@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.
Files changed (90) hide show
  1. package/CODE_OF_CONDUCT.md +26 -0
  2. package/CONTRIBUTING.md +54 -0
  3. package/LICENSE +21 -0
  4. package/README.md +334 -0
  5. package/SECURITY.md +30 -0
  6. package/SUPPORT.md +32 -0
  7. package/TRADEMARKS.md +14 -0
  8. package/base.css +100 -0
  9. package/bin/synced-flow.mjs +4639 -0
  10. package/components.css +1392 -0
  11. package/defaults.css +26 -0
  12. package/dist/config.d.ts +94 -0
  13. package/dist/config.js +3 -0
  14. package/dist/index.d.ts +45 -0
  15. package/dist/index.js +67 -0
  16. package/docs/accessibility-css.md +133 -0
  17. package/docs/ai-usage.md +112 -0
  18. package/docs/api-contract.md +81 -0
  19. package/docs/base-styling.md +113 -0
  20. package/docs/build-a-site-walkthrough.md +122 -0
  21. package/docs/cli-reference.md +230 -0
  22. package/docs/config-reference.md +81 -0
  23. package/docs/css-optimisation.md +117 -0
  24. package/docs/migration-from-tailwind.md +60 -0
  25. package/docs/native-components.md +156 -0
  26. package/docs/patterns.md +32 -0
  27. package/docs/presets.md +60 -0
  28. package/docs/quick-start.md +252 -0
  29. package/docs/recipes.md +285 -0
  30. package/docs/release-readiness.md +63 -0
  31. package/docs/system-primitives.md +150 -0
  32. package/docs/tailwind-comparison.md +66 -0
  33. package/docs/tokens.md +79 -0
  34. package/docs/website-patterns.md +114 -0
  35. package/docs/why-synced-flow.md +99 -0
  36. package/docs/wordpress.md +66 -0
  37. package/examples/README.md +16 -0
  38. package/examples/astro/package.json +19 -0
  39. package/examples/astro/src/pages/index.astro +85 -0
  40. package/examples/astro/src/styles/synced-flow.css +2 -0
  41. package/examples/astro/src/styles/synced-flow.generated.css +206 -0
  42. package/examples/astro/synced-flow.config.mjs +9 -0
  43. package/examples/next/app/layout.tsx +14 -0
  44. package/examples/next/app/page.tsx +92 -0
  45. package/examples/next/app/synced-flow.css +2 -0
  46. package/examples/next/app/synced-flow.generated.css +205 -0
  47. package/examples/next/package.json +19 -0
  48. package/examples/next/synced-flow.config.mjs +9 -0
  49. package/examples/plain-html/index.html +384 -0
  50. package/examples/plain-html/package.json +15 -0
  51. package/examples/plain-html/synced-flow.config.mjs +9 -0
  52. package/examples/plain-html/synced-flow.css +2 -0
  53. package/examples/plain-html/synced-flow.generated.css +205 -0
  54. package/examples/templates/README.md +22 -0
  55. package/examples/templates/blog-index.html +41 -0
  56. package/examples/templates/coming-soon.html +27 -0
  57. package/examples/templates/portfolio-scroll.html +45 -0
  58. package/examples/templates/saas-dashboard.html +171 -0
  59. package/examples/templates/saas-landing.html +104 -0
  60. package/examples/vite/index.html +2 -0
  61. package/examples/vite/package.json +20 -0
  62. package/examples/vite/src/main.jsx +27 -0
  63. package/examples/vite/src/synced-flow.css +2 -0
  64. package/examples/vite/src/synced-flow.generated.css +205 -0
  65. package/examples/vite/synced-flow.config.mjs +9 -0
  66. package/examples/wordpress/assets/css/synced-flow.css +641 -0
  67. package/examples/wordpress/functions.php +13 -0
  68. package/examples/wordpress/package.json +15 -0
  69. package/examples/wordpress/parts/footer.html +12 -0
  70. package/examples/wordpress/parts/header.html +10 -0
  71. package/examples/wordpress/patterns/contact-cta.php +28 -0
  72. package/examples/wordpress/patterns/feature-grid.php +38 -0
  73. package/examples/wordpress/patterns/landing-hero.php +45 -0
  74. package/examples/wordpress/synced-flow.config.mjs +11 -0
  75. package/examples/wordpress/templates/front-page.html +11 -0
  76. package/examples/wordpress/templates/index.html +27 -0
  77. package/examples/wordpress/theme.json +19 -0
  78. package/layout.css +365 -0
  79. package/package.json +93 -0
  80. package/reset.css +13 -0
  81. package/skills/synced-flow/SKILL.md +151 -0
  82. package/src/config.ts +98 -0
  83. package/src/index.ts +75 -0
  84. package/src/presets.d.mts +21 -0
  85. package/src/presets.mjs +171 -0
  86. package/src/tokens.mjs +138 -0
  87. package/src/utility-tokens.mjs +47 -0
  88. package/styles.css +2313 -0
  89. package/tokens.css +198 -0
  90. package/utilities.css +255 -0
