weifuwu 0.69.0 → 0.70.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.
@@ -640,6 +640,19 @@ body.wf-dragging {
640
640
  }
641
641
  }
642
642
 
643
+ @layer layout {
644
+ /* between — 两端对齐(行内垂直居中) */
645
+ .wf-between {
646
+ display: flex;
647
+ justify-content: space-between;
648
+ align-items: var(--wf-align, center);
649
+ gap: var(--wf-gap, var(--wf-gap-md));
650
+ }
651
+ @media (min-width: 640px) { .wf-between\@sm { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
652
+ @media (min-width: 768px) { .wf-between\@md { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
653
+ @media (min-width: 1024px) { .wf-between\@lg { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
654
+ }
655
+
643
656
  @layer layout {
644
657
  /* right — 靠右对齐 */
645
658
  .wf-right {
@@ -711,6 +724,12 @@ body.wf-dragging {
711
724
  .wf-fixed {
712
725
  flex: none;
713
726
  }
727
+
728
+ /* pin — 固定定位(角标/浮层锚点——position: fixed,坐标由 inline 参数控制) */
729
+ .wf-pin {
730
+ position: fixed;
731
+ z-index: var(--wf-z, var(--wf-cover-z));
732
+ }
714
733
  }
715
734
 
716
735
  @layer layout {
@@ -920,7 +939,7 @@ body.wf-dragging {
920
939
  }
921
940
  }
922
941
 
923
- @layer layout {
942
+ @layer utilities {
924
943
  /* block — 块级显示 */
925
944
  .wf-block {
926
945
  display: block;
@@ -946,7 +965,10 @@ body.wf-dragging {
946
965
 
947
966
  @layer layout {
948
967
  /* container — 内容宽度约束居中 */
968
+ /* width: 100% 必须:margin: 0 auto 在 flex 父中阻止 stretch(宽度=内容)
969
+ ——landing 特性区 404px 而非撑满 1100 容器的根因 */
949
970
  .wf-container {
971
+ width: 100%;
950
972
  max-width: var(--wf-max, 1200px);
951
973
  margin: 0 auto;
952
974
  padding: 0 var(--wf-gap, var(--wf-gap-lg));
@@ -969,12 +991,12 @@ body.wf-dragging {
969
991
  }
970
992
 
971
993
  @layer layout {
972
- /* nowrap — 不换行 */
994
+ /* nowrap — 不换行(只管 flex-wrap——不定义 align-items,避免与
995
+ wf-stretch 等对齐工具叠加冲突:双份 CSS 下 nowrap 后置曾覆盖 stretch) */
973
996
  .wf-nowrap {
974
997
  display: flex;
975
998
  flex-wrap: nowrap;
976
999
  gap: var(--wf-gap, var(--wf-gap-md));
977
- align-items: var(--wf-align, center);
978
1000
  }
979
1001
  }
980
1002
 
@@ -1046,19 +1068,30 @@ body.wf-dragging {
1046
1068
  .wf-mx-auto { margin-left: auto; margin-right: auto; }
1047
1069
  .wf-my-auto { margin-top: auto; margin-bottom: auto; }
1048
1070
 
1049
- /* ── gap:为 flex/grid 原语设置间距变量 ── */
1050
- .wf-gap-none { --wf-gap: 0; }
1051
- .wf-gap-xs { --wf-gap: var(--wf-gap-xs); }
1052
- .wf-gap-sm { --wf-gap: var(--wf-gap-sm); }
1053
- .wf-gap-md { --wf-gap: var(--wf-gap-md); }
1054
- .wf-gap-lg { --wf-gap: var(--wf-gap-lg); }
1055
- .wf-gap-xl { --wf-gap: var(--wf-gap-xl); }
1056
- .wf-gap-2xl { --wf-gap: var(--wf-gap-2xl); }
1071
+ /* ── gap:直接设置 gap 属性(不设 --wf-gap 变量——变量会继承污染子孙:
1072
+ 壳 root wf-gap-none 曾让 KPI grid 的 gap: var(--wf-gap) = 0 卡无间距) ── */
1073
+ .wf-gap-none { gap: 0; }
1074
+ .wf-gap-xs { gap: var(--wf-gap-xs); }
1075
+ .wf-gap-sm { gap: var(--wf-gap-sm); }
1076
+ .wf-gap-md { gap: var(--wf-gap-md); }
1077
+ .wf-gap-lg { gap: var(--wf-gap-lg); }
1078
+ .wf-gap-xl { gap: var(--wf-gap-xl); }
1079
+ .wf-gap-2xl { gap: var(--wf-gap-2xl); }
1057
1080
 
1058
1081
  /* ── 尺寸 ── */
1059
1082
  .wf-w-full { width: 100%; }
1060
1083
  .wf-h-full { height: 100%; }
1061
1084
  .wf-w-auto { width: auto; }
1085
+
1086
+ /* ── 固定宽度阶梯(对齐 token 阶梯——卡片/面板/容器宽不再内联) ── */
1087
+ .wf-w-xs { width: var(--wf-w-xs, 320px); }
1088
+ .wf-w-sm { width: var(--wf-w-sm, 480px); }
1089
+ .wf-w-md { width: var(--wf-w-md, 640px); }
1090
+ .wf-w-lg { width: var(--wf-w-lg, 768px); }
1091
+ .wf-w-xl { width: var(--wf-w-xl, 1024px); }
1092
+ .wf-w-max { max-width: 100%; }
1093
+ .wf-w-md-auto { width: 100%; }
1094
+ @media (min-width: 768px) { .wf-w-md-auto { width: var(--wf-w-md, 640px); } }
1062
1095
  }
1063
1096
 
1064
1097
  @layer layout {
@@ -1177,6 +1210,23 @@ body.wf-dragging {
1177
1210
  display: inline-flex;
1178
1211
  }
1179
1212
 
1213
+ /* ── 折叠态:图标-only 导航(配合 --wf-sidebar-width 收窄侧栏) ── */
1214
+ .wf-nav--collapsed .wf-nav-item {
1215
+ justify-content: center;
1216
+ gap: 0;
1217
+ padding: var(--wf-space-sm);
1218
+ }
1219
+ .wf-nav--collapsed .wf-nav-label {
1220
+ display: none;
1221
+ }
1222
+ .wf-nav--collapsed .wf-nav-group {
1223
+ text-align: center;
1224
+ padding-left: 0;
1225
+ padding-right: 0;
1226
+ overflow: hidden;
1227
+ white-space: nowrap;
1228
+ }
1229
+
1180
1230
  /* ── 主内容区 ── */
1181
1231
  .wf-main {
1182
1232
  padding: var(--wf-space-lg);
@@ -2817,6 +2867,15 @@ body.wf-dragging {
2817
2867
  white-space: pre;
2818
2868
  }
2819
2869
 
2870
+ /* ── 语法高亮(自研 tokenizer——语义色 token 亮暗双适配,P2 纪律 -text 变体) ── */
2871
+ .wf-hl-comment { color: var(--wf-color-success-text); font-style: italic; }
2872
+ .wf-hl-string { color: var(--wf-color-warning-text); }
2873
+ .wf-hl-keyword { color: var(--wf-color-primary-text); font-weight: 500; }
2874
+ .wf-hl-number { color: var(--wf-color-info-text); }
2875
+ .wf-hl-function { color: var(--wf-color-primary-text); }
2876
+ .wf-hl-jsx-tag { color: var(--wf-color-error-text); }
2877
+ .wf-hl-operator { color: var(--wf-color-text-tertiary); }
2878
+
2820
2879
  /* weifuwu/components — Collapse */
2821
2880
 
2822
2881
  .wf-collapse {
@@ -8512,7 +8571,8 @@ body.wf-dragging {
8512
8571
  .wf-transfer {
8513
8572
  display: flex;
8514
8573
  align-items: stretch;
8515
- gap: var(--wf-gap);
8574
+ /* wf-gap-* 改直接 gap 后 --wf-gap 无继承来源——加 fallback */
8575
+ gap: var(--wf-gap, var(--wf-gap-md));
8516
8576
  font-family: var(--wf-font-sans);
8517
8577
  }
8518
8578
 
@@ -640,6 +640,19 @@ body.wf-dragging {
640
640
  }
641
641
  }
642
642
 
643
+ @layer layout {
644
+ /* between — 两端对齐(行内垂直居中) */
645
+ .wf-between {
646
+ display: flex;
647
+ justify-content: space-between;
648
+ align-items: var(--wf-align, center);
649
+ gap: var(--wf-gap, var(--wf-gap-md));
650
+ }
651
+ @media (min-width: 640px) { .wf-between\@sm { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
652
+ @media (min-width: 768px) { .wf-between\@md { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
653
+ @media (min-width: 1024px) { .wf-between\@lg { display: flex; justify-content: space-between; align-items: var(--wf-align, center); gap: var(--wf-gap, var(--wf-gap-md)); } }
654
+ }
655
+
643
656
  @layer layout {
644
657
  /* right — 靠右对齐 */
645
658
  .wf-right {
@@ -711,6 +724,12 @@ body.wf-dragging {
711
724
  .wf-fixed {
712
725
  flex: none;
713
726
  }
727
+
728
+ /* pin — 固定定位(角标/浮层锚点——position: fixed,坐标由 inline 参数控制) */
729
+ .wf-pin {
730
+ position: fixed;
731
+ z-index: var(--wf-z, var(--wf-cover-z));
732
+ }
714
733
  }
715
734
 
716
735
  @layer layout {
@@ -920,7 +939,7 @@ body.wf-dragging {
920
939
  }
921
940
  }
922
941
 
923
- @layer layout {
942
+ @layer utilities {
924
943
  /* block — 块级显示 */
925
944
  .wf-block {
926
945
  display: block;
@@ -946,7 +965,10 @@ body.wf-dragging {
946
965
 
947
966
  @layer layout {
948
967
  /* container — 内容宽度约束居中 */
968
+ /* width: 100% 必须:margin: 0 auto 在 flex 父中阻止 stretch(宽度=内容)
969
+ ——landing 特性区 404px 而非撑满 1100 容器的根因 */
949
970
  .wf-container {
971
+ width: 100%;
950
972
  max-width: var(--wf-max, 1200px);
951
973
  margin: 0 auto;
952
974
  padding: 0 var(--wf-gap, var(--wf-gap-lg));
@@ -969,12 +991,12 @@ body.wf-dragging {
969
991
  }
970
992
 
971
993
  @layer layout {
972
- /* nowrap — 不换行 */
994
+ /* nowrap — 不换行(只管 flex-wrap——不定义 align-items,避免与
995
+ wf-stretch 等对齐工具叠加冲突:双份 CSS 下 nowrap 后置曾覆盖 stretch) */
973
996
  .wf-nowrap {
974
997
  display: flex;
975
998
  flex-wrap: nowrap;
976
999
  gap: var(--wf-gap, var(--wf-gap-md));
977
- align-items: var(--wf-align, center);
978
1000
  }
979
1001
  }
980
1002
 
@@ -1046,19 +1068,30 @@ body.wf-dragging {
1046
1068
  .wf-mx-auto { margin-left: auto; margin-right: auto; }
1047
1069
  .wf-my-auto { margin-top: auto; margin-bottom: auto; }
1048
1070
 
1049
- /* ── gap:为 flex/grid 原语设置间距变量 ── */
1050
- .wf-gap-none { --wf-gap: 0; }
1051
- .wf-gap-xs { --wf-gap: var(--wf-gap-xs); }
1052
- .wf-gap-sm { --wf-gap: var(--wf-gap-sm); }
1053
- .wf-gap-md { --wf-gap: var(--wf-gap-md); }
1054
- .wf-gap-lg { --wf-gap: var(--wf-gap-lg); }
1055
- .wf-gap-xl { --wf-gap: var(--wf-gap-xl); }
1056
- .wf-gap-2xl { --wf-gap: var(--wf-gap-2xl); }
1071
+ /* ── gap:直接设置 gap 属性(不设 --wf-gap 变量——变量会继承污染子孙:
1072
+ 壳 root wf-gap-none 曾让 KPI grid 的 gap: var(--wf-gap) = 0 卡无间距) ── */
1073
+ .wf-gap-none { gap: 0; }
1074
+ .wf-gap-xs { gap: var(--wf-gap-xs); }
1075
+ .wf-gap-sm { gap: var(--wf-gap-sm); }
1076
+ .wf-gap-md { gap: var(--wf-gap-md); }
1077
+ .wf-gap-lg { gap: var(--wf-gap-lg); }
1078
+ .wf-gap-xl { gap: var(--wf-gap-xl); }
1079
+ .wf-gap-2xl { gap: var(--wf-gap-2xl); }
1057
1080
 
1058
1081
  /* ── 尺寸 ── */
1059
1082
  .wf-w-full { width: 100%; }
1060
1083
  .wf-h-full { height: 100%; }
1061
1084
  .wf-w-auto { width: auto; }
1085
+
1086
+ /* ── 固定宽度阶梯(对齐 token 阶梯——卡片/面板/容器宽不再内联) ── */
1087
+ .wf-w-xs { width: var(--wf-w-xs, 320px); }
1088
+ .wf-w-sm { width: var(--wf-w-sm, 480px); }
1089
+ .wf-w-md { width: var(--wf-w-md, 640px); }
1090
+ .wf-w-lg { width: var(--wf-w-lg, 768px); }
1091
+ .wf-w-xl { width: var(--wf-w-xl, 1024px); }
1092
+ .wf-w-max { max-width: 100%; }
1093
+ .wf-w-md-auto { width: 100%; }
1094
+ @media (min-width: 768px) { .wf-w-md-auto { width: var(--wf-w-md, 640px); } }
1062
1095
  }
1063
1096
 
1064
1097
  @layer layout {
@@ -1177,6 +1210,23 @@ body.wf-dragging {
1177
1210
  display: inline-flex;
1178
1211
  }
1179
1212
 
1213
+ /* ── 折叠态:图标-only 导航(配合 --wf-sidebar-width 收窄侧栏) ── */
1214
+ .wf-nav--collapsed .wf-nav-item {
1215
+ justify-content: center;
1216
+ gap: 0;
1217
+ padding: var(--wf-space-sm);
1218
+ }
1219
+ .wf-nav--collapsed .wf-nav-label {
1220
+ display: none;
1221
+ }
1222
+ .wf-nav--collapsed .wf-nav-group {
1223
+ text-align: center;
1224
+ padding-left: 0;
1225
+ padding-right: 0;
1226
+ overflow: hidden;
1227
+ white-space: nowrap;
1228
+ }
1229
+
1180
1230
  /* ── 主内容区 ── */
1181
1231
  .wf-main {
1182
1232
  padding: var(--wf-space-lg);
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "weifuwu",
3
3
  "type": "module",
4
- "version": "0.69.0",
4
+ "version": "0.70.0",
5
5
  "description": "AI SaaS framework — (req, ctx) => Response",
6
6
  "exports": {
7
7
  ".": {