@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.
- package/README.md +11 -0
- package/dist/charts/activity-chart.d.ts +11 -0
- package/dist/charts/activity-chart.d.ts.map +1 -0
- package/dist/charts/activity-chart.js +28 -0
- package/dist/charts/activity-chart.js.map +1 -0
- package/dist/charts/chart.d.ts +50 -0
- package/dist/charts/chart.d.ts.map +1 -0
- package/dist/charts/chart.js +108 -0
- package/dist/charts/chart.js.map +1 -0
- package/dist/charts/index.d.ts +5 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +5 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/latency-chart.d.ts +15 -0
- package/dist/charts/latency-chart.d.ts.map +1 -0
- package/dist/charts/latency-chart.js +25 -0
- package/dist/charts/latency-chart.js.map +1 -0
- package/dist/charts/outcomes-chart.d.ts +11 -0
- package/dist/charts/outcomes-chart.d.ts.map +1 -0
- package/dist/charts/outcomes-chart.js +37 -0
- package/dist/charts/outcomes-chart.js.map +1 -0
- package/dist/console/activity-bars.d.ts +24 -0
- package/dist/console/activity-bars.d.ts.map +1 -0
- package/dist/console/activity-bars.js +25 -0
- package/dist/console/activity-bars.js.map +1 -0
- package/dist/console/alerts-config.d.ts +20 -0
- package/dist/console/alerts-config.d.ts.map +1 -0
- package/dist/console/alerts-config.js +31 -0
- package/dist/console/alerts-config.js.map +1 -0
- package/dist/console/api-keys-table.d.ts +16 -0
- package/dist/console/api-keys-table.d.ts.map +1 -0
- package/dist/console/api-keys-table.js +21 -0
- package/dist/console/api-keys-table.js.map +1 -0
- package/dist/console/bottom-bar.d.ts +17 -0
- package/dist/console/bottom-bar.d.ts.map +1 -0
- package/dist/console/bottom-bar.js +14 -0
- package/dist/console/bottom-bar.js.map +1 -0
- package/dist/console/commit-table.d.ts +12 -0
- package/dist/console/commit-table.d.ts.map +1 -0
- package/dist/console/commit-table.js +14 -0
- package/dist/console/commit-table.js.map +1 -0
- package/dist/console/connection-form.d.ts +29 -0
- package/dist/console/connection-form.d.ts.map +1 -0
- package/dist/console/connection-form.js +24 -0
- package/dist/console/connection-form.js.map +1 -0
- package/dist/console/connection-status-badge.d.ts +7 -0
- package/dist/console/connection-status-badge.d.ts.map +1 -0
- package/dist/console/connection-status-badge.js +19 -0
- package/dist/console/connection-status-badge.js.map +1 -0
- package/dist/console/danger-action-card.d.ts +10 -0
- package/dist/console/danger-action-card.d.ts.map +1 -0
- package/dist/console/danger-action-card.js +10 -0
- package/dist/console/danger-action-card.js.map +1 -0
- package/dist/console/empty-state.d.ts +9 -0
- package/dist/console/empty-state.d.ts.map +1 -0
- package/dist/console/empty-state.js +7 -0
- package/dist/console/empty-state.js.map +1 -0
- package/dist/console/filter-bar.d.ts +18 -0
- package/dist/console/filter-bar.d.ts.map +1 -0
- package/dist/console/filter-bar.js +14 -0
- package/dist/console/filter-bar.js.map +1 -0
- package/dist/console/fleet-card.d.ts +14 -0
- package/dist/console/fleet-card.d.ts.map +1 -0
- package/dist/console/fleet-card.js +58 -0
- package/dist/console/fleet-card.js.map +1 -0
- package/dist/console/handlers-table.d.ts +12 -0
- package/dist/console/handlers-table.d.ts.map +1 -0
- package/dist/console/handlers-table.js +21 -0
- package/dist/console/handlers-table.js.map +1 -0
- package/dist/console/index.d.ts +28 -0
- package/dist/console/index.d.ts.map +1 -0
- package/dist/console/index.js +28 -0
- package/dist/console/index.js.map +1 -0
- package/dist/console/kpi-card.d.ts +10 -0
- package/dist/console/kpi-card.d.ts.map +1 -0
- package/dist/console/kpi-card.js +17 -0
- package/dist/console/kpi-card.js.map +1 -0
- package/dist/console/kpi-strip.d.ts +10 -0
- package/dist/console/kpi-strip.d.ts.map +1 -0
- package/dist/console/kpi-strip.js +22 -0
- package/dist/console/kpi-strip.js.map +1 -0
- package/dist/console/latency-percentiles.d.ts +24 -0
- package/dist/console/latency-percentiles.d.ts.map +1 -0
- package/dist/console/latency-percentiles.js +23 -0
- package/dist/console/latency-percentiles.js.map +1 -0
- package/dist/console/live-activity-feed.d.ts +24 -0
- package/dist/console/live-activity-feed.d.ts.map +1 -0
- package/dist/console/live-activity-feed.js +29 -0
- package/dist/console/live-activity-feed.js.map +1 -0
- package/dist/console/maintenance-card.d.ts +28 -0
- package/dist/console/maintenance-card.d.ts.map +1 -0
- package/dist/console/maintenance-card.js +25 -0
- package/dist/console/maintenance-card.js.map +1 -0
- package/dist/console/page-header.d.ts +9 -0
- package/dist/console/page-header.d.ts.map +1 -0
- package/dist/console/page-header.js +9 -0
- package/dist/console/page-header.js.map +1 -0
- package/dist/console/panel-shell.d.ts +11 -0
- package/dist/console/panel-shell.d.ts.map +1 -0
- package/dist/console/panel-shell.js +10 -0
- package/dist/console/panel-shell.js.map +1 -0
- package/dist/console/preferences-panel.d.ts +30 -0
- package/dist/console/preferences-panel.d.ts.map +1 -0
- package/dist/console/preferences-panel.js +24 -0
- package/dist/console/preferences-panel.js.map +1 -0
- package/dist/console/section-card.d.ts +11 -0
- package/dist/console/section-card.d.ts.map +1 -0
- package/dist/console/section-card.js +9 -0
- package/dist/console/section-card.js.map +1 -0
- package/dist/console/stream-log.d.ts +26 -0
- package/dist/console/stream-log.d.ts.map +1 -0
- package/dist/console/stream-log.js +34 -0
- package/dist/console/stream-log.js.map +1 -0
- package/dist/console/sync-horizon.d.ts +18 -0
- package/dist/console/sync-horizon.d.ts.map +1 -0
- package/dist/console/sync-horizon.js +61 -0
- package/dist/console/sync-horizon.js.map +1 -0
- package/dist/console/sync-lag-bar.d.ts +23 -0
- package/dist/console/sync-lag-bar.d.ts.map +1 -0
- package/dist/console/sync-lag-bar.js +111 -0
- package/dist/console/sync-lag-bar.js.map +1 -0
- package/dist/console/sync-state-badge.d.ts +6 -0
- package/dist/console/sync-state-badge.d.ts.map +1 -0
- package/dist/console/sync-state-badge.js +21 -0
- package/dist/console/sync-state-badge.js.map +1 -0
- package/dist/console/topology-card.d.ts +9 -0
- package/dist/console/topology-card.d.ts.map +1 -0
- package/dist/console/topology-card.js +9 -0
- package/dist/console/topology-card.js.map +1 -0
- package/dist/console/topology-hero.d.ts +65 -0
- package/dist/console/topology-hero.d.ts.map +1 -0
- package/dist/console/topology-hero.js +90 -0
- package/dist/console/topology-hero.js.map +1 -0
- package/dist/demo/actor-panel.d.ts +11 -0
- package/dist/demo/actor-panel.d.ts.map +1 -0
- package/dist/demo/actor-panel.js +19 -0
- package/dist/demo/actor-panel.js.map +1 -0
- package/dist/demo/catalog-table.d.ts +17 -0
- package/dist/demo/catalog-table.d.ts.map +1 -0
- package/dist/demo/catalog-table.js +13 -0
- package/dist/demo/catalog-table.js.map +1 -0
- package/dist/demo/channel-selector.d.ts +12 -0
- package/dist/demo/channel-selector.d.ts.map +1 -0
- package/dist/demo/channel-selector.js +13 -0
- package/dist/demo/channel-selector.js.map +1 -0
- package/dist/demo/client-panel.d.ts +12 -0
- package/dist/demo/client-panel.d.ts.map +1 -0
- package/dist/demo/client-panel.js +18 -0
- package/dist/demo/client-panel.js.map +1 -0
- package/dist/demo/conflict-panel.d.ts +8 -0
- package/dist/demo/conflict-panel.d.ts.map +1 -0
- package/dist/demo/conflict-panel.js +9 -0
- package/dist/demo/conflict-panel.js.map +1 -0
- package/dist/demo/demo-header.d.ts +9 -0
- package/dist/demo/demo-header.d.ts.map +1 -0
- package/dist/demo/demo-header.js +12 -0
- package/dist/demo/demo-header.js.map +1 -0
- package/dist/demo/demo-section.d.ts +8 -0
- package/dist/demo/demo-section.d.ts.map +1 -0
- package/dist/demo/demo-section.js +10 -0
- package/dist/demo/demo-section.js.map +1 -0
- package/dist/demo/encrypted-badge.d.ts +7 -0
- package/dist/demo/encrypted-badge.d.ts.map +1 -0
- package/dist/demo/encrypted-badge.js +12 -0
- package/dist/demo/encrypted-badge.js.map +1 -0
- package/dist/demo/encryption-flow-diagram.d.ts +5 -0
- package/dist/demo/encryption-flow-diagram.d.ts.map +1 -0
- package/dist/demo/encryption-flow-diagram.js +24 -0
- package/dist/demo/encryption-flow-diagram.js.map +1 -0
- package/dist/demo/index.d.ts +27 -0
- package/dist/demo/index.d.ts.map +1 -0
- package/dist/demo/index.js +27 -0
- package/dist/demo/index.js.map +1 -0
- package/dist/demo/info-panel.d.ts +9 -0
- package/dist/demo/info-panel.d.ts.map +1 -0
- package/dist/demo/info-panel.js +11 -0
- package/dist/demo/info-panel.js.map +1 -0
- package/dist/demo/media-gallery.d.ts +7 -0
- package/dist/demo/media-gallery.d.ts.map +1 -0
- package/dist/demo/media-gallery.js +7 -0
- package/dist/demo/media-gallery.js.map +1 -0
- package/dist/demo/media-thumbnail.d.ts +11 -0
- package/dist/demo/media-thumbnail.d.ts.map +1 -0
- package/dist/demo/media-thumbnail.js +10 -0
- package/dist/demo/media-thumbnail.js.map +1 -0
- package/dist/demo/metric-card.d.ts +14 -0
- package/dist/demo/metric-card.d.ts.map +1 -0
- package/dist/demo/metric-card.js +20 -0
- package/dist/demo/metric-card.js.map +1 -0
- package/dist/demo/mnemonic-display.d.ts +8 -0
- package/dist/demo/mnemonic-display.d.ts.map +1 -0
- package/dist/demo/mnemonic-display.js +70 -0
- package/dist/demo/mnemonic-display.js.map +1 -0
- package/dist/demo/note-card.d.ts +10 -0
- package/dist/demo/note-card.d.ts.map +1 -0
- package/dist/demo/note-card.js +9 -0
- package/dist/demo/note-card.js.map +1 -0
- package/dist/demo/sync-controls.d.ts +8 -0
- package/dist/demo/sync-controls.d.ts.map +1 -0
- package/dist/demo/sync-controls.js +17 -0
- package/dist/demo/sync-controls.js.map +1 -0
- package/dist/demo/sync-status-badge.d.ts +7 -0
- package/dist/demo/sync-status-badge.d.ts.map +1 -0
- package/dist/demo/sync-status-badge.js +22 -0
- package/dist/demo/sync-status-badge.js.map +1 -0
- package/dist/demo/task-item.d.ts +12 -0
- package/dist/demo/task-item.d.ts.map +1 -0
- package/dist/demo/task-item.js +12 -0
- package/dist/demo/task-item.js.map +1 -0
- package/dist/demo/task-list.d.ts +8 -0
- package/dist/demo/task-list.d.ts.map +1 -0
- package/dist/demo/task-list.js +11 -0
- package/dist/demo/task-list.js.map +1 -0
- package/dist/demo/topology-panel.d.ts +10 -0
- package/dist/demo/topology-panel.d.ts.map +1 -0
- package/dist/demo/topology-panel.js +10 -0
- package/dist/demo/topology-panel.js.map +1 -0
- package/dist/demo/topology-svg-keyshare.d.ts +5 -0
- package/dist/demo/topology-svg-keyshare.d.ts.map +1 -0
- package/dist/demo/topology-svg-keyshare.js +31 -0
- package/dist/demo/topology-svg-keyshare.js.map +1 -0
- package/dist/demo/topology-svg-media.d.ts +5 -0
- package/dist/demo/topology-svg-media.d.ts.map +1 -0
- package/dist/demo/topology-svg-media.js +27 -0
- package/dist/demo/topology-svg-media.js.map +1 -0
- package/dist/demo/topology-svg-split.d.ts +5 -0
- package/dist/demo/topology-svg-split.d.ts.map +1 -0
- package/dist/demo/topology-svg-split.js +29 -0
- package/dist/demo/topology-svg-split.js.map +1 -0
- package/dist/demo/topology-svg-symmetric.d.ts +5 -0
- package/dist/demo/topology-svg-symmetric.d.ts.map +1 -0
- package/dist/demo/topology-svg-symmetric.js +35 -0
- package/dist/demo/topology-svg-symmetric.js.map +1 -0
- package/dist/demo/transfer-log.d.ts +14 -0
- package/dist/demo/transfer-log.d.ts.map +1 -0
- package/dist/demo/transfer-log.js +18 -0
- package/dist/demo/transfer-log.js.map +1 -0
- package/dist/demo/upload-area.d.ts +9 -0
- package/dist/demo/upload-area.d.ts.map +1 -0
- package/dist/demo/upload-area.js +58 -0
- package/dist/demo/upload-area.js.map +1 -0
- package/dist/forms/checkbox.d.ts +11 -0
- package/dist/forms/checkbox.d.ts.map +1 -0
- package/dist/forms/checkbox.js +16 -0
- package/dist/forms/checkbox.js.map +1 -0
- package/dist/forms/field.d.ts +7 -0
- package/dist/forms/field.d.ts.map +1 -0
- package/dist/forms/field.js +16 -0
- package/dist/forms/field.js.map +1 -0
- package/dist/forms/index.d.ts +7 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/index.js +7 -0
- package/dist/forms/index.js.map +1 -0
- package/dist/forms/select.d.ts +11 -0
- package/dist/forms/select.d.ts.map +1 -0
- package/dist/forms/select.js +15 -0
- package/dist/forms/select.js.map +1 -0
- package/dist/forms/textarea.d.ts +6 -0
- package/dist/forms/textarea.d.ts.map +1 -0
- package/dist/forms/textarea.js +8 -0
- package/dist/forms/textarea.js.map +1 -0
- package/dist/forms/toggle-group.d.ts +8 -0
- package/dist/forms/toggle-group.d.ts.map +1 -0
- package/dist/forms/toggle-group.js +11 -0
- package/dist/forms/toggle-group.js.map +1 -0
- package/dist/forms/toggle.d.ts +7 -0
- package/dist/forms/toggle.d.ts.map +1 -0
- package/dist/forms/toggle.js +9 -0
- package/dist/forms/toggle.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/cn.d.ts +3 -0
- package/dist/lib/cn.d.ts.map +1 -0
- package/dist/lib/cn.js +6 -0
- package/dist/lib/cn.js.map +1 -0
- package/dist/lib/types.d.ts +64 -0
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js +2 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/navigation/index.d.ts +6 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +6 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/nav-pill-group.d.ts +14 -0
- package/dist/navigation/nav-pill-group.d.ts.map +1 -0
- package/dist/navigation/nav-pill-group.js +15 -0
- package/dist/navigation/nav-pill-group.js.map +1 -0
- package/dist/navigation/nav-pill.d.ts +9 -0
- package/dist/navigation/nav-pill.d.ts.map +1 -0
- package/dist/navigation/nav-pill.js +7 -0
- package/dist/navigation/nav-pill.js.map +1 -0
- package/dist/navigation/status-dot.d.ts +13 -0
- package/dist/navigation/status-dot.d.ts.map +1 -0
- package/dist/navigation/status-dot.js +44 -0
- package/dist/navigation/status-dot.js.map +1 -0
- package/dist/navigation/syncular-brand.d.ts +6 -0
- package/dist/navigation/syncular-brand.d.ts.map +1 -0
- package/dist/navigation/syncular-brand.js +11 -0
- package/dist/navigation/syncular-brand.js.map +1 -0
- package/dist/navigation/top-navigation.d.ts +9 -0
- package/dist/navigation/top-navigation.d.ts.map +1 -0
- package/dist/navigation/top-navigation.js +9 -0
- package/dist/navigation/top-navigation.js.map +1 -0
- package/dist/observable-universe/architecture-section.d.ts +5 -0
- package/dist/observable-universe/architecture-section.d.ts.map +1 -0
- package/dist/observable-universe/architecture-section.js +44 -0
- package/dist/observable-universe/architecture-section.js.map +1 -0
- package/dist/observable-universe/code-section.d.ts +5 -0
- package/dist/observable-universe/code-section.d.ts.map +1 -0
- package/dist/observable-universe/code-section.js +86 -0
- package/dist/observable-universe/code-section.js.map +1 -0
- package/dist/observable-universe/commit-stream-panel.d.ts +8 -0
- package/dist/observable-universe/commit-stream-panel.d.ts.map +1 -0
- package/dist/observable-universe/commit-stream-panel.js +45 -0
- package/dist/observable-universe/commit-stream-panel.js.map +1 -0
- package/dist/observable-universe/connected-clients-panel.d.ts +7 -0
- package/dist/observable-universe/connected-clients-panel.d.ts.map +1 -0
- package/dist/observable-universe/connected-clients-panel.js +47 -0
- package/dist/observable-universe/connected-clients-panel.js.map +1 -0
- package/dist/observable-universe/constants.d.ts +10 -0
- package/dist/observable-universe/constants.d.ts.map +1 -0
- package/dist/observable-universe/constants.js +81 -0
- package/dist/observable-universe/constants.js.map +1 -0
- package/dist/observable-universe/explanation-section.d.ts +5 -0
- package/dist/observable-universe/explanation-section.d.ts.map +1 -0
- package/dist/observable-universe/explanation-section.js +76 -0
- package/dist/observable-universe/explanation-section.js.map +1 -0
- package/dist/observable-universe/footer-bar.d.ts +5 -0
- package/dist/observable-universe/footer-bar.d.ts.map +1 -0
- package/dist/observable-universe/footer-bar.js +12 -0
- package/dist/observable-universe/footer-bar.js.map +1 -0
- package/dist/observable-universe/hero-dashboard-section.d.ts +10 -0
- package/dist/observable-universe/hero-dashboard-section.d.ts.map +1 -0
- package/dist/observable-universe/hero-dashboard-section.js +20 -0
- package/dist/observable-universe/hero-dashboard-section.js.map +1 -0
- package/dist/observable-universe/index.d.ts +17 -0
- package/dist/observable-universe/index.d.ts.map +1 -0
- package/dist/observable-universe/index.js +17 -0
- package/dist/observable-universe/index.js.map +1 -0
- package/dist/observable-universe/install-section.d.ts +8 -0
- package/dist/observable-universe/install-section.d.ts.map +1 -0
- package/dist/observable-universe/install-section.js +24 -0
- package/dist/observable-universe/install-section.js.map +1 -0
- package/dist/observable-universe/live-metrics-bar.d.ts +7 -0
- package/dist/observable-universe/live-metrics-bar.d.ts.map +1 -0
- package/dist/observable-universe/live-metrics-bar.js +18 -0
- package/dist/observable-universe/live-metrics-bar.js.map +1 -0
- package/dist/observable-universe/observable-universe-header.d.ts +14 -0
- package/dist/observable-universe/observable-universe-header.d.ts.map +1 -0
- package/dist/observable-universe/observable-universe-header.js +45 -0
- package/dist/observable-universe/observable-universe-header.js.map +1 -0
- package/dist/observable-universe/observable-universe-landing.d.ts +12 -0
- package/dist/observable-universe/observable-universe-landing.d.ts.map +1 -0
- package/dist/observable-universe/observable-universe-landing.js +19 -0
- package/dist/observable-universe/observable-universe-landing.js.map +1 -0
- package/dist/observable-universe/section-heading.d.ts +8 -0
- package/dist/observable-universe/section-heading.d.ts.map +1 -0
- package/dist/observable-universe/section-heading.js +8 -0
- package/dist/observable-universe/section-heading.js.map +1 -0
- package/dist/observable-universe/sync-topology-panel.d.ts +7 -0
- package/dist/observable-universe/sync-topology-panel.d.ts.map +1 -0
- package/dist/observable-universe/sync-topology-panel.js +81 -0
- package/dist/observable-universe/sync-topology-panel.js.map +1 -0
- package/dist/observable-universe/types.d.ts +25 -0
- package/dist/observable-universe/types.d.ts.map +1 -0
- package/dist/observable-universe/types.js +2 -0
- package/dist/observable-universe/types.js.map +1 -0
- package/dist/observable-universe/use-observable-universe-simulation.d.ts +8 -0
- package/dist/observable-universe/use-observable-universe-simulation.d.ts.map +1 -0
- package/dist/observable-universe/use-observable-universe-simulation.js +92 -0
- package/dist/observable-universe/use-observable-universe-simulation.js.map +1 -0
- package/dist/primitives/alert.d.ts +14 -0
- package/dist/primitives/alert.d.ts.map +1 -0
- package/dist/primitives/alert.js +24 -0
- package/dist/primitives/alert.js.map +1 -0
- package/dist/primitives/badge.d.ts +12 -0
- package/dist/primitives/badge.d.ts.map +1 -0
- package/dist/primitives/badge.js +28 -0
- package/dist/primitives/badge.js.map +1 -0
- package/dist/primitives/button.d.ts +14 -0
- package/dist/primitives/button.d.ts.map +1 -0
- package/dist/primitives/button.js +30 -0
- package/dist/primitives/button.js.map +1 -0
- package/dist/primitives/card.d.ts +7 -0
- package/dist/primitives/card.d.ts.map +1 -0
- package/dist/primitives/card.js +16 -0
- package/dist/primitives/card.js.map +1 -0
- package/dist/primitives/dialog.d.ts +14 -0
- package/dist/primitives/dialog.d.ts.map +1 -0
- package/dist/primitives/dialog.js +25 -0
- package/dist/primitives/dialog.js.map +1 -0
- package/dist/primitives/index.d.ts +16 -0
- package/dist/primitives/index.d.ts.map +1 -0
- package/dist/primitives/index.js +16 -0
- package/dist/primitives/index.js.map +1 -0
- package/dist/primitives/input.d.ts +12 -0
- package/dist/primitives/input.d.ts.map +1 -0
- package/dist/primitives/input.js +20 -0
- package/dist/primitives/input.js.map +1 -0
- package/dist/primitives/pagination.d.ts +16 -0
- package/dist/primitives/pagination.d.ts.map +1 -0
- package/dist/primitives/pagination.js +13 -0
- package/dist/primitives/pagination.js.map +1 -0
- package/dist/primitives/separator.d.ts +10 -0
- package/dist/primitives/separator.d.ts.map +1 -0
- package/dist/primitives/separator.js +10 -0
- package/dist/primitives/separator.js.map +1 -0
- package/dist/primitives/sheet.d.ts +19 -0
- package/dist/primitives/sheet.d.ts.map +1 -0
- package/dist/primitives/sheet.js +35 -0
- package/dist/primitives/sheet.js.map +1 -0
- package/dist/primitives/skeleton.d.ts +3 -0
- package/dist/primitives/skeleton.d.ts.map +1 -0
- package/dist/primitives/skeleton.js +8 -0
- package/dist/primitives/skeleton.js.map +1 -0
- package/dist/primitives/spinner.d.ts +12 -0
- package/dist/primitives/spinner.d.ts.map +1 -0
- package/dist/primitives/spinner.js +23 -0
- package/dist/primitives/spinner.js.map +1 -0
- package/dist/primitives/switch.d.ts +7 -0
- package/dist/primitives/switch.d.ts.map +1 -0
- package/dist/primitives/switch.js +9 -0
- package/dist/primitives/switch.js.map +1 -0
- package/dist/primitives/table.d.ts +8 -0
- package/dist/primitives/table.d.ts.map +1 -0
- package/dist/primitives/table.js +18 -0
- package/dist/primitives/table.js.map +1 -0
- package/dist/primitives/tabs.d.ts +16 -0
- package/dist/primitives/tabs.d.ts.map +1 -0
- package/dist/primitives/tabs.js +26 -0
- package/dist/primitives/tabs.js.map +1 -0
- package/dist/primitives/tooltip.d.ts +13 -0
- package/dist/primitives/tooltip.d.ts.map +1 -0
- package/dist/primitives/tooltip.js +15 -0
- package/dist/primitives/tooltip.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/package.json +114 -0
- package/src/charts/activity-chart.tsx +85 -0
- package/src/charts/chart.tsx +302 -0
- package/src/charts/index.ts +4 -0
- package/src/charts/latency-chart.tsx +77 -0
- package/src/charts/outcomes-chart.tsx +101 -0
- package/src/console/activity-bars.tsx +113 -0
- package/src/console/alerts-config.tsx +110 -0
- package/src/console/api-keys-table.tsx +102 -0
- package/src/console/bottom-bar.tsx +73 -0
- package/src/console/commit-table.tsx +66 -0
- package/src/console/connection-form.tsx +153 -0
- package/src/console/connection-status-badge.tsx +48 -0
- package/src/console/danger-action-card.tsx +40 -0
- package/src/console/empty-state.tsx +31 -0
- package/src/console/filter-bar.tsx +97 -0
- package/src/console/fleet-card.tsx +154 -0
- package/src/console/handlers-table.tsx +74 -0
- package/src/console/index.ts +27 -0
- package/src/console/kpi-card.tsx +46 -0
- package/src/console/kpi-strip.tsx +77 -0
- package/src/console/latency-percentiles.tsx +109 -0
- package/src/console/live-activity-feed.tsx +112 -0
- package/src/console/maintenance-card.tsx +112 -0
- package/src/console/page-header.tsx +32 -0
- package/src/console/panel-shell.tsx +42 -0
- package/src/console/preferences-panel.tsx +126 -0
- package/src/console/section-card.tsx +41 -0
- package/src/console/stream-log.tsx +138 -0
- package/src/console/sync-horizon.tsx +149 -0
- package/src/console/sync-lag-bar.tsx +226 -0
- package/src/console/sync-state-badge.tsx +32 -0
- package/src/console/topology-card.tsx +47 -0
- package/src/console/topology-hero.tsx +499 -0
- package/src/demo/actor-panel.tsx +50 -0
- package/src/demo/catalog-table.tsx +83 -0
- package/src/demo/channel-selector.tsx +51 -0
- package/src/demo/client-panel.tsx +61 -0
- package/src/demo/conflict-panel.tsx +25 -0
- package/src/demo/demo-header.tsx +44 -0
- package/src/demo/demo-section.tsx +24 -0
- package/src/demo/encrypted-badge.tsx +59 -0
- package/src/demo/encryption-flow-diagram.tsx +93 -0
- package/src/demo/index.ts +26 -0
- package/src/demo/info-panel.tsx +41 -0
- package/src/demo/media-gallery.tsx +15 -0
- package/src/demo/media-thumbnail.tsx +55 -0
- package/src/demo/metric-card.tsx +85 -0
- package/src/demo/mnemonic-display.tsx +114 -0
- package/src/demo/note-card.tsx +52 -0
- package/src/demo/sync-controls.tsx +75 -0
- package/src/demo/sync-status-badge.tsx +36 -0
- package/src/demo/task-item.tsx +83 -0
- package/src/demo/task-list.tsx +33 -0
- package/src/demo/topology-panel.tsx +44 -0
- package/src/demo/topology-svg-keyshare.tsx +474 -0
- package/src/demo/topology-svg-media.tsx +423 -0
- package/src/demo/topology-svg-split.tsx +402 -0
- package/src/demo/topology-svg-symmetric.tsx +527 -0
- package/src/demo/transfer-log.tsx +68 -0
- package/src/demo/upload-area.tsx +136 -0
- package/src/forms/checkbox.tsx +58 -0
- package/src/forms/field.tsx +60 -0
- package/src/forms/index.ts +6 -0
- package/src/forms/select.tsx +65 -0
- package/src/forms/textarea.tsx +23 -0
- package/src/forms/toggle-group.tsx +24 -0
- package/src/forms/toggle.tsx +24 -0
- package/src/index.ts +7 -0
- package/src/lib/cn.ts +6 -0
- package/src/lib/types.ts +69 -0
- package/src/navigation/index.ts +5 -0
- package/src/navigation/nav-pill-group.tsx +46 -0
- package/src/navigation/nav-pill.tsx +35 -0
- package/src/navigation/status-dot.tsx +66 -0
- package/src/navigation/syncular-brand.tsx +29 -0
- package/src/navigation/top-navigation.tsx +31 -0
- package/src/observable-universe/architecture-section.tsx +209 -0
- package/src/observable-universe/code-section.tsx +136 -0
- package/src/observable-universe/commit-stream-panel.tsx +115 -0
- package/src/observable-universe/connected-clients-panel.tsx +109 -0
- package/src/observable-universe/constants.ts +84 -0
- package/src/observable-universe/explanation-section.tsx +129 -0
- package/src/observable-universe/footer-bar.tsx +34 -0
- package/src/observable-universe/hero-dashboard-section.tsx +71 -0
- package/src/observable-universe/index.ts +16 -0
- package/src/observable-universe/install-section.tsx +119 -0
- package/src/observable-universe/live-metrics-bar.tsx +64 -0
- package/src/observable-universe/observable-universe-header.tsx +155 -0
- package/src/observable-universe/observable-universe-landing.tsx +74 -0
- package/src/observable-universe/section-heading.tsx +31 -0
- package/src/observable-universe/sync-topology-panel.tsx +409 -0
- package/src/observable-universe/types.ts +26 -0
- package/src/observable-universe/use-observable-universe-simulation.ts +111 -0
- package/src/primitives/alert.tsx +55 -0
- package/src/primitives/badge.tsx +45 -0
- package/src/primitives/button.tsx +51 -0
- package/src/primitives/card.tsx +67 -0
- package/src/primitives/dialog.tsx +114 -0
- package/src/primitives/index.ts +15 -0
- package/src/primitives/input.tsx +37 -0
- package/src/primitives/pagination.tsx +54 -0
- package/src/primitives/separator.tsx +29 -0
- package/src/primitives/sheet.tsx +114 -0
- package/src/primitives/skeleton.tsx +17 -0
- package/src/primitives/spinner.tsx +52 -0
- package/src/primitives/switch.tsx +26 -0
- package/src/primitives/table.tsx +71 -0
- package/src/primitives/tabs.tsx +66 -0
- package/src/primitives/tooltip.tsx +43 -0
- package/src/styles/styles.css +177 -0
- package/src/styles/tokens.css +47 -0
- 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
|
+
});
|