@treenity/react 3.0.0 → 3.0.1

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 (369) hide show
  1. package/README.md +91 -0
  2. package/dist/AclEditor.d.ts +1 -1
  3. package/dist/AclEditor.d.ts.map +1 -1
  4. package/dist/AclEditor.js +5 -5
  5. package/dist/AclEditor.js.map +1 -1
  6. package/dist/ActionCards.d.ts +9 -0
  7. package/dist/ActionCards.d.ts.map +1 -0
  8. package/dist/ActionCards.js +96 -0
  9. package/dist/ActionCards.js.map +1 -0
  10. package/dist/App.d.ts.map +1 -1
  11. package/dist/App.js +71 -185
  12. package/dist/App.js.map +1 -1
  13. package/dist/ComponentSection.d.ts +15 -0
  14. package/dist/ComponentSection.d.ts.map +1 -0
  15. package/dist/ComponentSection.js +25 -0
  16. package/dist/ComponentSection.js.map +1 -0
  17. package/dist/ErrorBoundary.d.ts +18 -0
  18. package/dist/ErrorBoundary.d.ts.map +1 -0
  19. package/dist/ErrorBoundary.js +17 -0
  20. package/dist/ErrorBoundary.js.map +1 -0
  21. package/dist/Inspector.d.ts +1 -0
  22. package/dist/Inspector.d.ts.map +1 -1
  23. package/dist/Inspector.js +22 -347
  24. package/dist/Inspector.js.map +1 -1
  25. package/dist/Login.d.ts +8 -0
  26. package/dist/Login.d.ts.map +1 -0
  27. package/dist/Login.js +45 -0
  28. package/dist/Login.js.map +1 -0
  29. package/dist/NodeEditor.d.ts +11 -0
  30. package/dist/NodeEditor.d.ts.map +1 -0
  31. package/dist/NodeEditor.js +157 -0
  32. package/dist/NodeEditor.js.map +1 -0
  33. package/dist/Tree.d.ts +1 -0
  34. package/dist/Tree.d.ts.map +1 -1
  35. package/dist/Tree.js +8 -27
  36. package/dist/Tree.js.map +1 -1
  37. package/dist/bind/engine.js +1 -1
  38. package/dist/bind/engine.js.map +1 -1
  39. package/dist/bind/eval.d.ts +1 -1
  40. package/dist/bind/eval.d.ts.map +1 -1
  41. package/dist/bind/hook.d.ts +1 -1
  42. package/dist/bind/hook.d.ts.map +1 -1
  43. package/dist/bind/hook.js +1 -1
  44. package/dist/bind/hook.js.map +1 -1
  45. package/dist/cache.d.ts +1 -1
  46. package/dist/cache.d.ts.map +1 -1
  47. package/dist/cache.js +4 -0
  48. package/dist/cache.js.map +1 -1
  49. package/dist/client-tree.d.ts +1 -2
  50. package/dist/client-tree.d.ts.map +1 -1
  51. package/dist/client-tree.js +12 -5
  52. package/dist/client-tree.js.map +1 -1
  53. package/dist/client.d.ts +1 -1
  54. package/dist/client.d.ts.map +1 -1
  55. package/dist/client.js +2 -4
  56. package/dist/client.js.map +1 -1
  57. package/dist/components/ConfirmDialog.d.ts +9 -0
  58. package/dist/components/ConfirmDialog.d.ts.map +1 -0
  59. package/dist/components/ConfirmDialog.js +6 -0
  60. package/dist/components/ConfirmDialog.js.map +1 -0
  61. package/dist/components/ConfirmPopover.d.ts +8 -0
  62. package/dist/components/ConfirmPopover.d.ts.map +1 -0
  63. package/dist/components/ConfirmPopover.js +9 -0
  64. package/dist/components/ConfirmPopover.js.map +1 -0
  65. package/dist/components/PathBreadcrumb.d.ts +5 -0
  66. package/dist/components/PathBreadcrumb.d.ts.map +1 -0
  67. package/dist/components/PathBreadcrumb.js +16 -0
  68. package/dist/components/PathBreadcrumb.js.map +1 -0
  69. package/dist/components/lib/utils.d.ts +3 -0
  70. package/dist/components/lib/utils.d.ts.map +1 -0
  71. package/dist/components/lib/utils.js +6 -0
  72. package/dist/components/lib/utils.js.map +1 -0
  73. package/dist/components/ui/accordion.js +1 -1
  74. package/dist/components/ui/accordion.js.map +1 -1
  75. package/dist/components/ui/alert-dialog.d.ts +19 -0
  76. package/dist/components/ui/alert-dialog.d.ts.map +1 -0
  77. package/dist/components/ui/alert-dialog.js +42 -0
  78. package/dist/components/ui/alert-dialog.js.map +1 -0
  79. package/dist/components/ui/badge.js +1 -1
  80. package/dist/components/ui/badge.js.map +1 -1
  81. package/dist/components/ui/breadcrumb.d.ts +12 -0
  82. package/dist/components/ui/breadcrumb.d.ts.map +1 -0
  83. package/dist/components/ui/breadcrumb.js +28 -0
  84. package/dist/components/ui/breadcrumb.js.map +1 -0
  85. package/dist/components/ui/button.d.ts +9 -8
  86. package/dist/components/ui/button.d.ts.map +1 -1
  87. package/dist/components/ui/button.js +26 -21
  88. package/dist/components/ui/button.js.map +1 -1
  89. package/dist/components/ui/card.d.ts +10 -0
  90. package/dist/components/ui/card.d.ts.map +1 -0
  91. package/dist/components/ui/card.js +25 -0
  92. package/dist/components/ui/card.js.map +1 -0
  93. package/dist/components/ui/checkbox.js +1 -1
  94. package/dist/components/ui/checkbox.js.map +1 -1
  95. package/dist/components/ui/collapsible.d.ts +6 -0
  96. package/dist/components/ui/collapsible.d.ts.map +1 -0
  97. package/dist/components/ui/collapsible.js +13 -0
  98. package/dist/components/ui/collapsible.js.map +1 -0
  99. package/dist/components/ui/command.d.ts +19 -0
  100. package/dist/components/ui/command.d.ts.map +1 -0
  101. package/dist/components/ui/command.js +35 -0
  102. package/dist/components/ui/command.js.map +1 -0
  103. package/dist/components/ui/dialog.d.ts.map +1 -1
  104. package/dist/components/ui/dialog.js +1 -1
  105. package/dist/components/ui/dialog.js.map +1 -1
  106. package/dist/components/ui/drawer.js +1 -1
  107. package/dist/components/ui/drawer.js.map +1 -1
  108. package/dist/components/ui/dropdown-menu.d.ts +26 -0
  109. package/dist/components/ui/dropdown-menu.d.ts.map +1 -0
  110. package/dist/components/ui/dropdown-menu.js +52 -0
  111. package/dist/components/ui/dropdown-menu.js.map +1 -0
  112. package/dist/components/ui/form-field.d.ts +7 -0
  113. package/dist/components/ui/form-field.d.ts.map +1 -0
  114. package/dist/components/ui/form-field.js +17 -0
  115. package/dist/components/ui/form-field.js.map +1 -0
  116. package/dist/components/ui/input.js +1 -1
  117. package/dist/components/ui/input.js.map +1 -1
  118. package/dist/components/ui/label.js +1 -1
  119. package/dist/components/ui/label.js.map +1 -1
  120. package/dist/components/ui/pagination.d.ts +14 -0
  121. package/dist/components/ui/pagination.d.ts.map +1 -0
  122. package/dist/components/ui/pagination.js +30 -0
  123. package/dist/components/ui/pagination.js.map +1 -0
  124. package/dist/components/ui/popover.js +2 -2
  125. package/dist/components/ui/popover.js.map +1 -1
  126. package/dist/components/ui/progress.js +1 -1
  127. package/dist/components/ui/progress.js.map +1 -1
  128. package/dist/components/ui/resizable.d.ts +8 -0
  129. package/dist/components/ui/resizable.d.ts.map +1 -0
  130. package/dist/components/ui/resizable.js +14 -0
  131. package/dist/components/ui/resizable.js.map +1 -0
  132. package/dist/components/ui/scroll-area.d.ts +6 -0
  133. package/dist/components/ui/scroll-area.d.ts.map +1 -0
  134. package/dist/components/ui/scroll-area.js +13 -0
  135. package/dist/components/ui/scroll-area.js.map +1 -0
  136. package/dist/components/ui/select.js +1 -1
  137. package/dist/components/ui/select.js.map +1 -1
  138. package/dist/components/ui/separator.d.ts +5 -0
  139. package/dist/components/ui/separator.d.ts.map +1 -0
  140. package/dist/components/ui/separator.js +9 -0
  141. package/dist/components/ui/separator.js.map +1 -0
  142. package/dist/components/ui/sheet.d.ts +15 -0
  143. package/dist/components/ui/sheet.d.ts.map +1 -0
  144. package/dist/components/ui/sheet.js +40 -0
  145. package/dist/components/ui/sheet.js.map +1 -0
  146. package/dist/components/ui/skeleton.d.ts +3 -0
  147. package/dist/components/ui/skeleton.d.ts.map +1 -0
  148. package/dist/components/ui/skeleton.js +7 -0
  149. package/dist/components/ui/skeleton.js.map +1 -0
  150. package/dist/components/ui/slider.js +1 -1
  151. package/dist/components/ui/slider.js.map +1 -1
  152. package/dist/components/ui/switch.js +1 -1
  153. package/dist/components/ui/switch.js.map +1 -1
  154. package/dist/components/ui/table.d.ts +11 -0
  155. package/dist/components/ui/table.d.ts.map +1 -0
  156. package/dist/components/ui/table.js +29 -0
  157. package/dist/components/ui/table.js.map +1 -0
  158. package/dist/components/ui/tabs.d.ts +12 -0
  159. package/dist/components/ui/tabs.d.ts.map +1 -0
  160. package/dist/components/ui/tabs.js +29 -0
  161. package/dist/components/ui/tabs.js.map +1 -0
  162. package/dist/components/ui/textarea.js +1 -1
  163. package/dist/components/ui/textarea.js.map +1 -1
  164. package/dist/components/ui/toggle-group.d.ts +10 -0
  165. package/dist/components/ui/toggle-group.d.ts.map +1 -0
  166. package/dist/components/ui/toggle-group.js +23 -0
  167. package/dist/components/ui/toggle-group.js.map +1 -0
  168. package/dist/components/ui/toggle.d.ts +10 -0
  169. package/dist/components/ui/toggle.d.ts.map +1 -0
  170. package/dist/components/ui/toggle.js +27 -0
  171. package/dist/components/ui/toggle.js.map +1 -0
  172. package/dist/components/ui/tooltip.js +1 -1
  173. package/dist/components/ui/tooltip.js.map +1 -1
  174. package/dist/context/index.d.ts +27 -10
  175. package/dist/context/index.d.ts.map +1 -1
  176. package/dist/context/index.js +43 -36
  177. package/dist/context/index.js.map +1 -1
  178. package/dist/events.d.ts +10 -0
  179. package/dist/events.d.ts.map +1 -0
  180. package/dist/events.js +78 -0
  181. package/dist/events.js.map +1 -0
  182. package/dist/fiber-tree.d.ts +3 -0
  183. package/dist/fiber-tree.d.ts.map +1 -0
  184. package/dist/fiber-tree.js +93 -0
  185. package/dist/fiber-tree.js.map +1 -0
  186. package/dist/hooks.d.ts +5 -2
  187. package/dist/hooks.d.ts.map +1 -1
  188. package/dist/hooks.js +66 -6
  189. package/dist/hooks.js.map +1 -1
  190. package/dist/idb.d.ts +1 -1
  191. package/dist/idb.d.ts.map +1 -1
  192. package/dist/lib/to-plain.d.ts +2 -0
  193. package/dist/lib/to-plain.d.ts.map +1 -0
  194. package/dist/lib/to-plain.js +21 -0
  195. package/dist/lib/to-plain.js.map +1 -0
  196. package/dist/main.d.ts +1 -1
  197. package/dist/main.d.ts.map +1 -1
  198. package/dist/main.js +4 -3
  199. package/dist/main.js.map +1 -1
  200. package/dist/mods/clients.d.ts +3 -0
  201. package/dist/mods/clients.d.ts.map +1 -0
  202. package/dist/mods/clients.js +4 -0
  203. package/dist/mods/clients.js.map +1 -0
  204. package/dist/mods/editor-ui/FieldLabel.d.ts +15 -0
  205. package/dist/mods/editor-ui/FieldLabel.d.ts.map +1 -0
  206. package/dist/mods/editor-ui/FieldLabel.js +55 -0
  207. package/dist/mods/editor-ui/FieldLabel.js.map +1 -0
  208. package/dist/mods/editor-ui/client.d.ts +1 -1
  209. package/dist/mods/editor-ui/client.d.ts.map +1 -1
  210. package/dist/mods/editor-ui/client.js +1 -1
  211. package/dist/mods/editor-ui/client.js.map +1 -1
  212. package/dist/mods/editor-ui/default-edit.d.ts +2 -0
  213. package/dist/mods/editor-ui/default-edit.d.ts.map +1 -0
  214. package/dist/mods/editor-ui/default-edit.js +54 -0
  215. package/dist/mods/editor-ui/default-edit.js.map +1 -0
  216. package/dist/mods/editor-ui/default-view.d.ts +8 -1
  217. package/dist/mods/editor-ui/default-view.d.ts.map +1 -1
  218. package/dist/mods/editor-ui/default-view.js +8 -5
  219. package/dist/mods/editor-ui/default-view.js.map +1 -1
  220. package/dist/mods/editor-ui/dir-view.js +0 -2
  221. package/dist/mods/editor-ui/dir-view.js.map +1 -1
  222. package/dist/mods/editor-ui/empty-placeholder.d.ts +5 -0
  223. package/dist/mods/editor-ui/empty-placeholder.d.ts.map +1 -0
  224. package/dist/mods/editor-ui/empty-placeholder.js +14 -0
  225. package/dist/mods/editor-ui/empty-placeholder.js.map +1 -0
  226. package/dist/mods/editor-ui/form-field.d.ts +17 -0
  227. package/dist/mods/editor-ui/form-field.d.ts.map +1 -0
  228. package/dist/mods/editor-ui/form-field.js +68 -0
  229. package/dist/mods/editor-ui/form-field.js.map +1 -0
  230. package/dist/mods/editor-ui/form-fields.d.ts +1 -2
  231. package/dist/mods/editor-ui/form-fields.d.ts.map +1 -1
  232. package/dist/mods/editor-ui/form-fields.js +56 -60
  233. package/dist/mods/editor-ui/form-fields.js.map +1 -1
  234. package/dist/mods/editor-ui/layout-view.js +3 -2
  235. package/dist/mods/editor-ui/layout-view.js.map +1 -1
  236. package/dist/mods/editor-ui/list-items.js +1 -1
  237. package/dist/mods/editor-ui/list-items.js.map +1 -1
  238. package/dist/mods/editor-ui/node-utils.d.ts +2 -2
  239. package/dist/mods/editor-ui/node-utils.d.ts.map +1 -1
  240. package/dist/mods/editor-ui/node-utils.js +4 -5
  241. package/dist/mods/editor-ui/node-utils.js.map +1 -1
  242. package/dist/mods/editor-ui/type-picker.d.ts +15 -0
  243. package/dist/mods/editor-ui/type-picker.d.ts.map +1 -0
  244. package/dist/mods/editor-ui/type-picker.js +69 -0
  245. package/dist/mods/editor-ui/type-picker.js.map +1 -0
  246. package/dist/mods/editor-ui/user-view.js +1 -1
  247. package/dist/mods/editor-ui/user-view.js.map +1 -1
  248. package/dist/mods/servers.d.ts +1 -0
  249. package/dist/mods/servers.d.ts.map +1 -0
  250. package/dist/mods/servers.js +4 -0
  251. package/dist/mods/servers.js.map +1 -0
  252. package/dist/mods/treenity/groups/index.js +1 -1
  253. package/dist/mods/treenity/groups/index.js.map +1 -1
  254. package/dist/mods/treenity/preview.js +1 -1
  255. package/dist/mods/treenity/preview.js.map +1 -1
  256. package/dist/mods/treenity/ref-view.js +1 -1
  257. package/dist/mods/treenity/ref-view.js.map +1 -1
  258. package/dist/mods/treenity/schema-form.js +1 -1
  259. package/dist/mods/treenity/schema-form.js.map +1 -1
  260. package/dist/mods/treenity/seed.js +1 -1
  261. package/dist/mods/treenity/seed.js.map +1 -1
  262. package/dist/mods/treenity/type-view.js +1 -1
  263. package/dist/mods/treenity/type-view.js.map +1 -1
  264. package/dist/schema-loader.d.ts +1 -1
  265. package/dist/schema-loader.d.ts.map +1 -1
  266. package/dist/schema-loader.js +1 -1
  267. package/dist/schema-loader.js.map +1 -1
  268. package/dist/symbols.d.ts +5 -0
  269. package/dist/symbols.d.ts.map +1 -0
  270. package/dist/symbols.js +16 -0
  271. package/dist/symbols.js.map +1 -0
  272. package/dist/trpc.d.ts +10 -3
  273. package/dist/trpc.d.ts.map +1 -1
  274. package/package.json +74 -8
  275. package/src/AclEditor.tsx +11 -18
  276. package/src/ActionCards.tsx +224 -0
  277. package/src/App.tsx +204 -385
  278. package/src/ComponentSection.tsx +113 -0
  279. package/src/ErrorBoundary.tsx +37 -0
  280. package/src/Inspector.css +54 -0
  281. package/src/Inspector.tsx +73 -793
  282. package/src/Login.tsx +97 -0
  283. package/src/NodeEditor.tsx +300 -0
  284. package/src/Tree.css +91 -0
  285. package/src/Tree.tsx +40 -43
  286. package/src/bind/bind.test.ts +1 -1
  287. package/src/bind/engine.ts +1 -1
  288. package/src/bind/eval.ts +1 -1
  289. package/src/bind/hook.ts +1 -1
  290. package/src/bind/pipes.ts +1 -1
  291. package/src/cache.ts +5 -1
  292. package/src/client-tree.test.ts +1 -1
  293. package/src/client-tree.ts +22 -16
  294. package/src/client.ts +2 -4
  295. package/src/components/ConfirmDialog.tsx +34 -0
  296. package/src/components/ConfirmPopover.tsx +41 -0
  297. package/src/components/PathBreadcrumb.tsx +36 -0
  298. package/src/components/lib/utils.ts +6 -0
  299. package/src/components/lib/utils.ts.bak +6 -0
  300. package/src/components/ui/accordion.tsx +1 -1
  301. package/src/components/ui/alert-dialog.tsx +189 -0
  302. package/src/components/ui/badge.tsx +1 -1
  303. package/src/components/ui/breadcrumb.tsx +108 -0
  304. package/src/components/ui/button.tsx +53 -31
  305. package/src/components/ui/card.tsx +91 -0
  306. package/src/components/ui/checkbox.tsx +1 -1
  307. package/src/components/ui/collapsible.tsx +31 -0
  308. package/src/components/ui/command.tsx +177 -0
  309. package/src/components/ui/dialog.tsx +1 -2
  310. package/src/components/ui/drawer.tsx +1 -1
  311. package/src/components/ui/dropdown-menu.tsx +256 -0
  312. package/src/components/ui/form-field.tsx +37 -0
  313. package/src/components/ui/input.tsx +1 -1
  314. package/src/components/ui/label.tsx +1 -1
  315. package/src/components/ui/pagination.tsx +127 -0
  316. package/src/components/ui/popover.tsx +2 -2
  317. package/src/components/ui/progress.tsx +1 -1
  318. package/src/components/ui/resizable.tsx +47 -0
  319. package/src/components/ui/scroll-area.tsx +55 -0
  320. package/src/components/ui/select.tsx +1 -1
  321. package/src/components/ui/separator.tsx +27 -0
  322. package/src/components/ui/sheet.tsx +140 -0
  323. package/src/components/ui/skeleton.tsx +13 -0
  324. package/src/components/ui/slider.tsx +1 -1
  325. package/src/components/ui/switch.tsx +1 -1
  326. package/src/components/ui/table.tsx +115 -0
  327. package/src/components/ui/tabs.tsx +88 -0
  328. package/src/components/ui/textarea.tsx +1 -1
  329. package/src/components/ui/toggle-group.tsx +82 -0
  330. package/src/components/ui/toggle.tsx +46 -0
  331. package/src/components/ui/tooltip.tsx +1 -1
  332. package/src/context/index.tsx +75 -42
  333. package/src/events.ts +81 -0
  334. package/src/fiber-tree.ts +112 -0
  335. package/src/hooks.ts +88 -9
  336. package/src/idb.ts +1 -1
  337. package/src/lib/to-plain.ts +21 -0
  338. package/src/main.tsx +3 -1
  339. package/src/mods/clients.ts +3 -0
  340. package/src/mods/editor-ui/FieldLabel.tsx +124 -0
  341. package/src/mods/editor-ui/client.ts +1 -1
  342. package/src/mods/editor-ui/default-edit.tsx +99 -0
  343. package/src/mods/editor-ui/default-view.tsx +13 -8
  344. package/src/mods/editor-ui/dir-view.tsx +2 -2
  345. package/src/mods/editor-ui/editor-ui.css +174 -0
  346. package/src/mods/editor-ui/empty-placeholder.tsx +39 -0
  347. package/src/mods/editor-ui/form-field.tsx +144 -0
  348. package/src/mods/editor-ui/form-fields.tsx +132 -113
  349. package/src/mods/editor-ui/layout-view.tsx +4 -2
  350. package/src/mods/editor-ui/list-items.tsx +2 -2
  351. package/src/mods/editor-ui/node-utils.ts +4 -5
  352. package/src/mods/editor-ui/type-picker.tsx +147 -0
  353. package/src/mods/editor-ui/user-view.tsx +1 -1
  354. package/src/mods/servers.ts +2 -0
  355. package/src/mods/treenity/groups/index.tsx +1 -1
  356. package/src/mods/treenity/preview.tsx +1 -1
  357. package/src/mods/treenity/ref-view.tsx +1 -1
  358. package/src/mods/treenity/schema-form.tsx +1 -1
  359. package/src/mods/treenity/seed.ts +1 -1
  360. package/src/mods/treenity/type-view.tsx +1 -1
  361. package/src/optimistic.test.ts +111 -0
  362. package/src/remote-tree.test.ts +1 -1
  363. package/src/remote-tree.ts +1 -1
  364. package/src/root.css +117 -0
  365. package/src/schema-loader.ts +1 -1
  366. package/src/symbols.ts +18 -0
  367. package/src/index.html +0 -14
  368. package/src/style.css +0 -1269
  369. package/src/vite-env.d.ts +0 -3
