@exegia/corpora-ui 3.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 (587) hide show
  1. package/README.md +20 -0
  2. package/dist-lib/button-CIRkQXA6.js +152 -0
  3. package/dist-lib/button.js +3 -0
  4. package/dist-lib/card.js +150 -0
  5. package/dist-lib/components/atoms/text/default.d.ts +2 -1143
  6. package/dist-lib/components/blocks/shell/index.d.ts +1 -0
  7. package/dist-lib/components/ui/badge.d.ts +2 -2
  8. package/dist-lib/components/ui/button.d.ts +2 -2
  9. package/dist-lib/components/ui/glasscn/lazy-glass-surface.d.ts +6 -0
  10. package/dist-lib/components/ui/modal.d.ts +10 -0
  11. package/dist-lib/components/ui/overlays.d.ts +4 -0
  12. package/dist-lib/components/ui/select.d.ts +1 -1
  13. package/dist-lib/components/ui/toast.d.ts +2 -0
  14. package/dist-lib/ease-C9At8rnB.js +120 -0
  15. package/dist-lib/exegia-provider-DNTuLljX.js +124 -0
  16. package/dist-lib/index.css +3 -0
  17. package/dist-lib/index.d.ts +3 -0
  18. package/dist-lib/index.js +6482 -8894
  19. package/dist-lib/input.js +28 -0
  20. package/dist-lib/label.js +19 -0
  21. package/dist-lib/lib/segmented-control.d.ts +1 -1
  22. package/dist-lib/lib/state/exegia-provider.d.ts +17 -8
  23. package/dist-lib/lib/state/index.d.ts +2 -0
  24. package/dist-lib/lib/state/portal-context.d.ts +5 -0
  25. package/dist-lib/lib/state/sound-loading.d.ts +4 -0
  26. package/dist-lib/liquid-glass-BihU6nMl.js +50 -0
  27. package/dist-lib/modal-DLaOK-s1.js +82 -0
  28. package/dist-lib/overlays.js +3 -0
  29. package/dist-lib/rolldown-runtime-Dy4uBu1J.js +11 -0
  30. package/dist-lib/scaffold-Qv4hs5Pf.js +925 -0
  31. package/dist-lib/scaffold.js +2 -0
  32. package/dist-lib/shell-BQ9cjIEu.js +722 -0
  33. package/dist-lib/shell.js +2 -0
  34. package/dist-lib/sound-knGH4lj-.js +19 -0
  35. package/dist-lib/state.js +2 -0
  36. package/dist-lib/toast-CataVXHN.js +193 -0
  37. package/dist-lib/utils-BO0qfoA6.js +61 -0
  38. package/package.json +64 -23
  39. package/dist-lib/components/atoms/_layout.d.ts +0 -4
  40. package/dist-lib/components/atoms/bubble/__tests__/bubble.test.d.ts +0 -1
  41. package/dist-lib/components/atoms/bubble/__tests__/reference.test.d.ts +0 -1
  42. package/dist-lib/components/atoms/text/__tests__/text.test.d.ts +0 -1
  43. package/dist-lib/components/atoms/text-selection/__tests__/click-popover.test.d.ts +0 -1
  44. package/dist-lib/components/atoms/text-selection/__tests__/text-selection.test.d.ts +0 -1
  45. package/dist-lib/components/blocks/auth/__tests__/auth-flow-block.test.d.ts +0 -1
  46. package/dist-lib/components/blocks/auth/__tests__/auth-state-atom.test.d.ts +0 -1
  47. package/dist-lib/components/blocks/auth/__tests__/linked-accounts-block.test.d.ts +0 -1
  48. package/dist-lib/components/blocks/auth/__tests__/onboarding-block.test.d.ts +0 -1
  49. package/dist-lib/components/blocks/auth/__tests__/passkey-manager-block.test.d.ts +0 -1
  50. package/dist-lib/components/blocks/auth/__tests__/passkey-sign-in-block.test.d.ts +0 -1
  51. package/dist-lib/components/blocks/auth/__tests__/signup-block.test.d.ts +0 -1
  52. package/dist-lib/components/blocks/auth/__tests__/update-password-block.test.d.ts +0 -1
  53. package/dist-lib/components/blocks/chat/__tests__/ai-panel.test.d.ts +0 -1
  54. package/dist-lib/components/blocks/profile/__tests__/profile-card-block.test.d.ts +0 -1
  55. package/dist-lib/components/blocks/scaffold/__tests__/scaffold-atom.test.d.ts +0 -1
  56. package/dist-lib/components/blocks/scaffold/__tests__/scaffold.test.d.ts +0 -1
  57. package/dist-lib/components/blocks/shell/__tests__/shell-fit-atom.test.d.ts +0 -1
  58. package/dist-lib/components/blocks/shell/__tests__/shell-layout.test.d.ts +0 -1
  59. package/dist-lib/components/blocks/shell/__tests__/shell-metrics.test.d.ts +0 -1
  60. package/dist-lib/components/blocks/sidebar/__tests__/ai-sidebar-atom.test.d.ts +0 -1
  61. package/dist-lib/components/blocks/sidebar/__tests__/ai-sidebar.test.d.ts +0 -1
  62. package/dist-lib/components/blocks/sidebar/__tests__/use-ai-sidebar.test.d.ts +0 -1
  63. package/dist-lib/components/composed/__tests__/logo.test.d.ts +0 -1
  64. package/dist-lib/components/composed/action-bar/__tests__/action-bar.test.d.ts +0 -1
  65. package/dist-lib/components/composed/ai/__tests__/ai.test.d.ts +0 -1
  66. package/dist-lib/components/composed/chat/__tests__/attachment.test.d.ts +0 -1
  67. package/dist-lib/components/composed/chat/__tests__/beautiful-ui.test.d.ts +0 -1
  68. package/dist-lib/components/composed/chat/__tests__/chart.test.d.ts +0 -1
  69. package/dist-lib/components/composed/chat/__tests__/code-block.test.d.ts +0 -1
  70. package/dist-lib/components/composed/chat/__tests__/composer-attachments.test.d.ts +0 -1
  71. package/dist-lib/components/composed/chat/__tests__/composer.test.d.ts +0 -1
  72. package/dist-lib/components/composed/chat/__tests__/flowchart.test.d.ts +0 -1
  73. package/dist-lib/components/composed/chat/__tests__/glass-material.test.d.ts +0 -1
  74. package/dist-lib/components/composed/chat/__tests__/markdown.test.d.ts +0 -1
  75. package/dist-lib/components/composed/chat/__tests__/menu-command.test.d.ts +0 -1
  76. package/dist-lib/components/composed/chat/__tests__/recommendation.test.d.ts +0 -1
  77. package/dist-lib/components/composed/tree/__tests__/tree-atom.test.d.ts +0 -1
  78. package/dist-lib/components/composed/tree/__tests__/tree.test.d.ts +0 -1
  79. package/dist-lib/components/composed/tree/__tests__/use-tree.test.d.ts +0 -1
  80. package/dist-lib/components/composed/user/__tests__/message.test.d.ts +0 -1
  81. package/dist-lib/components/composed/verse/__tests__/verse.test.d.ts +0 -1
  82. package/dist-lib/components/docs/atoms-gallery.d.ts +0 -12
  83. package/dist-lib/components/docs/block-demo-stage.d.ts +0 -7
  84. package/dist-lib/components/docs/blocks-gallery.d.ts +0 -2
  85. package/dist-lib/components/docs/browser.d.ts +0 -10
  86. package/dist-lib/components/docs/code-block.d.ts +0 -4
  87. package/dist-lib/components/docs/components-gallery.d.ts +0 -2
  88. package/dist-lib/components/docs/demo-controls.d.ts +0 -21
  89. package/dist-lib/components/docs/hero.d.ts +0 -5
  90. package/dist-lib/components/docs/mermaid.d.ts +0 -3
  91. package/dist-lib/components/icons/__tests__/icons.test.d.ts +0 -1
  92. package/dist-lib/components/stories/attachment.story.d.ts +0 -11
  93. package/dist-lib/components/stories/auth-flow-block.story.d.ts +0 -2
  94. package/dist-lib/components/stories/avatar.story.d.ts +0 -6
  95. package/dist-lib/components/stories/base.story.d.ts +0 -6
  96. package/dist-lib/components/stories/bubble.story.d.ts +0 -6
  97. package/dist-lib/components/stories/button.story.d.ts +0 -9
  98. package/dist-lib/components/stories/card.story.d.ts +0 -8
  99. package/dist-lib/components/stories/chart.story.d.ts +0 -71
  100. package/dist-lib/components/stories/checkbox.story.d.ts +0 -6
  101. package/dist-lib/components/stories/code-auth-block.story.d.ts +0 -2
  102. package/dist-lib/components/stories/code-block.story.d.ts +0 -12
  103. package/dist-lib/components/stories/composed-password-input.story.d.ts +0 -6
  104. package/dist-lib/components/stories/context-cards.story.d.ts +0 -3
  105. package/dist-lib/components/stories/emoji-action-bar.story.d.ts +0 -3
  106. package/dist-lib/components/stories/field.story.d.ts +0 -6
  107. package/dist-lib/components/stories/file-icons.story.d.ts +0 -5
  108. package/dist-lib/components/stories/filter-table.story.d.ts +0 -21
  109. package/dist-lib/components/stories/flowchart.story.d.ts +0 -3
  110. package/dist-lib/components/stories/forgot-password-block.story.d.ts +0 -2
  111. package/dist-lib/components/stories/frame.story.d.ts +0 -8
  112. package/dist-lib/components/stories/index.d.ts +0 -54
  113. package/dist-lib/components/stories/input-group.story.d.ts +0 -6
  114. package/dist-lib/components/stories/input.story.d.ts +0 -8
  115. package/dist-lib/components/stories/insight-cards.story.d.ts +0 -74
  116. package/dist-lib/components/stories/label.story.d.ts +0 -8
  117. package/dist-lib/components/stories/linked-accounts-block.story.d.ts +0 -2
  118. package/dist-lib/components/stories/login-block.story.d.ts +0 -2
  119. package/dist-lib/components/stories/logo.story.d.ts +0 -3
  120. package/dist-lib/components/stories/markdown.story.d.ts +0 -7
  121. package/dist-lib/components/stories/menu-command.story.d.ts +0 -13
  122. package/dist-lib/components/stories/onboarding-block.story.d.ts +0 -2
  123. package/dist-lib/components/stories/otp-field.story.d.ts +0 -8
  124. package/dist-lib/components/stories/passkey-manager-block.story.d.ts +0 -2
  125. package/dist-lib/components/stories/passkey-sign-in-block.story.d.ts +0 -2
  126. package/dist-lib/components/stories/password-input.story.d.ts +0 -9
  127. package/dist-lib/components/stories/profile-card-block.story.d.ts +0 -6
  128. package/dist-lib/components/stories/recommendation-card.story.d.ts +0 -3
  129. package/dist-lib/components/stories/records-table.story.d.ts +0 -23
  130. package/dist-lib/components/stories/reference.story.d.ts +0 -9
  131. package/dist-lib/components/stories/research-answer.story.d.ts +0 -10
  132. package/dist-lib/components/stories/scaffold-root.story.d.ts +0 -6
  133. package/dist-lib/components/stories/separator.story.d.ts +0 -6
  134. package/dist-lib/components/stories/shell-layout.story.d.ts +0 -2
  135. package/dist-lib/components/stories/signup-block.story.d.ts +0 -2
  136. package/dist-lib/components/stories/social-providers.story.d.ts +0 -3
  137. package/dist-lib/components/stories/streaming-text.story.d.ts +0 -3
  138. package/dist-lib/components/stories/text.story.d.ts +0 -8
  139. package/dist-lib/components/stories/textarea.story.d.ts +0 -6
  140. package/dist-lib/components/stories/tree.story.d.ts +0 -4
  141. package/dist-lib/components/stories/update-password-block.story.d.ts +0 -2
  142. package/dist-lib/components/stories/user.story.d.ts +0 -8
  143. package/dist-lib/components/stories/verse.story.d.ts +0 -6
  144. package/dist-lib/components/ui/chat/__tests__/segmented-toggle.test.d.ts +0 -1
  145. package/dist-lib/index.js.map +0 -1
  146. package/dist-lib/lib/state/__tests__/sound.test.d.ts +0 -1
  147. package/dist-lib/lib/utils.test.d.ts +0 -1
  148. package/src/assets/css/base.css +0 -62
  149. package/src/assets/css/chat.css +0 -229
  150. package/src/assets/css/shadows.css +0 -157
  151. package/src/assets/css/theme.css +0 -321
  152. package/src/components/AGENTS.md +0 -0
  153. package/src/components/atoms/_layout.tsx +0 -9
  154. package/src/components/atoms/avatar/base.tsx +0 -70
  155. package/src/components/atoms/avatar/index.ts +0 -10
  156. package/src/components/atoms/avatar/types.ts +0 -24
  157. package/src/components/atoms/avatar/utils.ts +0 -54
  158. package/src/components/atoms/avatar/verified.tsx +0 -16
  159. package/src/components/atoms/background/index.ts +0 -8
  160. package/src/components/atoms/background/texture.tsx +0 -29
  161. package/src/components/atoms/background/type.ts +0 -10
  162. package/src/components/atoms/background/utils.ts +0 -13
  163. package/src/components/atoms/bubble/__tests__/bubble.test.tsx +0 -193
  164. package/src/components/atoms/bubble/__tests__/reference.test.tsx +0 -25
  165. package/src/components/atoms/bubble/actions.tsx +0 -28
  166. package/src/components/atoms/bubble/context.ts +0 -11
  167. package/src/components/atoms/bubble/default.tsx +0 -46
  168. package/src/components/atoms/bubble/header.tsx +0 -36
  169. package/src/components/atoms/bubble/index.ts +0 -37
  170. package/src/components/atoms/bubble/message.tsx +0 -32
  171. package/src/components/atoms/bubble/reactions.tsx +0 -191
  172. package/src/components/atoms/bubble/types.ts +0 -82
  173. package/src/components/atoms/bubble/utils.ts +0 -46
  174. package/src/components/atoms/chip.tsx +0 -61
  175. package/src/components/atoms/field.tsx +0 -43
  176. package/src/components/atoms/index.ts +0 -26
  177. package/src/components/atoms/loader.tsx +0 -33
  178. package/src/components/atoms/reference.tsx +0 -41
  179. package/src/components/atoms/text/__tests__/text.test.tsx +0 -47
  180. package/src/components/atoms/text/default.tsx +0 -59
  181. package/src/components/atoms/text/heading.tsx +0 -58
  182. package/src/components/atoms/text/index.ts +0 -28
  183. package/src/components/atoms/text/label.tsx +0 -16
  184. package/src/components/atoms/text/paragraph.tsx +0 -55
  185. package/src/components/atoms/text/span.tsx +0 -14
  186. package/src/components/atoms/text/types.ts +0 -41
  187. package/src/components/atoms/text/utils.ts +0 -16
  188. package/src/components/atoms/text-selection/__tests__/click-popover.test.tsx +0 -61
  189. package/src/components/atoms/text-selection/__tests__/text-selection.test.tsx +0 -90
  190. package/src/components/atoms/text-selection/click-popover.tsx +0 -62
  191. package/src/components/atoms/text-selection/index.ts +0 -30
  192. package/src/components/atoms/text-selection/popover.tsx +0 -103
  193. package/src/components/atoms/text-selection/selection-atom.ts +0 -51
  194. package/src/components/atoms/text-selection/selection.tsx +0 -56
  195. package/src/components/atoms/text-selection/types.ts +0 -125
  196. package/src/components/atoms/text-selection/use-selection.ts +0 -84
  197. package/src/components/atoms/types.ts +0 -46
  198. package/src/components/blocks/.gitkeep +0 -0
  199. package/src/components/blocks/auth/__tests__/auth-flow-block.test.tsx +0 -183
  200. package/src/components/blocks/auth/__tests__/auth-state-atom.test.tsx +0 -247
  201. package/src/components/blocks/auth/__tests__/linked-accounts-block.test.tsx +0 -128
  202. package/src/components/blocks/auth/__tests__/onboarding-block.test.tsx +0 -183
  203. package/src/components/blocks/auth/__tests__/passkey-manager-block.test.tsx +0 -131
  204. package/src/components/blocks/auth/__tests__/passkey-sign-in-block.test.tsx +0 -59
  205. package/src/components/blocks/auth/__tests__/signup-block.test.tsx +0 -176
  206. package/src/components/blocks/auth/__tests__/update-password-block.test.tsx +0 -95
  207. package/src/components/blocks/auth/auth-flow-atom.ts +0 -238
  208. package/src/components/blocks/auth/auth-flow-block.tsx +0 -211
  209. package/src/components/blocks/auth/auth-session-atom.ts +0 -82
  210. package/src/components/blocks/auth/auth-shell.tsx +0 -265
  211. package/src/components/blocks/auth/auth-state.ts +0 -40
  212. package/src/components/blocks/auth/code-auth-block.tsx +0 -176
  213. package/src/components/blocks/auth/forgot-password-block.tsx +0 -112
  214. package/src/components/blocks/auth/linked-accounts-block.tsx +0 -203
  215. package/src/components/blocks/auth/login-block.tsx +0 -217
  216. package/src/components/blocks/auth/onboarding/profile-step.tsx +0 -216
  217. package/src/components/blocks/auth/onboarding-block.tsx +0 -183
  218. package/src/components/blocks/auth/passkey-manager-block.tsx +0 -316
  219. package/src/components/blocks/auth/passkey-sign-in-block.tsx +0 -67
  220. package/src/components/blocks/auth/signup-block.tsx +0 -256
  221. package/src/components/blocks/auth/type.ts +0 -436
  222. package/src/components/blocks/auth/update-password-block.tsx +0 -139
  223. package/src/components/blocks/auth/use-auth-state.ts +0 -127
  224. package/src/components/blocks/chat/__tests__/ai-panel.test.tsx +0 -65
  225. package/src/components/blocks/chat/banners.tsx +0 -61
  226. package/src/components/blocks/chat/base.tsx +0 -84
  227. package/src/components/blocks/chat/header.tsx +0 -60
  228. package/src/components/blocks/chat/index.ts +0 -37
  229. package/src/components/blocks/chat/recommendation-stack.tsx +0 -41
  230. package/src/components/blocks/chat/shared.tsx +0 -27
  231. package/src/components/blocks/chat/suggested-prompts.tsx +0 -45
  232. package/src/components/blocks/chat/type.ts +0 -96
  233. package/src/components/blocks/chat/version-history-record.tsx +0 -37
  234. package/src/components/blocks/layout.ts +0 -35
  235. package/src/components/blocks/profile/__tests__/profile-card-block.test.tsx +0 -362
  236. package/src/components/blocks/profile/index.ts +0 -28
  237. package/src/components/blocks/profile/profile-card-atom.ts +0 -247
  238. package/src/components/blocks/profile/profile-card-block.tsx +0 -369
  239. package/src/components/blocks/profile/type.ts +0 -93
  240. package/src/components/blocks/profile/use-profile-card-state.ts +0 -67
  241. package/src/components/blocks/profile/use-profile-card.ts +0 -132
  242. package/src/components/blocks/scaffold/__tests__/scaffold-atom.test.tsx +0 -236
  243. package/src/components/blocks/scaffold/__tests__/scaffold.test.tsx +0 -524
  244. package/src/components/blocks/scaffold/constants.ts +0 -39
  245. package/src/components/blocks/scaffold/index.ts +0 -60
  246. package/src/components/blocks/scaffold/panel-close-button.tsx +0 -36
  247. package/src/components/blocks/scaffold/panel-menu-button.tsx +0 -221
  248. package/src/components/blocks/scaffold/scaffold-actions.tsx +0 -92
  249. package/src/components/blocks/scaffold/scaffold-atom.ts +0 -427
  250. package/src/components/blocks/scaffold/scaffold-canvas.tsx +0 -162
  251. package/src/components/blocks/scaffold/scaffold-context.ts +0 -20
  252. package/src/components/blocks/scaffold/scaffold-inspector.tsx +0 -137
  253. package/src/components/blocks/scaffold/scaffold-main.tsx +0 -28
  254. package/src/components/blocks/scaffold/scaffold-panel.tsx +0 -186
  255. package/src/components/blocks/scaffold/scaffold-root.tsx +0 -120
  256. package/src/components/blocks/scaffold/scaffold-sidebar.tsx +0 -31
  257. package/src/components/blocks/scaffold/scaffold-sub-panel.tsx +0 -122
  258. package/src/components/blocks/scaffold/scaffold-tab.tsx +0 -108
  259. package/src/components/blocks/scaffold/type.ts +0 -264
  260. package/src/components/blocks/scaffold/use-scaffold-state.ts +0 -85
  261. package/src/components/blocks/scaffold/use-scaffold.ts +0 -59
  262. package/src/components/blocks/scaffold/utils.ts +0 -112
  263. package/src/components/blocks/shell/__tests__/shell-fit-atom.test.tsx +0 -362
  264. package/src/components/blocks/shell/__tests__/shell-layout.test.tsx +0 -596
  265. package/src/components/blocks/shell/__tests__/shell-metrics.test.ts +0 -154
  266. package/src/components/blocks/shell/animated-panel-inset.tsx +0 -27
  267. package/src/components/blocks/shell/animated-panel-provider.tsx +0 -269
  268. package/src/components/blocks/shell/animated-panel-trigger.tsx +0 -51
  269. package/src/components/blocks/shell/animated-panel.tsx +0 -180
  270. package/src/components/blocks/shell/index.ts +0 -30
  271. package/src/components/blocks/shell/shell-fit-atom.ts +0 -246
  272. package/src/components/blocks/shell/shell-layout.tsx +0 -139
  273. package/src/components/blocks/shell/shell-metrics.ts +0 -133
  274. package/src/components/blocks/shell/shell-panel-atom.ts +0 -74
  275. package/src/components/blocks/shell/type.ts +0 -361
  276. package/src/components/blocks/shell/use-shell-fit-state.ts +0 -49
  277. package/src/components/blocks/shell/use-shell-fit.ts +0 -153
  278. package/src/components/blocks/shell/use-shell-panels.ts +0 -126
  279. package/src/components/blocks/shell/utils.ts +0 -187
  280. package/src/components/blocks/sidebar/__tests__/ai-sidebar-atom.test.tsx +0 -325
  281. package/src/components/blocks/sidebar/__tests__/ai-sidebar.test.tsx +0 -93
  282. package/src/components/blocks/sidebar/__tests__/use-ai-sidebar.test.tsx +0 -310
  283. package/src/components/blocks/sidebar/ai-sidebar-atom.ts +0 -698
  284. package/src/components/blocks/sidebar/ai-sidebar.tsx +0 -150
  285. package/src/components/blocks/sidebar/index.ts +0 -67
  286. package/src/components/blocks/sidebar/marquee-label.tsx +0 -59
  287. package/src/components/blocks/sidebar/sidebar-context.ts +0 -15
  288. package/src/components/blocks/sidebar/sidebar-icon.tsx +0 -14
  289. package/src/components/blocks/sidebar/sidebar-row.tsx +0 -378
  290. package/src/components/blocks/sidebar/type.ts +0 -294
  291. package/src/components/blocks/sidebar/use-ai-sidebar-state.ts +0 -123
  292. package/src/components/blocks/sidebar/use-ai-sidebar.ts +0 -619
  293. package/src/components/blocks/sidebar/utils.ts +0 -170
  294. package/src/components/blocks/types.ts +0 -6
  295. package/src/components/composed/.gitkeep +0 -0
  296. package/src/components/composed/__tests__/logo.test.tsx +0 -60
  297. package/src/components/composed/action-bar/__tests__/action-bar.test.tsx +0 -125
  298. package/src/components/composed/action-bar/action.tsx +0 -77
  299. package/src/components/composed/action-bar/emojis.tsx +0 -97
  300. package/src/components/composed/action-bar/index.ts +0 -24
  301. package/src/components/composed/action-bar/toolbar.tsx +0 -66
  302. package/src/components/composed/action-bar/types.ts +0 -58
  303. package/src/components/composed/action-bar/utils.ts +0 -140
  304. package/src/components/composed/ai/__tests__/ai.test.tsx +0 -66
  305. package/src/components/composed/ai/avatar.tsx +0 -19
  306. package/src/components/composed/ai/index.ts +0 -36
  307. package/src/components/composed/ai/message.tsx +0 -49
  308. package/src/components/composed/ai/research-answer.tsx +0 -157
  309. package/src/components/composed/ai/shared.tsx +0 -94
  310. package/src/components/composed/ai/streaming-text.tsx +0 -94
  311. package/src/components/composed/ai/suggested-prompt.tsx +0 -183
  312. package/src/components/composed/ai/types.ts +0 -81
  313. package/src/components/composed/chat/__tests__/attachment.test.tsx +0 -218
  314. package/src/components/composed/chat/__tests__/beautiful-ui.test.tsx +0 -57
  315. package/src/components/composed/chat/__tests__/chart.test.tsx +0 -316
  316. package/src/components/composed/chat/__tests__/code-block.test.tsx +0 -12
  317. package/src/components/composed/chat/__tests__/composer-attachments.test.tsx +0 -101
  318. package/src/components/composed/chat/__tests__/composer.test.tsx +0 -248
  319. package/src/components/composed/chat/__tests__/flowchart.test.tsx +0 -145
  320. package/src/components/composed/chat/__tests__/glass-material.test.tsx +0 -54
  321. package/src/components/composed/chat/__tests__/markdown.test.tsx +0 -25
  322. package/src/components/composed/chat/__tests__/menu-command.test.tsx +0 -35
  323. package/src/components/composed/chat/__tests__/recommendation.test.tsx +0 -43
  324. package/src/components/composed/chat/actions.tsx +0 -81
  325. package/src/components/composed/chat/attachment-file.ts +0 -82
  326. package/src/components/composed/chat/attachment.tsx +0 -498
  327. package/src/components/composed/chat/chart/chart-atom.ts +0 -55
  328. package/src/components/composed/chat/chart/chart-context.ts +0 -9
  329. package/src/components/composed/chat/chart/chart-legend.tsx +0 -75
  330. package/src/components/composed/chat/chart/chart-plot.tsx +0 -233
  331. package/src/components/composed/chat/chart/chart-root.tsx +0 -229
  332. package/src/components/composed/chat/chart/chart-tooltip.tsx +0 -74
  333. package/src/components/composed/chat/chart/constants.ts +0 -8
  334. package/src/components/composed/chat/chart/evilcharts/README.md +0 -8
  335. package/src/components/composed/chat/chart/evilcharts/echarts-area-chart.tsx +0 -2358
  336. package/src/components/composed/chat/chart/evilcharts/echarts-bar-chart.tsx +0 -2261
  337. package/src/components/composed/chat/chart/evilcharts/echarts-brush.tsx +0 -233
  338. package/src/components/composed/chat/chart/evilcharts/echarts-chart.tsx +0 -214
  339. package/src/components/composed/chat/chart/evilcharts/echarts-dot.tsx +0 -111
  340. package/src/components/composed/chat/chart/evilcharts/echarts-legend.tsx +0 -131
  341. package/src/components/composed/chat/chart/evilcharts/echarts-line-chart.tsx +0 -2112
  342. package/src/components/composed/chat/chart/evilcharts/echarts-pie-chart.tsx +0 -1235
  343. package/src/components/composed/chat/chart/evilcharts/echarts-tooltip.tsx +0 -125
  344. package/src/components/composed/chat/chart/index.ts +0 -13
  345. package/src/components/composed/chat/chart/type.ts +0 -88
  346. package/src/components/composed/chat/chart/use-chart-state.ts +0 -22
  347. package/src/components/composed/chat/chart/use-chart.ts +0 -70
  348. package/src/components/composed/chat/chart/utils.ts +0 -47
  349. package/src/components/composed/chat/chart.tsx +0 -3
  350. package/src/components/composed/chat/code-block.tsx +0 -123
  351. package/src/components/composed/chat/composer/add-button.tsx +0 -29
  352. package/src/components/composed/chat/composer/base.tsx +0 -573
  353. package/src/components/composed/chat/composer/command-menu.tsx +0 -47
  354. package/src/components/composed/chat/composer/hooks.ts +0 -29
  355. package/src/components/composed/chat/composer/index.ts +0 -19
  356. package/src/components/composed/chat/composer/send-button.tsx +0 -36
  357. package/src/components/composed/chat/composer/suggestions.tsx +0 -115
  358. package/src/components/composed/chat/composer/use-dictation.ts +0 -123
  359. package/src/components/composed/chat/composer/utils.ts +0 -74
  360. package/src/components/composed/chat/context-cards.tsx +0 -63
  361. package/src/components/composed/chat/filter-table.tsx +0 -119
  362. package/src/components/composed/chat/flowchart/chart-node.tsx +0 -162
  363. package/src/components/composed/chat/flowchart/connector.tsx +0 -32
  364. package/src/components/composed/chat/flowchart/constant.ts +0 -26
  365. package/src/components/composed/chat/flowchart/default.tsx +0 -230
  366. package/src/components/composed/chat/flowchart/edge-toolbar.tsx +0 -73
  367. package/src/components/composed/chat/flowchart/hooks.tsx +0 -347
  368. package/src/components/composed/chat/flowchart/index.ts +0 -14
  369. package/src/components/composed/chat/flowchart/step-body.tsx +0 -82
  370. package/src/components/composed/chat/flowchart/types.ts +0 -89
  371. package/src/components/composed/chat/flowchart/utils.ts +0 -78
  372. package/src/components/composed/chat/hint.tsx +0 -59
  373. package/src/components/composed/chat/index.ts +0 -92
  374. package/src/components/composed/chat/insight-cards.tsx +0 -199
  375. package/src/components/composed/chat/markdown-atom.ts +0 -15
  376. package/src/components/composed/chat/markdown.tsx +0 -213
  377. package/src/components/composed/chat/recommendation/checkbox.tsx +0 -122
  378. package/src/components/composed/chat/recommendation/constant.ts +0 -54
  379. package/src/components/composed/chat/recommendation/default.tsx +0 -25
  380. package/src/components/composed/chat/recommendation/group.tsx +0 -36
  381. package/src/components/composed/chat/recommendation/index.ts +0 -17
  382. package/src/components/composed/chat/recommendation/item.tsx +0 -215
  383. package/src/components/composed/chat/recommendation/types.ts +0 -76
  384. package/src/components/composed/chat/records-table.tsx +0 -130
  385. package/src/components/composed/chat/type.ts +0 -157
  386. package/src/components/composed/logo.tsx +0 -171
  387. package/src/components/composed/password-input.tsx +0 -179
  388. package/src/components/composed/reader/applied-mark.tsx +0 -32
  389. package/src/components/composed/reader/apply-toast.tsx +0 -49
  390. package/src/components/composed/reader/index.ts +0 -10
  391. package/src/components/composed/reader/selection-highlight.tsx +0 -26
  392. package/src/components/composed/reader/selection-popover.tsx +0 -149
  393. package/src/components/composed/reader/type.ts +0 -48
  394. package/src/components/composed/social-providers.tsx +0 -154
  395. package/src/components/composed/tree/CLAUDE.md +0 -145
  396. package/src/components/composed/tree/__tests__/tree-atom.test.tsx +0 -217
  397. package/src/components/composed/tree/__tests__/tree.test.tsx +0 -522
  398. package/src/components/composed/tree/__tests__/use-tree.test.tsx +0 -333
  399. package/src/components/composed/tree/constants.ts +0 -55
  400. package/src/components/composed/tree/index.ts +0 -51
  401. package/src/components/composed/tree/tree-atom.ts +0 -590
  402. package/src/components/composed/tree/tree-context.ts +0 -13
  403. package/src/components/composed/tree/tree-node.tsx +0 -496
  404. package/src/components/composed/tree/tree.tsx +0 -233
  405. package/src/components/composed/tree/type.ts +0 -322
  406. package/src/components/composed/tree/use-tree-dnd.ts +0 -179
  407. package/src/components/composed/tree/use-tree-state.ts +0 -105
  408. package/src/components/composed/tree/use-tree.ts +0 -311
  409. package/src/components/composed/tree/utils.ts +0 -172
  410. package/src/components/composed/types.ts +0 -9
  411. package/src/components/composed/user/__tests__/message.test.tsx +0 -79
  412. package/src/components/composed/user/index.ts +0 -14
  413. package/src/components/composed/user/info.tsx +0 -56
  414. package/src/components/composed/user/message.tsx +0 -36
  415. package/src/components/composed/user/pill.tsx +0 -20
  416. package/src/components/composed/user/types.ts +0 -47
  417. package/src/components/composed/user/utils.ts +0 -0
  418. package/src/components/composed/verse/__tests__/verse.test.tsx +0 -57
  419. package/src/components/composed/verse/index.ts +0 -2
  420. package/src/components/composed/verse/types.ts +0 -24
  421. package/src/components/composed/verse/verse.tsx +0 -100
  422. package/src/components/docs/atoms-gallery.tsx +0 -286
  423. package/src/components/docs/block-demo-stage.tsx +0 -38
  424. package/src/components/docs/blocks-gallery.tsx +0 -224
  425. package/src/components/docs/browser.tsx +0 -87
  426. package/src/components/docs/code-block.tsx +0 -10
  427. package/src/components/docs/components-gallery.tsx +0 -182
  428. package/src/components/docs/demo-controls.tsx +0 -142
  429. package/src/components/docs/hero.tsx +0 -197
  430. package/src/components/docs/mermaid.tsx +0 -55
  431. package/src/components/icons/README.md +0 -91
  432. package/src/components/icons/__tests__/icons.test.tsx +0 -58
  433. package/src/components/icons/file-badge-cfm.tsx +0 -615
  434. package/src/components/icons/file-badge-corpus.tsx +0 -604
  435. package/src/components/icons/file-badge-pdf.tsx +0 -570
  436. package/src/components/icons/file-badge-tei.tsx +0 -524
  437. package/src/components/icons/file-badge-tf.tsx +0 -620
  438. package/src/components/icons/file-badge-txt.tsx +0 -607
  439. package/src/components/icons/file-badge-xml.tsx +0 -576
  440. package/src/components/icons/file-wordmark-cfm.tsx +0 -424
  441. package/src/components/icons/file-wordmark-corpus.tsx +0 -454
  442. package/src/components/icons/file-wordmark-pdf.tsx +0 -470
  443. package/src/components/icons/file-wordmark-tei.tsx +0 -424
  444. package/src/components/icons/file-wordmark-tf.tsx +0 -406
  445. package/src/components/icons/file-wordmark-txt.tsx +0 -421
  446. package/src/components/icons/file-wordmark-xml.tsx +0 -424
  447. package/src/components/icons/index.ts +0 -16
  448. package/src/components/icons/types.ts +0 -8
  449. package/src/components/motion/index.ts +0 -0
  450. package/src/components/motion/overflow-actions.tsx +0 -376
  451. package/src/components/motion/popover-morph.tsx +0 -292
  452. package/src/components/motion/popover-position.ts +0 -86
  453. package/src/components/motion/shared-layout-bg.tsx +0 -151
  454. package/src/components/stories/attachment.story.tsx +0 -40
  455. package/src/components/stories/auth-flow-block.story.tsx +0 -17
  456. package/src/components/stories/avatar.story.tsx +0 -33
  457. package/src/components/stories/base.story.tsx +0 -70
  458. package/src/components/stories/bubble.story.tsx +0 -61
  459. package/src/components/stories/button.story.tsx +0 -32
  460. package/src/components/stories/card.story.tsx +0 -36
  461. package/src/components/stories/chart.story.tsx +0 -69
  462. package/src/components/stories/checkbox.story.tsx +0 -30
  463. package/src/components/stories/code-auth-block.story.tsx +0 -20
  464. package/src/components/stories/code-block.story.tsx +0 -35
  465. package/src/components/stories/composed-password-input.story.tsx +0 -41
  466. package/src/components/stories/context-cards.story.tsx +0 -30
  467. package/src/components/stories/emoji-action-bar.story.tsx +0 -20
  468. package/src/components/stories/field.story.tsx +0 -32
  469. package/src/components/stories/file-icons.story.tsx +0 -20
  470. package/src/components/stories/filter-table.story.tsx +0 -63
  471. package/src/components/stories/flowchart.story.tsx +0 -25
  472. package/src/components/stories/forgot-password-block.story.tsx +0 -14
  473. package/src/components/stories/frame.story.tsx +0 -32
  474. package/src/components/stories/index.ts +0 -57
  475. package/src/components/stories/input-group.story.tsx +0 -27
  476. package/src/components/stories/input.story.tsx +0 -42
  477. package/src/components/stories/insight-cards.story.tsx +0 -67
  478. package/src/components/stories/label.story.tsx +0 -32
  479. package/src/components/stories/linked-accounts-block.story.tsx +0 -23
  480. package/src/components/stories/login-block.story.tsx +0 -18
  481. package/src/components/stories/logo.story.tsx +0 -21
  482. package/src/components/stories/markdown.story.tsx +0 -31
  483. package/src/components/stories/menu-command.story.tsx +0 -43
  484. package/src/components/stories/onboarding-block.story.tsx +0 -14
  485. package/src/components/stories/otp-field.story.tsx +0 -35
  486. package/src/components/stories/passkey-manager-block.story.tsx +0 -18
  487. package/src/components/stories/passkey-sign-in-block.story.tsx +0 -15
  488. package/src/components/stories/password-input.story.tsx +0 -35
  489. package/src/components/stories/profile-card-block.story.tsx +0 -29
  490. package/src/components/stories/recommendation-card.story.tsx +0 -37
  491. package/src/components/stories/records-table.story.tsx +0 -52
  492. package/src/components/stories/reference.story.tsx +0 -33
  493. package/src/components/stories/research-answer.story.tsx +0 -32
  494. package/src/components/stories/scaffold-root.story.tsx +0 -47
  495. package/src/components/stories/separator.story.tsx +0 -37
  496. package/src/components/stories/shell-layout.story.tsx +0 -19
  497. package/src/components/stories/signup-block.story.tsx +0 -18
  498. package/src/components/stories/social-providers.story.tsx +0 -26
  499. package/src/components/stories/streaming-text.story.tsx +0 -25
  500. package/src/components/stories/text.story.tsx +0 -31
  501. package/src/components/stories/textarea.story.tsx +0 -34
  502. package/src/components/stories/tree.story.tsx +0 -31
  503. package/src/components/stories/update-password-block.story.tsx +0 -14
  504. package/src/components/stories/user.story.tsx +0 -32
  505. package/src/components/stories/verse.story.tsx +0 -42
  506. package/src/components/theme-provider.tsx +0 -230
  507. package/src/components/types.ts +0 -106
  508. package/src/components/ui/accordion.tsx +0 -68
  509. package/src/components/ui/alert-dialog.tsx +0 -167
  510. package/src/components/ui/alert.tsx +0 -84
  511. package/src/components/ui/autocomplete.tsx +0 -303
  512. package/src/components/ui/avatar.tsx +0 -109
  513. package/src/components/ui/badge.tsx +0 -101
  514. package/src/components/ui/button-group.tsx +0 -88
  515. package/src/components/ui/button.tsx +0 -192
  516. package/src/components/ui/card.tsx +0 -253
  517. package/src/components/ui/chat/__tests__/segmented-toggle.test.tsx +0 -27
  518. package/src/components/ui/chat/avatar-handle.tsx +0 -30
  519. package/src/components/ui/chat/badges.tsx +0 -85
  520. package/src/components/ui/chat/buttons.tsx +0 -94
  521. package/src/components/ui/chat/chips.tsx +0 -106
  522. package/src/components/ui/chat/dot.tsx +0 -81
  523. package/src/components/ui/chat/icon-button.tsx +0 -43
  524. package/src/components/ui/chat/icon-tile.tsx +0 -33
  525. package/src/components/ui/chat/index.ts +0 -12
  526. package/src/components/ui/chat/inline-source.tsx +0 -94
  527. package/src/components/ui/chat/segmented-toggle.tsx +0 -99
  528. package/src/components/ui/chat/tag.tsx +0 -61
  529. package/src/components/ui/chat/thumbnail.tsx +0 -31
  530. package/src/components/ui/chat/waveform.tsx +0 -30
  531. package/src/components/ui/checkbox.tsx +0 -83
  532. package/src/components/ui/collapsible.tsx +0 -42
  533. package/src/components/ui/command.tsx +0 -263
  534. package/src/components/ui/context-menu.tsx +0 -342
  535. package/src/components/ui/emoji-picker.tsx +0 -161
  536. package/src/components/ui/field.tsx +0 -89
  537. package/src/components/ui/frame.tsx +0 -87
  538. package/src/components/ui/glasscn/glass-button-group.tsx +0 -34
  539. package/src/components/ui/glasscn/glass-button.tsx +0 -25
  540. package/src/components/ui/glasscn/glass-container.tsx +0 -94
  541. package/src/components/ui/glasscn/glass-separator.tsx +0 -39
  542. package/src/components/ui/glasscn/liquid-glass.tsx +0 -59
  543. package/src/components/ui/group.tsx +0 -92
  544. package/src/components/ui/input-group.tsx +0 -105
  545. package/src/components/ui/input.tsx +0 -70
  546. package/src/components/ui/kbd.tsx +0 -32
  547. package/src/components/ui/label.tsx +0 -36
  548. package/src/components/ui/menu-command.tsx +0 -156
  549. package/src/components/ui/menu.tsx +0 -352
  550. package/src/components/ui/otp-field.tsx +0 -88
  551. package/src/components/ui/popover-glass.tsx +0 -158
  552. package/src/components/ui/popover.tsx +0 -120
  553. package/src/components/ui/preview-card.tsx +0 -61
  554. package/src/components/ui/scroll-area.tsx +0 -80
  555. package/src/components/ui/select.tsx +0 -257
  556. package/src/components/ui/separator.tsx +0 -23
  557. package/src/components/ui/sheet.tsx +0 -135
  558. package/src/components/ui/skeleton.tsx +0 -18
  559. package/src/components/ui/spinner.tsx +0 -17
  560. package/src/components/ui/switch.tsx +0 -30
  561. package/src/components/ui/tabs.tsx +0 -120
  562. package/src/components/ui/textarea.tsx +0 -58
  563. package/src/components/ui/toast.tsx +0 -325
  564. package/src/components/ui/toolbar.tsx +0 -92
  565. package/src/components/ui/tooltip.tsx +0 -67
  566. package/src/index.css +0 -10
  567. package/src/index.ts +0 -102
  568. package/src/lib/attachment-content.ts +0 -28
  569. package/src/lib/auth-accent.ts +0 -49
  570. package/src/lib/ease.ts +0 -90
  571. package/src/lib/glass-variants.ts +0 -22
  572. package/src/lib/hooks/use-hover-capable.ts +0 -23
  573. package/src/lib/hooks/use-mobile.ts +0 -21
  574. package/src/lib/keyed-atom.ts +0 -60
  575. package/src/lib/segmented-control.ts +0 -42
  576. package/src/lib/sound.ts +0 -39
  577. package/src/lib/specular.ts +0 -10
  578. package/src/lib/state/__tests__/sound.test.tsx +0 -53
  579. package/src/lib/state/exegia-provider.tsx +0 -83
  580. package/src/lib/state/index.ts +0 -4
  581. package/src/lib/state/store.ts +0 -19
  582. package/src/lib/use-motion-panel.ts +0 -78
  583. package/src/lib/utils.test.ts +0 -22
  584. package/src/lib/utils.ts +0 -100
  585. package/src/specular.js +0 -4
  586. /package/{src/components/composed/chat/composer → dist-lib}/BEAUTIFUL-UI-LICENSE.txt +0 -0
  587. /package/{src/components/composed/chat/chart/evilcharts/LICENSE → dist-lib/EVILCHARTS-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
- })