@treenity/mods 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 (486) hide show
  1. package/board/board.test.ts +212 -0
  2. package/board/client.ts +1 -0
  3. package/board/seed.ts +26 -0
  4. package/board/server.ts +5 -0
  5. package/board/types.ts +87 -0
  6. package/board/view.tsx +574 -0
  7. package/brahman/CLAUDE.md +18 -0
  8. package/brahman/brahman.test.ts +855 -0
  9. package/brahman/client.ts +2 -0
  10. package/brahman/helpers.ts +374 -0
  11. package/brahman/server.ts +2 -0
  12. package/brahman/service.ts +328 -0
  13. package/brahman/types.ts +727 -0
  14. package/brahman/view.tsx +73 -0
  15. package/brahman/views/action-cards.tsx +615 -0
  16. package/brahman/views/bot-view.tsx +76 -0
  17. package/brahman/views/chat-editor.tsx +782 -0
  18. package/brahman/views/chat-preview.tsx +266 -0
  19. package/brahman/views/menu-editor.tsx +451 -0
  20. package/brahman/views/page-layout.tsx +285 -0
  21. package/brahman/views/tstring-input.tsx +84 -0
  22. package/cafe/CLAUDE.md +7 -0
  23. package/cafe/seed.ts +8 -0
  24. package/cafe/server.ts +2 -0
  25. package/cafe/types.ts +32 -0
  26. package/canary/seed.ts +8 -0
  27. package/canary/server.ts +3 -0
  28. package/canary/service.ts +101 -0
  29. package/canary/types.ts +16 -0
  30. package/dist/board/client.d.ts +2 -0
  31. package/dist/board/client.d.ts.map +1 -0
  32. package/dist/board/client.js +2 -0
  33. package/dist/board/client.js.map +1 -0
  34. package/dist/board/seed.d.ts +2 -0
  35. package/dist/board/seed.d.ts.map +1 -0
  36. package/dist/board/seed.js +23 -0
  37. package/dist/board/seed.js.map +1 -0
  38. package/dist/board/server.d.ts +3 -0
  39. package/dist/board/server.d.ts.map +1 -0
  40. package/dist/board/server.js +5 -0
  41. package/dist/board/server.js.map +1 -0
  42. package/dist/board/types.d.ts +45 -0
  43. package/dist/board/types.d.ts.map +1 -0
  44. package/dist/board/types.js +82 -0
  45. package/dist/board/types.js.map +1 -0
  46. package/dist/board/view.d.ts +2 -0
  47. package/dist/board/view.d.ts.map +1 -0
  48. package/dist/board/view.js +254 -0
  49. package/dist/board/view.js.map +1 -0
  50. package/dist/brahman/client.d.ts +3 -0
  51. package/dist/brahman/client.d.ts.map +1 -0
  52. package/dist/brahman/client.js +3 -0
  53. package/dist/brahman/client.js.map +1 -0
  54. package/dist/brahman/helpers.d.ts +51 -0
  55. package/dist/brahman/helpers.d.ts.map +1 -0
  56. package/dist/brahman/helpers.js +321 -0
  57. package/dist/brahman/helpers.js.map +1 -0
  58. package/dist/brahman/server.d.ts +3 -0
  59. package/dist/brahman/server.d.ts.map +1 -0
  60. package/dist/brahman/server.js +3 -0
  61. package/dist/brahman/server.js.map +1 -0
  62. package/dist/brahman/service.d.ts +2 -0
  63. package/dist/brahman/service.d.ts.map +1 -0
  64. package/dist/brahman/service.js +310 -0
  65. package/dist/brahman/service.js.map +1 -0
  66. package/dist/brahman/types.d.ts +335 -0
  67. package/dist/brahman/types.d.ts.map +1 -0
  68. package/dist/brahman/types.js +633 -0
  69. package/dist/brahman/types.js.map +1 -0
  70. package/dist/brahman/view.d.ts +2 -0
  71. package/dist/brahman/view.d.ts.map +1 -0
  72. package/dist/brahman/view.js +47 -0
  73. package/dist/brahman/view.js.map +1 -0
  74. package/dist/brahman/views/action-cards.d.ts +60 -0
  75. package/dist/brahman/views/action-cards.d.ts.map +1 -0
  76. package/dist/brahman/views/action-cards.js +283 -0
  77. package/dist/brahman/views/action-cards.js.map +1 -0
  78. package/dist/brahman/views/bot-view.d.ts +5 -0
  79. package/dist/brahman/views/bot-view.d.ts.map +1 -0
  80. package/dist/brahman/views/bot-view.js +14 -0
  81. package/dist/brahman/views/bot-view.js.map +1 -0
  82. package/dist/brahman/views/chat-editor.d.ts +5 -0
  83. package/dist/brahman/views/chat-editor.d.ts.map +1 -0
  84. package/dist/brahman/views/chat-editor.js +306 -0
  85. package/dist/brahman/views/chat-editor.js.map +1 -0
  86. package/dist/brahman/views/chat-preview.d.ts +5 -0
  87. package/dist/brahman/views/chat-preview.d.ts.map +1 -0
  88. package/dist/brahman/views/chat-preview.js +145 -0
  89. package/dist/brahman/views/chat-preview.js.map +1 -0
  90. package/dist/brahman/views/menu-editor.d.ts +11 -0
  91. package/dist/brahman/views/menu-editor.d.ts.map +1 -0
  92. package/dist/brahman/views/menu-editor.js +171 -0
  93. package/dist/brahman/views/menu-editor.js.map +1 -0
  94. package/dist/brahman/views/page-layout.d.ts +5 -0
  95. package/dist/brahman/views/page-layout.d.ts.map +1 -0
  96. package/dist/brahman/views/page-layout.js +114 -0
  97. package/dist/brahman/views/page-layout.js.map +1 -0
  98. package/dist/brahman/views/tstring-input.d.ts +15 -0
  99. package/dist/brahman/views/tstring-input.d.ts.map +1 -0
  100. package/dist/brahman/views/tstring-input.js +23 -0
  101. package/dist/brahman/views/tstring-input.js.map +1 -0
  102. package/dist/cafe/seed.d.ts +2 -0
  103. package/dist/cafe/seed.d.ts.map +1 -0
  104. package/dist/cafe/seed.js +7 -0
  105. package/dist/cafe/seed.js.map +1 -0
  106. package/dist/cafe/server.d.ts +3 -0
  107. package/dist/cafe/server.d.ts.map +1 -0
  108. package/dist/cafe/server.js +3 -0
  109. package/dist/cafe/server.js.map +1 -0
  110. package/dist/cafe/types.d.ts +2 -0
  111. package/dist/cafe/types.d.ts.map +1 -0
  112. package/dist/cafe/types.js +31 -0
  113. package/dist/cafe/types.js.map +1 -0
  114. package/dist/canary/seed.d.ts +2 -0
  115. package/dist/canary/seed.d.ts.map +1 -0
  116. package/dist/canary/seed.js +7 -0
  117. package/dist/canary/seed.js.map +1 -0
  118. package/dist/canary/server.d.ts +4 -0
  119. package/dist/canary/server.d.ts.map +1 -0
  120. package/dist/canary/server.js +4 -0
  121. package/dist/canary/server.js.map +1 -0
  122. package/dist/canary/service.d.ts +2 -0
  123. package/dist/canary/service.d.ts.map +1 -0
  124. package/dist/canary/service.js +101 -0
  125. package/dist/canary/service.js.map +1 -0
  126. package/dist/canary/types.d.ts +9 -0
  127. package/dist/canary/types.d.ts.map +1 -0
  128. package/dist/canary/types.js +13 -0
  129. package/dist/canary/types.js.map +1 -0
  130. package/dist/doc/client.d.ts +3 -0
  131. package/dist/doc/client.d.ts.map +1 -0
  132. package/dist/doc/client.js +5 -0
  133. package/dist/doc/client.js.map +1 -0
  134. package/dist/doc/fs-codec.d.ts +2 -0
  135. package/dist/doc/fs-codec.d.ts.map +1 -0
  136. package/dist/doc/fs-codec.js +44 -0
  137. package/dist/doc/fs-codec.js.map +1 -0
  138. package/dist/doc/markdown.d.ts +13 -0
  139. package/dist/doc/markdown.d.ts.map +1 -0
  140. package/dist/doc/markdown.js +250 -0
  141. package/dist/doc/markdown.js.map +1 -0
  142. package/dist/doc/prefab.d.ts +2 -0
  143. package/dist/doc/prefab.d.ts.map +1 -0
  144. package/dist/doc/prefab.js +23 -0
  145. package/dist/doc/prefab.js.map +1 -0
  146. package/dist/doc/renderers.d.ts +2 -0
  147. package/dist/doc/renderers.d.ts.map +1 -0
  148. package/dist/doc/renderers.js +94 -0
  149. package/dist/doc/renderers.js.map +1 -0
  150. package/dist/doc/seed.d.ts +2 -0
  151. package/dist/doc/seed.d.ts.map +1 -0
  152. package/dist/doc/seed.js +9 -0
  153. package/dist/doc/seed.js.map +1 -0
  154. package/dist/doc/server.d.ts +6 -0
  155. package/dist/doc/server.d.ts.map +1 -0
  156. package/dist/doc/server.js +6 -0
  157. package/dist/doc/server.js.map +1 -0
  158. package/dist/doc/slash-command.d.ts +3 -0
  159. package/dist/doc/slash-command.d.ts.map +1 -0
  160. package/dist/doc/slash-command.js +123 -0
  161. package/dist/doc/slash-command.js.map +1 -0
  162. package/dist/doc/slash-menu.d.ts +15 -0
  163. package/dist/doc/slash-menu.d.ts.map +1 -0
  164. package/dist/doc/slash-menu.js +54 -0
  165. package/dist/doc/slash-menu.js.map +1 -0
  166. package/dist/doc/text.d.ts +2 -0
  167. package/dist/doc/text.d.ts.map +1 -0
  168. package/dist/doc/text.js +22 -0
  169. package/dist/doc/text.js.map +1 -0
  170. package/dist/doc/toolbar.d.ts +5 -0
  171. package/dist/doc/toolbar.d.ts.map +1 -0
  172. package/dist/doc/toolbar.js +15 -0
  173. package/dist/doc/toolbar.js.map +1 -0
  174. package/dist/doc/treenity-block-view.d.ts +2 -0
  175. package/dist/doc/treenity-block-view.d.ts.map +1 -0
  176. package/dist/doc/treenity-block-view.js +37 -0
  177. package/dist/doc/treenity-block-view.js.map +1 -0
  178. package/dist/doc/treenity-block.d.ts +3 -0
  179. package/dist/doc/treenity-block.d.ts.map +1 -0
  180. package/dist/doc/treenity-block.js +27 -0
  181. package/dist/doc/treenity-block.js.map +1 -0
  182. package/dist/doc/types.d.ts +2 -0
  183. package/dist/doc/types.d.ts.map +1 -0
  184. package/dist/doc/types.js +10 -0
  185. package/dist/doc/types.js.map +1 -0
  186. package/dist/launcher/client.d.ts +5 -0
  187. package/dist/launcher/client.d.ts.map +1 -0
  188. package/dist/launcher/client.js +5 -0
  189. package/dist/launcher/client.js.map +1 -0
  190. package/dist/launcher/icons.d.ts +2 -0
  191. package/dist/launcher/icons.d.ts.map +1 -0
  192. package/dist/launcher/icons.js +57 -0
  193. package/dist/launcher/icons.js.map +1 -0
  194. package/dist/launcher/seed.d.ts +2 -0
  195. package/dist/launcher/seed.d.ts.map +1 -0
  196. package/dist/launcher/seed.js +36 -0
  197. package/dist/launcher/seed.js.map +1 -0
  198. package/dist/launcher/server.d.ts +3 -0
  199. package/dist/launcher/server.d.ts.map +1 -0
  200. package/dist/launcher/server.js +3 -0
  201. package/dist/launcher/server.js.map +1 -0
  202. package/dist/launcher/types.d.ts +21 -0
  203. package/dist/launcher/types.d.ts.map +1 -0
  204. package/dist/launcher/types.js +47 -0
  205. package/dist/launcher/types.js.map +1 -0
  206. package/dist/launcher/view.d.ts +2 -0
  207. package/dist/launcher/view.d.ts.map +1 -0
  208. package/dist/launcher/view.js +187 -0
  209. package/dist/launcher/view.js.map +1 -0
  210. package/dist/launcher/widgets.d.ts +2 -0
  211. package/dist/launcher/widgets.d.ts.map +1 -0
  212. package/dist/launcher/widgets.js +73 -0
  213. package/dist/launcher/widgets.js.map +1 -0
  214. package/dist/mindmap/branch.d.ts +17 -0
  215. package/dist/mindmap/branch.d.ts.map +1 -0
  216. package/dist/mindmap/branch.js +47 -0
  217. package/dist/mindmap/branch.js.map +1 -0
  218. package/dist/mindmap/client.d.ts +3 -0
  219. package/dist/mindmap/client.d.ts.map +1 -0
  220. package/dist/mindmap/client.js +3 -0
  221. package/dist/mindmap/client.js.map +1 -0
  222. package/dist/mindmap/radial-tree.d.ts +14 -0
  223. package/dist/mindmap/radial-tree.d.ts.map +1 -0
  224. package/dist/mindmap/radial-tree.js +184 -0
  225. package/dist/mindmap/radial-tree.js.map +1 -0
  226. package/dist/mindmap/sidebar.d.ts +8 -0
  227. package/dist/mindmap/sidebar.d.ts.map +1 -0
  228. package/dist/mindmap/sidebar.js +24 -0
  229. package/dist/mindmap/sidebar.js.map +1 -0
  230. package/dist/mindmap/types.d.ts +8 -0
  231. package/dist/mindmap/types.d.ts.map +1 -0
  232. package/dist/mindmap/types.js +10 -0
  233. package/dist/mindmap/types.js.map +1 -0
  234. package/dist/mindmap/use-tree-data.d.ts +14 -0
  235. package/dist/mindmap/use-tree-data.d.ts.map +1 -0
  236. package/dist/mindmap/use-tree-data.js +95 -0
  237. package/dist/mindmap/use-tree-data.js.map +1 -0
  238. package/dist/mindmap/view.d.ts +3 -0
  239. package/dist/mindmap/view.d.ts.map +1 -0
  240. package/dist/mindmap/view.js +141 -0
  241. package/dist/mindmap/view.js.map +1 -0
  242. package/dist/sensor-demo/client.d.ts +2 -0
  243. package/dist/sensor-demo/client.d.ts.map +1 -0
  244. package/dist/sensor-demo/client.js +2 -0
  245. package/dist/sensor-demo/client.js.map +1 -0
  246. package/dist/sensor-demo/server.d.ts +2 -0
  247. package/dist/sensor-demo/server.d.ts.map +1 -0
  248. package/dist/sensor-demo/server.js +2 -0
  249. package/dist/sensor-demo/server.js.map +1 -0
  250. package/dist/sensor-demo/service.d.ts +2 -0
  251. package/dist/sensor-demo/service.d.ts.map +1 -0
  252. package/dist/sensor-demo/service.js +27 -0
  253. package/dist/sensor-demo/service.js.map +1 -0
  254. package/dist/sensor-demo/types.d.ts +15 -0
  255. package/dist/sensor-demo/types.d.ts.map +1 -0
  256. package/dist/sensor-demo/types.js +18 -0
  257. package/dist/sensor-demo/types.js.map +1 -0
  258. package/dist/sensor-demo/view.d.ts +2 -0
  259. package/dist/sensor-demo/view.d.ts.map +1 -0
  260. package/dist/sensor-demo/view.js +33 -0
  261. package/dist/sensor-demo/view.js.map +1 -0
  262. package/dist/sensor-generator/action.d.ts +2 -0
  263. package/dist/sensor-generator/action.d.ts.map +1 -0
  264. package/dist/sensor-generator/action.js +23 -0
  265. package/dist/sensor-generator/action.js.map +1 -0
  266. package/dist/sensor-generator/client.d.ts +2 -0
  267. package/dist/sensor-generator/client.d.ts.map +1 -0
  268. package/dist/sensor-generator/client.js +2 -0
  269. package/dist/sensor-generator/client.js.map +1 -0
  270. package/dist/sensor-generator/server.d.ts +2 -0
  271. package/dist/sensor-generator/server.d.ts.map +1 -0
  272. package/dist/sensor-generator/server.js +2 -0
  273. package/dist/sensor-generator/server.js.map +1 -0
  274. package/dist/sensor-generator/view.d.ts +2 -0
  275. package/dist/sensor-generator/view.d.ts.map +1 -0
  276. package/dist/sensor-generator/view.js +64 -0
  277. package/dist/sensor-generator/view.js.map +1 -0
  278. package/dist/sim/client.d.ts +2 -0
  279. package/dist/sim/client.d.ts.map +1 -0
  280. package/dist/sim/client.js +2 -0
  281. package/dist/sim/client.js.map +1 -0
  282. package/dist/sim/seed.d.ts +2 -0
  283. package/dist/sim/seed.d.ts.map +1 -0
  284. package/dist/sim/seed.js +50 -0
  285. package/dist/sim/seed.js.map +1 -0
  286. package/dist/sim/server.d.ts +3 -0
  287. package/dist/sim/server.d.ts.map +1 -0
  288. package/dist/sim/server.js +3 -0
  289. package/dist/sim/server.js.map +1 -0
  290. package/dist/sim/service.d.ts +4 -0
  291. package/dist/sim/service.d.ts.map +1 -0
  292. package/dist/sim/service.js +528 -0
  293. package/dist/sim/service.js.map +1 -0
  294. package/dist/sim/types.d.ts +63 -0
  295. package/dist/sim/types.d.ts.map +1 -0
  296. package/dist/sim/types.js +57 -0
  297. package/dist/sim/types.js.map +1 -0
  298. package/dist/sim/view.d.ts +2 -0
  299. package/dist/sim/view.d.ts.map +1 -0
  300. package/dist/sim/view.js +205 -0
  301. package/dist/sim/view.js.map +1 -0
  302. package/dist/table/client.d.ts +4 -0
  303. package/dist/table/client.d.ts.map +1 -0
  304. package/dist/table/client.js +4 -0
  305. package/dist/table/client.js.map +1 -0
  306. package/dist/table/edit.d.ts +2 -0
  307. package/dist/table/edit.d.ts.map +1 -0
  308. package/dist/table/edit.js +115 -0
  309. package/dist/table/edit.js.map +1 -0
  310. package/dist/table/server.d.ts +2 -0
  311. package/dist/table/server.d.ts.map +1 -0
  312. package/dist/table/server.js +2 -0
  313. package/dist/table/server.js.map +1 -0
  314. package/dist/table/types.d.ts +18 -0
  315. package/dist/table/types.d.ts.map +1 -0
  316. package/dist/table/types.js +13 -0
  317. package/dist/table/types.js.map +1 -0
  318. package/dist/table/use-debounced-sync.d.ts +8 -0
  319. package/dist/table/use-debounced-sync.d.ts.map +1 -0
  320. package/dist/table/use-debounced-sync.js +56 -0
  321. package/dist/table/use-debounced-sync.js.map +1 -0
  322. package/dist/table/view.d.ts +2 -0
  323. package/dist/table/view.d.ts.map +1 -0
  324. package/dist/table/view.js +199 -0
  325. package/dist/table/view.js.map +1 -0
  326. package/dist/tasks/server.d.ts +2 -0
  327. package/dist/tasks/server.d.ts.map +1 -0
  328. package/dist/tasks/server.js +2 -0
  329. package/dist/tasks/server.js.map +1 -0
  330. package/dist/tasks/types.d.ts +22 -0
  331. package/dist/tasks/types.d.ts.map +1 -0
  332. package/dist/tasks/types.js +34 -0
  333. package/dist/tasks/types.js.map +1 -0
  334. package/dist/three/client.d.ts +2 -0
  335. package/dist/three/client.d.ts.map +1 -0
  336. package/dist/three/client.js +2 -0
  337. package/dist/three/client.js.map +1 -0
  338. package/dist/three/seed.d.ts +2 -0
  339. package/dist/three/seed.d.ts.map +1 -0
  340. package/dist/three/seed.js +45 -0
  341. package/dist/three/seed.js.map +1 -0
  342. package/dist/three/server.d.ts +3 -0
  343. package/dist/three/server.d.ts.map +1 -0
  344. package/dist/three/server.js +3 -0
  345. package/dist/three/server.js.map +1 -0
  346. package/dist/three/types.d.ts +178 -0
  347. package/dist/three/types.d.ts.map +1 -0
  348. package/dist/three/types.js +209 -0
  349. package/dist/three/types.js.map +1 -0
  350. package/dist/three/view.d.ts +2 -0
  351. package/dist/three/view.d.ts.map +1 -0
  352. package/dist/three/view.js +307 -0
  353. package/dist/three/view.js.map +1 -0
  354. package/dist/todo/client.d.ts +3 -0
  355. package/dist/todo/client.d.ts.map +1 -0
  356. package/dist/todo/client.js +3 -0
  357. package/dist/todo/client.js.map +1 -0
  358. package/dist/todo/seed.d.ts +2 -0
  359. package/dist/todo/seed.d.ts.map +1 -0
  360. package/dist/todo/seed.js +8 -0
  361. package/dist/todo/seed.js.map +1 -0
  362. package/dist/todo/server.d.ts +3 -0
  363. package/dist/todo/server.d.ts.map +1 -0
  364. package/dist/todo/server.js +3 -0
  365. package/dist/todo/server.js.map +1 -0
  366. package/dist/todo/types.d.ts +15 -0
  367. package/dist/todo/types.d.ts.map +1 -0
  368. package/dist/todo/types.js +29 -0
  369. package/dist/todo/types.js.map +1 -0
  370. package/dist/todo/view.d.ts +2 -0
  371. package/dist/todo/view.d.ts.map +1 -0
  372. package/dist/todo/view.js +27 -0
  373. package/dist/todo/view.js.map +1 -0
  374. package/dist/whisper/client.d.ts +2 -0
  375. package/dist/whisper/client.d.ts.map +1 -0
  376. package/dist/whisper/client.js +2 -0
  377. package/dist/whisper/client.js.map +1 -0
  378. package/dist/whisper/inbox.d.ts +2 -0
  379. package/dist/whisper/inbox.d.ts.map +1 -0
  380. package/dist/whisper/inbox.js +50 -0
  381. package/dist/whisper/inbox.js.map +1 -0
  382. package/dist/whisper/route.d.ts +10 -0
  383. package/dist/whisper/route.d.ts.map +1 -0
  384. package/dist/whisper/route.js +154 -0
  385. package/dist/whisper/route.js.map +1 -0
  386. package/dist/whisper/seed.d.ts +2 -0
  387. package/dist/whisper/seed.d.ts.map +1 -0
  388. package/dist/whisper/seed.js +14 -0
  389. package/dist/whisper/seed.js.map +1 -0
  390. package/dist/whisper/server.d.ts +5 -0
  391. package/dist/whisper/server.d.ts.map +1 -0
  392. package/dist/whisper/server.js +5 -0
  393. package/dist/whisper/server.js.map +1 -0
  394. package/dist/whisper/service.d.ts +2 -0
  395. package/dist/whisper/service.d.ts.map +1 -0
  396. package/dist/whisper/service.js +26 -0
  397. package/dist/whisper/service.js.map +1 -0
  398. package/dist/whisper/types.d.ts +38 -0
  399. package/dist/whisper/types.d.ts.map +1 -0
  400. package/dist/whisper/types.js +45 -0
  401. package/dist/whisper/types.js.map +1 -0
  402. package/dist/whisper/view.d.ts +2 -0
  403. package/dist/whisper/view.d.ts.map +1 -0
  404. package/dist/whisper/view.js +40 -0
  405. package/dist/whisper/view.js.map +1 -0
  406. package/doc/CLAUDE.md +49 -0
  407. package/doc/client.ts +5 -0
  408. package/doc/editor.css +283 -0
  409. package/doc/fs-codec.test.ts +119 -0
  410. package/doc/fs-codec.ts +50 -0
  411. package/doc/markdown.test.ts +152 -0
  412. package/doc/markdown.ts +284 -0
  413. package/doc/prefab.ts +26 -0
  414. package/doc/renderers.tsx +126 -0
  415. package/doc/seed.ts +10 -0
  416. package/doc/server.ts +5 -0
  417. package/doc/slash-command.ts +136 -0
  418. package/doc/slash-menu.tsx +91 -0
  419. package/doc/text.ts +20 -0
  420. package/doc/toolbar.tsx +86 -0
  421. package/doc/treenity-block-view.tsx +116 -0
  422. package/doc/treenity-block.ts +31 -0
  423. package/doc/types.ts +10 -0
  424. package/launcher/client.ts +4 -0
  425. package/launcher/icons.tsx +234 -0
  426. package/launcher/launcher.css +64 -0
  427. package/launcher/seed.ts +41 -0
  428. package/launcher/server.ts +2 -0
  429. package/launcher/types.ts +53 -0
  430. package/launcher/view.tsx +401 -0
  431. package/launcher/widgets.tsx +171 -0
  432. package/mindmap/branch.tsx +163 -0
  433. package/mindmap/client.ts +2 -0
  434. package/mindmap/mindmap.css +243 -0
  435. package/mindmap/sidebar.tsx +127 -0
  436. package/mindmap/types.ts +10 -0
  437. package/mindmap/view.tsx +247 -0
  438. package/package.json +75 -0
  439. package/sensor-demo/CLAUDE.md +3 -0
  440. package/sensor-demo/client.ts +1 -0
  441. package/sensor-demo/server.ts +1 -0
  442. package/sensor-demo/service.ts +27 -0
  443. package/sensor-demo/types.ts +20 -0
  444. package/sensor-demo/view.tsx +64 -0
  445. package/sensor-generator/CLAUDE.md +3 -0
  446. package/sensor-generator/action.ts +28 -0
  447. package/sensor-generator/client.ts +1 -0
  448. package/sensor-generator/server.ts +1 -0
  449. package/sensor-generator/view.tsx +107 -0
  450. package/sim/CLAUDE.md +16 -0
  451. package/sim/client.ts +1 -0
  452. package/sim/seed.ts +55 -0
  453. package/sim/server.ts +2 -0
  454. package/sim/service.ts +594 -0
  455. package/sim/sim.test.ts +282 -0
  456. package/sim/types.ts +87 -0
  457. package/sim/view.tsx +446 -0
  458. package/table/client.ts +3 -0
  459. package/table/edit.tsx +241 -0
  460. package/table/server.ts +1 -0
  461. package/table/types.ts +22 -0
  462. package/table/use-debounced-sync.ts +67 -0
  463. package/table/view.tsx +339 -0
  464. package/tasks/CLAUDE.md +6 -0
  465. package/tasks/server.ts +1 -0
  466. package/tasks/types.ts +36 -0
  467. package/three/CLAUDE.md +6 -0
  468. package/three/client.ts +1 -0
  469. package/three/seed.ts +54 -0
  470. package/three/server.ts +2 -0
  471. package/three/types.ts +238 -0
  472. package/three/view.tsx +453 -0
  473. package/todo/client.ts +2 -0
  474. package/todo/seed.ts +9 -0
  475. package/todo/server.ts +2 -0
  476. package/todo/types.ts +32 -0
  477. package/todo/view.tsx +67 -0
  478. package/whisper/CLAUDE.md +16 -0
  479. package/whisper/client.ts +1 -0
  480. package/whisper/inbox.ts +54 -0
  481. package/whisper/route.ts +182 -0
  482. package/whisper/seed.ts +15 -0
  483. package/whisper/server.ts +4 -0
  484. package/whisper/service.ts +29 -0
  485. package/whisper/types.ts +51 -0
  486. package/whisper/view.tsx +81 -0
