From 9cfbb95b1e5968ab2831c45799fae16331ae0134 Mon Sep 17 00:00:00 2001 From: chermack <505360893@qq.com> Date: Sat, 22 Aug 2026 21:49:25 +0800 Subject: [PATCH] feat: launch Roncarve Harness product page --- .dockerignore | 11 +- .gitignore | 7 + Dockerfile | 13 +- baidu_verify_codeva-Jnq0QS7SFC.html | 1 + docker-compose.yml | 6 + index.html | 108 +- nginx.conf | 9 + package-lock.json | 1115 +++++++++++++++++++ package.json | 22 + products/roncarve-harness/index.html | 40 + scripts/copy-static.mjs | 20 + sitemap.xml | 8 +- src/harness/HarnessProductPage.jsx | 471 ++++++++ src/harness/ParticleStage.jsx | 402 +++++++ src/harness/harness.css | 590 ++++++++++ src/harness/main.jsx | 10 + vite.config.js | 24 + 荣刻驭境-Roncarve-Harness-产品页设计文档.md | 717 ++++++++++++ 18 files changed, 3561 insertions(+), 13 deletions(-) create mode 100644 baidu_verify_codeva-Jnq0QS7SFC.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 products/roncarve-harness/index.html create mode 100644 scripts/copy-static.mjs create mode 100644 src/harness/HarnessProductPage.jsx create mode 100644 src/harness/ParticleStage.jsx create mode 100644 src/harness/harness.css create mode 100644 src/harness/main.jsx create mode 100644 vite.config.js create mode 100644 荣刻驭境-Roncarve-Harness-产品页设计文档.md diff --git a/.dockerignore b/.dockerignore index fd4083b..5d44b91 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,17 @@ .git +.gitignore .idea qa-evidence design-references +.docker-config +.npm-cache +.npm-cache-* +node_modules +dist +design-qa-artifacts +deploy Dockerfile -docker-compose.yml .dockerignore *.md +docker-compose*.yml +Caddyfile.server diff --git a/.gitignore b/.gitignore index a7e4258..5be7482 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,10 @@ buildNumber.properties # JDT-specific (Eclipse Java Development Tools) .classpath +node_modules/ +dist/ +.npm-cache/ +.npm-cache-*/ +.docker-config/ +design-qa-artifacts/ +design-qa.md diff --git a/Dockerfile b/Dockerfile index f2d3e1b..58507f9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,15 @@ -FROM nginx:1.27-alpine +FROM node:22-alpine AS build + +WORKDIR /app +COPY package.json package-lock.json ./ +RUN npm ci --no-audit --no-fund + +COPY . . +RUN npm run build + +FROM nginx:alpine COPY nginx.conf /etc/nginx/conf.d/default.conf -COPY . /usr/share/nginx/html +COPY --from=build /app/dist /usr/share/nginx/html EXPOSE 80 diff --git a/baidu_verify_codeva-Jnq0QS7SFC.html b/baidu_verify_codeva-Jnq0QS7SFC.html new file mode 100644 index 0000000..76a54fb --- /dev/null +++ b/baidu_verify_codeva-Jnq0QS7SFC.html @@ -0,0 +1 @@ +94f23ded66ca5b5c5003812faeacf00d diff --git a/docker-compose.yml b/docker-compose.yml index 3390180..0db5356 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -5,3 +5,9 @@ services: restart: unless-stopped ports: - "127.0.0.1:8081:80" + healthcheck: + test: ["CMD", "wget", "-q", "--spider", "http://127.0.0.1/products/roncarve-harness/"] + interval: 10s + timeout: 3s + retries: 5 + start_period: 5s diff --git a/index.html b/index.html index 8ce6b98..a9a01b3 100644 --- a/index.html +++ b/index.html @@ -233,6 +233,52 @@ .nav-link:hover, .nav-link.active { color: var(--white); } .nav-link.active::after { opacity: 1; transform: translateX(-50%) scale(1); } + .product-nav { position: relative; } + .product-trigger { + display: block; + border: 0; + background: transparent; + font-family: inherit; + cursor: pointer; + } + .product-nav.open .product-trigger { color: var(--white); } + .product-nav.open .product-trigger::after { opacity: 1; transform: translateX(-50%) scale(1); } + .product-popover { + position: absolute; + top: calc(100% + 17px); + left: 50%; + z-index: 1100; + width: 430px; + padding: 8px; + border: 1px solid var(--line-strong); + border-radius: 16px; + background: color-mix(in srgb, var(--ink-900) 96%, transparent); + box-shadow: 0 24px 70px rgba(0, 0, 0, .32), inset 0 1px 0 rgba(255, 255, 255, .035); + backdrop-filter: blur(20px) saturate(135%); + -webkit-backdrop-filter: blur(20px) saturate(135%); + opacity: 0; + pointer-events: none; + transform: translate(-50%, -8px) scale(.98); + transform-origin: top center; + transition: opacity .2s ease, transform .2s var(--ease); + } + .product-nav.open .product-popover { opacity: 1; pointer-events: auto; transform: translate(-50%, 0) scale(1); } + .product-card { + display: block; + padding: 20px; + border: 1px solid var(--line); + border-radius: 12px; + background: linear-gradient(140deg, color-mix(in srgb, var(--cyan) 8%, transparent), rgba(255, 255, 255, .018)); + transition: border-color .22s ease, background .22s ease, transform .22s var(--ease); + } + .product-card:hover { transform: translateY(-2px); border-color: var(--line-strong); background: color-mix(in srgb, var(--cyan) 10%, var(--ink-900)); } + .product-card-meta { display: flex; align-items: center; justify-content: space-between; gap: 18px; } + .product-card-meta span { color: var(--cyan); font: 700 9px/1 var(--mono); letter-spacing: .13em; } + .product-card-meta strong { padding: 6px 8px; border: 1px solid var(--line); border-radius: 999px; color: var(--text-soft); background: rgba(255, 255, 255, .025); font: 650 9px/1 var(--mono); } + .product-card h3 { margin: 20px 0 4px; color: var(--white); font-size: 22px; letter-spacing: -.03em; } + .product-card small { color: var(--text-faint); font: 550 10px/1 var(--mono); letter-spacing: .1em; } + .product-card p { margin: 14px 0 0; color: var(--text-soft); font-size: 13px; line-height: 1.65; } + .nav-actions { display: flex; align-items: center; gap: 10px; } .preference-menu { position: relative; } .preference-trigger { @@ -784,13 +830,6 @@ .hero-spatial { width: min(100%, 760px); min-height: 420px; margin-left: auto; } } - /* Let desktop layouts use the available canvas on ultrawide screens. */ - @media (min-width: 1440px) { - :root { --max-width: 88vw; } - .hero-layout { gap: clamp(64px, 6vw, 132px); } - .section-header { gap: clamp(48px, 6vw, 120px); } - } - @media (max-width: 860px) { :root[data-theme="light"] .nav-links { background: rgba(250, 252, 255, .98); } } @@ -859,6 +898,24 @@ .nav-links.open { opacity: 1; pointer-events: auto; transform: translateY(0); } .nav-link { padding: 14px 6px; border-bottom: 1px solid var(--line); font-size: 15px; } .nav-link::after { display: none; } + .product-nav { width: 100%; } + .product-trigger { width: 100%; text-align: left; } + .product-popover { + position: relative; + top: auto; + left: auto; + width: 100%; + max-height: 0; + margin: 0; + padding: 0 8px; + overflow: hidden; + border-color: transparent; + opacity: 1; + transform: none; + transition: max-height .25s var(--ease), margin .25s ease, padding .25s ease, border-color .25s ease; + } + .product-nav.open .product-popover { max-height: 250px; margin: 8px 0 12px; padding: 8px; border-color: var(--line); transform: none; } + .product-card { padding: 17px; } .nav-actions { padding-top: 14px; justify-content: space-between; } .nav-cta { min-height: 42px; } .hero { padding-top: 126px; } @@ -954,6 +1011,17 @@