@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/index.mjs CHANGED
@@ -1,4 +1,4 @@
1
- import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, getCurrentInstance, h, inject, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, openBlock, provide, reactive, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useAttrs, useSlots, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
1
+ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createSlots, createTextVNode, createVNode, getCurrentInstance, h, inject, mergeProps, nextTick, normalizeClass, normalizeStyle, onBeforeUnmount, onMounted, onUnmounted, openBlock, provide, reactive, ref, renderList, renderSlot, resolveDynamicComponent, toDisplayString, unref, useAttrs, useSlots, vModelText, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
2
2
  //#region src/composables/useTheme.js
3
3
  /**
4
4
  * useTheme — 明暗主题管理
@@ -623,7 +623,8 @@ var DEFAULT_CONFIG = {
623
623
  semantic: null,
624
624
  radius: "default",
625
625
  space: "default",
626
- container: "default"
626
+ container: "default",
627
+ glass: false
627
628
  };
628
629
  var config = reactive({ ...DEFAULT_CONFIG });
629
630
  function apply() {
@@ -729,9 +730,16 @@ function useThemeConfig() {
729
730
  }
730
731
  apply();
731
732
  }
733
+ function setGlass(on) {
734
+ config.glass = !!on;
735
+ if (typeof document === "undefined") return;
736
+ if (config.glass) document.documentElement.setAttribute("data-ew-glass", "on");
737
+ else document.documentElement.removeAttribute("data-ew-glass");
738
+ }
732
739
  function reset() {
733
740
  Object.assign(config, DEFAULT_CONFIG);
734
741
  clearApplied();
742
+ setGlass(false);
735
743
  }
736
744
  /**
737
745
  * 应用一个风格方案(EW_STYLE_PRESETS 的 key)
@@ -748,6 +756,7 @@ function useThemeConfig() {
748
756
  config,
749
757
  setPrimary,
750
758
  setSemantic,
759
+ setGlass,
751
760
  setRadius,
752
761
  setSpace,
753
762
  setContainer,
@@ -1231,7 +1240,7 @@ function loadShowcaseIcons() {
1231
1240
  }
1232
1241
  //#endregion
1233
1242
  //#region src/components/icon/index.vue
1234
- var _sfc_main$21 = {
1243
+ var _sfc_main$24 = {
1235
1244
  __name: "index",
1236
1245
  props: {
1237
1246
  /** 图标组件或图标名称(kebab-case,如 'search') */
@@ -1280,20 +1289,15 @@ var _sfc_main$21 = {
1280
1289
  };
1281
1290
  //#endregion
1282
1291
  //#region src/components/button/index.vue
1283
- var _hoisted_1$40 = [
1284
- "type",
1285
- "disabled",
1286
- "aria-disabled"
1287
- ];
1288
- var _hoisted_2$35 = {
1292
+ var _hoisted_1$45 = {
1289
1293
  key: 0,
1290
1294
  class: "ew-button__loading"
1291
1295
  };
1292
- var _hoisted_3$29 = {
1296
+ var _hoisted_2$40 = {
1293
1297
  key: 2,
1294
1298
  class: "ew-button__content"
1295
1299
  };
1296
- var _sfc_main$7 = {
1300
+ var _sfc_main$9 = {
1297
1301
  __name: "index",
1298
1302
  props: {
1299
1303
  /** 视觉变体 */
@@ -1353,6 +1357,21 @@ var _sfc_main$7 = {
1353
1357
  "submit",
1354
1358
  "reset"
1355
1359
  ].includes(v)
1360
+ },
1361
+ /** 链接地址:传入时按钮渲染为 <a>,站内/外链跳转直接可用 */
1362
+ href: {
1363
+ type: String,
1364
+ default: void 0
1365
+ },
1366
+ /** 链接打开方式(href 存在时生效) */
1367
+ target: {
1368
+ type: String,
1369
+ default: void 0
1370
+ },
1371
+ /** rel 属性(href + target="_blank" 时默认 noopener) */
1372
+ rel: {
1373
+ type: String,
1374
+ default: void 0
1356
1375
  }
1357
1376
  },
1358
1377
  emits: ["click"],
@@ -1362,6 +1381,7 @@ var _sfc_main$7 = {
1362
1381
  * variant:primary 蓝色实心 / dark 墨色实心(launchos 黑胶囊 CTA)/
1363
1382
  * soft 柔和底(remixicon 头部下载钮)/ outline / ghost
1364
1383
  * 默认 radius-lg 圆润矩形,pill 转全圆胶囊
1384
+ * href 传入时渲染为 <a>(站内/外链跳转),target="_blank" 自动补 noopener
1365
1385
  */
1366
1386
  const props = __props;
1367
1387
  const emit = __emit;
@@ -1383,7 +1403,7 @@ var _sfc_main$7 = {
1383
1403
  blur: (...args) => btnRef.value?.blur?.(...args)
1384
1404
  });
1385
1405
  return (_ctx, _cache) => {
1386
- return openBlock(), createElementBlock("button", {
1406
+ return openBlock(), createBlock(resolveDynamicComponent(__props.href ? "a" : "button"), {
1387
1407
  ref_key: "btnRef",
1388
1408
  ref: btnRef,
1389
1409
  class: normalizeClass([
@@ -1398,40 +1418,54 @@ var _sfc_main$7 = {
1398
1418
  "is-icon-only": iconOnly.value
1399
1419
  }
1400
1420
  ]),
1401
- type: __props.nativeType,
1402
- disabled: __props.disabled || __props.loading,
1421
+ type: __props.href ? void 0 : __props.nativeType,
1422
+ href: __props.href || void 0,
1423
+ target: __props.href ? __props.target || void 0 : void 0,
1424
+ rel: __props.href ? __props.rel || (__props.target === "_blank" ? "noopener" : void 0) : void 0,
1425
+ disabled: __props.href ? void 0 : __props.disabled || __props.loading,
1403
1426
  "aria-disabled": __props.disabled || __props.loading,
1404
1427
  onClick: handleClick
1405
- }, [
1406
- __props.loading ? (openBlock(), createElementBlock("span", _hoisted_2$35, [createVNode(_sfc_main$21, {
1407
- name: "loading",
1408
- size: iconSize.value,
1409
- class: "is-rotating"
1410
- }, null, 8, ["size"])])) : __props.icon ? (openBlock(), createBlock(_sfc_main$21, {
1411
- key: 1,
1412
- name: __props.icon,
1413
- size: iconSize.value,
1414
- class: "ew-button__icon"
1415
- }, null, 8, ["name", "size"])) : createCommentVNode("", true),
1416
- _ctx.$slots.default ? (openBlock(), createElementBlock("span", _hoisted_3$29, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true),
1417
- __props.iconRight && !__props.loading ? (openBlock(), createBlock(_sfc_main$21, {
1418
- key: 3,
1419
- name: __props.iconRight,
1420
- size: iconSize.value,
1421
- class: "ew-button__icon ew-button__icon--right"
1422
- }, null, 8, ["name", "size"])) : createCommentVNode("", true)
1423
- ], 10, _hoisted_1$40);
1428
+ }, {
1429
+ default: withCtx(() => [
1430
+ __props.loading ? (openBlock(), createElementBlock("span", _hoisted_1$45, [createVNode(_sfc_main$24, {
1431
+ name: "loading",
1432
+ size: iconSize.value,
1433
+ class: "is-rotating"
1434
+ }, null, 8, ["size"])])) : __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
1435
+ key: 1,
1436
+ name: __props.icon,
1437
+ size: iconSize.value,
1438
+ class: "ew-button__icon"
1439
+ }, null, 8, ["name", "size"])) : createCommentVNode("", true),
1440
+ _ctx.$slots.default ? (openBlock(), createElementBlock("span", _hoisted_2$40, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true),
1441
+ __props.iconRight && !__props.loading ? (openBlock(), createBlock(_sfc_main$24, {
1442
+ key: 3,
1443
+ name: __props.iconRight,
1444
+ size: iconSize.value,
1445
+ class: "ew-button__icon ew-button__icon--right"
1446
+ }, null, 8, ["name", "size"])) : createCommentVNode("", true)
1447
+ ]),
1448
+ _: 3
1449
+ }, 8, [
1450
+ "class",
1451
+ "type",
1452
+ "href",
1453
+ "target",
1454
+ "rel",
1455
+ "disabled",
1456
+ "aria-disabled"
1457
+ ]);
1424
1458
  };
1425
1459
  }
1426
1460
  };
1427
1461
  //#endregion
1428
1462
  //#region src/components/icon-button/index.vue
1429
- var _hoisted_1$39 = [
1463
+ var _hoisted_1$44 = [
1430
1464
  "type",
1431
1465
  "disabled",
1432
1466
  "aria-label"
1433
1467
  ];
1434
- var _sfc_main$22 = {
1468
+ var _sfc_main$25 = {
1435
1469
  __name: "index",
1436
1470
  props: {
1437
1471
  /** 图标名(kebab-case) */
@@ -1517,16 +1551,16 @@ var _sfc_main$22 = {
1517
1551
  disabled: __props.disabled,
1518
1552
  "aria-label": __props.ariaLabel || __props.icon,
1519
1553
  onClick: handleClick
1520
- }, [createVNode(_sfc_main$21, {
1554
+ }, [createVNode(_sfc_main$24, {
1521
1555
  name: __props.icon,
1522
1556
  size: iconSize.value
1523
- }, null, 8, ["name", "size"]), renderSlot(_ctx.$slots, "default")], 10, _hoisted_1$39);
1557
+ }, null, 8, ["name", "size"]), renderSlot(_ctx.$slots, "default")], 10, _hoisted_1$44);
1524
1558
  };
1525
1559
  }
1526
1560
  };
1527
1561
  //#endregion
1528
1562
  //#region src/components/tag/index.vue
