diff --git a/src/pages/index.js b/src/pages/index.js
index 5fe7fe8..fceb3a1 100644
--- a/src/pages/index.js
+++ b/src/pages/index.js
@@ -1,118 +1,410 @@
+import clsx from 'clsx';
import Link from '@docusaurus/Link';
-import Translate from '@docusaurus/Translate';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import Layout from '@theme/Layout';
-import clsx from 'clsx';
-import React, { useEffect } from 'react';
-import Slider from "react-slick";
-import RecruitPhone from "../../static/img/index-recruit-phone.jpg";
-import Recruit from "../../static/img/index-recruit.jpg";
-import indexbug from '../../static/img/indexbug.png';
-import indexbugphone from '../../static/img/indexbugphone.png';
-import Elephant from '../../svg/img-elephant-balloon.svg';
-import HOW from '../../static/img/ivorysql-how.jpg';
-import HomepageFeatures from '../components/HomepageFeatures';
+import React, { useEffect, useState } from 'react';
import styles from './index.module.css';
-import SliderIndex from './slider';
-import SliderBug from './slider-bug';
-import SliderBugPhone from './slider-bug-phone';
-import SliderPhoneIndex from './slider-phone';
-import { customFields } from '../../docusaurus.config';
-function HomepageHeader() {
- const {siteConfig} = useDocusaurusContext();
- const settings = {
- autoplay: true,
- autoplaySpeed: 5000,
- dots: true,
- infinite: true,
- slidesToShow: 1,
- slidesToScroll: 1,
- arrows: false,
- };
- const { i18n } = useDocusaurusContext();
- const isEnglish = i18n.currentLocale === 'en';
+
+const Icon01 = require('../../svg/icon-01.svg').default;
+const Icon02 = require('../../svg/icon-02.svg').default;
+const Icon03 = require('../../svg/icon-03.svg').default;
+const Icon04 = require('../../svg/icon-04.svg').default;
+const Icon05 = require('../../svg/icon-05.svg').default;
+const Icon06 = require('../../svg/icon-06.svg').default;
+const HeroElephant = require('../../svg/img-elephant-balloon.svg').default;
+
+const CoreAdvantageIcon = Icon01;
+const ScenarioIcon = Icon03;
+const EcosystemIcon = Icon02;
+const CertificateIcon = Icon05;
+const InstallDeployIcon = Icon04;
+
+const CORE_CARD_ICONS = [Icon01, Icon03, Icon04, Icon02, Icon05, Icon06, Icon01, Icon03];
+const SCENARIO_CARD_ICONS = [Icon04, Icon02, Icon06, Icon01, Icon05];
+const INSTALL_CARD_ICONS = [Icon04, Icon01, Icon06];
+
+const RELEASES_URL = 'https://github.com/IvorySQL/IvorySQL/releases';
+const ONLINE_TRIAL_URL = 'https://trial.ivorysql.org/';
+const LATEST_RELEASE_API_URL = 'https://api.github.com/repos/IvorySQL/IvorySQL/releases/latest';
+const LATEST_VERSION_CACHE_KEY = 'ivorysql_latest_release_label';
+const LATEST_VERSION_CACHE_TTL = 6 * 60 * 60 * 1000;
+
+const ECOSYSTEM_TOOL_STATUS = {
+ progress: new Set(['citus', 'pg_ai_query', 'stackgres', 'databene', 'madlib']),
+ planned: new Set(['shardingsphere', 'pacemaker corosync', 'postgresql age', 'yukon', 'powa']),
+ proprietary: new Set(['ivymigration', 'ivyevaluation', 'ivorysql serverless']),
+};
+
+function normalizeToolName(toolName) {
+ return toolName.replace(/\u200c/g, '').toLowerCase().trim();
+}
+
+function getEcosystemToolTone(toolName) {
+ const normalizedName = normalizeToolName(toolName);
+ if (ECOSYSTEM_TOOL_STATUS.proprietary.has(normalizedName)) {
+ return 'proprietary';
+ }
+ if (ECOSYSTEM_TOOL_STATUS.progress.has(normalizedName)) {
+ return 'progress';
+ }
+ if (ECOSYSTEM_TOOL_STATUS.planned.has(normalizedName)) {
+ return 'planned';
+ }
+ return 'supported';
+}
+
+function formatLatestReleaseLabel(release, fallbackLabel) {
+ const source = `${release?.name || ''} ${release?.tag_name || ''}`;
+ const versionMatch = source.match(/(\d+(?:\.\d+){1,2})/);
+ if (versionMatch) {
+ return `IvorySQL ${versionMatch[1]}`;
+ }
+ const cleaned = (release?.name || release?.tag_name || '').trim();
+ return cleaned || fallbackLabel;
+}
+
+function readLatestVersionFromCache() {
+ if (typeof window === 'undefined') {
+ return null;
+ }
+
+ try {
+ const rawCache = window.localStorage.getItem(LATEST_VERSION_CACHE_KEY);
+ if (!rawCache) {
+ return null;
+ }
+ const parsedCache = JSON.parse(rawCache);
+ if (!parsedCache?.label || !parsedCache?.time) {
+ return null;
+ }
+ if (Date.now() - parsedCache.time > LATEST_VERSION_CACHE_TTL) {
+ return null;
+ }
+ return parsedCache.label;
+ } catch {
+ return null;
+ }
+}
+
+function writeLatestVersionToCache(label) {
+ if (typeof window === 'undefined') {
+ return;
+ }
+
+ try {
+ window.localStorage.setItem(
+ LATEST_VERSION_CACHE_KEY,
+ JSON.stringify({
+ label,
+ time: Date.now(),
+ }),
+ );
+ } catch {
+ // Ignore storage failures in private mode / restricted environments.
+ }
+}
+
+const CONTENT = {
+ zh: {
+ slogan: '一款开源的兼容 Oracle 的 PostgreSQL',
+ intro:
+ 'IvorySQL 是一款先进、功能齐全的开源 Oracle 兼容 PostgreSQL,致力于保持高兼容性,并可作为最新 PostgreSQL 的完全替代品。通过 compatible_mode 开关可在 Oracle 与 PostgreSQL 兼容模式间切换,PL/iSQL 支持 Oracle PL/SQL 语法及 Oracle 风格包(Packages)。',
+ heroBadges: ['Oracle 兼容', 'Apache 2.0 开源', '基于 PostgreSQL 内核'],
+ latestVersionPrefix: '最新版本',
+ latestVersionLabel: 'IvorySQL 5.1',
+ actions: [
+ { label: '免费下载', to: '/releases-page' },
+ { label: '在线体验', href: ONLINE_TRIAL_URL },
+ { label: '最新活动', to: '/webinars-page' },
+ ],
+ coreTitle: 'IvorySQL 核心优势',
+ coreDesc: '从内核兼容到生态扩展,提供面向企业生产环境的数据库能力。',
+ coreItems: [
+ {
+ title: '核心开源',
+ description: '采用 Apache 2.0 协议开源,无厂商限制,代码透明且支持定制化开发。',
+ },
+ {
+ title: '深度 Oracle 兼容',
+ description: '通过 PL/iSQL 过程语言和 ivorysql_ora 插件实现 PL/SQL 语法兼容,支持 Oracle 数据库迁移。',
+ },
+ {
+ title: '国产化全平台兼容',
+ description: '全面兼容国内外主流软硬件,兼容国产芯片架构和操作系统,提供全平台介质包确保便捷部署。',
+ },
+ {
+ title: '云原生支持',
+ description: '容器化方案覆盖 Docker Compose/Swarm、K8S Operator 及云服务平台。',
+ },
+ {
+ title: '企业级支持',
+ description: '由瀚高股份提供技术支持,并在多个企业生产环境落地。',
+ },
+ {
+ title: '生态融合',
+ description: '继承 PostgreSQL 完整 SQL 能力、可靠性和丰富生态组件。',
+ },
+ {
+ title: '场景覆盖广',
+ description: '覆盖企业数据库、LBS、数据仓库、建站开发、数据库迁移等核心场景。',
+ },
+ {
+ title: '易用性强',
+ description: '降低系统管理成本,提供开发者友好接口和第三方工具集成能力。',
+ },
+ ],
+ scenariosTitle: 'IvorySQL 应用场景',
+ scenariosDesc: '覆盖从交易系统到分析平台的典型数据库工作负载。',
+ scenarioItems: [
+ {
+ title: '企业数据库',
+ description: '适用于 ERP、交易系统、财务系统等对高可用和复杂业务逻辑有要求的场景。',
+ },
+ {
+ title: 'LBS 应用',
+ description: '支持地理空间查询(如 O2O、游戏地图),通过 PostGIS 实现位置服务。',
+ },
+ {
+ title: '数据仓库 / 大数据',
+ description: '利用丰富数据类型和计算能力搭建分析平台。',
+ },
+ {
+ title: '建站 / App 开发',
+ description: '依托高性能能力提升网站与应用效率。',
+ },
+ {
+ title: '数据库迁移',
+ description: '支持将 Oracle 数据库迁移到 IvorySQL。',
+ },
+ ],
+ installTitle: 'IvorySQL 安装部署',
+ installDesc:
+ '结合官网文档与版本发布信息,提供从快速上手到生产部署的清晰路径,可按环境选择包安装、源码构建或容器化部署。',
+ installItems: [
+ {
+ title: '快速安装(推荐)',
+ description: '通过官方安装文档完成依赖准备、实例初始化和服务启动,适合首次体验与标准化部署。',
+ action: { label: '查看安装文档', to: '/docs-installation' },
+ },
+ {
+ title: '版本与介质包安装',
+ description: '在 Releases 页面查看当前稳定版本与历史版本,并根据系统环境选择对应安装介质包。',
+ action: { label: '查看 Releases', to: '/releases-page' },
+ },
+ {
+ title: '容器化部署',
+ description: '基于官方 Docker 仓库进行镜像部署,便于在开发测试、CI/CD 与云原生环境中快速落地。',
+ action: { label: '查看 Docker 仓库', href: 'https://github.com/IvorySQL/docker_library' },
+ },
+ ],
+ ecosystemTitle: 'IvorySQL 及周边工具生态',
+ ecosystemDesc:
+ '社区提供丰富的生态工具:客户端工具、高可用工具、云原生工具、监控运维工具、备份恢复工具、地理信息工具等。',
+ ecosystemGroups: [
+ { title: '数据访问中间件', items: ['pgpool-II', 'pgBouncer', 'odyssey', 'HAProxy', 'ShardingSphere', 'Citus', 'vip-manager'], wide: true },
+ { title: 'ORM', items: ['Go', 'NodeJS', 'MyBatis', 'Hibernate'] },
+ { title: '标准 SQL 及驱动', items: ['libpq', 'JDBC', 'ODBC', 'NodeJS', 'psycopg2', 'Go', 'Python', 'Rust', 'Ruby', 'ADO.NET', 'lib/pq', 'pgx'], wide: true },
+ { title: '客户端工具', items: ['DBeaver', 'pgAdmin', 'Navicat', 'Navicat Premium'] },
+ { title: '内核扩展', items: ['Oracle 兼容', 'PG 兼容及跟进'] },
+ { title: '高可靠', items: ['pg_rman', 'WAL-G', 'pg_probackup', 'pgBackRest'] },
+ { title: '集群工具', items: ['Patroni', 'repmgr', 'Pacemaker Corosync'] },
+ { title: '监控运维', items: ['Prometheus', 'Alertmanager', 'pgMonitor', 'Grafana', 'PoWA'] },
+ { title: '异构数据库访问工具', items: ['Debezium', 'pglogical', 'mysql_fdw', 'oracle_fdw'] },
+ { title: '多模数据库', items: ['TimescaleDB', 'DocumentDB', 'PostgreSQL AGE', 'FerretDB'] },
+ { title: '地理信息', items: ['PostGIS', 'pgRouting'] },
+ { title: '机器学习及 AI', items: ['pgvector', 'MADlib', 'pg_ai_query'] },
+ { title: 'DDL 及数据加载工具', items: ['pg_bulkload', 'ddlx'] },
+ { title: '在线体验平台', items: ['postgres-wasm', 'IVYOnlineTrial'] },
+ { title: '定时任务工具', items: ['pg_cron', 'pgAgent', 'pg_jobs'] },
+ { title: '生态合作', items: ['Yukon', 'StackGres', 'Databene', 'WhaleOps'] },
+ { title: '迁移/评估工具', items: ['Ora2Pg', 'ivyMigration', 'ivyEvaluation'] },
+ {
+ title: '云生态',
+ items: ['Docker Compose', 'Podman', 'Docker Swarm', 'IvorySQL Cloud', 'IvorySQL Operator', 'IvorySQL Serverless'],
+ },
+ ],
+ ecosystemFooters: [
+ '操作系统(windows / CentOS / Redhat / ubuntu / openEuler / 银河麒麟 / 统信 UOS 等)',
+ 'x86、鲲鹏、龙芯、兆芯、申威、海光、飞腾、MIPS、RISC-V',
+ ],
+ ecosystemLegend: [
+ { label: '已支持', tone: 'supported' },
+ { label: '正在支持', tone: 'progress' },
+ { label: '未来支持', tone: 'planned' },
+ { label: '闭源产品', tone: 'proprietary' },
+ ],
+ compatibilityTitle: 'IvorySQL 兼容认证',
+ compatibilityDesc: '更多兼容认证与生态合作信息,请查看合作伙伴页面。',
+ },
+ en: {
+ slogan: 'An open source PostgreSQL with Oracle compatibility',
+ intro:
+ 'IvorySQL is an advanced open source Oracle-compatible PostgreSQL distribution built for strong compatibility and smooth replacement of the latest PostgreSQL. The compatible_mode switch lets you move between Oracle and PostgreSQL modes, while PL/iSQL supports Oracle PL/SQL syntax and package-style development.',
+ heroBadges: ['Oracle compatibility', 'Apache 2.0 open source', 'Built on PostgreSQL kernel'],
+ latestVersionPrefix: 'Latest Version',
+ latestVersionLabel: 'IvorySQL 5.1',
+ actions: [
+ { label: 'Free Download', to: '/releases-page' },
+ { label: 'Online Trial', href: ONLINE_TRIAL_URL },
+ { label: 'Latest Webinars', to: '/webinars-page' },
+ ],
+ coreTitle: 'Core Advantages',
+ coreDesc: 'From kernel compatibility to ecosystem integration, built for production workloads.',
+ coreItems: [
+ {
+ title: 'Open Source Core',
+ description: 'Apache 2.0 licensed with no vendor lock-in, transparent code, and easy customization.',
+ },
+ {
+ title: 'Deep Oracle Compatibility',
+ description: 'PL/iSQL and the ivorysql_ora extension provide strong PL/SQL compatibility for Oracle migrations.',
+ },
+ {
+ title: 'Full-Platform Compatibility',
+ description: 'Compatible with mainstream hardware and operating systems, including domestic chip architectures.',
+ },
+ {
+ title: 'Cloud-Native Support',
+ description: 'Container-ready support across Docker Compose/Swarm, K8S Operator, and cloud platforms.',
+ },
+ {
+ title: 'Enterprise Support',
+ description: 'Backed by HighGo and validated in production-grade enterprise deployments.',
+ },
+ {
+ title: 'Ecosystem Integration',
+ description: 'Inherits PostgreSQL SQL completeness, reliability, and ecosystem extensibility.',
+ },
+ {
+ title: 'Broad Scenario Coverage',
+ description: 'Covers enterprise workloads, LBS, data warehousing, web/app development, and migrations.',
+ },
+ {
+ title: 'Easy to Use',
+ description: 'Reduces management overhead with developer-friendly interfaces and third-party integration.',
+ },
+ ],
+ scenariosTitle: 'Application Scenarios',
+ scenariosDesc: 'Supports mainstream database workloads from OLTP systems to analytical platforms.',
+ scenarioItems: [
+ {
+ title: 'Enterprise Databases',
+ description: 'Fits ERP, transaction systems, and finance systems requiring high availability and complex logic.',
+ },
+ {
+ title: 'LBS Applications',
+ description: 'Supports geospatial workloads such as O2O and game maps through PostGIS.',
+ },
+ {
+ title: 'Data Warehouse / Big Data',
+ description: 'Build analytical platforms with rich data types and robust processing capabilities.',
+ },
+ {
+ title: 'Websites / App Development',
+ description: 'Improves website and application efficiency with high-performance database capabilities.',
+ },
+ {
+ title: 'Database Migration',
+ description: 'Enables direct migration paths from Oracle databases to IvorySQL.',
+ },
+ ],
+ installTitle: 'IvorySQL Installation & Deployment',
+ installDesc:
+ 'Based on official docs and release resources, choose package installation, source build, or container deployment to match your environment.',
+ installItems: [
+ {
+ title: 'Quick Installation (Recommended)',
+ description:
+ 'Follow the official installation guide to prepare dependencies, initialize clusters, and start services quickly.',
+ action: { label: 'Installation Guide', to: '/docs-installation' },
+ },
+ {
+ title: 'Packages & Releases',
+ description:
+ 'Use the Releases page to check stable/historical versions and pick proper installation packages for your platform.',
+ action: { label: 'View Releases', to: '/releases-page' },
+ },
+ {
+ title: 'Container Deployment',
+ description:
+ 'Use the official Docker repository for fast setup in development, CI/CD pipelines, and cloud-native environments.',
+ action: { label: 'Docker Repository', href: 'https://github.com/IvorySQL/docker_library' },
+ },
+ ],
+ ecosystemTitle: 'IvorySQL Ecosystem & Tools',
+ ecosystemDesc:
+ 'The community provides a rich ecosystem of tools, including client tools, high availability tools, cloud-native tools, monitoring and operations tools, backup and recovery tools, and geospatial tools.',
+ ecosystemGroups: [
+ {
+ title: 'Data Access Middleware',
+ items: ['pgpool-II', 'pgBouncer', 'odyssey', 'HAProxy', 'ShardingSphere', 'Citus', 'vip-manager'],
+ wide: true,
+ },
+ { title: 'ORM', items: ['Go', 'NodeJS', 'MyBatis', 'Hibernate'] },
+ {
+ title: 'Standard SQL & Drivers',
+ items: ['libpq', 'JDBC', 'ODBC', 'NodeJS', 'psycopg2', 'Go', 'Python', 'Rust', 'Ruby', 'ADO.NET', 'lib/pq', 'pgx'],
+ wide: true,
+ },
+ { title: 'Client Tools', items: ['DBeaver', 'pgAdmin', 'Navicat', 'Navicat Premium'] },
+ { title: 'Core Extensions', items: ['Oracle Compatibility', 'PG Compatibility & Upstream Tracking'] },
+ { title: 'High Availability', items: ['pg_rman', 'WAL-G', 'pg_probackup', 'pgBackRest'] },
+ { title: 'Cluster Management Tools', items: ['Patroni', 'repmgr', 'Pacemaker Corosync'] },
+ { title: 'Monitoring & Operations', items: ['Prometheus', 'Alertmanager', 'pgMonitor', 'Grafana', 'PoWA'] },
+ { title: 'Heterogeneous Access Tools', items: ['Debezium', 'pglogical', 'mysql_fdw', 'oracle_fdw'] },
+ { title: 'Multi-Model Database', items: ['TimescaleDB', 'DocumentDB', 'PostgreSQL AGE', 'FerretDB'] },
+ { title: 'Geospatial', items: ['PostGIS', 'pgRouting'] },
+ { title: 'Machine Learning & AI', items: ['pgvector', 'MADlib', 'pg_ai_query'] },
+ { title: 'DDL & Data Loading Tools', items: ['pg_bulkload', 'ddlx'] },
+ { title: 'Online Demo Platform', items: ['postgres-wasm', 'IVYOnlineTrial'] },
+ { title: 'Job Scheduling Tools', items: ['pg_cron', 'pgAgent', 'pg_jobs'] },
+ { title: 'Ecosystem Partnerships', items: ['Yukon', 'StackGres', 'Databene', 'WhaleOps'] },
+ { title: 'Migration & Assessment Tools', items: ['Ora2Pg', 'ivyMigration', 'ivyEvaluation'] },
+ {
+ title: 'Cloud Ecosystem',
+ items: ['Docker Compose', 'Podman', 'Docker Swarm', 'IvorySQL Cloud', 'IvorySQL Operator', 'IvorySQL Serverless'],
+ },
+ ],
+ ecosystemFooters: [
+ 'Operating System (windows / CentOS / Redhat / ubuntu / openEuler / kylin OS / UnionTech OS)',
+ 'x86 / Kunpeng / LoongArch / Zhaoxin / Sunway / Hygon / Phytium / MIPS / RISC-V',
+ ],
+ ecosystemLegend: [
+ { label: 'Supported', tone: 'supported' },
+ { label: 'Support In Progress', tone: 'progress' },
+ { label: 'Support Planned', tone: 'planned' },
+ { label: 'Proprietary Software', tone: 'proprietary' },
+ ],
+ compatibilityTitle: 'IvorySQL Compatibility Certificates',
+ compatibilityDesc: 'See more compatibility certificates and ecosystem partnerships on the partners page.',
+ },
+};
+
+function ActionLink({ action, className }) {
+ if (action.href) {
+ return (
+
+ {action.label}
+
+ );
+ }
return (
-
-
- {/* HOW 大会宣传,根据中英版显示不同图片及链接*/}
-
- {/* 页面一 */}
-
-
-
-
- {/* */}
-
-
-
-
IvorySQL
-
Open Source Oracle Compatible PostgreSQL
-
-
- Online Trial
-
-
- Learn More
-
-
-
-
-
- {/* */}
-
-
-
-
-
- {/* 页面二 */}
-
-
-

-
-
-
-

-
-
-
-
-
+
+ {action.label}
+
);
}
function ChatWidget() {
- const {siteConfig:{customFields}} = useDocusaurusContext();
-
+ const {
+ siteConfig: { customFields },
+ } = useDocusaurusContext();
+
useEffect(() => {
- // 创建外部 script 标签加载 SDK
const script = document.createElement('script');
- script.src = "https://lf-cdn.coze.cn/obj/unpkg/flow-platform/chat-app-sdk/1.1.0-beta.3/libs/cn/index.js";
+ script.src = 'https://lf-cdn.coze.cn/obj/unpkg/flow-platform/chat-app-sdk/1.1.0-beta.3/libs/cn/index.js';
script.async = true;
- // 当脚本加载完成后调用初始化代码
script.onload = () => {
if (window.CozeWebSDK && window.CozeWebSDK.WebChatClient) {
new window.CozeWebSDK.WebChatClient({
@@ -122,43 +414,278 @@ function ChatWidget() {
componentProps: {
title: 'IvorySQL Chatroom',
icon: 'https://raw.githubusercontent.com/IvorySQL/Ivory-www/main/static/img/ivory-black.png',
-
},
auth: {
- type: "token",
+ type: 'token',
token: customFields.patToken,
- onRefreshToken: function () {
+ onRefreshToken() {
return customFields.patToken;
- }
- }
+ },
+ },
});
} else {
- console.error('CozeWebSDK 未加载成功!');
+ console.error('Failed to load CozeWebSDK.');
}
};
- // 将 script 标签添加到 body 中
document.body.appendChild(script);
-
- // 可选:组件卸载时清除 script 标签
return () => {
document.body.removeChild(script);
};
- }, []);
+ }, [customFields.botId, customFields.patToken]);
+
+ return null;
+}
- return null; // 该组件不需要渲染任何内容
+function SectionTitle({ title, Icon }) {
+ return (
+
+
+ {Icon ? (
+
+
+
+ ) : null}
+
{title}
+
+
+ );
}
export default function Home() {
- const {siteConfig} = useDocusaurusContext();
+ const { siteConfig, i18n } = useDocusaurusContext();
+ const isZh = i18n.currentLocale.toLowerCase().startsWith('zh');
+ const content = isZh ? CONTENT.zh : CONTENT.en;
+ const [latestVersionLabel, setLatestVersionLabel] = useState(content.latestVersionLabel);
+ const certImages = [
+ '/img/partners/cert1.jpg',
+ '/img/partners/cert2.jpg',
+ '/img/partners/cert3.jpg',
+ '/img/partners/cert4.jpg',
+ '/img/partners/cert5.png',
+ ];
+ const certCarouselImages = [...certImages, ...certImages];
+
+ useEffect(() => {
+ let cancelled = false;
+
+ setLatestVersionLabel(content.latestVersionLabel);
+
+ const cacheLabel = readLatestVersionFromCache();
+ if (cacheLabel) {
+ setLatestVersionLabel(cacheLabel);
+ return () => {
+ cancelled = true;
+ };
+ }
+
+ const updateLatestVersion = async () => {
+ try {
+ const response = await fetch(LATEST_RELEASE_API_URL, {
+ headers: {
+ Accept: 'application/vnd.github+json',
+ },
+ });
+
+ if (!response.ok) {
+ return;
+ }
+
+ const release = await response.json();
+ const label = formatLatestReleaseLabel(release, content.latestVersionLabel);
+
+ if (!cancelled && label) {
+ setLatestVersionLabel(label);
+ writeLatestVersionToCache(label);
+ }
+ } catch {
+ // Keep default label when request fails.
+ }
+ };
+
+ updateLatestVersion();
+
+ return () => {
+ cancelled = true;
+ };
+ }, [content.latestVersionLabel]);
+
return (
-
+
-
-
-
+
+
+
+
+
IvorySQL
+
{content.slogan}
+
+ {content.heroBadges.map((badge) => (
+
+ {badge}
+
+ ))}
+
+
{content.intro}
+
+
+ {content.actions.map((action) => (
+
+ ))}
+
+
+
+
+
+
+
+
+
+
+
+
{content.coreDesc}
+
+ {content.coreItems.map((item, index) => {
+ const CardIcon = CORE_CARD_ICONS[index % CORE_CARD_ICONS.length];
+ return (
+
+
+
+
+
+
{item.title}
+
+ {item.description}
+
+ );
+ })}
+
+
+
+
+
+
+
+
{content.scenariosDesc}
+
+ {content.scenarioItems.map((item, index) => {
+ const CardIcon = SCENARIO_CARD_ICONS[index % SCENARIO_CARD_ICONS.length];
+ return (
+
+
+
+
+
+
{item.title}
+
+ {item.description}
+
+ );
+ })}
+
+
+
+
+
+
+
+
{content.installDesc}
+
+ {content.installItems.map((item, index) => {
+ const CardIcon = INSTALL_CARD_ICONS[index % INSTALL_CARD_ICONS.length];
+ return (
+
+
+
+
+
+
{item.title}
+
+ {item.description}
+
+
+ );
+ })}
+
+
+
+
+
+
+
+
{content.ecosystemDesc}
+
+
+ {content.ecosystemGroups.map((group) => (
+
+ {group.title}
+
+ {group.items.map((item) => {
+ const tone = getEcosystemToolTone(item);
+ return (
+
+ {item}
+
+ );
+ })}
+
+
+ ))}
+
+
+
+ {content.ecosystemFooters.map((line) => (
+
{line}
+ ))}
+
+
+
+ {content.ecosystemLegend.map((legend) => (
+
+
+ {legend.label}
+
+ ))}
+
+
+
+
+
+
+
+
+
{content.compatibilityDesc}
+
+
+ {certCarouselImages.map((image, index) => (
+
+
+

+
+
+ ))}
+
+
+
+
);
diff --git a/src/pages/index.module.css b/src/pages/index.module.css
index afdb33b..a6c1b1f 100644
--- a/src/pages/index.module.css
+++ b/src/pages/index.module.css
@@ -1,189 +1,1094 @@
-/**
- * CSS files with the .module.css suffix will be treated as CSS modules
- * and scoped locally.
- */
-@import url(https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick.min.css);
-@import url(https://cdnjs.cloudflare.com/ajax/libs/slick-carousel/1.6.0/slick-theme.min.css);
-.heroBanner {
- padding: 5rem 0;
- text-align: center;
+.homePage {
+ background: linear-gradient(180deg, #f4f8ff 0%, #ffffff 24%, #f6f9ff 100%);
+}
+
+.heroSection {
position: relative;
-
- background-image: linear-gradient(134.3deg,#1f0c79,#5a43ca 39.99%,#ba74e3);
- /* 圣诞 */
- /* background-color: #0e2956; */
+ overflow: hidden;
+ padding: 96px 0 128px;
+ background:
+ radial-gradient(circle at 76% 18%, rgba(159, 220, 255, 0.22) 0%, rgba(159, 220, 255, 0) 42%),
+ radial-gradient(circle at 12% -16%, rgba(84, 143, 255, 0.3) 0%, rgba(84, 143, 255, 0) 36%),
+ linear-gradient(126deg, #0f1b52 0%, #1c3c93 50%, #155fbd 100%);
+ color: #f8faff;
+}
+.heroSection::before {
+ content: '';
+ position: absolute;
+ width: 500px;
height: 500px;
- overflow: hidden;
+ top: -210px;
+ right: -110px;
+ border-radius: 50%;
+ background: radial-gradient(circle, rgba(157, 215, 255, 0.2) 0%, rgba(157, 215, 255, 0) 68%);
}
-.heroBanner_2 {
- padding: 4rem 4rem;
- text-align: center;
+
+.heroSection::after {
+ content: '';
+ position: absolute;
+ width: 420px;
+ height: 420px;
+ bottom: -220px;
+ left: -80px;
+ border-radius: 50%;
+ background: radial-gradient(circle, rgba(96, 139, 255, 0.2) 0%, rgba(96, 139, 255, 0) 72%);
+}
+
+.heroContainer {
position: relative;
- overflow: hidden;
+ z-index: 1;
+ max-width: 1240px;
+ display: grid;
+ grid-template-columns: minmax(0, 1.05fr) minmax(340px, 540px);
+ gap: 40px;
+ align-items: center;
}
-.heroBGImage {
- padding: 5rem 0;
- text-align: center;
+.heroContent {
+ max-width: 760px;
+ padding: 4px 10px 0 0;
+ display: flex;
+ flex-direction: column;
+ gap: 24px;
+ text-align: left;
+}
+
+.heroVisual {
position: relative;
- overflow: hidden;
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ min-height: 446px;
+ pointer-events: none;
+}
- background-repeat: no-repeat;
- background-position: center;
- background-size: cover;
+.heroVisual :global(svg) {
position: relative;
- background-blend-mode: darken;
+ z-index: 1;
+ display: block;
+ width: clamp(420px, 34vw, 620px);
+ height: auto;
+ opacity: 1;
+ filter: drop-shadow(0 18px 34px rgba(3, 18, 63, 0.42));
+ transform: translateX(10px);
+}
+
+.heroVisual::before {
+ content: '';
+ position: absolute;
+ width: min(100%, 520px);
+ aspect-ratio: 1 / 1;
+ border-radius: 50%;
+ background: radial-gradient(circle, rgba(255, 255, 255, 0.24) 0%, rgba(255, 255, 255, 0.06) 42%, rgba(255, 255, 255, 0) 72%);
+}
+
+.heroVisual::after {
+ content: none;
+}
+
+.heroTitle {
+ margin: 0;
+ color: #ffffff;
+ font-size: clamp(2.5rem, 4.5vw, 3.65rem);
+ line-height: 1.12;
+ font-weight: 700;
+ letter-spacing: 0.015em;
+ text-shadow: 0 8px 24px rgba(3, 18, 63, 0.32);
+}
+
+.slogan {
+ margin: 0;
+ max-width: 650px;
+ font-size: clamp(1.22rem, 2.2vw, 1.78rem);
+ font-weight: 600;
+ color: #fbaf42;
+ line-height: 1.58;
+ text-shadow: 0 3px 12px rgba(12, 25, 78, 0.28);
+}
+
+.heroBadges {
+ margin: 0;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ gap: 10px;
+}
+
+.heroBadge {
+ border-radius: 999px;
+ border: 1px solid rgba(180, 208, 255, 0.5);
+ background: rgba(255, 255, 255, 0.1);
+ padding: 6px 13px;
+ font-size: 0.82rem;
+ color: #e7f0ff;
+}
+
+.heroIntro {
+ margin: 0;
+ max-width: 700px;
+ color: #dfebff;
+ font-size: 1rem;
+ line-height: 1.88;
+ background: rgba(7, 22, 68, 0.34);
+ border: 1px solid rgba(170, 200, 255, 0.3);
+ border-left: 4px solid #fbaf42;
+ border-radius: 16px;
+ padding: 20px 22px;
+ backdrop-filter: blur(2px);
+ -webkit-backdrop-filter: blur(2px);
+}
+
+.latestVersion {
+ margin: 0;
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ padding: 10px 16px;
+ border-radius: 999px;
+ border: 1px solid rgba(123, 171, 255, 0.58);
+ background: linear-gradient(90deg, rgba(74, 143, 255, 0.3) 0%, rgba(255, 255, 255, 0.08) 100%);
+ box-shadow: 0 10px 22px rgba(6, 22, 70, 0.22);
+}
+
+.latestVersion span {
+ color: #deebff;
+ font-size: 0.9rem;
+ font-weight: 500;
+}
+
+.latestVersion a {
+ color: #fffdf8;
+ font-weight: 600;
+ text-decoration: none;
+}
+
+.latestVersion a:hover {
+ text-decoration: underline;
+}
+
+.heroActions {
+ margin: 0;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: flex-start;
+ gap: 12px;
+}
+
+.heroActionsEn {
width: 100%;
+ max-width: 900px;
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+}
+
+.actionButton {
+ min-width: 194px;
+ min-height: 48px;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ border: 1px solid rgba(198, 220, 255, 0.68);
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.24) 0%, rgba(255, 255, 255, 0.12) 100%);
+ box-shadow: 0 10px 22px rgba(6, 22, 70, 0.22);
+ backdrop-filter: blur(4px);
+ -webkit-backdrop-filter: blur(4px);
+ color: #ffffff;
+ font-weight: 600;
+ letter-spacing: 0.02em;
+ transition: background 0.2s ease, transform 0.2s ease, border-color 0.2s ease, box-shadow 0.2s ease;
+}
+
+.actionButtonEn {
+ min-width: 0;
+ width: 100%;
+ padding-left: 1rem;
+ padding-right: 1rem;
+}
+
+.actionButton:first-child {
+ border-color: rgba(251, 175, 66, 0.96);
+ background: linear-gradient(135deg, #fbb44f 0%, #f79e1f 100%);
+ color: #ffffff;
+ box-shadow: 0 14px 30px rgba(245, 151, 23, 0.38);
+}
+
+.actionButton:hover {
+ color: #ffffff;
+ border-color: rgba(251, 175, 66, 0.94);
+ background: linear-gradient(135deg, rgba(251, 175, 66, 0.95) 0%, rgba(247, 158, 31, 0.95) 100%);
+ transform: translateY(-2px);
+ box-shadow: 0 15px 30px rgba(245, 151, 23, 0.34);
+}
+
+.actionButton:first-child:hover {
+ color: #ffffff;
+ border-color: rgba(252, 188, 92, 0.98);
+ background: linear-gradient(135deg, #fcbf61 0%, #faa12f 100%);
+ box-shadow: 0 16px 34px rgba(245, 151, 23, 0.42);
+}
+
+.section {
+ position: relative;
+ overflow: hidden;
+ padding: 78px 0 20px;
+}
+
+.section :global(.container) {
+ position: relative;
+ z-index: 1;
+ max-width: 1240px;
+}
+
+.sectionToneCore {
+ background: linear-gradient(180deg, #f8fbff 0%, #fcfdff 100%);
+}
+
+.sectionToneCore::before {
+ content: '';
+ position: absolute;
+ width: 420px;
+ height: 420px;
+ right: -130px;
+ top: -210px;
+ border-radius: 50%;
+ background: radial-gradient(circle, rgba(103, 144, 255, 0.12) 0%, rgba(103, 144, 255, 0) 70%);
+}
+
+.sectionToneCore::after {
+ content: '';
+ position: absolute;
+ left: 3%;
+ bottom: 12%;
+ width: 148px;
+ height: 148px;
+ border-radius: 50%;
+ background:
+ radial-gradient(circle at 32% 34%, rgba(251, 175, 66, 0.32) 0%, rgba(251, 175, 66, 0.14) 32%, transparent 65%),
+ radial-gradient(circle at 70% 70%, rgba(66, 178, 255, 0.24) 0%, transparent 60%);
+}
+
+.sectionToneScenario {
+ background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%);
+}
+
+.sectionToneScenario::before {
+ content: '';
+ position: absolute;
+ width: 420px;
+ height: 420px;
+ left: -180px;
+ bottom: -220px;
+ border-radius: 50%;
+ background: radial-gradient(circle, rgba(55, 173, 255, 0.12) 0%, rgba(55, 173, 255, 0) 70%);
+}
+
+.sectionToneScenario::after {
+ content: '';
+ position: absolute;
+ right: 2%;
+ top: 14%;
+ width: 150px;
+ height: 150px;
+ border-radius: 50%;
+ background:
+ radial-gradient(circle at 70% 28%, rgba(66, 178, 255, 0.24) 0%, transparent 58%),
+ radial-gradient(circle at 30% 70%, rgba(251, 175, 66, 0.28) 0%, rgba(251, 175, 66, 0.1) 35%, transparent 68%);
+}
+
+.sectionToneDeployment {
+ background: linear-gradient(180deg, #f8fbff 0%, #ffffff 100%);
+}
+
+.sectionToneDeployment::before {
+ content: '';
+ position: absolute;
+ left: 3%;
+ top: 16%;
+ width: 140px;
+ height: 140px;
+ border-radius: 24px;
+ background:
+ linear-gradient(145deg, rgba(66, 178, 255, 0.2) 0%, rgba(66, 178, 255, 0.08) 48%, rgba(251, 175, 66, 0.14) 100%);
+ transform: rotate(-10deg);
+}
+
+.sectionToneArchitecture {
+ background: linear-gradient(180deg, #f6faff 0%, #ffffff 100%);
}
-.row{
+
+.sectionToneArchitecture::before {
+ content: '';
+ position: absolute;
+ left: 3%;
+ top: 18%;
+ width: 140px;
+ height: 140px;
+ border-radius: 28px;
+ background:
+ linear-gradient(145deg, rgba(66, 178, 255, 0.22) 0%, rgba(66, 178, 255, 0.08) 45%, rgba(251, 175, 66, 0.12) 100%);
+ transform: rotate(-12deg);
+}
+
+.sectionToneEcosystem {
+ background: linear-gradient(180deg, #ffffff 0%, #f7fbff 100%);
+}
+
+.sectionToneEcosystem::before {
+ content: '';
+ position: absolute;
+ right: 3%;
+ bottom: 15%;
+ width: 160px;
+ height: 160px;
+ border-radius: 50%;
+ background:
+ radial-gradient(circle at 34% 34%, rgba(251, 175, 66, 0.26) 0%, transparent 56%),
+ radial-gradient(circle at 66% 66%, rgba(66, 178, 255, 0.22) 0%, transparent 62%);
+}
+
+.sectionToneCertificate {
+ background: linear-gradient(180deg, #f8fbff 0%, #ffffff 100%);
+}
+
+.sectionToneCertificate::before {
+ content: '';
+ position: absolute;
+ left: 4%;
+ top: 24%;
+ width: 150px;
+ height: 150px;
+ border-radius: 50%;
+ background:
+ radial-gradient(circle at 48% 48%, rgba(251, 175, 66, 0.28) 0%, rgba(251, 175, 66, 0.12) 36%, transparent 66%),
+ radial-gradient(circle at 74% 30%, rgba(66, 178, 255, 0.18) 0%, transparent 58%);
+}
+
+.sectionHead {
+ margin-bottom: 24px;
display: flex;
- flex-wrap:nowrap;
+ justify-content: center;
+}
+
+.sectionTitleRow {
+ display: inline-flex;
+ align-items: center;
+ gap: 10px;
+ padding: 9px 18px;
+ border-radius: 999px;
+ border: 1px solid #d8e6ff;
+ background: linear-gradient(180deg, #ffffff 0%, #f5f9ff 100%);
+ box-shadow: 0 6px 18px rgba(21, 63, 131, 0.08);
+}
+
+.sectionIcon {
+ width: 32px;
+ height: 32px;
+ border-radius: 999px;
+ background: linear-gradient(135deg, #eef4ff 0%, #e3efff 100%);
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.sectionIcon :global(svg) {
+ width: 16px;
+ height: 16px;
+}
+
+.sectionTitleRow h2 {
+ margin: 0;
+ color: #fbaf42;
+ font-size: clamp(1.55rem, 3vw, 2rem);
}
-.heroCenterImage {
- padding: 5rem 0;
+
+.sectionDescription {
+ margin: 0 auto 24px;
+ max-width: 820px;
text-align: center;
+ color: #4a5a83;
+ line-height: 1.74;
+}
+
+.wideDescription {
+ max-width: 1080px;
+ text-wrap: pretty;
+ text-wrap: balance;
+}
+
+.advantagesGrid {
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ gap: 16px;
+}
+
+.scenariosGrid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 16px;
+}
+
+.deploymentGrid {
+ display: grid;
+ grid-template-columns: repeat(3, minmax(0, 1fr));
+ gap: 16px;
+}
+
+.infoCard {
position: relative;
overflow: hidden;
- background-repeat: no-repeat;
- background-position: cover;
- background-size: cover;
- /* 圣诞 */
- /* margin-left: 300px; */
-}
-.heroLeftImage {
- padding: 4rem 4rem;
- text-align: center;
+ min-height: 198px;
+ border-radius: 16px;
+ border: 1px solid #e1e9ff;
+ background: linear-gradient(180deg, #ffffff 0%, #fafdff 100%);
+ box-shadow: 0 10px 28px rgba(17, 63, 132, 0.07);
+ padding: 20px 18px;
+ transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
+}
+
+.infoCard::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 4px;
+ border-radius: 16px 16px 0 0;
+ background: linear-gradient(90deg, #2f74ff 0%, #4db2ff 100%);
+}
+
+.infoCard:hover {
+ transform: translateY(-6px);
+ box-shadow: 0 18px 36px rgba(17, 63, 132, 0.13);
+ border-color: #cfe0ff;
+}
+
+.scenariosGrid .infoCard:nth-child(3n + 1)::before {
+ background: linear-gradient(90deg, #8c6dff 0%, #b093ff 100%);
+}
+
+.scenariosGrid .infoCard:nth-child(3n + 2)::before {
+ background: linear-gradient(90deg, #8c6dff 0%, #b093ff 100%);
+}
+
+.scenariosGrid .infoCard:nth-child(3n + 3)::before {
+ background: linear-gradient(90deg, #8c6dff 0%, #b093ff 100%);
+}
+
+.cardTitleRow {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.cardIcon {
+ width: 40px;
+ height: 40px;
+ flex-shrink: 0;
+ border-radius: 12px;
+ border: 1px solid #d7e5ff;
+ background: linear-gradient(145deg, #f3f8ff 0%, #e8f2ff 100%);
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.cardIcon :global(svg) {
+ width: 20px;
+ height: 20px;
+}
+
+.infoCard h3 {
+ margin: 0;
+ font-size: 1.08rem;
+ color: #12214c;
+}
+
+.infoCard p {
+ margin: 10px 0 0;
+ color: #4f5f84;
+ font-size: 0.95rem;
+ line-height: 1.64;
+}
+
+.deploymentCard {
position: relative;
overflow: hidden;
- /* background: url("@site/static/img/fp_left_header.svg"); */
- background-repeat: no-repeat;
- background-size: cover;
- width: 25%;
-}
-.heroRightImage {
- /* 原图 */
- width: 43%;
- height: 100px;
+ min-height: 238px;
+ border-radius: 16px;
+ border: 1px solid #e1e9ff;
+ background: linear-gradient(180deg, #ffffff 0%, #fafdff 100%);
+ box-shadow: 0 10px 28px rgba(17, 63, 132, 0.07);
+ padding: 20px 18px;
+ transition: transform 0.25s ease, box-shadow 0.25s ease, border-color 0.25s ease;
+ display: flex;
+ flex-direction: column;
+}
+
+.deploymentCard::before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ height: 4px;
+ border-radius: 16px 16px 0 0;
+ background: linear-gradient(90deg, #3ac39f 0%, #61d8bd 100%);
+}
+
+.deploymentCard:hover {
+ transform: translateY(-6px);
+ box-shadow: 0 18px 36px rgba(17, 63, 132, 0.13);
+ border-color: #cfe0ff;
+}
+
+.deploymentCard h3 {
+ margin: 0;
+ font-size: 1.06rem;
+ color: #12214c;
+}
+
+.deploymentCard p {
+ margin: 10px 0 0;
+ color: #4f5f84;
+ font-size: 0.94rem;
+ line-height: 1.66;
+ flex-grow: 1;
+}
+
+.deployAction {
+ margin-top: 14px;
+ align-self: flex-start;
+ min-height: 46px;
+ min-width: 172px;
+ padding: 0.64rem 1.3rem;
+ border: 1px solid #d0e0ff;
+ background: linear-gradient(180deg, #f8fbff 0%, #edf4ff 100%);
+ color: #2a5fcb;
+ font-size: 1rem;
+ border-radius: 12px;
+ font-weight: 600;
+}
+
+.deployAction:hover {
+ color: #1d4fab;
+ border-color: #b6d0ff;
+}
+
+.ecosystemFrame {
position: relative;
- top: -47px;
- /* 圣诞 */
- /* width: 160%;
- height: 100px;
+ width: 100%;
+ max-width: 100%;
+ margin: 0 auto;
+ border-radius: 22px;
+ border: 1px solid #d9e6ff;
+ background:
+ radial-gradient(circle at 8% 0%, rgba(78, 143, 255, 0.08) 0%, rgba(78, 143, 255, 0) 42%),
+ radial-gradient(circle at 92% 100%, rgba(251, 175, 66, 0.1) 0%, rgba(251, 175, 66, 0) 40%),
+ linear-gradient(180deg, #fbfdff 0%, #f4f8ff 100%);
+ box-shadow: 0 12px 28px rgba(15, 43, 92, 0.08);
+ padding: 18px 18px 18px;
+}
+
+.ecosystemGrid {
position: relative;
- top: -75px;
- left: 100px;
- overflow:visible;
- white-space:nowrap;
- margin-left: 30px; */
-}
-.tree{
- width: 40%;
- height: 100px;
- margin-left: -200px;
- margin-top: -50px;
+ display: grid;
+ grid-template-columns: repeat(4, minmax(0, 1fr));
+ grid-auto-flow: dense;
+ gap: 10px;
+ margin-top: 2px;
+}
+
+.ecosystemGroup {
position: relative;
- top: 28px;
+ border-radius: 12px;
+ border: 1px solid #d8e5ff;
+ background: linear-gradient(180deg, #ffffff 0%, #f8fbff 100%);
+ box-shadow: 0 6px 14px rgba(15, 43, 92, 0.05);
+ padding: 10px 10px 12px;
}
-.indexImg{
- width: 100%;
- max-width: 1390px;
- height: 500px;
- margin: auto;
+
+.ecosystemGroup h3 {
+ margin: 0;
+ font-size: 0.9rem;
+ color: #2257a6;
+ line-height: 1.35;
}
-.indexImgbug{
- object-fit: cover;
- width: 100%;
- max-width: 2391px;
- height: 502px;
- margin: 0px auto -30px auto;
+
+.ecosystemGroupWide {
+ grid-column: span 2;
}
-.indexImgPhone{
- display: none;
- height: 500px;
- margin: auto;
+
+.ecosystemItems {
+ margin-top: 8px;
+ display: flex;
+ flex-wrap: wrap;
+ gap: 6px;
+}
+
+.ecosystemItem {
+ display: inline-flex;
+ align-items: center;
+ padding: 4px 8px;
+ border-radius: 999px;
+ border: 1px solid #d7e5ff;
+ background: #ffffff;
+ font-size: 0.76rem;
+ line-height: 1.3;
+ color: #3f547d;
+}
+
+.ecosystemItemsupported {
+ border-color: #d9caf8;
+ background: #f8f4ff;
+ color: #5f45a8;
}
-.indexImgbugphone{
- /* object-fit: cover; */
- width: 1000px;
+
+.ecosystemItemprogress {
+ border-color: #c6e4b0;
+ background: #f4faee;
+ color: #3f7726;
+}
+
+.ecosystemItemplanned {
+ border-color: #bae3f6;
+ background: #edf8ff;
+ color: #1f6d98;
+}
+
+.ecosystemItemproprietary {
+ border-color: #d6dbe4;
+ background: #f3f5f8;
+ color: #5a6172;
+}
+
+.ecosystemFooters {
+ margin-top: 10px;
+ display: grid;
+ gap: 8px;
+}
+
+.ecosystemFooters p {
+ margin: 0;
+ border-radius: 10px;
+ border: 1px solid #d9caf8;
+ background: #f8f4ff;
+ color: #5f45a8;
+ font-size: 0.83rem;
+ line-height: 1.45;
+ padding: 8px 10px;
+ text-align: center;
+}
+
+.ecosystemLegend {
+ margin-top: 10px;
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: center;
+ gap: 14px;
+ padding: 2px 6px 0;
+}
+
+.ecosystemLegendItem {
+ display: inline-flex;
+ align-items: center;
+ gap: 6px;
+ padding: 4px 8px;
+ border-radius: 999px;
+ border: 1px solid #d9e4fb;
+ background: rgba(255, 255, 255, 0.72);
+ font-size: 0.8rem;
+ color: #4a5a83;
+ white-space: nowrap;
+}
+
+.ecosystemLegendItem i {
+ width: 9px;
+ height: 9px;
+ border-radius: 999px;
+ display: inline-block;
+}
+
+.ecosystemDotsupported {
+ background: #7a32ec;
+}
+
+.ecosystemDotprogress {
+ background: #75c740;
+}
+
+.ecosystemDotplanned {
+ background: #00b0f0;
+}
+
+.ecosystemDotproprietary {
+ background: #808080;
+}
+
+.certCarouselContainer {
+ --cert-slide-width: 248px;
+ --cert-slide-height: 184px;
+ overflow: hidden;
+ padding: 16px 0 12px;
+ position: relative;
+ border-radius: 18px;
+ border: 1px solid #e2ebff;
+ background: linear-gradient(180deg, rgba(255, 255, 255, 0.78) 0%, rgba(247, 251, 255, 0.88) 100%);
+}
+
+.certCarouselContainer::before,
+.certCarouselContainer::after {
+ content: '';
+ position: absolute;
+ top: 0;
+ bottom: 0;
+ width: 42px;
+ z-index: 2;
+ pointer-events: none;
+}
+
+.certCarouselContainer::before {
+ left: 0;
+ background: linear-gradient(90deg, rgba(249, 251, 255, 1) 0%, rgba(249, 251, 255, 0) 100%);
+}
+
+.certCarouselContainer::after {
+ right: 0;
+ background: linear-gradient(270deg, rgba(249, 251, 255, 1) 0%, rgba(249, 251, 255, 0) 100%);
+}
+
+.certTrack {
+ display: flex;
+ width: calc(var(--cert-slide-width) * 10);
+ animation: certScroll 36s linear infinite;
+}
+
+.certTrack:hover {
+ animation-play-state: paused;
+}
+
+.certSlide {
+ width: var(--cert-slide-width);
+ height: var(--cert-slide-height);
+ box-sizing: border-box;
+ padding: 0 10px;
+ flex-shrink: 0;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.certSlideLink {
+ display: flex;
+ align-items: center;
+ justify-content: center;
width: 100%;
- /* min-width: 600px; */
- height: 502px;
- margin: 0px auto -30px auto;
+ height: 100%;
+ border-radius: 12px;
+ border: 1px solid #d9e3f8;
+ background: #ffffff;
+ box-shadow: 0 8px 20px rgba(15, 43, 92, 0.08);
+ padding: 10px;
}
-.recruitBanner{
- padding: 0;
- height: 500px;
- background-color: #3227d5;
+
+.certSlideLink img {
+ max-width: 100%;
+ max-height: 100%;
+ object-fit: contain;
+ border-radius: 8px;
}
-.phonetree{
- display: none;
+
+@keyframes certScroll {
+ 0% {
+ transform: translateX(0);
+ }
+
+ 100% {
+ transform: translateX(calc(var(--cert-slide-width) * -5));
+ }
}
-@media screen and (max-width: 1440px) {
- .tree{
- position: relative;
- top: 140px;
+
+@media (max-width: 1200px) {
+ .heroContainer {
+ grid-template-columns: minmax(0, 1fr) 380px;
+ gap: 22px;
}
- .heroRightImage{
- width: 160%;
- margin-left: -20px;
- position: relative;
- left: 90px;
- top: -25px;
+
+ .heroVisual :global(svg) {
+ width: 390px;
+ transform: translateX(0);
}
- .heroCenterImage{
- margin-left: 200px;
- width: 400px;
- height: 500px;
+
+ .advantagesGrid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
}
-}
-@media screen and (min-width: 997px) {
- /* Show inline table of contents on mobile only */
- div[class^='tableOfContentsInline'] {
- display: none;
+
+ .deploymentGrid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
}
- div[class^='heroCenterImage'] {
- width: 50%;
+
+ .ecosystemGrid {
+ grid-template-columns: repeat(3, minmax(0, 1fr));
}
- div[class^='indexImg-phone'] {
- display: none;
+
+ .certCarouselContainer {
+ --cert-slide-width: 220px;
+ --cert-slide-height: 168px;
}
}
-@media screen and (max-width: 997px) {
- div[class^='heroRightImage'] {
+@media (max-width: 996px) {
+ .heroVisual {
display: none;
}
- div[class^='heroLeftImage'] {
- display: none;
+
+ .heroSection {
+ padding: 70px 0 60px;
}
- div[class^='heroCenterImage'] {
- width: 100%;
- margin-left:0px;
- margin-top: 50px;
+
+ .heroContainer {
+ grid-template-columns: 1fr;
+ }
+
+ .heroContent {
+ gap: 18px;
+ padding-right: 0;
+ text-align: center;
+ max-width: 100%;
+ }
+
+ .slogan {
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ .heroBadges {
+ justify-content: center;
+ }
+
+ .heroIntro {
+ margin-left: auto;
+ margin-right: auto;
+ text-align: left;
+ font-size: 0.96rem;
+ line-height: 1.84;
+ max-width: 100%;
}
- div[class^='indexImg'] {
+
+ .latestVersion {
+ margin-left: auto;
+ margin-right: auto;
+ }
+
+ .heroActions {
+ justify-content: center;
+ }
+
+ .heroActionsEn {
+ display: flex;
+ max-width: 100%;
+ }
+
+ .actionButtonEn {
+ width: auto;
+ min-width: 194px;
+ }
+
+ .section {
+ padding-top: 58px;
+ }
+
+ .scenariosGrid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .sectionToneCore::after,
+ .sectionToneScenario::after,
+ .sectionToneDeployment::before,
+ .sectionToneArchitecture::before,
+ .sectionToneEcosystem::before,
+ .sectionToneCertificate::before {
display: none;
}
- div[class^='indexImg-phone'] {
- display: inline;
+
+ .certCarouselContainer {
+ overflow-x: auto;
+ overflow-y: visible;
+ -webkit-overflow-scrolling: touch;
+ scroll-snap-type: x mandatory;
+ padding: 10px 0 8px;
}
- div[class^='tree'] {
+
+ .certCarouselContainer::before,
+ .certCarouselContainer::after {
display: none;
}
- /* div[class^='phonetree'] {
- display: inline-block;
- width: 120%;
- position: relative;
- right: 90px;
- top: 200px;
- } */
-}
-.buttons {
- display: flex;
- flex-wrap: wrap;
- gap: 16px;
- align-items: center;
- justify-content: center;
+
+ .certTrack {
+ width: max-content;
+ animation: none;
+ gap: 10px;
+ padding: 0 6px;
+ }
+
+ .certSlide {
+ width: min(48vw, 220px);
+ height: min(36vw, 168px);
+ padding: 0;
+ scroll-snap-align: start;
+ }
+
+ .certSlideLink {
+ padding: 8px;
+ }
+
+ .ecosystemFrame {
+ padding: 16px 14px 16px;
+ }
+
+ .ecosystemGrid {
+ grid-template-columns: repeat(2, minmax(0, 1fr));
+ }
+
+ .ecosystemGroupWide {
+ grid-column: span 2;
+ }
+
+ .ecosystemLegend {
+ justify-content: center;
+ gap: 12px;
+ }
}
+@media (max-width: 640px) {
+ .heroSection {
+ padding: 62px 0 54px;
+ }
+
+ .heroContainer {
+ gap: 16px;
+ }
+
+ .heroContent {
+ gap: 16px;
+ }
+
+ .heroTitle {
+ font-size: clamp(2.1rem, 10vw, 2.6rem);
+ line-height: 1.14;
+ }
+
+ .slogan {
+ font-size: 1.06rem;
+ line-height: 1.68;
+ }
+
+ .heroBadges {
+ gap: 8px;
+ }
+
+ .heroBadge {
+ font-size: 0.78rem;
+ padding: 5px 11px;
+ }
+
+ .heroIntro {
+ font-size: 0.93rem;
+ line-height: 1.76;
+ padding: 16px 16px;
+ border-radius: 14px;
+ }
+
+ .latestVersion {
+ width: 100%;
+ justify-content: center;
+ padding: 10px 12px;
+ }
+
+ .certCarouselContainer {
+ padding: 8px 0 4px;
+ }
+
+ .certTrack {
+ gap: 8px;
+ padding: 0 4px;
+ }
+
+ .certSlide {
+ width: min(72vw, 192px);
+ height: min(54vw, 146px);
+ }
+
+ .heroActions {
+ flex-direction: column;
+ flex-wrap: nowrap;
+ width: 100%;
+ max-width: 360px;
+ margin-left: auto;
+ margin-right: auto;
+ align-items: center;
+ gap: 10px;
+ }
+
+ .actionButton {
+ width: 100%;
+ max-width: 360px;
+ min-width: 0;
+ }
+
+ .advantagesGrid,
+ .scenariosGrid,
+ .deploymentGrid {
+ grid-template-columns: 1fr;
+ }
+
+ .ecosystemGrid {
+ grid-template-columns: 1fr;
+ }
+
+ .ecosystemGroup,
+ .ecosystemGroupWide {
+ grid-column: span 1;
+ }
+
+ .ecosystemGroup h3 {
+ font-size: 0.88rem;
+ }
+
+ .ecosystemItem {
+ font-size: 0.74rem;
+ padding: 4px 7px;
+ }
+
+ .ecosystemFooters p {
+ font-size: 0.8rem;
+ padding: 7px 9px;
+ }
+
+ .ecosystemLegend {
+ margin-top: 8px;
+ gap: 8px;
+ justify-content: flex-start;
+ padding: 2px 2px 0;
+ }
+
+ .ecosystemLegendItem {
+ font-size: 0.78rem;
+ white-space: normal;
+ }
+
+ .infoCard {
+ min-height: 0;
+ }
+
+ .deploymentCard {
+ min-height: 0;
+ }
+
+ .deployAction {
+ min-height: 44px;
+ min-width: 164px;
+ font-size: 0.96rem;
+ }
+
+}