@wil-works/evoke-ui 0.1.0 → 0.2.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.
package/dist/evoke-ui.css CHANGED
@@ -267,6 +267,15 @@ html.dark {
267
267
 
268
268
  --ew-focus-ring: 0 0 0 2px rgba(var(--ew-color-primary-rgb), 0.45);
269
269
  }
270
+
271
+ /* ═══ 磨砂(glass)配方令牌:容器 is-glass 态取值,明暗共用;
272
+ 全局开关 = ConfigProvider glass / useThemeConfig.setGlass(html[data-ew-glass]) ═══ */
273
+ :root {
274
+ --ew-glass-blur: 16px;
275
+ --ew-glass-saturate: 1.5;
276
+ /* 磨砂底色一次配好:color-mix 的百分比不能走 var(),必须整体出令牌 */
277
+ --ew-glass-bg: color-mix(in srgb, var(--ew-bg-container) 72%, transparent);
278
+ }
270
279
  /* 工具类(容器/焦点/滚动条/reveal 浮现) */
271
280
  /* ============================================
272
281
  Evoke UI — 工具类与通用层
@@ -494,6 +503,11 @@ to { transform: rotate(360deg);
494
503
  transform: scale(0.98);
495
504
  }
496
505
 
506
+ /* ─── 链接形态(href 传入时渲染为 <a>) ─── */
507
+ a.ew-button {
508
+ text-decoration: none;
509
+ }
510
+
497
511
  /* ─── 尺寸 ─── */
498
512
  .ew-button--small {
499
513
  height: 32px;
@@ -914,6 +928,17 @@ html.dark .ew-icon-button.is-dark:hover {
914
928
  box-shadow: var(--ew-shadow-3);
915
929
  border-color: var(--ew-border-color);
916
930
  }
931
+
932
+ /* ─── 磨砂(glass):ConfigProvider 全局开关(html[data-ew-glass])或组件 glass prop;
933
+ backdrop-filter 不可用时整条不生效,自动回落实底 ─── */
934
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
935
+ .ew-card.is-glass,
936
+ html[data-ew-glass='on'] .ew-card:not(.no-glass) {
937
+ background-color: var(--ew-glass-bg);
938
+ -webkit-backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
939
+ backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
940
+ }
941
+ }
917
942
  /* EwSection — 内容区块 */
918
943
  .ew-section {
919
944
  margin-bottom: 96px;
@@ -969,9 +994,26 @@ html.dark .ew-icon-button.is-dark:hover {
969
994
  padding-top: 0;
970
995
  border-top: none;
971
996
  font-size: clamp(26px, 3vw, 34px);
997
+ font-weight: var(--ew-display-weight);
998
+ letter-spacing: var(--ew-display-letter-spacing);
999
+ line-height: var(--ew-display-line-height);
972
1000
  }
973
1001
  .ew-section .ew-section__description {
974
1002
  margin: 0;
1003
+ font-size: var(--ew-font-size-md);
1004
+ line-height: 1.75;
1005
+ color: var(--ew-text-secondary);
1006
+ }
1007
+
1008
+ /* ─── 磨砂(glass):ConfigProvider 全局开关(html[data-ew-glass])或组件 glass prop;
1009
+ backdrop-filter 不可用时整条不生效,自动回落实底 ─── */
1010
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
1011
+ .ew-section.is-glass,
1012
+ html[data-ew-glass='on'] .ew-section:not(.no-glass) {
1013
+ background-color: var(--ew-glass-bg);
1014
+ -webkit-backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
1015
+ backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
1016
+ }
975
1017
  }
976
1018
  /* EwNavbar — 站点导航 */
