@elench/shell 0.1.1 → 0.1.3

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 (307) hide show
  1. package/README.md +46 -7
  2. package/dist/components/shell/activity-bar.d.ts +2 -0
  3. package/dist/components/shell/activity-bar.d.ts.map +1 -0
  4. package/dist/components/shell/activity-bar.js +19 -0
  5. package/dist/components/shell/activity-bar.js.map +1 -0
  6. package/dist/components/shell/app-shell.d.ts +11 -0
  7. package/dist/components/shell/app-shell.d.ts.map +1 -0
  8. package/dist/components/shell/app-shell.js +323 -0
  9. package/dist/components/shell/app-shell.js.map +1 -0
  10. package/dist/components/shell/context-action-menu.d.ts +7 -0
  11. package/dist/components/shell/context-action-menu.d.ts.map +1 -0
  12. package/dist/components/shell/context-action-menu.js +75 -0
  13. package/dist/components/shell/context-action-menu.js.map +1 -0
  14. package/dist/components/shell/default-layout.d.ts +3 -0
  15. package/dist/components/shell/default-layout.d.ts.map +1 -0
  16. package/dist/components/shell/default-layout.js +63 -0
  17. package/dist/components/shell/default-layout.js.map +1 -0
  18. package/dist/components/shell/left-sidebar.d.ts +2 -0
  19. package/dist/components/shell/left-sidebar.d.ts.map +1 -0
  20. package/dist/components/shell/left-sidebar.js +16 -0
  21. package/dist/components/shell/left-sidebar.js.map +1 -0
  22. package/dist/components/shell/primitives/activity-nav.d.ts +7 -0
  23. package/dist/components/shell/primitives/activity-nav.d.ts.map +1 -0
  24. package/dist/components/shell/primitives/activity-nav.js +12 -0
  25. package/dist/components/shell/primitives/activity-nav.js.map +1 -0
  26. package/dist/components/shell/primitives/inspector-panel.d.ts +25 -0
  27. package/dist/components/shell/primitives/inspector-panel.d.ts.map +1 -0
  28. package/dist/components/shell/primitives/inspector-panel.js +32 -0
  29. package/dist/components/shell/primitives/inspector-panel.js.map +1 -0
  30. package/dist/components/shell/primitives/instance-row.d.ts +20 -0
  31. package/dist/components/shell/primitives/instance-row.d.ts.map +1 -0
  32. package/dist/components/shell/primitives/instance-row.js +16 -0
  33. package/dist/components/shell/primitives/instance-row.js.map +1 -0
  34. package/dist/components/shell/primitives/search-bar-primitives.d.ts +21 -0
  35. package/dist/components/shell/primitives/search-bar-primitives.d.ts.map +1 -0
  36. package/dist/components/shell/primitives/search-bar-primitives.js +24 -0
  37. package/dist/components/shell/primitives/search-bar-primitives.js.map +1 -0
  38. package/dist/components/shell/primitives/shell-frame.d.ts +10 -0
  39. package/dist/components/shell/primitives/shell-frame.d.ts.map +1 -0
  40. package/dist/components/shell/primitives/shell-frame.js +26 -0
  41. package/dist/components/shell/primitives/shell-frame.js.map +1 -0
  42. package/dist/components/shell/primitives/shell-status-bar.d.ts +13 -0
  43. package/dist/components/shell/primitives/shell-status-bar.d.ts.map +1 -0
  44. package/dist/components/shell/primitives/shell-status-bar.js +18 -0
  45. package/dist/components/shell/primitives/shell-status-bar.js.map +1 -0
  46. package/dist/components/shell/primitives/shell-surface.d.ts +19 -0
  47. package/dist/components/shell/primitives/shell-surface.d.ts.map +1 -0
  48. package/dist/components/shell/primitives/shell-surface.js +73 -0
  49. package/dist/components/shell/primitives/shell-surface.js.map +1 -0
  50. package/dist/components/shell/primitives/shell-toolbar.d.ts +8 -0
  51. package/dist/components/shell/primitives/shell-toolbar.d.ts.map +1 -0
  52. package/dist/components/shell/primitives/shell-toolbar.js +22 -0
  53. package/dist/components/shell/primitives/shell-toolbar.js.map +1 -0
  54. package/dist/components/shell/primitives/sidebar-action-row.d.ts +14 -0
  55. package/dist/components/shell/primitives/sidebar-action-row.d.ts.map +1 -0
  56. package/dist/components/shell/primitives/sidebar-action-row.js +9 -0
  57. package/dist/components/shell/primitives/sidebar-action-row.js.map +1 -0
  58. package/dist/components/shell/primitives/sidebar-frame.d.ts +12 -0
  59. package/dist/components/shell/primitives/sidebar-frame.d.ts.map +1 -0
  60. package/dist/components/shell/primitives/sidebar-frame.js +19 -0
  61. package/dist/components/shell/primitives/sidebar-frame.js.map +1 -0
  62. package/dist/components/shell/primitives/sidebar-section.d.ts +15 -0
  63. package/dist/components/shell/primitives/sidebar-section.d.ts.map +1 -0
  64. package/dist/components/shell/primitives/sidebar-section.js +23 -0
  65. package/dist/components/shell/primitives/sidebar-section.js.map +1 -0
  66. package/dist/components/shell/primitives/workspace-page.d.ts +21 -0
  67. package/dist/components/shell/primitives/workspace-page.d.ts.map +1 -0
  68. package/dist/components/shell/primitives/workspace-page.js +18 -0
  69. package/dist/components/shell/primitives/workspace-page.js.map +1 -0
  70. package/dist/components/shell/right-inspector.d.ts +2 -0
  71. package/dist/components/shell/right-inspector.d.ts.map +1 -0
  72. package/dist/components/shell/right-inspector.js +32 -0
  73. package/dist/components/shell/right-inspector.js.map +1 -0
  74. package/dist/components/shell/search-action-groups.d.ts +6 -0
  75. package/dist/components/shell/search-action-groups.d.ts.map +1 -0
  76. package/dist/components/shell/search-action-groups.js +37 -0
  77. package/dist/components/shell/search-action-groups.js.map +1 -0
  78. package/dist/components/shell/search-bar.d.ts +2 -0
  79. package/dist/components/shell/search-bar.d.ts.map +1 -0
  80. package/dist/components/shell/search-bar.js +161 -0
  81. package/dist/components/shell/search-bar.js.map +1 -0
  82. package/dist/components/shell/shell-layout.d.ts +30 -0
  83. package/dist/components/shell/shell-layout.d.ts.map +1 -0
  84. package/dist/components/shell/shell-layout.js +176 -0
  85. package/dist/components/shell/shell-layout.js.map +1 -0
  86. package/dist/components/shell/shell-model.d.ts +14 -0
  87. package/dist/components/shell/shell-model.d.ts.map +1 -0
  88. package/dist/components/shell/shell-model.js +75 -0
  89. package/dist/components/shell/shell-model.js.map +1 -0
  90. package/dist/components/shell/status-bar.d.ts +2 -0
  91. package/dist/components/shell/status-bar.d.ts.map +1 -0
  92. package/dist/components/shell/status-bar.js +16 -0
  93. package/dist/components/shell/status-bar.js.map +1 -0
  94. package/dist/components/shell/tab-strip-bridge.d.ts +32 -0
  95. package/dist/components/shell/tab-strip-bridge.d.ts.map +1 -0
  96. package/dist/components/shell/tab-strip-bridge.js +46 -0
  97. package/dist/components/shell/tab-strip-bridge.js.map +1 -0
  98. package/dist/components/shell/top-bar.d.ts +2 -0
  99. package/dist/components/shell/top-bar.d.ts.map +1 -0
  100. package/dist/components/shell/top-bar.js +24 -0
  101. package/dist/components/shell/top-bar.js.map +1 -0
  102. package/dist/components/shell/use-shell-surface-action-groups.d.ts +16 -0
  103. package/dist/components/shell/use-shell-surface-action-groups.d.ts.map +1 -0
  104. package/dist/components/shell/use-shell-surface-action-groups.js +169 -0
  105. package/dist/components/shell/use-shell-surface-action-groups.js.map +1 -0
  106. package/dist/components/shell/workspace-surface-context-menu.d.ts +12 -0
  107. package/dist/components/shell/workspace-surface-context-menu.d.ts.map +1 -0
  108. package/dist/components/shell/workspace-surface-context-menu.js +27 -0
  109. package/dist/components/shell/workspace-surface-context-menu.js.map +1 -0
  110. package/dist/components/shell/workspace-tab-content.d.ts +7 -0
  111. package/dist/components/shell/workspace-tab-content.d.ts.map +1 -0
  112. package/dist/components/shell/workspace-tab-content.js +15 -0
  113. package/dist/components/shell/workspace-tab-content.js.map +1 -0
  114. package/dist/components/system/async-state.d.ts +22 -0
  115. package/dist/components/system/async-state.d.ts.map +1 -0
  116. package/dist/components/system/async-state.js +34 -0
  117. package/dist/components/system/async-state.js.map +1 -0
  118. package/dist/components/system/status.d.ts +16 -0
  119. package/dist/components/system/status.d.ts.map +1 -0
  120. package/dist/components/system/status.js +42 -0
  121. package/dist/components/system/status.js.map +1 -0
  122. package/dist/components/ui/badge.d.ts +10 -0
  123. package/dist/components/ui/badge.d.ts.map +1 -0
  124. package/dist/components/ui/badge.js +26 -0
  125. package/dist/components/ui/badge.js.map +1 -0
  126. package/dist/components/ui/button.d.ts +11 -0
  127. package/dist/components/ui/button.d.ts.map +1 -0
  128. package/dist/components/ui/button.js +37 -0
  129. package/dist/components/ui/button.js.map +1 -0
  130. package/dist/components/ui/card.d.ts +12 -0
  131. package/dist/components/ui/card.d.ts.map +1 -0
  132. package/dist/components/ui/card.js +26 -0
  133. package/dist/components/ui/card.js.map +1 -0
  134. package/dist/components/ui/checkbox.d.ts +5 -0
  135. package/dist/components/ui/checkbox.d.ts.map +1 -0
  136. package/dist/components/ui/checkbox.js +11 -0
  137. package/dist/components/ui/checkbox.js.map +1 -0
  138. package/dist/components/ui/context-menu.d.ts +31 -0
  139. package/dist/components/ui/context-menu.d.ts.map +1 -0
  140. package/dist/components/ui/context-menu.js +54 -0
  141. package/dist/components/ui/context-menu.js.map +1 -0
  142. package/dist/components/ui/dialog.d.ts +18 -0
  143. package/dist/components/ui/dialog.d.ts.map +1 -0
  144. package/dist/components/ui/dialog.js +39 -0
  145. package/dist/components/ui/dialog.js.map +1 -0
  146. package/dist/components/ui/dropdown-menu.d.ts +30 -0
  147. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  148. package/dist/components/ui/dropdown-menu.js +53 -0
  149. package/dist/components/ui/dropdown-menu.js.map +1 -0
  150. package/dist/components/ui/icon-button.d.ts +10 -0
  151. package/dist/components/ui/icon-button.d.ts.map +1 -0
  152. package/dist/components/ui/icon-button.js +7 -0
  153. package/dist/components/ui/icon-button.js.map +1 -0
  154. package/dist/components/ui/input.d.ts +4 -0
  155. package/dist/components/ui/input.d.ts.map +1 -0
  156. package/dist/components/ui/input.js +8 -0
  157. package/dist/components/ui/input.js.map +1 -0
  158. package/dist/components/ui/kbd.d.ts +3 -0
  159. package/dist/components/ui/kbd.d.ts.map +1 -0
  160. package/dist/components/ui/kbd.js +6 -0
  161. package/dist/components/ui/kbd.js.map +1 -0
  162. package/dist/components/ui/label.d.ts +5 -0
  163. package/dist/components/ui/label.d.ts.map +1 -0
  164. package/dist/components/ui/label.js +10 -0
  165. package/dist/components/ui/label.js.map +1 -0
  166. package/dist/components/ui/popover.d.ts +11 -0
  167. package/dist/components/ui/popover.d.ts.map +1 -0
  168. package/dist/components/ui/popover.js +28 -0
  169. package/dist/components/ui/popover.js.map +1 -0
  170. package/dist/components/ui/scroll-area.d.ts +6 -0
  171. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  172. package/dist/components/ui/scroll-area.js +13 -0
  173. package/dist/components/ui/scroll-area.js.map +1 -0
  174. package/dist/components/ui/search-field.d.ts +9 -0
  175. package/dist/components/ui/search-field.d.ts.map +1 -0
  176. package/dist/components/ui/search-field.js +9 -0
  177. package/dist/components/ui/search-field.js.map +1 -0
  178. package/dist/components/ui/select.d.ts +25 -0
  179. package/dist/components/ui/select.d.ts.map +1 -0
  180. package/dist/components/ui/select.js +35 -0
  181. package/dist/components/ui/select.js.map +1 -0
  182. package/dist/components/ui/separator.d.ts +5 -0
  183. package/dist/components/ui/separator.d.ts.map +1 -0
  184. package/dist/components/ui/separator.js +10 -0
  185. package/dist/components/ui/separator.js.map +1 -0
  186. package/dist/components/ui/skeleton.d.ts +3 -0
  187. package/dist/components/ui/skeleton.d.ts.map +1 -0
  188. package/dist/components/ui/skeleton.js +9 -0
  189. package/dist/components/ui/skeleton.js.map +1 -0
  190. package/dist/components/ui/switch.d.ts +7 -0
  191. package/dist/components/ui/switch.d.ts.map +1 -0
  192. package/dist/components/ui/switch.js +10 -0
  193. package/dist/components/ui/switch.js.map +1 -0
  194. package/dist/components/ui/tabs.d.ts +12 -0
  195. package/dist/components/ui/tabs.d.ts.map +1 -0
  196. package/dist/components/ui/tabs.js +31 -0
  197. package/dist/components/ui/tabs.js.map +1 -0
  198. package/dist/components/ui/textarea.d.ts +4 -0
  199. package/dist/components/ui/textarea.d.ts.map +1 -0
  200. package/dist/components/ui/textarea.js +8 -0
  201. package/dist/components/ui/textarea.js.map +1 -0
  202. package/dist/components/ui/tooltip.d.ts +8 -0
  203. package/dist/components/ui/tooltip.d.ts.map +1 -0
  204. package/dist/components/ui/tooltip.js +19 -0
  205. package/dist/components/ui/tooltip.js.map +1 -0
  206. package/dist/hooks/shell/shell-registry-provider.d.ts +20 -0
  207. package/dist/hooks/shell/shell-registry-provider.d.ts.map +1 -0
  208. package/dist/hooks/shell/shell-registry-provider.js +42 -0
  209. package/dist/hooks/shell/shell-registry-provider.js.map +1 -0
  210. package/dist/hooks/shell/use-shell-shortcuts.d.ts +2 -0
  211. package/dist/hooks/shell/use-shell-shortcuts.d.ts.map +1 -0
  212. package/dist/hooks/shell/use-shell-shortcuts.js +27 -0
  213. package/dist/hooks/shell/use-shell-shortcuts.js.map +1 -0
  214. package/dist/hooks/shell/use-shell-store.d.ts +40 -0
  215. package/dist/hooks/shell/use-shell-store.d.ts.map +1 -0
  216. package/dist/hooks/shell/use-shell-store.js +420 -0
  217. package/dist/hooks/shell/use-shell-store.js.map +1 -0
  218. package/dist/hooks/shell/use-shell-tab-strip-bridge.d.ts +7 -0
  219. package/dist/hooks/shell/use-shell-tab-strip-bridge.d.ts.map +1 -0
  220. package/dist/hooks/shell/use-shell-tab-strip-bridge.js +316 -0
  221. package/dist/hooks/shell/use-shell-tab-strip-bridge.js.map +1 -0
  222. package/dist/hooks/use-keyboard-shortcut.d.ts +10 -0
  223. package/dist/hooks/use-keyboard-shortcut.d.ts.map +1 -0
  224. package/dist/hooks/use-keyboard-shortcut.js +35 -0
  225. package/dist/hooks/use-keyboard-shortcut.js.map +1 -0
  226. package/dist/hooks/use-media-query.d.ts +2 -0
  227. package/dist/hooks/use-media-query.d.ts.map +1 -0
  228. package/dist/hooks/use-media-query.js +14 -0
  229. package/dist/hooks/use-media-query.js.map +1 -0
  230. package/dist/hooks/use-theme.d.ts +14 -0
  231. package/dist/hooks/use-theme.d.ts.map +1 -0
  232. package/dist/hooks/use-theme.js +43 -0
  233. package/dist/hooks/use-theme.js.map +1 -0
  234. package/dist/hooks/workspace/use-workspace-draft-store.d.ts +45 -0
  235. package/dist/hooks/workspace/use-workspace-draft-store.d.ts.map +1 -0
  236. package/dist/hooks/workspace/use-workspace-draft-store.js +197 -0
  237. package/dist/hooks/workspace/use-workspace-draft-store.js.map +1 -0
  238. package/dist/index.d.ts +3 -28
  239. package/dist/index.d.ts.map +1 -1
  240. package/dist/index.js +1 -1
  241. package/dist/index.js.map +1 -1
  242. package/dist/lib/infra/logger.d.ts +10 -0
  243. package/dist/lib/infra/logger.d.ts.map +1 -0
  244. package/dist/lib/infra/logger.js +24 -0
  245. package/dist/lib/infra/logger.js.map +1 -0
  246. package/dist/lib/observe/event.d.ts +20 -0
  247. package/dist/lib/observe/event.d.ts.map +1 -0
  248. package/dist/lib/observe/event.js +60 -0
  249. package/dist/lib/observe/event.js.map +1 -0
  250. package/dist/lib/observe/ids.d.ts +3 -0
  251. package/dist/lib/observe/ids.d.ts.map +1 -0
  252. package/dist/lib/observe/ids.js +9 -0
  253. package/dist/lib/observe/ids.js.map +1 -0
  254. package/dist/lib/observe/index.d.ts +7 -0
  255. package/dist/lib/observe/index.d.ts.map +1 -0
  256. package/dist/lib/observe/index.js +6 -0
  257. package/dist/lib/observe/index.js.map +1 -0
  258. package/dist/lib/observe/logger.d.ts +25 -0
  259. package/dist/lib/observe/logger.d.ts.map +1 -0
  260. package/dist/lib/observe/logger.js +53 -0
  261. package/dist/lib/observe/logger.js.map +1 -0
  262. package/dist/lib/observe/nop.d.ts +3 -0
  263. package/dist/lib/observe/nop.d.ts.map +1 -0
  264. package/dist/lib/observe/nop.js +9 -0
  265. package/dist/lib/observe/nop.js.map +1 -0
  266. package/dist/lib/observe/shell.d.ts +19 -0
  267. package/dist/lib/observe/shell.d.ts.map +1 -0
  268. package/dist/lib/observe/shell.js +49 -0
  269. package/dist/lib/observe/shell.js.map +1 -0
  270. package/dist/lib/observe/stdout.d.ts +3 -0
  271. package/dist/lib/observe/stdout.d.ts.map +1 -0
  272. package/dist/lib/observe/stdout.js +6 -0
  273. package/dist/lib/observe/stdout.js.map +1 -0
  274. package/dist/lib/observe/types.d.ts +14 -0
  275. package/dist/lib/observe/types.d.ts.map +1 -0
  276. package/dist/lib/observe/types.js +2 -0
  277. package/dist/lib/observe/types.js.map +1 -0
  278. package/dist/lib/shell/actions.d.ts +33 -0
  279. package/dist/lib/shell/actions.d.ts.map +1 -0
  280. package/dist/lib/shell/actions.js +2 -0
  281. package/dist/lib/shell/actions.js.map +1 -0
  282. package/dist/lib/shell/persistence.d.ts +7 -0
  283. package/dist/lib/shell/persistence.d.ts.map +1 -0
  284. package/dist/lib/shell/persistence.js +18 -0
  285. package/dist/lib/shell/persistence.js.map +1 -0
  286. package/dist/lib/shell/status.d.ts +4 -0
  287. package/dist/lib/shell/status.d.ts.map +1 -0
  288. package/dist/lib/shell/status.js +31 -0
  289. package/dist/lib/shell/status.js.map +1 -0
  290. package/dist/lib/shell/types.d.ts +40 -0
  291. package/dist/lib/shell/types.d.ts.map +1 -0
  292. package/dist/lib/shell/types.js +2 -0
  293. package/dist/lib/shell/types.js.map +1 -0
  294. package/dist/lib/utils.d.ts +4 -0
  295. package/dist/lib/utils.d.ts.map +1 -0
  296. package/dist/lib/utils.js +11 -0
  297. package/dist/lib/utils.js.map +1 -0
  298. package/dist/public-api.d.ts +109 -0
  299. package/dist/public-api.d.ts.map +1 -0
  300. package/dist/public-api.js +145 -0
  301. package/dist/public-api.js.map +1 -0
  302. package/dist/styles.css +249 -379
  303. package/package.json +17 -11
  304. package/dist/shell.d.ts +0 -147
  305. package/dist/shell.d.ts.map +0 -1
  306. package/dist/shell.js +0 -339
  307. package/dist/shell.js.map +0 -1
