@zhang_jifan/fanui 2.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 (127) hide show
  1. package/ACCESSIBILITY.md +61 -0
  2. package/CHANGELOG.md +112 -0
  3. package/COMMERCIAL-LICENSE.md +71 -0
  4. package/DESIGN-SYSTEM.md +294 -0
  5. package/LICENSE +661 -0
  6. package/README.md +348 -0
  7. package/USAGE.md +1926 -0
  8. package/_index.scss +20 -0
  9. package/dist/fanui.cjs +15 -0
  10. package/dist/fanui.css +28209 -0
  11. package/dist/fanui.d.ts +353 -0
  12. package/dist/fanui.esm.js +71 -0
  13. package/dist/fanui.js +4782 -0
  14. package/dist/fanui.min.css +1 -0
  15. package/dist/fanui.mjs +71 -0
  16. package/dist/modules/fanui-advanced.css +830 -0
  17. package/dist/modules/fanui-advanced.min.css +129 -0
  18. package/dist/modules/fanui-alert.css +575 -0
  19. package/dist/modules/fanui-alert.min.css +122 -0
  20. package/dist/modules/fanui-badge.css +426 -0
  21. package/dist/modules/fanui-badge.min.css +77 -0
  22. package/dist/modules/fanui-base.css +1394 -0
  23. package/dist/modules/fanui-base.min.css +236 -0
  24. package/dist/modules/fanui-blog.css +762 -0
  25. package/dist/modules/fanui-blog.min.css +108 -0
  26. package/dist/modules/fanui-button.css +526 -0
  27. package/dist/modules/fanui-button.min.css +56 -0
  28. package/dist/modules/fanui-card.css +291 -0
  29. package/dist/modules/fanui-card.min.css +52 -0
  30. package/dist/modules/fanui-choice.css +539 -0
  31. package/dist/modules/fanui-choice.min.css +83 -0
  32. package/dist/modules/fanui-dashboard.css +1057 -0
  33. package/dist/modules/fanui-dashboard.min.css +160 -0
  34. package/dist/modules/fanui-data.css +687 -0
  35. package/dist/modules/fanui-data.min.css +125 -0
  36. package/dist/modules/fanui-feedback.css +432 -0
  37. package/dist/modules/fanui-feedback.min.css +79 -0
  38. package/dist/modules/fanui-form.css +779 -0
  39. package/dist/modules/fanui-form.min.css +123 -0
  40. package/dist/modules/fanui-glass.css +497 -0
  41. package/dist/modules/fanui-glass.min.css +46 -0
  42. package/dist/modules/fanui-input-plus.css +799 -0
  43. package/dist/modules/fanui-input-plus.min.css +124 -0
  44. package/dist/modules/fanui-interactive.css +960 -0
  45. package/dist/modules/fanui-interactive.min.css +138 -0
  46. package/dist/modules/fanui-layout.css +4399 -0
  47. package/dist/modules/fanui-layout.min.css +1172 -0
  48. package/dist/modules/fanui-marketing.css +1125 -0
  49. package/dist/modules/fanui-marketing.min.css +144 -0
  50. package/dist/modules/fanui-nav.css +458 -0
  51. package/dist/modules/fanui-nav.min.css +76 -0
  52. package/dist/modules/fanui-overlay.css +547 -0
  53. package/dist/modules/fanui-overlay.min.css +91 -0
  54. package/dist/modules/fanui-table.css +290 -0
  55. package/dist/modules/fanui-table.min.css +62 -0
  56. package/dist/modules/fanui-tabs.css +333 -0
  57. package/dist/modules/fanui-tabs.min.css +58 -0
  58. package/dist/modules/fanui-themes.css +2728 -0
  59. package/dist/modules/fanui-themes.min.css +40 -0
  60. package/dist/modules/fanui-tokens.css +587 -0
  61. package/dist/modules/fanui-tokens.min.css +3 -0
  62. package/dist/modules/fanui-utilities.css +6557 -0
  63. package/dist/modules/fanui-utilities.min.css +1762 -0
  64. package/dist/modules/sizes.json +103 -0
  65. package/docs/MIGRATION-v2.md +179 -0
  66. package/examples/01-script-tag.html +149 -0
  67. package/examples/02-react/README.md +39 -0
  68. package/examples/02-react/index.html +12 -0
  69. package/examples/02-react/package.json +20 -0
  70. package/examples/02-react/src/App.jsx +108 -0
  71. package/examples/02-react/src/main.jsx +13 -0
  72. package/examples/02-react/src/useFanUI.js +87 -0
  73. package/examples/02-react/vite.config.js +6 -0
  74. package/examples/03-vue3/README.md +67 -0
  75. package/examples/03-vue3/index.html +12 -0
  76. package/examples/03-vue3/package.json +19 -0
  77. package/examples/03-vue3/src/App.vue +93 -0
  78. package/examples/03-vue3/src/main.js +8 -0
  79. package/examples/03-vue3/src/useFanUI.js +85 -0
  80. package/examples/03-vue3/vite.config.js +6 -0
  81. package/examples/04-vue2-cdn.html +93 -0
  82. package/examples/README.md +34 -0
  83. package/package.json +127 -0
  84. package/src/_functions.scss +319 -0
  85. package/src/_mixins.scss +1202 -0
  86. package/src/_tokens.scss +180 -0
  87. package/src/_variables.scss +491 -0
  88. package/src/base/_animations.scss +210 -0
  89. package/src/base/_reset.scss +359 -0
  90. package/src/base/_rtl.scss +133 -0
  91. package/src/base/_typography.scss +353 -0
  92. package/src/components/_advanced.scss +763 -0
  93. package/src/components/_alert.scss +322 -0
  94. package/src/components/_badge.scss +279 -0
  95. package/src/components/_blog.scss +693 -0
  96. package/src/components/_button.scss +351 -0
  97. package/src/components/_capabilities.scss +463 -0
  98. package/src/components/_card.scss +281 -0
  99. package/src/components/_choice.scss +444 -0
  100. package/src/components/_dashboard.scss +950 -0
  101. package/src/components/_data.scss +618 -0
  102. package/src/components/_feedback.scss +403 -0
  103. package/src/components/_form.scss +408 -0
  104. package/src/components/_glass.scss +374 -0
  105. package/src/components/_input-plus.scss +730 -0
  106. package/src/components/_interactive.scss +885 -0
  107. package/src/components/_marketing.scss +982 -0
  108. package/src/components/_nav.scss +480 -0
  109. package/src/components/_overlay.scss +517 -0
  110. package/src/components/_table.scss +276 -0
  111. package/src/components/_tabs.scss +338 -0
  112. package/src/fanui.d.ts +353 -0
  113. package/src/fanui.js +4782 -0
  114. package/src/fanui.scss +79 -0
  115. package/src/glass/_switches.scss +36 -0
  116. package/src/glass/_tokens.scss +259 -0
  117. package/src/layout/_container.scss +111 -0
  118. package/src/layout/_flex.scss +164 -0
  119. package/src/layout/_grid.scss +180 -0
  120. package/src/themes/_accents.scss +201 -0
  121. package/src/themes/_palettes.scss +180 -0
  122. package/src/utilities/_borders.scss +104 -0
  123. package/src/utilities/_display.scss +145 -0
  124. package/src/utilities/_effects.scss +210 -0
  125. package/src/utilities/_sizing.scss +123 -0
  126. package/src/utilities/_spacing.scss +118 -0
  127. package/src/utilities/_texture.scss +323 -0