@@ -0,0 +1,92 @@
1
+ export default function Page() {
2
+ return (
3
+ <main>
4
+ <header className="sf-section sf-section--compact sf-sticky-top sf-bg-background">
5
+ <nav className="sf-container sf-nav" aria-label="Main navigation">
6
+ <a className="sf-nav__link" href="#home">
7
+ Synced Studio
8
+ </a>
9
+ <ul className="sf-nav__list">
10
+ <li>
11
+ <a className="sf-nav__link" href="#work">
12
+ Work
13
+ </a>
14
+ </li>
15
+ <li>
16
+ <a className="sf-nav__link" href="#contact">
17
+ Contact
18
+ </a>
19
+ </li>
20
+ </ul>
21
+ </nav>
22
+ </header>
23
+
24
+ <section id="home" className="sf-section">
25
+ <div className="sf-container sf-split">
26
+ <div className="sf-stack">
27
+ <p className="sf-badge">Next.js template</p>
28
+ <h1 className="sf-text-display">Build with fluid tokens from the first screen.</h1>
29
+ <p className="sf-text-lead sf-prose">
30
+ This page composes a sticky nav, split hero, card grid, native disclosure, and contact form with Synced Flow classes.
31
+ </p>
32
+ <div className="sf-cluster">
33
+ <a className="sf-button sf-button--default" href="#contact">
34
+ Start discovery
35
+ </a>
36
+ <a className="sf-button sf-button--outline" href="#work">
37
+ View work
38
+ </a>
39
+ </div>
40
+ </div>
41
+ <div className="sf-card sf-stack">
42
+ <p className="sf-kicker">Replace this card</p>
43
+ <p className="sf-text-lead">Use this area for a product screenshot, proof points, or a short customer quote.</p>
44
+ </div>
45
+ </div>
46
+ </section>
47
+
48
+ <section id="work" className="sf-section">
49
+ <div className="sf-container sf-stack">
50
+ <div className="sf-section-header">
51
+ <p className="sf-kicker">Patterns</p>
52
+ <h2 className="sf-text-h2">Swap sections without writing page CSS.</h2>
53
+ </div>
54
+ <div className="sf-auto-grid">
55
+ {['Hero systems', 'Native overlays', 'Accessible forms'].map((item) => (
56
+ <article className="sf-card sf-card--interactive sf-stack" key={item}>
57
+ <h3 className="sf-text-h4">{item}</h3>
58
+ <p className="sf-text-muted">Replace this section with project content while keeping the class structure.</p>
59
+ </article>
60
+ ))}
61
+ </div>
62
+ </div>
63
+ </section>
64
+
65
+ <section id="contact" className="sf-section">
66
+ <div className="sf-container sf-split">
67
+ <div className="sf-stack">
68
+ <p className="sf-kicker">Contact</p>
69
+ <h2 className="sf-text-h2">A styled form without custom field CSS.</h2>
70
+ <details className="sf-disclosure">
71
+ <summary>Can this run without JavaScript components?</summary>
72
+ <p>Yes. Synced Flow styles native HTML and CSS primitives; project JavaScript stays optional.</p>
73
+ </details>
74
+ </div>
75
+ <form className="sf-form sf-card">
76
+ <label className="sf-field">
77
+ <span className="sf-label">Email</span>
78
+ <input className="sf-input" type="email" placeholder="you@example.com" />
79
+ </label>
80
+ <label className="sf-field">
81
+ <span className="sf-label">Message</span>
82
+ <textarea className="sf-textarea" rows={4} placeholder="Tell us what you are building." />
83
+ </label>
84
+ <button className="sf-button sf-button--default" type="submit">
85
+ Send
86
+ </button>
87
+ </form>
88
+ </div>
89
+ </section>
90
+ </main>
91
+ )
92
+ }
@@ -0,0 +1,2 @@
1
+ @import "@syncedco/flow/styles.css";
2
+ @import "./synced-flow.generated.css";
@@ -0,0 +1,205 @@
1
+ /* Generated by @syncedco/flow. Edit synced-flow.config.mjs or run synced-flow build to refresh. */
2
+
3
+ @layer reset, tokens, base, app, layout, components, utilities, overrides;
4
+
5
+ @layer tokens {
6
+ :root {
7
+ color-scheme: light;
8
+ --font-sans: var(--sf-font-sans, ui-sans-serif, system-ui, sans-serif);
9
+ --font-display: var(--sf-font-display, ui-serif, Georgia, serif);
10
+ --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace;
11
+
12
+ --step--2: clamp(0.6944rem, 0.6866rem + 0.0348vw, 0.72rem);
13
+ --step--1: clamp(0.8333rem, 0.8129rem + 0.0907vw, 0.9rem);
14
+ --step-0: clamp(1rem, 0.9617rem + 0.1701vw, 1.125rem);
15
+ --step-1: clamp(1.2rem, 1.1369rem + 0.2806vw, 1.4063rem);
16
+ --step-2: clamp(1.44rem, 1.3427rem + 0.4324vw, 1.7578rem);
17
+ --step-3: clamp(1.728rem, 1.5843rem + 0.6385vw, 2.1973rem);
18
+ --step-4: clamp(2.0736rem, 1.8676rem + 0.9156vw, 2.7466rem);
19
+ --step-5: clamp(2.4883rem, 2.1991rem + 1.2856vw, 3.4332rem);
20
+ --step-6: clamp(2.986rem, 2.5863rem + 1.7763vw, 4.2915rem);
21
+ --step-7: clamp(3.5832rem, 3.0379rem + 2.4235vw, 5.3644rem);
22
+ --step-8: clamp(4.2998rem, 3.5634rem + 3.2731vw, 6.7055rem);
23
+
24
+ --space-3xs: clamp(0.25rem, 0.2404rem + 0.0425vw, 0.2813rem);
25
+ --space-2xs: clamp(0.5rem, 0.4809rem + 0.085vw, 0.5625rem);
26
+ --space-xs: clamp(0.75rem, 0.7213rem + 0.1276vw, 0.8438rem);
27
+ --space-s: clamp(1rem, 0.9617rem + 0.1701vw, 1.125rem);
28
+ --space-m: clamp(1.5rem, 1.4426rem + 0.2551vw, 1.6875rem);
29
+ --space-l: clamp(2rem, 1.9235rem + 0.3401vw, 2.25rem);
30
+ --space-xl: clamp(3rem, 2.8852rem + 0.5102vw, 3.375rem);
31
+ --space-2xl: clamp(4rem, 3.8469rem + 0.6803vw, 4.5rem);
32
+ --space-3xl: clamp(6rem, 5.7704rem + 1.0204vw, 6.75rem);
33
+ --space-4xl: clamp(8rem, 7.6939rem + 1.3605vw, 9rem);
34
+ --space-3xs-2xs: clamp(0.25rem, 0.1543rem + 0.4252vw, 0.5625rem);
35
+ --space-2xs-xs: clamp(0.5rem, 0.3948rem + 0.4677vw, 0.8438rem);
36
+ --space-xs-s: clamp(0.75rem, 0.6352rem + 0.5102vw, 1.125rem);
37
+ --space-s-m: clamp(1rem, 0.7895rem + 0.9354vw, 1.6875rem);
38
+ --space-m-l: clamp(1.5rem, 1.2704rem + 1.0204vw, 2.25rem);
39
+ --space-l-xl: clamp(2rem, 1.5791rem + 1.8707vw, 3.375rem);
40
+ --space-xl-2xl: clamp(3rem, 2.5408rem + 2.0408vw, 4.5rem);
41
+ --space-2xl-3xl: clamp(4rem, 3.1582rem + 3.7415vw, 6.75rem);
42
+ --space-s-l: clamp(1rem, 0.6173rem + 1.7007vw, 2.25rem);
43
+ --space-m-xl: clamp(1.5rem, 0.926rem + 2.551vw, 3.375rem);
44
+ --space-l-2xl: clamp(2rem, 1.2347rem + 3.4014vw, 4.5rem);
45
+
46
+ --grid-max-width: 90rem;
47
+ --grid-gutter: var(--space-s-l);
48
+ --grid-columns: 12;
49
+
50
+ --radius-none: 0;
51
+ --radius-xs: 0.25rem;
52
+ --radius-sm: 0.375rem;
53
+ --radius-md: 0.5rem;
54
+ --radius-lg: 0.75rem;
55
+ --radius-xl: 1rem;
56
+ --radius-2xl: 1.25rem;
57
+ --radius-3xl: 1.5rem;
58
+ --radius-full: 999rem;
59
+ --radius: var(--radius-xl);
60
+
61
+ --color-ink-950: oklch(14% 0.025 248);
62
+ --color-ink-900: oklch(18% 0.024 246);
63
+ --color-ink-800: oklch(24% 0.022 244);
64
+ --color-ink-700: oklch(34% 0.02 240);
65
+ --color-ink-600: oklch(45% 0.018 236);
66
+ --color-ink-500: oklch(56% 0.015 232);
67
+ --color-paper: oklch(98.6% 0.014 78);
68
+ --color-paper-alt: oklch(96.6% 0.018 82);
69
+ --color-white: oklch(100% 0 0);
70
+ --color-black: oklch(0% 0 0);
71
+
72
+ --color-background: oklch(14% 0.025 248);
73
+ --color-foreground: oklch(96% 0.01 92);
74
+ --color-card: oklch(18% 0.024 246);
75
+ --color-card-foreground: oklch(96% 0.01 92);
76
+ --color-popover: oklch(18% 0.024 246);
77
+ --color-popover-foreground: oklch(96% 0.01 92);
78
+ --color-primary: oklch(69% 0.18 44);
79
+ --color-primary-hover: oklch(64% 0.18 44);
80
+ --color-primary-label: oklch(55% 0.18 44);
81
+ --color-primary-border: oklch(66% 0.17 43);
82
+ --color-primary-foreground: oklch(98% 0.01 95);
83
+ --color-secondary: oklch(24% 0.018 22);
84
+ --color-secondary-foreground: oklch(96% 0.01 92);
85
+ --color-muted: oklch(26% 0.012 24);
86
+ --color-muted-foreground: oklch(76% 0.01 92);
87
+ --color-accent: oklch(24% 0.018 22);
88
+ --color-accent-foreground: oklch(96% 0.01 92);
89
+ --color-destructive: oklch(55% 0.2 28);
90
+ --color-destructive-foreground: oklch(98% 0.01 95);
91
+ --color-border: oklch(100% 0 0 / 0.12);
92
+ --color-input: oklch(100% 0 0 / 0.12);
93
+ --color-ring: oklch(69% 0.18 44);
94
+ --color-heading: oklch(20% 0.02 18);
95
+ --color-page-text: oklch(23% 0.02 18);
96
+ --color-body: oklch(45% 0.02 28);
97
+ --color-body-dark: oklch(40% 0.02 28);
98
+ --color-subdued: oklch(42% 0.02 20);
99
+ --color-surface: oklch(96% 0.015 80);
100
+ --color-surface-alt: oklch(96.6% 0.018 82);
101
+ --color-hero-bg: oklch(8% 0.02 260);
102
+ --color-green: oklch(55% 0.12 148);
103
+ --color-green-dark: oklch(45% 0.12 148);
104
+ --color-green-muted: oklch(40% 0.12 148);
105
+ --color-green-light: oklch(90% 0.06 148);
106
+ --color-green-lighter: oklch(92% 0.04 148);
107
+ --color-green-bg: oklch(88% 0.07 148);
108
+ --color-green-bg-alt: oklch(82% 0.1 148);
109
+ --color-green-vivid: oklch(78% 0.08 148);
110
+ --color-green-mid: oklch(75% 0.12 148);
111
+ --color-green-deep: oklch(70% 0.14 150);
112
+ --color-green-deepest: oklch(60% 0.14 150);
113
+ --color-green-wash: oklch(93% 0.06 148);
114
+ --color-green-wash-alt: oklch(88% 0.08 148);
115
+ --color-green-gradient-from: oklch(82% 0.1 148);
116
+ --color-green-gradient-to: oklch(86% 0.06 148);
117
+ --color-deco-lime: oklch(80% 0.18 130);
118
+ --color-deco-blue: oklch(60% 0.12 240);
119
+ --color-deco-warm: oklch(80% 0.06 60);
120
+ --color-deco-warm-light: oklch(92% 0.02 80);
121
+ --color-deco-warm-mid: oklch(80% 0.15 60);
122
+ --color-purple-light: oklch(95% 0.05 280);
123
+ --color-purple-mid: oklch(92% 0.05 280);
124
+ --color-purple-dark: oklch(90% 0.06 280);
125
+ --color-purple-darker: oklch(87% 0.07 280);
126
+ --color-purple-icon: oklch(55% 0.2 280);
127
+ --color-warm-light: oklch(95.6% 0.05 22);
128
+ --color-warm-mid: oklch(95% 0.04 40);
129
+ --color-warm-grad-to: oklch(90% 0.08 30);
130
+ --color-warm-grad-to-alt: oklch(90% 0.06 30);
131
+ --color-warm-icon: oklch(60% 0.17 44);
132
+ --color-cool-light: oklch(92% 0.04 200);
133
+ --color-cool-dark: oklch(87% 0.06 200);
134
+ --color-primary-glow: oklch(80% 0.12 44);
135
+ --color-primary-soft: oklch(69% 0.18 44 / 0.10);
136
+ --color-primary-soft-border: oklch(69% 0.18 44 / 0.30);
137
+ --color-primary-soft-border-light: oklch(69% 0.18 44 / 0.25);
138
+ --color-primary-soft-text: oklch(85% 0.08 44);
139
+ --color-primary-highlight: oklch(75% 0.14 44);
140
+
141
+ --shadow-sm: 0 0.125rem 0.375rem oklch(0% 0 0 / 0.06);
142
+ --shadow-md: 0 0.5rem 1.5rem oklch(0% 0 0 / 0.08);
143
+ --shadow-lg: 0 1rem 2rem oklch(0% 0 0 / 0.1);
144
+ --shadow-xl: 0 1.5rem 3rem oklch(0% 0 0 / 0.14);
145
+ --shadow-2xl: 0 2rem 4rem oklch(0% 0 0 / 0.18);
146
+ --shadow-primary-cta: 0 0.875rem 1.875rem oklch(69% 0.18 44 / 0.24);
147
+ --shadow-glow: 0 0 2rem oklch(69% 0.18 44 / 0.28);
148
+
149
+ --duration-fast: 150ms;
150
+ --duration-normal: 220ms;
151
+ --duration-slow: 360ms;
152
+ --ease-standard: cubic-bezier(.2, 0, 0, 1);
153
+ }
154
+ }
155
+
156
+ @layer tokens {
157
+ :root {
158
+ --sf-font-sans: Inter, ui-sans-serif, system-ui, sans-serif;
159
+ --font-sans: var(--sf-font-sans);
160
+ --sf-font-display: Fraunces, Georgia, serif;
161
+ --font-display: var(--sf-font-display);
162
+ --sf-colour-background: oklch(98.6% 0.006 80);
163
+ --color-background: var(--sf-colour-background);
164
+ --sf-colour-foreground: oklch(18% 0.026 250);
165
+ --color-foreground: var(--sf-colour-foreground);
166
+ --sf-colour-muted: oklch(45% 0.018 236);
167
+ --color-muted: var(--sf-colour-muted);
168
+ --sf-colour-surface: oklch(100% 0 0);
169
+ --color-surface: var(--sf-colour-surface);
170
+ --sf-colour-surface-alt: oklch(96.4% 0.011 80);
171
+ --color-surface-alt: var(--sf-colour-surface-alt);
172
+ --sf-colour-border: oklch(18% 0.026 250 / 0.12);
173
+ --color-border: var(--sf-colour-border);
174
+ --sf-colour-primary: oklch(68% 0.18 44);
175
+ --color-primary: var(--sf-colour-primary);
176
+ --sf-colour-primary-hover: oklch(60% 0.17 42);
177
+ --color-primary-hover: var(--sf-colour-primary-hover);
178
+ --sf-colour-primary-foreground: oklch(100% 0 0);
179
+ --color-primary-foreground: var(--sf-colour-primary-foreground);
180
+ --sf-colour-accent: oklch(70% 0.12 205);
181
+ --color-accent: var(--sf-colour-accent);
182
+ --sf-colour-link: oklch(58% 0.17 42);
183
+ --color-link: var(--sf-colour-link);
184
+ --sf-colour-link-hover: oklch(68% 0.18 44);
185
+ --color-link-hover: var(--sf-colour-link-hover);
186
+ --sf-colour-ring: oklch(68% 0.18 44);
187
+ --color-ring: var(--sf-colour-ring);
188
+ --sf-button-radius: 0.5rem;
189
+ --button-radius: 0.5rem;
190
+ --sf-button-block-size: 2.75rem;
191
+ --button-size: 2.75rem;
192
+ --sf-button-padding-inline: var(--sf-space-s);
193
+ --button-padding-inline: var(--sf-space-s);
194
+ --sf-card-radius: 0.75rem;
195
+ --card-radius: 0.75rem;
196
+ --sf-card-padding: var(--sf-space-m-l);
197
+ --sf-input-radius: 0.5rem;
198
+ --sf-input-block-size: 2.75rem;
199
+ }
200
+ }
201
+
202
+ @layer utilities {
203
+
204
+
205
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "synced-flow-next-example",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "dev": "next dev",
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
+ "next": "^16.0.0",
16
+ "react": "^19.0.0",
17
+ "react-dom": "^19.0.0"
18
+ }
19
+ }
@@ -0,0 +1,9 @@
1
+ import { defineConfig } from '@syncedco/flow/config'
2
+ import { themePresets } from '@syncedco/flow/presets'
3
+
4
+ export default defineConfig({
5
+ scan: ['app', 'components', 'lib'],
6
+ out: 'app/synced-flow.generated.css',
7
+ responsiveVariants: false,
8
+ theme: themePresets.synced,
9
+ })