package/README.md CHANGED
@@ -1,9 +1,48 @@
1
- # @elench/shell
1
+ # Avocado Frontend
2
2
 
3
- `@elench/shell` is the shared Elench desktop shell. Product code supplies
4
- sections, sidebar entries, tab descriptors, tab renderers, and inspector/status
5
- content. The package owns the activity rail, sidebar, tab rail, main pane,
6
- inspector placement, status bar, persistence, and shell actions.
3
+ Next.js 16 + React 19 frontend for Avocado. It is an App Router SPA with a shell-based workspace UI and is embedded into the API service at build time.
7
4
 
8
- The core contract is strict: domain content can only render inside an open tab.
9
- The shell never calls a product renderer with a null tab.
5
+ ## Quick Start
6
+
7
+ From `avocado/frontend/`:
8
+
9
+ ```bash
10
+ npm install
11
+ npm run dev
12
+ ```
13
+
14
+ - Dev server: `http://localhost:3010`
15
+ - Toolchain: Node `24.14.1`, npm `11.11.0`
16
+
17
+ ## How It Is Organized
18
+
19
+ - `src/app/` - Next.js routes and app entrypoints
20
+ - `src/components/shell/` - app shell layout, navigation, tabs, inspector
21
+ - `src/features/` - feature workspaces such as environments, instances, intelligence, and tools
22
+ - `src/hooks/` - data-fetching and domain hooks
23
+ - `src/hooks/shell/` - shell store, shortcuts, registry provider
24
+ - `src/lib/` - API client, shell types/actions, live updates, shared utilities
25
+
26
+ ## Architectural Notes
27
+
28
+ - The UI is centered around a multi-panel shell: activity bar, sidebar, workspace, and inspector.
29
+ - Feature workspaces register themselves through `src/hooks/shell/shell-registry-provider.tsx`.
30
+ - Shell state is managed with Zustand; server state and domain behavior live in focused hooks.
31
+ - Real-time updates flow through SSE-based stream hooks such as `use-event-stream` and `use-runtime-stream`.
32
+
33
+ ## Common Commands
34
+
35
+ ```bash
36
+ npm run dev
37
+ npm run build
38
+ npm run lint
39
+ npm run typecheck
40
+ npm run test
41
+ npm run test:e2e
42
+ npm run storybook
43
+ npm run ci
44
+ ```
45
+
46
+ ## Further Reading
47
+
48
+ - [Frontend architecture](../docs/frontend/architecture.md)
@@ -0,0 +1,2 @@
1
+ export declare function ActivityBar(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=activity-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-bar.d.ts","sourceRoot":"","sources":["../../../src/components/shell/activity-bar.tsx"],"names":[],"mappings":"AAYA,wBAAgB,WAAW,4CAiC1B"}
@@ -0,0 +1,19 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import { ContextActionMenu } from "./context-action-menu.js";
4
+ import { useShellRegistry } from "../../hooks/shell/shell-registry-provider.js";
5
+ import { useShellStore } from "../../hooks/shell/use-shell-store.js";
6
+ import { useShellSurfaceActionGroups } from "./use-shell-surface-action-groups.js";
7
+ import { ActivityNav, ActivityNavButton, ActivityNavSpacer, } from "./primitives/activity-nav.js";
8
+ export function ActivityBar() {
9
+ const setActiveMode = useShellStore((state) => state.setActiveMode);
10
+ const { activeMode, workspaces } = useShellRegistry();
11
+ const contextMenuGroups = useShellSurfaceActionGroups({
12
+ includeActiveTab: false,
13
+ includeAppearance: false,
14
+ includePanels: false,
15
+ includeSearch: false,
16
+ });
17
+ return (_jsx(ContextActionMenu, { groups: contextMenuGroups, children: _jsx("div", { className: "h-full", children: _jsxs(ActivityNav, { children: [workspaces.map((workspace) => (_jsx(ActivityNavButton, { active: activeMode === workspace.mode, "aria-label": workspace.label, onClick: () => setActiveMode(workspace.mode, { source: "activity_bar" }), title: workspace.label, children: workspace.icon }, workspace.mode))), _jsx(ActivityNavSpacer, {})] }) }) }));
18
+ }
19
+ //# sourceMappingURL=activity-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-bar.js","sourceRoot":"","sources":["../../../src/components/shell/activity-bar.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAE,MAAM,uCAAuC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EACL,WAAW,EACX,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,UAAU,WAAW;IACzB,MAAM,aAAa,GAAG,aAAa,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;IACpE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACtD,MAAM,iBAAiB,GAAG,2BAA2B,CAAC;QACpD,gBAAgB,EAAE,KAAK;QACvB,iBAAiB,EAAE,KAAK;QACxB,aAAa,EAAE,KAAK;QACpB,aAAa,EAAE,KAAK;KACrB,CAAC,CAAC;IAEH,OAAO,CACL,KAAC,iBAAiB,IAAC,MAAM,EAAE,iBAAiB,YAC1C,cAAK,SAAS,EAAC,QAAQ,YACrB,MAAC,WAAW,eACT,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,CAC7B,KAAC,iBAAiB,IAChB,MAAM,EAAE,UAAU,KAAK,SAAS,CAAC,IAAI,gBACzB,SAAS,CAAC,KAAK,EAE3B,OAAO,EAAE,GAAG,EAAE,CACZ,aAAa,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,CAAC,EAE3D,KAAK,EAAE,SAAS,CAAC,KAAK,YAErB,SAAS,CAAC,IAAI,IANV,SAAS,CAAC,IAAI,CAOD,CACrB,CAAC,EAEF,KAAC,iBAAiB,KAAG,IACT,GACV,GACY,CACrB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type ReactNode } from "react";
2
+ import type { ShellWorkspaceDefinition } from "../../lib/shell/types.js";
3
+ interface AppShellProps {
4
+ appTitle?: string;
5
+ children: ReactNode;
6
+ initialActiveMode?: string;
7
+ workspaces: ShellWorkspaceDefinition[];
8
+ }
9
+ export declare function AppShell({ appTitle, children, initialActiveMode, workspaces, }: AppShellProps): import("react/jsx-runtime").JSX.Element;
10
+ export {};
11
+ //# sourceMappingURL=app-shell.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell.d.ts","sourceRoot":"","sources":["../../../src/components/shell/app-shell.tsx"],"names":[],"mappings":"AAEA,OAAO,EACL,KAAK,SAAS,EAKf,MAAM,OAAO,CAAC;AAgCf,OAAO,KAAK,EAAY,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AAsiB5E,UAAU,aAAa;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,SAAS,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,UAAU,EAAE,wBAAwB,EAAE,CAAC;CACxC;AAED,wBAAgB,QAAQ,CAAC,EACvB,QAAQ,EACR,QAAQ,EACR,iBAAiB,EACjB,UAAU,GACX,EAAE,aAAa,2CAYf"}
@@ -0,0 +1,323 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
+ import { useCallback, useEffect, useRef, useState, } from "react";
4
+ import { Actions, DockLocation, Layout, Model, } from "flexlayout-react";
5
+ import { PinIcon, XIcon } from "lucide-react";
6
+ import { Dialog, DialogContent, DialogTitle } from "../ui/dialog.js";
7
+ import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "../ui/dropdown-menu.js";
8
+ import { ShellRegistryProvider } from "../../hooks/shell/shell-registry-provider.js";
9
+ import { useShellRegistry } from "../../hooks/shell/shell-registry-provider.js";
10
+ import { useShellShortcuts } from "../../hooks/shell/use-shell-shortcuts.js";
11
+ import { useShellStore } from "../../hooks/shell/use-shell-store.js";
12
+ import { useShellTabStripBridge } from "../../hooks/shell/use-shell-tab-strip-bridge.js";
13
+ import { setShellLayoutFields, setShellSource, shellLayoutLogger, } from "../../lib/observe/shell.js";
14
+ import { ContextActionMenu } from "./context-action-menu.js";
15
+ import { useShellSurfaceActionGroups } from "./use-shell-surface-action-groups.js";
16
+ import { ActivityBar } from "./activity-bar.js";
17
+ import { DEFAULT_LAYOUT } from "./default-layout.js";
18
+ import { LeftSidebar } from "./left-sidebar.js";
19
+ import { ShellHeaderSlot, ShellMainSlot, ShellRailSlot, ShellStatusSlot, ShellViewport, } from "./primitives/shell-frame.js";
20
+ import { RightInspector } from "./right-inspector.js";
21
+ import { ShellLayoutProvider, useShellLayout } from "./shell-layout.js";
22
+ import { extractActiveTabId, extractTabsFromModel, setShellModel, } from "./shell-model.js";
23
+ import { StatusBar } from "./status-bar.js";
24
+ import { SHELL_TAB_ID_ATTR, SHELL_TAB_MODE_ATTR, SHELL_TAB_PREVIEW_ATTR, } from "./tab-strip-bridge.js";
25
+ import { TopBar } from "./top-bar.js";
26
+ import { WorkspaceSurfaceContextMenu } from "./workspace-surface-context-menu.js";
27
+ import { WorkspaceTabContent } from "./workspace-tab-content.js";
28
+ const FLEXLAYOUT_STORAGE_KEY = "shell-flexlayout:v1";
29
+ function sanitizeStoredGlobalLayout(global) {
30
+ const sanitizedGlobal = {
31
+ ...global,
32
+ splitterSize: 6,
33
+ };
34
+ // Older saved layouts may persist these sizing fields, but the current shell
35
+ // controls tab geometry via CSS instead of FlexLayout globals.
36
+ delete sanitizedGlobal.tabMinWidth;
37
+ delete sanitizedGlobal.tabMaxWidth;
38
+ return sanitizedGlobal;
39
+ }
40
+ function sanitizeStoredLayout(json) {
41
+ if (!json || typeof json !== "object")
42
+ return DEFAULT_LAYOUT;
43
+ const layout = json;
44
+ if (!layout.global)
45
+ return json;
46
+ return {
47
+ ...layout,
48
+ global: sanitizeStoredGlobalLayout(layout.global),
49
+ };
50
+ }
51
+ function loadOrCreateModel() {
52
+ if (typeof window !== "undefined") {
53
+ try {
54
+ const stored = window.localStorage.getItem(FLEXLAYOUT_STORAGE_KEY);
55
+ if (stored) {
56
+ const json = sanitizeStoredLayout(JSON.parse(stored));
57
+ return Model.fromJson(json);
58
+ }
59
+ }
60
+ catch {
61
+ // Fall through to default
62
+ }
63
+ // Migrate tabs from old shell-store if present
64
+ try {
65
+ const oldStore = window.localStorage.getItem("shell-store");
66
+ if (oldStore) {
67
+ const parsed = JSON.parse(oldStore);
68
+ const tabs = parsed?.state?.tabs ?? [];
69
+ const activeTabId = parsed?.state?.activeTabId ?? null;
70
+ if (tabs.length > 0) {
71
+ const model = Model.fromJson(DEFAULT_LAYOUT);
72
+ for (const tab of tabs) {
73
+ model.doAction(Actions.addNode({
74
+ type: "tab",
75
+ id: `workspace:${tab.id}`,
76
+ name: tab.label,
77
+ component: "workspace",
78
+ config: { shellTab: tab },
79
+ }, "main-tabset", DockLocation.CENTER, -1, false));
80
+ }
81
+ // Select the previously active tab
82
+ if (activeTabId) {
83
+ const nodeId = `workspace:${activeTabId}`;
84
+ const node = model.getNodeById(nodeId);
85
+ if (node) {
86
+ model.doAction(Actions.selectTab(nodeId));
87
+ }
88
+ }
89
+ return model;
90
+ }
91
+ }
92
+ }
93
+ catch {
94
+ // Fall through to default
95
+ }
96
+ }
97
+ return Model.fromJson(DEFAULT_LAYOUT);
98
+ }
99
+ function persistModel(model) {
100
+ if (typeof window === "undefined")
101
+ return;
102
+ try {
103
+ window.localStorage.setItem(FLEXLAYOUT_STORAGE_KEY, JSON.stringify(model.toJson()));
104
+ }
105
+ catch {
106
+ // Ignore storage failures
107
+ }
108
+ }
109
+ function ShellChrome({ children }) {
110
+ const { isCompact, leftSidebarOpen, rightInspectorOpen, setPanelVisibility } = useShellLayout();
111
+ const modelRef = useRef(null);
112
+ const layoutSurfaceRef = useRef(null);
113
+ const layoutLogTimerRef = useRef(null);
114
+ const layoutContextMenuGroups = useShellSurfaceActionGroups({
115
+ includeActiveTab: false,
116
+ includeAppearance: false,
117
+ });
118
+ useShellShortcuts();
119
+ useShellTabStripBridge(layoutSurfaceRef, { enabled: !isCompact });
120
+ const [tabContextMenu, setTabContextMenu] = useState(null);
121
+ const handleTabContextMenu = useCallback((node, event) => {
122
+ if (node.getType() !== "tab")
123
+ return;
124
+ const tabNode = node;
125
+ if (tabNode.getComponent() !== "workspace")
126
+ return;
127
+ const shellTab = tabNode.getConfig()?.shellTab;
128
+ if (!shellTab)
129
+ return;
130
+ event.preventDefault();
131
+ event.stopPropagation();
132
+ setTabContextMenu({
133
+ tabId: shellTab.id,
134
+ shellTab,
135
+ x: event.clientX,
136
+ y: event.clientY,
137
+ });
138
+ }, []);
139
+ // Initialize model once
140
+ if (!modelRef.current) {
141
+ const model = loadOrCreateModel();
142
+ model.doAction(Actions.updateModelAttributes({ tabEnableRenderOnDemand: false }));
143
+ model.setOnAllowDrop((_dragNode, dropInfo) => {
144
+ return dropInfo.node.getType() !== "border";
145
+ });
146
+ persistModel(model);
147
+ modelRef.current = model;
148
+ setShellModel(model);
149
+ // Sync initial tabs to Zustand
150
+ const tabs = extractTabsFromModel(model);
151
+ const activeTabId = extractActiveTabId(model);
152
+ if (tabs.length > 0) {
153
+ useShellStore.setState({ tabs, activeTabId });
154
+ }
155
+ }
156
+ useEffect(() => {
157
+ setShellSource(setShellLayoutFields(shellLayoutLogger.event("shell.layout.restored"), {
158
+ isCompact,
159
+ leftSidebarOpen,
160
+ rightInspectorOpen,
161
+ }), "layout_restore").send();
162
+ return () => {
163
+ if (layoutLogTimerRef.current) {
164
+ clearTimeout(layoutLogTimerRef.current);
165
+ }
166
+ };
167
+ // Only log on mount
168
+ // eslint-disable-next-line react-hooks/exhaustive-deps
169
+ }, []);
170
+ const factory = useCallback((node) => {
171
+ switch (node.getComponent()) {
172
+ case "sidebar":
173
+ return _jsx(LeftSidebar, {});
174
+ case "inspector":
175
+ return _jsx(RightInspector, {});
176
+ case "workspace": {
177
+ const shellTab = node.getConfig()?.shellTab;
178
+ if (!shellTab)
179
+ return null;
180
+ return _jsx(WorkspaceTabContent, { tab: shellTab });
181
+ }
182
+ default:
183
+ return null;
184
+ }
185
+ }, []);
186
+ const handleModelChange = useCallback((model) => {
187
+ persistModel(model);
188
+ // Sync tabs + activeTabId back to Zustand
189
+ const tabs = extractTabsFromModel(model);
190
+ const activeTabId = extractActiveTabId(model);
191
+ useShellStore.setState({ tabs, activeTabId });
192
+ // Sync border visibility to shell layout
193
+ const borderSet = model.getBorderSet();
194
+ const borders = borderSet.getBorders();
195
+ const leftBorder = borders.find((b) => b.getLocation().getName() === "left");
196
+ const rightBorder = borders.find((b) => b.getLocation().getName() === "right");
197
+ const leftOpen = leftBorder?.getSelectedNode() != null;
198
+ const rightOpen = rightBorder?.getSelectedNode() != null;
199
+ if (leftOpen !== leftSidebarOpen || rightOpen !== rightInspectorOpen) {
200
+ setPanelVisibility({ leftSidebarOpen: leftOpen, rightInspectorOpen: rightOpen }, { source: "layout_resize" });
201
+ }
202
+ }, [leftSidebarOpen, rightInspectorOpen, setPanelVisibility]);
203
+ const handleAction = useCallback((action) => {
204
+ // Log layout-native events only (not tab lifecycle — that's in useShellStore)
205
+ switch (action.type) {
206
+ case Actions.MOVE_NODE:
207
+ case Actions.MAXIMIZE_TOGGLE: {
208
+ if (layoutLogTimerRef.current) {
209
+ clearTimeout(layoutLogTimerRef.current);
210
+ }
211
+ layoutLogTimerRef.current = setTimeout(() => {
212
+ setShellSource(setShellLayoutFields(shellLayoutLogger
213
+ .event("shell.panel.resized")
214
+ .set("action_type", action.type), { isCompact, leftSidebarOpen, rightInspectorOpen }), "layout_resize").send();
215
+ layoutLogTimerRef.current = null;
216
+ }, 250);
217
+ break;
218
+ }
219
+ }
220
+ // Prevent closing/dragging border tabs
221
+ if (action.type === Actions.DELETE_TAB ||
222
+ action.type === Actions.MOVE_NODE) {
223
+ const nodeId = action.data?.node;
224
+ if (nodeId === "sidebar" || nodeId === "inspector") {
225
+ return undefined;
226
+ }
227
+ }
228
+ // Pin preview tab when dragged
229
+ if (action.type === Actions.MOVE_NODE) {
230
+ const nodeId = action.data?.node;
231
+ if (nodeId && nodeId.startsWith("workspace:")) {
232
+ const tabId = nodeId.replace("workspace:", "");
233
+ setTimeout(() => {
234
+ useShellStore.getState().pinTab(tabId, { source: "tab_bar" });
235
+ }, 0);
236
+ }
237
+ }
238
+ return action;
239
+ }, [isCompact, leftSidebarOpen, rightInspectorOpen]);
240
+ const EmptyTabsetPlaceholder = useCallback(() => {
241
+ return _jsx(EmptyWorkspacePlaceholder, {});
242
+ }, []);
243
+ if (isCompact) {
244
+ return (_jsxs(ShellViewport, { compact: true, children: [_jsx(ShellHeaderSlot, { children: _jsx(TopBar, {}) }), _jsx(ShellRailSlot, { children: _jsx(ActivityBar, {}) }), _jsx(ShellMainSlot, { children: _jsx("div", { className: "h-full overflow-auto shell-surface-radius bg-bg-surface", children: _jsx("main", { className: "min-h-0 flex-1 overflow-auto", children: children }) }) }), _jsx(ShellStatusSlot, { children: _jsx(StatusBar, {}) }), _jsx(Dialog, { onOpenChange: (open) => setPanelVisibility({
245
+ leftSidebarOpen: open,
246
+ rightInspectorOpen,
247
+ }, { source: "drawer" }), open: leftSidebarOpen, children: _jsxs(DialogContent, { className: "!top-[calc(36px+var(--shell-gap))] !bottom-[calc(28px+var(--shell-gap))] !left-[52px] !right-auto !w-[min(24rem,calc(100vw-4rem))] !max-w-none !transform-none !rounded-none border-border/80 bg-popover !p-0", showCloseButton: false, children: [_jsx(DialogTitle, { className: "sr-only", children: "Left sidebar" }), _jsx(LeftSidebar, {})] }) }), _jsx(Dialog, { onOpenChange: (open) => setPanelVisibility({
248
+ leftSidebarOpen,
249
+ rightInspectorOpen: open,
250
+ }, { source: "drawer" }), open: rightInspectorOpen, children: _jsxs(DialogContent, { className: "!top-[calc(36px+var(--shell-gap))] !bottom-[calc(28px+var(--shell-gap))] !right-0 !left-auto !w-[min(24rem,calc(100vw-4rem))] !max-w-none !transform-none !rounded-none border-border/80 bg-popover !p-0", showCloseButton: false, children: [_jsx(DialogTitle, { className: "sr-only", children: "Inspector" }), _jsx(RightInspector, {})] }) })] }));
251
+ }
252
+ const model = modelRef.current;
253
+ if (!model)
254
+ return null;
255
+ return (_jsxs(ShellViewport, { children: [_jsx(ShellHeaderSlot, { children: _jsx(TopBar, {}) }), _jsx(ShellRailSlot, { children: _jsx(ActivityBar, {}) }), _jsx(ShellMainSlot, { children: _jsx(ContextActionMenu, { groups: layoutContextMenuGroups, children: _jsxs("div", { ref: layoutSurfaceRef, className: "relative h-full min-h-0 overflow-hidden shell-surface-radius", children: [_jsx(Layout, { model: model, factory: factory, realtimeResize: true, onModelChange: handleModelChange, onAction: handleAction, onContextMenu: handleTabContextMenu, onRenderTab: (node, renderValues) => {
256
+ if (node.getComponent() === "workspace") {
257
+ const shellTab = node.getConfig()?.shellTab;
258
+ if (shellTab) {
259
+ renderValues.content = (_jsx("span", { [SHELL_TAB_ID_ATTR]: shellTab.id,
260
+ [SHELL_TAB_MODE_ATTR]: shellTab.mode,
261
+ ...(shellTab.preview
262
+ ? { [SHELL_TAB_PREVIEW_ATTR]: "true" }
263
+ : {}), style: { display: "contents" }, onDoubleClick: () => {
264
+ if (!shellTab.preview)
265
+ return;
266
+ useShellStore.getState().pinTab(shellTab.id, {
267
+ source: "tab_bar",
268
+ });
269
+ }, children: renderValues.content }));
270
+ }
271
+ if (shellTab?.tone) {
272
+ const toneClass = {
273
+ neutral: "bg-border",
274
+ success: "bg-status-ok shadow-[0_0_4px_var(--ok-glow)]",
275
+ warning: "bg-status-warn shadow-[0_0_4px_var(--warn-glow)]",
276
+ danger: "bg-status-err shadow-[0_0_4px_var(--error-glow)]",
277
+ info: "bg-status-info shadow-[0_0_4px_var(--info-glow)]",
278
+ }[shellTab.tone];
279
+ renderValues.leading = (_jsx("span", { className: `size-[5px] shrink-0 rounded-full ${toneClass}` }));
280
+ }
281
+ }
282
+ }, onTabSetPlaceHolder: EmptyTabsetPlaceholder }), tabContextMenu && (_jsxs(DropdownMenu, { open: true, onOpenChange: (open) => {
283
+ if (!open)
284
+ setTabContextMenu(null);
285
+ }, children: [_jsx(DropdownMenuTrigger, { asChild: true, children: _jsx("div", { style: {
286
+ position: "fixed",
287
+ left: tabContextMenu.x,
288
+ top: tabContextMenu.y,
289
+ width: 0,
290
+ height: 0,
291
+ } }) }), _jsxs(DropdownMenuContent, { className: "min-w-52 w-auto", align: "start", side: "bottom", sideOffset: 0, children: [tabContextMenu.shellTab.preview && (_jsxs(_Fragment, { children: [_jsxs(DropdownMenuItem, { onSelect: () => {
292
+ useShellStore
293
+ .getState()
294
+ .pinTab(tabContextMenu.tabId, {
295
+ source: "context_menu",
296
+ });
297
+ }, children: [_jsx(PinIcon, { className: "size-4" }), " Keep open"] }), _jsx(DropdownMenuSeparator, {})] })), _jsxs(DropdownMenuItem, { onSelect: () => {
298
+ useShellStore.getState().closeTab(tabContextMenu.tabId, {
299
+ source: "context_menu",
300
+ });
301
+ }, children: [_jsx(XIcon, { className: "size-4" }), " Close"] }), _jsx(DropdownMenuItem, { disabled: useShellStore.getState().tabs.length <= 1, onSelect: () => {
302
+ useShellStore
303
+ .getState()
304
+ .closeOtherTabs(tabContextMenu.tabId, {
305
+ source: "context_menu",
306
+ });
307
+ }, children: "Close Others" }), _jsx(DropdownMenuItem, { variant: "destructive", onSelect: () => {
308
+ useShellStore
309
+ .getState()
310
+ .closeAllTabs({ source: "context_menu" });
311
+ }, children: "Close All" })] })] }))] }) }) }), _jsx(ShellStatusSlot, { children: _jsx(StatusBar, {}) })] }));
312
+ }
313
+ function EmptyWorkspacePlaceholder() {
314
+ const { activeModeWorkspace } = useShellRegistry();
315
+ if (!activeModeWorkspace)
316
+ return null;
317
+ const { Workspace } = activeModeWorkspace;
318
+ return (_jsx(WorkspaceSurfaceContextMenu, { workspace: activeModeWorkspace, tab: null, children: _jsx("div", { className: "h-full overflow-auto bg-bg-surface", children: _jsx(Workspace, { tab: null }) }) }));
319
+ }
320
+ export function AppShell({ appTitle, children, initialActiveMode, workspaces, }) {
321
+ return (_jsx(ShellRegistryProvider, { appTitle: appTitle, initialActiveMode: initialActiveMode, workspaces: workspaces, children: _jsx(ShellLayoutProvider, { children: _jsx(ShellChrome, { children: children }) }) }));
322
+ }
323
+ //# sourceMappingURL=app-shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app-shell.js","sourceRoot":"","sources":["../../../src/components/shell/app-shell.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { type ReactNode } from "react";
2
+ import type { ShellActionGroup } from "../../lib/shell/actions.js";
3
+ export declare function ContextActionMenu({ children, groups, }: {
4
+ children: ReactNode;
5
+ groups: ShellActionGroup[];
6
+ }): string | number | bigint | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | Promise<string | number | bigint | boolean | import("react").ReactPortal | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<ReactNode> | null | undefined> | null | undefined;
7
+ //# sourceMappingURL=context-action-menu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-action-menu.d.ts","sourceRoot":"","sources":["../../../src/components/shell/context-action-menu.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAmB,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAUxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAoE5D,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,MAAM,GACP,EAAE;IACD,QAAQ,EAAE,SAAS,CAAC;IACpB,MAAM,EAAE,gBAAgB,EAAE,CAAC;CAC5B,2UA4DA"}
@@ -0,0 +1,75 @@
1
+ "use client";
2
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
+ import {} from "react";
4
+ import { ContextMenu, ContextMenuContent, ContextMenuItem, ContextMenuLabel, ContextMenuSeparator, ContextMenuShortcut, ContextMenuTrigger, } from "../ui/context-menu.js";
5
+ const NATIVE_CONTEXT_MENU_SELECTOR = [
6
+ "a[href]",
7
+ "[role='link']",
8
+ "input",
9
+ "textarea",
10
+ "[contenteditable='']",
11
+ "[contenteditable='true']",
12
+ "[contenteditable='plaintext-only']",
13
+ "[data-native-context-menu]",
14
+ ].join(", ");
15
+ function hasSelectedText(target, currentTarget) {
16
+ if (typeof window === "undefined")
17
+ return false;
18
+ const selection = window.getSelection();
19
+ if (!selection ||
20
+ selection.isCollapsed ||
21
+ selection.rangeCount === 0 ||
22
+ selection.toString().trim().length === 0) {
23
+ return false;
24
+ }
25
+ const targetNode = target instanceof Node ? target : null;
26
+ if (!targetNode || !(currentTarget instanceof Node)) {
27
+ return false;
28
+ }
29
+ return Array.from({ length: selection.rangeCount }).some((_, index) => {
30
+ const range = selection.getRangeAt(index);
31
+ if (!currentTarget.contains(range.commonAncestorContainer)) {
32
+ return false;
33
+ }
34
+ try {
35
+ return range.intersectsNode(targetNode);
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ });
41
+ }
42
+ function shouldPreserveNativeContextMenu(event) {
43
+ const target = event.target;
44
+ const element = target instanceof Element
45
+ ? target
46
+ : target instanceof Node
47
+ ? target.parentElement
48
+ : null;
49
+ if (!element)
50
+ return false;
51
+ if (element.closest(NATIVE_CONTEXT_MENU_SELECTOR)) {
52
+ return true;
53
+ }
54
+ return hasSelectedText(target, event.currentTarget);
55
+ }
56
+ export function ContextActionMenu({ children, groups, }) {
57
+ const visibleGroups = groups
58
+ .map((group) => ({
59
+ ...group,
60
+ actions: group.actions.filter((action) => action.showInContextMenu !== false),
61
+ }))
62
+ .filter((group) => group.actions.length > 0);
63
+ if (visibleGroups.length === 0) {
64
+ return children;
65
+ }
66
+ const handleContextMenuCapture = (event) => {
67
+ if (!shouldPreserveNativeContextMenu(event)) {
68
+ return;
69
+ }
70
+ event.stopPropagation();
71
+ event.nativeEvent.stopImmediatePropagation?.();
72
+ };
73
+ return (_jsxs(ContextMenu, { children: [_jsx(ContextMenuTrigger, { asChild: true, children: _jsx("div", { className: "contents", onContextMenuCapture: handleContextMenuCapture, children: children }) }), _jsx(ContextMenuContent, { className: "min-w-52", children: visibleGroups.map((group, groupIndex) => (_jsxs("div", { children: [groupIndex > 0 ? _jsx(ContextMenuSeparator, {}) : null, group.label ? (_jsx(ContextMenuLabel, { children: group.label })) : null, group.actions.map((action) => (_jsxs(ContextMenuItem, { disabled: action.disabled, inset: !action.icon, onSelect: () => action.run({ source: "context_menu" }), variant: action.variant, children: [action.icon, action.label, action.shortcut ? (_jsx(ContextMenuShortcut, { children: action.shortcut })) : null] }, action.id)))] }, group.id))) })] }));
74
+ }
75
+ //# sourceMappingURL=context-action-menu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-action-menu.js","sourceRoot":"","sources":["../../../src/components/shell/context-action-menu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { IJsonModel } from "flexlayout-react";
2
+ export declare const DEFAULT_LAYOUT: IJsonModel;
3
+ //# sourceMappingURL=default-layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-layout.d.ts","sourceRoot":"","sources":["../../../src/components/shell/default-layout.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,eAAO,MAAM,cAAc,EAAE,UA6D5B,CAAC"}
@@ -0,0 +1,63 @@
1
+ export const DEFAULT_LAYOUT = {
2
+ global: {
3
+ tabEnableClose: true, // workspace tabs have an X button
4
+ tabEnableRename: false, // tab labels are set programmatically, not by users
5
+ tabEnableRenderOnDemand: false, // keep open workspace tabs mounted when inactive
6
+ tabSetEnableMaximize: true, // double-click tabset header to go fullscreen
7
+ tabSetEnableClose: false, // can't close the entire tabset container
8
+ splitterSize: 6, // must match --shell-gap in globals.css
9
+ splitterExtra: 4, // invisible hit-target padding on each side of splitter
10
+ borderEnableAutoHide: false, // sidebar/inspector only collapse via toggle functions, not by resizing narrow
11
+ borderEnableDrop: false, // borders are reserved shell surfaces, not user tab drop targets
12
+ },
13
+ borders: [
14
+ {
15
+ type: "border",
16
+ location: "left",
17
+ size: 260, // default width (px) — persisted after first drag
18
+ minSize: 100, // narrowest the user can drag to
19
+ selected: 0, // 0 = open (first child selected), -1 = collapsed
20
+ children: [
21
+ {
22
+ type: "tab",
23
+ id: "sidebar",
24
+ name: "Sidebar",
25
+ component: "sidebar", // resolved by factory → <LeftSidebar />
26
+ enableClose: false, // permanent — no X button
27
+ enableDrag: false, // can't be dragged out of the border
28
+ },
29
+ ],
30
+ },
31
+ {
32
+ type: "border",
33
+ location: "right",
34
+ size: 260,
35
+ minSize: 100,
36
+ selected: 0,
37
+ children: [
38
+ {
39
+ type: "tab",
40
+ id: "inspector",
41
+ name: "Inspector",
42
+ component: "inspector", // resolved by factory → <RightInspector />
43
+ enableClose: false,
44
+ enableDrag: false,
45
+ },
46
+ ],
47
+ },
48
+ ],
49
+ layout: {
50
+ type: "row",
51
+ weight: 100, // fills all remaining horizontal space between borders
52
+ children: [
53
+ {
54
+ type: "tabset",
55
+ weight: 100,
56
+ id: "main-tabset", // target for openTab — workspace tabs are added here
57
+ enableDeleteWhenEmpty: false, // keeps the tabset even with zero tabs (shows placeholder)
58
+ children: [],
59
+ },
60
+ ],
61
+ },
62
+ };
63
+ //# sourceMappingURL=default-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-layout.js","sourceRoot":"","sources":["../../../src/components/shell/default-layout.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,cAAc,GAAe;IACxC,MAAM,EAAE;QACN,cAAc,EAAE,IAAI,EAAE,kCAAkC;QACxD,eAAe,EAAE,KAAK,EAAE,oDAAoD;QAC5E,uBAAuB,EAAE,KAAK,EAAE,iDAAiD;QACjF,oBAAoB,EAAE,IAAI,EAAE,8CAA8C;QAC1E,iBAAiB,EAAE,KAAK,EAAE,0CAA0C;QACpE,YAAY,EAAE,CAAC,EAAE,wCAAwC;QACzD,aAAa,EAAE,CAAC,EAAE,wDAAwD;QAC1E,oBAAoB,EAAE,KAAK,EAAE,+EAA+E;QAC5G,gBAAgB,EAAE,KAAK,EAAE,iEAAiE;KAC3F;IACD,OAAO,EAAE;QACP;YACE,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,MAAM;YAChB,IAAI,EAAE,GAAG,EAAE,kDAAkD;YAC7D,OAAO,EAAE,GAAG,EAAE,iCAAiC;YAC/C,QAAQ,EAAE,CAAC,EAAE,kDAAkD;YAC/D,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,KAAK;oBACX,EAAE,EAAE,SAAS;oBACb,IAAI,EAAE,SAAS;oBACf,SAAS,EAAE,SAAS,EAAE,wCAAwC;oBAC9D,WAAW,EAAE,KAAK,EAAE,0BAA0B;oBAC9C,UAAU,EAAE,KAAK,EAAE,qCAAqC;iBACzD;aACF;SACF;QACD;YACE,IAAI,EAAE,QAAQ;YACd,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,GAAG;YACZ,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE;gBACR;oBACE,IAAI,EAAE,KAAK;oBACX,EAAE,EAAE,WAAW;oBACf,IAAI,EAAE,WAAW;oBACjB,SAAS,EAAE,WAAW,EAAE,2CAA2C;oBACnE,WAAW,EAAE,KAAK;oBAClB,UAAU,EAAE,KAAK;iBAClB;aACF;SACF;KACF;IACD,MAAM,EAAE;QACN,IAAI,EAAE,KAAK;QACX,MAAM,EAAE,GAAG,EAAE,uDAAuD;QACpE,QAAQ,EAAE;YACR;gBACE,IAAI,EAAE,QAAQ;gBACd,MAAM,EAAE,GAAG;gBACX,EAAE,EAAE,aAAa,EAAE,qDAAqD;gBACxE,qBAAqB,EAAE,KAAK,EAAE,2DAA2D;gBACzF,QAAQ,EAAE,EAAE;aACb;SACF;KACF;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function LeftSidebar(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=left-sidebar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"left-sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/shell/left-sidebar.tsx"],"names":[],"mappings":"AAQA,wBAAgB,WAAW,4CA4B1B"}