@syncular/ui 0.0.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 (554) hide show
  1. package/README.md +11 -0
  2. package/dist/charts/activity-chart.d.ts +11 -0
  3. package/dist/charts/activity-chart.d.ts.map +1 -0
  4. package/dist/charts/activity-chart.js +28 -0
  5. package/dist/charts/activity-chart.js.map +1 -0
  6. package/dist/charts/chart.d.ts +50 -0
  7. package/dist/charts/chart.d.ts.map +1 -0
  8. package/dist/charts/chart.js +108 -0
  9. package/dist/charts/chart.js.map +1 -0
  10. package/dist/charts/index.d.ts +5 -0
  11. package/dist/charts/index.d.ts.map +1 -0
  12. package/dist/charts/index.js +5 -0
  13. package/dist/charts/index.js.map +1 -0
  14. package/dist/charts/latency-chart.d.ts +15 -0
  15. package/dist/charts/latency-chart.d.ts.map +1 -0
  16. package/dist/charts/latency-chart.js +25 -0
  17. package/dist/charts/latency-chart.js.map +1 -0
  18. package/dist/charts/outcomes-chart.d.ts +11 -0
  19. package/dist/charts/outcomes-chart.d.ts.map +1 -0
  20. package/dist/charts/outcomes-chart.js +37 -0
  21. package/dist/charts/outcomes-chart.js.map +1 -0
  22. package/dist/console/activity-bars.d.ts +24 -0
  23. package/dist/console/activity-bars.d.ts.map +1 -0
  24. package/dist/console/activity-bars.js +25 -0
  25. package/dist/console/activity-bars.js.map +1 -0
  26. package/dist/console/alerts-config.d.ts +20 -0
  27. package/dist/console/alerts-config.d.ts.map +1 -0
  28. package/dist/console/alerts-config.js +31 -0
  29. package/dist/console/alerts-config.js.map +1 -0
  30. package/dist/console/api-keys-table.d.ts +16 -0
  31. package/dist/console/api-keys-table.d.ts.map +1 -0
  32. package/dist/console/api-keys-table.js +21 -0
  33. package/dist/console/api-keys-table.js.map +1 -0
  34. package/dist/console/bottom-bar.d.ts +17 -0
  35. package/dist/console/bottom-bar.d.ts.map +1 -0
  36. package/dist/console/bottom-bar.js +14 -0
  37. package/dist/console/bottom-bar.js.map +1 -0
  38. package/dist/console/commit-table.d.ts +12 -0
  39. package/dist/console/commit-table.d.ts.map +1 -0
  40. package/dist/console/commit-table.js +14 -0
  41. package/dist/console/commit-table.js.map +1 -0
  42. package/dist/console/connection-form.d.ts +29 -0
  43. package/dist/console/connection-form.d.ts.map +1 -0
  44. package/dist/console/connection-form.js +24 -0
  45. package/dist/console/connection-form.js.map +1 -0
  46. package/dist/console/connection-status-badge.d.ts +7 -0
  47. package/dist/console/connection-status-badge.d.ts.map +1 -0
  48. package/dist/console/connection-status-badge.js +19 -0
  49. package/dist/console/connection-status-badge.js.map +1 -0
  50. package/dist/console/danger-action-card.d.ts +10 -0
  51. package/dist/console/danger-action-card.d.ts.map +1 -0
  52. package/dist/console/danger-action-card.js +10 -0
  53. package/dist/console/danger-action-card.js.map +1 -0
  54. package/dist/console/empty-state.d.ts +9 -0
  55. package/dist/console/empty-state.d.ts.map +1 -0
  56. package/dist/console/empty-state.js +7 -0
  57. package/dist/console/empty-state.js.map +1 -0
  58. package/dist/console/filter-bar.d.ts +18 -0
  59. package/dist/console/filter-bar.d.ts.map +1 -0
  60. package/dist/console/filter-bar.js +14 -0
  61. package/dist/console/filter-bar.js.map +1 -0
  62. package/dist/console/fleet-card.d.ts +14 -0
  63. package/dist/console/fleet-card.d.ts.map +1 -0
  64. package/dist/console/fleet-card.js +58 -0
  65. package/dist/console/fleet-card.js.map +1 -0
  66. package/dist/console/handlers-table.d.ts +12 -0
  67. package/dist/console/handlers-table.d.ts.map +1 -0
  68. package/dist/console/handlers-table.js +21 -0
  69. package/dist/console/handlers-table.js.map +1 -0
  70. package/dist/console/index.d.ts +28 -0
  71. package/dist/console/index.d.ts.map +1 -0
  72. package/dist/console/index.js +28 -0
  73. package/dist/console/index.js.map +1 -0
  74. package/dist/console/kpi-card.d.ts +10 -0
  75. package/dist/console/kpi-card.d.ts.map +1 -0
  76. package/dist/console/kpi-card.js +17 -0
  77. package/dist/console/kpi-card.js.map +1 -0
  78. package/dist/console/kpi-strip.d.ts +10 -0
  79. package/dist/console/kpi-strip.d.ts.map +1 -0
  80. package/dist/console/kpi-strip.js +22 -0
  81. package/dist/console/kpi-strip.js.map +1 -0
  82. package/dist/console/latency-percentiles.d.ts +24 -0
  83. package/dist/console/latency-percentiles.d.ts.map +1 -0
  84. package/dist/console/latency-percentiles.js +23 -0
  85. package/dist/console/latency-percentiles.js.map +1 -0
  86. package/dist/console/live-activity-feed.d.ts +24 -0
  87. package/dist/console/live-activity-feed.d.ts.map +1 -0
  88. package/dist/console/live-activity-feed.js +29 -0
  89. package/dist/console/live-activity-feed.js.map +1 -0
  90. package/dist/console/maintenance-card.d.ts +28 -0
  91. package/dist/console/maintenance-card.d.ts.map +1 -0
  92. package/dist/console/maintenance-card.js +25 -0
  93. package/dist/console/maintenance-card.js.map +1 -0
  94. package/dist/console/page-header.d.ts +9 -0
  95. package/dist/console/page-header.d.ts.map +1 -0
  96. package/dist/console/page-header.js +9 -0
  97. package/dist/console/page-header.js.map +1 -0
  98. package/dist/console/panel-shell.d.ts +11 -0
  99. package/dist/console/panel-shell.d.ts.map +1 -0
  100. package/dist/console/panel-shell.js +10 -0
  101. package/dist/console/panel-shell.js.map +1 -0
  102. package/dist/console/preferences-panel.d.ts +30 -0
  103. package/dist/console/preferences-panel.d.ts.map +1 -0
  104. package/dist/console/preferences-panel.js +24 -0
  105. package/dist/console/preferences-panel.js.map +1 -0
  106. package/dist/console/section-card.d.ts +11 -0
  107. package/dist/console/section-card.d.ts.map +1 -0
  108. package/dist/console/section-card.js +9 -0
  109. package/dist/console/section-card.js.map +1 -0
  110. package/dist/console/stream-log.d.ts +26 -0
  111. package/dist/console/stream-log.d.ts.map +1 -0
  112. package/dist/console/stream-log.js +34 -0
  113. package/dist/console/stream-log.js.map +1 -0
  114. package/dist/console/sync-horizon.d.ts +18 -0
  115. package/dist/console/sync-horizon.d.ts.map +1 -0
  116. package/dist/console/sync-horizon.js +61 -0
  117. package/dist/console/sync-horizon.js.map +1 -0
  118. package/dist/console/sync-lag-bar.d.ts +23 -0
  119. package/dist/console/sync-lag-bar.d.ts.map +1 -0
  120. package/dist/console/sync-lag-bar.js +111 -0
  121. package/dist/console/sync-lag-bar.js.map +1 -0
  122. package/dist/console/sync-state-badge.d.ts +6 -0
  123. package/dist/console/sync-state-badge.d.ts.map +1 -0
  124. package/dist/console/sync-state-badge.js +21 -0
  125. package/dist/console/sync-state-badge.js.map +1 -0
  126. package/dist/console/topology-card.d.ts +9 -0
  127. package/dist/console/topology-card.d.ts.map +1 -0
  128. package/dist/console/topology-card.js +9 -0
  129. package/dist/console/topology-card.js.map +1 -0
  130. package/dist/console/topology-hero.d.ts +65 -0
  131. package/dist/console/topology-hero.d.ts.map +1 -0
  132. package/dist/console/topology-hero.js +90 -0
  133. package/dist/console/topology-hero.js.map +1 -0
  134. package/dist/demo/actor-panel.d.ts +11 -0
  135. package/dist/demo/actor-panel.d.ts.map +1 -0
  136. package/dist/demo/actor-panel.js +19 -0
  137. package/dist/demo/actor-panel.js.map +1 -0
  138. package/dist/demo/catalog-table.d.ts +17 -0
  139. package/dist/demo/catalog-table.d.ts.map +1 -0
  140. package/dist/demo/catalog-table.js +13 -0
  141. package/dist/demo/catalog-table.js.map +1 -0
  142. package/dist/demo/channel-selector.d.ts +12 -0
  143. package/dist/demo/channel-selector.d.ts.map +1 -0
  144. package/dist/demo/channel-selector.js +13 -0
  145. package/dist/demo/channel-selector.js.map +1 -0
  146. package/dist/demo/client-panel.d.ts +12 -0
  147. package/dist/demo/client-panel.d.ts.map +1 -0
  148. package/dist/demo/client-panel.js +18 -0
  149. package/dist/demo/client-panel.js.map +1 -0
  150. package/dist/demo/conflict-panel.d.ts +8 -0
  151. package/dist/demo/conflict-panel.d.ts.map +1 -0
  152. package/dist/demo/conflict-panel.js +9 -0
  153. package/dist/demo/conflict-panel.js.map +1 -0
  154. package/dist/demo/demo-header.d.ts +9 -0
  155. package/dist/demo/demo-header.d.ts.map +1 -0
  156. package/dist/demo/demo-header.js +12 -0
  157. package/dist/demo/demo-header.js.map +1 -0
  158. package/dist/demo/demo-section.d.ts +8 -0
  159. package/dist/demo/demo-section.d.ts.map +1 -0
  160. package/dist/demo/demo-section.js +10 -0
  161. package/dist/demo/demo-section.js.map +1 -0
  162. package/dist/demo/encrypted-badge.d.ts +7 -0
  163. package/dist/demo/encrypted-badge.d.ts.map +1 -0
  164. package/dist/demo/encrypted-badge.js +12 -0
  165. package/dist/demo/encrypted-badge.js.map +1 -0
  166. package/dist/demo/encryption-flow-diagram.d.ts +5 -0
  167. package/dist/demo/encryption-flow-diagram.d.ts.map +1 -0
  168. package/dist/demo/encryption-flow-diagram.js +24 -0
  169. package/dist/demo/encryption-flow-diagram.js.map +1 -0
  170. package/dist/demo/index.d.ts +27 -0
  171. package/dist/demo/index.d.ts.map +1 -0
  172. package/dist/demo/index.js +27 -0
  173. package/dist/demo/index.js.map +1 -0
  174. package/dist/demo/info-panel.d.ts +9 -0
  175. package/dist/demo/info-panel.d.ts.map +1 -0
  176. package/dist/demo/info-panel.js +11 -0
  177. package/dist/demo/info-panel.js.map +1 -0
  178. package/dist/demo/media-gallery.d.ts +7 -0
  179. package/dist/demo/media-gallery.d.ts.map +1 -0
  180. package/dist/demo/media-gallery.js +7 -0
  181. package/dist/demo/media-gallery.js.map +1 -0
  182. package/dist/demo/media-thumbnail.d.ts +11 -0
  183. package/dist/demo/media-thumbnail.d.ts.map +1 -0
  184. package/dist/demo/media-thumbnail.js +10 -0
  185. package/dist/demo/media-thumbnail.js.map +1 -0
  186. package/dist/demo/metric-card.d.ts +14 -0
  187. package/dist/demo/metric-card.d.ts.map +1 -0
  188. package/dist/demo/metric-card.js +20 -0
  189. package/dist/demo/metric-card.js.map +1 -0
  190. package/dist/demo/mnemonic-display.d.ts +8 -0
  191. package/dist/demo/mnemonic-display.d.ts.map +1 -0
  192. package/dist/demo/mnemonic-display.js +70 -0
  193. package/dist/demo/mnemonic-display.js.map +1 -0
  194. package/dist/demo/note-card.d.ts +10 -0
  195. package/dist/demo/note-card.d.ts.map +1 -0
  196. package/dist/demo/note-card.js +9 -0
  197. package/dist/demo/note-card.js.map +1 -0
  198. package/dist/demo/sync-controls.d.ts +8 -0
  199. package/dist/demo/sync-controls.d.ts.map +1 -0
  200. package/dist/demo/sync-controls.js +17 -0
  201. package/dist/demo/sync-controls.js.map +1 -0
  202. package/dist/demo/sync-status-badge.d.ts +7 -0
  203. package/dist/demo/sync-status-badge.d.ts.map +1 -0
  204. package/dist/demo/sync-status-badge.js +22 -0
  205. package/dist/demo/sync-status-badge.js.map +1 -0
  206. package/dist/demo/task-item.d.ts +12 -0
  207. package/dist/demo/task-item.d.ts.map +1 -0
  208. package/dist/demo/task-item.js +12 -0
  209. package/dist/demo/task-item.js.map +1 -0
  210. package/dist/demo/task-list.d.ts +8 -0
  211. package/dist/demo/task-list.d.ts.map +1 -0
  212. package/dist/demo/task-list.js +11 -0
  213. package/dist/demo/task-list.js.map +1 -0
  214. package/dist/demo/topology-panel.d.ts +10 -0
  215. package/dist/demo/topology-panel.d.ts.map +1 -0
  216. package/dist/demo/topology-panel.js +10 -0
  217. package/dist/demo/topology-panel.js.map +1 -0
  218. package/dist/demo/topology-svg-keyshare.d.ts +5 -0
  219. package/dist/demo/topology-svg-keyshare.d.ts.map +1 -0
  220. package/dist/demo/topology-svg-keyshare.js +31 -0
  221. package/dist/demo/topology-svg-keyshare.js.map +1 -0
  222. package/dist/demo/topology-svg-media.d.ts +5 -0
  223. package/dist/demo/topology-svg-media.d.ts.map +1 -0
  224. package/dist/demo/topology-svg-media.js +27 -0
  225. package/dist/demo/topology-svg-media.js.map +1 -0
  226. package/dist/demo/topology-svg-split.d.ts +5 -0
  227. package/dist/demo/topology-svg-split.d.ts.map +1 -0
  228. package/dist/demo/topology-svg-split.js +29 -0
  229. package/dist/demo/topology-svg-split.js.map +1 -0
  230. package/dist/demo/topology-svg-symmetric.d.ts +5 -0
  231. package/dist/demo/topology-svg-symmetric.d.ts.map +1 -0
  232. package/dist/demo/topology-svg-symmetric.js +35 -0
  233. package/dist/demo/topology-svg-symmetric.js.map +1 -0
  234. package/dist/demo/transfer-log.d.ts +14 -0
  235. package/dist/demo/transfer-log.d.ts.map +1 -0
  236. package/dist/demo/transfer-log.js +18 -0
  237. package/dist/demo/transfer-log.js.map +1 -0
  238. package/dist/demo/upload-area.d.ts +9 -0
  239. package/dist/demo/upload-area.d.ts.map +1 -0
  240. package/dist/demo/upload-area.js +58 -0
  241. package/dist/demo/upload-area.js.map +1 -0
  242. package/dist/forms/checkbox.d.ts +11 -0
  243. package/dist/forms/checkbox.d.ts.map +1 -0
  244. package/dist/forms/checkbox.js +16 -0
  245. package/dist/forms/checkbox.js.map +1 -0
  246. package/dist/forms/field.d.ts +7 -0
  247. package/dist/forms/field.d.ts.map +1 -0
  248. package/dist/forms/field.js +16 -0
  249. package/dist/forms/field.js.map +1 -0
  250. package/dist/forms/index.d.ts +7 -0
  251. package/dist/forms/index.d.ts.map +1 -0
  252. package/dist/forms/index.js +7 -0
  253. package/dist/forms/index.js.map +1 -0
  254. package/dist/forms/select.d.ts +11 -0
  255. package/dist/forms/select.d.ts.map +1 -0
  256. package/dist/forms/select.js +15 -0
  257. package/dist/forms/select.js.map +1 -0
  258. package/dist/forms/textarea.d.ts +6 -0
  259. package/dist/forms/textarea.d.ts.map +1 -0
  260. package/dist/forms/textarea.js +8 -0
  261. package/dist/forms/textarea.js.map +1 -0
  262. package/dist/forms/toggle-group.d.ts +8 -0
  263. package/dist/forms/toggle-group.d.ts.map +1 -0
  264. package/dist/forms/toggle-group.js +11 -0
  265. package/dist/forms/toggle-group.js.map +1 -0
  266. package/dist/forms/toggle.d.ts +7 -0
  267. package/dist/forms/toggle.d.ts.map +1 -0
  268. package/dist/forms/toggle.js +9 -0
  269. package/dist/forms/toggle.js.map +1 -0
  270. package/dist/index.d.ts +8 -0
  271. package/dist/index.d.ts.map +1 -0
  272. package/dist/index.js +8 -0
  273. package/dist/index.js.map +1 -0
  274. package/dist/lib/cn.d.ts +3 -0
  275. package/dist/lib/cn.d.ts.map +1 -0
  276. package/dist/lib/cn.js +6 -0
  277. package/dist/lib/cn.js.map +1 -0
  278. package/dist/lib/types.d.ts +64 -0
  279. package/dist/lib/types.d.ts.map +1 -0
  280. package/dist/lib/types.js +2 -0
  281. package/dist/lib/types.js.map +1 -0
  282. package/dist/navigation/index.d.ts +6 -0
  283. package/dist/navigation/index.d.ts.map +1 -0
  284. package/dist/navigation/index.js +6 -0
  285. package/dist/navigation/index.js.map +1 -0
  286. package/dist/navigation/nav-pill-group.d.ts +14 -0
  287. package/dist/navigation/nav-pill-group.d.ts.map +1 -0
  288. package/dist/navigation/nav-pill-group.js +15 -0
  289. package/dist/navigation/nav-pill-group.js.map +1 -0
  290. package/dist/navigation/nav-pill.d.ts +9 -0
  291. package/dist/navigation/nav-pill.d.ts.map +1 -0
  292. package/dist/navigation/nav-pill.js +7 -0
  293. package/dist/navigation/nav-pill.js.map +1 -0
  294. package/dist/navigation/status-dot.d.ts +13 -0
  295. package/dist/navigation/status-dot.d.ts.map +1 -0
  296. package/dist/navigation/status-dot.js +44 -0
  297. package/dist/navigation/status-dot.js.map +1 -0
  298. package/dist/navigation/syncular-brand.d.ts +6 -0
  299. package/dist/navigation/syncular-brand.d.ts.map +1 -0
  300. package/dist/navigation/syncular-brand.js +11 -0
  301. package/dist/navigation/syncular-brand.js.map +1 -0
  302. package/dist/navigation/top-navigation.d.ts +9 -0
  303. package/dist/navigation/top-navigation.d.ts.map +1 -0
  304. package/dist/navigation/top-navigation.js +9 -0
  305. package/dist/navigation/top-navigation.js.map +1 -0
  306. package/dist/observable-universe/architecture-section.d.ts +5 -0
  307. package/dist/observable-universe/architecture-section.d.ts.map +1 -0
  308. package/dist/observable-universe/architecture-section.js +44 -0
  309. package/dist/observable-universe/architecture-section.js.map +1 -0
  310. package/dist/observable-universe/code-section.d.ts +5 -0
  311. package/dist/observable-universe/code-section.d.ts.map +1 -0
  312. package/dist/observable-universe/code-section.js +86 -0
  313. package/dist/observable-universe/code-section.js.map +1 -0
  314. package/dist/observable-universe/commit-stream-panel.d.ts +8 -0
  315. package/dist/observable-universe/commit-stream-panel.d.ts.map +1 -0
  316. package/dist/observable-universe/commit-stream-panel.js +45 -0
  317. package/dist/observable-universe/commit-stream-panel.js.map +1 -0
  318. package/dist/observable-universe/connected-clients-panel.d.ts +7 -0
  319. package/dist/observable-universe/connected-clients-panel.d.ts.map +1 -0
  320. package/dist/observable-universe/connected-clients-panel.js +47 -0
  321. package/dist/observable-universe/connected-clients-panel.js.map +1 -0
  322. package/dist/observable-universe/constants.d.ts +10 -0
  323. package/dist/observable-universe/constants.d.ts.map +1 -0
  324. package/dist/observable-universe/constants.js +81 -0
  325. package/dist/observable-universe/constants.js.map +1 -0
  326. package/dist/observable-universe/explanation-section.d.ts +5 -0
  327. package/dist/observable-universe/explanation-section.d.ts.map +1 -0
  328. package/dist/observable-universe/explanation-section.js +76 -0
  329. package/dist/observable-universe/explanation-section.js.map +1 -0
  330. package/dist/observable-universe/footer-bar.d.ts +5 -0
  331. package/dist/observable-universe/footer-bar.d.ts.map +1 -0
  332. package/dist/observable-universe/footer-bar.js +12 -0
  333. package/dist/observable-universe/footer-bar.js.map +1 -0
  334. package/dist/observable-universe/hero-dashboard-section.d.ts +10 -0
  335. package/dist/observable-universe/hero-dashboard-section.d.ts.map +1 -0
  336. package/dist/observable-universe/hero-dashboard-section.js +20 -0
  337. package/dist/observable-universe/hero-dashboard-section.js.map +1 -0
  338. package/dist/observable-universe/index.d.ts +17 -0
  339. package/dist/observable-universe/index.d.ts.map +1 -0
  340. package/dist/observable-universe/index.js +17 -0
  341. package/dist/observable-universe/index.js.map +1 -0
  342. package/dist/observable-universe/install-section.d.ts +8 -0
  343. package/dist/observable-universe/install-section.d.ts.map +1 -0
  344. package/dist/observable-universe/install-section.js +24 -0
  345. package/dist/observable-universe/install-section.js.map +1 -0
  346. package/dist/observable-universe/live-metrics-bar.d.ts +7 -0
  347. package/dist/observable-universe/live-metrics-bar.d.ts.map +1 -0
  348. package/dist/observable-universe/live-metrics-bar.js +18 -0
  349. package/dist/observable-universe/live-metrics-bar.js.map +1 -0
  350. package/dist/observable-universe/observable-universe-header.d.ts +14 -0
  351. package/dist/observable-universe/observable-universe-header.d.ts.map +1 -0
  352. package/dist/observable-universe/observable-universe-header.js +45 -0
  353. package/dist/observable-universe/observable-universe-header.js.map +1 -0
  354. package/dist/observable-universe/observable-universe-landing.d.ts +12 -0
  355. package/dist/observable-universe/observable-universe-landing.d.ts.map +1 -0
  356. package/dist/observable-universe/observable-universe-landing.js +19 -0
  357. package/dist/observable-universe/observable-universe-landing.js.map +1 -0
  358. package/dist/observable-universe/section-heading.d.ts +8 -0
  359. package/dist/observable-universe/section-heading.d.ts.map +1 -0
  360. package/dist/observable-universe/section-heading.js +8 -0
  361. package/dist/observable-universe/section-heading.js.map +1 -0
  362. package/dist/observable-universe/sync-topology-panel.d.ts +7 -0
  363. package/dist/observable-universe/sync-topology-panel.d.ts.map +1 -0
  364. package/dist/observable-universe/sync-topology-panel.js +81 -0
  365. package/dist/observable-universe/sync-topology-panel.js.map +1 -0
  366. package/dist/observable-universe/types.d.ts +25 -0
  367. package/dist/observable-universe/types.d.ts.map +1 -0
  368. package/dist/observable-universe/types.js +2 -0
  369. package/dist/observable-universe/types.js.map +1 -0
  370. package/dist/observable-universe/use-observable-universe-simulation.d.ts +8 -0
  371. package/dist/observable-universe/use-observable-universe-simulation.d.ts.map +1 -0
  372. package/dist/observable-universe/use-observable-universe-simulation.js +92 -0
  373. package/dist/observable-universe/use-observable-universe-simulation.js.map +1 -0
  374. package/dist/primitives/alert.d.ts +14 -0
  375. package/dist/primitives/alert.d.ts.map +1 -0
  376. package/dist/primitives/alert.js +24 -0
  377. package/dist/primitives/alert.js.map +1 -0
  378. package/dist/primitives/badge.d.ts +12 -0
  379. package/dist/primitives/badge.d.ts.map +1 -0
  380. package/dist/primitives/badge.js +28 -0
  381. package/dist/primitives/badge.js.map +1 -0
  382. package/dist/primitives/button.d.ts +14 -0
  383. package/dist/primitives/button.d.ts.map +1 -0
  384. package/dist/primitives/button.js +30 -0
  385. package/dist/primitives/button.js.map +1 -0
  386. package/dist/primitives/card.d.ts +7 -0
  387. package/dist/primitives/card.d.ts.map +1 -0
  388. package/dist/primitives/card.js +16 -0
  389. package/dist/primitives/card.js.map +1 -0
  390. package/dist/primitives/dialog.d.ts +14 -0
  391. package/dist/primitives/dialog.d.ts.map +1 -0
  392. package/dist/primitives/dialog.js +25 -0
  393. package/dist/primitives/dialog.js.map +1 -0
  394. package/dist/primitives/index.d.ts +16 -0
  395. package/dist/primitives/index.d.ts.map +1 -0
  396. package/dist/primitives/index.js +16 -0
  397. package/dist/primitives/index.js.map +1 -0
  398. package/dist/primitives/input.d.ts +12 -0
  399. package/dist/primitives/input.d.ts.map +1 -0
  400. package/dist/primitives/input.js +20 -0
  401. package/dist/primitives/input.js.map +1 -0
  402. package/dist/primitives/pagination.d.ts +16 -0
  403. package/dist/primitives/pagination.d.ts.map +1 -0
  404. package/dist/primitives/pagination.js +13 -0
  405. package/dist/primitives/pagination.js.map +1 -0
  406. package/dist/primitives/separator.d.ts +10 -0
  407. package/dist/primitives/separator.d.ts.map +1 -0
  408. package/dist/primitives/separator.js +10 -0
  409. package/dist/primitives/separator.js.map +1 -0
  410. package/dist/primitives/sheet.d.ts +19 -0
  411. package/dist/primitives/sheet.d.ts.map +1 -0
  412. package/dist/primitives/sheet.js +35 -0
  413. package/dist/primitives/sheet.js.map +1 -0
  414. package/dist/primitives/skeleton.d.ts +3 -0
  415. package/dist/primitives/skeleton.d.ts.map +1 -0
  416. package/dist/primitives/skeleton.js +8 -0
  417. package/dist/primitives/skeleton.js.map +1 -0
  418. package/dist/primitives/spinner.d.ts +12 -0
  419. package/dist/primitives/spinner.d.ts.map +1 -0
  420. package/dist/primitives/spinner.js +23 -0
  421. package/dist/primitives/spinner.js.map +1 -0
  422. package/dist/primitives/switch.d.ts +7 -0
  423. package/dist/primitives/switch.d.ts.map +1 -0
  424. package/dist/primitives/switch.js +9 -0
  425. package/dist/primitives/switch.js.map +1 -0
  426. package/dist/primitives/table.d.ts +8 -0
  427. package/dist/primitives/table.d.ts.map +1 -0
  428. package/dist/primitives/table.js +18 -0
  429. package/dist/primitives/table.js.map +1 -0
  430. package/dist/primitives/tabs.d.ts +16 -0
  431. package/dist/primitives/tabs.d.ts.map +1 -0
  432. package/dist/primitives/tabs.js +26 -0
  433. package/dist/primitives/tabs.js.map +1 -0
  434. package/dist/primitives/tooltip.d.ts +13 -0
  435. package/dist/primitives/tooltip.d.ts.map +1 -0
  436. package/dist/primitives/tooltip.js +15 -0
  437. package/dist/primitives/tooltip.js.map +1 -0
  438. package/dist/version.d.ts +2 -0
  439. package/dist/version.d.ts.map +1 -0
  440. package/dist/version.js +3 -0
  441. package/dist/version.js.map +1 -0
  442. package/package.json +114 -0
  443. package/src/charts/activity-chart.tsx +85 -0
  444. package/src/charts/chart.tsx +302 -0
  445. package/src/charts/index.ts +4 -0
  446. package/src/charts/latency-chart.tsx +77 -0
  447. package/src/charts/outcomes-chart.tsx +101 -0
  448. package/src/console/activity-bars.tsx +113 -0
  449. package/src/console/alerts-config.tsx +110 -0
  450. package/src/console/api-keys-table.tsx +102 -0
  451. package/src/console/bottom-bar.tsx +73 -0
  452. package/src/console/commit-table.tsx +66 -0
  453. package/src/console/connection-form.tsx +153 -0
  454. package/src/console/connection-status-badge.tsx +48 -0
  455. package/src/console/danger-action-card.tsx +40 -0
  456. package/src/console/empty-state.tsx +31 -0
  457. package/src/console/filter-bar.tsx +97 -0
  458. package/src/console/fleet-card.tsx +154 -0
  459. package/src/console/handlers-table.tsx +74 -0
  460. package/src/console/index.ts +27 -0
  461. package/src/console/kpi-card.tsx +46 -0
  462. package/src/console/kpi-strip.tsx +77 -0
  463. package/src/console/latency-percentiles.tsx +109 -0
  464. package/src/console/live-activity-feed.tsx +112 -0
  465. package/src/console/maintenance-card.tsx +112 -0
  466. package/src/console/page-header.tsx +32 -0
  467. package/src/console/panel-shell.tsx +42 -0
  468. package/src/console/preferences-panel.tsx +126 -0
  469. package/src/console/section-card.tsx +41 -0
  470. package/src/console/stream-log.tsx +138 -0
  471. package/src/console/sync-horizon.tsx +149 -0
  472. package/src/console/sync-lag-bar.tsx +226 -0
  473. package/src/console/sync-state-badge.tsx +32 -0
  474. package/src/console/topology-card.tsx +47 -0
  475. package/src/console/topology-hero.tsx +499 -0
  476. package/src/demo/actor-panel.tsx +50 -0
  477. package/src/demo/catalog-table.tsx +83 -0
  478. package/src/demo/channel-selector.tsx +51 -0
  479. package/src/demo/client-panel.tsx +61 -0
  480. package/src/demo/conflict-panel.tsx +25 -0
  481. package/src/demo/demo-header.tsx +44 -0
  482. package/src/demo/demo-section.tsx +24 -0
  483. package/src/demo/encrypted-badge.tsx +59 -0
  484. package/src/demo/encryption-flow-diagram.tsx +93 -0
  485. package/src/demo/index.ts +26 -0
  486. package/src/demo/info-panel.tsx +41 -0
  487. package/src/demo/media-gallery.tsx +15 -0
  488. package/src/demo/media-thumbnail.tsx +55 -0
  489. package/src/demo/metric-card.tsx +85 -0
  490. package/src/demo/mnemonic-display.tsx +114 -0
  491. package/src/demo/note-card.tsx +52 -0
  492. package/src/demo/sync-controls.tsx +75 -0
  493. package/src/demo/sync-status-badge.tsx +36 -0
  494. package/src/demo/task-item.tsx +83 -0
  495. package/src/demo/task-list.tsx +33 -0
  496. package/src/demo/topology-panel.tsx +44 -0
  497. package/src/demo/topology-svg-keyshare.tsx +474 -0
  498. package/src/demo/topology-svg-media.tsx +423 -0
  499. package/src/demo/topology-svg-split.tsx +402 -0
  500. package/src/demo/topology-svg-symmetric.tsx +527 -0
  501. package/src/demo/transfer-log.tsx +68 -0
  502. package/src/demo/upload-area.tsx +136 -0
  503. package/src/forms/checkbox.tsx +58 -0
  504. package/src/forms/field.tsx +60 -0
  505. package/src/forms/index.ts +6 -0
  506. package/src/forms/select.tsx +65 -0
  507. package/src/forms/textarea.tsx +23 -0
  508. package/src/forms/toggle-group.tsx +24 -0
  509. package/src/forms/toggle.tsx +24 -0
  510. package/src/index.ts +7 -0
  511. package/src/lib/cn.ts +6 -0
  512. package/src/lib/types.ts +69 -0
  513. package/src/navigation/index.ts +5 -0
  514. package/src/navigation/nav-pill-group.tsx +46 -0
  515. package/src/navigation/nav-pill.tsx +35 -0
  516. package/src/navigation/status-dot.tsx +66 -0
  517. package/src/navigation/syncular-brand.tsx +29 -0
  518. package/src/navigation/top-navigation.tsx +31 -0
  519. package/src/observable-universe/architecture-section.tsx +209 -0
  520. package/src/observable-universe/code-section.tsx +136 -0
  521. package/src/observable-universe/commit-stream-panel.tsx +115 -0
  522. package/src/observable-universe/connected-clients-panel.tsx +109 -0
  523. package/src/observable-universe/constants.ts +84 -0
  524. package/src/observable-universe/explanation-section.tsx +129 -0
  525. package/src/observable-universe/footer-bar.tsx +34 -0
  526. package/src/observable-universe/hero-dashboard-section.tsx +71 -0
  527. package/src/observable-universe/index.ts +16 -0
  528. package/src/observable-universe/install-section.tsx +119 -0
  529. package/src/observable-universe/live-metrics-bar.tsx +64 -0
  530. package/src/observable-universe/observable-universe-header.tsx +155 -0
  531. package/src/observable-universe/observable-universe-landing.tsx +74 -0
  532. package/src/observable-universe/section-heading.tsx +31 -0
  533. package/src/observable-universe/sync-topology-panel.tsx +409 -0
  534. package/src/observable-universe/types.ts +26 -0
  535. package/src/observable-universe/use-observable-universe-simulation.ts +111 -0
  536. package/src/primitives/alert.tsx +55 -0
  537. package/src/primitives/badge.tsx +45 -0
  538. package/src/primitives/button.tsx +51 -0
  539. package/src/primitives/card.tsx +67 -0
  540. package/src/primitives/dialog.tsx +114 -0
  541. package/src/primitives/index.ts +15 -0
  542. package/src/primitives/input.tsx +37 -0
  543. package/src/primitives/pagination.tsx +54 -0
  544. package/src/primitives/separator.tsx +29 -0
  545. package/src/primitives/sheet.tsx +114 -0
  546. package/src/primitives/skeleton.tsx +17 -0
  547. package/src/primitives/spinner.tsx +52 -0
  548. package/src/primitives/switch.tsx +26 -0
  549. package/src/primitives/table.tsx +71 -0
  550. package/src/primitives/tabs.tsx +66 -0
  551. package/src/primitives/tooltip.tsx +43 -0
  552. package/src/styles/styles.css +177 -0
  553. package/src/styles/tokens.css +47 -0
  554. package/src/version.ts +3 -0
