@exegia/corpora-ui 0.29.0 → 1.0.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 (704) hide show
  1. package/README.md +33 -11
  2. package/dist-lib/index.js +13006 -7914
  3. package/dist-lib/index.js.map +1 -1
  4. package/dist-lib/src/components/atoms/_layout.d.ts +4 -0
  5. package/dist-lib/src/components/atoms/avatar/base.d.ts +2 -0
  6. package/dist-lib/src/components/atoms/avatar/index.d.ts +2 -0
  7. package/dist-lib/src/components/atoms/avatar/types.d.ts +20 -0
  8. package/dist-lib/src/components/atoms/avatar/utils.d.ts +13 -0
  9. package/dist-lib/src/components/atoms/avatar/verified.d.ts +1 -0
  10. package/dist-lib/src/components/atoms/background/index.d.ts +6 -0
  11. package/dist-lib/src/components/atoms/background/texture.d.ts +2 -0
  12. package/dist-lib/src/components/atoms/background/type.d.ts +7 -0
  13. package/dist-lib/src/components/atoms/background/utils.d.ts +4 -0
  14. package/dist-lib/src/components/atoms/bubble/actions.d.ts +7 -0
  15. package/dist-lib/src/components/atoms/bubble/context.d.ts +4 -0
  16. package/dist-lib/src/components/atoms/bubble/default.d.ts +3 -0
  17. package/dist-lib/src/components/atoms/bubble/header.d.ts +8 -0
  18. package/dist-lib/src/components/atoms/bubble/index.d.ts +16 -0
  19. package/dist-lib/src/components/atoms/bubble/message.d.ts +3 -0
  20. package/dist-lib/src/components/atoms/bubble/reactions.d.ts +14 -0
  21. package/dist-lib/src/components/atoms/bubble/types.d.ts +59 -0
  22. package/dist-lib/src/components/atoms/bubble/utils.d.ts +13 -0
  23. package/dist-lib/src/components/atoms/chip.d.ts +15 -0
  24. package/dist-lib/src/components/atoms/index.d.ts +15 -0
  25. package/dist-lib/src/components/atoms/loader.d.ts +8 -0
  26. package/dist-lib/src/components/atoms/reference.d.ts +7 -0
  27. package/dist-lib/src/components/atoms/text/default.d.ts +1144 -0
  28. package/dist-lib/src/components/atoms/text/heading.d.ts +4 -0
  29. package/dist-lib/src/components/atoms/text/index.d.ts +21 -0
  30. package/dist-lib/src/components/atoms/text/label.d.ts +2 -0
  31. package/dist-lib/src/components/atoms/text/paragraph.d.ts +4 -0
  32. package/dist-lib/src/components/atoms/text/span.d.ts +3 -0
  33. package/dist-lib/src/components/atoms/text/types.d.ts +23 -0
  34. package/dist-lib/src/components/atoms/text/utils.d.ts +4 -0
  35. package/dist-lib/src/components/atoms/text-selection/click-popover.d.ts +3 -0
  36. package/dist-lib/src/components/atoms/text-selection/index.d.ts +6 -0
  37. package/dist-lib/src/components/atoms/text-selection/popover.d.ts +3 -0
  38. package/dist-lib/src/components/atoms/text-selection/selection-atom.d.ts +30 -0
  39. package/dist-lib/src/components/atoms/text-selection/selection.d.ts +3 -0
  40. package/dist-lib/src/components/atoms/text-selection/types.d.ts +90 -0
  41. package/dist-lib/src/components/atoms/text-selection/use-selection.d.ts +7 -0
  42. package/dist-lib/src/components/atoms/types.d.ts +17 -0
  43. package/dist-lib/src/components/blocks/auth/auth-flow-block.story.d.ts +3 -0
  44. package/dist-lib/src/components/blocks/auth/code-auth-block.story.d.ts +3 -0
  45. package/dist-lib/src/components/blocks/auth/forgot-password-block.story.d.ts +3 -0
  46. package/dist-lib/src/components/blocks/auth/linked-accounts-block.story.d.ts +3 -0
  47. package/dist-lib/src/components/blocks/auth/login-block.story.d.ts +3 -0
  48. package/dist-lib/src/components/blocks/auth/onboarding-block.story.d.ts +3 -0
  49. package/dist-lib/src/components/blocks/auth/passkey-manager-block.story.d.ts +3 -0
  50. package/dist-lib/src/components/blocks/auth/passkey-sign-in-block.story.d.ts +3 -0
  51. package/dist-lib/src/components/blocks/auth/signup-block.story.d.ts +3 -0
  52. package/dist-lib/src/components/blocks/auth/update-password-block.story.d.ts +3 -0
  53. package/dist-lib/src/components/blocks/chat/banners.d.ts +13 -0
  54. package/dist-lib/src/components/blocks/chat/base.d.ts +10 -0
  55. package/dist-lib/src/components/blocks/chat/base.story.d.ts +3 -0
  56. package/dist-lib/src/components/blocks/chat/header.d.ts +4 -0
  57. package/dist-lib/src/components/blocks/chat/index.d.ts +13 -0
  58. package/dist-lib/src/components/blocks/chat/recommendation-stack.d.ts +13 -0
  59. package/dist-lib/src/components/blocks/chat/shared.d.ts +8 -0
  60. package/dist-lib/src/components/blocks/chat/suggested-prompts.d.ts +3 -0
  61. package/dist-lib/src/components/blocks/chat/types.d.ts +64 -0
  62. package/dist-lib/src/components/blocks/chat/version-history-record.d.ts +3 -0
  63. package/dist-lib/{components → src/components}/blocks/profile/profile-card-block.d.ts +2 -7
  64. package/dist-lib/src/components/blocks/profile/profile-card-block.story.d.ts +3 -0
  65. package/dist-lib/{components → src/components}/blocks/profile/type.d.ts +2 -2
  66. package/dist-lib/src/components/blocks/scaffold/scaffold-root.story.d.ts +3 -0
  67. package/dist-lib/src/components/blocks/shell/shell-layout.story.d.ts +3 -0
  68. package/dist-lib/src/components/composed/action-bar/action.d.ts +18 -0
  69. package/dist-lib/src/components/composed/action-bar/emojis.d.ts +10 -0
  70. package/dist-lib/src/components/composed/action-bar/index.d.ts +12 -0
  71. package/dist-lib/src/components/composed/action-bar/toolbar.d.ts +2 -0
  72. package/dist-lib/src/components/composed/action-bar/types.d.ts +55 -0
  73. package/dist-lib/src/components/composed/action-bar/utils.d.ts +57 -0
  74. package/dist-lib/src/components/composed/ai/avatar.d.ts +1 -0
  75. package/dist-lib/src/components/composed/ai/index.d.ts +17 -0
  76. package/dist-lib/src/components/composed/ai/message.d.ts +7 -0
  77. package/dist-lib/src/components/composed/ai/research-answer.d.ts +30 -0
  78. package/dist-lib/src/components/composed/ai/shared.d.ts +19 -0
  79. package/dist-lib/src/components/composed/ai/streaming-text.d.ts +26 -0
  80. package/dist-lib/src/components/composed/ai/suggested-prompt.d.ts +35 -0
  81. package/dist-lib/src/components/composed/ai/types.d.ts +66 -0
  82. package/dist-lib/src/components/composed/attachment.story.d.ts +3 -0
  83. package/dist-lib/src/components/composed/chart.story.d.ts +3 -0
  84. package/dist-lib/src/components/composed/chat/__tests__/attachment.test.d.ts +1 -0
  85. package/dist-lib/src/components/composed/chat/__tests__/beautiful-ui.test.d.ts +1 -0
  86. package/dist-lib/src/components/composed/chat/__tests__/chart.test.d.ts +1 -0
  87. package/dist-lib/src/components/composed/chat/__tests__/code-block.test.d.ts +1 -0
  88. package/dist-lib/src/components/composed/chat/__tests__/composer-attachments.test.d.ts +1 -0
  89. package/dist-lib/src/components/composed/chat/__tests__/composer.test.d.ts +1 -0
  90. package/dist-lib/src/components/composed/chat/__tests__/flowchart.test.d.ts +1 -0
  91. package/dist-lib/src/components/composed/chat/__tests__/markdown.test.d.ts +1 -0
  92. package/dist-lib/src/components/composed/chat/actions.d.ts +2 -0
  93. package/dist-lib/src/components/composed/chat/attachment.d.ts +62 -0
  94. package/dist-lib/src/components/composed/chat/chart.d.ts +41 -0
  95. package/dist-lib/src/components/composed/chat/code-block.d.ts +26 -0
  96. package/dist-lib/src/components/composed/chat/composer/add-button.d.ts +5 -0
  97. package/dist-lib/src/components/composed/chat/composer/base.d.ts +8 -0
  98. package/dist-lib/src/components/composed/chat/composer/command-menu.d.ts +2 -0
  99. package/dist-lib/src/components/composed/chat/composer/hooks.d.ts +9 -0
  100. package/dist-lib/src/components/composed/chat/composer/index.d.ts +10 -0
  101. package/dist-lib/src/components/composed/chat/composer/send-button.d.ts +3 -0
  102. package/dist-lib/src/components/composed/chat/composer/suggestions.d.ts +7 -0
  103. package/dist-lib/src/components/composed/chat/composer/utils.d.ts +19 -0
  104. package/dist-lib/src/components/composed/chat/context-cards.d.ts +27 -0
  105. package/dist-lib/src/components/composed/chat/filter-table.d.ts +40 -0
  106. package/dist-lib/src/components/composed/chat/flowchart/chart-node.d.ts +2 -0
  107. package/dist-lib/src/components/composed/chat/flowchart/connector.d.ts +2 -0
  108. package/dist-lib/src/components/composed/chat/flowchart/constant.d.ts +15 -0
  109. package/dist-lib/src/components/composed/chat/flowchart/default.d.ts +7 -0
  110. package/dist-lib/src/components/composed/chat/flowchart/edge-toolbar.d.ts +9 -0
  111. package/dist-lib/src/components/composed/chat/flowchart/hooks.d.ts +290 -0
  112. package/dist-lib/src/components/composed/chat/flowchart/index.d.ts +11 -0
  113. package/dist-lib/src/components/composed/chat/flowchart/step-body.d.ts +6 -0
  114. package/dist-lib/src/components/composed/chat/flowchart/types.d.ts +91 -0
  115. package/dist-lib/src/components/composed/chat/flowchart/utils.d.ts +64 -0
  116. package/dist-lib/src/components/composed/chat/hint.d.ts +6 -0
  117. package/dist-lib/src/components/composed/chat/index.d.ts +15 -0
  118. package/dist-lib/src/components/composed/chat/insight-cards.d.ts +54 -0
  119. package/dist-lib/src/components/composed/chat/markdown-atom.d.ts +7 -0
  120. package/dist-lib/src/components/composed/chat/markdown.d.ts +22 -0
  121. package/dist-lib/src/components/composed/chat/recommendation/checkbox.d.ts +15 -0
  122. package/dist-lib/src/components/composed/chat/recommendation/constant.d.ts +6 -0
  123. package/dist-lib/src/components/composed/chat/recommendation/default.d.ts +7 -0
  124. package/dist-lib/src/components/composed/chat/recommendation/group.d.ts +8 -0
  125. package/dist-lib/src/components/composed/chat/recommendation/index.d.ts +15 -0
  126. package/dist-lib/src/components/composed/chat/recommendation/item.d.ts +12 -0
  127. package/dist-lib/src/components/composed/chat/recommendation/types.d.ts +53 -0
  128. package/dist-lib/src/components/composed/chat/records-table.d.ts +38 -0
  129. package/dist-lib/src/components/composed/chat/type.d.ts +86 -0
  130. package/dist-lib/src/components/composed/code-block.story.d.ts +3 -0
  131. package/dist-lib/src/components/composed/context-cards.story.d.ts +3 -0
  132. package/dist-lib/src/components/composed/emoji-action-bar.story.d.ts +3 -0
  133. package/dist-lib/src/components/composed/filter-table.story.d.ts +7 -0
  134. package/dist-lib/src/components/composed/flowchart.story.d.ts +3 -0
  135. package/dist-lib/src/components/composed/insight-cards.story.d.ts +3 -0
  136. package/dist-lib/src/components/composed/logo.story.d.ts +3 -0
  137. package/dist-lib/src/components/composed/markdown.story.d.ts +3 -0
  138. package/dist-lib/src/components/composed/password-input.story.d.ts +7 -0
  139. package/dist-lib/src/components/composed/reader/applied-mark.d.ts +3 -0
  140. package/dist-lib/src/components/composed/reader/apply-toast.d.ts +3 -0
  141. package/dist-lib/src/components/composed/reader/index.d.ts +7 -0
  142. package/dist-lib/src/components/composed/reader/selection-highlight.d.ts +3 -0
  143. package/dist-lib/src/components/composed/reader/selection-popover.d.ts +9 -0
  144. package/dist-lib/src/components/composed/reader/type.d.ts +40 -0
  145. package/dist-lib/src/components/composed/recommendation-card.story.d.ts +3 -0
  146. package/dist-lib/src/components/composed/records-table.story.d.ts +3 -0
  147. package/dist-lib/src/components/composed/research-answer.story.d.ts +3 -0
  148. package/dist-lib/src/components/composed/social-providers.story.d.ts +3 -0
  149. package/dist-lib/src/components/composed/streaming-text.story.d.ts +3 -0
  150. package/dist-lib/src/components/composed/tree/__tests__/tree-atom.test.d.ts +1 -0
  151. package/dist-lib/src/components/composed/tree/__tests__/tree.test.d.ts +1 -0
  152. package/dist-lib/src/components/composed/tree/__tests__/use-tree.test.d.ts +1 -0
  153. package/dist-lib/src/components/composed/tree.story.d.ts +6 -0
  154. package/dist-lib/src/components/composed/user/index.d.ts +11 -0
  155. package/dist-lib/src/components/composed/user/info.d.ts +12 -0
  156. package/dist-lib/src/components/composed/user/message.d.ts +3 -0
  157. package/dist-lib/src/components/composed/user/pill.d.ts +10 -0
  158. package/dist-lib/src/components/composed/user/types.d.ts +20 -0
  159. package/dist-lib/src/components/composed/user/utils.d.ts +1 -0
  160. package/dist-lib/src/components/composed/user.story.d.ts +8 -0
  161. package/dist-lib/src/components/composed/verse/__tests__/verse.test.d.ts +1 -0
  162. package/dist-lib/src/components/composed/verse/index.d.ts +2 -0
  163. package/dist-lib/src/components/composed/verse/types.d.ts +18 -0
  164. package/dist-lib/src/components/composed/verse/verse.d.ts +5 -0
  165. package/dist-lib/src/components/composed/verse.story.d.ts +3 -0
  166. package/dist-lib/src/components/docs/atoms-gallery.d.ts +3 -0
  167. package/dist-lib/{components → src/components}/docs/demo-controls.d.ts +3 -10
  168. package/dist-lib/src/components/docs/hero.d.ts +5 -0
  169. package/dist-lib/src/components/docs/mermaid.d.ts +3 -0
  170. package/dist-lib/src/components/icons/__tests__/icons.test.d.ts +1 -0
  171. package/dist-lib/src/components/motion/index.d.ts +1 -0
  172. package/dist-lib/src/components/ui/accordion.d.ts +7 -0
  173. package/dist-lib/src/components/ui/alert-dialog.d.ts +20 -0
  174. package/dist-lib/src/components/ui/alert.d.ts +10 -0
  175. package/dist-lib/src/components/ui/autocomplete.d.ts +34 -0
  176. package/dist-lib/src/components/ui/avatar.d.ts +11 -0
  177. package/dist-lib/src/components/ui/avatar.story.d.ts +7 -0
  178. package/dist-lib/src/components/ui/badge.d.ts +14 -0
  179. package/dist-lib/src/components/ui/bubble.story.d.ts +7 -0
  180. package/dist-lib/{components → src/components}/ui/button.d.ts +1 -1
  181. package/dist-lib/src/components/ui/button.story.d.ts +8 -0
  182. package/dist-lib/src/components/ui/card.story.d.ts +9 -0
  183. package/dist-lib/src/components/ui/chat/__tests__/segmented-toggle.test.d.ts +1 -0
  184. package/dist-lib/src/components/ui/chat/avatar-handle.d.ts +13 -0
  185. package/dist-lib/src/components/ui/chat/badges.d.ts +29 -0
  186. package/dist-lib/src/components/ui/chat/buttons.d.ts +29 -0
  187. package/dist-lib/src/components/ui/chat/chips.d.ts +48 -0
  188. package/dist-lib/src/components/ui/chat/dot.d.ts +30 -0
  189. package/dist-lib/src/components/ui/chat/icon-button.d.ts +18 -0
  190. package/dist-lib/src/components/ui/chat/icon-tile.d.ts +20 -0
  191. package/dist-lib/src/components/ui/chat/index.d.ts +12 -0
  192. package/dist-lib/src/components/ui/chat/inline-source.d.ts +20 -0
  193. package/dist-lib/src/components/ui/chat/segmented-toggle.d.ts +20 -0
  194. package/dist-lib/src/components/ui/chat/tag.d.ts +21 -0
  195. package/dist-lib/src/components/ui/chat/thumbnail.d.ts +13 -0
  196. package/dist-lib/src/components/ui/chat/waveform.d.ts +13 -0
  197. package/dist-lib/src/components/ui/chat-atoms.story.d.ts +22 -0
  198. package/dist-lib/src/components/ui/checkbox.story.d.ts +7 -0
  199. package/dist-lib/src/components/ui/collapsible.d.ts +6 -0
  200. package/dist-lib/src/components/ui/command.d.ts +25 -0
  201. package/dist-lib/src/components/ui/context-menu.d.ts +42 -0
  202. package/dist-lib/src/components/ui/emoji-picker.d.ts +7 -0
  203. package/dist-lib/src/components/ui/field.story.d.ts +7 -0
  204. package/dist-lib/src/components/ui/file-icons.story.d.ts +7 -0
  205. package/dist-lib/src/components/ui/frame.story.d.ts +9 -0
  206. package/dist-lib/{components → src/components}/ui/glasscn/glass-container.d.ts +7 -2
  207. package/dist-lib/src/components/ui/input-group.story.d.ts +7 -0
  208. package/dist-lib/src/components/ui/input.story.d.ts +9 -0
  209. package/dist-lib/src/components/ui/kbd.d.ts +3 -0
  210. package/dist-lib/src/components/ui/label.story.d.ts +9 -0
  211. package/dist-lib/src/components/ui/menu-command.d.ts +37 -0
  212. package/dist-lib/src/components/ui/menu-command.story.d.ts +7 -0
  213. package/dist-lib/src/components/ui/otp-field.story.d.ts +9 -0
  214. package/dist-lib/src/components/ui/password-input.story.d.ts +3 -0
  215. package/dist-lib/src/components/ui/popover-glass.d.ts +32 -0
  216. package/dist-lib/src/components/ui/popover.d.ts +18 -0
  217. package/dist-lib/src/components/ui/preview-card.d.ts +11 -0
  218. package/dist-lib/src/components/ui/reference.story.d.ts +10 -0
  219. package/dist-lib/src/components/ui/scroll-area.d.ts +11 -0
  220. package/dist-lib/{components → src/components}/ui/select.d.ts +1 -1
  221. package/dist-lib/src/components/ui/separator.story.d.ts +7 -0
  222. package/dist-lib/src/components/ui/tabs.d.ts +15 -0
  223. package/dist-lib/src/components/ui/text.story.d.ts +9 -0
  224. package/dist-lib/src/components/ui/textarea.story.d.ts +7 -0
  225. package/dist-lib/src/components/ui/toast.d.ts +15 -0
  226. package/dist-lib/src/components/ui/toolbar.d.ts +9 -0
  227. package/dist-lib/src/components/ui/tooltip.d.ts +14 -0
  228. package/dist-lib/{index.d.ts → src/index.d.ts} +13 -4
  229. package/dist-lib/{lib → src/lib}/ease.d.ts +9 -0
  230. package/dist-lib/src/lib/hooks/use-mobile.d.ts +1 -0
  231. package/dist-lib/src/lib/keyed-atom.d.ts +14 -0
  232. package/dist-lib/src/lib/segmented-control.d.ts +8 -0
  233. package/dist-lib/src/lib/utils.test.d.ts +1 -0
  234. package/package.json +40 -21
  235. package/src/assets/css/base.css +62 -0
  236. package/src/assets/css/chat.css +229 -0
  237. package/src/assets/css/shadows.css +157 -0
  238. package/src/assets/css/theme.css +321 -0
  239. package/src/components/AGENTS.md +0 -0
  240. package/src/components/atoms/_layout.tsx +9 -0
  241. package/src/components/atoms/avatar/base.tsx +70 -0
  242. package/src/components/atoms/avatar/index.ts +3 -0
  243. package/src/components/atoms/avatar/types.ts +24 -0
  244. package/src/components/atoms/avatar/utils.ts +54 -0
  245. package/src/components/atoms/avatar/verified.tsx +16 -0
  246. package/src/components/atoms/background/index.ts +8 -0
  247. package/src/components/atoms/background/texture.tsx +29 -0
  248. package/src/components/atoms/background/type.ts +10 -0
  249. package/src/components/atoms/background/utils.ts +13 -0
  250. package/src/components/atoms/bubble/__tests__/bubble.test.tsx +138 -0
  251. package/src/components/atoms/bubble/__tests__/reference.test.tsx +25 -0
  252. package/src/components/atoms/bubble/actions.tsx +28 -0
  253. package/src/components/atoms/bubble/context.ts +11 -0
  254. package/src/components/atoms/bubble/default.tsx +46 -0
  255. package/src/components/atoms/bubble/header.tsx +34 -0
  256. package/src/components/atoms/bubble/index.ts +37 -0
  257. package/src/components/atoms/bubble/message.tsx +25 -0
  258. package/src/components/atoms/bubble/reactions.tsx +194 -0
  259. package/src/components/atoms/bubble/types.ts +79 -0
  260. package/src/components/atoms/bubble/utils.ts +46 -0
  261. package/src/components/atoms/chip.tsx +61 -0
  262. package/src/components/atoms/index.ts +52 -0
  263. package/src/components/atoms/loader.tsx +42 -0
  264. package/src/components/atoms/reference.tsx +41 -0
  265. package/src/components/atoms/text/__tests__/text.test.tsx +47 -0
  266. package/src/components/atoms/text/default.tsx +59 -0
  267. package/src/components/atoms/text/heading.tsx +61 -0
  268. package/src/components/atoms/text/index.ts +24 -0
  269. package/src/components/atoms/text/label.tsx +16 -0
  270. package/src/components/atoms/text/paragraph.tsx +58 -0
  271. package/src/components/atoms/text/span.tsx +15 -0
  272. package/src/components/atoms/text/types.ts +31 -0
  273. package/src/components/atoms/text/utils.ts +16 -0
  274. package/src/components/atoms/text-selection/__tests__/click-popover.test.tsx +61 -0
  275. package/src/components/atoms/text-selection/__tests__/text-selection.test.tsx +90 -0
  276. package/src/components/atoms/text-selection/click-popover.tsx +62 -0
  277. package/src/components/atoms/text-selection/index.ts +30 -0
  278. package/src/components/atoms/text-selection/popover.tsx +100 -0
  279. package/src/components/atoms/text-selection/selection-atom.ts +51 -0
  280. package/src/components/atoms/text-selection/selection.tsx +56 -0
  281. package/src/components/atoms/text-selection/types.ts +125 -0
  282. package/src/components/atoms/text-selection/use-selection.ts +84 -0
  283. package/src/components/atoms/types.ts +18 -0
  284. package/src/components/blocks/auth/__tests__/auth-flow-block.test.tsx +1 -1
  285. package/src/components/blocks/auth/__tests__/auth-state-atom.test.tsx +1 -1
  286. package/src/components/blocks/auth/auth-flow-block.story.tsx +17 -0
  287. package/src/components/blocks/auth/code-auth-block.story.tsx +20 -0
  288. package/src/components/blocks/auth/forgot-password-block.story.tsx +14 -0
  289. package/src/components/blocks/auth/linked-accounts-block.story.tsx +23 -0
  290. package/src/components/blocks/auth/linked-accounts-block.tsx +1 -1
  291. package/src/components/blocks/auth/login-block.story.tsx +18 -0
  292. package/src/components/blocks/auth/onboarding/profile-step.tsx +1 -1
  293. package/src/components/blocks/auth/onboarding-block.story.tsx +14 -0
  294. package/src/components/blocks/auth/passkey-manager-block.story.tsx +18 -0
  295. package/src/components/blocks/auth/passkey-manager-block.tsx +2 -2
  296. package/src/components/blocks/auth/passkey-sign-in-block.story.tsx +14 -0
  297. package/src/components/blocks/auth/signup-block.story.tsx +18 -0
  298. package/src/components/blocks/auth/update-password-block.story.tsx +14 -0
  299. package/src/components/blocks/chat/__tests__/ai-panel.test.tsx +65 -0
  300. package/src/components/blocks/chat/banners.tsx +69 -0
  301. package/src/components/blocks/chat/base.story.tsx +19 -0
  302. package/src/components/blocks/chat/base.tsx +84 -0
  303. package/src/components/blocks/chat/header.tsx +60 -0
  304. package/src/components/blocks/chat/index.ts +39 -0
  305. package/src/components/blocks/chat/recommendation-stack.tsx +43 -0
  306. package/src/components/blocks/chat/shared.tsx +27 -0
  307. package/src/components/blocks/chat/suggested-prompts.tsx +45 -0
  308. package/src/components/blocks/chat/types.ts +81 -0
  309. package/src/components/blocks/chat/version-history-record.tsx +37 -0
  310. package/src/components/blocks/nav/sidebar/__tests__/ai-sidebar-atom.test.tsx +1 -1
  311. package/src/components/blocks/nav/sidebar/sidebar-row.tsx +2 -2
  312. package/src/components/blocks/nav/sidebar/use-ai-sidebar.ts +193 -190
  313. package/src/components/blocks/profile/__tests__/profile-card-block.test.tsx +208 -176
  314. package/src/components/blocks/profile/profile-card-block.story.tsx +18 -0
  315. package/src/components/blocks/profile/profile-card-block.tsx +15 -17
  316. package/src/components/blocks/profile/type.ts +3 -5
  317. package/src/components/blocks/profile/use-profile-card.ts +17 -11
  318. package/src/components/blocks/scaffold/scaffold-canvas.tsx +4 -1
  319. package/src/components/blocks/scaffold/scaffold-root.story.tsx +36 -0
  320. package/src/components/blocks/scaffold/scaffold-root.tsx +9 -6
  321. package/src/components/blocks/scaffold/utils.ts +1 -1
  322. package/src/components/blocks/shell/__tests__/shell-fit-atom.test.tsx +4 -4
  323. package/src/components/blocks/shell/__tests__/shell-layout.test.tsx +3 -3
  324. package/src/components/blocks/shell/animated-panel-inset.tsx +1 -1
  325. package/src/components/blocks/shell/shell-layout.story.tsx +19 -0
  326. package/src/components/blocks/shell/shell-layout.tsx +1 -1
  327. package/src/components/blocks/shell/use-shell-fit-state.ts +2 -2
  328. package/src/components/blocks/shell/use-shell-fit.ts +2 -2
  329. package/src/components/blocks/shell/use-shell-panels.ts +3 -3
  330. package/src/components/composed/action-bar/__tests__/action-bar.test.tsx +96 -0
  331. package/src/components/composed/action-bar/action.tsx +80 -0
  332. package/src/components/composed/action-bar/emojis.tsx +97 -0
  333. package/src/components/composed/action-bar/index.ts +24 -0
  334. package/src/components/composed/action-bar/toolbar.tsx +60 -0
  335. package/src/components/composed/action-bar/types.ts +58 -0
  336. package/src/components/composed/action-bar/utils.ts +141 -0
  337. package/src/components/composed/ai/__tests__/ai.test.tsx +67 -0
  338. package/src/components/composed/ai/avatar.tsx +20 -0
  339. package/src/components/composed/ai/index.ts +36 -0
  340. package/src/components/composed/ai/message.tsx +49 -0
  341. package/src/components/composed/ai/research-answer.tsx +157 -0
  342. package/src/components/composed/ai/shared.tsx +94 -0
  343. package/src/components/composed/ai/streaming-text.tsx +94 -0
  344. package/src/components/composed/ai/suggested-prompt.tsx +183 -0
  345. package/src/components/composed/ai/types.ts +81 -0
  346. package/src/components/composed/attachment.story.tsx +52 -0
  347. package/src/components/composed/chart.story.tsx +46 -0
  348. package/src/components/composed/chat/__tests__/attachment.test.tsx +45 -0
  349. package/src/components/composed/chat/__tests__/beautiful-ui.test.tsx +57 -0
  350. package/src/components/composed/chat/__tests__/chart.test.tsx +29 -0
  351. package/src/components/composed/chat/__tests__/code-block.test.tsx +12 -0
  352. package/src/components/composed/chat/__tests__/composer-attachments.test.tsx +53 -0
  353. package/src/components/composed/chat/__tests__/composer.test.tsx +81 -0
  354. package/src/components/composed/chat/__tests__/flowchart.test.tsx +132 -0
  355. package/src/components/composed/chat/__tests__/markdown.test.tsx +25 -0
  356. package/src/components/composed/chat/actions.tsx +81 -0
  357. package/src/components/composed/chat/attachment.tsx +228 -0
  358. package/src/components/composed/chat/chart.tsx +193 -0
  359. package/src/components/composed/chat/code-block.tsx +123 -0
  360. package/src/components/composed/chat/composer/add-button.tsx +22 -0
  361. package/src/components/composed/chat/composer/base.tsx +248 -0
  362. package/src/components/composed/chat/composer/command-menu.tsx +42 -0
  363. package/src/components/composed/chat/composer/hooks.ts +29 -0
  364. package/src/components/composed/chat/composer/index.ts +19 -0
  365. package/src/components/composed/chat/composer/send-button.tsx +44 -0
  366. package/src/components/composed/chat/composer/suggestions.tsx +115 -0
  367. package/src/components/composed/chat/composer/utils.ts +74 -0
  368. package/src/components/composed/chat/context-cards.tsx +63 -0
  369. package/src/components/composed/chat/filter-table.tsx +119 -0
  370. package/src/components/composed/chat/flowchart/chart-node.tsx +162 -0
  371. package/src/components/composed/chat/flowchart/connector.tsx +32 -0
  372. package/src/components/composed/chat/flowchart/constant.ts +26 -0
  373. package/src/components/composed/chat/flowchart/default.tsx +230 -0
  374. package/src/components/composed/chat/flowchart/edge-toolbar.tsx +73 -0
  375. package/src/components/composed/chat/flowchart/hooks.tsx +345 -0
  376. package/src/components/composed/chat/flowchart/index.ts +14 -0
  377. package/src/components/composed/chat/flowchart/step-body.tsx +82 -0
  378. package/src/components/composed/chat/flowchart/types.ts +89 -0
  379. package/src/components/composed/chat/flowchart/utils.ts +78 -0
  380. package/src/components/composed/chat/hint.tsx +59 -0
  381. package/src/components/composed/chat/index.ts +96 -0
  382. package/src/components/composed/chat/insight-cards.tsx +199 -0
  383. package/src/components/composed/chat/markdown-atom.ts +15 -0
  384. package/src/components/composed/chat/markdown.tsx +213 -0
  385. package/src/components/composed/chat/recommendation/checkbox.tsx +133 -0
  386. package/src/components/composed/chat/recommendation/constant.ts +25 -0
  387. package/src/components/composed/chat/recommendation/default.tsx +25 -0
  388. package/src/components/composed/chat/recommendation/group.tsx +43 -0
  389. package/src/components/composed/chat/recommendation/index.ts +19 -0
  390. package/src/components/composed/chat/recommendation/item.tsx +244 -0
  391. package/src/components/composed/chat/recommendation/types.ts +65 -0
  392. package/src/components/composed/chat/records-table.tsx +128 -0
  393. package/src/components/composed/chat/type.ts +126 -0
  394. package/src/components/composed/code-block.story.tsx +29 -0
  395. package/src/components/composed/context-cards.story.tsx +30 -0
  396. package/src/components/composed/emoji-action-bar.story.tsx +20 -0
  397. package/src/components/composed/filter-table.story.tsx +58 -0
  398. package/src/components/composed/flowchart.story.tsx +24 -0
  399. package/src/components/composed/insight-cards.story.tsx +51 -0
  400. package/src/components/composed/logo.story.tsx +21 -0
  401. package/src/components/composed/logo.tsx +24 -12
  402. package/src/components/composed/markdown.story.tsx +21 -0
  403. package/src/components/composed/password-input.story.tsx +38 -0
  404. package/src/components/composed/reader/applied-mark.tsx +32 -0
  405. package/src/components/composed/reader/apply-toast.tsx +49 -0
  406. package/src/components/composed/reader/index.ts +10 -0
  407. package/src/components/composed/reader/selection-highlight.tsx +26 -0
  408. package/src/components/composed/reader/selection-popover.tsx +149 -0
  409. package/src/components/composed/reader/type.ts +48 -0
  410. package/src/components/composed/recommendation-card.story.tsx +32 -0
  411. package/src/components/composed/records-table.story.tsx +46 -0
  412. package/src/components/composed/research-answer.story.tsx +32 -0
  413. package/src/components/composed/social-providers.story.tsx +24 -0
  414. package/src/components/composed/streaming-text.story.tsx +24 -0
  415. package/src/components/composed/tree/__tests__/tree-atom.test.tsx +1 -1
  416. package/src/components/composed/tree/__tests__/tree.test.tsx +1 -1
  417. package/src/components/composed/tree/tree-node.tsx +1 -1
  418. package/src/components/composed/tree/use-tree.ts +20 -16
  419. package/src/components/composed/tree.story.tsx +31 -0
  420. package/src/components/composed/user/index.ts +14 -0
  421. package/src/components/composed/user/info.tsx +48 -0
  422. package/src/components/composed/user/message.tsx +10 -0
  423. package/src/components/composed/user/pill.tsx +20 -0
  424. package/src/components/composed/user/types.ts +27 -0
  425. package/src/components/composed/user/utils.ts +0 -0
  426. package/src/components/composed/user.story.tsx +29 -0
  427. package/src/components/composed/verse/__tests__/verse.test.tsx +57 -0
  428. package/src/components/composed/verse/index.ts +2 -0
  429. package/src/components/composed/verse/types.ts +24 -0
  430. package/src/components/composed/verse/verse.tsx +100 -0
  431. package/src/components/composed/verse.story.tsx +21 -0
  432. package/src/components/docs/atoms-gallery.tsx +286 -0
  433. package/src/components/docs/code-block.tsx +2 -0
  434. package/src/components/docs/demo-controls.tsx +20 -20
  435. package/src/components/docs/hero.tsx +198 -0
  436. package/src/components/docs/mermaid.tsx +55 -0
  437. package/src/components/ui/accordion.tsx +68 -0
  438. package/src/components/ui/alert-dialog.tsx +167 -0
  439. package/src/components/ui/alert.tsx +84 -0
  440. package/src/components/ui/autocomplete.tsx +303 -0
  441. package/src/components/ui/avatar.story.tsx +33 -0
  442. package/src/components/ui/avatar.tsx +81 -24
  443. package/src/components/ui/badge.tsx +73 -24
  444. package/src/components/ui/bubble.story.tsx +45 -0
  445. package/src/components/ui/button-group.tsx +4 -4
  446. package/src/components/ui/button.story.tsx +62 -0
  447. package/src/components/ui/button.tsx +3 -3
  448. package/src/components/ui/card.story.tsx +36 -0
  449. package/src/components/ui/card.tsx +2 -2
  450. package/src/components/ui/chat/__tests__/segmented-toggle.test.tsx +27 -0
  451. package/src/components/ui/chat/avatar-handle.tsx +30 -0
  452. package/src/components/ui/chat/badges.tsx +85 -0
  453. package/src/components/ui/chat/buttons.tsx +94 -0
  454. package/src/components/ui/chat/chips.tsx +106 -0
  455. package/src/components/ui/chat/dot.tsx +81 -0
  456. package/src/components/ui/chat/icon-button.tsx +43 -0
  457. package/src/components/ui/chat/icon-tile.tsx +33 -0
  458. package/src/components/ui/chat/index.ts +12 -0
  459. package/src/components/ui/chat/inline-source.tsx +94 -0
  460. package/src/components/ui/chat/segmented-toggle.tsx +99 -0
  461. package/src/components/ui/chat/tag.tsx +61 -0
  462. package/src/components/ui/chat/thumbnail.tsx +31 -0
  463. package/src/components/ui/chat/waveform.tsx +30 -0
  464. package/src/components/ui/chat-atoms.story.tsx +94 -0
  465. package/src/components/ui/checkbox.story.tsx +30 -0
  466. package/src/components/ui/collapsible.tsx +42 -0
  467. package/src/components/ui/command.tsx +263 -0
  468. package/src/components/ui/context-menu.tsx +342 -0
  469. package/src/components/ui/emoji-picker.tsx +161 -0
  470. package/src/components/ui/field.story.tsx +32 -0
  471. package/src/components/ui/file-icons.story.tsx +24 -0
  472. package/src/components/ui/frame.story.tsx +32 -0
  473. package/src/components/ui/frame.tsx +2 -2
  474. package/src/components/ui/glasscn/glass-container.tsx +9 -3
  475. package/src/components/ui/glasscn/liquid-glass.tsx +5 -5
  476. package/src/components/ui/group.tsx +1 -1
  477. package/src/components/ui/input-group.story.tsx +27 -0
  478. package/src/components/ui/input-group.tsx +1 -1
  479. package/src/components/ui/input.story.tsx +42 -0
  480. package/src/components/ui/input.tsx +1 -1
  481. package/src/components/ui/kbd.tsx +32 -0
  482. package/src/components/ui/label.story.tsx +32 -0
  483. package/src/components/ui/menu-command.story.tsx +37 -0
  484. package/src/components/ui/menu-command.tsx +128 -0
  485. package/src/components/ui/otp-field.story.tsx +35 -0
  486. package/src/components/ui/otp-field.tsx +1 -1
  487. package/src/components/ui/password-input.story.tsx +19 -0
  488. package/src/components/ui/popover-glass.tsx +161 -0
  489. package/src/components/ui/popover.tsx +120 -0
  490. package/src/components/ui/preview-card.tsx +61 -0
  491. package/src/components/ui/reference.story.tsx +33 -0
  492. package/src/components/ui/scroll-area.tsx +80 -0
  493. package/src/components/ui/select.tsx +1 -1
  494. package/src/components/ui/separator.story.tsx +34 -0
  495. package/src/components/ui/tabs.tsx +120 -0
  496. package/src/components/ui/text.story.tsx +31 -0
  497. package/src/components/ui/textarea.story.tsx +34 -0
  498. package/src/components/ui/textarea.tsx +1 -1
  499. package/src/components/ui/toast.tsx +325 -0
  500. package/src/components/ui/toolbar.tsx +92 -0
  501. package/src/components/ui/tooltip.tsx +40 -39
  502. package/src/index.css +6 -250
  503. package/src/index.ts +25 -31
  504. package/src/lib/ease.ts +11 -0
  505. package/src/lib/hooks/use-mobile.ts +21 -0
  506. package/src/lib/keyed-atom.ts +60 -0
  507. package/src/lib/segmented-control.ts +42 -0
  508. package/src/{state → lib/state}/exegia-provider.tsx +5 -1
  509. package/src/lib/utils.ts +93 -1
  510. package/dist-lib/components/beste/piece/browser-frame.d.ts +0 -2
  511. package/dist-lib/components/beste/piece/type.d.ts +0 -9
  512. package/dist-lib/components/beste/piece/utils.d.ts +0 -3
  513. package/dist-lib/components/composed/user-avatar.d.ts +0 -7
  514. package/dist-lib/components/docs/component-preview.d.ts +0 -10
  515. package/dist-lib/components/docs/props-table.d.ts +0 -4
  516. package/dist-lib/components/ui/avatar.d.ts +0 -6
  517. package/dist-lib/components/ui/badge.d.ts +0 -7
  518. package/dist-lib/components/ui/tooltip.d.ts +0 -6
  519. package/dist-lib/components/user-avatar/audio-wave.d.ts +0 -2
  520. package/dist-lib/components/user-avatar/component.d.ts +0 -3
  521. package/dist-lib/components/user-avatar/fallback.d.ts +0 -5
  522. package/dist-lib/components/user-avatar/index.d.ts +0 -18
  523. package/dist-lib/components/user-avatar/presence-badge.d.ts +0 -16
  524. package/dist-lib/components/user-avatar/type.d.ts +0 -79
  525. package/dist-lib/components/user-avatar/use-user-avatar-state.d.ts +0 -26
  526. package/dist-lib/components/user-avatar/use-user-avatar.d.ts +0 -37
  527. package/dist-lib/components/user-avatar/user-avatar-atom.d.ts +0 -64
  528. package/dist-lib/components/user-avatar/utils.d.ts +0 -24
  529. package/src/components/beste/piece/browser-frame.tsx +0 -58
  530. package/src/components/beste/piece/type.ts +0 -11
  531. package/src/components/beste/piece/utils.ts +0 -21
  532. package/src/components/composed/__tests__/user-avatar.test.tsx +0 -85
  533. package/src/components/composed/user-avatar.tsx +0 -13
  534. package/src/components/docs/component-preview.tsx +0 -34
  535. package/src/components/docs/props-table.tsx +0 -35
  536. package/src/components/user-avatar/__tests__/user-avatar.test.tsx +0 -286
  537. package/src/components/user-avatar/audio-wave.tsx +0 -22
  538. package/src/components/user-avatar/component.tsx +0 -182
  539. package/src/components/user-avatar/fallback.tsx +0 -28
  540. package/src/components/user-avatar/index.ts +0 -34
  541. package/src/components/user-avatar/presence-badge.tsx +0 -56
  542. package/src/components/user-avatar/type.ts +0 -93
  543. package/src/components/user-avatar/use-user-avatar-state.ts +0 -60
  544. package/src/components/user-avatar/use-user-avatar.ts +0 -180
  545. package/src/components/user-avatar/user-avatar-atom.ts +0 -218
  546. package/src/components/user-avatar/utils.ts +0 -102
  547. /package/dist-lib/{components/blocks/auth/__tests__/auth-flow-block.test.d.ts → src/components/atoms/bubble/__tests__/bubble.test.d.ts} +0 -0
  548. /package/dist-lib/{components/blocks/auth/__tests__/auth-state-atom.test.d.ts → src/components/atoms/bubble/__tests__/reference.test.d.ts} +0 -0
  549. /package/dist-lib/{components/blocks/auth/__tests__/passkey-manager-block.test.d.ts → src/components/atoms/text/__tests__/text.test.d.ts} +0 -0
  550. /package/dist-lib/{components/blocks/auth/__tests__/linked-accounts-block.test.d.ts → src/components/atoms/text-selection/__tests__/click-popover.test.d.ts} +0 -0
  551. /package/dist-lib/{components/blocks/auth/__tests__/onboarding-block.test.d.ts → src/components/atoms/text-selection/__tests__/text-selection.test.d.ts} +0 -0
  552. /package/dist-lib/{components/blocks/auth/__tests__/passkey-sign-in-block.test.d.ts → src/components/blocks/auth/__tests__/auth-flow-block.test.d.ts} +0 -0
  553. /package/dist-lib/{components/blocks/auth/__tests__/signup-block.test.d.ts → src/components/blocks/auth/__tests__/auth-state-atom.test.d.ts} +0 -0
  554. /package/dist-lib/{components/blocks/auth/__tests__/update-password-block.test.d.ts → src/components/blocks/auth/__tests__/linked-accounts-block.test.d.ts} +0 -0
  555. /package/dist-lib/{components/blocks/nav/sidebar/__tests__/ai-sidebar-atom.test.d.ts → src/components/blocks/auth/__tests__/onboarding-block.test.d.ts} +0 -0
  556. /package/dist-lib/{components/blocks/nav/sidebar/__tests__/ai-sidebar.test.d.ts → src/components/blocks/auth/__tests__/passkey-manager-block.test.d.ts} +0 -0
  557. /package/dist-lib/{components/blocks/nav/sidebar/__tests__/use-ai-sidebar.test.d.ts → src/components/blocks/auth/__tests__/passkey-sign-in-block.test.d.ts} +0 -0
  558. /package/dist-lib/{components/blocks/profile/__tests__/profile-card-block.test.d.ts → src/components/blocks/auth/__tests__/signup-block.test.d.ts} +0 -0
  559. /package/dist-lib/{components/blocks/scaffold/__tests__/scaffold-atom.test.d.ts → src/components/blocks/auth/__tests__/update-password-block.test.d.ts} +0 -0
  560. /package/dist-lib/{components → src/components}/blocks/auth/auth-flow-atom.d.ts +0 -0
  561. /package/dist-lib/{components → src/components}/blocks/auth/auth-flow-block.d.ts +0 -0
  562. /package/dist-lib/{components → src/components}/blocks/auth/auth-session-atom.d.ts +0 -0
  563. /package/dist-lib/{components → src/components}/blocks/auth/auth-shell.d.ts +0 -0
  564. /package/dist-lib/{components → src/components}/blocks/auth/auth-state-type.d.ts +0 -0
  565. /package/dist-lib/{components → src/components}/blocks/auth/auth-state.d.ts +0 -0
  566. /package/dist-lib/{components → src/components}/blocks/auth/code-auth-block.d.ts +0 -0
  567. /package/dist-lib/{components → src/components}/blocks/auth/forgot-password-block.d.ts +0 -0
  568. /package/dist-lib/{components → src/components}/blocks/auth/linked-accounts-block.d.ts +0 -0
  569. /package/dist-lib/{components → src/components}/blocks/auth/login-block.d.ts +0 -0
  570. /package/dist-lib/{components → src/components}/blocks/auth/onboarding/profile-step.d.ts +0 -0
  571. /package/dist-lib/{components → src/components}/blocks/auth/onboarding-block.d.ts +0 -0
  572. /package/dist-lib/{components → src/components}/blocks/auth/passkey-manager-block.d.ts +0 -0
  573. /package/dist-lib/{components → src/components}/blocks/auth/passkey-sign-in-block.d.ts +0 -0
  574. /package/dist-lib/{components → src/components}/blocks/auth/signup-block.d.ts +0 -0
  575. /package/dist-lib/{components → src/components}/blocks/auth/update-password-block.d.ts +0 -0
  576. /package/dist-lib/{components → src/components}/blocks/auth/use-auth-state.d.ts +0 -0
  577. /package/dist-lib/{components/blocks/scaffold/__tests__/scaffold.test.d.ts → src/components/blocks/chat/__tests__/ai-panel.test.d.ts} +0 -0
  578. /package/dist-lib/{components → src/components}/blocks/layout.d.ts +0 -0
  579. /package/dist-lib/{components/blocks/shell/__tests__/shell-fit-atom.test.d.ts → src/components/blocks/nav/sidebar/__tests__/ai-sidebar-atom.test.d.ts} +0 -0
  580. /package/dist-lib/{components/blocks/shell/__tests__/shell-layout.test.d.ts → src/components/blocks/nav/sidebar/__tests__/ai-sidebar.test.d.ts} +0 -0
  581. /package/dist-lib/{components/blocks/shell/__tests__/shell-metrics.test.d.ts → src/components/blocks/nav/sidebar/__tests__/use-ai-sidebar.test.d.ts} +0 -0
  582. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/ai-sidebar-atom.d.ts +0 -0
  583. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/ai-sidebar.d.ts +0 -0
  584. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/index.d.ts +0 -0
  585. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/marquee-label.d.ts +0 -0
  586. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/sidebar-context.d.ts +0 -0
  587. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/sidebar-icon.d.ts +0 -0
  588. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/sidebar-row.d.ts +0 -0
  589. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/type.d.ts +0 -0
  590. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/use-ai-sidebar-state.d.ts +0 -0
  591. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/use-ai-sidebar.d.ts +0 -0
  592. /package/dist-lib/{components → src/components}/blocks/nav/sidebar/utils.d.ts +0 -0
  593. /package/dist-lib/{components/composed/__tests__/logo.test.d.ts → src/components/blocks/profile/__tests__/profile-card-block.test.d.ts} +0 -0
  594. /package/dist-lib/{components → src/components}/blocks/profile/index.d.ts +0 -0
  595. /package/dist-lib/{components → src/components}/blocks/profile/profile-card-atom.d.ts +0 -0
  596. /package/dist-lib/{components → src/components}/blocks/profile/use-profile-card-state.d.ts +0 -0
  597. /package/dist-lib/{components → src/components}/blocks/profile/use-profile-card.d.ts +0 -0
  598. /package/dist-lib/{components/composed/__tests__/user-avatar.test.d.ts → src/components/blocks/scaffold/__tests__/scaffold-atom.test.d.ts} +0 -0
  599. /package/dist-lib/{components/composed/tree/__tests__/tree-atom.test.d.ts → src/components/blocks/scaffold/__tests__/scaffold.test.d.ts} +0 -0
  600. /package/dist-lib/{components → src/components}/blocks/scaffold/constants.d.ts +0 -0
  601. /package/dist-lib/{components → src/components}/blocks/scaffold/index.d.ts +0 -0
  602. /package/dist-lib/{components → src/components}/blocks/scaffold/panel-close-button.d.ts +0 -0
  603. /package/dist-lib/{components → src/components}/blocks/scaffold/panel-menu-button.d.ts +0 -0
  604. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-actions.d.ts +0 -0
  605. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-atom.d.ts +0 -0
  606. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-canvas.d.ts +0 -0
  607. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-context.d.ts +0 -0
  608. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-inspector.d.ts +0 -0
  609. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-main.d.ts +0 -0
  610. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-panel.d.ts +0 -0
  611. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-root.d.ts +0 -0
  612. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-sidebar.d.ts +0 -0
  613. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-sub-panel.d.ts +0 -0
  614. /package/dist-lib/{components → src/components}/blocks/scaffold/scaffold-tab.d.ts +0 -0
  615. /package/dist-lib/{components → src/components}/blocks/scaffold/type.d.ts +0 -0
  616. /package/dist-lib/{components → src/components}/blocks/scaffold/use-scaffold-state.d.ts +0 -0
  617. /package/dist-lib/{components → src/components}/blocks/scaffold/use-scaffold.d.ts +0 -0
  618. /package/dist-lib/{components → src/components}/blocks/scaffold/utils.d.ts +0 -0
  619. /package/dist-lib/{components/composed/tree/__tests__/tree.test.d.ts → src/components/blocks/shell/__tests__/shell-fit-atom.test.d.ts} +0 -0
  620. /package/dist-lib/{components/composed/tree/__tests__/use-tree.test.d.ts → src/components/blocks/shell/__tests__/shell-layout.test.d.ts} +0 -0
  621. /package/dist-lib/{components/icons/__tests__/icons.test.d.ts → src/components/blocks/shell/__tests__/shell-metrics.test.d.ts} +0 -0
  622. /package/dist-lib/{components → src/components}/blocks/shell/animated-panel-inset.d.ts +0 -0
  623. /package/dist-lib/{components → src/components}/blocks/shell/animated-panel-provider.d.ts +0 -0
  624. /package/dist-lib/{components → src/components}/blocks/shell/animated-panel-trigger.d.ts +0 -0
  625. /package/dist-lib/{components → src/components}/blocks/shell/animated-panel.d.ts +0 -0
  626. /package/dist-lib/{components → src/components}/blocks/shell/index.d.ts +0 -0
  627. /package/dist-lib/{components → src/components}/blocks/shell/shell-fit-atom.d.ts +0 -0
  628. /package/dist-lib/{components → src/components}/blocks/shell/shell-layout.d.ts +0 -0
  629. /package/dist-lib/{components → src/components}/blocks/shell/shell-metrics.d.ts +0 -0
  630. /package/dist-lib/{components → src/components}/blocks/shell/type.d.ts +0 -0
  631. /package/dist-lib/{components → src/components}/blocks/shell/use-shell-fit-state.d.ts +0 -0
  632. /package/dist-lib/{components → src/components}/blocks/shell/use-shell-fit.d.ts +0 -0
  633. /package/dist-lib/{components → src/components}/blocks/shell/use-shell-panels.d.ts +0 -0
  634. /package/dist-lib/{components → src/components}/blocks/shell/utils.d.ts +0 -0
  635. /package/dist-lib/{components/motion/index.d.ts → src/components/composed/__tests__/logo.test.d.ts} +0 -0
  636. /package/dist-lib/{components/user-avatar/__tests__/user-avatar.test.d.ts → src/components/composed/action-bar/__tests__/action-bar.test.d.ts} +0 -0
  637. /package/dist-lib/{lib/utils.test.d.ts → src/components/composed/ai/__tests__/ai.test.d.ts} +0 -0
  638. /package/dist-lib/{components → src/components}/composed/logo.d.ts +0 -0
  639. /package/dist-lib/{components → src/components}/composed/password-input.d.ts +0 -0
  640. /package/dist-lib/{components → src/components}/composed/social-providers.d.ts +0 -0
  641. /package/dist-lib/{components → src/components}/composed/tree/constants.d.ts +0 -0
  642. /package/dist-lib/{components → src/components}/composed/tree/index.d.ts +0 -0
  643. /package/dist-lib/{components → src/components}/composed/tree/tree-atom.d.ts +0 -0
  644. /package/dist-lib/{components → src/components}/composed/tree/tree-context.d.ts +0 -0
  645. /package/dist-lib/{components → src/components}/composed/tree/tree-node.d.ts +0 -0
  646. /package/dist-lib/{components → src/components}/composed/tree/tree.d.ts +0 -0
  647. /package/dist-lib/{components → src/components}/composed/tree/type.d.ts +0 -0
  648. /package/dist-lib/{components → src/components}/composed/tree/use-tree-dnd.d.ts +0 -0
  649. /package/dist-lib/{components → src/components}/composed/tree/use-tree-state.d.ts +0 -0
  650. /package/dist-lib/{components → src/components}/composed/tree/use-tree.d.ts +0 -0
  651. /package/dist-lib/{components → src/components}/composed/tree/utils.d.ts +0 -0
  652. /package/dist-lib/{components → src/components}/docs/code-block.d.ts +0 -0
  653. /package/dist-lib/{components → src/components}/icons/file-badge-cfm.d.ts +0 -0
  654. /package/dist-lib/{components → src/components}/icons/file-badge-corpus.d.ts +0 -0
  655. /package/dist-lib/{components → src/components}/icons/file-badge-pdf.d.ts +0 -0
  656. /package/dist-lib/{components → src/components}/icons/file-badge-tei.d.ts +0 -0
  657. /package/dist-lib/{components → src/components}/icons/file-badge-tf.d.ts +0 -0
  658. /package/dist-lib/{components → src/components}/icons/file-badge-txt.d.ts +0 -0
  659. /package/dist-lib/{components → src/components}/icons/file-badge-xml.d.ts +0 -0
  660. /package/dist-lib/{components → src/components}/icons/file-wordmark-cfm.d.ts +0 -0
  661. /package/dist-lib/{components → src/components}/icons/file-wordmark-corpus.d.ts +0 -0
  662. /package/dist-lib/{components → src/components}/icons/file-wordmark-pdf.d.ts +0 -0
  663. /package/dist-lib/{components → src/components}/icons/file-wordmark-tei.d.ts +0 -0
  664. /package/dist-lib/{components → src/components}/icons/file-wordmark-tf.d.ts +0 -0
  665. /package/dist-lib/{components → src/components}/icons/file-wordmark-txt.d.ts +0 -0
  666. /package/dist-lib/{components → src/components}/icons/file-wordmark-xml.d.ts +0 -0
  667. /package/dist-lib/{components → src/components}/icons/index.d.ts +0 -0
  668. /package/dist-lib/{components → src/components}/icons/types.d.ts +0 -0
  669. /package/dist-lib/{components → src/components}/motion/overflow-actions.d.ts +0 -0
  670. /package/dist-lib/{components → src/components}/motion/popover-morph.d.ts +0 -0
  671. /package/dist-lib/{components → src/components}/motion/popover-position.d.ts +0 -0
  672. /package/dist-lib/{components → src/components}/motion/shared-layout-bg.d.ts +0 -0
  673. /package/dist-lib/{components → src/components}/theme-provider.d.ts +0 -0
  674. /package/dist-lib/{components → src/components}/ui/button-group.d.ts +0 -0
  675. /package/dist-lib/{components → src/components}/ui/card.d.ts +0 -0
  676. /package/dist-lib/{components → src/components}/ui/checkbox.d.ts +0 -0
  677. /package/dist-lib/{components → src/components}/ui/field.d.ts +0 -0
  678. /package/dist-lib/{components → src/components}/ui/frame.d.ts +0 -0
  679. /package/dist-lib/{components → src/components}/ui/glasscn/glass-button-group.d.ts +0 -0
  680. /package/dist-lib/{components → src/components}/ui/glasscn/glass-button.d.ts +0 -0
  681. /package/dist-lib/{components → src/components}/ui/glasscn/glass-separator.d.ts +0 -0
  682. /package/dist-lib/{components → src/components}/ui/glasscn/liquid-glass.d.ts +0 -0
  683. /package/dist-lib/{components → src/components}/ui/group.d.ts +0 -0
  684. /package/dist-lib/{components → src/components}/ui/input-group.d.ts +0 -0
  685. /package/dist-lib/{components → src/components}/ui/input.d.ts +0 -0
  686. /package/dist-lib/{components → src/components}/ui/label.d.ts +0 -0
  687. /package/dist-lib/{components → src/components}/ui/menu.d.ts +0 -0
  688. /package/dist-lib/{components → src/components}/ui/otp-field.d.ts +0 -0
  689. /package/dist-lib/{components → src/components}/ui/separator.d.ts +0 -0
  690. /package/dist-lib/{components → src/components}/ui/sheet.d.ts +0 -0
  691. /package/dist-lib/{components → src/components}/ui/skeleton.d.ts +0 -0
  692. /package/dist-lib/{components → src/components}/ui/spinner.d.ts +0 -0
  693. /package/dist-lib/{components → src/components}/ui/switch.d.ts +0 -0
  694. /package/dist-lib/{components → src/components}/ui/textarea.d.ts +0 -0
  695. /package/dist-lib/{lib → src/lib}/auth-accent.d.ts +0 -0
  696. /package/dist-lib/{lib → src/lib}/glass-variants.d.ts +0 -0
  697. /package/dist-lib/{lib → src/lib}/hooks/use-hover-capable.d.ts +0 -0
  698. /package/dist-lib/{lib → src/lib}/sound.d.ts +0 -0
  699. /package/dist-lib/{state → src/lib/state}/exegia-provider.d.ts +0 -0
  700. /package/dist-lib/{state → src/lib/state}/index.d.ts +0 -0
  701. /package/dist-lib/{state → src/lib/state}/store.d.ts +0 -0
  702. /package/dist-lib/{lib → src/lib}/utils.d.ts +0 -0
  703. /package/src/{state → lib/state}/index.ts +0 -0
  704. /package/src/{state → lib/state}/store.ts +0 -0
