@syncedco/flow 0.3.0 → 0.3.2

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.
@@ -19,6 +19,8 @@
19
19
  --step-6: clamp(2.986rem, 2.5863rem + 1.7763vw, 4.2915rem);
20
20
  --step-7: clamp(3.5832rem, 3.0379rem + 2.4235vw, 5.3644rem);
21
21
  --step-8: clamp(4.2998rem, 3.5634rem + 3.2731vw, 6.7055rem);
22
+ --type-caption-sm: var(--step--2);
23
+ --text-base: var(--step-0);
22
24
 
23
25
  --space-3xs: clamp(0.25rem, 0.2404rem + 0.0425vw, 0.2813rem);
24
26
  --space-2xs: clamp(0.5rem, 0.4809rem + 0.085vw, 0.5625rem);
@@ -88,7 +90,9 @@
88
90
  --color-destructive: var(--sf-colour-destructive, oklch(55% 0.2 28));
89
91
  --color-destructive-foreground: var(--sf-colour-destructive-foreground, oklch(98% 0.01 95));
90
92
  --color-border: var(--sf-colour-border, oklch(100% 0 0 / 0.12));
93
+ --color-border-subtle: var(--sf-colour-border-subtle, oklch(100% 0 0 / 0.08));
91
94
  --color-input: var(--sf-colour-input, oklch(100% 0 0 / 0.12));
95
+ --color-backdrop: var(--sf-colour-backdrop, oklch(0% 0 0 / 0.56));
92
96
  --color-ring: var(--sf-colour-ring, oklch(69% 0.18 44));
93
97
  --color-heading: var(--sf-colour-heading, oklch(20% 0.02 18));
94
98
  --color-page-text: var(--sf-colour-page-text, oklch(23% 0.02 18));
@@ -97,6 +101,14 @@
97
101
  --color-subdued: var(--sf-colour-subdued, oklch(42% 0.02 20));
98
102
  --color-surface: var(--sf-colour-surface, oklch(96% 0.015 80));
99
103
  --color-surface-alt: var(--sf-colour-surface-alt, oklch(96.6% 0.018 82));
104
+ --color-surface-hover: var(--sf-colour-surface-hover, color-mix(in oklch, var(--color-surface-alt) 86%, var(--color-primary)));
105
+ --color-surface-raised-2: var(--sf-colour-surface-raised-2, color-mix(in oklch, var(--color-surface) 86%, white));
106
+ --color-categorical-1: var(--sf-colour-categorical-1, var(--color-primary));
107
+ --color-categorical-2: var(--sf-colour-categorical-2, var(--color-green));
108
+ --color-categorical-3: var(--sf-colour-categorical-3, var(--color-deco-blue));
109
+ --color-categorical-4: var(--sf-colour-categorical-4, var(--color-deco-lime));
110
+ --color-categorical-5: var(--sf-colour-categorical-5, var(--color-warm-icon));
111
+ --color-categorical-6: var(--sf-colour-categorical-6, var(--color-purple-icon));
100
112
  --color-hero-bg: oklch(8% 0.02 260);
101
113
  --color-green: var(--sf-colour-green, oklch(55% 0.12 148));
102
114
  --color-green-dark: var(--sf-colour-green-dark, oklch(45% 0.12 148));
