@peers-app/peers-ui 0.0.14

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 (404) hide show
  1. package/.github/README.md +52 -0
  2. package/.github/workflows/publish.yml +45 -0
  3. package/babel.config.js +7 -0
  4. package/dist/app.d.ts +9 -0
  5. package/dist/app.js +54 -0
  6. package/dist/command-palette/command-palette-ui.d.ts +2 -0
  7. package/dist/command-palette/command-palette-ui.js +192 -0
  8. package/dist/command-palette/command-palette.d.ts +23 -0
  9. package/dist/command-palette/command-palette.js +371 -0
  10. package/dist/components/checkbox.d.ts +7 -0
  11. package/dist/components/checkbox.js +20 -0
  12. package/dist/components/group-switcher.d.ts +6 -0
  13. package/dist/components/group-switcher.js +301 -0
  14. package/dist/components/input-date.d.ts +7 -0
  15. package/dist/components/input-date.js +19 -0
  16. package/dist/components/input-datetime.d.ts +7 -0
  17. package/dist/components/input-datetime.js +35 -0
  18. package/dist/components/input-number.d.ts +9 -0
  19. package/dist/components/input-number.js +87 -0
  20. package/dist/components/input.d.ts +7 -0
  21. package/dist/components/input.js +20 -0
  22. package/dist/components/io-schema-values.d.ts +15 -0
  23. package/dist/components/io-schema-values.js +105 -0
  24. package/dist/components/io-schema.d.ts +13 -0
  25. package/dist/components/io-schema.js +163 -0
  26. package/dist/components/lazy-list.d.ts +13 -0
  27. package/dist/components/lazy-list.js +91 -0
  28. package/dist/components/lazy-sortable-list.d.ts +29 -0
  29. package/dist/components/lazy-sortable-list.js +12 -0
  30. package/dist/components/left-bar.d.ts +3 -0
  31. package/dist/components/left-bar.js +130 -0
  32. package/dist/components/list-screen.d.ts +16 -0
  33. package/dist/components/list-screen.js +100 -0
  34. package/dist/components/loading-indicator.d.ts +2 -0
  35. package/dist/components/loading-indicator.js +12 -0
  36. package/dist/components/main-content-container.d.ts +2 -0
  37. package/dist/components/main-content-container.js +90 -0
  38. package/dist/components/markdown-editor/autolink-plugin.d.ts +2 -0
  39. package/dist/components/markdown-editor/autolink-plugin.js +29 -0
  40. package/dist/components/markdown-editor/editor-inline.d.ts +3 -0
  41. package/dist/components/markdown-editor/editor-inline.js +13 -0
  42. package/dist/components/markdown-editor/editor.d.ts +18 -0
  43. package/dist/components/markdown-editor/editor.js +143 -0
  44. package/dist/components/markdown-editor/markdown-plugin.d.ts +9 -0
  45. package/dist/components/markdown-editor/markdown-plugin.js +194 -0
  46. package/dist/components/markdown-editor/mention-node.d.ts +21 -0
  47. package/dist/components/markdown-editor/mention-node.js +160 -0
  48. package/dist/components/markdown-editor/mentions-plugin.d.ts +7 -0
  49. package/dist/components/markdown-editor/mentions-plugin.js +268 -0
  50. package/dist/components/markdown-editor/theme.d.ts +46 -0
  51. package/dist/components/markdown-editor/theme.js +48 -0
  52. package/dist/components/markdown-editor/toolbar.d.ts +10 -0
  53. package/dist/components/markdown-editor/toolbar.js +112 -0
  54. package/dist/components/markdown-with-mentions.d.ts +4 -0
  55. package/dist/components/markdown-with-mentions.js +140 -0
  56. package/dist/components/message-logs/message-logs.d.ts +6 -0
  57. package/dist/components/message-logs/message-logs.js +307 -0
  58. package/dist/components/messages/avatar.d.ts +10 -0
  59. package/dist/components/messages/avatar.js +65 -0
  60. package/dist/components/messages/channel-message-list.d.ts +14 -0
  61. package/dist/components/messages/channel-message-list.js +158 -0
  62. package/dist/components/messages/channel-view.d.ts +6 -0
  63. package/dist/components/messages/channel-view.js +82 -0
  64. package/dist/components/messages/message-compose.d.ts +11 -0
  65. package/dist/components/messages/message-compose.js +152 -0
  66. package/dist/components/messages/message-display.d.ts +10 -0
  67. package/dist/components/messages/message-display.js +152 -0
  68. package/dist/components/messages/thread-message-list.d.ts +11 -0
  69. package/dist/components/messages/thread-message-list.js +122 -0
  70. package/dist/components/messages/thread-view.d.ts +6 -0
  71. package/dist/components/messages/thread-view.js +174 -0
  72. package/dist/components/off-canvas.d.ts +13 -0
  73. package/dist/components/off-canvas.js +89 -0
  74. package/dist/components/router.d.ts +6 -0
  75. package/dist/components/router.js +240 -0
  76. package/dist/components/save-button.d.ts +13 -0
  77. package/dist/components/save-button.js +75 -0
  78. package/dist/components/sortable-list.d.ts +36 -0
  79. package/dist/components/sortable-list.js +77 -0
  80. package/dist/components/tabs.d.ts +11 -0
  81. package/dist/components/tabs.js +69 -0
  82. package/dist/components/text-list-editor.tsx/text-list-editor.d.ts +6 -0
  83. package/dist/components/text-list-editor.tsx/text-list-editor.js +13 -0
  84. package/dist/components/tooltip.d.ts +11 -0
  85. package/dist/components/tooltip.js +20 -0
  86. package/dist/components/top-bar.d.ts +2 -0
  87. package/dist/components/top-bar.js +51 -0
  88. package/dist/components/typeahead/mentions-plugin.d.ts +7 -0
  89. package/dist/components/typeahead/mentions-plugin.js +203 -0
  90. package/dist/components/typeahead/typeahead-editor.d.ts +15 -0
  91. package/dist/components/typeahead/typeahead-editor.js +134 -0
  92. package/dist/components/typeahead/typeahead.d.ts +12 -0
  93. package/dist/components/typeahead/typeahead.js +94 -0
  94. package/dist/components/typeahead.d.ts +22 -0
  95. package/dist/components/typeahead.js +270 -0
  96. package/dist/globals.d.ts +29 -0
  97. package/dist/globals.js +148 -0
  98. package/dist/hooks.d.ts +34 -0
  99. package/dist/hooks.js +137 -0
  100. package/dist/index.d.ts +4 -0
  101. package/dist/index.js +20 -0
  102. package/dist/layout-vars.d.ts +6 -0
  103. package/dist/layout-vars.js +10 -0
  104. package/dist/mention-configs.d.ts +18 -0
  105. package/dist/mention-configs.js +149 -0
  106. package/dist/screens/assistants/assistant-config.d.ts +5 -0
  107. package/dist/screens/assistants/assistant-config.js +52 -0
  108. package/dist/screens/assistants/assistant-details.d.ts +4 -0
  109. package/dist/screens/assistants/assistant-details.js +85 -0
  110. package/dist/screens/assistants/assistant-info.d.ts +6 -0
  111. package/dist/screens/assistants/assistant-info.js +28 -0
  112. package/dist/screens/assistants/assistant-list.d.ts +2 -0
  113. package/dist/screens/assistants/assistant-list.js +114 -0
  114. package/dist/screens/assistants/assistant-tools.d.ts +5 -0
  115. package/dist/screens/assistants/assistant-tools.js +38 -0
  116. package/dist/screens/contacts/contact-details.d.ts +6 -0
  117. package/dist/screens/contacts/contact-details.js +100 -0
  118. package/dist/screens/contacts/contact-list.d.ts +2 -0
  119. package/dist/screens/contacts/contact-list.js +213 -0
  120. package/dist/screens/contacts/index.d.ts +4 -0
  121. package/dist/screens/contacts/index.js +21 -0
  122. package/dist/screens/events/cron.d.ts +3 -0
  123. package/dist/screens/events/cron.js +77 -0
  124. package/dist/screens/events/event-details.d.ts +6 -0
  125. package/dist/screens/events/event-details.js +112 -0
  126. package/dist/screens/events/event-handlers.d.ts +7 -0
  127. package/dist/screens/events/event-handlers.js +84 -0
  128. package/dist/screens/events/event-info.d.ts +5 -0
  129. package/dist/screens/events/event-info.js +19 -0
  130. package/dist/screens/events/event-list.d.ts +2 -0
  131. package/dist/screens/events/event-list.js +107 -0
  132. package/dist/screens/events/event-schedule.d.ts +5 -0
  133. package/dist/screens/events/event-schedule.js +124 -0
  134. package/dist/screens/groups/group-details.d.ts +6 -0
  135. package/dist/screens/groups/group-details.js +218 -0
  136. package/dist/screens/groups/group-list.d.ts +2 -0
  137. package/dist/screens/groups/group-list.js +275 -0
  138. package/dist/screens/groups/group-members.d.ts +8 -0
  139. package/dist/screens/groups/group-members.js +315 -0
  140. package/dist/screens/groups/index.d.ts +6 -0
  141. package/dist/screens/groups/index.js +23 -0
  142. package/dist/screens/knowledge/knowledge-frame-details.bk.d.ts +6 -0
  143. package/dist/screens/knowledge/knowledge-frame-details.bk.js +84 -0
  144. package/dist/screens/knowledge/knowledge-frame-details.d.ts +8 -0
  145. package/dist/screens/knowledge/knowledge-frame-details.js +143 -0
  146. package/dist/screens/knowledge/knowledge-frame-list.d.ts +2 -0
  147. package/dist/screens/knowledge/knowledge-frame-list.js +45 -0
  148. package/dist/screens/knowledge/knowledge-value-details.d.ts +6 -0
  149. package/dist/screens/knowledge/knowledge-value-details.js +150 -0
  150. package/dist/screens/knowledge/knowledge-value-list-item.d.ts +5 -0
  151. package/dist/screens/knowledge/knowledge-value-list-item.js +39 -0
  152. package/dist/screens/knowledge/knowledge-value-list.d.ts +3 -0
  153. package/dist/screens/knowledge/knowledge-value-list.js +123 -0
  154. package/dist/screens/packages/package-details.d.ts +6 -0
  155. package/dist/screens/packages/package-details.js +82 -0
  156. package/dist/screens/packages/package-info.d.ts +5 -0
  157. package/dist/screens/packages/package-info.js +42 -0
  158. package/dist/screens/packages/package-list.d.ts +2 -0
  159. package/dist/screens/packages/package-list.js +182 -0
  160. package/dist/screens/packages/package-new-local.d.ts +2 -0
  161. package/dist/screens/packages/package-new-local.js +82 -0
  162. package/dist/screens/peer-types/peer-type-details.d.ts +10 -0
  163. package/dist/screens/peer-types/peer-type-details.js +126 -0
  164. package/dist/screens/peer-types/peer-type-list.d.ts +2 -0
  165. package/dist/screens/peer-types/peer-type-list.js +57 -0
  166. package/dist/screens/predicates/predicate-details.d.ts +6 -0
  167. package/dist/screens/predicates/predicate-details.js +103 -0
  168. package/dist/screens/predicates/predicate-list.d.ts +2 -0
  169. package/dist/screens/predicates/predicate-list.js +46 -0
  170. package/dist/screens/profile.d.ts +2 -0
  171. package/dist/screens/profile.js +66 -0
  172. package/dist/screens/search/global-search.d.ts +2 -0
  173. package/dist/screens/search/global-search.js +186 -0
  174. package/dist/screens/settings/color-mode-dropdown.d.ts +6 -0
  175. package/dist/screens/settings/color-mode-dropdown.js +63 -0
  176. package/dist/screens/settings/settings-page.d.ts +2 -0
  177. package/dist/screens/settings/settings-page.js +49 -0
  178. package/dist/screens/setup-user.d.ts +2 -0
  179. package/dist/screens/setup-user.js +270 -0
  180. package/dist/screens/tools/tool-code.d.ts +5 -0
  181. package/dist/screens/tools/tool-code.js +32 -0
  182. package/dist/screens/tools/tool-details.d.ts +6 -0
  183. package/dist/screens/tools/tool-details.js +68 -0
  184. package/dist/screens/tools/tool-info.d.ts +5 -0
  185. package/dist/screens/tools/tool-info.js +74 -0
  186. package/dist/screens/tools/tool-list.d.ts +2 -0
  187. package/dist/screens/tools/tool-list.js +123 -0
  188. package/dist/screens/tools/tool-schema.d.ts +5 -0
  189. package/dist/screens/tools/tool-schema.js +30 -0
  190. package/dist/screens/tools/tool-test-details.d.ts +4 -0
  191. package/dist/screens/tools/tool-test-details.js +54 -0
  192. package/dist/screens/tools/tool-test-list.d.ts +4 -0
  193. package/dist/screens/tools/tool-test-list.js +82 -0
  194. package/dist/screens/variables/variable-details.d.ts +6 -0
  195. package/dist/screens/variables/variable-details.js +140 -0
  196. package/dist/screens/variables/variable-list.d.ts +2 -0
  197. package/dist/screens/variables/variable-list.js +58 -0
  198. package/dist/screens/workflows/workflow-details.d.ts +6 -0
  199. package/dist/screens/workflows/workflow-details.js +122 -0
  200. package/dist/screens/workflows/workflow-info.d.ts +5 -0
  201. package/dist/screens/workflows/workflow-info.js +18 -0
  202. package/dist/screens/workflows/workflow-instructions.d.ts +5 -0
  203. package/dist/screens/workflows/workflow-instructions.js +118 -0
  204. package/dist/screens/workflows/workflow-list.d.ts +2 -0
  205. package/dist/screens/workflows/workflow-list.js +109 -0
  206. package/dist/screens/workflows/workflow-subscriptions.d.ts +6 -0
  207. package/dist/screens/workflows/workflow-subscriptions.js +81 -0
  208. package/dist/setupTests.d.ts +1 -0
  209. package/dist/setupTests.js +31 -0
  210. package/dist/system-apps/assistants.app.d.ts +2 -0
  211. package/dist/system-apps/assistants.app.js +8 -0
  212. package/dist/system-apps/contacts.app.d.ts +2 -0
  213. package/dist/system-apps/contacts.app.js +9 -0
  214. package/dist/system-apps/events.app.d.ts +2 -0
  215. package/dist/system-apps/events.app.js +8 -0
  216. package/dist/system-apps/groups.app.d.ts +2 -0
  217. package/dist/system-apps/groups.app.js +9 -0
  218. package/dist/system-apps/index.d.ts +19 -0
  219. package/dist/system-apps/index.js +90 -0
  220. package/dist/system-apps/knowledge-frames.app.d.ts +2 -0
  221. package/dist/system-apps/knowledge-frames.app.js +9 -0
  222. package/dist/system-apps/knowledge-values.app.d.ts +2 -0
  223. package/dist/system-apps/knowledge-values.app.js +9 -0
  224. package/dist/system-apps/packages.app.d.ts +2 -0
  225. package/dist/system-apps/packages.app.js +8 -0
  226. package/dist/system-apps/predicates.app.d.ts +2 -0
  227. package/dist/system-apps/predicates.app.js +8 -0
  228. package/dist/system-apps/profile.app.d.ts +2 -0
  229. package/dist/system-apps/profile.app.js +8 -0
  230. package/dist/system-apps/search.app.d.ts +2 -0
  231. package/dist/system-apps/search.app.js +9 -0
  232. package/dist/system-apps/settings.app.d.ts +2 -0
  233. package/dist/system-apps/settings.app.js +8 -0
  234. package/dist/system-apps/threads.app.d.ts +2 -0
  235. package/dist/system-apps/threads.app.js +8 -0
  236. package/dist/system-apps/tools.app.d.ts +2 -0
  237. package/dist/system-apps/tools.app.js +8 -0
  238. package/dist/system-apps/types.app.d.ts +2 -0
  239. package/dist/system-apps/types.app.js +8 -0
  240. package/dist/system-apps/variables.app.d.ts +2 -0
  241. package/dist/system-apps/variables.app.js +8 -0
  242. package/dist/system-apps/workflows.app.d.ts +2 -0
  243. package/dist/system-apps/workflows.app.js +8 -0
  244. package/dist/tabs-layout/tabs-layout.d.ts +5 -0
  245. package/dist/tabs-layout/tabs-layout.js +374 -0
  246. package/dist/tabs-layout/tabs-state.d.ts +26 -0
  247. package/dist/tabs-layout/tabs-state.js +239 -0
  248. package/dist/three-bar-layout/left-bar-content.d.ts +7 -0
  249. package/dist/three-bar-layout/left-bar-content.js +151 -0
  250. package/dist/three-bar-layout/right-bar-content.d.ts +2 -0
  251. package/dist/three-bar-layout/right-bar-content.js +64 -0
  252. package/dist/three-bar-layout/three-bar-layout.d.ts +5 -0
  253. package/dist/three-bar-layout/three-bar-layout.js +218 -0
  254. package/dist/ui-defaults/index.d.ts +2 -0
  255. package/dist/ui-defaults/index.js +4 -0
  256. package/dist/ui-defaults/list-screen.d.ts +6 -0
  257. package/dist/ui-defaults/list-screen.js +74 -0
  258. package/dist/ui-defaults/notes-editor.d.ts +7 -0
  259. package/dist/ui-defaults/notes-editor.js +41 -0
  260. package/dist/ui-router/routes-loader.d.ts +25 -0
  261. package/dist/ui-router/routes-loader.js +97 -0
  262. package/dist/ui-router/ui-loader.d.ts +18 -0
  263. package/dist/ui-router/ui-loader.js +481 -0
  264. package/dist/utils.d.ts +9 -0
  265. package/dist/utils.js +250 -0
  266. package/docs/conversation-tab.md +201 -0
  267. package/docs/getting-started.md +284 -0
  268. package/docs/knowledge.md +187 -0
  269. package/docs/tabs-ui.md +696 -0
  270. package/docs/user-contacts-ui.md +384 -0
  271. package/jest.config.js +25 -0
  272. package/package.json +109 -0
  273. package/src/app.tsx +59 -0
  274. package/src/command-palette/command-palette-ui.tsx +264 -0
  275. package/src/command-palette/command-palette.ts +364 -0
  276. package/src/components/checkbox.tsx +22 -0
  277. package/src/components/group-switcher.tsx +469 -0
  278. package/src/components/input-date.tsx +28 -0
  279. package/src/components/input-datetime.tsx +41 -0
  280. package/src/components/input-number.tsx +67 -0
  281. package/src/components/input.tsx +22 -0
  282. package/src/components/io-schema-values.tsx +122 -0
  283. package/src/components/io-schema.tsx +234 -0
  284. package/src/components/lazy-list.tsx +98 -0
  285. package/src/components/lazy-sortable-list.tsx +51 -0
  286. package/src/components/left-bar.tsx +264 -0
  287. package/src/components/list-screen.tsx +105 -0
  288. package/src/components/loading-indicator.tsx +9 -0
  289. package/src/components/main-content-container.tsx +76 -0
  290. package/src/components/markdown-editor/autolink-plugin.tsx +36 -0
  291. package/src/components/markdown-editor/editor-inline.tsx +10 -0
  292. package/src/components/markdown-editor/editor.tsx +152 -0
  293. package/src/components/markdown-editor/markdown-plugin.tsx +224 -0
  294. package/src/components/markdown-editor/mention-node.ts +199 -0
  295. package/src/components/markdown-editor/mentions-plugin.tsx +356 -0
  296. package/src/components/markdown-editor/theme.ts +47 -0
  297. package/src/components/markdown-editor/toolbar.tsx +263 -0
  298. package/src/components/markdown-with-mentions.tsx +183 -0
  299. package/src/components/message-logs/message-logs.tsx +406 -0
  300. package/src/components/messages/avatar.tsx +95 -0
  301. package/src/components/messages/channel-message-list.tsx +177 -0
  302. package/src/components/messages/channel-view.tsx +74 -0
  303. package/src/components/messages/message-compose.tsx +162 -0
  304. package/src/components/messages/message-display.tsx +217 -0
  305. package/src/components/messages/thread-message-list.tsx +126 -0
  306. package/src/components/messages/thread-view.tsx +214 -0
  307. package/src/components/off-canvas.tsx +83 -0
  308. package/src/components/router.tsx +224 -0
  309. package/src/components/save-button.tsx +109 -0
  310. package/src/components/sortable-list.tsx +102 -0
  311. package/src/components/tabs.tsx +70 -0
  312. package/src/components/text-list-editor.tsx/text-list-editor.tsx +13 -0
  313. package/src/components/tooltip.tsx +50 -0
  314. package/src/components/top-bar.tsx +119 -0
  315. package/src/components/typeahead/mentions-plugin.tsx +265 -0
  316. package/src/components/typeahead/typeahead-editor.tsx +140 -0
  317. package/src/components/typeahead/typeahead.tsx +77 -0
  318. package/src/components/typeahead.tsx +359 -0
  319. package/src/globals.tsx +162 -0
  320. package/src/hooks.ts +144 -0
  321. package/src/index.tsx +8 -0
  322. package/src/layout-vars.ts +8 -0
  323. package/src/mention-configs.ts +166 -0
  324. package/src/screens/assistants/assistant-config.tsx +80 -0
  325. package/src/screens/assistants/assistant-details.tsx +77 -0
  326. package/src/screens/assistants/assistant-info.tsx +45 -0
  327. package/src/screens/assistants/assistant-list.tsx +115 -0
  328. package/src/screens/assistants/assistant-tools.tsx +61 -0
  329. package/src/screens/contacts/contact-details.tsx +175 -0
  330. package/src/screens/contacts/contact-list.tsx +251 -0
  331. package/src/screens/contacts/index.ts +6 -0
  332. package/src/screens/events/cron.ts +74 -0
  333. package/src/screens/events/event-details.tsx +117 -0
  334. package/src/screens/events/event-handlers.tsx +61 -0
  335. package/src/screens/events/event-info.tsx +29 -0
  336. package/src/screens/events/event-list.tsx +104 -0
  337. package/src/screens/events/event-schedule.tsx +130 -0
  338. package/src/screens/groups/group-details.tsx +306 -0
  339. package/src/screens/groups/group-list.tsx +366 -0
  340. package/src/screens/groups/group-members.tsx +455 -0
  341. package/src/screens/groups/index.ts +9 -0
  342. package/src/screens/knowledge/knowledge-frame-details.bk.tsx +160 -0
  343. package/src/screens/knowledge/knowledge-frame-details.tsx +176 -0
  344. package/src/screens/knowledge/knowledge-frame-list.tsx +49 -0
  345. package/src/screens/knowledge/knowledge-value-details.tsx +181 -0
  346. package/src/screens/knowledge/knowledge-value-list-item.tsx +48 -0
  347. package/src/screens/knowledge/knowledge-value-list.tsx +131 -0
  348. package/src/screens/packages/package-details.tsx +117 -0
  349. package/src/screens/packages/package-info.tsx +83 -0
  350. package/src/screens/packages/package-list.tsx +191 -0
  351. package/src/screens/packages/package-new-local.tsx +93 -0
  352. package/src/screens/peer-types/peer-type-details.tsx +162 -0
  353. package/src/screens/peer-types/peer-type-list.tsx +74 -0
  354. package/src/screens/predicates/predicate-details.tsx +125 -0
  355. package/src/screens/predicates/predicate-list.tsx +50 -0
  356. package/src/screens/profile.tsx +68 -0
  357. package/src/screens/search/global-search.tsx +274 -0
  358. package/src/screens/settings/color-mode-dropdown.tsx +57 -0
  359. package/src/screens/settings/settings-page.tsx +76 -0
  360. package/src/screens/setup-user.tsx +367 -0
  361. package/src/screens/tools/tool-code.tsx +35 -0
  362. package/src/screens/tools/tool-details.tsx +101 -0
  363. package/src/screens/tools/tool-info.tsx +60 -0
  364. package/src/screens/tools/tool-list.tsx +121 -0
  365. package/src/screens/tools/tool-schema.tsx +42 -0
  366. package/src/screens/tools/tool-test-details.tsx +100 -0
  367. package/src/screens/tools/tool-test-list.tsx +74 -0
  368. package/src/screens/variables/variable-details.tsx +183 -0
  369. package/src/screens/variables/variable-list.tsx +74 -0
  370. package/src/screens/workflows/workflow-details.tsx +130 -0
  371. package/src/screens/workflows/workflow-info.tsx +29 -0
  372. package/src/screens/workflows/workflow-instructions.tsx +127 -0
  373. package/src/screens/workflows/workflow-list.tsx +107 -0
  374. package/src/screens/workflows/workflow-subscriptions.tsx +58 -0
  375. package/src/setupTests.ts +32 -0
  376. package/src/system-apps/assistants.app.ts +7 -0
  377. package/src/system-apps/contacts.app.ts +8 -0
  378. package/src/system-apps/events.app.ts +7 -0
  379. package/src/system-apps/groups.app.ts +8 -0
  380. package/src/system-apps/index.ts +79 -0
  381. package/src/system-apps/knowledge-frames.app.ts +8 -0
  382. package/src/system-apps/knowledge-values.app.ts +8 -0
  383. package/src/system-apps/packages.app.ts +7 -0
  384. package/src/system-apps/predicates.app.ts +7 -0
  385. package/src/system-apps/profile.app.ts +7 -0
  386. package/src/system-apps/search.app.ts +8 -0
  387. package/src/system-apps/settings.app.ts +7 -0
  388. package/src/system-apps/threads.app.ts +7 -0
  389. package/src/system-apps/tools.app.ts +7 -0
  390. package/src/system-apps/types.app.ts +7 -0
  391. package/src/system-apps/variables.app.ts +7 -0
  392. package/src/system-apps/workflows.app.ts +7 -0
  393. package/src/tabs-layout/tabs-layout.tsx +672 -0
  394. package/src/tabs-layout/tabs-state.ts +269 -0
  395. package/src/three-bar-layout/left-bar-content.tsx +202 -0
  396. package/src/three-bar-layout/right-bar-content.tsx +67 -0
  397. package/src/three-bar-layout/three-bar-layout.tsx +297 -0
  398. package/src/ui-defaults/index.ts +3 -0
  399. package/src/ui-defaults/list-screen.tsx +92 -0
  400. package/src/ui-defaults/notes-editor.tsx +51 -0
  401. package/src/ui-router/routes-loader.ts +98 -0
  402. package/src/ui-router/ui-loader.tsx +497 -0
  403. package/src/utils.ts +266 -0
  404. package/tsconfig.json +24 -0
