diff --git a/app.vue b/app.vue new file mode 100644 index 0000000..163a87b --- /dev/null +++ b/app.vue @@ -0,0 +1,10 @@ + + + diff --git a/assets/css/interior-polish.css b/assets/css/interior-polish.css new file mode 100644 index 0000000..6688e9d --- /dev/null +++ b/assets/css/interior-polish.css @@ -0,0 +1,409 @@ +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .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-surface: rgba(255, 255, 255, 0.88); + position: relative; + min-height: 100dvh; + overflow: clip; + color: var(--interior-copy); + background: #f8fbff; + 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, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .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 + ) + :is(h1, h2, h3, h4, strong) { + color: var(--interior-ink); + letter-spacing: 0 !important; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(h1, h2, h3) { + text-wrap: balance; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + p { + text-wrap: pretty; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + main + > section { + scroll-margin-top: 78px; + box-shadow: inset 0 1px 0 rgba(92, 145, 207, 0.055); +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(.section-kicker, .page-eyebrow) { + display: flex; + align-items: center; + gap: 10px; + color: var(--interior-blue); + font-weight: 650; + letter-spacing: 0 !important; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(.section-kicker, .page-eyebrow)::before { + width: 22px; + height: 2px; + flex: 0 0 auto; + content: ''; + background: linear-gradient(90deg, #207bf2, #72cbef); +} + +: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( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(.primary-button, .industry-plan-button, .service-action, .story-action) { + border-radius: 5px !important; + 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; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(button, a):focus-visible { + outline: 3px solid rgba(32, 123, 242, 0.3); + 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; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + img { + image-rendering: auto; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-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, + .baseline-grid article, + .question-grid article, + .phase-list article, + .distribution-map article, + .outcome-grid article, + .related-grid article, + .article-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; +} + +: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; +} + +: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; +} + +.interior-reveal-ready .interior-reveal { + opacity: 0; + transform: translateY(24px); + transition: + opacity 0.72s ease, + transform 0.82s cubic-bezier(0.22, 1, 0.36, 1); +} + +.interior-reveal-ready .interior-reveal.is-revealed { + opacity: 1; + transform: translateY(0); +} + +@media (hover: hover) and (pointer: fine) { + :is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .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( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is( + .stats-row article, + .method-flow article, + .team-capabilities article, + .intro-sequence article, + .proof-stats article, + .decision-factor-list article, + .more-industry-list button, + .snapshot-grid article, + .method-list article, + .baseline-grid article, + .question-grid article, + .phase-list article, + .distribution-map article, + .outcome-grid article, + .related-grid article, + .article-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; + transform: translateY(-5px); + } +} + +@media (max-width: 760px) { + :is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + .page-width { + width: min(100% - 32px, 580px); + } + + :is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + main + > section { + scroll-margin-top: 64px; + } + + .interior-reveal-ready .interior-reveal { + transform: translateY(16px); + } +} + +@media (prefers-reduced-motion: reduce) { + .interior-reveal-ready .interior-reveal { + opacity: 1; + transform: none; + transition: none; + } +} diff --git a/assets/css/main.css b/assets/css/main.css index 894f1f7..57541f0 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -41,91 +41,6 @@ a:focus-visible { width: min(1296px, calc(100% - 48px)); margin: 0 auto; } -.site-header { - height: 57px; - background: rgba(255, 255, 255, 0.96); - position: sticky; - top: 0; - z-index: 20; -} -.header-inner { - height: 100%; - display: flex; - align-items: center; - justify-content: space-between; -} -.brand { - display: block; - width: 190px; -} -.brand img { - display: block; - width: 100%; - height: auto; -} -.desktop-nav { - display: flex; - gap: clamp(18px, 2.25vw, 43px); - align-items: center; - height: 100%; -} -.desktop-nav button { - position: relative; - background: transparent; - color: #555; - font-size: 14px; - white-space: nowrap; -} -.desktop-nav button::after { - position: absolute; - right: 0; - bottom: -8px; - left: 0; - height: 2px; - content: ''; - background: #287cf9; - transform: scaleX(0); - transform-origin: center; - transition: transform 0.24s ease; -} -.desktop-nav button.active, -.desktop-nav button:hover { - color: #287cf9; - font-weight: 700; -} -.desktop-nav button.active::after, -.desktop-nav button:hover::after { - transform: scaleX(1); -} -.nav-chevron { - color: #646464; - margin-left: 6px; - font-size: 16px; - vertical-align: 1px; -} -.mobile-menu-button, -.mobile-navigation { - display: none; -} -.login-button { - height: 31px; - min-width: 70px; - padding: 0 15px; - border-radius: 20px; - background: #087dfb; - color: white; - font-size: 12px; - box-shadow: 0 3px 8px rgba(30, 127, 255, 0.22); - transition: - transform 0.22s ease, - box-shadow 0.22s ease, - background 0.22s ease; -} -.login-button span { - font-size: 8px; - margin-right: 6px; -} - .hero-section { position: relative; height: min(32.2vw, 617px); @@ -185,6 +100,7 @@ a:focus-visible { justify-content: center; border-radius: 5px; font-size: 14px; + text-decoration: none; transition: transform 0.2s, box-shadow 0.2s; @@ -199,8 +115,7 @@ a:focus-visible { box-shadow: 0 11px 20px rgba(25, 106, 255, 0.24); } .primary-button:active, -.outline-button:active, -.login-button:active { +.outline-button:active { transform: translateY(1px) scale(0.98); } .primary-button b { @@ -819,123 +734,8 @@ a:focus-visible { color: #4d4d4d; font-size: 17px; } -.site-footer { - color: #d6dde4; - background: #101d23; -} -.footer-main { - min-height: 222px; - display: grid; - grid-template-columns: 340px 1fr 210px; - align-items: center; - gap: 42px; -} -.footer-main > img { - width: 340px; - background: white; - border-radius: 5px; -} -.footer-links { - display: grid; - grid-template-columns: repeat(3, 1fr); - gap: 23px 45px; -} -.footer-links div { - min-width: 100px; -} -.footer-links b { - display: block; - color: #bbc6ce; - font-size: 15px; - font-weight: 500; -} -.footer-links span { - display: block; - margin-top: 28px; - font-size: 12px; - color: #89969d; -} -.qr { - display: grid; - grid-template-columns: repeat(2, 70px); - gap: 11px; -} -.qr span { - height: 70px; - display: grid; - place-items: center; - color: #111; - background: #fff; - font-size: 52px; -} -.qr small { - grid-column: 1 / -1; - font-size: 12px; - color: #9ca6ac; - white-space: nowrap; -} -.footer-bottom { - height: 59px; - display: grid; - place-items: center; - color: #879298; - background: #252e33; - font-size: 12px; -} -.dialog-mask { - position: fixed; - z-index: 40; - inset: 0; - display: grid; - place-items: center; - background: rgba(10, 25, 41, 0.46); -} -.consult-dialog { - position: relative; - width: min(390px, calc(100% - 40px)); - padding: 32px; - border-radius: 14px; - background: #fff; - box-shadow: 0 24px 60px rgba(7, 50, 100, 0.28); - text-align: center; -} -.consult-dialog h2 { - margin: 0; - font-size: 23px; -} -.consult-dialog p { - margin: 14px 0 24px; - color: #777; - line-height: 1.6; -} -.close { - position: absolute; - top: 8px; - right: 12px; - color: #999; - background: transparent; - font-size: 28px; -} -.toast { - position: fixed; - z-index: 50; - bottom: 24px; - left: 50%; - margin: 0; - transform: translateX(-50%); - padding: 12px 20px; - color: white; - border-radius: 30px; - background: rgba(20, 30, 43, 0.9); - box-shadow: 0 7px 22px rgba(0, 0, 0, 0.2); -} @media (hover: hover) and (pointer: fine) { - .login-button:hover { - background: #056ee2; - box-shadow: 0 7px 16px rgba(30, 127, 255, 0.3); - transform: translateY(-1px); - } .stat-item:hover { background: #fff; box-shadow: 0 18px 34px rgba(59, 125, 233, 0.15); @@ -980,17 +780,6 @@ a:focus-visible { } @media (min-width: 761px) { - .site-header { - transition: - background 0.3s ease, - box-shadow 0.3s ease, - backdrop-filter 0.3s ease; - } - .site-header.scrolled { - background: rgba(255, 255, 255, 0.9); - box-shadow: 0 10px 30px rgba(68, 122, 196, 0.1); - backdrop-filter: blur(18px) saturate(1.16); - } .hero-copy { will-change: transform; } @@ -1057,28 +846,12 @@ a:focus-visible { } @media (max-width: 1050px) { - .desktop-nav { - gap: 14px; - } - .desktop-nav button { - font-size: 12px; - } .hero-copy { margin-left: 3%; } .section-title h2 { font-size: 29px; } - .footer-main { - grid-template-columns: 250px 1fr; - padding: 30px 0; - } - .footer-main > img { - width: 250px; - } - .qr { - display: none; - } } @media (max-width: 760px) { html { @@ -1090,108 +863,8 @@ a:focus-visible { .page-width { width: min(100% - 32px, 560px); } - .site-header { - height: 55px; - box-shadow: 0 1px 0 rgba(31, 92, 165, 0.08); - backdrop-filter: blur(16px); - } - .brand { - width: 148px; - } - .desktop-nav { - display: none; - } - .login-button { - display: none; - } - .mobile-menu-button { - width: 44px; - height: 44px; - display: grid; - place-content: center; - gap: 5px; - margin-left: auto; - padding: 0; - border-radius: 50%; - color: #267cf5; - background: rgba(235, 245, 255, 0.88); - } - .mobile-menu-button .menu-glyph { - display: block; - font-size: 23px; - line-height: 1; - transform: translateY(-1px); - } - .mobile-menu-button.open .menu-glyph { - font-size: 28px; - } - .mobile-navigation { - position: fixed; - z-index: 19; - top: 55px; - right: 0; - bottom: 0; - left: 0; - display: block; - overflow-y: auto; - background: rgba(247, 251, 255, 0.97); - backdrop-filter: blur(20px); - } - .mobile-navigation-inner { - display: grid; - gap: 0; - padding-top: 20px; - padding-bottom: max(30px, env(safe-area-inset-bottom)); - } - .mobile-navigation-inner > button { - min-height: 58px; - display: flex; - align-items: center; - justify-content: space-between; - padding: 0 4px; - color: #46505e; - border-bottom: 1px solid rgba(33, 106, 198, 0.1); - background: transparent; - font-size: 16px; - text-align: left; - } - .mobile-navigation-inner > button.active { - color: #1478fb; - font-weight: 700; - } - .mobile-navigation-inner > button b { - color: #78aaf0; - font-size: 18px; - font-weight: 400; - } - .mobile-navigation-inner .mobile-consult-button { - min-height: 50px; - justify-content: center; - gap: 10px; - margin-top: 24px; - padding: 0 20px; - color: #fff; - border: 0; - border-radius: 7px; - background: linear-gradient(100deg, #453cff, #00adf6); - box-shadow: 0 12px 24px rgba(25, 106, 255, 0.2); - } - .mobile-navigation-inner .mobile-consult-button b { - color: inherit; - } - .mobile-nav-enter-active, - .mobile-nav-leave-active { - transition: - opacity 0.25s ease, - transform 0.3s cubic-bezier(0.22, 1, 0.36, 1); - } - .mobile-nav-enter-from, - .mobile-nav-leave-to { - opacity: 0; - transform: translateY(-12px); - } .hero-section { - height: min(720px, calc(100svh - 55px)); + height: min(720px, calc(100svh - 58px)); min-height: 570px; } .hero-art { @@ -1442,44 +1115,6 @@ a:focus-visible { .cta-content h2 br { display: none; } - .footer-main { - grid-template-columns: 1fr; - gap: 26px; - padding: 38px 0 34px; - } - .footer-main > img { - width: 240px; - } - .footer-links { - grid-template-columns: repeat(2, 1fr); - gap: 24px 18px; - } - .footer-links span { - margin-top: 8px; - } - .footer-bottom { - height: auto; - min-height: 59px; - padding: 14px 16px; - text-align: center; - font-size: 10px; - line-height: 1.6; - } - .consult-dialog { - width: calc(100% - 28px); - padding: 30px 22px 24px; - border-radius: 16px; - } - .consult-dialog .primary-button { - width: 100%; - } - .toast { - right: 16px; - bottom: calc(16px + env(safe-area-inset-bottom)); - left: 16px; - transform: none; - text-align: center; - } } @media (max-width: 390px) { @@ -1506,7 +1141,387 @@ a:focus-visible { width: calc(100vw - 12px); margin-right: -12px; } - .footer-main > img { - width: min(240px, 100%); +} + +/* Inner-page readability and layout system. The homepage intentionally stays unchanged. */ +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page +) { + --inner-ink: #2f4056; + --inner-copy: #52657d; + --inner-muted: #667a91; + color: var(--inner-ink); + text-rendering: optimizeLegibility; +} + +@media (min-width: 1180px) { + :is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + .page-width { + width: min(1400px, calc(100% - 80px)); + } +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(.page-eyebrow, .section-kicker) { + color: #286dae !important; + font-size: 14px !important; + font-weight: 700 !important; + letter-spacing: 0.08em !important; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(.primary-button, .outline-button) { + gap: 8px; + min-height: 46px; + font-size: 15px !important; + font-weight: 600; +} + +:is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(.primary-button, .outline-button, button, a) + .app-icon { + width: 1.05em; + height: 1.05em; +} + +/* Keep long-form section headings visually anchored instead of centering every block. */ +:is(.advantages-page, .case-detail-page) .center-heading, +.solutions-page :is(.model-heading, .process-heading, .service-system-heading), +.cases-page .cases-library-heading, +.insights-page .library-heading { + max-width: 860px !important; + margin-right: 0 !important; + margin-left: 0 !important; + text-align: left !important; +} + +/* About */ +.about-page + :is( + .story-content p, + .change-step p, + .change-question, + .method-flow p, + .timeline-list li, + .team-capabilities p + ) { + color: var(--inner-copy) !important; + font-size: 14px !important; + line-height: 1.75 !important; +} +.about-page + :is( + .contact-details dt, + .contact-qr small, + .team-capabilities span, + .method-marker, + .change-principles span + ) { + color: var(--inner-muted) !important; + font-size: 12px !important; +} +.about-page :is(.contact-details dd, .contact-qr strong, .stats-row p, .hero-status) { + color: var(--inner-copy) !important; + font-size: 14px !important; +} + +/* Advantages */ +.advantages-page :is(.hero-advantage-links button, .story-action, .proof-layout header > a) { + font-size: 14px !important; +} +.advantages-page + :is( + .story-problem p, + .story-capability p, + .advantage-story-copy li, + .advantage-story-copy blockquote, + .comparison-table-wrap th, + .comparison-table-wrap td, + .value-added-copy > span, + .proof-stats p + ) { + color: var(--inner-copy) !important; + font-size: 14px !important; + line-height: 1.7 !important; +} +.advantages-page + :is(.story-problem strong, .story-capability strong, .story-actions-title, .story-index) { + color: #476888 !important; + font-size: 13px !important; +} +.advantages-page :is(.value-added-copy > p, .value-added-copy li, .proof-stats span) { + color: var(--inner-muted) !important; + font-size: 12px !important; +} +.advantages-page .comparison-table-wrap thead th { + font-size: 13px !important; +} + +/* Services */ +.services-page + :is( + .model-explanation li, + .pain-note p, + .service-details strong, + .service-details li, + .process-timeline p, + .industry-list p, + .proof-summary li + ) { + color: var(--inner-copy) !important; + font-size: 14px !important; + line-height: 1.72 !important; +} +.services-page + :is( + .hero-badges, + .journey-number, + .service-index, + .service-action, + .industry-list strong, + .proof-tag + ) { + font-size: 14px !important; +} +.services-page + :is( + .model-explanation header span, + .visual-topline, + .step-marker span, + .industry-list > article > span, + .proof-data span + ) { + color: var(--inner-muted) !important; + font-size: 12px !important; +} + +/* Solutions */ +.solutions-page + :is(.hero-industry-links button, .industry-sticky-nav button, .industry-plan-button) { + font-size: 14px !important; +} +.solutions-page + :is(.decision-factor-list p, .strategy-copy, .industry-strategy li, .compliance-note) { + color: var(--inner-copy) !important; + font-size: 14px !important; + line-height: 1.72 !important; +} +.solutions-page + :is( + .decision-factor-list > article > span, + .strategy-label, + .actions-title, + .industry-visual-header + ) { + color: var(--inner-muted) !important; + font-size: 12px !important; +} +.solutions-page .industry-tags span { + color: #3f6286 !important; + font-size: 12px !important; +} + +/* Case library */ +.cases-page :is(.case-filters button, .featured-case-copy > a, .snapshot-copy button) { + font-size: 14px !important; +} +.cases-page + :is(.featured-summary, .snapshot-copy > p, .case-empty > p:nth-of-type(2), .method-list p) { + color: var(--inner-copy) !important; + font-size: 14px !important; + line-height: 1.72 !important; +} +.cases-page :is(.featured-case-copy > p, .snapshot-heading > span, .method-list span) { + color: var(--inner-muted) !important; + font-size: 12px !important; +} +.cases-page .case-filters { + justify-content: flex-start !important; +} + +/* Case detail */ +.case-detail-page .breadcrumb { + color: var(--inner-muted) !important; + font-size: 13px !important; +} +.case-detail-page + :is( + .objective-box > strong, + .objective-box li, + .baseline-grid p, + .question-grid p, + .question-grid strong, + .phase-list p, + .distribution-map article p, + .result-table-wrap th, + .result-table-wrap td, + .outcome-grid p + ) { + color: var(--inner-copy) !important; + font-size: 14px !important; + line-height: 1.72 !important; +} +.case-detail-page + :is( + .case-meta span, + .baseline-grid span, + .baseline-conclusion span, + .subsection-copy > p, + .phase-list > article > span, + .distribution-map article > span, + .summary-quote > span, + .related-grid span + ) { + color: var(--inner-muted) !important; + font-size: 12px !important; +} +.case-detail-page .result-table-wrap thead th { + font-size: 13px !important; +} + +/* Insight library */ +.insights-page + :is( + .hero-actions > button, + .featured-footer a, + .read-link, + .insight-filters button, + .load-more, + .whitepaper-grid > button + ) { + font-size: 14px !important; +} +.insights-page + :is( + .featured-copy > p, + .article-copy > p, + .insight-empty p, + .whitepaper-copy p, + .whitepaper-copy span + ) { + color: var(--inner-copy) !important; + font-size: 14px !important; + line-height: 1.72 !important; +} +.insights-page :is(.article-meta, .featured-footer > span) { + color: var(--inner-muted) !important; + font-size: 12px !important; +} +.insights-page .insight-filters { + justify-content: flex-start !important; +} + +/* Article detail */ +.article-page .breadcrumbs { + color: var(--inner-muted) !important; + font-size: 12px !important; +} +.article-page + :is( + .article-heading > p, + .article-byline, + .article-aside > a, + .article-aside button, + .section-number, + .article-pagination span, + .related-section header p + ) { + font-size: 13px !important; +} +.article-page + :is(.comparison-head, .comparison-row, .draft-note p, .inline-cta button, .article-aside strong) { + color: var(--inner-copy) !important; + font-size: 14px !important; + line-height: 1.65 !important; +} +.article-page .article-content { + max-width: 760px; +} + +@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; + } + + :is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + .page-width { + width: calc(100vw - 32px); + max-width: 620px; + } + + :is( + .about-page, + .advantages-page, + .services-page, + .solutions-page, + .cases-page, + .case-detail-page, + .insights-page, + .article-page + ) + :is(.page-eyebrow, .section-kicker) { + font-size: 13px !important; } } diff --git a/components/AppIcon.vue b/components/AppIcon.vue new file mode 100644 index 0000000..ef0d75d --- /dev/null +++ b/components/AppIcon.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/components/ConsultationModal.vue b/components/ConsultationModal.vue new file mode 100644 index 0000000..37f41eb --- /dev/null +++ b/components/ConsultationModal.vue @@ -0,0 +1,485 @@ + + + + + diff --git a/components/InteriorPageTools.vue b/components/InteriorPageTools.vue new file mode 100644 index 0000000..509bcdd --- /dev/null +++ b/components/InteriorPageTools.vue @@ -0,0 +1,177 @@ + + + + + diff --git a/components/site/SiteFooter.vue b/components/site/SiteFooter.vue new file mode 100644 index 0000000..93dc42f --- /dev/null +++ b/components/site/SiteFooter.vue @@ -0,0 +1,251 @@ + + + + + diff --git a/components/site/SiteHeader.vue b/components/site/SiteHeader.vue new file mode 100644 index 0000000..a18ea88 --- /dev/null +++ b/components/site/SiteHeader.vue @@ -0,0 +1,328 @@ + + + + + diff --git a/composables/useConsultation.js b/composables/useConsultation.js new file mode 100644 index 0000000..02ee60f --- /dev/null +++ b/composables/useConsultation.js @@ -0,0 +1,40 @@ +export function useConsultation() { + const isOpen = useState('consultation-open', () => false) + const context = useState('consultation-context', () => ({ + title: '预约免费 GEO 诊断', + source: '全站咨询入口', + industry: '' + })) + const form = useState('consultation-form', () => ({ + name: '', + company: '', + contact: '', + industry: '', + need: '', + message: '', + consent: false + })) + + function openConsultation(payload = {}) { + context.value = { + title: payload.title || '预约免费 GEO 诊断', + source: payload.source || '全站咨询入口', + industry: payload.industry || '' + } + + if (payload.industry) form.value.industry = payload.industry + isOpen.value = true + } + + function closeConsultation() { + isOpen.value = false + } + + return { + isOpen, + context, + form, + openConsultation, + closeConsultation + } +} diff --git a/data/cases.js b/data/cases.js new file mode 100644 index 0000000..e416d25 --- /dev/null +++ b/data/cases.js @@ -0,0 +1,138 @@ +export const caseCategories = ['全部', '企业服务', '教育培训', '本地生活', '医疗健康', '电商零售'] + +export const featuredCase = { + slug: 'k12-geo-growth', + industry: '教育培训', + client: '某 K12 全科在线教育品牌', + title: '420 个真实问题,5 个月进入 AI 推荐列表', + summary: + '围绕家长在 AI 平台中的真实提问场景,完成问题库搭建、内容体系建设、可信信源分发与持续效果监测。', + duration: '5 个月', + cover: '/images/lanhu/slices/home-group92-image17@2x.png', + metrics: [ + ['11% → 88%', '核心问题覆盖率'], + ['+215%', '官网 AI 来源流量'], + ['+190%', '精准学员咨询量'] + ] +} + +export const resultSnapshots = [ + { + industry: '企业服务', + client: '某 B2B 企业服务客户', + title: '从行业问题切入,让品牌提前进入采购比选', + metric: '+320%', + metricLabel: 'AI 搜索全域曝光', + secondary: '月精准线索新增 80+', + cover: '/images/lanhu/slices/home-group90-image15@2x.png' + }, + { + industry: '本地生活', + client: '某区域本地生活品牌', + title: '占住同城搜索入口,缩短从看到到到店', + metric: '95%', + metricLabel: '品牌词搜索覆盖率', + secondary: '到店咨询量提升 170%', + cover: '/images/lanhu/slices/home-group91-image16@2x.png' + }, + { + industry: '教育培训', + client: '某职业教育机构', + title: '用长尾问题覆盖课程比较与口碑验证', + metric: '1200+', + metricLabel: '长尾关键词布局', + secondary: '有效线索成本降低 45%', + cover: '/images/lanhu/slices/home-group93-image18@2x.png' + }, + { + industry: '电商零售', + client: '某新消费零售品牌', + title: '串起种草、主动搜索与店铺承接', + metric: '3 万+', + metricLabel: '内容资产沉淀', + secondary: '自然流量占比提升至 60%', + cover: '/images/lanhu/slices/home-group94-image20@2x.png' + } +] + +export const k12CaseDetail = { + ...featuredCase, + description: + '某 K12 全科在线教育品牌于 2025 年开展 GEO 全链路优化。项目在合规框架下,将品牌推进家长的 AI 选型、课程比较与口碑验证场景。', + background: [ + '该客户为国内某初高中全科培优在线教育品牌,具备自研教研体系、全职教师团队,并覆盖同步辅导、升学冲刺和专项提分等课程产品。', + '品牌已有较好的用户基础,但信息流与竞价渠道成本持续走高,同时 K12 行业监管趋严,营销内容必须更加审慎、真实与合规。', + '越来越多家长会先向 AI 询问学科提分方法、线上辅导机构选择和初三冲刺课程,再进一步比较机构、课程与口碑。项目初期,品牌在核心推荐问题中的出现率较低,师资和课程优势也没有被完整呈现。' + ], + objectives: [ + '在合规前提下提升品牌在主流 AI 平台中的认知与提及率', + '进入家长的机构选型、课程比较和口碑验证场景', + '把 AI 搜索需求与官网课程页、咨询入口稳定连接' + ], + baseline: [ + ['核心推荐问题', '品牌精准提及率约 11%'], + ['多平台表现', '字节系、百度系等平台整体提及率约 15%'], + ['推荐排序', '首推率为 0,前三推荐率不足 8%'], + ['信息完整度', '师资、教研与真实案例信息分散且部分更新滞后'], + ['转化链路', 'AI 搜索需求与官网、课程页和咨询入口缺少稳定承接'] + ], + questionFramework: [ + { + title: '精准选型类', + content: '机构推荐、课程对比、价格区间、适合人群与报名咨询。', + goal: '承接高意向用户,提高品牌进入推荐列表的概率。' + }, + { + title: '长尾场景类', + content: '学科提分方法、年级规划、备考节奏与常见学习误区。', + goal: '扩大前置需求覆盖,让品牌进入用户早期认知。' + }, + { + title: '能力证明类', + content: '师资背景、教研体系、课程结构、教学服务与办学成果。', + goal: '建立完整、专业且可信的品牌认知。' + }, + { + title: '口碑验证类', + content: '学员案例、家长评价、服务体验与课程反馈。', + goal: '降低家长决策顾虑,强化咨询和报名信心。' + } + ], + phases: [ + { + number: '01', + title: '先建立基础可见性与场景认知', + text: '围绕学习方法、备考规划和提分误区等泛需求主题,输出知识科普与问题解答,让品牌在家长搜索学习问题时稳定出现。' + }, + { + number: '02', + title: '再强化决策信任与推荐优先级', + text: '围绕师资、教研、课程体系、服务流程与真实案例补充高信任内容,并用外部权威信源增加 AI 引用依据。' + } + ], + distribution: [ + ['权威层', '教育类媒体、行业垂直平台', '补充品牌和课程体系的第三方公信力'], + ['讨论层', '教育创作者、家长社区、知识问答平台', '形成贴近真实用户场景的口碑内容'], + ['平台层', '官网、小程序、课程页与咨询入口', '承接 AI 搜索带来的访问和咨询需求'] + ], + resultTable: [ + ['核心问题覆盖率', '11%', '88%', '品牌在核心家长问题中的稳定出现能力明显提升'], + ['核心推荐问题前三率', '不足 8%', '76%', '多个细分学科场景进入前三推荐'], + ['能力类问题覆盖率', '基础薄弱', '95%', '师资、教研与课程体系被更完整呈现'], + ['口碑类问题覆盖率', '基础薄弱', '90%', '学员案例与家长评价类内容形成补充'], + ['官网 AI 来源流量', '基线值', '+215%', 'AI 搜索带来的站点访问明显提升'], + ['精准学员咨询量', '基线值', '+190%', '咨询增长与 GEO 覆盖率提升呈现较强相关性'], + ['线索有效率', '传统信息流约 28%', 'AI 渠道约 65%', 'AI 搜索用户的决策意图更明确'], + ['线上获客成本', '基线值', '-38%', '获客结构得到优化'] + ], + outcomes: [ + ['210+ 篇', '累计产出合规内容'], + ['15 类', '覆盖媒体、社区与知识平台渠道'], + ['第 4 个月', '客户启动年度续约沟通'], + ['新增需求', '小学段课程 GEO 推广进入沟通'] + ] +} + +export function getCaseBySlug(slug) { + return slug === k12CaseDetail.slug ? k12CaseDetail : null +} diff --git a/data/insights.js b/data/insights.js new file mode 100644 index 0000000..5e58850 --- /dev/null +++ b/data/insights.js @@ -0,0 +1,114 @@ +export const insightCategories = [ + '全部', + '最新文章', + '行业动态', + 'GEO 行业知识', + '实战复盘', + '行业白皮书' +] + +export const insights = [ + { + slug: 'what-is-geo', + category: 'GEO 行业知识', + title: 'GEO 是什么:从搜索排名到 AI 推荐的增长逻辑', + excerpt: + '当用户不再逐页浏览搜索结果,而是直接向 AI 提问,品牌需要重新理解内容、信源与推荐之间的关系。', + date: '2026-07-12', + readingTime: '8 分钟', + views: '2,438', + cover: '/images/lanhu/slices/home-group95-image21@2x.png', + featured: true, + lead: 'GEO(生成式引擎优化)不是给传统 SEO 换一个名字。它关注的是:当用户向 AI 描述需求时,品牌能否被准确理解、被可信来源支持,并进入最终答案。', + sections: [ + { + title: '用户的搜索动作正在发生什么变化', + paragraphs: [ + '传统搜索通常从关键词开始。用户打开多个网页,比较产品、价格、口碑与服务,再自行形成判断。AI 搜索把大量比较工作压缩进一次对话:用户描述场景,平台整理信息并直接给出总结或推荐。', + '这意味着品牌竞争不再只发生在结果页的排名位置,也发生在 AI 对品牌的认知结构中。企业公开信息是否完整、不同平台的说法是否一致、第三方信源是否足够可信,都会影响品牌是否进入回答。' + ] + }, + { + title: 'GEO 与 SEO 的关注点并不相同', + paragraphs: [ + 'SEO 重点解决网页能否被搜索引擎抓取、理解并获得较好的自然排名。GEO 更进一步,关注内容能否成为生成式答案中的有效依据。两者并不冲突:清晰的网站结构仍然重要,但仅有站内页面已经不足以支撑完整的 AI 品牌认知。' + ], + comparison: [ + ['关注对象', '搜索结果页与网页排名', 'AI 回答中的理解、提及与推荐'], + ['内容范围', '以官网和可索引页面为主', '官网、媒体、社区、问答与真实讨论'], + ['衡量方式', '排名、点击率、自然流量', '问题覆盖率、提及率、推荐率与咨询转化'], + ['长期资产', '关键词与站点权重', '跨平台一致的品牌事实与可信信源'] + ] + }, + { + title: '一套可执行的 GEO 工作从哪里开始', + paragraphs: [ + '第一步不是批量生产文章,而是建立问题库。企业需要知道用户在认知、比较、验证和决策阶段分别会问什么,再检查品牌目前在这些问题中的真实表现。', + '完成基线诊断后,再围绕业务事实建设内容,匹配官网、权威媒体、垂直平台和真实讨论场景,并持续观察不同 AI 平台的引用与推荐变化。最终,所有曝光都应该连接到可以承接需求的页面和咨询入口。' + ] + }, + { + title: '判断 GEO 是否有效,不能只看曝光', + paragraphs: [ + '有效的 GEO 指标应覆盖三个层次:品牌是否进入核心问题、是否被准确描述和优先推荐,以及这些认知是否带来网站访问、咨询和有效线索。只有把内容表现与业务结果放在同一条链路里,优化才不会停留在表面。' + ] + } + ] + }, + { + slug: 'ai-search-decision-path', + category: '行业动态', + title: 'AI 搜索如何改写用户的品牌决策路径', + excerpt: '从“找网页”到“要答案”,企业需要在认知、比较和验证三个阶段重新安排信息。', + date: '2026-07-08', + readingTime: '6 分钟', + views: '1,726', + cover: '/images/lanhu/slices/home-group90-image15@2x.png' + }, + { + slug: 'geo-question-library', + category: '实战复盘', + title: '问题库不是关键词表:如何覆盖一条完整决策旅程', + excerpt: '把零散关键词整理成认知、比较、能力证明与口碑验证四类真实问题。', + date: '2026-07-03', + readingTime: '7 分钟', + views: '1,394', + cover: '/images/lanhu/slices/home-group92-image17@2x.png' + }, + { + slug: 'credible-source-matrix', + category: 'GEO 行业知识', + title: '可信信源矩阵:为什么只更新官网还不够', + excerpt: 'AI 对品牌的判断来自多个公开来源,一致、真实、可验证的信息比单点声量更重要。', + date: '2026-06-27', + readingTime: '5 分钟', + views: '968', + cover: '/images/lanhu/slices/home-group91-image16@2x.png' + }, + { + slug: 'geo-metrics', + category: '最新文章', + title: '除了提及率,GEO 项目还应该看哪些指标', + excerpt: '从问题覆盖、推荐顺序到官网流量和线索质量,建立一套能连接业务结果的指标体系。', + date: '2026-06-19', + readingTime: '9 分钟', + views: '1,185', + cover: '/images/lanhu/slices/home-group93-image18@2x.png' + }, + { + slug: 'geo-industry-report-2026', + category: '行业白皮书', + title: '2026 AI 搜索与品牌增长观察', + excerpt: '梳理用户搜索行为、企业内容建设和 GEO 评估框架的关键变化。', + date: '2026-06-10', + readingTime: '白皮书', + views: '836', + cover: '/images/lanhu/slices/home-group95-image21@2x.png' + } +] + +export const featuredInsight = insights.find((item) => item.featured) + +export function getInsightBySlug(slug) { + return insights.find((item) => item.slug === slug) || null +} diff --git a/nuxt.config.js b/nuxt.config.js index 014e5aa..6eefaca 100644 --- a/nuxt.config.js +++ b/nuxt.config.js @@ -3,7 +3,7 @@ export default defineNuxtConfig({ compatibilityVersion: 3 }, modules: ['@nuxtjs/tailwindcss'], - css: ['~/assets/css/main.css'], + css: ['~/assets/css/main.css', '~/assets/css/interior-polish.css'], vite: { server: { watch: { diff --git a/package-lock.json b/package-lock.json index 3d2b243..52d24c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6,6 +6,7 @@ "": { "name": "damabang-geo-official-site", "dependencies": { + "@element-plus/icons-vue": "^2.3.2", "@nuxtjs/tailwindcss": "^6.14.0", "gsap": "^3.15.0", "nuxt": "^3.17.0" @@ -596,6 +597,15 @@ "integrity": "sha512-/B8YJGPzaYq1NbsQmwgP8EZqg40NpTw4ZB3suuI0TplbxKHeK94jeaawLmVhCv+YwUnOpiWEz9U6SeThku/8JQ==", "license": "MIT" }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, "node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmmirror.com/@emnapi/core/-/core-1.10.0.tgz", diff --git a/package.json b/package.json index 442986e..141f1cc 100644 --- a/package.json +++ b/package.json @@ -10,6 +10,7 @@ "format:check": "prettier --check ." }, "dependencies": { + "@element-plus/icons-vue": "^2.3.2", "@nuxtjs/tailwindcss": "^6.14.0", "gsap": "^3.15.0", "nuxt": "^3.17.0" diff --git a/pages/about.vue b/pages/about.vue new file mode 100644 index 0000000..ef55272 --- /dev/null +++ b/pages/about.vue @@ -0,0 +1,1303 @@ + + + + + diff --git a/pages/advantages.vue b/pages/advantages.vue new file mode 100644 index 0000000..f63f75b --- /dev/null +++ b/pages/advantages.vue @@ -0,0 +1,1508 @@ + + + + + diff --git a/pages/cases/[slug].vue b/pages/cases/[slug].vue new file mode 100644 index 0000000..c68aa96 --- /dev/null +++ b/pages/cases/[slug].vue @@ -0,0 +1,1237 @@ + + + + + diff --git a/pages/cases/index.vue b/pages/cases/index.vue new file mode 100644 index 0000000..6f360ab --- /dev/null +++ b/pages/cases/index.vue @@ -0,0 +1,1023 @@ + + + + + diff --git a/pages/index.vue b/pages/index.vue index 287dbca..9467b70 100644 --- a/pages/index.vue +++ b/pages/index.vue @@ -1,26 +1,14 @@