diff --git a/.gitignore b/.gitignore
index f47d438..0c23c73 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,6 +8,7 @@ dist/
# Local Codex agent skills and instructions
.agents/
+.codex/
skills-lock.json
# Local environment files
diff --git a/assets/css/interior-polish.css b/assets/css/interior-polish.css
index 6688e9d..851185d 100644
--- a/assets/css/interior-polish.css
+++ b/assets/css/interior-polish.css
@@ -1,3 +1,4 @@
+/* Shared visual system for all interior pages. Homepage styles remain untouched. */
:is(
.about-page,
.advantages-page,
@@ -8,39 +9,24 @@
.insights-page,
.article-page
) {
- --interior-ink: #263c55;
- --interior-copy: #5d7087;
- --interior-muted: #8192a6;
- --interior-line: rgba(74, 134, 204, 0.14);
- --interior-blue: #207bf2;
+ --interior-ink: var(--color-text-strong);
+ --interior-copy: var(--color-text-default);
+ --interior-body: var(--color-text-body);
+ --interior-muted: #75869a;
+ --interior-blue: var(--color-brand-primary);
+ --interior-blue-bright: var(--color-brand-bright);
+ --interior-line: rgba(73, 139, 234, 0.14);
--interior-surface: rgba(255, 255, 255, 0.88);
position: relative;
+ width: 100%;
+ min-width: 0;
min-height: 100dvh;
overflow: clip;
color: var(--interior-copy);
- background: #f8fbff;
+ background: #fff;
isolation: isolate;
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
-)::after {
- position: fixed;
- z-index: 40;
- inset: 0;
- content: '';
- pointer-events: none;
- background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 160 160' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.82' numOctaves='3' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.18'/%3E%3C/svg%3E");
- opacity: 0.018;
-}
-
:is(
.about-page,
.advantages-page,
@@ -51,11 +37,52 @@
.insights-page,
.article-page
)
- .page-width {
- width: min(1240px, calc(100% - 64px));
+ *,
+:is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ )
+ *::before,
+:is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ )
+ *::after {
+ box-sizing: border-box;
}
-:is(
+body
+ :is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ )
+ .page-width {
+ width: min(var(--container-max), calc(100% - 48px));
+ min-width: 0;
+ margin-right: auto;
+ margin-left: auto;
+}
+
+body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -67,10 +94,11 @@
)
:is(h1, h2, h3, h4, strong) {
color: var(--interior-ink);
- letter-spacing: 0 !important;
+ letter-spacing: 0;
}
-:is(
+body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -84,7 +112,8 @@
text-wrap: balance;
}
-:is(
+body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -95,10 +124,155 @@
.article-page
)
p {
+ max-width: 65ch;
+ color: var(--interior-body);
+ line-height: 1.72;
text-wrap: pretty;
}
-:is(
+/* Page heroes share brand foundations while retaining their own visual signatures. */
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(.about-hero, .advantages-hero, .services-hero, .solutions-hero, .cases-hero, .insights-hero) {
+ min-height: 620px;
+ background: linear-gradient(90deg, #f7faff 0%, #e6eefc 100%);
+}
+
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .about-hero-grid,
+ .advantages-hero-grid,
+ .services-hero-grid,
+ .solutions-hero-grid,
+ .cases-hero-grid,
+ .insights-hero-grid
+ ) {
+ min-height: 620px;
+ grid-template-columns: minmax(0, 0.94fr) minmax(420px, 1.06fr);
+ gap: clamp(40px, 5vw, 72px);
+ padding-top: 48px;
+ padding-bottom: 56px;
+}
+
+body
+ :is(.advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .advantages-hero-copy,
+ .services-hero-copy,
+ .solutions-hero-copy,
+ .cases-hero-copy,
+ .insights-hero-copy
+ )
+ h1 {
+ max-width: 11.5em;
+ margin-top: 15px;
+ font-size: clamp(40px, 3.35vw, 51px);
+ font-weight: 700;
+ line-height: 1.28;
+}
+
+body .about-page .about-hero-copy h1 {
+ max-width: 8em;
+ font-size: clamp(44px, 3.7vw, 56px);
+ line-height: 1.08;
+}
+
+body .about-page .about-hero-copy h2 {
+ max-width: 18em;
+ margin-top: 22px;
+ font-size: clamp(25px, 2.1vw, 31px);
+ font-weight: 500;
+ line-height: 1.48;
+}
+
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .about-hero-copy,
+ .advantages-hero-copy,
+ .services-hero-copy,
+ .solutions-hero-copy,
+ .cases-hero-copy,
+ .insights-hero-copy
+ )
+ > p:nth-of-type(2) {
+ max-width: 38em;
+ margin-top: 22px;
+ color: var(--interior-copy);
+ font-size: 15px;
+ line-height: 1.75;
+}
+
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(.page-eyebrow, .section-kicker) {
+ display: flex;
+ align-items: center;
+ gap: 10px;
+ margin: 0;
+ color: var(--interior-blue);
+ font-size: 14px;
+ font-weight: 700;
+ letter-spacing: 0;
+}
+
+body
+ :is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ )
+ :is(.page-eyebrow, .section-kicker)::before {
+ width: 22px;
+ height: 2px;
+ flex: 0 0 auto;
+ content: '';
+ background: linear-gradient(90deg, var(--interior-blue), #61c4ee);
+}
+
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .about-hero-visual,
+ .advantage-engine,
+ .services-hero-visual,
+ .solutions-hero-visual,
+ .case-collage,
+ .editorial-index
+ ) {
+ min-width: 0;
+ max-width: 100%;
+}
+
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page)
+ :is(.about-node, .engine-node, .industry-node, .hero-data) {
+ border-radius: var(--radius-card);
+ box-shadow: var(--shadow-card);
+}
+
+body .cases-page .collage-card {
+ border-radius: var(--radius-card);
+ box-shadow: 0 18px 42px rgba(55, 113, 184, 0.14);
+}
+
+body .insights-page .editorial-index {
+ border-radius: var(--radius-panel);
+ background: rgba(255, 255, 255, 0.7);
+ box-shadow:
+ 0 24px 56px rgba(48, 105, 171, 0.1),
+ inset 0 1px 0 #fff;
+}
+
+/* Shared section rhythm. */
+body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -110,63 +284,120 @@
)
main
> section {
- scroll-margin-top: 78px;
- box-shadow: inset 0 1px 0 rgba(92, 145, 207, 0.055);
+ scroll-margin-top: 76px;
+ box-shadow: none;
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .company-story-section,
+ .search-change-section,
+ .company-stats-section,
+ .method-section,
+ .timeline-section,
+ .team-section,
+ .contact-section,
+ .advantage-intro-section,
+ .advantage-system,
+ .comparison-section,
+ .value-added-section,
+ .proof-section,
+ .decision-section,
+ .model-deep-section,
+ .service-system-section,
+ .process-section,
+ .service-industries,
+ .difference-section,
+ .industry-solutions,
+ .more-industries-section,
+ .case-library-section,
+ .case-method-section,
+ .insight-library,
+ .whitepaper-section
+ ) {
+ padding-top: 84px;
+ padding-bottom: 96px;
+}
+
+body .about-page :is(.search-change-section, .method-section, .team-section),
+body .advantages-page :is(.advantage-intro-section, .comparison-section, .proof-section),
+body .services-page :is(.model-deep-section, .process-section, .proof-section),
+body .solutions-page :is(.difference-section, .more-industries-section),
+body .cases-page .case-method-section,
+body .insights-page .whitepaper-section {
+ background: var(--color-surface-blue);
+}
+
+body .cases-page .case-library-section,
+body .insights-page .insight-library,
+body
+ .about-page
+ :is(.company-story-section, .company-stats-section, .timeline-section, .contact-section),
+body .advantages-page :is(.advantage-system, .value-added-section),
+body .services-page :is(.decision-section, .service-system-section, .service-industries),
+body .solutions-page .industry-solutions {
+ background: #fff;
+}
+
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .story-heading,
+ .change-copy,
+ .company-stats-grid > header,
+ .center-heading,
+ .timeline-heading,
+ .team-statement,
+ .contact-heading,
+ .advantage-intro-grid > header,
+ .advantage-story-copy,
+ .value-added-heading,
+ .proof-layout > header,
+ .section-intro,
+ .model-heading,
+ .service-system-heading,
+ .process-heading,
+ .industry-list > header,
+ .difference-heading,
+ .industry-intro,
+ .case-library-heading,
+ .case-method-grid > header,
+ .library-heading,
+ .whitepaper-copy
)
- :is(.section-kicker, .page-eyebrow) {
- display: flex;
- align-items: center;
- gap: 10px;
- color: var(--interior-blue);
- font-weight: 650;
- letter-spacing: 0 !important;
+ h2 {
+ margin-top: 14px;
+ color: var(--interior-ink);
+ font-size: clamp(29px, 2.4vw, 35px);
+ font-weight: 700;
+ line-height: 1.35;
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .story-heading,
+ .change-copy,
+ .center-heading,
+ .timeline-heading,
+ .team-statement,
+ .contact-heading,
+ .advantage-story-copy,
+ .section-intro,
+ .industry-intro,
+ .case-library-heading,
+ .case-method-grid,
+ .library-heading
)
- :is(.section-kicker, .page-eyebrow)::before {
- width: 22px;
- height: 2px;
- flex: 0 0 auto;
- content: '';
- background: linear-gradient(90deg, #207bf2, #72cbef);
+ p {
+ font-size: 14px;
+ line-height: 1.72;
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
- )
- :is(.center-heading, .model-heading, .process-heading)
- :is(.section-kicker, .page-eyebrow) {
- justify-content: center;
-}
-
-:is(
+/* Controls and interaction states. */
+body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -177,16 +408,23 @@
.article-page
)
:is(.primary-button, .industry-plan-button, .service-action, .story-action) {
- border-radius: 5px !important;
+ min-height: 46px;
+ border-radius: var(--radius-control);
+ color: #fff;
+ background: var(--gradient-action);
+ box-shadow: var(--shadow-button);
+ font-size: 14px;
+ font-weight: 600;
transition:
- color 0.22s ease,
- background 0.22s ease,
- border-color 0.22s ease,
- box-shadow 0.24s ease,
- transform 0.24s cubic-bezier(0.22, 1, 0.36, 1) !important;
+ color var(--duration-fast) ease,
+ background var(--duration-fast) ease,
+ border-color var(--duration-fast) ease,
+ box-shadow var(--duration-fast) ease,
+ transform var(--duration-fast) var(--ease-standard);
}
-:is(
+body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -197,109 +435,221 @@
.article-page
)
:is(button, a):focus-visible {
- outline: 3px solid rgba(32, 123, 242, 0.3);
+ outline: 3px solid rgba(20, 120, 251, 0.34);
outline-offset: 3px;
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
- )
- :is(table, .comparison-table, .result-table-wrap) {
- font-variant-numeric: tabular-nums;
+body
+ :is(.advantages-page, .solutions-page)
+ :is(.hero-advantage-links button, .hero-industry-links button),
+body :is(.cases-page, .insights-page) :is(.case-filters button, .insight-filters button) {
+ border-radius: var(--radius-control);
+ font-size: 13px;
+ transition:
+ color var(--duration-fast) ease,
+ background var(--duration-fast) ease,
+ border-color var(--duration-fast) ease,
+ box-shadow var(--duration-fast) ease,
+ transform var(--duration-fast) ease;
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
- )
- img {
- image-rendering: auto;
+/* Panels use component-specific radii instead of one universal card treatment. */
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .featured-case,
+ .featured-insight,
+ .contact-details,
+ .comparison-table-wrap,
+ .result-table-wrap,
+ .comparison-table,
+ .objective-box
+ ) {
+ border: 1px solid var(--color-border-soft);
+ border-radius: var(--radius-panel);
+ background: rgba(255, 255, 255, 0.9);
+ box-shadow: var(--shadow-card);
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
- )
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
:is(
.stats-row article,
.method-flow article,
.team-capabilities article,
.intro-sequence article,
- .advantage-story-visual,
.proof-stats article,
.decision-factor-list article,
- .industry-visual,
.more-industry-list button,
.snapshot-grid article,
.method-list article,
+ .article-grid article
+ ) {
+ border: 1px solid rgba(83, 145, 215, 0.12);
+ border-radius: var(--radius-card);
+ background-color: var(--interior-surface);
+ box-shadow: var(--shadow-card);
+}
+
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(.stats-row article, .proof-stats article, .featured-metrics strong, .hero-proof-line strong) {
+ font-variant-numeric: tabular-nums;
+}
+
+body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ img {
+ max-width: 100%;
+ image-rendering: auto;
+}
+
+/* Page-specific signatures. */
+body .services-page .services-hero-visual::after {
+ position: absolute;
+ z-index: 1;
+ right: 8%;
+ bottom: 3%;
+ width: 46%;
+ height: 1px;
+ content: '';
+ background: linear-gradient(90deg, transparent, rgba(20, 120, 251, 0.5));
+}
+
+body .solutions-page .solutions-hero-mesh::after {
+ background-image: radial-gradient(circle, rgba(20, 120, 251, 0.17) 1px, transparent 1.5px);
+ background-size: 28px 28px;
+ opacity: 0.22;
+}
+
+body .advantages-page .advantages-hero-mesh::after {
+ background-image:
+ linear-gradient(rgba(54, 124, 214, 0.07) 1px, transparent 1px),
+ linear-gradient(90deg, rgba(54, 124, 214, 0.07) 1px, transparent 1px);
+ background-size: 72px 72px;
+ transform: rotate(-4deg) scale(1.08);
+}
+
+body .cases-page .case-collage {
+ transform: rotate(-0.6deg);
+}
+
+body .cases-page .case-collage .collage-card {
+ transition:
+ transform var(--duration-normal) var(--ease-standard),
+ box-shadow var(--duration-normal) ease;
+}
+
+body .insights-page .editorial-index::after {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 4px;
+ content: '';
+ background: linear-gradient(90deg, var(--color-brand-violet), var(--color-brand-cyan));
+}
+
+body .about-page .about-hero-mesh::after {
+ background-image:
+ linear-gradient(
+ 90deg,
+ transparent 0 13%,
+ rgba(20, 120, 251, 0.08) 13% 13.1%,
+ transparent 13.1%
+ ),
+ radial-gradient(circle, rgba(20, 120, 251, 0.18) 1px, transparent 1.5px);
+ background-size:
+ 100% 100%,
+ 36px 36px;
+ opacity: 0.2;
+}
+
+/* Detail and long-form pages. */
+body :is(.case-detail-page, .article-page) {
+ background: #fff;
+}
+
+body :is(.case-detail-page, .article-page) :is(.detail-hero, .article-hero) {
+ background: linear-gradient(90deg, #f7faff, #e6eefc);
+}
+
+body
+ .case-detail-page
+ :is(.overview-section, .baseline-section, .solution-detail-section, .detail-summary-section),
+body .article-page :is(.article-layout, .related-section) {
+ padding-top: 80px;
+ padding-bottom: 92px;
+}
+
+body .case-detail-page :is(.baseline-section, .detail-summary-section),
+body .article-page .related-section {
+ background: var(--color-surface-blue);
+}
+
+body
+ .case-detail-page
+ :is(
.baseline-grid article,
.question-grid article,
.phase-list article,
.distribution-map article,
.outcome-grid article,
- .related-grid article,
- .article-grid article
+ .related-grid article
) {
- border: 1px solid rgba(83, 145, 215, 0.12) !important;
- border-radius: 8px !important;
- background-color: var(--interior-surface) !important;
- box-shadow:
- 0 16px 42px rgba(58, 112, 174, 0.075),
- inset 0 1px 0 rgba(255, 255, 255, 0.9) !important;
+ border: 1px solid rgba(83, 145, 215, 0.12);
+ border-radius: var(--radius-card);
+ background-color: var(--interior-surface);
+ box-shadow: var(--shadow-card);
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
- )
- :is(.comparison-table-wrap, .result-table-wrap, .comparison-table) {
- border: 1px solid rgba(83, 145, 215, 0.14) !important;
- border-radius: 8px !important;
- background: rgba(255, 255, 255, 0.9) !important;
- box-shadow: 0 20px 50px rgba(58, 112, 174, 0.08) !important;
+body .case-detail-page :is(.comparison-table-wrap, .result-table-wrap, .objective-box) {
+ border: 1px solid var(--color-border-soft);
+ border-radius: var(--radius-panel);
+ background: rgba(255, 255, 255, 0.92);
+ box-shadow: var(--shadow-card);
}
-:is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
- )
- :is(.featured-case, .featured-insight, .contact-details, .objective-box, .article-lead) {
- border: 1px solid rgba(83, 145, 215, 0.13) !important;
- border-radius: 8px !important;
- box-shadow: 0 24px 56px rgba(48, 105, 171, 0.09) !important;
+body .case-detail-page :is(.comparison-table-wrap, .result-table-wrap),
+body .article-page .comparison-table {
+ max-width: 100%;
+ overflow-x: auto;
+ font-variant-numeric: tabular-nums;
}
+body .article-page .article-hero-inner,
+body .case-detail-page .detail-hero > .page-width {
+ padding-top: 72px;
+ padding-bottom: 78px;
+}
+
+body .article-page .article-layout {
+ grid-template-columns: minmax(200px, 260px) minmax(0, 760px);
+ justify-content: center;
+ gap: clamp(48px, 7vw, 96px);
+}
+
+body .article-page .article-content {
+ width: 100%;
+ max-width: 760px;
+}
+
+body .article-page .article-content p,
+body .article-page .article-content li {
+ color: var(--interior-copy);
+ font-size: 15px;
+ line-height: 1.85;
+}
+
+body .article-page .article-aside {
+ top: 92px;
+}
+
+body .article-page :is(.article-lead, .draft-note, .inline-cta) {
+ border-radius: var(--radius-card);
+}
+
+/* Shared reveal motion. */
.interior-reveal-ready .interior-reveal {
opacity: 0;
transform: translateY(24px);
@@ -314,7 +664,8 @@
}
@media (hover: hover) and (pointer: fine) {
- :is(
+ body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -324,21 +675,13 @@
.insights-page,
.article-page
)
- :is(.primary-button, .industry-plan-button):hover {
- box-shadow: 0 14px 28px rgba(29, 119, 234, 0.23) !important;
- transform: translateY(-3px);
+ :is(.primary-button, .industry-plan-button, .service-action, .story-action):hover {
+ box-shadow: var(--shadow-button-hover);
+ transform: translateY(-2px);
}
- :is(
- .about-page,
- .advantages-page,
- .services-page,
- .solutions-page,
- .cases-page,
- .case-detail-page,
- .insights-page,
- .article-page
- )
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
:is(
.stats-row article,
.method-flow article,
@@ -348,25 +691,105 @@
.decision-factor-list article,
.more-industry-list button,
.snapshot-grid article,
- .method-list article,
+ .article-grid article
+ ):hover,
+ body
+ .case-detail-page
+ :is(
.baseline-grid article,
.question-grid article,
.phase-list article,
- .distribution-map article,
- .outcome-grid article,
- .related-grid article,
- .article-grid article
+ .outcome-grid article
):hover {
- border-color: rgba(51, 132, 229, 0.24) !important;
- box-shadow:
- 0 22px 50px rgba(48, 111, 184, 0.13),
- inset 0 1px 0 #fff !important;
+ border-color: rgba(51, 132, 229, 0.24);
+ box-shadow: var(--shadow-card-hover);
transform: translateY(-5px);
}
+
+ body .cases-page .case-collage .collage-card:hover {
+ box-shadow: var(--shadow-card-hover);
+ }
+}
+
+@media (max-width: 1100px) {
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .about-hero-grid,
+ .advantages-hero-grid,
+ .services-hero-grid,
+ .solutions-hero-grid,
+ .cases-hero-grid,
+ .insights-hero-grid
+ ) {
+ grid-template-columns: minmax(0, 0.95fr) minmax(360px, 1.05fr);
+ gap: 32px;
+ }
+
+ body
+ :is(.advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .advantages-hero-copy,
+ .services-hero-copy,
+ .solutions-hero-copy,
+ .cases-hero-copy,
+ .insights-hero-copy
+ )
+ h1 {
+ font-size: clamp(38px, 4.25vw, 46px);
+ }
+}
+
+@media (max-width: 820px) {
+ body
+ :is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ )
+ .subsite-header-inner.page-width {
+ width: min(calc(100% - 32px), 580px);
+ }
+
+ body
+ :is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ )
+ .subsite-menu {
+ display: grid;
+ }
}
@media (max-width: 760px) {
:is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ ) {
+ width: 100%;
+ max-width: 100vw;
+ overflow-x: clip;
+ }
+
+ body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -377,10 +800,232 @@
.article-page
)
.page-width {
- width: min(100% - 32px, 580px);
+ width: min(calc(100% - 32px), 580px);
+ max-width: 100%;
}
- :is(
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .about-hero,
+ .advantages-hero,
+ .services-hero,
+ .solutions-hero,
+ .cases-hero,
+ .insights-hero
+ ) {
+ min-height: 0;
+ overflow: hidden;
+ }
+
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .about-hero-grid,
+ .advantages-hero-grid,
+ .services-hero-grid,
+ .solutions-hero-grid,
+ .cases-hero-grid,
+ .insights-hero-grid
+ ) {
+ min-height: 0;
+ grid-template-columns: minmax(0, 1fr);
+ gap: 28px;
+ padding-top: 58px;
+ padding-bottom: 0;
+ }
+
+ body
+ :is(.advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .advantages-hero-copy,
+ .services-hero-copy,
+ .solutions-hero-copy,
+ .cases-hero-copy,
+ .insights-hero-copy
+ ) {
+ width: 100%;
+ min-width: 0;
+ max-width: 100%;
+ }
+
+ body
+ :is(.advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .advantages-hero-copy,
+ .services-hero-copy,
+ .solutions-hero-copy,
+ .cases-hero-copy,
+ .insights-hero-copy
+ )
+ h1 {
+ max-width: 10.5em;
+ font-size: clamp(30px, 9vw, 36px);
+ line-height: 1.3;
+ overflow-wrap: break-word;
+ }
+
+ body .about-page .about-hero-copy h1 {
+ font-size: clamp(38px, 12vw, 48px);
+ line-height: 1.12;
+ }
+
+ body .about-page .about-hero-copy h2 {
+ max-width: 17em;
+ font-size: clamp(22px, 6.5vw, 27px);
+ line-height: 1.5;
+ }
+
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .about-hero-copy,
+ .advantages-hero-copy,
+ .services-hero-copy,
+ .solutions-hero-copy,
+ .cases-hero-copy,
+ .insights-hero-copy
+ )
+ > p:nth-of-type(2) {
+ width: 100%;
+ max-width: 34em;
+ margin-top: 20px;
+ font-size: 14px;
+ line-height: 1.75;
+ }
+
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(.page-eyebrow, .section-kicker) {
+ font-size: 13px;
+ }
+
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(.hero-actions, .hero-advantage-links, .hero-industry-links, .hero-proof-line) {
+ width: 100%;
+ min-width: 0;
+ flex-wrap: wrap;
+ }
+
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .about-hero-visual,
+ .advantage-engine,
+ .services-hero-visual,
+ .solutions-hero-visual,
+ .case-collage,
+ .editorial-index
+ ) {
+ width: min(100%, 430px);
+ max-width: calc(100vw - 32px);
+ justify-self: center;
+ margin-right: auto;
+ margin-left: auto;
+ }
+
+ body .insights-page .editorial-index {
+ min-height: 330px;
+ margin-bottom: 46px;
+ padding: 30px 26px;
+ }
+
+ body .cases-page .case-collage {
+ min-height: 410px;
+ transform: none;
+ }
+
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .company-story-section,
+ .search-change-section,
+ .company-stats-section,
+ .method-section,
+ .timeline-section,
+ .team-section,
+ .contact-section,
+ .advantage-intro-section,
+ .advantage-system,
+ .comparison-section,
+ .value-added-section,
+ .proof-section,
+ .decision-section,
+ .model-deep-section,
+ .service-system-section,
+ .process-section,
+ .service-industries,
+ .difference-section,
+ .industry-solutions,
+ .more-industries-section,
+ .case-library-section,
+ .case-method-section,
+ .insight-library,
+ .whitepaper-section
+ ) {
+ padding-top: var(--section-space-mobile);
+ padding-bottom: 70px;
+ }
+
+ body
+ :is(.about-page, .advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .story-heading,
+ .change-copy,
+ .company-stats-grid > header,
+ .center-heading,
+ .timeline-heading,
+ .team-statement,
+ .contact-heading,
+ .advantage-intro-grid > header,
+ .advantage-story-copy,
+ .value-added-heading,
+ .proof-layout > header,
+ .section-intro,
+ .model-heading,
+ .service-system-heading,
+ .process-heading,
+ .industry-list > header,
+ .difference-heading,
+ .industry-intro,
+ .case-library-heading,
+ .case-method-grid > header,
+ .library-heading,
+ .whitepaper-copy
+ )
+ h2 {
+ font-size: clamp(24px, 7vw, 29px);
+ line-height: 1.38;
+ }
+
+ body .article-page .article-layout {
+ grid-template-columns: minmax(0, 1fr);
+ gap: 34px;
+ padding-top: 58px;
+ padding-bottom: 68px;
+ }
+
+ body .article-page .article-aside {
+ position: static;
+ }
+
+ body .article-page .article-content p,
+ body .article-page .article-content li {
+ font-size: 14px;
+ line-height: 1.8;
+ }
+
+ body
+ .case-detail-page
+ :is(.overview-section, .baseline-section, .solution-detail-section, .detail-summary-section),
+ body .article-page .related-section {
+ padding-top: 62px;
+ padding-bottom: 70px;
+ }
+
+ body
+ :is(
.about-page,
.advantages-page,
.services-page,
@@ -400,6 +1045,48 @@
}
}
+@media (max-width: 390px) {
+ body
+ :is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ )
+ .page-width,
+ body
+ :is(
+ .about-page,
+ .advantages-page,
+ .services-page,
+ .solutions-page,
+ .cases-page,
+ .case-detail-page,
+ .insights-page,
+ .article-page
+ )
+ .subsite-header-inner.page-width {
+ width: calc(100% - 24px);
+ }
+
+ body
+ :is(.advantages-page, .services-page, .solutions-page, .cases-page, .insights-page)
+ :is(
+ .advantages-hero-copy,
+ .services-hero-copy,
+ .solutions-hero-copy,
+ .cases-hero-copy,
+ .insights-hero-copy
+ )
+ h1 {
+ font-size: 30px;
+ }
+}
+
@media (prefers-reduced-motion: reduce) {
.interior-reveal-ready .interior-reveal {
opacity: 1;
diff --git a/assets/css/main.css b/assets/css/main.css
index 57541f0..7caae71 100644
--- a/assets/css/main.css
+++ b/assets/css/main.css
@@ -6,6 +6,37 @@
font-family: 'Source Han Sans', 'PingFang SC', 'Microsoft YaHei', Arial, sans-serif;
color: #404040;
background: #fff;
+ --color-brand-primary: #1478fb;
+ --color-brand-bright: #0875f9;
+ --color-brand-blue: #287cf9;
+ --color-brand-cyan: #00adf6;
+ --color-brand-violet: #453cff;
+ --gradient-action: linear-gradient(100deg, #453cff, #00adf6);
+ --color-text-strong: #404040;
+ --color-text-default: #525966;
+ --color-text-body: #777;
+ --color-text-muted: #a5a5a5;
+ --color-surface-blue: #edf8ff;
+ --color-surface-case: #eef9ff;
+ --color-surface-soft: #f9fbff;
+ --color-border-soft: #d7e9ff;
+ --radius-control: 5px;
+ --radius-small: 8px;
+ --radius-card: 12px;
+ --radius-panel: 16px;
+ --radius-feature: 20px;
+ --shadow-button: 0 8px 15px rgba(25, 106, 255, 0.16);
+ --shadow-button-hover: 0 11px 20px rgba(25, 106, 255, 0.24);
+ --shadow-card: 0 10px 24px rgba(112, 163, 255, 0.09);
+ --shadow-card-hover: 0 17px 32px rgba(73, 139, 234, 0.14);
+ --container-max: 1296px;
+ --page-gutter-desktop: 24px;
+ --page-gutter-mobile: 16px;
+ --section-space-desktop: 80px;
+ --section-space-mobile: 64px;
+ --duration-fast: 200ms;
+ --duration-normal: 320ms;
+ --ease-standard: cubic-bezier(0.2, 0.75, 0.2, 1);
}
* {
box-sizing: border-box;
@@ -1188,7 +1219,7 @@ a:focus-visible {
.article-page
)
:is(.page-eyebrow, .section-kicker) {
- color: #286dae !important;
+ color: #286dae;
font-size: 14px !important;
font-weight: 700 !important;
letter-spacing: 0.08em !important;
@@ -1267,6 +1298,19 @@ a:focus-visible {
color: var(--inner-copy) !important;
font-size: 14px !important;
}
+.about-page .method-flow .method-marker {
+ color: #fff !important;
+}
+.about-page .center-heading .method-kicker {
+ width: fit-content !important;
+ display: block !important;
+ margin-right: auto !important;
+ margin-left: auto !important;
+ text-align: center !important;
+}
+.about-page .center-heading .method-kicker::before {
+ display: none !important;
+}
/* Advantages */
.advantages-page :is(.hero-advantage-links button, .story-action, .proof-layout header > a) {
@@ -1334,7 +1378,7 @@ a:focus-visible {
.industry-list > article > span,
.proof-data span
) {
- color: var(--inner-muted) !important;
+ color: var(--color-surface-soft) !important;
font-size: 12px !important;
}
diff --git a/components/ConsultationModal.vue b/components/ConsultationModal.vue
index 37f41eb..d92797b 100644
--- a/components/ConsultationModal.vue
+++ b/components/ConsultationModal.vue
@@ -15,7 +15,7 @@ function validate() {
if (!form.value.name.trim()) nextErrors.name = '请填写您的姓名'
if (!form.value.company.trim()) nextErrors.company = '请填写公司名称'
if (!form.value.contact.trim()) {
- nextErrors.contact = '请填写手机号或邮箱'
+ nextErrors.contact = '请填写手机号'
} else if (
!/^(1\d{10}|[\w.+-]+@[\w.-]+\.[A-Za-z]{2,}|[\d\s()+-]{6,})$/.test(form.value.contact.trim())
) {
@@ -143,7 +143,7 @@ onBeforeUnmount(() => {
v-model="form.contact"
type="text"
autocomplete="tel"
- placeholder="手机号或工作邮箱"
+ placeholder="手机号"
/>
{{ errors.contact }}
diff --git a/components/UEditor.vue b/components/UEditor.vue
new file mode 100644
index 0000000..0fec805
--- /dev/null
+++ b/components/UEditor.vue
@@ -0,0 +1,128 @@
+
+
+
+
+
+
+
diff --git a/components/site/SiteFooter.vue b/components/site/SiteFooter.vue
index 93dc42f..9d1941c 100644
--- a/components/site/SiteFooter.vue
+++ b/components/site/SiteFooter.vue
@@ -50,7 +50,7 @@ const sourceLabel = computed(() => {
联系我们
成都市武侯区芯通科技大厦 B 座 9 楼成都市武侯区芯通科技大厦B座9楼
联系电话:待补充
商务邮箱:待补充
diff --git a/composables/useOfficialContent.js b/composables/useOfficialContent.js
new file mode 100644
index 0000000..c06cc35
--- /dev/null
+++ b/composables/useOfficialContent.js
@@ -0,0 +1,131 @@
+const ALL_LABEL = '全部'
+const LATEST_LABEL = '最新文章'
+const FALLBACK_IMAGE = '/images/lanhu/slices/home-group95-image21@2x.png'
+
+function pickUrl(asset) {
+ return asset?.url || asset?.fileUrl || asset?.filePath || ''
+}
+
+function buildMediaMap(media = []) {
+ return new Map(media.map((asset) => [asset.id, asset]))
+}
+
+function toTags(value) {
+ if (Array.isArray(value)) return value.filter(Boolean)
+ return String(value || '')
+ .split(/[,,、\s]+/)
+ .map((item) => item.trim())
+ .filter(Boolean)
+}
+
+function bySortAndTime(left, right) {
+ const leftSort = Number.isFinite(Number(left.sortOrder)) ? Number(left.sortOrder) : 9999
+ const rightSort = Number.isFinite(Number(right.sortOrder)) ? Number(right.sortOrder) : 9999
+ if (leftSort !== rightSort) return leftSort - rightSort
+ return String(right.updatedAt || right.publishedAt || '').localeCompare(
+ String(left.updatedAt || left.publishedAt || '')
+ )
+}
+
+export function useOfficialContent() {
+ const config = useRuntimeConfig()
+ const serverApiBase = `${String(config.officialApiProxyTarget || 'http://localhost:8080').replace(/\/$/, '')}/api`
+ const apiBase = import.meta.server ? serverApiBase : (config.public.officialApiBase || '/api')
+
+ function fetchPublicContent(type) {
+ console.log(apiBase)
+ return $fetch('/public/content', {
+ baseURL: apiBase,
+ query: { type }
+ })
+ }
+
+ function fetchHomepageSections() {
+ return $fetch('/public/homepage/sections', { baseURL: apiBase })
+ }
+
+ function fetchPublicSiteConfig() {
+ return $fetch('/public/site-config', { baseURL: apiBase })
+ }
+
+ function assetUrl(assetId, mediaMap, fallback = FALLBACK_IMAGE) {
+ if (!assetId) return fallback
+ return pickUrl(mediaMap.get(assetId)) || fallback
+ }
+
+ function assetAlt(assetId, mediaMap, fallback = '') {
+ if (!assetId) return fallback
+ return mediaMap.get(assetId)?.alt || fallback
+ }
+
+ function normalizeCase(item, mediaMap) {
+ const metric = item.metricValue || ''
+ const metricLabel = item.metricLabel || ''
+ const clientName = item.isAnonymous && item.clientName ? `匿名客户:${item.clientName}` : item.clientName
+
+ return {
+ ...item,
+ industry: item.industry || item.category || '未分类',
+ client: clientName || '匿名客户',
+ cover: item.coverUrl || assetUrl(item.coverAssetId, mediaMap),
+ coverAlt: item.coverAlt || assetAlt(item.coverAssetId, mediaMap, item.title),
+ summary: item.summary || item.description || '',
+ description: item.description || item.summary || '',
+ metric,
+ metricLabel,
+ metrics: [[metric, metricLabel], [item.secondary, '辅助成果']].filter((row) => row[0]),
+ secondary: item.secondary || '',
+ contentHtml: item.contentHtml || ''
+ }
+ }
+
+ function normalizeArticle(item, mediaMap) {
+ return {
+ ...item,
+ category: item.category || '未分类',
+ excerpt: item.summary || item.description || '',
+ date: item.publishDate || item.publishedAt?.slice?.(0, 10) || '',
+ readingTime: item.readingTime || '约 5 分钟',
+ views: item.views || '0',
+ cover: item.coverUrl || assetUrl(item.coverAssetId, mediaMap),
+ coverAlt: item.coverAlt || assetAlt(item.coverAssetId, mediaMap, item.title),
+ featured: Boolean(item.isFeatured),
+ tags: toTags(item.tags),
+ contentHtml: item.contentHtml || ''
+ }
+ }
+
+ function normalizeWhitepaper(item, mediaMap) {
+ const documentAsset = item.documentAssetId ? mediaMap.get(item.documentAssetId) : null
+
+ return {
+ ...item,
+ category: item.category || '行业白皮书',
+ excerpt: item.summary || item.description || '',
+ cta: item.cta || '获取白皮书',
+ cover: item.coverUrl || assetUrl(item.coverAssetId, mediaMap),
+ documentUrl: item.documentUrl || pickUrl(documentAsset),
+ documentName: item.documentName || documentAsset?.name || item.title,
+ contentHtml: item.contentHtml || ''
+ }
+ }
+
+ function categoryList(items, field = 'category', extras = []) {
+ const values = items.map((item) => item[field]).filter(Boolean)
+ return [ALL_LABEL, ...extras, ...Array.from(new Set(values))]
+ }
+
+ return {
+ ALL_LABEL,
+ LATEST_LABEL,
+ bySortAndTime,
+ buildMediaMap,
+ fetchPublicContent,
+ fetchHomepageSections,
+ fetchPublicSiteConfig,
+ normalizeCase,
+ normalizeArticle,
+ normalizeWhitepaper,
+ categoryList
+ }
+}
diff --git a/nuxt.config.js b/nuxt.config.js
index 6eefaca..fbd0534 100644
--- a/nuxt.config.js
+++ b/nuxt.config.js
@@ -1,4 +1,12 @@
+const officialApiProxyTarget = (process.env.NUXT_OFFICIAL_API_PROXY_TARGET || 'http://localhost:8080').replace(/\/$/, '')
+
export default defineNuxtConfig({
+ runtimeConfig: {
+ officialApiProxyTarget,
+ public: {
+ officialApiBase: process.env.NUXT_PUBLIC_OFFICIAL_API_BASE || '/api'
+ }
+ },
future: {
compatibilityVersion: 3
},
@@ -13,6 +21,14 @@ export default defineNuxtConfig({
}
}
},
+ nitro: {
+ devProxy: {
+ '/api': {
+ target: `${officialApiProxyTarget}/api`,
+ changeOrigin: true
+ }
+ }
+ },
app: {
head: {
title: '大马棒 · 云途全域 GEO',
diff --git a/pages/about.vue b/pages/about.vue
index ef55272..63bafce 100644
--- a/pages/about.vue
+++ b/pages/about.vue
@@ -5,18 +5,44 @@ import SiteFooter from '~/components/site/SiteFooter.vue'
const pageRoot = ref(null)
const { openConsultation } = useConsultation()
+const { fetchPublicSiteConfig } = useOfficialContent()
let animationContext
-useHead({
+const { data: siteConfigRows } = await useAsyncData('public-site-config-about', () =>
+ fetchPublicSiteConfig()
+)
+
+function parseConfigValue(value, fallback) {
+ if (value == null || value === '') return fallback
+ if (typeof value !== 'string') return value
+ try {
+ return JSON.parse(value)
+ } catch {
+ return fallback
+ }
+}
+
+const siteConfig = computed(() => siteConfigRows.value || {})
+const brandConfig = computed(() => parseConfigValue(siteConfig.value.BRAND_PROFILE, {}))
+const contactConfig = computed(() =>
+ parseConfigValue(siteConfig.value.CONTACT, {
+ phone: '待补充',
+ email: '待补充',
+ address: '待补充'
+ })
+)
+
+useHead(() => ({
title: '关于我们|大马棒·云途全域 GEO',
meta: [
{
name: 'description',
content:
+ brandConfig.value.seoDescription ||
'大马棒·云途全域 GEO 是聚焦 AI 搜索增长的全链路服务商,提供可见性诊断、策略规划、内容建设、信源分发与效果复盘。'
}
]
-})
+}))
const stats = [
['1000+', '累计服务客户'],
@@ -33,7 +59,7 @@ const serviceFlow = [
['05', '效果复盘', '持续监测覆盖率、推荐率、流量与咨询线索质量。']
]
-const timeline = [
+const fallbackTimeline = [
{
year: '2023',
title: '核心团队组建',
@@ -58,6 +84,22 @@ const timeline = [
events: ['打通品牌曝光与营销获客闭环', '服务客户突破 1000 家,覆盖 12+ 主流行业']
}
]
+const timeline = computed(() => {
+ const rows = parseConfigValue(siteConfig.value.ABOUT_HISTORY, [])
+ if (!Array.isArray(rows) || rows.length === 0) return fallbackTimeline
+
+ return rows
+ .filter((item) => item.status !== 'OFFLINE')
+ .sort((left, right) => (Number(left.sortOrder) || 0) - (Number(right.sortOrder) || 0))
+ .map((item) => ({
+ year: item.year || '',
+ title: item.title || '',
+ events:
+ Array.isArray(item.events) && item.events.length
+ ? item.events
+ : [item.description].filter(Boolean)
+ }))
+})
const teamCapabilities = [
['搜索理解', '经历 PC 搜索、移动搜索到 AI 搜索的持续变化。'],
@@ -211,7 +253,7 @@ onBeforeUnmount(() => animationContext?.revert())
@@ -289,20 +331,16 @@ onBeforeUnmount(() => animationContext?.revert())
-
- 公司名称
- - 成都大马棒传媒有限公司
+ - 咨询电话
+ - {{ contactConfig.phone || '待补充' }}
-
- 公司地址
- - 成都市武侯区芯通科技大厦 B 座 9 楼
+ - 联系邮箱
+ - {{ contactConfig.email || '待补充' }}
-
- 联系电话
- - 待补充
-
-
-
- 商务邮箱
- - 待补充
+ - 办公地址
+ - {{ contactConfig.address || '待补充' }}
@@ -819,6 +857,15 @@ onBeforeUnmount(() => animationContext?.revert())
margin: 0 auto;
text-align: center;
}
+.center-heading .section-kicker {
+ width: 100%;
+ display: block;
+ justify-content: center;
+ text-align: center;
+}
+.center-heading .section-kicker::before {
+ display: none;
+}
.center-heading > p:last-child {
max-width: 640px;
margin: 18px auto 0;
@@ -856,7 +903,7 @@ onBeforeUnmount(() => animationContext?.revert())
place-items: center;
border: 7px solid rgba(255, 255, 255, 0.92);
border-radius: 50%;
- color: #fff;
+ color: #fff !important;
background: #358af0;
box-shadow: 0 11px 24px rgba(51, 135, 235, 0.22);
font-size: 10px;
@@ -1104,10 +1151,13 @@ onBeforeUnmount(() => animationContext?.revert())
url('/images/lanhu/slices/home-group105-image31@2x.png') center / cover no-repeat;
}
.about-cta-content {
+ display: grid;
+ justify-items: center;
padding: 75px 0;
text-align: center;
}
.about-cta-content > p {
+ width: 100%;
margin: 0;
color: #237df0;
font-size: 12px;
diff --git a/pages/advantages.vue b/pages/advantages.vue
index f63f75b..837ec31 100644
--- a/pages/advantages.vue
+++ b/pages/advantages.vue
@@ -106,6 +106,20 @@ const advantages = [
}
]
+const introSequenceIcons = {
+ 'human-content': '/images/advantages/intro-human-content.png',
+ 'media-network': '/images/advantages/intro-media-network.png',
+ 'closed-loop': '/images/advantages/intro-closed-loop.png',
+ 'custom-service': '/images/advantages/intro-custom-service.png'
+}
+
+const capabilityImages = {
+ 'human-content': '/images/advantages/capability-human-content.png',
+ 'media-network': '/images/advantages/capability-media-network.png',
+ 'closed-loop': '/images/advantages/capability-closed-loop.png',
+ 'custom-service': '/images/advantages/capability-custom-service.png'
+}
+
const comparisonRows = [
['核心目标', '抢排名、买点击', '蹭热度、抓眼球', '让品牌在 AI 推荐中被选中'],
['内容逻辑', '迎合搜索规则', '什么火就写什么', '真实可信,适配 AI 搜索与用户决策'],
@@ -120,14 +134,14 @@ const valueAddedServices = [
title: '创始人 / 企业 IP 打造',
text: '结合品牌调性与创始人特质,搭建差异化人设定位、内容脚本体系与长期更新规划,形成高辨识度的专属 IP。',
items: ['人设定位', '选题与脚本', '内容生产', '长期运营'],
- image: '/images/lanhu/slices/home-group96-image22@2x.png'
+ image: '/images/advantages/founder-ip-visual.png'
},
{
number: '02',
title: '短视频与直播获客',
text: '从短视频批量产出到直播间常态化运营,配置主播、运营、投流与中控团队,覆盖拍摄、剪辑、投放和转化。',
items: ['短视频生产', '直播运营', '投流优化', '成交承接'],
- image: '/images/lanhu/slices/home-group97-image23@2x.png'
+ image: '/images/advantages/short-video-live-visual.png'
}
]
@@ -239,10 +253,19 @@ onBeforeUnmount(() => animationContext?.revert())
-
+
{{ advantage.number }}{{ advantage.short }}
{{ advantage.metric }}
+
@@ -293,20 +316,10 @@ onBeforeUnmount(() => animationContext?.revert())
{{ advantage.short }}能力模型YUNTU CAPABILITY MAP
-
- {{ advantage.number }}{{ advantage.short }}
-
-
- 0{{ itemIndex + 1 }}{{ item }}
-
-
+
{{ advantage.metric }} animationContext?.revert())
gap: 14px;
}
.intro-sequence article {
+ position: relative;
min-height: 165px;
- padding: 26px;
+ overflow: hidden;
+ padding: 26px 118px 26px 26px;
border-radius: 14px 5px 14px 5px;
background: #f2f7fd;
transition: 0.24s;
@@ -799,12 +814,58 @@ onBeforeUnmount(() => animationContext?.revert())
font-size: 17px;
}
.intro-sequence p {
+ position: relative;
+ z-index: 2;
margin: 7px 0 0;
color: #277fec;
font-size: 20px;
font-weight: 700;
font-variant-numeric: tabular-nums;
}
+.intro-sequence span,
+.intro-sequence strong {
+ position: relative;
+ z-index: 2;
+}
+.intro-sequence-icon {
+ position: absolute;
+ right: 16px;
+ bottom: 12px;
+ z-index: 1;
+ width: 108px;
+ max-height: 128px;
+ object-fit: contain;
+ pointer-events: none;
+ filter: drop-shadow(0 18px 26px rgba(40, 126, 235, 0.18));
+ transition: transform 0.24s;
+}
+.intro-sequence article:hover .intro-sequence-icon {
+ transform: translate3d(0, -4px, 0) scale(1.03);
+}
+.intro-card--human-content .intro-sequence-icon {
+ right: 22px;
+ bottom: 24px;
+ width: 66px;
+ max-height: 86px;
+}
+.intro-card--media-network .intro-sequence-icon {
+ right: 16px;
+ bottom: 18px;
+ width: 106px;
+ max-height: 112px;
+}
+.intro-card--closed-loop .intro-sequence-icon {
+ right: 12px;
+ bottom: 41x;
+ width: 100px;
+ max-height: 128px;
+}
+.intro-card--custom-service .intro-sequence-icon {
+ right: 2px;
+ bottom: -4px;
+ width: 130px;
+ max-height: 132px;
+}
.advantage-story {
scroll-margin-top: 80px;
padding: 116px 0 132px;
@@ -919,20 +980,25 @@ onBeforeUnmount(() => animationContext?.revert())
letter-spacing: 0.1em;
}
.story-action {
+ display: inline-flex;
+ min-width: 164px;
+ min-height: 46px;
margin-top: 24px;
- padding: 0 0 5px;
- border-bottom: 1px solid #8eb9e9;
- color: #247be8;
- background: transparent;
+ padding: 0 26px;
+ align-items: center;
+ justify-content: center;
+ gap: 9px;
+ white-space: nowrap;
font-size: 12px;
font-weight: 600;
}
-.story-action b {
- margin-left: 8px;
- transition: margin 0.2s;
+.story-action :deep(.app-icon) {
+ width: 1em;
+ height: 1em;
+ transition: transform 0.2s;
}
-.story-action:hover b {
- margin-left: 13px;
+.story-action:hover :deep(.app-icon) {
+ transform: translateX(4px);
}
.advantage-story-visual {
position: relative;
@@ -978,110 +1044,14 @@ onBeforeUnmount(() => animationContext?.revert())
position: absolute;
top: 52%;
left: 50%;
- width: 410px;
- height: 360px;
+ width: min(88%, 460px);
+ height: 400px;
transform: translate(-50%, -50%);
}
-.capability-map::before {
- position: absolute;
- top: 50%;
- left: 50%;
- width: 280px;
- height: 280px;
- content: '';
- border: 1px dashed rgba(55, 137, 232, 0.34);
- border-radius: 50%;
- transform: translate(-50%, -50%);
-}
-.capability-center {
- position: absolute;
- z-index: 3;
- top: 50%;
- left: 50%;
- width: 142px;
- height: 142px;
- display: grid;
- place-content: center;
- justify-items: center;
- border: 11px solid rgba(255, 255, 255, 0.6);
- border-radius: 50%;
- color: #fff;
- background: linear-gradient(145deg, #3185ee, #50bce7);
- box-shadow: 0 22px 42px rgba(36, 123, 225, 0.28);
- transform: translate(-50%, -50%);
-}
-.capability-center small {
- font-size: 9px;
- opacity: 0.7;
-}
-.capability-center strong {
- margin-top: 5px;
- font-size: 17px;
-}
-.capability-node {
- position: absolute;
- z-index: 3;
- min-width: 110px;
- padding: 12px 14px;
- border: 1px solid rgba(255, 255, 255, 0.92);
- border-radius: 7px;
- color: #4e7198;
- background: rgba(255, 255, 255, 0.84);
- box-shadow: 0 12px 25px rgba(54, 113, 185, 0.11);
- text-align: center;
- backdrop-filter: blur(8px);
-}
-.capability-node span {
- display: block;
- color: #91a9c3;
- font-size: 8px;
-}
-.capability-node strong {
- display: block;
- margin-top: 3px;
- font-size: 10px;
-}
-.capability-node-1 {
- top: 0;
- left: 50%;
- transform: translateX(-50%);
-}
-.capability-node-2 {
- top: 50%;
- right: 0;
- transform: translateY(-50%);
-}
-.capability-node-3 {
- bottom: 0;
- left: 50%;
- transform: translateX(-50%);
-}
-.capability-node-4 {
- top: 50%;
- left: 0;
- transform: translateY(-50%);
-}
-.capability-line {
- position: absolute;
- z-index: 1;
- top: 50%;
- left: 50%;
- width: 2px;
- height: 135px;
- background: linear-gradient(#5aa1ed, transparent);
- transform-origin: top;
-}
-.line-1 {
- transform: rotate(180deg);
-}
-.line-2 {
- transform: rotate(90deg);
-}
-.line-3 {
- transform: rotate(0);
-}
-.line-4 {
- transform: rotate(-90deg);
+.capability-map img {
+ width: 100%;
+ height: 100%;
+ object-fit: contain;
}
.capability-metric {
position: absolute;
@@ -1140,7 +1110,7 @@ onBeforeUnmount(() => animationContext?.revert())
font-size: 11px;
}
.comparison-table-wrap thead th:last-child {
- color: #fff;
+ color: #fff !important;
background: #3187ee;
}
.comparison-table-wrap thead span {
@@ -1193,17 +1163,26 @@ onBeforeUnmount(() => animationContext?.revert())
}
.value-added-image {
position: relative;
+ display: grid;
+ place-items: center;
overflow: hidden;
- background: #e5f1ff;
+ background:
+ radial-gradient(circle at 28% 20%, rgba(255, 255, 255, 0.86) 0, rgba(255, 255, 255, 0) 31%),
+ radial-gradient(circle at 72% 32%, rgba(96, 207, 255, 0.36) 0, rgba(96, 207, 255, 0) 34%),
+ linear-gradient(135deg, #edf7ff 0%, #d8efff 48%, #f2edff 100%);
}
.value-added-image img {
- width: 100%;
- height: 100%;
+ position: relative;
+ z-index: 1;
+ width: min(108%, 560px);
+ height: min(92%, 370px);
display: block;
- object-fit: cover;
+ object-fit: contain;
+ filter: drop-shadow(0 24px 34px rgba(34, 122, 229, 0.18));
}
.value-added-image > span {
position: absolute;
+ z-index: 2;
top: 24px;
left: 24px;
display: grid;
@@ -1327,10 +1306,13 @@ onBeforeUnmount(() => animationContext?.revert())
url('/images/lanhu/slices/home-group105-image31@2x.png') center / cover no-repeat;
}
.advantages-cta-content {
+ display: grid;
+ justify-items: center;
padding: 75px 0;
text-align: center;
}
.advantages-cta-content > p {
+ width: 100%;
margin: 0;
color: #237df0;
font-size: 12px;
@@ -1442,6 +1424,31 @@ onBeforeUnmount(() => animationContext?.revert())
}
.intro-sequence article {
min-height: 140px;
+ padding-right: 118px;
+ }
+ .intro-sequence-icon {
+ right: 14px;
+ bottom: 10px;
+ width: 96px;
+ max-height: 106px;
+ }
+ .intro-card--human-content .intro-sequence-icon {
+ right: 20px;
+ bottom: 20px;
+ width: 68px;
+ }
+ .intro-card--media-network .intro-sequence-icon {
+ right: 14px;
+ bottom: 16px;
+ width: 94px;
+ max-height: 100px;
+ }
+ .intro-card--closed-loop .intro-sequence-icon,
+ .intro-card--custom-service .intro-sequence-icon {
+ right: 10px;
+ bottom: 0;
+ width: 108px;
+ max-height: 112px;
}
.advantage-story-copy h2 {
font-size: 31px;
@@ -1450,25 +1457,9 @@ onBeforeUnmount(() => animationContext?.revert())
min-height: 430px;
}
.capability-map {
- width: 310px;
+ width: min(92%, 320px);
height: 280px;
}
- .capability-map::before {
- width: 205px;
- height: 205px;
- }
- .capability-center {
- width: 105px;
- height: 105px;
- border-width: 8px;
- }
- .capability-node {
- min-width: 83px;
- padding: 9px;
- }
- .capability-line {
- height: 100px;
- }
.capability-metric {
right: 18px;
bottom: 17px;
@@ -1486,6 +1477,10 @@ onBeforeUnmount(() => animationContext?.revert())
.value-added-image {
min-height: 260px;
}
+ .value-added-image img {
+ width: min(112%, 430px);
+ height: 230px;
+ }
.value-added-copy {
padding: 32px 23px;
}
diff --git a/pages/cases/[slug].vue b/pages/cases/[slug].vue
index c68aa96..3b16b89 100644
--- a/pages/cases/[slug].vue
+++ b/pages/cases/[slug].vue
@@ -1,307 +1,262 @@
-
+
跳到主要内容
-
-
-
-
-
-
-
-
+
{{ article.category }}
{{ article.title }}
{{ article.excerpt }}
+
+ {{
+ tag
+ }}
+
查看详情
@@ -177,12 +227,12 @@ function requestWhitepaper(source) {
REPORT2026
-
行业白皮书
-
AI 搜索与品牌增长观察
-
用户行为 · 内容信源 · 衡量框架 · 行业实践
+
{{ featuredWhitepaper?.category || '行业白皮书' }}
+
{{ featuredWhitepaper?.title || 'AI 搜索与品牌增长观察' }}
+
{{ featuredWhitepaper?.excerpt || '用户行为 · 内容信源 · 衡量框架 · 行业实践' }}
@@ -493,43 +543,78 @@ function requestWhitepaper(source) {
}
.insight-filters {
display: flex;
- flex-wrap: wrap;
- gap: 10px;
- margin-top: 75px;
- padding-bottom: 18px;
- border-bottom: 1px solid #e0e9f3;
+ flex-wrap: nowrap;
+ justify-content: center;
+ gap: clamp(20px, 3.2vw, 44px);
+ width: min(100%, 980px);
+ margin: 72px auto 0;
+ padding: 0 6px;
+ overflow-x: auto;
+ border-bottom: 0;
+ scrollbar-width: none;
+}
+.insight-filters::-webkit-scrollbar {
+ display: none;
}
.insight-filters button {
- height: 38px;
- padding: 0 17px;
- border-radius: 4px;
- color: #61758c;
- background: #f1f6fc;
- font-size: 12px;
+ position: relative;
+ flex: 0 0 auto;
+ height: 54px;
+ padding: 0 8px;
+ border-radius: 0;
+ color: #101827;
+ background: transparent;
+ font-size: 22px !important;
+ font-weight: 500;
transition: 0.2s;
}
.insight-filters button:hover,
.insight-filters button.active {
- color: #fff;
- background: #287ff0;
- box-shadow: 0 8px 18px rgba(39, 126, 238, 0.2);
- transform: translateY(-1px);
+ color: #0978ff;
+ background: transparent;
+ box-shadow: none;
+ transform: none;
+}
+.insight-filters button::after {
+ position: absolute;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 2px;
+ content: '';
+ background: currentColor;
+ opacity: 0;
+ transform: scaleX(0.75);
+ transition:
+ opacity 0.2s,
+ transform 0.2s;
+}
+.insight-filters button.active::after {
+ opacity: 1;
+ transform: scaleX(1);
}
.article-results {
- margin-top: 40px;
+ margin-top: 28px;
}
.article-grid {
display: grid;
- grid-template-columns: repeat(2, 1fr);
- gap: 28px;
+ grid-template-columns: 1fr;
+ gap: 20px;
+ width: min(100%, 1180px);
+ margin: 0 auto;
}
.article-grid article {
display: grid;
- grid-template-columns: 0.85fr 1.15fr;
- min-height: 285px;
+ grid-template-columns: minmax(280px, 332px) 1fr;
+ gap: 48px;
+ align-items: center;
+ min-height: 268px;
overflow: hidden;
- border-radius: 14px 4px 14px 4px;
- background: #f3f7fc;
+ padding: 18px 48px 18px 28px;
+ border: 1px solid #edf1f6;
+ border-radius: 18px;
+ background: linear-gradient(100deg, #fff 0%, #fff 72%, #f0f7ff 100%);
+ box-shadow: 0 10px 26px rgba(43, 83, 130, 0.05);
transition:
transform 0.25s,
box-shadow 0.25s,
@@ -537,18 +622,20 @@ function requestWhitepaper(source) {
}
.article-grid article:hover {
background: #fff;
- box-shadow: 0 20px 42px rgba(61, 119, 189, 0.13);
- transform: translateY(-5px);
+ box-shadow: 0 18px 42px rgba(61, 119, 189, 0.12);
+ transform: translateY(-3px);
}
.article-grid article.lead {
- grid-column: 1 / -1;
- grid-template-columns: 1.05fr 0.95fr;
- min-height: 350px;
+ grid-column: auto;
+ grid-template-columns: minmax(280px, 332px) 1fr;
+ min-height: 268px;
}
.article-cover {
position: relative;
- min-height: 100%;
+ height: 232px;
+ min-height: 0;
overflow: hidden;
+ border-radius: 14px;
}
.article-cover img {
width: 100%;
@@ -561,40 +648,64 @@ function requestWhitepaper(source) {
transform: scale(1.04);
}
.article-cover > span {
- position: absolute;
- top: 18px;
- left: 18px;
- padding: 7px 9px;
- border-radius: 3px;
- color: #fff;
- background: rgba(32, 105, 200, 0.82);
- font-size: 9px;
+ display: none;
}
.article-copy {
display: flex;
flex-direction: column;
justify-content: center;
- padding: 28px;
+ min-width: 0;
+ padding: 4px 0;
+}
+.article-grid .article-meta,
+.article-grid .read-link {
+ display: none;
+}
+.article-category {
+ color: #50667f;
+ font-size: 13px;
+ line-height: 1.4;
}
.article-copy h3 {
- margin: 15px 0 0;
- font-size: 20px;
- line-height: 1.45;
+ margin: 12px 0 0;
+ color: #142033;
+ font-size: 24px;
+ font-weight: 500;
+ line-height: 1.38;
}
.article-grid article.lead h3 {
- font-size: 28px;
+ font-size: 24px;
+}
+.article-copy h3 a {
+ color: inherit;
+ text-decoration: none;
}
.article-copy > p {
- margin: 12px 0 0;
- color: #75859a;
- font-size: 11px;
- line-height: 1.75;
+ display: -webkit-box;
+ overflow: hidden;
+ margin: 16px 0 0;
+ color: #435776;
+ font-size: 16px;
+ line-height: 1.68;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 2;
}
-.read-link {
- align-self: flex-start;
- margin-top: 22px;
- padding-bottom: 4px;
- border-bottom: 1px solid #9bc1e9;
+.article-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 10px;
+ margin-top: 24px;
+}
+.article-tags span {
+ min-height: 34px;
+ display: inline-flex;
+ align-items: center;
+ padding: 0 13px;
+ border: 1px solid #d9e5f5;
+ border-radius: 5px;
+ color: #096fff;
+ background: #f7fbff;
+ font-size: 12px;
}
.load-more {
min-width: 150px;
@@ -736,10 +847,13 @@ function requestWhitepaper(source) {
url('/images/lanhu/slices/home-group105-image31@2x.png') center / cover no-repeat;
}
.insights-cta-content {
+ display: grid;
+ justify-items: center;
padding: 74px 0;
text-align: center;
}
.insights-cta-content p {
+ width: 100%;
margin: 0;
color: #237df0;
font-size: 12px;
@@ -850,24 +964,48 @@ function requestWhitepaper(source) {
flex-direction: column;
}
.insight-filters {
+ justify-content: flex-start;
+ gap: 30px;
+ width: 100%;
+ margin-top: 52px;
+ padding-bottom: 4px;
flex-wrap: nowrap;
overflow-x: auto;
}
.insight-filters button {
flex: 0 0 auto;
+ height: 48px;
+ font-size: 18px !important;
}
.article-grid article,
.article-grid article.lead {
grid-template-columns: 1fr;
+ gap: 18px;
+ padding: 14px;
+ border-radius: 16px;
}
.article-cover {
- min-height: 210px;
+ height: auto;
+ min-height: 0;
+ aspect-ratio: 1.43;
}
.article-copy {
- padding: 25px 22px;
+ padding: 0 4px 4px;
}
+ .article-copy h3,
.article-grid article.lead h3 {
- font-size: 22px;
+ font-size: 21px;
+ }
+ .article-copy > p {
+ font-size: 14px;
+ }
+ .article-tags {
+ gap: 8px;
+ margin-top: 18px;
+ }
+ .article-tags span {
+ min-height: 30px;
+ padding: 0 10px;
}
.whitepaper-grid {
grid-template-columns: 1fr;
diff --git a/pages/services.vue b/pages/services.vue
index 1fa85c6..20d2d59 100644
--- a/pages/services.vue
+++ b/pages/services.vue
@@ -37,6 +37,12 @@ const ringModels = [
}
]
+const serviceVisualImages = [
+ '/images/services/brand-exposure-visual.png',
+ '/images/services/lead-conversion-visual.png',
+ '/images/services/omnichannel-visual.png'
+]
+
const services = [
{
id: 'brand-exposure',
@@ -190,11 +196,11 @@ onBeforeUnmount(() => animationContext?.revert())
GEO品效双环持续增长
-
品牌提及+217%
-
- 转化效率+64%
-
-
AI 搜索增长系统正在运行
+
+
+
+
+
@@ -224,7 +230,7 @@ onBeforeUnmount(() => animationContext?.revert())
@@ -279,7 +285,7 @@ onBeforeUnmount(() => animationContext?.revert())
-
服务体系
+
服务体系
三类能力,服务同一个增长目标
@@ -337,7 +343,13 @@ onBeforeUnmount(() => animationContext?.revert())
{{ service.visualTitle }}YUNTU GEO SYSTEM
-
+
![]()
+
{{ service.index }}{{ service.title.split(',')[0] }}
@@ -350,7 +362,10 @@ onBeforeUnmount(() => animationContext?.revert())
>
-
+
{{ service.metric }}{{ service.metricLabel }}
@@ -364,7 +379,7 @@ onBeforeUnmount(() => animationContext?.revert())
@@ -424,7 +439,7 @@ onBeforeUnmount(() => animationContext?.revert())
教育培训行业 · GEO 全链路案例
420 个真实问题,5 个月进入 AI 推荐列表
-
+
围绕家长“找方法、选机构、比课程、看口碑、做决策”的完整路径,搭建问题库、可信内容与持续监测体系。
@@ -460,7 +475,7 @@ onBeforeUnmount(() => animationContext?.revert())
-
从一次真实诊断开始
+
从一次真实诊断开始
你的品牌,应该先解决曝光问题,
还是转化问题?
聊聊行业、现状和目标,我们会给出第一步建议。