@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/README.md +13 -21
- package/dist/evoke-ui.css +2677 -2216
- package/dist/index.mjs +1602 -777
- package/dist/showcase-icons.mjs +3 -3
- package/package.json +1 -1
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 = "
|
|
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
|
-
* 主题预设 — 供
|
|
145
|
+
* 主题预设 — 供 EvConfigProvider / 定制器与消费方直接取用
|
|
146
146
|
*/
|
|
147
147
|
/** 主色预设(name → hex) */
|
|
148
|
-
var
|
|
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
|
|
179
|
+
var EV_PALETTE_PRESETS = {
|
|
180
180
|
classic: {
|
|
181
181
|
label: "经典",
|
|
182
182
|
description: "Launch 系高辨识度主色,SaaS 与工具站的稳妥选择",
|
|
183
|
-
colors: Object.values(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 自定义属性(--
|
|
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["--
|
|
552
|
-
vars["--
|
|
553
|
-
vars["--
|
|
554
|
-
vars["--
|
|
555
|
-
vars["--
|
|
556
|
-
vars["--
|
|
557
|
-
vars["--
|
|
558
|
-
vars["--
|
|
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[`--
|
|
565
|
-
vars[`--
|
|
566
|
-
vars[`--
|
|
567
|
-
vars[`--
|
|
568
|
-
vars[`--
|
|
569
|
-
vars[`--
|
|
570
|
-
vars[`--
|
|
571
|
-
vars[`--
|
|
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 =
|
|
573
|
+
const radiusPreset = EV_RADIUS_PRESETS[radius];
|
|
574
574
|
if (radiusPreset) {
|
|
575
575
|
const s = radiusPreset.scale;
|
|
576
|
-
vars["--
|
|
577
|
-
vars["--
|
|
578
|
-
vars["--
|
|
579
|
-
vars["--
|
|
580
|
-
vars["--
|
|
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 =
|
|
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[`--
|
|
599
|
+
vars[`--ev-${names[i]}`] = `${Math.round(px * s)}px`;
|
|
600
600
|
});
|
|
601
601
|
}
|
|
602
|
-
const containerPreset =
|
|
603
|
-
if (containerPreset) vars["--
|
|
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 的 --
|
|
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
|
-
"--
|
|
667
|
-
"--
|
|
668
|
-
"--
|
|
669
|
-
"--
|
|
670
|
-
"--
|
|
671
|
-
"--
|
|
672
|
-
"--
|
|
673
|
-
"--
|
|
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(`--
|
|
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
|
-
"--
|
|
708
|
-
"--
|
|
709
|
-
"--
|
|
710
|
-
"--
|
|
711
|
-
"--
|
|
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(`--
|
|
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("--
|
|
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-
|
|
737
|
-
else document.documentElement.removeAttribute("data-
|
|
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
|
-
* 应用一个风格方案(
|
|
745
|
+
* 应用一个风格方案(EV_STYLE_PRESETS 的 key)
|
|
746
746
|
* 一整套 主色/圆角/间距/容器宽 即时生效
|
|
747
747
|
*/
|
|
748
748
|
function applyPreset(key) {
|
|
749
|
-
const preset =
|
|
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
|
-
/** 一次性应用整份配置(
|
|
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 的 .
|
|
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("
|
|
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
|
-
*
|
|
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
|
-
*
|
|
1209
|
+
* EvIcon 图标注册表(扁平命名空间)
|
|
1178
1210
|
*
|
|
1179
1211
|
* 解析优先级:custom(运行时注册)→ 核心 SVG 集(Remix 静态快照,运行时零依赖)→ 展示集(已加载时)
|
|
1180
1212
|
*
|
|
1181
1213
|
* Usage:
|
|
1182
|
-
* <
|
|
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
|
-
*
|
|
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
|
-
*
|
|
1265
|
-
* 根节点挂
|
|
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: "
|
|
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$
|
|
1324
|
+
var _hoisted_1$48 = {
|
|
1293
1325
|
key: 0,
|
|
1294
|
-
class: "
|
|
1326
|
+
class: "ev-button__loading"
|
|
1295
1327
|
};
|
|
1296
|
-
var _hoisted_2$
|
|
1328
|
+
var _hoisted_2$42 = {
|
|
1297
1329
|
key: 2,
|
|
1298
|
-
class: "
|
|
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
|
-
*
|
|
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
|
-
"
|
|
1411
|
-
`
|
|
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$
|
|
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: "
|
|
1470
|
+
class: "ev-button__icon"
|
|
1439
1471
|
}, null, 8, ["name", "size"])) : createCommentVNode("", true),
|
|
1440
|
-
_ctx.$slots.default ? (openBlock(), createElementBlock("span", _hoisted_2$
|
|
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: "
|
|
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$
|
|
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
|
-
*
|
|
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
|
-
"
|
|
1543
|
-
`
|
|
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$
|
|
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$
|
|
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
|
-
*
|
|
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
|
-
"
|
|
1620
|
-
`
|
|
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: "
|
|
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: "
|
|
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
|
-
*
|
|
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(["
|
|
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
|
-
"
|
|
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$
|
|
1802
|
+
var _hoisted_1$46 = {
|
|
1771
1803
|
key: 0,
|
|
1772
|
-
class: "
|
|
1804
|
+
class: "ev-section__eyebrow"
|
|
1773
1805
|
};
|
|
1774
|
-
var _hoisted_2$
|
|
1806
|
+
var _hoisted_2$41 = {
|
|
1775
1807
|
key: 1,
|
|
1776
|
-
class: "
|
|
1808
|
+
class: "ev-section__title"
|
|
1777
1809
|
};
|
|
1778
|
-
var _hoisted_3$
|
|
1810
|
+
var _hoisted_3$34 = {
|
|
1779
1811
|
key: 2,
|
|
1780
|
-
class: "
|
|
1812
|
+
class: "ev-section__description"
|
|
1781
1813
|
};
|
|
1782
|
-
var _hoisted_4$
|
|
1814
|
+
var _hoisted_4$32 = {
|
|
1783
1815
|
key: 3,
|
|
1784
|
-
class: "
|
|
1816
|
+
class: "ev-section__body"
|
|
1785
1817
|
};
|
|
1786
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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
|
-
"
|
|
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$
|
|
1841
|
-
__props.title || _ctx.$slots.title ? (openBlock(), createElementBlock("h2", _hoisted_2$
|
|
1842
|
-
__props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_3$
|
|
1843
|
-
_ctx.$slots.default ? (openBlock(), createElementBlock("div", _hoisted_4$
|
|
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$
|
|
1851
|
-
var _hoisted_2$
|
|
1852
|
-
var _hoisted_3$
|
|
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: "
|
|
1887
|
+
class: "ev-navbar__logo"
|
|
1856
1888
|
};
|
|
1857
|
-
var _hoisted_4$
|
|
1858
|
-
var _hoisted_5$
|
|
1889
|
+
var _hoisted_4$31 = ["src"];
|
|
1890
|
+
var _hoisted_5$25 = {
|
|
1859
1891
|
key: 2,
|
|
1860
|
-
class: "
|
|
1892
|
+
class: "ev-navbar__logo-text"
|
|
1861
1893
|
};
|
|
1862
1894
|
var _hoisted_6$15 = {
|
|
1863
1895
|
key: 0,
|
|
1864
|
-
class: "
|
|
1896
|
+
class: "ev-navbar__nav",
|
|
1865
1897
|
"aria-label": "主导航"
|
|
1866
1898
|
};
|
|
1867
|
-
var _hoisted_7$12 = { class: "
|
|
1899
|
+
var _hoisted_7$12 = { class: "ev-navbar__actions" };
|
|
1868
1900
|
var _hoisted_8$11 = {
|
|
1869
1901
|
key: 0,
|
|
1870
|
-
class: "
|
|
1902
|
+
class: "ev-navbar__mobile",
|
|
1871
1903
|
"aria-label": "移动端导航"
|
|
1872
1904
|
};
|
|
1873
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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(["
|
|
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$
|
|
1972
|
-
createElementVNode("div", _hoisted_2$
|
|
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: "
|
|
1981
|
-
}, null, 8, _hoisted_4$
|
|
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(["
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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$
|
|
2032
|
-
var _hoisted_2$
|
|
2063
|
+
var _hoisted_1$44 = { class: "ev-container" };
|
|
2064
|
+
var _hoisted_2$39 = {
|
|
2033
2065
|
key: 0,
|
|
2034
|
-
class: "
|
|
2066
|
+
class: "ev-footer__main"
|
|
2035
2067
|
};
|
|
2036
|
-
var _hoisted_3$
|
|
2037
|
-
var _hoisted_4$
|
|
2068
|
+
var _hoisted_3$32 = { class: "ev-footer__brand" };
|
|
2069
|
+
var _hoisted_4$30 = {
|
|
2038
2070
|
key: 0,
|
|
2039
|
-
class: "
|
|
2071
|
+
class: "ev-footer__logo"
|
|
2040
2072
|
};
|
|
2041
|
-
var _hoisted_5$
|
|
2073
|
+
var _hoisted_5$24 = {
|
|
2042
2074
|
key: 1,
|
|
2043
|
-
class: "
|
|
2075
|
+
class: "ev-footer__slogan"
|
|
2044
2076
|
};
|
|
2045
2077
|
var _hoisted_6$14 = {
|
|
2046
2078
|
key: 2,
|
|
2047
|
-
class: "
|
|
2079
|
+
class: "ev-footer__social"
|
|
2048
2080
|
};
|
|
2049
2081
|
var _hoisted_7$11 = ["aria-label"];
|
|
2050
|
-
var _hoisted_8$10 = { class: "
|
|
2051
|
-
var _hoisted_9$
|
|
2052
|
-
var _hoisted_10$4 = { class: "
|
|
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: "
|
|
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
|
-
*
|
|
2125
|
+
* EvFooter — 站点页脚
|
|
2094
2126
|
* columns [{ title, links: [{ label, href, target }] }] 多栏链接 + 品牌区 + 底部版权条
|
|
2095
2127
|
*/
|
|
2096
2128
|
return (_ctx, _cache) => {
|
|
2097
|
-
return openBlock(), createElementBlock("footer", { class: normalizeClass(["
|
|
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$
|
|
2102
|
-
__props.logoText ? (openBlock(), createElementBlock("div", _hoisted_4$
|
|
2103
|
-
__props.slogan ? (openBlock(), createElementBlock("p", _hoisted_5$
|
|
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: "
|
|
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: "
|
|
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$
|
|
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$
|
|
2128
|
-
var _hoisted_2$
|
|
2129
|
-
var _hoisted_3$
|
|
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: "
|
|
2132
|
-
"data-
|
|
2163
|
+
class: "ev-hero__badge",
|
|
2164
|
+
"data-ev-hero-item": ""
|
|
2133
2165
|
};
|
|
2134
|
-
var _hoisted_4$
|
|
2135
|
-
class: "
|
|
2136
|
-
"data-
|
|
2166
|
+
var _hoisted_4$29 = {
|
|
2167
|
+
class: "ev-hero__title",
|
|
2168
|
+
"data-ev-hero-item": ""
|
|
2137
2169
|
};
|
|
2138
|
-
var _hoisted_5$
|
|
2170
|
+
var _hoisted_5$23 = {
|
|
2139
2171
|
key: 1,
|
|
2140
|
-
class: "
|
|
2141
|
-
"data-
|
|
2172
|
+
class: "ev-hero__description",
|
|
2173
|
+
"data-ev-hero-item": ""
|
|
2142
2174
|
};
|
|
2143
2175
|
var _hoisted_6$13 = {
|
|
2144
2176
|
key: 2,
|
|
2145
|
-
class: "
|
|
2146
|
-
"data-
|
|
2177
|
+
class: "ev-hero__actions",
|
|
2178
|
+
"data-ev-hero-item": ""
|
|
2147
2179
|
};
|
|
2148
2180
|
var _hoisted_7$10 = {
|
|
2149
2181
|
key: 3,
|
|
2150
|
-
class: "
|
|
2151
|
-
"data-
|
|
2182
|
+
class: "ev-hero__body",
|
|
2183
|
+
"data-ev-hero-item": ""
|
|
2152
2184
|
};
|
|
2153
2185
|
var _hoisted_8$9 = {
|
|
2154
2186
|
key: 0,
|
|
2155
|
-
class: "
|
|
2156
|
-
"data-
|
|
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
|
-
*
|
|
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-
|
|
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
|
-
"
|
|
2238
|
+
"ev-hero",
|
|
2207
2239
|
`is-${__props.align}`,
|
|
2208
2240
|
{ "is-tinted": __props.tinted }
|
|
2209
2241
|
])
|
|
2210
|
-
}, [createElementVNode("div", _hoisted_1$
|
|
2211
|
-
_ctx.$slots.badge ? (openBlock(), createElementBlock("div", _hoisted_3$
|
|
2212
|
-
createElementVNode("h1", _hoisted_4$
|
|
2213
|
-
__props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_5$
|
|
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$
|
|
2252
|
-
var _hoisted_2$
|
|
2253
|
-
var _hoisted_3$
|
|
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: "
|
|
2287
|
+
class: "ev-select__menu",
|
|
2256
2288
|
role: "listbox"
|
|
2257
2289
|
};
|
|
2258
|
-
var _hoisted_4$
|
|
2259
|
-
var _hoisted_5$
|
|
2260
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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
|
-
"
|
|
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: "
|
|
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: "
|
|
2416
|
+
class: "ev-select__icon"
|
|
2385
2417
|
}, null, 8, ["name", "size"])) : createCommentVNode("", true),
|
|
2386
|
-
createElementVNode("span", { class: normalizeClass(["
|
|
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(["
|
|
2422
|
+
class: normalizeClass(["ev-select__caret", { "is-open": open.value }])
|
|
2391
2423
|
}, null, 8, ["size", "class"])
|
|
2392
|
-
], 8, _hoisted_2$
|
|
2393
|
-
default: withCtx(() => [open.value ? (openBlock(), createElementBlock("ul", _hoisted_3$
|
|
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(["
|
|
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: "
|
|
2440
|
+
class: "ev-select__option-icon"
|
|
2409
2441
|
}, null, 8, ["name"])) : createCommentVNode("", true),
|
|
2410
|
-
createElementVNode("span", _hoisted_5$
|
|
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: "
|
|
2447
|
+
class: "ev-select__option-check"
|
|
2416
2448
|
})) : createCommentVNode("", true)
|
|
2417
|
-
], 10, _hoisted_4$
|
|
2449
|
+
], 10, _hoisted_4$28);
|
|
2418
2450
|
}), 128))])) : createCommentVNode("", true)]),
|
|
2419
2451
|
_: 1
|
|
2420
|
-
})], 42, _hoisted_1$
|
|
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$
|
|
2458
|
+
var _hoisted_1$41 = {
|
|
2427
2459
|
key: 0,
|
|
2428
|
-
class: "
|
|
2460
|
+
class: "ev-search-box__category"
|
|
2429
2461
|
};
|
|
2430
|
-
var _hoisted_2$
|
|
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$
|
|
2469
|
+
var _hoisted_3$29 = {
|
|
2438
2470
|
key: 1,
|
|
2439
|
-
class: "
|
|
2471
|
+
class: "ev-search-box__suffix"
|
|
2440
2472
|
};
|
|
2441
|
-
var _hoisted_4$
|
|
2473
|
+
var _hoisted_4$27 = {
|
|
2442
2474
|
key: 2,
|
|
2443
|
-
class: "
|
|
2475
|
+
class: "ev-search-box__dropdown",
|
|
2444
2476
|
role: "listbox"
|
|
2445
2477
|
};
|
|
2446
|
-
var _hoisted_5$
|
|
2478
|
+
var _hoisted_5$21 = {
|
|
2447
2479
|
key: 0,
|
|
2448
|
-
class: "
|
|
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: "
|
|
2453
|
-
var _hoisted_9$
|
|
2484
|
+
var _hoisted_8$8 = { class: "ev-search-box__option-title" };
|
|
2485
|
+
var _hoisted_9$6 = {
|
|
2454
2486
|
key: 0,
|
|
2455
|
-
class: "
|
|
2487
|
+
class: "ev-search-box__option-desc"
|
|
2456
2488
|
};
|
|
2457
2489
|
var _hoisted_10$3 = {
|
|
2458
2490
|
key: 0,
|
|
2459
|
-
class: "
|
|
2491
|
+
class: "ev-search-box__option is-state"
|
|
2460
2492
|
};
|
|
2461
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
2513
|
-
* v-model(搜索词) + v-model:category(分类值);分类下拉为
|
|
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
|
-
"
|
|
2607
|
-
`
|
|
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$
|
|
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: "
|
|
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: "
|
|
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$
|
|
2648
|
-
_ctx.$slots.suffix ? (openBlock(), createElementBlock("div", _hoisted_3$
|
|
2649
|
-
panelOpen.value ? (openBlock(), createElementBlock("ul", _hoisted_4$
|
|
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(["
|
|
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$
|
|
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$
|
|
2671
|
-
var _hoisted_2$
|
|
2702
|
+
var _hoisted_1$40 = { class: "ev-icon-grid" };
|
|
2703
|
+
var _hoisted_2$35 = {
|
|
2672
2704
|
key: 0,
|
|
2673
|
-
class: "
|
|
2705
|
+
class: "ev-icon-grid__search"
|
|
2674
2706
|
};
|
|
2675
|
-
var _hoisted_3$
|
|
2707
|
+
var _hoisted_3$28 = {
|
|
2676
2708
|
key: 1,
|
|
2677
|
-
class: "
|
|
2709
|
+
class: "ev-icon-grid__state"
|
|
2678
2710
|
};
|
|
2679
|
-
var _hoisted_4$
|
|
2680
|
-
var _hoisted_5$
|
|
2681
|
-
var _hoisted_6$11 = { class: "
|
|
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$
|
|
2723
|
+
var _hoisted_9$5 = [
|
|
2692
2724
|
"d",
|
|
2693
2725
|
"fill-rule",
|
|
2694
2726
|
"fill"
|
|
2695
2727
|
];
|
|
2696
|
-
var _hoisted_10$2 = { class: "
|
|
2728
|
+
var _hoisted_10$2 = { class: "ev-icon-grid__name" };
|
|
2697
2729
|
var _hoisted_11$2 = {
|
|
2698
|
-
class: "
|
|
2730
|
+
class: "ev-icon-grid__plus",
|
|
2699
2731
|
"aria-hidden": "true"
|
|
2700
2732
|
};
|
|
2701
2733
|
var _hoisted_12 = {
|
|
2702
2734
|
key: 3,
|
|
2703
|
-
class: "
|
|
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
|
-
*
|
|
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.
|
|
2757
|
-
categoryZh: m.
|
|
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$
|
|
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$
|
|
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: "
|
|
2841
|
-
}, [createElementVNode("h3", _hoisted_4$
|
|
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(["
|
|
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$
|
|
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$
|
|
2903
|
+
var _hoisted_1$39 = {
|
|
2872
2904
|
key: 0,
|
|
2873
|
-
class: "
|
|
2905
|
+
class: "ev-feature__icon"
|
|
2874
2906
|
};
|
|
2875
|
-
var _hoisted_2$
|
|
2876
|
-
var _hoisted_3$
|
|
2877
|
-
var _hoisted_4$
|
|
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: "
|
|
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
|
-
*
|
|
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(".
|
|
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
|
-
"
|
|
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(["
|
|
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$
|
|
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$
|
|
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$
|
|
2998
|
+
var _hoisted_1$38 = {
|
|
2967
2999
|
key: 0,
|
|
2968
|
-
class: "
|
|
3000
|
+
class: "ev-pricing-card__badge"
|
|
2969
3001
|
};
|
|
2970
|
-
var _hoisted_2$
|
|
2971
|
-
var _hoisted_3$
|
|
3002
|
+
var _hoisted_2$33 = { class: "ev-pricing-card__title" };
|
|
3003
|
+
var _hoisted_3$26 = {
|
|
2972
3004
|
key: 1,
|
|
2973
|
-
class: "
|
|
3005
|
+
class: "ev-pricing-card__description"
|
|
2974
3006
|
};
|
|
2975
|
-
var _hoisted_4$
|
|
3007
|
+
var _hoisted_4$24 = {
|
|
2976
3008
|
key: 2,
|
|
2977
|
-
class: "
|
|
3009
|
+
class: "ev-pricing-card__price-row"
|
|
2978
3010
|
};
|
|
2979
|
-
var _hoisted_5$
|
|
3011
|
+
var _hoisted_5$19 = { class: "ev-pricing-card__price" };
|
|
2980
3012
|
var _hoisted_6$10 = {
|
|
2981
3013
|
key: 0,
|
|
2982
|
-
class: "
|
|
3014
|
+
class: "ev-pricing-card__original"
|
|
2983
3015
|
};
|
|
2984
3016
|
var _hoisted_7$7 = {
|
|
2985
3017
|
key: 3,
|
|
2986
|
-
class: "
|
|
3018
|
+
class: "ev-pricing-card__note"
|
|
2987
3019
|
};
|
|
2988
3020
|
var _hoisted_8$6 = {
|
|
2989
3021
|
key: 4,
|
|
2990
|
-
class: "
|
|
3022
|
+
class: "ev-pricing-card__features"
|
|
2991
3023
|
};
|
|
2992
|
-
var _hoisted_9$
|
|
2993
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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(["
|
|
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$
|
|
3063
|
-
createElementVNode("h3", _hoisted_2$
|
|
3064
|
-
__props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_3$
|
|
3065
|
-
__props.price ? (openBlock(), createElementBlock("div", _hoisted_4$
|
|
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: "
|
|
3102
|
+
class: "ev-pricing-card__feature"
|
|
3071
3103
|
}, [createVNode(_sfc_main$24, {
|
|
3072
3104
|
name: "check",
|
|
3073
3105
|
size: 16,
|
|
3074
|
-
class: "
|
|
3106
|
+
class: "ev-pricing-card__check"
|
|
3075
3107
|
}), createElementVNode("span", null, toDisplayString(item), 1)]);
|
|
3076
3108
|
}), 128))])])) : createCommentVNode("", true),
|
|
3077
|
-
createElementVNode("div", _hoisted_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$
|
|
3093
|
-
var _hoisted_2$
|
|
3094
|
-
var _hoisted_3$
|
|
3095
|
-
var _hoisted_4$
|
|
3096
|
-
class: "
|
|
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$
|
|
3100
|
-
var _hoisted_6$9 = { class: "
|
|
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
|
-
*
|
|
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$
|
|
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(["
|
|
3175
|
+
class: normalizeClass(["ev-faq__item", { "is-open": isOpen(i) }])
|
|
3144
3176
|
}, [createElementVNode("button", {
|
|
3145
3177
|
type: "button",
|
|
3146
|
-
class: "
|
|
3178
|
+
class: "ev-faq__question",
|
|
3147
3179
|
"aria-expanded": isOpen(i),
|
|
3148
3180
|
onClick: ($event) => toggle(i)
|
|
3149
|
-
}, [createElementVNode("span", _hoisted_3$
|
|
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$
|
|
3191
|
+
var _hoisted_1$36 = {
|
|
3160
3192
|
key: 0,
|
|
3161
|
-
class: "
|
|
3193
|
+
class: "ev-alert__icon"
|
|
3162
3194
|
};
|
|
3163
|
-
var _hoisted_2$
|
|
3164
|
-
var _hoisted_3$
|
|
3195
|
+
var _hoisted_2$31 = { class: "ev-alert__content" };
|
|
3196
|
+
var _hoisted_3$24 = {
|
|
3165
3197
|
key: 0,
|
|
3166
|
-
class: "
|
|
3198
|
+
class: "ev-alert__title"
|
|
3167
3199
|
};
|
|
3168
|
-
var _hoisted_4$
|
|
3169
|
-
var _hoisted_5$
|
|
3200
|
+
var _hoisted_4$22 = { class: "ev-alert__message" };
|
|
3201
|
+
var _hoisted_5$17 = {
|
|
3170
3202
|
key: 1,
|
|
3171
|
-
class: "
|
|
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
|
-
"
|
|
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$
|
|
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$
|
|
3227
|
-
_ctx.$slots.action ? (openBlock(), createElementBlock("div", _hoisted_5$
|
|
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: "
|
|
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, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
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$
|
|
3245
|
-
var _hoisted_2$
|
|
3246
|
-
var _hoisted_3$
|
|
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: "
|
|
3401
|
+
class: "ev-code-block__title"
|
|
3249
3402
|
};
|
|
3250
|
-
var _hoisted_4$
|
|
3251
|
-
var _hoisted_5$
|
|
3403
|
+
var _hoisted_4$21 = ["aria-label"];
|
|
3404
|
+
var _hoisted_5$16 = {
|
|
3252
3405
|
key: 0,
|
|
3253
|
-
class: "
|
|
3406
|
+
class: "ev-code-block__copy-text"
|
|
3254
3407
|
};
|
|
3255
|
-
var _hoisted_6$8 = { class: "
|
|
3408
|
+
var _hoisted_6$8 = { class: "ev-code-block__body" };
|
|
3256
3409
|
var _hoisted_7$6 = {
|
|
3257
3410
|
key: 0,
|
|
3258
|
-
class: "
|
|
3411
|
+
class: "ev-code-block__prefix"
|
|
3259
3412
|
};
|
|
3260
|
-
var _hoisted_8$5 = { class: "
|
|
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
|
-
*
|
|
3293
|
-
*
|
|
3294
|
-
*
|
|
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(".
|
|
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$
|
|
3466
|
+
return openBlock(), createElementBlock("div", _hoisted_1$35, [createElementVNode("div", _hoisted_2$30, [
|
|
3304
3467
|
_cache[0] || (_cache[0] = createElementVNode("span", {
|
|
3305
|
-
class: "
|
|
3468
|
+
class: "ev-code-block__lights",
|
|
3306
3469
|
"aria-hidden": "true"
|
|
3307
3470
|
}, [
|
|
3308
|
-
createElementVNode("i", { class: "
|
|
3309
|
-
createElementVNode("i", { class: "
|
|
3310
|
-
createElementVNode("i", { class: "
|
|
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$
|
|
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(["
|
|
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$
|
|
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", {}, () => [
|
|
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, "&").replace(/</g, "<").replace(/>/g, ">");
|
|
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$
|
|
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
|
-
*
|
|
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$
|
|
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: "
|
|
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$
|
|
3380
|
-
var _hoisted_2$
|
|
4031
|
+
var _hoisted_1$31 = { class: "ev-statistic__value" };
|
|
4032
|
+
var _hoisted_2$28 = {
|
|
3381
4033
|
key: 0,
|
|
3382
|
-
class: "
|
|
4034
|
+
class: "ev-statistic__sizer",
|
|
3383
4035
|
"aria-hidden": "true"
|
|
3384
4036
|
};
|
|
3385
|
-
var _hoisted_3$
|
|
4037
|
+
var _hoisted_3$21 = { class: "ev-statistic__num" };
|
|
3386
4038
|
var _hoisted_4$19 = {
|
|
3387
4039
|
key: 0,
|
|
3388
|
-
class: "
|
|
4040
|
+
class: "ev-statistic__label"
|
|
3389
4041
|
};
|
|
3390
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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(["
|
|
3490
|
-
}, [createElementVNode("div", _hoisted_1$
|
|
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$
|
|
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
|
-
*
|
|
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$
|
|
3540
|
-
var _hoisted_2$
|
|
3541
|
-
var _hoisted_3$
|
|
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: "
|
|
4196
|
+
class: "ev-quote__role"
|
|
3545
4197
|
};
|
|
3546
4198
|
var _hoisted_5$14 = ["href"];
|
|
3547
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
4230
|
+
* EvQuote — 引用/评价卡(launchos 用户评价语言)
|
|
3579
4231
|
*/
|
|
3580
4232
|
return (_ctx, _cache) => {
|
|
3581
|
-
return openBlock(), createElementBlock("figure", { class: normalizeClass(["
|
|
3582
|
-
createElementVNode("span", _hoisted_3$
|
|
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: "
|
|
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
|
-
*
|
|
4302
|
+
* EvConfigProvider — 主题配置提供者
|
|
3651
4303
|
*
|
|
3652
|
-
* props 变化时把对应的 --
|
|
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-
|
|
3683
|
-
else document.documentElement.removeAttribute("data-
|
|
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-
|
|
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: "
|
|
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$
|
|
3701
|
-
var _hoisted_2$
|
|
3702
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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
|
-
"
|
|
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: "
|
|
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(["
|
|
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$
|
|
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(["
|
|
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$
|
|
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$
|
|
3858
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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
|
-
"
|
|
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: "
|
|
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: "
|
|
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(["
|
|
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$
|
|
3950
|
-
var _hoisted_2$
|
|
4601
|
+
var _hoisted_1$27 = ["src", "alt"];
|
|
4602
|
+
var _hoisted_2$25 = {
|
|
3951
4603
|
key: 2,
|
|
3952
|
-
class: "
|
|
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
|
-
*
|
|
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
|
-
"
|
|
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: "
|
|
4675
|
+
class: "ev-avatar__img",
|
|
4024
4676
|
onError: _cache[0] || (_cache[0] = ($event) => imgFailed.value = true)
|
|
4025
|
-
}, null, 40, _hoisted_1$
|
|
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$
|
|
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$
|
|
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
|
-
*
|
|
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$
|
|
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: "
|
|
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$
|
|
4086
|
-
var _hoisted_2$
|
|
4087
|
-
var _hoisted_3$
|
|
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: "
|
|
4741
|
+
class: "ev-timeline__date"
|
|
4090
4742
|
};
|
|
4091
|
-
var _hoisted_4$17 = { class: "
|
|
4743
|
+
var _hoisted_4$17 = { class: "ev-timeline__title" };
|
|
4092
4744
|
var _hoisted_5$13 = {
|
|
4093
4745
|
key: 0,
|
|
4094
|
-
class: "
|
|
4746
|
+
class: "ev-timeline__description"
|
|
4095
4747
|
};
|
|
4096
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
4763
|
+
* EvTimeline — 时间线/更新日志
|
|
4112
4764
|
* items:[{ date?, tag?, tagTone?, title, description? }],最新一条默认高亮圆点
|
|
4113
4765
|
*/
|
|
4114
4766
|
return (_ctx, _cache) => {
|
|
4115
|
-
return openBlock(), createElementBlock("div", _hoisted_1$
|
|
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(["
|
|
4770
|
+
class: normalizeClass(["ev-timeline__item", { "is-latest": i === 0 && __props.highlightLatest }])
|
|
4119
4771
|
}, [
|
|
4120
4772
|
_cache[0] || (_cache[0] = createElementVNode("span", {
|
|
4121
|
-
class: "
|
|
4773
|
+
class: "ev-timeline__dot",
|
|
4122
4774
|
"aria-hidden": "true"
|
|
4123
4775
|
}, null, -1)),
|
|
4124
|
-
createElementVNode("div", _hoisted_2$
|
|
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$
|
|
4148
|
-
var _hoisted_2$
|
|
4149
|
-
class: "
|
|
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$
|
|
4804
|
+
var _hoisted_3$18 = { class: "ev-comparison-table__col-label" };
|
|
4153
4805
|
var _hoisted_4$16 = {
|
|
4154
4806
|
key: 0,
|
|
4155
|
-
class: "
|
|
4807
|
+
class: "ev-comparison-table__col-note"
|
|
4156
4808
|
};
|
|
4157
|
-
var _hoisted_5$12 = { class: "
|
|
4158
|
-
var _hoisted_6$7 = { class: "
|
|
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: "
|
|
4813
|
+
class: "ev-comparison-table__feature-desc"
|
|
4162
4814
|
};
|
|
4163
4815
|
var _hoisted_8$4 = {
|
|
4164
4816
|
key: 1,
|
|
4165
|
-
class: "
|
|
4817
|
+
class: "ev-comparison-table__dash"
|
|
4166
4818
|
};
|
|
4167
4819
|
var _hoisted_9$2 = {
|
|
4168
4820
|
key: 2,
|
|
4169
|
-
class: "
|
|
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
|
-
*
|
|
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$
|
|
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$
|
|
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: "
|
|
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$
|
|
4219
|
-
var _hoisted_2$
|
|
4870
|
+
var _hoisted_1$23 = { class: "ev-cta__title" };
|
|
4871
|
+
var _hoisted_2$22 = {
|
|
4220
4872
|
key: 0,
|
|
4221
|
-
class: "
|
|
4873
|
+
class: "ev-cta__description"
|
|
4222
4874
|
};
|
|
4223
|
-
var _hoisted_3$
|
|
4875
|
+
var _hoisted_3$17 = {
|
|
4224
4876
|
key: 1,
|
|
4225
|
-
class: "
|
|
4877
|
+
class: "ev-cta__actions"
|
|
4226
4878
|
};
|
|
4227
4879
|
var _hoisted_4$15 = {
|
|
4228
4880
|
key: 2,
|
|
4229
|
-
class: "
|
|
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
|
-
*
|
|
4911
|
+
* EvCta — 行动召唤区(官网转化收尾)
|
|
4260
4912
|
*/
|
|
4261
4913
|
return (_ctx, _cache) => {
|
|
4262
|
-
return openBlock(), createElementBlock("section", { class: normalizeClass(["
|
|
4914
|
+
return openBlock(), createElementBlock("section", { class: normalizeClass(["ev-cta", { "is-tinted": __props.tinted }]) }, [createVNode(_sfc_main$16, {
|
|
4263
4915
|
width: __props.container,
|
|
4264
|
-
class: "
|
|
4916
|
+
class: "ev-cta__inner"
|
|
4265
4917
|
}, {
|
|
4266
4918
|
default: withCtx(() => [
|
|
4267
|
-
createElementVNode("h2", _hoisted_1$
|
|
4268
|
-
__props.description || _ctx.$slots.description ? (openBlock(), createElementBlock("p", _hoisted_2$
|
|
4269
|
-
_ctx.$slots.actions ? (openBlock(), createElementBlock("div", _hoisted_3$
|
|
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$
|
|
4280
|
-
var _hoisted_2$
|
|
4931
|
+
var _hoisted_1$22 = ["placeholder", "aria-label"];
|
|
4932
|
+
var _hoisted_2$21 = {
|
|
4281
4933
|
key: 1,
|
|
4282
|
-
class: "
|
|
4934
|
+
class: "ev-newsletter__done"
|
|
4283
4935
|
};
|
|
4284
|
-
var _sfc_main$
|
|
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(["
|
|
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: "
|
|
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: "
|
|
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$
|
|
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$
|
|
5009
|
+
], 64)) : (openBlock(), createElementBlock("span", _hoisted_2$21, [createVNode(_sfc_main$24, {
|
|
4358
5010
|
name: "check",
|
|
4359
5011
|
size: 16,
|
|
4360
|
-
class: "
|
|
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$
|
|
4368
|
-
var _hoisted_2$
|
|
5019
|
+
var _hoisted_1$21 = { class: "ev-logo-cloud" };
|
|
5020
|
+
var _hoisted_2$20 = {
|
|
4369
5021
|
key: 0,
|
|
4370
|
-
class: "
|
|
5022
|
+
class: "ev-logo-cloud__title"
|
|
4371
5023
|
};
|
|
4372
|
-
var _hoisted_3$
|
|
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
|
-
*
|
|
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$
|
|
4401
|
-
class: "
|
|
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: "
|
|
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$
|
|
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$
|
|
4419
|
-
var _hoisted_2$
|
|
4420
|
-
var _hoisted_3$
|
|
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: "
|
|
5074
|
+
class: "ev-video__placeholder"
|
|
4423
5075
|
};
|
|
4424
5076
|
var _hoisted_4$14 = {
|
|
4425
5077
|
key: 0,
|
|
4426
|
-
class: "
|
|
5078
|
+
class: "ev-video__caption"
|
|
4427
5079
|
};
|
|
4428
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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$
|
|
4474
|
-
class: "
|
|
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$
|
|
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$
|
|
4494
|
-
var _hoisted_2$
|
|
4495
|
-
var _hoisted_3$
|
|
4496
|
-
var _hoisted_4$13 = { class: "
|
|
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
|
-
*
|
|
5165
|
+
* EvAudio — 音频卡片(节目/播客/语音介绍)
|
|
4514
5166
|
* 标题行 + 原生播放控件;src 缺省时可用插槽承载自定义播放器
|
|
4515
5167
|
*/
|
|
4516
5168
|
return (_ctx, _cache) => {
|
|
4517
|
-
return openBlock(), createElementBlock("div", _hoisted_1$
|
|
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$
|
|
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: "
|
|
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$
|
|
4533
|
-
var _hoisted_2$
|
|
4534
|
-
var _hoisted_3$
|
|
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: "
|
|
5188
|
+
class: "ev-contact-form__error"
|
|
4537
5189
|
};
|
|
4538
|
-
var _hoisted_4$12 = { class: "
|
|
5190
|
+
var _hoisted_4$12 = { class: "ev-contact-form__field" };
|
|
4539
5191
|
var _hoisted_5$10 = {
|
|
4540
5192
|
key: 0,
|
|
4541
|
-
class: "
|
|
5193
|
+
class: "ev-contact-form__error"
|
|
4542
5194
|
};
|
|
4543
|
-
var _hoisted_6$6 = { class: "
|
|
5195
|
+
var _hoisted_6$6 = { class: "ev-contact-form__field" };
|
|
4544
5196
|
var _hoisted_7$4 = {
|
|
4545
5197
|
key: 0,
|
|
4546
|
-
class: "
|
|
5198
|
+
class: "ev-contact-form__error"
|
|
4547
5199
|
};
|
|
4548
|
-
var _hoisted_8$3 = { class: "
|
|
5200
|
+
var _hoisted_8$3 = { class: "ev-contact-form__footer" };
|
|
4549
5201
|
var _hoisted_9$1 = {
|
|
4550
5202
|
key: 0,
|
|
4551
|
-
class: "
|
|
5203
|
+
class: "ev-contact-form__hint"
|
|
4552
5204
|
};
|
|
4553
5205
|
var _hoisted_10$1 = {
|
|
4554
5206
|
key: 1,
|
|
4555
|
-
class: "
|
|
5207
|
+
class: "ev-contact-form__done"
|
|
4556
5208
|
};
|
|
4557
|
-
var _hoisted_11$1 = { class: "
|
|
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: "
|
|
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$
|
|
5268
|
+
createElementVNode("div", _hoisted_1$18, [createElementVNode("div", _hoisted_2$17, [
|
|
4617
5269
|
_cache[6] || (_cache[6] = createElementVNode("label", {
|
|
4618
|
-
class: "
|
|
4619
|
-
for: "
|
|
5270
|
+
class: "ev-contact-form__label",
|
|
5271
|
+
for: "ev-contact-name"
|
|
4620
5272
|
}, "称呼", -1)),
|
|
4621
5273
|
withDirectives(createElementVNode("input", {
|
|
4622
|
-
id: "
|
|
5274
|
+
id: "ev-contact-name",
|
|
4623
5275
|
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => form.name = $event),
|
|
4624
|
-
class: normalizeClass(["
|
|
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$
|
|
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: "
|
|
4638
|
-
for: "
|
|
5289
|
+
class: "ev-contact-form__label",
|
|
5290
|
+
for: "ev-contact-email"
|
|
4639
5291
|
}, "邮箱", -1)),
|
|
4640
5292
|
withDirectives(createElementVNode("input", {
|
|
4641
|
-
id: "
|
|
5293
|
+
id: "ev-contact-email",
|
|
4642
5294
|
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => form.email = $event),
|
|
4643
|
-
class: normalizeClass(["
|
|
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: "
|
|
4658
|
-
for: "
|
|
5309
|
+
class: "ev-contact-form__label",
|
|
5310
|
+
for: "ev-contact-message"
|
|
4659
5311
|
}, "留言", -1)),
|
|
4660
5312
|
withDirectives(createElementVNode("textarea", {
|
|
4661
|
-
id: "
|
|
5313
|
+
id: "ev-contact-message",
|
|
4662
5314
|
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => form.message = $event),
|
|
4663
|
-
class: normalizeClass(["
|
|
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: "
|
|
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$
|
|
4704
|
-
var _hoisted_2$
|
|
5355
|
+
var _hoisted_1$17 = ["src", "alt"];
|
|
5356
|
+
var _hoisted_2$16 = {
|
|
4705
5357
|
key: 1,
|
|
4706
|
-
class: "
|
|
5358
|
+
class: "ev-carousel__banner"
|
|
4707
5359
|
};
|
|
4708
|
-
var _hoisted_3$
|
|
5360
|
+
var _hoisted_3$12 = ["src", "alt"];
|
|
4709
5361
|
var _hoisted_4$11 = {
|
|
4710
5362
|
key: 0,
|
|
4711
|
-
class: "
|
|
5363
|
+
class: "ev-carousel__caption"
|
|
4712
5364
|
};
|
|
4713
5365
|
var _hoisted_5$9 = {
|
|
4714
5366
|
key: 0,
|
|
4715
|
-
class: "
|
|
5367
|
+
class: "ev-carousel__caption-title"
|
|
4716
5368
|
};
|
|
4717
5369
|
var _hoisted_6$5 = {
|
|
4718
5370
|
key: 1,
|
|
4719
|
-
class: "
|
|
5371
|
+
class: "ev-carousel__caption-desc"
|
|
4720
5372
|
};
|
|
4721
5373
|
var _hoisted_7$3 = {
|
|
4722
5374
|
key: 2,
|
|
4723
|
-
class: "
|
|
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
|
-
*
|
|
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(["
|
|
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: "
|
|
5456
|
+
class: "ev-carousel__viewport",
|
|
4805
5457
|
style: normalizeStyle(viewportStyle.value)
|
|
4806
5458
|
}, [createElementVNode("div", {
|
|
4807
|
-
class: "
|
|
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: "
|
|
5464
|
+
class: "ev-carousel__slide"
|
|
4813
5465
|
}, [__props.variant === "image" ? (openBlock(), createElementBlock("img", {
|
|
4814
5466
|
key: 0,
|
|
4815
|
-
class: "
|
|
5467
|
+
class: "ev-carousel__img",
|
|
4816
5468
|
src: item.src,
|
|
4817
5469
|
alt: item.alt || "",
|
|
4818
5470
|
loading: "lazy"
|
|
4819
|
-
}, null, 8, _hoisted_1$
|
|
4820
|
-
class: "
|
|
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$
|
|
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: "
|
|
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: "
|
|
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(["
|
|
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$
|
|
4865
|
-
var _hoisted_2$
|
|
4866
|
-
var _hoisted_3$
|
|
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: "
|
|
5521
|
+
class: "ev-article-card__date"
|
|
4870
5522
|
};
|
|
4871
|
-
var _hoisted_5$8 = { class: "
|
|
5523
|
+
var _hoisted_5$8 = { class: "ev-article-card__title" };
|
|
4872
5524
|
var _hoisted_6$4 = {
|
|
4873
5525
|
key: 0,
|
|
4874
|
-
class: "
|
|
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
|
-
*
|
|
5577
|
+
* EvArticleCard — 文章卡(博客/动态/教程列表)
|
|
4926
5578
|
* 封面(缺省用图标占位)+ 日期与标签元信息 + 标题 + 摘要;整卡可链接
|
|
4927
5579
|
*/
|
|
4928
5580
|
const props = __props;
|
|
4929
|
-
const coverStyle = computed(() => props.cover ? void 0 : { background: "linear-gradient(135deg, var(--
|
|
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(["
|
|
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: "
|
|
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$
|
|
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: "
|
|
4952
|
-
}, null, 8, ["name"])) : createCommentVNode("", true)], 4), createElementVNode("div", _hoisted_2$
|
|
4953
|
-
createElementVNode("div", _hoisted_3$
|
|
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: "
|
|
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$
|
|
4970
|
-
var _hoisted_2$
|
|
5621
|
+
var _hoisted_1$15 = { class: "ev-profile-card__name" };
|
|
5622
|
+
var _hoisted_2$14 = {
|
|
4971
5623
|
key: 0,
|
|
4972
|
-
class: "
|
|
5624
|
+
class: "ev-profile-card__role"
|
|
4973
5625
|
};
|
|
4974
|
-
var _hoisted_3$
|
|
5626
|
+
var _hoisted_3$10 = {
|
|
4975
5627
|
key: 1,
|
|
4976
|
-
class: "
|
|
5628
|
+
class: "ev-profile-card__bio"
|
|
4977
5629
|
};
|
|
4978
5630
|
var _hoisted_4$9 = {
|
|
4979
5631
|
key: 2,
|
|
4980
|
-
class: "
|
|
5632
|
+
class: "ev-profile-card__stats"
|
|
4981
5633
|
};
|
|
4982
5634
|
var _hoisted_5$7 = {
|
|
4983
5635
|
key: 3,
|
|
4984
|
-
class: "
|
|
5636
|
+
class: "ev-profile-card__social"
|
|
4985
5637
|
};
|
|
4986
|
-
var _sfc_main$
|
|
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 或
|
|
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
|
-
*
|
|
5675
|
+
* EvProfileCard — 个人名片(团队页/关于页/个人站)
|
|
5024
5676
|
* 头像 + 姓名 + 角色 + 简介 + 可选数据行与社交链接行
|
|
5025
5677
|
*/
|
|
5026
5678
|
return (_ctx, _cache) => {
|
|
5027
|
-
return openBlock(), createElementBlock("div", { class: normalizeClass(["
|
|
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: "
|
|
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$
|
|
5043
|
-
__props.role || _ctx.$slots.role ? (openBlock(), createElementBlock("p", _hoisted_2$
|
|
5044
|
-
__props.bio || _ctx.$slots.bio ? (openBlock(), createElementBlock("p", _hoisted_3$
|
|
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$
|
|
5054
|
-
var _hoisted_2$
|
|
5055
|
-
var _hoisted_3$
|
|
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: "
|
|
5709
|
+
class: "ev-article__eyebrow"
|
|
5058
5710
|
};
|
|
5059
|
-
var _hoisted_4$8 = { class: "
|
|
5711
|
+
var _hoisted_4$8 = { class: "ev-article__title" };
|
|
5060
5712
|
var _hoisted_5$6 = {
|
|
5061
5713
|
key: 1,
|
|
5062
|
-
class: "
|
|
5714
|
+
class: "ev-article__description"
|
|
5063
5715
|
};
|
|
5064
5716
|
var _hoisted_6$3 = {
|
|
5065
5717
|
key: 2,
|
|
5066
|
-
class: "
|
|
5718
|
+
class: "ev-article__meta"
|
|
5067
5719
|
};
|
|
5068
5720
|
var _hoisted_7$2 = {
|
|
5069
5721
|
key: 1,
|
|
5070
|
-
class: "
|
|
5722
|
+
class: "ev-article__author"
|
|
5071
5723
|
};
|
|
5072
5724
|
var _hoisted_8$1 = {
|
|
5073
5725
|
key: 2,
|
|
5074
|
-
class: "
|
|
5726
|
+
class: "ev-article__date"
|
|
5075
5727
|
};
|
|
5076
5728
|
var _hoisted_9 = {
|
|
5077
5729
|
key: 3,
|
|
5078
|
-
class: "
|
|
5730
|
+
class: "ev-article__read"
|
|
5079
5731
|
};
|
|
5080
|
-
var _hoisted_10 = { class: "
|
|
5732
|
+
var _hoisted_10 = { class: "ev-article__body" };
|
|
5081
5733
|
var _hoisted_11 = {
|
|
5082
5734
|
key: 0,
|
|
5083
|
-
class: "
|
|
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
|
-
*
|
|
5779
|
+
* EvArticle — 文章内容(长文阅读排版)
|
|
5128
5780
|
* 页头:眉题 + 标题 + 摘要 + 元信息行(头像/作者/日期/阅读时长/标签);
|
|
5129
5781
|
* 正文插槽自带阅读排版(标题刻度、1.85 行高、引用块、列表、行内代码、图片圆角),
|
|
5130
|
-
* 排版全部以 .
|
|
5782
|
+
* 排版全部以 .ev-article__body 作用域类收敛,不外溢。
|
|
5131
5783
|
*/
|
|
5132
5784
|
return (_ctx, _cache) => {
|
|
5133
|
-
return openBlock(), createElementBlock("article", _hoisted_1$
|
|
5134
|
-
createElementVNode("header", _hoisted_2$
|
|
5135
|
-
__props.eyebrow || _ctx.$slots.eyebrow ? (openBlock(), createElementBlock("p", _hoisted_3$
|
|
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: "
|
|
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: "
|
|
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$
|
|
5166
|
-
var _hoisted_2$
|
|
5167
|
-
var _hoisted_3$
|
|
5168
|
-
var _hoisted_4$7 = { class: "
|
|
5169
|
-
var _hoisted_5$5 = { class: "
|
|
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: "
|
|
5824
|
+
class: "ev-exec-card__role"
|
|
5173
5825
|
};
|
|
5174
5826
|
var _hoisted_7$1 = {
|
|
5175
5827
|
key: 1,
|
|
5176
|
-
class: "
|
|
5828
|
+
class: "ev-exec-card__description"
|
|
5177
5829
|
};
|
|
5178
5830
|
var _hoisted_8 = {
|
|
5179
5831
|
key: 2,
|
|
5180
|
-
class: "
|
|
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
|
-
*
|
|
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(["
|
|
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({ "--
|
|
5228
|
-
}, [createElementVNode("div", _hoisted_1$
|
|
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: "
|
|
5884
|
+
class: "ev-exec-card__portrait",
|
|
5233
5885
|
loading: "lazy"
|
|
5234
|
-
}, null, 8, _hoisted_2$
|
|
5886
|
+
}, null, 8, _hoisted_2$12)) : (openBlock(), createElementBlock("svg", {
|
|
5235
5887
|
key: 1,
|
|
5236
|
-
class: "
|
|
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$
|
|
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$
|
|
5262
|
-
var _hoisted_2$
|
|
5263
|
-
var _hoisted_3$
|
|
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: "
|
|
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
|
-
*
|
|
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
|
-
|
|
6032
|
+
lockBodyScroll();
|
|
5337
6033
|
emit("open");
|
|
5338
6034
|
} else {
|
|
5339
6035
|
document.removeEventListener("keydown", onKeydown);
|
|
5340
|
-
|
|
6036
|
+
unlockBodyScroll();
|
|
5341
6037
|
}
|
|
5342
6038
|
});
|
|
5343
6039
|
onBeforeUnmount(() => {
|
|
5344
6040
|
if (typeof document === "undefined") return;
|
|
5345
6041
|
document.removeEventListener("keydown", onKeydown);
|
|
5346
|
-
|
|
6042
|
+
unlockBodyScroll();
|
|
5347
6043
|
});
|
|
5348
6044
|
return (_ctx, _cache) => {
|
|
5349
|
-
return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, { name: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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$
|
|
6073
|
+
createElementVNode("figure", _hoisted_2$11, [createElementVNode("img", {
|
|
5378
6074
|
src: current.value?.src,
|
|
5379
6075
|
alt: current.value?.alt || "",
|
|
5380
|
-
class: "
|
|
5381
|
-
}, null, 8, _hoisted_3$
|
|
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: "
|
|
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$
|
|
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$
|
|
5401
|
-
var _hoisted_2$
|
|
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
|
-
*
|
|
5435
|
-
* 均匀网格图片墙,点击任意图片打开
|
|
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: "
|
|
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: "
|
|
5464
|
-
style: normalizeStyle({ "--
|
|
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$
|
|
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: "
|
|
6324
|
+
class: "ev-modal__header"
|
|
5493
6325
|
};
|
|
5494
|
-
var _hoisted_3$5 = { class: "
|
|
5495
|
-
var _hoisted_4$5 = { class: "
|
|
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: "
|
|
6330
|
+
class: "ev-modal__footer"
|
|
5499
6331
|
};
|
|
5500
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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)
|
|
6406
|
+
if (props.lockScroll) lockBodyScroll();
|
|
5575
6407
|
document.addEventListener("keydown", onKeydown);
|
|
5576
6408
|
nextTick(() => panelRef.value?.focus?.());
|
|
5577
6409
|
} else {
|
|
5578
|
-
if (props.lockScroll)
|
|
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)
|
|
6418
|
+
if (props.lockScroll) unlockBodyScroll();
|
|
5587
6419
|
});
|
|
5588
6420
|
return (_ctx, _cache) => {
|
|
5589
6421
|
return openBlock(), createBlock(Teleport, { to: "body" }, [createVNode(Transition, {
|
|
5590
|
-
name: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
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: "
|
|
6460
|
+
var _hoisted_1$8 = { class: "ev-marquee__track" };
|
|
5629
6461
|
var _hoisted_2$7 = ["aria-hidden"];
|
|
5630
|
-
var _hoisted_3$4 = { class: "
|
|
6462
|
+
var _hoisted_3$4 = { class: "ev-marquee__group" };
|
|
5631
6463
|
var _hoisted_4$4 = {
|
|
5632
|
-
class: "
|
|
6464
|
+
class: "ev-marquee__group",
|
|
5633
6465
|
"aria-hidden": "true"
|
|
5634
6466
|
};
|
|
5635
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
6508
|
+
* EvMarquee — 无限滚动横幅
|
|
5677
6509
|
*
|
|
5678
6510
|
* 两种用法:
|
|
5679
6511
|
* 1. 插槽模式:默认插槽内容渲染两份,无缝循环(品牌墙 / 任意自定义内容)
|
|
5680
6512
|
* 2. 文本模式:传入 items(字符串数组),渲染大字横幅——
|
|
5681
6513
|
* alternateOutline 让奇偶项在 实心/描边 间交替(商场 LED 风格),
|
|
5682
|
-
* 可选 separator 分隔图标;字号/描边色由 --
|
|
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 = { "--
|
|
5695
|
-
if (props.textSize) style["--
|
|
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(["
|
|
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: "
|
|
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(["
|
|
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: "
|
|
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: "
|
|
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
|
-
/** 流光渐变主色(缺省取 --
|
|
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
|
-
*
|
|
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
|
-
"--
|
|
5772
|
-
"--
|
|
5773
|
-
"--
|
|
5774
|
-
"--
|
|
5775
|
-
"--
|
|
5776
|
-
"--
|
|
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: "
|
|
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: "
|
|
6629
|
+
class: "ev-input__suffix"
|
|
5797
6630
|
};
|
|
5798
6631
|
var _sfc_main$29 = /*@__PURE__*/ Object.assign({
|
|
5799
6632
|
inheritAttrs: false,
|
|
5800
|
-
name: "
|
|
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
|
-
*
|
|
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
|
-
"
|
|
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: "
|
|
6719
|
+
class: "ev-input__prefix"
|
|
5887
6720
|
}, null, 8, ["name", "size"])) : createCommentVNode("", true),
|
|
5888
6721
|
createElementVNode("input", mergeProps(filteredAttrs.value, {
|
|
5889
|
-
class: "
|
|
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: "
|
|
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: "
|
|
6755
|
+
class: "ev-textarea__count"
|
|
5923
6756
|
};
|
|
5924
|
-
var _sfc_main$
|
|
6757
|
+
var _sfc_main$53 = /*@__PURE__*/ Object.assign({
|
|
5925
6758
|
inheritAttrs: false,
|
|
5926
|
-
name: "
|
|
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
|
-
*
|
|
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(["
|
|
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: "
|
|
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: "
|
|
6828
|
+
class: "ev-field__label"
|
|
5996
6829
|
};
|
|
5997
6830
|
var _hoisted_2$4 = {
|
|
5998
6831
|
key: 0,
|
|
5999
|
-
class: "
|
|
6832
|
+
class: "ev-field__required",
|
|
6000
6833
|
"aria-hidden": "true"
|
|
6001
6834
|
};
|
|
6002
|
-
var _hoisted_3$3 = { class: "
|
|
6835
|
+
var _hoisted_3$3 = { class: "ev-field__control" };
|
|
6003
6836
|
var _hoisted_4$3 = {
|
|
6004
6837
|
key: 1,
|
|
6005
|
-
class: "
|
|
6838
|
+
class: "ev-field__error"
|
|
6006
6839
|
};
|
|
6007
6840
|
var _hoisted_5$2 = {
|
|
6008
6841
|
key: 2,
|
|
6009
|
-
class: "
|
|
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
|
-
*
|
|
6035
|
-
* 与
|
|
6867
|
+
* EvField — 表单字段包装(标签 + 控件 + 错误/提示)
|
|
6868
|
+
* 与 EvInput / EvTextarea / EvSelect 组合出前台提交表单;error 传非空字符串即错误态
|
|
6036
6869
|
*/
|
|
6037
6870
|
return (_ctx, _cache) => {
|
|
6038
|
-
return openBlock(), createElementBlock("div", { class: normalizeClass(["
|
|
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
|
-
* 滚动定位工具 — 移动组件(
|
|
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: "
|
|
6907
|
+
class: "ev-pull-refresh__spinner"
|
|
6075
6908
|
};
|
|
6076
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
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(--
|
|
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: "
|
|
7082
|
+
class: "ev-pull-refresh"
|
|
6250
7083
|
}, [createElementVNode("div", {
|
|
6251
|
-
class: "
|
|
7084
|
+
class: "ev-pull-refresh__track",
|
|
6252
7085
|
style: normalizeStyle(trackStyle.value)
|
|
6253
7086
|
}, [createElementVNode("div", {
|
|
6254
|
-
class: "
|
|
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(["
|
|
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: "
|
|
6270
|
-
var _sfc_main$31 = /*@__PURE__*/ Object.assign({ name: "
|
|
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
|
-
*
|
|
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(["
|
|
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: "
|
|
7196
|
+
class: "ev-load-more__sentinel"
|
|
6364
7197
|
}, null, 512)) : createCommentVNode("", true), createElementVNode("button", {
|
|
6365
7198
|
type: "button",
|
|
6366
|
-
class: "
|
|
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: "
|
|
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: "
|
|
7211
|
+
class: "ev-action-sheet__title"
|
|
6379
7212
|
};
|
|
6380
|
-
var _hoisted_3$2 = { class: "
|
|
7213
|
+
var _hoisted_3$2 = { class: "ev-action-sheet__list" };
|
|
6381
7214
|
var _hoisted_4$2 = ["disabled", "onClick"];
|
|
6382
|
-
var _hoisted_5$1 = { class: "
|
|
7215
|
+
var _hoisted_5$1 = { class: "ev-action-sheet__name" };
|
|
6383
7216
|
var _hoisted_6$1 = {
|
|
6384
7217
|
key: 0,
|
|
6385
|
-
class: "
|
|
7218
|
+
class: "ev-action-sheet__subname"
|
|
6386
7219
|
};
|
|
6387
|
-
var _sfc_main = /*@__PURE__*/ Object.assign({ name: "
|
|
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
|
-
*
|
|
7284
|
+
* EvActionSheet — 底部动作面板
|
|
6452
7285
|
* 移动端「更多操作」的标准形态:底部滑入的纵向动作列表 + 取消栏,
|
|
6453
7286
|
* 替代 hover 类菜单在触屏上的缺位。动作项 { name, subname, color, disabled }。
|
|
6454
|
-
*
|
|
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)
|
|
7303
|
+
if (props.lockScroll && hasDom) lockBodyScroll();
|
|
6482
7304
|
if (hasDom) window.addEventListener("keydown", onKeydown);
|
|
6483
7305
|
} else {
|
|
6484
|
-
if (props.lockScroll && hasDom)
|
|
7306
|
+
if (props.lockScroll && hasDom) unlockBodyScroll();
|
|
6485
7307
|
if (hasDom) window.removeEventListener("keydown", onKeydown);
|
|
6486
7308
|
}
|
|
6487
7309
|
}, { immediate: true });
|
|
6488
7310
|
onBeforeUnmount(() => {
|
|
6489
|
-
|
|
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: "
|
|
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: "
|
|
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(["
|
|
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(["
|
|
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: "
|
|
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$
|
|
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
|
-
*
|
|
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: "
|
|
7460
|
+
class: "ev-tabbar__placeholder",
|
|
6639
7461
|
style: normalizeStyle({ height: `${barHeight.value}px` })
|
|
6640
|
-
}, null, 4)) : createCommentVNode("", true), createElementVNode("div", { class: normalizeClass(["
|
|
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: "
|
|
7475
|
+
class: "ev-tabbar-item__icon"
|
|
6654
7476
|
};
|
|
6655
7477
|
var _hoisted_3$1 = {
|
|
6656
7478
|
key: 0,
|
|
6657
|
-
class: "
|
|
7479
|
+
class: "ev-tabbar-item__dot"
|
|
6658
7480
|
};
|
|
6659
7481
|
var _hoisted_4$1 = {
|
|
6660
7482
|
key: 1,
|
|
6661
|
-
class: "
|
|
7483
|
+
class: "ev-tabbar-item__badge"
|
|
6662
7484
|
};
|
|
6663
|
-
var _hoisted_5 = { class: "
|
|
7485
|
+
var _hoisted_5 = { class: "ev-tabbar-item__text" };
|
|
6664
7486
|
var _hoisted_6 = {
|
|
6665
7487
|
key: 0,
|
|
6666
|
-
class: "
|
|
7488
|
+
class: "ev-tabbar-item__dot is-inline"
|
|
6667
7489
|
};
|
|
6668
7490
|
var _hoisted_7 = {
|
|
6669
7491
|
key: 1,
|
|
6670
|
-
class: "
|
|
7492
|
+
class: "ev-tabbar-item__badge is-inline"
|
|
6671
7493
|
};
|
|
6672
|
-
var _sfc_main$
|
|
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
|
-
/** 图标名(
|
|
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
|
-
*
|
|
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(["
|
|
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: "
|
|
7560
|
+
class: "ev-nav-bar__placeholder",
|
|
6739
7561
|
"aria-hidden": "true"
|
|
6740
7562
|
};
|
|
6741
7563
|
var _hoisted_2 = {
|
|
6742
7564
|
key: 1,
|
|
6743
|
-
class: "
|
|
7565
|
+
class: "ev-nav-bar__text"
|
|
6744
7566
|
};
|
|
6745
|
-
var _hoisted_3 = { class: "
|
|
7567
|
+
var _hoisted_3 = { class: "ev-nav-bar__title" };
|
|
6746
7568
|
var _hoisted_4 = {
|
|
6747
7569
|
key: 0,
|
|
6748
|
-
class: "
|
|
7570
|
+
class: "ev-nav-bar__text"
|
|
6749
7571
|
};
|
|
6750
|
-
var _sfc_main$
|
|
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
|
-
*
|
|
7619
|
+
* EvNavBar — 移动端页头(返回 + 标题 + 右侧动作)
|
|
6798
7620
|
* H5 页面的标准头部:左区返回箭头/文案、居中标题(超长省略)、右区动作;
|
|
6799
7621
|
* fixed 吸顶时自动吸收 env(safe-area-inset-top)(刘海屏独立 PWA 生效,普通浏览器为 0),
|
|
6800
|
-
* 配 placeholder 生成等高占位避免内容顶到头下。区别于桌面站点的
|
|
7622
|
+
* 配 placeholder 生成等高占位避免内容顶到头下。区别于桌面站点的 EvNavbar。
|
|
6801
7623
|
* 前台库零外部依赖:无滚动锁定与层级计数,固定层级默认压在弹层之下。
|
|
6802
7624
|
*/
|
|
6803
7625
|
const emit = __emit;
|
|
6804
7626
|
return (_ctx, _cache) => {
|
|
6805
|
-
return openBlock(), createElementBlock("div", { class: normalizeClass(["
|
|
6806
|
-
class: normalizeClass(["
|
|
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: "
|
|
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: "
|
|
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
|
-
|
|
6830
|
-
|
|
6831
|
-
|
|
6832
|
-
|
|
6833
|
-
|
|
6834
|
-
|
|
6835
|
-
|
|
6836
|
-
|
|
6837
|
-
|
|
6838
|
-
|
|
6839
|
-
|
|
6840
|
-
|
|
6841
|
-
|
|
6842
|
-
|
|
6843
|
-
|
|
6844
|
-
|
|
6845
|
-
|
|
6846
|
-
|
|
6847
|
-
|
|
6848
|
-
|
|
6849
|
-
|
|
6850
|
-
|
|
6851
|
-
|
|
6852
|
-
|
|
6853
|
-
|
|
6854
|
-
|
|
6855
|
-
|
|
6856
|
-
|
|
6857
|
-
|
|
6858
|
-
|
|
6859
|
-
|
|
6860
|
-
|
|
6861
|
-
|
|
6862
|
-
|
|
6863
|
-
|
|
6864
|
-
|
|
6865
|
-
|
|
6866
|
-
|
|
6867
|
-
|
|
6868
|
-
|
|
6869
|
-
|
|
6870
|
-
|
|
6871
|
-
|
|
6872
|
-
|
|
6873
|
-
|
|
6874
|
-
|
|
6875
|
-
|
|
6876
|
-
|
|
6877
|
-
|
|
6878
|
-
|
|
6879
|
-
|
|
6880
|
-
|
|
6881
|
-
|
|
6882
|
-
|
|
6883
|
-
|
|
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 {
|
|
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 };
|