@peers-app/peers-ui 0.14.0 → 0.15.0

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 (438) hide show
  1. package/.github/workflows/publish.yml +8 -5
  2. package/babel.config.js +4 -4
  3. package/biome.json +191 -0
  4. package/dist/command-palette/command-palette-ui.d.ts +1 -2
  5. package/dist/command-palette/command-palette-ui.js +175 -244
  6. package/dist/command-palette/command-palette.js +65 -64
  7. package/dist/components/chat-overlay.d.ts +2 -2
  8. package/dist/components/chat-overlay.js +160 -217
  9. package/dist/components/checkbox.d.ts +5 -4
  10. package/dist/components/checkbox.js +4 -7
  11. package/dist/components/group-switcher.d.ts +1 -2
  12. package/dist/components/group-switcher.js +119 -159
  13. package/dist/components/input-date.d.ts +3 -3
  14. package/dist/components/input-date.js +6 -6
  15. package/dist/components/input-number.d.ts +7 -6
  16. package/dist/components/input-number.js +25 -20
  17. package/dist/components/input.d.ts +5 -4
  18. package/dist/components/input.js +4 -7
  19. package/dist/components/inverse-lazy-list.d.ts +3 -3
  20. package/dist/components/inverse-lazy-list.js +13 -47
  21. package/dist/components/io-schema-values.d.ts +5 -6
  22. package/dist/components/io-schema-values.js +28 -65
  23. package/dist/components/io-schema.d.ts +4 -5
  24. package/dist/components/io-schema.js +42 -79
  25. package/dist/components/lazy-list.d.ts +3 -3
  26. package/dist/components/lazy-list.js +38 -58
  27. package/dist/components/list-screen.d.ts +3 -8
  28. package/dist/components/list-screen.js +28 -23
  29. package/dist/components/loading-indicator.d.ts +1 -2
  30. package/dist/components/loading-indicator.js +2 -6
  31. package/dist/components/markdown-editor/autolink-plugin.js +5 -8
  32. package/dist/components/markdown-editor/editor-inline.d.ts +2 -3
  33. package/dist/components/markdown-editor/editor-inline.js +2 -6
  34. package/dist/components/markdown-editor/editor.d.ts +6 -6
  35. package/dist/components/markdown-editor/editor.js +9 -19
  36. package/dist/components/markdown-editor/markdown-plugin.d.ts +1 -1
  37. package/dist/components/markdown-editor/markdown-plugin.js +20 -21
  38. package/dist/components/markdown-editor/mention-node.d.ts +2 -2
  39. package/dist/components/markdown-editor/mention-node.js +24 -24
  40. package/dist/components/markdown-editor/mentions-plugin.d.ts +2 -2
  41. package/dist/components/markdown-editor/mentions-plugin.js +61 -62
  42. package/dist/components/markdown-editor/theme.js +28 -28
  43. package/dist/components/markdown-editor/toolbar.d.ts +2 -3
  44. package/dist/components/markdown-editor/toolbar.js +32 -49
  45. package/dist/components/markdown-with-mentions.d.ts +1 -1
  46. package/dist/components/markdown-with-mentions.js +43 -43
  47. package/dist/components/message-logs/message-logs.d.ts +1 -2
  48. package/dist/components/message-logs/message-logs.js +91 -116
  49. package/dist/components/messages/avatar.d.ts +3 -4
  50. package/dist/components/messages/avatar.js +37 -46
  51. package/dist/components/messages/channel-message-list.d.ts +5 -6
  52. package/dist/components/messages/channel-message-list.js +34 -34
  53. package/dist/components/messages/channel-view.d.ts +1 -2
  54. package/dist/components/messages/channel-view.js +23 -57
  55. package/dist/components/messages/message-compose.d.ts +3 -4
  56. package/dist/components/messages/message-compose.js +27 -38
  57. package/dist/components/messages/message-display.d.ts +2 -3
  58. package/dist/components/messages/message-display.js +42 -95
  59. package/dist/components/messages/thread-message-list.d.ts +4 -5
  60. package/dist/components/messages/thread-message-list.js +29 -29
  61. package/dist/components/router.d.ts +1 -2
  62. package/dist/components/router.js +58 -66
  63. package/dist/components/save-button.d.ts +3 -3
  64. package/dist/components/save-button.js +23 -33
  65. package/dist/components/sortable-list.d.ts +11 -12
  66. package/dist/components/sortable-list.js +42 -22
  67. package/dist/components/tabs.d.ts +3 -3
  68. package/dist/components/tabs.js +16 -47
  69. package/dist/components/tooltip.d.ts +4 -4
  70. package/dist/components/tooltip.js +4 -9
  71. package/dist/components/trust-level-badge.d.ts +2 -3
  72. package/dist/components/trust-level-badge.js +16 -16
  73. package/dist/components/trust-level-dropdown.d.ts +3 -4
  74. package/dist/components/trust-level-dropdown.js +32 -55
  75. package/dist/components/typeahead.d.ts +3 -3
  76. package/dist/components/typeahead.js +48 -89
  77. package/dist/components/voice-indicator.d.ts +2 -2
  78. package/dist/components/voice-indicator.js +93 -106
  79. package/dist/components/voice-subscribe-events.d.ts +32 -0
  80. package/dist/components/voice-subscribe-events.js +2 -0
  81. package/dist/globals.d.ts +3 -5
  82. package/dist/globals.js +22 -33
  83. package/dist/hooks.d.ts +5 -5
  84. package/dist/hooks.js +22 -12
  85. package/dist/hooks.test.js +129 -145
  86. package/dist/index.d.ts +9 -8
  87. package/dist/index.js +13 -12
  88. package/dist/mention-configs.d.ts +2 -2
  89. package/dist/mention-configs.js +55 -42
  90. package/dist/screens/assistants/assistant-config.d.ts +2 -3
  91. package/dist/screens/assistants/assistant-config.js +9 -22
  92. package/dist/screens/assistants/assistant-details.d.ts +1 -2
  93. package/dist/screens/assistants/assistant-details.js +13 -28
  94. package/dist/screens/assistants/assistant-info.d.ts +2 -3
  95. package/dist/screens/assistants/assistant-info.js +3 -17
  96. package/dist/screens/assistants/assistant-list.d.ts +1 -2
  97. package/dist/screens/assistants/assistant-list.js +15 -56
  98. package/dist/screens/assistants/assistant-tools.d.ts +2 -3
  99. package/dist/screens/assistants/assistant-tools.js +10 -24
  100. package/dist/screens/console-logs/console-logs-list.d.ts +1 -2
  101. package/dist/screens/console-logs/console-logs-list.js +130 -134
  102. package/dist/screens/console-logs/log-display.d.ts +2 -3
  103. package/dist/screens/console-logs/log-display.js +40 -42
  104. package/dist/screens/console-logs/log-filters.d.ts +1 -2
  105. package/dist/screens/console-logs/log-filters.js +2 -24
  106. package/dist/screens/console-logs/mobile-log-card.d.ts +2 -3
  107. package/dist/screens/console-logs/mobile-log-card.js +64 -67
  108. package/dist/screens/console-logs/resizable-table-header.d.ts +1 -2
  109. package/dist/screens/console-logs/resizable-table-header.js +31 -67
  110. package/dist/screens/contacts/contact-details.d.ts +1 -2
  111. package/dist/screens/contacts/contact-details.js +16 -46
  112. package/dist/screens/contacts/contact-list.d.ts +1 -2
  113. package/dist/screens/contacts/contact-list.js +44 -103
  114. package/dist/screens/contacts/index.d.ts +4 -4
  115. package/dist/screens/contacts/index.js +1 -1
  116. package/dist/screens/contacts/user-connect.d.ts +1 -2
  117. package/dist/screens/contacts/user-connect.js +85 -186
  118. package/dist/screens/data-explorer/data-explorer.d.ts +1 -2
  119. package/dist/screens/data-explorer/data-explorer.js +61 -181
  120. package/dist/screens/data-explorer/index.d.ts +2 -2
  121. package/dist/screens/data-explorer/query-executor.d.ts +1 -2
  122. package/dist/screens/data-explorer/query-executor.js +56 -166
  123. package/dist/screens/groups/group-details.d.ts +1 -2
  124. package/dist/screens/groups/group-details.js +27 -122
  125. package/dist/screens/groups/group-invite-listener.d.ts +2 -3
  126. package/dist/screens/groups/group-invite-listener.js +8 -104
  127. package/dist/screens/groups/group-list.d.ts +1 -2
  128. package/dist/screens/groups/group-list.js +56 -133
  129. package/dist/screens/groups/group-members.d.ts +2 -3
  130. package/dist/screens/groups/group-members.js +62 -132
  131. package/dist/screens/groups/index.d.ts +4 -4
  132. package/dist/screens/groups/index.js +1 -1
  133. package/dist/screens/join-group/index.d.ts +2 -2
  134. package/dist/screens/join-group/join-group.d.ts +1 -2
  135. package/dist/screens/join-group/join-group.js +9 -109
  136. package/dist/screens/network-viewer/connection-troubleshooter.d.ts +2 -3
  137. package/dist/screens/network-viewer/connection-troubleshooter.js +89 -193
  138. package/dist/screens/network-viewer/cpu-usage-graph.d.ts +1 -2
  139. package/dist/screens/network-viewer/cpu-usage-graph.js +60 -99
  140. package/dist/screens/network-viewer/device-details-modal.d.ts +1 -2
  141. package/dist/screens/network-viewer/device-details-modal.js +25 -177
  142. package/dist/screens/network-viewer/group-details-modal.d.ts +1 -2
  143. package/dist/screens/network-viewer/group-details-modal.js +31 -142
  144. package/dist/screens/network-viewer/index.d.ts +4 -4
  145. package/dist/screens/network-viewer/index.js +3 -3
  146. package/dist/screens/network-viewer/network-viewer-ipc.d.ts +22 -0
  147. package/dist/screens/network-viewer/network-viewer-ipc.js +6 -0
  148. package/dist/screens/network-viewer/network-viewer.d.ts +1 -2
  149. package/dist/screens/network-viewer/network-viewer.js +91 -296
  150. package/dist/screens/network-viewer/usage-graph.d.ts +1 -2
  151. package/dist/screens/network-viewer/usage-graph.js +78 -110
  152. package/dist/screens/packages/package-details.d.ts +1 -2
  153. package/dist/screens/packages/package-details.js +35 -41
  154. package/dist/screens/packages/package-info.d.ts +2 -2
  155. package/dist/screens/packages/package-info.js +33 -86
  156. package/dist/screens/packages/package-list.d.ts +1 -2
  157. package/dist/screens/packages/package-list.js +42 -106
  158. package/dist/screens/packages/package-new-local.d.ts +1 -2
  159. package/dist/screens/packages/package-new-local.js +13 -19
  160. package/dist/screens/packages/package-versions.d.ts +2 -3
  161. package/dist/screens/packages/package-versions.js +29 -96
  162. package/dist/screens/peer-types/peer-type-details.d.ts +3 -4
  163. package/dist/screens/peer-types/peer-type-details.js +26 -78
  164. package/dist/screens/peer-types/peer-type-list.d.ts +1 -2
  165. package/dist/screens/peer-types/peer-type-list.js +13 -24
  166. package/dist/screens/search/global-search.d.ts +1 -2
  167. package/dist/screens/search/global-search.js +104 -182
  168. package/dist/screens/settings/color-mode-dropdown.d.ts +3 -4
  169. package/dist/screens/settings/color-mode-dropdown.js +18 -37
  170. package/dist/screens/settings/settings-page.d.ts +1 -1
  171. package/dist/screens/settings/settings-page.js +86 -213
  172. package/dist/screens/settings/voice-settings-agent.d.ts +1 -1
  173. package/dist/screens/settings/voice-settings-agent.js +7 -44
  174. package/dist/screens/settings/voice-settings-api-keys.d.ts +2 -2
  175. package/dist/screens/settings/voice-settings-api-keys.js +2 -29
  176. package/dist/screens/settings/voice-settings-output.d.ts +2 -2
  177. package/dist/screens/settings/voice-settings-output.js +2 -40
  178. package/dist/screens/settings/voice-settings-providers.d.ts +2 -2
  179. package/dist/screens/settings/voice-settings-providers.js +2 -19
  180. package/dist/screens/settings/voice-settings-types.d.ts +4 -4
  181. package/dist/screens/settings/voice-settings-types.js +31 -31
  182. package/dist/screens/settings/voice-settings-wake-word.d.ts +2 -2
  183. package/dist/screens/settings/voice-settings-wake-word.js +2 -33
  184. package/dist/screens/settings/voice-settings.d.ts +1 -1
  185. package/dist/screens/settings/voice-settings.js +35 -112
  186. package/dist/screens/setup-user.d.ts +1 -2
  187. package/dist/screens/setup-user.js +38 -116
  188. package/dist/screens/tools/tool-code.d.ts +2 -3
  189. package/dist/screens/tools/tool-code.js +9 -13
  190. package/dist/screens/tools/tool-details.d.ts +1 -2
  191. package/dist/screens/tools/tool-details.js +26 -39
  192. package/dist/screens/tools/tool-info.d.ts +2 -3
  193. package/dist/screens/tools/tool-info.js +9 -48
  194. package/dist/screens/tools/tool-list.d.ts +1 -2
  195. package/dist/screens/tools/tool-list.js +33 -65
  196. package/dist/screens/tools/tool-schema.d.ts +2 -3
  197. package/dist/screens/tools/tool-schema.js +2 -13
  198. package/dist/screens/tools/tool-test-details.d.ts +1 -2
  199. package/dist/screens/tools/tool-test-details.js +12 -28
  200. package/dist/screens/tools/tool-test-list.d.ts +1 -2
  201. package/dist/screens/tools/tool-test-list.js +17 -56
  202. package/dist/screens/variables/variable-details.d.ts +1 -2
  203. package/dist/screens/variables/variable-details.js +19 -86
  204. package/dist/screens/variables/variable-list.d.ts +1 -2
  205. package/dist/screens/variables/variable-list.js +16 -27
  206. package/dist/screens/welcome-modal.d.ts +1 -2
  207. package/dist/screens/welcome-modal.js +44 -111
  208. package/dist/screens/workflows/workflow-details.d.ts +1 -2
  209. package/dist/screens/workflows/workflow-details.js +17 -31
  210. package/dist/screens/workflows/workflow-info.d.ts +2 -3
  211. package/dist/screens/workflows/workflow-info.js +2 -9
  212. package/dist/screens/workflows/workflow-instructions.d.ts +2 -3
  213. package/dist/screens/workflows/workflow-instructions.js +23 -55
  214. package/dist/screens/workflows/workflow-list.d.ts +1 -2
  215. package/dist/screens/workflows/workflow-list.js +23 -62
  216. package/dist/setupTests.d.ts +1 -1
  217. package/dist/setupTests.js +10 -11
  218. package/dist/system-apps/assistants.app.d.ts +1 -1
  219. package/dist/system-apps/assistants.app.js +3 -3
  220. package/dist/system-apps/console-logs.app.d.ts +1 -1
  221. package/dist/system-apps/console-logs.app.js +3 -3
  222. package/dist/system-apps/contacts.app.d.ts +1 -1
  223. package/dist/system-apps/contacts.app.js +4 -4
  224. package/dist/system-apps/data-explorer.app.d.ts +1 -1
  225. package/dist/system-apps/data-explorer.app.js +4 -4
  226. package/dist/system-apps/groups.app.d.ts +1 -1
  227. package/dist/system-apps/groups.app.js +4 -4
  228. package/dist/system-apps/index.d.ts +17 -17
  229. package/dist/system-apps/index.js +52 -52
  230. package/dist/system-apps/join-group.app.d.ts +1 -1
  231. package/dist/system-apps/join-group.app.js +4 -4
  232. package/dist/system-apps/mobile-settings.app.d.ts +1 -1
  233. package/dist/system-apps/mobile-settings.app.js +3 -3
  234. package/dist/system-apps/network-viewer.app.d.ts +1 -1
  235. package/dist/system-apps/network-viewer.app.js +4 -4
  236. package/dist/system-apps/packages.app.d.ts +1 -1
  237. package/dist/system-apps/packages.app.js +3 -3
  238. package/dist/system-apps/search.app.d.ts +1 -1
  239. package/dist/system-apps/search.app.js +4 -4
  240. package/dist/system-apps/settings.app.d.ts +1 -1
  241. package/dist/system-apps/settings.app.js +3 -3
  242. package/dist/system-apps/threads.app.d.ts +1 -1
  243. package/dist/system-apps/threads.app.js +3 -3
  244. package/dist/system-apps/tools.app.d.ts +1 -1
  245. package/dist/system-apps/tools.app.js +3 -3
  246. package/dist/system-apps/types.app.d.ts +1 -1
  247. package/dist/system-apps/types.app.js +3 -3
  248. package/dist/system-apps/variables.app.d.ts +1 -1
  249. package/dist/system-apps/variables.app.js +3 -3
  250. package/dist/system-apps/workflows.app.d.ts +1 -1
  251. package/dist/system-apps/workflows.app.js +3 -3
  252. package/dist/tabs-layout/tabs-layout.d.ts +2 -3
  253. package/dist/tabs-layout/tabs-layout.js +215 -246
  254. package/dist/tabs-layout/tabs-state.d.ts +2 -2
  255. package/dist/tabs-layout/tabs-state.js +73 -61
  256. package/dist/ui-defaults/index.d.ts +2 -2
  257. package/dist/ui-defaults/list-screen.d.ts +2 -3
  258. package/dist/ui-defaults/list-screen.js +33 -37
  259. package/dist/ui-defaults/markdown-field.js +24 -56
  260. package/dist/ui-router/routes-loader.d.ts +1 -1
  261. package/dist/ui-router/routes-loader.js +17 -13
  262. package/dist/ui-router/ui-loader.d.ts +6 -6
  263. package/dist/ui-router/ui-loader.js +172 -268
  264. package/dist/utils.js +49 -39
  265. package/jest.config.js +16 -16
  266. package/package.json +16 -14
  267. package/src/command-palette/command-palette-ui.tsx +261 -237
  268. package/src/command-palette/command-palette.ts +81 -78
  269. package/src/components/chat-overlay.tsx +366 -261
  270. package/src/components/checkbox.tsx +15 -12
  271. package/src/components/group-switcher.tsx +150 -105
  272. package/src/components/input-date.tsx +17 -16
  273. package/src/components/input-number.tsx +47 -31
  274. package/src/components/input.tsx +15 -12
  275. package/src/components/inverse-lazy-list.tsx +14 -13
  276. package/src/components/io-schema-values.tsx +51 -69
  277. package/src/components/io-schema.tsx +94 -69
  278. package/src/components/lazy-list.tsx +51 -34
  279. package/src/components/list-screen.tsx +51 -35
  280. package/src/components/loading-indicator.tsx +2 -4
  281. package/src/components/markdown-editor/autolink-plugin.tsx +4 -11
  282. package/src/components/markdown-editor/editor-inline.tsx +3 -4
  283. package/src/components/markdown-editor/editor.tsx +53 -51
  284. package/src/components/markdown-editor/markdown-plugin.tsx +48 -40
  285. package/src/components/markdown-editor/mention-node.ts +39 -38
  286. package/src/components/markdown-editor/mentions-plugin.tsx +99 -101
  287. package/src/components/markdown-editor/theme.ts +28 -29
  288. package/src/components/markdown-editor/toolbar.tsx +53 -47
  289. package/src/components/markdown-with-mentions.tsx +56 -46
  290. package/src/components/message-logs/message-logs.tsx +225 -165
  291. package/src/components/messages/avatar.tsx +70 -52
  292. package/src/components/messages/channel-message-list.tsx +80 -68
  293. package/src/components/messages/channel-view.tsx +34 -33
  294. package/src/components/messages/message-compose.tsx +84 -67
  295. package/src/components/messages/message-display.tsx +103 -89
  296. package/src/components/messages/thread-message-list.tsx +53 -44
  297. package/src/components/router.tsx +42 -43
  298. package/src/components/save-button.tsx +43 -39
  299. package/src/components/sortable-list.tsx +77 -49
  300. package/src/components/tabs.tsx +31 -31
  301. package/src/components/tooltip.tsx +21 -28
  302. package/src/components/trust-level-badge.tsx +15 -11
  303. package/src/components/trust-level-dropdown.tsx +49 -19
  304. package/src/components/typeahead.tsx +57 -59
  305. package/src/components/voice-indicator.tsx +158 -141
  306. package/src/components/voice-subscribe-events.ts +20 -0
  307. package/src/globals.tsx +42 -40
  308. package/src/hooks.test.tsx +141 -134
  309. package/src/hooks.ts +80 -48
  310. package/src/index.tsx +17 -10
  311. package/src/mention-configs.ts +122 -68
  312. package/src/screens/assistants/assistant-config.tsx +28 -18
  313. package/src/screens/assistants/assistant-details.tsx +35 -36
  314. package/src/screens/assistants/assistant-info.tsx +16 -11
  315. package/src/screens/assistants/assistant-list.tsx +37 -34
  316. package/src/screens/assistants/assistant-tools.tsx +41 -20
  317. package/src/screens/console-logs/console-logs-list.tsx +173 -140
  318. package/src/screens/console-logs/log-display.tsx +65 -38
  319. package/src/screens/console-logs/log-filters.tsx +4 -3
  320. package/src/screens/console-logs/mobile-log-card.tsx +78 -71
  321. package/src/screens/console-logs/resizable-table-header.tsx +29 -21
  322. package/src/screens/contacts/contact-details.tsx +29 -30
  323. package/src/screens/contacts/contact-list.tsx +71 -60
  324. package/src/screens/contacts/index.ts +5 -5
  325. package/src/screens/contacts/user-connect.tsx +177 -171
  326. package/src/screens/data-explorer/data-explorer.tsx +134 -98
  327. package/src/screens/data-explorer/index.ts +2 -3
  328. package/src/screens/data-explorer/query-executor.tsx +90 -80
  329. package/src/screens/groups/group-details.tsx +120 -101
  330. package/src/screens/groups/group-invite-listener.tsx +34 -37
  331. package/src/screens/groups/group-list.tsx +119 -103
  332. package/src/screens/groups/group-members.tsx +225 -164
  333. package/src/screens/groups/index.ts +5 -6
  334. package/src/screens/join-group/index.ts +2 -2
  335. package/src/screens/join-group/join-group.tsx +41 -39
  336. package/src/screens/network-viewer/connection-troubleshooter.tsx +145 -104
  337. package/src/screens/network-viewer/cpu-usage-graph.tsx +39 -43
  338. package/src/screens/network-viewer/device-details-modal.tsx +46 -59
  339. package/src/screens/network-viewer/group-details-modal.tsx +68 -49
  340. package/src/screens/network-viewer/index.ts +4 -5
  341. package/src/screens/network-viewer/network-viewer-ipc.ts +23 -0
  342. package/src/screens/network-viewer/network-viewer.tsx +261 -236
  343. package/src/screens/network-viewer/usage-graph.tsx +57 -49
  344. package/src/screens/packages/package-details.tsx +43 -35
  345. package/src/screens/packages/package-info.tsx +107 -66
  346. package/src/screens/packages/package-list.tsx +175 -98
  347. package/src/screens/packages/package-new-local.tsx +28 -26
  348. package/src/screens/packages/package-versions.tsx +102 -77
  349. package/src/screens/peer-types/peer-type-details.tsx +60 -50
  350. package/src/screens/peer-types/peer-type-list.tsx +20 -30
  351. package/src/screens/search/global-search.tsx +153 -137
  352. package/src/screens/settings/color-mode-dropdown.tsx +52 -35
  353. package/src/screens/settings/settings-page.tsx +215 -141
  354. package/src/screens/settings/voice-settings-agent.tsx +13 -12
  355. package/src/screens/settings/voice-settings-api-keys.tsx +14 -12
  356. package/src/screens/settings/voice-settings-output.tsx +12 -11
  357. package/src/screens/settings/voice-settings-providers.tsx +7 -3
  358. package/src/screens/settings/voice-settings-types.ts +52 -49
  359. package/src/screens/settings/voice-settings-wake-word.tsx +25 -9
  360. package/src/screens/settings/voice-settings.tsx +66 -43
  361. package/src/screens/setup-user.tsx +88 -41
  362. package/src/screens/tools/tool-code.tsx +12 -17
  363. package/src/screens/tools/tool-details.tsx +28 -28
  364. package/src/screens/tools/tool-info.tsx +14 -19
  365. package/src/screens/tools/tool-list.tsx +58 -40
  366. package/src/screens/tools/tool-schema.tsx +16 -9
  367. package/src/screens/tools/tool-test-details.tsx +11 -22
  368. package/src/screens/tools/tool-test-list.tsx +29 -30
  369. package/src/screens/variables/variable-details.tsx +63 -51
  370. package/src/screens/variables/variable-list.tsx +29 -30
  371. package/src/screens/welcome-modal.tsx +68 -48
  372. package/src/screens/workflows/workflow-details.tsx +40 -30
  373. package/src/screens/workflows/workflow-info.tsx +4 -11
  374. package/src/screens/workflows/workflow-instructions.tsx +35 -28
  375. package/src/screens/workflows/workflow-list.tsx +50 -40
  376. package/src/setupTests.ts +14 -13
  377. package/src/system-apps/assistants.app.ts +5 -5
  378. package/src/system-apps/console-logs.app.ts +4 -4
  379. package/src/system-apps/contacts.app.ts +6 -6
  380. package/src/system-apps/data-explorer.app.ts +5 -5
  381. package/src/system-apps/groups.app.ts +6 -6
  382. package/src/system-apps/index.ts +49 -49
  383. package/src/system-apps/join-group.app.ts +5 -5
  384. package/src/system-apps/mobile-settings.app.ts +4 -5
  385. package/src/system-apps/network-viewer.app.ts +5 -5
  386. package/src/system-apps/packages.app.ts +5 -5
  387. package/src/system-apps/search.app.ts +6 -6
  388. package/src/system-apps/settings.app.ts +5 -5
  389. package/src/system-apps/threads.app.ts +5 -5
  390. package/src/system-apps/tools.app.ts +5 -5
  391. package/src/system-apps/types.app.ts +5 -5
  392. package/src/system-apps/variables.app.ts +5 -5
  393. package/src/system-apps/workflows.app.ts +5 -5
  394. package/src/tabs-layout/tabs-layout.tsx +345 -254
  395. package/src/tabs-layout/tabs-state.ts +100 -81
  396. package/src/ui-defaults/index.ts +2 -3
  397. package/src/ui-defaults/list-screen.tsx +45 -40
  398. package/src/ui-defaults/markdown-field.tsx +22 -26
  399. package/src/ui-router/routes-loader.ts +40 -24
  400. package/src/ui-router/ui-loader.tsx +312 -214
  401. package/src/utils.ts +68 -81
  402. package/tsconfig.json +5 -10
  403. package/dist/components/input-datetime.d.ts +0 -7
  404. package/dist/components/input-datetime.js +0 -35
  405. package/dist/components/lazy-sortable-list.d.ts +0 -29
  406. package/dist/components/lazy-sortable-list.js +0 -12
  407. package/dist/components/left-bar.d.ts +0 -5
  408. package/dist/components/left-bar.js +0 -207
  409. package/dist/components/main-content-container.d.ts +0 -2
  410. package/dist/components/main-content-container.js +0 -92
  411. package/dist/components/messages/thread-view.d.ts +0 -6
  412. package/dist/components/messages/thread-view.js +0 -174
  413. package/dist/components/off-canvas.d.ts +0 -13
  414. package/dist/components/off-canvas.js +0 -89
  415. package/dist/components/text-list-editor.tsx/text-list-editor.d.ts +0 -6
  416. package/dist/components/text-list-editor.tsx/text-list-editor.js +0 -13
  417. package/dist/components/top-bar.d.ts +0 -2
  418. package/dist/components/top-bar.js +0 -51
  419. package/dist/components/typeahead/mentions-plugin.d.ts +0 -7
  420. package/dist/components/typeahead/mentions-plugin.js +0 -203
  421. package/dist/components/typeahead/typeahead-editor.d.ts +0 -15
  422. package/dist/components/typeahead/typeahead-editor.js +0 -134
  423. package/dist/components/typeahead/typeahead.d.ts +0 -12
  424. package/dist/components/typeahead/typeahead.js +0 -94
  425. package/dist/screens/profile.d.ts +0 -2
  426. package/dist/screens/profile.js +0 -76
  427. package/src/components/input-datetime.tsx +0 -41
  428. package/src/components/lazy-sortable-list.tsx +0 -51
  429. package/src/components/left-bar.tsx +0 -322
  430. package/src/components/main-content-container.tsx +0 -79
  431. package/src/components/messages/thread-view.tsx +0 -214
  432. package/src/components/off-canvas.tsx +0 -83
  433. package/src/components/text-list-editor.tsx/text-list-editor.tsx +0 -13
  434. package/src/components/top-bar.tsx +0 -119
  435. package/src/components/typeahead/mentions-plugin.tsx +0 -265
  436. package/src/components/typeahead/typeahead-editor.tsx +0 -140
  437. package/src/components/typeahead/typeahead.tsx +0 -77
  438. package/src/screens/profile.tsx +0 -75
