weifuwu 0.61.2 → 0.62.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 (37) hide show
  1. package/README.md +100 -10
  2. package/dist/client/diff.d.ts +13 -1
  3. package/dist/client/index.js +3 -3
  4. package/dist/client/popup.d.ts +22 -0
  5. package/dist/client/types.d.ts +4 -0
  6. package/dist/components/AvatarGroup/AvatarGroup.d.ts +21 -0
  7. package/dist/components/CodeBlock/CodeBlock.d.ts +14 -0
  8. package/dist/components/Descriptions/Descriptions.d.ts +21 -0
  9. package/dist/components/Highlight/Highlight.d.ts +13 -0
  10. package/dist/components/Icon/Icon.d.ts +1 -1
  11. package/dist/components/InputNumber/InputNumber.d.ts +25 -0
  12. package/dist/components/List/List.d.ts +18 -0
  13. package/dist/components/Markdown/Markdown.d.ts +14 -0
  14. package/dist/components/Markdown/parser.d.ts +32 -0
  15. package/dist/components/Menu/Menu.d.ts +25 -0
  16. package/dist/components/MessageBubble/MessageBubble.d.ts +20 -0
  17. package/dist/components/PasswordInput/PasswordInput.d.ts +21 -0
  18. package/dist/components/Result/Result.d.ts +17 -0
  19. package/dist/components/TagsInput/TagsInput.d.ts +21 -0
  20. package/dist/components/Timeline/Timeline.d.ts +25 -0
  21. package/dist/components/index.d.ts +27 -0
  22. package/dist/components/index.js +7 -1
  23. package/dist/components/style.css +677 -1
  24. package/dist/db/postgres/connection.d.ts +24 -3
  25. package/dist/db/postgres/pool.d.ts +30 -8
  26. package/dist/db/redis/client.d.ts +43 -0
  27. package/dist/db/redis/connection.d.ts +12 -0
  28. package/dist/db/redis/pipeline.d.ts +26 -0
  29. package/dist/db/redis/pool.d.ts +27 -2
  30. package/dist/index.d.ts +1 -0
  31. package/dist/index.js +1055 -94
  32. package/dist/layout/weifuwu-layout.css +11 -1
  33. package/dist/postgres/types.d.ts +2 -1
  34. package/dist/redis/types.d.ts +6 -0
  35. package/dist/scheduler/cron.d.ts +26 -0
  36. package/dist/scheduler/index.d.ts +69 -0
  37. package/package.json +2 -4