@@ -0,0 +1,180 @@
1
+ // =============================================================================
2
+ // fanUI · 设计令牌输出层 · CSS 自定义属性 (Custom Properties)
3
+ // -----------------------------------------------------------------------------
4
+ // 将 SCSS 设计变量统一输出为 `--fanui-*`,运行时可通过 JS / 覆盖 :root 动态换肤。
5
+ // 令牌分层(命名规范):
6
+ // --fanui-<色系>-<色阶> 原始调色板 --fanui-primary-600
7
+ // --fanui-<语义色>[-变体] 语义色角色 --fanui-primary-hover
8
+ // --fanui-color-<语义> 主题语义色 --fanui-color-text
9
+ // --fanui-glass-* 液态玻璃 --fanui-glass-intensity
10
+ // --fanui-<类别>-<名> 功能令牌 --fanui-radius-lg
11
+ // --fanui-z-<名> 层级 --fanui-z-modal
12
+ //
13
+ // 说明:语义色角色(--fanui-primary / --fanui-success …)由 themes/_accents.scss
14
+ // 统一输出,那里同时处理 12 套主题色 × 深浅模式 × 局部作用域的组合,
15
+ // 本文件只负责「与主题色无关」的令牌。
16
+ // =============================================================================
17
+
18
+ @use "sass:map";
19
+ @use "functions" as fn;
20
+ @use "variables" as v;
21
+ @use "mixins" as mx;
22
+ @use "glass/tokens" as gt;
23
+
24
+ :root {
25
+ // ---- 原始调色板 -----------------------------------------------------------
26
+ @include mx.fanui-emit-palette(v.$fanui-palette);
27
+
28
+ // ---- 主题语义令牌(浅色)--------------------------------------------------
29
+ @include mx.fanui-emit-theme(v.$fanui-theme-light);
30
+
31
+ // ---- 液态玻璃令牌 --------------------------------------------------------
32
+ @if v.$fanui-enable-glass {
33
+ @include gt.fanui-emit-glass-tokens("light");
34
+ }
35
+
36
+ // ---- 字体 ----------------------------------------------------------------
37
+ --fanui-font-sans: #{v.$fanui-font-family-sans};
38
+ --fanui-font-serif: #{v.$fanui-font-family-serif};
39
+ --fanui-font-mono: #{v.$fanui-font-family-mono};
40
+ --fanui-font-base: #{v.$fanui-font-family-base};
41
+
42
+ // ---- 字号 ----------------------------------------------------------------
43
+ @each $name, $size in v.$fanui-font-sizes {
44
+ @if v.$fanui-font-size-root == 0px {
45
+ --fanui-font-size-#{$name}: #{$size};
46
+ } @else {
47
+ --fanui-font-size-#{$name}: #{fn.fanui-px2rem($size, v.$fanui-font-size-root)};
48
+ }
49
+ --fanui-font-size-#{$name}-px: #{$size};
50
+ }
51
+
52
+ // ---- 行高 ----------------------------------------------------------------
53
+ @each $name, $value in v.$fanui-line-heights {
54
+ --fanui-line-height-#{$name}: #{$value};
55
+ }
56
+
57
+ // ---- 字重 ----------------------------------------------------------------
58
+ @each $name, $value in v.$fanui-font-weights {
59
+ --fanui-font-weight-#{$name}: #{$value};
60
+ }
61
+
62
+ // ---- 字距 ----------------------------------------------------------------
63
+ @each $name, $value in v.$fanui-letter-spacings {
64
+ --fanui-tracking-#{$name}: #{$value};
65
+ }
66
+
67
+ // ---- 间距标尺 ------------------------------------------------------------
68
+ @each $name, $value in v.$fanui-spacers {
69
+ --fanui-space-#{$name}: #{$value};
70
+ }
71
+
72
+ // ---- 圆角 ----------------------------------------------------------------
73
+ @each $name, $value in v.$fanui-radii {
74
+ --fanui-radius-#{$name}: #{$value};
75
+ }
76
+ --fanui-radius: #{v.$fanui-radius-base};
77
+
78
+ // ---- 阴影 ----------------------------------------------------------------
79
+ @each $name, $value in v.$fanui-shadows {
80
+ --fanui-shadow-#{$name}: #{$value};
81
+ }
82
+
83
+ // ---- 层级 ----------------------------------------------------------------
84
+ @each $name, $value in v.$fanui-zindexes {
85
+ --fanui-z-#{$name}: #{$value};
86
+ }
87
+
88
+ // ---- 动效 ----------------------------------------------------------------
89
+ @each $name, $value in v.$fanui-durations {
90
+ --fanui-duration-#{$name}: #{$value};
91
+ }
92
+ --fanui-ease-linear: #{v.$fanui-ease-linear};
93
+ --fanui-ease-in: #{v.$fanui-ease-in};
94
+ --fanui-ease-out: #{v.$fanui-ease-out};
95
+ --fanui-ease-in-out: #{v.$fanui-ease-in-out};
96
+ --fanui-ease-spring: #{v.$fanui-ease-spring};
97
+ --fanui-ease-base: #{v.$fanui-ease-base};
98
+
99
+ // ---- 控件尺寸 ------------------------------------------------------------
100
+ @each $name, $value in v.$fanui-control-heights {
101
+ --fanui-control-h-#{$name}: #{$value};
102
+ }
103
+ --fanui-control-h: #{v.$fanui-control-height-base};
104
+ --fanui-control-px: #{v.$fanui-control-padding-x};
105
+ --fanui-control-font-size: #{v.$fanui-control-font-size};
106
+ --fanui-control-radius: #{v.$fanui-control-radius};
107
+ --fanui-border-width: #{v.$fanui-border-width};
108
+ --fanui-border-width-thick: #{v.$fanui-border-width-thick};
109
+
110
+ // ---- 栅格 ----------------------------------------------------------------
111
+ --fanui-grid-columns: #{v.$fanui-grid-columns};
112
+ --fanui-grid-gutter-x: #{v.$fanui-grid-gutter-x};
113
+ --fanui-grid-gutter-y: #{v.$fanui-grid-gutter-y};
114
+ --fanui-gutter-x: #{v.$fanui-grid-gutter-x};
115
+ --fanui-gutter-y: #{v.$fanui-grid-gutter-y};
116
+
117
+ // ---- 遮罩 ----------------------------------------------------------------
118
+ --fanui-backdrop-bg: #{v.$fanui-backdrop-bg};
119
+ --fanui-backdrop-blur: #{v.$fanui-backdrop-blur};
120
+
121
+ // ---- 焦点环(C3 无障碍):运行时可覆盖,键盘策略见 :focus-visible 全局规则 ----
122
+ --fanui-focus-ring-color: #{fn.fanui-var("primary-ring")};
123
+ --fanui-focus-ring-width: #{v.$fanui-focus-ring-width};
124
+ --fanui-focus-ring-offset: #{v.$fanui-focus-ring-offset};
125
+
126
+ // ---- 断点参考(供 JS 读取,保持 CSS/JS 一致)-----------------------------
127
+ @each $name, $value in v.$fanui-breakpoints {
128
+ --fanui-bp-#{$name}: #{$value};
129
+ }
130
+ @each $name, $value in v.$fanui-container-max-widths {
131
+ --fanui-container-max-#{$name}: #{$value};
132
+ }
133
+ --fanui-container-px: #{v.$fanui-container-padding-x};
134
+ }
135
+
136
+ // =============================================================================
137
+ // 暗色主题
138
+ // =============================================================================
139
+
140
+ @if v.$fanui-enable-dark-mode {
141
+ // 1) 显式指定暗色
142
+ // 注意:这里只输出「与主题色无关」的中性令牌;
143
+ // 主题色角色由 themes/_accents.scss 输出,避免选择器权重互相覆盖。
144
+ [data-fanui-theme="dark"],
145
+ :root[data-fanui-theme="dark"] {
146
+ @include mx.fanui-emit-theme(v.$fanui-theme-dark);
147
+
148
+ --fanui-backdrop-bg: #{fn.fanui-alpha(#020617, 0.68)};
149
+
150
+ @if v.$fanui-enable-glass {
151
+ @include gt.fanui-emit-glass-tokens("dark");
152
+ }
153
+ }
154
+
155
+ // 2) 跟随系统:需显式声明 <html data-fanui-theme="auto">
156
+ @media (prefers-color-scheme: dark) {
157
+ [data-fanui-theme="auto"],
158
+ :root[data-fanui-theme="auto"] {
159
+ @include mx.fanui-emit-theme(v.$fanui-theme-dark);
160
+
161
+ --fanui-backdrop-bg: #{fn.fanui-alpha(#020617, 0.68)};
162
+
163
+ @if v.$fanui-enable-glass {
164
+ @include gt.fanui-emit-glass-tokens("dark");
165
+ }
166
+ }
167
+ }
168
+ }
169
+
170
+ // =============================================================================
171
+ // 便捷工具:显式锁定浅色(覆盖系统偏好)
172
+ // =============================================================================
173
+
174
+ :root[data-fanui-theme="light"] {
175
+ @include mx.fanui-emit-theme(v.$fanui-theme-light);
176
+
177
+ @if v.$fanui-enable-glass {
178
+ @include gt.fanui-emit-glass-tokens("light");
179
+ }
180
+ }
@@ -0,0 +1,491 @@
1
+ // =============================================================================
2
+ // fanUI · 设计变量层 (Design Tokens · SCSS)
3
+ // -----------------------------------------------------------------------------
4
+ // 全部变量以 `$fanui-` 为前缀,均带 `!default`,可在引入时按需覆盖:
5
+ //
6
+ // @use "@zhang_jifan/fanui" with (
7
+ // $fanui-primary: #7c3aed,
8
+ // $fanui-radius-base: 8px
9
+ // );
10
+ // =============================================================================
11
+
12
+ @use "sass:map";
13
+ @use "functions" as fn;
14
+ @use "themes/palettes" as pal;
15
+
16
+ // -----------------------------------------------------------------------------
17
+ // 0. 运行时主题能力开关
18
+ // -----------------------------------------------------------------------------
19
+
20
+ /// 是否输出 12 套主题色(关闭可显著减小产物体积)
21
+ $fanui-enable-accent-themes: true !default;
22
+
23
+ /// 主题色切换属性名:<html data-fanui-accent="cyan">
24
+ $fanui-accent-attribute: "data-fanui-accent" !default;
25
+
26
+ /// 是否输出液态玻璃令牌与组件
27
+ $fanui-enable-glass: true !default;
28
+
29
+ /// 液态玻璃关闭属性:<html data-fanui-glass="off">
30
+ $fanui-glass-attribute: "data-fanui-glass" !default;
31
+
32
+ /// 默认主题色(见 themes/_palettes.scss,默认 cyan 青)
33
+ $fanui-accent-default: pal.$fanui-accent-default !default;
34
+
35
+ // -----------------------------------------------------------------------------
36
+ // 1. 调色板 (Palette) —— 每个色系 50 / 100 … 900 / 950 共 11 阶
37
+ // -----------------------------------------------------------------------------
38
+
39
+ $fanui-palette: (
40
+ // 主题主色(默认 = cyan,运行时可通过 data-fanui-accent 换成另外 11 套)
41
+ "primary": pal.fanui-accent-palette($fanui-accent-default),
42
+ // 和声副色(cyan 的推荐配对:violet)
43
+ "accent": pal.fanui-accent-palette("violet"),
44
+ // 成功 · 绿
45
+ "success": (
46
+ 50: #ecfdf5, 100: #d1fae5, 200: #a7f3d0, 300: #6ee7b7, 400: #34d399,
47
+ 500: #10b981, 600: #059669, 700: #047857, 800: #065f46, 900: #064e3b, 950: #022c22
48
+ ),
49
+ // 警告 · 琥珀
50
+ "warning": (
51
+ 50: #fffbeb, 100: #fef3c7, 200: #fde68a, 300: #fcd34d, 400: #fbbf24,
52
+ 500: #f59e0b, 600: #d97706, 700: #b45309, 800: #92400e, 900: #78350f, 950: #451a03
53
+ ),
54
+ // 危险 · 红
55
+ "danger": (
56
+ 50: #fef2f2, 100: #fee2e2, 200: #fecaca, 300: #fca5a5, 400: #f87171,
57
+ 500: #ef4444, 600: #dc2626, 700: #b91c1c, 800: #991b1b, 900: #7f1d1d, 950: #450a0a
58
+ ),
59
+ // 信息 · 天蓝
60
+ "info": (
61
+ 50: #f0f9ff, 100: #e0f2fe, 200: #bae6fd, 300: #7dd3fc, 400: #38bdf8,
62
+ 500: #0ea5e9, 600: #0284c7, 700: #0369a1, 800: #075985, 900: #0c4a6e, 950: #082f49
63
+ ),
64
+ // 中性 · 石板灰
65
+ "neutral": (
66
+ 0: #ffffff, 50: #f8fafc, 100: #f1f5f9, 200: #e2e8f0, 300: #cbd5e1,
67
+ 400: #94a3b8, 500: #64748b, 600: #475569, 700: #334155, 800: #1e293b,
68
+ 900: #0f172a, 950: #020617
69
+ )
70
+ ) !default;
71
+
72
+ /// 语义色主阶。
73
+ ///
74
+ /// v2 变化:语义实心色统一采用 700 阶 —— 因为 600 阶(如 #059669 / #d97706)
75
+ /// 与白色文字对比度不足 4.5:1。改用 700 阶后:
76
+ /// · 实心按钮/徽标上的白字全部达到 WCAG AA
77
+ /// · 语义文字色(.fanui-text-success 等)落在白底上也达到 4.5:1
78
+ /// 500/600 阶仍然保留为 `-vivid`,供渐变、光晕、图表等装饰场景使用。
79
+ $fanui-primary: fn.fanui-palette($fanui-palette, "primary", 700) !default;
80
+ $fanui-accent: fn.fanui-palette($fanui-palette, "accent", 600) !default;
81
+ $fanui-success: fn.fanui-palette($fanui-palette, "success", 700) !default;
82
+ $fanui-warning: fn.fanui-palette($fanui-palette, "warning", 700) !default;
83
+ $fanui-danger: fn.fanui-palette($fanui-palette, "danger", 700) !default;
84
+ $fanui-info: fn.fanui-palette($fanui-palette, "info", 700) !default;
85
+
86
+ /// 鲜亮色(装饰用途,不承担白字可读性义务)
87
+ $fanui-primary-vivid: fn.fanui-palette($fanui-palette, "primary", 500) !default;
88
+ $fanui-accent-vivid: fn.fanui-palette($fanui-palette, "accent", 500) !default;
89
+ $fanui-success-vivid: fn.fanui-palette($fanui-palette, "success", 500) !default;
90
+ $fanui-warning-vivid: fn.fanui-palette($fanui-palette, "warning", 500) !default;
91
+ $fanui-danger-vivid: fn.fanui-palette($fanui-palette, "danger", 500) !default;
92
+ $fanui-info-vivid: fn.fanui-palette($fanui-palette, "info", 500) !default;
93
+
94
+ /// 语义色集合,供按钮/徽标/警告框等变体批量生成
95
+ $fanui-theme-colors: (
96
+ "primary": $fanui-primary,
97
+ "accent": $fanui-accent,
98
+ "success": $fanui-success,
99
+ "warning": $fanui-warning,
100
+ "danger": $fanui-danger,
101
+ "info": $fanui-info
102
+ ) !default;
103
+
104
+ /// 语义色对应的鲜亮色
105
+ $fanui-theme-colors-vivid: (
106
+ "primary": $fanui-primary-vivid,
107
+ "accent": $fanui-accent-vivid,
108
+ "success": $fanui-success-vivid,
109
+ "warning": $fanui-warning-vivid,
110
+ "danger": $fanui-danger-vivid,
111
+ "info": $fanui-info-vivid
112
+ ) !default;
113
+
114
+ // -----------------------------------------------------------------------------
115
+ // 2. 断点 (Breakpoints) —— 移动优先
116
+ // -----------------------------------------------------------------------------
117
+
118
+ $fanui-breakpoints: (
119
+ "xs": 0,
120
+ "sm": 576px,
121
+ "md": 768px,
122
+ "lg": 992px,
123
+ "xl": 1200px,
124
+ "xxl": 1400px
125
+ ) !default;
126
+
127
+ /// 容器在各断点下的最大宽度
128
+ $fanui-container-max-widths: (
129
+ "sm": 540px,
130
+ "md": 720px,
131
+ "lg": 960px,
132
+ "xl": 1140px,
133
+ "xxl": 1320px
134
+ ) !default;
135
+
136
+ $fanui-container-padding-x: 16px !default;
137
+ $fanui-container-fluid-max: 100% !default;
138
+
139
+ /// 栅格
140
+ $fanui-grid-columns: 12 !default;
141
+ $fanui-grid-gutter-x: 24px !default;
142
+ $fanui-grid-gutter-y: 0 !default;
143
+
144
+ // -----------------------------------------------------------------------------
145
+ // 3. 间距标尺 (Spacing) —— 4px 基准栅格
146
+ // -----------------------------------------------------------------------------
147
+
148
+ $fanui-spacer: 4px !default;
149
+
150
+ $fanui-spacers: (
151
+ 0: 0,
152
+ 1: 4px,
153
+ 2: 8px,
154
+ 3: 12px,
155
+ 4: 16px,
156
+ 5: 20px,
157
+ 6: 24px,
158
+ 7: 28px,
159
+ 8: 32px,
160
+ 10: 40px,
161
+ 12: 48px,
162
+ 16: 64px,
163
+ 20: 80px,
164
+ 24: 96px,
165
+ "auto": auto
166
+ ) !default;
167
+
168
+ /// 供间距工具类生成的子集(不含 auto)
169
+ $fanui-spacers-utilities: (
170
+ 0: 0, 1: 4px, 2: 8px, 3: 12px, 4: 16px, 5: 20px, 6: 24px,
171
+ 8: 32px, 10: 40px, 12: 48px, 16: 64px, 20: 80px, 24: 96px
172
+ ) !default;
173
+
174
+ // -----------------------------------------------------------------------------
175
+ // 4. 字体排版 (Typography)
176
+ // -----------------------------------------------------------------------------
177
+
178
+ $fanui-font-family-sans: (
179
+ -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC",
180
+ "Hiragino Sans GB", "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial,
181
+ sans-serif, "Apple Color Emoji", "Segoe UI Emoji"
182
+ ) !default;
183
+
184
+ $fanui-font-family-serif: (
185
+ Georgia, Cambria, "Times New Roman", "Songti SC", "SimSun", serif
186
+ ) !default;
187
+
188
+ $fanui-font-family-mono: (
189
+ ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas,
190
+ "Liberation Mono", "Courier New", monospace
191
+ ) !default;
192
+
193
+ $fanui-font-family-base: $fanui-font-family-sans !default;
194
+
195
+ /// 字号标尺(推荐:配合 token 以 rem 输出)
196
+ $fanui-font-sizes: (
197
+ "xs": 12px,
198
+ "sm": 13px,
199
+ "base": 14px,
200
+ "md": 16px,
201
+ "lg": 18px,
202
+ "xl": 20px,
203
+ "2xl": 24px,
204
+ "3xl": 30px,
205
+ "4xl": 36px,
206
+ "5xl": 48px,
207
+ "6xl": 60px
208
+ ) !default;
209
+
210
+ $fanui-font-size-root: 16px !default;
211
+ $fanui-line-height-base: 1.5715 !default;
212
+
213
+ /// 行高标尺
214
+ $fanui-line-heights: (
215
+ "none": 1,
216
+ "tight": 1.25,
217
+ "snug": 1.375,
218
+ "normal": 1.5,
219
+ "base": 1.5715,
220
+ "relaxed": 1.625,
221
+ "loose": 2
222
+ ) !default;
223
+
224
+ /// 字重标尺
225
+ $fanui-font-weights: (
226
+ "light": 300,
227
+ "normal": 400,
228
+ "medium": 500,
229
+ "semibold": 600,
230
+ "bold": 700,
231
+ "extrabold": 800
232
+ ) !default;
233
+
234
+ /// 字距
235
+ $fanui-letter-spacings: (
236
+ "tighter": -0.05em,
237
+ "tight": -0.025em,
238
+ "normal": 0,
239
+ "wide": 0.025em,
240
+ "wider": 0.05em,
241
+ "widest": 0.1em
242
+ ) !default;
243
+
244
+ $fanui-heading-margin-bottom: 0.5em !default;
245
+ $fanui-heading-font-weight: map.get($fanui-font-weights, "semibold") !default;
246
+ $fanui-heading-line-height: 1.25 !default;
247
+ $fanui-paragraph-margin-bottom: 1em !default;
248
+
249
+ // -----------------------------------------------------------------------------
250
+ // 5. 圆角 (Radius)
251
+ // -----------------------------------------------------------------------------
252
+
253
+ $fanui-radius-none: 0 !default;
254
+ $fanui-radius-sm: 2px !default;
255
+ $fanui-radius-base: 6px !default;
256
+ $fanui-radius-md: 8px !default;
257
+ $fanui-radius-lg: 12px !default;
258
+ $fanui-radius-xl: 16px !default;
259
+ $fanui-radius-2xl: 24px !default;
260
+ $fanui-radius-full: 9999px !default;
261
+
262
+ $fanui-radii: (
263
+ "none": $fanui-radius-none,
264
+ "sm": $fanui-radius-sm,
265
+ "base": $fanui-radius-base,
266
+ "md": $fanui-radius-md,
267
+ "lg": $fanui-radius-lg,
268
+ "xl": $fanui-radius-xl,
269
+ "2xl": $fanui-radius-2xl,
270
+ "full": $fanui-radius-full
271
+ ) !default;
272
+
273
+ // -----------------------------------------------------------------------------
274
+ // 6. 阴影 (Elevation)
275
+ // -----------------------------------------------------------------------------
276
+
277
+ $fanui-shadow-xs: 0 1px 2px 0 rgba(15, 23, 42, 0.05) !default;
278
+ $fanui-shadow-sm: 0 1px 3px 0 rgba(15, 23, 42, 0.10), 0 1px 2px -1px rgba(15, 23, 42, 0.10) !default;
279
+ $fanui-shadow-base: 0 4px 6px -1px rgba(15, 23, 42, 0.10), 0 2px 4px -2px rgba(15, 23, 42, 0.06) !default;
280
+ $fanui-shadow-md: 0 6px 12px -2px rgba(15, 23, 42, 0.12), 0 3px 6px -3px rgba(15, 23, 42, 0.08) !default;
281
+ $fanui-shadow-lg: 0 12px 20px -4px rgba(15, 23, 42, 0.14), 0 4px 8px -4px rgba(15, 23, 42, 0.08) !default;
282
+ $fanui-shadow-xl: 0 20px 32px -8px rgba(15, 23, 42, 0.18), 0 8px 16px -8px rgba(15, 23, 42, 0.10) !default;
283
+ $fanui-shadow-2xl: 0 32px 64px -16px rgba(15, 23, 42, 0.24) !default;
284
+ $fanui-shadow-inner: inset 0 2px 4px 0 rgba(15, 23, 42, 0.06) !default;
285
+
286
+ $fanui-shadows: (
287
+ "none": none,
288
+ "xs": $fanui-shadow-xs,
289
+ "sm": $fanui-shadow-sm,
290
+ "base": $fanui-shadow-base,
291
+ "md": $fanui-shadow-md,
292
+ "lg": $fanui-shadow-lg,
293
+ "xl": $fanui-shadow-xl,
294
+ "2xl": $fanui-shadow-2xl,
295
+ "inner": $fanui-shadow-inner
296
+ ) !default;
297
+
298
+ // -----------------------------------------------------------------------------
299
+ // 7. 层级 (z-index)
300
+ // -----------------------------------------------------------------------------
301
+
302
+ $fanui-zindex-dropdown: 1000 !default;
303
+ $fanui-zindex-sticky: 1020 !default;
304
+ $fanui-zindex-fixed: 1030 !default;
305
+ $fanui-zindex-backdrop: 1040 !default;
306
+ $fanui-zindex-offcanvas: 1050 !default;
307
+ $fanui-zindex-modal: 1060 !default;
308
+ $fanui-zindex-popover: 1070 !default;
309
+ $fanui-zindex-tooltip: 1080 !default;
310
+ $fanui-zindex-toast: 1090 !default;
311
+
312
+ $fanui-zindexes: (
313
+ "dropdown": $fanui-zindex-dropdown,
314
+ "sticky": $fanui-zindex-sticky,
315
+ "fixed": $fanui-zindex-fixed,
316
+ "backdrop": $fanui-zindex-backdrop,
317
+ "offcanvas": $fanui-zindex-offcanvas,
318
+ "modal": $fanui-zindex-modal,
319
+ "popover": $fanui-zindex-popover,
320
+ "tooltip": $fanui-zindex-tooltip,
321
+ "toast": $fanui-zindex-toast
322
+ ) !default;
323
+
324
+ // -----------------------------------------------------------------------------
325
+ // 8. 动效 (Motion)
326
+ // -----------------------------------------------------------------------------
327
+
328
+ $fanui-duration-instant: 100ms !default;
329
+ $fanui-duration-fast: 150ms !default;
330
+ $fanui-duration-base: 200ms !default;
331
+ $fanui-duration-slow: 300ms !default;
332
+ $fanui-duration-slower: 500ms !default;
333
+
334
+ $fanui-ease-linear: linear !default;
335
+ $fanui-ease-in: cubic-bezier(0.4, 0, 1, 1) !default;
336
+ $fanui-ease-out: cubic-bezier(0, 0, 0.2, 1) !default;
337
+ $fanui-ease-in-out: cubic-bezier(0.4, 0, 0.2, 1) !default;
338
+ $fanui-ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1) !default;
339
+ $fanui-ease-base: $fanui-ease-in-out !default;
340
+
341
+ $fanui-durations: (
342
+ "instant": $fanui-duration-instant,
343
+ "fast": $fanui-duration-fast,
344
+ "base": $fanui-duration-base,
345
+ "slow": $fanui-duration-slow,
346
+ "slower": $fanui-duration-slower
347
+ ) !default;
348
+
349
+ // -----------------------------------------------------------------------------
350
+ // 9. 组件级尺寸与外观
351
+ // -----------------------------------------------------------------------------
352
+
353
+ /// 控件高度标尺
354
+ $fanui-control-heights: (
355
+ "xs": 24px,
356
+ "sm": 28px,
357
+ "md": 32px,
358
+ "base": 36px,
359
+ "lg": 40px,
360
+ "xl": 48px
361
+ ) !default;
362
+
363
+ $fanui-control-height-base: 36px !default;
364
+ $fanui-control-padding-x: 14px !default;
365
+ $fanui-control-font-size: map.get($fanui-font-sizes, "base") !default;
366
+ $fanui-control-line-height: 1.5 !default;
367
+ $fanui-control-radius: $fanui-radius-base !default;
368
+ $fanui-control-border-width: 1px !default;
369
+
370
+ /// 焦点环
371
+ $fanui-focus-ring-width: 3px !default;
372
+ $fanui-focus-ring-offset: 1px !default;
373
+ $fanui-focus-ring-alpha: 0.30 !default;
374
+
375
+ /// 边框
376
+ $fanui-border-width: 1px !default;
377
+ $fanui-border-width-thick: 2px !default;
378
+
379
+ /// 遮罩
380
+ $fanui-backdrop-bg: rgba(15, 23, 42, 0.55) !default;
381
+ $fanui-backdrop-blur: 2px !default;
382
+
383
+ /// 模态框
384
+ $fanui-modal-widths: (
385
+ "sm": 380px,
386
+ "base": 520px,
387
+ "lg": 720px,
388
+ "xl": 960px,
389
+ "full": 100%
390
+ ) !default;
391
+
392
+ /// 表格
393
+ $fanui-table-cell-padding-y: 10px !default;
394
+ $fanui-table-cell-padding-x: 14px !default;
395
+
396
+ /// 字体渲染
397
+ $fanui-body-font-smoothing: true !default;
398
+ $fanui-enable-transitions: true !default;
399
+ $fanui-enable-dark-mode: true !default;
400
+
401
+ /// 暗色模式选择器(可换成 `.dark`、`.theme-dark` 等)
402
+ $fanui-dark-selector: '[data-fanui-theme="dark"]' !default;
403
+
404
+ // -----------------------------------------------------------------------------
405
+ // 10. 浅色 / 暗色主题语义令牌
406
+ // -----------------------------------------------------------------------------
407
+
408
+ /// 浅色主题(默认)
409
+ ///
410
+ /// v2.1 无障碍修正(C1):`color-text-subtle` / `color-disabled-text` 原先取 neutral 400
411
+ /// (#94a3b8),落在最常见的浅色底(--color-bg #f1f5f9 / --color-bg-subtle #f8fafc /
412
+ /// 白底 #ffffff)上只有 2.4 ~ 2.6 : 1,正文级(< 18.66px)达不到 WCAG AA 4.5:1。
413
+ /// 现改用中性阶 500 与 600 之间的 #5b6b80:白底 5.44、#f8fafc 5.20、#f1f5f9 4.97,
414
+ /// 三档底色全部达标,同时仍明显轻于 `color-text-muted`(#475569),保留层级。
415
+ $fanui-theme-light: (
416
+ "color-bg": fn.fanui-palette($fanui-palette, "neutral", 100),
417
+ "color-bg-subtle": fn.fanui-palette($fanui-palette, "neutral", 50),
418
+ "color-surface": fn.fanui-palette($fanui-palette, "neutral", 0),
419
+ "color-surface-raised": fn.fanui-palette($fanui-palette, "neutral", 0),
420
+ "color-surface-sunken": fn.fanui-palette($fanui-palette, "neutral", 100),
421
+ "color-overlay": fn.fanui-palette($fanui-palette, "neutral", 0),
422
+ "color-text": fn.fanui-palette($fanui-palette, "neutral", 900),
423
+ "color-text-strong": fn.fanui-palette($fanui-palette, "neutral", 950),
424
+ "color-text-muted": fn.fanui-palette($fanui-palette, "neutral", 600),
425
+ "color-text-subtle": #5b6b80,
426
+ "color-text-inverse": fn.fanui-palette($fanui-palette, "neutral", 0),
427
+ "color-border": fn.fanui-palette($fanui-palette, "neutral", 200),
428
+ "color-border-subtle": fn.fanui-palette($fanui-palette, "neutral", 100),
429
+ "color-border-strong": fn.fanui-palette($fanui-palette, "neutral", 300),
430
+ "color-hover": fn.fanui-palette($fanui-palette, "neutral", 100),
431
+ "color-active": fn.fanui-palette($fanui-palette, "neutral", 200),
432
+ "color-disabled-bg": fn.fanui-palette($fanui-palette, "neutral", 100),
433
+ "color-disabled-text": #5b6b80
434
+ ) !default;
435
+
436
+ /// 暗色主题
437
+ ///
438
+ /// v2.1 无障碍修正(C1):`color-text-subtle` 原先取 neutral 500 (#64748b),
439
+ /// 在 --color-bg #020617 / --color-surface #0f172a 上只有 4.23 / 3.75 : 1。
440
+ /// 现改用 #8592a6:两档底色分别 5.99 / 5.66,达标且仍轻于 muted (#94a3b8)。
441
+ /// `color-disabled-text` 同理从 neutral 600 (#475569) 提亮到 #8592a6,
442
+ /// 在 --color-disabled-bg #1a2332 上由 2.08 提升到 5.01。
443
+ $fanui-theme-dark: (
444
+ "color-bg": fn.fanui-palette($fanui-palette, "neutral", 950),
445
+ "color-bg-subtle": fn.fanui-palette($fanui-palette, "neutral", 900),
446
+ "color-surface": fn.fanui-palette($fanui-palette, "neutral", 900),
447
+ "color-surface-raised": fn.fanui-palette($fanui-palette, "neutral", 800),
448
+ "color-surface-sunken": fn.fanui-palette($fanui-palette, "neutral", 950),
449
+ "color-overlay": fn.fanui-palette($fanui-palette, "neutral", 800),
450
+ "color-text": #e8edf5,
451
+ "color-text-strong": #ffffff,
452
+ "color-text-muted": fn.fanui-palette($fanui-palette, "neutral", 400),
453
+ "color-text-subtle": #8592a6,
454
+ "color-text-inverse": fn.fanui-palette($fanui-palette, "neutral", 950),
455
+ "color-border": #2b3648,
456
+ "color-border-subtle": #222c3c,
457
+ "color-border-strong": #3d4a60,
458
+ "color-hover": #1d2736,
459
+ "color-active": #26313f,
460
+ "color-disabled-bg": #1a2332,
461
+ "color-disabled-text": #8592a6
462
+ ) !default;
463
+
464
+ /// 暗色主题下的语义色(提亮,保证暗背景可读)
465
+ $fanui-theme-dark-colors: (
466
+ "primary": fn.fanui-palette($fanui-palette, "primary", 400),
467
+ "accent": fn.fanui-palette($fanui-palette, "accent", 400),
468
+ "success": fn.fanui-palette($fanui-palette, "success", 400),
469
+ "warning": fn.fanui-palette($fanui-palette, "warning", 400),
470
+ "danger": fn.fanui-palette($fanui-palette, "danger", 400),
471
+ "info": fn.fanui-palette($fanui-palette, "info", 400)
472
+ ) !default;
473
+
474
+ /// 参与「全套角色令牌」输出的语义色名单(primary / accent 由主题色系统驱动,不在此列)
475
+ $fanui-semantic-names: ("success", "warning", "danger", "info") !default;
476
+
477
+ // -----------------------------------------------------------------------------
478
+ // 11. 液态玻璃 (Liquid Glass) 配置
479
+ // -----------------------------------------------------------------------------
480
+
481
+ /// 开启了玻璃材质的组件默认预设:thin | regular | thick | ultra | lens
482
+ $fanui-glass-default-preset: "regular" !default;
483
+
484
+ /// 玻璃是否启用镜面高光跟随指针(需要 data-fanui-glass-track 属性,由 JS 驱动)
485
+ $fanui-glass-enable-tracking: true !default;
486
+
487
+ /// 玻璃是否启用「液体流动」动画(.fanui-glass--flow)
488
+ $fanui-glass-enable-flow: true !default;
489
+
490
+ /// 玻璃材质的圆角(与全局圆角保持同一标尺)
491
+ $fanui-glass-radius: $fanui-radius-lg !default;