@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,384 @@
1
+ # Contacts System App - Implementation Plan
2
+
3
+ ## Overview
4
+
5
+ The Contacts system app provides a unified interface for managing and viewing all users that the current user knows about, aggregated from both their personal database and all group databases they're a member of.
6
+
7
+ ## Key Features
8
+
9
+ ### **📋 Unified User Directory**
10
+ - **Personal Contacts**: Users stored in the user's personal `Users` table
11
+ - **Group Contacts**: Users discovered from `Users` tables across all joined groups
12
+ - **Deduplication**: Each user appears only once, prioritizing personal contacts over group contacts
13
+ - **Efficient Loading**: Cursor-based lazy loading to handle thousands of users
14
+
15
+ ### **🔍 Smart Aggregation Strategy**
16
+ 1. **Primary Source**: Load users from personal `Users` table first
17
+ 2. **Secondary Sources**: Load users from group `Users` tables
18
+ 3. **Deduplication Logic**: Skip users already shown from personal context
19
+ 4. **Visual Separation**: Horizontal divider between personal and group-discovered users
20
+
21
+ ## System App Definition
22
+
23
+ ### **App Registration**
24
+ ```typescript
25
+ // src/system-apps/contacts.app.ts
26
+ export const contactsApp: IAppNav = {
27
+ name: 'Contacts',
28
+ displayName: 'Contacts',
29
+ iconClassName: 'bi-person-fill-check',
30
+ navigationPath: 'contacts'
31
+ };
32
+ ```
33
+
34
+ ### **Integration**
35
+ - Add to `systemApps` array in Core Management Apps section
36
+ - Register routes using modern `registerInternalPeersUI` system
37
+
38
+ ## UI Architecture
39
+
40
+ ### **Component Structure**
41
+ ```
42
+ src/screens/contacts/
43
+ ├── index.ts # Component imports and exports
44
+ ├── contact-list.tsx # Main list screen with lazy loading
45
+ └── contact-details.tsx # Individual contact profile view (future)
46
+ ```
47
+
48
+ ### **List Screen Design**
49
+ ```typescript
50
+ // Main component structure
51
+ export const ContactList = () => {
52
+ return (
53
+ <div className="container-fluid p-3">
54
+ <div className="d-flex justify-content-between align-items-center mb-3">
55
+ <h4>
56
+ <i className="bi-person-fill-check me-2" />
57
+ Contacts
58
+ </h4>
59
+ <UserStats />
60
+ </div>
61
+
62
+ <SearchAndFilter />
63
+ <LazyUserList />
64
+ </div>
65
+ );
66
+ };
67
+ ```
68
+
69
+ ## Data Loading Strategy
70
+
71
+ ### **Cursor-Based Lazy Loading**
72
+ Using `LazyScrollableList` component (following existing patterns):
73
+
74
+ ```typescript
75
+ // Load personal users first
76
+ const personalUsersLoader = async (cursor?: string, limit = 50) => {
77
+ const userContext = await getUserContext();
78
+ const personalUsersTable = Users(userContext.userDataContext);
79
+
80
+ return await personalUsersTable.list({
81
+ // Exclude current user
82
+ userId: { $ne: userContext.userId() }
83
+ }, {
84
+ cursor,
85
+ limit,
86
+ sortBy: ['name']
87
+ });
88
+ };
89
+
90
+ // Load group users after personal users exhausted
91
+ const groupUsersLoader = async (cursor?: string, limit = 50) => {
92
+ const userContext = await getUserContext();
93
+ const groups = await Groups(userContext.userDataContext).list({});
94
+
95
+ // Aggregate users from all group contexts
96
+ const allGroupUsers = [];
97
+ for (const group of groups) {
98
+ const groupDataContext = userContext.getDataContext(group.groupId);
99
+ const groupUsersTable = Users(groupDataContext);
100
+ const groupUsers = await groupUsersTable.list({}, { cursor, limit });
101
+ allGroupUsers.push(...groupUsers.map(u => ({ ...u, sourceGroupId: group.groupId })));
102
+ }
103
+
104
+ return deduplicateUsers(allGroupUsers);
105
+ };
106
+ ```
107
+
108
+ ### **Deduplication Logic**
109
+ ```typescript
110
+ interface UserWithSource extends IUser {
111
+ sourceType: 'personal' | 'group';
112
+ sourceGroupId?: string;
113
+ sourceGroupName?: string;
114
+ }
115
+
116
+ const deduplicateUsers = (users: IUser[], seenUserIds: Set<string>) => {
117
+ return users.filter(user => {
118
+ if (seenUserIds.has(user.userId)) {
119
+ return false; // Skip already seen users
120
+ }
121
+ seenUserIds.add(user.userId);
122
+ return true;
123
+ });
124
+ };
125
+ ```
126
+
127
+ ## UI Components
128
+
129
+ ### **UserCard Component**
130
+ ```typescript
131
+ interface UserCardProps {
132
+ user: UserWithSource;
133
+ isCurrentUser: boolean;
134
+ onViewDetails?: (userId: string) => void;
135
+ }
136
+
137
+ const UserCard = ({ user, isCurrentUser }: UserCardProps) => (
138
+ <div className="list-group-item d-flex align-items-center justify-content-between">
139
+ <div className="d-flex align-items-center">
140
+ <i className="bi-person-circle me-3" style={{ fontSize: '32px' }} />
141
+ <div>
142
+ <strong>
143
+ {user.name}
144
+ {isCurrentUser && ' (You)'}
145
+ </strong>
146
+ <div className="d-flex align-items-center">
147
+ <small className="text-muted">{user.userId}</small>
148
+ {user.sourceType === 'group' && (
149
+ <>
150
+ <span className="mx-1">•</span>
151
+ <small className="text-primary">
152
+ From: {user.sourceGroupName}
153
+ </small>
154
+ </>
155
+ )}
156
+ </div>
157
+ </div>
158
+ </div>
159
+
160
+ <div className="d-flex align-items-center">
161
+ {user.trustLevel && (
162
+ <TrustLevelBadge level={user.trustLevel} />
163
+ )}
164
+ <button className="btn btn-outline-primary btn-sm ms-2">
165
+ View Details
166
+ </button>
167
+ </div>
168
+ </div>
169
+ );
170
+ ```
171
+
172
+ ### **Section Headers**
173
+ ```typescript
174
+ const SectionHeader = ({ title, icon, count }: SectionHeaderProps) => (
175
+ <div className="d-flex align-items-center justify-content-between mb-3 mt-4">
176
+ <h6 className="mb-0">
177
+ <i className={`${icon} me-2`} />
178
+ {title}
179
+ </h6>
180
+ <span className="badge bg-secondary">{count}</span>
181
+ </div>
182
+ );
183
+
184
+ // Usage
185
+ <SectionHeader
186
+ title="Personal Contacts"
187
+ icon="bi-person-fill"
188
+ count={personalUsers.length}
189
+ />
190
+
191
+ <hr className="my-4" /> {/* Separator */}
192
+
193
+ <SectionHeader
194
+ title="Group Contacts"
195
+ icon="bi-people-fill"
196
+ count={groupUsers.length}
197
+ />
198
+ ```
199
+
200
+ ## Performance Optimizations
201
+
202
+ ### **Lazy Loading Implementation**
203
+ ```typescript
204
+ const LazyUserList = () => {
205
+ const [personalUsersComplete, setPersonalUsersComplete] = useState(false);
206
+ const [seenUserIds] = useState(new Set<string>());
207
+
208
+ return (
209
+ <div>
210
+ {/* Personal Users Section */}
211
+ <LazyScrollableList
212
+ loader={personalUsersLoader}
213
+ renderItem={(user) => (
214
+ <UserCard
215
+ user={{ ...user, sourceType: 'personal' }}
216
+ isCurrentUser={user.userId === currentUserId}
217
+ />
218
+ )}
219
+ onComplete={() => setPersonalUsersComplete(true)}
220
+ onUserLoad={(user) => seenUserIds.add(user.userId)}
221
+ />
222
+
223
+ {/* Separator when personal users complete */}
224
+ {personalUsersComplete && (
225
+ <>
226
+ <hr className="my-4" />
227
+ <SectionHeader title="Group Contacts" icon="bi-people-fill" />
228
+ </>
229
+ )}
230
+
231
+ {/* Group Users Section */}
232
+ {personalUsersComplete && (
233
+ <LazyScrollableList
234
+ loader={(cursor, limit) => groupUsersLoader(cursor, limit, seenUserIds)}
235
+ renderItem={(user) => (
236
+ <UserCard
237
+ user={{ ...user, sourceType: 'group' }}
238
+ isCurrentUser={user.userId === currentUserId}
239
+ />
240
+ )}
241
+ />
242
+ )}
243
+ </div>
244
+ );
245
+ };
246
+ ```
247
+
248
+ ### **Search and Filtering**
249
+ ```typescript
250
+ const SearchAndFilter = ({ onFilter }: SearchAndFilterProps) => {
251
+ const [searchTerm, setSearchTerm] = useState('');
252
+ const [sourceFilter, setSourceFilter] = useState<'all' | 'personal' | 'group'>('all');
253
+
254
+ return (
255
+ <div className="row g-2 mb-4">
256
+ <div className="col-md-8">
257
+ <div className="position-relative">
258
+ <i className="bi-search position-absolute" style={{ left: '12px', top: '50%', transform: 'translateY(-50%)' }} />
259
+ <input
260
+ type="text"
261
+ className="form-control"
262
+ placeholder="Search contacts by name or ID..."
263
+ value={searchTerm}
264
+ onChange={(e) => setSearchTerm(e.target.value)}
265
+ style={{ paddingLeft: '40px' }}
266
+ />
267
+ </div>
268
+ </div>
269
+ <div className="col-md-4">
270
+ <select
271
+ className="form-select"
272
+ value={sourceFilter}
273
+ onChange={(e) => setSourceFilter(e.target.value as any)}
274
+ >
275
+ <option value="all">All Contacts</option>
276
+ <option value="personal">Personal Only</option>
277
+ <option value="group">Group Only</option>
278
+ </select>
279
+ </div>
280
+ </div>
281
+ );
282
+ };
283
+ ```
284
+
285
+ ## User Statistics
286
+
287
+ ### **Summary Component**
288
+ ```typescript
289
+ const UserStats = () => {
290
+ const stats = usePromise(async () => {
291
+ const userContext = await getUserContext();
292
+
293
+ const personalCount = await Users(userContext.userDataContext).count({
294
+ userId: { $ne: userContext.userId() }
295
+ });
296
+
297
+ const groups = await Groups(userContext.userDataContext).list({});
298
+ let groupUsersCount = 0;
299
+ const uniqueGroupUsers = new Set<string>();
300
+
301
+ for (const group of groups) {
302
+ const groupDataContext = userContext.getDataContext(group.groupId);
303
+ const groupUsers = await Users(groupDataContext).list({});
304
+ groupUsers.forEach(u => uniqueGroupUsers.add(u.userId));
305
+ }
306
+
307
+ return {
308
+ personalContacts: personalCount,
309
+ groupContacts: uniqueGroupUsers.size,
310
+ totalGroups: groups.length
311
+ };
312
+ });
313
+
314
+ if (!stats) return null;
315
+
316
+ return (
317
+ <div className="d-flex gap-3">
318
+ <span className="badge bg-primary">{stats.personalContacts} Personal</span>
319
+ <span className="badge bg-secondary">{stats.groupContacts} From Groups</span>
320
+ <span className="badge bg-info">{stats.totalGroups} Groups</span>
321
+ </div>
322
+ );
323
+ };
324
+ ```
325
+
326
+ ## Trust Level Integration
327
+
328
+ ### **Trust Level Badge**
329
+ ```typescript
330
+ const TrustLevelBadge = ({ level }: { level: TrustLevel }) => {
331
+ const config = {
332
+ [TrustLevel.Trusted]: { color: 'success', icon: 'bi-shield-check', text: 'Trusted' },
333
+ [TrustLevel.Unknown]: { color: 'warning', icon: 'bi-shield-exclamation', text: 'Unknown' },
334
+ [TrustLevel.Blocked]: { color: 'danger', icon: 'bi-shield-x', text: 'Blocked' }
335
+ }[level];
336
+
337
+ return (
338
+ <span className={`badge bg-${config.color} d-flex align-items-center gap-1`}>
339
+ <i className={config.icon} />
340
+ {config.text}
341
+ </span>
342
+ );
343
+ };
344
+ ```
345
+
346
+ ## Future Enhancements
347
+
348
+ ### **Phase 2 Features**
349
+ - **Contact Details View**: Comprehensive user profiles with interaction history
350
+ - **Trust Level Management**: Update trust levels and manage blocked users
351
+ - **Contact Actions**: Message, invite to groups, share contacts
352
+ - **Advanced Search**: Filter by trust level, group membership, recent activity
353
+
354
+ ### **Phase 3 Features**
355
+ - **Contact Import/Export**: Sync with external contact systems
356
+ - **Relationship Mapping**: Visualize user connections across groups
357
+ - **Activity Tracking**: Show recent interactions and shared content
358
+ - **Bulk Operations**: Manage multiple contacts simultaneously
359
+
360
+ ## Implementation Checklist
361
+
362
+ ### **Core Implementation**
363
+ - [ ] Create `contacts.app.ts` system app definition
364
+ - [ ] Add to systemApps array and router integration
365
+ - [ ] Implement `ContactList` component with lazy loading
366
+ - [ ] Create `UserCard` component with source attribution
367
+ - [ ] Implement cursor-based loading for personal users
368
+ - [ ] Implement cursor-based loading for group users
369
+ - [ ] Add deduplication logic with Set-based tracking
370
+
371
+ ### **UI Polish**
372
+ - [ ] Add search and filtering functionality
373
+ - [ ] Implement user statistics summary
374
+ - [ ] Add section headers and visual separators
375
+ - [ ] Integrate trust level badges
376
+ - [ ] Add responsive design for mobile
377
+
378
+ ### **Performance**
379
+ - [ ] Implement lazy scrollable list with virtualization
380
+ - [ ] Add proper loading states and error handling
381
+ - [ ] Optimize group user aggregation queries
382
+ - [ ] Add caching for expensive group discovery operations
383
+
384
+ This implementation will provide a comprehensive, performant contacts system that scales to thousands of users while maintaining a clean, intuitive interface.
package/jest.config.js ADDED
@@ -0,0 +1,25 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'jsdom',
4
+ setupFilesAfterEnv: ['<rootDir>/src/setupTests.ts'],
5
+ moduleNameMapper: {
6
+ '\\.(css|less|scss|sass)$': 'identity-obj-proxy',
7
+ },
8
+ transform: {
9
+ '^.+\\.(ts|tsx)$': 'ts-jest',
10
+ },
11
+ testMatch: [
12
+ '<rootDir>/src/**/__tests__/**/*.(ts|tsx|js)',
13
+ '<rootDir>/src/**/?(*.)(spec|test).(ts|tsx|js)',
14
+ ],
15
+ moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
16
+ collectCoverageFrom: [
17
+ 'src/**/*.(ts|tsx)',
18
+ '!src/**/*.d.ts',
19
+ '!src/**/__tests__/**',
20
+ '!src/**/?(*.)(spec|test).*',
21
+ ],
22
+ roots: ['<rootDir>/src'],
23
+ testPathIgnorePatterns: ['/node_modules/', '/dist/'],
24
+ coveragePathIgnorePatterns: ['/node_modules/', '/dist/'],
25
+ };
package/package.json ADDED
@@ -0,0 +1,109 @@
1
+ {
2
+ "name": "@peers-app/peers-ui",
3
+ "version": "0.0.14",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "git+https://github.com/peers-app/peers-ui.git"
7
+ },
8
+ "author": "Mark Archer <mark_archer@live.com>",
9
+ "license": "MIT",
10
+ "main": "dist/index.js",
11
+ "types": "dist/index.d.ts",
12
+ "publishConfig": {
13
+ "access": "public"
14
+ },
15
+ "scripts": {
16
+ "clean": "rm -rf dist",
17
+ "build": "tsc",
18
+ "dev": "tsc -w",
19
+ "clean:build": "yarn clean && yarn build",
20
+ "deploy": "yarn clean && yarn build && npm version patch && npm publish && git push",
21
+ "test": "jest",
22
+ "test:watch": "jest --watch",
23
+ "test:coverage": "jest --coverage"
24
+ },
25
+ "peerDependencies": {
26
+ "bootstrap": "^5.3.3",
27
+ "@peers-app/peers-sdk": "^0.1.4",
28
+ "react": "^18.0.0",
29
+ "react-dom": "^18.0.0"
30
+ },
31
+ "devDependencies": {
32
+ "@babel/core": "^7.24.5",
33
+ "@babel/preset-env": "^7.24.5",
34
+ "@babel/preset-react": "^7.24.1",
35
+ "@babel/preset-typescript": "^7.27.1",
36
+ "@electron/rebuild": "^3.6.0",
37
+ "@testing-library/dom": "^10.4.0",
38
+ "@testing-library/jest-dom": "^6.6.3",
39
+ "@testing-library/react": "^16.3.0",
40
+ "@testing-library/user-event": "^14.6.1",
41
+ "@types/bootstrap": "^5.2.10",
42
+ "@types/dompurify": "^3.0.5",
43
+ "@types/jest": "^29.5.12",
44
+ "@types/lodash": "^4.17.1",
45
+ "@types/node": "^20.12.10",
46
+ "@types/prismjs": "^1.26.4",
47
+ "@types/react": "^18.3.1",
48
+ "@types/react-dom": "^18.3.0",
49
+ "@types/semver": "^7.5.8",
50
+ "@types/ws": "^8.5.12",
51
+ "babel-loader": "^9.1.3",
52
+ "bootstrap": "^5.3.3",
53
+ "identity-obj-proxy": "^3.0.0",
54
+ "jest": "^29.7.0",
55
+ "jest-environment-jsdom": "^30.0.5",
56
+ "path-browserify": "^1.0.1",
57
+ "@peers-app/peers-sdk": "^0.1.4",
58
+ "react": "^18.0.0",
59
+ "react-dom": "^18.0.0",
60
+ "string-width": "^7.1.0",
61
+ "ts-jest": "^29.1.2",
62
+ "ts-node": "^10.9.2",
63
+ "typescript": "^5.4.5",
64
+ "webpack": "^5.91.0",
65
+ "webpack-cli": "^5.1.4"
66
+ },
67
+ "dependencies": {
68
+ "@langchain/community": "^0.0.55",
69
+ "@langchain/core": "^0.1.62",
70
+ "@lexical/code": "^0.20.0",
71
+ "@lexical/list": "^0.20.0",
72
+ "@lexical/markdown": "^0.20.0",
73
+ "@lexical/react": "^0.20.0",
74
+ "@types/sortablejs": "^1.15.8",
75
+ "bootstrap": "^5.3.3",
76
+ "bootstrap-icons": "^1.11.3",
77
+ "cheerio": "^1.0.0-rc.12",
78
+ "cheminfo-types": "^1.7.3",
79
+ "compression-webpack-plugin": "^11.1.0",
80
+ "cron-parser": "^4.9.0",
81
+ "cron-validate": "^1.4.5",
82
+ "css-loader": "^7.1.1",
83
+ "dompurify": "^3.1.4",
84
+ "dotenv": "^16.4.5",
85
+ "fast-json-stable-stringify": "^2.1.0",
86
+ "js-sha256": "^0.11.0",
87
+ "keytar": "^7.9.0",
88
+ "langchain": "^0.1.36",
89
+ "lexical": "^0.20.0",
90
+ "lodash": "^4.17.21",
91
+ "ml-tree-similarity": "^2.2.0",
92
+ "moment": "^2.30.1",
93
+ "moment-timezone": "^0.5.46",
94
+ "react-infinite-scroll-component": "^6.1.0",
95
+ "react-markdown": "^9.0.1",
96
+ "react-split-pane": "^0.1.92",
97
+ "react-tiny-popover": "^8.0.4",
98
+ "remark-gfm": "^4.0.0",
99
+ "socket.io": "^4.7.5",
100
+ "socket.io-client": "^4.8.0",
101
+ "sortablejs": "^1.15.6",
102
+ "source-map-loader": "^5.0.0",
103
+ "style-loader": "^4.0.0",
104
+ "svg-inline-loader": "^0.8.2",
105
+ "ts-loader": "^9.5.1",
106
+ "tweetnacl": "^1.0.3",
107
+ "tweetnacl-util": "^0.15.1"
108
+ }
109
+ }
package/src/app.tsx ADDED
@@ -0,0 +1,59 @@
1
+ import { sleep } from "@peers-app/peers-sdk";
2
+ import React from 'react';
3
+ import { LeftBar } from './components/left-bar';
4
+ import { TopBar } from './components/top-bar';
5
+ import { usePromise } from './hooks';
6
+ import { colorModePreference, ColorModePreference } from './screens/settings/color-mode-dropdown';
7
+ import { TabsLayout } from './tabs-layout/tabs-layout';
8
+ import './ui-router/ui-loader';
9
+
10
+ export const App = (props: { colorMode?: ColorModePreference}) => {
11
+ return <TabsLayout colorMode={props.colorMode} />;
12
+ }
13
+
14
+ export const AppSimple = (props: { colorMode?: ColorModePreference}) => {
15
+ console.log('AppSimple waiting');
16
+ const loaded = usePromise(async () => {
17
+ await sleep(100);
18
+ return true;
19
+ });
20
+ if (!loaded) return false;
21
+ console.log('AppSimple loaded');
22
+
23
+ document.getElementById('appLoadingDiv')?.remove();
24
+
25
+ colorModePreference(props.colorMode);
26
+
27
+ // return (
28
+ // <div className='container'>
29
+ // <h1>Hi</h1>
30
+ // <main className="peers-main-content">
31
+ // HI! v2
32
+ // </main>
33
+ // <pre>
34
+ // {`
35
+ // hi
36
+ // hi
37
+ // hi
38
+ // hi
39
+ // hi
40
+ // hi
41
+ // hi
42
+ // `}
43
+
44
+ // </pre>
45
+ // </div>
46
+ // )
47
+
48
+ return (
49
+ <div>
50
+ <TopBar />
51
+ <LeftBar />
52
+ {/* <NotificationsBar /> */}
53
+ {/* <MediaViewer /> */}
54
+ <main className="peers-main-content">
55
+ {/* <MainContentContainer /> */}
56
+ </main>
57
+ </div>
58
+ );
59
+ }