@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,129 @@
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 ExplanationSectionProps {
8
+ className?: string;
9
+ }
10
+
11
+ const features = [
12
+ {
13
+ title: 'Instant UI',
14
+ color: 'healthy',
15
+ description:
16
+ 'Queries hit local SQLite in <1ms. No loading spinners, no network in the hot path.',
17
+ },
18
+ {
19
+ title: 'Offline by default',
20
+ color: 'flow',
21
+ description:
22
+ 'Writes queue in a local outbox. Sync happens when connectivity returns.',
23
+ },
24
+ {
25
+ title: 'Commit-log sync',
26
+ color: 'flow',
27
+ description:
28
+ 'Append-only log of changes. Incremental pulls. Easy to reason about and debug.',
29
+ },
30
+ {
31
+ title: 'Scope-based auth',
32
+ color: 'syncing',
33
+ description:
34
+ 'Every change tagged with scope values. Pulls return only what\u2019s requested and allowed.',
35
+ },
36
+ {
37
+ title: 'Blob storage',
38
+ color: 'violet-400',
39
+ description:
40
+ 'Sync binary files alongside structured data. Adapters for filesystem, database, and S3-compatible storage (S3/R2/MinIO).',
41
+ },
42
+ {
43
+ title: 'End-to-end encryption',
44
+ color: 'pink-400',
45
+ description:
46
+ 'Field-level E2E encryption (XChaCha20-Poly1305) with BIP39 key sharing.',
47
+ },
48
+ {
49
+ title: 'Observability',
50
+ color: 'healthy',
51
+ description:
52
+ 'Pluggable telemetry \u2014 logs, traces, metrics, exceptions. Sentry adapter or bring your own.',
53
+ },
54
+ {
55
+ title: 'Admin console',
56
+ color: 'flow',
57
+ description:
58
+ 'Inspect commits, clients, and events. Trigger prune/compact and debug sync in production.',
59
+ },
60
+ ] as const;
61
+
62
+ function colorClasses(color: string) {
63
+ switch (color) {
64
+ case 'healthy':
65
+ return { bg: 'bg-healthy/10', text: 'text-healthy' };
66
+ case 'flow':
67
+ return { bg: 'bg-flow/10', text: 'text-flow' };
68
+ case 'syncing':
69
+ return { bg: 'bg-syncing/10', text: 'text-syncing' };
70
+ case 'violet-400':
71
+ return { bg: 'bg-violet-400/10', text: 'text-violet-400' };
72
+ case 'pink-400':
73
+ return { bg: 'bg-pink-400/10', text: 'text-pink-400' };
74
+ default:
75
+ return { bg: 'bg-flow/10', text: 'text-flow' };
76
+ }
77
+ }
78
+
79
+ export const ExplanationSection = forwardRef<
80
+ HTMLElement,
81
+ ExplanationSectionProps
82
+ >(function ExplanationSection({ className }, ref) {
83
+ return (
84
+ <section
85
+ ref={ref}
86
+ id="why-syncular"
87
+ className={cn('py-24 border-t border-border', className)}
88
+ >
89
+ <div className="max-w-[1400px] mx-auto px-6">
90
+ <SectionHeading
91
+ label="Why Syncular"
92
+ title="Everything you need for offline-first sync. Nothing you don't."
93
+ />
94
+
95
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-6">
96
+ {features.map((feature) => {
97
+ const colors = colorClasses(feature.color);
98
+ return (
99
+ <div
100
+ key={feature.title}
101
+ className="dashboard-panel rounded-lg p-6"
102
+ >
103
+ <div className="flex items-center gap-2 mb-4">
104
+ <div
105
+ className={cn(
106
+ 'w-8 h-8 rounded flex items-center justify-center',
107
+ colors.bg
108
+ )}
109
+ >
110
+ <div
111
+ className={cn('w-2 h-2 rounded-full', colors.text)}
112
+ style={{ backgroundColor: 'currentColor' }}
113
+ />
114
+ </div>
115
+ <span className="font-display font-semibold text-white text-sm">
116
+ {feature.title}
117
+ </span>
118
+ </div>
119
+ <p className="text-sm text-neutral-400 leading-relaxed">
120
+ {feature.description}
121
+ </p>
122
+ </div>
123
+ );
124
+ })}
125
+ </div>
126
+ </div>
127
+ </section>
128
+ );
129
+ });
@@ -0,0 +1,34 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+
6
+ export interface FooterBarProps {
7
+ className?: string;
8
+ }
9
+
10
+ export const FooterBar = forwardRef<HTMLElement, FooterBarProps>(
11
+ function FooterBar({ className }, ref) {
12
+ return (
13
+ <footer
14
+ ref={ref}
15
+ className={cn('border-t border-border py-10', className)}
16
+ >
17
+ <div className="max-w-[1400px] mx-auto px-6 flex items-center justify-between">
18
+ <div className="flex items-center gap-3">
19
+ <span className="font-display font-bold text-white text-sm">
20
+ syncular
21
+ </span>
22
+ <span
23
+ className="w-1.5 h-1.5 rounded-full bg-healthy inline-block"
24
+ style={{ boxShadow: '0 0 4px #22c55e' }}
25
+ />
26
+ </div>
27
+ <div className="font-mono text-[11px] text-neutral-600">
28
+ Offline-first sync for SQLite. Open source.
29
+ </div>
30
+ </div>
31
+ </footer>
32
+ );
33
+ }
34
+ );
@@ -0,0 +1,71 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+ import { CommitStreamPanel } from './commit-stream-panel';
6
+ import { ConnectedClientsPanel } from './connected-clients-panel';
7
+ import { LiveMetricsBar } from './live-metrics-bar';
8
+ import { SyncTopologyPanel } from './sync-topology-panel';
9
+ import type {
10
+ ObservableClient,
11
+ ObservableMetrics,
12
+ ObservableStreamEntry,
13
+ } from './types';
14
+
15
+ export interface HeroDashboardSectionProps {
16
+ clients: ObservableClient[];
17
+ streamEntries: ObservableStreamEntry[];
18
+ metrics: ObservableMetrics;
19
+ streamRate?: string;
20
+ className?: string;
21
+ }
22
+
23
+ export const HeroDashboardSection = forwardRef<
24
+ HTMLElement,
25
+ HeroDashboardSectionProps
26
+ >(function HeroDashboardSection(
27
+ { clients, streamEntries, metrics, streamRate, className },
28
+ ref
29
+ ) {
30
+ return (
31
+ <section
32
+ ref={ref}
33
+ className={cn('pt-16 pb-4 min-h-screen flex flex-col', className)}
34
+ >
35
+ {/* Title bar */}
36
+ <div className="max-w-[1400px] mx-auto w-full px-6 pt-6 pb-4">
37
+ <h1 className="font-display font-bold text-3xl md:text-4xl text-white leading-tight">
38
+ Offline-first SQL sync you can operate.
39
+ </h1>
40
+ <p className="font-display text-base text-neutral-500 mt-2 max-w-2xl">
41
+ Web, Electron, Expo. Local SQLite read and write path. Commit-log
42
+ sync. Scopes for partial sync and auth.
43
+ </p>
44
+ <div className="mt-3 flex items-center gap-2 flex-wrap">
45
+ <span className="font-mono text-[10px] uppercase tracking-widest text-amber-300 border border-amber-300/30 px-2 py-0.5 rounded">
46
+ Alpha
47
+ </span>
48
+ <span className="text-sm text-neutral-500">
49
+ APIs and storage layouts will change. Pin versions and expect manual
50
+ migrations between versions.
51
+ </span>
52
+ </div>
53
+ </div>
54
+
55
+ {/* Dashboard grid */}
56
+ <div
57
+ className="max-w-[1400px] mx-auto w-full px-6 flex-1 grid grid-cols-1 lg:grid-cols-[320px_1fr_320px] gap-3 pb-3"
58
+ style={{ minHeight: 520 }}
59
+ >
60
+ <ConnectedClientsPanel clients={clients} />
61
+ <SyncTopologyPanel clients={clients} />
62
+ <CommitStreamPanel entries={streamEntries} rate={streamRate} />
63
+ </div>
64
+
65
+ {/* Bottom strip: Live Metrics */}
66
+ <div className="max-w-[1400px] mx-auto w-full px-6 pb-6">
67
+ <LiveMetricsBar metrics={metrics} />
68
+ </div>
69
+ </section>
70
+ );
71
+ });
@@ -0,0 +1,16 @@
1
+ export * from './architecture-section';
2
+ export * from './code-section';
3
+ export * from './commit-stream-panel';
4
+ export * from './connected-clients-panel';
5
+ export * from './constants';
6
+ export * from './explanation-section';
7
+ export * from './footer-bar';
8
+ export * from './hero-dashboard-section';
9
+ export * from './install-section';
10
+ export * from './live-metrics-bar';
11
+ export * from './observable-universe-header';
12
+ export * from './observable-universe-landing';
13
+ export * from './section-heading';
14
+ export * from './sync-topology-panel';
15
+ export * from './types';
16
+ export * from './use-observable-universe-simulation';
@@ -0,0 +1,119 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+
6
+ export interface InstallSectionProps {
7
+ docsHref?: string;
8
+ demoHref?: string;
9
+ githubHref?: string;
10
+ className?: string;
11
+ }
12
+
13
+ export const InstallSection = forwardRef<HTMLElement, InstallSectionProps>(
14
+ function InstallSection(
15
+ {
16
+ docsHref = '/docs',
17
+ demoHref,
18
+ githubHref = 'https://github.com/syncular/syncular',
19
+ className,
20
+ },
21
+ ref
22
+ ) {
23
+ return (
24
+ <section
25
+ ref={ref}
26
+ id="install"
27
+ className={cn('py-24 border-t border-border', className)}
28
+ >
29
+ <div className="max-w-[1400px] mx-auto px-6 text-center">
30
+ <span className="font-mono text-[11px] text-flow uppercase tracking-widest">
31
+ Get started
32
+ </span>
33
+ <h2 className="font-display font-bold text-2xl md:text-3xl text-white mt-4">
34
+ Syncular is modular. Install only what you need.
35
+ </h2>
36
+
37
+ <div className="mt-10 grid grid-cols-1 lg:grid-cols-2 gap-6 max-w-4xl mx-auto text-left">
38
+ {/* Server install */}
39
+ <div className="code-block">
40
+ <div className="code-header">
41
+ <span className="w-2 h-2 rounded-full bg-healthy inline-block" />
42
+ <span>Server</span>
43
+ </div>
44
+ <pre className="font-mono text-sm px-6 py-4">
45
+ <code>
46
+ <span className="text-neutral-500">$</span>{' '}
47
+ <span className="text-white">bun add @syncular/server \</span>
48
+ {'\n'}
49
+ <span className="text-white">
50
+ {' '}@syncular/server-hono \
51
+ </span>
52
+ {'\n'}
53
+ <span className="text-white">
54
+ {' '}@syncular/server-dialect-postgres \
55
+ </span>
56
+ {'\n'}
57
+ <span className="text-white">{' '}kysely pg hono</span>
58
+ </code>
59
+ </pre>
60
+ </div>
61
+
62
+ {/* Client install */}
63
+ <div className="code-block">
64
+ <div className="code-header">
65
+ <span className="w-2 h-2 rounded-full bg-flow inline-block" />
66
+ <span>Client</span>
67
+ </div>
68
+ <pre className="font-mono text-sm px-6 py-4">
69
+ <code>
70
+ <span className="text-neutral-500">$</span>{' '}
71
+ <span className="text-white">bun add @syncular/client \</span>
72
+ {'\n'}
73
+ <span className="text-white">
74
+ {' '}@syncular/client-react \
75
+ </span>
76
+ {'\n'}
77
+ <span className="text-white">
78
+ {' '}@syncular/transport-http \
79
+ </span>
80
+ {'\n'}
81
+ <span className="text-white">
82
+ {' '}@syncular/dialect-wa-sqlite kysely
83
+ </span>
84
+ </code>
85
+ </pre>
86
+ </div>
87
+ </div>
88
+
89
+ <div className="mt-10 flex items-center justify-center gap-4 flex-wrap">
90
+ {docsHref ? (
91
+ <a
92
+ href={docsHref}
93
+ className="font-display font-medium text-sm bg-flow text-white px-6 py-2.5 rounded hover:bg-blue-600 transition-colors"
94
+ >
95
+ Read the docs
96
+ </a>
97
+ ) : null}
98
+ {demoHref ? (
99
+ <a
100
+ href={demoHref}
101
+ className="font-display font-medium text-sm border border-flow text-flow px-6 py-2.5 rounded hover:bg-flow/10 transition-colors"
102
+ >
103
+ Try the demo
104
+ </a>
105
+ ) : null}
106
+ {githubHref ? (
107
+ <a
108
+ href={githubHref}
109
+ className="font-display font-medium text-sm border border-border text-neutral-300 px-6 py-2.5 rounded hover:border-neutral-500 hover:text-white transition-colors"
110
+ >
111
+ View on GitHub
112
+ </a>
113
+ ) : null}
114
+ </div>
115
+ </div>
116
+ </section>
117
+ );
118
+ }
119
+ );
@@ -0,0 +1,64 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+ import type { ObservableMetrics } from './types';
6
+
7
+ export interface LiveMetricsBarProps {
8
+ metrics: ObservableMetrics;
9
+ className?: string;
10
+ }
11
+
12
+ export const LiveMetricsBar = forwardRef<HTMLDivElement, LiveMetricsBarProps>(
13
+ function LiveMetricsBar({ metrics, className }, ref) {
14
+ return (
15
+ <div
16
+ ref={ref}
17
+ className={cn(
18
+ 'dashboard-panel rounded-lg px-6 py-3 flex items-center justify-between flex-wrap gap-4',
19
+ className
20
+ )}
21
+ >
22
+ <div className="flex items-center gap-2">
23
+ <span className="w-1.5 h-1.5 rounded-full bg-flow inline-block" />
24
+ <span className="font-mono text-[11px] text-neutral-500 uppercase">
25
+ Commits/sec
26
+ </span>
27
+ <span className="font-mono text-sm text-white font-medium">
28
+ {metrics.commitsPerSec.toFixed(1)}
29
+ </span>
30
+ </div>
31
+ <div className="w-px h-4 bg-border" />
32
+ <div className="flex items-center gap-2">
33
+ <span className="w-1.5 h-1.5 rounded-full bg-healthy inline-block" />
34
+ <span className="font-mono text-[11px] text-neutral-500 uppercase">
35
+ Avg Sync Latency
36
+ </span>
37
+ <span className="font-mono text-sm text-white font-medium">
38
+ {metrics.avgLatency}ms
39
+ </span>
40
+ </div>
41
+ <div className="w-px h-4 bg-border" />
42
+ <div className="flex items-center gap-2">
43
+ <span className="w-1.5 h-1.5 rounded-full bg-syncing inline-block" />
44
+ <span className="font-mono text-[11px] text-neutral-500 uppercase">
45
+ Active Clients
46
+ </span>
47
+ <span className="font-mono text-sm text-white font-medium">
48
+ {metrics.activeClients}
49
+ </span>
50
+ </div>
51
+ <div className="w-px h-4 bg-border" />
52
+ <div className="flex items-center gap-2">
53
+ <span className="w-1.5 h-1.5 rounded-full bg-healthy inline-block" />
54
+ <span className="font-mono text-[11px] text-neutral-500 uppercase">
55
+ Uptime
56
+ </span>
57
+ <span className="font-mono text-sm text-white font-medium">
58
+ {metrics.uptime}
59
+ </span>
60
+ </div>
61
+ </div>
62
+ );
63
+ }
64
+ );
@@ -0,0 +1,155 @@
1
+ 'use client';
2
+
3
+ import { ExternalLink, Github, Star } from 'lucide-react';
4
+ import { forwardRef } from 'react';
5
+ import { cn } from '../lib/cn';
6
+ import { UI_VERSION } from '../version';
7
+
8
+ export interface ObservableUniverseHeaderTopicLink {
9
+ label: string;
10
+ href: string;
11
+ }
12
+
13
+ export interface ObservableUniverseHeaderProps {
14
+ topicLinks?: ObservableUniverseHeaderTopicLink[];
15
+ demoHref?: string;
16
+ consoleHref?: string;
17
+ githubHref?: string;
18
+ githubStars?: number | null;
19
+ className?: string;
20
+ }
21
+
22
+ const DEFAULT_TOPIC_LINKS: ObservableUniverseHeaderTopicLink[] = [
23
+ { label: 'Introduction', href: '/docs/introduction' },
24
+ { label: 'Build', href: '/docs/build' },
25
+ { label: 'Client SDK', href: '/docs/client-sdk' },
26
+ { label: 'Server', href: '/docs/server' },
27
+ { label: 'API', href: '/docs/api' },
28
+ ];
29
+
30
+ function isExternalHref(href: string): boolean {
31
+ return href.startsWith('http://') || href.startsWith('https://');
32
+ }
33
+
34
+ function formatCompactCount(value: number): string {
35
+ if (value < 1000) return value.toString();
36
+ if (value < 10_000) {
37
+ const short = (value / 1000).toFixed(1);
38
+ return `${short.endsWith('.0') ? short.slice(0, -2) : short}k`;
39
+ }
40
+ if (value < 1_000_000) {
41
+ return `${Math.floor(value / 1000)}k`;
42
+ }
43
+ const short = (value / 1_000_000).toFixed(1);
44
+ return `${short.endsWith('.0') ? short.slice(0, -2) : short}m`;
45
+ }
46
+
47
+ export const ObservableUniverseHeader = forwardRef<
48
+ HTMLElement,
49
+ ObservableUniverseHeaderProps
50
+ >(function ObservableUniverseHeader(
51
+ {
52
+ topicLinks = DEFAULT_TOPIC_LINKS,
53
+ demoHref,
54
+ consoleHref,
55
+ githubHref = 'https://github.com/syncular/syncular',
56
+ githubStars,
57
+ className,
58
+ },
59
+ ref
60
+ ) {
61
+ const formattedStars =
62
+ typeof githubStars === 'number' ? formatCompactCount(githubStars) : null;
63
+
64
+ return (
65
+ <nav
66
+ ref={ref}
67
+ className={cn(
68
+ 'fixed top-0 left-0 right-0 z-50 border-b border-border',
69
+ className
70
+ )}
71
+ style={{
72
+ background: 'rgba(12,12,12,0.92)',
73
+ backdropFilter: 'blur(12px)',
74
+ }}
75
+ >
76
+ <div className="max-w-[1400px] mx-auto px-6 h-12 flex items-center gap-4">
77
+ <a href="/" className="flex items-center gap-3 shrink-0">
78
+ <span className="font-display font-bold text-white text-sm tracking-tight">
79
+ syncular
80
+ </span>
81
+ <span
82
+ className="w-1.5 h-1.5 rounded-full bg-amber-400 inline-block"
83
+ style={{ boxShadow: '0 0 6px #f59e0b' }}
84
+ />
85
+ <span className="font-mono text-[10px] text-amber-300/80 uppercase tracking-widest">
86
+ alpha
87
+ </span>
88
+ <span className="font-mono text-[10px] text-neutral-500 tracking-wider">
89
+ v{UI_VERSION}
90
+ </span>
91
+ </a>
92
+
93
+ <div className="flex-1 min-w-0">
94
+ <div className="flex items-center gap-5 overflow-x-auto whitespace-nowrap [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden">
95
+ {topicLinks.map((topic) => (
96
+ <a
97
+ key={`${topic.label}:${topic.href}`}
98
+ href={topic.href}
99
+ className="font-mono text-[11px] text-neutral-500 hover:text-white transition-colors uppercase tracking-wider"
100
+ >
101
+ {topic.label}
102
+ </a>
103
+ ))}
104
+ </div>
105
+ </div>
106
+
107
+ <div className="flex items-center gap-2 shrink-0">
108
+ {demoHref ? (
109
+ <a
110
+ href={demoHref}
111
+ target={isExternalHref(demoHref) ? '_blank' : undefined}
112
+ rel={isExternalHref(demoHref) ? 'noreferrer noopener' : undefined}
113
+ className="font-mono text-[11px] text-white transition-colors bg-purple-600 hover:bg-purple-500 px-3 py-1 rounded flex items-center gap-1.5"
114
+ >
115
+ Demo
116
+ <ExternalLink className="size-2.5 opacity-50" />
117
+ </a>
118
+ ) : null}
119
+ {consoleHref ? (
120
+ <a
121
+ href={consoleHref}
122
+ className="font-mono text-[11px] text-flow hover:text-white transition-colors border border-flow/40 px-2.5 py-1 rounded"
123
+ >
124
+ Console
125
+ </a>
126
+ ) : null}
127
+ {githubHref ? (
128
+ <a
129
+ href={githubHref}
130
+ target={isExternalHref(githubHref) ? '_blank' : undefined}
131
+ rel={
132
+ isExternalHref(githubHref) ? 'noreferrer noopener' : undefined
133
+ }
134
+ className={cn(
135
+ 'text-neutral-400 hover:text-white transition-colors border border-border rounded inline-flex items-center',
136
+ formattedStars ? 'px-2.5 py-1 gap-1.5' : 'p-1.5'
137
+ )}
138
+ aria-label={
139
+ formattedStars ? `GitHub (${formattedStars} stars)` : 'GitHub'
140
+ }
141
+ >
142
+ <Github className="size-3.5" />
143
+ {formattedStars ? (
144
+ <span className="font-mono text-[10px] text-neutral-300 inline-flex items-center gap-1">
145
+ <Star className="size-2.5" />
146
+ {formattedStars}
147
+ </span>
148
+ ) : null}
149
+ </a>
150
+ ) : null}
151
+ </div>
152
+ </div>
153
+ </nav>
154
+ );
155
+ });
@@ -0,0 +1,74 @@
1
+ 'use client';
2
+
3
+ import { forwardRef } from 'react';
4
+ import { cn } from '../lib/cn';
5
+ import { ArchitectureSection } from './architecture-section';
6
+ import { CodeSection } from './code-section';
7
+ import { ExplanationSection } from './explanation-section';
8
+ import { FooterBar } from './footer-bar';
9
+ import { HeroDashboardSection } from './hero-dashboard-section';
10
+ import { InstallSection } from './install-section';
11
+ import {
12
+ ObservableUniverseHeader,
13
+ type ObservableUniverseHeaderTopicLink,
14
+ } from './observable-universe-header';
15
+ import { useObservableUniverseSimulation } from './use-observable-universe-simulation';
16
+
17
+ export interface ObservableUniverseLandingProps {
18
+ docsHref?: string;
19
+ topicLinks?: ObservableUniverseHeaderTopicLink[];
20
+ demoHref?: string;
21
+ consoleHref?: string;
22
+ githubHref?: string;
23
+ githubStars?: number | null;
24
+ className?: string;
25
+ }
26
+
27
+ export const ObservableUniverseLanding = forwardRef<
28
+ HTMLDivElement,
29
+ ObservableUniverseLandingProps
30
+ >(function ObservableUniverseLanding(
31
+ {
32
+ docsHref,
33
+ topicLinks,
34
+ demoHref,
35
+ consoleHref,
36
+ githubHref,
37
+ githubStars,
38
+ className,
39
+ },
40
+ ref
41
+ ) {
42
+ const { clients, entries, metrics, streamRate } =
43
+ useObservableUniverseSimulation();
44
+
45
+ return (
46
+ <div
47
+ ref={ref}
48
+ className={cn('bg-surface text-foreground min-h-screen', className)}
49
+ >
50
+ <ObservableUniverseHeader
51
+ topicLinks={topicLinks}
52
+ demoHref={demoHref}
53
+ consoleHref={consoleHref}
54
+ githubHref={githubHref}
55
+ githubStars={githubStars}
56
+ />
57
+ <HeroDashboardSection
58
+ clients={clients}
59
+ streamEntries={entries}
60
+ metrics={metrics}
61
+ streamRate={streamRate}
62
+ />
63
+ <ExplanationSection />
64
+ <ArchitectureSection />
65
+ <CodeSection />
66
+ <InstallSection
67
+ docsHref={docsHref}
68
+ demoHref={demoHref}
69
+ githubHref={githubHref}
70
+ />
71
+ <FooterBar />
72
+ </div>
73
+ );
74
+ });