1529
- var _sfc_main$44 = {
1563
+ var _sfc_main$50 = {
1530
1564
  __name: "index",
1531
1565
  props: {
1532
1566
  tone: {
@@ -1587,7 +1621,7 @@ var _sfc_main$44 = {
1587
1621
  `is-${__props.tone}`,
1588
1622
  `is-${__props.variant}`
1589
1623
  ]) }, [
1590
- __props.icon ? (openBlock(), createBlock(_sfc_main$21, {
1624
+ __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
1591
1625
  key: 0,
1592
1626
  name: __props.icon,
1593
1627
  size: iconSize.value,
@@ -1600,7 +1634,7 @@ var _sfc_main$44 = {
1600
1634
  class: "ew-tag__close",
1601
1635
  "aria-label": "close",
1602
1636
  onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("close"), ["stop"]))
1603
- }, [createVNode(_sfc_main$21, {
1637
+ }, [createVNode(_sfc_main$24, {
1604
1638
  name: "close",
1605
1639
  size: iconSize.value - 2
1606
1640
  }, null, 8, ["size"])])) : createCommentVNode("", true)
@@ -1610,7 +1644,7 @@ var _sfc_main$44 = {
1610
1644
  };
1611
1645
  //#endregion
1612
1646
  //#region src/components/badge/index.vue
1613
- var _sfc_main$6 = {
1647
+ var _sfc_main$7 = {
1614
1648
  __name: "index",
1615
1649
  props: {
1616
1650
  /** 计数值(超过 max 显示 max+) */
@@ -1656,9 +1690,14 @@ var _sfc_main$6 = {
1656
1690
  };
1657
1691
  //#endregion
1658
1692
  //#region src/components/card/index.vue
1659
- var _sfc_main$8 = {
1693
+ var _sfc_main$10 = {
1660
1694
  __name: "index",
1661
1695
  props: {
1696
+ /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
1697
+ glass: {
1698
+ type: Boolean,
1699
+ default: void 0
1700
+ },
1662
1701
  tone: {
1663
1702
  type: String,
1664
1703
  default: "plain",
@@ -1713,7 +1752,9 @@ var _sfc_main$8 = {
1713
1752
  "is-sticker": __props.sticker,
1714
1753
  "is-featured": __props.featured,
1715
1754
  "is-hoverable": __props.hoverable,
1716
- "is-flat": __props.flat
1755
+ "is-flat": __props.flat,
1756
+ "is-glass": __props.glass === true,
1757
+ "no-glass": __props.glass === false
1717
1758
  }
1718
1759
  ]),
1719
1760
  style: normalizeStyle(__props.customBg ? { backgroundColor: __props.customBg } : void 0)
@@ -1726,25 +1767,30 @@ var _sfc_main$8 = {
1726
1767
  };
1727
1768
  //#endregion
1728
1769
  //#region src/components/section/index.vue
1729
- var _hoisted_1$38 = {
1770
+ var _hoisted_1$43 = {
1730
1771
  key: 0,
1731
1772
  class: "ew-section__eyebrow"
1732
1773
  };
1733
- var _hoisted_2$34 = {
1774
+ var _hoisted_2$39 = {
1734
1775
  key: 1,
1735
1776
  class: "ew-section__title"
1736
1777
  };
1737
- var _hoisted_3$28 = {
1778
+ var _hoisted_3$32 = {
1738
1779
  key: 2,
1739
1780
  class: "ew-section__description"
1740
1781
  };
1741
- var _hoisted_4$25 = {
1782
+ var _hoisted_4$31 = {
1742
1783
  key: 3,
1743
1784
  class: "ew-section__body"
1744
1785
  };
1745
- var _sfc_main$37 = {
1786
+ var _sfc_main$43 = {
1746
1787
  __name: "index",
1747
1788
  props: {
1789
+ /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
1790
+ glass: {
1791
+ type: Boolean,
1792
+ default: void 0
1793
+ },
1748
1794
  /** 眉题(自动大写字距拉开) */
1749
1795
  eyebrow: {
1750
1796
  type: String,
@@ -1781,45 +1827,57 @@ var _sfc_main$37 = {
1781
1827
  });
1782
1828
  return (_ctx, _cache) => {
1783
1829
  return openBlock(), createElementBlock("section", {
1784
- class: normalizeClass(["ew-section", `is-${__props.align}`]),
1830
+ class: normalizeClass([
1831
+ "ew-section",
1832
+ `is-${__props.align}`,
1833
+ {
1834
+ "is-glass": __props.glass === true,
1835
+ "no-glass": __props.glass === false
1836
+ }
1837
+ ]),
1785
1838
  style: normalizeStyle(sectionStyle.value)
1786
1839
  }, [
1787
- __props.eyebrow || _ctx.$slots.eyebrow ? (openBlock(), createElementBlock("div", _hoisted_1$38, [renderSlot(_ctx.$slots, "eyebrow", {}, () => [createTextVNode(toDisplayString(__props.eyebrow), 1)])])) : createCommentVNode("", true),
1788
- __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("h2", _hoisted_2$34, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true),
1789
- __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_3$28, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
1790
- _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_4$25, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
1840
+ __props.eyebrow || _ctx.$slots.eyebrow ? (openBlock(), createElementBlock("div", _hoisted_1$43, [renderSlot(_ctx.$slots, "eyebrow", {}, () => [createTextVNode(toDisplayString(__props.eyebrow), 1)])])) : createCommentVNode("", true),
1841
+ __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("h2", _hoisted_2$39, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true),
1842
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_3$32, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
1843
+ _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_4$31, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
1791
1844
  ], 6);
1792
1845
  };
1793
1846
  }
1794
1847
  };
1795
1848
  //#endregion
1796
1849
  //#region src/components/navbar/index.vue
1797
- var _hoisted_1$37 = { class: "ew-navbar__inner ew-container" };
1798
- var _hoisted_2$33 = { class: "ew-navbar__left" };
1799
- var _hoisted_3$27 = {
1850
+ var _hoisted_1$42 = { class: "ew-navbar__inner ew-container" };
1851
+ var _hoisted_2$38 = { class: "ew-navbar__left" };
1852
+ var _hoisted_3$31 = {
1800
1853
  key: 0,
1801
1854
  href: "/",
1802
1855
  class: "ew-navbar__logo"
1803
1856
  };
1804
- var _hoisted_4$24 = ["src"];
1805
- var _hoisted_5$18 = {
1857
+ var _hoisted_4$30 = ["src"];
1858
+ var _hoisted_5$24 = {
1806
1859
  key: 2,
1807
1860
  class: "ew-navbar__logo-text"
1808
1861
  };
1809
- var _hoisted_6$11 = {
1862
+ var _hoisted_6$15 = {
1810
1863
  key: 0,
1811
1864
  class: "ew-navbar__nav",
1812
1865
  "aria-label": "主导航"
1813
1866
  };
1814
- var _hoisted_7$8 = { class: "ew-navbar__actions" };
1815
- var _hoisted_8$7 = {
1867
+ var _hoisted_7$12 = { class: "ew-navbar__actions" };
1868
+ var _hoisted_8$11 = {
1816
1869
  key: 0,
1817
1870
  class: "ew-navbar__mobile",
1818
1871
  "aria-label": "移动端导航"
1819
1872
  };
1820
- var _sfc_main$30 = {
1873
+ var _sfc_main$36 = {
1821
1874
  __name: "index",
1822
1875
  props: {
1876
+ /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
1877
+ glass: {
1878
+ type: Boolean,
1879
+ default: void 0
1880
+ },
1823
1881
  /** 吸顶 */
1824
1882
  sticky: {
1825
1883
  type: Boolean,
@@ -1906,10 +1964,12 @@ var _sfc_main$30 = {
1906
1964
  "is-sticky": __props.sticky,
1907
1965
  "is-scrolled": isScrolled.value && __props.sticky,
1908
1966
  "is-blur": __props.blur && __props.sticky,
1909
- "is-hidden": hidden.value && __props.sticky
1967
+ "is-hidden": hidden.value && __props.sticky,
1968
+ "is-glass": __props.glass === true,
1969
+ "no-glass": __props.glass === false
1910
1970
  }])
1911
- }, [createElementVNode("div", _hoisted_1$37, [
1912
- createElementVNode("div", _hoisted_2$33, [renderSlot(_ctx.$slots, "logo", {}, () => [__props.logo ? (openBlock(), createElementBlock("a", _hoisted_3$27, [__props.logoIcon ? (openBlock(), createBlock(_sfc_main$21, {
1971
+ }, [createElementVNode("div", _hoisted_1$42, [
1972
+ createElementVNode("div", _hoisted_2$38, [renderSlot(_ctx.$slots, "logo", {}, () => [__props.logo ? (openBlock(), createElementBlock("a", _hoisted_3$31, [__props.logoIcon ? (openBlock(), createBlock(_sfc_main$24, {
1913
1973
  key: 0,
1914
1974
  name: __props.logoIcon,
1915
1975
  size: 22
@@ -1918,12 +1978,13 @@ var _sfc_main$30 = {
1918
1978
  src: __props.logoImage,
1919
1979
  alt: "logo",
1920
1980
  class: "ew-navbar__logo-img"
1921
- }, null, 8, _hoisted_4$24)) : createCommentVNode("", true), __props.logoText ? (openBlock(), createElementBlock("span", _hoisted_5$18, toDisplayString(__props.logoText), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)]), renderSlot(_ctx.$slots, "start")]),
1922
- __props.items.length || _ctx.$slots.center ? (openBlock(), createElementBlock("nav", _hoisted_6$11, [renderSlot(_ctx.$slots, "center", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
1981
+ }, null, 8, _hoisted_4$30)) : createCommentVNode("", true), __props.logoText ? (openBlock(), createElementBlock("span", _hoisted_5$24, toDisplayString(__props.logoText), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)]), renderSlot(_ctx.$slots, "start")]),
1982
+ __props.items.length || _ctx.$slots.center ? (openBlock(), createElementBlock("nav", _hoisted_6$15, [renderSlot(_ctx.$slots, "center", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
1923
1983
  return openBlock(), createBlock(resolveDynamicComponent(item.href ? "a" : "span"), {
1924
1984
  key: item.label,
1925
1985
  href: item.href,
1926
1986
  target: item.target,
1987
+ rel: item.rel,
1927
1988
  class: normalizeClass(["ew-navbar__link", { "is-active": isActive(item) }])
1928
1989
  }, {
1929
1990
  default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
@@ -1931,10 +1992,11 @@ var _sfc_main$30 = {
1931
1992
  }, 1032, [
1932
1993
  "href",
1933
1994
  "target",
1995
+ "rel",
1934
1996
  "class"
1935
1997
  ]);
1936
1998
  }), 128))])])) : createCommentVNode("", true),
1937
- createElementVNode("div", _hoisted_7$8, [renderSlot(_ctx.$slots, "actions"), __props.items.length || _ctx.$slots.default ? (openBlock(), createBlock(_sfc_main$22, {
1999
+ createElementVNode("div", _hoisted_7$12, [renderSlot(_ctx.$slots, "actions"), __props.items.length || _ctx.$slots.default ? (openBlock(), createBlock(_sfc_main$25, {
1938
2000
  key: 0,
1939
2001
  class: "ew-navbar__burger",
1940
2002
  icon: "menu",
@@ -1942,17 +2004,22 @@ var _sfc_main$30 = {
1942
2004
  onClick: _cache[0] || (_cache[0] = ($event) => menuOpen.value = !menuOpen.value)
1943
2005
  })) : createCommentVNode("", true)])
1944
2006
  ]), createVNode(Transition, { name: "ew-navbar-collapse" }, {
1945
- default: withCtx(() => [menuOpen.value && (_ctx.$slots.default || __props.items.length) ? (openBlock(), createElementBlock("nav", _hoisted_8$7, [renderSlot(_ctx.$slots, "default"), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
2007
+ default: withCtx(() => [menuOpen.value && (_ctx.$slots.default || __props.items.length) ? (openBlock(), createElementBlock("nav", _hoisted_8$11, [renderSlot(_ctx.$slots, "default"), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item) => {
1946
2008
  return openBlock(), createBlock(resolveDynamicComponent(item.href ? "a" : "span"), {
1947
2009
  key: item.label,
1948
2010
  href: item.href,
1949
2011
  target: item.target,
2012
+ rel: item.rel,
1950
2013
  class: "ew-navbar__mobile-link",
1951
2014
  onClick: _cache[1] || (_cache[1] = ($event) => menuOpen.value = false)
1952
2015
  }, {
1953
2016
  default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
1954
2017
  _: 2
1955
- }, 1032, ["href", "target"]);
2018
+ }, 1032, [
2019
+ "href",
2020
+ "target",
2021
+ "rel"
2022
+ ]);
1956
2023
  }), 128))])) : createCommentVNode("", true)]),
1957
2024
  _: 3
1958
2025
  })], 2);
@@ -1961,35 +2028,40 @@ var _sfc_main$30 = {
1961
2028
  };
1962
2029
  //#endregion
1963
2030
  //#region src/components/footer/index.vue
1964
- var _hoisted_1$36 = { class: "ew-container" };
1965
- var _hoisted_2$32 = {
2031
+ var _hoisted_1$41 = { class: "ew-container" };
2032
+ var _hoisted_2$37 = {
1966
2033
  key: 0,
1967
2034
  class: "ew-footer__main"
1968
2035
  };
1969
- var _hoisted_3$26 = { class: "ew-footer__brand" };
1970
- var _hoisted_4$23 = {
2036
+ var _hoisted_3$30 = { class: "ew-footer__brand" };
2037
+ var _hoisted_4$29 = {
1971
2038
  key: 0,
1972
2039
  class: "ew-footer__logo"
1973
2040
  };
1974
- var _hoisted_5$17 = {
2041
+ var _hoisted_5$23 = {
1975
2042
  key: 1,
1976
2043
  class: "ew-footer__slogan"
1977
2044
  };
1978
- var _hoisted_6$10 = {
2045
+ var _hoisted_6$14 = {
1979
2046
  key: 2,
1980
2047
  class: "ew-footer__social"
1981
2048
  };
1982
- var _hoisted_7$7 = ["aria-label"];
1983
- var _hoisted_8$6 = { class: "ew-footer__col-title" };
1984
- var _hoisted_9$4 = { class: "ew-footer__bottom" };
1985
- var _hoisted_10$2 = { class: "ew-footer__copyright" };
1986
- var _hoisted_11$2 = {
2049
+ var _hoisted_7$11 = ["aria-label"];
2050
+ var _hoisted_8$10 = { class: "ew-footer__col-title" };
2051
+ var _hoisted_9$6 = { class: "ew-footer__bottom" };
2052
+ var _hoisted_10$4 = { class: "ew-footer__copyright" };
2053
+ var _hoisted_11$3 = {
1987
2054
  key: 0,
1988
2055
  class: "ew-footer__legal"
1989
2056
  };
1990
- var _sfc_main$19 = {
2057
+ var _sfc_main$22 = {
1991
2058
  __name: "index",
1992
2059
  props: {
2060
+ /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
2061
+ glass: {
2062
+ type: Boolean,
2063
+ default: void 0
2064
+ },
1993
2065
  /** 链接栏 [{ title, links: [{ label, href, target }] }] */
1994
2066
  columns: {
1995
2067
  type: Array,
@@ -2022,16 +2094,20 @@ var _sfc_main$19 = {
2022
2094
  * columns [{ title, links: [{ label, href, target }] }] 多栏链接 + 品牌区 + 底部版权条
2023
2095
  */
2024
2096
  return (_ctx, _cache) => {
2025
- return openBlock(), createElementBlock("footer", { class: normalizeClass(["ew-footer", { "is-soft": __props.soft }]) }, [createElementVNode("div", _hoisted_1$36, [__props.columns.length || _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_2$32, [createElementVNode("div", _hoisted_3$26, [renderSlot(_ctx.$slots, "brand", {}, () => [
2026
- __props.logoText ? (openBlock(), createElementBlock("div", _hoisted_4$23, toDisplayString(__props.logoText), 1)) : createCommentVNode("", true),
2027
- __props.slogan ? (openBlock(), createElementBlock("p", _hoisted_5$17, toDisplayString(__props.slogan), 1)) : createCommentVNode("", true),
2028
- _ctx.$slots.social ? (openBlock(), createElementBlock("div", _hoisted_6$10, [renderSlot(_ctx.$slots, "social")])) : createCommentVNode("", true)
2097
+ return openBlock(), createElementBlock("footer", { class: normalizeClass(["ew-footer", {
2098
+ "is-soft": __props.soft,
2099
+ "is-glass": __props.glass === true,
2100
+ "no-glass": __props.glass === false
2101
+ }]) }, [createElementVNode("div", _hoisted_1$41, [__props.columns.length || _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_2$37, [createElementVNode("div", _hoisted_3$30, [renderSlot(_ctx.$slots, "brand", {}, () => [
2102
+ __props.logoText ? (openBlock(), createElementBlock("div", _hoisted_4$29, toDisplayString(__props.logoText), 1)) : createCommentVNode("", true),
2103
+ __props.slogan ? (openBlock(), createElementBlock("p", _hoisted_5$23, toDisplayString(__props.slogan), 1)) : createCommentVNode("", true),
2104
+ _ctx.$slots.social ? (openBlock(), createElementBlock("div", _hoisted_6$14, [renderSlot(_ctx.$slots, "social")])) : createCommentVNode("", true)
2029
2105
  ])]), renderSlot(_ctx.$slots, "default", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
2030
2106
  return openBlock(), createElementBlock("nav", {
2031
2107
  key: col.title,
2032
2108
  class: "ew-footer__col",
2033
2109
  "aria-label": col.title
2034
- }, [createElementVNode("h4", _hoisted_8$6, toDisplayString(col.title), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(col.links, (link) => {
2110
+ }, [createElementVNode("h4", _hoisted_8$10, toDisplayString(col.title), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(col.links, (link) => {
2035
2111
  return openBlock(), createBlock(resolveDynamicComponent(link.href ? "a" : "span"), {
2036
2112
  key: link.label,
2037
2113
  href: link.href,
@@ -2041,45 +2117,45 @@ var _sfc_main$19 = {
2041
2117
  default: withCtx(() => [createTextVNode(toDisplayString(link.label), 1)]),
2042
2118
  _: 2
2043
2119
  }, 1032, ["href", "target"]);
2044
- }), 128))], 8, _hoisted_7$7);
2045
- }), 128))])])) : createCommentVNode("", true), createElementVNode("div", _hoisted_9$4, [createElementVNode("span", _hoisted_10$2, toDisplayString(__props.copyright), 1), _ctx.$slots.legal ? (openBlock(), createElementBlock("div", _hoisted_11$2, [renderSlot(_ctx.$slots, "legal")])) : createCommentVNode("", true)])])], 2);
2120
+ }), 128))], 8, _hoisted_7$11);
2121
+ }), 128))])])) : createCommentVNode("", true), createElementVNode("div", _hoisted_9$6, [createElementVNode("span", _hoisted_10$4, toDisplayString(__props.copyright), 1), _ctx.$slots.legal ? (openBlock(), createElementBlock("div", _hoisted_11$3, [renderSlot(_ctx.$slots, "legal")])) : createCommentVNode("", true)])])], 2);
2046
2122
  };
2047
2123
  }
2048
2124
  };
2049
2125
  //#endregion
2050
2126
  //#region src/components/hero/index.vue
2051
- var _hoisted_1$35 = { class: "ew-container" };
2052
- var _hoisted_2$31 = { class: "ew-hero__content" };
2053
- var _hoisted_3$25 = {
2127
+ var _hoisted_1$40 = { class: "ew-container" };
2128
+ var _hoisted_2$36 = { class: "ew-hero__content" };
2129
+ var _hoisted_3$29 = {
2054
2130
  key: 0,
2055
2131
  class: "ew-hero__badge",
2056
2132
  "data-ew-hero-item": ""
2057
2133
  };
2058
- var _hoisted_4$22 = {
2134
+ var _hoisted_4$28 = {
2059
2135
  class: "ew-hero__title",
2060
2136
  "data-ew-hero-item": ""
2061
2137
  };
2062
- var _hoisted_5$16 = {
2138
+ var _hoisted_5$22 = {
2063
2139
  key: 1,
2064
2140
  class: "ew-hero__description",
2065
2141
  "data-ew-hero-item": ""
2066
2142
  };
2067
- var _hoisted_6$9 = {
2143
+ var _hoisted_6$13 = {
2068
2144
  key: 2,
2069
2145
  class: "ew-hero__actions",
2070
2146
  "data-ew-hero-item": ""
2071
2147
  };
2072
- var _hoisted_7$6 = {
2148
+ var _hoisted_7$10 = {
2073
2149
  key: 3,
2074
2150
  class: "ew-hero__body",
2075
2151
  "data-ew-hero-item": ""
2076
2152
  };
2077
- var _hoisted_8$5 = {
2153
+ var _hoisted_8$9 = {
2078
2154
  key: 0,
2079
2155
  class: "ew-hero__aside",
2080
2156
  "data-ew-hero-item": ""
2081
2157
  };
2082
- var _sfc_main$20 = {
2158
+ var _sfc_main$23 = {
2083
2159
  __name: "index",
2084
2160
  props: {
2085
2161
  title: {
@@ -2131,13 +2207,13 @@ var _sfc_main$20 = {
2131
2207
  `is-${__props.align}`,
2132
2208
  { "is-tinted": __props.tinted }
2133
2209
  ])
2134
- }, [createElementVNode("div", _hoisted_1$35, [createElementVNode("div", { class: normalizeClass(["ew-hero__inner", { "has-aside": _ctx.$slots.aside }]) }, [createElementVNode("div", _hoisted_2$31, [
2135
- _ctx.$slots.badge ? (openBlock(), createElementBlock("div", _hoisted_3$25, [renderSlot(_ctx.$slots, "badge")])) : createCommentVNode("", true),
2136
- createElementVNode("h1", _hoisted_4$22, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
2137
- __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_5$16, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
2138
- _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_6$9, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
2139
- _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_7$6, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
2140
- ]), _ctx.$slots.aside ? (openBlock(), createElementBlock("div", _hoisted_8$5, [renderSlot(_ctx.$slots, "aside")])) : createCommentVNode("", true)], 2)])], 2);
2210
+ }, [createElementVNode("div", _hoisted_1$40, [createElementVNode("div", { class: normalizeClass(["ew-hero__inner", { "has-aside": _ctx.$slots.aside }]) }, [createElementVNode("div", _hoisted_2$36, [
2211
+ _ctx.$slots.badge ? (openBlock(), createElementBlock("div", _hoisted_3$29, [renderSlot(_ctx.$slots, "badge")])) : createCommentVNode("", true),
2212
+ createElementVNode("h1", _hoisted_4$28, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
2213
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_5$22, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
2214
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_6$13, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
2215
+ _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_7$10, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
2216
+ ]), _ctx.$slots.aside ? (openBlock(), createElementBlock("div", _hoisted_8$9, [renderSlot(_ctx.$slots, "aside")])) : createCommentVNode("", true)], 2)])], 2);
2141
2217
  };
2142
2218
  }
2143
2219
  };
@@ -2172,16 +2248,16 @@ function useUncontrolled(props, { defaultValue } = {}) {
2172
2248
  }
2173
2249
  //#endregion
2174
2250
  //#region src/components/select/index.vue
2175
- var _hoisted_1$34 = ["onKeydown"];
2176
- var _hoisted_2$30 = ["disabled", "aria-expanded"];
2177
- var _hoisted_3$24 = {
2251
+ var _hoisted_1$39 = ["onKeydown"];
2252
+ var _hoisted_2$35 = ["disabled", "aria-expanded"];
2253
+ var _hoisted_3$28 = {
2178
2254
  key: 0,
2179
2255
  class: "ew-select__menu",
2180
2256
  role: "listbox"
2181
2257
  };
2182
- var _hoisted_4$21 = ["aria-selected", "onClick"];
2183
- var _hoisted_5$15 = { class: "ew-select__option-label" };
2184
- var _sfc_main$38 = {
2258
+ var _hoisted_4$27 = ["aria-selected", "onClick"];
2259
+ var _hoisted_5$21 = { class: "ew-select__option-label" };
2260
+ var _sfc_main$44 = {
2185
2261
  __name: "index",
2186
2262
  props: {
2187
2263
  /** 当前值(v-model) */
@@ -2301,20 +2377,20 @@ var _sfc_main$38 = {
2301
2377
  "aria-expanded": open.value,
2302
2378
  onClick: toggle
2303
2379
  }, [
2304
- selectedIcon.value ? (openBlock(), createBlock(_sfc_main$21, {
2380
+ selectedIcon.value ? (openBlock(), createBlock(_sfc_main$24, {
2305
2381
  key: 0,
2306
2382
  name: selectedIcon.value,
2307
2383
  size: iconSize.value,
2308
2384
  class: "ew-select__icon"
2309
2385
  }, null, 8, ["name", "size"])) : createCommentVNode("", true),
2310
2386
  createElementVNode("span", { class: normalizeClass(["ew-select__label", { "is-placeholder": !selectedLabel.value }]) }, toDisplayString(selectedLabel.value || __props.placeholder), 3),
2311
- createVNode(_sfc_main$21, {
2387
+ createVNode(_sfc_main$24, {
2312
2388
  name: "chevron-down",
2313
2389
  size: caretSize.value,
2314
2390
  class: normalizeClass(["ew-select__caret", { "is-open": open.value }])
2315
2391
  }, null, 8, ["size", "class"])
2316
- ], 8, _hoisted_2$30), createVNode(Transition, { name: "ew-select-drop" }, {
2317
- default: withCtx(() => [open.value ? (openBlock(), createElementBlock("ul", _hoisted_3$24, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (opt) => {
2392
+ ], 8, _hoisted_2$35), createVNode(Transition, { name: "ew-select-drop" }, {
2393
+ default: withCtx(() => [open.value ? (openBlock(), createElementBlock("ul", _hoisted_3$28, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (opt) => {
2318
2394
  return openBlock(), createElementBlock("li", {
2319
2395
  key: opt.value,
2320
2396
  role: "option",
@@ -2325,42 +2401,64 @@ var _sfc_main$38 = {
2325
2401
  }]),
2326
2402
  onClick: ($event) => pick(opt)
2327
2403
  }, [
2328
- opt.icon ? (openBlock(), createBlock(_sfc_main$21, {
2404
+ opt.icon ? (openBlock(), createBlock(_sfc_main$24, {
2329
2405
  key: 0,
2330
2406
  name: opt.icon,
2331
2407
  size: 14,
2332
2408
  class: "ew-select__option-icon"
2333
2409
  }, null, 8, ["name"])) : createCommentVNode("", true),
2334
- createElementVNode("span", _hoisted_5$15, toDisplayString(opt.label), 1),
2335
- opt.value === unref(current) ? (openBlock(), createBlock(_sfc_main$21, {
2410
+ createElementVNode("span", _hoisted_5$21, toDisplayString(opt.label), 1),
2411
+ opt.value === unref(current) ? (openBlock(), createBlock(_sfc_main$24, {
2336
2412
  key: 1,
2337
2413
  name: "check",
2338
2414
  size: 14,
2339
2415
  class: "ew-select__option-check"
2340
2416
  })) : createCommentVNode("", true)
2341
- ], 10, _hoisted_4$21);
2417
+ ], 10, _hoisted_4$27);
2342
2418
  }), 128))])) : createCommentVNode("", true)]),
2343
2419
  _: 1
2344
- })], 42, _hoisted_1$34);
2420
+ })], 42, _hoisted_1$39);
2345
2421
  };
2346
2422
  }
2347
2423
  };
2348
2424
  //#endregion
2349
2425
  //#region src/components/search-box/index.vue
2350
- var _hoisted_1$33 = {
2426
+ var _hoisted_1$38 = {
2351
2427
  key: 0,
2352
2428
  class: "ew-search-box__category"
2353
2429
  };
2354
- var _hoisted_2$29 = [
2430
+ var _hoisted_2$34 = [
2355
2431
  "value",
2356
2432
  "placeholder",
2357
- "aria-label"
2433
+ "aria-label",
2434
+ "aria-expanded",
2435
+ "onKeydown"
2358
2436
  ];
2359
- var _hoisted_3$23 = {
2437
+ var _hoisted_3$27 = {
2360
2438
  key: 1,
2361
2439
  class: "ew-search-box__suffix"
2362
2440
  };
2363
- var _sfc_main$36 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2441
+ var _hoisted_4$26 = {
2442
+ key: 2,
2443
+ class: "ew-search-box__dropdown",
2444
+ role: "listbox"
2445
+ };
2446
+ var _hoisted_5$20 = {
2447
+ key: 0,
2448
+ class: "ew-search-box__option is-state"
2449
+ };
2450
+ var _hoisted_6$12 = ["aria-selected"];
2451
+ var _hoisted_7$9 = ["onMousedown", "onMouseenter"];
2452
+ var _hoisted_8$8 = { class: "ew-search-box__option-title" };
2453
+ var _hoisted_9$5 = {
2454
+ key: 0,
2455
+ class: "ew-search-box__option-desc"
2456
+ };
2457
+ var _hoisted_10$3 = {
2458
+ key: 0,
2459
+ class: "ew-search-box__option is-state"
2460
+ };
2461
+ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2364
2462
  __name: "index",
2365
2463
  props: {
2366
2464
  /** 搜索词(v-model) */
@@ -2391,18 +2489,33 @@ var _sfc_main$36 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2391
2489
  ariaLabel: {
2392
2490
  type: String,
2393
2491
  default: ""
2492
+ },
2493
+ /** 远程搜索函数:async (keyword) => [{ title, description?, … }];传入后启用结果下拉 */
2494
+ remote: {
2495
+ type: Function,
2496
+ default: null
2497
+ },
2498
+ /** 远程搜索防抖(ms) */
2499
+ debounce: {
2500
+ type: Number,
2501
+ default: 300
2394
2502
  }
2395
2503
  },
2396
2504
  emits: [
2397
2505
  "update:modelValue",
2398
2506
  "update:category",
2399
- "search"
2507
+ "search",
2508
+ "select"
2400
2509
  ],
2401
2510
  setup(__props, { emit: __emit }) {
2402
2511
  /**
2403
2512
  * EwSearchBox — 大搜索框(签名组件:分类下拉 + 搜索输入 + 后缀动作位)
2404
2513
  * v-model(搜索词) + v-model:category(分类值);分类下拉为 EwSelect bare 嵌入
2405
2514
  * 圆润 xl 圆角 + 藏青软阴影,穿透 attrs 到原生 input
2515
+ *
2516
+ * 远程搜索:传入 remote(async keyword => [{ title, description?, … }])后,
2517
+ * 输入经 debounce 防抖调用,结果以 select 下拉形态呈现;
2518
+ * ↑↓ 选择、Enter 确认、Esc 关闭;选中派发 select 事件并回填搜索词。
2406
2519
  */
2407
2520
  const props = __props;
2408
2521
  const emit = __emit;
@@ -2421,14 +2534,80 @@ var _sfc_main$36 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2421
2534
  function onInput(e) {
2422
2535
  emit("update:modelValue", e.target.value);
2423
2536
  emit("search", e.target.value);
2537
+ if (props.remote) scheduleRemote(e.target.value);
2424
2538
  }
2425
2539
  function onCategoryChange(v) {
2426
2540
  categoryProxy.value = v;
2427
2541
  emit("search", props.modelValue);
2428
2542
  }
2543
+ const inputRef = ref(null);
2544
+ const inputFocused = ref(false);
2545
+ const remoteLoading = ref(false);
2546
+ const remoteResults = ref([]);
2547
+ const activeIndex = ref(-1);
2548
+ let debounceTimer = null;
2549
+ let requestSeq = 0;
2550
+ const panelOpen = computed(() => !!props.remote && inputFocused.value && (remoteLoading.value || remoteResults.value.length > 0));
2551
+ function scheduleRemote(keyword) {
2552
+ if (debounceTimer) clearTimeout(debounceTimer);
2553
+ if (!keyword) {
2554
+ remoteLoading.value = false;
2555
+ remoteResults.value = [];
2556
+ activeIndex.value = -1;
2557
+ return;
2558
+ }
2559
+ remoteLoading.value = true;
2560
+ debounceTimer = setTimeout(() => runRemote(keyword), props.debounce);
2561
+ }
2562
+ async function runRemote(keyword) {
2563
+ const seq = ++requestSeq;
2564
+ try {
2565
+ const results = await props.remote(keyword) || [];
2566
+ if (seq !== requestSeq) return;
2567
+ remoteResults.value = results;
2568
+ remoteLoading.value = false;
2569
+ activeIndex.value = results.length ? 0 : -1;
2570
+ } catch {
2571
+ if (seq !== requestSeq) return;
2572
+ remoteResults.value = [];
2573
+ remoteLoading.value = false;
2574
+ }
2575
+ }
2576
+ function moveActive(dir) {
2577
+ if (!panelOpen.value || !remoteResults.value.length) return;
2578
+ const total = remoteResults.value.length;
2579
+ activeIndex.value = ((activeIndex.value + dir) % total + total) % total;
2580
+ }
2581
+ function chooseActive() {
2582
+ if (panelOpen.value && remoteResults.value[activeIndex.value]) choose(remoteResults.value[activeIndex.value]);
2583
+ }
2584
+ function choose(option) {
2585
+ emit("select", option);
2586
+ emit("update:modelValue", option.title ?? "");
2587
+ closePanel();
2588
+ inputRef.value?.blur?.();
2589
+ }
2590
+ function closePanel() {
2591
+ inputFocused.value = false;
2592
+ remoteLoading.value = false;
2593
+ remoteResults.value = [];
2594
+ activeIndex.value = -1;
2595
+ }
2596
+ function onInputBlur() {
2597
+ setTimeout(() => {
2598
+ inputFocused.value = false;
2599
+ }, 120);
2600
+ }
2601
+ onBeforeUnmount(() => {
2602
+ if (debounceTimer) clearTimeout(debounceTimer);
2603
+ });
2429
2604
  return (_ctx, _cache) => {
2430
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-search-box", `ew-search-box--${__props.size}`]) }, [
2431
- __props.categories.length ? (openBlock(), createElementBlock("div", _hoisted_1$33, [createVNode(_sfc_main$38, {
2605
+ return openBlock(), createElementBlock("div", { class: normalizeClass([
2606
+ "ew-search-box",
2607
+ `ew-search-box--${__props.size}`,
2608
+ { "is-remote-open": panelOpen.value }
2609
+ ]) }, [
2610
+ __props.categories.length ? (openBlock(), createElementBlock("div", _hoisted_1$38, [createVNode(_sfc_main$44, {
2432
2611
  bare: "",
2433
2612
  "model-value": categoryProxy.value || normalizedCategories.value[0] && normalizedCategories.value[0].value,
2434
2613
  options: normalizedCategories.value,
@@ -2439,54 +2618,83 @@ var _sfc_main$36 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2439
2618
  "options",
2440
2619
  "aria-label"
2441
2620
  ])])) : createCommentVNode("", true),
2442
- createVNode(_sfc_main$21, {
2621
+ createVNode(_sfc_main$24, {
2443
2622
  name: "search",
2444
2623
  size: iconSize.value,
2445
2624
  class: "ew-search-box__magnifier"
2446
2625
  }, null, 8, ["size"]),
2447
- createElementVNode("input", mergeProps(_ctx.$attrs, {
2626
+ createElementVNode("input", mergeProps({
2627
+ ref_key: "inputRef",
2628
+ ref: inputRef
2629
+ }, _ctx.$attrs, {
2448
2630
  class: "ew-search-box__input",
2449
2631
  type: "search",
2450
2632
  value: __props.modelValue,
2451
2633
  placeholder: __props.placeholder,
2452
2634
  "aria-label": __props.ariaLabel || __props.placeholder,
2453
- onInput
2454
- }), null, 16, _hoisted_2$29),
2455
- _ctx.$slots.suffix ? (openBlock(), createElementBlock("div", _hoisted_3$23, [renderSlot(_ctx.$slots, "suffix")])) : createCommentVNode("", true)
2635
+ role: "combobox",
2636
+ "aria-expanded": panelOpen.value,
2637
+ "aria-autocomplete": "list",
2638
+ onInput,
2639
+ onFocus: _cache[0] || (_cache[0] = ($event) => inputFocused.value = true),
2640
+ onBlur: onInputBlur,
2641
+ onKeydown: [
2642
+ _cache[1] || (_cache[1] = withKeys(withModifiers(($event) => moveActive(1), ["prevent"]), ["down"])),
2643
+ _cache[2] || (_cache[2] = withKeys(withModifiers(($event) => moveActive(-1), ["prevent"]), ["up"])),
2644
+ withKeys(withModifiers(chooseActive, ["prevent"]), ["enter"]),
2645
+ withKeys(withModifiers(closePanel, ["prevent"]), ["esc"])
2646
+ ]
2647
+ }), null, 16, _hoisted_2$34),
2648
+ _ctx.$slots.suffix ? (openBlock(), createElementBlock("div", _hoisted_3$27, [renderSlot(_ctx.$slots, "suffix")])) : createCommentVNode("", true),
2649
+ panelOpen.value ? (openBlock(), createElementBlock("ul", _hoisted_4$26, [remoteLoading.value ? (openBlock(), createElementBlock("li", _hoisted_5$20, [createVNode(_sfc_main$24, {
2650
+ name: "search",
2651
+ size: 14
2652
+ }), _cache[3] || (_cache[3] = createTextVNode(" 搜索中… ", -1))])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [(openBlock(true), createElementBlock(Fragment, null, renderList(remoteResults.value, (option, i) => {
2653
+ return openBlock(), createElementBlock("li", {
2654
+ key: i,
2655
+ role: "option",
2656
+ "aria-selected": i === activeIndex.value
2657
+ }, [createElementVNode("button", {
2658
+ type: "button",
2659
+ class: normalizeClass(["ew-search-box__option", { "is-active": i === activeIndex.value }]),
2660
+ onMousedown: withModifiers(($event) => choose(option), ["prevent"]),
2661
+ onMouseenter: ($event) => activeIndex.value = i
2662
+ }, [createElementVNode("span", _hoisted_8$8, toDisplayString(option.title), 1), option.description ? (openBlock(), createElementBlock("span", _hoisted_9$5, toDisplayString(option.description), 1)) : createCommentVNode("", true)], 42, _hoisted_7$9)], 8, _hoisted_6$12);
2663
+ }), 128)), !remoteResults.value.length ? (openBlock(), createElementBlock("li", _hoisted_10$3, "无匹配结果")) : createCommentVNode("", true)], 64))])) : createCommentVNode("", true)
2456
2664
  ], 2);
2457
2665
  };
2458
2666
  }
2459
2667
  });
2460
2668
  //#endregion
2461
2669
  //#region src/components/icon-grid/index.vue
2462
- var _hoisted_1$32 = { class: "ew-icon-grid" };
2463
- var _hoisted_2$28 = {
2670
+ var _hoisted_1$37 = { class: "ew-icon-grid" };
2671
+ var _hoisted_2$33 = {
2464
2672
  key: 0,
2465
2673
  class: "ew-icon-grid__search"
2466
2674
  };
2467
- var _hoisted_3$22 = {
2675
+ var _hoisted_3$26 = {
2468
2676
  key: 1,
2469
2677
  class: "ew-icon-grid__state"
2470
2678
  };
2471
- var _hoisted_4$20 = { class: "ew-icon-grid__title" };
2472
- var _hoisted_5$14 = { class: "ew-icon-grid__count" };
2473
- var _hoisted_6$8 = { class: "ew-icon-grid__grid" };
2474
- var _hoisted_7$5 = [
2679
+ var _hoisted_4$25 = { class: "ew-icon-grid__title" };
2680
+ var _hoisted_5$19 = { class: "ew-icon-grid__count" };
2681
+ var _hoisted_6$11 = { class: "ew-icon-grid__grid" };
2682
+ var _hoisted_7$8 = [
2475
2683
  "title",
2476
2684
  "aria-label",
2477
2685
  "onClick"
2478
2686
  ];
2479
- var _hoisted_8$4 = {
2687
+ var _hoisted_8$7 = {
2480
2688
  viewBox: "0 0 24 24",
2481
2689
  "aria-hidden": "true"
2482
2690
  };
2483
- var _hoisted_9$3 = [
2691
+ var _hoisted_9$4 = [
2484
2692
  "d",
2485
2693
  "fill-rule",
2486
2694
  "fill"
2487
2695
  ];
2488
- var _hoisted_10$1 = { class: "ew-icon-grid__name" };
2489
- var _hoisted_11$1 = {
2696
+ var _hoisted_10$2 = { class: "ew-icon-grid__name" };
2697
+ var _hoisted_11$2 = {
2490
2698
  class: "ew-icon-grid__plus",
2491
2699
  "aria-hidden": "true"
2492
2700
  };
@@ -2494,7 +2702,7 @@ var _hoisted_12 = {
2494
2702
  key: 3,
2495
2703
  class: "ew-icon-grid__state"
2496
2704
  };
2497
- var _sfc_main$23 = {
2705
+ var _sfc_main$26 = {
2498
2706
  __name: "index",
2499
2707
  props: {
2500
2708
  /** 自定义图标集 [{ name, category, paths }];缺省用内置展示集 */
@@ -2606,7 +2814,7 @@ var _sfc_main$23 = {
2606
2814
  }
2607
2815
  }
2608
2816
  return (_ctx, _cache) => {
2609
- return openBlock(), createElementBlock("div", _hoisted_1$32, [__props.searchable ? (openBlock(), createElementBlock("div", _hoisted_2$28, [renderSlot(_ctx.$slots, "search", {}, () => [createVNode(_sfc_main$36, {
2817
+ return openBlock(), createElementBlock("div", _hoisted_1$37, [__props.searchable ? (openBlock(), createElementBlock("div", _hoisted_2$33, [renderSlot(_ctx.$slots, "search", {}, () => [createVNode(_sfc_main$42, {
2610
2818
  modelValue: keyword.value,
2611
2819
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => keyword.value = $event),
2612
2820
  category: activeCategory.value,
@@ -2622,7 +2830,7 @@ var _sfc_main$23 = {
2622
2830
  "category",
2623
2831
  "categories",
2624
2832
  "placeholder"
2625
- ])])])) : createCommentVNode("", true), loading.value ? (openBlock(), createElementBlock("div", _hoisted_3$22, [createVNode(_sfc_main$21, {
2833
+ ])])])) : createCommentVNode("", true), loading.value ? (openBlock(), createElementBlock("div", _hoisted_3$26, [createVNode(_sfc_main$24, {
2626
2834
  name: "loading",
2627
2835
  size: 20,
2628
2836
  class: "is-rotating"
@@ -2630,7 +2838,7 @@ var _sfc_main$23 = {
2630
2838
  return openBlock(), createElementBlock("section", {
2631
2839
  key: sec.key,
2632
2840
  class: "ew-icon-grid__section"
2633
- }, [createElementVNode("h3", _hoisted_4$20, [createTextVNode(toDisplayString(sec.label) + " ", 1), createElementVNode("span", _hoisted_5$14, toDisplayString(sec.icons.length), 1)]), createElementVNode("div", _hoisted_6$8, [(openBlock(true), createElementBlock(Fragment, null, renderList(sec.icons, (icon) => {
2841
+ }, [createElementVNode("h3", _hoisted_4$25, [createTextVNode(toDisplayString(sec.label) + " ", 1), createElementVNode("span", _hoisted_5$19, toDisplayString(sec.icons.length), 1)]), createElementVNode("div", _hoisted_6$11, [(openBlock(true), createElementBlock(Fragment, null, renderList(sec.icons, (icon) => {
2634
2842
  return openBlock(), createElementBlock("button", {
2635
2843
  key: icon.name,
2636
2844
  type: "button",
@@ -2639,20 +2847,20 @@ var _sfc_main$23 = {
2639
2847
  "aria-label": `复制图标名 ${icon.name}`,
2640
2848
  onClick: ($event) => pick(icon)
2641
2849
  }, [
2642
- (openBlock(), createElementBlock("svg", _hoisted_8$4, [(openBlock(true), createElementBlock(Fragment, null, renderList(icon.paths, (p, i) => {
2850
+ (openBlock(), createElementBlock("svg", _hoisted_8$7, [(openBlock(true), createElementBlock(Fragment, null, renderList(icon.paths, (p, i) => {
2643
2851
  return openBlock(), createElementBlock("path", {
2644
2852
  key: i,
2645
2853
  d: p.d,
2646
2854
  "fill-rule": p.fillRule,
2647
2855
  fill: p.fill
2648
- }, null, 8, _hoisted_9$3);
2856
+ }, null, 8, _hoisted_9$4);
2649
2857
  }), 128))])),
2650
- createElementVNode("span", _hoisted_10$1, toDisplayString(icon.name), 1),
2651
- createElementVNode("span", _hoisted_11$1, [createVNode(_sfc_main$21, {
2858
+ createElementVNode("span", _hoisted_10$2, toDisplayString(icon.name), 1),
2859
+ createElementVNode("span", _hoisted_11$2, [createVNode(_sfc_main$24, {
2652
2860
  name: copiedName.value === icon.name ? "check" : "plus",
2653
2861
  size: 12
2654
2862
  }, null, 8, ["name"])])
2655
- ], 10, _hoisted_7$5);
2863
+ ], 10, _hoisted_7$8);
2656
2864
  }), 128))])]);
2657
2865
  }), 128)) : (openBlock(), createElementBlock("div", _hoisted_12, [createElementVNode("span", null, [_cache[3] || (_cache[3] = createTextVNode("No icons found", -1)), keyword.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createTextVNode(" for “" + toDisplayString(keyword.value) + "”", 1)], 64)) : createCommentVNode("", true)])]))]);
2658
2866
  };
@@ -2660,17 +2868,17 @@ var _sfc_main$23 = {
2660
2868
  };
2661
2869
  //#endregion
2662
2870
  //#region src/components/feature-grid/index.vue
2663
- var _hoisted_1$31 = {
2871
+ var _hoisted_1$36 = {
2664
2872
  key: 0,
2665
2873
  class: "ew-feature__icon"
2666
2874
  };
2667
- var _hoisted_2$27 = { class: "ew-feature__text" };
2668
- var _hoisted_3$21 = { class: "ew-feature__title" };
2669
- var _hoisted_4$19 = {
2875
+ var _hoisted_2$32 = { class: "ew-feature__text" };
2876
+ var _hoisted_3$25 = { class: "ew-feature__title" };
2877
+ var _hoisted_4$24 = {
2670
2878
  key: 0,
2671
2879
  class: "ew-feature__description"
2672
2880
  };
2673
- var _sfc_main$17 = {
2881
+ var _sfc_main$20 = {
2674
2882
  __name: "index",
2675
2883
  props: {
2676
2884
  /** [{ icon, title, description }] */
@@ -2745,46 +2953,51 @@ var _sfc_main$17 = {
2745
2953
  key: item.title,
2746
2954
  class: normalizeClass(["ew-feature", `is-${__props.variant}`]),
2747
2955
  style: normalizeStyle({ "--feature-delay": `${i * __props.stagger}ms` })
2748
- }, [item.icon ? (openBlock(), createElementBlock("span", _hoisted_1$31, [createVNode(_sfc_main$21, {
2956
+ }, [item.icon ? (openBlock(), createElementBlock("span", _hoisted_1$36, [createVNode(_sfc_main$24, {
2749
2957
  name: item.icon,
2750
2958
  size: __props.variant === "bullets" ? 20 : 22
2751
- }, null, 8, ["name", "size"])])) : createCommentVNode("", true), createElementVNode("div", _hoisted_2$27, [createElementVNode("h4", _hoisted_3$21, toDisplayString(item.title), 1), item.description ? (openBlock(), createElementBlock("p", _hoisted_4$19, toDisplayString(item.description), 1)) : createCommentVNode("", true)])], 6);
2959
+ }, null, 8, ["name", "size"])])) : createCommentVNode("", true), createElementVNode("div", _hoisted_2$32, [createElementVNode("h4", _hoisted_3$25, toDisplayString(item.title), 1), item.description ? (openBlock(), createElementBlock("p", _hoisted_4$24, toDisplayString(item.description), 1)) : createCommentVNode("", true)])], 6);
2752
2960
  }), 128))], 2);
2753
2961
  };
2754
2962
  }
2755
2963
  };
2756
2964
  //#endregion
2757
2965
  //#region src/components/pricing-card/index.vue
2758
- var _hoisted_1$30 = {
2966
+ var _hoisted_1$35 = {
2759
2967
  key: 0,
2760
2968
  class: "ew-pricing-card__badge"
2761
2969
  };
2762
- var _hoisted_2$26 = { class: "ew-pricing-card__title" };
2763
- var _hoisted_3$20 = {
2970
+ var _hoisted_2$31 = { class: "ew-pricing-card__title" };
2971
+ var _hoisted_3$24 = {
2764
2972
  key: 1,
2765
2973
  class: "ew-pricing-card__description"
2766
2974
  };
2767
- var _hoisted_4$18 = {
2975
+ var _hoisted_4$23 = {
2768
2976
  key: 2,
2769
2977
  class: "ew-pricing-card__price-row"
2770
2978
  };
2771
- var _hoisted_5$13 = { class: "ew-pricing-card__price" };
2772
- var _hoisted_6$7 = {
2979
+ var _hoisted_5$18 = { class: "ew-pricing-card__price" };
2980
+ var _hoisted_6$10 = {
2773
2981
  key: 0,
2774
2982
  class: "ew-pricing-card__original"
2775
2983
  };
2776
- var _hoisted_7$4 = {
2984
+ var _hoisted_7$7 = {
2777
2985
  key: 3,
2778
2986
  class: "ew-pricing-card__note"
2779
2987
  };
2780
- var _hoisted_8$3 = {
2988
+ var _hoisted_8$6 = {
2781
2989
  key: 4,
2782
2990
  class: "ew-pricing-card__features"
2783
2991
  };
2784
- var _hoisted_9$2 = { class: "ew-pricing-card__footer" };
2785
- var _sfc_main$32 = {
2992
+ var _hoisted_9$3 = { class: "ew-pricing-card__footer" };
2993
+ var _sfc_main$38 = {
2786
2994
  __name: "index",
2787
2995
  props: {
2996
+ /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
2997
+ glass: {
2998
+ type: Boolean,
2999
+ default: void 0
3000
+ },
2788
3001
  title: {
2789
3002
  type: String,
2790
3003
  default: ""
@@ -2841,23 +3054,27 @@ var _sfc_main$32 = {
2841
3054
  */
2842
3055
  const emit = __emit;
2843
3056
  return (_ctx, _cache) => {
2844
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-pricing-card", { "is-featured": __props.featured }]) }, [
2845
- __props.badge ? (openBlock(), createElementBlock("span", _hoisted_1$30, [renderSlot(_ctx.$slots, "badge", {}, () => [createTextVNode(toDisplayString(__props.badge), 1)])])) : createCommentVNode("", true),
2846
- createElementVNode("h3", _hoisted_2$26, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
2847
- __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_3$20, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
2848
- __props.price ? (openBlock(), createElementBlock("div", _hoisted_4$18, [createElementVNode("span", _hoisted_5$13, [renderSlot(_ctx.$slots, "price", {}, () => [createTextVNode(toDisplayString(__props.price), 1)])]), __props.originalPrice ? (openBlock(), createElementBlock("del", _hoisted_6$7, toDisplayString(__props.originalPrice), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true),
2849
- __props.offerNote || _ctx.$slots.note ? (openBlock(), createElementBlock("div", _hoisted_7$4, [renderSlot(_ctx.$slots, "note", {}, () => [createTextVNode(toDisplayString(__props.offerNote), 1)])])) : createCommentVNode("", true),
2850
- __props.features.length || _ctx.$slots.features ? (openBlock(), createElementBlock("ul", _hoisted_8$3, [renderSlot(_ctx.$slots, "features", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.features, (item) => {
3057
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-pricing-card", {
3058
+ "is-featured": __props.featured,
3059
+ "is-glass": __props.glass === true,
3060
+ "no-glass": __props.glass === false
3061
+ }]) }, [
3062
+ __props.badge ? (openBlock(), createElementBlock("span", _hoisted_1$35, [renderSlot(_ctx.$slots, "badge", {}, () => [createTextVNode(toDisplayString(__props.badge), 1)])])) : createCommentVNode("", true),
3063
+ createElementVNode("h3", _hoisted_2$31, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
3064
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_3$24, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
3065
+ __props.price ? (openBlock(), createElementBlock("div", _hoisted_4$23, [createElementVNode("span", _hoisted_5$18, [renderSlot(_ctx.$slots, "price", {}, () => [createTextVNode(toDisplayString(__props.price), 1)])]), __props.originalPrice ? (openBlock(), createElementBlock("del", _hoisted_6$10, toDisplayString(__props.originalPrice), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true),
3066
+ __props.offerNote || _ctx.$slots.note ? (openBlock(), createElementBlock("div", _hoisted_7$7, [renderSlot(_ctx.$slots, "note", {}, () => [createTextVNode(toDisplayString(__props.offerNote), 1)])])) : createCommentVNode("", true),
3067
+ __props.features.length || _ctx.$slots.features ? (openBlock(), createElementBlock("ul", _hoisted_8$6, [renderSlot(_ctx.$slots, "features", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.features, (item) => {
2851
3068
  return openBlock(), createElementBlock("li", {
2852
3069
  key: item,
2853
3070
  class: "ew-pricing-card__feature"
2854
- }, [createVNode(_sfc_main$21, {
3071
+ }, [createVNode(_sfc_main$24, {
2855
3072
  name: "check",
2856
3073
  size: 16,
2857
3074
  class: "ew-pricing-card__check"
2858
3075
  }), createElementVNode("span", null, toDisplayString(item), 1)]);
2859
3076
  }), 128))])])) : createCommentVNode("", true),
2860
- createElementVNode("div", _hoisted_9$2, [renderSlot(_ctx.$slots, "action", {}, () => [createVNode(_sfc_main$7, {
3077
+ createElementVNode("div", _hoisted_9$3, [renderSlot(_ctx.$slots, "action", {}, () => [createVNode(_sfc_main$9, {
2861
3078
  variant: __props.featured ? "primary" : "dark",
2862
3079
  block: "",
2863
3080
  pill: __props.pill,
@@ -2872,16 +3089,16 @@ var _sfc_main$32 = {
2872
3089
  };
2873
3090
  //#endregion
2874
3091
  //#region src/components/faq/index.vue
2875
- var _hoisted_1$29 = { class: "ew-faq" };
2876
- var _hoisted_2$25 = ["aria-expanded", "onClick"];
2877
- var _hoisted_3$19 = { class: "ew-faq__question-text" };
2878
- var _hoisted_4$17 = {
3092
+ var _hoisted_1$34 = { class: "ew-faq" };
3093
+ var _hoisted_2$30 = ["aria-expanded", "onClick"];
3094
+ var _hoisted_3$23 = { class: "ew-faq__question-text" };
3095
+ var _hoisted_4$22 = {
2879
3096
  class: "ew-faq__indicator",
2880
3097
  "aria-hidden": "true"
2881
3098
  };
2882
- var _hoisted_5$12 = { class: "ew-faq__answer-wrap" };
2883
- var _hoisted_6$6 = { class: "ew-faq__answer" };
2884
- var _sfc_main$16 = {
3099
+ var _hoisted_5$17 = { class: "ew-faq__answer-wrap" };
3100
+ var _hoisted_6$9 = { class: "ew-faq__answer" };
3101
+ var _sfc_main$19 = {
2885
3102
  __name: "index",
2886
3103
  props: {
2887
3104
  /** [{ question, answer }] */
@@ -2920,7 +3137,7 @@ var _sfc_main$16 = {
2920
3137
  openSet.value = next;
2921
3138
  }
2922
3139
  return (_ctx, _cache) => {
2923
- return openBlock(), createElementBlock("div", _hoisted_1$29, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
3140
+ return openBlock(), createElementBlock("div", _hoisted_1$34, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
2924
3141
  return openBlock(), createElementBlock("div", {
2925
3142
  key: i,
2926
3143
  class: normalizeClass(["ew-faq__item", { "is-open": isOpen(i) }])
@@ -2929,7 +3146,7 @@ var _sfc_main$16 = {
2929
3146
  class: "ew-faq__question",
2930
3147
  "aria-expanded": isOpen(i),
2931
3148
  onClick: ($event) => toggle(i)
2932
- }, [createElementVNode("span", _hoisted_3$19, toDisplayString(item.question), 1), createElementVNode("span", _hoisted_4$17, toDisplayString(isOpen(i) ? "−" : "+"), 1)], 8, _hoisted_2$25), createElementVNode("div", _hoisted_5$12, [createElementVNode("div", _hoisted_6$6, [renderSlot(_ctx.$slots, "answer", {
3149
+ }, [createElementVNode("span", _hoisted_3$23, toDisplayString(item.question), 1), createElementVNode("span", _hoisted_4$22, toDisplayString(isOpen(i) ? "−" : "+"), 1)], 8, _hoisted_2$30), createElementVNode("div", _hoisted_5$17, [createElementVNode("div", _hoisted_6$9, [renderSlot(_ctx.$slots, "answer", {
2933
3150
  item,
2934
3151
  index: i
2935
3152
  }, () => [createTextVNode(toDisplayString(item.answer), 1)])])])], 2);
@@ -2939,17 +3156,17 @@ var _sfc_main$16 = {
2939
3156
  };
2940
3157
  //#endregion
2941
3158
  //#region src/components/alert/index.vue
2942
- var _hoisted_1$28 = {
3159
+ var _hoisted_1$33 = {
2943
3160
  key: 0,
2944
3161
  class: "ew-alert__icon"
2945
3162
  };
2946
- var _hoisted_2$24 = { class: "ew-alert__content" };
2947
- var _hoisted_3$18 = {
3163
+ var _hoisted_2$29 = { class: "ew-alert__content" };
3164
+ var _hoisted_3$22 = {
2948
3165
  key: 0,
2949
3166
  class: "ew-alert__title"
2950
3167
  };
2951
- var _hoisted_4$16 = { class: "ew-alert__message" };
2952
- var _hoisted_5$11 = {
3168
+ var _hoisted_4$21 = { class: "ew-alert__message" };
3169
+ var _hoisted_5$16 = {
2953
3170
  key: 1,
2954
3171
  class: "ew-alert__action"
2955
3172
  };
@@ -3002,19 +3219,19 @@ var _sfc_main$1 = {
3002
3219
  ]),
3003
3220
  role: "status"
3004
3221
  }, [
3005
- __props.icon || _ctx.$slots.icon ? (openBlock(), createElementBlock("span", _hoisted_1$28, [renderSlot(_ctx.$slots, "icon", {}, () => [createVNode(_sfc_main$21, {
3222
+ __props.icon || _ctx.$slots.icon ? (openBlock(), createElementBlock("span", _hoisted_1$33, [renderSlot(_ctx.$slots, "icon", {}, () => [createVNode(_sfc_main$24, {
3006
3223
  name: __props.icon,
3007
3224
  size: __props.pill ? 16 : 18
3008
3225
  }, null, 8, ["name", "size"])])])) : createCommentVNode("", true),
3009
- createElementVNode("div", _hoisted_2$24, [__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("strong", _hoisted_3$18, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true), createElementVNode("span", _hoisted_4$16, [renderSlot(_ctx.$slots, "default")])]),
3010
- _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$11, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true),
3226
+ createElementVNode("div", _hoisted_2$29, [__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("strong", _hoisted_3$22, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true), createElementVNode("span", _hoisted_4$21, [renderSlot(_ctx.$slots, "default")])]),
3227
+ _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$16, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true),
3011
3228
  __props.closable ? (openBlock(), createElementBlock("button", {
3012
3229
  key: 2,
3013
3230
  type: "button",
3014
3231
  class: "ew-alert__close",
3015
3232
  "aria-label": "关闭",
3016
3233
  onClick: _cache[0] || (_cache[0] = ($event) => visible.value = false)
3017
- }, [createVNode(_sfc_main$21, {
3234
+ }, [createVNode(_sfc_main$24, {
3018
3235
  name: "close",
3019
3236
  size: 14
3020
3237
  })])) : createCommentVNode("", true)
@@ -3024,24 +3241,24 @@ var _sfc_main$1 = {
3024
3241
  };
3025
3242
  //#endregion
3026
3243
  //#region src/components/code-block/index.vue
3027
- var _hoisted_1$27 = { class: "ew-code-block" };
3028
- var _hoisted_2$23 = { class: "ew-code-block__titlebar" };
3029
- var _hoisted_3$17 = {
3244
+ var _hoisted_1$32 = { class: "ew-code-block" };
3245
+ var _hoisted_2$28 = { class: "ew-code-block__titlebar" };
3246
+ var _hoisted_3$21 = {
3030
3247
  key: 0,
3031
3248
  class: "ew-code-block__title"
3032
3249
  };
3033
- var _hoisted_4$15 = ["aria-label"];
3034
- var _hoisted_5$10 = {
3250
+ var _hoisted_4$20 = ["aria-label"];
3251
+ var _hoisted_5$15 = {
3035
3252
  key: 0,
3036
3253
  class: "ew-code-block__copy-text"
3037
3254
  };
3038
- var _hoisted_6$5 = { class: "ew-code-block__body" };
3039
- var _hoisted_7$3 = {
3255
+ var _hoisted_6$8 = { class: "ew-code-block__body" };
3256
+ var _hoisted_7$6 = {
3040
3257
  key: 0,
3041
3258
  class: "ew-code-block__prefix"
3042
3259
  };
3043
- var _hoisted_8$2 = { class: "ew-code-block__code" };
3044
- var _sfc_main$10 = {
3260
+ var _hoisted_8$5 = { class: "ew-code-block__code" };
3261
+ var _sfc_main$12 = {
3045
3262
  __name: "index",
3046
3263
  props: {
3047
3264
  /** 代码/命令文案(亦可用默认插槽承载高亮内容) */
@@ -3083,7 +3300,7 @@ var _sfc_main$10 = {
3083
3300
  if (await copy(text)) emit("copy", text);
3084
3301
  }
3085
3302
  return (_ctx, _cache) => {
3086
- return openBlock(), createElementBlock("div", _hoisted_1$27, [createElementVNode("div", _hoisted_2$23, [
3303
+ return openBlock(), createElementBlock("div", _hoisted_1$32, [createElementVNode("div", _hoisted_2$28, [
3087
3304
  _cache[0] || (_cache[0] = createElementVNode("span", {
3088
3305
  class: "ew-code-block__lights",
3089
3306
  "aria-hidden": "true"
@@ -3092,25 +3309,25 @@ var _sfc_main$10 = {
3092
3309
  createElementVNode("i", { class: "ew-code-block__light is-yellow" }),
3093
3310
  createElementVNode("i", { class: "ew-code-block__light is-green" })
3094
3311
  ], -1)),
3095
- __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("span", _hoisted_3$17, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true),
3312
+ __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("span", _hoisted_3$21, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true),
3096
3313
  __props.copyable ? (openBlock(), createElementBlock("button", {
3097
3314
  key: 1,
3098
3315
  type: "button",
3099
3316
  class: normalizeClass(["ew-code-block__copy", { "is-copied": unref(copied) }]),
3100
3317
  "aria-label": unref(copied) ? "已复制" : "复制",
3101
3318
  onClick: onCopy
3102
- }, [createVNode(_sfc_main$21, {
3319
+ }, [createVNode(_sfc_main$24, {
3103
3320
  name: unref(copied) ? "check" : "copy",
3104
3321
  size: 14
3105
- }, null, 8, ["name"]), __props.showCopyText ? (openBlock(), createElementBlock("span", _hoisted_5$10, toDisplayString(unref(copied) ? "Copied" : "Copy"), 1)) : createCommentVNode("", true)], 10, _hoisted_4$15)) : createCommentVNode("", true)
3106
- ]), createElementVNode("div", _hoisted_6$5, [__props.prefix ? (openBlock(), createElementBlock("span", _hoisted_7$3, toDisplayString(__props.prefix), 1)) : createCommentVNode("", true), createElementVNode("code", _hoisted_8$2, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.code), 1)])])])]);
3322
+ }, null, 8, ["name"]), __props.showCopyText ? (openBlock(), createElementBlock("span", _hoisted_5$15, toDisplayString(unref(copied) ? "Copied" : "Copy"), 1)) : createCommentVNode("", true)], 10, _hoisted_4$20)) : createCommentVNode("", true)
3323
+ ]), createElementVNode("div", _hoisted_6$8, [__props.prefix ? (openBlock(), createElementBlock("span", _hoisted_7$6, toDisplayString(__props.prefix), 1)) : createCommentVNode("", true), createElementVNode("code", _hoisted_8$5, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.code), 1)])])])]);
3107
3324
  };
3108
3325
  }
3109
3326
  };
3110
3327
  //#endregion
3111
3328
  //#region src/components/keycap/index.vue
3112
- var _hoisted_1$26 = { class: "ew-keycap" };
3113
- var _sfc_main$25 = {
3329
+ var _hoisted_1$31 = { class: "ew-keycap" };
3330
+ var _sfc_main$30 = {
3114
3331
  __name: "index",
3115
3332
  props: {
3116
3333
  /** 单键字符串或组合键数组 */
@@ -3126,7 +3343,7 @@ keys: {
3126
3343
  const props = __props;
3127
3344
  const keys = computed(() => Array.isArray(props.keys) ? props.keys : String(props.keys).split(""));
3128
3345
  return (_ctx, _cache) => {
3129
- return openBlock(), createElementBlock("span", _hoisted_1$26, [(openBlock(true), createElementBlock(Fragment, null, renderList(keys.value, (k, i) => {
3346
+ return openBlock(), createElementBlock("span", _hoisted_1$31, [(openBlock(true), createElementBlock(Fragment, null, renderList(keys.value, (k, i) => {
3130
3347
  return openBlock(), createElementBlock("kbd", {
3131
3348
  key: i,
3132
3349
  class: "ew-keycap__key"
@@ -3159,18 +3376,18 @@ function onInView(el, onEnter, onFallback, options = {}) {
3159
3376
  }
3160
3377
  //#endregion
3161
3378
  //#region src/components/statistic/index.vue
3162
- var _hoisted_1$25 = { class: "ew-statistic__value" };
3163
- var _hoisted_2$22 = {
3379
+ var _hoisted_1$30 = { class: "ew-statistic__value" };
3380
+ var _hoisted_2$27 = {
3164
3381
  key: 0,
3165
3382
  class: "ew-statistic__sizer",
3166
3383
  "aria-hidden": "true"
3167
3384
  };
3168
- var _hoisted_3$16 = { class: "ew-statistic__num" };
3169
- var _hoisted_4$14 = {
3385
+ var _hoisted_3$20 = { class: "ew-statistic__num" };
3386
+ var _hoisted_4$19 = {
3170
3387
  key: 0,
3171
3388
  class: "ew-statistic__label"
3172
3389
  };
3173
- var _sfc_main$39 = {
3390
+ var _sfc_main$45 = {
3174
3391
  __name: "index",
3175
3392
  props: {
3176
3393
  value: {
@@ -3270,13 +3487,13 @@ var _sfc_main$39 = {
3270
3487
  ref_key: "rootRef",
3271
3488
  ref: rootRef,
3272
3489
  class: normalizeClass(["ew-statistic", `is-${__props.align}`])
3273
- }, [createElementVNode("div", _hoisted_1$25, [__props.animated && sizerText.value ? (openBlock(), createElementBlock("span", _hoisted_2$22, toDisplayString(sizerText.value), 1)) : createCommentVNode("", true), createElementVNode("span", _hoisted_3$16, [renderSlot(_ctx.$slots, "value", {}, () => [createTextVNode(toDisplayString(shown.value), 1)])])]), __props.label || _ctx.$slots.label ? (openBlock(), createElementBlock("div", _hoisted_4$14, [renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])])) : createCommentVNode("", true)], 2);
3490
+ }, [createElementVNode("div", _hoisted_1$30, [__props.animated && sizerText.value ? (openBlock(), createElementBlock("span", _hoisted_2$27, toDisplayString(sizerText.value), 1)) : createCommentVNode("", true), createElementVNode("span", _hoisted_3$20, [renderSlot(_ctx.$slots, "value", {}, () => [createTextVNode(toDisplayString(shown.value), 1)])])]), __props.label || _ctx.$slots.label ? (openBlock(), createElementBlock("div", _hoisted_4$19, [renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label), 1)])])) : createCommentVNode("", true)], 2);
3274
3491
  };
3275
3492
  }
3276
3493
  };
3277
3494
  //#endregion
3278
3495
  //#region src/components/theme-toggle/index.vue
3279
- var _sfc_main$46 = {
3496
+ var _sfc_main$52 = {
3280
3497
  __name: "index",
3281
3498
  props: {
3282
3499
  variant: {
@@ -3299,7 +3516,7 @@ var _sfc_main$46 = {
3299
3516
  */
3300
3517
  const { isDark, toggleTheme } = useTheme();
3301
3518
  return (_ctx, _cache) => {
3302
- return openBlock(), createBlock(_sfc_main$22, {
3519
+ return openBlock(), createBlock(_sfc_main$25, {
3303
3520
  icon: unref(isDark) ? "sun" : "moon",
3304
3521
  variant: __props.variant,
3305
3522
  size: __props.size,
@@ -3319,15 +3536,15 @@ var _sfc_main$46 = {
3319
3536
  };
3320
3537
  //#endregion
3321
3538
  //#region src/components/quote/index.vue
3322
- var _hoisted_1$24 = { class: "ew-quote__text" };
3323
- var _hoisted_2$21 = { class: "ew-quote__author" };
3324
- var _hoisted_3$15 = { class: "ew-quote__name" };
3325
- var _hoisted_4$13 = {
3539
+ var _hoisted_1$29 = { class: "ew-quote__text" };
3540
+ var _hoisted_2$26 = { class: "ew-quote__author" };
3541
+ var _hoisted_3$19 = { class: "ew-quote__name" };
3542
+ var _hoisted_4$18 = {
3326
3543
  key: 0,
3327
3544
  class: "ew-quote__role"
3328
3545
  };
3329
- var _hoisted_5$9 = ["href"];
3330
- var _sfc_main$35 = {
3546
+ var _hoisted_5$14 = ["href"];
3547
+ var _sfc_main$41 = {
3331
3548
  __name: "index",
3332
3549
  props: {
3333
3550
  quote: {
@@ -3361,26 +3578,26 @@ var _sfc_main$35 = {
3361
3578
  * EwQuote — 引用/评价卡(launchos 用户评价语言)
3362
3579
  */
3363
3580
  return (_ctx, _cache) => {
3364
- return openBlock(), createElementBlock("figure", { class: normalizeClass(["ew-quote", { "is-sticker": __props.sticker }]) }, [createElementVNode("blockquote", _hoisted_1$24, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.quote), 1)])]), createElementVNode("figcaption", _hoisted_2$21, [renderSlot(_ctx.$slots, "author", {}, () => [
3365
- createElementVNode("span", _hoisted_3$15, toDisplayString(__props.author), 1),
3366
- __props.role ? (openBlock(), createElementBlock("span", _hoisted_4$13, toDisplayString(__props.role), 1)) : createCommentVNode("", true),
3581
+ return openBlock(), createElementBlock("figure", { class: normalizeClass(["ew-quote", { "is-sticker": __props.sticker }]) }, [createElementVNode("blockquote", _hoisted_1$29, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.quote), 1)])]), createElementVNode("figcaption", _hoisted_2$26, [renderSlot(_ctx.$slots, "author", {}, () => [
3582
+ createElementVNode("span", _hoisted_3$19, toDisplayString(__props.author), 1),
3583
+ __props.role ? (openBlock(), createElementBlock("span", _hoisted_4$18, toDisplayString(__props.role), 1)) : createCommentVNode("", true),
3367
3584
  __props.source && __props.sourceHref ? (openBlock(), createElementBlock("a", {
3368
3585
  key: 1,
3369
3586
  href: __props.sourceHref,
3370
3587
  target: "_blank",
3371
3588
  rel: "noopener",
3372
3589
  class: "ew-quote__source"
3373
- }, [createTextVNode(toDisplayString(__props.source) + " ", 1), createVNode(_sfc_main$21, {
3590
+ }, [createTextVNode(toDisplayString(__props.source) + " ", 1), createVNode(_sfc_main$24, {
3374
3591
  name: "external-link",
3375
3592
  size: 12
3376
- })], 8, _hoisted_5$9)) : createCommentVNode("", true)
3593
+ })], 8, _hoisted_5$14)) : createCommentVNode("", true)
3377
3594
  ])])], 2);
3378
3595
  };
3379
3596
  }
3380
3597
  };
3381
3598
  //#endregion
3382
3599
  //#region src/components/config-provider/index.vue
3383
- var _sfc_main$12 = {
3600
+ var _sfc_main$14 = {
3384
3601
  __name: "index",
3385
3602
  props: {
3386
3603
  /** 主色(hex),淡色阶自动生成 */
@@ -3421,6 +3638,11 @@ var _sfc_main$12 = {
3421
3638
  global: {
3422
3639
  type: Boolean,
3423
3640
  default: true
3641
+ },
3642
+ /** 全局磨砂:开启后容器类组件(card/section/footer/navbar…)默认玻璃质感,组件级 glass prop 可单独覆盖 */
3643
+ glass: {
3644
+ type: Boolean,
3645
+ default: false
3424
3646
  }
3425
3647
  },
3426
3648
  setup(__props) {
@@ -3455,6 +3677,15 @@ var _sfc_main$12 = {
3455
3677
  const vars = resolveThemeVars(props);
3456
3678
  for (const [name, value] of Object.entries(vars)) style.setProperty(name, value);
3457
3679
  }, { immediate: true });
3680
+ watch(() => props.glass, (on) => {
3681
+ if (typeof document === "undefined") return;
3682
+ if (on) document.documentElement.setAttribute("data-ew-glass", "on");
3683
+ else document.documentElement.removeAttribute("data-ew-glass");
3684
+ }, { immediate: true });
3685
+ onUnmounted(() => {
3686
+ if (typeof document === "undefined") return;
3687
+ document.documentElement.removeAttribute("data-ew-glass");
3688
+ });
3458
3689
  return (_ctx, _cache) => {
3459
3690
  return !__props.global ? (openBlock(), createElementBlock("div", {
3460
3691
  key: 0,
@@ -3466,9 +3697,9 @@ var _sfc_main$12 = {
3466
3697
  };
3467
3698
  //#endregion
3468
3699
  //#region src/components/tabs/index.vue
3469
- var _hoisted_1$23 = ["aria-selected", "onClick"];
3470
- var _hoisted_2$20 = ["aria-selected", "onClick"];
3471
- var _sfc_main$43 = {
3700
+ var _hoisted_1$28 = ["aria-selected", "onClick"];
3701
+ var _hoisted_2$25 = ["aria-selected", "onClick"];
3702
+ var _sfc_main$49 = {
3472
3703
  __name: "index",
3473
3704
  props: {
3474
3705
  /** 当前值(v-model) */
@@ -3596,11 +3827,11 @@ var _sfc_main$43 = {
3596
3827
  "is-disabled": item.disabled
3597
3828
  }]),
3598
3829
  onClick: ($event) => select(item)
3599
- }, [item.icon ? (openBlock(), createBlock(_sfc_main$21, {
3830
+ }, [item.icon ? (openBlock(), createBlock(_sfc_main$24, {
3600
3831
  key: 0,
3601
3832
  name: item.icon,
3602
3833
  size: iconSize.value
3603
- }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(item.label), 1)], 10, _hoisted_1$23);
3834
+ }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(item.label), 1)], 10, _hoisted_1$28);
3604
3835
  }), 128))], 64)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(__props.items, (item) => {
3605
3836
  return openBlock(), createElementBlock("button", {
3606
3837
  key: item.value,
@@ -3612,19 +3843,19 @@ var _sfc_main$43 = {
3612
3843
  "is-disabled": item.disabled
3613
3844
  }]),
3614
3845
  onClick: ($event) => select(item)
3615
- }, [item.icon ? (openBlock(), createBlock(_sfc_main$21, {
3846
+ }, [item.icon ? (openBlock(), createBlock(_sfc_main$24, {
3616
3847
  key: 0,
3617
3848
  name: item.icon,
3618
3849
  size: iconSize.value
3619
- }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(item.label), 1)], 10, _hoisted_2$20);
3850
+ }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(item.label), 1)], 10, _hoisted_2$25);
3620
3851
  }), 128))], 2);
3621
3852
  };
3622
3853
  }
3623
3854
  };
3624
3855
  //#endregion
3625
3856
  //#region src/components/switch-comp/index.vue
3626
- var _hoisted_1$22 = ["aria-checked", "disabled"];
3627
- var _sfc_main$40 = {
3857
+ var _hoisted_1$27 = ["aria-checked", "disabled"];
3858
+ var _sfc_main$46 = {
3628
3859
  __name: "index",
3629
3860
  props: {
3630
3861
  /** 当前状态(v-model) */
@@ -3680,13 +3911,13 @@ var _sfc_main$40 = {
3680
3911
  "aria-checked": unref(checked),
3681
3912
  disabled: __props.disabled,
3682
3913
  onClick: toggle
3683
- }, [..._cache[0] || (_cache[0] = [createElementVNode("span", { class: "ew-switch__knob" }, null, -1)])], 10, _hoisted_1$22);
3914
+ }, [..._cache[0] || (_cache[0] = [createElementVNode("span", { class: "ew-switch__knob" }, null, -1)])], 10, _hoisted_1$27);
3684
3915
  };
3685
3916
  }
3686
3917
  };
3687
3918
  //#endregion
3688
3919
  //#region src/components/container/index.vue
3689
- var _sfc_main$14 = /*@__PURE__*/ Object.assign({ name: "EwContainer" }, {
3920
+ var _sfc_main$16 = /*@__PURE__*/ Object.assign({ name: "EwContainer" }, {
3690
3921
  __name: "index",
3691
3922
  props: {
3692
3923
  width: {
@@ -3715,12 +3946,12 @@ var _sfc_main$14 = /*@__PURE__*/ Object.assign({ name: "EwContainer" }, {
3715
3946
  });
3716
3947
  //#endregion
3717
3948
  //#region src/components/avatar/index.vue
3718
- var _hoisted_1$21 = ["src", "alt"];
3719
- var _hoisted_2$19 = {
3949
+ var _hoisted_1$26 = ["src", "alt"];
3950
+ var _hoisted_2$24 = {
3720
3951
  key: 2,
3721
3952
  class: "ew-avatar__fallback"
3722
3953
  };
3723
- var _sfc_main$4 = {
3954
+ var _sfc_main$5 = {
3724
3955
  __name: "index",
3725
3956
  props: {
3726
3957
  src: {
@@ -3791,18 +4022,18 @@ var _sfc_main$4 = {
3791
4022
  alt: __props.alt || __props.name,
3792
4023
  class: "ew-avatar__img",
3793
4024
  onError: _cache[0] || (_cache[0] = ($event) => imgFailed.value = true)
3794
- }, null, 40, _hoisted_1$21)) : __props.icon ? (openBlock(), createBlock(_sfc_main$21, {
4025
+ }, null, 40, _hoisted_1$26)) : __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
3795
4026
  key: 1,
3796
4027
  name: __props.icon,
3797
4028
  size: iconSize.value
3798
- }, null, 8, ["name", "size"])) : (openBlock(), createElementBlock("span", _hoisted_2$19, toDisplayString(initials.value), 1))], 6);
4029
+ }, null, 8, ["name", "size"])) : (openBlock(), createElementBlock("span", _hoisted_2$24, toDisplayString(initials.value), 1))], 6);
3799
4030
  };
3800
4031
  }
3801
4032
  };
3802
4033
  //#endregion
3803
4034
  //#region src/components/avatar/group.vue
3804
- var _hoisted_1$20 = { class: "ew-avatar-group" };
3805
- var _sfc_main$5 = {
4035
+ var _hoisted_1$25 = { class: "ew-avatar-group" };
4036
+ var _sfc_main$6 = {
3806
4037
  __name: "group",
3807
4038
  props: {
3808
4039
  items: {
@@ -3835,9 +4066,9 @@ var _sfc_main$5 = {
3835
4066
  };
3836
4067
  });
3837
4068
  return (_ctx, _cache) => {
3838
- return openBlock(), createElementBlock("div", _hoisted_1$20, [
4069
+ return openBlock(), createElementBlock("div", _hoisted_1$25, [
3839
4070
  (openBlock(true), createElementBlock(Fragment, null, renderList(shown.value, (item, i) => {
3840
- return openBlock(), createBlock(_sfc_main$4, mergeProps({ key: item.src || item.name || i }, { ref_for: true }, item, { style: { zIndex: shown.value.length - i } }), null, 16, ["style"]);
4071
+ return openBlock(), createBlock(_sfc_main$5, mergeProps({ key: item.src || item.name || i }, { ref_for: true }, item, { style: { zIndex: shown.value.length - i } }), null, 16, ["style"]);
3841
4072
  }), 128)),
3842
4073
  renderSlot(_ctx.$slots, "default"),
3843
4074
  overflow.value > 0 ? (openBlock(), createElementBlock("span", {
@@ -3851,18 +4082,18 @@ var _sfc_main$5 = {
3851
4082
  };
3852
4083
  //#endregion
3853
4084
  //#region src/components/timeline/index.vue
3854
- var _hoisted_1$19 = { class: "ew-timeline" };
3855
- var _hoisted_2$18 = { class: "ew-timeline__meta" };
3856
- var _hoisted_3$14 = {
4085
+ var _hoisted_1$24 = { class: "ew-timeline" };
4086
+ var _hoisted_2$23 = { class: "ew-timeline__meta" };
4087
+ var _hoisted_3$18 = {
3857
4088
  key: 0,
3858
4089
  class: "ew-timeline__date"
3859
4090
  };
3860
- var _hoisted_4$12 = { class: "ew-timeline__title" };
3861
- var _hoisted_5$8 = {
4091
+ var _hoisted_4$17 = { class: "ew-timeline__title" };
4092
+ var _hoisted_5$13 = {
3862
4093
  key: 0,
3863
4094
  class: "ew-timeline__description"
3864
4095
  };
3865
- var _sfc_main$47 = {
4096
+ var _sfc_main$53 = {
3866
4097
  __name: "index",
3867
4098
  props: {
3868
4099
  items: {
@@ -3881,7 +4112,7 @@ var _sfc_main$47 = {
3881
4112
  * items:[{ date?, tag?, tagTone?, title, description? }],最新一条默认高亮圆点
3882
4113
  */
3883
4114
  return (_ctx, _cache) => {
3884
- return openBlock(), createElementBlock("div", _hoisted_1$19, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
4115
+ return openBlock(), createElementBlock("div", _hoisted_1$24, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
3885
4116
  return openBlock(), createElementBlock("div", {
3886
4117
  key: i,
3887
4118
  class: normalizeClass(["ew-timeline__item", { "is-latest": i === 0 && __props.highlightLatest }])
@@ -3890,7 +4121,7 @@ var _sfc_main$47 = {
3890
4121
  class: "ew-timeline__dot",
3891
4122
  "aria-hidden": "true"
3892
4123
  }, null, -1)),
3893
- createElementVNode("div", _hoisted_2$18, [item.date ? (openBlock(), createElementBlock("span", _hoisted_3$14, toDisplayString(item.date), 1)) : createCommentVNode("", true), item.tag ? (openBlock(), createBlock(_sfc_main$44, {
4124
+ createElementVNode("div", _hoisted_2$23, [item.date ? (openBlock(), createElementBlock("span", _hoisted_3$18, toDisplayString(item.date), 1)) : createCommentVNode("", true), item.tag ? (openBlock(), createBlock(_sfc_main$50, {
3894
4125
  key: 1,
3895
4126
  tone: item.tagTone || "primary",
3896
4127
  size: "small"
@@ -3898,11 +4129,11 @@ var _sfc_main$47 = {
3898
4129
  default: withCtx(() => [createTextVNode(toDisplayString(item.tag), 1)]),
3899
4130
  _: 2
3900
4131
  }, 1032, ["tone"])) : createCommentVNode("", true)]),
3901
- createElementVNode("h4", _hoisted_4$12, [renderSlot(_ctx.$slots, "title", {
4132
+ createElementVNode("h4", _hoisted_4$17, [renderSlot(_ctx.$slots, "title", {
3902
4133
  item,
3903
4134
  index: i
3904
4135
  }, () => [createTextVNode(toDisplayString(item.title), 1)])]),
3905
- item.description ? (openBlock(), createElementBlock("p", _hoisted_5$8, [renderSlot(_ctx.$slots, "description", {
4136
+ item.description ? (openBlock(), createElementBlock("p", _hoisted_5$13, [renderSlot(_ctx.$slots, "description", {
3906
4137
  item,
3907
4138
  index: i
3908
4139
  }, () => [createTextVNode(toDisplayString(item.description), 1)])])) : createCommentVNode("", true)
@@ -3913,31 +4144,31 @@ var _sfc_main$47 = {
3913
4144
  };
3914
4145
  //#endregion
3915
4146
  //#region src/components/comparison-table/index.vue
3916
- var _hoisted_1$18 = { class: "ew-comparison-table" };
3917
- var _hoisted_2$17 = {
4147
+ var _hoisted_1$23 = { class: "ew-comparison-table" };
4148
+ var _hoisted_2$22 = {
3918
4149
  class: "ew-comparison-table__feature-col",
3919
4150
  scope: "col"
3920
4151
  };
3921
- var _hoisted_3$13 = { class: "ew-comparison-table__col-label" };
3922
- var _hoisted_4$11 = {
4152
+ var _hoisted_3$17 = { class: "ew-comparison-table__col-label" };
4153
+ var _hoisted_4$16 = {
3923
4154
  key: 0,
3924
4155
  class: "ew-comparison-table__col-note"
3925
4156
  };
3926
- var _hoisted_5$7 = { class: "ew-comparison-table__feature-col" };
3927
- var _hoisted_6$4 = { class: "ew-comparison-table__feature-label" };
3928
- var _hoisted_7$2 = {
4157
+ var _hoisted_5$12 = { class: "ew-comparison-table__feature-col" };
4158
+ var _hoisted_6$7 = { class: "ew-comparison-table__feature-label" };
4159
+ var _hoisted_7$5 = {
3929
4160
  key: 0,
3930
4161
  class: "ew-comparison-table__feature-desc"
3931
4162
  };
3932
- var _hoisted_8$1 = {
4163
+ var _hoisted_8$4 = {
3933
4164
  key: 1,
3934
4165
  class: "ew-comparison-table__dash"
3935
4166
  };
3936
- var _hoisted_9$1 = {
4167
+ var _hoisted_9$2 = {
3937
4168
  key: 2,
3938
4169
  class: "ew-comparison-table__text"
3939
4170
  };
3940
- var _sfc_main$11 = {
4171
+ var _sfc_main$13 = {
3941
4172
  __name: "index",
3942
4173
  props: {
3943
4174
  columns: {
@@ -3960,23 +4191,23 @@ var _sfc_main$11 = {
3960
4191
  * rows:[{ label, description?, values: (boolean|string)[] }] — true 勾 / false 破折号 / 字符串直出
3961
4192
  */
3962
4193
  return (_ctx, _cache) => {
3963
- return openBlock(), createElementBlock("div", _hoisted_1$18, [createElementVNode("table", null, [createElementVNode("thead", null, [createElementVNode("tr", null, [createElementVNode("th", _hoisted_2$17, [renderSlot(_ctx.$slots, "feature-head", {}, () => [createTextVNode(toDisplayString(__props.featureHead), 1)])]), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
4194
+ return openBlock(), createElementBlock("div", _hoisted_1$23, [createElementVNode("table", null, [createElementVNode("thead", null, [createElementVNode("tr", null, [createElementVNode("th", _hoisted_2$22, [renderSlot(_ctx.$slots, "feature-head", {}, () => [createTextVNode(toDisplayString(__props.featureHead), 1)])]), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
3964
4195
  return openBlock(), createElementBlock("th", {
3965
4196
  key: col.label,
3966
4197
  scope: "col",
3967
4198
  class: normalizeClass({ "is-featured": col.featured })
3968
- }, [createElementVNode("span", _hoisted_3$13, toDisplayString(col.label), 1), col.note ? (openBlock(), createElementBlock("span", _hoisted_4$11, toDisplayString(col.note), 1)) : createCommentVNode("", true)], 2);
4199
+ }, [createElementVNode("span", _hoisted_3$17, toDisplayString(col.label), 1), col.note ? (openBlock(), createElementBlock("span", _hoisted_4$16, toDisplayString(col.note), 1)) : createCommentVNode("", true)], 2);
3969
4200
  }), 128))])]), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row, i) => {
3970
- return openBlock(), createElementBlock("tr", { key: row.label }, [createElementVNode("td", _hoisted_5$7, [createElementVNode("span", _hoisted_6$4, toDisplayString(row.label), 1), row.description ? (openBlock(), createElementBlock("span", _hoisted_7$2, toDisplayString(row.description), 1)) : createCommentVNode("", true)]), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col, j) => {
4201
+ return openBlock(), createElementBlock("tr", { key: row.label }, [createElementVNode("td", _hoisted_5$12, [createElementVNode("span", _hoisted_6$7, toDisplayString(row.label), 1), row.description ? (openBlock(), createElementBlock("span", _hoisted_7$5, toDisplayString(row.description), 1)) : createCommentVNode("", true)]), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col, j) => {
3971
4202
  return openBlock(), createElementBlock("td", {
3972
4203
  key: j,
3973
4204
  class: normalizeClass({ "is-featured": col.featured })
3974
- }, [row.values[j] === true ? (openBlock(), createBlock(_sfc_main$21, {
4205
+ }, [row.values[j] === true ? (openBlock(), createBlock(_sfc_main$24, {
3975
4206
  key: 0,
3976
4207
  name: "check",
3977
4208
  size: 16,
3978
4209
  class: "ew-comparison-table__check"
3979
- })) : row.values[j] === false ? (openBlock(), createElementBlock("span", _hoisted_8$1, "—")) : (openBlock(), createElementBlock("span", _hoisted_9$1, toDisplayString(row.values[j]), 1))], 2);
4210
+ })) : row.values[j] === false ? (openBlock(), createElementBlock("span", _hoisted_8$4, "—")) : (openBlock(), createElementBlock("span", _hoisted_9$2, toDisplayString(row.values[j]), 1))], 2);
3980
4211
  }), 128))]);
3981
4212
  }), 128))])])]);
3982
4213
  };
@@ -3984,20 +4215,20 @@ var _sfc_main$11 = {
3984
4215
  };
3985
4216
  //#endregion
3986
4217
  //#region src/components/cta/index.vue
3987
- var _hoisted_1$17 = { class: "ew-cta__title" };
3988
- var _hoisted_2$16 = {
4218
+ var _hoisted_1$22 = { class: "ew-cta__title" };
4219
+ var _hoisted_2$21 = {
3989
4220
  key: 0,
3990
4221
  class: "ew-cta__description"
3991
4222
  };
3992
- var _hoisted_3$12 = {
4223
+ var _hoisted_3$16 = {
3993
4224
  key: 1,
3994
4225
  class: "ew-cta__actions"
3995
4226
  };
3996
- var _hoisted_4$10 = {
4227
+ var _hoisted_4$15 = {
3997
4228
  key: 2,
3998
4229
  class: "ew-cta__body"
3999
4230
  };
4000
- var _sfc_main$15 = {
4231
+ var _sfc_main$17 = {
4001
4232
  __name: "index",
4002
4233
  props: {
4003
4234
  title: {
@@ -4028,15 +4259,15 @@ var _sfc_main$15 = {
4028
4259
  * EwCta — 行动召唤区(官网转化收尾)
4029
4260
  */
4030
4261
  return (_ctx, _cache) => {
4031
- return openBlock(), createElementBlock("section", { class: normalizeClass(["ew-cta", { "is-tinted": __props.tinted }]) }, [createVNode(_sfc_main$14, {
4262
+ return openBlock(), createElementBlock("section", { class: normalizeClass(["ew-cta", { "is-tinted": __props.tinted }]) }, [createVNode(_sfc_main$16, {
4032
4263
  width: __props.container,
4033
4264
  class: "ew-cta__inner"
4034
4265
  }, {
4035
4266
  default: withCtx(() => [
4036
- createElementVNode("h2", _hoisted_1$17, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
4037
- __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_2$16, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
4038
- _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_3$12, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
4039
- _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_4$10, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
4267
+ createElementVNode("h2", _hoisted_1$22, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
4268
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_2$21, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
4269
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_3$16, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
4270
+ _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_4$15, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
4040
4271
  ]),
4041
4272
  _: 3
4042
4273
  }, 8, ["width"])], 2);
@@ -4045,12 +4276,12 @@ var _sfc_main$15 = {
4045
4276
  };
4046
4277
  //#endregion
4047
4278
  //#region src/components/newsletter/index.vue
4048
- var _hoisted_1$16 = ["placeholder", "aria-label"];
4049
- var _hoisted_2$15 = {
4279
+ var _hoisted_1$21 = ["placeholder", "aria-label"];
4280
+ var _hoisted_2$20 = {
4050
4281
  key: 1,
4051
4282
  class: "ew-newsletter__done"
4052
4283
  };
4053
- var _sfc_main$31 = {
4284
+ var _sfc_main$37 = {
4054
4285
  __name: "index",
4055
4286
  props: {
4056
4287
  placeholder: {
@@ -4092,7 +4323,7 @@ var _sfc_main$31 = {
4092
4323
  class: normalizeClass(["ew-newsletter", { "is-subscribed": subscribed.value }]),
4093
4324
  onSubmit: withModifiers(onSubmit, ["prevent"])
4094
4325
  }, [!subscribed.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
4095
- createVNode(_sfc_main$21, {
4326
+ createVNode(_sfc_main$24, {
4096
4327
  name: "mail",
4097
4328
  size: 18,
4098
4329
  class: "ew-newsletter__icon"
@@ -4104,13 +4335,13 @@ var _sfc_main$31 = {
4104
4335
  required: "",
4105
4336
  placeholder: __props.placeholder,
4106
4337
  "aria-label": __props.placeholder
4107
- }, null, 8, _hoisted_1$16), [[
4338
+ }, null, 8, _hoisted_1$21), [[
4108
4339
  vModelText,
4109
4340
  email.value,
4110
4341
  void 0,
4111
4342
  { trim: true }
4112
4343
  ]]),
4113
- createVNode(_sfc_main$7, {
4344
+ createVNode(_sfc_main$9, {
4114
4345
  type: "submit",
4115
4346
  pill: __props.pill,
4116
4347
  loading: loading.value,
@@ -4123,7 +4354,7 @@ var _sfc_main$31 = {
4123
4354
  "loading",
4124
4355
  "disabled"
4125
4356
  ])
4126
- ], 64)) : (openBlock(), createElementBlock("span", _hoisted_2$15, [createVNode(_sfc_main$21, {
4357
+ ], 64)) : (openBlock(), createElementBlock("span", _hoisted_2$20, [createVNode(_sfc_main$24, {
4127
4358
  name: "check",
4128
4359
  size: 16,
4129
4360
  class: "ew-newsletter__done-icon"
@@ -4133,13 +4364,13 @@ var _sfc_main$31 = {
4133
4364
  };
4134
4365
  //#endregion
4135
4366
  //#region src/components/logo-cloud/index.vue
4136
- var _hoisted_1$15 = { class: "ew-logo-cloud" };
4137
- var _hoisted_2$14 = {
4367
+ var _hoisted_1$20 = { class: "ew-logo-cloud" };
4368
+ var _hoisted_2$19 = {
4138
4369
  key: 0,
4139
4370
  class: "ew-logo-cloud__title"
4140
4371
  };
4141
- var _hoisted_3$11 = { class: "ew-logo-cloud__label" };
4142
- var _sfc_main$27 = {
4372
+ var _hoisted_3$15 = { class: "ew-logo-cloud__label" };
4373
+ var _sfc_main$32 = {
4143
4374
  __name: "index",
4144
4375
  props: {
4145
4376
  items: {
@@ -4166,35 +4397,35 @@ var _sfc_main$27 = {
4166
4397
  const iconSize = computed(() => 20);
4167
4398
  const gridStyle = computed(() => props.columns ? { gridTemplateColumns: `repeat(${Number(props.columns)}, 1fr)` } : void 0);
4168
4399
  return (_ctx, _cache) => {
4169
- return openBlock(), createElementBlock("div", _hoisted_1$15, [__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("p", _hoisted_2$14, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true), createElementVNode("div", {
4400
+ return openBlock(), createElementBlock("div", _hoisted_1$20, [__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("p", _hoisted_2$19, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true), createElementVNode("div", {
4170
4401
  class: "ew-logo-cloud__grid",
4171
4402
  style: normalizeStyle(gridStyle.value)
4172
4403
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedItems.value, (item, i) => {
4173
4404
  return openBlock(), createElementBlock("div", {
4174
4405
  key: i,
4175
4406
  class: "ew-logo-cloud__item"
4176
- }, [item.icon ? (openBlock(), createBlock(_sfc_main$21, {
4407
+ }, [item.icon ? (openBlock(), createBlock(_sfc_main$24, {
4177
4408
  key: 0,
4178
4409
  name: item.icon,
4179
4410
  size: iconSize.value
4180
- }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", _hoisted_3$11, toDisplayString(item.label), 1)]);
4411
+ }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", _hoisted_3$15, toDisplayString(item.label), 1)]);
4181
4412
  }), 128))], 4)]);
4182
4413
  };
4183
4414
  }
4184
4415
  };
4185
4416
  //#endregion
4186
4417
  //#region src/components/video/index.vue
4187
- var _hoisted_1$14 = { class: "ew-video" };
4188
- var _hoisted_2$13 = ["poster", "src"];
4189
- var _hoisted_3$10 = {
4418
+ var _hoisted_1$19 = { class: "ew-video" };
4419
+ var _hoisted_2$18 = ["poster", "src"];
4420
+ var _hoisted_3$14 = {
4190
4421
  key: 2,
4191
4422
  class: "ew-video__placeholder"
4192
4423
  };
4193
- var _hoisted_4$9 = {
4424
+ var _hoisted_4$14 = {
4194
4425
  key: 0,
4195
4426
  class: "ew-video__caption"
4196
4427
  };
4197
- var _sfc_main$48 = {
4428
+ var _sfc_main$54 = {
4198
4429
  __name: "index",
4199
4430
  props: {
4200
4431
  /** 视频地址 */
@@ -4239,7 +4470,7 @@ var _sfc_main$48 = {
4239
4470
  };
4240
4471
  const frameStyle = computed(() => ({ paddingTop: RATIO[props.aspect] }));
4241
4472
  return (_ctx, _cache) => {
4242
- return openBlock(), createElementBlock("figure", _hoisted_1$14, [createElementVNode("div", {
4473
+ return openBlock(), createElementBlock("figure", _hoisted_1$19, [createElementVNode("div", {
4243
4474
  class: "ew-video__frame",
4244
4475
  style: normalizeStyle(frameStyle.value)
4245
4476
  }, [_ctx.$slots.default ? renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 0) : __props.src ? (openBlock(), createElementBlock("video", {
@@ -4250,21 +4481,21 @@ var _sfc_main$48 = {
4250
4481
  src: __props.src,
4251
4482
  onPlay: _cache[0] || (_cache[0] = ($event) => emit("play")),
4252
4483
  onPause: _cache[1] || (_cache[1] = ($event) => emit("pause"))
4253
- }, null, 40, _hoisted_2$13)) : (openBlock(), createElementBlock("div", _hoisted_3$10, [createVNode(_sfc_main$21, {
4484
+ }, null, 40, _hoisted_2$18)) : (openBlock(), createElementBlock("div", _hoisted_3$14, [createVNode(_sfc_main$24, {
4254
4485
  name: "play-fill",
4255
4486
  size: 28
4256
- }), _cache[2] || (_cache[2] = createElementVNode("span", null, "视频占位", -1))]))], 4), __props.caption || _ctx.$slots.caption ? (openBlock(), createElementBlock("figcaption", _hoisted_4$9, [renderSlot(_ctx.$slots, "caption", {}, () => [createTextVNode(toDisplayString(__props.caption), 1)])])) : createCommentVNode("", true)]);
4487
+ }), _cache[2] || (_cache[2] = createElementVNode("span", null, "视频占位", -1))]))], 4), __props.caption || _ctx.$slots.caption ? (openBlock(), createElementBlock("figcaption", _hoisted_4$14, [renderSlot(_ctx.$slots, "caption", {}, () => [createTextVNode(toDisplayString(__props.caption), 1)])])) : createCommentVNode("", true)]);
4257
4488
  };
4258
4489
  }
4259
4490
  };
4260
4491
  //#endregion
4261
4492
  //#region src/components/audio/index.vue
4262
- var _hoisted_1$13 = { class: "ew-audio" };
4263
- var _hoisted_2$12 = { class: "ew-audio__badge" };
4264
- var _hoisted_3$9 = { class: "ew-audio__body" };
4265
- var _hoisted_4$8 = { class: "ew-audio__title" };
4266
- var _hoisted_5$6 = ["src"];
4267
- var _sfc_main$3 = {
4493
+ var _hoisted_1$18 = { class: "ew-audio" };
4494
+ var _hoisted_2$17 = { class: "ew-audio__badge" };
4495
+ var _hoisted_3$13 = { class: "ew-audio__body" };
4496
+ var _hoisted_4$13 = { class: "ew-audio__title" };
4497
+ var _hoisted_5$11 = ["src"];
4498
+ var _sfc_main$4 = {
4268
4499
  __name: "index",
4269
4500
  props: {
4270
4501
  /** 音频地址 */
@@ -4283,48 +4514,48 @@ var _sfc_main$3 = {
4283
4514
  * 标题行 + 原生播放控件;src 缺省时可用插槽承载自定义播放器
4284
4515
  */
4285
4516
  return (_ctx, _cache) => {
4286
- return openBlock(), createElementBlock("div", _hoisted_1$13, [createElementVNode("span", _hoisted_2$12, [createVNode(_sfc_main$21, {
4517
+ return openBlock(), createElementBlock("div", _hoisted_1$18, [createElementVNode("span", _hoisted_2$17, [createVNode(_sfc_main$24, {
4287
4518
  name: "music",
4288
4519
  size: 18
4289
- })]), createElementVNode("div", _hoisted_3$9, [createElementVNode("div", _hoisted_4$8, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]), __props.src ? (openBlock(), createElementBlock("audio", {
4520
+ })]), createElementVNode("div", _hoisted_3$13, [createElementVNode("div", _hoisted_4$13, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]), __props.src ? (openBlock(), createElementBlock("audio", {
4290
4521
  key: 0,
4291
4522
  controls: "",
4292
4523
  preload: "metadata",
4293
4524
  src: __props.src,
4294
4525
  class: "ew-audio__player"
4295
- }, null, 8, _hoisted_5$6)) : renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 1)])]);
4526
+ }, null, 8, _hoisted_5$11)) : renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 1)])]);
4296
4527
  };
4297
4528
  }
4298
4529
  };
4299
4530
  //#endregion
4300
4531
  //#region src/components/contact-form/index.vue
4301
- var _hoisted_1$12 = { class: "ew-contact-form__row" };
4302
- var _hoisted_2$11 = { class: "ew-contact-form__field" };
4303
- var _hoisted_3$8 = {
4532
+ var _hoisted_1$17 = { class: "ew-contact-form__row" };
4533
+ var _hoisted_2$16 = { class: "ew-contact-form__field" };
4534
+ var _hoisted_3$12 = {
4304
4535
  key: 0,
4305
4536
  class: "ew-contact-form__error"
4306
4537
  };
4307
- var _hoisted_4$7 = { class: "ew-contact-form__field" };
4308
- var _hoisted_5$5 = {
4538
+ var _hoisted_4$12 = { class: "ew-contact-form__field" };
4539
+ var _hoisted_5$10 = {
4309
4540
  key: 0,
4310
4541
  class: "ew-contact-form__error"
4311
4542
  };
4312
- var _hoisted_6$3 = { class: "ew-contact-form__field" };
4313
- var _hoisted_7$1 = {
4543
+ var _hoisted_6$6 = { class: "ew-contact-form__field" };
4544
+ var _hoisted_7$4 = {
4314
4545
  key: 0,
4315
4546
  class: "ew-contact-form__error"
4316
4547
  };
4317
- var _hoisted_8 = { class: "ew-contact-form__footer" };
4318
- var _hoisted_9 = {
4548
+ var _hoisted_8$3 = { class: "ew-contact-form__footer" };
4549
+ var _hoisted_9$1 = {
4319
4550
  key: 0,
4320
4551
  class: "ew-contact-form__hint"
4321
4552
  };
4322
- var _hoisted_10 = {
4553
+ var _hoisted_10$1 = {
4323
4554
  key: 1,
4324
4555
  class: "ew-contact-form__done"
4325
4556
  };
4326
- var _hoisted_11 = { class: "ew-contact-form__done-text" };
4327
- var _sfc_main$13 = {
4557
+ var _hoisted_11$1 = { class: "ew-contact-form__done-text" };
4558
+ var _sfc_main$15 = {
4328
4559
  __name: "index",
4329
4560
  props: {
4330
4561
  buttonText: {
@@ -4382,7 +4613,7 @@ var _sfc_main$13 = {
4382
4613
  novalidate: "",
4383
4614
  onSubmit: withModifiers(onSubmit, ["prevent"])
4384
4615
  }, [!sent.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
4385
- createElementVNode("div", _hoisted_1$12, [createElementVNode("div", _hoisted_2$11, [
4616
+ createElementVNode("div", _hoisted_1$17, [createElementVNode("div", _hoisted_2$16, [
4386
4617
  _cache[6] || (_cache[6] = createElementVNode("label", {
4387
4618
  class: "ew-contact-form__label",
4388
4619
  for: "ew-contact-name"
@@ -4400,8 +4631,8 @@ var _sfc_main$13 = {
4400
4631
  void 0,
4401
4632
  { trim: true }
4402
4633
  ]]),
4403
- errors.name ? (openBlock(), createElementBlock("span", _hoisted_3$8, "请填写称呼")) : createCommentVNode("", true)
4404
- ]), createElementVNode("div", _hoisted_4$7, [
4634
+ errors.name ? (openBlock(), createElementBlock("span", _hoisted_3$12, "请填写称呼")) : createCommentVNode("", true)
4635
+ ]), createElementVNode("div", _hoisted_4$12, [
4405
4636
  _cache[7] || (_cache[7] = createElementVNode("label", {
4406
4637
  class: "ew-contact-form__label",
4407
4638
  for: "ew-contact-email"
@@ -4419,9 +4650,9 @@ var _sfc_main$13 = {
4419
4650
  void 0,
4420
4651
  { trim: true }
4421
4652
  ]]),
4422
- errors.email ? (openBlock(), createElementBlock("span", _hoisted_5$5, "邮箱格式不正确")) : createCommentVNode("", true)
4653
+ errors.email ? (openBlock(), createElementBlock("span", _hoisted_5$10, "邮箱格式不正确")) : createCommentVNode("", true)
4423
4654
  ])]),
4424
- createElementVNode("div", _hoisted_6$3, [
4655
+ createElementVNode("div", _hoisted_6$6, [
4425
4656
  _cache[8] || (_cache[8] = createElementVNode("label", {
4426
4657
  class: "ew-contact-form__label",
4427
4658
  for: "ew-contact-message"
@@ -4439,23 +4670,23 @@ var _sfc_main$13 = {
4439
4670
  void 0,
4440
4671
  { trim: true }
4441
4672
  ]]),
4442
- errors.message ? (openBlock(), createElementBlock("span", _hoisted_7$1, "留言不能为空")) : createCommentVNode("", true)
4673
+ errors.message ? (openBlock(), createElementBlock("span", _hoisted_7$4, "留言不能为空")) : createCommentVNode("", true)
4443
4674
  ]),
4444
- createElementVNode("div", _hoisted_8, [createVNode(_sfc_main$7, {
4675
+ createElementVNode("div", _hoisted_8$3, [createVNode(_sfc_main$9, {
4445
4676
  type: "submit",
4446
4677
  loading: loading.value
4447
4678
  }, {
4448
4679
  default: withCtx(() => [createTextVNode(toDisplayString(__props.buttonText), 1)]),
4449
4680
  _: 1
4450
- }, 8, ["loading"]), _ctx.$slots.hint ? (openBlock(), createElementBlock("span", _hoisted_9, [renderSlot(_ctx.$slots, "hint")])) : createCommentVNode("", true)])
4451
- ], 64)) : (openBlock(), createElementBlock("div", _hoisted_10, [
4452
- createVNode(_sfc_main$21, {
4681
+ }, 8, ["loading"]), _ctx.$slots.hint ? (openBlock(), createElementBlock("span", _hoisted_9$1, [renderSlot(_ctx.$slots, "hint")])) : createCommentVNode("", true)])
4682
+ ], 64)) : (openBlock(), createElementBlock("div", _hoisted_10$1, [
4683
+ createVNode(_sfc_main$24, {
4453
4684
  name: "check",
4454
4685
  size: 18,
4455
4686
  class: "ew-contact-form__done-icon"
4456
4687
  }),
4457
- createElementVNode("div", _hoisted_11, [renderSlot(_ctx.$slots, "sent", {}, () => [createTextVNode(toDisplayString(__props.sentText), 1)])]),
4458
- createVNode(_sfc_main$7, {
4688
+ createElementVNode("div", _hoisted_11$1, [renderSlot(_ctx.$slots, "sent", {}, () => [createTextVNode(toDisplayString(__props.sentText), 1)])]),
4689
+ createVNode(_sfc_main$9, {
4459
4690
  variant: "ghost",
4460
4691
  size: "small",
4461
4692
  onClick: reset
@@ -4469,19 +4700,51 @@ var _sfc_main$13 = {
4469
4700
  };
4470
4701
  //#endregion
4471
4702
  //#region src/components/carousel/index.vue
4472
- var _hoisted_1$11 = { class: "ew-carousel__viewport" };
4473
- var _hoisted_2$10 = {
4703
+ var _hoisted_1$16 = ["src", "alt"];
4704
+ var _hoisted_2$15 = {
4705
+ key: 1,
4706
+ class: "ew-carousel__banner"
4707
+ };
4708
+ var _hoisted_3$11 = ["src", "alt"];
4709
+ var _hoisted_4$11 = {
4710
+ key: 0,
4711
+ class: "ew-carousel__caption"
4712
+ };
4713
+ var _hoisted_5$9 = {
4714
+ key: 0,
4715
+ class: "ew-carousel__caption-title"
4716
+ };
4717
+ var _hoisted_6$5 = {
4718
+ key: 1,
4719
+ class: "ew-carousel__caption-desc"
4720
+ };
4721
+ var _hoisted_7$3 = {
4474
4722
  key: 2,
4475
4723
  class: "ew-carousel__dots"
4476
4724
  };
4477
- var _hoisted_3$7 = ["aria-label", "onClick"];
4478
- var _sfc_main$9 = {
4725
+ var _hoisted_8$2 = ["aria-label", "onClick"];
4726
+ var _sfc_main$11 = {
4479
4727
  __name: "index",
4480
4728
  props: {
4481
4729
  items: {
4482
4730
  type: Array,
4483
4731
  default: () => []
4484
4732
  },
4733
+ /** 形态:default 自定义插槽 / image 纯图片 / banner 图片+文字注释 */
4734
+ variant: {
4735
+ type: String,
4736
+ default: "default",
4737
+ validator: (v) => [
4738
+ "default",
4739
+ "image",
4740
+ "banner"
4741
+ ].includes(v)
4742
+ },
4743
+ /** image / banner 形态的画幅比例(CSS aspect-ratio 值) */
4744
+ aspect: {
4745
+ type: String,
4746
+ default: "16 / 9"
4747
+ },
4485
4748
  /** 自动轮播间隔 ms(0 关闭) */
4486
4749
  autoplay: {
4487
4750
  type: Number,
@@ -4495,13 +4758,21 @@ var _sfc_main$9 = {
4495
4758
  setup(__props) {
4496
4759
  /**
4497
4760
  * EwCarousel — 轮播(评价墙、案例展示、横幅)
4498
- * items 提供数据,#item 作用域插槽自定义每张内容;autoplay 毫秒数(0 关闭),hover 暂停
4761
+ * 三种形态(variant):
4762
+ * - default:items 提供数据,#item 作用域插槽自定义每张内容
4763
+ * - image:纯图片轮播,items 项 { src, alt? },aspect 控制画幅
4764
+ * - banner:图片 + 文字注释,items 项 { src, title?, desc?, alt? },注释带渐变遮罩贴底
4765
+ * autoplay 毫秒数(0 关闭),hover 暂停
4499
4766
  */
4500
4767
  const props = __props;
4501
4768
  const index = ref(0);
4502
4769
  const paused = ref(false);
4503
4770
  let timer = null;
4504
4771
  const count = computed(() => props.items.length);
4772
+ const viewportStyle = computed(() => {
4773
+ if (props.variant === "default") return null;
4774
+ return { aspectRatio: props.aspect };
4775
+ });
4505
4776
  function go(i) {
4506
4777
  if (!count.value) return;
4507
4778
  index.value = (i % count.value + count.value) % count.value;
@@ -4525,29 +4796,43 @@ var _sfc_main$9 = {
4525
4796
  onBeforeUnmount(teardownTimer);
4526
4797
  return (_ctx, _cache) => {
4527
4798
  return openBlock(), createElementBlock("div", {
4528
- class: "ew-carousel",
4799
+ class: normalizeClass(["ew-carousel", { "is-media": __props.variant !== "default" }]),
4529
4800
  onMouseenter: _cache[2] || (_cache[2] = ($event) => paused.value = true),
4530
4801
  onMouseleave: _cache[3] || (_cache[3] = ($event) => paused.value = false)
4531
4802
  }, [
4532
- createElementVNode("div", _hoisted_1$11, [createElementVNode("div", {
4803
+ createElementVNode("div", {
4804
+ class: "ew-carousel__viewport",
4805
+ style: normalizeStyle(viewportStyle.value)
4806
+ }, [createElementVNode("div", {
4533
4807
  class: "ew-carousel__track",
4534
4808
  style: normalizeStyle({ transform: `translateX(-${index.value * 100}%)` })
4535
4809
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
4536
4810
  return openBlock(), createElementBlock("div", {
4537
4811
  key: i,
4538
4812
  class: "ew-carousel__slide"
4539
- }, [renderSlot(_ctx.$slots, "item", {
4813
+ }, [__props.variant === "image" ? (openBlock(), createElementBlock("img", {
4814
+ key: 0,
4815
+ class: "ew-carousel__img",
4816
+ src: item.src,
4817
+ alt: item.alt || "",
4818
+ loading: "lazy"
4819
+ }, null, 8, _hoisted_1$16)) : __props.variant === "banner" ? (openBlock(), createElementBlock("div", _hoisted_2$15, [createElementVNode("img", {
4820
+ class: "ew-carousel__img",
4821
+ src: item.src,
4822
+ alt: item.alt || "",
4823
+ loading: "lazy"
4824
+ }, null, 8, _hoisted_3$11), item.title || item.desc ? (openBlock(), createElementBlock("div", _hoisted_4$11, [item.title ? (openBlock(), createElementBlock("h3", _hoisted_5$9, toDisplayString(item.title), 1)) : createCommentVNode("", true), item.desc ? (openBlock(), createElementBlock("p", _hoisted_6$5, toDisplayString(item.desc), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)])) : renderSlot(_ctx.$slots, "item", {
4540
4825
  item,
4541
4826
  index: i
4542
- }, () => [createTextVNode(toDisplayString(item), 1)])]);
4543
- }), 128))], 4)]),
4827
+ }, () => [createTextVNode(toDisplayString(item), 1)], void 0, 2)]);
4828
+ }), 128))], 4)], 4),
4544
4829
  __props.items.length > 1 ? (openBlock(), createElementBlock("button", {
4545
4830
  key: 0,
4546
4831
  type: "button",
4547
4832
  class: "ew-carousel__arrow is-prev",
4548
4833
  "aria-label": "上一张",
4549
4834
  onClick: _cache[0] || (_cache[0] = ($event) => step(-1))
4550
- }, [createVNode(_sfc_main$21, {
4835
+ }, [createVNode(_sfc_main$24, {
4551
4836
  name: "chevron-left",
4552
4837
  size: 18
4553
4838
  })])) : createCommentVNode("", true),
@@ -4557,40 +4842,45 @@ var _sfc_main$9 = {
4557
4842
  class: "ew-carousel__arrow is-next",
4558
4843
  "aria-label": "下一张",
4559
4844
  onClick: _cache[1] || (_cache[1] = ($event) => step(1))
4560
- }, [createVNode(_sfc_main$21, {
4845
+ }, [createVNode(_sfc_main$24, {
4561
4846
  name: "chevron-right",
4562
4847
  size: 18
4563
4848
  })])) : createCommentVNode("", true),
4564
- __props.items.length > 1 && __props.dots ? (openBlock(), createElementBlock("div", _hoisted_2$10, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (_, i) => {
4849
+ __props.items.length > 1 && __props.dots ? (openBlock(), createElementBlock("div", _hoisted_7$3, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (_, i) => {
4565
4850
  return openBlock(), createElementBlock("button", {
4566
4851
  key: i,
4567
4852
  type: "button",
4568
4853
  class: normalizeClass(["ew-carousel__dot", { "is-active": i === index.value }]),
4569
4854
  "aria-label": `第 ${i + 1} 张`,
4570
4855
  onClick: ($event) => go(i)
4571
- }, null, 10, _hoisted_3$7);
4856
+ }, null, 10, _hoisted_8$2);
4572
4857
  }), 128))])) : createCommentVNode("", true)
4573
- ], 32);
4858
+ ], 34);
4574
4859
  };
4575
4860
  }
4576
4861
  };
4577
4862
  //#endregion
4578
4863
  //#region src/components/article-card/index.vue
4579
- var _hoisted_1$10 = ["src", "alt"];
4580
- var _hoisted_2$9 = { class: "ew-article-card__body" };
4581
- var _hoisted_3$6 = { class: "ew-article-card__meta" };
4582
- var _hoisted_4$6 = {
4864
+ var _hoisted_1$15 = ["src", "alt"];
4865
+ var _hoisted_2$14 = { class: "ew-article-card__body" };
4866
+ var _hoisted_3$10 = { class: "ew-article-card__meta" };
4867
+ var _hoisted_4$10 = {
4583
4868
  key: 0,
4584
4869
  class: "ew-article-card__date"
4585
4870
  };
4586
- var _hoisted_5$4 = { class: "ew-article-card__title" };
4587
- var _hoisted_6$2 = {
4871
+ var _hoisted_5$8 = { class: "ew-article-card__title" };
4872
+ var _hoisted_6$4 = {
4588
4873
  key: 0,
4589
4874
  class: "ew-article-card__excerpt"
4590
4875
  };
4591
- var _sfc_main$2 = {
4876
+ var _sfc_main$3 = {
4592
4877
  __name: "index",
4593
4878
  props: {
4879
+ /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
4880
+ glass: {
4881
+ type: Boolean,
4882
+ default: void 0
4883
+ },
4594
4884
  title: {
4595
4885
  type: String,
4596
4886
  default: ""
@@ -4639,7 +4929,11 @@ var _sfc_main$2 = {
4639
4929
  const coverStyle = computed(() => props.cover ? void 0 : { background: "linear-gradient(135deg, var(--ew-fill-1), var(--ew-bg-soft))" });
4640
4930
  return (_ctx, _cache) => {
4641
4931
  return openBlock(), createBlock(resolveDynamicComponent(__props.tag), {
4642
- class: normalizeClass(["ew-article-card", { "is-hoverable": __props.hoverable }]),
4932
+ class: normalizeClass(["ew-article-card", {
4933
+ "is-hoverable": __props.hoverable,
4934
+ "is-glass": __props.glass === true,
4935
+ "no-glass": __props.glass === false
4936
+ }]),
4643
4937
  href: __props.tag === "a" ? __props.href : void 0
4644
4938
  }, {
4645
4939
  default: withCtx(() => [createElementVNode("div", {
@@ -4650,20 +4944,20 @@ var _sfc_main$2 = {
4650
4944
  src: __props.cover,
4651
4945
  alt: __props.title,
4652
4946
  loading: "lazy"
4653
- }, null, 8, _hoisted_1$10)) : __props.icon ? (openBlock(), createBlock(_sfc_main$21, {
4947
+ }, null, 8, _hoisted_1$15)) : __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
4654
4948
  key: 1,
4655
4949
  name: __props.icon,
4656
4950
  size: 28,
4657
4951
  class: "ew-article-card__cover-icon"
4658
- }, null, 8, ["name"])) : createCommentVNode("", true)], 4), createElementVNode("div", _hoisted_2$9, [
4659
- createElementVNode("div", _hoisted_3$6, [__props.date ? (openBlock(), createElementBlock("span", _hoisted_4$6, toDisplayString(__props.date), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.tags, (t) => {
4952
+ }, null, 8, ["name"])) : createCommentVNode("", true)], 4), createElementVNode("div", _hoisted_2$14, [
4953
+ createElementVNode("div", _hoisted_3$10, [__props.date ? (openBlock(), createElementBlock("span", _hoisted_4$10, toDisplayString(__props.date), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.tags, (t) => {
4660
4954
  return openBlock(), createElementBlock("span", {
4661
4955
  key: t,
4662
4956
  class: "ew-article-card__tag"
4663
4957
  }, toDisplayString(t), 1);
4664
4958
  }), 128))]),
4665
- createElementVNode("h4", _hoisted_5$4, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
4666
- __props.excerpt || _ctx.$slots.excerpt ? (openBlock(), createElementBlock("p", _hoisted_6$2, [renderSlot(_ctx.$slots, "excerpt", {}, () => [createTextVNode(toDisplayString(__props.excerpt), 1)])])) : createCommentVNode("", true)
4959
+ createElementVNode("h4", _hoisted_5$8, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
4960
+ __props.excerpt || _ctx.$slots.excerpt ? (openBlock(), createElementBlock("p", _hoisted_6$4, [renderSlot(_ctx.$slots, "excerpt", {}, () => [createTextVNode(toDisplayString(__props.excerpt), 1)])])) : createCommentVNode("", true)
4667
4961
  ])]),
4668
4962
  _: 3
4669
4963
  }, 8, ["class", "href"]);
@@ -4672,26 +4966,31 @@ var _sfc_main$2 = {
4672
4966
  };
4673
4967
  //#endregion
4674
4968
  //#region src/components/profile-card/index.vue
4675
- var _hoisted_1$9 = { class: "ew-profile-card__name" };
4676
- var _hoisted_2$8 = {
4969
+ var _hoisted_1$14 = { class: "ew-profile-card__name" };
4970
+ var _hoisted_2$13 = {
4677
4971
  key: 0,
4678
4972
  class: "ew-profile-card__role"
4679
4973
  };
4680
- var _hoisted_3$5 = {
4974
+ var _hoisted_3$9 = {
4681
4975
  key: 1,
4682
4976
  class: "ew-profile-card__bio"
4683
4977
  };
4684
- var _hoisted_4$5 = {
4978
+ var _hoisted_4$9 = {
4685
4979
  key: 2,
4686
4980
  class: "ew-profile-card__stats"
4687
4981
  };
4688
- var _hoisted_5$3 = {
4982
+ var _hoisted_5$7 = {
4689
4983
  key: 3,
4690
4984
  class: "ew-profile-card__social"
4691
4985
  };
4692
- var _sfc_main$33 = {
4986
+ var _sfc_main$39 = {
4693
4987
  __name: "index",
4694
4988
  props: {
4989
+ /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
4990
+ glass: {
4991
+ type: Boolean,
4992
+ default: void 0
4993
+ },
4695
4994
  name: {
4696
4995
  type: String,
4697
4996
  default: ""
@@ -4725,8 +5024,12 @@ var _sfc_main$33 = {
4725
5024
  * 头像 + 姓名 + 角色 + 简介 + 可选数据行与社交链接行
4726
5025
  */
4727
5026
  return (_ctx, _cache) => {
4728
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-profile-card", { "is-plain": __props.plain }]) }, [
4729
- createVNode(_sfc_main$4, {
5027
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-profile-card", {
5028
+ "is-plain": __props.plain,
5029
+ "is-glass": __props.glass === true,
5030
+ "no-glass": __props.glass === false
5031
+ }]) }, [
5032
+ createVNode(_sfc_main$5, {
4730
5033
  src: __props.avatar,
4731
5034
  name: __props.name,
4732
5035
  size: __props.avatarSize,
@@ -4736,17 +5039,592 @@ var _sfc_main$33 = {
4736
5039
  "name",
4737
5040
  "size"
4738
5041
  ]),
4739
- createElementVNode("h3", _hoisted_1$9, [renderSlot(_ctx.$slots, "name", {}, () => [createTextVNode(toDisplayString(__props.name), 1)])]),
4740
- __props.role || _ctx.$slots.role ? (openBlock(), createElementBlock("p", _hoisted_2$8, [renderSlot(_ctx.$slots, "role", {}, () => [createTextVNode(toDisplayString(__props.role), 1)])])) : createCommentVNode("", true),
4741
- __props.bio || _ctx.$slots.bio ? (openBlock(), createElementBlock("p", _hoisted_3$5, [renderSlot(_ctx.$slots, "bio", {}, () => [createTextVNode(toDisplayString(__props.bio), 1)])])) : createCommentVNode("", true),
4742
- _ctx.$slots.stats ? (openBlock(), createElementBlock("div", _hoisted_4$5, [renderSlot(_ctx.$slots, "stats")])) : createCommentVNode("", true),
4743
- _ctx.$slots.social ? (openBlock(), createElementBlock("div", _hoisted_5$3, [renderSlot(_ctx.$slots, "social")])) : createCommentVNode("", true)
5042
+ createElementVNode("h3", _hoisted_1$14, [renderSlot(_ctx.$slots, "name", {}, () => [createTextVNode(toDisplayString(__props.name), 1)])]),
5043
+ __props.role || _ctx.$slots.role ? (openBlock(), createElementBlock("p", _hoisted_2$13, [renderSlot(_ctx.$slots, "role", {}, () => [createTextVNode(toDisplayString(__props.role), 1)])])) : createCommentVNode("", true),
5044
+ __props.bio || _ctx.$slots.bio ? (openBlock(), createElementBlock("p", _hoisted_3$9, [renderSlot(_ctx.$slots, "bio", {}, () => [createTextVNode(toDisplayString(__props.bio), 1)])])) : createCommentVNode("", true),
5045
+ _ctx.$slots.stats ? (openBlock(), createElementBlock("div", _hoisted_4$9, [renderSlot(_ctx.$slots, "stats")])) : createCommentVNode("", true),
5046
+ _ctx.$slots.social ? (openBlock(), createElementBlock("div", _hoisted_5$7, [renderSlot(_ctx.$slots, "social")])) : createCommentVNode("", true)
4744
5047
  ], 2);
4745
5048
  };
4746
5049
  }
4747
5050
  };
4748
5051
  //#endregion
4749
- //#region src/components/marquee/index.vue
5052
+ //#region src/components/article/index.vue
5053
+ var _hoisted_1$13 = { class: "ew-article" };
5054
+ var _hoisted_2$12 = { class: "ew-article__header" };
5055
+ var _hoisted_3$8 = {
5056
+ key: 0,
5057
+ class: "ew-article__eyebrow"
5058
+ };
5059
+ var _hoisted_4$8 = { class: "ew-article__title" };
5060
+ var _hoisted_5$6 = {
5061
+ key: 1,
5062
+ class: "ew-article__description"
5063
+ };
5064
+ var _hoisted_6$3 = {
5065
+ key: 2,
5066
+ class: "ew-article__meta"
5067
+ };
5068
+ var _hoisted_7$2 = {
5069
+ key: 1,
5070
+ class: "ew-article__author"
5071
+ };
5072
+ var _hoisted_8$1 = {
5073
+ key: 2,
5074
+ class: "ew-article__date"
5075
+ };
5076
+ var _hoisted_9 = {
5077
+ key: 3,
5078
+ class: "ew-article__read"
5079
+ };
5080
+ var _hoisted_10 = { class: "ew-article__body" };
5081
+ var _hoisted_11 = {
5082
+ key: 0,
5083
+ class: "ew-article__footer"
5084
+ };
5085
+ var _sfc_main$2 = {
5086
+ __name: "index",
5087
+ props: {
5088
+ /** 标题 */
5089
+ title: {
5090
+ type: String,
5091
+ default: ""
5092
+ },
5093
+ /** 摘要(标题下的导语) */
5094
+ description: {
5095
+ type: String,
5096
+ default: ""
5097
+ },
5098
+ /** 眉题(小 uppercase 字距标签) */
5099
+ eyebrow: {
5100
+ type: String,
5101
+ default: ""
5102
+ },
5103
+ author: {
5104
+ type: String,
5105
+ default: ""
5106
+ },
5107
+ avatar: {
5108
+ type: String,
5109
+ default: ""
5110
+ },
5111
+ date: {
5112
+ type: String,
5113
+ default: ""
5114
+ },
5115
+ /** 阅读时长(如 '8 min') */
5116
+ readTime: {
5117
+ type: String,
5118
+ default: ""
5119
+ },
5120
+ tags: {
5121
+ type: Array,
5122
+ default: () => []
5123
+ }
5124
+ },
5125
+ setup(__props) {
5126
+ /**
5127
+ * EwArticle — 文章内容(长文阅读排版)
5128
+ * 页头:眉题 + 标题 + 摘要 + 元信息行(头像/作者/日期/阅读时长/标签);
5129
+ * 正文插槽自带阅读排版(标题刻度、1.85 行高、引用块、列表、行内代码、图片圆角),
5130
+ * 排版全部以 .ew-article__body 作用域类收敛,不外溢。
5131
+ */
5132
+ return (_ctx, _cache) => {
5133
+ return openBlock(), createElementBlock("article", _hoisted_1$13, [
5134
+ createElementVNode("header", _hoisted_2$12, [
5135
+ __props.eyebrow || _ctx.$slots.eyebrow ? (openBlock(), createElementBlock("p", _hoisted_3$8, [renderSlot(_ctx.$slots, "eyebrow", {}, () => [createTextVNode(toDisplayString(__props.eyebrow), 1)])])) : createCommentVNode("", true),
5136
+ createElementVNode("h1", _hoisted_4$8, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
5137
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_5$6, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
5138
+ __props.author || __props.date || __props.readTime || __props.tags.length ? (openBlock(), createElementBlock("div", _hoisted_6$3, [
5139
+ __props.author && __props.avatar ? (openBlock(), createBlock(_sfc_main$5, {
5140
+ key: 0,
5141
+ src: __props.avatar,
5142
+ name: __props.author,
5143
+ size: 28,
5144
+ class: "ew-article__avatar"
5145
+ }, null, 8, ["src", "name"])) : createCommentVNode("", true),
5146
+ __props.author ? (openBlock(), createElementBlock("span", _hoisted_7$2, toDisplayString(__props.author), 1)) : createCommentVNode("", true),
5147
+ __props.date ? (openBlock(), createElementBlock("span", _hoisted_8$1, toDisplayString(__props.date), 1)) : createCommentVNode("", true),
5148
+ __props.readTime ? (openBlock(), createElementBlock("span", _hoisted_9, toDisplayString(__props.readTime), 1)) : createCommentVNode("", true),
5149
+ (openBlock(true), createElementBlock(Fragment, null, renderList(__props.tags, (tag) => {
5150
+ return openBlock(), createElementBlock("span", {
5151
+ key: tag,
5152
+ class: "ew-article__tag"
5153
+ }, toDisplayString(tag), 1);
5154
+ }), 128))
5155
+ ])) : createCommentVNode("", true)
5156
+ ]),
5157
+ createElementVNode("div", _hoisted_10, [renderSlot(_ctx.$slots, "default")]),
5158
+ _ctx.$slots.footer ? (openBlock(), createElementBlock("footer", _hoisted_11, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
5159
+ ]);
5160
+ };
5161
+ }
5162
+ };
5163
+ //#endregion
5164
+ //#region src/components/exec-card/index.vue
5165
+ var _hoisted_1$12 = { class: "ew-exec-card__stage" };
5166
+ var _hoisted_2$11 = ["src", "alt"];
5167
+ var _hoisted_3$7 = ["aria-label"];
5168
+ var _hoisted_4$7 = { class: "ew-exec-card__body" };
5169
+ var _hoisted_5$5 = { class: "ew-exec-card__name" };
5170
+ var _hoisted_6$2 = {
5171
+ key: 0,
5172
+ class: "ew-exec-card__role"
5173
+ };
5174
+ var _hoisted_7$1 = {
5175
+ key: 1,
5176
+ class: "ew-exec-card__description"
5177
+ };
5178
+ var _hoisted_8 = {
5179
+ key: 2,
5180
+ class: "ew-exec-card__actions"
5181
+ };
5182
+ var _sfc_main$18 = {
5183
+ __name: "index",
5184
+ props: {
5185
+ /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
5186
+ glass: {
5187
+ type: Boolean,
5188
+ default: void 0
5189
+ },
5190
+ name: {
5191
+ type: String,
5192
+ default: ""
5193
+ },
5194
+ /** 职务/头衔(展示型小标签排版) */
5195
+ role: {
5196
+ type: String,
5197
+ default: ""
5198
+ },
5199
+ description: {
5200
+ type: String,
5201
+ default: ""
5202
+ },
5203
+ /** 人物半身图(建议透明背景 PNG,人物居中、底部裁切) */
5204
+ image: {
5205
+ type: String,
5206
+ default: ""
5207
+ },
5208
+ /** 人物舞台高度(px) */
5209
+ portraitHeight: {
5210
+ type: Number,
5211
+ default: 190
5212
+ }
5213
+ },
5214
+ setup(__props) {
5215
+ /**
5216
+ * EwExecCard — 高管/团队介绍卡
5217
+ * 为「透明背景半身人物图」设计:人物图锚定在渐变舞台底边,像从卡片里走出来;
5218
+ * 未传 image 时渲染内置人物剪影占位。展示型 title 用强字距展示体。
5219
+ * props:name / role / description / image / portraitHeight(舞台高度,px)
5220
+ */
5221
+ return (_ctx, _cache) => {
5222
+ return openBlock(), createElementBlock("div", {
5223
+ class: normalizeClass(["ew-exec-card", {
5224
+ "is-glass": __props.glass === true,
5225
+ "no-glass": __props.glass === false
5226
+ }]),
5227
+ style: normalizeStyle({ "--ew-exec-portrait-h": `${__props.portraitHeight}px` })
5228
+ }, [createElementVNode("div", _hoisted_1$12, [__props.image ? (openBlock(), createElementBlock("img", {
5229
+ key: 0,
5230
+ src: __props.image,
5231
+ alt: __props.name,
5232
+ class: "ew-exec-card__portrait",
5233
+ loading: "lazy"
5234
+ }, null, 8, _hoisted_2$11)) : (openBlock(), createElementBlock("svg", {
5235
+ key: 1,
5236
+ class: "ew-exec-card__portrait",
5237
+ viewBox: "0 0 240 200",
5238
+ role: "img",
5239
+ "aria-label": __props.name
5240
+ }, [..._cache[0] || (_cache[0] = [createElementVNode("circle", {
5241
+ cx: "120",
5242
+ cy: "86",
5243
+ r: "44",
5244
+ fill: "currentColor",
5245
+ opacity: "0.35"
5246
+ }, null, -1), createElementVNode("path", {
5247
+ d: "M40 200c0-44 36-72 80-72s80 28 80 72",
5248
+ fill: "currentColor",
5249
+ opacity: "0.35"
5250
+ }, null, -1)])], 8, _hoisted_3$7))]), createElementVNode("div", _hoisted_4$7, [
5251
+ createElementVNode("h3", _hoisted_5$5, [renderSlot(_ctx.$slots, "name", {}, () => [createTextVNode(toDisplayString(__props.name), 1)])]),
5252
+ __props.role || _ctx.$slots.role ? (openBlock(), createElementBlock("p", _hoisted_6$2, [renderSlot(_ctx.$slots, "role", {}, () => [createTextVNode(toDisplayString(__props.role), 1)])])) : createCommentVNode("", true),
5253
+ __props.description || _ctx.$slots.default ? (openBlock(), createElementBlock("p", _hoisted_7$1, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
5254
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_8, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true)
5255
+ ])], 6);
5256
+ };
5257
+ }
5258
+ };
5259
+ //#endregion
5260
+ //#region src/components/image-preview/index.vue
5261
+ var _hoisted_1$11 = ["aria-label"];
5262
+ var _hoisted_2$10 = { class: "ew-image-preview__stage" };
5263
+ var _hoisted_3$6 = ["src", "alt"];
5264
+ var _hoisted_4$6 = {
5265
+ key: 0,
5266
+ class: "ew-image-preview__caption"
5267
+ };
5268
+ var _hoisted_5$4 = { key: 0 };
5269
+ var _sfc_main$27 = {
5270
+ __name: "index",
5271
+ props: {
5272
+ /** 可见性(v-model) */
5273
+ modelValue: {
5274
+ type: Boolean,
5275
+ default: false
5276
+ },
5277
+ /** 图片列表:url 字符串或 { src, alt } */
5278
+ images: {
5279
+ type: Array,
5280
+ default: () => []
5281
+ },
5282
+ /** 当前下标(v-model:index) */
5283
+ index: {
5284
+ type: Number,
5285
+ default: 0
5286
+ },
5287
+ /** Esc 关闭 */
5288
+ escClose: {
5289
+ type: Boolean,
5290
+ default: true
5291
+ }
5292
+ },
5293
+ emits: [
5294
+ "update:modelValue",
5295
+ "update:index",
5296
+ "open",
5297
+ "close",
5298
+ "change"
5299
+ ],
5300
+ setup(__props, { emit: __emit }) {
5301
+ /**
5302
+ * EwImagePreview — 图片预览灯箱
5303
+ * 全屏遮罩 + 居中大图;Esc / 点击遮罩 / 关闭按钮关闭;
5304
+ * 多图时支持左右箭头与键盘 ← → 切换,右下角显示计数;
5305
+ * 打开期间锁定页面滚动,关闭后恢复。
5306
+ * v-model(可见) + v-model:index(当前下标);images: [{ src, alt }] 或 url 字符串
5307
+ */
5308
+ const props = __props;
5309
+ const emit = __emit;
5310
+ const count = computed(() => props.images.length);
5311
+ const visible = computed(() => props.modelValue);
5312
+ const normalized = computed(() => props.images.map((img) => typeof img === "string" ? {
5313
+ src: img,
5314
+ alt: ""
5315
+ } : img));
5316
+ const current = computed(() => normalized.value[props.index]);
5317
+ function close() {
5318
+ emit("update:modelValue", false);
5319
+ emit("close");
5320
+ }
5321
+ function step(dir) {
5322
+ if (count.value < 2) return;
5323
+ const next = ((props.index + dir) % count.value + count.value) % count.value;
5324
+ emit("update:index", next);
5325
+ emit("change", next);
5326
+ }
5327
+ function onKeydown(e) {
5328
+ if (e.key === "Escape" && props.escClose) close();
5329
+ else if (e.key === "ArrowLeft") step(-1);
5330
+ else if (e.key === "ArrowRight") step(1);
5331
+ }
5332
+ watch(() => props.modelValue, (visible) => {
5333
+ if (typeof document === "undefined") return;
5334
+ if (visible) {
5335
+ document.addEventListener("keydown", onKeydown);
5336
+ document.body.style.overflow = "hidden";
5337
+ emit("open");
5338
+ } else {
5339
+ document.removeEventListener("keydown", onKeydown);
5340
+ document.body.style.overflow = "";
5341
+ }
5342
+ });
5343
+ onBeforeUnmount(() => {
5344
+ if (typeof document === "undefined") return;
5345
+ document.removeEventListener("keydown", onKeydown);
5346
+ document.body.style.overflow = "";
5347
+ });
5348
+ return (_ctx, _cache) => {
5349
+ return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, { name: "ew-image-preview" }, {
5350
+ default: withCtx(() => [visible.value ? (openBlock(), createElementBlock("div", {
5351
+ key: 0,
5352
+ class: "ew-image-preview",
5353
+ role: "dialog",
5354
+ "aria-modal": "true",
5355
+ "aria-label": `图片预览(${__props.index + 1} / ${count.value})`,
5356
+ onClick: withModifiers(close, ["self"])
5357
+ }, [
5358
+ createElementVNode("button", {
5359
+ type: "button",
5360
+ class: "ew-image-preview__close",
5361
+ "aria-label": "关闭预览",
5362
+ onClick: close
5363
+ }, [createVNode(_sfc_main$24, {
5364
+ name: "close",
5365
+ size: 16
5366
+ })]),
5367
+ count.value > 1 ? (openBlock(), createElementBlock("button", {
5368
+ key: 0,
5369
+ type: "button",
5370
+ class: "ew-image-preview__arrow is-prev",
5371
+ "aria-label": "上一张",
5372
+ onClick: _cache[0] || (_cache[0] = withModifiers(($event) => step(-1), ["stop"]))
5373
+ }, [createVNode(_sfc_main$24, {
5374
+ name: "chevron-left",
5375
+ size: 20
5376
+ })])) : createCommentVNode("", true),
5377
+ createElementVNode("figure", _hoisted_2$10, [createElementVNode("img", {
5378
+ src: current.value?.src,
5379
+ alt: current.value?.alt || "",
5380
+ class: "ew-image-preview__img"
5381
+ }, null, 8, _hoisted_3$6), current.value?.alt || count.value > 1 ? (openBlock(), createElementBlock("figcaption", _hoisted_4$6, [createElementVNode("span", null, toDisplayString(current.value?.alt), 1), count.value > 1 ? (openBlock(), createElementBlock("span", _hoisted_5$4, toDisplayString(__props.index + 1) + " / " + toDisplayString(count.value), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)]),
5382
+ count.value > 1 ? (openBlock(), createElementBlock("button", {
5383
+ key: 1,
5384
+ type: "button",
5385
+ class: "ew-image-preview__arrow is-next",
5386
+ "aria-label": "下一张",
5387
+ onClick: _cache[1] || (_cache[1] = withModifiers(($event) => step(1), ["stop"]))
5388
+ }, [createVNode(_sfc_main$24, {
5389
+ name: "chevron-right",
5390
+ size: 20
5391
+ })])) : createCommentVNode("", true)
5392
+ ], 8, _hoisted_1$11)) : createCommentVNode("", true)]),
5393
+ _: 1
5394
+ })]);
5395
+ };
5396
+ }
5397
+ };
5398
+ //#endregion
5399
+ //#region src/components/image-wall/index.vue
5400
+ var _hoisted_1$10 = ["aria-label", "onClick"];
5401
+ var _hoisted_2$9 = ["src", "alt"];
5402
+ var _sfc_main$28 = {
5403
+ __name: "index",
5404
+ props: {
5405
+ /** 图片列表:url 字符串或 { src, alt } */
5406
+ images: {
5407
+ type: Array,
5408
+ default: () => []
5409
+ },
5410
+ /** 列数 */
5411
+ columns: {
5412
+ type: Number,
5413
+ default: 3
5414
+ },
5415
+ /** 间距(px) */
5416
+ gap: {
5417
+ type: Number,
5418
+ default: 14
5419
+ },
5420
+ /** 点击图片是否打开预览(false 时仅派发 select 事件) */
5421
+ preview: {
5422
+ type: Boolean,
5423
+ default: true
5424
+ },
5425
+ /** 网格圆角(px) */
5426
+ radius: {
5427
+ type: Number,
5428
+ default: 12
5429
+ }
5430
+ },
5431
+ emits: ["select"],
5432
+ setup(__props, { emit: __emit }) {
5433
+ /**
5434
+ * EwImageWall — 图片墙
5435
+ * 均匀网格图片墙,点击任意图片打开 EwImagePreview 灯箱预览(可关)。
5436
+ * images 项:字符串 url 或 { src, alt };columns 列数;preview=false 时仅发出 select 事件。
5437
+ */
5438
+ const props = __props;
5439
+ const emit = __emit;
5440
+ const previewVisible = ref(false);
5441
+ const previewIndex = ref(0);
5442
+ const normalized = computed(() => props.images.map((img) => typeof img === "string" ? {
5443
+ src: img,
5444
+ alt: ""
5445
+ } : img));
5446
+ const gridStyle = computed(() => ({
5447
+ gridTemplateColumns: `repeat(${props.columns}, 1fr)`,
5448
+ gap: `${props.gap}px`
5449
+ }));
5450
+ function open(i) {
5451
+ previewIndex.value = i;
5452
+ emit("select", normalized.value[i], i);
5453
+ if (props.preview) previewVisible.value = true;
5454
+ }
5455
+ return (_ctx, _cache) => {
5456
+ return openBlock(), createElementBlock("div", {
5457
+ class: "ew-image-wall",
5458
+ style: normalizeStyle(gridStyle.value)
5459
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalized.value, (img, i) => {
5460
+ return openBlock(), createElementBlock("button", {
5461
+ key: i,
5462
+ type: "button",
5463
+ class: "ew-image-wall__item",
5464
+ style: normalizeStyle({ "--ew-image-wall-radius": `${__props.radius}px` }),
5465
+ "aria-label": img.alt || `查看第 ${i + 1} 张图片`,
5466
+ onClick: ($event) => open(i)
5467
+ }, [createElementVNode("img", {
5468
+ src: img.src,
5469
+ alt: img.alt || "",
5470
+ loading: "lazy"
5471
+ }, null, 8, _hoisted_2$9)], 12, _hoisted_1$10);
5472
+ }), 128)), __props.preview ? (openBlock(), createBlock(_sfc_main$27, {
5473
+ key: 0,
5474
+ modelValue: previewVisible.value,
5475
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => previewVisible.value = $event),
5476
+ index: previewIndex.value,
5477
+ "onUpdate:index": _cache[1] || (_cache[1] = ($event) => previewIndex.value = $event),
5478
+ images: normalized.value
5479
+ }, null, 8, [
5480
+ "modelValue",
5481
+ "index",
5482
+ "images"
5483
+ ])) : createCommentVNode("", true)], 4);
5484
+ };
5485
+ }
5486
+ };
5487
+ //#endregion
5488
+ //#region src/components/modal/index.vue
5489
+ var _hoisted_1$9 = ["aria-label"];
5490
+ var _hoisted_2$8 = {
5491
+ key: 0,
5492
+ class: "ew-modal__header"
5493
+ };
5494
+ var _hoisted_3$5 = { class: "ew-modal__title" };
5495
+ var _hoisted_4$5 = { class: "ew-modal__body" };
5496
+ var _hoisted_5$3 = {
5497
+ key: 1,
5498
+ class: "ew-modal__footer"
5499
+ };
5500
+ var _sfc_main$34 = {
5501
+ __name: "index",
5502
+ props: {
5503
+ /** 可见性(v-model) */
5504
+ modelValue: {
5505
+ type: Boolean,
5506
+ default: false
5507
+ },
5508
+ title: {
5509
+ type: String,
5510
+ default: ""
5511
+ },
5512
+ /** 面板宽度(数字按 px) */
5513
+ width: {
5514
+ type: [String, Number],
5515
+ default: "560px"
5516
+ },
5517
+ /** 点击遮罩关闭 */
5518
+ overlayClose: {
5519
+ type: Boolean,
5520
+ default: true
5521
+ },
5522
+ /** Esc 关闭 */
5523
+ escClose: {
5524
+ type: Boolean,
5525
+ default: true
5526
+ },
5527
+ /** 打开期间锁定页面滚动 */
5528
+ lockScroll: {
5529
+ type: Boolean,
5530
+ default: true
5531
+ },
5532
+ /** 右上角关闭按钮 */
5533
+ showClose: {
5534
+ type: Boolean,
5535
+ default: true
5536
+ }
5537
+ },
5538
+ emits: [
5539
+ "update:modelValue",
5540
+ "open",
5541
+ "opened",
5542
+ "close",
5543
+ "closed"
5544
+ ],
5545
+ setup(__props, { emit: __emit }) {
5546
+ /**
5547
+ * EwModal — 弹出层
5548
+ * 遮罩 + 居中面板;Teleport 到 body;Esc / 遮罩点击 / 关闭按钮关闭(均可配);
5549
+ * 打开期间锁定页面滚动,打开时焦点移入面板、关闭后归还触发元素;
5550
+ * 事件:update:modelValue / open / opened / close / closed。
5551
+ * 典型用法:弹出层 + 表单(邮箱验证、订阅、邀请)。
5552
+ */
5553
+ const props = __props;
5554
+ const emit = __emit;
5555
+ const panelRef = ref(null);
5556
+ let lastFocused = null;
5557
+ const visible = computed(() => props.modelValue);
5558
+ const panelStyle = computed(() => ({ width: typeof props.width === "number" ? `${props.width}px` : props.width }));
5559
+ function close() {
5560
+ emit("update:modelValue", false);
5561
+ emit("close");
5562
+ }
5563
+ function onOverlayClick() {
5564
+ if (props.overlayClose) close();
5565
+ }
5566
+ function onKeydown(e) {
5567
+ if (e.key === "Escape" && props.escClose) close();
5568
+ }
5569
+ watch(visible, (show) => {
5570
+ if (typeof document === "undefined") return;
5571
+ if (show) {
5572
+ lastFocused = document.activeElement;
5573
+ emit("open");
5574
+ if (props.lockScroll) document.body.style.overflow = "hidden";
5575
+ document.addEventListener("keydown", onKeydown);
5576
+ nextTick(() => panelRef.value?.focus?.());
5577
+ } else {
5578
+ if (props.lockScroll) document.body.style.overflow = "";
5579
+ document.removeEventListener("keydown", onKeydown);
5580
+ nextTick(() => lastFocused?.focus?.());
5581
+ }
5582
+ });
5583
+ onBeforeUnmount(() => {
5584
+ if (typeof document === "undefined") return;
5585
+ document.removeEventListener("keydown", onKeydown);
5586
+ if (props.lockScroll) document.body.style.overflow = "";
5587
+ });
5588
+ return (_ctx, _cache) => {
5589
+ return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
5590
+ name: "ew-modal",
5591
+ onAfterEnter: _cache[0] || (_cache[0] = ($event) => emit("opened")),
5592
+ onAfterLeave: _cache[1] || (_cache[1] = ($event) => emit("closed"))
5593
+ }, {
5594
+ default: withCtx(() => [visible.value ? (openBlock(), createElementBlock("div", {
5595
+ key: 0,
5596
+ class: "ew-modal",
5597
+ onClick: withModifiers(onOverlayClick, ["self"])
5598
+ }, [createElementVNode("div", {
5599
+ ref_key: "panelRef",
5600
+ ref: panelRef,
5601
+ class: "ew-modal__panel",
5602
+ role: "dialog",
5603
+ "aria-modal": "true",
5604
+ "aria-label": __props.title || "对话框",
5605
+ style: normalizeStyle(panelStyle.value),
5606
+ tabindex: "-1"
5607
+ }, [
5608
+ __props.title || _ctx.$slots.header || __props.showClose ? (openBlock(), createElementBlock("header", _hoisted_2$8, [renderSlot(_ctx.$slots, "header", {}, () => [createElementVNode("h2", _hoisted_3$5, toDisplayString(__props.title), 1)]), __props.showClose ? (openBlock(), createElementBlock("button", {
5609
+ key: 0,
5610
+ type: "button",
5611
+ class: "ew-modal__close",
5612
+ "aria-label": "关闭",
5613
+ onClick: close
5614
+ }, [createVNode(_sfc_main$24, {
5615
+ name: "close",
5616
+ size: 14
5617
+ })])) : createCommentVNode("", true)])) : createCommentVNode("", true),
5618
+ createElementVNode("div", _hoisted_4$5, [renderSlot(_ctx.$slots, "default")]),
5619
+ _ctx.$slots.footer ? (openBlock(), createElementBlock("footer", _hoisted_5$3, [renderSlot(_ctx.$slots, "footer")])) : createCommentVNode("", true)
5620
+ ], 12, _hoisted_1$9)])) : createCommentVNode("", true)]),
5621
+ _: 3
5622
+ })]);
5623
+ };
5624
+ }
5625
+ };
5626
+ //#endregion
5627
+ //#region src/components/marquee/index.vue
4750
5628
  var _hoisted_1$8 = { class: "ew-marquee__track" };
4751
5629
  var _hoisted_2$7 = ["aria-hidden"];
4752
5630
  var _hoisted_3$4 = { class: "ew-marquee__group" };
@@ -4754,7 +5632,7 @@ var _hoisted_4$4 = {
4754
5632
  class: "ew-marquee__group",
4755
5633
  "aria-hidden": "true"
4756
5634
  };
4757
- var _sfc_main$28 = {
5635
+ var _sfc_main$33 = {
4758
5636
  __name: "index",
4759
5637
  props: {
4760
5638
  /** 文本模式的词条(传入后若没有默认插槽则启用文本模式) */
@@ -4831,7 +5709,7 @@ var _sfc_main$28 = {
4831
5709
  class: "ew-marquee__group",
4832
5710
  "aria-hidden": g === 2 ? "true" : void 0
4833
5711
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (w, i) => {
4834
- return openBlock(), createElementBlock(Fragment, { key: i }, [createElementVNode("span", { class: normalizeClass(["ew-marquee__text", { "is-outline": __props.alternateOutline && i % 2 === 1 }]) }, toDisplayString(w), 3), __props.separator ? (openBlock(), createBlock(_sfc_main$21, {
5712
+ return openBlock(), createElementBlock(Fragment, { key: i }, [createElementVNode("span", { class: normalizeClass(["ew-marquee__text", { "is-outline": __props.alternateOutline && i % 2 === 1 }]) }, toDisplayString(w), 3), __props.separator ? (openBlock(), createBlock(_sfc_main$24, {
4835
5713
  key: 0,
4836
5714
  name: __props.separator,
4837
5715
  size: separatorSize.value,
@@ -4846,6 +5724,66 @@ var _sfc_main$28 = {
4846
5724
  }
4847
5725
  };
4848
5726
  //#endregion
5727
+ //#region src/components/border-beam/index.vue
5728
+ var _sfc_main$8 = {
5729
+ __name: "index",
5730
+ props: {
5731
+ /** 光带宽度(px) */
5732
+ width: {
5733
+ type: Number,
5734
+ default: 2
5735
+ },
5736
+ /** 一圈时长(ms,越小越快) */
5737
+ duration: {
5738
+ type: Number,
5739
+ default: 6e3
5740
+ },
5741
+ /** 起始延迟(ms) */
5742
+ delay: {
5743
+ type: Number,
5744
+ default: 0
5745
+ },
5746
+ /** 流光渐变起点色(默认透明,扫到位置时显现) */
5747
+ colorFrom: {
5748
+ type: String,
5749
+ default: "transparent"
5750
+ },
5751
+ /** 流光渐变主色(缺省取 --ew-color-primary) */
5752
+ colorTo: {
5753
+ type: String,
5754
+ default: ""
5755
+ },
5756
+ /** 反向扫动 */
5757
+ reverse: {
5758
+ type: Boolean,
5759
+ default: false
5760
+ }
5761
+ },
5762
+ setup(__props) {
5763
+ /**
5764
+ * EwBorderBeam — 边框流光
5765
+ * 包住任意内容,一道流光沿边框循环扫过(主色渐变,方向/速度/宽度可调)。
5766
+ * 依赖 CSS @property 插值角度;不支持的浏览器自动退化为静态渐变细环。
5767
+ * 圆角跟随宿主:给本组件根元素设置 border-radius 即可(ring 会同步取圆角)。
5768
+ */
5769
+ const props = __props;
5770
+ const rootStyle = computed(() => ({
5771
+ "--ew-beam-width": `${props.width}px`,
5772
+ "--ew-beam-duration": `${props.duration}ms`,
5773
+ "--ew-beam-delay": `${props.delay}ms`,
5774
+ "--ew-beam-from": props.colorFrom || "transparent",
5775
+ "--ew-beam-to": props.colorTo || "var(--ew-color-primary)",
5776
+ "--ew-beam-direction": props.reverse ? "reverse" : "normal"
5777
+ }));
5778
+ return (_ctx, _cache) => {
5779
+ return openBlock(), createElementBlock("div", {
5780
+ class: "ew-border-beam",
5781
+ style: normalizeStyle(rootStyle.value)
5782
+ }, [renderSlot(_ctx.$slots, "default")], 4);
5783
+ };
5784
+ }
5785
+ };
5786
+ //#endregion
4849
5787
  //#region src/components/input/index.vue
4850
5788
  var _hoisted_1$7 = [
4851
5789
  "value",
@@ -4857,7 +5795,7 @@ var _hoisted_2$6 = {
4857
5795
  key: 2,
4858
5796
  class: "ew-input__suffix"
4859
5797
  };
4860
- var _sfc_main$24 = /*@__PURE__*/ Object.assign({
5798
+ var _sfc_main$29 = /*@__PURE__*/ Object.assign({
4861
5799
  inheritAttrs: false,
4862
5800
  name: "EwInput"
4863
5801
  }, {
@@ -4941,7 +5879,7 @@ var _sfc_main$24 = /*@__PURE__*/ Object.assign({
4941
5879
  "is-error": __props.error
4942
5880
  }
4943
5881
  ]) }, [
4944
- __props.icon ? (openBlock(), createBlock(_sfc_main$21, {
5882
+ __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
4945
5883
  key: 0,
4946
5884
  name: __props.icon,
4947
5885
  size: iconSize.value,
@@ -4961,7 +5899,7 @@ var _sfc_main$24 = /*@__PURE__*/ Object.assign({
4961
5899
  class: "ew-input__clear",
4962
5900
  "aria-label": "清空",
4963
5901
  onClick: clear
4964
- }, [createVNode(_sfc_main$21, {
5902
+ }, [createVNode(_sfc_main$24, {
4965
5903
  name: "close",
4966
5904
  size: 12
4967
5905
  })])) : createCommentVNode("", true),
@@ -4983,7 +5921,7 @@ var _hoisted_2$5 = {
4983
5921
  key: 0,
4984
5922
  class: "ew-textarea__count"
4985
5923
  };
4986
- var _sfc_main$45 = /*@__PURE__*/ Object.assign({
5924
+ var _sfc_main$51 = /*@__PURE__*/ Object.assign({
4987
5925
  inheritAttrs: false,
4988
5926
  name: "EwTextarea"
4989
5927
  }, {
@@ -5070,7 +6008,7 @@ var _hoisted_5$2 = {
5070
6008
  key: 2,
5071
6009
  class: "ew-field__hint"
5072
6010
  };
5073
- var _sfc_main$18 = {
6011
+ var _sfc_main$21 = {
5074
6012
  __name: "index",
5075
6013
  props: {
5076
6014
  label: {
@@ -5135,7 +6073,7 @@ var _hoisted_1$4 = {
5135
6073
  key: 0,
5136
6074
  class: "ew-pull-refresh__spinner"
5137
6075
  };
5138
- var _sfc_main$34 = /*@__PURE__*/ Object.assign({ name: "EwPullRefresh" }, {
6076
+ var _sfc_main$40 = /*@__PURE__*/ Object.assign({ name: "EwPullRefresh" }, {
5139
6077
  __name: "index",
5140
6078
  props: {
5141
6079
  /** 刷新中状态(v-model):置 true 进入 loading,加载完成置 false 自动展示成功态后收回 */
@@ -5329,7 +6267,7 @@ var _sfc_main$34 = /*@__PURE__*/ Object.assign({ name: "EwPullRefresh" }, {
5329
6267
  //#region src/components/load-more/index.vue
5330
6268
  var _hoisted_1$3 = ["disabled"];
5331
6269
  var _hoisted_2$3 = { class: "ew-load-more__text" };
5332
- var _sfc_main$26 = /*@__PURE__*/ Object.assign({ name: "EwLoadMore" }, {
6270
+ var _sfc_main$31 = /*@__PURE__*/ Object.assign({ name: "EwLoadMore" }, {
5333
6271
  __name: "index",
5334
6272
  props: {
5335
6273
  /** 列表状态(v-model:status):idle | loading | noMore | error */
@@ -5622,7 +6560,7 @@ var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EwActionSheet" }, {
5622
6560
  });
5623
6561
  //#endregion
5624
6562
  //#region src/components/tabbar/index.vue
5625
- var _sfc_main$41 = /*@__PURE__*/ Object.assign({ name: "EwTabbar" }, {
6563
+ var _sfc_main$47 = /*@__PURE__*/ Object.assign({ name: "EwTabbar" }, {
5626
6564
  __name: "index",
5627
6565
  props: {
5628
6566
  /** 当前激活项的 name(未设置 name 时为索引) */
@@ -5731,7 +6669,7 @@ var _hoisted_7 = {
5731
6669
  key: 1,
5732
6670
  class: "ew-tabbar-item__badge is-inline"
5733
6671
  };
5734
- var _sfc_main$42 = /*@__PURE__*/ Object.assign({ name: "EwTabbarItem" }, {
6672
+ var _sfc_main$48 = /*@__PURE__*/ Object.assign({ name: "EwTabbarItem" }, {
5735
6673
  __name: "item",
5736
6674
  props: {
5737
6675
  /** 标识,缺省用注册顺序索引 */
@@ -5786,7 +6724,7 @@ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ name: "EwTabbarItem" }, {
5786
6724
  role: "tab",
5787
6725
  "aria-selected": isActive.value,
5788
6726
  onClick
5789
- }, [hasIcon.value ? (openBlock(), createElementBlock("div", _hoisted_2$1, [renderSlot(_ctx.$slots, "icon", { active: isActive.value }, () => [__props.icon ? (openBlock(), createBlock(_sfc_main$21, {
6727
+ }, [hasIcon.value ? (openBlock(), createElementBlock("div", _hoisted_2$1, [renderSlot(_ctx.$slots, "icon", { active: isActive.value }, () => [__props.icon ? (openBlock(), createBlock(_sfc_main$24, {
5790
6728
  key: 0,
5791
6729
  name: __props.icon
5792
6730
  }, null, 8, ["name"])) : createCommentVNode("", true)]), __props.dot ? (openBlock(), createElementBlock("i", _hoisted_3$1)) : showBadge.value ? (openBlock(), createElementBlock("span", _hoisted_4$1, toDisplayString(__props.badge), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true), createElementVNode("div", _hoisted_5, [renderSlot(_ctx.$slots, "default"), !hasIcon.value && __props.dot ? (openBlock(), createElementBlock("i", _hoisted_6)) : !hasIcon.value && showBadge.value ? (openBlock(), createElementBlock("span", _hoisted_7, toDisplayString(__props.badge), 1)) : createCommentVNode("", true)])], 10, _hoisted_1$1);
@@ -5809,7 +6747,7 @@ var _hoisted_4 = {
5809
6747
  key: 0,
5810
6748
  class: "ew-nav-bar__text"
5811
6749
  };
5812
- var _sfc_main$29 = /*@__PURE__*/ Object.assign({ name: "EwNavBar" }, {
6750
+ var _sfc_main$35 = /*@__PURE__*/ Object.assign({ name: "EwNavBar" }, {
5813
6751
  __name: "index",
5814
6752
  props: {
5815
6753
  /** 标题文本(title 插槽可替换) */
@@ -5871,7 +6809,7 @@ var _sfc_main$29 = /*@__PURE__*/ Object.assign({ name: "EwNavBar" }, {
5871
6809
  createElementVNode("div", {
5872
6810
  class: "ew-nav-bar__side is-left",
5873
6811
  onClick: _cache[0] || (_cache[0] = ($event) => emit("click-left"))
5874
- }, [renderSlot(_ctx.$slots, "left", {}, () => [__props.leftArrow ? (openBlock(), createBlock(_sfc_main$21, {
6812
+ }, [renderSlot(_ctx.$slots, "left", {}, () => [__props.leftArrow ? (openBlock(), createBlock(_sfc_main$24, {
5875
6813
  key: 0,
5876
6814
  name: "arrow-left",
5877
6815
  size: 18
@@ -5888,55 +6826,61 @@ var _sfc_main$29 = /*@__PURE__*/ Object.assign({ name: "EwNavBar" }, {
5888
6826
  //#endregion
5889
6827
  //#region src/index.js
5890
6828
  var components = {
5891
- EwIcon: _sfc_main$21,
5892
- EwButton: _sfc_main$7,
5893
- EwIconButton: _sfc_main$22,
5894
- EwTag: _sfc_main$44,
5895
- EwBadge: _sfc_main$6,
5896
- EwCard: _sfc_main$8,
5897
- EwSection: _sfc_main$37,
5898
- EwNavbar: _sfc_main$30,
5899
- EwFooter: _sfc_main$19,
5900
- EwHero: _sfc_main$20,
5901
- EwSearchBox: _sfc_main$36,
5902
- EwIconGrid: _sfc_main$23,
5903
- EwFeatureGrid: _sfc_main$17,
5904
- EwPricingCard: _sfc_main$32,
5905
- EwFaq: _sfc_main$16,
6829
+ EwIcon: _sfc_main$24,
6830
+ EwButton: _sfc_main$9,
6831
+ EwIconButton: _sfc_main$25,
6832
+ EwTag: _sfc_main$50,
6833
+ EwBadge: _sfc_main$7,
6834
+ EwCard: _sfc_main$10,
6835
+ EwSection: _sfc_main$43,
6836
+ EwNavbar: _sfc_main$36,
6837
+ EwFooter: _sfc_main$22,
6838
+ EwHero: _sfc_main$23,
6839
+ EwSearchBox: _sfc_main$42,
6840
+ EwIconGrid: _sfc_main$26,
6841
+ EwFeatureGrid: _sfc_main$20,
6842
+ EwPricingCard: _sfc_main$38,
6843
+ EwFaq: _sfc_main$19,
5906
6844
  EwAlert: _sfc_main$1,
5907
- EwCodeBlock: _sfc_main$10,
5908
- EwKeycap: _sfc_main$25,
5909
- EwStatistic: _sfc_main$39,
5910
- EwThemeToggle: _sfc_main$46,
5911
- EwQuote: _sfc_main$35,
5912
- EwConfigProvider: _sfc_main$12,
5913
- EwTabs: _sfc_main$43,
5914
- EwSwitch: _sfc_main$40,
5915
- EwContainer: _sfc_main$14,
5916
- EwAvatar: _sfc_main$4,
5917
- EwAvatarGroup: _sfc_main$5,
5918
- EwTimeline: _sfc_main$47,
5919
- EwComparisonTable: _sfc_main$11,
5920
- EwCta: _sfc_main$15,
5921
- EwNewsletter: _sfc_main$31,
5922
- EwLogoCloud: _sfc_main$27,
5923
- EwVideo: _sfc_main$48,
5924
- EwAudio: _sfc_main$3,
5925
- EwContactForm: _sfc_main$13,
5926
- EwCarousel: _sfc_main$9,
5927
- EwArticleCard: _sfc_main$2,
5928
- EwProfileCard: _sfc_main$33,
5929
- EwMarquee: _sfc_main$28,
5930
- EwInput: _sfc_main$24,
5931
- EwTextarea: _sfc_main$45,
5932
- EwSelect: _sfc_main$38,
5933
- EwField: _sfc_main$18,
5934
- EwPullRefresh: _sfc_main$34,
5935
- EwLoadMore: _sfc_main$26,
6845
+ EwCodeBlock: _sfc_main$12,
6846
+ EwKeycap: _sfc_main$30,
6847
+ EwStatistic: _sfc_main$45,
6848
+ EwThemeToggle: _sfc_main$52,
6849
+ EwQuote: _sfc_main$41,
6850
+ EwConfigProvider: _sfc_main$14,
6851
+ EwTabs: _sfc_main$49,
6852
+ EwSwitch: _sfc_main$46,
6853
+ EwContainer: _sfc_main$16,
6854
+ EwAvatar: _sfc_main$5,
6855
+ EwAvatarGroup: _sfc_main$6,
6856
+ EwTimeline: _sfc_main$53,
6857
+ EwComparisonTable: _sfc_main$13,
6858
+ EwCta: _sfc_main$17,
6859
+ EwNewsletter: _sfc_main$37,
6860
+ EwLogoCloud: _sfc_main$32,
6861
+ EwVideo: _sfc_main$54,
6862
+ EwAudio: _sfc_main$4,
6863
+ EwContactForm: _sfc_main$15,
6864
+ EwCarousel: _sfc_main$11,
6865
+ EwArticleCard: _sfc_main$3,
6866
+ EwProfileCard: _sfc_main$39,
6867
+ EwArticle: _sfc_main$2,
6868
+ EwExecCard: _sfc_main$18,
6869
+ EwImageWall: _sfc_main$28,
6870
+ EwImagePreview: _sfc_main$27,
6871
+ EwModal: _sfc_main$34,
6872
+ EwMarquee: _sfc_main$33,
6873
+ EwBorderBeam: _sfc_main$8,
6874
+ EwInput: _sfc_main$29,
6875
+ EwTextarea: _sfc_main$51,
6876
+ EwSelect: _sfc_main$44,
6877
+ EwField: _sfc_main$21,
6878
+ EwPullRefresh: _sfc_main$40,
6879
+ EwLoadMore: _sfc_main$31,
5936
6880
  EwActionSheet: _sfc_main,
5937
- EwTabbar: _sfc_main$41,
5938
- EwTabbarItem: _sfc_main$42,
5939
- EwNavBar: _sfc_main$29
6881
+ EwTabbar: _sfc_main$47,
6882
+ EwTabbarItem: _sfc_main$48,
6883
+ EwNavBar: _sfc_main$35
5940
6884
  };
5941
6885
  function install(app) {
5942
6886
  for (const [name, comp] of Object.entries(components)) app.component(name, comp);
@@ -5945,4 +6889,4 @@ function install(app) {
5945
6889
  }
5946
6890
  var src_default = { install };
5947
6891
  //#endregion
5948
- export { EW_COLOR_PRESETS, EW_CONTAINER_PRESETS, EW_PALETTE_PRESETS, EW_RADIUS_PRESETS, EW_SPACE_PRESETS, EW_STYLE_PRESETS, _sfc_main as EwActionSheet, _sfc_main$1 as EwAlert, _sfc_main$2 as EwArticleCard, _sfc_main$3 as EwAudio, _sfc_main$4 as EwAvatar, _sfc_main$5 as EwAvatarGroup, _sfc_main$6 as EwBadge, _sfc_main$7 as EwButton, _sfc_main$8 as EwCard, _sfc_main$9 as EwCarousel, _sfc_main$10 as EwCodeBlock, _sfc_main$11 as EwComparisonTable, _sfc_main$12 as EwConfigProvider, _sfc_main$13 as EwContactForm, _sfc_main$14 as EwContainer, _sfc_main$15 as EwCta, _sfc_main$16 as EwFaq, _sfc_main$17 as EwFeatureGrid, _sfc_main$18 as EwField, _sfc_main$19 as EwFooter, _sfc_main$20 as EwHero, _sfc_main$21 as EwIcon, _sfc_main$22 as EwIconButton, _sfc_main$23 as EwIconGrid, _sfc_main$24 as EwInput, _sfc_main$25 as EwKeycap, _sfc_main$26 as EwLoadMore, _sfc_main$27 as EwLogoCloud, _sfc_main$28 as EwMarquee, _sfc_main$29 as EwNavBar, _sfc_main$30 as EwNavbar, _sfc_main$31 as EwNewsletter, _sfc_main$32 as EwPricingCard, _sfc_main$33 as EwProfileCard, _sfc_main$34 as EwPullRefresh, _sfc_main$35 as EwQuote, _sfc_main$36 as EwSearchBox, _sfc_main$37 as EwSection, _sfc_main$38 as EwSelect, _sfc_main$39 as EwStatistic, _sfc_main$40 as EwSwitch, _sfc_main$41 as EwTabbar, _sfc_main$42 as EwTabbarItem, _sfc_main$43 as EwTabs, _sfc_main$44 as EwTag, _sfc_main$45 as EwTextarea, _sfc_main$46 as EwThemeToggle, _sfc_main$47 as EwTimeline, _sfc_main$48 as EwVideo, components, src_default as default, ensureViewportFit, getIconByName, getIconNames, hasIcon, initTheme, install, loadShowcaseIcons, registerIcons, resolveThemeVars, useCopy, useSafeArea, useTheme, useThemeConfig, revealDirective as vReveal };
6892
+ export { EW_COLOR_PRESETS, EW_CONTAINER_PRESETS, EW_PALETTE_PRESETS, EW_RADIUS_PRESETS, EW_SPACE_PRESETS, EW_STYLE_PRESETS, _sfc_main as EwActionSheet, _sfc_main$1 as EwAlert, _sfc_main$2 as EwArticle, _sfc_main$3 as EwArticleCard, _sfc_main$4 as EwAudio, _sfc_main$5 as EwAvatar, _sfc_main$6 as EwAvatarGroup, _sfc_main$7 as EwBadge, _sfc_main$8 as EwBorderBeam, _sfc_main$9 as EwButton, _sfc_main$10 as EwCard, _sfc_main$11 as EwCarousel, _sfc_main$12 as EwCodeBlock, _sfc_main$13 as EwComparisonTable, _sfc_main$14 as EwConfigProvider, _sfc_main$15 as EwContactForm, _sfc_main$16 as EwContainer, _sfc_main$17 as EwCta, _sfc_main$18 as EwExecCard, _sfc_main$19 as EwFaq, _sfc_main$20 as EwFeatureGrid, _sfc_main$21 as EwField, _sfc_main$22 as EwFooter, _sfc_main$23 as EwHero, _sfc_main$24 as EwIcon, _sfc_main$25 as EwIconButton, _sfc_main$26 as EwIconGrid, _sfc_main$27 as EwImagePreview, _sfc_main$28 as EwImageWall, _sfc_main$29 as EwInput, _sfc_main$30 as EwKeycap, _sfc_main$31 as EwLoadMore, _sfc_main$32 as EwLogoCloud, _sfc_main$33 as EwMarquee, _sfc_main$34 as EwModal, _sfc_main$35 as EwNavBar, _sfc_main$36 as EwNavbar, _sfc_main$37 as EwNewsletter, _sfc_main$38 as EwPricingCard, _sfc_main$39 as EwProfileCard, _sfc_main$40 as EwPullRefresh, _sfc_main$41 as EwQuote, _sfc_main$42 as EwSearchBox, _sfc_main$43 as EwSection, _sfc_main$44 as EwSelect, _sfc_main$45 as EwStatistic, _sfc_main$46 as EwSwitch, _sfc_main$47 as EwTabbar, _sfc_main$48 as EwTabbarItem, _sfc_main$49 as EwTabs, _sfc_main$50 as EwTag, _sfc_main$51 as EwTextarea, _sfc_main$52 as EwThemeToggle, _sfc_main$53 as EwTimeline, _sfc_main$54 as EwVideo, components, src_default as default, ensureViewportFit, getIconByName, getIconNames, hasIcon, initTheme, install, loadShowcaseIcons, registerIcons, resolveThemeVars, useCopy, useSafeArea, useTheme, useThemeConfig, revealDirective as vReveal };