@@ -0,0 +1,451 @@
1
+ // Menu editor — DnD button/row constructor
2
+ // Per-row horizontal sortable + cross-row drop with indicator
3
+
4
+ import {
5
+ closestCenter,
6
+ DndContext,
7
+ type DragEndEvent,
8
+ DragOverlay,
9
+ type DragStartEvent,
10
+ PointerSensor,
11
+ useSensor,
12
+ useSensors,
13
+ } from '@dnd-kit/core';
14
+ import { arrayMove, horizontalListSortingStrategy, SortableContext, useSortable } from '@dnd-kit/sortable';
15
+ import { CSS } from '@dnd-kit/utilities';
16
+ import { Badge } from '@treenity/react/components/ui/badge';
17
+ import { Button } from '@treenity/react/components/ui/button';
18
+ import { Input } from '@treenity/react/components/ui/input';
19
+ import { trpc } from '@treenity/react/trpc';
20
+ import { ArrowRight, Plus, X } from 'lucide-react';
21
+ import { useRef, useState } from 'react';
22
+ import { createPortal } from 'react-dom';
23
+ import { ACTION_TYPES, MENU_TYPES, type MenuButton, type MenuRow, type MenuType, type TString } from '../types';
24
+ import { TStringLineInput, tstringPreview } from './tstring-input';
25
+
26
+ // ── Modal (lightweight, no radix dependency) ──
27
+
28
+ function Modal({ open, onClose, title, children }: {
29
+ open: boolean;
30
+ onClose: () => void;
31
+ title: string;
32
+ children: React.ReactNode;
33
+ }) {
34
+ if (!open) return null;
35
+
36
+ return createPortal(
37
+ <div className="fixed inset-0 z-50 flex items-center justify-center">
38
+ <div className="absolute inset-0 bg-black/50" onClick={onClose} />
39
+ <div className="relative bg-background border border-border rounded-lg shadow-lg w-full max-w-md mx-4">
40
+ <div className="flex items-center justify-between px-4 py-3 border-b border-border">
41
+ <h3 className="text-sm font-semibold">{title}</h3>
42
+ <button type="button" onClick={onClose} className="text-muted-foreground hover:text-foreground">
43
+ <X className="h-4 w-4" />
44
+ </button>
45
+ </div>
46
+ <div className="p-4 space-y-4">{children}</div>
47
+ </div>
48
+ </div>,
49
+ document.body,
50
+ );
51
+ }
52
+
53
+ // ── Tag editor (for button tags) ──
54
+
55
+ function TagEditor({ tags, onChange }: { tags: string[]; onChange: (tags: string[]) => void }) {
56
+ const [input, setInput] = useState('');
57
+
58
+ function add() {
59
+ const t = input.trim();
60
+ if (!t || tags.includes(t)) return;
61
+ onChange([...tags, t]);
62
+ setInput('');
63
+ }
64
+
65
+ return (
66
+ <div className="space-y-1.5">
67
+ <div className="flex flex-wrap gap-1">
68
+ {tags.map(tag => (
69
+ <Badge key={tag} variant="secondary" className="gap-1 pr-1 text-xs">
70
+ {tag}
71
+ <button type="button" onClick={() => onChange(tags.filter(t => t !== tag))}
72
+ className="ml-0.5 rounded-full hover:bg-destructive/20 p-0.5">
73
+ <X className="h-2.5 w-2.5" />
74
+ </button>
75
+ </Badge>
76
+ ))}
77
+ </div>
78
+ <div className="flex gap-1">
79
+ <Input className="flex-1 h-7 text-xs" placeholder="tag (!exclude)" value={input}
80
+ onChange={e => setInput(e.target.value)}
81
+ onKeyDown={e => e.key === 'Enter' && (e.preventDefault(), add())} />
82
+ <Button variant="outline" size="sm" className="h-7 text-xs" onClick={add}>+</Button>
83
+ </div>
84
+ </div>
85
+ );
86
+ }
87
+
88
+ // ── Button edit modal ──
89
+
90
+ function ButtonEditModal({
91
+ button,
92
+ langs,
93
+ onSave,
94
+ onDelete,
95
+ onClose,
96
+ }: {
97
+ button: MenuButton;
98
+ langs: string[];
99
+ onSave: (btn: MenuButton) => void;
100
+ onDelete: () => void;
101
+ onClose: () => void;
102
+ }) {
103
+ const [draft, setDraft] = useState<MenuButton>({ ...button });
104
+
105
+ function update<K extends keyof MenuButton>(key: K, val: MenuButton[K]) {
106
+ setDraft(prev => ({ ...prev, [key]: val }));
107
+ }
108
+
109
+ return (
110
+ <Modal open title="Edit Button" onClose={onClose}>
111
+ <div className="space-y-3">
112
+ <div>
113
+ <label className="text-xs font-medium text-muted-foreground">Title</label>
114
+ <TStringLineInput value={draft.title} onChange={t => update('title', t)} langs={langs} />
115
+ </div>
116
+
117
+ <div>
118
+ <label className="text-xs font-medium text-muted-foreground">URL (optional)</label>
119
+ <Input className="h-8 text-sm" placeholder="https://..."
120
+ value={draft.url ?? ''} onChange={e => update('url', e.target.value || undefined)} />
121
+ </div>
122
+
123
+ <div>
124
+ <label className="text-xs font-medium text-muted-foreground">Tags</label>
125
+ <TagEditor tags={draft.tags ?? []} onChange={t => update('tags', t)} />
126
+ </div>
127
+
128
+ <div>
129
+ <label className="text-xs font-medium text-muted-foreground">Button action</label>
130
+ <select
131
+ className="w-full h-8 text-sm border border-border rounded-md bg-background px-2"
132
+ value={draft.action?.type ?? ''}
133
+ onChange={e => {
134
+ if (!e.target.value) { update('action', undefined); return; }
135
+ update('action', { type: e.target.value });
136
+ }}
137
+ >
138
+ <option value="">No action</option>
139
+ {ACTION_TYPES.map(at => (
140
+ <option key={at.type} value={at.type}>{at.label}</option>
141
+ ))}
142
+ </select>
143
+
144
+ {draft.action?.type === 'brahman.action.page' && (
145
+ <Input className="h-8 text-sm mt-1" placeholder="Target page path"
146
+ value={(draft.action.target as string) ?? ''}
147
+ onChange={e => update('action', { ...draft.action!, target: e.target.value })} />
148
+ )}
149
+ </div>
150
+ </div>
151
+
152
+ <div className="flex justify-between pt-2">
153
+ <Button variant="destructive" size="sm" onClick={onDelete}>Delete</Button>
154
+ <div className="flex gap-2">
155
+ <Button variant="outline" size="sm" onClick={onClose}>Cancel</Button>
156
+ <Button size="sm" onClick={() => { onSave(draft); onClose(); }}>Save</Button>
157
+ </div>
158
+ </div>
159
+ </Modal>
160
+ );
161
+ }
162
+
163
+ // ── Sortable button with drop indicator ──
164
+
165
+ function SortableButton({
166
+ button,
167
+ totalInRow,
168
+ onClick,
169
+ onPageDrop,
170
+ isOver,
171
+ isCrossRow,
172
+ }: {
173
+ button: MenuButton;
174
+ totalInRow: number;
175
+ onClick: () => void;
176
+ onPageDrop: (path: string) => void;
177
+ isOver: boolean;
178
+ isCrossRow: boolean;
179
+ }) {
180
+ const { attributes, listeners, setNodeRef, transform, transition, isDragging } = useSortable({
181
+ id: `btn-${button.id}`,
182
+ });
183
+ const [treeDragOver, setTreeDragOver] = useState(false);
184
+
185
+ const widthPct = `${(100 / totalInRow).toFixed(1)}%`;
186
+ const showIndicator = isOver && isCrossRow;
187
+ const pageTarget = button.action?.type === 'brahman.action.page' ? button.action.target as string : null;
188
+
189
+ return (
190
+ <div
191
+ ref={setNodeRef}
192
+ style={{
193
+ width: widthPct,
194
+ transform: CSS.Transform.toString(transform),
195
+ transition,
196
+ opacity: isDragging ? 0.3 : 1,
197
+ }}
198
+ className={`shrink-0 relative ${showIndicator ? 'ml-2' : ''}`}
199
+ onDragOver={e => {
200
+ if (e.dataTransfer.types.includes('application/treenity-path')) {
201
+ e.preventDefault();
202
+ e.dataTransfer.dropEffect = 'link';
203
+ setTreeDragOver(true);
204
+ }
205
+ }}
206
+ onDragLeave={() => setTreeDragOver(false)}
207
+ onDrop={async e => {
208
+ const path = e.dataTransfer.getData('application/treenity-path');
209
+ setTreeDragOver(false);
210
+ if (!path) return;
211
+ e.preventDefault();
212
+ const node = await trpc.get.query({ path });
213
+ if (node?.$type === 'brahman.page') onPageDrop(path);
214
+ }}
215
+ >
216
+ {showIndicator && (
217
+ <div className="absolute -left-2 top-0 bottom-0 flex items-center z-10">
218
+ <div className="w-1 h-full bg-primary rounded-full" />
219
+ </div>
220
+ )}
221
+ <div
222
+ {...attributes}
223
+ {...listeners}
224
+ onClick={onClick}
225
+ className={`flex flex-wrap items-center justify-center gap-x-1.5 gap-y-0 px-2 py-1.5 border rounded-md
226
+ cursor-pointer text-sm font-medium select-none transition-colors
227
+ ${treeDragOver ? 'border-primary bg-primary/10 ring-1 ring-primary/30' : ''}
228
+ ${showIndicator ? 'border-primary/50 bg-primary/5' : ''}
229
+ ${!treeDragOver && !showIndicator ? 'border-border bg-card hover:bg-accent' : ''}`}
230
+ >
231
+ <span className="truncate">
232
+ {tstringPreview(button.title, 20) || 'Button'}
233
+ </span>
234
+ {(button.tags?.length ?? 0) > 0 && (
235
+ <span className="text-[9px] text-muted-foreground">({button.tags!.length})</span>
236
+ )}
237
+ {pageTarget && (
238
+ <span className="flex items-center gap-0.5 text-[9px] text-primary/70">
239
+ <ArrowRight className="h-2.5 w-2.5" />
240
+ {pageTarget.split('/').at(-1)}
241
+ </span>
242
+ )}
243
+ </div>
244
+ </div>
245
+ );
246
+ }
247
+
248
+ // ── Helpers ──
249
+
250
+ function findButtonIn(rows: MenuRow[], id: string): { rowIdx: number; btnIdx: number } | null {
251
+ const numId = parseInt(id.replace('btn-', ''), 10);
252
+ for (let r = 0; r < rows.length; r++) {
253
+ const bi = rows[r].buttons.findIndex(b => b.id === numId);
254
+ if (bi >= 0) return { rowIdx: r, btnIdx: bi };
255
+ }
256
+ return null;
257
+ }
258
+
259
+ // ── Menu editor (main component) ──
260
+
261
+ type MenuEditorProps = {
262
+ menuType: MenuType;
263
+ rows: MenuRow[];
264
+ langs: string[];
265
+ onChangeType: (type: MenuType) => void;
266
+ onChangeRows: (rows: MenuRow[]) => void;
267
+ };
268
+
269
+ export function MenuEditor({ menuType = 'none', rows = [], langs, onChangeType, onChangeRows }: MenuEditorProps) {
270
+ const [editingButton, setEditingButton] = useState<{ rowIdx: number; btnIdx: number } | null>(null);
271
+ const [activeId, setActiveId] = useState<string | null>(null);
272
+ // Track which button we're hovering over (using ref to avoid re-render storms from @dnd-kit)
273
+ const overIdRef = useRef<string | null>(null);
274
+ const [overId, setOverId] = useState<string | null>(null);
275
+
276
+ const sensors = useSensors(
277
+ useSensor(PointerSensor, { activationConstraint: { distance: 5 } }),
278
+ );
279
+
280
+ const showRows = menuType !== 'none' && menuType !== 'remove';
281
+ let nextId = 1;
282
+ for (const row of rows) for (const btn of row.buttons) if (btn.id >= nextId) nextId = btn.id + 1;
283
+
284
+ function defaultTitle(): TString {
285
+ return Object.fromEntries(langs.map(l => [l, `Button ${nextId}`]));
286
+ }
287
+
288
+ // ── DnD handlers ──
289
+
290
+ function handleDragStart(event: DragStartEvent) {
291
+ setActiveId(String(event.active.id));
292
+ overIdRef.current = null;
293
+ setOverId(null);
294
+ }
295
+
296
+ function handleDragEnd(event: DragEndEvent) {
297
+ const { active, over } = event;
298
+
299
+ if (over && active.id !== over.id) {
300
+ const src = findButtonIn(rows, String(active.id));
301
+ const dst = findButtonIn(rows, String(over.id));
302
+
303
+ if (src && dst) {
304
+ const newRows = rows.map(r => ({ buttons: [...r.buttons] }));
305
+
306
+ if (src.rowIdx === dst.rowIdx) {
307
+ newRows[src.rowIdx].buttons = arrayMove(newRows[src.rowIdx].buttons, src.btnIdx, dst.btnIdx);
308
+ } else {
309
+ const [btn] = newRows[src.rowIdx].buttons.splice(src.btnIdx, 1);
310
+ newRows[dst.rowIdx].buttons.splice(dst.btnIdx, 0, btn);
311
+ }
312
+
313
+ onChangeRows(newRows.filter(r => r.buttons.length > 0));
314
+ }
315
+ }
316
+
317
+ setActiveId(null);
318
+ overIdRef.current = null;
319
+ setOverId(null);
320
+ }
321
+
322
+ // ── CRUD ──
323
+
324
+ function addButton(rowIdx: number) {
325
+ const newRows = rows.map(r => ({ buttons: [...r.buttons] }));
326
+ newRows[rowIdx].buttons.push({ id: nextId, title: defaultTitle(), tags: [] });
327
+ onChangeRows(newRows);
328
+ }
329
+
330
+ function addRow() {
331
+ onChangeRows([...rows, { buttons: [{ id: nextId, title: defaultTitle(), tags: [] }] }]);
332
+ }
333
+
334
+ function updateButton(rowIdx: number, btnIdx: number, btn: MenuButton) {
335
+ const newRows = rows.map(r => ({ buttons: [...r.buttons] }));
336
+ newRows[rowIdx].buttons[btnIdx] = btn;
337
+ onChangeRows(newRows);
338
+ }
339
+
340
+ function deleteButton(rowIdx: number, btnIdx: number) {
341
+ const newRows = rows.map(r => ({ buttons: [...r.buttons] }));
342
+ newRows[rowIdx].buttons.splice(btnIdx, 1);
343
+ onChangeRows(newRows.filter(r => r.buttons.length > 0));
344
+ setEditingButton(null);
345
+ }
346
+
347
+ // Determine if active and over are in different rows
348
+ const activePos = activeId ? findButtonIn(rows, activeId) : null;
349
+ const overPos = overId ? findButtonIn(rows, overId) : null;
350
+ const isCrossRow = !!(activePos && overPos && activePos.rowIdx !== overPos.rowIdx);
351
+
352
+ return (
353
+ <div className="space-y-3">
354
+ {/* Menu type selector */}
355
+ <div className="flex items-center gap-3">
356
+ <label className="text-xs font-medium text-muted-foreground w-20">Menu type</label>
357
+ <select
358
+ className="flex-1 h-8 text-sm border border-border rounded-md bg-background px-2"
359
+ value={menuType}
360
+ onChange={e => onChangeType(e.target.value as MenuType)}
361
+ >
362
+ {MENU_TYPES.map(mt => (
363
+ <option key={mt.value} value={mt.value}>{mt.label}</option>
364
+ ))}
365
+ </select>
366
+ </div>
367
+
368
+ {/* Rows & buttons grid */}
369
+ {showRows && (
370
+ <div className="space-y-2">
371
+ <DndContext
372
+ sensors={sensors}
373
+ collisionDetection={closestCenter}
374
+ onDragStart={handleDragStart}
375
+ onDragMove={({ over }) => {
376
+ const id = over ? String(over.id) : null;
377
+ if (id !== overIdRef.current) {
378
+ overIdRef.current = id;
379
+ setOverId(id);
380
+ }
381
+ }}
382
+ onDragEnd={handleDragEnd}
383
+ onDragCancel={() => { setActiveId(null); overIdRef.current = null; setOverId(null); }}
384
+ >
385
+ {rows.map((row, ri) => (
386
+ <div key={ri} className="space-y-1">
387
+ <div className="flex items-center gap-1">
388
+ <span className="text-[10px] text-muted-foreground w-4">{ri + 1}</span>
389
+
390
+ <SortableContext
391
+ items={row.buttons.map(b => `btn-${b.id}`)}
392
+ strategy={horizontalListSortingStrategy}
393
+ >
394
+ <div className="flex-1 flex gap-1">
395
+ {row.buttons.map((btn, bi) => (
396
+ <SortableButton
397
+ key={btn.id}
398
+ button={btn}
399
+ totalInRow={row.buttons.length}
400
+ onClick={() => setEditingButton({ rowIdx: ri, btnIdx: bi })}
401
+ onPageDrop={path => updateButton(ri, bi, {
402
+ ...btn,
403
+ action: { type: 'brahman.action.page', target: path },
404
+ })}
405
+ isOver={overId === `btn-${btn.id}`}
406
+ isCrossRow={isCrossRow}
407
+ />
408
+ ))}
409
+ </div>
410
+ </SortableContext>
411
+
412
+ <button
413
+ type="button"
414
+ onClick={() => addButton(ri)}
415
+ className="p-1 text-muted-foreground hover:text-foreground"
416
+ title="Add button to row"
417
+ >
418
+ <Plus className="h-3.5 w-3.5" />
419
+ </button>
420
+ </div>
421
+ </div>
422
+ ))}
423
+
424
+ <DragOverlay>
425
+ {activeId && activePos ? (
426
+ <div className="px-2 py-1.5 border border-primary rounded-md bg-card shadow-lg text-xs font-medium opacity-85">
427
+ {tstringPreview(rows[activePos.rowIdx].buttons[activePos.btnIdx].title, 12) || 'Button'}
428
+ </div>
429
+ ) : null}
430
+ </DragOverlay>
431
+ </DndContext>
432
+
433
+ <Button variant="outline" size="sm" className="text-xs" onClick={addRow}>
434
+ <Plus className="h-3 w-3 mr-1" /> Add row
435
+ </Button>
436
+ </div>
437
+ )}
438
+
439
+ {/* Button edit modal */}
440
+ {editingButton && rows[editingButton.rowIdx]?.buttons[editingButton.btnIdx] && (
441
+ <ButtonEditModal
442
+ button={rows[editingButton.rowIdx].buttons[editingButton.btnIdx]}
443
+ langs={langs}
444
+ onSave={btn => updateButton(editingButton.rowIdx, editingButton.btnIdx, btn)}
445
+ onDelete={() => deleteButton(editingButton.rowIdx, editingButton.btnIdx)}
446
+ onClose={() => setEditingButton(null)}
447
+ />
448
+ )}
449
+ </div>
450
+ );
451
+ }