@wil-works/evoke-ui 0.2.0 → 0.3.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, onUnmounted, 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, vShow, watch, withCtx, withDirectives, withKeys, withModifiers } from "vue";
2
2
  //#region src/composables/useTheme.js
3
3
  /**
4
4
  * useTheme — 明暗主题管理
@@ -8,7 +8,7 @@ import { Fragment, Teleport, Transition, computed, createBlock, createCommentVNo
8
8
  * Usage:
9
9
  * const { isDark, toggle, set } = useTheme()
10
10
  */
11
- var STORAGE_KEY = "ew-theme";
11
+ var STORAGE_KEY = "ev-theme";
12
12
  var isDark = ref(false);
13
13
  var initialized = false;
14
14
  function apply$1(dark) {
@@ -142,10 +142,10 @@ function generatePrimaryRamp(primary) {
142
142
  //#endregion
143
143
  //#region src/presets.js
144
144
  /**
145
- * 主题预设 — 供 EwConfigProvider / 定制器与消费方直接取用
145
+ * 主题预设 — 供 EvConfigProvider / 定制器与消费方直接取用
146
146
  */
147
147
  /** 主色预设(name → hex) */
148
- var EW_COLOR_PRESETS = {
148
+ var EV_COLOR_PRESETS = {
149
149
  blue: {
150
150
  label: "Launch Blue",
151
151
  primary: "#0D70FF"
@@ -176,11 +176,11 @@ var EW_COLOR_PRESETS = {
176
176
  * 组内每色均可直接作为主色,淡色阶由 generatePrimaryRamp 自动生成;
177
177
  * semantic 为该色系配套的 success/warning/danger/info,切色系时整体联动
178
178
  */
179
- var EW_PALETTE_PRESETS = {
179
+ var EV_PALETTE_PRESETS = {
180
180
  classic: {
181
181
  label: "经典",
182
182
  description: "Launch 系高辨识度主色,SaaS 与工具站的稳妥选择",
183
- colors: Object.values(EW_COLOR_PRESETS).map((c) => ({
183
+ colors: Object.values(EV_COLOR_PRESETS).map((c) => ({
184
184
  label: c.label,
185
185
  value: c.primary
186
186
  })),
@@ -409,7 +409,7 @@ var EW_PALETTE_PRESETS = {
409
409
  }
410
410
  };
411
411
  /** 圆角档预设(scale 基准乘数作用于 6/10/14/20/28) */
412
- var EW_RADIUS_PRESETS = {
412
+ var EV_RADIUS_PRESETS = {
413
413
  sharp: {
414
414
  label: "硬朗",
415
415
  scale: .55
@@ -428,7 +428,7 @@ var EW_RADIUS_PRESETS = {
428
428
  }
429
429
  };
430
430
  /** 间距档预设(作用于 4px 网格全部间距令牌) */
431
- var EW_SPACE_PRESETS = {
431
+ var EV_SPACE_PRESETS = {
432
432
  compact: {
433
433
  label: "紧凑",
434
434
  scale: .85
@@ -443,7 +443,7 @@ var EW_SPACE_PRESETS = {
443
443
  }
444
444
  };
445
445
  /** 内容容器宽度档 */
446
- var EW_CONTAINER_PRESETS = {
446
+ var EV_CONTAINER_PRESETS = {
447
447
  narrow: {
448
448
  label: "窄",
449
449
  width: 920
@@ -462,7 +462,7 @@ var EW_CONTAINER_PRESETS = {
462
462
  }
463
463
  };
464
464
  /** 风格方案预设(站点类型 → 一整套 主色/圆角/间距/容器宽) */
465
- var EW_STYLE_PRESETS = {
465
+ var EV_STYLE_PRESETS = {
466
466
  corporate: {
467
467
  label: "企业官网",
468
468
  description: "标准蓝 · 均衡节奏,稳重可信的第一印象",
@@ -541,45 +541,45 @@ var SEMANTIC_SLOTS = [
541
541
  "danger",
542
542
  "info"
543
543
  ];
544
- /** 由配置计算需要写入的 CSS 自定义属性(--ew-*) */
544
+ /** 由配置计算需要写入的 CSS 自定义属性(--ev-*) */
545
545
  function resolveThemeVars(config = {}) {
546
546
  const vars = {};
547
547
  const { primary, semantic, radius, space, container } = config;
548
548
  if (primary) {
549
549
  const ramp = generatePrimaryRamp(primary);
550
550
  if (ramp) {
551
- vars["--ew-color-primary"] = ramp.base;
552
- vars["--ew-color-primary-light-3"] = ramp.light3;
553
- vars["--ew-color-primary-light-5"] = ramp.light5;
554
- vars["--ew-color-primary-light-7"] = ramp.light7;
555
- vars["--ew-color-primary-light-8"] = ramp.light8;
556
- vars["--ew-color-primary-light-9"] = ramp.light9;
557
- vars["--ew-color-primary-dark-2"] = ramp.dark2;
558
- vars["--ew-color-primary-rgb"] = ramp.rgb;
551
+ vars["--ev-color-primary"] = ramp.base;
552
+ vars["--ev-color-primary-light-3"] = ramp.light3;
553
+ vars["--ev-color-primary-light-5"] = ramp.light5;
554
+ vars["--ev-color-primary-light-7"] = ramp.light7;
555
+ vars["--ev-color-primary-light-8"] = ramp.light8;
556
+ vars["--ev-color-primary-light-9"] = ramp.light9;
557
+ vars["--ev-color-primary-dark-2"] = ramp.dark2;
558
+ vars["--ev-color-primary-rgb"] = ramp.rgb;
559
559
  }
560
560
  }
561
561
  if (semantic) for (const name of SEMANTIC_SLOTS) {
562
562
  const ramp = generatePrimaryRamp(semantic[name] || "");
563
563
  if (!ramp) continue;
564
- vars[`--ew-color-${name}`] = ramp.base;
565
- vars[`--ew-color-${name}-light-3`] = ramp.light3;
566
- vars[`--ew-color-${name}-light-5`] = ramp.light5;
567
- vars[`--ew-color-${name}-light-7`] = ramp.light7;
568
- vars[`--ew-color-${name}-light-8`] = ramp.light8;
569
- vars[`--ew-color-${name}-light-9`] = ramp.light9;
570
- vars[`--ew-color-${name}-dark-2`] = ramp.dark2;
571
- vars[`--ew-color-${name}-rgb`] = ramp.rgb;
564
+ vars[`--ev-color-${name}`] = ramp.base;
565
+ vars[`--ev-color-${name}-light-3`] = ramp.light3;
566
+ vars[`--ev-color-${name}-light-5`] = ramp.light5;
567
+ vars[`--ev-color-${name}-light-7`] = ramp.light7;
568
+ vars[`--ev-color-${name}-light-8`] = ramp.light8;
569
+ vars[`--ev-color-${name}-light-9`] = ramp.light9;
570
+ vars[`--ev-color-${name}-dark-2`] = ramp.dark2;
571
+ vars[`--ev-color-${name}-rgb`] = ramp.rgb;
572
572
  }
573
- const radiusPreset = EW_RADIUS_PRESETS[radius];
573
+ const radiusPreset = EV_RADIUS_PRESETS[radius];
574
574
  if (radiusPreset) {
575
575
  const s = radiusPreset.scale;
576
- vars["--ew-radius-sm"] = `${Math.round(BASE_RADIUS.sm * s)}px`;
577
- vars["--ew-radius-md"] = `${Math.round(BASE_RADIUS.md * s)}px`;
578
- vars["--ew-radius-lg"] = `${Math.round(BASE_RADIUS.lg * s)}px`;
579
- vars["--ew-radius-xl"] = `${Math.round(BASE_RADIUS.xl * s)}px`;
580
- vars["--ew-radius-2xl"] = `${Math.round(BASE_RADIUS.xxl * s)}px`;
576
+ vars["--ev-radius-sm"] = `${Math.round(BASE_RADIUS.sm * s)}px`;
577
+ vars["--ev-radius-md"] = `${Math.round(BASE_RADIUS.md * s)}px`;
578
+ vars["--ev-radius-lg"] = `${Math.round(BASE_RADIUS.lg * s)}px`;
579
+ vars["--ev-radius-xl"] = `${Math.round(BASE_RADIUS.xl * s)}px`;
580
+ vars["--ev-radius-2xl"] = `${Math.round(BASE_RADIUS.xxl * s)}px`;
581
581
  }
582
- const spacePreset = EW_SPACE_PRESETS[space];
582
+ const spacePreset = EV_SPACE_PRESETS[space];
583
583
  if (spacePreset) {
584
584
  const s = spacePreset.scale;
585
585
  const names = [
@@ -596,11 +596,11 @@ function resolveThemeVars(config = {}) {
596
596
  "space-20"
597
597
  ];
598
598
  BASE_SPACES.forEach((px, i) => {
599
- vars[`--ew-${names[i]}`] = `${Math.round(px * s)}px`;
599
+ vars[`--ev-${names[i]}`] = `${Math.round(px * s)}px`;
600
600
  });
601
601
  }
602
- const containerPreset = EW_CONTAINER_PRESETS[container];
603
- if (containerPreset) vars["--ew-container-width"] = containerPreset.width ? `${containerPreset.width}px` : "100%";
602
+ const containerPreset = EV_CONTAINER_PRESETS[container];
603
+ if (containerPreset) vars["--ev-container-width"] = containerPreset.width ? `${containerPreset.width}px` : "100%";
604
604
  return vars;
605
605
  }
606
606
  //#endregion
@@ -608,7 +608,7 @@ function resolveThemeVars(config = {}) {
608
608
  /**
609
609
  * useThemeConfig — 全站主题配置(响应式)
610
610
  *
611
- * 管理 主色/圆角/间距/容器宽 四类可调风格,写入 documentElement 的 --ew-* 令牌,
611
+ * 管理 主色/圆角/间距/容器宽 四类可调风格,写入 documentElement 的 --ev-* 令牌,
612
612
  * 全库组件全部经令牌取值,因此即时生效、明暗两套自动兼容。
613
613
  *
614
614
  * Usage:
@@ -663,14 +663,14 @@ function useThemeConfig() {
663
663
  if (typeof document === "undefined") return;
664
664
  const style = document.documentElement.style;
665
665
  for (const name of [
666
- "--ew-color-primary",
667
- "--ew-color-primary-light-3",
668
- "--ew-color-primary-light-5",
669
- "--ew-color-primary-light-7",
670
- "--ew-color-primary-light-8",
671
- "--ew-color-primary-light-9",
672
- "--ew-color-primary-dark-2",
673
- "--ew-color-primary-rgb"
666
+ "--ev-color-primary",
667
+ "--ev-color-primary-light-3",
668
+ "--ev-color-primary-light-5",
669
+ "--ev-color-primary-light-7",
670
+ "--ev-color-primary-light-8",
671
+ "--ev-color-primary-light-9",
672
+ "--ev-color-primary-dark-2",
673
+ "--ev-color-primary-rgb"
674
674
  ]) style.removeProperty(name);
675
675
  }
676
676
  /**
@@ -695,7 +695,7 @@ function useThemeConfig() {
695
695
  "-light-9",
696
696
  "-dark-2",
697
697
  "-rgb"
698
- ]) style.removeProperty(`--ew-color-${name}${suffix}`);
698
+ ]) style.removeProperty(`--ev-color-${name}${suffix}`);
699
699
  return;
700
700
  }
701
701
  apply();
@@ -704,11 +704,11 @@ function useThemeConfig() {
704
704
  config.radius = preset;
705
705
  if (preset === "default") {
706
706
  for (const name of [
707
- "--ew-radius-sm",
708
- "--ew-radius-md",
709
- "--ew-radius-lg",
710
- "--ew-radius-xl",
711
- "--ew-radius-2xl"
707
+ "--ev-radius-sm",
708
+ "--ev-radius-md",
709
+ "--ev-radius-lg",
710
+ "--ev-radius-xl",
711
+ "--ev-radius-2xl"
712
712
  ]) document.documentElement.style.removeProperty(name);
713
713
  return;
714
714
  }
@@ -717,7 +717,7 @@ function useThemeConfig() {
717
717
  function setSpace(preset) {
718
718
  config.space = preset;
719
719
  if (preset === "default") {
720
- for (let i = 1; i <= 20; i++) document.documentElement.style.removeProperty(`--ew-space-${i}`);
720
+ for (let i = 1; i <= 20; i++) document.documentElement.style.removeProperty(`--ev-space-${i}`);
721
721
  return;
722
722
  }
723
723
  apply();
@@ -725,7 +725,7 @@ function useThemeConfig() {
725
725
  function setContainer(preset) {
726
726
  config.container = preset;
727
727
  if (preset === "default") {
728
- document.documentElement.style.removeProperty("--ew-container-width");
728
+ document.documentElement.style.removeProperty("--ev-container-width");
729
729
  return;
730
730
  }
731
731
  apply();
@@ -733,8 +733,8 @@ function useThemeConfig() {
733
733
  function setGlass(on) {
734
734
  config.glass = !!on;
735
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");
736
+ if (config.glass) document.documentElement.setAttribute("data-ev-glass", "on");
737
+ else document.documentElement.removeAttribute("data-ev-glass");
738
738
  }
739
739
  function reset() {
740
740
  Object.assign(config, DEFAULT_CONFIG);
@@ -742,11 +742,11 @@ function useThemeConfig() {
742
742
  setGlass(false);
743
743
  }
744
744
  /**
745
- * 应用一个风格方案(EW_STYLE_PRESETS 的 key)
745
+ * 应用一个风格方案(EV_STYLE_PRESETS 的 key)
746
746
  * 一整套 主色/圆角/间距/容器宽 即时生效
747
747
  */
748
748
  function applyPreset(key) {
749
- const preset = EW_STYLE_PRESETS[key];
749
+ const preset = EV_STYLE_PRESETS[key];
750
750
  if (!preset) return;
751
751
  Object.assign(config, DEFAULT_CONFIG, preset.config);
752
752
  clearApplied();
@@ -762,7 +762,7 @@ function useThemeConfig() {
762
762
  setContainer,
763
763
  applyPreset,
764
764
  reset,
765
- /** 一次性应用整份配置(EwConfigProvider 消费) */
765
+ /** 一次性应用整份配置(EvConfigProvider 消费) */
766
766
  applyConfig(next) {
767
767
  Object.assign(config, DEFAULT_CONFIG, next || {});
768
768
  clearApplied();
@@ -852,7 +852,7 @@ function useSafeArea() {
852
852
  //#region src/directives/reveal.js
853
853
  /**
854
854
  * v-reveal — 滚动入场指令(轻盈浮现语言)v2
855
- * 元素进入视口时添加 .is-revealed(配合 utilities.css 的 .ew-reveal 过渡)
855
+ * 元素进入视口时添加 .is-revealed(配合 utilities.css 的 .ev-reveal 过渡)
856
856
  *
857
857
  * Usage:
858
858
  * <div v-reveal>…</div>
@@ -885,7 +885,7 @@ function getObserver() {
885
885
  */
886
886
  function revealElement(el, options = {}) {
887
887
  const { type = "up", delay = 0, once = true } = options;
888
- el.classList.add("ew-reveal");
888
+ el.classList.add("ev-reveal");
889
889
  el.dataset.ewReveal = REVEAL_TYPES.includes(type) ? type : "up";
890
890
  el.dataset.ewRevealOnce = String(once);
891
891
  if (delay) el.style.transitionDelay = `${delay}ms`;
@@ -908,7 +908,7 @@ var revealDirective = {
908
908
  //#endregion
909
909
  //#region src/components/icon/svg-paths.js
910
910
  /**
911
- * EwIcon 核心图标集(64 个,静态快照数据)
911
+ * EvIcon 核心图标集(72 个,静态快照数据)
912
912
  * 图标形状源自 Remix Icon v4.9.1(https://remixicon.com/,Remix Icon License v1.0,免费商用)
913
913
  * 由 scripts/generate-remix-icons.mjs 生成,键名为 kebab-case 语义命名,请勿手动修改;
914
914
  * 需增删图标时在脚本 MAPPING 中登记后重新执行生成
@@ -1046,6 +1046,38 @@ var ewSvgPaths = {
1046
1046
  "viewBox": "0 0 24 24",
1047
1047
  "paths": [{ "d": "M18.3638 15.5355L16.9496 14.1213L18.3638 12.7071C20.3164 10.7545 20.3164 7.58866 18.3638 5.63604C16.4112 3.68341 13.2453 3.68341 11.2927 5.63604L9.87849 7.05025L8.46428 5.63604L9.87849 4.22182C12.6122 1.48815 17.0443 1.48815 19.778 4.22182C22.5117 6.95549 22.5117 11.3876 19.778 14.1213L18.3638 15.5355ZM15.5353 18.364L14.1211 19.7782C11.3875 22.5118 6.95531 22.5118 4.22164 19.7782C1.48797 17.0445 1.48797 12.6123 4.22164 9.87868L5.63585 8.46446L7.05007 9.87868L5.63585 11.2929C3.68323 13.2455 3.68323 16.4113 5.63585 18.364C7.58847 20.3166 10.7543 20.3166 12.7069 18.364L14.1211 16.9497L15.5353 18.364ZM14.8282 7.75736L16.2425 9.17157L9.17139 16.2426L7.75717 14.8284L14.8282 7.75736Z" }]
1048
1048
  },
1049
+ "bold": {
1050
+ "viewBox": "0 0 24 24",
1051
+ "paths": [{ "d": "M8 11H12.5C13.8807 11 15 9.88071 15 8.5C15 7.11929 13.8807 6 12.5 6H8V11ZM18 15.5C18 17.9853 15.9853 20 13.5 20H6V4H12.5C14.9853 4 17 6.01472 17 8.5C17 9.70431 16.5269 10.7981 15.7564 11.6058C17.0979 12.3847 18 13.837 18 15.5ZM8 13V18H13.5C14.8807 18 16 16.8807 16 15.5C16 14.1193 14.8807 13 13.5 13H8Z" }]
1052
+ },
1053
+ "italic": {
1054
+ "viewBox": "0 0 24 24",
1055
+ "paths": [{ "d": "M15 20H7V18H9.92661L12.0425 6H9V4H17V6H14.0734L11.9575 18H15V20Z" }]
1056
+ },
1057
+ "strikethrough": {
1058
+ "viewBox": "0 0 24 24",
1059
+ "paths": [{ "d": "M17.1538 14C17.3846 14.5161 17.5 15.0893 17.5 15.7196C17.5 17.0625 16.9762 18.1116 15.9286 18.867C14.8809 19.6223 13.4335 20 11.5862 20C9.94674 20 8.32335 19.6185 6.71592 18.8555V16.6009C8.23538 17.4783 9.7908 17.917 11.3822 17.917C13.9333 17.917 15.2128 17.1846 15.2208 15.7196C15.2208 15.0939 15.0049 14.5598 14.5731 14.1173C14.5339 14.0772 14.4939 14.0381 14.4531 14H3V12H21V14H17.1538ZM13.076 11H7.62908C7.4566 10.8433 7.29616 10.6692 7.14776 10.4778C6.71592 9.92084 6.5 9.24559 6.5 8.45207C6.5 7.21602 6.96583 6.165 7.89749 5.299C8.82916 4.43299 10.2706 4 12.2219 4C13.6934 4 15.1009 4.32808 16.4444 4.98426V7.13591C15.2448 6.44921 13.9293 6.10587 12.4978 6.10587C10.0187 6.10587 8.77917 6.88793 8.77917 8.45207C8.77917 8.87172 8.99709 9.23796 9.43293 9.55079C9.86878 9.86362 10.4066 10.1135 11.0463 10.3004C11.6665 10.4816 12.3431 10.7148 13.076 11H13.076Z" }]
1060
+ },
1061
+ "heading": {
1062
+ "viewBox": "0 0 24 24",
1063
+ "paths": [{ "d": "M17 11V4H19V21H17V13H7V21H5V4H7V11H17Z" }]
1064
+ },
1065
+ "list-unordered": {
1066
+ "viewBox": "0 0 24 24",
1067
+ "paths": [{ "d": "M8 4H21V6H8V4ZM4.5 6.5C3.67157 6.5 3 5.82843 3 5C3 4.17157 3.67157 3.5 4.5 3.5C5.32843 3.5 6 4.17157 6 5C6 5.82843 5.32843 6.5 4.5 6.5ZM4.5 13.5C3.67157 13.5 3 12.8284 3 12C3 11.1716 3.67157 10.5 4.5 10.5C5.32843 10.5 6 11.1716 6 12C6 12.8284 5.32843 13.5 4.5 13.5ZM4.5 20.4C3.67157 20.4 3 19.7284 3 18.9C3 18.0716 3.67157 17.4 4.5 17.4C5.32843 17.4 6 18.0716 6 18.9C6 19.7284 5.32843 20.4 4.5 20.4ZM8 11H21V13H8V11ZM8 18H21V20H8V18Z" }]
1068
+ },
1069
+ "list-ordered": {
1070
+ "viewBox": "0 0 24 24",
1071
+ "paths": [{ "d": "M8 4H21V6H8V4ZM5 3V6H6V7H3V6H4V4H3V3H5ZM3 14V11.5H5V11H3V10H6V12.5H4V13H6V14H3ZM5 19.5H3V18.5H5V18H3V17H6V21H3V20H5V19.5ZM8 11H21V13H8V11ZM8 18H21V20H8V18Z" }]
1072
+ },
1073
+ "code": {
1074
+ "viewBox": "0 0 24 24",
1075
+ "paths": [{ "d": "M23 12L15.9289 19.0711L14.5147 17.6569L20.1716 12L14.5147 6.34317L15.9289 4.92896L23 12ZM3.82843 12L9.48528 17.6569L8.07107 19.0711L1 12L8.07107 4.92896L9.48528 6.34317L3.82843 12Z" }]
1076
+ },
1077
+ "markdown": {
1078
+ "viewBox": "0 0 24 24",
1079
+ "paths": [{ "d": "M3 3H21C21.5523 3 22 3.44772 22 4V20C22 20.5523 21.5523 21 21 21H3C2.44772 21 2 20.5523 2 20V4C2 3.44772 2.44772 3 3 3ZM7 15.5V11.5L9 13.5L11 11.5V15.5H13V8.5H11L9 10.5L7 8.5H5V15.5H7ZM18 12.5V8.5H16V12.5H14L17 15.5L20 12.5H18Z" }]
1080
+ },
1049
1081
  "sun": {
1050
1082
  "viewBox": "0 0 24 24",
1051
1083
  "paths": [{ "d": "M12 18C8.68629 18 6 15.3137 6 12C6 8.68629 8.68629 6 12 6C15.3137 6 18 8.68629 18 12C18 15.3137 15.3137 18 12 18ZM12 16C14.2091 16 16 14.2091 16 12C16 9.79086 14.2091 8 12 8C9.79086 8 8 9.79086 8 12C8 14.2091 9.79086 16 12 16ZM11 1H13V4H11V1ZM11 20H13V23H11V20ZM3.51472 4.92893L4.92893 3.51472L7.05025 5.63604L5.63604 7.05025L3.51472 4.92893ZM16.9497 18.364L18.364 16.9497L20.4853 19.0711L19.0711 20.4853L16.9497 18.364ZM19.0711 3.51472L20.4853 4.92893L18.364 7.05025L16.9497 5.63604L19.0711 3.51472ZM5.63604 16.9497L7.05025 18.364L4.92893 20.4853L3.51472 19.0711L5.63604 16.9497ZM23 11V13H20V11H23ZM4 11V13H1V11H4Z" }]
@@ -1174,18 +1206,18 @@ var ewSvgPaths = {
1174
1206
  //#endregion
1175
1207
  //#region src/components/icon/iconRegistry.js
1176
1208
  /**
1177
- * EwIcon 图标注册表(扁平命名空间)
1209
+ * EvIcon 图标注册表(扁平命名空间)
1178
1210
  *
1179
1211
  * 解析优先级:custom(运行时注册)→ 核心 SVG 集(Remix 静态快照,运行时零依赖)→ 展示集(已加载时)
1180
1212
  *
1181
1213
  * Usage:
1182
- * <ew-icon name="search" :size="16" />
1214
+ * <ev-icon name="search" :size="16" />
1183
1215
  * registerIcons({ 'my-logo': MyLogoComponent })
1184
1216
  * loadShowcaseIcons() // 按需加载 900+ 展示图标(不阻塞首屏)
1185
1217
  */
1186
1218
  /**
1187
1219
  * 注册表版本号:晚注册的图标(展示集异步加载 / registerIcons)会自增版本,
1188
- * EwIcon 的解析计算属性依赖它——晚注册的图标出现时,已挂载的图标自动补渲染
1220
+ * EvIcon 的解析计算属性依赖它——晚注册的图标出现时,已挂载的图标自动补渲染
1189
1221
  */
1190
1222
  var iconRegistryVersion = ref(0);
1191
1223
  var componentCache = /* @__PURE__ */ new Map();
@@ -1261,8 +1293,8 @@ var _sfc_main$24 = {
1261
1293
  },
1262
1294
  setup(__props) {
1263
1295
  /**
1264
- * EwIcon — 图标组件
1265
- * 根节点挂 ew-icon class;name 支持 kebab-case 语义名(核心集)
1296
+ * EvIcon — 图标组件
1297
+ * 根节点挂 ev-icon class;name 支持 kebab-case 语义名(核心集)
1266
1298
  * 与 Remix 原生命名(加载展示集后,如 'brush-line')
1267
1299
  */
1268
1300
  const props = __props;
@@ -1280,7 +1312,7 @@ var _sfc_main$24 = {
1280
1312
  });
1281
1313
  return (_ctx, _cache) => {
1282
1314
  return openBlock(), createElementBlock("i", mergeProps({
1283
- class: "ew-icon",
1315
+ class: "ev-icon",
1284
1316
  style: iconStyle.value,
1285
1317
  "aria-hidden": "true"
1286
1318
  }, _ctx.$attrs), [resolvedIcon.value ? (openBlock(), createBlock(resolveDynamicComponent(resolvedIcon.value), { key: 0 })) : renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 1)], 16);
@@ -1289,13 +1321,13 @@ var _sfc_main$24 = {
1289
1321
  };
1290
1322
  //#endregion
1291
1323
  //#region src/components/button/index.vue
1292
- var _hoisted_1$45 = {
1324
+ var _hoisted_1$48 = {
1293
1325
  key: 0,
1294
- class: "ew-button__loading"
1326
+ class: "ev-button__loading"
1295
1327
  };
1296
- var _hoisted_2$40 = {
1328
+ var _hoisted_2$42 = {
1297
1329
  key: 2,
1298
- class: "ew-button__content"
1330
+ class: "ev-button__content"
1299
1331
  };
1300
1332
  var _sfc_main$9 = {
1301
1333
  __name: "index",
@@ -1377,7 +1409,7 @@ var _sfc_main$9 = {
1377
1409
  emits: ["click"],
1378
1410
  setup(__props, { expose: __expose, emit: __emit }) {
1379
1411
  /**
1380
- * EwButton — 按钮(官网 CTA 语言)
1412
+ * EvButton — 按钮(官网 CTA 语言)
1381
1413
  * variant:primary 蓝色实心 / dark 墨色实心(launchos 黑胶囊 CTA)/
1382
1414
  * soft 柔和底(remixicon 头部下载钮)/ outline / ghost
1383
1415
  * 默认 radius-lg 圆润矩形,pill 转全圆胶囊
@@ -1407,8 +1439,8 @@ var _sfc_main$9 = {
1407
1439
  ref_key: "btnRef",
1408
1440
  ref: btnRef,
1409
1441
  class: normalizeClass([
1410
- "ew-button",
1411
- `ew-button--${sizeClass.value}`,
1442
+ "ev-button",
1443
+ `ev-button--${sizeClass.value}`,
1412
1444
  `is-${__props.variant}`,
1413
1445
  {
1414
1446
  "is-pill": __props.pill,
@@ -1427,7 +1459,7 @@ var _sfc_main$9 = {
1427
1459
  onClick: handleClick
1428
1460
  }, {
1429
1461
  default: withCtx(() => [
1430
- __props.loading ? (openBlock(), createElementBlock("span", _hoisted_1$45, [createVNode(_sfc_main$24, {
1462
+ __props.loading ? (openBlock(), createElementBlock("span", _hoisted_1$48, [createVNode(_sfc_main$24, {
1431
1463
  name: "loading",
1432
1464
  size: iconSize.value,
1433
1465
  class: "is-rotating"
@@ -1435,14 +1467,14 @@ var _sfc_main$9 = {
1435
1467
  key: 1,
1436
1468
  name: __props.icon,
1437
1469
  size: iconSize.value,
1438
- class: "ew-button__icon"
1470
+ class: "ev-button__icon"
1439
1471
  }, null, 8, ["name", "size"])) : createCommentVNode("", true),
1440
- _ctx.$slots.default ? (openBlock(), createElementBlock("span", _hoisted_2$40, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true),
1472
+ _ctx.$slots.default ? (openBlock(), createElementBlock("span", _hoisted_2$42, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true),
1441
1473
  __props.iconRight && !__props.loading ? (openBlock(), createBlock(_sfc_main$24, {
1442
1474
  key: 3,
1443
1475
  name: __props.iconRight,
1444
1476
  size: iconSize.value,
1445
- class: "ew-button__icon ew-button__icon--right"
1477
+ class: "ev-button__icon ev-button__icon--right"
1446
1478
  }, null, 8, ["name", "size"])) : createCommentVNode("", true)
1447
1479
  ]),
1448
1480
  _: 3
@@ -1460,7 +1492,7 @@ var _sfc_main$9 = {
1460
1492
  };
1461
1493
  //#endregion
1462
1494
  //#region src/components/icon-button/index.vue
1463
- var _hoisted_1$44 = [
1495
+ var _hoisted_1$47 = [
1464
1496
  "type",
1465
1497
  "disabled",
1466
1498
  "aria-label"
@@ -1515,7 +1547,7 @@ var _sfc_main$25 = {
1515
1547
  emits: ["click"],
1516
1548
  setup(__props, { expose: __expose, emit: __emit }) {
1517
1549
  /**
1518
- * EwIconButton — 图标按钮(官网头部动作:主题切换 / GitHub / 下载等)
1550
+ * EvIconButton — 图标按钮(官网头部动作:主题切换 / GitHub / 下载等)
1519
1551
  * remixicon 头部语言:方圆角小按钮,round 转正圆
1520
1552
  */
1521
1553
  const props = __props;
@@ -1539,8 +1571,8 @@ var _sfc_main$25 = {
1539
1571
  ref_key: "btnRef",
1540
1572
  ref: btnRef,
1541
1573
  class: normalizeClass([
1542
- "ew-icon-button",
1543
- `ew-icon-button--${__props.size}`,
1574
+ "ev-icon-button",
1575
+ `ev-icon-button--${__props.size}`,
1544
1576
  `is-${__props.variant}`,
1545
1577
  {
1546
1578
  "is-round": __props.round,
@@ -1554,13 +1586,13 @@ var _sfc_main$25 = {
1554
1586
  }, [createVNode(_sfc_main$24, {
1555
1587
  name: __props.icon,
1556
1588
  size: iconSize.value
1557
- }, null, 8, ["name", "size"]), renderSlot(_ctx.$slots, "default")], 10, _hoisted_1$44);
1589
+ }, null, 8, ["name", "size"]), renderSlot(_ctx.$slots, "default")], 10, _hoisted_1$47);
1558
1590
  };
1559
1591
  }
1560
1592
  };
1561
1593
  //#endregion
1562
1594
  //#region src/components/tag/index.vue
1563
- var _sfc_main$50 = {
1595
+ var _sfc_main$52 = {
1564
1596
  __name: "index",
1565
1597
  props: {
1566
1598
  tone: {
@@ -1607,7 +1639,7 @@ var _sfc_main$50 = {
1607
1639
  emits: ["close"],
1608
1640
  setup(__props, { emit: __emit }) {
1609
1641
  /**
1610
- * EwTag — 胶囊标签(remixdesign「Open Source」/ remixicon「v4.9.1」/ launchos「SAVE 50%」语言)
1642
+ * EvTag — 胶囊标签(remixdesign「Open Source」/ remixicon「v4.9.1」/ launchos「SAVE 50%」语言)
1611
1643
  * tone:neutral/primary/success/warning/danger/lime(限量促销黄绿)/orange
1612
1644
  * variant:soft 淡底 / solid 实底 / outline 描边
1613
1645
  */
@@ -1616,8 +1648,8 @@ var _sfc_main$50 = {
1616
1648
  const iconSize = computed(() => props.size === "small" ? 12 : 14);
1617
1649
  return (_ctx, _cache) => {
1618
1650
  return openBlock(), createElementBlock("span", { class: normalizeClass([
1619
- "ew-tag",
1620
- `ew-tag--${__props.size}`,
1651
+ "ev-tag",
1652
+ `ev-tag--${__props.size}`,
1621
1653
  `is-${__props.tone}`,
1622
1654
  `is-${__props.variant}`
1623
1655
  ]) }, [
@@ -1625,13 +1657,13 @@ var _sfc_main$50 = {
1625
1657
  key: 0,
1626
1658
  name: __props.icon,
1627
1659
  size: iconSize.value,
1628
- class: "ew-tag__icon"
1660
+ class: "ev-tag__icon"
1629
1661
  }, null, 8, ["name", "size"])) : createCommentVNode("", true),
1630
1662
  renderSlot(_ctx.$slots, "default"),
1631
1663
  __props.closable ? (openBlock(), createElementBlock("button", {
1632
1664
  key: 1,
1633
1665
  type: "button",
1634
- class: "ew-tag__close",
1666
+ class: "ev-tag__close",
1635
1667
  "aria-label": "close",
1636
1668
  onClick: _cache[0] || (_cache[0] = withModifiers(($event) => emit("close"), ["stop"]))
1637
1669
  }, [createVNode(_sfc_main$24, {
@@ -1669,7 +1701,7 @@ var _sfc_main$7 = {
1669
1701
  },
1670
1702
  setup(__props) {
1671
1703
  /**
1672
- * EwBadge — 计数徽标(remixicon 版本红点 / 分类计数语言)
1704
+ * EvBadge — 计数徽标(remixicon 版本红点 / 分类计数语言)
1673
1705
  * 独立使用或配合相对定位父级悬挂;dot 模式仅显示圆点
1674
1706
  */
1675
1707
  const props = __props;
@@ -1682,7 +1714,7 @@ var _sfc_main$7 = {
1682
1714
  const badgeStyle = computed(() => props.color ? { backgroundColor: props.color } : {});
1683
1715
  return (_ctx, _cache) => {
1684
1716
  return openBlock(), createElementBlock("sup", {
1685
- class: normalizeClass(["ew-badge", { "is-dot": __props.dot }]),
1717
+ class: normalizeClass(["ev-badge", { "is-dot": __props.dot }]),
1686
1718
  style: normalizeStyle(badgeStyle.value)
1687
1719
  }, [!__props.dot ? renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(displayValue.value), 1)], void 0, 0) : createCommentVNode("", true)], 6);
1688
1720
  };
@@ -1746,7 +1778,7 @@ var _sfc_main$10 = {
1746
1778
  return (_ctx, _cache) => {
1747
1779
  return openBlock(), createBlock(resolveDynamicComponent(__props.tag), {
1748
1780
  class: normalizeClass([
1749
- "ew-card",
1781
+ "ev-card",
1750
1782
  `is-${__props.tone}`,
1751
1783
  {
1752
1784
  "is-sticker": __props.sticker,
@@ -1767,23 +1799,23 @@ var _sfc_main$10 = {
1767
1799
  };
1768
1800
  //#endregion
1769
1801
  //#region src/components/section/index.vue
1770
- var _hoisted_1$43 = {
1802
+ var _hoisted_1$46 = {
1771
1803
  key: 0,
1772
- class: "ew-section__eyebrow"
1804
+ class: "ev-section__eyebrow"
1773
1805
  };
1774
- var _hoisted_2$39 = {
1806
+ var _hoisted_2$41 = {
1775
1807
  key: 1,
1776
- class: "ew-section__title"
1808
+ class: "ev-section__title"
1777
1809
  };
1778
- var _hoisted_3$32 = {
1810
+ var _hoisted_3$34 = {
1779
1811
  key: 2,
1780
- class: "ew-section__description"
1812
+ class: "ev-section__description"
1781
1813
  };
1782
- var _hoisted_4$31 = {
1814
+ var _hoisted_4$32 = {
1783
1815
  key: 3,
1784
- class: "ew-section__body"
1816
+ class: "ev-section__body"
1785
1817
  };
1786
- var _sfc_main$43 = {
1818
+ var _sfc_main$45 = {
1787
1819
  __name: "index",
1788
1820
  props: {
1789
1821
  /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
@@ -1817,7 +1849,7 @@ var _sfc_main$43 = {
1817
1849
  },
1818
1850
  setup(__props) {
1819
1851
  /**
1820
- * EwSection — 内容区块(眉题 + 大标题 + 描述 + 内容)
1852
+ * EvSection — 内容区块(眉题 + 大标题 + 描述 + 内容)
1821
1853
  * eyebrow 为 remixdesign「WORK」式字距拉开的大写小标
1822
1854
  */
1823
1855
  const props = __props;
@@ -1828,7 +1860,7 @@ var _sfc_main$43 = {
1828
1860
  return (_ctx, _cache) => {
1829
1861
  return openBlock(), createElementBlock("section", {
1830
1862
  class: normalizeClass([
1831
- "ew-section",
1863
+ "ev-section",
1832
1864
  `is-${__props.align}`,
1833
1865
  {
1834
1866
  "is-glass": __props.glass === true,
@@ -1837,40 +1869,40 @@ var _sfc_main$43 = {
1837
1869
  ]),
1838
1870
  style: normalizeStyle(sectionStyle.value)
1839
1871
  }, [
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)
1872
+ __props.eyebrow || _ctx.$slots.eyebrow ? (openBlock(), createElementBlock("div", _hoisted_1$46, [renderSlot(_ctx.$slots, "eyebrow", {}, () => [createTextVNode(toDisplayString(__props.eyebrow), 1)])])) : createCommentVNode("", true),
1873
+ __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("h2", _hoisted_2$41, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true),
1874
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_3$34, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
1875
+ _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_4$32, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
1844
1876
  ], 6);
1845
1877
  };
1846
1878
  }
1847
1879
  };
1848
1880
  //#endregion
1849
1881
  //#region src/components/navbar/index.vue
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 = {
1882
+ var _hoisted_1$45 = { class: "ev-navbar__inner ev-container" };
1883
+ var _hoisted_2$40 = { class: "ev-navbar__left" };
1884
+ var _hoisted_3$33 = {
1853
1885
  key: 0,
1854
1886
  href: "/",
1855
- class: "ew-navbar__logo"
1887
+ class: "ev-navbar__logo"
1856
1888
  };
1857
- var _hoisted_4$30 = ["src"];
1858
- var _hoisted_5$24 = {
1889
+ var _hoisted_4$31 = ["src"];
1890
+ var _hoisted_5$25 = {
1859
1891
  key: 2,
1860
- class: "ew-navbar__logo-text"
1892
+ class: "ev-navbar__logo-text"
1861
1893
  };
1862
1894
  var _hoisted_6$15 = {
1863
1895
  key: 0,
1864
- class: "ew-navbar__nav",
1896
+ class: "ev-navbar__nav",
1865
1897
  "aria-label": "主导航"
1866
1898
  };
1867
- var _hoisted_7$12 = { class: "ew-navbar__actions" };
1899
+ var _hoisted_7$12 = { class: "ev-navbar__actions" };
1868
1900
  var _hoisted_8$11 = {
1869
1901
  key: 0,
1870
- class: "ew-navbar__mobile",
1902
+ class: "ev-navbar__mobile",
1871
1903
  "aria-label": "移动端导航"
1872
1904
  };
1873
- var _sfc_main$36 = {
1905
+ var _sfc_main$38 = {
1874
1906
  __name: "index",
1875
1907
  props: {
1876
1908
  /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
@@ -1922,7 +1954,7 @@ var _sfc_main$36 = {
1922
1954
  },
1923
1955
  setup(__props, { expose: __expose }) {
1924
1956
  /**
1925
- * EwNavbar — 站点导航
1957
+ * EvNavbar — 站点导航
1926
1958
  * sticky 吸顶 + 滚动后加边框投影;blur 追加背景磨砂
1927
1959
  * hideOnScroll 开启后:下滑隐藏、上滑浮现(长页面的沉浸式阅读)
1928
1960
  * items [{ label, href, target }];插槽 logo / start / center / actions / default(移动端)
@@ -1960,7 +1992,7 @@ var _sfc_main$36 = {
1960
1992
  return openBlock(), createElementBlock("header", {
1961
1993
  ref_key: "navRef",
1962
1994
  ref: navRef,
1963
- class: normalizeClass(["ew-navbar", {
1995
+ class: normalizeClass(["ev-navbar", {
1964
1996
  "is-sticky": __props.sticky,
1965
1997
  "is-scrolled": isScrolled.value && __props.sticky,
1966
1998
  "is-blur": __props.blur && __props.sticky,
@@ -1968,8 +2000,8 @@ var _sfc_main$36 = {
1968
2000
  "is-glass": __props.glass === true,
1969
2001
  "no-glass": __props.glass === false
1970
2002
  }])
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, {
2003
+ }, [createElementVNode("div", _hoisted_1$45, [
2004
+ createElementVNode("div", _hoisted_2$40, [renderSlot(_ctx.$slots, "logo", {}, () => [__props.logo ? (openBlock(), createElementBlock("a", _hoisted_3$33, [__props.logoIcon ? (openBlock(), createBlock(_sfc_main$24, {
1973
2005
  key: 0,
1974
2006
  name: __props.logoIcon,
1975
2007
  size: 22
@@ -1977,15 +2009,15 @@ var _sfc_main$36 = {
1977
2009
  key: 1,
1978
2010
  src: __props.logoImage,
1979
2011
  alt: "logo",
1980
- class: "ew-navbar__logo-img"
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")]),
2012
+ class: "ev-navbar__logo-img"
2013
+ }, null, 8, _hoisted_4$31)) : createCommentVNode("", true), __props.logoText ? (openBlock(), createElementBlock("span", _hoisted_5$25, toDisplayString(__props.logoText), 1)) : createCommentVNode("", true)])) : createCommentVNode("", true)]), renderSlot(_ctx.$slots, "start")]),
1982
2014
  __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) => {
1983
2015
  return openBlock(), createBlock(resolveDynamicComponent(item.href ? "a" : "span"), {
1984
2016
  key: item.label,
1985
2017
  href: item.href,
1986
2018
  target: item.target,
1987
2019
  rel: item.rel,
1988
- class: normalizeClass(["ew-navbar__link", { "is-active": isActive(item) }])
2020
+ class: normalizeClass(["ev-navbar__link", { "is-active": isActive(item) }])
1989
2021
  }, {
1990
2022
  default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
1991
2023
  _: 2
@@ -1998,19 +2030,19 @@ var _sfc_main$36 = {
1998
2030
  }), 128))])])) : createCommentVNode("", true),
1999
2031
  createElementVNode("div", _hoisted_7$12, [renderSlot(_ctx.$slots, "actions"), __props.items.length || _ctx.$slots.default ? (openBlock(), createBlock(_sfc_main$25, {
2000
2032
  key: 0,
2001
- class: "ew-navbar__burger",
2033
+ class: "ev-navbar__burger",
2002
2034
  icon: "menu",
2003
2035
  "aria-label": "打开菜单",
2004
2036
  onClick: _cache[0] || (_cache[0] = ($event) => menuOpen.value = !menuOpen.value)
2005
2037
  })) : createCommentVNode("", true)])
2006
- ]), createVNode(Transition, { name: "ew-navbar-collapse" }, {
2038
+ ]), createVNode(Transition, { name: "ev-navbar-collapse" }, {
2007
2039
  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) => {
2008
2040
  return openBlock(), createBlock(resolveDynamicComponent(item.href ? "a" : "span"), {
2009
2041
  key: item.label,
2010
2042
  href: item.href,
2011
2043
  target: item.target,
2012
2044
  rel: item.rel,
2013
- class: "ew-navbar__mobile-link",
2045
+ class: "ev-navbar__mobile-link",
2014
2046
  onClick: _cache[1] || (_cache[1] = ($event) => menuOpen.value = false)
2015
2047
  }, {
2016
2048
  default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
@@ -2028,31 +2060,31 @@ var _sfc_main$36 = {
2028
2060
  };
2029
2061
  //#endregion
2030
2062
  //#region src/components/footer/index.vue
2031
- var _hoisted_1$41 = { class: "ew-container" };
2032
- var _hoisted_2$37 = {
2063
+ var _hoisted_1$44 = { class: "ev-container" };
2064
+ var _hoisted_2$39 = {
2033
2065
  key: 0,
2034
- class: "ew-footer__main"
2066
+ class: "ev-footer__main"
2035
2067
  };
2036
- var _hoisted_3$30 = { class: "ew-footer__brand" };
2037
- var _hoisted_4$29 = {
2068
+ var _hoisted_3$32 = { class: "ev-footer__brand" };
2069
+ var _hoisted_4$30 = {
2038
2070
  key: 0,
2039
- class: "ew-footer__logo"
2071
+ class: "ev-footer__logo"
2040
2072
  };
2041
- var _hoisted_5$23 = {
2073
+ var _hoisted_5$24 = {
2042
2074
  key: 1,
2043
- class: "ew-footer__slogan"
2075
+ class: "ev-footer__slogan"
2044
2076
  };
2045
2077
  var _hoisted_6$14 = {
2046
2078
  key: 2,
2047
- class: "ew-footer__social"
2079
+ class: "ev-footer__social"
2048
2080
  };
2049
2081
  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" };
2082
+ var _hoisted_8$10 = { class: "ev-footer__col-title" };
2083
+ var _hoisted_9$7 = { class: "ev-footer__bottom" };
2084
+ var _hoisted_10$4 = { class: "ev-footer__copyright" };
2053
2085
  var _hoisted_11$3 = {
2054
2086
  key: 0,
2055
- class: "ew-footer__legal"
2087
+ class: "ev-footer__legal"
2056
2088
  };
2057
2089
  var _sfc_main$22 = {
2058
2090
  __name: "index",
@@ -2090,70 +2122,70 @@ var _sfc_main$22 = {
2090
2122
  },
2091
2123
  setup(__props) {
2092
2124
  /**
2093
- * EwFooter — 站点页脚
2125
+ * EvFooter — 站点页脚
2094
2126
  * columns [{ title, links: [{ label, href, target }] }] 多栏链接 + 品牌区 + 底部版权条
2095
2127
  */
2096
2128
  return (_ctx, _cache) => {
2097
- return openBlock(), createElementBlock("footer", { class: normalizeClass(["ew-footer", {
2129
+ return openBlock(), createElementBlock("footer", { class: normalizeClass(["ev-footer", {
2098
2130
  "is-soft": __props.soft,
2099
2131
  "is-glass": __props.glass === true,
2100
2132
  "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),
2133
+ }]) }, [createElementVNode("div", _hoisted_1$44, [__props.columns.length || _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_2$39, [createElementVNode("div", _hoisted_3$32, [renderSlot(_ctx.$slots, "brand", {}, () => [
2134
+ __props.logoText ? (openBlock(), createElementBlock("div", _hoisted_4$30, toDisplayString(__props.logoText), 1)) : createCommentVNode("", true),
2135
+ __props.slogan ? (openBlock(), createElementBlock("p", _hoisted_5$24, toDisplayString(__props.slogan), 1)) : createCommentVNode("", true),
2104
2136
  _ctx.$slots.social ? (openBlock(), createElementBlock("div", _hoisted_6$14, [renderSlot(_ctx.$slots, "social")])) : createCommentVNode("", true)
2105
2137
  ])]), renderSlot(_ctx.$slots, "default", {}, () => [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
2106
2138
  return openBlock(), createElementBlock("nav", {
2107
2139
  key: col.title,
2108
- class: "ew-footer__col",
2140
+ class: "ev-footer__col",
2109
2141
  "aria-label": col.title
2110
2142
  }, [createElementVNode("h4", _hoisted_8$10, toDisplayString(col.title), 1), (openBlock(true), createElementBlock(Fragment, null, renderList(col.links, (link) => {
2111
2143
  return openBlock(), createBlock(resolveDynamicComponent(link.href ? "a" : "span"), {
2112
2144
  key: link.label,
2113
2145
  href: link.href,
2114
2146
  target: link.target,
2115
- class: "ew-footer__link"
2147
+ class: "ev-footer__link"
2116
2148
  }, {
2117
2149
  default: withCtx(() => [createTextVNode(toDisplayString(link.label), 1)]),
2118
2150
  _: 2
2119
2151
  }, 1032, ["href", "target"]);
2120
2152
  }), 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);
2153
+ }), 128))])])) : createCommentVNode("", true), createElementVNode("div", _hoisted_9$7, [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);
2122
2154
  };
2123
2155
  }
2124
2156
  };
2125
2157
  //#endregion
2126
2158
  //#region src/components/hero/index.vue
2127
- var _hoisted_1$40 = { class: "ew-container" };
2128
- var _hoisted_2$36 = { class: "ew-hero__content" };
2129
- var _hoisted_3$29 = {
2159
+ var _hoisted_1$43 = { class: "ev-container" };
2160
+ var _hoisted_2$38 = { class: "ev-hero__content" };
2161
+ var _hoisted_3$31 = {
2130
2162
  key: 0,
2131
- class: "ew-hero__badge",
2132
- "data-ew-hero-item": ""
2163
+ class: "ev-hero__badge",
2164
+ "data-ev-hero-item": ""
2133
2165
  };
2134
- var _hoisted_4$28 = {
2135
- class: "ew-hero__title",
2136
- "data-ew-hero-item": ""
2166
+ var _hoisted_4$29 = {
2167
+ class: "ev-hero__title",
2168
+ "data-ev-hero-item": ""
2137
2169
  };
2138
- var _hoisted_5$22 = {
2170
+ var _hoisted_5$23 = {
2139
2171
  key: 1,
2140
- class: "ew-hero__description",
2141
- "data-ew-hero-item": ""
2172
+ class: "ev-hero__description",
2173
+ "data-ev-hero-item": ""
2142
2174
  };
2143
2175
  var _hoisted_6$13 = {
2144
2176
  key: 2,
2145
- class: "ew-hero__actions",
2146
- "data-ew-hero-item": ""
2177
+ class: "ev-hero__actions",
2178
+ "data-ev-hero-item": ""
2147
2179
  };
2148
2180
  var _hoisted_7$10 = {
2149
2181
  key: 3,
2150
- class: "ew-hero__body",
2151
- "data-ew-hero-item": ""
2182
+ class: "ev-hero__body",
2183
+ "data-ev-hero-item": ""
2152
2184
  };
2153
2185
  var _hoisted_8$9 = {
2154
2186
  key: 0,
2155
- class: "ew-hero__aside",
2156
- "data-ew-hero-item": ""
2187
+ class: "ev-hero__aside",
2188
+ "data-ev-hero-item": ""
2157
2189
  };
2158
2190
  var _sfc_main$23 = {
2159
2191
  __name: "index",
@@ -2184,7 +2216,7 @@ var _sfc_main$23 = {
2184
2216
  },
2185
2217
  setup(__props) {
2186
2218
  /**
2187
- * EwHero — 首屏区块
2219
+ * EvHero — 首屏区块
2188
2220
  * 淡蓝灰渐变底 + 细字重展示标题 + 顶部胶囊徽章位 + 动作区
2189
2221
  * 插槽:badge(顶部胶囊)/ title / description / actions / default(如搜索框)/ aside(右侧视觉)
2190
2222
  * reveal 开启后徽章/标题/描述/动作依次错峰入场(60ms 步进,进入视口触发)
@@ -2193,7 +2225,7 @@ var _sfc_main$23 = {
2193
2225
  const rootRef = ref(null);
2194
2226
  onMounted(() => {
2195
2227
  if (!props.reveal || !rootRef.value) return;
2196
- rootRef.value.querySelectorAll("[data-ew-hero-item]").forEach((el, i) => revealElement(el, {
2228
+ rootRef.value.querySelectorAll("[data-ev-hero-item]").forEach((el, i) => revealElement(el, {
2197
2229
  type: "up",
2198
2230
  delay: i * 60
2199
2231
  }));
@@ -2203,14 +2235,14 @@ var _sfc_main$23 = {
2203
2235
  ref_key: "rootRef",
2204
2236
  ref: rootRef,
2205
2237
  class: normalizeClass([
2206
- "ew-hero",
2238
+ "ev-hero",
2207
2239
  `is-${__props.align}`,
2208
2240
  { "is-tinted": __props.tinted }
2209
2241
  ])
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),
2242
+ }, [createElementVNode("div", _hoisted_1$43, [createElementVNode("div", { class: normalizeClass(["ev-hero__inner", { "has-aside": _ctx.$slots.aside }]) }, [createElementVNode("div", _hoisted_2$38, [
2243
+ _ctx.$slots.badge ? (openBlock(), createElementBlock("div", _hoisted_3$31, [renderSlot(_ctx.$slots, "badge")])) : createCommentVNode("", true),
2244
+ createElementVNode("h1", _hoisted_4$29, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
2245
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_5$23, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
2214
2246
  _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_6$13, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
2215
2247
  _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_7$10, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
2216
2248
  ]), _ctx.$slots.aside ? (openBlock(), createElementBlock("div", _hoisted_8$9, [renderSlot(_ctx.$slots, "aside")])) : createCommentVNode("", true)], 2)])], 2);
@@ -2248,16 +2280,16 @@ function useUncontrolled(props, { defaultValue } = {}) {
2248
2280
  }
2249
2281
  //#endregion
2250
2282
  //#region src/components/select/index.vue
2251
- var _hoisted_1$39 = ["onKeydown"];
2252
- var _hoisted_2$35 = ["disabled", "aria-expanded"];
2253
- var _hoisted_3$28 = {
2283
+ var _hoisted_1$42 = ["onKeydown"];
2284
+ var _hoisted_2$37 = ["disabled", "aria-expanded"];
2285
+ var _hoisted_3$30 = {
2254
2286
  key: 0,
2255
- class: "ew-select__menu",
2287
+ class: "ev-select__menu",
2256
2288
  role: "listbox"
2257
2289
  };
2258
- var _hoisted_4$27 = ["aria-selected", "onClick"];
2259
- var _hoisted_5$21 = { class: "ew-select__option-label" };
2260
- var _sfc_main$44 = {
2290
+ var _hoisted_4$28 = ["aria-selected", "onClick"];
2291
+ var _hoisted_5$22 = { class: "ev-select__option-label" };
2292
+ var _sfc_main$46 = {
2261
2293
  __name: "index",
2262
2294
  props: {
2263
2295
  /** 当前值(v-model) */
@@ -2315,7 +2347,7 @@ var _sfc_main$44 = {
2315
2347
  ],
2316
2348
  setup(__props, { emit: __emit }) {
2317
2349
  /**
2318
- * EwSelect — 下拉选择(自定义菜单,替代原生 select 的生硬外观)
2350
+ * EvSelect — 下拉选择(自定义菜单,替代原生 select 的生硬外观)
2319
2351
  * bare 模式去边框,用于嵌入搜索栏等复合控件;点击外部自动收起,Esc 关闭
2320
2352
  */
2321
2353
  const props = __props;
@@ -2359,7 +2391,7 @@ var _sfc_main$44 = {
2359
2391
  ref_key: "rootRef",
2360
2392
  ref: rootRef,
2361
2393
  class: normalizeClass([
2362
- "ew-select",
2394
+ "ev-select",
2363
2395
  `is-${__props.size}`,
2364
2396
  {
2365
2397
  "is-bare": __props.bare,
@@ -2371,7 +2403,7 @@ var _sfc_main$44 = {
2371
2403
  onKeydown: withKeys(withModifiers(close, ["stop"]), ["esc"])
2372
2404
  }, [createElementVNode("button", {
2373
2405
  type: "button",
2374
- class: "ew-select__trigger",
2406
+ class: "ev-select__trigger",
2375
2407
  disabled: __props.disabled,
2376
2408
  "aria-haspopup": `listbox`,
2377
2409
  "aria-expanded": open.value,
@@ -2381,21 +2413,21 @@ var _sfc_main$44 = {
2381
2413
  key: 0,
2382
2414
  name: selectedIcon.value,
2383
2415
  size: iconSize.value,
2384
- class: "ew-select__icon"
2416
+ class: "ev-select__icon"
2385
2417
  }, null, 8, ["name", "size"])) : createCommentVNode("", true),
2386
- createElementVNode("span", { class: normalizeClass(["ew-select__label", { "is-placeholder": !selectedLabel.value }]) }, toDisplayString(selectedLabel.value || __props.placeholder), 3),
2418
+ createElementVNode("span", { class: normalizeClass(["ev-select__label", { "is-placeholder": !selectedLabel.value }]) }, toDisplayString(selectedLabel.value || __props.placeholder), 3),
2387
2419
  createVNode(_sfc_main$24, {
2388
2420
  name: "chevron-down",
2389
2421
  size: caretSize.value,
2390
- class: normalizeClass(["ew-select__caret", { "is-open": open.value }])
2422
+ class: normalizeClass(["ev-select__caret", { "is-open": open.value }])
2391
2423
  }, null, 8, ["size", "class"])
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) => {
2424
+ ], 8, _hoisted_2$37), createVNode(Transition, { name: "ev-select-drop" }, {
2425
+ default: withCtx(() => [open.value ? (openBlock(), createElementBlock("ul", _hoisted_3$30, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.options, (opt) => {
2394
2426
  return openBlock(), createElementBlock("li", {
2395
2427
  key: opt.value,
2396
2428
  role: "option",
2397
2429
  "aria-selected": opt.value === unref(current),
2398
- class: normalizeClass(["ew-select__option", {
2430
+ class: normalizeClass(["ev-select__option", {
2399
2431
  "is-selected": opt.value === __props.modelValue,
2400
2432
  "is-disabled": opt.disabled
2401
2433
  }]),
@@ -2405,60 +2437,60 @@ var _sfc_main$44 = {
2405
2437
  key: 0,
2406
2438
  name: opt.icon,
2407
2439
  size: 14,
2408
- class: "ew-select__option-icon"
2440
+ class: "ev-select__option-icon"
2409
2441
  }, null, 8, ["name"])) : createCommentVNode("", true),
2410
- createElementVNode("span", _hoisted_5$21, toDisplayString(opt.label), 1),
2442
+ createElementVNode("span", _hoisted_5$22, toDisplayString(opt.label), 1),
2411
2443
  opt.value === unref(current) ? (openBlock(), createBlock(_sfc_main$24, {
2412
2444
  key: 1,
2413
2445
  name: "check",
2414
2446
  size: 14,
2415
- class: "ew-select__option-check"
2447
+ class: "ev-select__option-check"
2416
2448
  })) : createCommentVNode("", true)
2417
- ], 10, _hoisted_4$27);
2449
+ ], 10, _hoisted_4$28);
2418
2450
  }), 128))])) : createCommentVNode("", true)]),
2419
2451
  _: 1
2420
- })], 42, _hoisted_1$39);
2452
+ })], 42, _hoisted_1$42);
2421
2453
  };
2422
2454
  }
2423
2455
  };
2424
2456
  //#endregion
2425
2457
  //#region src/components/search-box/index.vue
2426
- var _hoisted_1$38 = {
2458
+ var _hoisted_1$41 = {
2427
2459
  key: 0,
2428
- class: "ew-search-box__category"
2460
+ class: "ev-search-box__category"
2429
2461
  };
2430
- var _hoisted_2$34 = [
2462
+ var _hoisted_2$36 = [
2431
2463
  "value",
2432
2464
  "placeholder",
2433
2465
  "aria-label",
2434
2466
  "aria-expanded",
2435
2467
  "onKeydown"
2436
2468
  ];
2437
- var _hoisted_3$27 = {
2469
+ var _hoisted_3$29 = {
2438
2470
  key: 1,
2439
- class: "ew-search-box__suffix"
2471
+ class: "ev-search-box__suffix"
2440
2472
  };
2441
- var _hoisted_4$26 = {
2473
+ var _hoisted_4$27 = {
2442
2474
  key: 2,
2443
- class: "ew-search-box__dropdown",
2475
+ class: "ev-search-box__dropdown",
2444
2476
  role: "listbox"
2445
2477
  };
2446
- var _hoisted_5$20 = {
2478
+ var _hoisted_5$21 = {
2447
2479
  key: 0,
2448
- class: "ew-search-box__option is-state"
2480
+ class: "ev-search-box__option is-state"
2449
2481
  };
2450
2482
  var _hoisted_6$12 = ["aria-selected"];
2451
2483
  var _hoisted_7$9 = ["onMousedown", "onMouseenter"];
2452
- var _hoisted_8$8 = { class: "ew-search-box__option-title" };
2453
- var _hoisted_9$5 = {
2484
+ var _hoisted_8$8 = { class: "ev-search-box__option-title" };
2485
+ var _hoisted_9$6 = {
2454
2486
  key: 0,
2455
- class: "ew-search-box__option-desc"
2487
+ class: "ev-search-box__option-desc"
2456
2488
  };
2457
2489
  var _hoisted_10$3 = {
2458
2490
  key: 0,
2459
- class: "ew-search-box__option is-state"
2491
+ class: "ev-search-box__option is-state"
2460
2492
  };
2461
- var _sfc_main$42 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2493
+ var _sfc_main$44 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2462
2494
  __name: "index",
2463
2495
  props: {
2464
2496
  /** 搜索词(v-model) */
@@ -2509,8 +2541,8 @@ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2509
2541
  ],
2510
2542
  setup(__props, { emit: __emit }) {
2511
2543
  /**
2512
- * EwSearchBox — 大搜索框(签名组件:分类下拉 + 搜索输入 + 后缀动作位)
2513
- * v-model(搜索词) + v-model:category(分类值);分类下拉为 EwSelect bare 嵌入
2544
+ * EvSearchBox — 大搜索框(签名组件:分类下拉 + 搜索输入 + 后缀动作位)
2545
+ * v-model(搜索词) + v-model:category(分类值);分类下拉为 EvSelect bare 嵌入
2514
2546
  * 圆润 xl 圆角 + 藏青软阴影,穿透 attrs 到原生 input
2515
2547
  *
2516
2548
  * 远程搜索:传入 remote(async keyword => [{ title, description?, … }])后,
@@ -2603,11 +2635,11 @@ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2603
2635
  });
2604
2636
  return (_ctx, _cache) => {
2605
2637
  return openBlock(), createElementBlock("div", { class: normalizeClass([
2606
- "ew-search-box",
2607
- `ew-search-box--${__props.size}`,
2638
+ "ev-search-box",
2639
+ `ev-search-box--${__props.size}`,
2608
2640
  { "is-remote-open": panelOpen.value }
2609
2641
  ]) }, [
2610
- __props.categories.length ? (openBlock(), createElementBlock("div", _hoisted_1$38, [createVNode(_sfc_main$44, {
2642
+ __props.categories.length ? (openBlock(), createElementBlock("div", _hoisted_1$41, [createVNode(_sfc_main$46, {
2611
2643
  bare: "",
2612
2644
  "model-value": categoryProxy.value || normalizedCategories.value[0] && normalizedCategories.value[0].value,
2613
2645
  options: normalizedCategories.value,
@@ -2621,13 +2653,13 @@ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2621
2653
  createVNode(_sfc_main$24, {
2622
2654
  name: "search",
2623
2655
  size: iconSize.value,
2624
- class: "ew-search-box__magnifier"
2656
+ class: "ev-search-box__magnifier"
2625
2657
  }, null, 8, ["size"]),
2626
2658
  createElementVNode("input", mergeProps({
2627
2659
  ref_key: "inputRef",
2628
2660
  ref: inputRef
2629
2661
  }, _ctx.$attrs, {
2630
- class: "ew-search-box__input",
2662
+ class: "ev-search-box__input",
2631
2663
  type: "search",
2632
2664
  value: __props.modelValue,
2633
2665
  placeholder: __props.placeholder,
@@ -2644,9 +2676,9 @@ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2644
2676
  withKeys(withModifiers(chooseActive, ["prevent"]), ["enter"]),
2645
2677
  withKeys(withModifiers(closePanel, ["prevent"]), ["esc"])
2646
2678
  ]
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, {
2679
+ }), null, 16, _hoisted_2$36),
2680
+ _ctx.$slots.suffix ? (openBlock(), createElementBlock("div", _hoisted_3$29, [renderSlot(_ctx.$slots, "suffix")])) : createCommentVNode("", true),
2681
+ panelOpen.value ? (openBlock(), createElementBlock("ul", _hoisted_4$27, [remoteLoading.value ? (openBlock(), createElementBlock("li", _hoisted_5$21, [createVNode(_sfc_main$24, {
2650
2682
  name: "search",
2651
2683
  size: 14
2652
2684
  }), _cache[3] || (_cache[3] = createTextVNode(" 搜索中… ", -1))])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [(openBlock(true), createElementBlock(Fragment, null, renderList(remoteResults.value, (option, i) => {
@@ -2656,10 +2688,10 @@ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2656
2688
  "aria-selected": i === activeIndex.value
2657
2689
  }, [createElementVNode("button", {
2658
2690
  type: "button",
2659
- class: normalizeClass(["ew-search-box__option", { "is-active": i === activeIndex.value }]),
2691
+ class: normalizeClass(["ev-search-box__option", { "is-active": i === activeIndex.value }]),
2660
2692
  onMousedown: withModifiers(($event) => choose(option), ["prevent"]),
2661
2693
  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);
2694
+ }, [createElementVNode("span", _hoisted_8$8, toDisplayString(option.title), 1), option.description ? (openBlock(), createElementBlock("span", _hoisted_9$6, toDisplayString(option.description), 1)) : createCommentVNode("", true)], 42, _hoisted_7$9)], 8, _hoisted_6$12);
2663
2695
  }), 128)), !remoteResults.value.length ? (openBlock(), createElementBlock("li", _hoisted_10$3, "无匹配结果")) : createCommentVNode("", true)], 64))])) : createCommentVNode("", true)
2664
2696
  ], 2);
2665
2697
  };
@@ -2667,18 +2699,18 @@ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ inheritAttrs: false }, {
2667
2699
  });
2668
2700
  //#endregion
2669
2701
  //#region src/components/icon-grid/index.vue
2670
- var _hoisted_1$37 = { class: "ew-icon-grid" };
2671
- var _hoisted_2$33 = {
2702
+ var _hoisted_1$40 = { class: "ev-icon-grid" };
2703
+ var _hoisted_2$35 = {
2672
2704
  key: 0,
2673
- class: "ew-icon-grid__search"
2705
+ class: "ev-icon-grid__search"
2674
2706
  };
2675
- var _hoisted_3$26 = {
2707
+ var _hoisted_3$28 = {
2676
2708
  key: 1,
2677
- class: "ew-icon-grid__state"
2709
+ class: "ev-icon-grid__state"
2678
2710
  };
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" };
2711
+ var _hoisted_4$26 = { class: "ev-icon-grid__title" };
2712
+ var _hoisted_5$20 = { class: "ev-icon-grid__count" };
2713
+ var _hoisted_6$11 = { class: "ev-icon-grid__grid" };
2682
2714
  var _hoisted_7$8 = [
2683
2715
  "title",
2684
2716
  "aria-label",
@@ -2688,19 +2720,19 @@ var _hoisted_8$7 = {
2688
2720
  viewBox: "0 0 24 24",
2689
2721
  "aria-hidden": "true"
2690
2722
  };
2691
- var _hoisted_9$4 = [
2723
+ var _hoisted_9$5 = [
2692
2724
  "d",
2693
2725
  "fill-rule",
2694
2726
  "fill"
2695
2727
  ];
2696
- var _hoisted_10$2 = { class: "ew-icon-grid__name" };
2728
+ var _hoisted_10$2 = { class: "ev-icon-grid__name" };
2697
2729
  var _hoisted_11$2 = {
2698
- class: "ew-icon-grid__plus",
2730
+ class: "ev-icon-grid__plus",
2699
2731
  "aria-hidden": "true"
2700
2732
  };
2701
2733
  var _hoisted_12 = {
2702
2734
  key: 3,
2703
- class: "ew-icon-grid__state"
2735
+ class: "ev-icon-grid__state"
2704
2736
  };
2705
2737
  var _sfc_main$26 = {
2706
2738
  __name: "index",
@@ -2728,7 +2760,7 @@ var _sfc_main$26 = {
2728
2760
  emits: ["select", "copy"],
2729
2761
  setup(__props, { emit: __emit }) {
2730
2762
  /**
2731
- * EwIconGrid — 可搜索图标网格(remixicon.com 站点的核心界面语言)
2763
+ * EvIconGrid — 可搜索图标网格(remixicon.com 站点的核心界面语言)
2732
2764
  *
2733
2765
  * 内置展示集 900+ 图标(动态 chunk,按需加载):分类分节 + 计数胶囊 +
2734
2766
  * 关键词/分类过滤 + 点击复制图标名(remixicon 交互语言)
@@ -2753,8 +2785,8 @@ var _sfc_main$26 = {
2753
2785
  const m = await import("./showcase-icons.mjs");
2754
2786
  builtIn.value = Object.entries(m.ewShowcasePaths).map(([name, paths]) => ({
2755
2787
  name,
2756
- category: m.EW_SHOWCASE_META[name]?.category || "Others",
2757
- categoryZh: m.EW_SHOWCASE_META[name]?.categoryZh,
2788
+ category: m.EV_SHOWCASE_META[name]?.category || "Others",
2789
+ categoryZh: m.EV_SHOWCASE_META[name]?.categoryZh,
2758
2790
  paths: paths.paths,
2759
2791
  viewBox: paths.viewBox
2760
2792
  }));
@@ -2814,7 +2846,7 @@ var _sfc_main$26 = {
2814
2846
  }
2815
2847
  }
2816
2848
  return (_ctx, _cache) => {
2817
- return openBlock(), createElementBlock("div", _hoisted_1$37, [__props.searchable ? (openBlock(), createElementBlock("div", _hoisted_2$33, [renderSlot(_ctx.$slots, "search", {}, () => [createVNode(_sfc_main$42, {
2849
+ return openBlock(), createElementBlock("div", _hoisted_1$40, [__props.searchable ? (openBlock(), createElementBlock("div", _hoisted_2$35, [renderSlot(_ctx.$slots, "search", {}, () => [createVNode(_sfc_main$44, {
2818
2850
  modelValue: keyword.value,
2819
2851
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => keyword.value = $event),
2820
2852
  category: activeCategory.value,
@@ -2830,19 +2862,19 @@ var _sfc_main$26 = {
2830
2862
  "category",
2831
2863
  "categories",
2832
2864
  "placeholder"
2833
- ])])])) : createCommentVNode("", true), loading.value ? (openBlock(), createElementBlock("div", _hoisted_3$26, [createVNode(_sfc_main$24, {
2865
+ ])])])) : createCommentVNode("", true), loading.value ? (openBlock(), createElementBlock("div", _hoisted_3$28, [createVNode(_sfc_main$24, {
2834
2866
  name: "loading",
2835
2867
  size: 20,
2836
2868
  class: "is-rotating"
2837
2869
  }), _cache[2] || (_cache[2] = createElementVNode("span", null, "Loading icons…", -1))])) : sections.value.length ? (openBlock(true), createElementBlock(Fragment, { key: 2 }, renderList(sections.value, (sec) => {
2838
2870
  return openBlock(), createElementBlock("section", {
2839
2871
  key: sec.key,
2840
- class: "ew-icon-grid__section"
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) => {
2872
+ class: "ev-icon-grid__section"
2873
+ }, [createElementVNode("h3", _hoisted_4$26, [createTextVNode(toDisplayString(sec.label) + " ", 1), createElementVNode("span", _hoisted_5$20, toDisplayString(sec.icons.length), 1)]), createElementVNode("div", _hoisted_6$11, [(openBlock(true), createElementBlock(Fragment, null, renderList(sec.icons, (icon) => {
2842
2874
  return openBlock(), createElementBlock("button", {
2843
2875
  key: icon.name,
2844
2876
  type: "button",
2845
- class: normalizeClass(["ew-icon-grid__cell", { "is-copied": copiedName.value === icon.name }]),
2877
+ class: normalizeClass(["ev-icon-grid__cell", { "is-copied": copiedName.value === icon.name }]),
2846
2878
  title: `Copy '${icon.name}'`,
2847
2879
  "aria-label": `复制图标名 ${icon.name}`,
2848
2880
  onClick: ($event) => pick(icon)
@@ -2853,7 +2885,7 @@ var _sfc_main$26 = {
2853
2885
  d: p.d,
2854
2886
  "fill-rule": p.fillRule,
2855
2887
  fill: p.fill
2856
- }, null, 8, _hoisted_9$4);
2888
+ }, null, 8, _hoisted_9$5);
2857
2889
  }), 128))])),
2858
2890
  createElementVNode("span", _hoisted_10$2, toDisplayString(icon.name), 1),
2859
2891
  createElementVNode("span", _hoisted_11$2, [createVNode(_sfc_main$24, {
@@ -2868,15 +2900,15 @@ var _sfc_main$26 = {
2868
2900
  };
2869
2901
  //#endregion
2870
2902
  //#region src/components/feature-grid/index.vue
2871
- var _hoisted_1$36 = {
2903
+ var _hoisted_1$39 = {
2872
2904
  key: 0,
2873
- class: "ew-feature__icon"
2905
+ class: "ev-feature__icon"
2874
2906
  };
2875
- var _hoisted_2$32 = { class: "ew-feature__text" };
2876
- var _hoisted_3$25 = { class: "ew-feature__title" };
2877
- var _hoisted_4$24 = {
2907
+ var _hoisted_2$34 = { class: "ev-feature__text" };
2908
+ var _hoisted_3$27 = { class: "ev-feature__title" };
2909
+ var _hoisted_4$25 = {
2878
2910
  key: 0,
2879
- class: "ew-feature__description"
2911
+ class: "ev-feature__description"
2880
2912
  };
2881
2913
  var _sfc_main$20 = {
2882
2914
  __name: "index",
@@ -2919,7 +2951,7 @@ var _sfc_main$20 = {
2919
2951
  },
2920
2952
  setup(__props) {
2921
2953
  /**
2922
- * EwFeatureGrid — 特性展示
2954
+ * EvFeatureGrid — 特性展示
2923
2955
  * variant:bullets 行内特性条 / cards 特性卡片
2924
2956
  * cards 形态默认带交错滚动入场(reveal 控制开关,stagger 控制步长)
2925
2957
  */
@@ -2930,7 +2962,7 @@ var _sfc_main$20 = {
2930
2962
  cleanups.forEach((fn) => fn());
2931
2963
  cleanups = [];
2932
2964
  if (!props.reveal || !rootRef.value) return;
2933
- rootRef.value.querySelectorAll(".ew-feature").forEach((el, i) => {
2965
+ rootRef.value.querySelectorAll(".ev-feature").forEach((el, i) => {
2934
2966
  cleanups.push(revealElement(el, {
2935
2967
  type: "up",
2936
2968
  delay: i * props.stagger
@@ -2944,53 +2976,53 @@ var _sfc_main$20 = {
2944
2976
  ref_key: "rootRef",
2945
2977
  ref: rootRef,
2946
2978
  class: normalizeClass([
2947
- "ew-feature-grid",
2979
+ "ev-feature-grid",
2948
2980
  `is-${__props.variant}`,
2949
2981
  `is-columns-${__props.columns}`
2950
2982
  ])
2951
2983
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
2952
2984
  return openBlock(), createElementBlock("div", {
2953
2985
  key: item.title,
2954
- class: normalizeClass(["ew-feature", `is-${__props.variant}`]),
2986
+ class: normalizeClass(["ev-feature", `is-${__props.variant}`]),
2955
2987
  style: normalizeStyle({ "--feature-delay": `${i * __props.stagger}ms` })
2956
- }, [item.icon ? (openBlock(), createElementBlock("span", _hoisted_1$36, [createVNode(_sfc_main$24, {
2988
+ }, [item.icon ? (openBlock(), createElementBlock("span", _hoisted_1$39, [createVNode(_sfc_main$24, {
2957
2989
  name: item.icon,
2958
2990
  size: __props.variant === "bullets" ? 20 : 22
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);
2991
+ }, null, 8, ["name", "size"])])) : createCommentVNode("", true), createElementVNode("div", _hoisted_2$34, [createElementVNode("h4", _hoisted_3$27, toDisplayString(item.title), 1), item.description ? (openBlock(), createElementBlock("p", _hoisted_4$25, toDisplayString(item.description), 1)) : createCommentVNode("", true)])], 6);
2960
2992
  }), 128))], 2);
2961
2993
  };
2962
2994
  }
2963
2995
  };
2964
2996
  //#endregion
2965
2997
  //#region src/components/pricing-card/index.vue
2966
- var _hoisted_1$35 = {
2998
+ var _hoisted_1$38 = {
2967
2999
  key: 0,
2968
- class: "ew-pricing-card__badge"
3000
+ class: "ev-pricing-card__badge"
2969
3001
  };
2970
- var _hoisted_2$31 = { class: "ew-pricing-card__title" };
2971
- var _hoisted_3$24 = {
3002
+ var _hoisted_2$33 = { class: "ev-pricing-card__title" };
3003
+ var _hoisted_3$26 = {
2972
3004
  key: 1,
2973
- class: "ew-pricing-card__description"
3005
+ class: "ev-pricing-card__description"
2974
3006
  };
2975
- var _hoisted_4$23 = {
3007
+ var _hoisted_4$24 = {
2976
3008
  key: 2,
2977
- class: "ew-pricing-card__price-row"
3009
+ class: "ev-pricing-card__price-row"
2978
3010
  };
2979
- var _hoisted_5$18 = { class: "ew-pricing-card__price" };
3011
+ var _hoisted_5$19 = { class: "ev-pricing-card__price" };
2980
3012
  var _hoisted_6$10 = {
2981
3013
  key: 0,
2982
- class: "ew-pricing-card__original"
3014
+ class: "ev-pricing-card__original"
2983
3015
  };
2984
3016
  var _hoisted_7$7 = {
2985
3017
  key: 3,
2986
- class: "ew-pricing-card__note"
3018
+ class: "ev-pricing-card__note"
2987
3019
  };
2988
3020
  var _hoisted_8$6 = {
2989
3021
  key: 4,
2990
- class: "ew-pricing-card__features"
3022
+ class: "ev-pricing-card__features"
2991
3023
  };
2992
- var _hoisted_9$3 = { class: "ew-pricing-card__footer" };
2993
- var _sfc_main$38 = {
3024
+ var _hoisted_9$4 = { class: "ev-pricing-card__footer" };
3025
+ var _sfc_main$40 = {
2994
3026
  __name: "index",
2995
3027
  props: {
2996
3028
  /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
@@ -3049,32 +3081,32 @@ var _sfc_main$38 = {
3049
3081
  emits: ["action"],
3050
3082
  setup(__props, { emit: __emit }) {
3051
3083
  /**
3052
- * EwPricingCard — 定价卡(launchos 定价区语言)
3084
+ * EvPricingCard — 定价卡(launchos 定价区语言)
3053
3085
  * featured 深色主推卡 + lime 徽章 + 划线原价 + 橙色促销注记 + 勾选特性列表
3054
3086
  */
3055
3087
  const emit = __emit;
3056
3088
  return (_ctx, _cache) => {
3057
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-pricing-card", {
3089
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ev-pricing-card", {
3058
3090
  "is-featured": __props.featured,
3059
3091
  "is-glass": __props.glass === true,
3060
3092
  "no-glass": __props.glass === false
3061
3093
  }]) }, [
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),
3094
+ __props.badge ? (openBlock(), createElementBlock("span", _hoisted_1$38, [renderSlot(_ctx.$slots, "badge", {}, () => [createTextVNode(toDisplayString(__props.badge), 1)])])) : createCommentVNode("", true),
3095
+ createElementVNode("h3", _hoisted_2$33, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
3096
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_3$26, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
3097
+ __props.price ? (openBlock(), createElementBlock("div", _hoisted_4$24, [createElementVNode("span", _hoisted_5$19, [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
3098
  __props.offerNote || _ctx.$slots.note ? (openBlock(), createElementBlock("div", _hoisted_7$7, [renderSlot(_ctx.$slots, "note", {}, () => [createTextVNode(toDisplayString(__props.offerNote), 1)])])) : createCommentVNode("", true),
3067
3099
  __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) => {
3068
3100
  return openBlock(), createElementBlock("li", {
3069
3101
  key: item,
3070
- class: "ew-pricing-card__feature"
3102
+ class: "ev-pricing-card__feature"
3071
3103
  }, [createVNode(_sfc_main$24, {
3072
3104
  name: "check",
3073
3105
  size: 16,
3074
- class: "ew-pricing-card__check"
3106
+ class: "ev-pricing-card__check"
3075
3107
  }), createElementVNode("span", null, toDisplayString(item), 1)]);
3076
3108
  }), 128))])])) : createCommentVNode("", true),
3077
- createElementVNode("div", _hoisted_9$3, [renderSlot(_ctx.$slots, "action", {}, () => [createVNode(_sfc_main$9, {
3109
+ createElementVNode("div", _hoisted_9$4, [renderSlot(_ctx.$slots, "action", {}, () => [createVNode(_sfc_main$9, {
3078
3110
  variant: __props.featured ? "primary" : "dark",
3079
3111
  block: "",
3080
3112
  pill: __props.pill,
@@ -3089,15 +3121,15 @@ var _sfc_main$38 = {
3089
3121
  };
3090
3122
  //#endregion
3091
3123
  //#region src/components/faq/index.vue
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 = {
3096
- class: "ew-faq__indicator",
3124
+ var _hoisted_1$37 = { class: "ev-faq" };
3125
+ var _hoisted_2$32 = ["aria-expanded", "onClick"];
3126
+ var _hoisted_3$25 = { class: "ev-faq__question-text" };
3127
+ var _hoisted_4$23 = {
3128
+ class: "ev-faq__indicator",
3097
3129
  "aria-hidden": "true"
3098
3130
  };
3099
- var _hoisted_5$17 = { class: "ew-faq__answer-wrap" };
3100
- var _hoisted_6$9 = { class: "ew-faq__answer" };
3131
+ var _hoisted_5$18 = { class: "ev-faq__answer-wrap" };
3132
+ var _hoisted_6$9 = { class: "ev-faq__answer" };
3101
3133
  var _sfc_main$19 = {
3102
3134
  __name: "index",
3103
3135
  props: {
@@ -3119,7 +3151,7 @@ var _sfc_main$19 = {
3119
3151
  },
3120
3152
  setup(__props) {
3121
3153
  /**
3122
- * EwFaq — 常见问题手风琴(launchos FAQ 语言:+/− 指示器 + 平滑展开)
3154
+ * EvFaq — 常见问题手风琴(launchos FAQ 语言:+/− 指示器 + 平滑展开)
3123
3155
  * items [{ question, answer }];accordion 单开模式,multiple 允许多开
3124
3156
  */
3125
3157
  const props = __props;
@@ -3137,16 +3169,16 @@ var _sfc_main$19 = {
3137
3169
  openSet.value = next;
3138
3170
  }
3139
3171
  return (_ctx, _cache) => {
3140
- return openBlock(), createElementBlock("div", _hoisted_1$34, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
3172
+ return openBlock(), createElementBlock("div", _hoisted_1$37, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
3141
3173
  return openBlock(), createElementBlock("div", {
3142
3174
  key: i,
3143
- class: normalizeClass(["ew-faq__item", { "is-open": isOpen(i) }])
3175
+ class: normalizeClass(["ev-faq__item", { "is-open": isOpen(i) }])
3144
3176
  }, [createElementVNode("button", {
3145
3177
  type: "button",
3146
- class: "ew-faq__question",
3178
+ class: "ev-faq__question",
3147
3179
  "aria-expanded": isOpen(i),
3148
3180
  onClick: ($event) => toggle(i)
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", {
3181
+ }, [createElementVNode("span", _hoisted_3$25, toDisplayString(item.question), 1), createElementVNode("span", _hoisted_4$23, toDisplayString(isOpen(i) ? "−" : "+"), 1)], 8, _hoisted_2$32), createElementVNode("div", _hoisted_5$18, [createElementVNode("div", _hoisted_6$9, [renderSlot(_ctx.$slots, "answer", {
3150
3182
  item,
3151
3183
  index: i
3152
3184
  }, () => [createTextVNode(toDisplayString(item.answer), 1)])])])], 2);
@@ -3156,19 +3188,19 @@ var _sfc_main$19 = {
3156
3188
  };
3157
3189
  //#endregion
3158
3190
  //#region src/components/alert/index.vue
3159
- var _hoisted_1$33 = {
3191
+ var _hoisted_1$36 = {
3160
3192
  key: 0,
3161
- class: "ew-alert__icon"
3193
+ class: "ev-alert__icon"
3162
3194
  };
3163
- var _hoisted_2$29 = { class: "ew-alert__content" };
3164
- var _hoisted_3$22 = {
3195
+ var _hoisted_2$31 = { class: "ev-alert__content" };
3196
+ var _hoisted_3$24 = {
3165
3197
  key: 0,
3166
- class: "ew-alert__title"
3198
+ class: "ev-alert__title"
3167
3199
  };
3168
- var _hoisted_4$21 = { class: "ew-alert__message" };
3169
- var _hoisted_5$16 = {
3200
+ var _hoisted_4$22 = { class: "ev-alert__message" };
3201
+ var _hoisted_5$17 = {
3170
3202
  key: 1,
3171
- class: "ew-alert__action"
3203
+ class: "ev-alert__action"
3172
3204
  };
3173
3205
  var _sfc_main$1 = {
3174
3206
  __name: "index",
@@ -3209,7 +3241,7 @@ var _sfc_main$1 = {
3209
3241
  return (_ctx, _cache) => {
3210
3242
  return openBlock(), createElementBlock("div", {
3211
3243
  class: normalizeClass([
3212
- "ew-alert",
3244
+ "ev-alert",
3213
3245
  `is-${variant.value}`,
3214
3246
  `is-${__props.tone}`,
3215
3247
  {
@@ -3219,16 +3251,16 @@ var _sfc_main$1 = {
3219
3251
  ]),
3220
3252
  role: "status"
3221
3253
  }, [
3222
- __props.icon || _ctx.$slots.icon ? (openBlock(), createElementBlock("span", _hoisted_1$33, [renderSlot(_ctx.$slots, "icon", {}, () => [createVNode(_sfc_main$24, {
3254
+ __props.icon || _ctx.$slots.icon ? (openBlock(), createElementBlock("span", _hoisted_1$36, [renderSlot(_ctx.$slots, "icon", {}, () => [createVNode(_sfc_main$24, {
3223
3255
  name: __props.icon,
3224
3256
  size: __props.pill ? 16 : 18
3225
3257
  }, null, 8, ["name", "size"])])])) : 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),
3258
+ createElementVNode("div", _hoisted_2$31, [__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("strong", _hoisted_3$24, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true), createElementVNode("span", _hoisted_4$22, [renderSlot(_ctx.$slots, "default")])]),
3259
+ _ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$17, [renderSlot(_ctx.$slots, "action")])) : createCommentVNode("", true),
3228
3260
  __props.closable ? (openBlock(), createElementBlock("button", {
3229
3261
  key: 2,
3230
3262
  type: "button",
3231
- class: "ew-alert__close",
3263
+ class: "ev-alert__close",
3232
3264
  "aria-label": "关闭",
3233
3265
  onClick: _cache[0] || (_cache[0] = ($event) => visible.value = false)
3234
3266
  }, [createVNode(_sfc_main$24, {
@@ -3240,32 +3272,159 @@ var _sfc_main$1 = {
3240
3272
  }
3241
3273
  };
3242
3274
  //#endregion
3275
+ //#region src/components/code-block/highlight.js
3276
+ /**
3277
+ * EvCodeBlock 内置轻量语法高亮 — 零依赖
3278
+ * 覆盖 shell / js / json 三种常用形态,`auto` 按内容特征自动识别;
3279
+ * 所有原文一律先 HTML 转义再包裹 token span,产物可安全用于 v-html
3280
+ */
3281
+ var escapeHtml$1 = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
3282
+ /**
3283
+ * 规则项:[sticky 正则, token 类名];可选 when(src, i, cmdNext) 做上下文门控。
3284
+ * 扫描从左到右,位置逐点尝试各规则,首个命中者胜出,未命中字符逐字落入普通文本
3285
+ */
3286
+ function scan(src, rules) {
3287
+ let out = "";
3288
+ let plain = "";
3289
+ let cmdNext = true;
3290
+ const flush = () => {
3291
+ if (plain) {
3292
+ out += escapeHtml$1(plain);
3293
+ plain = "";
3294
+ }
3295
+ };
3296
+ let i = 0;
3297
+ while (i < src.length) {
3298
+ let matched = null;
3299
+ for (const rule of rules) {
3300
+ const [re, cls] = Array.isArray(rule) ? rule : [rule.re, rule.cls];
3301
+ if (rule.when) {
3302
+ if (!rule.when(src, i, cmdNext)) continue;
3303
+ }
3304
+ re.lastIndex = i;
3305
+ const m = src.match(re);
3306
+ if (m !== null) {
3307
+ if (m.index === i) {
3308
+ matched = {
3309
+ text: m[0],
3310
+ cls
3311
+ };
3312
+ break;
3313
+ }
3314
+ }
3315
+ }
3316
+ if (matched !== null) {
3317
+ flush();
3318
+ out += `<span class="tok-${matched.cls}">${escapeHtml$1(matched.text)}</span>`;
3319
+ i += matched.text.length;
3320
+ cmdNext = matched.cls === "op";
3321
+ if (matched.text.includes("\n")) cmdNext = true;
3322
+ } else {
3323
+ plain += src[i];
3324
+ if (src[i] === "\n") cmdNext = true;
3325
+ i += 1;
3326
+ }
3327
+ }
3328
+ flush();
3329
+ return out;
3330
+ }
3331
+ var RULES = {
3332
+ shell: [
3333
+ [/#[^\n]*/y, "comment"],
3334
+ [/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'/y, "string"],
3335
+ [/\$\{?[A-Za-z_][A-Za-z0-9_]*\}?/y, "env"],
3336
+ {
3337
+ re: /--?[a-zA-Z][\w-]*/y,
3338
+ cls: "flag",
3339
+ when: (_s, i) => i === 0 ? true : /\s/.test(_s[i - 1])
3340
+ },
3341
+ [/\d[\d._]*/y, "number"],
3342
+ [/&{2}|\|{2}|[|;&<>]/y, "op"],
3343
+ {
3344
+ re: /[a-zA-Z@][\w./@-]*/y,
3345
+ cls: "cmd",
3346
+ when: (_s, _i, cmdNext) => cmdNext
3347
+ }
3348
+ ],
3349
+ js: [
3350
+ [/\/\/[^\n]*|\/\*[\s\S]*?\*\//y, "comment"],
3351
+ [/"(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*'|`(?:\\.|[^`\\])*`/y, "string"],
3352
+ [/\b(?:const|let|var|function|return|if|else|for|while|do|switch|case|break|continue|import|from|export|default|class|extends|new|delete|in|of|instanceof|typeof|void|await|async|yield|try|catch|finally|throw)\b/y, "keyword"],
3353
+ [/\b(?:true|false|null|undefined|this|super)\b/y, "atom"],
3354
+ [/\b0x[\da-fA-F]+\b|\b\d+(?:\.\d+)?(?:[eE][+-]?\d+)?\b/y, "number"],
3355
+ [/[A-Za-z_$][\w$]*(?=\s*\()/y, "fn"],
3356
+ [/=>|\.{3}|[{}()[\];,.:=+\-*/%<>!&|?]/y, "punct"]
3357
+ ],
3358
+ json: [
3359
+ [/"(?:\\.|[^"\\])*"(?=\s*:)/y, "key"],
3360
+ [/"(?:\\.|[^"\\])*"/y, "string"],
3361
+ [/\b(?:true|false|null)\b/y, "keyword"],
3362
+ [/-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/y, "number"],
3363
+ [/[{}[\]:,]/y, "punct"]
3364
+ ]
3365
+ };
3366
+ var ALIAS = {
3367
+ bash: "shell",
3368
+ sh: "shell",
3369
+ zsh: "shell",
3370
+ javascript: "js",
3371
+ ts: "js",
3372
+ typescript: "js"
3373
+ };
3374
+ /** 按内容特征自动识别语言 */
3375
+ function detectLanguage(code) {
3376
+ const t = code.trim();
3377
+ if (/^[{[]/.test(t)) return "json";
3378
+ if (/\b(?:const|let|var|function|import|export|class)\b/.test(t)) return "js";
3379
+ if (/=>/.test(t)) return "js";
3380
+ return "shell";
3381
+ }
3382
+ /**
3383
+ * 高亮入口:language 传 'auto'(默认)或具体语言名;
3384
+ * 未知语言按纯文本处理(仅转义)
3385
+ */
3386
+ function highlightCode(code, language = "auto") {
3387
+ if (!code) return "";
3388
+ let lang = language;
3389
+ if (lang === "auto") lang = detectLanguage(code);
3390
+ if (ALIAS[lang]) lang = ALIAS[lang];
3391
+ const rules = RULES[lang];
3392
+ if (!rules) return escapeHtml$1(code);
3393
+ return scan(code, rules);
3394
+ }
3395
+ //#endregion
3243
3396
  //#region src/components/code-block/index.vue
3244
- var _hoisted_1$32 = { class: "ew-code-block" };
3245
- var _hoisted_2$28 = { class: "ew-code-block__titlebar" };
3246
- var _hoisted_3$21 = {
3397
+ var _hoisted_1$35 = { class: "ev-code-block" };
3398
+ var _hoisted_2$30 = { class: "ev-code-block__titlebar" };
3399
+ var _hoisted_3$23 = {
3247
3400
  key: 0,
3248
- class: "ew-code-block__title"
3401
+ class: "ev-code-block__title"
3249
3402
  };
3250
- var _hoisted_4$20 = ["aria-label"];
3251
- var _hoisted_5$15 = {
3403
+ var _hoisted_4$21 = ["aria-label"];
3404
+ var _hoisted_5$16 = {
3252
3405
  key: 0,
3253
- class: "ew-code-block__copy-text"
3406
+ class: "ev-code-block__copy-text"
3254
3407
  };
3255
- var _hoisted_6$8 = { class: "ew-code-block__body" };
3408
+ var _hoisted_6$8 = { class: "ev-code-block__body" };
3256
3409
  var _hoisted_7$6 = {
3257
3410
  key: 0,
3258
- class: "ew-code-block__prefix"
3411
+ class: "ev-code-block__prefix"
3259
3412
  };
3260
- var _hoisted_8$5 = { class: "ew-code-block__code" };
3413
+ var _hoisted_8$5 = { class: "ev-code-block__code" };
3414
+ var _hoisted_9$3 = ["innerHTML"];
3261
3415
  var _sfc_main$12 = {
3262
3416
  __name: "index",
3263
3417
  props: {
3264
- /** 代码/命令文案(亦可用默认插槽承载高亮内容) */
3418
+ /** 代码/命令文案(亦可用默认插槽承载自定义渲染内容) */
3265
3419
  code: {
3266
3420
  type: String,
3267
3421
  default: ""
3268
3422
  },
3423
+ /** 语法高亮语言:'auto'(按内容识别)| 'shell' | 'js' | 'json' */
3424
+ language: {
3425
+ type: String,
3426
+ default: "auto"
3427
+ },
3269
3428
  /** 提示符前缀(如 $) */
3270
3429
  prefix: {
3271
3430
  type: String,
@@ -3289,44 +3448,537 @@ var _sfc_main$12 = {
3289
3448
  emits: ["copy"],
3290
3449
  setup(__props, { emit: __emit }) {
3291
3450
  /**
3292
- * EwCodeBlock — 命令/代码块(macOS 窗框式终端语言)
3293
- * 红绿灯标题栏 + 提示符前缀 + 一键复制(成功打勾反馈);
3294
- * 颜色全部走 --ew-* 语义令牌,明暗双主题自动跟随
3451
+ * EvCodeBlock — 命令/代码块(macOS 窗框式终端语言)
3452
+ * 窗口控制点标题栏 + 提示符前缀 + 一键复制(成功打勾反馈);
3453
+ * 代码内容经内置零依赖高亮(highlight.js 模块)渲染 token 配色,
3454
+ * 默认插槽可整体覆写渲染内容。
3455
+ * 颜色全部走 --ev-* 语义令牌,明暗双主题自动跟随
3295
3456
  */
3457
+ const props = __props;
3296
3458
  const emit = __emit;
3297
3459
  const { copy, copied } = useCopy(2e3);
3460
+ const rendered = computed(() => highlightCode(props.code, props.language));
3298
3461
  async function onCopy(e) {
3299
- const text = e.currentTarget.closest(".ew-code-block")?.querySelector(".ew-code-block__code")?.textContent?.trim() || "";
3462
+ const text = e.currentTarget.closest(".ev-code-block")?.querySelector(".ev-code-block__code")?.textContent?.trim() || "";
3300
3463
  if (await copy(text)) emit("copy", text);
3301
3464
  }
3302
3465
  return (_ctx, _cache) => {
3303
- return openBlock(), createElementBlock("div", _hoisted_1$32, [createElementVNode("div", _hoisted_2$28, [
3466
+ return openBlock(), createElementBlock("div", _hoisted_1$35, [createElementVNode("div", _hoisted_2$30, [
3304
3467
  _cache[0] || (_cache[0] = createElementVNode("span", {
3305
- class: "ew-code-block__lights",
3468
+ class: "ev-code-block__lights",
3306
3469
  "aria-hidden": "true"
3307
3470
  }, [
3308
- createElementVNode("i", { class: "ew-code-block__light is-red" }),
3309
- createElementVNode("i", { class: "ew-code-block__light is-yellow" }),
3310
- createElementVNode("i", { class: "ew-code-block__light is-green" })
3471
+ createElementVNode("i", { class: "ev-code-block__light is-red" }),
3472
+ createElementVNode("i", { class: "ev-code-block__light is-yellow" }),
3473
+ createElementVNode("i", { class: "ev-code-block__light is-green" })
3311
3474
  ], -1)),
3312
- __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("span", _hoisted_3$21, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true),
3475
+ __props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("span", _hoisted_3$23, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true),
3313
3476
  __props.copyable ? (openBlock(), createElementBlock("button", {
3314
3477
  key: 1,
3315
3478
  type: "button",
3316
- class: normalizeClass(["ew-code-block__copy", { "is-copied": unref(copied) }]),
3479
+ class: normalizeClass(["ev-code-block__copy", { "is-copied": unref(copied) }]),
3317
3480
  "aria-label": unref(copied) ? "已复制" : "复制",
3318
3481
  onClick: onCopy
3319
3482
  }, [createVNode(_sfc_main$24, {
3320
3483
  name: unref(copied) ? "check" : "copy",
3321
3484
  size: 14
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)])])])]);
3485
+ }, null, 8, ["name"]), __props.showCopyText ? (openBlock(), createElementBlock("span", _hoisted_5$16, toDisplayString(unref(copied) ? "Copied" : "Copy"), 1)) : createCommentVNode("", true)], 10, _hoisted_4$21)) : createCommentVNode("", true)
3486
+ ]), 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", {}, () => [createElementVNode("span", { innerHTML: rendered.value }, null, 8, _hoisted_9$3)])])])]);
3487
+ };
3488
+ }
3489
+ };
3490
+ //#endregion
3491
+ //#region src/components/markdown/markdown.js
3492
+ /**
3493
+ * EvMarkdown 内置轻量 Markdown 解析器 — 零依赖
3494
+ *
3495
+ * 块级:标题(#{1,6}) / 段落 / 无序·有序列表(缩进嵌套)/ 引用(递归)/
3496
+ * 分隔线 / 围栏代码块(复用 EvCodeBlock 高亮分词器)/ GFM 表格(含对齐)
3497
+ * 行内:加粗 / 斜体 / 删除线 / 行内代码 / 链接 / 图片
3498
+ *
3499
+ * 安全模型:原文全量 HTML 转义后再包裹自有标签,链接与图片地址仅放行
3500
+ * http(s) / mailto / 相对路径 / 锚点,产物可安全用于 v-html
3501
+ */
3502
+ var escapeHtml = (s) => s.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
3503
+ function safeUrl(u) {
3504
+ const t = u.trim();
3505
+ if (/^(https?:|mailto:|\/|#|\.\/|\.\.\/?)/i.test(t)) return t;
3506
+ return "#";
3507
+ }
3508
+ /** 行内解析:转义 → 行内代码占位 → 图片 → 链接 → 强调 → 恢复代码 */
3509
+ function renderInline(text) {
3510
+ let s = escapeHtml(text);
3511
+ const codes = [];
3512
+ s = s.replace(/`([^`]+)`/g, (_m, c) => {
3513
+ codes.push(`<code class="ev-md__code-inline">${c}</code>`);
3514
+ return `\u0000${codes.length - 1}\u0000`;
3515
+ });
3516
+ s = s.replace(/!\[([^\]]*)\]\(([^)\s]+)\)/g, (_m, alt, src) => `<img class="ev-md__img" src="${safeUrl(src)}" alt="${alt}" />`);
3517
+ s = s.replace(/\[([^\]]+)\]\(([^)\s]+)\)/g, (_m, label, href) => `<a class="ev-md__link" href="${safeUrl(href)}" target="_blank" rel="noopener">${label}</a>`);
3518
+ s = s.replace(/\*\*([^*]+)\*\*/g, "<strong>$1</strong>");
3519
+ s = s.replace(/__([^_]+)__/g, "<strong>$1</strong>");
3520
+ s = s.replace(/(^|[^*])\*([^*\n]+)\*/g, "$1<em>$2</em>");
3521
+ s = s.replace(/~~([^~]+)~~/g, "<del>$1</del>");
3522
+ s = s.replace(/\u0000(\d+)\u0000/g, (_m, i) => codes[Number(i)]);
3523
+ return s;
3524
+ }
3525
+ function mapFenceLang(info) {
3526
+ const t = info ? info.trim().toLowerCase() : "";
3527
+ if ([
3528
+ "js",
3529
+ "javascript",
3530
+ "ts",
3531
+ "typescript",
3532
+ "jsx",
3533
+ "tsx"
3534
+ ].includes(t)) return "js";
3535
+ if (t === "json") return "json";
3536
+ if ([
3537
+ "sh",
3538
+ "shell",
3539
+ "bash",
3540
+ "zsh",
3541
+ "console",
3542
+ "terminal"
3543
+ ].includes(t)) return "shell";
3544
+ return "auto";
3545
+ }
3546
+ var FENCE_CLOSE_RE = /^(`{3,}|~{3,})\s*$/;
3547
+ function isFenceClose(line, markerChar) {
3548
+ const m = line.match(FENCE_CLOSE_RE);
3549
+ if (m === null) return false;
3550
+ return m[1][0] === markerChar;
3551
+ }
3552
+ var isSepRow = (line) => {
3553
+ if (!line.includes("-")) return false;
3554
+ return line.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").every((c) => /^:?-+:?$/.test(c.trim()));
3555
+ };
3556
+ var cellAlign = (c) => {
3557
+ if (c.startsWith(":") && c.endsWith(":")) return "center";
3558
+ if (c.endsWith(":")) return "right";
3559
+ return "";
3560
+ };
3561
+ /** 表格起点:当前行含竖线且下一行为分隔行 */
3562
+ function isTableStart(lines, i) {
3563
+ if (i + 1 >= lines.length) return false;
3564
+ if (!lines[i].includes("|")) return false;
3565
+ return isSepRow(lines[i + 1]);
3566
+ }
3567
+ var PARAGRAPH_STOP = /^(#{1,6}\s|```|~~~|\s*>|\s*[-*+]\s|\s*\d+[.)]\s|\s*(-{3,}|\*{3,}|_{3,})\s*$)/;
3568
+ function canContinueParagraph(lines, i) {
3569
+ if (i >= lines.length) return false;
3570
+ if (!lines[i].trim()) return false;
3571
+ if (PARAGRAPH_STOP.test(lines[i])) return false;
3572
+ if (isTableStart(lines, i)) return false;
3573
+ return true;
3574
+ }
3575
+ var LIST_ITEM_RE = /^(\s*)([-*+]|\d+[.)])\s+(.*)$/;
3576
+ function renderList$1(lines, start) {
3577
+ let html = "";
3578
+ let i = start;
3579
+ const stack = [];
3580
+ const closeTo = (indent) => {
3581
+ while (stack.length > 0) {
3582
+ if (stack[stack.length - 1].indent <= indent) break;
3583
+ html += `</li></${stack.pop().type}>`;
3584
+ }
3585
+ };
3586
+ while (i < lines.length) {
3587
+ const m = lines[i].match(LIST_ITEM_RE);
3588
+ if (m === null) {
3589
+ const nextLine = lines[i + 1] ? lines[i + 1] : "";
3590
+ if (!lines[i].trim() && LIST_ITEM_RE.test(nextLine)) {
3591
+ i += 1;
3592
+ continue;
3593
+ }
3594
+ break;
3595
+ }
3596
+ const indent = m[1].replace(/\t/g, " ").length;
3597
+ const type = /\d/.test(m[2]) ? "ol" : "ul";
3598
+ const content = renderInline(m[3]);
3599
+ closeTo(indent);
3600
+ const top = stack[stack.length - 1];
3601
+ if (stack.length === 0) {
3602
+ stack.push({
3603
+ type,
3604
+ indent
3605
+ });
3606
+ html += `<${type} class="ev-md__list">`;
3607
+ } else if (top.type !== type) {
3608
+ while (stack.length > 0) html += `</li></${stack.pop().type}>`;
3609
+ stack.push({
3610
+ type,
3611
+ indent
3612
+ });
3613
+ html += `<${type} class="ev-md__list">`;
3614
+ } else if (top.indent < indent) {
3615
+ stack.push({
3616
+ type,
3617
+ indent
3618
+ });
3619
+ html += `<${type} class="ev-md__list">`;
3620
+ } else html += "</li>";
3621
+ html += `<li>${content}`;
3622
+ i += 1;
3623
+ }
3624
+ while (stack.length > 0) html += `</li></${stack.pop().type}>`;
3625
+ return {
3626
+ html,
3627
+ next: i
3628
+ };
3629
+ }
3630
+ function cellHtml(c, idx, aligns, tag) {
3631
+ const a = aligns[idx];
3632
+ if (a === "left" ? false : Boolean(a)) return `<${tag} style="text-align:${a}">${renderInline(c)}</${tag}>`;
3633
+ return `<${tag}>${renderInline(c)}</${tag}>`;
3634
+ }
3635
+ function renderTable(lines, i) {
3636
+ const splitRow = (r) => r.trim().replace(/^\|/, "").replace(/\|$/, "").split("|").map((c) => c.trim());
3637
+ const head = splitRow(lines[i]);
3638
+ const aligns = splitRow(lines[i + 1]).map(cellAlign);
3639
+ let cursor = i + 2;
3640
+ const rows = [];
3641
+ while (cursor < lines.length) {
3642
+ if (!lines[cursor].includes("|")) break;
3643
+ if (!lines[cursor].trim()) break;
3644
+ rows.push(splitRow(lines[cursor]));
3645
+ cursor += 1;
3646
+ }
3647
+ return {
3648
+ html: `<div class="ev-md__table-wrap"><table class="ev-md__table"><thead>${`<tr>${head.map((c, idx) => cellHtml(c, idx, aligns, "th")).join("")}</tr>`}</thead><tbody>${rows.map((r) => `<tr>${r.map((c, idx) => cellHtml(c, idx, aligns, "td")).join("")}</tr>`).join("")}</tbody></table></div>`,
3649
+ next: cursor
3650
+ };
3651
+ }
3652
+ function renderFence(lines, i, markerChar, lang) {
3653
+ const buf = [];
3654
+ let cursor = i + 1;
3655
+ while (cursor < lines.length) {
3656
+ if (isFenceClose(lines[cursor], markerChar)) break;
3657
+ buf.push(lines[cursor]);
3658
+ cursor += 1;
3659
+ }
3660
+ if (cursor < lines.length) cursor += 1;
3661
+ const mapped = mapFenceLang(lang);
3662
+ const body = buf.join("\n");
3663
+ return {
3664
+ html: `<pre class="ev-md__pre"><code>${mapped === "auto" ? highlightCode(body) : highlightCode(body, mapped)}</code></pre>`,
3665
+ next: cursor
3666
+ };
3667
+ }
3668
+ /** 解析入口:输入 Markdown 源文本,输出 HTML 片段 */
3669
+ function parseMarkdown(src) {
3670
+ const lines = String(src != null ? src : "").replace(/\r\n?/g, "\n").split("\n");
3671
+ const out = [];
3672
+ let i = 0;
3673
+ while (i < lines.length) {
3674
+ const line = lines[i];
3675
+ if (!line.trim()) {
3676
+ i += 1;
3677
+ continue;
3678
+ }
3679
+ const fence = line.match(/^\s*(`{3,}|~{3,})\s*(\S*)\s*$/);
3680
+ if (fence) {
3681
+ const { html, next } = renderFence(lines, i, fence[1][0], fence[2]);
3682
+ out.push(html);
3683
+ i = next;
3684
+ continue;
3685
+ }
3686
+ const h = line.match(/^(#{1,6})\s+(.+?)\s*#*$/);
3687
+ if (h) {
3688
+ const level = h[1].length;
3689
+ out.push(`<h${level} class="ev-md__h">${renderInline(h[2])}</h${level}>`);
3690
+ i += 1;
3691
+ continue;
3692
+ }
3693
+ if (/^\s*(-{3,}|\*{3,}|_{3,})\s*$/.test(line)) {
3694
+ out.push("<hr class=\"ev-md__hr\" />");
3695
+ i += 1;
3696
+ continue;
3697
+ }
3698
+ if (/^\s*>/.test(line)) {
3699
+ const buf = [];
3700
+ while (i < lines.length && /^\s*>/.test(lines[i])) {
3701
+ buf.push(lines[i].replace(/^\s*>\s?/, ""));
3702
+ i += 1;
3703
+ }
3704
+ out.push(`<blockquote class="ev-md__quote">${parseMarkdown(buf.join("\n"))}</blockquote>`);
3705
+ continue;
3706
+ }
3707
+ if (isTableStart(lines, i)) {
3708
+ const { html, next } = renderTable(lines, i);
3709
+ out.push(html);
3710
+ i = next;
3711
+ continue;
3712
+ }
3713
+ if (LIST_ITEM_RE.test(line)) {
3714
+ const { html, next } = renderList$1(lines, i);
3715
+ out.push(html);
3716
+ i = next;
3717
+ continue;
3718
+ }
3719
+ const buf = [line];
3720
+ i += 1;
3721
+ while (canContinueParagraph(lines, i)) {
3722
+ buf.push(lines[i]);
3723
+ i += 1;
3724
+ }
3725
+ out.push(`<p class="ev-md__p">${renderInline(buf.join("\n")).replace(/\n/g, "<br />")}</p>`);
3726
+ }
3727
+ return out.join("\n");
3728
+ }
3729
+ //#endregion
3730
+ //#region src/components/markdown/index.vue
3731
+ var _hoisted_1$34 = ["innerHTML"];
3732
+ var _sfc_main$33 = {
3733
+ __name: "index",
3734
+ props: {
3735
+ /** Markdown 源文本 */
3736
+ content: {
3737
+ type: String,
3738
+ default: ""
3739
+ } },
3740
+ setup(__props) {
3741
+ /**
3742
+ * EvMarkdown — Markdown 渲染
3743
+ * 内置零依赖解析器(markdown.js),代码围栏复用 EvCodeBlock 的
3744
+ * highlight 分词器做语法配色;原文全量转义后渲染,v-html 安全。
3745
+ * 字体排版走 --ev-* 语义令牌,明暗双主题自动跟随
3746
+ */
3747
+ const props = __props;
3748
+ const rendered = computed(() => parseMarkdown(props.content));
3749
+ return (_ctx, _cache) => {
3750
+ return openBlock(), createElementBlock("div", {
3751
+ class: "ev-markdown",
3752
+ innerHTML: rendered.value
3753
+ }, null, 8, _hoisted_1$34);
3754
+ };
3755
+ }
3756
+ };
3757
+ //#endregion
3758
+ //#region src/components/markdown-editor/index.vue
3759
+ var _hoisted_1$33 = {
3760
+ key: 0,
3761
+ class: "ev-md-editor__toolbar"
3762
+ };
3763
+ var _hoisted_2$29 = [
3764
+ "title",
3765
+ "aria-label",
3766
+ "disabled",
3767
+ "onClick"
3768
+ ];
3769
+ var _hoisted_3$22 = {
3770
+ key: 0,
3771
+ class: "ev-md-editor__tabs"
3772
+ };
3773
+ var _hoisted_4$20 = [
3774
+ "value",
3775
+ "placeholder",
3776
+ "disabled"
3777
+ ];
3778
+ var _hoisted_5$15 = { class: "ev-md-editor__preview" };
3779
+ var _sfc_main$34 = {
3780
+ __name: "index",
3781
+ props: {
3782
+ /** Markdown 源文本(v-model) */
3783
+ modelValue: {
3784
+ type: String,
3785
+ default: ""
3786
+ },
3787
+ /** 占位文案 */
3788
+ placeholder: {
3789
+ type: String,
3790
+ default: ""
3791
+ },
3792
+ /** 编辑区高度(数字按 px) */
3793
+ height: {
3794
+ type: [String, Number],
3795
+ default: "320px"
3796
+ },
3797
+ /** 预览形态:'split' 双栏实时 | 'toggle' 编辑/预览切换 */
3798
+ preview: {
3799
+ type: String,
3800
+ default: "split",
3801
+ validator: (v) => ["split", "toggle"].includes(v)
3802
+ },
3803
+ /** 展示工具栏 */
3804
+ toolbar: {
3805
+ type: Boolean,
3806
+ default: true
3807
+ },
3808
+ disabled: {
3809
+ type: Boolean,
3810
+ default: false
3811
+ }
3812
+ },
3813
+ emits: ["update:modelValue", "change"],
3814
+ setup(__props, { emit: __emit }) {
3815
+ /**
3816
+ * EvMarkdownEditor — Markdown 编辑器
3817
+ * 工具栏(加粗/斜体/删除线/行内代码/标题/引用/列表/链接)+ 编辑预览双栏;
3818
+ * preview='split' 左右分栏实时预览,'toggle' 编辑/预览切换(Ctrl/⌘+B / I 快捷加粗斜体)。
3819
+ * 预览由 EvMarkdown 承载(零依赖解析 + 语法高亮),颜色走 --ev-* 语义令牌
3820
+ */
3821
+ const props = __props;
3822
+ const emit = __emit;
3823
+ const inputRef = ref(null);
3824
+ const tab = ref("edit");
3825
+ const px = (v) => typeof v === "number" ? `${v}px` : v;
3826
+ const panesStyle = computed(() => ({ height: px(props.height) }));
3827
+ const isSingle = computed(() => props.preview === "toggle");
3828
+ const showInput = computed(() => props.preview === "split" || tab.value === "edit");
3829
+ const showPreview = computed(() => props.preview === "split" || tab.value === "preview");
3830
+ function emitUpdate(value) {
3831
+ emit("update:modelValue", value);
3832
+ emit("change", value);
3833
+ }
3834
+ function onInput(e) {
3835
+ emitUpdate(e.target.value);
3836
+ }
3837
+ /** 包裹选区(无选区时插入占位文本并选中) */
3838
+ function surround(before, after, placeholder) {
3839
+ const el = inputRef.value;
3840
+ if (!el || props.disabled) return;
3841
+ const start = el.selectionStart;
3842
+ const end = el.selectionEnd;
3843
+ const value = props.modelValue;
3844
+ const body = value.slice(start, end) ? value.slice(start, end) : placeholder;
3845
+ emitUpdate(value.slice(0, start) + before + body + after + value.slice(end));
3846
+ nextTick(() => {
3847
+ el.focus();
3848
+ el.setSelectionRange(start + before.length, start + before.length + body.length);
3849
+ });
3850
+ }
3851
+ /** 行前缀切换(标题/引用/列表):已有前缀则移除,否则添加 */
3852
+ function togglePrefix(prefix) {
3853
+ const el = inputRef.value;
3854
+ if (!el || props.disabled) return;
3855
+ const value = props.modelValue;
3856
+ let start = el.selectionStart;
3857
+ let end = el.selectionEnd;
3858
+ while (start > 0 && value[start - 1] !== "\n") start -= 1;
3859
+ while (end < value.length && value[end] !== "\n") end += 1;
3860
+ const lines = value.slice(start, end).split("\n");
3861
+ const allPrefixed = lines.every((l) => l.startsWith(prefix));
3862
+ const block = lines.map((l) => allPrefixed ? l.slice(prefix.length) : prefix + l).join("\n");
3863
+ emitUpdate(value.slice(0, start) + block + value.slice(end));
3864
+ nextTick(() => {
3865
+ el.focus();
3866
+ el.setSelectionRange(start, start + block.length);
3867
+ });
3868
+ }
3869
+ const actions = [
3870
+ {
3871
+ name: "bold",
3872
+ icon: "bold",
3873
+ title: "加粗",
3874
+ run: () => surround("**", "**", "加粗文本")
3875
+ },
3876
+ {
3877
+ name: "italic",
3878
+ icon: "italic",
3879
+ title: "斜体",
3880
+ run: () => surround("*", "*", "斜体文本")
3881
+ },
3882
+ {
3883
+ name: "strikethrough",
3884
+ icon: "strikethrough",
3885
+ title: "删除线",
3886
+ run: () => surround("~~", "~~", "删除文本")
3887
+ },
3888
+ {
3889
+ name: "code",
3890
+ icon: "code",
3891
+ title: "行内代码",
3892
+ run: () => surround("`", "`", "代码")
3893
+ },
3894
+ {
3895
+ name: "heading",
3896
+ icon: "heading",
3897
+ title: "标题",
3898
+ run: () => togglePrefix("## ")
3899
+ },
3900
+ {
3901
+ name: "quote",
3902
+ icon: "quote",
3903
+ title: "引用",
3904
+ run: () => togglePrefix("> ")
3905
+ },
3906
+ {
3907
+ name: "ul",
3908
+ icon: "list-unordered",
3909
+ title: "无序列表",
3910
+ run: () => togglePrefix("- ")
3911
+ },
3912
+ {
3913
+ name: "ol",
3914
+ icon: "list-ordered",
3915
+ title: "有序列表",
3916
+ run: () => togglePrefix("1. ")
3917
+ },
3918
+ {
3919
+ name: "link",
3920
+ icon: "link",
3921
+ title: "链接",
3922
+ run: () => surround("[", "](https://)", "链接文字")
3923
+ }
3924
+ ];
3925
+ function onKeydown(e) {
3926
+ if (props.disabled) return;
3927
+ if (!(e.metaKey ? true : e.ctrlKey)) return;
3928
+ if (e.key === "b") {
3929
+ e.preventDefault();
3930
+ surround("**", "**", "加粗文本");
3931
+ }
3932
+ if (e.key === "i") {
3933
+ e.preventDefault();
3934
+ surround("*", "*", "斜体文本");
3935
+ }
3936
+ }
3937
+ return (_ctx, _cache) => {
3938
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ev-md-editor", { "is-disabled": __props.disabled }]) }, [__props.toolbar ? (openBlock(), createElementBlock("div", _hoisted_1$33, [
3939
+ (openBlock(), createElementBlock(Fragment, null, renderList(actions, (act) => {
3940
+ return createElementVNode("button", {
3941
+ key: act.name,
3942
+ type: "button",
3943
+ class: "ev-md-editor__btn",
3944
+ title: act.title,
3945
+ "aria-label": act.title,
3946
+ disabled: __props.disabled,
3947
+ onClick: act.run
3948
+ }, [createVNode(_sfc_main$24, {
3949
+ name: act.icon,
3950
+ size: 15
3951
+ }, null, 8, ["name"])], 8, _hoisted_2$29);
3952
+ }), 64)),
3953
+ _cache[2] || (_cache[2] = createElementVNode("span", { class: "ev-md-editor__spacer" }, null, -1)),
3954
+ __props.preview === "toggle" ? (openBlock(), createElementBlock("div", _hoisted_3$22, [createElementVNode("button", {
3955
+ type: "button",
3956
+ class: normalizeClass(["ev-md-editor__tab", { "is-active": tab.value === "edit" }]),
3957
+ onClick: _cache[0] || (_cache[0] = ($event) => tab.value = "edit")
3958
+ }, " 编辑 ", 2), createElementVNode("button", {
3959
+ type: "button",
3960
+ class: normalizeClass(["ev-md-editor__tab", { "is-active": tab.value === "preview" }]),
3961
+ onClick: _cache[1] || (_cache[1] = ($event) => tab.value = "preview")
3962
+ }, " 预览 ", 2)])) : createCommentVNode("", true)
3963
+ ])) : createCommentVNode("", true), createElementVNode("div", {
3964
+ class: normalizeClass(["ev-md-editor__panes", { "is-single": isSingle.value }]),
3965
+ style: normalizeStyle(panesStyle.value)
3966
+ }, [withDirectives(createElementVNode("textarea", {
3967
+ ref_key: "inputRef",
3968
+ ref: inputRef,
3969
+ class: "ev-md-editor__input",
3970
+ value: __props.modelValue,
3971
+ placeholder: __props.placeholder,
3972
+ disabled: __props.disabled,
3973
+ onInput,
3974
+ onKeydown
3975
+ }, null, 40, _hoisted_4$20), [[vShow, showInput.value]]), withDirectives(createElementVNode("div", _hoisted_5$15, [createVNode(_sfc_main$33, { content: __props.modelValue }, null, 8, ["content"])], 512), [[vShow, showPreview.value]])], 6)], 2);
3324
3976
  };
3325
3977
  }
3326
3978
  };
3327
3979
  //#endregion
3328
3980
  //#region src/components/keycap/index.vue
3329
- var _hoisted_1$31 = { class: "ew-keycap" };
3981
+ var _hoisted_1$32 = { class: "ev-keycap" };
3330
3982
  var _sfc_main$30 = {
3331
3983
  __name: "index",
3332
3984
  props: {
@@ -3337,16 +3989,16 @@ keys: {
3337
3989
  } },
3338
3990
  setup(__props) {
3339
3991
  /**
3340
- * EwKeycap — 键盘按键展示(remixdesign「Press c to copy」语言)
3992
+ * EvKeycap — 键盘按键展示(remixdesign「Press c to copy」语言)
3341
3993
  * keys 传字符串(拆成单键)或数组(组合键)
3342
3994
  */
3343
3995
  const props = __props;
3344
3996
  const keys = computed(() => Array.isArray(props.keys) ? props.keys : String(props.keys).split(""));
3345
3997
  return (_ctx, _cache) => {
3346
- return openBlock(), createElementBlock("span", _hoisted_1$31, [(openBlock(true), createElementBlock(Fragment, null, renderList(keys.value, (k, i) => {
3998
+ return openBlock(), createElementBlock("span", _hoisted_1$32, [(openBlock(true), createElementBlock(Fragment, null, renderList(keys.value, (k, i) => {
3347
3999
  return openBlock(), createElementBlock("kbd", {
3348
4000
  key: i,
3349
- class: "ew-keycap__key"
4001
+ class: "ev-keycap__key"
3350
4002
  }, toDisplayString(k), 1);
3351
4003
  }), 128))]);
3352
4004
  };
@@ -3376,18 +4028,18 @@ function onInView(el, onEnter, onFallback, options = {}) {
3376
4028
  }
3377
4029
  //#endregion
3378
4030
  //#region src/components/statistic/index.vue
3379
- var _hoisted_1$30 = { class: "ew-statistic__value" };
3380
- var _hoisted_2$27 = {
4031
+ var _hoisted_1$31 = { class: "ev-statistic__value" };
4032
+ var _hoisted_2$28 = {
3381
4033
  key: 0,
3382
- class: "ew-statistic__sizer",
4034
+ class: "ev-statistic__sizer",
3383
4035
  "aria-hidden": "true"
3384
4036
  };
3385
- var _hoisted_3$20 = { class: "ew-statistic__num" };
4037
+ var _hoisted_3$21 = { class: "ev-statistic__num" };
3386
4038
  var _hoisted_4$19 = {
3387
4039
  key: 0,
3388
- class: "ew-statistic__label"
4040
+ class: "ev-statistic__label"
3389
4041
  };
3390
- var _sfc_main$45 = {
4042
+ var _sfc_main$47 = {
3391
4043
  __name: "index",
3392
4044
  props: {
3393
4045
  value: {
@@ -3421,7 +4073,7 @@ var _sfc_main$45 = {
3421
4073
  },
3422
4074
  setup(__props) {
3423
4075
  /**
3424
- * EwStatistic — 数据指标(GitHub Star 数 / 下载量等社会证明位)
4076
+ * EvStatistic — 数据指标(GitHub Star 数 / 下载量等社会证明位)
3425
4077
  * animated 开启后:数值在进入视口时从 0 缓动滚动到目标值
3426
4078
  * (自动解析「前缀 + 数字 + 后缀」:¥120.5 / 99.99% / 1,200+;无法解析的纯文案直接显示)
3427
4079
  */
@@ -3486,14 +4138,14 @@ var _sfc_main$45 = {
3486
4138
  return openBlock(), createElementBlock("div", {
3487
4139
  ref_key: "rootRef",
3488
4140
  ref: rootRef,
3489
- class: normalizeClass(["ew-statistic", `is-${__props.align}`])
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);
4141
+ class: normalizeClass(["ev-statistic", `is-${__props.align}`])
4142
+ }, [createElementVNode("div", _hoisted_1$31, [__props.animated && sizerText.value ? (openBlock(), createElementBlock("span", _hoisted_2$28, toDisplayString(sizerText.value), 1)) : createCommentVNode("", true), createElementVNode("span", _hoisted_3$21, [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);
3491
4143
  };
3492
4144
  }
3493
4145
  };
3494
4146
  //#endregion
3495
4147
  //#region src/components/theme-toggle/index.vue
3496
- var _sfc_main$52 = {
4148
+ var _sfc_main$54 = {
3497
4149
  __name: "index",
3498
4150
  props: {
3499
4151
  variant: {
@@ -3511,7 +4163,7 @@ var _sfc_main$52 = {
3511
4163
  },
3512
4164
  setup(__props) {
3513
4165
  /**
3514
- * EwThemeToggle — 明暗主题切换按钮
4166
+ * EvThemeToggle — 明暗主题切换按钮
3515
4167
  * 基于 useTheme(html.dark 驱动暗色令牌重映射),日/月图标随状态切换
3516
4168
  */
3517
4169
  const { isDark, toggleTheme } = useTheme();
@@ -3536,15 +4188,15 @@ var _sfc_main$52 = {
3536
4188
  };
3537
4189
  //#endregion
3538
4190
  //#region src/components/quote/index.vue
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" };
4191
+ var _hoisted_1$30 = { class: "ev-quote__text" };
4192
+ var _hoisted_2$27 = { class: "ev-quote__author" };
4193
+ var _hoisted_3$20 = { class: "ev-quote__name" };
3542
4194
  var _hoisted_4$18 = {
3543
4195
  key: 0,
3544
- class: "ew-quote__role"
4196
+ class: "ev-quote__role"
3545
4197
  };
3546
4198
  var _hoisted_5$14 = ["href"];
3547
- var _sfc_main$41 = {
4199
+ var _sfc_main$43 = {
3548
4200
  __name: "index",
3549
4201
  props: {
3550
4202
  quote: {
@@ -3575,18 +4227,18 @@ var _sfc_main$41 = {
3575
4227
  },
3576
4228
  setup(__props) {
3577
4229
  /**
3578
- * EwQuote — 引用/评价卡(launchos 用户评价语言)
4230
+ * EvQuote — 引用/评价卡(launchos 用户评价语言)
3579
4231
  */
3580
4232
  return (_ctx, _cache) => {
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),
4233
+ return openBlock(), createElementBlock("figure", { class: normalizeClass(["ev-quote", { "is-sticker": __props.sticker }]) }, [createElementVNode("blockquote", _hoisted_1$30, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.quote), 1)])]), createElementVNode("figcaption", _hoisted_2$27, [renderSlot(_ctx.$slots, "author", {}, () => [
4234
+ createElementVNode("span", _hoisted_3$20, toDisplayString(__props.author), 1),
3583
4235
  __props.role ? (openBlock(), createElementBlock("span", _hoisted_4$18, toDisplayString(__props.role), 1)) : createCommentVNode("", true),
3584
4236
  __props.source && __props.sourceHref ? (openBlock(), createElementBlock("a", {
3585
4237
  key: 1,
3586
4238
  href: __props.sourceHref,
3587
4239
  target: "_blank",
3588
4240
  rel: "noopener",
3589
- class: "ew-quote__source"
4241
+ class: "ev-quote__source"
3590
4242
  }, [createTextVNode(toDisplayString(__props.source) + " ", 1), createVNode(_sfc_main$24, {
3591
4243
  name: "external-link",
3592
4244
  size: 12
@@ -3647,9 +4299,9 @@ var _sfc_main$14 = {
3647
4299
  },
3648
4300
  setup(__props) {
3649
4301
  /**
3650
- * EwConfigProvider — 主题配置提供者
4302
+ * EvConfigProvider — 主题配置提供者
3651
4303
  *
3652
- * props 变化时把对应的 --ew-* 令牌写入 :root(global,默认)或包裹元素,
4304
+ * props 变化时把对应的 --ev-* 令牌写入 :root(global,默认)或包裹元素,
3653
4305
  * 全库组件经令牌取值,主题即时生效;淡色阶(light-3…9/dark-2)由主色自动生成。
3654
4306
  *
3655
4307
  * props:primary(hex) / radius('sharp'|'soft'|'default'|'round') /
@@ -3679,17 +4331,17 @@ var _sfc_main$14 = {
3679
4331
  }, { immediate: true });
3680
4332
  watch(() => props.glass, (on) => {
3681
4333
  if (typeof document === "undefined") return;
3682
- if (on) document.documentElement.setAttribute("data-ew-glass", "on");
3683
- else document.documentElement.removeAttribute("data-ew-glass");
4334
+ if (on) document.documentElement.setAttribute("data-ev-glass", "on");
4335
+ else document.documentElement.removeAttribute("data-ev-glass");
3684
4336
  }, { immediate: true });
3685
4337
  onUnmounted(() => {
3686
4338
  if (typeof document === "undefined") return;
3687
- document.documentElement.removeAttribute("data-ew-glass");
4339
+ document.documentElement.removeAttribute("data-ev-glass");
3688
4340
  });
3689
4341
  return (_ctx, _cache) => {
3690
4342
  return !__props.global ? (openBlock(), createElementBlock("div", {
3691
4343
  key: 0,
3692
- class: "ew-config-provider",
4344
+ class: "ev-config-provider",
3693
4345
  style: normalizeStyle(scopedStyle.value)
3694
4346
  }, [renderSlot(_ctx.$slots, "default")], 4)) : renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 1);
3695
4347
  };
@@ -3697,9 +4349,9 @@ var _sfc_main$14 = {
3697
4349
  };
3698
4350
  //#endregion
3699
4351
  //#region src/components/tabs/index.vue
3700
- var _hoisted_1$28 = ["aria-selected", "onClick"];
3701
- var _hoisted_2$25 = ["aria-selected", "onClick"];
3702
- var _sfc_main$49 = {
4352
+ var _hoisted_1$29 = ["aria-selected", "onClick"];
4353
+ var _hoisted_2$26 = ["aria-selected", "onClick"];
4354
+ var _sfc_main$51 = {
3703
4355
  __name: "index",
3704
4356
  props: {
3705
4357
  /** 当前值(v-model) */
@@ -3735,7 +4387,7 @@ var _sfc_main$49 = {
3735
4387
  emits: ["update:modelValue", "change"],
3736
4388
  setup(__props, { emit: __emit }) {
3737
4389
  /**
3738
- * EwTabs — 标签页/分段控件
4390
+ * EvTabs — 标签页/分段控件
3739
4391
  * variant:capsule 分段胶囊(灰轨道 + 弹性滑块跟随)/ underline 下划线
3740
4392
  * 滑块位置随激活项平滑移动(resize 自适应)
3741
4393
  */
@@ -3802,7 +4454,7 @@ var _sfc_main$49 = {
3802
4454
  return (_ctx, _cache) => {
3803
4455
  return openBlock(), createElementBlock("div", {
3804
4456
  class: normalizeClass([
3805
- "ew-tabs",
4457
+ "ev-tabs",
3806
4458
  `is-${__props.variant}`,
3807
4459
  `is-${__props.size}`
3808
4460
  ]),
@@ -3811,7 +4463,7 @@ var _sfc_main$49 = {
3811
4463
  ref: trackRef
3812
4464
  }, [__props.variant === "capsule" ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [thumbReady.value ? (openBlock(), createElementBlock("span", {
3813
4465
  key: 0,
3814
- class: "ew-tabs__thumb",
4466
+ class: "ev-tabs__thumb",
3815
4467
  style: normalizeStyle(thumbStyle.value),
3816
4468
  "aria-hidden": "true"
3817
4469
  }, null, 4)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
@@ -3822,7 +4474,7 @@ var _sfc_main$49 = {
3822
4474
  type: "button",
3823
4475
  role: "tab",
3824
4476
  "aria-selected": unref(current) === item.value,
3825
- class: normalizeClass(["ew-tabs__item", {
4477
+ class: normalizeClass(["ev-tabs__item", {
3826
4478
  "is-active": unref(current) === item.value,
3827
4479
  "is-disabled": item.disabled
3828
4480
  }]),
@@ -3831,14 +4483,14 @@ var _sfc_main$49 = {
3831
4483
  key: 0,
3832
4484
  name: item.icon,
3833
4485
  size: iconSize.value
3834
- }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(item.label), 1)], 10, _hoisted_1$28);
4486
+ }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(item.label), 1)], 10, _hoisted_1$29);
3835
4487
  }), 128))], 64)) : (openBlock(true), createElementBlock(Fragment, { key: 1 }, renderList(__props.items, (item) => {
3836
4488
  return openBlock(), createElementBlock("button", {
3837
4489
  key: item.value,
3838
4490
  type: "button",
3839
4491
  role: "tab",
3840
4492
  "aria-selected": unref(current) === item.value,
3841
- class: normalizeClass(["ew-tabs__item", {
4493
+ class: normalizeClass(["ev-tabs__item", {
3842
4494
  "is-active": unref(current) === item.value,
3843
4495
  "is-disabled": item.disabled
3844
4496
  }]),
@@ -3847,15 +4499,15 @@ var _sfc_main$49 = {
3847
4499
  key: 0,
3848
4500
  name: item.icon,
3849
4501
  size: iconSize.value
3850
- }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(item.label), 1)], 10, _hoisted_2$25);
4502
+ }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(item.label), 1)], 10, _hoisted_2$26);
3851
4503
  }), 128))], 2);
3852
4504
  };
3853
4505
  }
3854
4506
  };
3855
4507
  //#endregion
3856
4508
  //#region src/components/switch-comp/index.vue
3857
- var _hoisted_1$27 = ["aria-checked", "disabled"];
3858
- var _sfc_main$46 = {
4509
+ var _hoisted_1$28 = ["aria-checked", "disabled"];
4510
+ var _sfc_main$48 = {
3859
4511
  __name: "index",
3860
4512
  props: {
3861
4513
  /** 当前状态(v-model) */
@@ -3885,7 +4537,7 @@ var _sfc_main$46 = {
3885
4537
  emits: ["update:modelValue", "change"],
3886
4538
  setup(__props, { emit: __emit }) {
3887
4539
  /**
3888
- * EwSwitch — 开关
4540
+ * EvSwitch — 开关
3889
4541
  * 受控(v-model)与非受控(不传 modelValue,配 default-value 定初值)双模式
3890
4542
  */
3891
4543
  const props = __props;
@@ -3900,7 +4552,7 @@ var _sfc_main$46 = {
3900
4552
  return (_ctx, _cache) => {
3901
4553
  return openBlock(), createElementBlock("button", {
3902
4554
  class: normalizeClass([
3903
- "ew-switch",
4555
+ "ev-switch",
3904
4556
  `is-${__props.size}`,
3905
4557
  {
3906
4558
  "is-on": unref(checked),
@@ -3911,13 +4563,13 @@ var _sfc_main$46 = {
3911
4563
  "aria-checked": unref(checked),
3912
4564
  disabled: __props.disabled,
3913
4565
  onClick: toggle
3914
- }, [..._cache[0] || (_cache[0] = [createElementVNode("span", { class: "ew-switch__knob" }, null, -1)])], 10, _hoisted_1$27);
4566
+ }, [..._cache[0] || (_cache[0] = [createElementVNode("span", { class: "ev-switch__knob" }, null, -1)])], 10, _hoisted_1$28);
3915
4567
  };
3916
4568
  }
3917
4569
  };
3918
4570
  //#endregion
3919
4571
  //#region src/components/container/index.vue
3920
- var _sfc_main$16 = /*@__PURE__*/ Object.assign({ name: "EwContainer" }, {
4572
+ var _sfc_main$16 = /*@__PURE__*/ Object.assign({ name: "EvContainer" }, {
3921
4573
  __name: "index",
3922
4574
  props: {
3923
4575
  width: {
@@ -3937,7 +4589,7 @@ var _sfc_main$16 = /*@__PURE__*/ Object.assign({ name: "EwContainer" }, {
3937
4589
  },
3938
4590
  setup(__props) {
3939
4591
  return (_ctx, _cache) => {
3940
- return openBlock(), createBlock(resolveDynamicComponent(__props.as), { class: normalizeClass(["ew-container", `is-${__props.width}`]) }, {
4592
+ return openBlock(), createBlock(resolveDynamicComponent(__props.as), { class: normalizeClass(["ev-container", `is-${__props.width}`]) }, {
3941
4593
  default: withCtx(() => [renderSlot(_ctx.$slots, "default")]),
3942
4594
  _: 3
3943
4595
  }, 8, ["class"]);
@@ -3946,10 +4598,10 @@ var _sfc_main$16 = /*@__PURE__*/ Object.assign({ name: "EwContainer" }, {
3946
4598
  });
3947
4599
  //#endregion
3948
4600
  //#region src/components/avatar/index.vue
3949
- var _hoisted_1$26 = ["src", "alt"];
3950
- var _hoisted_2$24 = {
4601
+ var _hoisted_1$27 = ["src", "alt"];
4602
+ var _hoisted_2$25 = {
3951
4603
  key: 2,
3952
- class: "ew-avatar__fallback"
4604
+ class: "ev-avatar__fallback"
3953
4605
  };
3954
4606
  var _sfc_main$5 = {
3955
4607
  __name: "index",
@@ -3983,7 +4635,7 @@ var _sfc_main$5 = {
3983
4635
  },
3984
4636
  setup(__props) {
3985
4637
  /**
3986
- * EwAvatar — 头像(用户/团队/评价位)
4638
+ * EvAvatar — 头像(用户/团队/评价位)
3987
4639
  * src 图片缺失或加载失败时回退到 name 首字符
3988
4640
  */
3989
4641
  const props = __props;
@@ -4011,7 +4663,7 @@ var _sfc_main$5 = {
4011
4663
  return (_ctx, _cache) => {
4012
4664
  return openBlock(), createElementBlock("span", {
4013
4665
  class: normalizeClass([
4014
- "ew-avatar",
4666
+ "ev-avatar",
4015
4667
  `is-${__props.shape}`,
4016
4668
  `is-${sizeClass.value}`
4017
4669
  ]),
@@ -4020,19 +4672,19 @@ var _sfc_main$5 = {
4020
4672
  key: 0,
4021
4673
  src: __props.src,
4022
4674
  alt: __props.alt || __props.name,
4023
- class: "ew-avatar__img",
4675
+ class: "ev-avatar__img",
4024
4676
  onError: _cache[0] || (_cache[0] = ($event) => imgFailed.value = true)
4025
- }, null, 40, _hoisted_1$26)) : __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
4677
+ }, null, 40, _hoisted_1$27)) : __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
4026
4678
  key: 1,
4027
4679
  name: __props.icon,
4028
4680
  size: iconSize.value
4029
- }, null, 8, ["name", "size"])) : (openBlock(), createElementBlock("span", _hoisted_2$24, toDisplayString(initials.value), 1))], 6);
4681
+ }, null, 8, ["name", "size"])) : (openBlock(), createElementBlock("span", _hoisted_2$25, toDisplayString(initials.value), 1))], 6);
4030
4682
  };
4031
4683
  }
4032
4684
  };
4033
4685
  //#endregion
4034
4686
  //#region src/components/avatar/group.vue
4035
- var _hoisted_1$25 = { class: "ew-avatar-group" };
4687
+ var _hoisted_1$26 = { class: "ev-avatar-group" };
4036
4688
  var _sfc_main$6 = {
4037
4689
  __name: "group",
4038
4690
  props: {
@@ -4047,7 +4699,7 @@ var _sfc_main$6 = {
4047
4699
  },
4048
4700
  setup(__props) {
4049
4701
  /**
4050
- * EwAvatarGroup — 头像组(层叠 + 溢出折叠为 +N)
4702
+ * EvAvatarGroup — 头像组(层叠 + 溢出折叠为 +N)
4051
4703
  * items:[{ src?, name?, icon?, alt? }];max 限制直接展示数量
4052
4704
  * 默认插槽可追加自定义头像(置于折叠计数之前)
4053
4705
  */
@@ -4066,14 +4718,14 @@ var _sfc_main$6 = {
4066
4718
  };
4067
4719
  });
4068
4720
  return (_ctx, _cache) => {
4069
- return openBlock(), createElementBlock("div", _hoisted_1$25, [
4721
+ return openBlock(), createElementBlock("div", _hoisted_1$26, [
4070
4722
  (openBlock(true), createElementBlock(Fragment, null, renderList(shown.value, (item, i) => {
4071
4723
  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"]);
4072
4724
  }), 128)),
4073
4725
  renderSlot(_ctx.$slots, "default"),
4074
4726
  overflow.value > 0 ? (openBlock(), createElementBlock("span", {
4075
4727
  key: 0,
4076
- class: "ew-avatar-group__more",
4728
+ class: "ev-avatar-group__more",
4077
4729
  style: normalizeStyle(moreStyle.value)
4078
4730
  }, "+" + toDisplayString(overflow.value), 5)) : createCommentVNode("", true)
4079
4731
  ]);
@@ -4082,18 +4734,18 @@ var _sfc_main$6 = {
4082
4734
  };
4083
4735
  //#endregion
4084
4736
  //#region src/components/timeline/index.vue
4085
- var _hoisted_1$24 = { class: "ew-timeline" };
4086
- var _hoisted_2$23 = { class: "ew-timeline__meta" };
4087
- var _hoisted_3$18 = {
4737
+ var _hoisted_1$25 = { class: "ev-timeline" };
4738
+ var _hoisted_2$24 = { class: "ev-timeline__meta" };
4739
+ var _hoisted_3$19 = {
4088
4740
  key: 0,
4089
- class: "ew-timeline__date"
4741
+ class: "ev-timeline__date"
4090
4742
  };
4091
- var _hoisted_4$17 = { class: "ew-timeline__title" };
4743
+ var _hoisted_4$17 = { class: "ev-timeline__title" };
4092
4744
  var _hoisted_5$13 = {
4093
4745
  key: 0,
4094
- class: "ew-timeline__description"
4746
+ class: "ev-timeline__description"
4095
4747
  };
4096
- var _sfc_main$53 = {
4748
+ var _sfc_main$55 = {
4097
4749
  __name: "index",
4098
4750
  props: {
4099
4751
  items: {
@@ -4108,20 +4760,20 @@ var _sfc_main$53 = {
4108
4760
  },
4109
4761
  setup(__props) {
4110
4762
  /**
4111
- * EwTimeline — 时间线/更新日志
4763
+ * EvTimeline — 时间线/更新日志
4112
4764
  * items:[{ date?, tag?, tagTone?, title, description? }],最新一条默认高亮圆点
4113
4765
  */
4114
4766
  return (_ctx, _cache) => {
4115
- return openBlock(), createElementBlock("div", _hoisted_1$24, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
4767
+ return openBlock(), createElementBlock("div", _hoisted_1$25, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
4116
4768
  return openBlock(), createElementBlock("div", {
4117
4769
  key: i,
4118
- class: normalizeClass(["ew-timeline__item", { "is-latest": i === 0 && __props.highlightLatest }])
4770
+ class: normalizeClass(["ev-timeline__item", { "is-latest": i === 0 && __props.highlightLatest }])
4119
4771
  }, [
4120
4772
  _cache[0] || (_cache[0] = createElementVNode("span", {
4121
- class: "ew-timeline__dot",
4773
+ class: "ev-timeline__dot",
4122
4774
  "aria-hidden": "true"
4123
4775
  }, null, -1)),
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, {
4776
+ createElementVNode("div", _hoisted_2$24, [item.date ? (openBlock(), createElementBlock("span", _hoisted_3$19, toDisplayString(item.date), 1)) : createCommentVNode("", true), item.tag ? (openBlock(), createBlock(_sfc_main$52, {
4125
4777
  key: 1,
4126
4778
  tone: item.tagTone || "primary",
4127
4779
  size: "small"
@@ -4144,29 +4796,29 @@ var _sfc_main$53 = {
4144
4796
  };
4145
4797
  //#endregion
4146
4798
  //#region src/components/comparison-table/index.vue
4147
- var _hoisted_1$23 = { class: "ew-comparison-table" };
4148
- var _hoisted_2$22 = {
4149
- class: "ew-comparison-table__feature-col",
4799
+ var _hoisted_1$24 = { class: "ev-comparison-table" };
4800
+ var _hoisted_2$23 = {
4801
+ class: "ev-comparison-table__feature-col",
4150
4802
  scope: "col"
4151
4803
  };
4152
- var _hoisted_3$17 = { class: "ew-comparison-table__col-label" };
4804
+ var _hoisted_3$18 = { class: "ev-comparison-table__col-label" };
4153
4805
  var _hoisted_4$16 = {
4154
4806
  key: 0,
4155
- class: "ew-comparison-table__col-note"
4807
+ class: "ev-comparison-table__col-note"
4156
4808
  };
4157
- var _hoisted_5$12 = { class: "ew-comparison-table__feature-col" };
4158
- var _hoisted_6$7 = { class: "ew-comparison-table__feature-label" };
4809
+ var _hoisted_5$12 = { class: "ev-comparison-table__feature-col" };
4810
+ var _hoisted_6$7 = { class: "ev-comparison-table__feature-label" };
4159
4811
  var _hoisted_7$5 = {
4160
4812
  key: 0,
4161
- class: "ew-comparison-table__feature-desc"
4813
+ class: "ev-comparison-table__feature-desc"
4162
4814
  };
4163
4815
  var _hoisted_8$4 = {
4164
4816
  key: 1,
4165
- class: "ew-comparison-table__dash"
4817
+ class: "ev-comparison-table__dash"
4166
4818
  };
4167
4819
  var _hoisted_9$2 = {
4168
4820
  key: 2,
4169
- class: "ew-comparison-table__text"
4821
+ class: "ev-comparison-table__text"
4170
4822
  };
4171
4823
  var _sfc_main$13 = {
4172
4824
  __name: "index",
@@ -4186,17 +4838,17 @@ var _sfc_main$13 = {
4186
4838
  },
4187
4839
  setup(__props) {
4188
4840
  /**
4189
- * EwComparisonTable — 功能对比表(定价区标配)
4841
+ * EvComparisonTable — 功能对比表(定价区标配)
4190
4842
  * columns:[{ label, note?, featured? }]
4191
4843
  * rows:[{ label, description?, values: (boolean|string)[] }] — true 勾 / false 破折号 / 字符串直出
4192
4844
  */
4193
4845
  return (_ctx, _cache) => {
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) => {
4846
+ return openBlock(), createElementBlock("div", _hoisted_1$24, [createElementVNode("table", null, [createElementVNode("thead", null, [createElementVNode("tr", null, [createElementVNode("th", _hoisted_2$23, [renderSlot(_ctx.$slots, "feature-head", {}, () => [createTextVNode(toDisplayString(__props.featureHead), 1)])]), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (col) => {
4195
4847
  return openBlock(), createElementBlock("th", {
4196
4848
  key: col.label,
4197
4849
  scope: "col",
4198
4850
  class: normalizeClass({ "is-featured": col.featured })
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);
4851
+ }, [createElementVNode("span", _hoisted_3$18, toDisplayString(col.label), 1), col.note ? (openBlock(), createElementBlock("span", _hoisted_4$16, toDisplayString(col.note), 1)) : createCommentVNode("", true)], 2);
4200
4852
  }), 128))])]), createElementVNode("tbody", null, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.rows, (row, i) => {
4201
4853
  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) => {
4202
4854
  return openBlock(), createElementBlock("td", {
@@ -4206,7 +4858,7 @@ var _sfc_main$13 = {
4206
4858
  key: 0,
4207
4859
  name: "check",
4208
4860
  size: 16,
4209
- class: "ew-comparison-table__check"
4861
+ class: "ev-comparison-table__check"
4210
4862
  })) : row.values[j] === false ? (openBlock(), createElementBlock("span", _hoisted_8$4, "—")) : (openBlock(), createElementBlock("span", _hoisted_9$2, toDisplayString(row.values[j]), 1))], 2);
4211
4863
  }), 128))]);
4212
4864
  }), 128))])])]);
@@ -4215,18 +4867,18 @@ var _sfc_main$13 = {
4215
4867
  };
4216
4868
  //#endregion
4217
4869
  //#region src/components/cta/index.vue
4218
- var _hoisted_1$22 = { class: "ew-cta__title" };
4219
- var _hoisted_2$21 = {
4870
+ var _hoisted_1$23 = { class: "ev-cta__title" };
4871
+ var _hoisted_2$22 = {
4220
4872
  key: 0,
4221
- class: "ew-cta__description"
4873
+ class: "ev-cta__description"
4222
4874
  };
4223
- var _hoisted_3$16 = {
4875
+ var _hoisted_3$17 = {
4224
4876
  key: 1,
4225
- class: "ew-cta__actions"
4877
+ class: "ev-cta__actions"
4226
4878
  };
4227
4879
  var _hoisted_4$15 = {
4228
4880
  key: 2,
4229
- class: "ew-cta__body"
4881
+ class: "ev-cta__body"
4230
4882
  };
4231
4883
  var _sfc_main$17 = {
4232
4884
  __name: "index",
@@ -4256,17 +4908,17 @@ var _sfc_main$17 = {
4256
4908
  },
4257
4909
  setup(__props) {
4258
4910
  /**
4259
- * EwCta — 行动召唤区(官网转化收尾)
4911
+ * EvCta — 行动召唤区(官网转化收尾)
4260
4912
  */
4261
4913
  return (_ctx, _cache) => {
4262
- return openBlock(), createElementBlock("section", { class: normalizeClass(["ew-cta", { "is-tinted": __props.tinted }]) }, [createVNode(_sfc_main$16, {
4914
+ return openBlock(), createElementBlock("section", { class: normalizeClass(["ev-cta", { "is-tinted": __props.tinted }]) }, [createVNode(_sfc_main$16, {
4263
4915
  width: __props.container,
4264
- class: "ew-cta__inner"
4916
+ class: "ev-cta__inner"
4265
4917
  }, {
4266
4918
  default: withCtx(() => [
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),
4919
+ createElementVNode("h2", _hoisted_1$23, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
4920
+ __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_2$22, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
4921
+ _ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_3$17, [renderSlot(_ctx.$slots, "actions")])) : createCommentVNode("", true),
4270
4922
  _ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_4$15, [renderSlot(_ctx.$slots, "default")])) : createCommentVNode("", true)
4271
4923
  ]),
4272
4924
  _: 3
@@ -4276,12 +4928,12 @@ var _sfc_main$17 = {
4276
4928
  };
4277
4929
  //#endregion
4278
4930
  //#region src/components/newsletter/index.vue
4279
- var _hoisted_1$21 = ["placeholder", "aria-label"];
4280
- var _hoisted_2$20 = {
4931
+ var _hoisted_1$22 = ["placeholder", "aria-label"];
4932
+ var _hoisted_2$21 = {
4281
4933
  key: 1,
4282
- class: "ew-newsletter__done"
4934
+ class: "ev-newsletter__done"
4283
4935
  };
4284
- var _sfc_main$37 = {
4936
+ var _sfc_main$39 = {
4285
4937
  __name: "index",
4286
4938
  props: {
4287
4939
  placeholder: {
@@ -4320,22 +4972,22 @@ var _sfc_main$37 = {
4320
4972
  }
4321
4973
  return (_ctx, _cache) => {
4322
4974
  return openBlock(), createElementBlock("form", {
4323
- class: normalizeClass(["ew-newsletter", { "is-subscribed": subscribed.value }]),
4975
+ class: normalizeClass(["ev-newsletter", { "is-subscribed": subscribed.value }]),
4324
4976
  onSubmit: withModifiers(onSubmit, ["prevent"])
4325
4977
  }, [!subscribed.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
4326
4978
  createVNode(_sfc_main$24, {
4327
4979
  name: "mail",
4328
4980
  size: 18,
4329
- class: "ew-newsletter__icon"
4981
+ class: "ev-newsletter__icon"
4330
4982
  }),
4331
4983
  withDirectives(createElementVNode("input", {
4332
4984
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => email.value = $event),
4333
- class: "ew-newsletter__input",
4985
+ class: "ev-newsletter__input",
4334
4986
  type: "email",
4335
4987
  required: "",
4336
4988
  placeholder: __props.placeholder,
4337
4989
  "aria-label": __props.placeholder
4338
- }, null, 8, _hoisted_1$21), [[
4990
+ }, null, 8, _hoisted_1$22), [[
4339
4991
  vModelText,
4340
4992
  email.value,
4341
4993
  void 0,
@@ -4354,22 +5006,22 @@ var _sfc_main$37 = {
4354
5006
  "loading",
4355
5007
  "disabled"
4356
5008
  ])
4357
- ], 64)) : (openBlock(), createElementBlock("span", _hoisted_2$20, [createVNode(_sfc_main$24, {
5009
+ ], 64)) : (openBlock(), createElementBlock("span", _hoisted_2$21, [createVNode(_sfc_main$24, {
4358
5010
  name: "check",
4359
5011
  size: 16,
4360
- class: "ew-newsletter__done-icon"
5012
+ class: "ev-newsletter__done-icon"
4361
5013
  }), renderSlot(_ctx.$slots, "subscribed", {}, () => [createTextVNode(toDisplayString(__props.subscribedText), 1)])]))], 34);
4362
5014
  };
4363
5015
  }
4364
5016
  };
4365
5017
  //#endregion
4366
5018
  //#region src/components/logo-cloud/index.vue
4367
- var _hoisted_1$20 = { class: "ew-logo-cloud" };
4368
- var _hoisted_2$19 = {
5019
+ var _hoisted_1$21 = { class: "ev-logo-cloud" };
5020
+ var _hoisted_2$20 = {
4369
5021
  key: 0,
4370
- class: "ew-logo-cloud__title"
5022
+ class: "ev-logo-cloud__title"
4371
5023
  };
4372
- var _hoisted_3$15 = { class: "ew-logo-cloud__label" };
5024
+ var _hoisted_3$16 = { class: "ev-logo-cloud__label" };
4373
5025
  var _sfc_main$32 = {
4374
5026
  __name: "index",
4375
5027
  props: {
@@ -4389,7 +5041,7 @@ var _sfc_main$32 = {
4389
5041
  },
4390
5042
  setup(__props) {
4391
5043
  /**
4392
- * EwLogoCloud — 用户/合作品牌墙
5044
+ * EvLogoCloud — 用户/合作品牌墙
4393
5045
  * 弱化的字标网格,社会证明位;items 为 [string] 或 [{ label, icon? }]
4394
5046
  */
4395
5047
  const props = __props;
@@ -4397,35 +5049,35 @@ var _sfc_main$32 = {
4397
5049
  const iconSize = computed(() => 20);
4398
5050
  const gridStyle = computed(() => props.columns ? { gridTemplateColumns: `repeat(${Number(props.columns)}, 1fr)` } : void 0);
4399
5051
  return (_ctx, _cache) => {
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", {
4401
- class: "ew-logo-cloud__grid",
5052
+ return openBlock(), createElementBlock("div", _hoisted_1$21, [__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("p", _hoisted_2$20, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])])) : createCommentVNode("", true), createElementVNode("div", {
5053
+ class: "ev-logo-cloud__grid",
4402
5054
  style: normalizeStyle(gridStyle.value)
4403
5055
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalizedItems.value, (item, i) => {
4404
5056
  return openBlock(), createElementBlock("div", {
4405
5057
  key: i,
4406
- class: "ew-logo-cloud__item"
5058
+ class: "ev-logo-cloud__item"
4407
5059
  }, [item.icon ? (openBlock(), createBlock(_sfc_main$24, {
4408
5060
  key: 0,
4409
5061
  name: item.icon,
4410
5062
  size: iconSize.value
4411
- }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", _hoisted_3$15, toDisplayString(item.label), 1)]);
5063
+ }, null, 8, ["name", "size"])) : createCommentVNode("", true), createElementVNode("span", _hoisted_3$16, toDisplayString(item.label), 1)]);
4412
5064
  }), 128))], 4)]);
4413
5065
  };
4414
5066
  }
4415
5067
  };
4416
5068
  //#endregion
4417
5069
  //#region src/components/video/index.vue
4418
- var _hoisted_1$19 = { class: "ew-video" };
4419
- var _hoisted_2$18 = ["poster", "src"];
4420
- var _hoisted_3$14 = {
5070
+ var _hoisted_1$20 = { class: "ev-video" };
5071
+ var _hoisted_2$19 = ["poster", "src"];
5072
+ var _hoisted_3$15 = {
4421
5073
  key: 2,
4422
- class: "ew-video__placeholder"
5074
+ class: "ev-video__placeholder"
4423
5075
  };
4424
5076
  var _hoisted_4$14 = {
4425
5077
  key: 0,
4426
- class: "ew-video__caption"
5078
+ class: "ev-video__caption"
4427
5079
  };
4428
- var _sfc_main$54 = {
5080
+ var _sfc_main$56 = {
4429
5081
  __name: "index",
4430
5082
  props: {
4431
5083
  /** 视频地址 */
@@ -4457,7 +5109,7 @@ var _sfc_main$54 = {
4457
5109
  emits: ["play", "pause"],
4458
5110
  setup(__props, { emit: __emit }) {
4459
5111
  /**
4460
- * EwVideo — 视频区块(响应式画幅 + 可选文案)
5112
+ * EvVideo — 视频区块(响应式画幅 + 可选文案)
4461
5113
  * 默认渲染原生 video(src/poster);也可以用默认插槽嵌入 iframe(视频平台分享代码)
4462
5114
  */
4463
5115
  const props = __props;
@@ -4470,8 +5122,8 @@ var _sfc_main$54 = {
4470
5122
  };
4471
5123
  const frameStyle = computed(() => ({ paddingTop: RATIO[props.aspect] }));
4472
5124
  return (_ctx, _cache) => {
4473
- return openBlock(), createElementBlock("figure", _hoisted_1$19, [createElementVNode("div", {
4474
- class: "ew-video__frame",
5125
+ return openBlock(), createElementBlock("figure", _hoisted_1$20, [createElementVNode("div", {
5126
+ class: "ev-video__frame",
4475
5127
  style: normalizeStyle(frameStyle.value)
4476
5128
  }, [_ctx.$slots.default ? renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 0) : __props.src ? (openBlock(), createElementBlock("video", {
4477
5129
  key: 1,
@@ -4481,7 +5133,7 @@ var _sfc_main$54 = {
4481
5133
  src: __props.src,
4482
5134
  onPlay: _cache[0] || (_cache[0] = ($event) => emit("play")),
4483
5135
  onPause: _cache[1] || (_cache[1] = ($event) => emit("pause"))
4484
- }, null, 40, _hoisted_2$18)) : (openBlock(), createElementBlock("div", _hoisted_3$14, [createVNode(_sfc_main$24, {
5136
+ }, null, 40, _hoisted_2$19)) : (openBlock(), createElementBlock("div", _hoisted_3$15, [createVNode(_sfc_main$24, {
4485
5137
  name: "play-fill",
4486
5138
  size: 28
4487
5139
  }), _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)]);
@@ -4490,10 +5142,10 @@ var _sfc_main$54 = {
4490
5142
  };
4491
5143
  //#endregion
4492
5144
  //#region src/components/audio/index.vue
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" };
5145
+ var _hoisted_1$19 = { class: "ev-audio" };
5146
+ var _hoisted_2$18 = { class: "ev-audio__badge" };
5147
+ var _hoisted_3$14 = { class: "ev-audio__body" };
5148
+ var _hoisted_4$13 = { class: "ev-audio__title" };
4497
5149
  var _hoisted_5$11 = ["src"];
4498
5150
  var _sfc_main$4 = {
4499
5151
  __name: "index",
@@ -4510,51 +5162,51 @@ var _sfc_main$4 = {
4510
5162
  },
4511
5163
  setup(__props) {
4512
5164
  /**
4513
- * EwAudio — 音频卡片(节目/播客/语音介绍)
5165
+ * EvAudio — 音频卡片(节目/播客/语音介绍)
4514
5166
  * 标题行 + 原生播放控件;src 缺省时可用插槽承载自定义播放器
4515
5167
  */
4516
5168
  return (_ctx, _cache) => {
4517
- return openBlock(), createElementBlock("div", _hoisted_1$18, [createElementVNode("span", _hoisted_2$17, [createVNode(_sfc_main$24, {
5169
+ return openBlock(), createElementBlock("div", _hoisted_1$19, [createElementVNode("span", _hoisted_2$18, [createVNode(_sfc_main$24, {
4518
5170
  name: "music",
4519
5171
  size: 18
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", {
5172
+ })]), createElementVNode("div", _hoisted_3$14, [createElementVNode("div", _hoisted_4$13, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]), __props.src ? (openBlock(), createElementBlock("audio", {
4521
5173
  key: 0,
4522
5174
  controls: "",
4523
5175
  preload: "metadata",
4524
5176
  src: __props.src,
4525
- class: "ew-audio__player"
5177
+ class: "ev-audio__player"
4526
5178
  }, null, 8, _hoisted_5$11)) : renderSlot(_ctx.$slots, "default", {}, void 0, void 0, 1)])]);
4527
5179
  };
4528
5180
  }
4529
5181
  };
4530
5182
  //#endregion
4531
5183
  //#region src/components/contact-form/index.vue
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 = {
5184
+ var _hoisted_1$18 = { class: "ev-contact-form__row" };
5185
+ var _hoisted_2$17 = { class: "ev-contact-form__field" };
5186
+ var _hoisted_3$13 = {
4535
5187
  key: 0,
4536
- class: "ew-contact-form__error"
5188
+ class: "ev-contact-form__error"
4537
5189
  };
4538
- var _hoisted_4$12 = { class: "ew-contact-form__field" };
5190
+ var _hoisted_4$12 = { class: "ev-contact-form__field" };
4539
5191
  var _hoisted_5$10 = {
4540
5192
  key: 0,
4541
- class: "ew-contact-form__error"
5193
+ class: "ev-contact-form__error"
4542
5194
  };
4543
- var _hoisted_6$6 = { class: "ew-contact-form__field" };
5195
+ var _hoisted_6$6 = { class: "ev-contact-form__field" };
4544
5196
  var _hoisted_7$4 = {
4545
5197
  key: 0,
4546
- class: "ew-contact-form__error"
5198
+ class: "ev-contact-form__error"
4547
5199
  };
4548
- var _hoisted_8$3 = { class: "ew-contact-form__footer" };
5200
+ var _hoisted_8$3 = { class: "ev-contact-form__footer" };
4549
5201
  var _hoisted_9$1 = {
4550
5202
  key: 0,
4551
- class: "ew-contact-form__hint"
5203
+ class: "ev-contact-form__hint"
4552
5204
  };
4553
5205
  var _hoisted_10$1 = {
4554
5206
  key: 1,
4555
- class: "ew-contact-form__done"
5207
+ class: "ev-contact-form__done"
4556
5208
  };
4557
- var _hoisted_11$1 = { class: "ew-contact-form__done-text" };
5209
+ var _hoisted_11$1 = { class: "ev-contact-form__done-text" };
4558
5210
  var _sfc_main$15 = {
4559
5211
  __name: "index",
4560
5212
  props: {
@@ -4609,19 +5261,19 @@ var _sfc_main$15 = {
4609
5261
  });
4610
5262
  return (_ctx, _cache) => {
4611
5263
  return openBlock(), createElementBlock("form", {
4612
- class: "ew-contact-form",
5264
+ class: "ev-contact-form",
4613
5265
  novalidate: "",
4614
5266
  onSubmit: withModifiers(onSubmit, ["prevent"])
4615
5267
  }, [!sent.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
4616
- createElementVNode("div", _hoisted_1$17, [createElementVNode("div", _hoisted_2$16, [
5268
+ createElementVNode("div", _hoisted_1$18, [createElementVNode("div", _hoisted_2$17, [
4617
5269
  _cache[6] || (_cache[6] = createElementVNode("label", {
4618
- class: "ew-contact-form__label",
4619
- for: "ew-contact-name"
5270
+ class: "ev-contact-form__label",
5271
+ for: "ev-contact-name"
4620
5272
  }, "称呼", -1)),
4621
5273
  withDirectives(createElementVNode("input", {
4622
- id: "ew-contact-name",
5274
+ id: "ev-contact-name",
4623
5275
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => form.name = $event),
4624
- class: normalizeClass(["ew-contact-form__input", { "is-error": errors.name }]),
5276
+ class: normalizeClass(["ev-contact-form__input", { "is-error": errors.name }]),
4625
5277
  type: "text",
4626
5278
  placeholder: "怎么称呼你",
4627
5279
  onInput: _cache[1] || (_cache[1] = ($event) => errors.name = false)
@@ -4631,16 +5283,16 @@ var _sfc_main$15 = {
4631
5283
  void 0,
4632
5284
  { trim: true }
4633
5285
  ]]),
4634
- errors.name ? (openBlock(), createElementBlock("span", _hoisted_3$12, "请填写称呼")) : createCommentVNode("", true)
5286
+ errors.name ? (openBlock(), createElementBlock("span", _hoisted_3$13, "请填写称呼")) : createCommentVNode("", true)
4635
5287
  ]), createElementVNode("div", _hoisted_4$12, [
4636
5288
  _cache[7] || (_cache[7] = createElementVNode("label", {
4637
- class: "ew-contact-form__label",
4638
- for: "ew-contact-email"
5289
+ class: "ev-contact-form__label",
5290
+ for: "ev-contact-email"
4639
5291
  }, "邮箱", -1)),
4640
5292
  withDirectives(createElementVNode("input", {
4641
- id: "ew-contact-email",
5293
+ id: "ev-contact-email",
4642
5294
  "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => form.email = $event),
4643
- class: normalizeClass(["ew-contact-form__input", { "is-error": errors.email }]),
5295
+ class: normalizeClass(["ev-contact-form__input", { "is-error": errors.email }]),
4644
5296
  type: "email",
4645
5297
  placeholder: "用于回复你",
4646
5298
  onInput: _cache[3] || (_cache[3] = ($event) => errors.email = false)
@@ -4654,13 +5306,13 @@ var _sfc_main$15 = {
4654
5306
  ])]),
4655
5307
  createElementVNode("div", _hoisted_6$6, [
4656
5308
  _cache[8] || (_cache[8] = createElementVNode("label", {
4657
- class: "ew-contact-form__label",
4658
- for: "ew-contact-message"
5309
+ class: "ev-contact-form__label",
5310
+ for: "ev-contact-message"
4659
5311
  }, "留言", -1)),
4660
5312
  withDirectives(createElementVNode("textarea", {
4661
- id: "ew-contact-message",
5313
+ id: "ev-contact-message",
4662
5314
  "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => form.message = $event),
4663
- class: normalizeClass(["ew-contact-form__input ew-contact-form__textarea", { "is-error": errors.message }]),
5315
+ class: normalizeClass(["ev-contact-form__input ev-contact-form__textarea", { "is-error": errors.message }]),
4664
5316
  rows: "4",
4665
5317
  placeholder: "想聊点什么…",
4666
5318
  onInput: _cache[5] || (_cache[5] = ($event) => errors.message = false)
@@ -4683,7 +5335,7 @@ var _sfc_main$15 = {
4683
5335
  createVNode(_sfc_main$24, {
4684
5336
  name: "check",
4685
5337
  size: 18,
4686
- class: "ew-contact-form__done-icon"
5338
+ class: "ev-contact-form__done-icon"
4687
5339
  }),
4688
5340
  createElementVNode("div", _hoisted_11$1, [renderSlot(_ctx.$slots, "sent", {}, () => [createTextVNode(toDisplayString(__props.sentText), 1)])]),
4689
5341
  createVNode(_sfc_main$9, {
@@ -4700,27 +5352,27 @@ var _sfc_main$15 = {
4700
5352
  };
4701
5353
  //#endregion
4702
5354
  //#region src/components/carousel/index.vue
4703
- var _hoisted_1$16 = ["src", "alt"];
4704
- var _hoisted_2$15 = {
5355
+ var _hoisted_1$17 = ["src", "alt"];
5356
+ var _hoisted_2$16 = {
4705
5357
  key: 1,
4706
- class: "ew-carousel__banner"
5358
+ class: "ev-carousel__banner"
4707
5359
  };
4708
- var _hoisted_3$11 = ["src", "alt"];
5360
+ var _hoisted_3$12 = ["src", "alt"];
4709
5361
  var _hoisted_4$11 = {
4710
5362
  key: 0,
4711
- class: "ew-carousel__caption"
5363
+ class: "ev-carousel__caption"
4712
5364
  };
4713
5365
  var _hoisted_5$9 = {
4714
5366
  key: 0,
4715
- class: "ew-carousel__caption-title"
5367
+ class: "ev-carousel__caption-title"
4716
5368
  };
4717
5369
  var _hoisted_6$5 = {
4718
5370
  key: 1,
4719
- class: "ew-carousel__caption-desc"
5371
+ class: "ev-carousel__caption-desc"
4720
5372
  };
4721
5373
  var _hoisted_7$3 = {
4722
5374
  key: 2,
4723
- class: "ew-carousel__dots"
5375
+ class: "ev-carousel__dots"
4724
5376
  };
4725
5377
  var _hoisted_8$2 = ["aria-label", "onClick"];
4726
5378
  var _sfc_main$11 = {
@@ -4757,7 +5409,7 @@ var _sfc_main$11 = {
4757
5409
  },
4758
5410
  setup(__props) {
4759
5411
  /**
4760
- * EwCarousel — 轮播(评价墙、案例展示、横幅)
5412
+ * EvCarousel — 轮播(评价墙、案例展示、横幅)
4761
5413
  * 三种形态(variant):
4762
5414
  * - default:items 提供数据,#item 作用域插槽自定义每张内容
4763
5415
  * - image:纯图片轮播,items 项 { src, alt? },aspect 控制画幅
@@ -4796,32 +5448,32 @@ var _sfc_main$11 = {
4796
5448
  onBeforeUnmount(teardownTimer);
4797
5449
  return (_ctx, _cache) => {
4798
5450
  return openBlock(), createElementBlock("div", {
4799
- class: normalizeClass(["ew-carousel", { "is-media": __props.variant !== "default" }]),
5451
+ class: normalizeClass(["ev-carousel", { "is-media": __props.variant !== "default" }]),
4800
5452
  onMouseenter: _cache[2] || (_cache[2] = ($event) => paused.value = true),
4801
5453
  onMouseleave: _cache[3] || (_cache[3] = ($event) => paused.value = false)
4802
5454
  }, [
4803
5455
  createElementVNode("div", {
4804
- class: "ew-carousel__viewport",
5456
+ class: "ev-carousel__viewport",
4805
5457
  style: normalizeStyle(viewportStyle.value)
4806
5458
  }, [createElementVNode("div", {
4807
- class: "ew-carousel__track",
5459
+ class: "ev-carousel__track",
4808
5460
  style: normalizeStyle({ transform: `translateX(-${index.value * 100}%)` })
4809
5461
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (item, i) => {
4810
5462
  return openBlock(), createElementBlock("div", {
4811
5463
  key: i,
4812
- class: "ew-carousel__slide"
5464
+ class: "ev-carousel__slide"
4813
5465
  }, [__props.variant === "image" ? (openBlock(), createElementBlock("img", {
4814
5466
  key: 0,
4815
- class: "ew-carousel__img",
5467
+ class: "ev-carousel__img",
4816
5468
  src: item.src,
4817
5469
  alt: item.alt || "",
4818
5470
  loading: "lazy"
4819
- }, null, 8, _hoisted_1$16)) : __props.variant === "banner" ? (openBlock(), createElementBlock("div", _hoisted_2$15, [createElementVNode("img", {
4820
- class: "ew-carousel__img",
5471
+ }, null, 8, _hoisted_1$17)) : __props.variant === "banner" ? (openBlock(), createElementBlock("div", _hoisted_2$16, [createElementVNode("img", {
5472
+ class: "ev-carousel__img",
4821
5473
  src: item.src,
4822
5474
  alt: item.alt || "",
4823
5475
  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", {
5476
+ }, null, 8, _hoisted_3$12), 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", {
4825
5477
  item,
4826
5478
  index: i
4827
5479
  }, () => [createTextVNode(toDisplayString(item), 1)], void 0, 2)]);
@@ -4829,7 +5481,7 @@ var _sfc_main$11 = {
4829
5481
  __props.items.length > 1 ? (openBlock(), createElementBlock("button", {
4830
5482
  key: 0,
4831
5483
  type: "button",
4832
- class: "ew-carousel__arrow is-prev",
5484
+ class: "ev-carousel__arrow is-prev",
4833
5485
  "aria-label": "上一张",
4834
5486
  onClick: _cache[0] || (_cache[0] = ($event) => step(-1))
4835
5487
  }, [createVNode(_sfc_main$24, {
@@ -4839,7 +5491,7 @@ var _sfc_main$11 = {
4839
5491
  __props.items.length > 1 ? (openBlock(), createElementBlock("button", {
4840
5492
  key: 1,
4841
5493
  type: "button",
4842
- class: "ew-carousel__arrow is-next",
5494
+ class: "ev-carousel__arrow is-next",
4843
5495
  "aria-label": "下一张",
4844
5496
  onClick: _cache[1] || (_cache[1] = ($event) => step(1))
4845
5497
  }, [createVNode(_sfc_main$24, {
@@ -4850,7 +5502,7 @@ var _sfc_main$11 = {
4850
5502
  return openBlock(), createElementBlock("button", {
4851
5503
  key: i,
4852
5504
  type: "button",
4853
- class: normalizeClass(["ew-carousel__dot", { "is-active": i === index.value }]),
5505
+ class: normalizeClass(["ev-carousel__dot", { "is-active": i === index.value }]),
4854
5506
  "aria-label": `第 ${i + 1} 张`,
4855
5507
  onClick: ($event) => go(i)
4856
5508
  }, null, 10, _hoisted_8$2);
@@ -4861,17 +5513,17 @@ var _sfc_main$11 = {
4861
5513
  };
4862
5514
  //#endregion
4863
5515
  //#region src/components/article-card/index.vue
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" };
5516
+ var _hoisted_1$16 = ["src", "alt"];
5517
+ var _hoisted_2$15 = { class: "ev-article-card__body" };
5518
+ var _hoisted_3$11 = { class: "ev-article-card__meta" };
4867
5519
  var _hoisted_4$10 = {
4868
5520
  key: 0,
4869
- class: "ew-article-card__date"
5521
+ class: "ev-article-card__date"
4870
5522
  };
4871
- var _hoisted_5$8 = { class: "ew-article-card__title" };
5523
+ var _hoisted_5$8 = { class: "ev-article-card__title" };
4872
5524
  var _hoisted_6$4 = {
4873
5525
  key: 0,
4874
- class: "ew-article-card__excerpt"
5526
+ class: "ev-article-card__excerpt"
4875
5527
  };
4876
5528
  var _sfc_main$3 = {
4877
5529
  __name: "index",
@@ -4922,14 +5574,14 @@ var _sfc_main$3 = {
4922
5574
  },
4923
5575
  setup(__props) {
4924
5576
  /**
4925
- * EwArticleCard — 文章卡(博客/动态/教程列表)
5577
+ * EvArticleCard — 文章卡(博客/动态/教程列表)
4926
5578
  * 封面(缺省用图标占位)+ 日期与标签元信息 + 标题 + 摘要;整卡可链接
4927
5579
  */
4928
5580
  const props = __props;
4929
- const coverStyle = computed(() => props.cover ? void 0 : { background: "linear-gradient(135deg, var(--ew-fill-1), var(--ew-bg-soft))" });
5581
+ const coverStyle = computed(() => props.cover ? void 0 : { background: "linear-gradient(135deg, var(--ev-fill-1), var(--ev-bg-soft))" });
4930
5582
  return (_ctx, _cache) => {
4931
5583
  return openBlock(), createBlock(resolveDynamicComponent(__props.tag), {
4932
- class: normalizeClass(["ew-article-card", {
5584
+ class: normalizeClass(["ev-article-card", {
4933
5585
  "is-hoverable": __props.hoverable,
4934
5586
  "is-glass": __props.glass === true,
4935
5587
  "no-glass": __props.glass === false
@@ -4937,23 +5589,23 @@ var _sfc_main$3 = {
4937
5589
  href: __props.tag === "a" ? __props.href : void 0
4938
5590
  }, {
4939
5591
  default: withCtx(() => [createElementVNode("div", {
4940
- class: "ew-article-card__cover",
5592
+ class: "ev-article-card__cover",
4941
5593
  style: normalizeStyle(coverStyle.value)
4942
5594
  }, [__props.cover ? (openBlock(), createElementBlock("img", {
4943
5595
  key: 0,
4944
5596
  src: __props.cover,
4945
5597
  alt: __props.title,
4946
5598
  loading: "lazy"
4947
- }, null, 8, _hoisted_1$15)) : __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
5599
+ }, null, 8, _hoisted_1$16)) : __props.icon ? (openBlock(), createBlock(_sfc_main$24, {
4948
5600
  key: 1,
4949
5601
  name: __props.icon,
4950
5602
  size: 28,
4951
- class: "ew-article-card__cover-icon"
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) => {
5603
+ class: "ev-article-card__cover-icon"
5604
+ }, null, 8, ["name"])) : createCommentVNode("", true)], 4), createElementVNode("div", _hoisted_2$15, [
5605
+ createElementVNode("div", _hoisted_3$11, [__props.date ? (openBlock(), createElementBlock("span", _hoisted_4$10, toDisplayString(__props.date), 1)) : createCommentVNode("", true), (openBlock(true), createElementBlock(Fragment, null, renderList(__props.tags, (t) => {
4954
5606
  return openBlock(), createElementBlock("span", {
4955
5607
  key: t,
4956
- class: "ew-article-card__tag"
5608
+ class: "ev-article-card__tag"
4957
5609
  }, toDisplayString(t), 1);
4958
5610
  }), 128))]),
4959
5611
  createElementVNode("h4", _hoisted_5$8, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
@@ -4966,24 +5618,24 @@ var _sfc_main$3 = {
4966
5618
  };
4967
5619
  //#endregion
4968
5620
  //#region src/components/profile-card/index.vue
4969
- var _hoisted_1$14 = { class: "ew-profile-card__name" };
4970
- var _hoisted_2$13 = {
5621
+ var _hoisted_1$15 = { class: "ev-profile-card__name" };
5622
+ var _hoisted_2$14 = {
4971
5623
  key: 0,
4972
- class: "ew-profile-card__role"
5624
+ class: "ev-profile-card__role"
4973
5625
  };
4974
- var _hoisted_3$9 = {
5626
+ var _hoisted_3$10 = {
4975
5627
  key: 1,
4976
- class: "ew-profile-card__bio"
5628
+ class: "ev-profile-card__bio"
4977
5629
  };
4978
5630
  var _hoisted_4$9 = {
4979
5631
  key: 2,
4980
- class: "ew-profile-card__stats"
5632
+ class: "ev-profile-card__stats"
4981
5633
  };
4982
5634
  var _hoisted_5$7 = {
4983
5635
  key: 3,
4984
- class: "ew-profile-card__social"
5636
+ class: "ev-profile-card__social"
4985
5637
  };
4986
- var _sfc_main$39 = {
5638
+ var _sfc_main$41 = {
4987
5639
  __name: "index",
4988
5640
  props: {
4989
5641
  /** 磨砂玻璃质感:true 强制开 / false 强制关 / 缺省跟随全局(ConfigProvider 的 glass) */
@@ -5007,7 +5659,7 @@ var _sfc_main$39 = {
5007
5659
  type: String,
5008
5660
  default: ""
5009
5661
  },
5010
- /** 头像尺寸(px 或 EwAvatar 预设) */
5662
+ /** 头像尺寸(px 或 EvAvatar 预设) */
5011
5663
  avatarSize: {
5012
5664
  type: [String, Number],
5013
5665
  default: 72
@@ -5020,11 +5672,11 @@ var _sfc_main$39 = {
5020
5672
  },
5021
5673
  setup(__props) {
5022
5674
  /**
5023
- * EwProfileCard — 个人名片(团队页/关于页/个人站)
5675
+ * EvProfileCard — 个人名片(团队页/关于页/个人站)
5024
5676
  * 头像 + 姓名 + 角色 + 简介 + 可选数据行与社交链接行
5025
5677
  */
5026
5678
  return (_ctx, _cache) => {
5027
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-profile-card", {
5679
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ev-profile-card", {
5028
5680
  "is-plain": __props.plain,
5029
5681
  "is-glass": __props.glass === true,
5030
5682
  "no-glass": __props.glass === false
@@ -5033,15 +5685,15 @@ var _sfc_main$39 = {
5033
5685
  src: __props.avatar,
5034
5686
  name: __props.name,
5035
5687
  size: __props.avatarSize,
5036
- class: "ew-profile-card__avatar"
5688
+ class: "ev-profile-card__avatar"
5037
5689
  }, null, 8, [
5038
5690
  "src",
5039
5691
  "name",
5040
5692
  "size"
5041
5693
  ]),
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),
5694
+ createElementVNode("h3", _hoisted_1$15, [renderSlot(_ctx.$slots, "name", {}, () => [createTextVNode(toDisplayString(__props.name), 1)])]),
5695
+ __props.role || _ctx.$slots.role ? (openBlock(), createElementBlock("p", _hoisted_2$14, [renderSlot(_ctx.$slots, "role", {}, () => [createTextVNode(toDisplayString(__props.role), 1)])])) : createCommentVNode("", true),
5696
+ __props.bio || _ctx.$slots.bio ? (openBlock(), createElementBlock("p", _hoisted_3$10, [renderSlot(_ctx.$slots, "bio", {}, () => [createTextVNode(toDisplayString(__props.bio), 1)])])) : createCommentVNode("", true),
5045
5697
  _ctx.$slots.stats ? (openBlock(), createElementBlock("div", _hoisted_4$9, [renderSlot(_ctx.$slots, "stats")])) : createCommentVNode("", true),
5046
5698
  _ctx.$slots.social ? (openBlock(), createElementBlock("div", _hoisted_5$7, [renderSlot(_ctx.$slots, "social")])) : createCommentVNode("", true)
5047
5699
  ], 2);
@@ -5050,37 +5702,37 @@ var _sfc_main$39 = {
5050
5702
  };
5051
5703
  //#endregion
5052
5704
  //#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 = {
5705
+ var _hoisted_1$14 = { class: "ev-article" };
5706
+ var _hoisted_2$13 = { class: "ev-article__header" };
5707
+ var _hoisted_3$9 = {
5056
5708
  key: 0,
5057
- class: "ew-article__eyebrow"
5709
+ class: "ev-article__eyebrow"
5058
5710
  };
5059
- var _hoisted_4$8 = { class: "ew-article__title" };
5711
+ var _hoisted_4$8 = { class: "ev-article__title" };
5060
5712
  var _hoisted_5$6 = {
5061
5713
  key: 1,
5062
- class: "ew-article__description"
5714
+ class: "ev-article__description"
5063
5715
  };
5064
5716
  var _hoisted_6$3 = {
5065
5717
  key: 2,
5066
- class: "ew-article__meta"
5718
+ class: "ev-article__meta"
5067
5719
  };
5068
5720
  var _hoisted_7$2 = {
5069
5721
  key: 1,
5070
- class: "ew-article__author"
5722
+ class: "ev-article__author"
5071
5723
  };
5072
5724
  var _hoisted_8$1 = {
5073
5725
  key: 2,
5074
- class: "ew-article__date"
5726
+ class: "ev-article__date"
5075
5727
  };
5076
5728
  var _hoisted_9 = {
5077
5729
  key: 3,
5078
- class: "ew-article__read"
5730
+ class: "ev-article__read"
5079
5731
  };
5080
- var _hoisted_10 = { class: "ew-article__body" };
5732
+ var _hoisted_10 = { class: "ev-article__body" };
5081
5733
  var _hoisted_11 = {
5082
5734
  key: 0,
5083
- class: "ew-article__footer"
5735
+ class: "ev-article__footer"
5084
5736
  };
5085
5737
  var _sfc_main$2 = {
5086
5738
  __name: "index",
@@ -5124,15 +5776,15 @@ var _sfc_main$2 = {
5124
5776
  },
5125
5777
  setup(__props) {
5126
5778
  /**
5127
- * EwArticle — 文章内容(长文阅读排版)
5779
+ * EvArticle — 文章内容(长文阅读排版)
5128
5780
  * 页头:眉题 + 标题 + 摘要 + 元信息行(头像/作者/日期/阅读时长/标签);
5129
5781
  * 正文插槽自带阅读排版(标题刻度、1.85 行高、引用块、列表、行内代码、图片圆角),
5130
- * 排版全部以 .ew-article__body 作用域类收敛,不外溢。
5782
+ * 排版全部以 .ev-article__body 作用域类收敛,不外溢。
5131
5783
  */
5132
5784
  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),
5785
+ return openBlock(), createElementBlock("article", _hoisted_1$14, [
5786
+ createElementVNode("header", _hoisted_2$13, [
5787
+ __props.eyebrow || _ctx.$slots.eyebrow ? (openBlock(), createElementBlock("p", _hoisted_3$9, [renderSlot(_ctx.$slots, "eyebrow", {}, () => [createTextVNode(toDisplayString(__props.eyebrow), 1)])])) : createCommentVNode("", true),
5136
5788
  createElementVNode("h1", _hoisted_4$8, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
5137
5789
  __props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_5$6, [renderSlot(_ctx.$slots, "description", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
5138
5790
  __props.author || __props.date || __props.readTime || __props.tags.length ? (openBlock(), createElementBlock("div", _hoisted_6$3, [
@@ -5141,7 +5793,7 @@ var _sfc_main$2 = {
5141
5793
  src: __props.avatar,
5142
5794
  name: __props.author,
5143
5795
  size: 28,
5144
- class: "ew-article__avatar"
5796
+ class: "ev-article__avatar"
5145
5797
  }, null, 8, ["src", "name"])) : createCommentVNode("", true),
5146
5798
  __props.author ? (openBlock(), createElementBlock("span", _hoisted_7$2, toDisplayString(__props.author), 1)) : createCommentVNode("", true),
5147
5799
  __props.date ? (openBlock(), createElementBlock("span", _hoisted_8$1, toDisplayString(__props.date), 1)) : createCommentVNode("", true),
@@ -5149,7 +5801,7 @@ var _sfc_main$2 = {
5149
5801
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.tags, (tag) => {
5150
5802
  return openBlock(), createElementBlock("span", {
5151
5803
  key: tag,
5152
- class: "ew-article__tag"
5804
+ class: "ev-article__tag"
5153
5805
  }, toDisplayString(tag), 1);
5154
5806
  }), 128))
5155
5807
  ])) : createCommentVNode("", true)
@@ -5162,22 +5814,22 @@ var _sfc_main$2 = {
5162
5814
  };
5163
5815
  //#endregion
5164
5816
  //#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" };
5817
+ var _hoisted_1$13 = { class: "ev-exec-card__stage" };
5818
+ var _hoisted_2$12 = ["src", "alt"];
5819
+ var _hoisted_3$8 = ["aria-label"];
5820
+ var _hoisted_4$7 = { class: "ev-exec-card__body" };
5821
+ var _hoisted_5$5 = { class: "ev-exec-card__name" };
5170
5822
  var _hoisted_6$2 = {
5171
5823
  key: 0,
5172
- class: "ew-exec-card__role"
5824
+ class: "ev-exec-card__role"
5173
5825
  };
5174
5826
  var _hoisted_7$1 = {
5175
5827
  key: 1,
5176
- class: "ew-exec-card__description"
5828
+ class: "ev-exec-card__description"
5177
5829
  };
5178
5830
  var _hoisted_8 = {
5179
5831
  key: 2,
5180
- class: "ew-exec-card__actions"
5832
+ class: "ev-exec-card__actions"
5181
5833
  };
5182
5834
  var _sfc_main$18 = {
5183
5835
  __name: "index",
@@ -5213,27 +5865,27 @@ var _sfc_main$18 = {
5213
5865
  },
5214
5866
  setup(__props) {
5215
5867
  /**
5216
- * EwExecCard — 高管/团队介绍卡
5868
+ * EvExecCard — 高管/团队介绍卡
5217
5869
  * 为「透明背景半身人物图」设计:人物图锚定在渐变舞台底边,像从卡片里走出来;
5218
5870
  * 未传 image 时渲染内置人物剪影占位。展示型 title 用强字距展示体。
5219
5871
  * props:name / role / description / image / portraitHeight(舞台高度,px)
5220
5872
  */
5221
5873
  return (_ctx, _cache) => {
5222
5874
  return openBlock(), createElementBlock("div", {
5223
- class: normalizeClass(["ew-exec-card", {
5875
+ class: normalizeClass(["ev-exec-card", {
5224
5876
  "is-glass": __props.glass === true,
5225
5877
  "no-glass": __props.glass === false
5226
5878
  }]),
5227
- style: normalizeStyle({ "--ew-exec-portrait-h": `${__props.portraitHeight}px` })
5228
- }, [createElementVNode("div", _hoisted_1$12, [__props.image ? (openBlock(), createElementBlock("img", {
5879
+ style: normalizeStyle({ "--ev-exec-portrait-h": `${__props.portraitHeight}px` })
5880
+ }, [createElementVNode("div", _hoisted_1$13, [__props.image ? (openBlock(), createElementBlock("img", {
5229
5881
  key: 0,
5230
5882
  src: __props.image,
5231
5883
  alt: __props.name,
5232
- class: "ew-exec-card__portrait",
5884
+ class: "ev-exec-card__portrait",
5233
5885
  loading: "lazy"
5234
- }, null, 8, _hoisted_2$11)) : (openBlock(), createElementBlock("svg", {
5886
+ }, null, 8, _hoisted_2$12)) : (openBlock(), createElementBlock("svg", {
5235
5887
  key: 1,
5236
- class: "ew-exec-card__portrait",
5888
+ class: "ev-exec-card__portrait",
5237
5889
  viewBox: "0 0 240 200",
5238
5890
  role: "img",
5239
5891
  "aria-label": __props.name
@@ -5247,7 +5899,7 @@ var _sfc_main$18 = {
5247
5899
  d: "M40 200c0-44 36-72 80-72s80 28 80 72",
5248
5900
  fill: "currentColor",
5249
5901
  opacity: "0.35"
5250
- }, null, -1)])], 8, _hoisted_3$7))]), createElementVNode("div", _hoisted_4$7, [
5902
+ }, null, -1)])], 8, _hoisted_3$8))]), createElementVNode("div", _hoisted_4$7, [
5251
5903
  createElementVNode("h3", _hoisted_5$5, [renderSlot(_ctx.$slots, "name", {}, () => [createTextVNode(toDisplayString(__props.name), 1)])]),
5252
5904
  __props.role || _ctx.$slots.role ? (openBlock(), createElementBlock("p", _hoisted_6$2, [renderSlot(_ctx.$slots, "role", {}, () => [createTextVNode(toDisplayString(__props.role), 1)])])) : createCommentVNode("", true),
5253
5905
  __props.description || _ctx.$slots.default ? (openBlock(), createElementBlock("p", _hoisted_7$1, [renderSlot(_ctx.$slots, "default", {}, () => [createTextVNode(toDisplayString(__props.description), 1)])])) : createCommentVNode("", true),
@@ -5257,13 +5909,57 @@ var _sfc_main$18 = {
5257
5909
  }
5258
5910
  };
5259
5911
  //#endregion
5912
+ //#region src/composables/useScrollLock.js
5913
+ /**
5914
+ * useScrollLock — body 滚动锁定(弹层类组件共用)
5915
+ *
5916
+ * 锁定期间为 body 补偿滚动条宽度(padding-right),避免
5917
+ * 「滚动条消失 → 视口变宽 → 内容回流」造成的抖动;
5918
+ * 引用计数支持多弹层叠加(Modal + ImagePreview 同开等),全部关闭后恢复原状
5919
+ */
5920
+ var lockCount = 0;
5921
+ var savedOverflow = "";
5922
+ var savedPaddingRight = "";
5923
+ function scrollbarWidth() {
5924
+ if (typeof window === "undefined" || typeof document === "undefined") return 0;
5925
+ return Math.max(0, window.innerWidth - document.documentElement.clientWidth);
5926
+ }
5927
+ /** 锁定 body 滚动;重复调用按引用计数叠加 */
5928
+ function lockBodyScroll() {
5929
+ if (typeof document === "undefined") return;
5930
+ if (lockCount > 0) {
5931
+ lockCount += 1;
5932
+ return;
5933
+ }
5934
+ lockCount = 1;
5935
+ savedOverflow = document.body.style.overflow;
5936
+ savedPaddingRight = document.body.style.paddingRight;
5937
+ const gap = scrollbarWidth();
5938
+ if (gap > 0) {
5939
+ const prev = getComputedStyle(document.body).paddingRight;
5940
+ document.body.style.paddingRight = `calc(${prev} + ${gap}px)`;
5941
+ }
5942
+ document.body.style.overflow = "hidden";
5943
+ }
5944
+ /** 解除锁定;与 lockBodyScroll 配对使用,计数归零后才真正恢复 */
5945
+ function unlockBodyScroll() {
5946
+ if (typeof document === "undefined") return;
5947
+ if (lockCount === 0) return;
5948
+ lockCount -= 1;
5949
+ if (lockCount > 0) return;
5950
+ document.body.style.overflow = savedOverflow;
5951
+ document.body.style.paddingRight = savedPaddingRight;
5952
+ savedOverflow = "";
5953
+ savedPaddingRight = "";
5954
+ }
5955
+ //#endregion
5260
5956
  //#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"];
5957
+ var _hoisted_1$12 = ["aria-label"];
5958
+ var _hoisted_2$11 = { class: "ev-image-preview__stage" };
5959
+ var _hoisted_3$7 = ["src", "alt"];
5264
5960
  var _hoisted_4$6 = {
5265
5961
  key: 0,
5266
- class: "ew-image-preview__caption"
5962
+ class: "ev-image-preview__caption"
5267
5963
  };
5268
5964
  var _hoisted_5$4 = { key: 0 };
5269
5965
  var _sfc_main$27 = {
@@ -5299,7 +5995,7 @@ var _sfc_main$27 = {
5299
5995
  ],
5300
5996
  setup(__props, { emit: __emit }) {
5301
5997
  /**
5302
- * EwImagePreview — 图片预览灯箱
5998
+ * EvImagePreview — 图片预览灯箱
5303
5999
  * 全屏遮罩 + 居中大图;Esc / 点击遮罩 / 关闭按钮关闭;
5304
6000
  * 多图时支持左右箭头与键盘 ← → 切换,右下角显示计数;
5305
6001
  * 打开期间锁定页面滚动,关闭后恢复。
@@ -5333,23 +6029,23 @@ var _sfc_main$27 = {
5333
6029
  if (typeof document === "undefined") return;
5334
6030
  if (visible) {
5335
6031
  document.addEventListener("keydown", onKeydown);
5336
- document.body.style.overflow = "hidden";
6032
+ lockBodyScroll();
5337
6033
  emit("open");
5338
6034
  } else {
5339
6035
  document.removeEventListener("keydown", onKeydown);
5340
- document.body.style.overflow = "";
6036
+ unlockBodyScroll();
5341
6037
  }
5342
6038
  });
5343
6039
  onBeforeUnmount(() => {
5344
6040
  if (typeof document === "undefined") return;
5345
6041
  document.removeEventListener("keydown", onKeydown);
5346
- document.body.style.overflow = "";
6042
+ unlockBodyScroll();
5347
6043
  });
5348
6044
  return (_ctx, _cache) => {
5349
- return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, { name: "ew-image-preview" }, {
6045
+ return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, { name: "ev-image-preview" }, {
5350
6046
  default: withCtx(() => [visible.value ? (openBlock(), createElementBlock("div", {
5351
6047
  key: 0,
5352
- class: "ew-image-preview",
6048
+ class: "ev-image-preview",
5353
6049
  role: "dialog",
5354
6050
  "aria-modal": "true",
5355
6051
  "aria-label": `图片预览(${__props.index + 1} / ${count.value})`,
@@ -5357,7 +6053,7 @@ var _sfc_main$27 = {
5357
6053
  }, [
5358
6054
  createElementVNode("button", {
5359
6055
  type: "button",
5360
- class: "ew-image-preview__close",
6056
+ class: "ev-image-preview__close",
5361
6057
  "aria-label": "关闭预览",
5362
6058
  onClick: close
5363
6059
  }, [createVNode(_sfc_main$24, {
@@ -5367,29 +6063,29 @@ var _sfc_main$27 = {
5367
6063
  count.value > 1 ? (openBlock(), createElementBlock("button", {
5368
6064
  key: 0,
5369
6065
  type: "button",
5370
- class: "ew-image-preview__arrow is-prev",
6066
+ class: "ev-image-preview__arrow is-prev",
5371
6067
  "aria-label": "上一张",
5372
6068
  onClick: _cache[0] || (_cache[0] = withModifiers(($event) => step(-1), ["stop"]))
5373
6069
  }, [createVNode(_sfc_main$24, {
5374
6070
  name: "chevron-left",
5375
6071
  size: 20
5376
6072
  })])) : createCommentVNode("", true),
5377
- createElementVNode("figure", _hoisted_2$10, [createElementVNode("img", {
6073
+ createElementVNode("figure", _hoisted_2$11, [createElementVNode("img", {
5378
6074
  src: current.value?.src,
5379
6075
  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)]),
6076
+ class: "ev-image-preview__img"
6077
+ }, null, 8, _hoisted_3$7), 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
6078
  count.value > 1 ? (openBlock(), createElementBlock("button", {
5383
6079
  key: 1,
5384
6080
  type: "button",
5385
- class: "ew-image-preview__arrow is-next",
6081
+ class: "ev-image-preview__arrow is-next",
5386
6082
  "aria-label": "下一张",
5387
6083
  onClick: _cache[1] || (_cache[1] = withModifiers(($event) => step(1), ["stop"]))
5388
6084
  }, [createVNode(_sfc_main$24, {
5389
6085
  name: "chevron-right",
5390
6086
  size: 20
5391
6087
  })])) : createCommentVNode("", true)
5392
- ], 8, _hoisted_1$11)) : createCommentVNode("", true)]),
6088
+ ], 8, _hoisted_1$12)) : createCommentVNode("", true)]),
5393
6089
  _: 1
5394
6090
  })]);
5395
6091
  };
@@ -5397,8 +6093,8 @@ var _sfc_main$27 = {
5397
6093
  };
5398
6094
  //#endregion
5399
6095
  //#region src/components/image-wall/index.vue
5400
- var _hoisted_1$10 = ["aria-label", "onClick"];
5401
- var _hoisted_2$9 = ["src", "alt"];
6096
+ var _hoisted_1$11 = ["aria-label", "onClick"];
6097
+ var _hoisted_2$10 = ["src", "alt"];
5402
6098
  var _sfc_main$28 = {
5403
6099
  __name: "index",
5404
6100
  props: {
@@ -5431,8 +6127,8 @@ var _sfc_main$28 = {
5431
6127
  emits: ["select"],
5432
6128
  setup(__props, { emit: __emit }) {
5433
6129
  /**
5434
- * EwImageWall — 图片墙
5435
- * 均匀网格图片墙,点击任意图片打开 EwImagePreview 灯箱预览(可关)。
6130
+ * EvImageWall — 图片墙
6131
+ * 均匀网格图片墙,点击任意图片打开 EvImagePreview 灯箱预览(可关)。
5436
6132
  * images 项:字符串 url 或 { src, alt };columns 列数;preview=false 时仅发出 select 事件。
5437
6133
  */
5438
6134
  const props = __props;
@@ -5454,21 +6150,157 @@ var _sfc_main$28 = {
5454
6150
  }
5455
6151
  return (_ctx, _cache) => {
5456
6152
  return openBlock(), createElementBlock("div", {
5457
- class: "ew-image-wall",
6153
+ class: "ev-image-wall",
5458
6154
  style: normalizeStyle(gridStyle.value)
5459
6155
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(normalized.value, (img, i) => {
5460
6156
  return openBlock(), createElementBlock("button", {
5461
6157
  key: i,
5462
6158
  type: "button",
5463
- class: "ew-image-wall__item",
5464
- style: normalizeStyle({ "--ew-image-wall-radius": `${__props.radius}px` }),
6159
+ class: "ev-image-wall__item",
6160
+ style: normalizeStyle({ "--ev-image-wall-radius": `${__props.radius}px` }),
5465
6161
  "aria-label": img.alt || `查看第 ${i + 1} 张图片`,
5466
6162
  onClick: ($event) => open(i)
5467
6163
  }, [createElementVNode("img", {
5468
6164
  src: img.src,
5469
6165
  alt: img.alt || "",
5470
6166
  loading: "lazy"
5471
- }, null, 8, _hoisted_2$9)], 12, _hoisted_1$10);
6167
+ }, null, 8, _hoisted_2$10)], 12, _hoisted_1$11);
6168
+ }), 128)), __props.preview ? (openBlock(), createBlock(_sfc_main$27, {
6169
+ key: 0,
6170
+ modelValue: previewVisible.value,
6171
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => previewVisible.value = $event),
6172
+ index: previewIndex.value,
6173
+ "onUpdate:index": _cache[1] || (_cache[1] = ($event) => previewIndex.value = $event),
6174
+ images: normalized.value
6175
+ }, null, 8, [
6176
+ "modelValue",
6177
+ "index",
6178
+ "images"
6179
+ ])) : createCommentVNode("", true)], 4);
6180
+ };
6181
+ }
6182
+ };
6183
+ //#endregion
6184
+ //#region src/components/waterfall/index.vue
6185
+ var _hoisted_1$10 = ["aria-label", "onClick"];
6186
+ var _hoisted_2$9 = [
6187
+ "src",
6188
+ "alt",
6189
+ "onLoad"
6190
+ ];
6191
+ var _hoisted_3$6 = {
6192
+ key: 0,
6193
+ class: "ev-waterfall__caption"
6194
+ };
6195
+ var FALLBACK_RATIO = .75;
6196
+ var _sfc_main$57 = {
6197
+ __name: "index",
6198
+ props: {
6199
+ /** 条目列表:url 字符串或 { src, alt, caption, ratio(高/宽), width, height } */
6200
+ items: {
6201
+ type: Array,
6202
+ default: () => []
6203
+ },
6204
+ /** 列数 */
6205
+ columns: {
6206
+ type: Number,
6207
+ default: 3
6208
+ },
6209
+ /** 间距(px),横向与纵向同值 */
6210
+ gap: {
6211
+ type: Number,
6212
+ default: 14
6213
+ },
6214
+ /** 圆角(px) */
6215
+ radius: {
6216
+ type: Number,
6217
+ default: 12
6218
+ },
6219
+ /** 点击图片是否打开预览灯箱(false 时仅派发 select 事件) */
6220
+ preview: {
6221
+ type: Boolean,
6222
+ default: true
6223
+ }
6224
+ },
6225
+ emits: ["select"],
6226
+ setup(__props, { emit: __emit }) {
6227
+ /**
6228
+ * EvWaterfall — 瀑布流
6229
+ * 多列瀑布流布局:按「最短列优先」分发条目,列高随内容比例自动均衡。
6230
+ * items 项:字符串 url 或 { src, alt, caption, ratio, width, height };
6231
+ * 未声明比例时先按默认画幅占位,图片加载完成后按真实比例重新归位。
6232
+ * 默认渲染图片卡(可带 caption 蒙层、点击打开 EvImagePreview 灯箱,可关);
6233
+ * 作用插槽 #item 完全接管单元格,可承载任意内容实现内容瀑布流。
6234
+ */
6235
+ const props = __props;
6236
+ const emit = __emit;
6237
+ const previewVisible = ref(false);
6238
+ const previewIndex = ref(0);
6239
+ const measured = ref({});
6240
+ const normalized = computed(() => props.items.map((item) => typeof item === "string" ? { src: item } : item));
6241
+ function declaredRatio(item) {
6242
+ if (item.ratio) return item.ratio;
6243
+ if (item.width && item.height) return item.height / item.width;
6244
+ return 0;
6245
+ }
6246
+ const buckets = computed(() => {
6247
+ const cols = Math.max(1, Math.floor(props.columns));
6248
+ const loads = Array(cols).fill(0);
6249
+ const out = Array.from({ length: cols }, () => []);
6250
+ normalized.value.forEach((item, i) => {
6251
+ let target = 0;
6252
+ for (let k = 1; k < cols; k++) if (loads[k] < loads[target] - 1e-6) target = k;
6253
+ out[target].push({
6254
+ item,
6255
+ index: i
6256
+ });
6257
+ loads[target] += declaredRatio(item) || measured.value[i] || FALLBACK_RATIO;
6258
+ });
6259
+ return out;
6260
+ });
6261
+ function onImgLoad(index, e) {
6262
+ const img = e.target;
6263
+ if (!img.naturalWidth || !img.naturalHeight) return;
6264
+ if (declaredRatio(normalized.value[index])) return;
6265
+ measured.value = {
6266
+ ...measured.value,
6267
+ [index]: img.naturalHeight / img.naturalWidth
6268
+ };
6269
+ }
6270
+ function open(index) {
6271
+ previewIndex.value = index;
6272
+ emit("select", normalized.value[index], index);
6273
+ if (props.preview) previewVisible.value = true;
6274
+ }
6275
+ return (_ctx, _cache) => {
6276
+ return openBlock(), createElementBlock("div", {
6277
+ class: "ev-waterfall",
6278
+ style: normalizeStyle({ gap: `${__props.gap}px` })
6279
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(buckets.value, (col, c) => {
6280
+ return openBlock(), createElementBlock("div", {
6281
+ key: c,
6282
+ class: "ev-waterfall__col",
6283
+ style: normalizeStyle({ gap: `${__props.gap}px` })
6284
+ }, [(openBlock(true), createElementBlock(Fragment, null, renderList(col, (cell) => {
6285
+ return openBlock(), createElementBlock("div", {
6286
+ key: cell.index,
6287
+ class: "ev-waterfall__cell"
6288
+ }, [renderSlot(_ctx.$slots, "item", {
6289
+ item: cell.item,
6290
+ index: cell.index
6291
+ }, () => [createElementVNode("button", {
6292
+ type: "button",
6293
+ class: "ev-waterfall__item",
6294
+ style: normalizeStyle({ "--ev-waterfall-radius": `${__props.radius}px` }),
6295
+ "aria-label": cell.item.alt || cell.item.caption || `查看第 ${cell.index + 1} 张图片`,
6296
+ onClick: ($event) => open(cell.index)
6297
+ }, [createElementVNode("img", {
6298
+ src: cell.item.src,
6299
+ alt: cell.item.alt || "",
6300
+ loading: "lazy",
6301
+ onLoad: ($event) => onImgLoad(cell.index, $event)
6302
+ }, null, 40, _hoisted_2$9), cell.item.caption ? (openBlock(), createElementBlock("span", _hoisted_3$6, toDisplayString(cell.item.caption), 1)) : createCommentVNode("", true)], 12, _hoisted_1$10)])]);
6303
+ }), 128))], 4);
5472
6304
  }), 128)), __props.preview ? (openBlock(), createBlock(_sfc_main$27, {
5473
6305
  key: 0,
5474
6306
  modelValue: previewVisible.value,
@@ -5489,15 +6321,15 @@ var _sfc_main$28 = {
5489
6321
  var _hoisted_1$9 = ["aria-label"];
5490
6322
  var _hoisted_2$8 = {
5491
6323
  key: 0,
5492
- class: "ew-modal__header"
6324
+ class: "ev-modal__header"
5493
6325
  };
5494
- var _hoisted_3$5 = { class: "ew-modal__title" };
5495
- var _hoisted_4$5 = { class: "ew-modal__body" };
6326
+ var _hoisted_3$5 = { class: "ev-modal__title" };
6327
+ var _hoisted_4$5 = { class: "ev-modal__body" };
5496
6328
  var _hoisted_5$3 = {
5497
6329
  key: 1,
5498
- class: "ew-modal__footer"
6330
+ class: "ev-modal__footer"
5499
6331
  };
5500
- var _sfc_main$34 = {
6332
+ var _sfc_main$36 = {
5501
6333
  __name: "index",
5502
6334
  props: {
5503
6335
  /** 可见性(v-model) */
@@ -5544,7 +6376,7 @@ var _sfc_main$34 = {
5544
6376
  ],
5545
6377
  setup(__props, { emit: __emit }) {
5546
6378
  /**
5547
- * EwModal — 弹出层
6379
+ * EvModal — 弹出层
5548
6380
  * 遮罩 + 居中面板;Teleport 到 body;Esc / 遮罩点击 / 关闭按钮关闭(均可配);
5549
6381
  * 打开期间锁定页面滚动,打开时焦点移入面板、关闭后归还触发元素;
5550
6382
  * 事件:update:modelValue / open / opened / close / closed。
@@ -5571,11 +6403,11 @@ var _sfc_main$34 = {
5571
6403
  if (show) {
5572
6404
  lastFocused = document.activeElement;
5573
6405
  emit("open");
5574
- if (props.lockScroll) document.body.style.overflow = "hidden";
6406
+ if (props.lockScroll) lockBodyScroll();
5575
6407
  document.addEventListener("keydown", onKeydown);
5576
6408
  nextTick(() => panelRef.value?.focus?.());
5577
6409
  } else {
5578
- if (props.lockScroll) document.body.style.overflow = "";
6410
+ if (props.lockScroll) unlockBodyScroll();
5579
6411
  document.removeEventListener("keydown", onKeydown);
5580
6412
  nextTick(() => lastFocused?.focus?.());
5581
6413
  }
@@ -5583,22 +6415,22 @@ var _sfc_main$34 = {
5583
6415
  onBeforeUnmount(() => {
5584
6416
  if (typeof document === "undefined") return;
5585
6417
  document.removeEventListener("keydown", onKeydown);
5586
- if (props.lockScroll) document.body.style.overflow = "";
6418
+ if (props.lockScroll) unlockBodyScroll();
5587
6419
  });
5588
6420
  return (_ctx, _cache) => {
5589
6421
  return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
5590
- name: "ew-modal",
6422
+ name: "ev-modal",
5591
6423
  onAfterEnter: _cache[0] || (_cache[0] = ($event) => emit("opened")),
5592
6424
  onAfterLeave: _cache[1] || (_cache[1] = ($event) => emit("closed"))
5593
6425
  }, {
5594
6426
  default: withCtx(() => [visible.value ? (openBlock(), createElementBlock("div", {
5595
6427
  key: 0,
5596
- class: "ew-modal",
6428
+ class: "ev-modal",
5597
6429
  onClick: withModifiers(onOverlayClick, ["self"])
5598
6430
  }, [createElementVNode("div", {
5599
6431
  ref_key: "panelRef",
5600
6432
  ref: panelRef,
5601
- class: "ew-modal__panel",
6433
+ class: "ev-modal__panel",
5602
6434
  role: "dialog",
5603
6435
  "aria-modal": "true",
5604
6436
  "aria-label": __props.title || "对话框",
@@ -5608,7 +6440,7 @@ var _sfc_main$34 = {
5608
6440
  __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
6441
  key: 0,
5610
6442
  type: "button",
5611
- class: "ew-modal__close",
6443
+ class: "ev-modal__close",
5612
6444
  "aria-label": "关闭",
5613
6445
  onClick: close
5614
6446
  }, [createVNode(_sfc_main$24, {
@@ -5625,14 +6457,14 @@ var _sfc_main$34 = {
5625
6457
  };
5626
6458
  //#endregion
5627
6459
  //#region src/components/marquee/index.vue
5628
- var _hoisted_1$8 = { class: "ew-marquee__track" };
6460
+ var _hoisted_1$8 = { class: "ev-marquee__track" };
5629
6461
  var _hoisted_2$7 = ["aria-hidden"];
5630
- var _hoisted_3$4 = { class: "ew-marquee__group" };
6462
+ var _hoisted_3$4 = { class: "ev-marquee__group" };
5631
6463
  var _hoisted_4$4 = {
5632
- class: "ew-marquee__group",
6464
+ class: "ev-marquee__group",
5633
6465
  "aria-hidden": "true"
5634
6466
  };
5635
- var _sfc_main$33 = {
6467
+ var _sfc_main$35 = {
5636
6468
  __name: "index",
5637
6469
  props: {
5638
6470
  /** 文本模式的词条(传入后若没有默认插槽则启用文本模式) */
@@ -5673,13 +6505,13 @@ var _sfc_main$33 = {
5673
6505
  },
5674
6506
  setup(__props) {
5675
6507
  /**
5676
- * EwMarquee — 无限滚动横幅
6508
+ * EvMarquee — 无限滚动横幅
5677
6509
  *
5678
6510
  * 两种用法:
5679
6511
  * 1. 插槽模式:默认插槽内容渲染两份,无缝循环(品牌墙 / 任意自定义内容)
5680
6512
  * 2. 文本模式:传入 items(字符串数组),渲染大字横幅——
5681
6513
  * alternateOutline 让奇偶项在 实心/描边 间交替(商场 LED 风格),
5682
- * 可选 separator 分隔图标;字号/描边色由 --ew-marquee-text-size / --ew-marquee-stroke 控制
6514
+ * 可选 separator 分隔图标;字号/描边色由 --ev-marquee-text-size / --ev-marquee-stroke 控制
5683
6515
  *
5684
6516
  * duration 单程时长 ms(越小越快),reverse 反向,hover 暂停(可关)
5685
6517
  */
@@ -5691,13 +6523,13 @@ var _sfc_main$33 = {
5691
6523
  return Math.max(14, Math.round(size * .38));
5692
6524
  });
5693
6525
  const rootStyle = computed(() => {
5694
- const style = { "--ew-marquee-duration": `${props.duration}ms` };
5695
- if (props.textSize) style["--ew-marquee-text-size"] = props.textSize;
6526
+ const style = { "--ev-marquee-duration": `${props.duration}ms` };
6527
+ if (props.textSize) style["--ev-marquee-text-size"] = props.textSize;
5696
6528
  return style;
5697
6529
  });
5698
6530
  return (_ctx, _cache) => {
5699
6531
  return openBlock(), createElementBlock("div", {
5700
- class: normalizeClass(["ew-marquee", {
6532
+ class: normalizeClass(["ev-marquee", {
5701
6533
  "is-reverse": __props.reverse,
5702
6534
  "is-pausable": __props.pauseOnHover
5703
6535
  }]),
@@ -5706,18 +6538,18 @@ var _sfc_main$33 = {
5706
6538
  }, [createElementVNode("div", _hoisted_1$8, [textMode.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, renderList(2, (g) => {
5707
6539
  return createElementVNode("div", {
5708
6540
  key: g,
5709
- class: "ew-marquee__group",
6541
+ class: "ev-marquee__group",
5710
6542
  "aria-hidden": g === 2 ? "true" : void 0
5711
6543
  }, [(openBlock(true), createElementBlock(Fragment, null, renderList(__props.items, (w, i) => {
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, {
6544
+ return openBlock(), createElementBlock(Fragment, { key: i }, [createElementVNode("span", { class: normalizeClass(["ev-marquee__text", { "is-outline": __props.alternateOutline && i % 2 === 1 }]) }, toDisplayString(w), 3), __props.separator ? (openBlock(), createBlock(_sfc_main$24, {
5713
6545
  key: 0,
5714
6546
  name: __props.separator,
5715
6547
  size: separatorSize.value,
5716
- class: "ew-marquee__separator"
6548
+ class: "ev-marquee__separator"
5717
6549
  }, null, 8, ["name", "size"])) : createCommentVNode("", true)], 64);
5718
6550
  }), 128))], 8, _hoisted_2$7);
5719
6551
  }), 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createElementVNode("div", _hoisted_3$4, [renderSlot(_ctx.$slots, "default")]), createElementVNode("div", _hoisted_4$4, [renderSlot(_ctx.$slots, "default")])], 64))]), _cache[0] || (_cache[0] = createElementVNode("div", {
5720
- class: "ew-marquee__mask",
6552
+ class: "ev-marquee__mask",
5721
6553
  "aria-hidden": "true"
5722
6554
  }, null, -1))], 6);
5723
6555
  };
@@ -5748,7 +6580,7 @@ var _sfc_main$8 = {
5748
6580
  type: String,
5749
6581
  default: "transparent"
5750
6582
  },
5751
- /** 流光渐变主色(缺省取 --ew-color-primary) */
6583
+ /** 流光渐变主色(缺省取 --ev-color-primary) */
5752
6584
  colorTo: {
5753
6585
  type: String,
5754
6586
  default: ""
@@ -5761,23 +6593,24 @@ var _sfc_main$8 = {
5761
6593
  },
5762
6594
  setup(__props) {
5763
6595
  /**
5764
- * EwBorderBeam — 边框流光
5765
- * 包住任意内容,一道流光沿边框循环扫过(主色渐变,方向/速度/宽度可调)。
6596
+ * EvBorderBeam — 边框流光
6597
+ * 包住任意内容,一道流光沿边框循环扫过(主色渐变,方向/速度/宽度可调);
6598
+ * 自带 1px 静态细描边(--ev-border-color-light),流光未扫过时卡片仍有边界。
5766
6599
  * 依赖 CSS @property 插值角度;不支持的浏览器自动退化为静态渐变细环。
5767
6600
  * 圆角跟随宿主:给本组件根元素设置 border-radius 即可(ring 会同步取圆角)。
5768
6601
  */
5769
6602
  const props = __props;
5770
6603
  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"
6604
+ "--ev-beam-width": `${props.width}px`,
6605
+ "--ev-beam-duration": `${props.duration}ms`,
6606
+ "--ev-beam-delay": `${props.delay}ms`,
6607
+ "--ev-beam-from": props.colorFrom || "transparent",
6608
+ "--ev-beam-to": props.colorTo || "var(--ev-color-primary)",
6609
+ "--ev-beam-direction": props.reverse ? "reverse" : "normal"
5777
6610
  }));
5778
6611
  return (_ctx, _cache) => {
5779
6612
  return openBlock(), createElementBlock("div", {
5780
- class: "ew-border-beam",
6613
+ class: "ev-border-beam",
5781
6614
  style: normalizeStyle(rootStyle.value)
5782
6615
  }, [renderSlot(_ctx.$slots, "default")], 4);
5783
6616
  };
@@ -5793,11 +6626,11 @@ var _hoisted_1$7 = [
5793
6626
  ];
5794
6627
  var _hoisted_2$6 = {
5795
6628
  key: 2,
5796
- class: "ew-input__suffix"
6629
+ class: "ev-input__suffix"
5797
6630
  };
5798
6631
  var _sfc_main$29 = /*@__PURE__*/ Object.assign({
5799
6632
  inheritAttrs: false,
5800
- name: "EwInput"
6633
+ name: "EvInput"
5801
6634
  }, {
5802
6635
  __name: "index",
5803
6636
  props: {
@@ -5849,7 +6682,7 @@ var _sfc_main$29 = /*@__PURE__*/ Object.assign({
5849
6682
  ],
5850
6683
  setup(__props, { expose: __expose, emit: __emit }) {
5851
6684
  /**
5852
- * EwInput — 文本输入(留言/评论/订阅等前台提交场景的基础件)
6685
+ * EvInput — 文本输入(留言/评论/订阅等前台提交场景的基础件)
5853
6686
  * prefix 图标、可清空、错误态、三档尺寸;穿透 attrs 到原生 input
5854
6687
  */
5855
6688
  const props = __props;
@@ -5872,7 +6705,7 @@ var _sfc_main$29 = /*@__PURE__*/ Object.assign({
5872
6705
  __expose({ focused });
5873
6706
  return (_ctx, _cache) => {
5874
6707
  return openBlock(), createElementBlock("div", { class: normalizeClass([
5875
- "ew-input",
6708
+ "ev-input",
5876
6709
  `is-${__props.size}`,
5877
6710
  {
5878
6711
  "is-disabled": __props.disabled,
@@ -5883,10 +6716,10 @@ var _sfc_main$29 = /*@__PURE__*/ Object.assign({
5883
6716
  key: 0,
5884
6717
  name: __props.icon,
5885
6718
  size: iconSize.value,
5886
- class: "ew-input__prefix"
6719
+ class: "ev-input__prefix"
5887
6720
  }, null, 8, ["name", "size"])) : createCommentVNode("", true),
5888
6721
  createElementVNode("input", mergeProps(filteredAttrs.value, {
5889
- class: "ew-input__inner",
6722
+ class: "ev-input__inner",
5890
6723
  value: __props.modelValue,
5891
6724
  type: __props.type,
5892
6725
  disabled: __props.disabled,
@@ -5896,7 +6729,7 @@ var _sfc_main$29 = /*@__PURE__*/ Object.assign({
5896
6729
  __props.clearable && __props.modelValue && !__props.disabled ? (openBlock(), createElementBlock("button", {
5897
6730
  key: 1,
5898
6731
  type: "button",
5899
- class: "ew-input__clear",
6732
+ class: "ev-input__clear",
5900
6733
  "aria-label": "清空",
5901
6734
  onClick: clear
5902
6735
  }, [createVNode(_sfc_main$24, {
@@ -5919,11 +6752,11 @@ var _hoisted_1$6 = [
5919
6752
  ];
5920
6753
  var _hoisted_2$5 = {
5921
6754
  key: 0,
5922
- class: "ew-textarea__count"
6755
+ class: "ev-textarea__count"
5923
6756
  };
5924
- var _sfc_main$51 = /*@__PURE__*/ Object.assign({
6757
+ var _sfc_main$53 = /*@__PURE__*/ Object.assign({
5925
6758
  inheritAttrs: false,
5926
- name: "EwTextarea"
6759
+ name: "EvTextarea"
5927
6760
  }, {
5928
6761
  __name: "index",
5929
6762
  props: {
@@ -5957,7 +6790,7 @@ var _sfc_main$51 = /*@__PURE__*/ Object.assign({
5957
6790
  emits: ["update:modelValue", "input"],
5958
6791
  setup(__props, { emit: __emit }) {
5959
6792
  /**
5960
- * EwTextarea — 多行文本(留言/评论正文)
6793
+ * EvTextarea — 多行文本(留言/评论正文)
5961
6794
  * rows 控制高度,maxlength 显示字数计数;穿透 attrs 到原生 textarea
5962
6795
  */
5963
6796
  const props = __props;
@@ -5973,11 +6806,11 @@ var _sfc_main$51 = /*@__PURE__*/ Object.assign({
5973
6806
  emit("input", e);
5974
6807
  }
5975
6808
  return (_ctx, _cache) => {
5976
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-textarea", {
6809
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ev-textarea", {
5977
6810
  "is-disabled": __props.disabled,
5978
6811
  "is-error": __props.error
5979
6812
  }]) }, [createElementVNode("textarea", mergeProps(filteredAttrs.value, {
5980
- class: "ew-textarea__inner",
6813
+ class: "ev-textarea__inner",
5981
6814
  value: __props.modelValue,
5982
6815
  disabled: __props.disabled,
5983
6816
  placeholder: __props.placeholder,
@@ -5992,21 +6825,21 @@ var _sfc_main$51 = /*@__PURE__*/ Object.assign({
5992
6825
  //#region src/components/field/index.vue
5993
6826
  var _hoisted_1$5 = {
5994
6827
  key: 0,
5995
- class: "ew-field__label"
6828
+ class: "ev-field__label"
5996
6829
  };
5997
6830
  var _hoisted_2$4 = {
5998
6831
  key: 0,
5999
- class: "ew-field__required",
6832
+ class: "ev-field__required",
6000
6833
  "aria-hidden": "true"
6001
6834
  };
6002
- var _hoisted_3$3 = { class: "ew-field__control" };
6835
+ var _hoisted_3$3 = { class: "ev-field__control" };
6003
6836
  var _hoisted_4$3 = {
6004
6837
  key: 1,
6005
- class: "ew-field__error"
6838
+ class: "ev-field__error"
6006
6839
  };
6007
6840
  var _hoisted_5$2 = {
6008
6841
  key: 2,
6009
- class: "ew-field__hint"
6842
+ class: "ev-field__hint"
6010
6843
  };
6011
6844
  var _sfc_main$21 = {
6012
6845
  __name: "index",
@@ -6031,11 +6864,11 @@ var _sfc_main$21 = {
6031
6864
  },
6032
6865
  setup(__props) {
6033
6866
  /**
6034
- * EwField — 表单字段包装(标签 + 控件 + 错误/提示)
6035
- * 与 EwInput / EwTextarea / EwSelect 组合出前台提交表单;error 传非空字符串即错误态
6867
+ * EvField — 表单字段包装(标签 + 控件 + 错误/提示)
6868
+ * 与 EvInput / EvTextarea / EvSelect 组合出前台提交表单;error 传非空字符串即错误态
6036
6869
  */
6037
6870
  return (_ctx, _cache) => {
6038
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-field", { "is-error": !!__props.error }]) }, [
6871
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ev-field", { "is-error": !!__props.error }]) }, [
6039
6872
  __props.label || _ctx.$slots.label ? (openBlock(), createElementBlock("label", _hoisted_1$5, [renderSlot(_ctx.$slots, "label", {}, () => [createTextVNode(toDisplayString(__props.label), 1)]), __props.required ? (openBlock(), createElementBlock("span", _hoisted_2$4, "*")) : createCommentVNode("", true)])) : createCommentVNode("", true),
6040
6873
  createElementVNode("div", _hoisted_3$3, [renderSlot(_ctx.$slots, "default")]),
6041
6874
  __props.error ? (openBlock(), createElementBlock("span", _hoisted_4$3, toDisplayString(__props.error), 1)) : __props.hint || _ctx.$slots.hint ? (openBlock(), createElementBlock("span", _hoisted_5$2, [renderSlot(_ctx.$slots, "hint", {}, () => [createTextVNode(toDisplayString(__props.hint), 1)])])) : createCommentVNode("", true)
@@ -6046,7 +6879,7 @@ var _sfc_main$21 = {
6046
6879
  //#endregion
6047
6880
  //#region src/utils/scroll.js
6048
6881
  /**
6049
- * 滚动定位工具 — 移动组件(EwPullRefresh / EwLoadMore 等)共用
6882
+ * 滚动定位工具 — 移动组件(EvPullRefresh / EvLoadMore 等)共用
6050
6883
  */
6051
6884
  /** 元素是否为可纵向滚动的容器 */
6052
6885
  function isScrollable(el) {
@@ -6071,9 +6904,9 @@ function getScrollTop(target) {
6071
6904
  //#region src/components/pull-refresh/index.vue
6072
6905
  var _hoisted_1$4 = {
6073
6906
  key: 0,
6074
- class: "ew-pull-refresh__spinner"
6907
+ class: "ev-pull-refresh__spinner"
6075
6908
  };
6076
- var _sfc_main$40 = /*@__PURE__*/ Object.assign({ name: "EwPullRefresh" }, {
6909
+ var _sfc_main$42 = /*@__PURE__*/ Object.assign({ name: "EvPullRefresh" }, {
6077
6910
  __name: "index",
6078
6911
  props: {
6079
6912
  /** 刷新中状态(v-model):置 true 进入 loading,加载完成置 false 自动展示成功态后收回 */
@@ -6123,7 +6956,7 @@ var _sfc_main$40 = /*@__PURE__*/ Object.assign({ name: "EwPullRefresh" }, {
6123
6956
  ],
6124
6957
  setup(__props, { expose: __expose, emit: __emit }) {
6125
6958
  /**
6126
- * EwPullRefresh — 下拉刷新
6959
+ * EvPullRefresh — 下拉刷新
6127
6960
  * 触屏下拉手势:顶部下拉 → 释放触发 refresh(v-model 同步 loading 态 → 置 false 收尾)。
6128
6961
  * 滚动容器不在顶部时不拦截手势;超出触发距离后阻尼跟手。
6129
6962
  * 状态机:normal → pulling(未到阈值)→ loosing(释放即刷新)→ loading → success → normal
@@ -6143,7 +6976,7 @@ var _sfc_main$40 = /*@__PURE__*/ Object.assign({ name: "EwPullRefresh" }, {
6143
6976
  success: props.successText
6144
6977
  })[status.value] ?? "");
6145
6978
  const trackStyle = computed(() => ({
6146
- transition: touching.value ? "none" : `transform ${props.animationDuration}ms var(--ew-ease-smooth)`,
6979
+ transition: touching.value ? "none" : `transform ${props.animationDuration}ms var(--ev-ease-smooth)`,
6147
6980
  transform: `translate3d(0, ${distance.value}px, 0)`
6148
6981
  }));
6149
6982
  watch(status, (val, old) => {
@@ -6246,12 +7079,12 @@ var _sfc_main$40 = /*@__PURE__*/ Object.assign({ name: "EwPullRefresh" }, {
6246
7079
  return openBlock(), createElementBlock("div", {
6247
7080
  ref_key: "rootRef",
6248
7081
  ref: rootRef,
6249
- class: "ew-pull-refresh"
7082
+ class: "ev-pull-refresh"
6250
7083
  }, [createElementVNode("div", {
6251
- class: "ew-pull-refresh__track",
7084
+ class: "ev-pull-refresh__track",
6252
7085
  style: normalizeStyle(trackStyle.value)
6253
7086
  }, [createElementVNode("div", {
6254
- class: "ew-pull-refresh__head",
7087
+ class: "ev-pull-refresh__head",
6255
7088
  style: normalizeStyle({
6256
7089
  height: `${__props.headHeight}px`,
6257
7090
  top: `${-__props.headHeight - 1}px`
@@ -6259,15 +7092,15 @@ var _sfc_main$40 = /*@__PURE__*/ Object.assign({ name: "EwPullRefresh" }, {
6259
7092
  }, [renderSlot(_ctx.$slots, "head", {
6260
7093
  status: status.value,
6261
7094
  distance: distance.value
6262
- }, () => [createElementVNode("div", { class: normalizeClass(["ew-pull-refresh__text", `is-${status.value}`]) }, [status.value === "loading" ? (openBlock(), createElementBlock("span", _hoisted_1$4)) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(statusText.value), 1)], 2)])], 4), renderSlot(_ctx.$slots, "default")], 4)], 512);
7095
+ }, () => [createElementVNode("div", { class: normalizeClass(["ev-pull-refresh__text", `is-${status.value}`]) }, [status.value === "loading" ? (openBlock(), createElementBlock("span", _hoisted_1$4)) : createCommentVNode("", true), createElementVNode("span", null, toDisplayString(statusText.value), 1)], 2)])], 4), renderSlot(_ctx.$slots, "default")], 4)], 512);
6263
7096
  };
6264
7097
  }
6265
7098
  });
6266
7099
  //#endregion
6267
7100
  //#region src/components/load-more/index.vue
6268
7101
  var _hoisted_1$3 = ["disabled"];
6269
- var _hoisted_2$3 = { class: "ew-load-more__text" };
6270
- var _sfc_main$31 = /*@__PURE__*/ Object.assign({ name: "EwLoadMore" }, {
7102
+ var _hoisted_2$3 = { class: "ev-load-more__text" };
7103
+ var _sfc_main$31 = /*@__PURE__*/ Object.assign({ name: "EvLoadMore" }, {
6271
7104
  __name: "index",
6272
7105
  props: {
6273
7106
  /** 列表状态(v-model:status):idle | loading | noMore | error */
@@ -6315,7 +7148,7 @@ var _sfc_main$31 = /*@__PURE__*/ Object.assign({ name: "EwLoadMore" }, {
6315
7148
  emits: ["update:status", "load-more"],
6316
7149
  setup(__props, { expose: __expose, emit: __emit }) {
6317
7150
  /**
6318
- * EwLoadMore — 上拉加载 / 加载更多
7151
+ * EvLoadMore — 上拉加载 / 加载更多
6319
7152
  * 列表尾部状态条:idle(可点击/触底自动)→ loading(外部拉数据)→ idle / noMore / error。
6320
7153
  * 状态由父级持有(v-model:status):触发时组件置 loading 并发出 load-more,
6321
7154
  * 加载完成后由父级改回 idle(还有数据)或 noMore(到底)/ error(失败可点重试)。
@@ -6356,17 +7189,17 @@ var _sfc_main$31 = /*@__PURE__*/ Object.assign({ name: "EwLoadMore" }, {
6356
7189
  /** 手动触发一次加载(等同点击) */
6357
7190
  trigger });
6358
7191
  return (_ctx, _cache) => {
6359
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-load-more", `is-${__props.status}`]) }, [__props.autoLoad && !__props.disabled ? (openBlock(), createElementBlock("div", {
7192
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ev-load-more", `is-${__props.status}`]) }, [__props.autoLoad && !__props.disabled ? (openBlock(), createElementBlock("div", {
6360
7193
  key: 0,
6361
7194
  ref_key: "sentinelRef",
6362
7195
  ref: sentinelRef,
6363
- class: "ew-load-more__sentinel"
7196
+ class: "ev-load-more__sentinel"
6364
7197
  }, null, 512)) : createCommentVNode("", true), createElementVNode("button", {
6365
7198
  type: "button",
6366
- class: "ew-load-more__body",
7199
+ class: "ev-load-more__body",
6367
7200
  disabled: __props.disabled || __props.status === "loading" || __props.status === "noMore",
6368
7201
  onClick: trigger
6369
- }, [__props.status === "loading" ? renderSlot(_ctx.$slots, "loading", {}, () => [_cache[0] || (_cache[0] = createElementVNode("span", { class: "ew-load-more__spinner" }, null, -1))], void 0, 0) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default", { status: __props.status }, () => [createElementVNode("span", _hoisted_2$3, toDisplayString(statusText.value), 1)])], 8, _hoisted_1$3)], 2);
7202
+ }, [__props.status === "loading" ? renderSlot(_ctx.$slots, "loading", {}, () => [_cache[0] || (_cache[0] = createElementVNode("span", { class: "ev-load-more__spinner" }, null, -1))], void 0, 0) : createCommentVNode("", true), renderSlot(_ctx.$slots, "default", { status: __props.status }, () => [createElementVNode("span", _hoisted_2$3, toDisplayString(statusText.value), 1)])], 8, _hoisted_1$3)], 2);
6370
7203
  };
6371
7204
  }
6372
7205
  });
@@ -6375,16 +7208,16 @@ trigger });
6375
7208
  var _hoisted_1$2 = ["aria-label"];
6376
7209
  var _hoisted_2$2 = {
6377
7210
  key: 0,
6378
- class: "ew-action-sheet__title"
7211
+ class: "ev-action-sheet__title"
6379
7212
  };
6380
- var _hoisted_3$2 = { class: "ew-action-sheet__list" };
7213
+ var _hoisted_3$2 = { class: "ev-action-sheet__list" };
6381
7214
  var _hoisted_4$2 = ["disabled", "onClick"];
6382
- var _hoisted_5$1 = { class: "ew-action-sheet__name" };
7215
+ var _hoisted_5$1 = { class: "ev-action-sheet__name" };
6383
7216
  var _hoisted_6$1 = {
6384
7217
  key: 0,
6385
- class: "ew-action-sheet__subname"
7218
+ class: "ev-action-sheet__subname"
6386
7219
  };
6387
- var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EwActionSheet" }, {
7220
+ var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EvActionSheet" }, {
6388
7221
  __name: "index",
6389
7222
  props: {
6390
7223
  modelValue: {
@@ -6448,29 +7281,18 @@ var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EwActionSheet" }, {
6448
7281
  ],
6449
7282
  setup(__props, { emit: __emit }) {
6450
7283
  /**
6451
- * EwActionSheet — 底部动作面板
7284
+ * EvActionSheet — 底部动作面板
6452
7285
  * 移动端「更多操作」的标准形态:底部滑入的纵向动作列表 + 取消栏,
6453
7286
  * 替代 hover 类菜单在触屏上的缺位。动作项 { name, subname, color, disabled }。
6454
- * 前台库保持零外部依赖:滚动锁定 / ESC 关闭 / 层级自增均在组件内实现。
7287
+ * 前台库保持零外部依赖:ESC 关闭 / 层级自增在组件内实现,滚动锁定走共享 useScrollLock。
6455
7288
  */
6456
7289
  const props = __props;
6457
7290
  const emit = __emit;
6458
7291
  const panelRef = ref(null);
6459
7292
  let zSeed = 0;
6460
7293
  const zIndex = computed(() => 2e3 + zSeed);
6461
- let lockCount = 0;
6462
7294
  const visible = computed(() => props.modelValue);
6463
7295
  const hasDom = typeof window !== "undefined";
6464
- function lock() {
6465
- if (lockCount > 0) return;
6466
- lockCount = 1;
6467
- document.body.style.overflow = "hidden";
6468
- }
6469
- function unlock() {
6470
- if (lockCount === 0) return;
6471
- lockCount = 0;
6472
- document.body.style.overflow = "";
6473
- }
6474
7296
  function onKeydown(e) {
6475
7297
  if (e.key === "Escape" && props.closeOnPressEscape) handleClose();
6476
7298
  }
@@ -6478,15 +7300,15 @@ var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EwActionSheet" }, {
6478
7300
  if (val) {
6479
7301
  emit("open");
6480
7302
  zSeed += 1;
6481
- if (props.lockScroll && hasDom) lock();
7303
+ if (props.lockScroll && hasDom) lockBodyScroll();
6482
7304
  if (hasDom) window.addEventListener("keydown", onKeydown);
6483
7305
  } else {
6484
- if (props.lockScroll && hasDom) unlock();
7306
+ if (props.lockScroll && hasDom) unlockBodyScroll();
6485
7307
  if (hasDom) window.removeEventListener("keydown", onKeydown);
6486
7308
  }
6487
7309
  }, { immediate: true });
6488
7310
  onBeforeUnmount(() => {
6489
- unlock();
7311
+ if (hasDom) unlockBodyScroll();
6490
7312
  window.removeEventListener("keydown", onKeydown);
6491
7313
  });
6492
7314
  function hide() {
@@ -6518,19 +7340,19 @@ var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EwActionSheet" }, {
6518
7340
  to: "body",
6519
7341
  disabled: !__props.appendToBody
6520
7342
  }, [createVNode(Transition, {
6521
- name: "ew-action-sheet-fade",
7343
+ name: "ev-action-sheet-fade",
6522
7344
  onAfterEnter: _cache[0] || (_cache[0] = ($event) => emit("opened")),
6523
7345
  onAfterLeave: _cache[1] || (_cache[1] = ($event) => emit("closed"))
6524
7346
  }, {
6525
7347
  default: withCtx(() => [visible.value ? (openBlock(), createElementBlock("div", {
6526
7348
  key: 0,
6527
- class: "ew-action-sheet__overlay",
7349
+ class: "ev-action-sheet__overlay",
6528
7350
  style: normalizeStyle({ zIndex: zIndex.value }),
6529
7351
  onClick: withModifiers(onOverlayClick, ["self"])
6530
7352
  }, [createElementVNode("div", {
6531
7353
  ref_key: "panelRef",
6532
7354
  ref: panelRef,
6533
- class: normalizeClass(["ew-action-sheet", { "is-round": __props.round }]),
7355
+ class: normalizeClass(["ev-action-sheet", { "is-round": __props.round }]),
6534
7356
  role: "dialog",
6535
7357
  "aria-modal": "true",
6536
7358
  "aria-label": __props.title || "action sheet"
@@ -6540,7 +7362,7 @@ var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EwActionSheet" }, {
6540
7362
  return openBlock(), createElementBlock("button", {
6541
7363
  key: index,
6542
7364
  type: "button",
6543
- class: normalizeClass(["ew-action-sheet__item", { "is-disabled": action.disabled }]),
7365
+ class: normalizeClass(["ev-action-sheet__item", { "is-disabled": action.disabled }]),
6544
7366
  style: normalizeStyle({ color: action.color }),
6545
7367
  disabled: action.disabled,
6546
7368
  onClick: ($event) => onAction(action, index)
@@ -6549,7 +7371,7 @@ var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EwActionSheet" }, {
6549
7371
  __props.cancelText ? (openBlock(), createElementBlock("button", {
6550
7372
  key: 1,
6551
7373
  type: "button",
6552
- class: "ew-action-sheet__cancel",
7374
+ class: "ev-action-sheet__cancel",
6553
7375
  onClick: onCancel
6554
7376
  }, toDisplayString(__props.cancelText), 1)) : createCommentVNode("", true)
6555
7377
  ], 10, _hoisted_1$2)], 4)) : createCommentVNode("", true)]),
@@ -6560,7 +7382,7 @@ var _sfc_main = /*@__PURE__*/ Object.assign({ name: "EwActionSheet" }, {
6560
7382
  });
6561
7383
  //#endregion
6562
7384
  //#region src/components/tabbar/index.vue
6563
- var _sfc_main$47 = /*@__PURE__*/ Object.assign({ name: "EwTabbar" }, {
7385
+ var _sfc_main$49 = /*@__PURE__*/ Object.assign({ name: "EvTabbar" }, {
6564
7386
  __name: "index",
6565
7387
  props: {
6566
7388
  /** 当前激活项的 name(未设置 name 时为索引) */
@@ -6591,7 +7413,7 @@ var _sfc_main$47 = /*@__PURE__*/ Object.assign({ name: "EwTabbar" }, {
6591
7413
  emits: ["update:modelValue", "change"],
6592
7414
  setup(__props, { emit: __emit }) {
6593
7415
  /**
6594
- * EwTabbar — 底部标签栏(配 EwTabbarItem 使用)
7416
+ * EvTabbar — 底部标签栏(配 EvTabbarItem 使用)
6595
7417
  * 移动端一级导航:固定吸底的页签入口,页内内容切换由业务持有(v-model)。
6596
7418
  * fixed 模式脱离文档流吸底并适配安全区,默认渲染等高占位防止遮挡内容。
6597
7419
  */
@@ -6635,9 +7457,9 @@ var _sfc_main$47 = /*@__PURE__*/ Object.assign({ name: "EwTabbar" }, {
6635
7457
  return (_ctx, _cache) => {
6636
7458
  return openBlock(), createElementBlock("div", null, [__props.fixed && __props.placeholder ? (openBlock(), createElementBlock("div", {
6637
7459
  key: 0,
6638
- class: "ew-tabbar__placeholder",
7460
+ class: "ev-tabbar__placeholder",
6639
7461
  style: normalizeStyle({ height: `${barHeight.value}px` })
6640
- }, null, 4)) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(["ew-tabbar", {
7462
+ }, null, 4)) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(["ev-tabbar", {
6641
7463
  "is-fixed": __props.fixed,
6642
7464
  "is-border": __props.border,
6643
7465
  "is-safe": __props.safeAreaInsetBottom
@@ -6650,26 +7472,26 @@ var _sfc_main$47 = /*@__PURE__*/ Object.assign({ name: "EwTabbar" }, {
6650
7472
  var _hoisted_1$1 = ["aria-selected"];
6651
7473
  var _hoisted_2$1 = {
6652
7474
  key: 0,
6653
- class: "ew-tabbar-item__icon"
7475
+ class: "ev-tabbar-item__icon"
6654
7476
  };
6655
7477
  var _hoisted_3$1 = {
6656
7478
  key: 0,
6657
- class: "ew-tabbar-item__dot"
7479
+ class: "ev-tabbar-item__dot"
6658
7480
  };
6659
7481
  var _hoisted_4$1 = {
6660
7482
  key: 1,
6661
- class: "ew-tabbar-item__badge"
7483
+ class: "ev-tabbar-item__badge"
6662
7484
  };
6663
- var _hoisted_5 = { class: "ew-tabbar-item__text" };
7485
+ var _hoisted_5 = { class: "ev-tabbar-item__text" };
6664
7486
  var _hoisted_6 = {
6665
7487
  key: 0,
6666
- class: "ew-tabbar-item__dot is-inline"
7488
+ class: "ev-tabbar-item__dot is-inline"
6667
7489
  };
6668
7490
  var _hoisted_7 = {
6669
7491
  key: 1,
6670
- class: "ew-tabbar-item__badge is-inline"
7492
+ class: "ev-tabbar-item__badge is-inline"
6671
7493
  };
6672
- var _sfc_main$48 = /*@__PURE__*/ Object.assign({ name: "EwTabbarItem" }, {
7494
+ var _sfc_main$50 = /*@__PURE__*/ Object.assign({ name: "EvTabbarItem" }, {
6673
7495
  __name: "item",
6674
7496
  props: {
6675
7497
  /** 标识,缺省用注册顺序索引 */
@@ -6677,7 +7499,7 @@ var _sfc_main$48 = /*@__PURE__*/ Object.assign({ name: "EwTabbarItem" }, {
6677
7499
  type: [String, Number],
6678
7500
  default: ""
6679
7501
  },
6680
- /** 图标名(EwIcon 注册名),需自定义选中态时用 #icon 插槽 */
7502
+ /** 图标名(EvIcon 注册名),需自定义选中态时用 #icon 插槽 */
6681
7503
  icon: {
6682
7504
  type: String,
6683
7505
  default: ""
@@ -6699,7 +7521,7 @@ var _sfc_main$48 = /*@__PURE__*/ Object.assign({ name: "EwTabbarItem" }, {
6699
7521
  },
6700
7522
  setup(__props) {
6701
7523
  /**
6702
- * EwTabbarItem — 底部标签栏项
7524
+ * EvTabbarItem — 底部标签栏项
6703
7525
  * name 缺省时以注册顺序的索引作为标识;icon 插槽携带 active 支持选中态图标切换。
6704
7526
  * 纯文字页签(无 icon)时 badge/dot 内联在文字后,避免悬空叠字。
6705
7527
  */
@@ -6717,7 +7539,7 @@ var _sfc_main$48 = /*@__PURE__*/ Object.assign({ name: "EwTabbarItem" }, {
6717
7539
  }
6718
7540
  return (_ctx, _cache) => {
6719
7541
  return openBlock(), createElementBlock("div", {
6720
- class: normalizeClass(["ew-tabbar-item", {
7542
+ class: normalizeClass(["ev-tabbar-item", {
6721
7543
  "is-active": isActive.value,
6722
7544
  "is-disabled": __props.disabled
6723
7545
  }]),
@@ -6735,19 +7557,19 @@ var _sfc_main$48 = /*@__PURE__*/ Object.assign({ name: "EwTabbarItem" }, {
6735
7557
  //#region src/components/nav-bar/index.vue
6736
7558
  var _hoisted_1 = {
6737
7559
  key: 0,
6738
- class: "ew-nav-bar__placeholder",
7560
+ class: "ev-nav-bar__placeholder",
6739
7561
  "aria-hidden": "true"
6740
7562
  };
6741
7563
  var _hoisted_2 = {
6742
7564
  key: 1,
6743
- class: "ew-nav-bar__text"
7565
+ class: "ev-nav-bar__text"
6744
7566
  };
6745
- var _hoisted_3 = { class: "ew-nav-bar__title" };
7567
+ var _hoisted_3 = { class: "ev-nav-bar__title" };
6746
7568
  var _hoisted_4 = {
6747
7569
  key: 0,
6748
- class: "ew-nav-bar__text"
7570
+ class: "ev-nav-bar__text"
6749
7571
  };
6750
- var _sfc_main$35 = /*@__PURE__*/ Object.assign({ name: "EwNavBar" }, {
7572
+ var _sfc_main$37 = /*@__PURE__*/ Object.assign({ name: "EvNavBar" }, {
6751
7573
  __name: "index",
6752
7574
  props: {
6753
7575
  /** 标题文本(title 插槽可替换) */
@@ -6794,20 +7616,20 @@ var _sfc_main$35 = /*@__PURE__*/ Object.assign({ name: "EwNavBar" }, {
6794
7616
  emits: ["click-left", "click-right"],
6795
7617
  setup(__props, { emit: __emit }) {
6796
7618
  /**
6797
- * EwNavBar — 移动端页头(返回 + 标题 + 右侧动作)
7619
+ * EvNavBar — 移动端页头(返回 + 标题 + 右侧动作)
6798
7620
  * H5 页面的标准头部:左区返回箭头/文案、居中标题(超长省略)、右区动作;
6799
7621
  * fixed 吸顶时自动吸收 env(safe-area-inset-top)(刘海屏独立 PWA 生效,普通浏览器为 0),
6800
- * 配 placeholder 生成等高占位避免内容顶到头下。区别于桌面站点的 EwNavbar
7622
+ * 配 placeholder 生成等高占位避免内容顶到头下。区别于桌面站点的 EvNavbar
6801
7623
  * 前台库零外部依赖:无滚动锁定与层级计数,固定层级默认压在弹层之下。
6802
7624
  */
6803
7625
  const emit = __emit;
6804
7626
  return (_ctx, _cache) => {
6805
- return openBlock(), createElementBlock("div", { class: normalizeClass(["ew-nav-bar", { "is-bordered": __props.bordered }]) }, [__props.fixed && __props.placeholder ? (openBlock(), createElementBlock("div", _hoisted_1)) : createCommentVNode("", true), createElementVNode("header", {
6806
- class: normalizeClass(["ew-nav-bar__inner", { "is-fixed": __props.fixed }]),
7627
+ return openBlock(), createElementBlock("div", { class: normalizeClass(["ev-nav-bar", { "is-bordered": __props.bordered }]) }, [__props.fixed && __props.placeholder ? (openBlock(), createElementBlock("div", _hoisted_1)) : createCommentVNode("", true), createElementVNode("header", {
7628
+ class: normalizeClass(["ev-nav-bar__inner", { "is-fixed": __props.fixed }]),
6807
7629
  style: normalizeStyle(__props.fixed ? { zIndex: __props.zIndex } : void 0)
6808
7630
  }, [
6809
7631
  createElementVNode("div", {
6810
- class: "ew-nav-bar__side is-left",
7632
+ class: "ev-nav-bar__side is-left",
6811
7633
  onClick: _cache[0] || (_cache[0] = ($event) => emit("click-left"))
6812
7634
  }, [renderSlot(_ctx.$slots, "left", {}, () => [__props.leftArrow ? (openBlock(), createBlock(_sfc_main$24, {
6813
7635
  key: 0,
@@ -6816,7 +7638,7 @@ var _sfc_main$35 = /*@__PURE__*/ Object.assign({ name: "EwNavBar" }, {
6816
7638
  })) : createCommentVNode("", true), __props.leftText ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(__props.leftText), 1)) : createCommentVNode("", true)])]),
6817
7639
  createElementVNode("div", _hoisted_3, [renderSlot(_ctx.$slots, "title", {}, () => [createTextVNode(toDisplayString(__props.title), 1)])]),
6818
7640
  createElementVNode("div", {
6819
- class: "ew-nav-bar__side is-right",
7641
+ class: "ev-nav-bar__side is-right",
6820
7642
  onClick: _cache[1] || (_cache[1] = ($event) => emit("click-right"))
6821
7643
  }, [renderSlot(_ctx.$slots, "right", {}, () => [__props.rightText ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(__props.rightText), 1)) : createCommentVNode("", true)])])
6822
7644
  ], 6)], 2);
@@ -6826,61 +7648,64 @@ var _sfc_main$35 = /*@__PURE__*/ Object.assign({ name: "EwNavBar" }, {
6826
7648
  //#endregion
6827
7649
  //#region src/index.js
6828
7650
  var components = {
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,
6844
- EwAlert: _sfc_main$1,
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,
6880
- EwActionSheet: _sfc_main,
6881
- EwTabbar: _sfc_main$47,
6882
- EwTabbarItem: _sfc_main$48,
6883
- EwNavBar: _sfc_main$35
7651
+ EvIcon: _sfc_main$24,
7652
+ EvButton: _sfc_main$9,
7653
+ EvIconButton: _sfc_main$25,
7654
+ EvTag: _sfc_main$52,
7655
+ EvBadge: _sfc_main$7,
7656
+ EvCard: _sfc_main$10,
7657
+ EvSection: _sfc_main$45,
7658
+ EvNavbar: _sfc_main$38,
7659
+ EvFooter: _sfc_main$22,
7660
+ EvHero: _sfc_main$23,
7661
+ EvSearchBox: _sfc_main$44,
7662
+ EvIconGrid: _sfc_main$26,
7663
+ EvFeatureGrid: _sfc_main$20,
7664
+ EvPricingCard: _sfc_main$40,
7665
+ EvFaq: _sfc_main$19,
7666
+ EvAlert: _sfc_main$1,
7667
+ EvCodeBlock: _sfc_main$12,
7668
+ EvMarkdown: _sfc_main$33,
7669
+ EvMarkdownEditor: _sfc_main$34,
7670
+ EvKeycap: _sfc_main$30,
7671
+ EvStatistic: _sfc_main$47,
7672
+ EvThemeToggle: _sfc_main$54,
7673
+ EvQuote: _sfc_main$43,
7674
+ EvConfigProvider: _sfc_main$14,
7675
+ EvTabs: _sfc_main$51,
7676
+ EvSwitch: _sfc_main$48,
7677
+ EvContainer: _sfc_main$16,
7678
+ EvAvatar: _sfc_main$5,
7679
+ EvAvatarGroup: _sfc_main$6,
7680
+ EvTimeline: _sfc_main$55,
7681
+ EvComparisonTable: _sfc_main$13,
7682
+ EvCta: _sfc_main$17,
7683
+ EvNewsletter: _sfc_main$39,
7684
+ EvLogoCloud: _sfc_main$32,
7685
+ EvVideo: _sfc_main$56,
7686
+ EvAudio: _sfc_main$4,
7687
+ EvContactForm: _sfc_main$15,
7688
+ EvCarousel: _sfc_main$11,
7689
+ EvArticleCard: _sfc_main$3,
7690
+ EvProfileCard: _sfc_main$41,
7691
+ EvArticle: _sfc_main$2,
7692
+ EvExecCard: _sfc_main$18,
7693
+ EvImageWall: _sfc_main$28,
7694
+ EvImagePreview: _sfc_main$27,
7695
+ EvWaterfall: _sfc_main$57,
7696
+ EvModal: _sfc_main$36,
7697
+ EvMarquee: _sfc_main$35,
7698
+ EvBorderBeam: _sfc_main$8,
7699
+ EvInput: _sfc_main$29,
7700
+ EvTextarea: _sfc_main$53,
7701
+ EvSelect: _sfc_main$46,
7702
+ EvField: _sfc_main$21,
7703
+ EvPullRefresh: _sfc_main$42,
7704
+ EvLoadMore: _sfc_main$31,
7705
+ EvActionSheet: _sfc_main,
7706
+ EvTabbar: _sfc_main$49,
7707
+ EvTabbarItem: _sfc_main$50,
7708
+ EvNavBar: _sfc_main$37
6884
7709
  };
6885
7710
  function install(app) {
6886
7711
  for (const [name, comp] of Object.entries(components)) app.component(name, comp);
@@ -6889,4 +7714,4 @@ function install(app) {
6889
7714
  }
6890
7715
  var src_default = { install };
6891
7716
  //#endregion
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 };
7717
+ export { EV_COLOR_PRESETS, EV_CONTAINER_PRESETS, EV_PALETTE_PRESETS, EV_RADIUS_PRESETS, EV_SPACE_PRESETS, EV_STYLE_PRESETS, _sfc_main as EvActionSheet, _sfc_main$1 as EvAlert, _sfc_main$2 as EvArticle, _sfc_main$3 as EvArticleCard, _sfc_main$4 as EvAudio, _sfc_main$5 as EvAvatar, _sfc_main$6 as EvAvatarGroup, _sfc_main$7 as EvBadge, _sfc_main$8 as EvBorderBeam, _sfc_main$9 as EvButton, _sfc_main$10 as EvCard, _sfc_main$11 as EvCarousel, _sfc_main$12 as EvCodeBlock, _sfc_main$13 as EvComparisonTable, _sfc_main$14 as EvConfigProvider, _sfc_main$15 as EvContactForm, _sfc_main$16 as EvContainer, _sfc_main$17 as EvCta, _sfc_main$18 as EvExecCard, _sfc_main$19 as EvFaq, _sfc_main$20 as EvFeatureGrid, _sfc_main$21 as EvField, _sfc_main$22 as EvFooter, _sfc_main$23 as EvHero, _sfc_main$24 as EvIcon, _sfc_main$25 as EvIconButton, _sfc_main$26 as EvIconGrid, _sfc_main$27 as EvImagePreview, _sfc_main$28 as EvImageWall, _sfc_main$29 as EvInput, _sfc_main$30 as EvKeycap, _sfc_main$31 as EvLoadMore, _sfc_main$32 as EvLogoCloud, _sfc_main$33 as EvMarkdown, _sfc_main$34 as EvMarkdownEditor, _sfc_main$35 as EvMarquee, _sfc_main$36 as EvModal, _sfc_main$37 as EvNavBar, _sfc_main$38 as EvNavbar, _sfc_main$39 as EvNewsletter, _sfc_main$40 as EvPricingCard, _sfc_main$41 as EvProfileCard, _sfc_main$42 as EvPullRefresh, _sfc_main$43 as EvQuote, _sfc_main$44 as EvSearchBox, _sfc_main$45 as EvSection, _sfc_main$46 as EvSelect, _sfc_main$47 as EvStatistic, _sfc_main$48 as EvSwitch, _sfc_main$49 as EvTabbar, _sfc_main$50 as EvTabbarItem, _sfc_main$51 as EvTabs, _sfc_main$52 as EvTag, _sfc_main$53 as EvTextarea, _sfc_main$54 as EvThemeToggle, _sfc_main$55 as EvTimeline, _sfc_main$56 as EvVideo, _sfc_main$57 as EvWaterfall, components, src_default as default, ensureViewportFit, getIconByName, getIconNames, hasIcon, initTheme, install, loadShowcaseIcons, registerIcons, resolveThemeVars, useCopy, useSafeArea, useTheme, useThemeConfig, revealDirective as vReveal };