@@ -1014,7 +1014,11 @@ code {
1014
1014
  .wf-app-shell {
1015
1015
  display: grid;
1016
1016
  grid-template-columns: var(--wf-sidebar-width, 240px) minmax(0, 1fr);
1017
- min-height: 100vh;
1017
+ /* 固定视口高度(非 min-height):内部页面(聊天等)依赖 height: 100% 链实现
1018
+ 容器内滚动——min-height 会让壳随内容长高,聊天消息区永远无法内部滚动
1019
+ (scrollTop 赋值无效果,页面滚动条不跟随消息到底) */
1020
+ height: 100vh;
1021
+ overflow: hidden;
1018
1022
  }
1019
1023
 
1020
1024
  /* ── 侧边栏 ── */
@@ -1115,6 +1119,9 @@ code {
1115
1119
  .wf-main {
1116
1120
  padding: var(--wf-space-lg);
1117
1121
  min-width: 0;
1122
+ min-height: 0;
1123
+ /* 内容高于视口时在主区内滚动(壳固定视口高度后的唯一滚动出口) */
1124
+ overflow-y: auto;
1118
1125
  background: var(--wf-color-bg);
1119
1126
  }
1120
1127
 
@@ -1129,6 +1136,8 @@ code {
1129
1136
  @media (max-width: 767.98px) {
1130
1137
  .wf-app-shell {
1131
1138
  grid-template-columns: 1fr;
1139
+ height: auto; /* 恢复文档流滚动(侧边栏堆叠在顶部) */
1140
+ overflow: visible;
1132
1141
  }
1133
1142
  .wf-sidebar {
1134
1143
  position: static;
@@ -1138,6 +1147,7 @@ code {
1138
1147
  }
1139
1148
  .wf-main {
1140
1149
  padding: var(--wf-space-md);
1150
+ overflow: visible;
1141
1151
  }
1142
1152
  }
1143
1153
  }
@@ -2991,6 +3001,8 @@ code {
2991
3001
  display: flex;
2992
3002
  align-items: center;
2993
3003
  gap: var(--wf-gap-sm);
3004
+ width: 100%;
3005
+ min-width: 0; /* flex 子项可收缩(防 bar 塌缩为 0) */
2994
3006
  }
2995
3007
 
2996
3008
  .wf-progress-label {
@@ -4704,4 +4716,668 @@ code {
4704
4716
  border-color: var(--wf-color-primary);
4705
4717
  }
4706
4718
 
4719
+ /* weifuwu/components — Markdown 排版 */
4720
+
4721
+ .wf-md {
4722
+ font-family: var(--wf-font-sans);
4723
+ font-size: var(--wf-font-size-sm);
4724
+ line-height: var(--wf-line-height);
4725
+ color: var(--wf-color-text);
4726
+ word-break: break-word;
4727
+ }
4728
+
4729
+ .wf-md > :first-child { margin-top: 0; }
4730
+ .wf-md > :last-child { margin-bottom: 0; }
4731
+
4732
+ .wf-md-h { margin: var(--wf-space-md) 0 var(--wf-space-sm); font-weight: var(--wf-font-weight-bold); line-height: 1.25; }
4733
+ .wf-md-h1 { font-size: var(--wf-font-size-xl); }
4734
+ .wf-md-h2 { font-size: var(--wf-font-size-lg); }
4735
+ .wf-md-h3 { font-size: var(--wf-font-size-base); }
4736
+ .wf-md-h4 { font-size: var(--wf-font-size-sm); color: var(--wf-color-text-secondary); }
4737
+
4738
+ .wf-md-p { margin: 0 0 var(--wf-space-sm); }
4739
+
4740
+ .wf-md-ul, .wf-md-ol { margin: 0 0 var(--wf-space-sm); padding-left: var(--wf-space-lg); }
4741
+ .wf-md-li { margin: 2px 0; }
4742
+
4743
+ .wf-md-code {
4744
+ font-family: var(--wf-font-mono);
4745
+ font-size: 0.875em; /* 行内代码相对字号(继承父级,随上下文缩放) */
4746
+ background: var(--wf-color-bg-secondary);
4747
+ border-radius: var(--wf-radius-xs);
4748
+ padding: 1px var(--wf-space-xs);
4749
+ }
4750
+
4751
+ .wf-md-strong { font-weight: var(--wf-font-weight-bold); }
4752
+ .wf-md-em { font-style: italic; }
4753
+
4754
+ .wf-md-link {
4755
+ color: var(--wf-color-primary-text);
4756
+ text-decoration: underline;
4757
+ text-underline-offset: 2px;
4758
+ }
4759
+ .wf-md-link:hover { opacity: 0.85; }
4760
+
4761
+ .wf-md-quote {
4762
+ margin: 0 0 var(--wf-space-sm);
4763
+ padding: var(--wf-space-xs) var(--wf-space-md);
4764
+ border-left: 3px solid var(--wf-color-border);
4765
+ color: var(--wf-color-text-secondary);
4766
+ }
4767
+
4768
+ .wf-md-hr {
4769
+ border: none;
4770
+ border-top: 1px solid var(--wf-color-border);
4771
+ margin: var(--wf-space-md) 0;
4772
+ }
4773
+
4774
+ /* weifuwu/components — CodeBlock */
4775
+
4776
+ .wf-codeblock {
4777
+ margin: 0 0 var(--wf-space-sm);
4778
+ border: 1px solid var(--wf-color-border);
4779
+ border-radius: var(--wf-radius-md);
4780
+ overflow: hidden;
4781
+ background: var(--wf-color-bg-secondary);
4782
+ font-family: var(--wf-font-mono);
4783
+ }
4784
+
4785
+ .wf-codeblock-header {
4786
+ display: flex;
4787
+ align-items: center;
4788
+ justify-content: space-between;
4789
+ padding: var(--wf-space-xs) var(--wf-space-sm);
4790
+ background: var(--wf-color-bg-tertiary);
4791
+ border-bottom: 1px solid var(--wf-color-border);
4792
+ }
4793
+
4794
+ .wf-codeblock-title {
4795
+ font-family: var(--wf-font-sans);
4796
+ font-size: var(--wf-font-size-xs);
4797
+ color: var(--wf-color-text-secondary);
4798
+ display: flex;
4799
+ align-items: center;
4800
+ gap: var(--wf-gap-xs);
4801
+ }
4802
+
4803
+ .wf-codeblock-lang {
4804
+ display: inline-flex;
4805
+ align-items: center;
4806
+ gap: 6px;
4807
+ }
4808
+
4809
+ .wf-codeblock-dot {
4810
+ width: 8px;
4811
+ height: 8px;
4812
+ border-radius: 50%;
4813
+ background: var(--wf-color-primary);
4814
+ }
4815
+
4816
+ .wf-codeblock-copy {
4817
+ display: inline-flex;
4818
+ align-items: center;
4819
+ justify-content: center;
4820
+ background: none;
4821
+ border: none;
4822
+ cursor: pointer;
4823
+ color: var(--wf-color-text-secondary);
4824
+ padding: 4px;
4825
+ border-radius: var(--wf-radius-xs);
4826
+ }
4827
+ .wf-codeblock-copy:hover {
4828
+ color: var(--wf-color-text);
4829
+ background: var(--wf-color-bg);
4830
+ }
4831
+ .wf-codeblock-copy:focus-visible {
4832
+ outline: 2px solid var(--wf-color-primary);
4833
+ outline-offset: 1px;
4834
+ }
4835
+
4836
+ .wf-codeblock-pre {
4837
+ margin: 0;
4838
+ padding: var(--wf-space-sm) var(--wf-space-md);
4839
+ overflow-x: auto;
4840
+ font-size: var(--wf-font-size-xs);
4841
+ line-height: 1.6;
4842
+ }
4843
+
4844
+ .wf-codeblock-code {
4845
+ font-family: inherit;
4846
+ white-space: pre;
4847
+ }
4848
+
4849
+ /* weifuwu/components — Timeline */
4850
+
4851
+ .wf-timeline {
4852
+ margin: 0;
4853
+ padding: 0;
4854
+ list-style: none;
4855
+ }
4856
+
4857
+ .wf-timeline-item {
4858
+ position: relative;
4859
+ display: flex;
4860
+ gap: var(--wf-gap-md);
4861
+ padding-bottom: var(--wf-space-md);
4862
+ }
4863
+
4864
+ /* 连接线(除最后一项) */
4865
+ .wf-timeline-item:not(:last-child)::before {
4866
+ content: '';
4867
+ position: absolute;
4868
+ top: 20px;
4869
+ bottom: 0;
4870
+ left: 8px;
4871
+ width: 2px;
4872
+ background: var(--wf-color-border);
4873
+ }
4874
+
4875
+ .wf-timeline-node {
4876
+ position: relative;
4877
+ z-index: 1;
4878
+ width: 18px;
4879
+ height: 18px;
4880
+ border-radius: 50%;
4881
+ flex-shrink: 0;
4882
+ display: flex;
4883
+ align-items: center;
4884
+ justify-content: center;
4885
+ font-size: 10px;
4886
+ margin-top: 2px;
4887
+ }
4888
+
4889
+ /* 节点状态色(-text 语义色变体,对比度达标) */
4890
+ .wf-timeline-node--default { background: var(--wf-color-border); color: var(--wf-color-text-secondary); }
4891
+ .wf-timeline-node--info { background: var(--wf-color-info-text); color: var(--wf-color-on-brand); }
4892
+ .wf-timeline-node--success { background: var(--wf-color-success-text); color: var(--wf-color-on-brand); }
4893
+ .wf-timeline-node--warning { background: var(--wf-color-warning-text); color: var(--wf-color-on-brand); }
4894
+ .wf-timeline-node--error { background: var(--wf-color-error-text); color: var(--wf-color-on-brand); }
4895
+
4896
+ .wf-timeline-col {
4897
+ flex: 1;
4898
+ min-width: 0;
4899
+ }
4900
+
4901
+ .wf-timeline-head {
4902
+ display: flex;
4903
+ align-items: baseline;
4904
+ gap: var(--wf-gap-sm);
4905
+ flex-wrap: wrap;
4906
+ }
4907
+
4908
+ .wf-timeline-title {
4909
+ font-weight: var(--wf-font-weight-semibold);
4910
+ font-size: var(--wf-font-size-sm);
4911
+ color: var(--wf-color-text);
4912
+ }
4913
+
4914
+ .wf-timeline-time {
4915
+ font-size: var(--wf-font-size-xs);
4916
+ color: var(--wf-color-text-tertiary);
4917
+ }
4918
+
4919
+ .wf-timeline-content {
4920
+ margin-top: 2px;
4921
+ font-size: var(--wf-font-size-sm);
4922
+ color: var(--wf-color-text-secondary);
4923
+ }
4924
+
4925
+ .wf-timeline-item--clickable {
4926
+ cursor: pointer;
4927
+ border-radius: var(--wf-radius-sm);
4928
+ padding: 2px 4px;
4929
+ margin: -2px -4px;
4930
+ }
4931
+ .wf-timeline-item--clickable:hover { background: var(--wf-color-bg-secondary); }
4932
+ .wf-timeline-item--clickable:focus-visible {
4933
+ outline: 2px solid var(--wf-color-primary);
4934
+ outline-offset: 1px;
4935
+ }
4936
+
4937
+ /* alternate:内容左右交替(节点居中分隔) */
4938
+ .wf-timeline-item--alt-left, .wf-timeline-item--alt-right {
4939
+ width: 50%;
4940
+ }
4941
+ .wf-timeline-item--alt-left { align-self: flex-start; text-align: right; }
4942
+ .wf-timeline-item--alt-right { align-self: flex-end; margin-left: 50%; }
4943
+
4944
+ /* weifuwu/components — InputNumber */
4945
+
4946
+ .wf-inputnumber-wrap {
4947
+ display: flex;
4948
+ flex-direction: column;
4949
+ gap: var(--wf-gap-xs);
4950
+ width: 100%;
4951
+ }
4952
+
4953
+ .wf-inputnumber {
4954
+ display: flex;
4955
+ align-items: stretch;
4956
+ width: 100%;
4957
+ border: var(--wf-border-width) solid var(--wf-color-border);
4958
+ border-radius: var(--wf-radius-sm);
4959
+ background: var(--wf-color-bg);
4960
+ min-height: 36px; /* 与 Button md 对齐 */
4961
+ transition: border-color var(--wf-dur-fast) var(--wf-ease-out);
4962
+ }
4963
+
4964
+ .wf-inputnumber:focus-within {
4965
+ border-color: var(--wf-color-primary);
4966
+ box-shadow: 0 0 0 2px var(--wf-color-primary-bg);
4967
+ }
4968
+
4969
+ .wf-inputnumber--err { border-color: var(--wf-color-error-text); }
4970
+ .wf-inputnumber--disabled { opacity: 0.6; }
4971
+
4972
+ .wf-inputnumber-input {
4973
+ flex: 1;
4974
+ min-width: 0;
4975
+ border: none;
4976
+ outline: none;
4977
+ background: transparent;
4978
+ padding: 0 var(--wf-space-sm);
4979
+ font-family: var(--wf-font-sans);
4980
+ font-size: var(--wf-font-size-sm);
4981
+ color: var(--wf-color-text);
4982
+ width: 100%;
4983
+ }
4984
+
4985
+ .wf-inputnumber-btns {
4986
+ display: flex;
4987
+ flex-direction: column;
4988
+ border-left: 1px solid var(--wf-color-border);
4989
+ }
4990
+
4991
+ .wf-inputnumber-btn {
4992
+ flex: 1;
4993
+ display: flex;
4994
+ align-items: center;
4995
+ justify-content: center;
4996
+ background: none;
4997
+ border: none;
4998
+ cursor: pointer;
4999
+ color: var(--wf-color-text-secondary);
5000
+ padding: 2px 6px;
5001
+ min-height: 18px;
5002
+ }
5003
+ .wf-inputnumber-btn:hover { background: var(--wf-color-bg-secondary); color: var(--wf-color-text); }
5004
+ .wf-inputnumber-btn:first-child { border-bottom: 1px solid var(--wf-color-border); }
5005
+ .wf-inputnumber-btn:focus-visible { outline: 2px solid var(--wf-color-primary); outline-offset: -2px; }
5006
+ .wf-inputnumber-btn:disabled { cursor: not-allowed; }
5007
+
5008
+ .wf-inputnumber-label {
5009
+ font-family: var(--wf-font-sans);
5010
+ font-size: var(--wf-font-size-sm);
5011
+ color: var(--wf-color-text);
5012
+ }
5013
+
5014
+ .wf-inputnumber-req { color: var(--wf-color-error-text); margin-left: 2px; }
5015
+
5016
+ .wf-inputnumber-err { font-size: var(--wf-font-size-xs); color: var(--wf-color-error-text); }
5017
+ .wf-inputnumber-hint { font-size: var(--wf-font-size-xs); color: var(--wf-color-text-tertiary); }
5018
+
5019
+ /* weifuwu/components — Descriptions */
5020
+
5021
+ .wf-descriptions {
5022
+ display: grid;
5023
+ gap: var(--wf-space-sm) var(--wf-space-md);
5024
+ margin: 0;
5025
+ font-family: var(--wf-font-sans);
5026
+ }
5027
+
5028
+ .wf-descriptions--1 { grid-template-columns: repeat(1, 1fr); }
5029
+ .wf-descriptions--2 { grid-template-columns: repeat(2, 1fr); }
5030
+ .wf-descriptions--3 { grid-template-columns: repeat(3, 1fr); }
5031
+ .wf-descriptions--4 { grid-template-columns: repeat(4, 1fr); }
5032
+
5033
+ .wf-descriptions-item {
5034
+ display: flex;
5035
+ flex-direction: column;
5036
+ gap: 2px;
5037
+ min-width: 0;
5038
+ }
5039
+
5040
+ .wf-descriptions-label {
5041
+ font-size: var(--wf-font-size-xs);
5042
+ color: var(--wf-color-text-tertiary);
5043
+ font-weight: var(--wf-font-weight-medium);
5044
+ }
5045
+
5046
+ .wf-descriptions-value {
5047
+ margin: 0;
5048
+ font-size: var(--wf-font-size-sm);
5049
+ color: var(--wf-color-text);
5050
+ word-break: break-word;
5051
+ }
5052
+
5053
+ /* bordered:单元格描边 */
5054
+ .wf-descriptions--bordered {
5055
+ border: var(--wf-border-width) solid var(--wf-color-border);
5056
+ border-radius: var(--wf-radius-md);
5057
+ gap: 0;
5058
+ overflow: hidden;
5059
+ }
5060
+ .wf-descriptions--bordered .wf-descriptions-item {
5061
+ border-bottom: 1px solid var(--wf-color-border);
5062
+ padding: var(--wf-space-sm) var(--wf-space-md);
5063
+ border-right: 1px solid var(--wf-color-border);
5064
+ }
5065
+ .wf-descriptions--bordered .wf-descriptions-item:nth-child(n):last-child {
5066
+ border-bottom: none;
5067
+ }
5068
+
5069
+ /* size */
5070
+ .wf-descriptions--sm .wf-descriptions-value { font-size: var(--wf-font-size-xs); }
5071
+ .wf-descriptions--lg .wf-descriptions-value { font-size: var(--wf-font-size-base); }
5072
+
5073
+ /* weifuwu/components — AvatarGroup */
5074
+
5075
+ .wf-avatar-group {
5076
+ display: inline-flex;
5077
+ align-items: center;
5078
+ }
5079
+
5080
+ .wf-avatar-group-item {
5081
+ margin-left: -6px;
5082
+ }
5083
+ .wf-avatar-group-item:first-child {
5084
+ margin-left: 0;
5085
+ }
5086
+
5087
+ .wf-avatar-group-more {
5088
+ display: inline-flex;
5089
+ align-items: center;
5090
+ justify-content: center;
5091
+ width: 32px;
5092
+ height: 32px;
5093
+ border-radius: 50%;
5094
+ margin-left: -6px;
5095
+ background: var(--wf-color-bg-tertiary);
5096
+ border: 2px solid var(--wf-color-bg);
5097
+ font-size: var(--wf-font-size-xs);
5098
+ font-weight: var(--wf-font-weight-semibold);
5099
+ color: var(--wf-color-text-secondary);
5100
+ font-family: var(--wf-font-sans);
5101
+ }
5102
+
5103
+ /* weifuwu/components — MessageBubble(依赖 layout wf-bubble 原语) */
5104
+
5105
+ .wf-bubble--error {
5106
+ border: 1px solid var(--wf-color-error-text);
5107
+ background: var(--wf-color-error-bg);
5108
+ color: var(--wf-color-error-text);
5109
+ }
5110
+
5111
+ .wf-bubble--streaming {
5112
+ border-right: 3px solid var(--wf-color-primary);
5113
+ border-right-color: var(--wf-color-primary);
5114
+ animation: wf-bubble-blink var(--wf-dur-fast) var(--wf-ease-in-out) infinite;
5115
+ }
5116
+
5117
+ @keyframes wf-bubble-blink {
5118
+ 0%, 100% { border-right-color: var(--wf-color-primary); }
5119
+ 50% { border-right-color: transparent; }
5120
+ }
5121
+
5122
+ .wf-bubble-body {
5123
+ display: flex;
5124
+ flex-direction: column;
5125
+ gap: var(--wf-gap-xs);
5126
+ }
5127
+
5128
+ .wf-bubble-actions {
5129
+ display: flex;
5130
+ gap: var(--wf-gap-xs);
5131
+ align-items: center;
5132
+ }
5133
+
5134
+ /* weifuwu/components — Menu(侧栏导航) */
5135
+
5136
+ .wf-menu {
5137
+ display: flex;
5138
+ flex-direction: column;
5139
+ gap: 2px;
5140
+ font-family: var(--wf-font-sans);
5141
+ }
5142
+
5143
+ .wf-menu-group {
5144
+ padding: var(--wf-space-sm) var(--wf-space-sm) 2px;
5145
+ font-size: var(--wf-font-size-xs);
5146
+ font-weight: var(--wf-font-weight-semibold);
5147
+ color: var(--wf-color-text-tertiary);
5148
+ letter-spacing: 0.02em;
5149
+ }
5150
+
5151
+ .wf-menu-item {
5152
+ display: flex;
5153
+ align-items: center;
5154
+ gap: var(--wf-gap-sm);
5155
+ padding: var(--wf-space-sm) var(--wf-space-md);
5156
+ border-radius: var(--wf-radius-sm);
5157
+ font-size: var(--wf-font-size-sm);
5158
+ color: var(--wf-color-text-secondary);
5159
+ cursor: pointer;
5160
+ user-select: none;
5161
+ transition: background var(--wf-dur-fast) var(--wf-ease-out), color var(--wf-dur-fast) var(--wf-ease-out);
5162
+ }
5163
+
5164
+ .wf-menu-item:hover {
5165
+ background: var(--wf-color-bg-secondary);
5166
+ color: var(--wf-color-text);
5167
+ }
5168
+
5169
+ .wf-menu-item--active {
5170
+ background: var(--wf-color-primary-bg);
5171
+ color: var(--wf-color-primary-text);
5172
+ font-weight: var(--wf-font-weight-semibold);
5173
+ }
5174
+
5175
+ .wf-menu-item--danger { color: var(--wf-color-error-text); }
5176
+ .wf-menu-item--danger:hover { background: var(--wf-color-error-bg); color: var(--wf-color-error-text); }
5177
+
5178
+ .wf-menu-item:focus-visible {
5179
+ outline: 2px solid var(--wf-color-primary);
5180
+ outline-offset: -2px;
5181
+ }
5182
+
5183
+ .wf-menu-icon {
5184
+ display: inline-flex;
5185
+ font-size: var(--wf-font-size-base);
5186
+ width: 18px;
5187
+ justify-content: center;
5188
+ flex-shrink: 0;
5189
+ }
5190
+
5191
+ /* weifuwu/components — PasswordInput(复用 Input 基础类) */
5192
+
5193
+ .wf-password {
5194
+ position: relative;
5195
+ }
5196
+
5197
+ .wf-password .wf-input {
5198
+ padding-right: 38px;
5199
+ }
5200
+
5201
+ .wf-password-eye {
5202
+ position: absolute;
5203
+ right: 4px;
5204
+ top: 50%;
5205
+ transform: translateY(-50%);
5206
+ display: inline-flex;
5207
+ align-items: center;
5208
+ justify-content: center;
5209
+ background: none;
5210
+ border: none;
5211
+ cursor: pointer;
5212
+ color: var(--wf-color-text-tertiary);
5213
+ padding: 6px;
5214
+ border-radius: var(--wf-radius-xs);
5215
+ }
5216
+ .wf-password-eye:hover { color: var(--wf-color-text-secondary); }
5217
+
5218
+ /* weifuwu/components — TagsInput */
5219
+
5220
+ .wf-tags {
5221
+ display: flex;
5222
+ flex-wrap: wrap;
5223
+ align-items: center;
5224
+ gap: var(--wf-gap-xs);
5225
+ padding: 4px var(--wf-space-sm);
5226
+ border: var(--wf-border-width) solid var(--wf-color-border);
5227
+ border-radius: var(--wf-radius-sm);
5228
+ background: var(--wf-color-bg);
5229
+ min-height: 36px; /* 与 Input 对齐 */
5230
+ cursor: text;
5231
+ transition: border-color var(--wf-dur-fast) var(--wf-ease-out);
5232
+ }
5233
+
5234
+ .wf-tags:focus-within {
5235
+ border-color: var(--wf-color-primary);
5236
+ box-shadow: 0 0 0 2px var(--wf-color-primary-bg);
5237
+ }
5238
+
5239
+ .wf-tags--err { border-color: var(--wf-color-error-text); }
5240
+ .wf-tags--disabled { opacity: 0.6; cursor: not-allowed; }
5241
+
5242
+ .wf-tags-tag {
5243
+ display: inline-flex;
5244
+ align-items: center;
5245
+ gap: 4px;
5246
+ padding: 2px var(--wf-space-xs);
5247
+ border-radius: var(--wf-radius-sm);
5248
+ background: var(--wf-color-bg-secondary);
5249
+ border: 1px solid var(--wf-color-border);
5250
+ font-size: var(--wf-font-size-xs);
5251
+ color: var(--wf-color-text);
5252
+ font-family: var(--wf-font-sans);
5253
+ }
5254
+
5255
+ .wf-tags-remove {
5256
+ display: inline-flex;
5257
+ align-items: center;
5258
+ justify-content: center;
5259
+ background: none;
5260
+ border: none;
5261
+ cursor: pointer;
5262
+ color: var(--wf-color-text-tertiary);
5263
+ padding: 0;
5264
+ border-radius: 2px;
5265
+ }
5266
+ .wf-tags-remove:hover { color: var(--wf-color-error-text); }
5267
+ .wf-tags-remove:focus-visible { outline: 2px solid var(--wf-color-primary); }
5268
+
5269
+ .wf-tags-input {
5270
+ flex: 1;
5271
+ min-width: 60px;
5272
+ border: none;
5273
+ outline: none;
5274
+ background: transparent;
5275
+ font-family: var(--wf-font-sans);
5276
+ font-size: var(--wf-font-size-sm);
5277
+ color: var(--wf-color-text);
5278
+ padding: 4px 0;
5279
+ }
5280
+ .wf-tags-input::placeholder { color: var(--wf-color-text-tertiary); }
5281
+
5282
+ /* weifuwu/components — Highlight */
5283
+
5284
+ .wf-highlight-mark {
5285
+ background: var(--wf-color-warning-bg);
5286
+ color: var(--wf-color-warning-text);
5287
+ border-radius: 2px;
5288
+ padding: 0 1px;
5289
+ font-weight: var(--wf-font-weight-semibold);
5290
+ }
5291
+
5292
+ /* weifuwu/components — List */
5293
+
5294
+ .wf-list {
5295
+ font-family: var(--wf-font-sans);
5296
+ }
5297
+
5298
+ .wf-list-header {
5299
+ font-weight: var(--wf-font-weight-semibold);
5300
+ font-size: var(--wf-font-size-sm);
5301
+ color: var(--wf-color-text);
5302
+ padding: var(--wf-space-sm) 0;
5303
+ }
5304
+
5305
+ .wf-list-body {
5306
+ margin: 0;
5307
+ padding: 0;
5308
+ list-style: none;
5309
+ }
5310
+
5311
+ .wf-list-item {
5312
+ padding: var(--wf-space-sm) 0;
5313
+ }
5314
+
5315
+ .wf-list--divided .wf-list-item {
5316
+ border-bottom: 1px solid var(--wf-color-border);
5317
+ }
5318
+ .wf-list--divided .wf-list-item:last-child {
5319
+ border-bottom: none;
5320
+ }
5321
+
5322
+ .wf-list-footer {
5323
+ padding: var(--wf-space-sm) 0;
5324
+ font-size: var(--wf-font-size-sm);
5325
+ color: var(--wf-color-text-tertiary);
5326
+ }
5327
+
5328
+ .wf-list-empty {
5329
+ display: flex;
5330
+ flex-direction: column;
5331
+ align-items: center;
5332
+ gap: var(--wf-gap-sm);
5333
+ padding: var(--wf-space-lg) 0;
5334
+ color: var(--wf-color-text-tertiary);
5335
+ font-size: var(--wf-font-size-sm);
5336
+ }
5337
+
5338
+ /* weifuwu/components — Result */
5339
+
5340
+ .wf-result {
5341
+ display: flex;
5342
+ flex-direction: column;
5343
+ align-items: center;
5344
+ gap: var(--wf-gap-sm);
5345
+ padding: var(--wf-space-xl) var(--wf-space-md);
5346
+ text-align: center;
5347
+ font-family: var(--wf-font-sans);
5348
+ }
5349
+
5350
+ .wf-result-icon {
5351
+ display: flex;
5352
+ align-items: center;
5353
+ justify-content: center;
5354
+ width: 72px;
5355
+ height: 72px;
5356
+ border-radius: 50%;
5357
+ }
5358
+
5359
+ .wf-result--success .wf-result-icon { background: var(--wf-color-success-bg); color: var(--wf-color-success-text); }
5360
+ .wf-result--error .wf-result-icon { background: var(--wf-color-error-bg); color: var(--wf-color-error-text); }
5361
+ .wf-result--warning .wf-result-icon { background: var(--wf-color-warning-bg); color: var(--wf-color-warning-text); }
5362
+ .wf-result--info .wf-result-icon { background: var(--wf-color-info-bg); color: var(--wf-color-info-text); }
5363
+
5364
+ .wf-result-title {
5365
+ font-size: var(--wf-font-size-lg);
5366
+ font-weight: var(--wf-font-weight-bold);
5367
+ color: var(--wf-color-text);
5368
+ }
5369
+
5370
+ .wf-result-desc {
5371
+ font-size: var(--wf-font-size-sm);
5372
+ color: var(--wf-color-text-secondary);
5373
+ max-width: 420px;
5374
+ }
5375
+
5376
+ .wf-result-extra {
5377
+ margin-top: var(--wf-space-md);
5378
+ display: flex;
5379
+ gap: var(--wf-gap-sm);
5380
+ justify-content: center;
5381
+ }
5382
+
4707
5383
  }