977
1019
  .ew-navbar {
@@ -1061,6 +1103,37 @@ html.dark .ew-icon-button.is-dark:hover {
1061
1103
  color: var(--ew-color-primary);
1062
1104
  }
1063
1105
 
1106
+ /* <a> 形态的自防御:宿主页(浏览器默认样式、文档站 .vp-doc a)会给链接
1107
+ 加下划线、链接色和 500 字重,这里的优先级必须压得过 .vp-doc a / .vp-doc a:hover */
1108
+ .ew-navbar a.ew-navbar__logo,
1109
+ .ew-navbar a.ew-navbar__link,
1110
+ .ew-navbar a.ew-navbar__mobile-link {
1111
+ text-decoration: none;
1112
+ }
1113
+ .ew-navbar a.ew-navbar__logo {
1114
+ color: var(--ew-text-primary);
1115
+ font-weight: var(--ew-display-weight-strong);
1116
+ letter-spacing: var(--ew-display-letter-spacing);
1117
+ }
1118
+ .ew-navbar a.ew-navbar__link {
1119
+ color: var(--ew-text-regular);
1120
+ font-weight: var(--ew-font-weight-regular);
1121
+ }
1122
+ .ew-navbar a.ew-navbar__link:hover {
1123
+ color: var(--ew-text-primary);
1124
+ }
1125
+ .ew-navbar a.ew-navbar__link.is-active {
1126
+ color: var(--ew-color-primary);
1127
+ }
1128
+ .ew-navbar a.ew-navbar__mobile-link {
1129
+ color: var(--ew-text-regular);
1130
+ font-weight: var(--ew-font-weight-medium);
1131
+ }
1132
+ .ew-navbar a.ew-navbar__mobile-link:hover {
1133
+ color: var(--ew-text-primary);
1134
+ background-color: var(--ew-bg-hover);
1135
+ }
1136
+
1064
1137
  /* ─── 右侧动作区 ─── */
1065
1138
  .ew-navbar__actions {
1066
1139
  display: flex;
@@ -1114,6 +1187,17 @@ html.dark .ew-icon-button.is-dark:hover {
1114
1187
  opacity: 0;
1115
1188
  transform: translateY(-6px);
1116
1189
  }
1190
+
1191
+ /* ─── 磨砂(glass):ConfigProvider 全局开关(html[data-ew-glass])或组件 glass prop;
1192
+ backdrop-filter 不可用时整条不生效,自动回落实底 ─── */
1193
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
1194
+ .ew-navbar.is-glass,
1195
+ html[data-ew-glass='on'] .ew-navbar:not(.no-glass) {
1196
+ background-color: var(--ew-glass-bg);
1197
+ -webkit-backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
1198
+ backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
1199
+ }
1200
+ }
1117
1201
  /* EwFooter — 站点页脚 */
1118
1202
  .ew-footer {
1119
1203
  padding: 80px 0 40px;
@@ -1206,10 +1290,37 @@ html.dark .ew-icon-button.is-dark:hover {
1206
1290
  .ew-footer .ew-footer__slogan {
1207
1291
  margin: var(--ew-space-3) 0 0;
1208
1292
  font-size: var(--ew-font-size-sm);
1293
+ line-height: 1.7;
1294
+ color: var(--ew-text-secondary);
1209
1295
  }
1210
1296
  .ew-footer .ew-footer__col-title {
1211
1297
  margin: 0 0 var(--ew-space-2);
1212
1298
  font-size: var(--ew-font-size-xs);
1299
+ font-weight: var(--ew-font-weight-medium);
1300
+ letter-spacing: 0.14em;
1301
+ color: var(--ew-text-secondary);
1302
+ }
1303
+
1304
+ /* 链接渲染为 <a>:压过宿主链接样式的颜色/下划线/字重 */
1305
+ .ew-footer a.ew-footer__link {
1306
+ font-size: var(--ew-font-size-sm);
1307
+ font-weight: var(--ew-font-weight-regular);
1308
+ color: var(--ew-text-secondary);
1309
+ text-decoration: none;
1310
+ }
1311
+ .ew-footer a.ew-footer__link:hover {
1312
+ color: var(--ew-text-primary);
1313
+ }
1314
+
1315
+ /* ─── 磨砂(glass):ConfigProvider 全局开关(html[data-ew-glass])或组件 glass prop;
1316
+ backdrop-filter 不可用时整条不生效,自动回落实底 ─── */
1317
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
1318
+ .ew-footer.is-glass,
1319
+ html[data-ew-glass='on'] .ew-footer:not(.no-glass) {
1320
+ background-color: var(--ew-glass-bg);
1321
+ -webkit-backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
1322
+ backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
1323
+ }
1213
1324
  }
1214
1325
  /* EwHero — 首屏区块 */
1215
1326
  .ew-hero {
@@ -1309,6 +1420,8 @@ html.dark .ew-icon-button.is-dark:hover {
1309
1420
  .ew-hero .ew-hero__description {
1310
1421
  margin: var(--ew-space-5) 0 0;
1311
1422
  font-size: 17px;
1423
+ line-height: 1.75;
1424
+ color: var(--ew-text-secondary);
1312
1425
  }
1313
1426
  /* EwSelect — 下拉选择 */
1314
1427
  .ew-select {
@@ -1495,8 +1608,34 @@ html.dark .ew-icon-button.is-dark:hover {
1495
1608
  outline-offset: 2px;
1496
1609
  border-radius: var(--ew-radius-sm);
1497
1610
  }
1611
+
1612
+ /* ─── 边框激活波纹:聚焦时边框向外扩散两圈涟漪;
1613
+ 全局关闭 html[data-ew-ripple='off'];prefers-reduced-motion 自动停用 ─── */
1614
+ .ew-select::after {
1615
+ content: '';
1616
+ position: absolute;
1617
+ inset: -3px;
1618
+ border-radius: inherit;
1619
+ border: 1px solid color-mix(in srgb, var(--ew-color-primary) 45%, transparent);
1620
+ opacity: 0;
1621
+ pointer-events: none;
1622
+ }
1623
+ @media (prefers-reduced-motion: no-preference) {
1624
+ html:not([data-ew-ripple='off']) .ew-select:focus-within, .ew-select.is-open::after {
1625
+ animation: ew-border-ripple 0.7s ease-out 2;
1626
+ }
1627
+ }
1628
+ @keyframes ew-border-ripple {
1629
+ 0% { opacity: 0.9; transform: scale(1);
1630
+ }
1631
+ 70% { opacity: 0.25;
1632
+ }
1633
+ 100% { opacity: 0; transform: scale(1.04);
1634
+ }
1635
+ }
1498
1636
  /* EwSearchBox — 大搜索框(remixicon 签名组件) */
1499
1637
  .ew-search-box {
1638
+ position: relative;
1500
1639
  display: flex;
1501
1640
  align-items: center;
1502
1641
  gap: var(--ew-space-4);
@@ -1575,6 +1714,87 @@ html.dark .ew-icon-button.is-dark:hover {
1575
1714
  padding-left: var(--ew-space-4);
1576
1715
  border-left: 1px solid var(--ew-border-color-light);
1577
1716
  }
1717
+
1718
+ /* ─── 边框激活波纹:聚焦时边框向外扩散两圈涟漪;
1719
+ 全局关闭 html[data-ew-ripple='off'];prefers-reduced-motion 自动停用 ─── */
1720
+ /* 定位锚点:波纹环定位参考 */
1721
+ .ew-search-box {
1722
+ position: relative;
1723
+ }
1724
+ .ew-search-box::after {
1725
+ content: '';
1726
+ position: absolute;
1727
+ inset: -3px;
1728
+ border-radius: inherit;
1729
+ border: 1px solid color-mix(in srgb, var(--ew-color-primary) 45%, transparent);
1730
+ opacity: 0;
1731
+ pointer-events: none;
1732
+ }
1733
+ @media (prefers-reduced-motion: no-preference) {
1734
+ html:not([data-ew-ripple='off']) .ew-search-box:focus-within::after {
1735
+ animation: ew-border-ripple 0.7s ease-out 2;
1736
+ }
1737
+ }
1738
+ @keyframes ew-border-ripple {
1739
+ 0% { opacity: 0.9; transform: scale(1);
1740
+ }
1741
+ 70% { opacity: 0.25;
1742
+ }
1743
+ 100% { opacity: 0; transform: scale(1.04);
1744
+ }
1745
+ }
1746
+
1747
+ /* ─── 远程搜索结果下拉(select 菜单同款语言) ─── */
1748
+ .ew-search-box__dropdown {
1749
+ position: absolute;
1750
+ top: calc(100% + 8px);
1751
+ left: 0;
1752
+ right: 0;
1753
+ z-index: var(--ew-z-index-overlay, 2000);
1754
+ margin: 0;
1755
+ padding: 5px;
1756
+ list-style: none;
1757
+ border: 1px solid var(--ew-border-color-light);
1758
+ border-radius: var(--ew-radius-md);
1759
+ background-color: var(--ew-bg-container);
1760
+ box-shadow: var(--ew-shadow-2);
1761
+ max-height: 320px;
1762
+ overflow-y: auto;
1763
+ }
1764
+ .ew-search-box__option {
1765
+ display: flex;
1766
+ flex-direction: column;
1767
+ gap: 2px;
1768
+ width: 100%;
1769
+ padding: 9px 12px;
1770
+ border: none;
1771
+ border-radius: var(--ew-radius-sm);
1772
+ background: transparent;
1773
+ text-align: left;
1774
+ cursor: pointer;
1775
+ }
1776
+ .ew-search-box__option-title {
1777
+ font-size: var(--ew-font-size-sm);
1778
+ font-weight: var(--ew-font-weight-medium);
1779
+ color: var(--ew-text-primary);
1780
+ }
1781
+ .ew-search-box__option-desc {
1782
+ font-size: var(--ew-font-size-xs);
1783
+ color: var(--ew-text-secondary);
1784
+ }
1785
+ .ew-search-box__option.is-active {
1786
+ background-color: var(--ew-color-primary-light-9);
1787
+ }
1788
+ .ew-search-box__option.is-active .ew-search-box__option-title {
1789
+ color: var(--ew-color-primary);
1790
+ }
1791
+ .ew-search-box__option.is-state {
1792
+ padding: 12px;
1793
+ text-align: center;
1794
+ font-size: var(--ew-font-size-sm);
1795
+ color: var(--ew-text-secondary);
1796
+ cursor: default;
1797
+ }
1578
1798
  /* EwIconGrid — 可搜索图标网格(remixicon 核心界面语言) */
1579
1799
  .ew-icon-grid__search {
1580
1800
  margin-bottom: 56px;
@@ -1699,6 +1919,10 @@ html.dark .ew-icon-button.is-dark:hover {
1699
1919
  .ew-icon-grid .ew-icon-grid__title {
1700
1920
  margin: 0 0 var(--ew-space-5);
1701
1921
  font-size: var(--ew-font-size-md);
1922
+ font-weight: var(--ew-font-weight-regular);
1923
+ letter-spacing: 0;
1924
+ line-height: 1.7;
1925
+ color: var(--ew-text-primary);
1702
1926
  }
1703
1927
  /* EwFeatureGrid — 特性展示 */
1704
1928
 
@@ -1945,16 +2169,37 @@ html.dark .ew-icon-button.is-dark:hover {
1945
2169
  .ew-pricing-card .ew-pricing-card__title {
1946
2170
  margin: 0;
1947
2171
  font-size: var(--ew-font-size-xl);
2172
+ font-weight: var(--ew-display-weight-strong);
2173
+ letter-spacing: var(--ew-display-letter-spacing);
2174
+ line-height: var(--ew-display-line-height);
2175
+ color: var(--ew-text-primary);
1948
2176
  }
1949
2177
  .ew-pricing-card .ew-pricing-card__description {
1950
2178
  margin: var(--ew-space-2) 0 0;
1951
2179
  font-size: var(--ew-font-size-sm);
2180
+ line-height: 1.7;
2181
+ color: var(--ew-text-secondary);
1952
2182
  }
1953
2183
  .ew-pricing-card .ew-pricing-card__features {
1954
2184
  margin: var(--ew-space-5) 0;
1955
2185
  padding: 0;
1956
2186
  list-style: none;
1957
2187
  }
2188
+ .ew-pricing-card .ew-pricing-card__feature {
2189
+ margin: 0;
2190
+ padding: 0;
2191
+ }
2192
+
2193
+ /* ─── 磨砂(glass):ConfigProvider 全局开关(html[data-ew-glass])或组件 glass prop;
2194
+ backdrop-filter 不可用时整条不生效,自动回落实底 ─── */
2195
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
2196
+ .ew-pricing-card.is-glass:not(.is-featured),
2197
+ html[data-ew-glass='on'] .ew-pricing-card:not(.no-glass):not(.is-featured) {
2198
+ background-color: var(--ew-glass-bg);
2199
+ -webkit-backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
2200
+ backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
2201
+ }
2202
+ }
1958
2203
  /* EwFaq — 常见问题手风琴 */
1959
2204
  .ew-faq {
1960
2205
  display: flex;
@@ -2384,6 +2629,15 @@ html.dark .ew-alert.is-pill .ew-alert__icon {
2384
2629
  border: none;
2385
2630
  font-size: var(--ew-font-size-base);
2386
2631
  }
2632
+
2633
+ /* <a> 形态来源链接:压过宿主链接样式(.vp-doc a 的下划线与链接色) */
2634
+ .ew-quote a.ew-quote__source {
2635
+ color: var(--ew-color-primary);
2636
+ text-decoration: none;
2637
+ }
2638
+ .ew-quote a.ew-quote__source:hover {
2639
+ color: var(--ew-color-primary-dark-2);
2640
+ }
2387
2641
  /* EwConfigProvider — 局部换肤包裹 */
2388
2642
  .ew-config-provider {
2389
2643
  display: block;
@@ -2703,10 +2957,16 @@ html.dark .ew-alert.is-pill .ew-alert__icon {
2703
2957
  .ew-timeline .ew-timeline__title {
2704
2958
  margin: 0;
2705
2959
  font-size: var(--ew-font-size-md);
2960
+ font-weight: var(--ew-font-weight-medium);
2961
+ letter-spacing: 0;
2962
+ line-height: var(--ew-display-line-height);
2963
+ color: var(--ew-text-primary);
2706
2964
  }
2707
2965
  .ew-timeline .ew-timeline__description {
2708
2966
  margin: var(--ew-space-1) 0 0;
2709
2967
  font-size: var(--ew-font-size-sm);
2968
+ line-height: 1.7;
2969
+ color: var(--ew-text-secondary);
2710
2970
  }
2711
2971
  /* EwComparisonTable — 功能对比表 */
2712
2972
  .ew-comparison-table {
@@ -2936,6 +3196,9 @@ html.dark .ew-alert.is-pill .ew-alert__icon {
2936
3196
  .ew-logo-cloud .ew-logo-cloud__title {
2937
3197
  margin: 0 0 var(--ew-space-6);
2938
3198
  font-size: var(--ew-font-size-sm);
3199
+ letter-spacing: 0.08em;
3200
+ line-height: 1.7;
3201
+ color: var(--ew-text-secondary);
2939
3202
  }
2940
3203
  /* EwVideo — 视频区块 */
2941
3204
  .ew-video {
@@ -3179,6 +3442,66 @@ html.dark .ew-audio__badge {
3179
3442
  width: 18px;
3180
3443
  background-color: var(--ew-color-primary);
3181
3444
  }
3445
+
3446
+ /* ─── image / banner 形态 ─── */
3447
+ /* 内部链路高度全部填满视口(aspect-ratio 决定可见高度),
3448
+ 保证 caption 的 bottom:0 锚定在可见区域内而不被裁掉 */
3449
+ .ew-carousel.is-media .ew-carousel__track,
3450
+ .ew-carousel.is-media .ew-carousel__slide,
3451
+ .ew-carousel.is-media .ew-carousel__banner,
3452
+ .ew-carousel.is-media .ew-carousel__img {
3453
+ height: 100%;
3454
+ }
3455
+ .ew-carousel__img {
3456
+ display: block;
3457
+ width: 100%;
3458
+ height: 100%;
3459
+ object-fit: cover;
3460
+ }
3461
+ .ew-carousel__banner {
3462
+ position: relative;
3463
+ height: 100%;
3464
+ overflow: hidden;
3465
+ }
3466
+ .ew-carousel__caption {
3467
+ position: absolute;
3468
+ inset: auto 0 0 0;
3469
+ display: flex;
3470
+ flex-direction: column;
3471
+ gap: 4px;
3472
+ padding: 64px 24px 18px;
3473
+ background: linear-gradient(180deg, rgba(10, 14, 24, 0) 0%, rgba(10, 14, 24, 0.78) 78%, rgba(10, 14, 24, 0.85) 100%);
3474
+ text-align: left;
3475
+ }
3476
+ .ew-carousel__caption-title {
3477
+ margin: 0;
3478
+ font-size: var(--ew-font-size-xl);
3479
+ font-weight: var(--ew-display-weight-strong);
3480
+ letter-spacing: var(--ew-display-letter-spacing);
3481
+ color: #ffffff;
3482
+ }
3483
+ .ew-carousel__caption-desc {
3484
+ margin: 0;
3485
+ font-size: var(--ew-font-size-sm);
3486
+ line-height: 1.6;
3487
+ color: rgba(255, 255, 255, 0.85);
3488
+ }
3489
+
3490
+ /* ─── 宿主环境屏蔽:文档站 .vp-doc h3/p 的字号/颜色/边距侵入注释区 ─── */
3491
+ .ew-carousel .ew-carousel__caption-title {
3492
+ margin: 0;
3493
+ font-size: var(--ew-font-size-xl);
3494
+ font-weight: var(--ew-display-weight-strong);
3495
+ letter-spacing: var(--ew-display-letter-spacing);
3496
+ line-height: var(--ew-display-line-height);
3497
+ color: #ffffff;
3498
+ }
3499
+ .ew-carousel .ew-carousel__caption-desc {
3500
+ margin: 0;
3501
+ font-size: var(--ew-font-size-sm);
3502
+ line-height: 1.6;
3503
+ color: rgba(255, 255, 255, 0.88);
3504
+ }
3182
3505
  /* EwArticleCard — 文章卡 */
3183
3506
  .ew-article-card {
3184
3507
  display: flex;
@@ -3271,10 +3594,34 @@ html.dark .ew-audio__badge {
3271
3594
  .ew-article-card .ew-article-card__title {
3272
3595
  margin: 0;
3273
3596
  font-size: var(--ew-font-size-md);
3597
+ font-weight: var(--ew-font-weight-medium);
3598
+ letter-spacing: 0;
3599
+ line-height: 1.4;
3600
+ color: var(--ew-text-primary);
3274
3601
  }
3275
3602
  .ew-article-card .ew-article-card__excerpt {
3276
3603
  margin: 0;
3277
3604
  font-size: var(--ew-font-size-sm);
3605
+ line-height: 1.7;
3606
+ color: var(--ew-text-secondary);
3607
+ }
3608
+
3609
+ /* 根元素渲染为 <a>(href 传入)时,压过宿主链接样式的字重/颜色/下划线 */
3610
+ a.ew-article-card {
3611
+ font-weight: var(--ew-font-weight-regular);
3612
+ color: inherit;
3613
+ text-decoration: none;
3614
+ }
3615
+
3616
+ /* ─── 磨砂(glass):ConfigProvider 全局开关(html[data-ew-glass])或组件 glass prop;
3617
+ backdrop-filter 不可用时整条不生效,自动回落实底 ─── */
3618
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
3619
+ .ew-article-card.is-glass,
3620
+ html[data-ew-glass='on'] .ew-article-card:not(.no-glass) {
3621
+ background-color: var(--ew-glass-bg);
3622
+ -webkit-backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
3623
+ backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
3624
+ }
3278
3625
  }
3279
3626
  /* EwProfileCard — 个人名片 */
3280
3627
  .ew-profile-card {
@@ -3331,55 +3678,504 @@ html.dark .ew-audio__badge {
3331
3678
  .ew-profile-card .ew-profile-card__name {
3332
3679
  margin: 0;
3333
3680
  font-size: var(--ew-font-size-lg);
3681
+ font-weight: var(--ew-display-weight-strong);
3682
+ letter-spacing: var(--ew-display-letter-spacing);
3683
+ line-height: var(--ew-display-line-height);
3684
+ color: var(--ew-text-primary);
3334
3685
  }
3335
3686
  .ew-profile-card .ew-profile-card__role {
3336
3687
  margin: 4px 0 0;
3337
3688
  font-size: var(--ew-font-size-sm);
3689
+ line-height: 1.7;
3690
+ color: var(--ew-text-secondary);
3338
3691
  }
3339
3692
  .ew-profile-card .ew-profile-card__bio {
3340
3693
  margin: var(--ew-space-3) 0 0;
3341
3694
  font-size: var(--ew-font-size-sm);
3695
+ line-height: 1.7;
3696
+ color: var(--ew-text-regular);
3342
3697
  }
3343
- /* EwMarquee — 无限滚动横幅 */
3344
- .ew-marquee {
3345
- position: relative;
3346
- overflow: hidden;
3347
- /* 两端淡出 */
3348
- --ew-marquee-mask: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
3349
- -webkit-mask-image: var(--ew-marquee-mask);
3350
- mask-image: var(--ew-marquee-mask);
3351
- }
3352
- .ew-marquee__track {
3353
- display: flex;
3354
- width: max-content;
3355
- animation: ew-marquee-scroll var(--ew-marquee-duration) linear infinite;
3356
- }
3357
- .ew-marquee.is-reverse .ew-marquee__track {
3358
- animation-direction: reverse;
3698
+
3699
+ /* ─── 磨砂(glass):ConfigProvider 全局开关(html[data-ew-glass])或组件 glass prop;
3700
+ backdrop-filter 不可用时整条不生效,自动回落实底 ─── */
3701
+ @supports ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
3702
+ .ew-profile-card.is-glass:not(.is-plain),
3703
+ html[data-ew-glass='on'] .ew-profile-card:not(.no-glass):not(.is-plain) {
3704
+ background-color: var(--ew-glass-bg);
3705
+ -webkit-backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
3706
+ backdrop-filter: blur(var(--ew-glass-blur)) saturate(var(--ew-glass-saturate));
3359
3707
  }
3360
- .ew-marquee.is-pausable:hover .ew-marquee__track {
3361
- animation-play-state: paused;
3362
3708
  }
3363
- .ew-marquee__group {
3364
- display: flex;
3365
- align-items: center;
3366
- flex-shrink: 0;
3367
- gap: var(--ew-space-6);
3368
- padding-right: var(--ew-space-6);
3709
+ /* EwArticle — 文章内容(长文阅读排版) */
3710
+ .ew-article {
3711
+ max-width: 760px;
3712
+ margin: 0 auto;
3369
3713
  }
3370
3714
 
3371
- /* ══════ 文本模式:商场 LED 大字横幅 ══════ */
3372
- .ew-marquee__text {
3373
- font-size: var(--ew-marquee-text-size, clamp(32px, 5vw, 56px));
3374
- font-weight: var(--ew-display-weight-strong);
3375
- letter-spacing: -0.02em;
3715
+ /* ─── 页头 ─── */
3716
+ .ew-article__eyebrow {
3717
+ margin-bottom: var(--ew-space-3);
3718
+ font-size: var(--ew-font-size-xs);
3719
+ font-weight: var(--ew-font-weight-medium);
3720
+ letter-spacing: 0.16em;
3376
3721
  text-transform: uppercase;
3377
- white-space: nowrap;
3378
- color: var(--ew-text-primary);
3379
- line-height: 1.15;
3722
+ color: var(--ew-text-secondary);
3380
3723
  }
3381
-
3382
- /* 描边字(奇数项):空心 + 描边,商场横幅的节奏感来源 */
3724
+ .ew-article__title {
3725
+ margin: 0 0 var(--ew-space-3);
3726
+ font-size: clamp(28px, 3.4vw, 38px);
3727
+ font-weight: var(--ew-display-weight);
3728
+ letter-spacing: var(--ew-display-letter-spacing);
3729
+ line-height: var(--ew-display-line-height);
3730
+ color: var(--ew-text-primary);
3731
+ }
3732
+ .ew-article__description {
3733
+ margin: 0 0 var(--ew-space-5);
3734
+ font-size: var(--ew-font-size-lg);
3735
+ line-height: 1.7;
3736
+ color: var(--ew-text-secondary);
3737
+ }
3738
+ .ew-article__meta {
3739
+ display: flex;
3740
+ align-items: center;
3741
+ flex-wrap: wrap;
3742
+ gap: var(--ew-space-3);
3743
+ padding-bottom: var(--ew-space-5);
3744
+ margin-bottom: var(--ew-space-6);
3745
+ border-bottom: 1px solid var(--ew-border-color-light);
3746
+ font-size: var(--ew-font-size-sm);
3747
+ color: var(--ew-text-secondary);
3748
+ }
3749
+ .ew-article__author {
3750
+ font-weight: var(--ew-font-weight-medium);
3751
+ color: var(--ew-text-primary);
3752
+ }
3753
+ .ew-article__tag {
3754
+ padding: 2px 10px;
3755
+ border-radius: var(--ew-radius-full);
3756
+ background-color: var(--ew-color-primary-light-9);
3757
+ color: var(--ew-color-primary);
3758
+ font-size: var(--ew-font-size-xs);
3759
+ }
3760
+
3761
+ /* ─── 正文阅读排版(作用域收敛,不外溢) ─── */
3762
+ .ew-article__body {
3763
+ font-size: var(--ew-font-size-md);
3764
+ line-height: 1.85;
3765
+ color: var(--ew-text-regular);
3766
+ }
3767
+ .ew-article__body h2,
3768
+ .ew-article__body h3 {
3769
+ margin: 2em 0 0.6em;
3770
+ font-weight: var(--ew-display-weight);
3771
+ letter-spacing: var(--ew-display-letter-spacing);
3772
+ line-height: var(--ew-display-line-height);
3773
+ color: var(--ew-text-primary);
3774
+ }
3775
+ .ew-article__body h2 {
3776
+ font-size: var(--ew-font-size-2xl, 24px);
3777
+ }
3778
+ .ew-article__body h3 {
3779
+ font-size: var(--ew-font-size-xl);
3780
+ }
3781
+ .ew-article__body p {
3782
+ margin: 0 0 1.1em;
3783
+ }
3784
+ .ew-article__body a {
3785
+ color: var(--ew-color-primary);
3786
+ text-decoration: underline;
3787
+ text-underline-offset: 3px;
3788
+ }
3789
+ .ew-article__body blockquote {
3790
+ margin: 1.4em 0;
3791
+ padding: 10px 18px;
3792
+ border-left: 3px solid var(--ew-color-primary-light-5);
3793
+ border-radius: 0 var(--ew-radius-md) var(--ew-radius-md) 0;
3794
+ background-color: var(--ew-color-primary-light-9);
3795
+ color: var(--ew-text-secondary);
3796
+ }
3797
+ .ew-article__body blockquote p {
3798
+ margin: 0.2em 0;
3799
+ }
3800
+ .ew-article__body ul,
3801
+ .ew-article__body ol {
3802
+ margin: 0 0 1.1em;
3803
+ padding-left: 1.4em;
3804
+ }
3805
+ .ew-article__body li {
3806
+ margin: 0.3em 0;
3807
+ }
3808
+ .ew-article__body code {
3809
+ padding: 2px 6px;
3810
+ border-radius: var(--ew-radius-sm);
3811
+ background-color: var(--ew-color-primary-light-9);
3812
+ color: var(--ew-color-primary-dark-2);
3813
+ font-family: var(--ew-font-family-mono, monospace);
3814
+ font-size: 0.9em;
3815
+ }
3816
+ .ew-article__body img {
3817
+ max-width: 100%;
3818
+ border-radius: var(--ew-radius-md);
3819
+ }
3820
+ .ew-article__body hr {
3821
+ margin: 2em 0;
3822
+ border: none;
3823
+ border-top: 1px solid var(--ew-border-color-light);
3824
+ }
3825
+ .ew-article__body strong {
3826
+ color: var(--ew-text-primary);
3827
+ }
3828
+
3829
+ /* ─── 页脚 ─── */
3830
+ .ew-article__footer {
3831
+ margin-top: var(--ew-space-6);
3832
+ padding-top: var(--ew-space-5);
3833
+ border-top: 1px solid var(--ew-border-color-light);
3834
+ }
3835
+ /* EwExecCard — 高管/团队介绍卡 */
3836
+ .ew-exec-card {
3837
+ --ew-exec-portrait-h: 190px;
3838
+ display: flex;
3839
+ flex-direction: column;
3840
+ overflow: hidden;
3841
+ border: 1px solid var(--ew-border-color-light);
3842
+ border-radius: var(--ew-radius-lg);
3843
+ background-color: var(--ew-bg-container);
3844
+ text-align: center;
3845
+ transition: transform var(--ew-duration-base) var(--ew-ease-smooth),
3846
+ box-shadow var(--ew-duration-base) var(--ew-ease-in-out),
3847
+ border-color var(--ew-duration-base) var(--ew-ease-in-out);
3848
+ }
3849
+ .ew-exec-card:hover {
3850
+ transform: translateY(-3px);
3851
+ border-color: var(--ew-border-color);
3852
+ box-shadow: var(--ew-shadow-2);
3853
+ }
3854
+
3855
+ /* ─── 人物舞台:渐变底 + 透明 PNG 锚定底边 ─── */
3856
+ .ew-exec-card__stage {
3857
+ position: relative;
3858
+ height: var(--ew-exec-portrait-h);
3859
+ background-image: var(--ew-gradient-hero);
3860
+ overflow: hidden;
3861
+ }
3862
+ .ew-exec-card__portrait {
3863
+ position: absolute;
3864
+ bottom: 0;
3865
+ left: 50%;
3866
+ transform: translateX(-50%);
3867
+ width: auto;
3868
+ max-width: 78%;
3869
+ height: 96%;
3870
+ object-fit: contain;
3871
+ object-position: bottom;
3872
+ color: var(--ew-color-primary-light-5);
3873
+ transition: transform var(--ew-duration-slow) var(--ew-ease-smooth);
3874
+ }
3875
+ .ew-exec-card:hover .ew-exec-card__portrait {
3876
+ transform: translateX(-50%) translateY(-4px);
3877
+ }
3878
+
3879
+ /* ─── 介绍文本:展示体标题 + 小标签职务 + 次级简介 ─── */
3880
+ .ew-exec-card__body {
3881
+ display: flex;
3882
+ flex-direction: column;
3883
+ align-items: center;
3884
+ gap: var(--ew-space-2);
3885
+ padding: var(--ew-space-5) var(--ew-space-5) var(--ew-space-6);
3886
+ }
3887
+ .ew-exec-card__name {
3888
+ margin: 0;
3889
+ font-size: var(--ew-font-size-lg);
3890
+ font-weight: var(--ew-display-weight-strong);
3891
+ letter-spacing: var(--ew-display-letter-spacing);
3892
+ line-height: var(--ew-display-line-height);
3893
+ color: var(--ew-text-primary);
3894
+ }
3895
+ .ew-exec-card__role {
3896
+ margin: 0;
3897
+ font-size: var(--ew-font-size-xs);
3898
+ font-weight: var(--ew-font-weight-medium);
3899
+ letter-spacing: 0.14em;
3900
+ text-transform: uppercase;
3901
+ color: var(--ew-text-secondary);
3902
+ }
3903
+ .ew-exec-card__description {
3904
+ margin: var(--ew-space-1) 0 0;
3905
+ font-size: var(--ew-font-size-sm);
3906
+ line-height: 1.7;
3907
+ color: var(--ew-text-regular);
3908
+ }
3909
+ .ew-exec-card__actions {
3910
+ display: flex;
3911
+ gap: var(--ew-space-2);
3912
+ margin-top: var(--ew-space-2);
3913
+ }
3914
+
3915
+ /* ─── 宿主环境屏蔽 ───
3916
+ 文档站等宿主的元素级排版(.vp-doc h3/p)会以更高优先级侵入,这里双类重申 */
3917
+ .ew-exec-card .ew-exec-card__name {
3918
+ margin: 0;
3919
+ font-size: var(--ew-font-size-lg);
3920
+ font-weight: var(--ew-display-weight-strong);
3921
+ letter-spacing: var(--ew-display-letter-spacing);
3922
+ line-height: var(--ew-display-line-height);
3923
+ color: var(--ew-text-primary);
3924
+ }
3925
+ .ew-exec-card .ew-exec-card__role {
3926
+ margin: 0;
3927
+ font-size: var(--ew-font-size-xs);
3928
+ font-weight: var(--ew-font-weight-medium);
3929
+ letter-spacing: 0.14em;
3930
+ color: var(--ew-text-secondary);
3931
+ }
3932
+ .ew-exec-card .ew-exec-card__description {
3933
+ margin: var(--ew-space-1) 0 0;
3934
+ font-size: var(--ew-font-size-sm);
3935
+ line-height: 1.7;
3936
+ color: var(--ew-text-regular);
3937
+ }
3938
+ /* EwImagePreview — 图片预览灯箱 */
3939
+ .ew-image-preview {
3940
+ position: fixed;
3941
+ inset: 0;
3942
+ z-index: var(--ew-z-index-overlay, 2000);
3943
+ display: flex;
3944
+ align-items: center;
3945
+ justify-content: center;
3946
+ background: rgba(10, 14, 24, 0.82);
3947
+ backdrop-filter: blur(6px);
3948
+ -webkit-backdrop-filter: blur(6px);
3949
+ }
3950
+ .ew-image-preview__stage {
3951
+ display: flex;
3952
+ flex-direction: column;
3953
+ align-items: center;
3954
+ gap: 10px;
3955
+ margin: 0 72px;
3956
+ max-width: min(1080px, calc(100vw - 144px));
3957
+ }
3958
+ .ew-image-preview__img {
3959
+ max-width: 100%;
3960
+ max-height: calc(100vh - 140px);
3961
+ border-radius: var(--ew-radius-md);
3962
+ box-shadow: var(--ew-shadow-4);
3963
+ object-fit: contain;
3964
+ }
3965
+ .ew-image-preview__caption {
3966
+ display: flex;
3967
+ justify-content: space-between;
3968
+ gap: 16px;
3969
+ width: 100%;
3970
+ font-size: var(--ew-font-size-sm);
3971
+ color: rgba(255, 255, 255, 0.85);
3972
+ }
3973
+ .ew-image-preview__close,
3974
+ .ew-image-preview__arrow {
3975
+ position: absolute;
3976
+ display: inline-flex;
3977
+ align-items: center;
3978
+ justify-content: center;
3979
+ width: 40px;
3980
+ height: 40px;
3981
+ border: 1px solid rgba(255, 255, 255, 0.25);
3982
+ border-radius: var(--ew-radius-full);
3983
+ background: rgba(255, 255, 255, 0.08);
3984
+ color: rgba(255, 255, 255, 0.92);
3985
+ cursor: pointer;
3986
+ transition: background-color var(--ew-duration-base) var(--ew-ease-in-out);
3987
+ }
3988
+ .ew-image-preview__close:hover,
3989
+ .ew-image-preview__arrow:hover {
3990
+ background: rgba(255, 255, 255, 0.18);
3991
+ }
3992
+ .ew-image-preview__close {
3993
+ top: 20px;
3994
+ right: 24px;
3995
+ }
3996
+ .ew-image-preview__arrow.is-prev {
3997
+ left: 24px;
3998
+ }
3999
+ .ew-image-preview__arrow.is-next {
4000
+ right: 24px;
4001
+ }
4002
+
4003
+ /* ─── 进出场 ─── */
4004
+ .ew-image-preview-enter-active,
4005
+ .ew-image-preview-leave-active {
4006
+ transition: opacity var(--ew-duration-base) var(--ew-ease-in-out);
4007
+ }
4008
+ .ew-image-preview-enter-active .ew-image-preview__img,
4009
+ .ew-image-preview-leave-active .ew-image-preview__img {
4010
+ transition: transform var(--ew-duration-base) var(--ew-ease-smooth);
4011
+ }
4012
+ .ew-image-preview-enter-from,
4013
+ .ew-image-preview-leave-to {
4014
+ opacity: 0;
4015
+ }
4016
+ .ew-image-preview-enter-from .ew-image-preview__img {
4017
+ transform: scale(0.94);
4018
+ }
4019
+ /* EwImageWall — 图片墙 */
4020
+ .ew-image-wall {
4021
+ display: grid;
4022
+ }
4023
+ .ew-image-wall__item {
4024
+ padding: 0;
4025
+ border: none;
4026
+ border-radius: var(--ew-image-wall-radius, 12px);
4027
+ background: var(--ew-fill-1);
4028
+ overflow: hidden;
4029
+ cursor: zoom-in;
4030
+ }
4031
+ .ew-image-wall__item img {
4032
+ display: block;
4033
+ width: 100%;
4034
+ height: 100%;
4035
+ aspect-ratio: 4 / 3;
4036
+ object-fit: cover;
4037
+ transition: transform var(--ew-duration-slow) var(--ew-ease-smooth);
4038
+ }
4039
+ .ew-image-wall__item:hover img,
4040
+ .ew-image-wall__item:focus-visible img {
4041
+ transform: scale(1.04);
4042
+ }
4043
+ .ew-image-wall__item:focus-visible {
4044
+ outline: 2px solid var(--ew-color-primary);
4045
+ outline-offset: 2px;
4046
+ }
4047
+ /* EwModal — 弹出层 */
4048
+ .ew-modal {
4049
+ position: fixed;
4050
+ inset: 0;
4051
+ z-index: var(--ew-z-index-overlay, 2000);
4052
+ display: flex;
4053
+ align-items: flex-start;
4054
+ justify-content: center;
4055
+ padding: 10vh 16px 24px;
4056
+ background: rgba(10, 14, 24, 0.5);
4057
+ backdrop-filter: blur(3px);
4058
+ -webkit-backdrop-filter: blur(3px);
4059
+ overflow-y: auto;
4060
+ }
4061
+ .ew-modal__panel {
4062
+ position: relative;
4063
+ width: 560px;
4064
+ max-width: 100%;
4065
+ border: 1px solid var(--ew-border-color-light);
4066
+ border-radius: var(--ew-radius-lg);
4067
+ background-color: var(--ew-bg-container);
4068
+ box-shadow: var(--ew-shadow-4);
4069
+ outline: none;
4070
+ }
4071
+ .ew-modal__header {
4072
+ display: flex;
4073
+ align-items: center;
4074
+ justify-content: space-between;
4075
+ gap: var(--ew-space-4);
4076
+ padding: var(--ew-space-5) var(--ew-space-6) 0;
4077
+ }
4078
+ .ew-modal__title {
4079
+ margin: 0;
4080
+ font-size: var(--ew-font-size-xl);
4081
+ font-weight: var(--ew-display-weight-strong);
4082
+ letter-spacing: var(--ew-display-letter-spacing);
4083
+ color: var(--ew-text-primary);
4084
+ }
4085
+ .ew-modal__close {
4086
+ display: inline-flex;
4087
+ align-items: center;
4088
+ justify-content: center;
4089
+ width: 28px;
4090
+ height: 28px;
4091
+ margin-left: auto;
4092
+ border: none;
4093
+ border-radius: var(--ew-radius-full);
4094
+ background: transparent;
4095
+ color: var(--ew-text-secondary);
4096
+ cursor: pointer;
4097
+ transition: background-color var(--ew-duration-base) var(--ew-ease-in-out),
4098
+ color var(--ew-duration-base) var(--ew-ease-in-out);
4099
+ }
4100
+ .ew-modal__close:hover {
4101
+ background-color: var(--ew-fill-1);
4102
+ color: var(--ew-text-primary);
4103
+ }
4104
+ .ew-modal__body {
4105
+ padding: var(--ew-space-4) var(--ew-space-6) var(--ew-space-6);
4106
+ font-size: var(--ew-font-size-md);
4107
+ line-height: 1.7;
4108
+ color: var(--ew-text-regular);
4109
+ }
4110
+ .ew-modal__footer {
4111
+ display: flex;
4112
+ justify-content: flex-end;
4113
+ gap: var(--ew-space-3);
4114
+ padding: 0 var(--ew-space-6) var(--ew-space-6);
4115
+ }
4116
+
4117
+ /* ─── 进出场:遮罩淡入 + 面板上浮 ─── */
4118
+ .ew-modal-enter-active,
4119
+ .ew-modal-leave-active {
4120
+ transition: opacity var(--ew-duration-base) var(--ew-ease-in-out);
4121
+ }
4122
+ .ew-modal-enter-active .ew-modal__panel,
4123
+ .ew-modal-leave-active .ew-modal__panel {
4124
+ transition: transform var(--ew-duration-base) var(--ew-ease-smooth),
4125
+ opacity var(--ew-duration-base) var(--ew-ease-in-out);
4126
+ }
4127
+ .ew-modal-enter-from,
4128
+ .ew-modal-leave-to {
4129
+ opacity: 0;
4130
+ }
4131
+ .ew-modal-enter-from .ew-modal__panel {
4132
+ transform: translateY(14px) scale(0.98);
4133
+ opacity: 0;
4134
+ }
4135
+ .ew-modal-leave-to .ew-modal__panel {
4136
+ transform: translateY(8px);
4137
+ opacity: 0;
4138
+ }
4139
+ /* EwMarquee — 无限滚动横幅 */
4140
+ .ew-marquee {
4141
+ position: relative;
4142
+ overflow: hidden;
4143
+ /* 两端淡出 */
4144
+ --ew-marquee-mask: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
4145
+ -webkit-mask-image: var(--ew-marquee-mask);
4146
+ mask-image: var(--ew-marquee-mask);
4147
+ }
4148
+ .ew-marquee__track {
4149
+ display: flex;
4150
+ width: max-content;
4151
+ animation: ew-marquee-scroll var(--ew-marquee-duration) linear infinite;
4152
+ }
4153
+ .ew-marquee.is-reverse .ew-marquee__track {
4154
+ animation-direction: reverse;
4155
+ }
4156
+ .ew-marquee.is-pausable:hover .ew-marquee__track {
4157
+ animation-play-state: paused;
4158
+ }
4159
+ .ew-marquee__group {
4160
+ display: flex;
4161
+ align-items: center;
4162
+ flex-shrink: 0;
4163
+ gap: var(--ew-space-6);
4164
+ padding-right: var(--ew-space-6);
4165
+ }
4166
+
4167
+ /* ══════ 文本模式:商场 LED 大字横幅 ══════ */
4168
+ .ew-marquee__text {
4169
+ font-size: var(--ew-marquee-text-size, clamp(32px, 5vw, 56px));
4170
+ font-weight: var(--ew-display-weight-strong);
4171
+ letter-spacing: -0.02em;
4172
+ text-transform: uppercase;
4173
+ white-space: nowrap;
4174
+ color: var(--ew-text-primary);
4175
+ line-height: 1.15;
4176
+ }
4177
+
4178
+ /* 描边字(奇数项):空心 + 描边,商场横幅的节奏感来源 */
3383
4179
  .ew-marquee__text.is-outline {
3384
4180
  color: transparent;
3385
4181
  -webkit-text-stroke: 1.5px var(--ew-marquee-stroke, var(--ew-text-secondary));
@@ -3399,6 +4195,52 @@ to { transform: translateX(-50%);
3399
4195
  animation: none;
3400
4196
  }
3401
4197
  }
4198
+ /* EwBorderBeam — 边框流光 */
4199
+
4200
+ /* 角度可插值注册:不支持的浏览器退化为静态渐变细环(不影响内容) */
4201
+ @property --ew-beam-angle {
4202
+ syntax: '<angle>';
4203
+ initial-value: 0deg;
4204
+ inherits: false;
4205
+ }
4206
+ .ew-border-beam {
4207
+ position: relative;
4208
+ isolation: isolate;
4209
+ }
4210
+
4211
+ /* 光带环:conic 渐变沿角度旋转,mask 只保留边框宽度一圈 */
4212
+ .ew-border-beam::before {
4213
+ content: '';
4214
+ position: absolute;
4215
+ inset: 0;
4216
+ z-index: 1;
4217
+ border-radius: inherit;
4218
+ padding: var(--ew-beam-width);
4219
+ background: conic-gradient(
4220
+ from var(--ew-beam-angle),
4221
+ var(--ew-beam-from) 0deg,
4222
+ var(--ew-beam-from) 250deg,
4223
+ var(--ew-beam-to) 310deg,
4224
+ var(--ew-beam-from) 360deg
4225
+ );
4226
+ -webkit-mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
4227
+ -webkit-mask-composite: xor;
4228
+ mask: linear-gradient(#fff 0 0) content-box, linear-gradient(#fff 0 0);
4229
+ mask-composite: exclude;
4230
+ animation: ew-beam-spin var(--ew-beam-duration) var(--ew-beam-direction) linear infinite;
4231
+ animation-delay: var(--ew-beam-delay);
4232
+ pointer-events: none;
4233
+ }
4234
+ @keyframes ew-beam-spin {
4235
+ to {
4236
+ --ew-beam-angle: 360deg;
4237
+ }
4238
+ }
4239
+ @media (prefers-reduced-motion: reduce) {
4240
+ .ew-border-beam::before {
4241
+ animation: none;
4242
+ }
4243
+ }
3402
4244
  /* EwInput — 文本输入 */
3403
4245
  .ew-input {
3404
4246
  display: inline-flex;
@@ -3487,6 +4329,35 @@ to { transform: translateX(-50%);
3487
4329
  background-color: var(--ew-fill-3);
3488
4330
  color: var(--ew-text-primary);
3489
4331
  }
4332
+
4333
+ /* ─── 边框激活波纹:聚焦时边框向外扩散两圈涟漪;
4334
+ 全局关闭 html[data-ew-ripple='off'];prefers-reduced-motion 自动停用 ─── */
4335
+ /* 定位锚点:波纹环与清空按钮的定位参考 */
4336
+ .ew-input {
4337
+ position: relative;
4338
+ }
4339
+ .ew-input::after {
4340
+ content: '';
4341
+ position: absolute;
4342
+ inset: -3px;
4343
+ border-radius: inherit;
4344
+ border: 1px solid color-mix(in srgb, var(--ew-color-primary) 45%, transparent);
4345
+ opacity: 0;
4346
+ pointer-events: none;
4347
+ }
4348
+ @media (prefers-reduced-motion: no-preference) {
4349
+ html:not([data-ew-ripple='off']) .ew-input:focus-within::after {
4350
+ animation: ew-border-ripple 0.7s ease-out 2;
4351
+ }
4352
+ }
4353
+ @keyframes ew-border-ripple {
4354
+ 0% { opacity: 0.9; transform: scale(1);
4355
+ }
4356
+ 70% { opacity: 0.25;
4357
+ }
4358
+ 100% { opacity: 0; transform: scale(1.04);
4359
+ }
4360
+ }
3490
4361
  /* EwTextarea — 多行文本 */
3491
4362
  .ew-textarea {
3492
4363
  position: relative;
@@ -3536,6 +4407,31 @@ to { transform: translateX(-50%);
3536
4407
  padding-left: 4px;
3537
4408
  pointer-events: none;
3538
4409
  }
4410
+
4411
+ /* ─── 边框激活波纹:聚焦时边框向外扩散两圈涟漪;
4412
+ 全局关闭 html[data-ew-ripple='off'];prefers-reduced-motion 自动停用 ─── */
4413
+ .ew-textarea::after {
4414
+ content: '';
4415
+ position: absolute;
4416
+ inset: -3px;
4417
+ border-radius: inherit;
4418
+ border: 1px solid color-mix(in srgb, var(--ew-color-primary) 45%, transparent);
4419
+ opacity: 0;
4420
+ pointer-events: none;
4421
+ }
4422
+ @media (prefers-reduced-motion: no-preference) {
4423
+ html:not([data-ew-ripple='off']) .ew-textarea:focus-within::after {
4424
+ animation: ew-border-ripple 0.7s ease-out 2;
4425
+ }
4426
+ }
4427
+ @keyframes ew-border-ripple {
4428
+ 0% { opacity: 0.9; transform: scale(1);
4429
+ }
4430
+ 70% { opacity: 0.25;
4431
+ }
4432
+ 100% { opacity: 0; transform: scale(1.04);
4433
+ }
4434
+ }
3539
4435
  /* EwField — 表单字段包装 */
3540
4436
  .ew-field {
3541
4437
  display: flex;