package/src/style.css DELETED
@@ -1,1269 +0,0 @@
1
- @import 'tailwindcss';
2
- @source "../../src/mods";
3
-
4
- /* shadcn/ui theme tokens mapped to Treenity dark theme */
5
- @theme inline extend {
6
- --color-background: #0d1117;
7
- --color-foreground: #e6edf3;
8
- --color-card: #161b22;
9
- --color-card-foreground: #e6edf3;
10
- --color-popover: #161b22;
11
- --color-popover-foreground: #e6edf3;
12
- --color-primary: #2ecc71;
13
- --color-primary-foreground: #0d1117;
14
- --color-secondary: #21262d;
15
- --color-secondary-foreground: #e6edf3;
16
- --color-muted: #161b22;
17
- --color-muted-foreground: #7d8590;
18
- --color-accent: rgba(46, 204, 113, 0.15);
19
- --color-accent-foreground: #2ecc71;
20
- --color-destructive: #f85149;
21
- --color-destructive-foreground: #e6edf3;
22
- --color-border: #30363d;
23
- --color-input: #30363d;
24
- --color-ring: #2ecc71;
25
- --radius-sm: 4px;
26
- --radius-md: 6px;
27
- --radius-lg: 8px;
28
- }
29
-
30
- /* Treenity Tree Editor — Modern Dark Theme */
31
- :root {
32
- --bg: #0d1117;
33
- --surface: #161b22;
34
- --surface-2: #1c2128;
35
- --surface-3: #21262d;
36
- --border: #30363d;
37
- --border-subtle: #21262d;
38
- --text: #e6edf3;
39
- --text-2: #7d8590;
40
- --text-3: #484f58;
41
- --accent: #2ecc71;
42
- --accent-subtle: rgba(46, 204, 113, 0.15);
43
- --danger: #f85149;
44
- --danger-subtle: rgba(248, 81, 73, 0.15);
45
- --success: #3fb950;
46
- --success-subtle: rgba(63, 185, 80, 0.15);
47
- --warning: #d29922;
48
- --radius: 6px;
49
- --radius-lg: 8px;
50
- --font: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
51
- --mono: 'SF Mono', SFMono-Regular, 'Cascadia Code', 'Fira Code', Consolas, monospace;
52
- --transition: 0.15s ease;
53
- }
54
- @layer base {
55
- * {
56
- margin: 0;
57
- padding: 0;
58
- box-sizing: border-box;
59
- }
60
- }
61
- html,
62
- body {
63
- height: 100%;
64
- }
65
- body {
66
- font-family: var(--font);
67
- background: var(--bg);
68
- color: var(--text);
69
- font-size: 14px;
70
- line-height: 1.5;
71
- }
72
-
73
- .app {
74
- display: flex;
75
- height: 100vh;
76
- }
77
-
78
- /* Sidebar */
79
- .sidebar {
80
- width: 280px;
81
- min-width: 280px;
82
- background: var(--surface);
83
- border-right: 1px solid var(--border);
84
- display: flex;
85
- flex-direction: column;
86
- overflow: hidden;
87
- transition: width 0.2s ease, min-width 0.2s ease;
88
- }
89
- .sidebar.collapsed {
90
- width: 44px;
91
- min-width: 44px;
92
- }
93
- .sidebar.collapsed .sidebar-search,
94
- .sidebar.collapsed .sidebar-tree,
95
- .sidebar.collapsed .sidebar-footer {
96
- display: none;
97
- }
98
- .sidebar.collapsed .sidebar-header {
99
- padding: 12px 8px;
100
- justify-content: center;
101
- }
102
- .sidebar.collapsed .sidebar-header .logo {
103
- justify-content: center;
104
- }
105
- .sidebar.collapsed .sidebar-header .logo img {
106
- margin: 0;
107
- }
108
- .sidebar-header {
109
- padding: 12px 14px;
110
- border-bottom: 1px solid var(--border);
111
- display: flex;
112
- align-items: center;
113
- justify-content: space-between;
114
- flex-shrink: 0;
115
- }
116
- .sidebar-header .logo {
117
- font-weight: 600;
118
- font-size: 13px;
119
- letter-spacing: -0.2px;
120
- display: inline-flex;
121
- align-items: center;
122
- gap: 4px;
123
- }
124
- .sidebar-header .logo img {
125
- display: block;
126
- }
127
-
128
- .sidebar-search {
129
- padding: 8px 12px;
130
- border-bottom: 1px solid var(--border);
131
- flex-shrink: 0;
132
- display: flex;
133
- align-items: center;
134
- gap: 4px;
135
- }
136
- .sidebar-search input {
137
- flex: 1;
138
- min-width: 0;
139
- padding: 6px 10px;
140
- background: var(--bg);
141
- border: 1px solid var(--border);
142
- border-radius: var(--radius);
143
- color: var(--text);
144
- font-size: 12px;
145
- outline: none;
146
- transition: border-color var(--transition);
147
- }
148
- .sidebar-search input:focus {
149
- border-color: var(--accent);
150
- }
151
- .sidebar-search input::placeholder {
152
- color: var(--text-3);
153
- }
154
- .sidebar-search-toggle {
155
- width: 20px;
156
- height: 20px;
157
- flex-shrink: 0;
158
- display: flex;
159
- align-items: center;
160
- justify-content: center;
161
- border: none;
162
- border-radius: var(--radius);
163
- background: transparent;
164
- color: var(--text-3);
165
- font-size: 11px;
166
- font-weight: 700;
167
- font-family: monospace;
168
- cursor: pointer;
169
- opacity: 0.4;
170
- transition: all var(--transition);
171
- }
172
- .sidebar-search-toggle:hover {
173
- opacity: 1;
174
- color: var(--text);
175
- }
176
- .sidebar-search-toggle[data-active] {
177
- opacity: 1;
178
- color: var(--accent);
179
- }
180
-
181
- .sidebar-tree {
182
- flex: 1;
183
- overflow-y: auto;
184
- padding: 4px 0;
185
- }
186
- .sidebar-tree::-webkit-scrollbar {
187
- width: 6px;
188
- }
189
- .sidebar-tree::-webkit-scrollbar-track {
190
- background: transparent;
191
- }
192
- .sidebar-tree::-webkit-scrollbar-thumb {
193
- background: var(--border);
194
- border-radius: 3px;
195
- }
196
-
197
- .sidebar-footer {
198
- padding: 8px 12px;
199
- border-top: 1px solid var(--border);
200
- font-size: 11px;
201
- color: var(--text-3);
202
- flex-shrink: 0;
203
- display: flex;
204
- align-items: center;
205
- justify-content: space-between;
206
- position: relative;
207
- }
208
- .sidebar-collapse-btn {
209
- font-size: 10px;
210
- opacity: 0.5;
211
- flex-shrink: 0;
212
- }
213
- .sidebar-collapse-btn:hover {
214
- opacity: 1;
215
- }
216
-
217
- .sidebar-menu {
218
- position: absolute;
219
- bottom: 100%;
220
- right: 8px;
221
- margin-bottom: 4px;
222
- background: var(--bg);
223
- border: 1px solid var(--border);
224
- border-radius: 6px;
225
- padding: 6px 0;
226
- min-width: 160px;
227
- box-shadow: 0 4px 16px rgba(0,0,0,.4);
228
- z-index: 100;
229
- }
230
- .sidebar-menu button {
231
- display: block;
232
- width: 100%;
233
- text-align: left;
234
- padding: 8px 14px;
235
- font-size: 13px;
236
- background: none;
237
- border: none;
238
- color: var(--text-1);
239
- cursor: pointer;
240
- }
241
- .sidebar-menu button:hover {
242
- background: color-mix(in srgb, var(--text-1) 10%, var(--bg));
243
- }
244
-
245
- /* Tree */
246
- .tree-node {
247
- position: relative;
248
- }
249
- .tree-children {
250
- position: relative;
251
- padding-left: 12px;
252
- }
253
- .tree-children::before {
254
- content: '';
255
- position: absolute;
256
- left: 15px;
257
- top: 0;
258
- bottom: 8px;
259
- width: 1px;
260
- background: var(--border-subtle);
261
- }
262
-
263
- .tree-row {
264
- display: flex;
265
- align-items: center;
266
- padding: 1px 8px 1px 0;
267
- cursor: pointer;
268
- color: var(--text);
269
- font-size: 13px;
270
- height: 28px;
271
- position: relative;
272
- user-select: none;
273
- transition: background var(--transition);
274
- }
275
- .tree-row:hover {
276
- background: var(--surface-2);
277
- }
278
- .tree-row.selected {
279
- background: var(--accent-subtle);
280
- }
281
- .tree-row.selected::before {
282
- content: '';
283
- position: absolute;
284
- left: 0;
285
- top: 2px;
286
- bottom: 2px;
287
- width: 2px;
288
- background: var(--accent);
289
- border-radius: 1px;
290
- }
291
-
292
- .tree-toggle {
293
- width: 20px;
294
- height: 28px;
295
- display: flex;
296
- align-items: center;
297
- justify-content: center;
298
- color: var(--text-3);
299
- font-size: 14px;
300
- flex-shrink: 0;
301
- transition: color var(--transition);
302
- }
303
- .tree-toggle:hover {
304
- color: var(--text-2);
305
- }
306
-
307
- .tree-label {
308
- flex: 1;
309
- overflow: hidden;
310
- text-overflow: ellipsis;
311
- white-space: nowrap;
312
- }
313
- .tree-badge-wrap {
314
- position: relative;
315
- flex-shrink: 0;
316
- margin-left: 4px;
317
- }
318
- .tree-badge {
319
- font-size: 10px;
320
- color: var(--text-3);
321
- padding: 1px 6px;
322
- background: var(--surface-3);
323
- border-radius: 10px;
324
- flex-shrink: 0;
325
- font-family: var(--mono);
326
- cursor: pointer;
327
- transition: all var(--transition);
328
- }
329
- .tree-badge:hover {
330
- color: var(--text-2);
331
- background: var(--surface-2);
332
- }
333
- .tree-menu {
334
- position: absolute;
335
- top: 100%;
336
- right: 0;
337
- margin-top: 2px;
338
- background: var(--surface);
339
- border: 1px solid var(--border);
340
- border-radius: 6px;
341
- padding: 3px;
342
- z-index: 50;
343
- min-width: 120px;
344
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
345
- }
346
- .tree-menu-item {
347
- display: block;
348
- width: 100%;
349
- text-align: left;
350
- padding: 4px 8px;
351
- font-size: 11px;
352
- color: var(--text-2);
353
- background: none;
354
- border: none;
355
- border-radius: 4px;
356
- cursor: pointer;
357
- white-space: nowrap;
358
- }
359
- .tree-menu-item:hover {
360
- background: var(--surface-3);
361
- color: var(--text);
362
- }
363
- .tree-menu-item.danger:hover {
364
- color: var(--danger);
365
- }
366
-
367
- /* Drag */
368
- .tree-drop-above {
369
- box-shadow: inset 0 2px 0 var(--accent);
370
- }
371
- .tree-drop-below {
372
- box-shadow: inset 0 -2px 0 var(--accent);
373
- }
374
- .tree-dragging {
375
- opacity: 0.4;
376
- }
377
-
378
- /* Editor */
379
- .editor {
380
- flex: 1;
381
- display: flex;
382
- flex-direction: column;
383
- overflow: hidden;
384
- background: var(--bg);
385
- }
386
- .editor-empty {
387
- flex: 1;
388
- display: flex;
389
- flex-direction: column;
390
- align-items: center;
391
- justify-content: center;
392
- color: var(--text-3);
393
- gap: 8px;
394
- }
395
- .editor-empty .icon {
396
- font-size: 32px;
397
- opacity: 0.3;
398
- }
399
-
400
- .editor-header {
401
- padding: 16px 24px 12px;
402
- border-bottom: 1px solid var(--border);
403
- background: var(--surface);
404
- flex-shrink: 0;
405
- }
406
- .editor-breadcrumb {
407
- display: flex;
408
- align-items: center;
409
- gap: 4px;
410
- font-size: 12px;
411
- color: var(--text-2);
412
- margin-bottom: 8px;
413
- }
414
- .editor-breadcrumb span {
415
- cursor: pointer;
416
- }
417
- .editor-breadcrumb span:hover {
418
- color: var(--accent);
419
- }
420
- .editor-breadcrumb .sep {
421
- color: var(--text-3);
422
- cursor: default;
423
- }
424
- .editor-breadcrumb .sep:hover {
425
- color: var(--text-3);
426
- }
427
-
428
- .editor-title {
429
- display: flex;
430
- align-items: center;
431
- gap: 10px;
432
- flex-wrap: wrap;
433
- }
434
- .editor-title .spacer {
435
- flex: 1;
436
- }
437
- .editor-title h2 {
438
- font-size: 18px;
439
- font-weight: 600;
440
- color: var(--text);
441
- margin: 0;
442
- }
443
- .editor-type-badge {
444
- font-size: 11px;
445
- padding: 2px 8px;
446
- background: var(--accent-subtle);
447
- color: var(--accent);
448
- border-radius: 10px;
449
- font-family: var(--mono);
450
- }
451
-
452
- .editor-body {
453
- flex: 1;
454
- overflow-y: auto;
455
- padding: 20px 24px;
456
- }
457
- .editor-body::-webkit-scrollbar {
458
- width: 6px;
459
- }
460
- .editor-body::-webkit-scrollbar-track {
461
- background: transparent;
462
- }
463
- .editor-body::-webkit-scrollbar-thumb {
464
- background: var(--border);
465
- border-radius: 3px;
466
- }
467
-
468
- /* Card → flat section (no box, just a labelled section) */
469
- .card {
470
- border-top: 1px solid var(--border-subtle);
471
- margin-top: 8px;
472
- padding-top: 2px;
473
- }
474
- .card:first-child {
475
- border-top: none;
476
- margin-top: 0;
477
- padding-top: 0;
478
- }
479
- .card-header {
480
- display: flex;
481
- align-items: center;
482
- justify-content: space-between;
483
- padding: 8px 0 6px;
484
- font-size: 11px;
485
- font-weight: 600;
486
- color: var(--text-2);
487
- text-transform: uppercase;
488
- letter-spacing: 0.5px;
489
- }
490
- .card-body {
491
- padding: 2px 0 10px;
492
- }
493
-
494
- /* Form */
495
- .field {
496
- display: flex;
497
- align-items: center;
498
- gap: 8px;
499
- margin-bottom: 4px;
500
- }
501
- .field:last-child {
502
- margin-bottom: 0;
503
- }
504
- .field label {
505
- font-size: 11px;
506
- font-weight: 500;
507
- color: var(--text-2);
508
- min-width: 32px;
509
- flex-shrink: 0;
510
- white-space: nowrap;
511
- }
512
- .field:has(textarea),
513
- .field.stack {
514
- flex-direction: column;
515
- align-items: stretch;
516
- }
517
- .field:has(textarea) label,
518
- .field.stack label {
519
- min-width: unset;
520
- margin-bottom: 3px;
521
- }
522
-
523
- @layer base {
524
- input,
525
- textarea,
526
- select {
527
- width: 100%;
528
- padding: 4px 8px;
529
- background: var(--bg);
530
- border: 1px solid var(--border);
531
- border-radius: var(--radius);
532
- color: var(--text);
533
- font-size: 12px;
534
- font-family: var(--mono);
535
- outline: none;
536
- transition: border-color var(--transition);
537
- }
538
- input:focus,
539
- textarea:focus,
540
- select:focus {
541
- border-color: var(--accent);
542
- }
543
- input:read-only {
544
- color: var(--text-2);
545
- cursor: default;
546
- }
547
- input:read-only:focus {
548
- border-color: var(--border);
549
- }
550
- textarea {
551
- min-height: 80px;
552
- resize: vertical;
553
- line-height: 1.5;
554
- }
555
- }
556
-
557
- /* Buttons — scoped to Treenity shell, not global (Tailwind views override) */
558
- @layer base {
559
- button {
560
- padding: 6px 14px;
561
- border-radius: var(--radius);
562
- border: 1px solid var(--border);
563
- background: var(--surface-2);
564
- color: var(--text);
565
- font-size: 13px;
566
- font-family: var(--font);
567
- cursor: pointer;
568
- transition: all var(--transition);
569
- display: inline-flex;
570
- align-items: center;
571
- gap: 6px;
572
- line-height: 1.4;
573
- }
574
- button:hover {
575
- background: var(--surface-3);
576
- border-color: var(--text-3);
577
- }
578
- button:active {
579
- transform: scale(0.98);
580
- }
581
- button:disabled {
582
- opacity: 0.4;
583
- cursor: default;
584
- pointer-events: none;
585
- }
586
- }
587
- button.primary:disabled {
588
- background: var(--surface-3);
589
- border-color: var(--border);
590
- color: var(--text-3);
591
- opacity: 1;
592
- }
593
- button.primary {
594
- background: var(--accent);
595
- border-color: var(--accent);
596
- color: #fff;
597
- }
598
- button.primary:hover {
599
- background: #27ae60;
600
- }
601
- button.danger {
602
- color: var(--danger);
603
- border-color: transparent;
604
- background: var(--danger-subtle);
605
- }
606
- button.danger:hover {
607
- border-color: var(--danger);
608
- }
609
- button.ghost {
610
- border: none;
611
- background: transparent;
612
- color: var(--text-2);
613
- padding: 4px 8px;
614
- }
615
- button.ghost:hover {
616
- color: var(--text);
617
- background: var(--surface-3);
618
- }
619
- button.sm {
620
- font-size: 12px;
621
- padding: 4px 10px;
622
- }
623
-
624
- /* Component */
625
- .component {
626
- background: var(--surface-2);
627
- border: 1px solid var(--border);
628
- border-radius: var(--radius);
629
- margin-bottom: 10px;
630
- overflow: hidden;
631
- }
632
- .component-header {
633
- display: flex;
634
- align-items: center;
635
- justify-content: space-between;
636
- padding: 8px 12px;
637
- background: var(--surface-3);
638
- cursor: pointer;
639
- gap: 8px;
640
- }
641
- .component-name {
642
- font-size: 13px;
643
- font-weight: 500;
644
- }
645
- .component-type {
646
- font-size: 11px;
647
- color: var(--text-3);
648
- font-family: var(--mono);
649
- }
650
- .component-body {
651
- padding: 8px 10px;
652
- }
653
- .component-body textarea {
654
- min-height: 60px;
655
- font-size: 12px;
656
- }
657
-
658
- /* Actions */
659
- .actions-bar {
660
- display: flex;
661
- gap: 8px;
662
- padding: 12px 24px;
663
- border-top: 1px solid var(--border);
664
- background: var(--surface);
665
- flex-shrink: 0;
666
- }
667
- .actions-bar .spacer {
668
- flex: 1;
669
- }
670
-
671
- /* Action pills — compact method invocation */
672
- .action-pills {
673
- margin-top: 10px;
674
- padding-top: 10px;
675
- border-top: 1px solid var(--border);
676
- }
677
-
678
- .action-pill {
679
- display: inline-flex;
680
- align-items: center;
681
- padding: 3px 10px;
682
- font-family: var(--mono);
683
- font-size: 11px;
684
- font-weight: 500;
685
- color: var(--success);
686
- background: transparent;
687
- border: 1px solid color-mix(in srgb, var(--success) 30%, transparent);
688
- border-radius: 999px;
689
- cursor: pointer;
690
- transition: all 0.15s;
691
- }
692
- .action-pill:hover {
693
- background: color-mix(in srgb, var(--success) 10%, transparent);
694
- border-color: color-mix(in srgb, var(--success) 50%, transparent);
695
- }
696
- .action-pill.active {
697
- background: color-mix(in srgb, var(--success) 15%, transparent);
698
- border-color: var(--success);
699
- }
700
- .action-pill.running {
701
- opacity: 0.6;
702
- pointer-events: none;
703
- }
704
-
705
- .action-detail {
706
- margin-top: 8px;
707
- padding: 8px 10px;
708
- border: 1px solid var(--border);
709
- border-radius: var(--radius);
710
- background: var(--surface);
711
- }
712
-
713
- .action-detail-field {
714
- display: flex;
715
- flex-direction: column;
716
- gap: 2px;
717
- }
718
- .action-detail-field label {
719
- font-size: 10px;
720
- color: var(--text-3);
721
- text-transform: uppercase;
722
- letter-spacing: 0.03em;
723
- }
724
- .action-detail-field input {
725
- padding: 4px 8px;
726
- font-size: 12px;
727
- }
728
-
729
- .action-params-input {
730
- min-height: 48px;
731
- font-size: 11px;
732
- }
733
-
734
- .action-run-btn {
735
- display: inline-flex;
736
- align-items: center;
737
- gap: 4px;
738
- padding: 3px 10px;
739
- font-size: 11px;
740
- font-weight: 500;
741
- color: var(--bg);
742
- background: var(--success);
743
- border: none;
744
- border-radius: 999px;
745
- cursor: pointer;
746
- transition: opacity 0.15s;
747
- }
748
- .action-run-btn:hover { opacity: 0.85; }
749
- .action-run-btn:disabled { opacity: 0.5; cursor: default; }
750
-
751
- .action-result-box {
752
- margin-top: 8px;
753
- padding: 6px 8px;
754
- border-radius: var(--radius);
755
- background: var(--bg);
756
- border: 1px solid var(--border);
757
- }
758
- .action-result-box.error {
759
- border-color: color-mix(in srgb, var(--danger) 40%, transparent);
760
- background: color-mix(in srgb, var(--danger) 5%, var(--bg));
761
- }
762
-
763
- .action-mode-btn {
764
- padding: 1px 6px;
765
- font-size: 10px;
766
- color: var(--text-3);
767
- background: transparent;
768
- border: 1px solid var(--border);
769
- border-radius: 999px;
770
- cursor: pointer;
771
- }
772
- .action-mode-btn.active {
773
- color: var(--text);
774
- background: var(--surface-3);
775
- border-color: var(--text-3);
776
- }
777
-
778
- /* Component data view — shows field values in default view */
779
- .comp-view-card {
780
- background: var(--surface);
781
- border: 1px solid var(--border);
782
- border-radius: var(--radius-lg);
783
- padding: 14px 16px;
784
- margin-bottom: 12px;
785
- }
786
- .comp-view-header {
787
- font-size: 11px;
788
- font-weight: 600;
789
- color: var(--text-3);
790
- text-transform: uppercase;
791
- letter-spacing: 0.5px;
792
- margin-bottom: 10px;
793
- display: flex;
794
- align-items: center;
795
- gap: 8px;
796
- }
797
- .comp-view-header .comp-type {
798
- font-family: var(--mono);
799
- color: var(--accent);
800
- background: var(--accent-subtle);
801
- padding: 1px 6px;
802
- border-radius: 10px;
803
- font-size: 10px;
804
- text-transform: none;
805
- }
806
- .comp-view-row {
807
- display: flex;
808
- gap: 8px;
809
- font-size: 13px;
810
- padding: 3px 0;
811
- }
812
- .comp-view-label {
813
- color: var(--text-3);
814
- min-width: 80px;
815
- flex-shrink: 0;
816
- }
817
- .comp-view-value {
818
- color: var(--text);
819
- word-break: break-word;
820
- }
821
-
822
- /* Type picker */
823
- .type-picker-overlay {
824
- position: fixed;
825
- inset: 0;
826
- background: rgba(0, 0, 0, 0.5);
827
- display: flex;
828
- align-items: center;
829
- justify-content: center;
830
- z-index: 1000;
831
- animation: fade-in 0.15s ease;
832
- }
833
- @keyframes fade-in {
834
- from {
835
- opacity: 0;
836
- }
837
- }
838
-
839
- .type-picker {
840
- background: var(--surface);
841
- border: 1px solid var(--border);
842
- border-radius: var(--radius-lg);
843
- width: 380px;
844
- max-height: 480px;
845
- display: flex;
846
- flex-direction: column;
847
- box-shadow: 0 16px 48px rgba(0, 0, 0, 0.4);
848
- animation: modal-in 0.2s ease;
849
- }
850
- @keyframes modal-in {
851
- from {
852
- opacity: 0;
853
- transform: scale(0.96) translateY(8px);
854
- }
855
- }
856
-
857
- .type-picker-header {
858
- padding: 16px;
859
- border-bottom: 1px solid var(--border);
860
- font-weight: 600;
861
- font-size: 15px;
862
- }
863
- .type-picker-search {
864
- padding: 12px 16px;
865
- display: flex;
866
- flex-direction: column;
867
- gap: 8px;
868
- }
869
- .type-picker-list {
870
- flex: 1;
871
- overflow-y: auto;
872
- padding: 4px 8px;
873
- max-height: 280px;
874
- }
875
- .type-picker-item {
876
- padding: 8px 12px;
877
- border-radius: var(--radius);
878
- cursor: pointer;
879
- display: flex;
880
- align-items: center;
881
- justify-content: space-between;
882
- font-size: 13px;
883
- transition: background var(--transition);
884
- }
885
- .type-picker-item:hover {
886
- background: var(--surface-2);
887
- }
888
- .type-picker-item.active {
889
- background: var(--accent-subtle);
890
- color: var(--accent);
891
- }
892
- .type-picker-item .type-name {
893
- font-family: var(--mono);
894
- }
895
- .type-picker-item .type-label {
896
- color: var(--text-2);
897
- font-size: 12px;
898
- }
899
- .type-picker-footer {
900
- padding: 12px 16px;
901
- border-top: 1px solid var(--border);
902
- display: flex;
903
- gap: 8px;
904
- justify-content: flex-end;
905
- }
906
-
907
- /* Toast */
908
- .toast {
909
- position: fixed;
910
- bottom: 20px;
911
- right: 20px;
912
- padding: 10px 16px;
913
- background: var(--surface-2);
914
- border: 1px solid var(--success);
915
- border-radius: var(--radius);
916
- font-size: 13px;
917
- display: flex;
918
- align-items: center;
919
- gap: 8px;
920
- box-shadow: 0 4px 16px rgba(0, 0, 0, 0.3);
921
- z-index: 2000;
922
- animation: toast-in 0.2s ease;
923
- color: var(--success);
924
- }
925
- .toast-error {
926
- border-color: var(--danger);
927
- color: var(--danger);
928
- }
929
- @keyframes toast-in {
930
- from {
931
- opacity: 0;
932
- transform: translateY(8px);
933
- }
934
- }
935
-
936
- /* Tabs */
937
- .editor-tabs {
938
- display: flex;
939
- gap: 0;
940
- padding: 0 24px;
941
- background: var(--surface);
942
- border-bottom: 1px solid var(--border);
943
- }
944
- .editor-tab {
945
- padding: 8px 16px;
946
- font-size: 13px;
947
- color: var(--text-2);
948
- cursor: pointer;
949
- border: none;
950
- border-bottom: 2px solid transparent;
951
- transition: all var(--transition);
952
- margin-bottom: -1px;
953
- background: none;
954
- border-radius: 0;
955
- }
956
- .editor-tab:hover {
957
- color: var(--text);
958
- background: none;
959
- }
960
- .editor-tab.active {
961
- color: var(--text);
962
- border-bottom-color: var(--accent);
963
- }
964
-
965
- /* JSON toggle */
966
- .json-view {
967
- position: relative;
968
- background: var(--bg);
969
- border: 1px solid var(--border);
970
- border-radius: var(--radius);
971
- overflow: hidden;
972
- }
973
- .json-view textarea {
974
- min-height: 200px;
975
- border: none;
976
- border-radius: 0;
977
- font-size: 12px;
978
- }
979
-
980
- /* Edit panel — slides from right */
981
- .edit-panel {
982
- position: fixed;
983
- top: 0;
984
- right: 0;
985
- height: 100vh;
986
- width: 380px;
987
- background: var(--surface);
988
- border-left: 1px solid var(--border);
989
- transform: translateX(100%);
990
- transition: transform 0.25s ease;
991
- display: flex;
992
- flex-direction: column;
993
- z-index: 100;
994
- box-shadow: -8px 0 24px rgba(0, 0, 0, 0.3);
995
- }
996
- .edit-panel.open {
997
- transform: translateX(0);
998
- }
999
-
1000
- .edit-panel-header {
1001
- display: flex;
1002
- align-items: center;
1003
- justify-content: space-between;
1004
- padding: 14px 16px;
1005
- border-bottom: 1px solid var(--border);
1006
- font-weight: 600;
1007
- font-size: 14px;
1008
- flex-shrink: 0;
1009
- }
1010
- .edit-panel-tabs {
1011
- display: flex;
1012
- padding: 0 16px;
1013
- border-bottom: 1px solid var(--border);
1014
- flex-shrink: 0;
1015
- }
1016
- .edit-panel-body {
1017
- flex: 1;
1018
- overflow-y: auto;
1019
- padding: 10px 14px;
1020
- }
1021
- .edit-panel-body::-webkit-scrollbar {
1022
- width: 6px;
1023
- }
1024
- .edit-panel-body::-webkit-scrollbar-track {
1025
- background: transparent;
1026
- }
1027
- .edit-panel-body::-webkit-scrollbar-thumb {
1028
- background: var(--border);
1029
- border-radius: 3px;
1030
- }
1031
- .edit-panel-actions {
1032
- display: flex;
1033
- gap: 8px;
1034
- padding: 12px 16px;
1035
- border-top: 1px solid var(--border);
1036
- flex-shrink: 0;
1037
- }
1038
-
1039
- /* Context buttons — inline after type badge */
1040
- .context-buttons {
1041
- display: inline-flex;
1042
- gap: 0;
1043
- border: 1px solid var(--border);
1044
- border-radius: var(--radius);
1045
- overflow: hidden;
1046
- }
1047
- .context-btn {
1048
- border: none;
1049
- border-radius: 0;
1050
- padding: 3px 10px;
1051
- font-size: 11px;
1052
- font-family: var(--mono);
1053
- background: var(--surface-2);
1054
- color: var(--text-2);
1055
- cursor: pointer;
1056
- transition: all var(--transition);
1057
- }
1058
- .context-btn:hover {
1059
- background: var(--surface-3);
1060
- color: var(--text);
1061
- }
1062
- .context-btn.active {
1063
- background: var(--accent);
1064
- color: #fff;
1065
- }
1066
- .context-btn + .context-btn {
1067
- border-left: 1px solid var(--border);
1068
- }
1069
-
1070
- /* Node view */
1071
- .node-view {
1072
- max-width: 680px;
1073
- }
1074
- .node-view:has(> .view-full) {
1075
- max-width: none;
1076
- }
1077
- .editor-body:has(.view-full) {
1078
- padding: 0;
1079
- }
1080
-
1081
- /* Info bar — compact chips for components and fields */
1082
- .node-info-bar {
1083
- display: flex;
1084
- flex-wrap: wrap;
1085
- gap: 8px;
1086
- margin-bottom: 20px;
1087
- }
1088
- .node-info-chip {
1089
- display: inline-flex;
1090
- align-items: center;
1091
- gap: 6px;
1092
- padding: 4px 10px;
1093
- border-radius: 16px;
1094
- background: var(--surface);
1095
- border: 1px solid var(--border);
1096
- font-size: 12px;
1097
- }
1098
- .node-info-chip-label {
1099
- color: var(--text-2);
1100
- font-weight: 500;
1101
- }
1102
- .node-info-chip-type {
1103
- font-family: var(--mono);
1104
- color: var(--accent);
1105
- background: var(--accent-subtle);
1106
- padding: 1px 6px;
1107
- border-radius: 10px;
1108
- font-size: 11px;
1109
- }
1110
- .node-info-chip.data .node-info-chip-val {
1111
- color: var(--text);
1112
- max-width: 120px;
1113
- overflow: hidden;
1114
- text-overflow: ellipsis;
1115
- white-space: nowrap;
1116
- }
1117
-
1118
- /* Children grid — file explorer cards with staggered reveal */
1119
- .children-grid {
1120
- display: flex;
1121
- flex-direction: column;
1122
- gap: 2px;
1123
- }
1124
-
1125
- .child-card {
1126
- display: flex;
1127
- align-items: center;
1128
- gap: 12px;
1129
- padding: 10px 14px;
1130
- border-radius: var(--radius);
1131
- cursor: pointer;
1132
- transition: all var(--transition);
1133
- animation: child-in 0.25s ease both;
1134
- }
1135
- .child-card:hover {
1136
- background: var(--surface);
1137
- }
1138
- @keyframes child-in {
1139
- from {
1140
- opacity: 0;
1141
- transform: translateY(6px);
1142
- }
1143
- }
1144
-
1145
- .child-icon {
1146
- width: 32px;
1147
- height: 32px;
1148
- border-radius: 8px;
1149
- background: var(--surface-2);
1150
- border: 1px solid var(--border);
1151
- display: flex;
1152
- align-items: center;
1153
- justify-content: center;
1154
- font-size: 13px;
1155
- font-weight: 600;
1156
- color: var(--text-2);
1157
- flex-shrink: 0;
1158
- }
1159
- .child-info {
1160
- flex: 1;
1161
- min-width: 0;
1162
- }
1163
- .child-name {
1164
- display: block;
1165
- font-size: 13px;
1166
- font-weight: 500;
1167
- color: var(--text);
1168
- overflow: hidden;
1169
- text-overflow: ellipsis;
1170
- white-space: nowrap;
1171
- }
1172
- .child-type {
1173
- display: block;
1174
- font-size: 11px;
1175
- color: var(--text-3);
1176
- font-family: var(--mono);
1177
- margin-top: 1px;
1178
- }
1179
- .child-chevron {
1180
- color: var(--text-3);
1181
- font-size: 18px;
1182
- flex-shrink: 0;
1183
- transition: transform var(--transition);
1184
- }
1185
- .child-card:hover .child-chevron {
1186
- transform: translateX(2px);
1187
- color: var(--text-2);
1188
- }
1189
-
1190
- .node-empty {
1191
- color: var(--text-3);
1192
- font-size: 13px;
1193
- padding: 40px;
1194
- text-align: center;
1195
- }
1196
-
1197
- /* Login */
1198
- .login-screen {
1199
- height: 100vh;
1200
- display: flex;
1201
- align-items: center;
1202
- justify-content: center;
1203
- background: var(--bg);
1204
- }
1205
- .login-box {
1206
- width: 320px;
1207
- padding: 32px;
1208
- background: var(--surface);
1209
- border: 1px solid var(--border);
1210
- border-radius: var(--radius-lg);
1211
- display: flex;
1212
- flex-direction: column;
1213
- gap: 16px;
1214
- }
1215
- .login-box .field {
1216
- flex-direction: column;
1217
- align-items: stretch;
1218
- gap: 4px;
1219
- }
1220
- .login-box .field label {
1221
- min-width: unset;
1222
- }
1223
- .login-logo {
1224
- font-size: 18px;
1225
- font-weight: 600;
1226
- display: flex;
1227
- align-items: center;
1228
- gap: 8px;
1229
- justify-content: center;
1230
- margin-bottom: 8px;
1231
- }
1232
- .login-error {
1233
- font-size: 13px;
1234
- color: var(--danger);
1235
- padding: 8px 12px;
1236
- background: var(--danger-subtle);
1237
- border-radius: var(--radius);
1238
- }
1239
- .login-overlay {
1240
- position: fixed;
1241
- inset: 0;
1242
- background: rgba(0, 0, 0, 0.5);
1243
- display: flex;
1244
- align-items: center;
1245
- justify-content: center;
1246
- z-index: 1000;
1247
- animation: fade-in 0.15s ease;
1248
- }
1249
- .login-modal {
1250
- position: relative;
1251
- animation: modal-in 0.2s ease;
1252
- }
1253
- .login-modal-close {
1254
- position: absolute;
1255
- top: 8px;
1256
- right: 8px;
1257
- background: none;
1258
- border: none;
1259
- color: var(--text-muted);
1260
- font-size: 20px;
1261
- cursor: pointer;
1262
- padding: 4px 8px;
1263
- line-height: 1;
1264
- border-radius: var(--radius);
1265
- }
1266
- .login-modal-close:hover {
1267
- color: var(--text);
1268
- background: var(--hover);
1269
- }