@@ -1,18 +1,18 @@
1
- import React, { useEffect, useRef, useState } from 'react';
2
- import { useObservable } from '../../hooks';
3
- import { colorMode } from '../settings/color-mode-dropdown';
4
- import { goToTabPath } from '../../tabs-layout/tabs-state';
5
- import {
6
- toolMentionConfig,
7
- userMentionConfig,
8
- assistantMentionConfig,
9
- workflowMentionConfig,
1
+ import type { IAppNav, IMentionData } from "@peers-app/peers-sdk";
2
+ import { useCallback, useEffect, useRef, useState } from "react";
3
+ import { useObservable } from "../../hooks";
4
+ import {
5
+ assistantMentionConfig,
6
+ type IMentionConfig,
7
+ toolMentionConfig,
8
+ userMentionConfig,
10
9
  valueTypeMentionConfig,
11
- IMentionConfig
12
- } from '../../mention-configs';
13
- import { IMentionData, IAppNav } from "@peers-app/peers-sdk";
14
- import { allPackages } from '../../ui-router/routes-loader';
15
- import { systemPackage } from '../../system-apps';
10
+ workflowMentionConfig,
11
+ } from "../../mention-configs";
12
+ import { systemPackage } from "../../system-apps";
13
+ import { goToTabPath } from "../../tabs-layout/tabs-state";
14
+ import { allPackages } from "../../ui-router/routes-loader";
15
+ import { colorMode } from "../settings/color-mode-dropdown";
16
16
 