@@ -0,0 +1,497 @@
1
+ import { debounceByArgs, IPackage, IPeersPackageUIs, IPeersUI, IPeersUIRoute, newid, Packages, rpcServerCalls, toJSON, UIContext, zodAnyObject } from "@peers-app/peers-sdk";
2
+ import { orderBy } from "lodash";
3
+ import React, { Component, useEffect } from "react";
4
+ import { LoadingIndicator } from "../components/loading-indicator";
5
+ import { mainContentPath, packageReloaded } from "../globals";
6
+ import { useObservable } from "../hooks";
7
+ import "../ui-defaults";
8
+ import { allPackages } from "./routes-loader";
9
+
10
+ const peersUIs: { [key: string]: IPeersUI } = {};
11
+
12
+ interface ErrorBoundaryState {
13
+ hasError: boolean;
14
+ error: Error | null;
15
+ errorInfo: React.ErrorInfo | null;
16
+ }
17
+
18
+ interface ErrorBoundaryProps {
19
+ peersUIId?: string;
20
+ packageName?: string;
21
+ componentName?: string;
22
+ children: React.ReactNode;
23
+ }
24
+
25
+ class UIErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {
26
+ constructor(props: ErrorBoundaryProps) {
27
+ super(props);
28
+ this.state = { hasError: false, error: null, errorInfo: null };
29
+ }
30
+
31
+ static getDerivedStateFromError(error: Error): ErrorBoundaryState {
32
+ return { hasError: true, error, errorInfo: null };
33
+ }
34
+
35
+ componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
36
+ console.error('UIErrorBoundary caught an error:', error, errorInfo);
37
+ this.setState({
38
+ error,
39
+ errorInfo,
40
+ });
41
+ }
42
+
43
+ render() {
44
+ if (this.state.hasError) {
45
+ const { peersUIId, packageName, componentName } = this.props;
46
+ const { error, errorInfo } = this.state;
47
+
48
+ return (
49
+ <div style={{
50
+ padding: '20px',
51
+ border: '2px solid #ff6b6b',
52
+ borderRadius: '8px',
53
+ backgroundColor: '#fff5f5',
54
+ color: '#721c24',
55
+ fontFamily: 'monospace',
56
+ margin: '10px 0'
57
+ }}>
58
+ <h3 style={{ color: '#c53030', marginTop: 0 }}>UI Component Error</h3>
59
+ <div style={{ marginBottom: '15px' }}>
60
+ {peersUIId && <div><strong>Peers UI ID:</strong> {peersUIId}</div>}
61
+ {packageName && <div><strong>Package:</strong> {packageName}</div>}
62
+ {componentName && <div><strong>Component:</strong> {componentName}</div>}
63
+ </div>
64
+
65
+ <details style={{ marginBottom: '15px' }}>
66
+ <summary style={{ cursor: 'pointer', fontWeight: 'bold', marginBottom: '10px' }}>
67
+ Error Details
68
+ </summary>
69
+ <div style={{
70
+ backgroundColor: '#fed7d7',
71
+ padding: '10px',
72
+ borderRadius: '4px',
73
+ whiteSpace: 'pre-wrap',
74
+ overflow: 'auto',
75
+ maxHeight: '200px'
76
+ }}>
77
+ <strong>Error:</strong> {error?.message || 'Unknown error'}
78
+ {error?.stack && (
79
+ <>
80
+ <br /><br />
81
+ <strong>Stack Trace:</strong><br />
82
+ {error.stack}
83
+ </>
84
+ )}
85
+ </div>
86
+ </details>
87
+
88
+ {errorInfo && (
89
+ <details>
90
+ <summary style={{ cursor: 'pointer', fontWeight: 'bold', marginBottom: '10px' }}>
91
+ Component Stack
92
+ </summary>
93
+ <div style={{
94
+ backgroundColor: '#fed7d7',
95
+ padding: '10px',
96
+ borderRadius: '4px',
97
+ whiteSpace: 'pre-wrap',
98
+ overflow: 'auto',
99
+ maxHeight: '200px'
100
+ }}>
101
+ {errorInfo.componentStack}
102
+ </div>
103
+ </details>
104
+ )}
105
+
106
+ <button
107
+ onClick={() => this.setState({ hasError: false, error: null, errorInfo: null })}
108
+ style={{
109
+ marginTop: '15px',
110
+ padding: '8px 16px',
111
+ backgroundColor: '#c53030',
112
+ color: 'white',
113
+ border: 'none',
114
+ borderRadius: '4px',
115
+ cursor: 'pointer'
116
+ }}
117
+ >
118
+ Try Again
119
+ </button>
120
+ </div>
121
+ );
122
+ }
123
+
124
+ return this.props.children;
125
+ }
126
+ }
127
+
128
+ interface IProps extends UIContext {
129
+ props: Record<string, any>;
130
+ }
131
+
132
+ export const UIRouter = (props: IProps) => {
133
+ let matchingRoute: IPeersUIRoute | undefined;
134
+ const allRoutes = _window.getPeersUIRoutes() as IPeersUIRoute[];
135
+ const filteredRoutes = allRoutes.filter(r => {
136
+ if (props.uiEditMode && props.uiEditMode !== '*' && r.uiEditMode !== '*' && r.uiEditMode !== props.uiEditMode) return false;
137
+ if (props.uiCategory && props.uiCategory !== '*' && r.uiCategory !== '*' && r.uiCategory !== props.uiCategory) return false;
138
+ if (props.uiSubcategory && props.uiSubcategory !== '*' && r.uiSubcategory !== '*' && r.uiSubcategory !== props.uiSubcategory) return false;
139
+ return true;
140
+ });
141
+
142
+ const context: UIContext & { path: string } = {
143
+ ...props,
144
+ path: props.path || mainContentPath(),
145
+ }
146
+ for (const route of filteredRoutes) {
147
+ // if (route.path && !context.path.startsWith(route.path)) continue;
148
+
149
+ // <todo> test this
150
+ if (route.path) {
151
+ // since `isMatch` can already be used to match the path, this might be overkill
152
+ // but if you just need a simple regex match this makes it nice instead of having to declare a whole function
153
+ const match = route.path.match(/^\/(.+)\/([gimsuy]{0,6})$/);
154
+ if (match) {
155
+ const [, pattern, flags] = match;
156
+ try {
157
+ const regex = new RegExp(pattern, flags);
158
+ if (!regex.test(context.path)) continue;
159
+ } catch {
160
+ // Invalid regex → treat as plain prefix
161
+ if (!context.path.startsWith(route.path)) continue;
162
+ }
163
+ } else {
164
+ // TODO treating path as a prefix is confusing.
165
+ // Now that we have regex matching, we should treat it as exact match if it's not a regex
166
+ if (!context.path.startsWith(route.path)) continue;
167
+ }
168
+ }
169
+ // </todo>
170
+
171
+ if (!route.propsSchema || route.propsSchema.safeParse(props.props).success) {
172
+ if (!route.isMatch || route.isMatch(props.props, context)) {
173
+ matchingRoute = route;
174
+ break;
175
+ }
176
+ }
177
+ }
178
+
179
+ if (!matchingRoute) {
180
+ return undefined;
181
+ }
182
+
183
+ return UILoader({ peersUIId: matchingRoute.peersUIId, props: props.props });
184
+ }
185
+
186
+ const UILoader = (args: { peersUIId: string, props: Record<string, any> }) => {
187
+ const { props, peersUIId } = args;
188
+ const [lastReloadTime] = useObservable(packageReloaded);
189
+ args.props.__lastPackageReload = lastReloadTime;
190
+ // check if peersUIId maps to an in-memory react component
191
+ const peersUI = peersUIs[peersUIId];
192
+ if (peersUI?.content) {
193
+ const parseResult = peersUI.propsSchema.safeParse(props);
194
+ if (!parseResult.success) {
195
+ console.error('props did not match schema', { props, schema: peersUI.propsSchema, errors: parseResult.error });
196
+ return (
197
+ <div>
198
+ <pre>
199
+ Peers UI could not be loaded <br />
200
+ peersUIId: {peersUI.peersUIId} <br />
201
+ Component name: {peersUI.content?.name} <br />
202
+ Props did not match schema <br />
203
+ Errors: {JSON.stringify(parseResult.error, null, 2)} <br /><br />
204
+ Props {JSON.stringify(toJSON(props), null, 2)}<br />
205
+ </pre>
206
+ </div>
207
+ );
208
+ }
209
+ const Component = peersUI.content as React.ComponentType<any>;
210
+ return (
211
+ <UIErrorBoundary
212
+ peersUIId={peersUIId}
213
+ componentName={peersUI.content?.name}
214
+ >
215
+ <Component {...args.props} />
216
+ </UIErrorBoundary>
217
+ );
218
+ }
219
+
220
+ return <UIAsyncLoader {...args} />;
221
+ }
222
+
223
+ const uiLoadingPromises: Record<string, Promise<any>> = {};
224
+ function loadUIBundle(pkg: IPackage, forceRefresh?: boolean) {
225
+ // Dynamically import the bundle
226
+ let importPromise: Promise<any> = uiLoadingPromises[pkg.packageId];
227
+ if (!importPromise || forceRefresh) {
228
+ console.log(`loading ui bundle for ${pkg.name}`);
229
+ importPromise = new Promise<void>(async (resolve, reject) => {
230
+ try {
231
+ let bundleCode = '';
232
+ if (pkg.uiBundleFileId) {
233
+ bundleCode = await rpcServerCalls.getFileContents(pkg.uiBundleFileId);
234
+ }
235
+ if (bundleCode) {
236
+ const exportUIs = (peerUIs: IPeersPackageUIs) => {
237
+ // TODO maybe add packageId that this came from
238
+ peerUIs?.uis?.forEach(ui => {
239
+ peersUIs[ui.peersUIId] = ui;
240
+ });
241
+ }
242
+ const bundleFunction = new Function('exportUIs', bundleCode);
243
+ await bundleFunction(exportUIs);
244
+ }
245
+ resolve();
246
+ } catch (err) {
247
+ console.error(`Error while loading ui module for ${pkg.name}`, err);
248
+ reject(err);
249
+ }
250
+ });
251
+ uiLoadingPromises[pkg.packageId] = importPromise;
252
+ }
253
+ return importPromise;
254
+ }
255
+
256
+ const UIAsyncLoader = (props: { peersUIId: string, props: Record<string, any> }) => {
257
+ const { peersUIId } = props;
258
+ const [loaded, setLoaded] = React.useState(false);
259
+ const [loadError, setLoadError] = React.useState<Error | null>(null);
260
+
261
+ const allRoutes = _window.getPeersUIRoutes() as IPeersUIRoute[];
262
+ const uiPackageId = allRoutes.find(r => r.peersUIId === peersUIId)?.packageId;
263
+
264
+ useObservable(allPackages);
265
+ const pkg = allPackages().find(p => p.packageId === uiPackageId);
266
+
267
+ useEffect(() => {
268
+ if (!pkg) return;
269
+ setLoadError(null);
270
+ loadUIBundle(pkg)
271
+ .then(() => setLoaded(true))
272
+ .catch((error) => {
273
+ console.error(`Failed to load UI bundle for package ${pkg.name}:`, error);
274
+ setLoadError(error);
275
+ });
276
+ }, [pkg?.packageId]);
277
+
278
+ if (!pkg) {
279
+ return <div>Could not find package that owns peersUIId {peersUIId}</div>;
280
+ }
281
+
282
+ if (loadError) {
283
+ return (
284
+ <div style={{
285
+ padding: '20px',
286
+ border: '2px solid #ff6b6b',
287
+ borderRadius: '8px',
288
+ backgroundColor: '#fff5f5',
289
+ color: '#721c24',
290
+ fontFamily: 'monospace',
291
+ margin: '10px 0'
292
+ }}>
293
+ <h3 style={{ color: '#c53030', marginTop: 0 }}>Bundle Loading Error</h3>
294
+ <div style={{ marginBottom: '15px' }}>
295
+ <div><strong>Peers UI ID:</strong> {peersUIId}</div>
296
+ <div><strong>Package:</strong> {pkg.name}</div>
297
+ <div><strong>Package ID:</strong> {pkg.packageId}</div>
298
+ </div>
299
+
300
+ <details style={{ marginBottom: '15px' }}>
301
+ <summary style={{ cursor: 'pointer', fontWeight: 'bold', marginBottom: '10px' }}>
302
+ Error Details
303
+ </summary>
304
+ <div style={{
305
+ backgroundColor: '#fed7d7',
306
+ padding: '10px',
307
+ borderRadius: '4px',
308
+ whiteSpace: 'pre-wrap',
309
+ overflow: 'auto',
310
+ maxHeight: '200px'
311
+ }}>
312
+ <strong>Error:</strong> {loadError.message || 'Unknown error'}
313
+ {loadError.stack && (
314
+ <>
315
+ <br /><br />
316
+ <strong>Stack Trace:</strong><br />
317
+ {loadError.stack}
318
+ </>
319
+ )}
320
+ </div>
321
+ </details>
322
+
323
+ <button
324
+ onClick={() => {
325
+ setLoadError(null);
326
+ setLoaded(false);
327
+ if (pkg) {
328
+ loadUIBundle(pkg, true)
329
+ .then(() => setLoaded(true))
330
+ .catch(setLoadError);
331
+ }
332
+ }}
333
+ style={{
334
+ marginTop: '15px',
335
+ padding: '8px 16px',
336
+ backgroundColor: '#c53030',
337
+ color: 'white',
338
+ border: 'none',
339
+ borderRadius: '4px',
340
+ cursor: 'pointer'
341
+ }}
342
+ >
343
+ Retry Loading
344
+ </button>
345
+ </div>
346
+ );
347
+ }
348
+
349
+ if (!loaded) {
350
+ return (<LoadingIndicator />);
351
+ }
352
+
353
+ const peersUI = peersUIs[peersUIId];
354
+ if (peersUI?.content) {
355
+ const _props = { ...props, uiVar: undefined };
356
+ try {
357
+ peersUI.propsSchema.parse(_props);
358
+ const Component = peersUI.content as React.ComponentType<any>;
359
+ return (
360
+ <UIErrorBoundary
361
+ peersUIId={peersUIId}
362
+ packageName={pkg.name}
363
+ componentName={peersUI.content?.name}
364
+ >
365
+ <Component {..._props} />
366
+ </UIErrorBoundary>
367
+ );
368
+ } catch (parseError) {
369
+ return (
370
+ <div style={{
371
+ padding: '20px',
372
+ border: '2px solid #ff6b6b',
373
+ borderRadius: '8px',
374
+ backgroundColor: '#fff5f5',
375
+ color: '#721c24',
376
+ fontFamily: 'monospace',
377
+ margin: '10px 0'
378
+ }}>
379
+ <h3 style={{ color: '#c53030', marginTop: 0 }}>Props Validation Error</h3>
380
+ <div style={{ marginBottom: '15px' }}>
381
+ <div><strong>Peers UI ID:</strong> {peersUIId}</div>
382
+ <div><strong>Package:</strong> {pkg.name}</div>
383
+ <div><strong>Component:</strong> {peersUI.content?.name}</div>
384
+ </div>
385
+
386
+ <div style={{
387
+ backgroundColor: '#fed7d7',
388
+ padding: '10px',
389
+ borderRadius: '4px',
390
+ whiteSpace: 'pre-wrap',
391
+ overflow: 'auto',
392
+ maxHeight: '200px',
393
+ marginBottom: '15px'
394
+ }}>
395
+ <strong>Error:</strong> Props did not match schema<br />
396
+ <strong>Validation Error:</strong> {JSON.stringify(parseError, null, 2)}<br /><br />
397
+ <strong>Props:</strong> {JSON.stringify(toJSON(_props), null, 2)}
398
+ </div>
399
+ </div>
400
+ );
401
+ }
402
+ } else {
403
+ return <div>Component not found</div>;
404
+ }
405
+ }
406
+
407
+ let _window: {
408
+ registerPeersUIRoute: (route: IPeersUIRoute) => Promise<void>,
409
+ getPeersUIRoutes: () => IPeersUIRoute[],
410
+ UIRouter: typeof UIRouter,
411
+ UILoader: typeof UILoader,
412
+ };
413
+
414
+ if (typeof window !== 'undefined') {
415
+ _window = window as any;
416
+ if (!_window.registerPeersUIRoute) {
417
+ let uiRoutes: IPeersUIRoute[] = [];
418
+ Object.defineProperty(window, 'registerPeersUIRoute', {
419
+ value: (route: IPeersUIRoute) => {
420
+ uiRoutes = uiRoutes.filter(r => !(r.peersUIId === route.peersUIId));
421
+ uiRoutes.push(route);
422
+ uiRoutes = orderBy(uiRoutes, r => r.priority ?? 0, 'desc');
423
+ },
424
+ writable: false,
425
+ configurable: false
426
+ });
427
+ Object.defineProperty(window, 'getPeersUIRoutes', {
428
+ value: () => {
429
+ return [...uiRoutes];
430
+ },
431
+ writable: false,
432
+ configurable: false
433
+ });
434
+ Object.defineProperty(window, 'UIRouter', {
435
+ value: UIRouter,
436
+ writable: false,
437
+ configurable: false
438
+ });
439
+ Object.defineProperty(window, 'UILoader', {
440
+ value: UILoader,
441
+ writable: false,
442
+ configurable: false
443
+ });
444
+ }
445
+ }
446
+
447
+ const reloadPackage = debounceByArgs(async (packageId: string) => {
448
+ const pkg = await Packages().get(packageId);
449
+ if (pkg) {
450
+ await loadUIBundle(pkg, true);
451
+ console.log(`reloaded UI bundle for ${pkg.name}`);
452
+ packageReloaded(Date.now());
453
+ }
454
+ }, 200);
455
+
456
+ Packages().dataChanged.subscribe(async evt => {
457
+ const pkg = evt.dataObject;
458
+ const loadingPromise = uiLoadingPromises[pkg.packageId];
459
+ if (!loadingPromise) return;
460
+ reloadPackage(pkg.packageId);
461
+ })
462
+
463
+ export const peersSystemPackageId = '000peers0system000package';
464
+
465
+ /**
466
+ * This is meant to make it easy to register components that are internal to peers
467
+ */
468
+ export async function registerInternalPeersUI(props: {
469
+ component: React.ComponentType<any>,
470
+ propsSchema?: any,
471
+ routes?: Omit<IPeersUIRoute, 'peersUIId' | 'packageId'>[];
472
+ peersUIId?: string;
473
+ }) {
474
+ while (!(window as any).registerPeersUIRoute) {
475
+ console.log("Waiting for registerPeersUIRoute to be defined on the window object");
476
+ await new Promise((resolve) => setTimeout(resolve, 20));
477
+ }
478
+ const peersUIId = props.peersUIId || newid();
479
+
480
+ const peersUI: IPeersUI = {
481
+ peersUIId,
482
+ content: props.component,
483
+ propsSchema: props.propsSchema || zodAnyObject,
484
+ };
485
+ peersUIs[peersUIId] = peersUI;
486
+
487
+ if (props.routes?.length) {
488
+ props.routes.forEach(route => {
489
+ _window.registerPeersUIRoute({
490
+ packageId: peersSystemPackageId,
491
+ peersUIId,
492
+ propsSchema: props.propsSchema,
493
+ ...route,
494
+ });
495
+ });
496
+ }
497
+ }