@@ -0,0 +1,31 @@
1
+ 'use client';
2
+
3
+ import type { ReactNode } from 'react';
4
+ import { cn } from '../lib/cn';
5
+
6
+ export type TopNavigationProps = {
7
+ brand?: ReactNode;
8
+ center?: ReactNode;
9
+ right?: ReactNode;
10
+ className?: string;
11
+ };
12
+
13
+ export function TopNavigation({
14
+ brand,
15
+ center,
16
+ right,
17
+ className,
18
+ }: TopNavigationProps) {
19
+ return (
20
+ <nav
21
+ className={cn(
22
+ 'fixed top-0 left-0 right-0 z-100 h-[42px] border-b border-border bg-surface/88 backdrop-blur-lg flex items-center justify-between px-5',
23
+ className
24
+ )}
25
+ >
26
+ <div className="flex items-center gap-3">{brand}</div>
27
+ <div className="flex items-center gap-0.5">{center}</div>
28
+ <div className="flex items-center gap-2">{right}</div>
29
+ </nav>
30
+ );
31
+ }
@@ -0,0 +1,209 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+ import { SectionHeading } from './section-heading';
6
+
7
+ export interface ArchitectureSectionProps {
8
+ className?: string;
9
+ }
10
+
11
+ export const ArchitectureSection = forwardRef<
12
+ HTMLElement,
13
+ ArchitectureSectionProps
14
+ >(function ArchitectureSection({ className }, ref) {
15
+ return (
16
+ <section
17
+ ref={ref}
18
+ id="architecture"
19
+ className={cn('py-24 border-t border-border', className)}
20
+ >
21
+ <div className="max-w-[1400px] mx-auto px-6">
22
+ <SectionHeading
23
+ label="How sync works"
24
+ title="Local SQLite on every client. Commit log for change tracking. Server as the source of truth."
25
+ />
26
+
27
+ {/* Architecture diagram */}
28
+ <div className="dashboard-panel rounded-lg p-8 md:p-12 overflow-x-auto">
29
+ <div className="flex items-center justify-center gap-0 min-w-[700px]">
30
+ {/* Client A */}
31
+ <div className="flex flex-col items-center gap-2 shrink-0">
32
+ <div className="w-32 border border-border rounded-lg p-4 text-center bg-panel">
33
+ <div className="font-mono text-[10px] text-neutral-500 uppercase mb-1">
34
+ Client A
35
+ </div>
36
+ <div className="font-mono text-xs text-white">SQLite</div>
37
+ <div className="font-mono text-[10px] text-neutral-600 mt-1">
38
+ outbox + local DB
39
+ </div>
40
+ </div>
41
+ </div>
42
+
43
+ {/* Arrow */}
44
+ <div className="flex flex-col items-center gap-1 px-3 shrink-0">
45
+ <svg width="60" height="24" viewBox="0 0 60 24">
46
+ <path
47
+ d="M0 12h52m-6-5l6 5-6 5"
48
+ stroke="#3b82f6"
49
+ strokeWidth="1.5"
50
+ fill="none"
51
+ strokeLinecap="round"
52
+ />
53
+ </svg>
54
+ <span className="font-mono text-[9px] text-flow">HTTP / WS</span>
55
+ </div>
56
+
57
+ {/* Transport */}
58
+ <div className="flex flex-col items-center gap-2 shrink-0">
59
+ <div
60
+ className="w-28 border border-flow/30 rounded-lg p-4 text-center"
61
+ style={{ background: 'rgba(59,130,246,0.05)' }}
62
+ >
63
+ <div className="font-mono text-[10px] text-flow uppercase mb-1">
64
+ Transport
65
+ </div>
66
+ <div className="font-mono text-xs text-white">Push / Pull</div>
67
+ <div className="font-mono text-[10px] text-neutral-600 mt-1">
68
+ delta sync
69
+ </div>
70
+ </div>
71
+ </div>
72
+
73
+ {/* Arrow */}
74
+ <div className="flex flex-col items-center gap-1 px-3 shrink-0">
75
+ <svg width="60" height="24" viewBox="0 0 60 24">
76
+ <path
77
+ d="M0 12h52m-6-5l6 5-6 5"
78
+ stroke="#3b82f6"
79
+ strokeWidth="1.5"
80
+ fill="none"
81
+ strokeLinecap="round"
82
+ />
83
+ </svg>
84
+ <span className="font-mono text-[9px] text-flow">commits</span>
85
+ </div>
86
+
87
+ {/* Server */}
88
+ <div className="flex flex-col items-center gap-2 shrink-0">
89
+ <div
90
+ className="w-36 border-2 border-flow rounded-lg p-4 text-center relative"
91
+ style={{
92
+ background: 'rgba(59,130,246,0.08)',
93
+ boxShadow: '0 0 20px rgba(59,130,246,0.15)',
94
+ }}
95
+ >
96
+ <div className="font-mono text-[10px] text-flow uppercase mb-1">
97
+ Server
98
+ </div>
99
+ <div className="font-mono text-xs text-white font-medium">
100
+ Commit Log
101
+ </div>
102
+ <div className="font-mono text-[10px] text-neutral-600 mt-1">
103
+ source of truth
104
+ </div>
105
+ </div>
106
+ </div>
107
+
108
+ {/* Arrow */}
109
+ <div className="flex flex-col items-center gap-1 px-3 shrink-0">
110
+ <svg width="60" height="24" viewBox="0 0 60 24">
111
+ <path
112
+ d="M0 12h52m-6-5l6 5-6 5"
113
+ stroke="#3b82f6"
114
+ strokeWidth="1.5"
115
+ fill="none"
116
+ strokeLinecap="round"
117
+ />
118
+ </svg>
119
+ <span className="font-mono text-[9px] text-flow">commits</span>
120
+ </div>
121
+
122
+ {/* Transport */}
123
+ <div className="flex flex-col items-center gap-2 shrink-0">
124
+ <div
125
+ className="w-28 border border-flow/30 rounded-lg p-4 text-center"
126
+ style={{ background: 'rgba(59,130,246,0.05)' }}
127
+ >
128
+ <div className="font-mono text-[10px] text-flow uppercase mb-1">
129
+ Transport
130
+ </div>
131
+ <div className="font-mono text-xs text-white">Push / Pull</div>
132
+ <div className="font-mono text-[10px] text-neutral-600 mt-1">
133
+ delta sync
134
+ </div>
135
+ </div>
136
+ </div>
137
+
138
+ {/* Arrow */}
139
+ <div className="flex flex-col items-center gap-1 px-3 shrink-0">
140
+ <svg width="60" height="24" viewBox="0 0 60 24">
141
+ <path
142
+ d="M0 12h52m-6-5l6 5-6 5"
143
+ stroke="#3b82f6"
144
+ strokeWidth="1.5"
145
+ fill="none"
146
+ strokeLinecap="round"
147
+ />
148
+ </svg>
149
+ <span className="font-mono text-[9px] text-flow">HTTP / WS</span>
150
+ </div>
151
+
152
+ {/* Client B */}
153
+ <div className="flex flex-col items-center gap-2 shrink-0">
154
+ <div className="w-32 border border-border rounded-lg p-4 text-center bg-panel">
155
+ <div className="font-mono text-[10px] text-neutral-500 uppercase mb-1">
156
+ Client B
157
+ </div>
158
+ <div className="font-mono text-xs text-white">SQLite</div>
159
+ <div className="font-mono text-[10px] text-neutral-600 mt-1">
160
+ outbox + local DB
161
+ </div>
162
+ </div>
163
+ </div>
164
+ </div>
165
+ </div>
166
+
167
+ {/* Step cards */}
168
+ <div className="grid grid-cols-1 md:grid-cols-4 gap-4 mt-6">
169
+ <div className="dashboard-panel rounded-lg p-5">
170
+ <div className="font-mono text-[10px] text-healthy uppercase tracking-wider mb-2">
171
+ Bootstrap
172
+ </div>
173
+ <p className="text-sm text-neutral-400 leading-relaxed">
174
+ First sync sends a point-in-time snapshot, chunked and compressed
175
+ for large datasets.
176
+ </p>
177
+ </div>
178
+ <div className="dashboard-panel rounded-lg p-5">
179
+ <div className="font-mono text-[10px] text-syncing uppercase tracking-wider mb-2">
180
+ Push
181
+ </div>
182
+ <p className="text-sm text-neutral-400 leading-relaxed">
183
+ Client writes locally, queues in outbox, pushes to server. Server
184
+ validates and writes to commit log.
185
+ </p>
186
+ </div>
187
+ <div className="dashboard-panel rounded-lg p-5">
188
+ <div className="font-mono text-[10px] text-flow uppercase tracking-wider mb-2">
189
+ Pull
190
+ </div>
191
+ <p className="text-sm text-neutral-400 leading-relaxed">
192
+ Client sends its cursor. Server returns commits since then,
193
+ filtered by scopes.
194
+ </p>
195
+ </div>
196
+ <div className="dashboard-panel rounded-lg p-5">
197
+ <div className="font-mono text-[10px] text-violet-400 uppercase tracking-wider mb-2">
198
+ Realtime
199
+ </div>
200
+ <p className="text-sm text-neutral-400 leading-relaxed">
201
+ WebSocket wakes clients on new commits. Data still flows over
202
+ HTTP.
203
+ </p>
204
+ </div>
205
+ </div>
206
+ </div>
207
+ </section>
208
+ );
209
+ });
@@ -0,0 +1,136 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+ import { SectionHeading } from './section-heading';
6
+
7
+ export interface CodeSectionProps {
8
+ className?: string;
9
+ }
10
+
11
+ const dialects = [
12
+ {
13
+ dialect: 'Postgres',
14
+ runtime: 'Node.js / Bun / Edge',
15
+ href: '/docs/server/dialects',
16
+ },
17
+ {
18
+ dialect: 'SQLite',
19
+ runtime: 'Node.js / Bun',
20
+ href: '/docs/server/dialects',
21
+ },
22
+ {
23
+ dialect: 'wa-sqlite',
24
+ runtime: 'Browser (WASM)',
25
+ clientOnly: true,
26
+ href: '/docs/build/runtimes/web',
27
+ },
28
+ {
29
+ dialect: 'PGlite',
30
+ runtime: 'Browser (WASM)',
31
+ href: '/docs/build/runtimes/web',
32
+ },
33
+ {
34
+ dialect: 'better-sqlite3',
35
+ runtime: 'Node.js / Electron',
36
+ href: '/docs/build/runtimes/bun-node',
37
+ },
38
+ {
39
+ dialect: 'sqlite3',
40
+ runtime: 'Node.js',
41
+ href: '/docs/build/runtimes/bun-node',
42
+ },
43
+ {
44
+ dialect: 'Bun SQLite',
45
+ runtime: 'Bun',
46
+ href: '/docs/build/runtimes/bun-node',
47
+ },
48
+ {
49
+ dialect: 'Expo SQLite',
50
+ runtime: 'React Native',
51
+ clientOnly: true,
52
+ href: '/docs/build/runtimes/expo',
53
+ },
54
+ {
55
+ dialect: 'Nitro SQLite',
56
+ runtime: 'React Native',
57
+ clientOnly: true,
58
+ href: '/docs/build/runtimes/expo',
59
+ },
60
+ {
61
+ dialect: 'LibSQL',
62
+ runtime: 'Turso / LibSQL',
63
+ href: '/docs/server/dialects',
64
+ },
65
+ {
66
+ dialect: 'Neon',
67
+ runtime: 'Neon Postgres (serverless)',
68
+ href: '/docs/build/runtimes/cloudflare',
69
+ },
70
+ {
71
+ dialect: 'D1',
72
+ runtime: 'Cloudflare Workers',
73
+ href: '/docs/build/runtimes/cloudflare',
74
+ },
75
+ ];
76
+
77
+ export const CodeSection = forwardRef<HTMLElement, CodeSectionProps>(
78
+ function CodeSection({ className }, ref) {
79
+ return (
80
+ <section
81
+ ref={ref}
82
+ id="databases"
83
+ className={cn('py-24 border-t border-border', className)}
84
+ >
85
+ <div className="max-w-[1400px] mx-auto px-6">
86
+ <SectionHeading
87
+ label="Runs everywhere"
88
+ title="Pick the dialect for your runtime. Mix and match client and server."
89
+ />
90
+
91
+ <div className="max-w-3xl">
92
+ <div className="dashboard-panel rounded-lg overflow-hidden">
93
+ <div className="px-6 py-4 border-b border-border">
94
+ <div className="flex items-center gap-2">
95
+ <span className="w-2 h-2 rounded-full bg-flow inline-block" />
96
+ <span className="font-mono text-[11px] text-flow uppercase tracking-wider">
97
+ Supported dialects
98
+ </span>
99
+ </div>
100
+ </div>
101
+ <table className="w-full">
102
+ <thead>
103
+ <tr className="border-b border-border">
104
+ <th className="text-left text-[11px] font-mono text-neutral-500 uppercase tracking-wider px-6 py-3">
105
+ Dialect
106
+ </th>
107
+ <th className="text-left text-[11px] font-mono text-neutral-500 uppercase tracking-wider px-6 py-3">
108
+ Runtime
109
+ </th>
110
+ </tr>
111
+ </thead>
112
+ <tbody>
113
+ {dialects.map((row) => (
114
+ <tr key={row.dialect} className="border-b border-border/50">
115
+ <td className="px-6 py-3 font-mono text-sm text-white">
116
+ <a
117
+ href={row.href}
118
+ className="underline decoration-border underline-offset-4 transition-colors hover:text-flow hover:decoration-flow"
119
+ >
120
+ {row.dialect}
121
+ </a>
122
+ </td>
123
+ <td className="px-6 py-3 text-sm text-neutral-400">
124
+ {row.runtime}
125
+ </td>
126
+ </tr>
127
+ ))}
128
+ </tbody>
129
+ </table>
130
+ </div>
131
+ </div>
132
+ </div>
133
+ </section>
134
+ );
135
+ }
136
+ );
@@ -0,0 +1,115 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+ import type { ObservableStreamEntry } from './types';
6
+
7
+ export interface CommitStreamPanelProps {
8
+ entries: ObservableStreamEntry[];
9
+ rate?: string;
10
+ className?: string;
11
+ }
12
+
13
+ function formatDetail(entry: ObservableStreamEntry) {
14
+ if (entry.operation === 'PUSH') {
15
+ return {
16
+ color: 'text-amber-400',
17
+ detail: (
18
+ <>
19
+ <span className="text-neutral-500">{entry.table}</span>
20
+ {' '}
21
+ <span className="text-neutral-400">{entry.mutation}</span>
22
+ {' '}
23
+ <span className="text-neutral-500">
24
+ +{entry.commits} commit{entry.commits > 1 ? 's' : ''}
25
+ </span>
26
+ </>
27
+ ),
28
+ };
29
+ }
30
+ if (entry.operation === 'PULL') {
31
+ return {
32
+ color: 'text-emerald-400',
33
+ detail: (
34
+ <>
35
+ <span className="text-neutral-500">{entry.table}</span>
36
+ {' '}
37
+ <span className="text-neutral-400">
38
+ +{entry.commits} commit{entry.commits > 1 ? 's' : ''}
39
+ </span>{' '}
40
+ <span className="text-neutral-600">(synced)</span>
41
+ </>
42
+ ),
43
+ };
44
+ }
45
+ return {
46
+ color: 'text-blue-400',
47
+ detail: (
48
+ <>
49
+ <span className="text-neutral-500">sync complete</span>{' '}
50
+ <span className="text-neutral-600">(0 conflicts)</span>
51
+ </>
52
+ ),
53
+ };
54
+ }
55
+
56
+ export const CommitStreamPanel = forwardRef<
57
+ HTMLDivElement,
58
+ CommitStreamPanelProps
59
+ >(function CommitStreamPanel({ entries, rate, className }, ref) {
60
+ return (
61
+ <div
62
+ ref={ref}
63
+ className={cn('dashboard-panel rounded-lg flex flex-col', className)}
64
+ >
65
+ <div className="px-4 py-3 border-b border-border flex items-center justify-between">
66
+ <span className="font-mono text-[11px] text-neutral-400 uppercase tracking-wider">
67
+ Commit Stream
68
+ </span>
69
+ {rate ? (
70
+ <span className="font-mono text-[11px] text-healthy">{rate}</span>
71
+ ) : null}
72
+ </div>
73
+ <div className="flex-1 overflow-hidden relative">
74
+ <div
75
+ className="absolute inset-x-0 top-0 h-6 z-10 pointer-events-none"
76
+ style={{
77
+ background: 'linear-gradient(to bottom, #111111, transparent)',
78
+ }}
79
+ />
80
+ <div
81
+ className="absolute inset-x-0 bottom-0 h-8 z-10 pointer-events-none"
82
+ style={{
83
+ background: 'linear-gradient(to top, #111111, transparent)',
84
+ }}
85
+ />
86
+ <div
87
+ className="p-3 space-y-0.5 overflow-hidden"
88
+ style={{ maxHeight: '100%' }}
89
+ >
90
+ {entries.map((entry) => {
91
+ const { color, detail } = formatDetail(entry);
92
+ return (
93
+ <div
94
+ key={entry.id}
95
+ className="stream-entry font-mono text-[9px] leading-5 whitespace-nowrap"
96
+ >
97
+ <span className="text-neutral-600">{entry.timestamp}</span>
98
+ {' '}
99
+ <span className={cn('font-medium', color)}>
100
+ {entry.operation.padEnd(4)}
101
+ </span>
102
+ {' '}
103
+ <span className="text-neutral-400">
104
+ {entry.clientId.padEnd(10)}
105
+ </span>
106
+ {' '}
107
+ {detail}
108
+ </div>
109
+ );
110
+ })}
111
+ </div>
112
+ </div>
113
+ </div>
114
+ );
115
+ });
@@ -0,0 +1,109 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+ import type { ObservableClient } from './types';
6
+
7
+ export interface ConnectedClientsPanelProps {
8
+ clients: ObservableClient[];
9
+ className?: string;
10
+ }
11
+
12
+ function formatSyncTime(client: ObservableClient) {
13
+ if (client.status === 'syncing') {
14
+ return `pushing ${client.syncingCommits ?? 0} commits...`;
15
+ }
16
+ if (client.lastSync === 0) return 'just now';
17
+ if (client.lastSync < 60) return `${client.lastSync}s ago`;
18
+ return `${Math.floor(client.lastSync / 60)}m ago`;
19
+ }
20
+
21
+ function statusDotChar(status: ObservableClient['status']) {
22
+ if (status === 'online') return '\u25CF';
23
+ if (status === 'syncing') return '\u25D0';
24
+ return '\u25CB';
25
+ }
26
+
27
+ const statusDotClass: Record<ObservableClient['status'], string> = {
28
+ online: 'text-healthy',
29
+ syncing: 'text-syncing animate-[dotPulse_1s_ease-in-out_infinite]',
30
+ offline: 'text-offline',
31
+ };
32
+
33
+ const statusTextClass: Record<ObservableClient['status'], string> = {
34
+ online: 'text-emerald-500',
35
+ syncing: 'text-amber-500',
36
+ offline: 'text-red-500',
37
+ };
38
+
39
+ export const ConnectedClientsPanel = forwardRef<
40
+ HTMLDivElement,
41
+ ConnectedClientsPanelProps
42
+ >(function ConnectedClientsPanel({ clients, className }, ref) {
43
+ return (
44
+ <div
45
+ ref={ref}
46
+ className={cn('dashboard-panel rounded-lg flex flex-col', className)}
47
+ >
48
+ <div className="px-4 py-3 border-b border-border flex items-center justify-between">
49
+ <span className="font-mono text-[11px] text-neutral-400 uppercase tracking-wider">
50
+ Connected Clients
51
+ </span>
52
+ <span className="font-mono text-[11px] text-neutral-600">
53
+ {clients.length} nodes
54
+ </span>
55
+ </div>
56
+ <div className="flex-1 overflow-auto p-2 space-y-1">
57
+ {clients.map((client) => (
58
+ <div
59
+ key={client.id}
60
+ className="flex items-start gap-3 px-3 py-2.5 rounded hover:bg-white/[0.02] transition-colors"
61
+ >
62
+ <span
63
+ className={cn(
64
+ 'font-mono text-sm mt-0.5 shrink-0',
65
+ statusDotClass[client.status]
66
+ )}
67
+ >
68
+ {statusDotChar(client.status)}
69
+ </span>
70
+ <div className="flex-1 min-w-0">
71
+ <div className="flex items-center gap-2">
72
+ <span className="font-mono text-xs text-white truncate">
73
+ {client.id}
74
+ </span>
75
+ <span className="font-mono text-[10px] text-neutral-600">
76
+ ({client.type})
77
+ </span>
78
+ {client.via === 'relay' ? (
79
+ <span className="font-mono text-[9px] text-violet-400/60 border border-violet-400/20 rounded px-1 ml-1">
80
+ relay
81
+ </span>
82
+ ) : null}
83
+ </div>
84
+ <div className="flex items-center gap-3 mt-0.5">
85
+ <span
86
+ className={cn(
87
+ 'font-mono text-[10px]',
88
+ statusTextClass[client.status]
89
+ )}
90
+ >
91
+ {client.status}
92
+ </span>
93
+ <span className="font-mono text-[10px] text-neutral-600">
94
+ sync: {formatSyncTime(client)}
95
+ </span>
96
+ </div>
97
+ <div className="font-mono text-[10px] text-neutral-600 mt-0.5">
98
+ commits:{' '}
99
+ <span className="text-neutral-400">
100
+ {client.commits.toLocaleString()}
101
+ </span>
102
+ </div>
103
+ </div>
104
+ </div>
105
+ ))}
106
+ </div>
107
+ </div>
108
+ );
109
+ });
@@ -0,0 +1,84 @@
1
+ import type { ObservableClient } from './types';
2
+
3
+ export const INITIAL_CLIENTS: ObservableClient[] = [
4
+ {
5
+ id: 'client-a',
6
+ type: 'mobile',
7
+ status: 'online',
8
+ lastSync: 2,
9
+ commits: 847,
10
+ via: 'direct',
11
+ },
12
+ {
13
+ id: 'client-b',
14
+ type: 'desktop',
15
+ status: 'online',
16
+ lastSync: 0,
17
+ commits: 1203,
18
+ via: 'direct',
19
+ },
20
+ {
21
+ id: 'client-c',
22
+ type: 'tablet',
23
+ status: 'syncing',
24
+ lastSync: 0,
25
+ commits: 445,
26
+ syncingCommits: 3,
27
+ via: 'direct',
28
+ },
29
+ {
30
+ id: 'client-d',
31
+ type: 'edge',
32
+ status: 'offline',
33
+ lastSync: 240,
34
+ commits: 201,
35
+ via: 'direct',
36
+ },
37
+ {
38
+ id: 'client-e',
39
+ type: 'mobile',
40
+ status: 'online',
41
+ lastSync: 1,
42
+ commits: 312,
43
+ via: 'relay',
44
+ },
45
+ {
46
+ id: 'client-f',
47
+ type: 'laptop',
48
+ status: 'online',
49
+ lastSync: 3,
50
+ commits: 589,
51
+ via: 'relay',
52
+ },
53
+ {
54
+ id: 'client-g',
55
+ type: 'iot',
56
+ status: 'offline',
57
+ lastSync: 180,
58
+ commits: 67,
59
+ via: 'relay',
60
+ },
61
+ ];
62
+
63
+ export const TABLES = ['todos', 'projects', 'notes', 'users'];
64
+ export const MUTATIONS = ['INSERT', 'UPDATE', 'DELETE'] as const;
65
+ export const OPERATIONS = [
66
+ 'PUSH',
67
+ 'PULL',
68
+ 'ACK',
69
+ 'PUSH',
70
+ 'PULL',
71
+ 'PUSH',
72
+ ] as const;
73
+
74
+ export const NODE_POSITIONS: Record<string, { x: number; y: number }> = {
75
+ server: { x: 195, y: 210 },
76
+ relay: { x: 465, y: 210 },
77
+ 'client-a': { x: 52, y: 100 },
78
+ 'client-b': { x: 38, y: 220 },
79
+ 'client-c': { x: 52, y: 340 },
80
+ 'client-d': { x: 195, y: 390 },
81
+ 'client-e': { x: 608, y: 100 },
82
+ 'client-f': { x: 622, y: 220 },
83
+ 'client-g': { x: 608, y: 340 },
84
+ };