17
17
  interface SearchResult {
18
18
  config: IMentionConfig;
@@ -30,16 +30,28 @@ interface AppSearchItem {
30
30
  iconClassName: string;
31
31
  }
32
32
 
33
+ const searchConfigs: Array<{
34
+ config: IMentionConfig;
35
+ category: string;
36
+ navigationPath: string;
37
+ }> = [
38
+ { config: toolMentionConfig, category: "Tools", navigationPath: "tools" },
39
+ { config: assistantMentionConfig, category: "Assistants", navigationPath: "assistants" },
40
+ { config: workflowMentionConfig, category: "Workflows", navigationPath: "workflows" },
41
+ { config: valueTypeMentionConfig, category: "Types", navigationPath: "peer-types" },
42
+ { config: userMentionConfig, category: "Users", navigationPath: "contacts" },
43
+ ];
44
+
33
45
  export function GlobalSearch() {
34
46
  const [_colorMode] = useObservable(colorMode);
35
47
  const [packages] = useObservable(allPackages);
36
- const [searchQuery, setSearchQuery] = useState('');
48
+ const [searchQuery, setSearchQuery] = useState("");
37
49
  const [searchResults, setSearchResults] = useState<SearchResult[]>([]);
38
50
  const [appResults, setAppResults] = useState<AppSearchItem[]>([]);
39
51
  const [isSearching, setIsSearching] = useState(false);
40
52
  const inputRef = useRef<HTMLInputElement>(null);
41
-
42
- const isDark = _colorMode === 'dark';
53
+
54
+ const isDark = _colorMode === "dark";
43
55
 
44
56
  // Focus search input on mount
45
57
  useEffect(() => {
@@ -48,30 +60,23 @@ export function GlobalSearch() {
48
60
  }
49
61
  }, []);
50
62
 
51
- // Search configs with their display names
52
- const searchConfigs: Array<{ config: IMentionConfig; category: string; navigationPath: string }> = [
53
- { config: toolMentionConfig, category: 'Tools', navigationPath: 'tools' },
54
- { config: assistantMentionConfig, category: 'Assistants', navigationPath: 'assistants' },
55
- { config: workflowMentionConfig, category: 'Workflows', navigationPath: 'workflows' },
56
- { config: valueTypeMentionConfig, category: 'Types', navigationPath: 'peer-types' },
57
- { config: userMentionConfig, category: 'Users', navigationPath: 'profile' },
58
- ];
59
-
60
63
  // Get all apps (system and user)
61
- const getAllApps = (): AppSearchItem[] => {
64
+ const getAllApps = useCallback((): AppSearchItem[] => {
62
65
  const allPackages_ = [...packages, systemPackage];
63
66
  return allPackages_
64
- .filter(p => !p.disabled && p.appNavs && p.appNavs.length > 0)
65
- .flatMap(pkg =>
66
- pkg.appNavs!.map(navItem => {
67
+ .filter((p) => !p.disabled && p.appNavs && p.appNavs.length > 0)
68
+ .flatMap((pkg) => {
69
+ const navs = pkg.appNavs;
70
+ if (!navs?.length) return [];
71
+ return navs.map((navItem) => {
67
72
  // Construct path - use direct path for system apps, package-nav for others
68
73
  let path: string;
69
- if (pkg.packageId === 'system-apps') {
70
- path = navItem.navigationPath ?? navItem.name.replace(/\s/g, '-').toLowerCase();
74
+ if (pkg.packageId === "system-apps") {
75
+ path = navItem.navigationPath ?? navItem.name.replace(/\s/g, "-").toLowerCase();
71
76
  } else {
72
- path = `package-nav/${pkg.packageId}/${(navItem.navigationPath ?? navItem.name).replace(/[^a-zA-Z0-9]/g, '-').toLowerCase()}`;
73
- while (path.includes('//')) {
74
- path = path.replace('//', '/');
77
+ path = `package-nav/${pkg.packageId}/${(navItem.navigationPath ?? navItem.name).replace(/[^a-zA-Z0-9]/g, "-").toLowerCase()}`;
78
+ while (path.includes("//")) {
79
+ path = path.replace("//", "/");
75
80
  }
76
81
  }
77
82
 
@@ -82,11 +87,11 @@ export function GlobalSearch() {
82
87
  path,
83
88
  name: navItem.name,
84
89
  displayName: navItem.displayName || navItem.name,
85
- iconClassName: navItem.iconClassName || 'bi-box-seam'
90
+ iconClassName: navItem.iconClassName || "bi-box-seam",
86
91
  };
87
- })
88
- );
89
- };
92
+ });
93
+ });
94
+ }, [packages]);
90
95
 
91
96
  // Debounced search effect
92
97
  useEffect(() => {
@@ -115,16 +120,17 @@ export function GlobalSearch() {
115
120
 
116
121
  const searchResults = await Promise.all(searchPromises);
117
122
  const filteredResults = searchResults.filter(Boolean) as SearchResult[];
118
-
123
+
119
124
  setSearchResults(filteredResults);
120
125
 
121
126
  // Search apps
122
127
  const allApps = getAllApps();
123
128
  const lowerQuery = searchQuery.toLowerCase();
124
- const filteredApps = allApps.filter(app =>
125
- app.name.toLowerCase().includes(lowerQuery) ||
126
- app.displayName.toLowerCase().includes(lowerQuery) ||
127
- app.packageName.toLowerCase().includes(lowerQuery)
129
+ const filteredApps = allApps.filter(
130
+ (app) =>
131
+ app.name.toLowerCase().includes(lowerQuery) ||
132
+ app.displayName.toLowerCase().includes(lowerQuery) ||
133
+ app.packageName.toLowerCase().includes(lowerQuery),
128
134
  );
129
135
  setAppResults(filteredApps);
130
136
  } finally {
@@ -133,7 +139,7 @@ export function GlobalSearch() {
133
139
  }, 300); // 300ms debounce
134
140
 
135
141
  return () => clearTimeout(timeoutId);
136
- }, [searchQuery, packages]);
142
+ }, [searchQuery, getAllApps]);
137
143
 
138
144
  const handleItemClick = (result: SearchResult, item: IMentionData) => {
139
145
  // Try using the config's onClick first
@@ -142,16 +148,10 @@ export function GlobalSearch() {
142
148
  return;
143
149
  }
144
150
 
145
- // Otherwise navigate to the appropriate list page
146
- const configPath = searchConfigs.find(c => c.config === result.config)?.navigationPath;
151
+ // Detail route under the same system app as list (e.g. tools/:id, contacts/:userId).
152
+ const configPath = searchConfigs.find((c) => c.config === result.config)?.navigationPath;
147
153
  if (configPath) {
148
- if (configPath === 'profile') {
149
- // Special case for users - just go to profile for now
150
- goToTabPath('profile');
151
- } else {
152
- // Navigate to the detail page if possible
153
- goToTabPath(`${configPath}/${item.id}`);
154
- }
154
+ goToTabPath(`${configPath}/${item.id}`);
155
155
  }
156
156
  };
157
157
 
@@ -159,69 +159,70 @@ export function GlobalSearch() {
159
159
  goToTabPath(app.path);
160
160
  };
161
161
 
162
- const totalResults = searchResults.reduce((sum, result) => sum + result.items.length, 0) + appResults.length;
162
+ const totalResults =
163
+ searchResults.reduce((sum, result) => sum + result.items.length, 0) + appResults.length;
163
164
 
164
165
  return (
165
- <div className="container-fluid h-100 p-4" style={{ maxHeight: '100vh', overflowY: 'auto' }}>
166
+ <div className="container-fluid h-100 p-4" style={{ maxHeight: "100vh", overflowY: "auto" }}>
166
167
  {/* Search Header */}
167
168
  <div className="mb-4">
168
169
  <h1 className="h3 mb-3 d-flex align-items-center">
169
170
  <i className="bi-search me-3" />
170
171
  Search Everything
171
172
  </h1>
172
-
173
+
173
174
  {/* Search Input */}
174
175
  <div className="position-relative">
175
- <i
176
- className="bi-search position-absolute"
176
+ <i
177
+ className="bi-search position-absolute"
177
178
  style={{
178
- left: '16px',
179
- top: '50%',
180
- transform: 'translateY(-50%)',
181
- color: '#6c757d',
179
+ left: "16px",
180
+ top: "50%",
181
+ transform: "translateY(-50%)",
182
+ color: "#6c757d",
182
183
  zIndex: 1,
183
- fontSize: '18px'
184
- }}
184
+ fontSize: "18px",
185
+ }}
185
186
  />
186
187
  <input
187
188
  ref={inputRef}
188
189
  type="text"
189
- className={`form-control form-control-lg ${isDark ? 'bg-dark text-light border-secondary' : ''}`}
190
+ className={`form-control form-control-lg ${isDark ? "bg-dark text-light border-secondary" : ""}`}
190
191
  placeholder="Search across apps, tools, assistants, workflows, and more..."
191
192
  value={searchQuery}
192
193
  onChange={(e) => setSearchQuery(e.target.value)}
193
194
  style={{
194
- paddingLeft: '50px',
195
- fontSize: '18px',
196
- borderRadius: '12px',
197
- backgroundColor: isDark ? '#343a40' : '#f8f9fa',
198
- border: isDark ? '2px solid #495057' : '2px solid #dee2e6'
195
+ paddingLeft: "50px",
196
+ fontSize: "18px",
197
+ borderRadius: "12px",
198
+ backgroundColor: isDark ? "#343a40" : "#f8f9fa",
199
+ border: isDark ? "2px solid #495057" : "2px solid #dee2e6",
199
200
  }}
200
201
  />
201
202
  {isSearching && (
202
- <div
203
+ <div
203
204
  className="position-absolute"
204
205
  style={{
205
- right: '16px',
206
- top: '50%',
207
- transform: 'translateY(-50%)'
206
+ right: "16px",
207
+ top: "50%",
208
+ transform: "translateY(-50%)",
208
209
  }}
209
210
  >
210
211
  <div className="spinner-border spinner-border-sm text-muted" />
211
212
  </div>
212
213
  )}
213
214
  </div>
214
-
215
+
215
216
  {/* Search Stats */}
216
217
  {searchQuery && (
217
218
  <div className="mt-3 text-muted small">
218
- {isSearching ? (
219
- 'Searching...'
220
- ) : totalResults > 0 ? (
221
- `Found ${totalResults} result${totalResults !== 1 ? 's' : ''}`
222
- ) : searchQuery.trim() ? (
223
- 'No results found'
224
- ) : null}
219
+ {isSearching
220
+ ? "Searching..."
221
+ : totalResults > 0
222
+ ? `Found ${totalResults} result${totalResults !== 1 ? "s" : ""}`
223
+ : searchQuery.trim()
224
+ ? "No results found"
225
+ : null}
225
226
  </div>
226
227
  )}
227
228
  </div>
@@ -231,11 +232,9 @@ export function GlobalSearch() {
231
232
  <div>
232
233
  {searchResults.length === 0 && appResults.length === 0 ? (
233
234
  <div className="text-center py-5">
234
- <i className="bi-search mb-3 d-block text-muted" style={{ fontSize: '48px' }} />
235
+ <i className="bi-search mb-3 d-block text-muted" style={{ fontSize: "48px" }} />
235
236
  <h4 className="text-muted">No results found</h4>
236
- <p className="text-muted">
237
- Try different keywords or check your spelling
238
- </p>
237
+ <p className="text-muted">Try different keywords or check your spelling</p>
239
238
  </div>
240
239
  ) : (
241
240
  <div>
@@ -243,51 +242,61 @@ export function GlobalSearch() {
243
242
  {appResults.length > 0 && (
244
243
  <div className="mb-5">
245
244
  <div className="d-flex align-items-center mb-3">
246
- <i className="bi-grid-3x3-gap me-3" style={{ fontSize: '20px', color: '#6c757d' }} />
245
+ <i
246
+ className="bi-grid-3x3-gap me-3"
247
+ style={{ fontSize: "20px", color: "#6c757d" }}
248
+ />
247
249
  <h4 className="mb-0 me-3">Apps</h4>
248
250
  <span className="badge bg-secondary">{appResults.length}</span>
249
251
  </div>
250
252
  <div className="row g-3">
251
253
  {appResults.map((app) => (
252
- <div key={`${app.packageId}-${app.path}`} className="col-12 col-md-6 col-lg-4">
254
+ <div
255
+ key={`${app.packageId}-${app.path}`}
256
+ className="col-12 col-md-6 col-lg-4"
257
+ >
253
258
  <div
254
- className={`card h-100 ${isDark ? 'bg-dark border-secondary' : 'bg-light'}`}
259
+ className={`card h-100 ${isDark ? "bg-dark border-secondary" : "bg-light"}`}
255
260
  style={{
256
- cursor: 'pointer',
257
- transition: 'all 0.15s ease',
258
- borderRadius: '8px'
261
+ cursor: "pointer",
262
+ transition: "all 0.15s ease",
263
+ borderRadius: "8px",
259
264
  }}
260
265
  onClick={() => handleAppClick(app)}
261
266
  onMouseEnter={(e) => {
262
- e.currentTarget.style.transform = 'translateY(-2px)';
263
- e.currentTarget.style.boxShadow = isDark
264
- ? '0 4px 12px rgba(0,0,0,0.3)'
265
- : '0 4px 12px rgba(0,0,0,0.1)';
267
+ e.currentTarget.style.transform = "translateY(-2px)";
268
+ e.currentTarget.style.boxShadow = isDark
269
+ ? "0 4px 12px rgba(0,0,0,0.3)"
270
+ : "0 4px 12px rgba(0,0,0,0.1)";
266
271
  }}
267
272
  onMouseLeave={(e) => {
268
- e.currentTarget.style.transform = 'translateY(0)';
269
- e.currentTarget.style.boxShadow = 'none';
273
+ e.currentTarget.style.transform = "translateY(0)";
274
+ e.currentTarget.style.boxShadow = "none";
270
275
  }}
271
276
  >
272
277
  <div className="card-body p-3">
273
278
  <div className="d-flex align-items-start">
274
- <i
279
+ <i
275
280
  className={`${app.iconClassName} me-3 mt-1`}
276
- style={{
277
- fontSize: '16px',
278
- color: isDark ? '#0d6efd' : '#0d6efd',
279
- minWidth: '16px'
281
+ style={{
282
+ fontSize: "16px",
283
+ color: isDark ? "#0d6efd" : "#0d6efd",
284
+ minWidth: "16px",
280
285
  }}
281
286
  />
282
287
  <div className="flex-grow-1">
283
- <h6 className="card-title mb-1 fw-medium">
284
- {app.displayName}
285
- </h6>
286
- <small className="text-muted text-uppercase" style={{ fontSize: '11px', letterSpacing: '0.5px' }}>
287
- {app.packageId === 'system-apps' ? 'System App' : app.packageName}
288
+ <h6 className="card-title mb-1 fw-medium">{app.displayName}</h6>
289
+ <small
290
+ className="text-muted text-uppercase"
291
+ style={{ fontSize: "11px", letterSpacing: "0.5px" }}
292
+ >
293
+ {app.packageId === "system-apps" ? "System App" : app.packageName}
288
294
  </small>
289
295
  </div>
290
- <i className="bi-arrow-right text-muted" style={{ fontSize: '12px' }} />
296
+ <i
297
+ className="bi-arrow-right text-muted"
298
+ style={{ fontSize: "12px" }}
299
+ />
291
300
  </div>
292
301
  </div>
293
302
  </div>
@@ -302,7 +311,10 @@ export function GlobalSearch() {
302
311
  <div key={result.category} className="mb-5">
303
312
  {/* Category Header */}
304
313
  <div className="d-flex align-items-center mb-3">
305
- <i className={`${result.config.iconClass} me-3`} style={{ fontSize: '20px', color: '#6c757d' }} />
314
+ <i
315
+ className={`${result.config.iconClass} me-3`}
316
+ style={{ fontSize: "20px", color: "#6c757d" }}
317
+ />
306
318
  <h4 className="mb-0 me-3">{result.category}</h4>
307
319
  <span className="badge bg-secondary">{result.items.length}</span>
308
320
  </div>
@@ -312,43 +324,47 @@ export function GlobalSearch() {
312
324
  {result.items.map((item) => (
313
325
  <div key={item.id} className="col-12 col-md-6 col-lg-4">
314
326
  <div
315
- className={`card h-100 ${isDark ? 'bg-dark border-secondary' : 'bg-light'}`}
327
+ className={`card h-100 ${isDark ? "bg-dark border-secondary" : "bg-light"}`}
316
328
  style={{
317
- cursor: 'pointer',
318
- transition: 'all 0.15s ease',
319
- borderRadius: '8px'
329
+ cursor: "pointer",
330
+ transition: "all 0.15s ease",
331
+ borderRadius: "8px",
320
332
  }}
321
333
  onClick={() => handleItemClick(result, item)}
322
334
  onMouseEnter={(e) => {
323
- e.currentTarget.style.transform = 'translateY(-2px)';
324
- e.currentTarget.style.boxShadow = isDark
325
- ? '0 4px 12px rgba(0,0,0,0.3)'
326
- : '0 4px 12px rgba(0,0,0,0.1)';
335
+ e.currentTarget.style.transform = "translateY(-2px)";
336
+ e.currentTarget.style.boxShadow = isDark
337
+ ? "0 4px 12px rgba(0,0,0,0.3)"
338
+ : "0 4px 12px rgba(0,0,0,0.1)";
327
339
  }}
328
340
  onMouseLeave={(e) => {
329
- e.currentTarget.style.transform = 'translateY(0)';
330
- e.currentTarget.style.boxShadow = 'none';
341
+ e.currentTarget.style.transform = "translateY(0)";
342
+ e.currentTarget.style.boxShadow = "none";
331
343
  }}
332
344
  >
333
345
  <div className="card-body p-3">
334
346
  <div className="d-flex align-items-start">
335
- <i
347
+ <i
336
348
  className={`${result.config.iconClass} me-3 mt-1`}
337
- style={{
338
- fontSize: '16px',
339
- color: isDark ? '#0d6efd' : '#0d6efd',
340
- minWidth: '16px'
349
+ style={{
350
+ fontSize: "16px",
351
+ color: isDark ? "#0d6efd" : "#0d6efd",
352
+ minWidth: "16px",
341
353
  }}
342
354
  />
343
355
  <div className="flex-grow-1">
344
- <h6 className="card-title mb-1 fw-medium">
345
- {item.name}
346
- </h6>
347
- <small className="text-muted text-uppercase" style={{ fontSize: '11px', letterSpacing: '0.5px' }}>
356
+ <h6 className="card-title mb-1 fw-medium">{item.name}</h6>
357
+ <small
358
+ className="text-muted text-uppercase"
359
+ style={{ fontSize: "11px", letterSpacing: "0.5px" }}
360
+ >
348
361
  {result.category.slice(0, -1)}
349
362
  </small>
350
363
  </div>
351
- <i className="bi-arrow-right text-muted" style={{ fontSize: '12px' }} />
364
+ <i
365
+ className="bi-arrow-right text-muted"
366
+ style={{ fontSize: "12px" }}
367
+ />
352
368
  </div>
353
369
  </div>
354
370
  </div>
@@ -365,17 +381,17 @@ export function GlobalSearch() {
365
381
  {/* Initial State */}
366
382
  {!searchQuery && (
367
383
  <div className="text-center py-5">
368
- <i className="bi-search mb-3 d-block text-muted" style={{ fontSize: '64px' }} />
384
+ <i className="bi-search mb-3 d-block text-muted" style={{ fontSize: "64px" }} />
369
385
  <h3 className="text-muted mb-3">Search across everything</h3>
370
- <p className="text-muted mb-4" style={{ maxWidth: '400px', margin: '0 auto' }}>
386
+ <p className="text-muted mb-4" style={{ maxWidth: "400px", margin: "0 auto" }}>
371
387
  Find apps, tools, assistants, workflows, types, and users all in one place.
372
388
  </p>
373
389
  <div className="d-flex flex-wrap justify-content-center gap-2">
374
390
  {searchConfigs.map(({ config, category }) => (
375
- <span
391
+ <span
376
392
  key={category}
377
- className={`badge ${isDark ? 'bg-secondary' : 'bg-light text-dark'} px-3 py-2 d-flex align-items-center`}
378
- style={{ fontSize: '12px' }}
393
+ className={`badge ${isDark ? "bg-secondary" : "bg-light text-dark"} px-3 py-2 d-flex align-items-center`}
394
+ style={{ fontSize: "12px" }}
379
395
  >
380
396
  <i className={`${config.iconClass} me-2`} />
381
397
  {category}
@@ -386,4 +402,4 @@ export function GlobalSearch() {
386
402
  )}
387
403
  </div>
388
404
  );
389
- }
405
+ }
@@ -1,43 +1,42 @@
1
1
  import { camelCaseToSpaces, deviceVar } from "@peers-app/peers-sdk";
2
- import React from 'react';
3
- import { useObservable } from '../../hooks';
2
+ import { useObservable } from "../../hooks";
4
3
 
5
- export type ColorModePreference = 'light' | 'dark' | 'auto';
6
- export type ColorMode = 'light' | 'dark';
4
+ export type ColorModePreference = "light" | "dark" | "auto";
5
+ export type ColorMode = "light" | "dark";
7
6
 
8
- export const colorMode = deviceVar<ColorMode>('colorMode', {
9
- defaultValue: 'dark',
7
+ export const colorMode = deviceVar<ColorMode>("colorMode", {
8
+ defaultValue: "dark",
10
9
  });
11
10
 
12
- export const colorModePreference = deviceVar<ColorModePreference>('colorModePreference', {
13
- defaultValue: 'dark',
11
+ export const colorModePreference = deviceVar<ColorModePreference>("colorModePreference", {
12
+ defaultValue: "dark",
14
13
  });
15
14
 
16
15
  function applyColorMode(modePreference?: ColorModePreference): ColorMode {
17
16
  if (!modePreference) {
18
- modePreference = colorModePreference() || 'dark';
17
+ modePreference = colorModePreference() || "dark";
19
18
  } else {
20
19
  colorModePreference(modePreference);
21
20
  }
22
21
  let mode = colorMode();
23
- if (modePreference === 'auto') {
24
- const isDarkMode = window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches;
25
- mode = isDarkMode ? 'dark' : 'light';
22
+ if (modePreference === "auto") {
23
+ const isDarkMode = window.matchMedia?.("(prefers-color-scheme: dark)").matches;
24
+ mode = isDarkMode ? "dark" : "light";
26
25
  } else {
27
26
  mode = modePreference;
28
27
  }
29
- document.documentElement.setAttribute('data-bs-theme', mode);
30
- if (mode === 'light') {
31
- document.documentElement.style.backgroundColor = '';
32
- document.body.style.backgroundColor = 'initial';
28
+ document.documentElement.setAttribute("data-bs-theme", mode);
29
+ if (mode === "light") {
30
+ document.documentElement.style.backgroundColor = "";
31
+ document.body.style.backgroundColor = "initial";
33
32
  } else {
34
- document.documentElement.style.backgroundColor = 'rgb(33, 37, 41)';
35
- document.body.style.backgroundColor = 'rgb(33, 37, 41)';
33
+ document.documentElement.style.backgroundColor = "rgb(33, 37, 41)";
34
+ document.body.style.backgroundColor = "rgb(33, 37, 41)";
36
35
  }
37
36
 
38
37
  const themeMeta = document.querySelector('meta[name="theme-color"]');
39
38
  if (themeMeta) {
40
- themeMeta.setAttribute('content', mode === 'light' ? '#ffffff' : '#212529');
39
+ themeMeta.setAttribute("content", mode === "light" ? "#ffffff" : "#212529");
41
40
  }
42
41
  colorMode(mode);
43
42
  colorMode.notifySubscribers();
@@ -45,21 +44,39 @@ function applyColorMode(modePreference?: ColorModePreference): ColorMode {
45
44
  return mode;
46
45
  }
47
46
 
48
- colorModePreference.subscribe(newValue => applyColorMode(newValue));
47
+ colorModePreference.subscribe((newValue) => applyColorMode(newValue));
49
48
 
50
49
  export const ColorModeDropdown = () => {
51
- const [modePreference] = useObservable(colorModePreference);
52
-
53
- return (
54
- <div className="dropdown">
55
- <button className="btn btn-secondary dropdown-toggle" type="button" id="colorModeDropdown" data-bs-toggle="dropdown" aria-expanded="false">
56
- Color Mode: {camelCaseToSpaces(modePreference)}
57
- </button>
58
- <ul className="dropdown-menu" aria-labelledby="colorModeDropdown">
59
- <li><button className="dropdown-item" onClick={() => colorModePreference('auto')}>Auto {modePreference === 'auto' && '✓'}</button></li>
60
- <li><button className="dropdown-item" onClick={() => colorModePreference('light')}>Light {modePreference === 'light' && '✓'}</button></li>
61
- <li><button className="dropdown-item" onClick={() => colorModePreference('dark')}>Dark {modePreference === 'dark' && '✓'}</button></li>
62
- </ul>
63
- </div>
64
- );
65
- };
50
+ const [modePreference] = useObservable(colorModePreference);
51
+
52
+ return (
53
+ <div className="dropdown">
54
+ <button
55
+ className="btn btn-secondary dropdown-toggle"
56
+ type="button"
57
+ id="colorModeDropdown"
58
+ data-bs-toggle="dropdown"
59
+ aria-expanded="false"
60
+ >
61
+ Color Mode: {camelCaseToSpaces(modePreference)}
62
+ </button>
63
+ <ul className="dropdown-menu" aria-labelledby="colorModeDropdown">
64
+ <li>
65
+ <button className="dropdown-item" onClick={() => colorModePreference("auto")}>
66
+ Auto {modePreference === "auto" && "✓"}
67
+ </button>
68
+ </li>
69
+ <li>
70
+ <button className="dropdown-item" onClick={() => colorModePreference("light")}>
71
+ Light {modePreference === "light" && "✓"}
72
+ </button>
73
+ </li>
74
+ <li>
75
+ <button className="dropdown-item" onClick={() => colorModePreference("dark")}>
76
+ Dark {modePreference === "dark" && "✓"}
77
+ </button>
78
+ </li>
79
+ </ul>
80
+ </div>
81
+ );
82
+ };