-
-
-
-
-
-
核心亮点
-
-
-
-
-
-
-
专属 MCP 工具快速定义
-
可快速创建属于你域名的 MCP 工具,无需关注 Server 定义或 Transport 连接,支持接口调用与 DOM 操作。
-
-
-
-
极低改造成本
-
无需改动现有应用,通过插件中的 mcp-servers 工具即可快速实现应用智能化。
-
-
-
-
灵活的执行环境配置
-
通过 meta.ts 定义运行环境,支持主世界(访问页面 JS)或 Content Script 环境。
-
-
-
-
多域名工具协同
-
支持组合多个域名的工具协同完成任务,自动打开对应页面,提升操作效率。
-
-
-
-
内置智能功能
-
类比 Chrome DevTools MCP,自动识别网页无障碍信息并规划路径,开箱即用。
-
-
-
-
-
-
远程操控支持
-
支持远程控制,通过识别码或链接在 codeMate、Cursor 等智能体中跨设备协同。
-
-
-
-
极速与 AI 互动反馈
-
集成生成式 UI,可快速将必要信息反馈给 AI,提升协作效率。
-
-
-
-
快速接入云端工具
-
可集成云端 MCP 能力与 Web 端 MCP 工具,协同完成复杂需求。
-
-
-
-
+import aiextMcpToolsNew from "@/assets/images/home/ai-extension-home/flow1.svg";
+import aiextUserscriptsNew from "@/assets/images/home/ai-extension-home/flow2.svg";
+import aiextInstallNew from "@/assets/images/home/ai-extension-home/flow3.svg";
+import aiextDevelopmentNew from "@/assets/images/home/ai-extension-home/flow4.svg";
+import { onMounted, onUnmounted, nextTick } from "vue";
+import HeroSection from "./components/HeroSection.vue";
+import HighlightsSection from "./components/HighlightsSection.vue";
+import FeatureSection from "./components/FeatureSection.vue";
+
+// Feature 配置数据
+const features = [
+ {
+ title: "MCP 工具集成",
+ description: `基于 Model Context Protocol 实现工具调用。
为特定网站注册自定义 MCP 工具。
AI 助手可通过扩展与网页深度交互。`,
+ imageSrc: aiextMcpToolsNew,
+ imageAlt: "MCP 工具",
+ reverse: false,
+ bgClass: "bg-tech-1",
+ },
+ {
+ title: "User Scripts API",
+ description: `支持 Chrome 120+ 的 User Scripts API。
在页面主世界(Main World)中执行脚本。
访问页面完整的 JavaScript 环境和全局变量。`,
+ imageSrc: aiextUserscriptsNew,
+ imageAlt: "User Scripts",
+ reverse: true,
+ bgClass: "bg-tech-2",
+ delayClass: "delay-1",
+ },
+ {
+ title: "简单易用",
+ description: `下载 ZIP 文件即可本地安装。
无需通过浏览器插件市场。
开发者模式加载,快速上手使用。`,
+ imageSrc: aiextInstallNew,
+ imageAlt: "简单安装",
+ reverse: false,
+ bgClass: "bg-tech-1",
+ delayClass: "delay-2",
+ },
+ {
+ title: "灵活的工具开发",
+ description: `支持 pageMcpServer 和 contentScriptMcpServer 两种类型。
使用 Zod 定义参数验证规则。
完善的 meta.ts 配置和工具注册机制。`,
+ imageSrc: aiextDevelopmentNew,
+ imageAlt: "工具开发",
+ reverse: true,
+ bgClass: "bg-tech-2",
+ delayClass: "delay-3",
+ },
+];
+
+// 进入视口触发 fade-in-up 动效
+let fadeObserver;
+
+const initFadeInUp = async (elementRefs) => {
+ if (typeof window === "undefined" || typeof document === "undefined") return;
+ if (!("IntersectionObserver" in window)) return;
+
+ await nextTick();
+
+ // 等待 DOM 完全渲染
+ await new Promise((resolve) => setTimeout(resolve, 150));
+
+ // 收集所有需要观察的元素(去重)
+ const elementsToObserve = new Set();
+
+ // 从 refs 收集
+ if (Array.isArray(elementRefs)) {
+ elementRefs.forEach((el) => {
+ if (el && el instanceof Element) {
+ elementsToObserve.add(el);
+ }
+ });
+ } else if (elementRefs && elementRefs instanceof Element) {
+ elementsToObserve.add(elementRefs);
+ }
-
-
-
-
-
MCP 工具集成
-
- 基于 Model Context Protocol 实现工具调用。
- 为特定网站注册自定义 MCP 工具。
- AI 助手可通过扩展与网页深度交互。
-
-
-
-
![MCP 工具]()
-
-
-
+ // 如果 refs 为空,从 DOM 中查找所有 .fade-in-up 元素
+ if (elementsToObserve.size === 0) {
+ const targets = Array.from(document.querySelectorAll(".fade-in-up"));
+ targets.forEach((el) => {
+ if (el instanceof Element) {
+ elementsToObserve.add(el);
+ }
+ });
+ }
-
-
-
-
-
User Scripts API
-
- 支持 Chrome 120+ 的 User Scripts API。
- 在页面主世界(Main World)中执行脚本。
- 访问页面完整的 JavaScript 环境和全局变量。
-
-
-
-
![User Scripts]()
-
-
-
+ if (elementsToObserve.size === 0) return;
+
+ // 如果没有创建 observer,则创建
+ if (!fadeObserver) {
+ fadeObserver = new IntersectionObserver(
+ (entries) => {
+ entries.forEach((entry) => {
+ if (entry.isIntersecting) {
+ entry.target.classList.add("is-visible");
+ } else if (entry.intersectionRatio === 0) {
+ entry.target.classList.remove("is-visible");
+ }
+ });
+ },
+ {
+ threshold: 0.1, // 元素出现 10% 就触发
+ rootMargin: "0px 0px -50px 0px", // 提前 50px 触发,让动效更自然
+ }
+ );
+ }
-
-
-
-
-
简单易用
-
- 下载 ZIP 文件即可本地安装。
- 无需通过浏览器插件市场。
- 开发者模式加载,快速上手使用。
-
-
-
-
![简单安装]()
-
-
-
+ // 检查并观察所有元素
+ elementsToObserve.forEach((el) => {
+ if (el && el instanceof Element) {
+ // 如果元素已经在视口中,立即添加 is-visible 类
+ const rect = el.getBoundingClientRect();
+ const isVisible = rect.top < window.innerHeight && rect.bottom > 0;
+ if (isVisible) {
+ el.classList.add("is-visible");
+ }
+ fadeObserver.observe(el);
+ }
+ });
+};
+
+// 生命周期:监听窗口大小变化
+onMounted(async () => {
+ // 延迟初始化,确保所有动态内容都已渲染
+ await nextTick();
+ setTimeout(() => {
+ // 从整个容器中查找所有 .fade-in-up 元素
+ initFadeInUp(null);
+ }, 800);
+});
+
+onUnmounted(() => {
+ fadeObserver?.disconnect();
+ fadeObserver = undefined;
+});
+
-
-
-
-
-
灵活的工具开发
-
- 支持 pageMcpServer 和 contentScriptMcpServer 两种类型。
- 使用 Zod 定义参数验证规则。
- 完善的 meta.ts 配置和工具注册机制。
-
-
-
-
![工具开发]()
-
-
-
+
+
+
+
+
+
+
+
+
+
-
diff --git a/packages/home/src/views/next-sdks-home/common.less b/packages/home/src/views/next-sdks-home/common.less
index 75e21cd8..9f7d96c7 100644
--- a/packages/home/src/views/next-sdks-home/common.less
+++ b/packages/home/src/views/next-sdks-home/common.less
@@ -1,151 +1,155 @@
/* ==================== 公共样式 ==================== */
+/* 使用 .next-sdks-home 作为根选择器进行 CSS 隔离,并对齐 tiny-vue-home 的字号/间距体系 */
-/* 工具类 */
-.pad-b40 {
- padding-bottom: 40px !important;
-}
+.next-sdks-home {
+ /* 工具类 */
+ .pad-b40 {
+ padding-bottom: 40px !important;
+ }
-.mar-t40 {
- margin-top: 40px !important;
-}
+ .mar-t40 {
+ margin-top: 40px !important;
+ }
-.pad-t40 {
- padding-top: 40px !important;
-}
+ .pad-t40 {
+ padding-top: 40px !important;
+ }
-/* 通用布局 */
-.section {
- min-height: 100vh;
- width: 100%;
- position: relative;
- overflow: hidden;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-}
+ /* 通用布局 */
+ .section {
+ min-height: 100vh;
+ width: 100%;
+ position: relative;
+ overflow: hidden;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ }
-.content-around {
- justify-content: space-around;
-}
+ .content-around {
+ justify-content: space-around;
+ flex-direction: column;
+ }
-.text-center {
- text-align: center;
-}
+ .text-center {
+ text-align: center;
+ }
-/* 背景类 */
-.bg-color-1 {
- background: #f7fbfe;
-}
+ /* 背景类 */
+ .bg-color-1 {
+ background: #f7fbfe;
+ }
-.bg-tech-1 {
- background-size: cover;
- background-position: center;
-}
+ .bg-tech-1 {
+ background-size: cover;
+ background-position: center;
+ }
-.bg-tech-2 {
- background-size: cover;
- background-position: center;
-}
+ .bg-tech-2 {
+ background-size: cover;
+ background-position: center;
+ }
-/* 通用文字样式 */
-.title {
- font-size: 50px;
- font-weight: 700;
- color: #191919;
- letter-spacing: 5px;
- line-height: 1.2;
- padding-bottom: 20px;
-}
+ /* 通用文字样式(对齐 tiny-vue-home) */
+ .title {
+ font-size: 52px;
+ font-weight: 600;
+ color: #191919;
+ letter-spacing: 2px;
+ line-height: 1.5;
+ padding-bottom: 32px;
+ .title-us {
+ font-size: 56px;
+ }
+ }
-.subtitle {
- font-size: 44px;
- padding-bottom: 20px;
- line-height: 1.5;
- background: linear-gradient(90deg, #cb43a8 10%, #2c5fef 50%);
- -webkit-background-clip: text;
- background-clip: text;
- letter-spacing: 5px;
- -webkit-text-fill-color: transparent;
- font-weight: 700;
-}
+ .subtitle {
+ font-size: 50px;
+ padding-bottom: 48px;
+ line-height: 1.5;
+ background: linear-gradient(90deg, #cb43a8 10%, #2c5fef 50%);
+ -webkit-background-clip: text;
+ background-clip: text;
+ letter-spacing: 5px;
+ -webkit-text-fill-color: transparent;
+ font-weight: 700;
+ }
-.description {
- font-size: 20px;
- padding-bottom: 30px;
- line-height: 2;
- color: #a0a0a0;
- letter-spacing: 3px;
- font-weight: 400;
-}
+ .description {
+ font-size: 18px;
+ padding-bottom: 48px;
+ line-height: 2;
+ color: #a0a0a0;
+ letter-spacing: 2px;
+ font-weight: 400;
+ }
-.feature-title {
- font-size: 36px;
-}
+ .feature-title {
+ font-size: 36px;
+ }
-.feature-sub-title {
- font-size: 20px;
- letter-spacing: 2px;
- padding-bottom: 0;
-}
+ .feature-sub-title {
+ font-size: 20px;
+ letter-spacing: 2px;
+ padding-bottom: 0;
+ }
-.title-logo {
- display: flex;
- align-items: center;
- gap: 8px;
- padding-bottom: 20px;
-}
+ /* 按钮样式(对齐 tiny-vue-home) */
+ .cta-group {
+ display: flex;
+ gap: 30px;
+ }
-/* 按钮样式 */
-.btn {
- padding: 16px 48px;
- border-radius: 30px;
- font-size: 19px;
- text-decoration: none;
- transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
- cursor: pointer;
- text-transform: uppercase;
- letter-spacing: 1px;
- position: relative;
- overflow: hidden;
-}
+ .btn {
+ padding: 12px 44px;
+ line-height: 24px;
+ border-radius: 30px;
+ font-size: 16px;
+ font-weight: 400;
+ text-decoration: none;
+ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
+ cursor: pointer;
+ letter-spacing: 1px;
+ position: relative;
+ overflow: hidden;
+ }
-.btn.primary {
- background: #191919;
- color: white;
- border: none;
- box-shadow: 0 10px 25px rgba(94, 124, 226, 0.3);
-}
+ .btn.primary {
+ background: #191919;
+ color: white;
+ border: none;
+ box-shadow: 0 10px 25px rgba(94, 124, 226, 0.3);
+ }
-.btn.primary:hover {
- transform: translateY(-3px);
- box-shadow: 0 15px 35px rgba(94, 124, 226, 0.5);
-}
+ .btn.primary:hover {
+ transform: translateY(-3px);
+ box-shadow: 0 15px 35px rgba(94, 124, 226, 0.5);
+ }
-.btn.secondary {
- background: transparent;
- color: #191919;
- border: 1px solid #191919;
- box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
-}
+ .btn.secondary {
+ background: transparent;
+ color: #191919;
+ border: 1px solid #191919;
+ box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
+ }
-.btn.secondary:hover {
- transform: translateY(-3px);
- border-color: #191919;
- box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
-}
+ .btn.secondary:hover {
+ transform: translateY(-3px);
+ border-color: #191919;
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
+ }
-/* 动画效果 */
-.fade-in-up {
- opacity: 0;
- transform: translateY(30px);
- transition: opacity 0.6s ease-out, transform 0.6s ease-out;
-}
+ /* 动画效果 */
+ .fade-in-up {
+ opacity: 0;
+ transform: translateY(30px);
+ transition: opacity 0.6s ease-out, transform 0.6s ease-out;
+ }
-.fade-in-up.is-visible {
- opacity: 1;
- transform: translateY(0);
-}
+ .fade-in-up.is-visible {
+ opacity: 1;
+ transform: translateY(0);
+ }
@keyframes fadeInUp {
from {
@@ -186,12 +190,12 @@
/* 平板横屏 (1024px - 1440px) */
@media (max-width: 1024px) {
.title {
- font-size: 24px;
+ font-size: 28px;
letter-spacing: 3px;
}
.subtitle {
- font-size: 32px;
+ font-size: 26px;
letter-spacing: 3px;
}
@@ -199,9 +203,6 @@
font-size: 16px;
}
- .feature-title {
- font-size: 30px;
- }
}
/* 平板竖屏 / 大手机 (768px - 1024px) */
@@ -216,7 +217,7 @@
}
.title {
- font-size: 32px;
+ font-size: 28px;
letter-spacing: 2px;
padding-bottom: 15px;
}
@@ -231,15 +232,17 @@
padding-bottom: 20px;
}
+ .cta-group {
+ gap: 15px;
+ width: 100%;
+ justify-content: center;
+ }
+
.btn {
padding: 14px 30px;
font-size: 14px;
}
- .feature-title {
- font-size: 28px;
- }
-
.feature-sub-title {
font-size: 18px;
padding-bottom: 0px;
@@ -261,31 +264,32 @@
}
.btn {
- padding: 10px 20px;
- font-size: 12px;
+ padding: 12px 24px;
+ font-size: 14px;
+ line-height: 1;
}
.description {
letter-spacing: 0px;
+ padding-left: 15px;
+ padding-right: 15px;
}
.title {
- font-size: 28px;
+ font-size: 22px;
letter-spacing: 1px;
+ .title-us {
+ font-size: 24px;
+ }
}
.subtitle {
- font-size: 22px;
+ font-size: 20px;
letter-spacing: 1px;
}
- .feature-title {
- font-size: 24px;
- }
-
.feature-sub-title {
font-size: 16px;
}
}
-
-
+}
\ No newline at end of file
diff --git a/packages/home/src/views/next-sdks-home/components/FeatureSection.vue b/packages/home/src/views/next-sdks-home/components/FeatureSection.vue
index e987ed07..ff04fd06 100644
--- a/packages/home/src/views/next-sdks-home/components/FeatureSection.vue
+++ b/packages/home/src/views/next-sdks-home/components/FeatureSection.vue
@@ -1,5 +1,5 @@
+import { computed } from "vue";
+// 导入图片资源
+import heroBgWhite from "@/assets/images/home/next-sdk-home/banner-bg.svg";
+import heroBgPc from "@/assets/images/home/next-sdk-home/banner-img.svg";
+
+// 使用 computed 确保 Vite 在构建时能正确追踪背景图片资源
+const heroBackgroundImageUrl = computed(() => {
+ return `url(${heroBgWhite})`;
+});
+
+
+
+
+
+
+ NEXT-SDKs
前端智能应用开发工具包
+
+
让你的前端应用变成智能应用
+
只需四步,即可接入 AI 能力,让应用智能化开发更简单高效
+
+
+
+
![NEXT-SDKs]()
+
+
+
+
+
diff --git a/packages/home/src/views/next-sdks-home/components/StepItem.vue b/packages/home/src/views/next-sdks-home/components/StepItem.vue
index 6088d0a8..c0810e58 100644
--- a/packages/home/src/views/next-sdks-home/components/StepItem.vue
+++ b/packages/home/src/views/next-sdks-home/components/StepItem.vue
@@ -19,9 +19,9 @@
:class="`language-${codeBlock.lang}`"
>
{
let body = lines.slice(1).join("\n");
const codeBlocks = [];
+ const codeBlockRanges = []; // 存储代码块的位置范围,用于后续移除
+
+ // 先提取所有代码块:```lang\n ... \n```
+ let searchStart = 0;
+ while (true) {
+ const fenceStart = body.indexOf("```", searchStart);
+ if (fenceStart === -1) break;
- // 仅处理第一个代码块:```lang\n ... \n```
- const fenceStart = body.indexOf("```");
- if (fenceStart !== -1) {
const langLineEnd = body.indexOf("\n", fenceStart + 3);
+ if (langLineEnd === -1) break;
+
const fenceHeader = body.slice(fenceStart + 3, langLineEnd).trim();
// 简单判断语言:首个和最后一个步骤是 bash,其余默认为 ts
const lang =
@@ -122,26 +128,35 @@ const parseMarkdown = () => {
(props.stepIndex === 0 || props.stepIndex === 3 ? "bash" : "typescript");
const fenceEnd = body.indexOf("```", langLineEnd + 1);
- if (fenceEnd !== -1) {
- const code = body.slice(langLineEnd + 1, fenceEnd).trim();
- if (code) {
- try {
- const language = Prism.languages[lang] || Prism.languages.markup || {};
- const highlightedCode = Prism.highlight(code, language, lang);
- codeBlocks.push({ lang, code, highlightedCode });
- } catch {
- const escapedCode = code
- .replace(/&/g, "&")
- .replace(//g, ">")
- .replace(/"/g, """)
- .replace(/'/g, "'");
- codeBlocks.push({ lang, code, highlightedCode: escapedCode });
- }
+ if (fenceEnd === -1) break;
+
+ const code = body.slice(langLineEnd + 1, fenceEnd).trim();
+ if (code) {
+ try {
+ const language = Prism.languages[lang] || Prism.languages.markup || {};
+ const highlightedCode = Prism.highlight(code, language, lang);
+ codeBlocks.push({ lang, code, highlightedCode });
+ } catch {
+ const escapedCode = code
+ .replace(/&/g, "&")
+ .replace(//g, ">")
+ .replace(/"/g, """)
+ .replace(/'/g, "'");
+ codeBlocks.push({ lang, code, highlightedCode: escapedCode });
}
- // 去掉代码块部分,保留其余内容用于 markdown 渲染
- body = body.slice(0, fenceStart) + body.slice(fenceEnd + 3);
+ // 记录代码块的位置范围
+ codeBlockRanges.push({ start: fenceStart, end: fenceEnd + 3 });
}
+
+ // 更新搜索起始位置
+ searchStart = fenceEnd + 3;
+ }
+
+ // 从后往前移除代码块,避免索引变化
+ for (let i = codeBlockRanges.length - 1; i >= 0; i--) {
+ const range = codeBlockRanges[i];
+ body = body.slice(0, range.start) + body.slice(range.end);
}
const processedContent = body.trim();
@@ -156,8 +171,8 @@ const parseMarkdown = () => {
const step = ref(parseMarkdown());
-// 跟踪每个代码块的复制状态
-const copiedStates = ref(false);
+// 跟踪每个代码块的复制状态,使用对象存储每个代码块的独立状态
+const copiedStates = ref({});
// 监听 markdownContent 或 stepIndex 变化,重新解析
watch([() => props.markdownContent, () => props.stepIndex], () => {
@@ -198,10 +213,10 @@ const copyCode = async (code, index, codeIndex) => {
document.body.removeChild(textArea);
}
- // 显示复制成功提示
- copiedStates.value = true;
+ // 显示复制成功提示(针对当前代码块)
+ copiedStates.value[key] = true;
setTimeout(() => {
- copiedStates.value = false;
+ copiedStates.value[key] = false;
}, 2000);
} catch (err) {
console.error("复制失败:", err);
@@ -210,6 +225,10 @@ const copyCode = async (code, index, codeIndex) => {
diff --git a/packages/home/src/views/next-sdks-home/next-sdk.md b/packages/home/src/views/next-sdks-home/next-sdk.md
index a85cc5bc..ea081c79 100644
--- a/packages/home/src/views/next-sdks-home/next-sdk.md
+++ b/packages/home/src/views/next-sdks-home/next-sdk.md
@@ -76,10 +76,12 @@ await server.connect(serverTransport)
安装并使用遥控器组件
-```typescript
-// 安装依赖
+```bash
npm install @opentiny/next-remoter
+```
+
+```typescript
// 在 Vue 中使用
@@ -93,3 +95,4 @@ const show = ref(false)
```
+
diff --git a/packages/home/src/views/tiny-vue-home/common.less b/packages/home/src/views/tiny-vue-home/common.less
index 9335c19b..89973b60 100644
--- a/packages/home/src/views/tiny-vue-home/common.less
+++ b/packages/home/src/views/tiny-vue-home/common.less
@@ -19,6 +19,7 @@
position: relative;
overflow: hidden;
display: flex;
+ padding: 30px;
justify-content: center;
align-items: center;
}
@@ -107,17 +108,20 @@
/* ==================== 公共文本样式 ==================== */
.title {
- font-size: 50px;
+ font-size: 52px;
font-weight: 700;
color: #191919;
- letter-spacing: 5px;
- line-height: 1.2;
- padding-bottom: 20px;
+ letter-spacing: 2px;
+ line-height: 1.5;
+ padding-bottom: 32px;
+ .title-us {
+ font-size: 56px;
+ }
}
.subtitle {
- font-size: 44px;
- padding-bottom: 20px;
+ font-size: 50px;
+ padding-bottom: 48px;
line-height: 1.5;
background: linear-gradient(90deg, #cb43a8 10%, #2c5fef 50%);
-webkit-background-clip: text;
@@ -128,8 +132,8 @@
}
.description {
- font-size: 20px;
- padding-bottom: 30px;
+ font-size: 18px;
+ padding-bottom: 48px;
line-height: 2;
color: #a0a0a0;
letter-spacing: 2px;
@@ -143,10 +147,11 @@
}
.btn {
- padding: 16px 40px;
+ padding: 12px 44px;
+ line-height: 24px;
border-radius: 30px;
font-size: 16px;
- font-weight: 600;
+ font-weight: 400;
text-decoration: none;
cursor: pointer;
letter-spacing: 1px;
@@ -168,24 +173,17 @@
}
.btn.secondary {
- background: rgba(255, 255, 255, 0.8);
color: #191919;
border: 1px solid #191919;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.05);
}
.btn.secondary:hover {
- background: white;
transform: translateY(-3px);
border-color: #191919;
box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
}
- /* ==================== Feature 相关样式 ==================== */
- .feature-title {
- font-size: 36px;
- }
-
.feature-sub-title {
font-size: 20px;
letter-spacing: 2px;
@@ -205,7 +203,7 @@
position: relative;
z-index: 1;
display: flex;
- align-items: center;
+ align-items: baseline;
justify-content: space-between;
max-width: 1400px;
width: 100%;
@@ -214,14 +212,7 @@
.feature-text {
flex: 1;
- color: var(--text-primary);
- padding: 0 30px;
-
- .description {
- font-size: 16px;
- letter-spacing: 2px;
- color: #808080;
- }
+ padding: 0 20px;
}
.feature-visual {
@@ -278,22 +269,18 @@
}
.title {
- font-size: 24px;
+ font-size: 28px;
letter-spacing: 3px;
}
.subtitle {
- font-size: 32px;
+ font-size: 26px;
letter-spacing: 3px;
}
.description {
font-size: 16px;
}
-
- .feature-title {
- font-size: 30px;
- }
}
@media (max-width: 768px) {
@@ -307,7 +294,7 @@
}
.title {
- font-size: 32px;
+ font-size: 28px;
letter-spacing: 2px;
padding-bottom: 15px;
}
@@ -333,10 +320,6 @@
font-size: 14px;
}
- .feature-title {
- font-size: 28px;
- }
-
.feature-sub-title {
font-size: 18px;
padding-bottom: 0px;
@@ -349,30 +332,47 @@
}
.title {
- font-size: 28px;
+ font-size: 22px;
letter-spacing: 1px;
+ .title-us {
+ font-size: 24px;
+ }
+ }
+
+ .floating-img {
+ width: 100%;
+ animation: none;
+ transition: none;
}
.subtitle {
- font-size: 22px;
+ font-size: 20px;
letter-spacing: 1px;
}
.description {
- font-size: 14px;
+ font-size: 16px;
letter-spacing: 0px;
+ padding-left: 15px;
+ padding-right: 15px;
}
.feature-title {
- font-size: 24px;
+ font-size: 20px;
}
.feature-sub-title {
font-size: 16px;
}
+ .feature-text-description {
+ font-size: 14px;
+ }
+
.btn {
- padding: 12px 25px;
+ padding: 12px 24px;
+ font-size: 14px;
+ line-height: 1;
}
}
}
diff --git a/packages/home/src/views/tiny-vue-home/components/CrossPlatformFeature.vue b/packages/home/src/views/tiny-vue-home/components/CrossPlatformFeature.vue
index 964cf856..5e910c9b 100644
--- a/packages/home/src/views/tiny-vue-home/components/CrossPlatformFeature.vue
+++ b/packages/home/src/views/tiny-vue-home/components/CrossPlatformFeature.vue
@@ -2,16 +2,19 @@
import { onMounted, ref, inject, nextTick } from "vue";
// 导入图片资源
import featureCrossPlatform from "@/assets/images/home/tinyvue-home/web/framework.svg";
-
+import img1 from "@/assets/images/home/tinyvue-home/web/img1.svg";
+import img2 from "@/assets/images/home/tinyvue-home/web/img2.svg";
// 跨端跨框架特性数据
const features = [
{
title: "一套代码同时支持PC和移动端",
+ icon: img1,
description:
"我们支持PC和移动端,同一个组件在不同终端表现不同在多端场景下组件的使用方式完全相同。",
},
{
- title: "一套代码同时支持Vue 2 / Vue 3",
+ title: "一套代码同时支持 Vue 2 / Vue 3",
+ icon: img2,
description:
"针对Vue2 和 Vue3 实现了相应的版本适配器,抹平Vue2 和 Vue3 的差异,实现了一套代码同时支持Vue2 和 Vue3。",
},
@@ -24,16 +27,17 @@ const features = [
+
{{ item.title }}
-
{{ item.description }}
+
{{ item.description }}
diff --git a/packages/home/src/views/tiny-vue-home/components/HeroSection.vue b/packages/home/src/views/tiny-vue-home/components/HeroSection.vue
index baee1c9c..f743f953 100644
--- a/packages/home/src/views/tiny-vue-home/components/HeroSection.vue
+++ b/packages/home/src/views/tiny-vue-home/components/HeroSection.vue
@@ -1,5 +1,5 @@
-
+
-
TinyVue 智能组件库
-
跨端、跨框架、智能化
-
- 一款跨端、跨框架的企业级 UI 组件库,支持 Vue 2 和 Vue 3,支持 PC 端和移动端
-
+
TinyVue 智能组件库
+
轻量 高性能 智能化
+
一款支持主流前端框架、AI对话框、MCP Host 和智能体搭建平台
-
![TinyVue 智能组件库]()
+
@@ -59,7 +67,7 @@ onMounted(() => {
align-items: center;
background-repeat: no-repeat;
background-size: cover;
- padding: 0 75px;
+ gap: 60px;
}
.hero-content {
@@ -79,8 +87,7 @@ onMounted(() => {
align-items: center;
img {
- width: 90%;
- max-width: 1000px;
+ width: 1000px;
filter: drop-shadow(0 20px 40px rgba(0, 0, 0, 0.15));
border-radius: 20px;
}
@@ -107,6 +114,7 @@ onMounted(() => {
flex-direction: column;
text-align: center;
justify-content: center;
+ gap: 0px;
}
.hero-content {
diff --git a/packages/home/src/views/tiny-vue-home/components/McpSection.vue b/packages/home/src/views/tiny-vue-home/components/McpSection.vue
new file mode 100644
index 00000000..ac48f822
--- /dev/null
+++ b/packages/home/src/views/tiny-vue-home/components/McpSection.vue
@@ -0,0 +1,366 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ item.title }}
+
{{ item.description }}
+
+
+
+
+
+
TinyVue 智能组件库
+
让你的Web 随心所动 无需手动
+
+
+
+
+
+
diff --git a/packages/home/src/views/tiny-vue-home/index.vue b/packages/home/src/views/tiny-vue-home/index.vue
index 1e37f05b..5f31cfff 100644
--- a/packages/home/src/views/tiny-vue-home/index.vue
+++ b/packages/home/src/views/tiny-vue-home/index.vue
@@ -1,11 +1,21 @@