@syncedco/flow 0.3.1 → 0.4.1
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/CHANGELOG.md +33 -0
- package/CONTRIBUTING.md +18 -5
- package/README.md +32 -9
- package/base.css +2 -1
- package/bin/synced-flow.mjs +446 -58
- package/components.css +440 -9
- package/dist/index.d.ts +69 -0
- package/dist/index.js +69 -0
- package/docs/accessibility-css.md +14 -3
- package/docs/ai-usage.md +22 -1
- package/docs/api-contract.md +10 -2
- package/docs/audit-2026-06.md +13 -12
- package/docs/base-styling.md +5 -0
- package/docs/cli-reference.md +9 -6
- package/docs/config-reference.md +2 -2
- package/docs/css-optimisation.md +10 -10
- package/docs/native-components.md +121 -0
- package/docs/patterns.md +18 -0
- package/docs/quick-start.md +6 -4
- package/docs/recipes.md +12 -0
- package/docs/release-readiness.md +32 -7
- package/docs/system-primitives.md +10 -3
- package/docs/tokens.md +10 -2
- package/examples/README.md +2 -2
- package/examples/astro/src/styles/synced-flow.generated.css +14 -0
- package/examples/next/app/synced-flow.generated.css +19 -5
- package/examples/plain-html/synced-flow.generated.css +19 -5
- package/examples/templates/README.md +2 -0
- package/examples/templates/app-settings-workflow.html +81 -0
- package/examples/vite/src/synced-flow.generated.css +19 -5
- package/examples/wordpress/assets/css/synced-flow.css +542 -9
- package/package.json +14 -3
- package/reset.css +1 -1
- package/skills/synced-flow/SKILL.md +20 -3
- package/src/index.ts +69 -0
- package/src/presets.mjs +5 -5
- package/src/tokens.mjs +10 -8
- package/styles.css +456 -21
- package/tokens.css +13 -10
package/reset.css
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
@layer reset {
|
|
4
4
|
*, *::before, *::after { box-sizing: border-box; }
|
|
5
5
|
*:where(:not(dialog)) { margin: 0; }
|
|
6
|
-
html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
|
|
6
|
+
html { font-size: 100%; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
|
|
7
7
|
body { min-block-size: 100%; }
|
|
8
8
|
img, picture, video, canvas, svg { display: block; max-inline-size: 100%; }
|
|
9
9
|
img, video { block-size: auto; }
|
|
@@ -91,14 +91,24 @@ intact. Leave out `utilities.css` unless static helpers such as `sf-text-*`,
|
|
|
91
91
|
`sf-app-backdrop`, `sf-frame`, and `sf-flow`.
|
|
92
92
|
- Prefer component primitives for common UI: `sf-button`, `sf-card`,
|
|
93
93
|
`sf-badge`, `sf-status`, `sf-field`, `sf-input`, `sf-search`,
|
|
94
|
-
`sf-
|
|
94
|
+
`sf-input-group`, `sf-file-input`, `sf-range`, `sf-switch`,
|
|
95
|
+
`sf-segmented-control`, `sf-spinner`, `sf-data-table`, `sf-table-sort`,
|
|
96
|
+
`sf-tab__count`, and `sf-toast-stack`.
|
|
95
97
|
- Use `saas-landing` for public SaaS marketing pages. Use `saas-dashboard` when
|
|
96
98
|
a full authenticated starter is useful, but prefer neutral app patterns for
|
|
97
99
|
reusable UI in admin panels, portals, CRMs, analytics dashboards, internal
|
|
98
100
|
tools, account areas, and product workspaces.
|
|
99
101
|
- Use app patterns before writing project CSS:
|
|
100
102
|
`app-shell-layout`, `row-action-menu`, `tabs-with-counts`,
|
|
101
|
-
`data-table-actions`, `search-field`, `modal-form`,
|
|
103
|
+
`data-table-actions`, `search-field`, `modal-form`, `toast-stack`,
|
|
104
|
+
`searchable-select`, `bulk-actions-toolbar`, `complete-pagination`, and
|
|
105
|
+
`multi-step-form`.
|
|
106
|
+
- Use `switch-control` for independent binary settings and
|
|
107
|
+
`segmented-control` for one choice from a small set. Do not use either as a
|
|
108
|
+
substitute for tabs.
|
|
109
|
+
- Treat `searchable-select`, async loading, bulk selection, and multi-step
|
|
110
|
+
navigation as app-owned behavior. Flow supplies presentation and accessible
|
|
111
|
+
markup guidance, not JavaScript state machines.
|
|
102
112
|
- Use app shell states instead of bespoke layout CSS: `data-layout="fixed-header"`
|
|
103
113
|
for fixed app headers, `data-collapsed="true"` for collapsed sidebars, and
|
|
104
114
|
`data-mobile="drawer"` with `data-sidebar-open="true"` for mobile drawer
|
|
@@ -160,9 +170,16 @@ pnpm flow:doctor
|
|
|
160
170
|
For package or repo changes, also run:
|
|
161
171
|
|
|
162
172
|
```bash
|
|
173
|
+
pnpm check:generated
|
|
163
174
|
pnpm check
|
|
164
175
|
pnpm test
|
|
176
|
+
pnpm test:browser
|
|
177
|
+
pnpm test:browser:all
|
|
165
178
|
pnpm pack --dry-run
|
|
166
179
|
```
|
|
167
180
|
|
|
168
|
-
|
|
181
|
+
Run `pnpm check:generated` before a build or lifecycle command can refresh
|
|
182
|
+
tracked CSS. It covers package CSS and the plain HTML, Vite, Next, Astro, and
|
|
183
|
+
WordPress generated outputs. Use the Chromium browser gate during development
|
|
184
|
+
and all three browser engines before a release. If `doctor` warns about stale
|
|
185
|
+
project CSS, run `pnpm flow:build`.
|
package/src/index.ts
CHANGED
|
@@ -48,10 +48,79 @@ export const fluidSystem = {
|
|
|
48
48
|
},
|
|
49
49
|
components: {
|
|
50
50
|
button: 'sf-button',
|
|
51
|
+
buttonGroup: 'sf-button-group',
|
|
52
|
+
icon: 'sf-icon',
|
|
53
|
+
iconButton: 'sf-icon-button',
|
|
51
54
|
card: 'sf-card',
|
|
55
|
+
surface: 'sf-surface',
|
|
56
|
+
hero: 'sf-hero',
|
|
57
|
+
logoCloud: 'sf-logo-cloud',
|
|
58
|
+
feature: 'sf-feature',
|
|
59
|
+
stats: 'sf-stats',
|
|
60
|
+
testimonial: 'sf-testimonial',
|
|
61
|
+
pricingGrid: 'sf-pricing-grid',
|
|
62
|
+
faq: 'sf-faq',
|
|
63
|
+
callToAction: 'sf-cta',
|
|
64
|
+
footer: 'sf-footer',
|
|
52
65
|
badge: 'sf-badge',
|
|
66
|
+
avatar: 'sf-avatar',
|
|
67
|
+
alert: 'sf-alert',
|
|
68
|
+
status: 'sf-status',
|
|
69
|
+
sectionHeader: 'sf-section-header',
|
|
70
|
+
kicker: 'sf-kicker',
|
|
71
|
+
nav: 'sf-nav',
|
|
72
|
+
form: 'sf-form',
|
|
73
|
+
fieldset: 'sf-fieldset',
|
|
53
74
|
field: 'sf-field',
|
|
75
|
+
label: 'sf-label',
|
|
76
|
+
help: 'sf-help',
|
|
77
|
+
error: 'sf-error',
|
|
54
78
|
input: 'sf-input',
|
|
79
|
+
inputGroup: 'sf-input-group',
|
|
80
|
+
select: 'sf-select',
|
|
81
|
+
textarea: 'sf-textarea',
|
|
82
|
+
check: 'sf-check',
|
|
83
|
+
switch: 'sf-switch',
|
|
84
|
+
fileInput: 'sf-file-input',
|
|
85
|
+
range: 'sf-range',
|
|
86
|
+
segmentedControl: 'sf-segmented-control',
|
|
87
|
+
spinner: 'sf-spinner',
|
|
88
|
+
search: 'sf-search',
|
|
89
|
+
combobox: 'sf-combobox',
|
|
90
|
+
filterBar: 'sf-filter-bar',
|
|
91
|
+
bulkActions: 'sf-bulk-actions',
|
|
92
|
+
dataTable: 'sf-data-table',
|
|
93
|
+
tableSort: 'sf-table-sort',
|
|
94
|
+
dataList: 'sf-data-list',
|
|
95
|
+
emptyState: 'sf-empty-state',
|
|
96
|
+
settingsSection: 'sf-settings-section',
|
|
97
|
+
detailPanel: 'sf-detail-panel',
|
|
98
|
+
dialog: 'sf-dialog',
|
|
99
|
+
popover: 'sf-popover',
|
|
100
|
+
drawer: 'sf-drawer',
|
|
101
|
+
tooltip: 'sf-tooltip',
|
|
102
|
+
toast: 'sf-toast',
|
|
103
|
+
toastStack: 'sf-toast-stack',
|
|
104
|
+
banner: 'sf-banner',
|
|
105
|
+
disclosure: 'sf-disclosure',
|
|
106
|
+
accordion: 'sf-accordion',
|
|
107
|
+
tabs: 'sf-tabs',
|
|
108
|
+
tab: 'sf-tab',
|
|
109
|
+
menu: 'sf-menu',
|
|
110
|
+
breadcrumb: 'sf-breadcrumb',
|
|
111
|
+
pagination: 'sf-pagination',
|
|
112
|
+
stepper: 'sf-stepper',
|
|
113
|
+
wizardActions: 'sf-wizard-actions',
|
|
114
|
+
progress: 'sf-progress',
|
|
115
|
+
skeleton: 'sf-skeleton',
|
|
116
|
+
chart: 'sf-chart',
|
|
117
|
+
meter: 'sf-meter',
|
|
118
|
+
codeWindow: 'sf-code-window',
|
|
119
|
+
codeLines: 'sf-code-lines',
|
|
120
|
+
tokenStrip: 'sf-token-strip',
|
|
121
|
+
marquee: 'sf-marquee',
|
|
122
|
+
commandList: 'sf-command-list',
|
|
123
|
+
platformCard: 'sf-platform-card',
|
|
55
124
|
},
|
|
56
125
|
utilities: {
|
|
57
126
|
visuallyHidden: 'sf-visually-hidden',
|
package/src/presets.mjs
CHANGED
|
@@ -12,13 +12,13 @@ export const themePresets = {
|
|
|
12
12
|
surfaceAlt: 'oklch(96.4% 0.011 80)',
|
|
13
13
|
surfaceElevated: 'var(--sf-colour-surface-raised)',
|
|
14
14
|
border: 'oklch(18% 0.026 250 / 0.12)',
|
|
15
|
-
primary: 'oklch(
|
|
16
|
-
primaryHover: 'oklch(
|
|
15
|
+
primary: 'oklch(50% 0.16 40)',
|
|
16
|
+
primaryHover: 'oklch(44% 0.14 40)',
|
|
17
17
|
primaryForeground: 'oklch(100% 0 0)',
|
|
18
18
|
accent: 'oklch(70% 0.12 205)',
|
|
19
|
-
link: 'oklch(
|
|
20
|
-
linkHover: 'oklch(
|
|
21
|
-
ring: 'oklch(
|
|
19
|
+
link: 'oklch(50% 0.16 40)',
|
|
20
|
+
linkHover: 'oklch(44% 0.14 40)',
|
|
21
|
+
ring: 'oklch(50% 0.16 40)',
|
|
22
22
|
},
|
|
23
23
|
components: {
|
|
24
24
|
button: {
|
package/src/tokens.mjs
CHANGED
|
@@ -36,6 +36,8 @@ export const primitiveTokens = {
|
|
|
36
36
|
orange500: 'oklch(74% 0.17 48)',
|
|
37
37
|
orange600: 'oklch(68% 0.18 44)',
|
|
38
38
|
orange700: 'oklch(58% 0.17 42)',
|
|
39
|
+
orange800: 'oklch(50% 0.16 40)',
|
|
40
|
+
orange900: 'oklch(44% 0.14 40)',
|
|
39
41
|
green500: 'oklch(62% 0.13 150)',
|
|
40
42
|
green600: 'oklch(54% 0.13 150)',
|
|
41
43
|
green700: 'oklch(44% 0.12 150)',
|
|
@@ -82,13 +84,13 @@ export const semanticTokens = {
|
|
|
82
84
|
border: 'oklch(18% 0.026 250 / 0.12)',
|
|
83
85
|
borderStrong: 'oklch(18% 0.026 250 / 0.22)',
|
|
84
86
|
backdrop: 'oklch(0% 0 0 / 0.48)',
|
|
85
|
-
primary: 'var(--sf-colour-orange-
|
|
86
|
-
primaryHover: 'var(--sf-colour-orange-
|
|
87
|
+
primary: 'var(--sf-colour-orange-800)',
|
|
88
|
+
primaryHover: 'var(--sf-colour-orange-900)',
|
|
87
89
|
primaryForeground: 'var(--sf-colour-neutral-0)',
|
|
88
|
-
primarySoft: 'oklch(
|
|
89
|
-
primarySoftBorder: 'oklch(
|
|
90
|
-
link: 'var(--sf-colour-orange-
|
|
91
|
-
linkHover: 'var(--sf-colour-orange-
|
|
90
|
+
primarySoft: 'oklch(50% 0.16 40 / 0.12)',
|
|
91
|
+
primarySoftBorder: 'oklch(50% 0.16 40 / 0.28)',
|
|
92
|
+
link: 'var(--sf-colour-orange-800)',
|
|
93
|
+
linkHover: 'var(--sf-colour-orange-900)',
|
|
92
94
|
accent: 'var(--sf-colour-cyan-500)',
|
|
93
95
|
accentForeground: 'var(--sf-colour-neutral-950)',
|
|
94
96
|
success: 'var(--sf-colour-green-500)',
|
|
@@ -97,7 +99,7 @@ export const semanticTokens = {
|
|
|
97
99
|
warning: 'var(--sf-colour-amber-500)',
|
|
98
100
|
warningForeground: 'var(--sf-colour-neutral-950)',
|
|
99
101
|
warningSoft: 'oklch(78% 0.15 82 / 0.16)',
|
|
100
|
-
danger: 'var(--sf-colour-red-
|
|
102
|
+
danger: 'var(--sf-colour-red-700)',
|
|
101
103
|
dangerForeground: 'var(--sf-colour-neutral-0)',
|
|
102
104
|
dangerSoft: 'oklch(56% 0.2 28 / 0.12)',
|
|
103
105
|
info: 'var(--sf-colour-cyan-600)',
|
|
@@ -109,7 +111,7 @@ export const semanticTokens = {
|
|
|
109
111
|
categorical4: 'var(--sf-colour-orange-600)',
|
|
110
112
|
categorical5: 'var(--sf-colour-red-600)',
|
|
111
113
|
categorical6: 'oklch(58% 0.15 292)',
|
|
112
|
-
ring: 'var(--sf-colour-orange-
|
|
114
|
+
ring: 'var(--sf-colour-orange-800)',
|
|
113
115
|
},
|
|
114
116
|
}
|
|
115
117
|
|