@@ -202,7 +214,7 @@
202
214
  @layer reset {
203
215
  *, *::before, *::after { box-sizing: border-box; }
204
216
  *:where(:not(dialog)) { margin: 0; }
205
- html { -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
217
+ html { font-size: 100%; -webkit-text-size-adjust: 100%; text-size-adjust: 100%; }
206
218
  body { min-block-size: 100%; }
207
219
  img, picture, video, canvas, svg { display: block; max-inline-size: 100%; }
208
220
  img, video { block-size: auto; }
@@ -212,11 +224,15 @@
212
224
  }
213
225
 
214
226
  @layer base {
227
+ html {
228
+ font-size: 100%;
229
+ }
230
+
215
231
  body {
216
232
  background: var(--color-background);
217
233
  color: var(--color-foreground);
218
234
  font-family: var(--font-inter, var(--sf-font-sans, ui-sans-serif, system-ui, sans-serif));
219
- font-size: var(--step-0);
235
+ font-size: var(--text-base);
220
236
  line-height: 1.5;
221
237
  font-feature-settings: "rlig" 1, "calt" 1;
222
238
  -webkit-font-smoothing: antialiased;
@@ -244,7 +260,7 @@
244
260
  :where(button:disabled, [aria-disabled="true"]) { cursor: not-allowed; }
245
261
 
246
262
  :where(:focus-visible) {
247
- outline: 2px solid var(--color-ring);
263
+ outline: 0.125rem solid var(--color-ring);
248
264
  outline-offset: .2rem;
249
265
  }
250
266
 
@@ -330,11 +346,47 @@
330
346
  }
331
347
 
332
348
  .sf-app-shell {
349
+ --sf-app-header-height: 4rem;
350
+ --sf-app-sidebar-collapsed-width: 4.75rem;
333
351
  background: var(--color-background);
334
352
  color: var(--color-foreground);
335
353
  display: grid;
336
354
  grid-template-columns: minmax(14rem, var(--sf-app-sidebar-width, 16rem)) minmax(0, 1fr);
337
355
  min-block-size: 100dvh;
356
+ position: relative;
357
+ transition: grid-template-columns var(--duration-normal) var(--ease-standard);
358
+ }
359
+
360
+ .sf-app-header {
361
+ align-items: center;
362
+ background: var(--color-card);
363
+ border-block-end: 1px solid var(--color-border);
364
+ display: flex;
365
+ gap: var(--space-s);
366
+ grid-column: 1 / -1;
367
+ justify-content: space-between;
368
+ min-block-size: var(--sf-app-header-height);
369
+ padding-inline: var(--space-s-m);
370
+ z-index: 20;
371
+ }
372
+
373
+ .sf-app-shell[data-layout~="fixed-header"] {
374
+ grid-template-rows: var(--sf-app-header-height) minmax(0, 1fr);
375
+ }
376
+
377
+ .sf-app-shell[data-layout~="fixed-header"] .sf-app-header {
378
+ inset-block-start: 0;
379
+ position: sticky;
380
+ }
381
+
382
+ .sf-app-shell[data-layout~="fixed-header"] .sf-app-sidebar {
383
+ inset-block-start: var(--sf-app-header-height);
384
+ max-block-size: calc(100dvh - var(--sf-app-header-height));
385
+ min-block-size: calc(100dvh - var(--sf-app-header-height));
386
+ }
387
+
388
+ .sf-app-shell[data-collapsed="true"] {
389
+ grid-template-columns: var(--sf-app-sidebar-collapsed-width) minmax(0, 1fr);
338
390
  }
339
391
 
340
392
  .sf-app-sidebar {
@@ -350,6 +402,7 @@
350
402
  padding: var(--space-s);
351
403
  position: sticky;
352
404
  inset-block-start: 0;
405
+ transition: transform var(--duration-normal) var(--ease-standard), inline-size var(--duration-normal) var(--ease-standard);
353
406
  }
354
407
 
355
408
  .sf-app-sidebar__brand {
@@ -402,6 +455,58 @@
402
455
  padding: var(--sf-app-main-padding, var(--space-m-l));
403
456
  }
404
457
 
458
+ .sf-app-shell[data-collapsed="true"] .sf-app-sidebar {
459
+ overflow-x: hidden;
460
+ }
461
+
462
+ .sf-app-shell[data-collapsed="true"] .sf-app-sidebar__brand,
463
+ .sf-app-shell[data-collapsed="true"] .sf-app-sidebar .sf-nav__link {
464
+ justify-content: center;
465
+ }
466
+
467
+ .sf-app-shell[data-collapsed="true"] [data-hide-collapsed="true"] {
468
+ display: none;
469
+ }
470
+
471
+ .sf-app-backdrop {
472
+ display: none;
473
+ }
474
+
475
+ @media (max-width: 48rem) {
476
+ .sf-app-shell[data-mobile="drawer"] {
477
+ display: block;
478
+ }
479
+
480
+ .sf-app-shell[data-mobile="drawer"] .sf-app-header {
481
+ position: sticky;
482
+ inset-block-start: 0;
483
+ }
484
+
485
+ .sf-app-shell[data-mobile="drawer"] .sf-app-sidebar {
486
+ box-shadow: var(--shadow-xl);
487
+ inline-size: min(18rem, calc(100vw - var(--space-l)));
488
+ inset-block: 0;
489
+ inset-inline-start: 0;
490
+ max-block-size: none;
491
+ min-block-size: 100dvh;
492
+ position: fixed;
493
+ transform: translateX(-100%);
494
+ z-index: 30;
495
+ }
496
+
497
+ .sf-app-shell[data-mobile="drawer"][data-sidebar-open="true"] .sf-app-sidebar {
498
+ transform: translateX(0);
499
+ }
500
+
501
+ .sf-app-shell[data-mobile="drawer"][data-sidebar-open="true"] .sf-app-backdrop {
502
+ background: var(--color-backdrop);
503
+ display: block;
504
+ inset: 0;
505
+ position: fixed;
506
+ z-index: 25;
507
+ }
508
+ }
509
+
405
510
  .sf-grid {
406
511
  display: grid;
407
512
  gap: var(--grid-gutter);
@@ -725,11 +830,268 @@
725
830
  overflow: hidden;
726
831
  }
727
832
 
833
+ .sf-progress {
834
+ accent-color: var(--progress-color, var(--color-primary));
835
+ block-size: var(--progress-size, .625rem);
836
+ inline-size: 100%;
837
+ }
838
+
839
+ .sf-progress::-webkit-progress-bar {
840
+ background: var(--color-surface-alt);
841
+ border-radius: var(--radius-full);
842
+ }
843
+
844
+ .sf-progress::-webkit-progress-value,
845
+ .sf-progress::-moz-progress-bar {
846
+ background: var(--progress-color, var(--color-primary));
847
+ border-radius: var(--radius-full);
848
+ }
849
+
850
+ .sf-skeleton {
851
+ background: color-mix(in oklch, var(--color-surface-alt) 82%, var(--color-foreground));
852
+ border-radius: var(--skeleton-radius, var(--radius-md));
853
+ color: transparent;
854
+ min-block-size: var(--skeleton-block-size, 1em);
855
+ }
856
+
857
+ @media (prefers-reduced-motion: no-preference) {
858
+ .sf-skeleton {
859
+ animation: sf-skeleton-pulse 1.4s var(--ease-standard) infinite alternate;
860
+ }
861
+ }
862
+
863
+ @keyframes sf-skeleton-pulse {
864
+ to { opacity: .62; }
865
+ }
866
+
867
+ .sf-filter-bar {
868
+ align-items: end;
869
+ background: var(--color-card);
870
+ border: 1px solid var(--color-border);
871
+ border-radius: var(--radius-lg);
872
+ display: flex;
873
+ flex-wrap: wrap;
874
+ gap: var(--space-xs);
875
+ padding: var(--space-s);
876
+ }
877
+
878
+ .sf-filter-bar > :where(.sf-field, form, label) {
879
+ flex: 1 1 min(100%, 14rem);
880
+ }
881
+
882
+ .sf-filter-bar > :where(.sf-button, button, a) {
883
+ flex: 0 0 auto;
884
+ }
885
+
886
+ .sf-data-table {
887
+ border-collapse: collapse;
888
+ inline-size: 100%;
889
+ min-inline-size: var(--data-table-min, 44rem);
890
+ }
891
+
892
+ .sf-data-table :where(th, td) {
893
+ border-block-end: 1px solid var(--color-border);
894
+ padding-block: var(--data-table-padding-block, var(--space-xs));
895
+ padding-inline: var(--data-table-padding-inline, var(--space-s));
896
+ text-align: start;
897
+ vertical-align: middle;
898
+ }
899
+
900
+ .sf-data-table :where(th) {
901
+ background: var(--color-surface-alt);
902
+ color: var(--color-muted-foreground);
903
+ font-size: var(--step--1);
904
+ font-weight: 800;
905
+ }
906
+
907
+ .sf-data-table :where(tbody tr:hover) {
908
+ background: color-mix(in oklch, var(--color-primary) 6%, transparent);
909
+ }
910
+
911
+ .sf-data-table[data-density="compact"] {
912
+ --data-table-padding-block: var(--space-2xs);
913
+ --data-table-padding-inline: var(--space-xs);
914
+ }
915
+
916
+ .sf-data-table :where(th button, .sf-table-sort) {
917
+ align-items: center;
918
+ color: inherit;
919
+ display: inline-flex;
920
+ font: inherit;
921
+ font-weight: inherit;
922
+ gap: var(--space-3xs);
923
+ padding: 0;
924
+ }
925
+
926
+ .sf-data-table :where(th button, .sf-table-sort)[aria-sort]::after {
927
+ color: var(--color-muted-foreground);
928
+ content: "\2195";
929
+ font-size: var(--step--2);
930
+ }
931
+
932
+ .sf-data-table :where(th button, .sf-table-sort)[aria-sort="ascending"]::after { content: "\2191"; }
933
+ .sf-data-table :where(th button, .sf-table-sort)[aria-sort="descending"]::after { content: "\2193"; }
934
+
935
+ .sf-data-table tr[data-clickable="true"] {
936
+ cursor: pointer;
937
+ }
938
+
939
+ .sf-data-table tr[data-clickable="true"]:focus-within {
940
+ outline: 0.125rem solid var(--color-ring);
941
+ outline-offset: -0.125rem;
942
+ }
943
+
944
+ @container (max-width: 38rem) {
945
+ .sf-table-wrap[data-view="cards"] {
946
+ border: 0;
947
+ overflow: visible;
948
+ }
949
+
950
+ .sf-table-wrap[data-view="cards"] .sf-data-table,
951
+ .sf-table-wrap[data-view="cards"] .sf-data-table :where(thead, tbody, tr, th, td) {
952
+ display: block;
953
+ min-inline-size: 0;
954
+ }
955
+
956
+ .sf-table-wrap[data-view="cards"] .sf-data-table thead {
957
+ display: none;
958
+ }
959
+
960
+ .sf-table-wrap[data-view="cards"] .sf-data-table tr {
961
+ background: var(--color-card);
962
+ border: 1px solid var(--color-border);
963
+ border-radius: var(--radius-lg);
964
+ margin-block-end: var(--space-xs);
965
+ padding: var(--space-xs);
966
+ }
967
+
968
+ .sf-table-wrap[data-view="cards"] .sf-data-table td {
969
+ align-items: center;
970
+ border: 0;
971
+ display: flex;
972
+ gap: var(--space-s);
973
+ justify-content: space-between;
974
+ padding-block: var(--space-2xs);
975
+ padding-inline: 0;
976
+ }
977
+
978
+ .sf-table-wrap[data-view="cards"] .sf-data-table td::before {
979
+ color: var(--color-muted-foreground);
980
+ content: attr(data-label);
981
+ font-size: var(--step--1);
982
+ font-weight: 800;
983
+ }
984
+ }
985
+
986
+ .sf-status {
987
+ align-items: center;
988
+ background: var(--status-bg, var(--color-surface-alt));
989
+ border: 1px solid var(--status-border, var(--color-border));
990
+ border-radius: var(--radius-full);
991
+ color: var(--status-color, var(--color-foreground));
992
+ display: inline-flex;
993
+ font-size: var(--step--1);
994
+ font-weight: 700;
995
+ gap: var(--space-3xs);
996
+ line-height: 1;
997
+ min-block-size: 1.75rem;
998
+ padding-inline: .7em;
999
+ }
1000
+
1001
+ .sf-status[data-size="sm"] {
1002
+ font-size: var(--step--2);
1003
+ min-block-size: 1.35rem;
1004
+ padding-inline: .55em;
1005
+ }
1006
+
1007
+ .sf-status::before {
1008
+ background: currentColor;
1009
+ block-size: .42em;
1010
+ border-radius: var(--radius-full);
1011
+ content: "";
1012
+ inline-size: .42em;
1013
+ }
1014
+
1015
+ .sf-status[data-tone="success"] {
1016
+ --status-bg: var(--sf-colour-success-soft, oklch(62% 0.13 150 / 0.12));
1017
+ --status-border: color-mix(in oklch, var(--sf-colour-success, oklch(62% 0.13 150)) 34%, transparent);
1018
+ --status-color: color-mix(in oklch, var(--sf-colour-success, oklch(62% 0.13 150)) 76%, var(--color-foreground));
1019
+ }
1020
+
1021
+ .sf-status[data-tone="warning"] {
1022
+ --status-bg: var(--sf-colour-warning-soft, oklch(78% 0.15 82 / 0.16));
1023
+ --status-border: color-mix(in oklch, var(--sf-colour-warning, oklch(78% 0.15 82)) 38%, transparent);
1024
+ --status-color: color-mix(in oklch, var(--sf-colour-warning, oklch(78% 0.15 82)) 70%, var(--color-foreground));
1025
+ }
1026
+
1027
+ .sf-status[data-tone="danger"] {
1028
+ --status-bg: var(--sf-colour-danger-soft, oklch(56% 0.2 28 / 0.12));
1029
+ --status-border: color-mix(in oklch, var(--sf-colour-danger, var(--color-destructive)) 34%, transparent);
1030
+ --status-color: color-mix(in oklch, var(--sf-colour-danger, var(--color-destructive)) 76%, var(--color-foreground));
1031
+ }
1032
+
1033
+ .sf-status[data-tone="info"] {
1034
+ --status-bg: var(--sf-colour-info-soft, oklch(70% 0.12 205 / 0.14));
1035
+ --status-border: color-mix(in oklch, var(--sf-colour-info, oklch(70% 0.12 205)) 34%, transparent);
1036
+ --status-color: color-mix(in oklch, var(--sf-colour-info, oklch(70% 0.12 205)) 76%, var(--color-foreground));
1037
+ }
1038
+
1039
+ .sf-data-list {
1040
+ display: grid;
1041
+ }
1042
+
1043
+ .sf-data-list > * {
1044
+ align-items: center;
1045
+ border-block-end: 1px solid var(--color-border);
1046
+ display: flex;
1047
+ flex-wrap: wrap;
1048
+ gap: var(--space-xs);
1049
+ justify-content: space-between;
1050
+ padding-block: var(--space-xs);
1051
+ }
1052
+
1053
+ .sf-data-list > :last-child {
1054
+ border-block-end: 0;
1055
+ }
1056
+
1057
+ .sf-empty-state {
1058
+ align-items: center;
1059
+ background: var(--color-surface-alt);
1060
+ border: 1px dashed var(--color-border);
1061
+ border-radius: var(--radius-lg);
1062
+ color: var(--color-muted-foreground);
1063
+ display: grid;
1064
+ gap: var(--space-xs);
1065
+ justify-items: center;
1066
+ padding: var(--space-l);
1067
+ text-align: center;
1068
+ }
1069
+
1070
+ .sf-settings-section,
1071
+ .sf-detail-panel {
1072
+ background: var(--color-card);
1073
+ border: 1px solid var(--color-border);
1074
+ border-radius: var(--radius-lg);
1075
+ display: grid;
1076
+ gap: var(--space-s);
1077
+ padding: var(--space-m);
1078
+ }
1079
+
1080
+ .sf-detail-panel {
1081
+ background: var(--color-surface-alt);
1082
+ }
1083
+
728
1084
  .sf-field {
729
1085
  display: grid;
730
1086
  gap: var(--space-2xs);
731
1087
  }
732
1088
 
1089
+ .sf-form[data-density="compact"],
1090
+ .sf-field[data-density="compact"] {
1091
+ --input-block-size: 2.25rem;
1092
+ --input-padding-inline: var(--space-xs);
1093
+ }
1094
+
733
1095
  .sf-field > label {
734
1096
  color: var(--color-muted-foreground);
735
1097
  font-size: var(--step--1);
@@ -742,7 +1104,41 @@
742
1104
  border-radius: var(--input-radius, var(--radius-md));
743
1105
  color: var(--color-foreground);
744
1106
  min-block-size: var(--input-block-size, 2.75rem);
745
- padding-inline: var(--space-s);
1107
+ padding-inline: var(--input-padding-inline, var(--space-s));
1108
+ }
1109
+
1110
+ .sf-search {
1111
+ position: relative;
1112
+ }
1113
+
1114
+ .sf-search::before {
1115
+ block-size: .75em;
1116
+ border: 0.125em solid currentColor;
1117
+ border-radius: var(--radius-full);
1118
+ color: var(--color-muted-foreground);
1119
+ content: "";
1120
+ inline-size: .75em;
1121
+ inset-block-start: 50%;
1122
+ inset-inline-start: var(--space-xs);
1123
+ line-height: 1;
1124
+ position: absolute;
1125
+ transform: translateY(-58%);
1126
+ }
1127
+
1128
+ .sf-search::after {
1129
+ background: var(--color-muted-foreground);
1130
+ block-size: .125em;
1131
+ content: "";
1132
+ inline-size: .45em;
1133
+ inset-block-start: 50%;
1134
+ inset-inline-start: calc(var(--space-xs) + .58em);
1135
+ position: absolute;
1136
+ transform: translateY(120%) rotate(45deg);
1137
+ transform-origin: inline-start center;
1138
+ }
1139
+
1140
+ .sf-search > .sf-input {
1141
+ padding-inline-start: var(--space-l);
746
1142
  }
747
1143
 
748
1144
  .sf-input:focus-visible {
package/layout.css CHANGED
@@ -116,7 +116,7 @@
116
116
  justify-content: space-between;
117
117
  min-block-size: var(--sf-app-header-height);
118
118
  padding-inline: var(--sf-space-s-m);
119
- z-index: 20;
119
+ z-index: var(--sf-z-header);
120
120
  }
121
121
 
122
122
  .sf-app-shell[data-layout~="fixed-header"] {
@@ -199,6 +199,7 @@
199
199
  }
200
200
 
201
201
  .sf-app-shell[data-mobile="drawer"] .sf-app-sidebar {
202
+ block-size: 100dvh;
202
203
  box-shadow: var(--sf-shadow-xl);
203
204
  inline-size: min(18rem, calc(100vw - var(--sf-space-l)));
204
205
  inset-block: 0;
@@ -207,7 +208,7 @@
207
208
  min-block-size: 100dvh;
208
209
  position: fixed;
209
210
  transform: translateX(-100%);
210
- z-index: 30;
211
+ z-index: var(--sf-z-drawer);
211
212
  }
212
213
 
213
214
  .sf-app-shell[data-mobile="drawer"][data-sidebar-open="true"] .sf-app-sidebar {
@@ -219,7 +220,7 @@
219
220
  display: block;
220
221
  inset: 0;
221
222
  position: fixed;
222
- z-index: 25;
223
+ z-index: var(--sf-z-backdrop);
223
224
  }
224
225
  }
225
226
 
@@ -363,7 +364,7 @@
363
364
  .sf-sticky-top {
364
365
  position: sticky;
365
366
  inset-block-start: var(--sf-sticky-offset, 0);
366
- z-index: var(--sf-sticky-z, 20);
367
+ z-index: var(--sf-sticky-z, var(--sf-z-sticky));
367
368
  }
368
369
 
369
370
  .sf-media-object {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@syncedco/flow",
3
- "version": "0.3.0",
4
- "description": "AI-native fluid CSS design system for brand-consistent websites and agency builds.",
3
+ "version": "0.3.2",
4
+ "description": "AI-friendly fluid CSS design system for brand-consistent websites and agency builds.",
5
5
  "type": "module",
6
6
  "packageManager": "pnpm@11.2.2",
7
7
  "license": "MIT",
@@ -63,6 +63,7 @@
63
63
  "examples",
64
64
  "skills",
65
65
  "src",
66
+ "CHANGELOG.md",
66
67
  "CODE_OF_CONDUCT.md",
67
68
  "CONTRIBUTING.md",
68
69
  "LICENSE",
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; }