@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,374 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.TabsLayout = TabsLayout;
37
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
38
+ const react_1 = __importStar(require("react"));
39
+ const command_palette_1 = require("../command-palette/command-palette");
40
+ const command_palette_ui_1 = require("../command-palette/command-palette-ui");
41
+ const group_switcher_1 = require("../components/group-switcher");
42
+ const router_1 = require("../components/router");
43
+ const globals_1 = require("../globals");
44
+ const hooks_1 = require("../hooks");
45
+ const color_mode_dropdown_1 = require("../screens/settings/color-mode-dropdown");
46
+ const setup_user_1 = require("../screens/setup-user");
47
+ const system_apps_1 = require("../system-apps");
48
+ const routes_loader_1 = require("../ui-router/routes-loader");
49
+ const ui_loader_1 = require("../ui-router/ui-loader");
50
+ const tabs_state_1 = require("./tabs-state");
51
+ function TabsLayout(props) {
52
+ const loaded = (0, hooks_1.usePromise)(async () => {
53
+ await (0, globals_1.loadGlobals)().then(() => console.log('Globals loaded'));
54
+ await (0, routes_loader_1.loadAllRoutes)().then(() => console.log('Routes loaded'));
55
+ // Wait for tab state to load from database
56
+ await Promise.all([
57
+ tabs_state_1.activeTabs.loadingPromise,
58
+ tabs_state_1.activeTabId.loadingPromise,
59
+ tabs_state_1.recentlyUsedApps.loadingPromise
60
+ ]);
61
+ return true;
62
+ });
63
+ if (!loaded)
64
+ return false;
65
+ document.getElementById('appLoadingDiv')?.remove();
66
+ if (globals_1.me.name === globals_1.me.userId) {
67
+ return react_1.default.createElement(setup_user_1.SetupUser, null);
68
+ }
69
+ (0, color_mode_dropdown_1.colorModePreference)(props.colorMode);
70
+ return (react_1.default.createElement(react_1.default.Fragment, null,
71
+ react_1.default.createElement(TabsLayoutInternal, null),
72
+ react_1.default.createElement(command_palette_ui_1.CommandPaletteOverlay, null)));
73
+ }
74
+ function TabsLayoutInternal() {
75
+ const [_colorMode] = (0, hooks_1.useObservable)(color_mode_dropdown_1.colorMode);
76
+ const [tabs] = (0, hooks_1.useObservable)(tabs_state_1.activeTabs);
77
+ const [activeTab] = (0, hooks_1.useObservable)(tabs_state_1.activeTabId);
78
+ const [currentlyActiveGroupId, setCurrentlyActiveGroupId] = (0, react_1.useState)('');
79
+ (0, react_1.useEffect)(() => {
80
+ let sub;
81
+ (0, peers_sdk_1.getUserContext)().then(userContext => {
82
+ setCurrentlyActiveGroupId(userContext.currentlyActiveGroupId() || userContext.userId());
83
+ sub = userContext.currentlyActiveGroupId.subscribe(async (groupId) => {
84
+ setCurrentlyActiveGroupId(userContext.currentlyActiveGroupId() || userContext.userId());
85
+ // below reloading logic is a kludge to deal with different groups having different packages installed
86
+ await (0, peers_sdk_1.sleep)(100);
87
+ window.location.reload();
88
+ });
89
+ });
90
+ return () => {
91
+ if (sub) {
92
+ sub.dispose();
93
+ }
94
+ };
95
+ }, []);
96
+ (0, hooks_1.useObservable)(globals_1.isDesktop);
97
+ const isMobile = !(0, globals_1.isDesktop)();
98
+ const closeTab = (tabId) => {
99
+ const currentTabs = (0, tabs_state_1.activeTabs)();
100
+ const tabToClose = currentTabs.find(t => t.tabId === tabId);
101
+ if (!tabToClose || tabToClose.tabId === "launcher")
102
+ return;
103
+ const newTabs = currentTabs.filter(t => t.tabId !== tabId);
104
+ (0, tabs_state_1.activeTabs)(newTabs);
105
+ tabs_state_1.initializedTabs.delete(tabId);
106
+ // If closing active tab, switch to previous tab
107
+ if (activeTab === tabId) {
108
+ const newActiveTab = newTabs.length > 0 ? newTabs[newTabs.length - 1].tabId : 'launcher';
109
+ (0, tabs_state_1.activeTabId)(newActiveTab);
110
+ }
111
+ };
112
+ const switchTab = (tabId) => {
113
+ (0, tabs_state_1.activeTabId)(tabId);
114
+ };
115
+ return (react_1.default.createElement("div", { key: currentlyActiveGroupId, className: "d-flex flex-column", style: { height: '100vh', overflow: 'hidden' } },
116
+ react_1.default.createElement("div", { className: `border-bottom ${_colorMode === 'light' ? 'bg-light' : 'bg-dark'}`, style: {
117
+ borderBottomWidth: '1px',
118
+ borderBottomColor: _colorMode === 'light' ? '#dee2e6' : '#495057'
119
+ } }, isMobile ? (react_1.default.createElement(MobileTabsHeader, { tabs: tabs, activeTab: activeTab, onSwitch: switchTab, onClose: closeTab, colorMode: _colorMode })) : (react_1.default.createElement("div", { className: "d-flex align-items-center px-1", style: { height: '36px' } },
120
+ react_1.default.createElement(group_switcher_1.GroupSwitcher, { colorMode: _colorMode }),
121
+ react_1.default.createElement("button", { className: "btn btn-sm me-2 d-flex align-items-center", onClick: command_palette_1.openCommandPalette, title: "Search everything (Cmd+K)", style: {
122
+ padding: '4px 8px',
123
+ fontSize: '12px',
124
+ borderRadius: '6px',
125
+ border: 'none',
126
+ background: 'transparent',
127
+ color: _colorMode === 'light' ? '#6c757d' : '#adb5bd'
128
+ }, onMouseEnter: (e) => {
129
+ e.currentTarget.style.backgroundColor = _colorMode === 'light' ? '#f8f9fa' : '#495057';
130
+ e.currentTarget.style.color = _colorMode === 'light' ? '#0d6efd' : '#ffffff';
131
+ }, onMouseLeave: (e) => {
132
+ e.currentTarget.style.backgroundColor = 'transparent';
133
+ e.currentTarget.style.color = _colorMode === 'light' ? '#6c757d' : '#adb5bd';
134
+ } },
135
+ react_1.default.createElement("i", { className: "bi-search", style: { fontSize: '14px' } })),
136
+ react_1.default.createElement("div", { className: "d-flex flex-grow-1 overflow-auto", style: {
137
+ scrollbarWidth: 'none',
138
+ msOverflowStyle: 'none'
139
+ } }, tabs.map(tab => (react_1.default.createElement(TabHeader, { key: tab.tabId, tab: tab, isActive: activeTab === tab.tabId, onSwitch: switchTab, onClose: closeTab, colorMode: _colorMode }))))))),
140
+ react_1.default.createElement("div", { className: "flex-grow-1 overflow-hidden" }, tabs.map(tab => (react_1.default.createElement("div", { key: tab.tabId, className: `h-100 ${activeTab === tab.tabId ? 'd-block' : 'd-none'}`, style: { display: activeTab === tab.tabId ? 'block' : 'none' } },
141
+ react_1.default.createElement(TabContent, { tab: tab, isMobile: isMobile, isActive: activeTab === tab.tabId })))))));
142
+ }
143
+ function MobileTabsHeader({ tabs, activeTab, onSwitch, onClose, colorMode }) {
144
+ const [showTabDropdown, setShowTabDropdown] = react_1.default.useState(false);
145
+ const currentTab = tabs.find(t => t.tabId === activeTab);
146
+ const nonLauncherTabs = tabs.filter(t => t.packageId !== 'launcher');
147
+ return (react_1.default.createElement("div", { className: "d-flex align-items-center justify-content-between px-2", style: { height: '36px' } },
148
+ react_1.default.createElement("div", { className: "d-flex align-items-center gap-1" },
149
+ react_1.default.createElement(group_switcher_1.GroupSwitcher, { colorMode: colorMode }),
150
+ react_1.default.createElement("button", { className: "btn btn-sm", onClick: command_palette_1.openCommandPalette, title: "Search everything", style: {
151
+ minWidth: '36px',
152
+ border: 'none',
153
+ background: 'transparent',
154
+ color: colorMode === 'light' ? '#6c757d' : '#adb5bd'
155
+ }, onMouseEnter: (e) => {
156
+ e.currentTarget.style.backgroundColor = colorMode === 'light' ? '#f8f9fa' : '#495057';
157
+ e.currentTarget.style.color = colorMode === 'light' ? '#0d6efd' : '#ffffff';
158
+ }, onMouseLeave: (e) => {
159
+ e.currentTarget.style.backgroundColor = 'transparent';
160
+ e.currentTarget.style.color = colorMode === 'light' ? '#6c757d' : '#adb5bd';
161
+ } },
162
+ react_1.default.createElement("i", { className: "bi-search" })),
163
+ react_1.default.createElement("button", { className: `btn btn-sm ${colorMode === 'light' ? 'btn-outline-primary' : 'btn-outline-light'}`, onClick: () => onSwitch('launcher'), style: { minWidth: '36px' } },
164
+ react_1.default.createElement("i", { className: "bi-grid-3x3-gap" }))),
165
+ react_1.default.createElement("div", { className: "d-flex align-items-center flex-grow-1 justify-content-center" },
166
+ currentTab?.iconClassName && currentTab.packageId !== 'launcher' && (react_1.default.createElement("i", { className: `${currentTab.iconClassName} me-2` })),
167
+ react_1.default.createElement("span", { className: "fw-medium text-truncate me-2 small" }, currentTab?.title || 'Apps')),
168
+ react_1.default.createElement("div", { className: "d-flex align-items-center gap-2" }, nonLauncherTabs.length > 0 && (react_1.default.createElement("div", { className: "dropdown" },
169
+ react_1.default.createElement("button", { className: `btn btn-sm ${colorMode === 'light' ? 'btn-outline-dark' : 'btn-outline-light'}`, onClick: () => setShowTabDropdown(!showTabDropdown) },
170
+ react_1.default.createElement("i", { className: "bi-list" }),
171
+ react_1.default.createElement("span", { className: "ms-1" }, nonLauncherTabs.length)),
172
+ showTabDropdown && (react_1.default.createElement("div", { className: `dropdown-menu show position-absolute ${colorMode === 'light' ? '' : 'dropdown-menu-dark'}`, style: { right: 0, top: '100%', zIndex: 1000, minWidth: '250px' } }, nonLauncherTabs.slice().reverse().map(tab => (react_1.default.createElement("div", { key: tab.tabId, className: `dropdown-item d-flex align-items-center justify-content-between ${activeTab === tab.tabId ? 'active' : ''}`, style: { cursor: 'pointer' }, onClick: () => {
173
+ onSwitch(tab.tabId);
174
+ setShowTabDropdown(false);
175
+ } },
176
+ react_1.default.createElement("div", { className: "d-flex align-items-center" },
177
+ tab.iconClassName && react_1.default.createElement("i", { className: `${tab.iconClassName} me-2` }),
178
+ react_1.default.createElement("span", null, tab.title)),
179
+ tab.tabId !== "launcher" && (react_1.default.createElement("button", { className: "btn btn-sm p-0 ms-2", style: { width: '20px', height: '20px' }, onClick: (e) => {
180
+ e.stopPropagation();
181
+ onClose(tab.tabId);
182
+ } },
183
+ react_1.default.createElement("i", { className: "bi-x" }))))))))))),
184
+ showTabDropdown && (react_1.default.createElement("div", { className: "position-fixed w-100 h-100", style: { top: 0, left: 0, zIndex: 999 }, onClick: () => setShowTabDropdown(false) }))));
185
+ }
186
+ function TabHeader({ tab, isActive, onSwitch, onClose, colorMode }) {
187
+ const activeClass = isActive
188
+ ? (colorMode === 'light' ? 'bg-white' : 'bg-secondary')
189
+ : (colorMode === 'light' ? 'bg-light' : 'bg-dark');
190
+ return (react_1.default.createElement("div", { className: `d-flex align-items-center px-2 py-1 user-select-none ${activeClass}`, style: {
191
+ cursor: 'pointer',
192
+ minWidth: '100px',
193
+ maxWidth: '180px',
194
+ height: '34px',
195
+ fontSize: '13px',
196
+ borderTop: isActive ? '2px solid #0d6efd' : '2px solid transparent',
197
+ borderLeft: '1px solid transparent',
198
+ borderRight: '1px solid ' + (colorMode === 'light' ? '#dee2e6' : '#495057'),
199
+ borderBottom: isActive ? (colorMode === 'light' ? '1px solid white' : '1px solid #343a40') : 'none',
200
+ marginBottom: isActive ? '-1px' : '0',
201
+ borderRadius: isActive ? '6px 6px 0 0' : '0',
202
+ transition: 'all 0.15s ease',
203
+ zIndex: isActive ? 1 : 0,
204
+ boxShadow: isActive ? '0 2px 4px rgba(0,0,0,0.1)' : 'none'
205
+ }, onMouseEnter: (e) => {
206
+ if (!isActive) {
207
+ e.currentTarget.style.backgroundColor = colorMode === 'light' ? '#f8f9fa' : '#495057';
208
+ }
209
+ }, onMouseLeave: (e) => {
210
+ if (!isActive) {
211
+ e.currentTarget.style.backgroundColor = colorMode === 'light' ? '#f1f3f4' : '#343a40';
212
+ }
213
+ }, onClick: () => onSwitch(tab.tabId) },
214
+ tab.iconClassName && (react_1.default.createElement("i", { className: `${tab.iconClassName} me-2` })),
215
+ react_1.default.createElement("span", { className: "text-truncate", style: { maxWidth: '120px', fontSize: '12px' } }, tab.title),
216
+ tab.tabId !== "launcher" && (react_1.default.createElement("button", { className: "btn p-0 ms-1 opacity-75 hover-opacity-100", style: {
217
+ width: '14px',
218
+ height: '14px',
219
+ fontSize: '11px',
220
+ border: 'none',
221
+ background: 'none',
222
+ borderRadius: '2px'
223
+ }, onMouseEnter: (e) => e.currentTarget.style.backgroundColor = 'rgba(0,0,0,0.1)', onMouseLeave: (e) => e.currentTarget.style.backgroundColor = 'transparent', onClick: (e) => {
224
+ e.stopPropagation();
225
+ onClose(tab.tabId);
226
+ } },
227
+ react_1.default.createElement("i", { className: "bi-x" })))));
228
+ }
229
+ function TabContent({ tab, isMobile, isActive }) {
230
+ // Only render content if this tab is active OR has been previously initialized
231
+ const shouldRender = isActive || tabs_state_1.initializedTabs.has(tab.tabId);
232
+ // Mark tab as initialized when it becomes active for the first time
233
+ react_1.default.useEffect(() => {
234
+ if (isActive) {
235
+ tabs_state_1.initializedTabs.add(tab.tabId);
236
+ }
237
+ }, [isActive, tab.tabId]);
238
+ if (!shouldRender) {
239
+ return null;
240
+ }
241
+ return react_1.default.createElement(TabContentRenderer, { tab: tab, isMobile: isMobile });
242
+ }
243
+ // Create individual tab content components that don't re-render
244
+ const TabContentRenderer = react_1.default.memo(({ tab, isMobile }) => {
245
+ if (tab.packageId === 'launcher') {
246
+ return react_1.default.createElement(AppLauncherTab, { isMobile: isMobile });
247
+ }
248
+ // System apps use the main Router (which reads from mainContentPath)
249
+ // Package apps use UIRouter with explicit path
250
+ const isSystemApp = tab.packageId === 'system-apps';
251
+ return (react_1.default.createElement("div", { className: `h-100 overflow-auto ${isMobile ? 'p-2' : 'p-3'}` }, isSystemApp ? (react_1.default.createElement(router_1.Router, { path: tab.path })) : (react_1.default.createElement(ui_loader_1.UIRouter, { path: tab.path, uiCategory: "screen", props: {} }))));
252
+ }, (prevProps, nextProps) => {
253
+ // Only re-render if the tab or isMobile changed
254
+ return prevProps.tab.tabId === nextProps.tab.tabId &&
255
+ prevProps.tab.path === nextProps.tab.path &&
256
+ prevProps.isMobile === nextProps.isMobile;
257
+ });
258
+ function AppLauncherTab({ isMobile }) {
259
+ const [packages] = (0, hooks_1.useObservable)(routes_loader_1.allPackages);
260
+ const [recentApps] = (0, hooks_1.useObservable)(tabs_state_1.recentlyUsedApps);
261
+ const [searchTerm, setSearchTerm] = react_1.default.useState('');
262
+ // Combine regular packages with system apps package
263
+ const allPackages_ = [...packages, system_apps_1.systemPackage];
264
+ // Create app items from nav items in packages
265
+ const allApps = allPackages_
266
+ .filter(p => !p.disabled && p.appNavs && p.appNavs.length > 0)
267
+ .flatMap(pkg => pkg.appNavs.map(navItem => {
268
+ // Construct path - use direct path for system apps, package-nav for others
269
+ let path;
270
+ if (pkg.packageId === 'system-apps') {
271
+ // System apps use direct routing (like the original left bar)
272
+ path = navItem.navigationPath ?? navItem.name.replace(/\s/g, '-').toLowerCase();
273
+ }
274
+ else {
275
+ // Regular packages use package-nav format
276
+ path = `package-nav/${pkg.packageId}/${(navItem.navigationPath ?? navItem.name).replace(/[^a-zA-Z0-9]/g, '-').toLowerCase()}`;
277
+ while (path.includes('//')) {
278
+ path = path.replace('//', '/');
279
+ }
280
+ }
281
+ return {
282
+ packageId: pkg.packageId,
283
+ packageName: pkg.name,
284
+ navItem,
285
+ path,
286
+ name: navItem.name,
287
+ displayName: navItem.displayName || navItem.name,
288
+ iconClassName: navItem.iconClassName || 'bi-box-seam'
289
+ };
290
+ }));
291
+ // Filter apps based on search term
292
+ const filteredApps = searchTerm.trim()
293
+ ? allApps.filter(app => app.name.toLowerCase().includes(searchTerm.toLowerCase()) ||
294
+ app.displayName.toLowerCase().includes(searchTerm.toLowerCase()))
295
+ : allApps;
296
+ // Categorize filtered apps by package ID
297
+ const systemApps = filteredApps.filter(app => app.packageId === 'system-apps');
298
+ const userApps = filteredApps.filter(app => app.packageId !== 'system-apps');
299
+ // Get recently used apps by matching paths (only show if they match search)
300
+ const recentAppItems = recentApps
301
+ .map(path => filteredApps.find(app => app.path === path))
302
+ .filter(Boolean);
303
+ const openApp = (appItem) => {
304
+ (0, tabs_state_1.goToTabPath)(appItem.path);
305
+ };
306
+ return (react_1.default.createElement("div", { className: `container-fluid ${isMobile ? 'p-2' : 'p-4'}`, style: { maxHeight: '100%', overflowY: 'auto' } },
307
+ react_1.default.createElement("div", { className: isMobile ? 'mb-3' : 'mb-4' },
308
+ react_1.default.createElement("div", { className: "position-relative" },
309
+ react_1.default.createElement("i", { className: "bi-search position-absolute", style: {
310
+ left: '12px',
311
+ top: '50%',
312
+ transform: 'translateY(-50%)',
313
+ color: '#6c757d',
314
+ zIndex: 1
315
+ } }),
316
+ react_1.default.createElement("input", { type: "text", className: "form-control", placeholder: "Search apps...", value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), style: {
317
+ paddingLeft: '40px',
318
+ fontSize: isMobile ? '14px' : '15px'
319
+ } }),
320
+ searchTerm && (react_1.default.createElement("button", { className: "btn btn-sm position-absolute", style: {
321
+ right: '8px',
322
+ top: '50%',
323
+ transform: 'translateY(-50%)',
324
+ border: 'none',
325
+ background: 'none',
326
+ color: '#6c757d'
327
+ }, onClick: () => setSearchTerm('') },
328
+ react_1.default.createElement("i", { className: "bi-x" }))))),
329
+ recentAppItems.length > 0 && (react_1.default.createElement(AppSection, { title: "Recently Used", iconClassName: "bi-clock", apps: recentAppItems, onOpenApp: openApp, isMobile: isMobile })),
330
+ userApps.length > 0 && (react_1.default.createElement(AppSection, { title: "User Apps", iconClassName: "bi-person", apps: userApps, onOpenApp: openApp, isMobile: isMobile })),
331
+ systemApps.length > 0 && (react_1.default.createElement(AppSection, { title: "System Apps", iconClassName: "bi-gear", apps: systemApps, onOpenApp: openApp, isMobile: isMobile }))));
332
+ }
333
+ function AppSection({ title, iconClassName, apps, onOpenApp, isMobile }) {
334
+ return (react_1.default.createElement("div", { className: 'mb-5' },
335
+ react_1.default.createElement("h4", { className: `${isMobile ? 'mb-3 h5' : 'mb-3'}` },
336
+ react_1.default.createElement("i", { className: `${iconClassName} me-2` }),
337
+ title),
338
+ react_1.default.createElement("div", { className: `d-flex flex-wrap ${isMobile ? 'gap-3' : 'gap-4'}`, style: { gap: isMobile ? '16px' : '20px' } }, apps.map(app => (react_1.default.createElement(AppCard, { key: `${app.packageId}-${app.path}`, appItem: app, onOpenApp: onOpenApp, isMobile: isMobile }))))));
339
+ }
340
+ function AppCard({ appItem, onOpenApp, isMobile }) {
341
+ const [_colorMode] = (0, hooks_1.useObservable)(color_mode_dropdown_1.colorMode);
342
+ const isDark = _colorMode === 'dark';
343
+ return (react_1.default.createElement("div", { className: "d-flex flex-column align-items-center text-center", style: {
344
+ cursor: 'pointer',
345
+ width: isMobile ? '80px' : '90px',
346
+ transition: 'all 0.15s ease'
347
+ }, title: appItem.name, onMouseEnter: (e) => {
348
+ e.currentTarget.style.transform = 'scale(1.05)';
349
+ }, onMouseLeave: (e) => {
350
+ e.currentTarget.style.transform = 'scale(1)';
351
+ }, onClick: () => onOpenApp(appItem) },
352
+ react_1.default.createElement("div", { className: "d-flex align-items-center justify-content-center mb-2", style: {
353
+ width: isMobile ? '64px' : '72px',
354
+ height: isMobile ? '64px' : '72px',
355
+ backgroundColor: isDark ? '#343a40' : '#f8f9fa',
356
+ borderRadius: '12px',
357
+ border: `1px solid ${isDark ? '#495057' : '#e9ecef'}`,
358
+ boxShadow: isDark ? '0 2px 4px rgba(0,0,0,0.3)' : '0 2px 4px rgba(0,0,0,0.08)',
359
+ transition: 'all 0.15s ease'
360
+ } },
361
+ react_1.default.createElement("i", { className: appItem.iconClassName, style: {
362
+ fontSize: isMobile ? '28px' : '32px',
363
+ color: isDark ? '#0d6efd' : '#0d6efd' // Keep primary blue for both themes
364
+ } })),
365
+ react_1.default.createElement("span", { className: isDark ? 'text-light' : 'text-dark', style: {
366
+ fontSize: isMobile ? '11px' : '12px',
367
+ fontWeight: '500',
368
+ lineHeight: '1.2',
369
+ maxWidth: '100%',
370
+ overflow: 'hidden',
371
+ textOverflow: 'ellipsis',
372
+ whiteSpace: 'nowrap'
373
+ } }, appItem.displayName)));
374
+ }
@@ -0,0 +1,26 @@
1
+ import { IAppNav, IPackage } from "@peers-app/peers-sdk";
2
+ export interface TabState {
3
+ tabId: string;
4
+ packageId?: string;
5
+ path: string;
6
+ title: string;
7
+ iconClassName?: string;
8
+ }
9
+ export declare const launcherApp: TabState;
10
+ export declare const activeTabs: import("@peers-app/peers-sdk").PersistentVar<TabState[]>;
11
+ export declare const activeTabId: import("@peers-app/peers-sdk").PersistentVar<string>;
12
+ export declare const recentlyUsedApps: import("@peers-app/peers-sdk").PersistentVar<string[]>;
13
+ export declare const initializedTabs: Set<string>;
14
+ export declare function goToTabPath(path: string): void;
15
+ export declare const handleMainPathChanged: (oldPath: string, newPath: string, setNewMainPath: ((path: string) => any)) => void;
16
+ type AppInfo = {
17
+ navItem: IAppNav;
18
+ package: IPackage;
19
+ };
20
+ export declare function determineAppFromPath(path: string): AppInfo | undefined;
21
+ export declare const updateActiveTabTitle: (newTitle: string) => void;
22
+ export declare const openNewTab: (tab: Omit<TabState, "tabId">, forceNew?: boolean) => void;
23
+ export declare const closeCurrentTab: () => void;
24
+ export declare const switchToNextTab: () => void;
25
+ export declare const switchToPreviousTab: () => void;
26
+ export {};
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.switchToPreviousTab = exports.switchToNextTab = exports.closeCurrentTab = exports.openNewTab = exports.updateActiveTabTitle = exports.handleMainPathChanged = exports.initializedTabs = exports.recentlyUsedApps = exports.activeTabId = exports.activeTabs = exports.launcherApp = void 0;
4
+ exports.goToTabPath = goToTabPath;
5
+ exports.determineAppFromPath = determineAppFromPath;
6
+ const peers_sdk_1 = require("@peers-app/peers-sdk");
7
+ const globals_1 = require("../globals");
8
+ const system_apps_1 = require("../system-apps");
9
+ const routes_loader_1 = require("../ui-router/routes-loader");
10
+ exports.launcherApp = {
11
+ tabId: 'launcher',
12
+ packageId: 'launcher',
13
+ path: '',
14
+ title: 'Apps',
15
+ iconClassName: 'bi-grid-3x3-gap',
16
+ };
17
+ // Global persistent variables for tab state
18
+ exports.activeTabs = (0, peers_sdk_1.groupUserVar)('activeTabs', {
19
+ defaultValue: [exports.launcherApp],
20
+ });
21
+ exports.activeTabId = (0, peers_sdk_1.groupUserVar)('activeTabId', {
22
+ defaultValue: 'launcher',
23
+ });
24
+ exports.recentlyUsedApps = (0, peers_sdk_1.groupUserVar)('recentlyUsedApps', {
25
+ defaultValue: [],
26
+ });
27
+ exports.initializedTabs = new Set();
28
+ function goToTabPath(path) {
29
+ const tab = (0, exports.activeTabs)().find(t => t.path === path);
30
+ if (tab) {
31
+ (0, exports.activeTabId)(tab.tabId);
32
+ }
33
+ else {
34
+ const appInfo = determineAppFromPath(path);
35
+ if (appInfo) {
36
+ (0, exports.openNewTab)({
37
+ path: path,
38
+ title: appInfo.navItem.displayName || appInfo.navItem.name,
39
+ packageId: appInfo.package.packageId,
40
+ iconClassName: appInfo.navItem.iconClassName
41
+ });
42
+ }
43
+ else {
44
+ // update current tab path if no app found
45
+ const currentTabId = (0, exports.activeTabId)();
46
+ const currentTabs = (0, exports.activeTabs)();
47
+ const currentTab = currentTabs.find(t => t.tabId === currentTabId);
48
+ if (currentTab && currentTab.path !== '') {
49
+ currentTab.path = path;
50
+ (0, exports.activeTabs)([...currentTabs]);
51
+ }
52
+ else {
53
+ (0, exports.openNewTab)({
54
+ path: path,
55
+ title: "New Tab",
56
+ packageId: 'system-apps',
57
+ iconClassName: 'bi-question-circle'
58
+ });
59
+ }
60
+ }
61
+ }
62
+ }
63
+ const handleMainPathChanged = (oldPath, newPath, setNewMainPath) => {
64
+ const oldPathPart = oldPath.toLowerCase().trim().split('?')[0];
65
+ const newPathPart = newPath.toLowerCase().trim().split('?')[0];
66
+ const currentTab = (0, exports.activeTabs)().find(t => t.tabId === (0, exports.activeTabId)());
67
+ if (oldPathPart === newPathPart || (currentTab && currentTab.path === newPath)) {
68
+ // nothing to do
69
+ setNewMainPath(newPath);
70
+ return;
71
+ }
72
+ const appInfo = determineAppFromPath(newPath);
73
+ if (appInfo && oldPath !== '') {
74
+ (0, exports.openNewTab)({
75
+ path: newPath,
76
+ title: appInfo.navItem.displayName || appInfo.navItem.name,
77
+ packageId: appInfo.package.packageId,
78
+ iconClassName: appInfo.navItem.iconClassName
79
+ });
80
+ }
81
+ else {
82
+ setNewMainPath(newPath);
83
+ }
84
+ };
85
+ exports.handleMainPathChanged = handleMainPathChanged;
86
+ function determineAppFromPath(path) {
87
+ const launcherInfo = {
88
+ navItem: {
89
+ name: 'Apps',
90
+ navigationPath: '',
91
+ iconClassName: exports.launcherApp.iconClassName || 'bi-grid-3x3-gap',
92
+ },
93
+ package: system_apps_1.systemPackage
94
+ };
95
+ if (!path || path === '' || path === '/') {
96
+ return launcherInfo;
97
+ }
98
+ // Remove leading/trailing slashes and query params
99
+ path = path.toLowerCase().trim().split('?')[0];
100
+ if (path.startsWith('/')) {
101
+ path = path.substring(1);
102
+ }
103
+ const rootPath = path.split('/')[0];
104
+ const _allPackages = [system_apps_1.systemPackage, ...(0, routes_loader_1.allPackages)()]; // WARNING allPackages might not be loaded yet
105
+ const allAppInfos = _allPackages
106
+ .filter(pkg => (pkg.appNavs?.length ?? 0) > 0)
107
+ .flatMap(pkg => pkg.appNavs.map(navItem => ({ navItem, package: pkg })));
108
+ // Find the most relevant app based on path
109
+ for (const appInfo of allAppInfos) {
110
+ const navPath = appInfo.navItem.navigationPath || appInfo.navItem.name.toLowerCase();
111
+ // Check for exact match or path starting with nav path
112
+ if (rootPath === navPath || rootPath.startsWith(navPath + '/')) {
113
+ // Return the first matching app
114
+ return {
115
+ navItem: appInfo.navItem,
116
+ package: appInfo.package
117
+ };
118
+ }
119
+ }
120
+ // look for package-specific routes
121
+ // uri in format of "package-nav/{packageId}/{path}"
122
+ const packageNavPrefix = 'package-nav/';
123
+ if (path.startsWith(packageNavPrefix)) {
124
+ const parts = path.substring(packageNavPrefix.length).split('/');
125
+ if (parts.length > 0) {
126
+ const packageId = parts[0];
127
+ const pkg = _allPackages.find(p => p.packageId === packageId);
128
+ if (pkg) {
129
+ const subPath = parts.slice(1).join('/');
130
+ const navItem = pkg.appNavs?.find(n => n.navigationPath === subPath || n.name.toLowerCase() === subPath);
131
+ if (navItem) {
132
+ return {
133
+ navItem,
134
+ package: pkg
135
+ };
136
+ }
137
+ }
138
+ }
139
+ }
140
+ console.warn(`No app found for path: ${path}`);
141
+ return undefined;
142
+ }
143
+ // Utility function for detail screens to update the active tab's title
144
+ const updateActiveTabTitle = (newTitle) => {
145
+ // TODO Fix this to use a more reliable update mechanism
146
+ // using setTimeout to get around a race condition for setting title on new tabs
147
+ setTimeout(() => {
148
+ const currentTabs = (0, exports.activeTabs)();
149
+ const activeTab = currentTabs.find(t => t.tabId === (0, exports.activeTabId)());
150
+ if (activeTab) {
151
+ activeTab.title = newTitle;
152
+ (0, exports.activeTabs)([...currentTabs]);
153
+ }
154
+ }, 100);
155
+ };
156
+ exports.updateActiveTabTitle = updateActiveTabTitle;
157
+ // Global function to open content in new tab
158
+ const openNewTab = (tab, forceNew = false) => {
159
+ const newTab = {
160
+ ...tab,
161
+ tabId: (0, peers_sdk_1.newid)(),
162
+ };
163
+ const currentTabs = (0, exports.activeTabs)();
164
+ const existingTabIndex = currentTabs.findIndex(t => t.packageId === tab.packageId && t.path === tab.path);
165
+ if (existingTabIndex >= 0 && !forceNew) {
166
+ // Switch to existing tab
167
+ (0, exports.activeTabId)(currentTabs[existingTabIndex].tabId);
168
+ }
169
+ else {
170
+ // Always add new tab (for app launcher or when forceNew is true)
171
+ (0, exports.activeTabs)([...currentTabs, newTab]);
172
+ (0, exports.activeTabId)(newTab.tabId);
173
+ }
174
+ // Update recently used (track by path instead of packageId)
175
+ if (tab.path && tab.packageId !== 'launcher') {
176
+ const recent = (0, exports.recentlyUsedApps)();
177
+ const filtered = recent.filter(path => path !== tab.path);
178
+ (0, exports.recentlyUsedApps)([tab.path, ...filtered].slice(0, 8));
179
+ }
180
+ };
181
+ exports.openNewTab = openNewTab;
182
+ // Close the current active tab (but not launcher)
183
+ const closeCurrentTab = () => {
184
+ const currentTabs = (0, exports.activeTabs)();
185
+ const _activeTabId = (0, exports.activeTabId)();
186
+ const tabToClose = currentTabs.find(t => t.tabId === _activeTabId);
187
+ if (!tabToClose || tabToClose.tabId === "launcher")
188
+ return;
189
+ const newTabs = currentTabs.filter(t => t.tabId !== _activeTabId);
190
+ (0, exports.activeTabs)(newTabs);
191
+ exports.initializedTabs.delete(_activeTabId);
192
+ // If closing active tab, switch to previous tab
193
+ if (newTabs.length > 0) {
194
+ const newActiveTab = newTabs[newTabs.length - 1].tabId;
195
+ (0, exports.activeTabId)(newActiveTab);
196
+ }
197
+ else {
198
+ (0, exports.activeTabId)('launcher');
199
+ }
200
+ };
201
+ exports.closeCurrentTab = closeCurrentTab;
202
+ // Navigate to next tab
203
+ const switchToNextTab = () => {
204
+ const currentTabs = (0, exports.activeTabs)();
205
+ const activeTab = (0, exports.activeTabId)();
206
+ const currentIndex = currentTabs.findIndex(tab => tab.tabId === activeTab);
207
+ if (currentIndex === -1)
208
+ return;
209
+ const nextIndex = currentIndex === currentTabs.length - 1 ? 0 : currentIndex + 1;
210
+ (0, exports.activeTabId)(currentTabs[nextIndex].tabId);
211
+ };
212
+ exports.switchToNextTab = switchToNextTab;
213
+ // Navigate to previous tab
214
+ const switchToPreviousTab = () => {
215
+ const currentTabs = (0, exports.activeTabs)();
216
+ const activeTab = (0, exports.activeTabId)();
217
+ const currentIndex = currentTabs.findIndex(tab => tab.tabId === activeTab);
218
+ if (currentIndex === -1)
219
+ return;
220
+ const prevIndex = currentIndex === 0 ? currentTabs.length - 1 : currentIndex - 1;
221
+ (0, exports.activeTabId)(currentTabs[prevIndex].tabId);
222
+ };
223
+ exports.switchToPreviousTab = switchToPreviousTab;
224
+ // Keyboard shortcuts are now handled by the command palette system
225
+ exports.activeTabId.subscribe(newActiveTab => {
226
+ const currentTabs = (0, exports.activeTabs)();
227
+ const activeTab = currentTabs.find(t => t.tabId === newActiveTab);
228
+ if (!activeTab) {
229
+ console.warn('Active tab not found:', newActiveTab);
230
+ return;
231
+ }
232
+ // Update mainContentPath for the new active tab
233
+ if (activeTab.packageId !== 'launcher') {
234
+ (0, globals_1._mainContentPath)(activeTab.path);
235
+ }
236
+ else {
237
+ (0, globals_1._mainContentPath)(''); // Launcher or fallback
238
+ }
239
+ });
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ interface IProps {
3
+ collapsed?: boolean;
4
+ toggleCollapsed: () => void;
5
+ }
6
+ export declare const LeftBarContent: (props: IProps) => React.JSX.Element;
7
+ export {};