@syncedco/flow 0.1.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/CODE_OF_CONDUCT.md +26 -0
- package/CONTRIBUTING.md +54 -0
- package/LICENSE +21 -0
- package/README.md +334 -0
- package/SECURITY.md +30 -0
- package/SUPPORT.md +32 -0
- package/TRADEMARKS.md +14 -0
- package/base.css +100 -0
- package/bin/synced-flow.mjs +4639 -0
- package/components.css +1392 -0
- package/defaults.css +26 -0
- package/dist/config.d.ts +94 -0
- package/dist/config.js +3 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +67 -0
- package/docs/accessibility-css.md +133 -0
- package/docs/ai-usage.md +112 -0
- package/docs/api-contract.md +81 -0
- package/docs/base-styling.md +113 -0
- package/docs/build-a-site-walkthrough.md +122 -0
- package/docs/cli-reference.md +230 -0
- package/docs/config-reference.md +81 -0
- package/docs/css-optimisation.md +117 -0
- package/docs/migration-from-tailwind.md +60 -0
- package/docs/native-components.md +156 -0
- package/docs/patterns.md +32 -0
- package/docs/presets.md +60 -0
- package/docs/quick-start.md +252 -0
- package/docs/recipes.md +285 -0
- package/docs/release-readiness.md +63 -0
- package/docs/system-primitives.md +150 -0
- package/docs/tailwind-comparison.md +66 -0
- package/docs/tokens.md +79 -0
- package/docs/website-patterns.md +114 -0
- package/docs/why-synced-flow.md +99 -0
- package/docs/wordpress.md +66 -0
- package/examples/README.md +16 -0
- package/examples/astro/package.json +19 -0
- package/examples/astro/src/pages/index.astro +85 -0
- package/examples/astro/src/styles/synced-flow.css +2 -0
- package/examples/astro/src/styles/synced-flow.generated.css +206 -0
- package/examples/astro/synced-flow.config.mjs +9 -0
- package/examples/next/app/layout.tsx +14 -0
- package/examples/next/app/page.tsx +92 -0
- package/examples/next/app/synced-flow.css +2 -0
- package/examples/next/app/synced-flow.generated.css +205 -0
- package/examples/next/package.json +19 -0
- package/examples/next/synced-flow.config.mjs +9 -0
- package/examples/plain-html/index.html +384 -0
- package/examples/plain-html/package.json +15 -0
- package/examples/plain-html/synced-flow.config.mjs +9 -0
- package/examples/plain-html/synced-flow.css +2 -0
- package/examples/plain-html/synced-flow.generated.css +205 -0
- package/examples/templates/README.md +22 -0
- package/examples/templates/blog-index.html +41 -0
- package/examples/templates/coming-soon.html +27 -0
- package/examples/templates/portfolio-scroll.html +45 -0
- package/examples/templates/saas-dashboard.html +171 -0
- package/examples/templates/saas-landing.html +104 -0
- package/examples/vite/index.html +2 -0
- package/examples/vite/package.json +20 -0
- package/examples/vite/src/main.jsx +27 -0
- package/examples/vite/src/synced-flow.css +2 -0
- package/examples/vite/src/synced-flow.generated.css +205 -0
- package/examples/vite/synced-flow.config.mjs +9 -0
- package/examples/wordpress/assets/css/synced-flow.css +641 -0
- package/examples/wordpress/functions.php +13 -0
- package/examples/wordpress/package.json +15 -0
- package/examples/wordpress/parts/footer.html +12 -0
- package/examples/wordpress/parts/header.html +10 -0
- package/examples/wordpress/patterns/contact-cta.php +28 -0
- package/examples/wordpress/patterns/feature-grid.php +38 -0
- package/examples/wordpress/patterns/landing-hero.php +45 -0
- package/examples/wordpress/synced-flow.config.mjs +11 -0
- package/examples/wordpress/templates/front-page.html +11 -0
- package/examples/wordpress/templates/index.html +27 -0
- package/examples/wordpress/theme.json +19 -0
- package/layout.css +365 -0
- package/package.json +93 -0
- package/reset.css +13 -0
- package/skills/synced-flow/SKILL.md +151 -0
- package/src/config.ts +98 -0
- package/src/index.ts +75 -0
- package/src/presets.d.mts +21 -0
- package/src/presets.mjs +171 -0
- package/src/tokens.mjs +138 -0
- package/src/utility-tokens.mjs +47 -0
- package/styles.css +2313 -0
- package/tokens.css +198 -0
- package/utilities.css +255 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Synced Flow Blog Index Template</title>
|
|
7
|
+
<link rel="stylesheet" href="../plain-html/synced-flow.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<main class="sf-section">
|
|
11
|
+
<div class="sf-container sf-stack">
|
|
12
|
+
<nav class="sf-breadcrumb" aria-label="Breadcrumb">
|
|
13
|
+
<a href="/">Home</a>
|
|
14
|
+
<span>Resources</span>
|
|
15
|
+
</nav>
|
|
16
|
+
<header class="sf-section-header">
|
|
17
|
+
<p class="sf-kicker">Resources</p>
|
|
18
|
+
<h1 class="sf-text-display">Ideas, guides, and product notes.</h1>
|
|
19
|
+
</header>
|
|
20
|
+
<div class="sf-auto-grid">
|
|
21
|
+
<article class="sf-card sf-card--interactive sf-stack">
|
|
22
|
+
<p class="sf-meta">Guide - 6 min read</p>
|
|
23
|
+
<h2 class="sf-text-h4"><a class="sf-link-plain" href="/articles/theme-tokens">Theme tokens first</a></h2>
|
|
24
|
+
<p class="sf-text-muted">Keep brand decisions reusable.</p>
|
|
25
|
+
</article>
|
|
26
|
+
<article class="sf-card sf-card--interactive sf-stack">
|
|
27
|
+
<p class="sf-meta">Pattern - 4 min read</p>
|
|
28
|
+
<h2 class="sf-text-h4"><a class="sf-link-plain" href="/articles/native-ui">Native UI patterns</a></h2>
|
|
29
|
+
<p class="sf-text-muted">Use browser primitives before JavaScript.</p>
|
|
30
|
+
</article>
|
|
31
|
+
</div>
|
|
32
|
+
<nav class="sf-pagination" aria-label="Pagination">
|
|
33
|
+
<a href="#">Previous</a>
|
|
34
|
+
<a aria-current="page" href="#">1</a>
|
|
35
|
+
<a href="#">2</a>
|
|
36
|
+
<a href="#">Next</a>
|
|
37
|
+
</nav>
|
|
38
|
+
</div>
|
|
39
|
+
</main>
|
|
40
|
+
</body>
|
|
41
|
+
</html>
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Synced Flow Coming Soon Template</title>
|
|
7
|
+
<link rel="stylesheet" href="../plain-html/synced-flow.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<main class="sf-section">
|
|
11
|
+
<section class="sf-container sf-split">
|
|
12
|
+
<div class="sf-stack">
|
|
13
|
+
<p class="sf-badge">Coming soon</p>
|
|
14
|
+
<h1 class="sf-text-display">A new product is almost ready.</h1>
|
|
15
|
+
<p class="sf-text-lead sf-prose">Join the list for launch updates.</p>
|
|
16
|
+
</div>
|
|
17
|
+
<form class="sf-form sf-card">
|
|
18
|
+
<label class="sf-field">
|
|
19
|
+
<span class="sf-label">Email</span>
|
|
20
|
+
<input class="sf-input" type="email" placeholder="you@example.com" required />
|
|
21
|
+
</label>
|
|
22
|
+
<button class="sf-button" type="submit">Join waitlist</button>
|
|
23
|
+
</form>
|
|
24
|
+
</section>
|
|
25
|
+
</main>
|
|
26
|
+
</body>
|
|
27
|
+
</html>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Synced Flow Scroll Portfolio Template</title>
|
|
7
|
+
<link rel="stylesheet" href="../plain-html/synced-flow.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<header class="sf-section sf-section--compact sf-sticky-top sf-bg-background">
|
|
11
|
+
<nav class="sf-container sf-nav" aria-label="Portfolio navigation">
|
|
12
|
+
<a class="sf-nav__link" href="#intro">Studio</a>
|
|
13
|
+
<ul class="sf-nav__list">
|
|
14
|
+
<li><a class="sf-nav__link" href="#work">Work</a></li>
|
|
15
|
+
<li><a class="sf-nav__link" href="#contact">Contact</a></li>
|
|
16
|
+
</ul>
|
|
17
|
+
</nav>
|
|
18
|
+
</header>
|
|
19
|
+
<main class="sf-scroll-viewport" data-snap="mandatory">
|
|
20
|
+
<section class="sf-scroll-panel" id="intro">
|
|
21
|
+
<div class="sf-container sf-stack">
|
|
22
|
+
<p class="sf-kicker">Selected work</p>
|
|
23
|
+
<h1 class="sf-text-display">Fluid portfolio panels with native scroll snap.</h1>
|
|
24
|
+
<p class="sf-text-lead sf-prose">Use each panel for one story, proof point, or call to action.</p>
|
|
25
|
+
</div>
|
|
26
|
+
</section>
|
|
27
|
+
<section class="sf-scroll-panel" id="work">
|
|
28
|
+
<div class="sf-container sf-split">
|
|
29
|
+
<div class="sf-card sf-stack">
|
|
30
|
+
<p class="sf-badge">Case study</p>
|
|
31
|
+
<h2 class="sf-text-h2">Project title</h2>
|
|
32
|
+
<p class="sf-text-muted">Replace this panel with project details.</p>
|
|
33
|
+
</div>
|
|
34
|
+
<div class="sf-frame sf-card" aria-label="Project media placeholder"></div>
|
|
35
|
+
</div>
|
|
36
|
+
</section>
|
|
37
|
+
<section class="sf-scroll-panel" id="contact">
|
|
38
|
+
<div class="sf-container sf-stack">
|
|
39
|
+
<h2 class="sf-text-h2">Let's build the next one.</h2>
|
|
40
|
+
<a class="sf-button" href="mailto:hello@example.com">Start a project</a>
|
|
41
|
+
</div>
|
|
42
|
+
</section>
|
|
43
|
+
</main>
|
|
44
|
+
</body>
|
|
45
|
+
</html>
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Synced Flow SaaS Dashboard Template</title>
|
|
7
|
+
<link rel="stylesheet" href="../plain-html/synced-flow.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<a class="sf-skip-link" href="#dashboard-main">Skip to dashboard</a>
|
|
11
|
+
<div class="sf-app-shell" data-sf-dashboard-theme data-sf-theme="light">
|
|
12
|
+
<aside class="sf-app-sidebar sf-stack" aria-label="Workspace navigation">
|
|
13
|
+
<div class="sf-app-sidebar__brand">
|
|
14
|
+
<span class="sf-badge" aria-hidden="true">SF</span>
|
|
15
|
+
<div><strong>Product Suite</strong><br><span class="sf-text-muted">Workspace</span></div>
|
|
16
|
+
</div>
|
|
17
|
+
<nav class="sf-nav" aria-label="Primary">
|
|
18
|
+
<p class="sf-kicker">Overview</p>
|
|
19
|
+
<ul class="sf-nav__list">
|
|
20
|
+
<li><a class="sf-nav__link" href="#dashboard-main" aria-current="page"><svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><rect width="7" height="9" x="3" y="3" rx="1"></rect><rect width="7" height="5" x="14" y="3" rx="1"></rect><rect width="7" height="9" x="14" y="12" rx="1"></rect><rect width="7" height="5" x="3" y="16" rx="1"></rect></svg><span>Dashboard</span></a></li>
|
|
21
|
+
<li><a class="sf-nav__link" href="#command"><svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><polyline points="4 17 10 11 4 5"></polyline><line x1="12" x2="20" y1="19" y2="19"></line></svg><span>Command centre</span></a></li>
|
|
22
|
+
</ul>
|
|
23
|
+
<p class="sf-kicker">Workspace</p>
|
|
24
|
+
<ul class="sf-nav__list">
|
|
25
|
+
<li><a class="sf-nav__link" href="#customers"><svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2"></path><circle cx="9" cy="7" r="4"></circle><path d="M22 21v-2a4 4 0 0 0-3-3.87"></path><path d="M16 3.13a4 4 0 0 1 0 7.75"></path></svg><span>Customers</span></a></li>
|
|
26
|
+
<li><a class="sf-nav__link" href="#activity"><svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M22 12h-4l-3 9L9 3l-3 9H2"></path></svg><span>Activity</span></a></li>
|
|
27
|
+
<li><a class="sf-nav__link" href="#billing"><svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><rect width="20" height="14" x="2" y="5" rx="2"></rect><line x1="2" x2="22" y1="10" y2="10"></line></svg><span>Billing</span></a></li>
|
|
28
|
+
</ul>
|
|
29
|
+
<p class="sf-kicker">System</p>
|
|
30
|
+
<ul class="sf-nav__list">
|
|
31
|
+
<li><a class="sf-nav__link" href="/app/settings"><svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z"></path><circle cx="12" cy="12" r="3"></circle></svg><span>Settings</span></a></li>
|
|
32
|
+
</ul>
|
|
33
|
+
</nav>
|
|
34
|
+
<footer class="sf-stack sf-stack--tight sf-push-block-end">
|
|
35
|
+
<div class="sf-cluster">
|
|
36
|
+
<span class="sf-badge" aria-hidden="true">S</span>
|
|
37
|
+
<span><strong>Account owner</strong><br><span class="sf-text-muted">Admin role</span></span>
|
|
38
|
+
</div>
|
|
39
|
+
<form action="/logout" method="post"><button class="sf-button sf-button--ghost sf-button--block" type="submit">Sign out</button></form>
|
|
40
|
+
<p class="sf-text-caption sf-text-muted">Product Suite v1.0</p>
|
|
41
|
+
</footer>
|
|
42
|
+
</aside>
|
|
43
|
+
<main class="sf-app-main sf-stack sf-stack--loose" id="dashboard-main">
|
|
44
|
+
<header class="sf-toolbar">
|
|
45
|
+
<div class="sf-cluster">
|
|
46
|
+
<button class="sf-button sf-button--outline sf-button--icon" type="button" aria-label="Open workspace menu">
|
|
47
|
+
<svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><line x1="4" x2="20" y1="7" y2="7"></line><line x1="4" x2="20" y1="12" y2="12"></line><line x1="4" x2="20" y1="17" y2="17"></line></svg>
|
|
48
|
+
</button>
|
|
49
|
+
<form class="sf-field" role="search">
|
|
50
|
+
<label class="sf-visually-hidden" for="dashboard-search">Search workspace</label>
|
|
51
|
+
<input class="sf-input" id="dashboard-search" type="search" placeholder="Search or type command..." size="36">
|
|
52
|
+
</form>
|
|
53
|
+
<span class="sf-badge" aria-hidden="true">Cmd K</span>
|
|
54
|
+
</div>
|
|
55
|
+
<div class="sf-cluster" aria-label="Theme, notifications, and signed-in user">
|
|
56
|
+
<button class="sf-button sf-button--outline sf-button--icon" type="button" aria-label="Use light theme" aria-pressed="true" data-sf-theme-choice="light">
|
|
57
|
+
<svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4"></circle><path d="M12 2v2"></path><path d="M12 20v2"></path><path d="m4.93 4.93 1.41 1.41"></path><path d="m17.66 17.66 1.41 1.41"></path><path d="M2 12h2"></path><path d="M20 12h2"></path><path d="m6.34 17.66-1.41 1.41"></path><path d="m19.07 4.93-1.41 1.41"></path></svg>
|
|
58
|
+
</button>
|
|
59
|
+
<button class="sf-button sf-button--outline sf-button--icon" type="button" aria-label="Use dark theme" aria-pressed="false" data-sf-theme-choice="dark">
|
|
60
|
+
<svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3a6 6 0 0 0 9 7.4A9 9 0 1 1 12 3Z"></path></svg>
|
|
61
|
+
</button>
|
|
62
|
+
<button class="sf-button sf-button--outline sf-button--icon" type="button" aria-label="View notifications">
|
|
63
|
+
<svg class="sf-icon" aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round"><path d="M10.27 21a2 2 0 0 0 3.46 0"></path><path d="M18 8a6 6 0 1 0-12 0c0 7-3 7-3 9h18c0-2-3-2-3-9"></path></svg>
|
|
64
|
+
</button>
|
|
65
|
+
<div class="sf-cluster" aria-label="Signed in as Admin">
|
|
66
|
+
<span class="sf-avatar" aria-hidden="true">A</span>
|
|
67
|
+
<strong>Admin</strong>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</header>
|
|
71
|
+
<section class="sf-metric-grid" aria-label="Workspace metrics">
|
|
72
|
+
<article class="sf-card sf-stack sf-stack--tight"><div class="sf-repel"><p class="sf-kicker">Accounts</p><span class="sf-badge">+12</span></div><strong class="sf-text-h3 sf-font-sans">128</strong><span class="sf-text-muted">Active workspaces</span></article>
|
|
73
|
+
<article class="sf-card sf-stack sf-stack--tight"><div class="sf-repel"><p class="sf-kicker">Revenue</p><span class="sf-badge">Month</span></div><strong class="sf-text-h3 sf-font-sans">£78k</strong><span class="sf-text-muted">Tracked this month</span></article>
|
|
74
|
+
<article class="sf-card sf-stack sf-stack--tight"><div class="sf-repel"><p class="sf-kicker">Tasks</p><span class="sf-badge">5 due</span></div><strong class="sf-text-h3 sf-font-sans">24</strong><span class="sf-text-muted">Open actions</span></article>
|
|
75
|
+
<article class="sf-card sf-stack sf-stack--tight"><div class="sf-repel"><p class="sf-kicker">Health</p><span class="sf-badge">Good</span></div><strong class="sf-text-h3 sf-font-sans">94%</strong><span class="sf-text-muted">Across accounts</span></article>
|
|
76
|
+
</section>
|
|
77
|
+
<section class="sf-panel-grid" data-density="featured" aria-labelledby="analytics-title">
|
|
78
|
+
<article class="sf-card sf-chart sf-chart--wide sf-stack" aria-labelledby="analytics-title">
|
|
79
|
+
<div class="sf-repel">
|
|
80
|
+
<div><p class="sf-kicker">Analytics</p><h2 class="sf-card__title sf-font-sans" id="analytics-title">Revenue trend</h2></div>
|
|
81
|
+
<span class="sf-badge">+12%</span>
|
|
82
|
+
</div>
|
|
83
|
+
<div class="sf-chart__plot">
|
|
84
|
+
<svg class="sf-chart__svg" viewBox="0 0 320 160" role="img" aria-labelledby="revenue-chart-title revenue-chart-desc">
|
|
85
|
+
<title id="revenue-chart-title">Revenue trend for the last six months</title>
|
|
86
|
+
<desc id="revenue-chart-desc">Revenue rises from twenty eight thousand pounds to seventy eight thousand pounds with one mid-period dip.</desc>
|
|
87
|
+
<path class="sf-chart__grid" d="M20 30H300M20 75H300M20 120H300"></path>
|
|
88
|
+
<path class="sf-chart__axis" d="M20 20V140H304"></path>
|
|
89
|
+
<path class="sf-chart__area" d="M20 124L72 104L124 112L176 76L228 54L280 34L280 140L20 140Z"></path>
|
|
90
|
+
<path class="sf-chart__line" d="M20 124L72 104L124 112L176 76L228 54L280 34"></path>
|
|
91
|
+
<circle class="sf-chart__point" cx="280" cy="34" r="4"></circle>
|
|
92
|
+
</svg>
|
|
93
|
+
</div>
|
|
94
|
+
<div class="sf-chart__legend" aria-label="Chart legend">
|
|
95
|
+
<span class="sf-chart__legend-item"><span class="sf-chart__swatch" aria-hidden="true"></span>Revenue</span>
|
|
96
|
+
<span class="sf-text-muted">£78k current month</span>
|
|
97
|
+
</div>
|
|
98
|
+
</article>
|
|
99
|
+
<article class="sf-card sf-chart sf-stack" aria-labelledby="capacity-title">
|
|
100
|
+
<div><p class="sf-kicker">Capacity</p><h2 class="sf-card__title sf-font-sans" id="capacity-title">Usage by area</h2></div>
|
|
101
|
+
<div class="sf-meter-list">
|
|
102
|
+
<label class="sf-meter-row"><span class="sf-repel"><strong>Accounts</strong><span class="sf-text-muted">82%</span></span><meter class="sf-meter" min="0" max="100" value="82">82%</meter></label>
|
|
103
|
+
<label class="sf-meter-row"><span class="sf-repel"><strong>Automation</strong><span class="sf-text-muted">64%</span></span><meter class="sf-meter" min="0" max="100" value="64">64%</meter></label>
|
|
104
|
+
<label class="sf-meter-row"><span class="sf-repel"><strong>Support</strong><span class="sf-text-muted">48%</span></span><meter class="sf-meter" min="0" max="100" value="48">48%</meter></label>
|
|
105
|
+
</div>
|
|
106
|
+
</article>
|
|
107
|
+
</section>
|
|
108
|
+
<section class="sf-metric-grid" id="command">
|
|
109
|
+
<article class="sf-card sf-stack"><div class="sf-repel"><h2 class="sf-card__title sf-font-sans">Command centre</h2><span class="sf-badge">Priority</span></div><p class="sf-card__description">Follow-ups, approvals, and missing next actions stay visible.</p></article>
|
|
110
|
+
<article class="sf-card sf-stack" id="billing"><h2 class="sf-card__title sf-font-sans">Billing watch</h2><p class="sf-card__description">2 overdue payment follow-ups and 1 renewal due this week.</p></article>
|
|
111
|
+
<article class="sf-card sf-stack"><h2 class="sf-card__title sf-font-sans">Relationship pulse</h2><p class="sf-card__description">Three customer timelines need a recent touch point.</p></article>
|
|
112
|
+
</section>
|
|
113
|
+
<section class="sf-panel-grid" id="customers">
|
|
114
|
+
<article class="sf-card sf-stack">
|
|
115
|
+
<div class="sf-repel"><h2 class="sf-card__title sf-font-sans">Recent activity</h2><a class="sf-link" href="/app/activity">View all</a></div>
|
|
116
|
+
<div class="sf-table-wrap">
|
|
117
|
+
<table>
|
|
118
|
+
<thead><tr><th>Item</th><th>Status</th><th>Value</th><th>Date</th></tr></thead>
|
|
119
|
+
<tbody>
|
|
120
|
+
<tr><td>Enterprise onboarding</td><td><span class="sf-badge">Active</span></td><td>£7,800</td><td>Today</td></tr>
|
|
121
|
+
<tr><td>Usage review</td><td><span class="sf-badge">Scheduled</span></td><td>£4,050</td><td>Yesterday</td></tr>
|
|
122
|
+
<tr><td>Renewal workflow</td><td><span class="sf-badge">Complete</span></td><td>£3,250</td><td>17 May</td></tr>
|
|
123
|
+
</tbody>
|
|
124
|
+
</table>
|
|
125
|
+
</div>
|
|
126
|
+
</article>
|
|
127
|
+
<article class="sf-card sf-stack" id="activity">
|
|
128
|
+
<div class="sf-repel"><h2 class="sf-card__title sf-font-sans">Recent customers</h2><a class="sf-link" href="/app/customers">View all</a></div>
|
|
129
|
+
<ul class="sf-list-reset sf-stack">
|
|
130
|
+
<li class="sf-repel"><span><strong>Northstar Labs</strong><br><span class="sf-text-muted">Growth workspace</span></span><span class="sf-text-muted">Healthy</span></li>
|
|
131
|
+
<li class="sf-repel"><span><strong>Willow Group</strong><br><span class="sf-text-muted">Operations workspace</span></span><span class="sf-text-muted">Needs review</span></li>
|
|
132
|
+
<li class="sf-repel"><span><strong>Harbour Systems</strong><br><span class="sf-text-muted">Platform workspace</span></span><span class="sf-text-muted">Healthy</span></li>
|
|
133
|
+
</ul>
|
|
134
|
+
</article>
|
|
135
|
+
</section>
|
|
136
|
+
<section class="sf-card sf-form" aria-labelledby="signin-title">
|
|
137
|
+
<!-- Example unauthenticated state. Wire this form to your app auth provider. -->
|
|
138
|
+
<div class="sf-repel">
|
|
139
|
+
<div><p class="sf-kicker">Signed out state</p><h2 class="sf-card__title sf-font-sans" id="signin-title">Sign in to your workspace</h2></div>
|
|
140
|
+
<span class="sf-badge">Auth UI only</span>
|
|
141
|
+
</div>
|
|
142
|
+
<div class="sf-panel-grid">
|
|
143
|
+
<label class="sf-field"><span class="sf-label">Email</span><input class="sf-input" type="email" autocomplete="email" placeholder="you@example.com"></label>
|
|
144
|
+
<label class="sf-field"><span class="sf-label">Password</span><input class="sf-input" type="password" autocomplete="current-password"></label>
|
|
145
|
+
</div>
|
|
146
|
+
<label class="sf-check"><input type="checkbox" name="remember"> <span>Remember this device</span></label>
|
|
147
|
+
<div class="sf-cluster"><button class="sf-button" type="submit">Sign in</button><a class="sf-link" href="/forgot-password">Forgot password?</a></div>
|
|
148
|
+
</section>
|
|
149
|
+
</main>
|
|
150
|
+
</div>
|
|
151
|
+
<script>
|
|
152
|
+
(() => {
|
|
153
|
+
const shell = document.querySelector("[data-sf-dashboard-theme]");
|
|
154
|
+
const buttons = document.querySelectorAll("[data-sf-theme-choice]");
|
|
155
|
+
const storageKey = "synced-flow-dashboard-theme";
|
|
156
|
+
const setTheme = (theme) => {
|
|
157
|
+
shell?.setAttribute("data-sf-theme", theme);
|
|
158
|
+
buttons.forEach((button) => {
|
|
159
|
+
button.setAttribute("aria-pressed", String(button.dataset.sfThemeChoice === theme));
|
|
160
|
+
});
|
|
161
|
+
localStorage.setItem(storageKey, theme);
|
|
162
|
+
};
|
|
163
|
+
const stored = localStorage.getItem(storageKey);
|
|
164
|
+
if (stored === "light" || stored === "dark") setTheme(stored);
|
|
165
|
+
buttons.forEach((button) => {
|
|
166
|
+
button.addEventListener("click", () => setTheme(button.dataset.sfThemeChoice));
|
|
167
|
+
});
|
|
168
|
+
})();
|
|
169
|
+
</script>
|
|
170
|
+
</body>
|
|
171
|
+
</html>
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="en">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
+
<title>Synced Flow SaaS Landing Template</title>
|
|
7
|
+
<link rel="stylesheet" href="../plain-html/synced-flow.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<a class="sf-skip-link" href="#main">Skip to main content</a>
|
|
11
|
+
<header class="sf-section sf-section--compact sf-sticky-top sf-bg-background">
|
|
12
|
+
<nav class="sf-container sf-nav" aria-label="Main navigation">
|
|
13
|
+
<a class="sf-nav__link" href="/">Product</a>
|
|
14
|
+
<ul class="sf-nav__list">
|
|
15
|
+
<li><a class="sf-nav__link" href="#features">Features</a></li>
|
|
16
|
+
<li><a class="sf-nav__link" href="#pricing">Pricing</a></li>
|
|
17
|
+
<li><a class="sf-nav__link" href="#faq">FAQ</a></li>
|
|
18
|
+
</ul>
|
|
19
|
+
<a class="sf-button sf-button--sm" href="#contact">Book demo</a>
|
|
20
|
+
</nav>
|
|
21
|
+
</header>
|
|
22
|
+
<main id="main">
|
|
23
|
+
<section class="sf-section">
|
|
24
|
+
<div class="sf-container sf-split">
|
|
25
|
+
<div class="sf-stack">
|
|
26
|
+
<p class="sf-kicker">Launch faster</p>
|
|
27
|
+
<h1 class="sf-text-display">A modern product site without page-specific CSS.</h1>
|
|
28
|
+
<p class="sf-text-lead sf-prose">Compose hero, proof, pricing, FAQ, and contact sections from Synced Flow primitives.</p>
|
|
29
|
+
<div class="sf-cluster">
|
|
30
|
+
<a class="sf-button sf-button--default" href="#contact">Start free</a>
|
|
31
|
+
<a class="sf-button sf-button--outline" href="#features">View features</a>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
<aside class="sf-card sf-stack">
|
|
35
|
+
<p class="sf-badge">Included</p>
|
|
36
|
+
<ul class="sf-list-disc">
|
|
37
|
+
<li>Fluid tokens</li>
|
|
38
|
+
<li>Native components</li>
|
|
39
|
+
<li>Accessible states</li>
|
|
40
|
+
</ul>
|
|
41
|
+
</aside>
|
|
42
|
+
</div>
|
|
43
|
+
</section>
|
|
44
|
+
<section class="sf-section" id="features">
|
|
45
|
+
<div class="sf-container sf-stack">
|
|
46
|
+
<header class="sf-section-header" data-align="center">
|
|
47
|
+
<p class="sf-kicker">Features</p>
|
|
48
|
+
<h2 class="sf-text-h2">Everything a basic website needs.</h2>
|
|
49
|
+
</header>
|
|
50
|
+
<div class="sf-auto-grid">
|
|
51
|
+
<article class="sf-card sf-card--interactive sf-stack">
|
|
52
|
+
<h3 class="sf-text-h4">Tokens</h3>
|
|
53
|
+
<p class="sf-text-muted">Theme type, colour, radius, motion, and surfaces.</p>
|
|
54
|
+
</article>
|
|
55
|
+
<article class="sf-card sf-card--interactive sf-stack">
|
|
56
|
+
<h3 class="sf-text-h4">Patterns</h3>
|
|
57
|
+
<p class="sf-text-muted">Hero, cards, nav, forms, pricing, FAQ, and CTA.</p>
|
|
58
|
+
</article>
|
|
59
|
+
<article class="sf-card sf-card--interactive sf-stack">
|
|
60
|
+
<h3 class="sf-text-h4">Guardrails</h3>
|
|
61
|
+
<p class="sf-text-muted">Doctor, lint, catalog, and recipe discovery.</p>
|
|
62
|
+
</article>
|
|
63
|
+
</div>
|
|
64
|
+
</div>
|
|
65
|
+
</section>
|
|
66
|
+
<section class="sf-section" id="pricing">
|
|
67
|
+
<div class="sf-container sf-stack">
|
|
68
|
+
<header class="sf-section-header" data-align="center">
|
|
69
|
+
<p class="sf-kicker">Pricing</p>
|
|
70
|
+
<h2 class="sf-text-h2">Simple plans.</h2>
|
|
71
|
+
</header>
|
|
72
|
+
<div class="sf-pricing-grid">
|
|
73
|
+
<article class="sf-price-card">
|
|
74
|
+
<h3>Starter</h3>
|
|
75
|
+
<p class="sf-price">$19</p>
|
|
76
|
+
<a class="sf-button sf-button--outline" href="#contact">Choose Starter</a>
|
|
77
|
+
</article>
|
|
78
|
+
<article class="sf-price-card" data-featured="true">
|
|
79
|
+
<h3>Team</h3>
|
|
80
|
+
<p class="sf-price">$49</p>
|
|
81
|
+
<a class="sf-button" href="#contact">Choose Team</a>
|
|
82
|
+
</article>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
</section>
|
|
86
|
+
<section class="sf-section" id="faq">
|
|
87
|
+
<div class="sf-container sf-stack">
|
|
88
|
+
<header class="sf-section-header">
|
|
89
|
+
<p class="sf-kicker">FAQ</p>
|
|
90
|
+
<h2 class="sf-text-h2">Answers before the call.</h2>
|
|
91
|
+
</header>
|
|
92
|
+
<details class="sf-disclosure">
|
|
93
|
+
<summary>Does this require JavaScript components?</summary>
|
|
94
|
+
<p>No. Synced Flow styles native HTML and CSS primitives.</p>
|
|
95
|
+
</details>
|
|
96
|
+
<details class="sf-disclosure">
|
|
97
|
+
<summary>Can the theme change?</summary>
|
|
98
|
+
<p>Yes. Put brand decisions in synced-flow.config.mjs theme tokens.</p>
|
|
99
|
+
</details>
|
|
100
|
+
</div>
|
|
101
|
+
</section>
|
|
102
|
+
</main>
|
|
103
|
+
</body>
|
|
104
|
+
</html>
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "synced-flow-vite-example",
|
|
3
|
+
"private": true,
|
|
4
|
+
"type": "module",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "vite",
|
|
7
|
+
"flow:build": "synced-flow build",
|
|
8
|
+
"flow:check": "synced-flow build --check",
|
|
9
|
+
"flow:lint": "synced-flow lint",
|
|
10
|
+
"flow:watch": "synced-flow watch",
|
|
11
|
+
"flow:doctor": "synced-flow doctor"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@syncedco/flow": "file:../..",
|
|
15
|
+
"@vitejs/plugin-react": "^5.0.0",
|
|
16
|
+
"vite": "^7.0.0",
|
|
17
|
+
"react": "^19.0.0",
|
|
18
|
+
"react-dom": "^19.0.0"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createRoot } from 'react-dom/client'
|
|
2
|
+
|
|
3
|
+
import './synced-flow.css'
|
|
4
|
+
|
|
5
|
+
function App() {
|
|
6
|
+
return (
|
|
7
|
+
<main className="sf-section">
|
|
8
|
+
<section className="sf-container sf-stack">
|
|
9
|
+
<p className="sf-badge">Strict fluid starter</p>
|
|
10
|
+
<h1 className="sf-text-display">A reusable styling foundation for practical interfaces.</h1>
|
|
11
|
+
<p className="sf-text-lead sf-prose">
|
|
12
|
+
Synced Flow gives new projects tokens, layout primitives, and generated utilities without starting from breakpoints.
|
|
13
|
+
</p>
|
|
14
|
+
<div className="sf-cluster">
|
|
15
|
+
<a className="sf-button sf-button--default" href="/">
|
|
16
|
+
Start building
|
|
17
|
+
</a>
|
|
18
|
+
<a className="sf-button sf-button--outline" href="https://github.com/SyncedCo/synced-flow">
|
|
19
|
+
View package
|
|
20
|
+
</a>
|
|
21
|
+
</div>
|
|
22
|
+
</section>
|
|
23
|
+
</main>
|
|
24
|
+
)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
createRoot(document.getElementById('root')).render(<App />)
|