@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,384 @@
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 Plain HTML Example</title>
7
+ <link rel="icon" href="data:," />
8
+ <link rel="stylesheet" href="./synced-flow.css" />
9
+ </head>
10
+ <body>
11
+ <a class="sf-skip-link" href="#main">Skip to main content</a>
12
+
13
+ <header class="sf-section sf-section--compact sf-sticky-top sf-bg-background">
14
+ <nav class="sf-container sf-nav" aria-label="Primary">
15
+ <a class="sf-link-plain sf-text-h4 sf-font-display" href="/">Synced Flow</a>
16
+ <ul class="sf-nav__list">
17
+ <li><a class="sf-nav__link" href="#features" aria-current="page">Features</a></li>
18
+ <li><a class="sf-nav__link" href="#systems">Systems</a></li>
19
+ <li><a class="sf-nav__link" href="#native">Native UI</a></li>
20
+ <li><a class="sf-nav__link" href="#contact">Contact</a></li>
21
+ </ul>
22
+ </nav>
23
+ </header>
24
+
25
+ <main id="main">
26
+ <section class="sf-hero">
27
+ <div class="sf-container sf-split">
28
+ <div class="sf-stack sf-stack--loose">
29
+ <div class="sf-stack sf-stack--tight">
30
+ <p class="sf-badge">Plain HTML starter</p>
31
+ <h1 class="sf-text-display">Build a modern fluid website without custom component CSS.</h1>
32
+ </div>
33
+ <p class="sf-text-lead sf-prose sf-text-muted">
34
+ This page uses Synced Flow tokens, base styles, layouts, components, and utilities for
35
+ common website needs: navigation, sections, cards, forms, alerts, buttons, and responsive flow.
36
+ </p>
37
+ <div class="sf-button-group">
38
+ <a class="sf-button sf-button--default" href="#contact">Start building</a>
39
+ <a class="sf-button sf-button--outline" href="#features">View primitives</a>
40
+ </div>
41
+ </div>
42
+
43
+ <aside class="sf-surface sf-surface--raised sf-stack" aria-label="Starter coverage">
44
+ <p class="sf-kicker">Included primitives</p>
45
+ <ul class="sf-list-disc sf-flow">
46
+ <li>Fluid type and spacing tokens</li>
47
+ <li>Containers, stacks, splits, grids, and surfaces</li>
48
+ <li>Buttons, links, forms, cards, alerts, and focus states</li>
49
+ </ul>
50
+ </aside>
51
+ </div>
52
+ </section>
53
+
54
+ <section class="sf-section" id="features">
55
+ <div class="sf-container sf-stack sf-stack--loose">
56
+ <div class="sf-section-header" data-align="center">
57
+ <p class="sf-kicker">Core building blocks</p>
58
+ <h2 class="sf-text-h1">Enough structure for a real website.</h2>
59
+ <p class="sf-text-lead sf-text-muted">
60
+ A developer can compose these pieces without writing one-off CSS for basic layout,
61
+ spacing, surfaces, typography, or interactive states.
62
+ </p>
63
+ </div>
64
+
65
+ <div class="sf-auto-grid">
66
+ <article class="sf-card sf-card--interactive sf-stack">
67
+ <div class="sf-card__header">
68
+ <h3 class="sf-card__title">Fluid foundations</h3>
69
+ <p class="sf-card__description">Type, spacing, radii, borders, shadows, and semantic colour roles.</p>
70
+ </div>
71
+ </article>
72
+ <article class="sf-card sf-card--interactive sf-stack">
73
+ <div class="sf-card__header">
74
+ <h3 class="sf-card__title">Layout primitives</h3>
75
+ <p class="sf-card__description">Containers, sections, stacks, clusters, splits, grids, frames, and covers.</p>
76
+ </div>
77
+ </article>
78
+ <article class="sf-card sf-card--interactive sf-stack">
79
+ <div class="sf-card__header">
80
+ <h3 class="sf-card__title">Common UI</h3>
81
+ <p class="sf-card__description">Buttons, forms, cards, alerts, nav links, badges, and accessible helpers.</p>
82
+ </div>
83
+ </article>
84
+ </div>
85
+ </div>
86
+ </section>
87
+
88
+ <section class="sf-section sf-bg-surface-alt" id="systems">
89
+ <div class="sf-container sf-stack sf-stack--loose">
90
+ <div class="sf-logo-cloud" aria-label="Example trusted by">
91
+ <span>Studio</span>
92
+ <span>Agency</span>
93
+ <span>Startup</span>
94
+ <span>Product</span>
95
+ </div>
96
+
97
+ <div class="sf-split">
98
+ <div class="sf-stack">
99
+ <p class="sf-kicker">System first</p>
100
+ <h2>Start with reusable decisions, then customize only what matters.</h2>
101
+ <p class="sf-prose sf-text-muted">
102
+ Synced Flow keeps defaults practical and gives projects semantic variables for
103
+ brand-specific choices. That keeps the first page fast while leaving room for product
104
+ or client identity.
105
+ </p>
106
+ </div>
107
+ <div class="sf-alert sf-alert--info" role="status">
108
+ <p class="sf-alert__title">No page CSS required for this demo</p>
109
+ <p>
110
+ The page uses the package stylesheet, semantic tokens, and reusable classes for all
111
+ visible layout and common UI styling.
112
+ </p>
113
+ </div>
114
+ </div>
115
+
116
+ <div class="sf-stats">
117
+ <div class="sf-stat">
118
+ <p class="sf-stat__value">10.5 KB</p>
119
+ <p class="sf-stat__label">Full core gzip size</p>
120
+ </div>
121
+ <div class="sf-stat">
122
+ <p class="sf-stat__value">0</p>
123
+ <p class="sf-stat__label">Runtime dependencies</p>
124
+ </div>
125
+ <div class="sf-stat">
126
+ <p class="sf-stat__value">1</p>
127
+ <p class="sf-stat__label">CSS entry to import</p>
128
+ </div>
129
+ </div>
130
+ </div>
131
+ </section>
132
+
133
+ <section class="sf-section">
134
+ <div class="sf-container sf-stack sf-stack--loose">
135
+ <div class="sf-section-header">
136
+ <p class="sf-kicker">Website patterns</p>
137
+ <h2>Common sections without inventing new CSS every time.</h2>
138
+ </div>
139
+
140
+ <div class="sf-auto-grid">
141
+ <article class="sf-feature">
142
+ <span class="sf-feature__icon" aria-hidden="true">1</span>
143
+ <h3 class="sf-feature__title">Feature blocks</h3>
144
+ <p class="sf-feature__text">Use icons, titles, and supporting text for product or service sections.</p>
145
+ </article>
146
+ <article class="sf-feature">
147
+ <span class="sf-feature__icon" aria-hidden="true">2</span>
148
+ <h3 class="sf-feature__title">Proof sections</h3>
149
+ <p class="sf-feature__text">Combine stats, testimonials, and logo clouds with the same token rhythm.</p>
150
+ </article>
151
+ <article class="sf-feature">
152
+ <span class="sf-feature__icon" aria-hidden="true">3</span>
153
+ <h3 class="sf-feature__title">Conversion patterns</h3>
154
+ <p class="sf-feature__text">Build pricing, FAQs, forms, notices, and calls to action from named primitives.</p>
155
+ </article>
156
+ </div>
157
+
158
+ <figure class="sf-testimonial">
159
+ <blockquote class="sf-testimonial__quote">
160
+ "Synced Flow gives us the repeatable parts first, so custom CSS is reserved for the brand moments."
161
+ </blockquote>
162
+ <figcaption class="sf-testimonial__meta">Example client, product team</figcaption>
163
+ </figure>
164
+ </div>
165
+ </section>
166
+
167
+ <section class="sf-section sf-bg-surface-alt">
168
+ <div class="sf-container sf-stack sf-stack--loose">
169
+ <div class="sf-section-header" data-align="center">
170
+ <p class="sf-kicker">Pricing and FAQ</p>
171
+ <h2>Useful commercial sections are part of the starter kit.</h2>
172
+ </div>
173
+
174
+ <div class="sf-pricing-grid">
175
+ <article class="sf-price-card">
176
+ <h3 class="sf-card__title">Starter</h3>
177
+ <div class="sf-price">
178
+ <span class="sf-price__value">£0</span>
179
+ <span class="sf-price__interval">prototype</span>
180
+ </div>
181
+ <p class="sf-card__description">Use the core primitives to build and test a new site direction.</p>
182
+ <a class="sf-button sf-button--outline sf-button--block" href="#contact">Try it</a>
183
+ </article>
184
+ <article class="sf-price-card sf-price-card--featured">
185
+ <p class="sf-badge">Most useful</p>
186
+ <h3 class="sf-card__title">Website</h3>
187
+ <div class="sf-price">
188
+ <span class="sf-price__value">£49</span>
189
+ <span class="sf-price__interval">project</span>
190
+ </div>
191
+ <p class="sf-card__description">Use patterns, docs, and examples to ship a complete marketing site.</p>
192
+ <a class="sf-button sf-button--default sf-button--block" href="#contact">Start</a>
193
+ </article>
194
+ </div>
195
+
196
+ <div class="sf-faq">
197
+ <details class="sf-faq__item">
198
+ <summary>Is this trying to replace Tailwind?</summary>
199
+ <p>No. Synced Flow offers named CSS primitives and patterns for common website work.</p>
200
+ </details>
201
+ <details class="sf-faq__item">
202
+ <summary>Can I still customize a project?</summary>
203
+ <p>Yes. Override semantic tokens first, then add project CSS only for unique brand moments.</p>
204
+ </details>
205
+ </div>
206
+ </div>
207
+ </section>
208
+
209
+ <section class="sf-section" id="contact">
210
+ <div class="sf-container sf-split">
211
+ <div class="sf-stack">
212
+ <p class="sf-kicker">Forms included</p>
213
+ <h2>Collect a lead without rebuilding inputs from scratch.</h2>
214
+ <p class="sf-prose sf-text-muted">
215
+ Fields, labels, help text, textarea, select, checkbox, focus rings, disabled states,
216
+ and buttons all share the same token system.
217
+ </p>
218
+ </div>
219
+
220
+ <form class="sf-surface sf-form" action="/" method="post">
221
+ <div class="sf-field">
222
+ <label class="sf-required" for="name">Name</label>
223
+ <input class="sf-input" id="name" name="name" autocomplete="name" placeholder="Alex Morgan" required aria-describedby="name-help" />
224
+ <p class="sf-help" id="name-help">Your name is required so the form has a clear accessible label and requirement.</p>
225
+ </div>
226
+
227
+ <div class="sf-field">
228
+ <label for="project">Project type</label>
229
+ <select class="sf-select" id="project" name="project">
230
+ <option>Marketing website</option>
231
+ <option>Product site</option>
232
+ <option>Web app shell</option>
233
+ </select>
234
+ </div>
235
+
236
+ <div class="sf-field" data-invalid="true">
237
+ <label for="message">Project notes</label>
238
+ <textarea class="sf-textarea" id="message" name="message" placeholder="Tell us what you want to build" aria-invalid="true" aria-describedby="message-help message-error"></textarea>
239
+ <p class="sf-help" id="message-help">Use semantic classes first; add custom CSS only for truly project-specific styling.</p>
240
+ <p class="sf-error" id="message-error">Example invalid state: add a little more project detail.</p>
241
+ </div>
242
+
243
+ <label class="sf-check">
244
+ <input type="checkbox" name="updates" />
245
+ <span>Send me practical CSS system updates.</span>
246
+ </label>
247
+
248
+ <button class="sf-button sf-button--default sf-button--block" type="submit">Send enquiry</button>
249
+ </form>
250
+ </div>
251
+ </section>
252
+
253
+ <section class="sf-section sf-bg-surface-alt" id="native">
254
+ <div class="sf-container sf-stack sf-stack--loose">
255
+ <div class="sf-section-header">
256
+ <p class="sf-kicker">Native component layer</p>
257
+ <h2>Dialog, popover, disclosure, tabs, and scroll patterns without a JS component library.</h2>
258
+ <p class="sf-text-muted sf-prose">
259
+ Synced Flow styles native browser primitives and progressive state hooks. Projects can add tiny helper scripts only when accessible state sync needs it.
260
+ </p>
261
+ </div>
262
+
263
+ <div class="sf-auto-grid">
264
+ <article class="sf-card sf-stack">
265
+ <h3 class="sf-card__title">Dialog</h3>
266
+ <p class="sf-card__description">Use the native dialog element with tokenized panels and backdrops.</p>
267
+ <button class="sf-button sf-button--outline" type="button" commandfor="demo-dialog" command="show-modal">Open dialog</button>
268
+ </article>
269
+
270
+ <article class="sf-card sf-stack">
271
+ <h3 class="sf-card__title">Popover and tooltip</h3>
272
+ <p class="sf-card__description">
273
+ <button class="sf-tooltip-trigger" type="button" interestfor="demo-tooltip" aria-describedby="demo-tooltip">Hover or focus</button>
274
+ for native popover help where supported.
275
+ </p>
276
+ <p class="sf-tooltip" id="demo-tooltip" popover="hint">Tooltips keep the accessible description in markup.</p>
277
+ <button class="sf-button sf-button--secondary" type="button" popovertarget="demo-toast">Show toast</button>
278
+ </article>
279
+
280
+ <article class="sf-card sf-stack">
281
+ <h3 class="sf-card__title">Disclosure</h3>
282
+ <div class="sf-accordion">
283
+ <details name="native-demo">
284
+ <summary>Can accordions be native?</summary>
285
+ <p>Yes. Details elements with the same name behave as an exclusive accordion in supporting browsers.</p>
286
+ </details>
287
+ <details name="native-demo">
288
+ <summary>Does this ship JavaScript?</summary>
289
+ <p>No. The package ships CSS and documented markup contracts only.</p>
290
+ </details>
291
+ </div>
292
+ </article>
293
+
294
+ <article class="sf-card sf-stack">
295
+ <h3 class="sf-card__title">Drawer</h3>
296
+ <p class="sf-card__description">Use popover-backed drawers for menus, filters, and lightweight panels.</p>
297
+ <button class="sf-button sf-button--secondary" type="button" popovertarget="demo-drawer">Open drawer</button>
298
+ </article>
299
+ </div>
300
+
301
+ <section class="sf-tabs" aria-labelledby="tabs-title">
302
+ <h3 class="sf-text-h4" id="tabs-title">CSS-first tabs</h3>
303
+ <input id="tab-one" name="demo-tabs" type="radio" checked />
304
+ <input id="tab-two" name="demo-tabs" type="radio" />
305
+ <div class="sf-tab-list" aria-label="Native component examples">
306
+ <label class="sf-tab" for="tab-one">Markup</label>
307
+ <label class="sf-tab" for="tab-two">Theming</label>
308
+ </div>
309
+ <div class="sf-tab-panels">
310
+ <div class="sf-tab-panel">
311
+ <p>Use the CSS-only radio pattern for simple panels, or add example-level JavaScript for full tab keyboard behavior.</p>
312
+ </div>
313
+ <div class="sf-tab-panel">
314
+ <p>Native controls inherit light and dark semantic tokens through <code>color-scheme</code> and <code>data-sf-theme</code>.</p>
315
+ </div>
316
+ </div>
317
+ </section>
318
+
319
+ <div class="sf-scroll-viewport" data-snap="mandatory" data-size="preview" aria-label="Scroll snap demo">
320
+ <section class="sf-scroll-panel sf-surface">
321
+ <div class="sf-stack">
322
+ <p class="sf-kicker">Scroll panel</p>
323
+ <h3>First snap section</h3>
324
+ </div>
325
+ </section>
326
+ <section class="sf-scroll-panel sf-surface sf-surface--raised">
327
+ <div class="sf-stack">
328
+ <p class="sf-kicker">Sticky and snap</p>
329
+ <h3>Second snap section</h3>
330
+ </div>
331
+ </section>
332
+ </div>
333
+ </div>
334
+ </section>
335
+
336
+ <dialog class="sf-dialog" id="demo-dialog" aria-labelledby="demo-dialog-title">
337
+ <header class="sf-dialog__header">
338
+ <h2 id="demo-dialog-title">Native dialog</h2>
339
+ <button class="sf-button sf-button--ghost" type="button" commandfor="demo-dialog" command="close">Close</button>
340
+ </header>
341
+ <div class="sf-dialog__body">
342
+ <p class="sf-prose">The dialog uses native focus handling where supported and Synced Flow tokens for its surface, border, radius, and backdrop.</p>
343
+ </div>
344
+ <footer class="sf-dialog__footer">
345
+ <button class="sf-button" type="button" commandfor="demo-dialog" command="close">Done</button>
346
+ </footer>
347
+ </dialog>
348
+
349
+ <aside class="sf-toast" id="demo-toast" popover role="status">
350
+ <p class="sf-alert__title">Saved</p>
351
+ <p>This toast is a popover-backed status message.</p>
352
+ </aside>
353
+
354
+ <aside class="sf-drawer sf-drawer--right sf-stack" id="demo-drawer" popover aria-label="Example drawer">
355
+ <p class="sf-kicker">Drawer</p>
356
+ <h2 class="sf-text-h4">Native popover panel</h2>
357
+ <p class="sf-prose">Drawers use the Popover API and inherit the same semantic surface tokens.</p>
358
+ <button class="sf-button sf-button--outline" type="button" popovertarget="demo-drawer" popovertargetaction="hide">Close drawer</button>
359
+ </aside>
360
+
361
+ <section class="sf-section sf-section--compact">
362
+ <div class="sf-container">
363
+ <div class="sf-cta" data-layout="split" role="status">
364
+ <div class="sf-stack sf-stack--tight">
365
+ <p class="sf-alert__title">Ready for a basic website build</p>
366
+ <p>
367
+ Header, hero, content, cards, proof, pricing, FAQ, form, call to action, and footer
368
+ are all composed from Synced Flow primitives.
369
+ </p>
370
+ </div>
371
+ <a class="sf-button sf-button--default" href="#contact">Use the patterns</a>
372
+ </div>
373
+ </div>
374
+ </section>
375
+ </main>
376
+
377
+ <footer class="sf-footer">
378
+ <div class="sf-container sf-repel">
379
+ <p class="sf-text-caption sf-text-muted">Synced Flow plain HTML example</p>
380
+ <a class="sf-link" href="#main">Back to top</a>
381
+ </div>
382
+ </footer>
383
+ </body>
384
+ </html>
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "synced-flow-plain-html-example",
3
+ "private": true,
4
+ "type": "module",
5
+ "scripts": {
6
+ "flow:build": "synced-flow build",
7
+ "flow:check": "synced-flow build --check",
8
+ "flow:lint": "synced-flow lint",
9
+ "flow:watch": "synced-flow watch",
10
+ "flow:doctor": "synced-flow doctor"
11
+ },
12
+ "dependencies": {
13
+ "@syncedco/flow": "file:../.."
14
+ }
15
+ }
@@ -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: ['.'],
6
+ out: 'synced-flow.generated.css',
7
+ responsiveVariants: false,
8
+ theme: themePresets.synced,
9
+ })
@@ -0,0 +1,2 @@
1
+ @import "../../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,22 @@
1
+ # Full Page Templates
2
+
3
+ These templates are copy-ready HTML examples built from Synced Flow primitives.
4
+ They intentionally reuse the plain HTML example CSS entry so they do not add to
5
+ the core CSS size.
6
+
7
+ Use the CLI for framework-specific output:
8
+
9
+ ```bash
10
+ pnpm exec synced-flow recipe saas-landing --markup
11
+ pnpm exec synced-flow recipe saas-landing --framework next --markup
12
+ pnpm exec synced-flow recipe saas-dashboard --framework next --markup
13
+ pnpm exec synced-flow recipe portfolio-scroll --framework astro --markup
14
+ ```
15
+
16
+ Templates:
17
+
18
+ - `saas-landing.html`
19
+ - `saas-dashboard.html`
20
+ - `portfolio-scroll.html`
21
+ - `blog-index.html`
22
+ - `coming-soon.html`