@@ -1,286 +0,0 @@
1
- import { describe, expect, test } from "bun:test"
2
- import { act, fireEvent, render, screen } from "@testing-library/react"
3
- import { createStore, Provider } from "jotai"
4
-
5
- import { UserAvatar } from "../component"
6
- import {
7
- DEFAULT_BEZEL_ANGLE,
8
- removeUserAvatarInstance,
9
- resetUserAvatarAtom,
10
- setUserAvatarBezelAngleAtom,
11
- setUserAvatarImageToneAtom,
12
- setUserAvatarPresenceAtom,
13
- toggleUserAvatarPresenceAtom,
14
- userAvatarBezelAngleAtom,
15
- userAvatarImageToneAtom,
16
- userAvatarIsOnlineAtom,
17
- userAvatarPresenceAtom,
18
- userAvatarStateAtom,
19
- } from "../user-avatar-atom"
20
- import { bezelAlphasForTone } from "../utils"
21
- import { useUserAvatarActions, useUserAvatarState } from "../use-user-avatar-state"
22
- import type { UserAvatarActions, UserAvatarState } from "../type"
23
-
24
- const badge = () => document.querySelector('[data-slot="user-avatar-presence"]')
25
- const bezel = () => document.querySelector('[data-slot="user-avatar-bezel"]')
26
- const frame = () =>
27
- document.querySelector<HTMLElement>('[data-slot="user-avatar-frame"]')
28
- /** The rim's rotation, parsed. The component damps the stored bearing
29
- * (`bezelAngle * 0.8`) so the highlight trails the pointer slightly. */
30
- const BEZEL_DAMPING = 0.8
31
- const rimRotation = () => {
32
- const match = /rotate\((-?[\d.]+)deg\)/.exec(bezel()?.getAttribute("style") ?? "")
33
- return match ? Number(match[1]) : Number.NaN
34
- }
35
-
36
- describe("UserAvatar · presence badge", () => {
37
- test("no presence, no badge", () => {
38
- render(<UserAvatar name="Jenny Hamilton" />)
39
- expect(badge()).toBeNull()
40
- })
41
-
42
- test("online is a filled dot named for AT; offline a hollow ring", () => {
43
- const { rerender } = render(
44
- <UserAvatar name="Jenny Hamilton" presence="online" />
45
- )
46
- expect(badge()?.getAttribute("data-presence")).toBe("online")
47
- expect(screen.getByRole("img", { name: "Online" })).toBeDefined()
48
- expect(badge()?.className).toContain("bg-emerald-500")
49
-
50
- rerender(<UserAvatar name="Jenny Hamilton" presence="offline" />)
51
- expect(screen.getByRole("img", { name: "Offline" })).toBeDefined()
52
- expect(badge()?.className).toContain("border-2")
53
-
54
- // Releasing the prop clears the badge — a real transition for a user.
55
- rerender(<UserAvatar name="Jenny Hamilton" />)
56
- expect(badge()).toBeNull()
57
- })
58
-
59
- test("online reflects the badge colour onto the disc; offline does not", async () => {
60
- const reflection = () =>
61
- document.querySelector('[data-slot="user-avatar-reflection"]')
62
- const { rerender } = render(
63
- <UserAvatar name="Jenny Hamilton" presence="online" />
64
- )
65
- expect(reflection()).not.toBeNull()
66
- // Static — no transform, unlike the bezel rim.
67
- expect(reflection()?.getAttribute("style")).toBeNull()
68
- expect(reflection()?.className).toContain("radial-gradient")
69
- // Initials disc: the smaller, fainter pool.
70
- expect(reflection()?.hasAttribute("data-image")).toBe(false)
71
- expect(reflection()?.className).toContain("[--reflect-peak:16%]")
72
- // A requested-but-not-loaded src still shows initials — still the small
73
- // pool; only a loaded photo gets the larger one.
74
- // happy-dom's Image reports naturalWidth 0 (Base UI reads that as a
75
- // failed preload) — a broken src keeps the initials and the small pool.
76
- rerender(
77
- <UserAvatar name="Jenny Hamilton" presence="online" src="/broken.jpg" />
78
- )
79
- expect(reflection()?.hasAttribute("data-image")).toBe(false)
80
-
81
- // Stand in a preload that succeeds: now a photo is on screen.
82
- const RealImage = window.Image
83
- window.Image = class {
84
- complete = true
85
- naturalWidth = 72
86
- onload: (() => void) | null = null
87
- onerror: (() => void) | null = null
88
- src = ""
89
- } as unknown as typeof window.Image
90
- try {
91
- rerender(
92
- <UserAvatar name="Jenny Hamilton" presence="online" src="/ok.jpg" />
93
- )
94
- await act(async () => {
95
- await new Promise((r) => setTimeout(r, 0))
96
- })
97
- expect(reflection()?.hasAttribute("data-image")).toBe(true)
98
- expect(reflection()?.className).toContain("[--reflect-peak:30%]")
99
- } finally {
100
- window.Image = RealImage
101
- }
102
- rerender(<UserAvatar name="Jenny Hamilton" presence="offline" />)
103
- expect(reflection()).toBeNull()
104
- })
105
-
106
- test("the badge carries a sheen lit from the bezel angle; none without a bezel", async () => {
107
- const sheen = () =>
108
- document.querySelector('[data-slot="user-avatar-presence-sheen"]')
109
- const { rerender } = render(
110
- <UserAvatar avatarId="sheen" name="Jenny Hamilton" presence="online" />
111
- )
112
- expect(sheen()).not.toBeNull()
113
- const rot = () =>
114
- Number(/rotate\((-?[\d.]+)deg\)/.exec(sheen()?.getAttribute("style") ?? "")?.[1])
115
- expect(rot()).toBeCloseTo(DEFAULT_BEZEL_ANGLE * BEZEL_DAMPING, 5)
116
-
117
- // Same light as the rim: a pointer move rotates both together.
118
- const host = frame() as HTMLElement
119
- host.getBoundingClientRect = () =>
120
- ({ left: 100, top: 100, width: 40, height: 40, right: 140, bottom: 140 }) as DOMRect
121
- await act(async () => {
122
- fireEvent.pointerMove(window, { clientX: 200, clientY: 120 })
123
- await new Promise((r) => requestAnimationFrame(() => r(null)))
124
- })
125
- expect(rot()).toBeCloseTo(90 * BEZEL_DAMPING, 5)
126
- expect(rot()).toBeCloseTo(rimRotation(), 5)
127
-
128
- rerender(<UserAvatar bezel={false} name="Jenny Hamilton" presence="online" />)
129
- expect(sheen()).toBeNull()
130
- removeUserAvatarInstance("sheen")
131
- })
132
-
133
- test("the root carries data-presence for styling hooks", () => {
134
- render(<UserAvatar name="Jenny Hamilton" presence="online" />)
135
- expect(
136
- document
137
- .querySelector('[data-slot="user-avatar"]')
138
- ?.getAttribute("data-presence")
139
- ).toBe("online")
140
- })
141
- })
142
-
143
- describe("UserAvatar · bezel", () => {
144
- test("on by default: an emboss shadow on the root and a rotated rim", () => {
145
- render(<UserAvatar name="Jenny Hamilton" />)
146
- const root = document.querySelector('[data-slot="user-avatar"]')
147
- expect(root?.hasAttribute("data-bezel")).toBe(true)
148
- expect(root?.className).toContain("shadow-[inset")
149
- // Rests at the classic top-left light until a pointer moves.
150
- expect(rimRotation()).toBeCloseTo(DEFAULT_BEZEL_ANGLE * BEZEL_DAMPING, 5)
151
- })
152
-
153
- test("bezel={false} renders a flat disc", () => {
154
- render(<UserAvatar bezel={false} name="Jenny Hamilton" />)
155
- expect(bezel()).toBeNull()
156
- expect(
157
- document.querySelector('[data-slot="user-avatar"]')?.hasAttribute("data-bezel")
158
- ).toBe(false)
159
- })
160
-
161
- test("the rim follows the pointer's bearing from the avatar's centre", async () => {
162
- render(<UserAvatar avatarId="lit" name="Jenny Hamilton" />)
163
- const host = frame() as HTMLElement
164
- // happy-dom rects are 0×0; give the frame a box the hook can measure.
165
- host.getBoundingClientRect = () =>
166
- ({ left: 100, top: 100, width: 40, height: 40, right: 140, bottom: 140 }) as DOMRect
167
-
168
- // Pointer straight to the right of centre (120,120) → 3 o'clock → 90°.
169
- await act(async () => {
170
- fireEvent.pointerMove(window, { clientX: 200, clientY: 120 })
171
- await new Promise((r) => requestAnimationFrame(() => r(null)))
172
- })
173
- expect(rimRotation()).toBeCloseTo(90 * BEZEL_DAMPING, 5)
174
-
175
- // Straight below → 6 o'clock → 180°.
176
- await act(async () => {
177
- fireEvent.pointerMove(window, { clientX: 120, clientY: 300 })
178
- await new Promise((r) => requestAnimationFrame(() => r(null)))
179
- })
180
- expect(rimRotation()).toBeCloseTo(180 * BEZEL_DAMPING, 5)
181
- removeUserAvatarInstance("lit")
182
- })
183
- })
184
-
185
- describe("UserAvatar · bezel tone", () => {
186
- test("alphas lean on the shadow over a pale rim and ease the highlight over a dark one", () => {
187
- const dark = bezelAlphasForTone(0)
188
- const light = bezelAlphasForTone(1)
189
- expect(dark.hi).toBeLessThan(light.hi)
190
- expect(dark.lo).toBeGreaterThan(light.lo)
191
- // Out-of-range input clamps rather than extrapolating past [0, 1].
192
- expect(bezelAlphasForTone(-3)).toEqual(dark)
193
- expect(bezelAlphasForTone(7)).toEqual(light)
194
- })
195
-
196
- test("without a sampled tone the rim carries no inline alphas — the theme's defaults apply", () => {
197
- render(<UserAvatar name="Jenny Hamilton" />)
198
- const rim = bezel()
199
- expect(rim?.hasAttribute("data-tone")).toBe(false)
200
- expect(rim?.getAttribute("style")).not.toContain("--bezel-hi-a")
201
- // The defaults live in classes, per theme, so a photo-less disc is lit
202
- // for the page it sits on.
203
- expect(rim?.className).toContain("[--bezel-hi-a:1]")
204
- expect(rim?.className).toContain("dark:[--bezel-hi-a:0.18]")
205
- })
206
-
207
- test("the tone atom clamps and clears", () => {
208
- const store = createStore()
209
- store.set(setUserAvatarImageToneAtom("t"), 1.7)
210
- expect(store.get(userAvatarImageToneAtom("t"))).toBe(1)
211
- store.set(setUserAvatarImageToneAtom("t"), 0.3)
212
- expect(store.get(userAvatarImageToneAtom("t"))).toBe(0.3)
213
- store.set(setUserAvatarImageToneAtom("t"), Number.NaN)
214
- expect(store.get(userAvatarImageToneAtom("t"))).toBeNull()
215
- store.set(setUserAvatarImageToneAtom("t"), 0.5)
216
- store.set(resetUserAvatarAtom("t"))
217
- expect(store.get(userAvatarImageToneAtom("t"))).toBeNull()
218
- removeUserAvatarInstance("t")
219
- })
220
- })
221
-
222
- describe("UserAvatar · store", () => {
223
- test("presence, toggle, isOnline and reset on an isolated store", () => {
224
- const store = createStore()
225
- expect(store.get(userAvatarPresenceAtom("a"))).toBeNull()
226
- store.set(setUserAvatarPresenceAtom("a"), "online")
227
- expect(store.get(userAvatarIsOnlineAtom("a"))).toBe(true)
228
- store.set(toggleUserAvatarPresenceAtom("a"))
229
- expect(store.get(userAvatarPresenceAtom("a"))).toBe("offline")
230
- // A badge-less avatar comes online on toggle.
231
- store.set(setUserAvatarPresenceAtom("a"), null)
232
- store.set(toggleUserAvatarPresenceAtom("a"))
233
- expect(store.get(userAvatarPresenceAtom("a"))).toBe("online")
234
-
235
- store.set(setUserAvatarBezelAngleAtom("a"), 400)
236
- // Continuous — not wrapped — so a CSS rotation takes the short way.
237
- expect(store.get(userAvatarBezelAngleAtom("a"))).toBe(400)
238
- store.set(setUserAvatarBezelAngleAtom("a"), Number.NaN)
239
- expect(store.get(userAvatarBezelAngleAtom("a"))).toBe(400)
240
-
241
- store.set(resetUserAvatarAtom("a"))
242
- expect(store.get(userAvatarStateAtom("a"))).toEqual({
243
- presence: null,
244
- bezelAngle: DEFAULT_BEZEL_ANGLE,
245
- imageStatus: "idle",
246
- imageTone: null,
247
- })
248
- removeUserAvatarInstance("a")
249
- })
250
-
251
- test("a controlled presence prop wins over store writes; hooks by id read and drive", () => {
252
- let actions!: UserAvatarActions
253
- let state!: UserAvatarState
254
- function Probe() {
255
- actions = useUserAvatarActions("me")
256
- state = useUserAvatarState("me")
257
- return null
258
- }
259
- const store = createStore()
260
- const { rerender } = render(
261
- <Provider store={store}>
262
- <UserAvatar avatarId="me" name="Jenny Hamilton" presence="offline" />
263
- <Probe />
264
- </Provider>
265
- )
266
- expect(state.presence).toBe("offline")
267
- act(() => actions.setPresence("online"))
268
- // Controlled: the store write is inert, the badge stays offline.
269
- expect(badge()?.getAttribute("data-presence")).toBe("offline")
270
-
271
- // Uncontrolled: the store drives the badge from anywhere.
272
- rerender(
273
- <Provider store={store}>
274
- <UserAvatar avatarId="me" name="Jenny Hamilton" />
275
- <Probe />
276
- </Provider>
277
- )
278
- expect(badge()).toBeNull()
279
- act(() => actions.setPresence("online"))
280
- expect(badge()?.getAttribute("data-presence")).toBe("online")
281
- expect(state.presence).toBe("online")
282
- act(() => actions.togglePresence())
283
- expect(badge()?.getAttribute("data-presence")).toBe("offline")
284
- removeUserAvatarInstance("me")
285
- })
286
- })
@@ -1,22 +0,0 @@
1
- import { cn } from "@/lib/utils"
2
- import type { IAudioWaveProps } from "./type"
3
-
4
- // `volume` is accepted but not yet wired to the ring animation.
5
- export function AudioWave({ className, volume: _volume, children }: IAudioWaveProps) {
6
- return (
7
- <div
8
- className={cn(
9
- "group/avatar relative flex items-center justify-center",
10
- className
11
- )}
12
- >
13
- {/* Animated Story Ring */}
14
- <div className="absolute -inset-1 animate-[spin_3s_linear_infinite] rounded-full bg-linear-to-tr from-yellow-400 via-fuchsia-500 to-violet-600 opacity-75 blur-xs transition-all duration-500 group-hover/avatar:opacity-100 group-hover/avatar:blur-sm" />
15
-
16
- {/* Main Avatar */}
17
- <div className="size-10 ring-2 ring-background transition-transform duration-500 group-hover/avatar:scale-95">
18
- {children}
19
- </div>
20
- </div>
21
- )
22
- }
@@ -1,182 +0,0 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
-
5
- import { Avatar, AvatarImage } from "@/components/ui/avatar"
6
- import { cn } from "@/lib/utils"
7
- import { Fallback } from "./fallback"
8
- import { PresenceBadge } from "./presence-badge"
9
- import type { UserAvatarProps } from "./type"
10
- import { useUserAvatar } from "./use-user-avatar"
11
- import { bezelAlphasForTone } from "./utils"
12
-
13
- /**
14
- * Identity avatar: an image when one is given, initials otherwise, with an
15
- * optional presence badge and a pointer-lit bezel.
16
- *
17
- * A passed `src` is assumed to be remote, so the slot holds a skeleton until
18
- * the image resolves rather than flashing initials that are about to be
19
- * replaced. A failed load settles on the initials.
20
- *
21
- * State (presence, bezel angle, image status) lives in Jotai atoms keyed by
22
- * `avatarId` — name the avatar and `useUserAvatarActions(id).setPresence()`
23
- * flips its badge from anywhere under `ExegiaProvider`.
24
- */
25
- /** The rim (and the badge sheen) trail the pointer's bearing slightly rather
26
- * than pointing dead at it — a touch of lag reads as weight. */
27
- const BEZEL_DAMPING = 0.8
28
-
29
- export function UserAvatar({
30
- src,
31
- name = "",
32
- initials,
33
- alt,
34
- loading: loadingProp,
35
- presence: presenceProp,
36
- bezel = true,
37
- avatarId,
38
- className,
39
- style,
40
- ...props
41
- }: UserAvatarProps): React.ReactElement {
42
- const hasImage = src !== undefined
43
- const avatar = useUserAvatar({
44
- avatarId,
45
- presence: presenceProp,
46
- bezel,
47
- hasImage,
48
- src,
49
- })
50
- const { presence, bezelAngle, imageStatus, imageTone, setImageStatus, ref } =
51
- avatar
52
-
53
- const loading =
54
- loadingProp ??
55
- (hasImage && (imageStatus === "idle" || imageStatus === "loading"))
56
- // A photo is actually on screen — not merely requested. A broken or
57
- // still-loading `src` shows initials/skeleton and should be treated as
58
- // the flat disc it is.
59
- const showsImage = hasImage && loadingProp !== true && imageStatus === "loaded"
60
- // With a photo on screen and its rim sampled, the bezel's alphas follow the
61
- // photo rather than the theme: the ring sits on the image, not the page.
62
- const bezelAlphas =
63
- showsImage && imageTone !== null ? bezelAlphasForTone(imageTone) : null
64
-
65
- return (
66
- // The frame is what the badge and bezel hang off: the Avatar root clips
67
- // to its circle, and the badge has to sit on the rim, half outside it.
68
- // Sizing classes still target the Avatar — the frame shrink-wraps it.
69
- <span
70
- className="relative inline-flex shrink-0 rounded-full"
71
- data-slot="user-avatar-frame"
72
- ref={ref as React.RefObject<HTMLSpanElement>}
73
- >
74
- <Avatar
75
- className={cn(
76
- // `@container` lets the fallback size its initials in cqw — a
77
- // fraction of whatever `size-*` the caller put on this element —
78
- // instead of a fixed text step. `text-xl` stays as the fallback for
79
- // engines without container units.
80
- "@container size-8 border-1 border-white bg-neutral-800! text-xl dark:border-neutral-900",
81
- // The emboss itself: an inset drop toward the light's opposite side
82
- // is what the ring below is rotated against.
83
- bezel &&
84
- "shadow-[inset_0_3px_3px_--theme(--color-white/80%),inset_0_-1px_2px_--theme(--color-black/15%)] dark:shadow-[inset_0_1px_1px_--theme(--color-white/5%),inset_0_-8px_2px_--theme(--color-black/20%)]",
85
- className
86
- )}
87
- data-avatar-id={avatar.avatarId}
88
- data-bezel={bezel ? "" : undefined}
89
- data-loading={loading || undefined}
90
- data-presence={presence ?? undefined}
91
- data-slot="user-avatar"
92
- style={style}
93
- {...props}
94
- >
95
- {/* Held back while forced-loading: a loaded image would hide the
96
- fallback the skeleton lives in. */}
97
- {!hasImage || loadingProp === true ? null : (
98
- <AvatarImage
99
- alt={alt ?? name}
100
- onLoadingStatusChange={setImageStatus}
101
- src={src}
102
- />
103
- )}
104
- <Fallback name={name} initials={initials} loading={loading} />
105
- </Avatar>
106
- {presence === "online" ? (
107
- // The badge's green "reflected" onto the disc: a static radial wash
108
- // anchored at the badge corner that fades inward, so the dot reads
109
- // as a light source sitting on the avatar rather than a sticker on
110
- // it. Does not move with the bezel — it belongs to the badge, not
111
- // the pointer. Sits above the image, below the bezel and the badge.
112
- <span
113
- aria-hidden="true"
114
- className={cn(
115
- "pointer-events-none absolute inset-0 rounded-full",
116
- // One gradient, four knobs: colour, peak alpha, mid alpha, reach.
117
- // Light mode is quieter than dark (a green wash on a pale disc
118
- // reads as a stain, on a dark one as a glow), and an initials
119
- // disc — flat, no photo to sit on — takes a smaller, fainter
120
- // pool than an image does.
121
- "[--reflect:--theme(--color-emerald-500)] dark:[--reflect:--theme(--color-emerald-400)]",
122
- showsImage
123
- ? "[--reflect-peak:30%] [--reflect-mid:12%] [--reflect-reach:56%] dark:[--reflect-peak:40%] dark:[--reflect-mid:16%] dark:[--reflect-reach:60%]"
124
- : "[--reflect-peak:16%] [--reflect-mid:6%] [--reflect-reach:40%] dark:[--reflect-peak:26%] dark:[--reflect-mid:9%] dark:[--reflect-reach:46%]",
125
- "bg-[radial-gradient(circle_at_88%_88%,color-mix(in_oklab,var(--reflect)_var(--reflect-peak),transparent)_0%,color-mix(in_oklab,var(--reflect)_var(--reflect-mid),transparent)_22%,transparent_var(--reflect-reach))]",
126
- "transition-opacity duration-150 ease-smooth-out"
127
- )}
128
- data-image={showsImage ? "" : undefined}
129
- data-slot="user-avatar-reflection"
130
- />
131
- ) : null}
132
- {bezel ? (
133
- // A conic highlight → shadow sweep, masked to a thin rim and rotated
134
- // so the highlight faces the pointer. Rotation (not the gradient
135
- // angle) is what moves, because `transform` transitions and a
136
- // gradient stop does not. The highlight is white and the shadow
137
- // black at alphas `--bezel-hi-a` / `--bezel-lo-a`: light and dark
138
- // pick their own defaults (a white rim glares on a dark page), and a
139
- // sampled photo overrides both inline so the ring is weighted against
140
- // the image it actually sits on — scaled by `--bezel-hi-k`, because
141
- // the rim borders the page as much as the photo and the same white
142
- // that lifts a dark portrait off a light page glares on a dark one.
143
- <span
144
- aria-hidden="true"
145
- className={cn(
146
- "pointer-events-none absolute inset-0 rounded-full",
147
- "[--bezel-hi-a:1] [--bezel-lo-a:0.2] dark:[--bezel-hi-a:0.18] dark:[--bezel-lo-a:0.4]",
148
- "[--bezel-hi-k:1] dark:[--bezel-hi-k:0.55]",
149
- "[--bezel-hi:color-mix(in_oklab,white_calc(var(--bezel-hi-a)*100%),transparent)]",
150
- "[--bezel-lo:color-mix(in_oklab,black_calc(var(--bezel-lo-a)*100%),transparent)]",
151
- // Starts at 6 o'clock: shadow there, highlight peaking at 12 (50%),
152
- // symmetric either side — so rotate(angle) puts the highlight at
153
- // exactly `bezelAngle` clockwise from 12.
154
- "bg-[conic-gradient(from_180deg,var(--bezel-lo)_0%,transparent_24%,transparent_28%,var(--bezel-hi)_50%,transparent_72%,transparent_76%,var(--bezel-lo)_100%)]",
155
- // Rim width is a share of the radius, not a px count, so the
156
- // bezel reads the same at size-8 and size-16: solid over the outer
157
- // 8%, feathering in over the 14% inside that.
158
- "[mask-image:radial-gradient(farthest-side,transparent_78%,#000_92%)]",
159
- "mix-blend-normal transition-transform duration-150 ease-smooth-out motion-reduce:transition-none"
160
- )}
161
- data-slot="user-avatar-bezel"
162
- data-tone={imageTone === null ? undefined : imageTone.toFixed(2)}
163
- style={{
164
- transform: `rotate(${bezelAngle * BEZEL_DAMPING}deg)`,
165
- ...(bezelAlphas
166
- ? {
167
- "--bezel-hi-a": `calc(${bezelAlphas.hi.toFixed(2)} * var(--bezel-hi-k))`,
168
- "--bezel-lo-a": bezelAlphas.lo.toFixed(2),
169
- }
170
- : null),
171
- }}
172
- />
173
- ) : null}
174
- {presence ? (
175
- <PresenceBadge
176
- lightAngle={bezel ? bezelAngle * BEZEL_DAMPING : undefined}
177
- presence={presence}
178
- />
179
- ) : null}
180
- </span>
181
- )
182
- }
@@ -1,28 +0,0 @@
1
- import { AvatarFallback } from "@/components/ui/avatar"
2
- import { Skeleton } from "@/components/ui/skeleton"
3
- import { initialsFrom } from "./utils"
4
-
5
- export function Fallback({
6
- name,
7
- initials,
8
- loading,
9
- }: {
10
- name?: string
11
- initials?: string
12
- loading?: boolean
13
- }) {
14
- return (
15
- // Initials scale with the disc: 42% of the avatar's width (≈ text-xl on
16
- // size-12), resolved against the `@container` on the Avatar root.
17
- <AvatarFallback className="text-[42cqw]">
18
- {loading ? (
19
- <Skeleton
20
- className="size-full rounded-full"
21
- data-slot="avatar-skeleton"
22
- />
23
- ) : (
24
- (initials ?? initialsFrom(name ?? ""))
25
- )}
26
- </AvatarFallback>
27
- )
28
- }
@@ -1,34 +0,0 @@
1
- import { AudioWave } from "./audio-wave"
2
- import { UserAvatar } from "./component"
3
- import { Fallback } from "./fallback"
4
-
5
- export { AudioWave } from "./audio-wave"
6
- export { UserAvatar } from "./component"
7
- export { Fallback } from "./fallback"
8
- export { PresenceBadge } from "./presence-badge"
9
- export { initialsFrom } from "./utils"
10
- export { useUserAvatar } from "./use-user-avatar"
11
- export type { UseUserAvatarOptions, UserAvatarBinding } from "./use-user-avatar"
12
- export { useUserAvatarActions, useUserAvatarState } from "./use-user-avatar-state"
13
- // The public atom surface. `@internal` atoms (config, image status, the
14
- // props projection) stay unexported on purpose — `export *` would make every
15
- // internal a breaking-change surface for consumer apps.
16
- export {
17
- DEFAULT_BEZEL_ANGLE,
18
- removeUserAvatarInstance,
19
- resetUserAvatarAtom,
20
- setUserAvatarBezelAngleAtom,
21
- setUserAvatarPresenceAtom,
22
- toggleUserAvatarPresenceAtom,
23
- userAvatarBezelAngleAtom,
24
- userAvatarIsOnlineAtom,
25
- userAvatarPresenceAtom,
26
- userAvatarStateAtom,
27
- } from "./user-avatar-atom"
28
- export type * from "./type"
29
-
30
- export const Avatar = {
31
- AudioWave,
32
- Component: UserAvatar,
33
- Fallback,
34
- }
@@ -1,56 +0,0 @@
1
- import { cn } from "@/lib/utils"
2
- import type { UserPresence } from "./type"
3
-
4
- /**
5
- * Corner dot naming whether the person is reachable. Sits on the avatar
6
- * frame, outside the clipped circle, with a background-coloured ring so it
7
- * reads against any image. Colour is not the only signal: `offline` is a
8
- * hollow ring, `online` a filled dot, and the label is spelled out for AT.
9
- *
10
- * `lightAngle` (degrees clockwise from 12) lays a faint sheen across the dot
11
- * from that side — the same angle the avatar's bezel is lit from, so the two
12
- * highlights agree and the badge reads as a bead sitting in the same light.
13
- */
14
- export function PresenceBadge({
15
- presence,
16
- lightAngle,
17
- className,
18
- }: {
19
- presence: UserPresence
20
- lightAngle?: number
21
- className?: string
22
- }) {
23
- const online = presence === "online"
24
- return (
25
- <span
26
- aria-label={online ? "Online" : "Offline"}
27
- className={cn(
28
- "absolute right-0 bottom-0 box-content size-[22%] min-h-1.5 min-w-1.5 overflow-hidden rounded-full",
29
- "ring-2 ring-background transition-colors duration-150 ease-smooth-out",
30
- online
31
- ? "bg-emerald-500 dark:bg-emerald-400"
32
- : "border-2 border-muted-foreground/60 bg-background dark:border-muted-foreground/70",
33
- className
34
- )}
35
- data-presence={presence}
36
- data-slot="user-avatar-presence"
37
- role="img"
38
- >
39
- {lightAngle !== undefined ? (
40
- // Highlight at 12 o'clock, fading out by the middle, rotated so it
41
- // faces the light. Rotation transitions; the gradient is static.
42
- <span
43
- aria-hidden="true"
44
- className={cn(
45
- "pointer-events-none absolute inset-0 rounded-full",
46
- "bg-[linear-gradient(to_bottom,--theme(--color-white/55%),--theme(--color-white/12%)_38%,transparent_58%)]",
47
- "dark:bg-[linear-gradient(to_bottom,--theme(--color-white/40%),--theme(--color-white/8%)_38%,transparent_58%)]",
48
- "transition-transform duration-150 ease-smooth-out motion-reduce:transition-none"
49
- )}
50
- data-slot="user-avatar-presence-sheen"
51
- style={{ transform: `rotate(${lightAngle}deg)` }}
52
- />
53
- ) : null}
54
- </span>
55
- )
56
- }