@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,596 +0,0 @@
1
- import { describe, expect, mock, test } from "bun:test"
2
- import { act, render, screen } from "@testing-library/react"
3
- import userEvent from "@testing-library/user-event"
4
-
5
- import { ShellLayout } from "../shell-layout"
6
- import { useShellPanels } from "../use-shell-panels"
7
- import { SHELL_WIDTHS } from "../utils"
8
- import type { TPanelMap, IUseShellPanelsOptions } from "../type"
9
-
10
- const PANELS: TPanelMap = {
11
- left: {
12
- id: "nav",
13
- name: "Navigation",
14
- component: <div>Nav body</div>,
15
- open: true,
16
- side: "left",
17
- },
18
- right: {
19
- id: "inspector",
20
- name: "Inspector",
21
- component: <div>Inspector body</div>,
22
- open: false,
23
- side: "right",
24
- },
25
- }
26
-
27
- /** The shell resolves its columns from CSS variables with hidden probe
28
- * elements. happy-dom has no layout engine, so every probe measures 0 and the
29
- * fit rule fails open — answer the probes with the real px behind each
30
- * variable so the rule works on the numbers it ships with:
31
- *
32
- * rail 256 (56 folded) + body 360 + panel 320
33
- *
34
- * Only probes are intercepted; every other box keeps happy-dom's answer. */
35
- function stubShellWidths(containerWidth = () => window.innerWidth) {
36
- const px = Object.fromEntries(
37
- Object.entries(SHELL_WIDTHS).map(([name, value]) => [
38
- name,
39
- Number.parseFloat(value),
40
- ])
41
- )
42
- const original = Element.prototype.getBoundingClientRect
43
- Element.prototype.getBoundingClientRect = function (this: HTMLElement) {
44
- if (this.getAttribute("data-slot") === "sidebar-wrapper")
45
- return { width: containerWidth() } as DOMRect
46
- const isProbe =
47
- this.style.visibility === "hidden" && this.style.position === "absolute"
48
- if (!isProbe) return original.call(this)
49
-
50
- const variable = /var\((--[a-z-]+)\)/.exec(this.style.width)?.[1]
51
- return { width: (variable && px[variable]) || 0 } as DOMRect
52
- }
53
- return () => {
54
- Element.prototype.getBoundingClientRect = original
55
- }
56
- }
57
-
58
- interface IHappyDOMWindow {
59
- happyDOM?: { setViewport: (viewport: { width: number }) => void }
60
- }
61
-
62
- /** Resize the viewport the way the shell hears it: happy-dom's own viewport
63
- * plus the `resize` event, inside `act` so the remeasure lands in this tick. */
64
- function resizeViewport(width: number) {
65
- act(() => {
66
- ;(globalThis as IHappyDOMWindow).happyDOM?.setViewport({ width })
67
- window.dispatchEvent(new Event("resize"))
68
- })
69
- }
70
-
71
- /** happy-dom's default, restored between viewport tests. */
72
- const WIDE_VIEWPORT = 1024
73
-
74
- /** Mount the shell at `width` px of viewport with real column widths in play.
75
- * The returned function puts both back — inside `act`, because happy-dom
76
- * fires `resize` on `setViewport` and the shell (still mounted until
77
- * cleanup) remeasures on it. */
78
- function shellViewport(width: number) {
79
- const restoreWidths = stubShellWidths()
80
- ;(globalThis as IHappyDOMWindow).happyDOM?.setViewport({ width })
81
- return () => {
82
- restoreWidths()
83
- act(() => {
84
- ;(globalThis as IHappyDOMWindow).happyDOM?.setViewport({
85
- width: WIDE_VIEWPORT,
86
- })
87
- })
88
- }
89
- }
90
-
91
- /** The desktop rail / drawer elements, queried by their landmark roles. */
92
- function leftRail() {
93
- return screen.getByRole("navigation", { name: "Primary navigation" })
94
- }
95
-
96
- function rightDrawer(name = "Inspector") {
97
- return document.querySelector(`[data-slot="sidebar"][aria-label="${name}"]`)!
98
- }
99
-
100
- describe("ShellLayout", () => {
101
- test("renders panel content by side and children in the inset", () => {
102
- render(
103
- <ShellLayout panels={PANELS} variant="web">
104
- <div>Main content</div>
105
- </ShellLayout>
106
- )
107
-
108
- expect(leftRail().textContent).toContain("Nav body")
109
- expect(rightDrawer().textContent).toContain("Inspector body")
110
- expect(screen.getByRole("main").textContent).toContain("Main content")
111
- })
112
-
113
- test("names the right drawer after its panel", () => {
114
- render(<ShellLayout panels={PANELS} variant="web" />)
115
-
116
- expect(rightDrawer("Inspector")).toBeDefined()
117
- })
118
-
119
- test("trailing actions stay in the right cluster without a header", () => {
120
- render(
121
- <ShellLayout
122
- panels={PANELS}
123
- trailing={<button type="button">Upload</button>}
124
- variant="web"
125
- />
126
- )
127
-
128
- const upload = screen.getByRole("button", { name: "Upload" })
129
- const cluster = upload.parentElement
130
- // Pinned by margin, not by flex-filling: the cluster hugs the right edge
131
- // even with nothing beside it to push against.
132
- expect(cluster?.className).toContain("ml-auto")
133
- // The right panel's trigger sits after the actions, at the far edge.
134
- expect(
135
- cluster?.contains(screen.getByRole("button", { name: "Toggle panel" }))
136
- ).toBe(true)
137
- })
138
-
139
- test("trailing renders the cluster even with no right panel", () => {
140
- render(
141
- <ShellLayout
142
- trailing={<button type="button">Upload</button>}
143
- variant="web"
144
- />
145
- )
146
-
147
- expect(screen.getByRole("button", { name: "Upload" })).toBeDefined()
148
- expect(screen.queryByRole("button", { name: "Toggle panel" })).toBeNull()
149
- })
150
-
151
- test("panelComponents renders a side with no static panels entry", () => {
152
- render(
153
- <ShellLayout
154
- panelComponents={{ right: <div>Dynamic body</div> }}
155
- variant="web"
156
- />
157
- )
158
-
159
- expect(rightDrawer("Secondary panel").textContent).toContain("Dynamic body")
160
- })
161
-
162
- test("the header triggers toggle their own side", async () => {
163
- const user = userEvent.setup()
164
- render(<ShellLayout panels={PANELS} variant="web" />)
165
-
166
- const leftTrigger = screen.getByRole("button", { name: "Toggle sidebar" })
167
- const rightTrigger = screen.getByRole("button", { name: "Toggle panel" })
168
-
169
- expect(leftRail().getAttribute("data-state")).toBe("expanded")
170
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
171
-
172
- await user.click(leftTrigger)
173
- expect(leftRail().getAttribute("data-state")).toBe("collapsed")
174
- expect(leftTrigger.getAttribute("aria-expanded")).toBe("false")
175
- // The other side is untouched.
176
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
177
-
178
- await user.click(rightTrigger)
179
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
180
- expect(rightTrigger.getAttribute("aria-expanded")).toBe("true")
181
- expect(leftRail().getAttribute("data-state")).toBe("collapsed")
182
- })
183
-
184
- test("the shell owns the trigger icon, ignoring a panel's trigger node", async () => {
185
- const user = userEvent.setup()
186
- render(
187
- <ShellLayout
188
- panels={{
189
- ...PANELS,
190
- right: { ...PANELS.right!, trigger: <span>Custom trigger</span> },
191
- }}
192
- variant="web"
193
- />
194
- )
195
-
196
- const rightTrigger = screen.getByRole("button", { name: "Toggle panel" })
197
- expect(rightTrigger.textContent).not.toContain("Custom trigger")
198
-
199
- await user.click(rightTrigger)
200
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
201
- })
202
-
203
- test("a side with no panel gets no header trigger", () => {
204
- render(<ShellLayout panels={{ left: PANELS.left! }} variant="web" />)
205
-
206
- expect(screen.getByRole("button", { name: "Toggle sidebar" })).toBeDefined()
207
- expect(screen.queryByRole("button", { name: "Toggle panel" })).toBeNull()
208
- })
209
-
210
- test("a panel's own defaultOpen flag seeds its side's initial state", () => {
211
- render(
212
- <ShellLayout
213
- panels={{
214
- ...PANELS,
215
- right: { ...PANELS.right!, defaultOpen: true },
216
- }}
217
- variant="web"
218
- />
219
- )
220
-
221
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
222
- })
223
-
224
- test("an explicit defaultOpen record wins over the panel's flag", () => {
225
- render(
226
- <ShellLayout
227
- defaultOpen={{ left: false, right: false }}
228
- panels={{
229
- ...PANELS,
230
- right: { ...PANELS.right!, defaultOpen: true },
231
- }}
232
- variant="web"
233
- />
234
- )
235
-
236
- expect(leftRail().getAttribute("data-state")).toBe("collapsed")
237
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
238
- })
239
-
240
- test("keeps the right panel while every column fits", () => {
241
- // 256 + 360 + 320 = 936, inside happy-dom's 1024px viewport.
242
- const restore = shellViewport(WIDE_VIEWPORT)
243
- try {
244
- render(<ShellLayout panels={PANELS} variant="web" />)
245
-
246
- expect(rightDrawer()).toBeDefined()
247
- expect(screen.getByRole("button", { name: "Toggle panel" })).toBeDefined()
248
- } finally {
249
- restore()
250
- }
251
- })
252
-
253
- test("drops the right panel when the columns no longer fit", () => {
254
- // 936 needed, 800 available.
255
- const restore = shellViewport(800)
256
- try {
257
- render(<ShellLayout panels={PANELS} variant="web" />)
258
-
259
- expect(screen.queryByRole("complementary")).toBeNull()
260
- // Its trigger goes with it rather than driving nothing.
261
- expect(screen.queryByRole("button", { name: "Toggle panel" })).toBeNull()
262
- // The rail and the body are untouched — they are never the ones to go.
263
- expect(leftRail()).toBeDefined()
264
- expect(screen.getByRole("main")).toBeDefined()
265
- } finally {
266
- restore()
267
- }
268
- })
269
-
270
- test("folding the left rail hands its column to the right panel", async () => {
271
- const user = userEvent.setup()
272
- // Expanded: 256 + 360 + 320 = 936 > 800. Folded: 56 + 360 + 320 = 736.
273
- const restore = shellViewport(800)
274
- try {
275
- render(<ShellLayout panels={PANELS} variant="web" />)
276
-
277
- expect(leftRail().getAttribute("data-state")).toBe("expanded")
278
- expect(screen.queryByRole("complementary")).toBeNull()
279
-
280
- await user.click(screen.getByRole("button", { name: "Toggle sidebar" }))
281
-
282
- expect(leftRail().getAttribute("data-state")).toBe("collapsed")
283
- expect(rightDrawer()).toBeDefined()
284
- expect(screen.getByRole("button", { name: "Toggle panel" })).toBeDefined()
285
- } finally {
286
- restore()
287
- }
288
- })
289
-
290
- test("⌘B toggles the left rail", async () => {
291
- const user = userEvent.setup()
292
- render(<ShellLayout panels={PANELS} variant="web" />)
293
-
294
- expect(leftRail().getAttribute("data-state")).toBe("expanded")
295
-
296
- await user.keyboard("{Meta>}b{/Meta}")
297
- expect(leftRail().getAttribute("data-state")).toBe("collapsed")
298
-
299
- await user.keyboard("{Meta>}b{/Meta}")
300
- expect(leftRail().getAttribute("data-state")).toBe("expanded")
301
- })
302
- })
303
-
304
- function HookedShell({
305
- onPanelChange,
306
- }: {
307
- onPanelChange?: IUseShellPanelsOptions["onPanelChange"]
308
- }) {
309
- const panels = useShellPanels({ onPanelChange })
310
-
311
- return (
312
- <ShellLayout {...panels.providerProps} panels={PANELS} variant="web">
313
- <button onClick={() => panels.toggle("right")} type="button">
314
- External toggle
315
- </button>
316
- <button
317
- onClick={() => panels.openPanel("right", <div>Details body</div>)}
318
- type="button"
319
- >
320
- Open details
321
- </button>
322
- {panels.isNarrow && <p>No room for the inspector</p>}
323
- </ShellLayout>
324
- )
325
- }
326
-
327
- describe("useShellPanels", () => {
328
- test("reports every change as (open, side)", async () => {
329
- const user = userEvent.setup()
330
- const onPanelChange = mock(() => {})
331
- render(<HookedShell onPanelChange={onPanelChange} />)
332
-
333
- await user.click(screen.getByRole("button", { name: "Toggle panel" }))
334
- expect(onPanelChange).toHaveBeenLastCalledWith(true, "right")
335
-
336
- await user.click(screen.getByRole("button", { name: "Toggle sidebar" }))
337
- expect(onPanelChange).toHaveBeenLastCalledWith(false, "left")
338
-
339
- expect(onPanelChange).toHaveBeenCalledTimes(2)
340
- })
341
-
342
- test("controls the shell from outside it", async () => {
343
- const user = userEvent.setup()
344
- render(<HookedShell />)
345
-
346
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
347
-
348
- await user.click(screen.getByRole("button", { name: "External toggle" }))
349
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
350
-
351
- await user.click(screen.getByRole("button", { name: "External toggle" }))
352
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
353
- })
354
-
355
- test("openPanel opens the side with the content it was handed", async () => {
356
- const user = userEvent.setup()
357
- render(<HookedShell />)
358
-
359
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
360
-
361
- await user.click(screen.getByRole("button", { name: "Open details" }))
362
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
363
- // The dynamic content replaces the static panels entry for that side…
364
- expect(rightDrawer().textContent).toContain("Details body")
365
- expect(rightDrawer().textContent).not.toContain("Inspector body")
366
-
367
- // …and sticks across a close/reopen instead of reverting.
368
- await user.click(screen.getByRole("button", { name: "External toggle" }))
369
- await user.click(screen.getByRole("button", { name: "External toggle" }))
370
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
371
- expect(rightDrawer().textContent).toContain("Details body")
372
- })
373
-
374
- test("mirrors the shell's too-narrow verdict back into the hook", () => {
375
- const restore = shellViewport(800)
376
- try {
377
- render(<HookedShell />)
378
-
379
- // The shell measures, the hook hears about it, and outside UI stands
380
- // down with the panel it would have driven.
381
- expect(screen.getByText("No room for the inspector")).toBeDefined()
382
- expect(screen.queryByRole("complementary")).toBeNull()
383
- } finally {
384
- restore()
385
- }
386
- })
387
-
388
- test("leaves the hook's verdict alone while the panel fits", () => {
389
- const restore = shellViewport(WIDE_VIEWPORT)
390
- try {
391
- render(<HookedShell />)
392
-
393
- expect(screen.queryByText("No room for the inspector")).toBeNull()
394
- expect(rightDrawer()).toBeDefined()
395
- } finally {
396
- restore()
397
- }
398
- })
399
-
400
- test("refuses to open the right panel while the shell is too narrow", async () => {
401
- const user = userEvent.setup()
402
- const onPanelChange = mock(() => {})
403
- const restore = shellViewport(800)
404
- try {
405
- render(<HookedShell onPanelChange={onPanelChange} />)
406
-
407
- await user.click(screen.getByRole("button", { name: "External toggle" }))
408
-
409
- // Nothing opened, and nothing was reported — the write never happened,
410
- // so widening the viewport later cannot surface a stale panel.
411
- expect(screen.queryByRole("complementary")).toBeNull()
412
- expect(onPanelChange).not.toHaveBeenCalled()
413
- } finally {
414
- restore()
415
- }
416
- })
417
-
418
- test("retires the right panel's state when the shell goes too narrow", async () => {
419
- const user = userEvent.setup()
420
- const onPanelChange = mock(() => {})
421
- const restore = shellViewport(WIDE_VIEWPORT)
422
- try {
423
- render(<HookedShell onPanelChange={onPanelChange} />)
424
-
425
- await user.click(screen.getByRole("button", { name: "External toggle" }))
426
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
427
-
428
- resizeViewport(800)
429
-
430
- expect(screen.queryByRole("complementary")).toBeNull()
431
- expect(onPanelChange).toHaveBeenLastCalledWith(false, "right")
432
-
433
- // The state went with the panel: coming back does not spring it open.
434
- resizeViewport(WIDE_VIEWPORT)
435
-
436
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
437
- } finally {
438
- restore()
439
- }
440
- })
441
-
442
- test("the shell's own triggers round-trip through the hook's state", async () => {
443
- const user = userEvent.setup()
444
- render(<HookedShell />)
445
-
446
- // Trigger click flows through providerProps into hook state and back —
447
- // the drawer only opens because the hook re-rendered the controlled
448
- // provider.
449
- await user.click(screen.getByRole("button", { name: "Toggle panel" }))
450
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
451
-
452
- // The external toggle sees that state, so it closes rather than opens.
453
- await user.click(screen.getByRole("button", { name: "External toggle" }))
454
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
455
- })
456
- })
457
-
458
- describe("shell app-wide panel state", () => {
459
- function RemoteControls() {
460
- const panels = useShellPanels({ shellId: "shared-shell" })
461
- return (
462
- <>
463
- <button onClick={() => panels.toggle("right")}>Remote inspector</button>
464
- <button onClick={() => panels.resizeSidebar(280)}>Resize rail</button>
465
- <output aria-label="Rail width">{panels.sidebarWidth}</output>
466
- <button
467
- onClick={() => panels.openPanel("right", <div>Remote details</div>)}
468
- >
469
- Remote content
470
- </button>
471
- <output>{panels.open.right ? "Remote open" : "Remote closed"}</output>
472
- </>
473
- )
474
- }
475
-
476
- test("separate hooks drive the same named shell and dynamic content", async () => {
477
- const user = userEvent.setup()
478
- const restore = shellViewport(WIDE_VIEWPORT)
479
- try {
480
- render(
481
- <>
482
- <ShellLayout shellId="shared-shell" panels={PANELS}>
483
- Workspace
484
- </ShellLayout>
485
- <RemoteControls />
486
- </>
487
- )
488
- await user.click(screen.getByRole("button", { name: "Resize rail" }))
489
- expect(screen.getByLabelText("Rail width").textContent).toBe("280")
490
- expect(
491
- document
492
- .querySelector<HTMLElement>('[data-slot="sidebar-wrapper"]')
493
- ?.style.getPropertyValue("--sidebar-width")
494
- ).toBe("280px")
495
- await user.click(screen.getByRole("button", { name: "Remote inspector" }))
496
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
497
- expect(screen.getByText("Remote open")).toBeTruthy()
498
- await user.click(screen.getByRole("button", { name: "Toggle panel" }))
499
- expect(screen.getByText("Remote closed")).toBeTruthy()
500
- await user.click(screen.getByRole("button", { name: "Remote content" }))
501
- expect(screen.getByText("Remote details")).toBeTruthy()
502
- expect(rightDrawer().getAttribute("data-state")).toBe("expanded")
503
- } finally {
504
- restore()
505
- }
506
- })
507
- })
508
-
509
- describe("shell container responsiveness", () => {
510
- test("shrinks, folds, hides, and restores from container-only resizes", async () => {
511
- let width = 1100
512
- const restoreWidths = stubShellWidths(() => width)
513
- const originalObserver = globalThis.ResizeObserver
514
- const callbacks = new Set<ResizeObserverCallback>()
515
- globalThis.ResizeObserver = class {
516
- callback: ResizeObserverCallback
517
- constructor(callback: ResizeObserverCallback) {
518
- this.callback = callback
519
- }
520
- observe(node: Element) {
521
- if (node.getAttribute("data-slot") === "sidebar-wrapper")
522
- callbacks.add(this.callback)
523
- }
524
- unobserve() {}
525
- disconnect() {
526
- callbacks.delete(this.callback)
527
- }
528
- } as unknown as typeof ResizeObserver
529
- const resizeContainer = (next: number) =>
530
- act(() => {
531
- width = next
532
- for (const callback of callbacks) callback([], {} as ResizeObserver)
533
- })
534
- const user = userEvent.setup()
535
- function RemoteState() {
536
- const { sidebar } = useShellPanels({ shellId: "responsive-shell" })
537
- return (
538
- <output data-testid="sidebar-fit">{JSON.stringify(sidebar)}</output>
539
- )
540
- }
541
- const currentFit = () =>
542
- JSON.parse(screen.getByTestId("sidebar-fit").textContent ?? "{}")
543
- try {
544
- render(
545
- <>
546
- <ShellLayout shellId="responsive-shell" panels={PANELS}>
547
- Main content
548
- </ShellLayout>
549
- <RemoteState />
550
- </>
551
- )
552
- expect(currentFit().width).toBe(256)
553
- await user.click(screen.getByRole("button", { name: "Toggle panel" }))
554
- resizeContainer(570)
555
- expect(currentFit()).toMatchObject({
556
- width: 210,
557
- mode: "expanded",
558
- canExpand: true,
559
- })
560
- expect(screen.queryByRole("button", { name: "Toggle panel" })).toBeNull()
561
- resizeContainer(539)
562
- expect(currentFit()).toMatchObject({
563
- width: 56,
564
- mode: "icon",
565
- canExpand: false,
566
- })
567
- expect(
568
- screen
569
- .getByRole("button", { name: "Toggle sidebar" })
570
- .hasAttribute("disabled")
571
- ).toBe(true)
572
- await user.keyboard("{Meta>}b{/Meta}")
573
- expect(currentFit().mode).toBe("icon")
574
- resizeContainer(390)
575
- expect(currentFit().mode).toBe("hidden")
576
- expect(
577
- screen.queryByRole("navigation", { name: "Primary navigation" })
578
- ).toBeNull()
579
- expect(screen.getByRole("main").textContent).toContain("Main content")
580
- resizeContainer(1100)
581
- expect(currentFit()).toMatchObject({
582
- width: 256,
583
- mode: "expanded",
584
- canExpand: true,
585
- })
586
- expect(rightDrawer().getAttribute("data-state")).toBe("collapsed")
587
- await user.click(screen.getByRole("button", { name: "Toggle sidebar" }))
588
- resizeContainer(390)
589
- resizeContainer(1100)
590
- expect(currentFit().mode).toBe("icon")
591
- } finally {
592
- restoreWidths()
593
- globalThis.ResizeObserver = originalObserver
594
- }
595
- })
596
- })