|
|
@@ -1,455 +1,120 @@
|
|
|
-import React from 'react'
|
|
|
+import { useEffect, useRef, useState } from 'react'
|
|
|
+import { Link } from 'react-router-dom'
|
|
|
import { Helmet } from 'react-helmet-async'
|
|
|
-import { useLegacyThemePage, usePageContext, withLocale } from '../../shared/pageContext'
|
|
|
-import { MarketingLink } from '../../components/common/MarketingLink'
|
|
|
+import { useLegacyThemePage, usePageContext } from '../../shared/pageContext'
|
|
|
+
|
|
|
+const inviteLinks = [
|
|
|
+ { label: '主页示例', path: '/profile' },
|
|
|
+ { label: '试发型体验', path: '/customer-simulation' },
|
|
|
+ { label: '测试后台', path: '/login' },
|
|
|
+ { label: '申请内测', path: '/beta-apply' },
|
|
|
+]
|
|
|
+
|
|
|
+const inviteMeta = [
|
|
|
+ { label: 'Status', title: '少量名额开放中', body: '我们正在邀请愿意共创测试的发型设计师与沙龙。' },
|
|
|
+ { label: 'For', title: '发型设计师 / 沙龙主理人', body: '适合重视咨询体验、提案转化和长期顾客关系的团队。' },
|
|
|
+ { label: 'Core', title: '预约前可视化提案', body: '让顾客在到店前先看到方向,也让咨询从一开始更具体。' },
|
|
|
+ { label: 'Contact', title: '告诉我们你的场景', body: '测试期间免费使用;正式上线后,内测参与者也会获得折扣价格。' },
|
|
|
+]
|
|
|
|
|
|
export function LandingPage() {
|
|
|
- const { locale, path, copy } = usePageContext()
|
|
|
- const page = copy.marketing
|
|
|
- const [navHome, navAbout, navFeatures, navResults, navSample, navFaq, navContact, navLogin, navDevSpec] =
|
|
|
- page.header.nav
|
|
|
- const faqJsonLd = {
|
|
|
- '@context': 'https://schema.org',
|
|
|
- '@type': 'FAQPage',
|
|
|
- mainEntity: page.faq.map((item) => ({
|
|
|
- '@type': 'Question',
|
|
|
- name: item.q,
|
|
|
- acceptedAnswer: {
|
|
|
- '@type': 'Answer',
|
|
|
- text: item.a,
|
|
|
- },
|
|
|
- })),
|
|
|
+ const { locale, path } = usePageContext()
|
|
|
+ const [menuOpen, setMenuOpen] = useState(false)
|
|
|
+ const pageRef = useRef<HTMLElement>(null)
|
|
|
+ const rafRef = useRef<number | null>(null)
|
|
|
+ useLegacyThemePage({ bodyClassName: 'aitori-invite-body', mobileNavStyle: 'classic' })
|
|
|
+
|
|
|
+ useEffect(() => () => {
|
|
|
+ if (rafRef.current) window.cancelAnimationFrame(rafRef.current)
|
|
|
+ }, [])
|
|
|
+
|
|
|
+ const updateVideoShift = (clientX: number, clientY: number) => {
|
|
|
+ const page = pageRef.current
|
|
|
+ if (!page || window.matchMedia('(prefers-reduced-motion: reduce)').matches || !window.matchMedia('(hover: hover) and (pointer: fine)').matches) return
|
|
|
+ const rect = page.getBoundingClientRect()
|
|
|
+ const x = (clientX - rect.left) / rect.width - 0.5
|
|
|
+ const y = (clientY - rect.top) / rect.height - 0.5
|
|
|
+ if (rafRef.current) window.cancelAnimationFrame(rafRef.current)
|
|
|
+ rafRef.current = window.requestAnimationFrame(() => {
|
|
|
+ page.style.setProperty('--video-shift-x', `${(x * -72).toFixed(2)}px`)
|
|
|
+ page.style.setProperty('--video-shift-y', `${(y * -44).toFixed(2)}px`)
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
- useLegacyThemePage({ bodyClassName: 'custom-cursor', mobileNavStyle: 'classic' })
|
|
|
+ const resetVideoShift = () => {
|
|
|
+ const page = pageRef.current
|
|
|
+ if (!page) return
|
|
|
+ page.style.setProperty('--video-shift-x', '0px')
|
|
|
+ page.style.setProperty('--video-shift-y', '0px')
|
|
|
+ }
|
|
|
|
|
|
return (
|
|
|
<>
|
|
|
<Helmet>
|
|
|
- <html lang={page.htmlLang} />
|
|
|
- <title>{page.title}</title>
|
|
|
- <meta name="description" content={page.description} />
|
|
|
- <meta name="robots" content="index,follow,max-image-preview:large,max-snippet:-1,max-video-preview:-1" />
|
|
|
- <link rel="canonical" href={page.canonical} />
|
|
|
- <script type="application/ld+json">{JSON.stringify(faqJsonLd)}</script>
|
|
|
+ <html lang={locale === 'ja' ? 'ja' : 'zh-CN'} />
|
|
|
+ <title>Aitori Stylist | 发型设计师与沙龙内测招募中</title>
|
|
|
+ <meta name="description" content="Aitori Stylist 正在邀请发型设计师与沙龙参加内测。一起打磨预约前 AI 试发型、公开主页、发型模板和顾客咨询体验。" />
|
|
|
</Helmet>
|
|
|
-
|
|
|
- <div className="cursor-page-inner">
|
|
|
- <div className="circle-cursor circle-cursor-inner"></div>
|
|
|
- <div className="circle-cursor circle-cursor-outer"></div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <header>
|
|
|
- <nav className="navbar navbar-expand-lg header-light bg-transparent disable-fixed" data-header-hover="light">
|
|
|
- <div className="container-fluid">
|
|
|
- <div className="col-auto me-auto">
|
|
|
- <MarketingLink className="navbar-brand" to={path('')}>
|
|
|
- <img src="/images/logo_color.svg" alt="" className="default-logo" />
|
|
|
- <img src="/images/logo_color.svg" alt="" className="alt-logo" />
|
|
|
- <img src="/images/logo_color.svg" alt="" className="mobile-logo" />
|
|
|
- </MarketingLink>
|
|
|
- </div>
|
|
|
- <div className="col-auto menu-order position-static">
|
|
|
- <button
|
|
|
- className="navbar-toggler float-start"
|
|
|
- type="button"
|
|
|
- data-bs-toggle="collapse"
|
|
|
- data-bs-target="#navbarNav"
|
|
|
- aria-controls="navbarNav"
|
|
|
- aria-label="Toggle navigation"
|
|
|
- >
|
|
|
- <span className="navbar-toggler-line"></span>
|
|
|
- <span className="navbar-toggler-line"></span>
|
|
|
- <span className="navbar-toggler-line"></span>
|
|
|
- <span className="navbar-toggler-line"></span>
|
|
|
- </button>
|
|
|
- <div className="collapse navbar-collapse" id="navbarNav">
|
|
|
- <ul className="navbar-nav">
|
|
|
- <li className="nav-item"><a href="#top" className="nav-link">{navHome}</a></li>
|
|
|
- <li className="nav-item"><a href="#about" className="nav-link">{navAbout}</a></li>
|
|
|
- <li className="nav-item"><a href="#features" className="nav-link">{navFeatures}</a></li>
|
|
|
- <li className="nav-item"><a href="#results" className="nav-link">{navResults}</a></li>
|
|
|
- <li className="nav-item"><a href="#sample-site" className="nav-link">{navSample}</a></li>
|
|
|
- <li className="nav-item"><a href="#faq" className="nav-link">{navFaq}</a></li>
|
|
|
- <li className="nav-item"><a href="#contact" className="nav-link">{navContact}</a></li>
|
|
|
- <li className="nav-item"><MarketingLink className="nav-link" to={path('/login')}>{navLogin}</MarketingLink></li>
|
|
|
- {navDevSpec ? <li className="nav-item"><a href="#" className="nav-link">{navDevSpec}</a></li> : null}
|
|
|
- <li className="nav-item dropdown simple-dropdown">
|
|
|
- <a href="#" className="nav-link dropdown-toggle" id="languageDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
|
- {page.header.languageLabel}
|
|
|
- </a>
|
|
|
- <ul className="dropdown-menu" aria-labelledby="languageDropdown">
|
|
|
- {page.header.languageItems.map((item) => (
|
|
|
- <li key={item.label} className={item.locale === locale ? 'active' : undefined}>
|
|
|
- {item.locale ? (
|
|
|
- <MarketingLink
|
|
|
- className="dropdown-item"
|
|
|
- to={withLocale(item.locale)}
|
|
|
- >
|
|
|
- {item.label}
|
|
|
- </MarketingLink>
|
|
|
- ) : (
|
|
|
- <a href={item.href} className="dropdown-item" lang={item.lang}>{item.label}</a>
|
|
|
- )}
|
|
|
- </li>
|
|
|
- ))}
|
|
|
- </ul>
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </nav>
|
|
|
- </header>
|
|
|
-
|
|
|
- <section
|
|
|
- id="top"
|
|
|
- className="p-0 cover-background full-screen ipad-top-space-margin md-h-auto position-relative md-pb-70px"
|
|
|
- style={{ backgroundImage: "url('/images/demo-application-home-banner.jpg')" }}
|
|
|
+ <main
|
|
|
+ ref={pageRef}
|
|
|
+ className={`aitori-invite-page${menuOpen ? ' is-menu-open' : ''}`}
|
|
|
+ onPointerMove={(event) => updateVideoShift(event.clientX, event.clientY)}
|
|
|
+ onPointerLeave={resetVideoShift}
|
|
|
>
|
|
|
- <div className="container h-100 position-relative z-index-9">
|
|
|
- <div className="row align-items-center h-100 justify-content-center">
|
|
|
- <div className="col-xl-6 col-lg-6 col-md-10 text-center text-lg-start md-mb-50px">
|
|
|
- <span className="bg-base-color d-inline-block mb-20px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">
|
|
|
- {page.hero.badge}
|
|
|
- </span>
|
|
|
- <h1 className="fw-700 text-dark-gray ls-minus-2px mb-25px">{page.hero.title}</h1>
|
|
|
- <p className="fs-19 lh-32 mb-20px w-90 lg-w-100">{page.hero.lead}</p>
|
|
|
- <p className="fs-17 lh-30 mb-35px w-85 lg-w-100">{page.hero.sublead}</p>
|
|
|
- <div className="d-flex flex-column flex-sm-row justify-content-center justify-content-lg-start gap-3">
|
|
|
- <a href="#contact" className="btn btn-extra-large btn-rounded btn-dark-gray btn-box-shadow fw-700">{page.hero.primaryCta}</a>
|
|
|
- <a href="#features" className="btn btn-extra-large btn-rounded btn-transparent-light-gray border border-1 border-color-dark-gray fw-700">{page.hero.secondaryCta}</a>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="col-xl-5 col-lg-6 col-md-10">
|
|
|
- <div className="hero-visual">
|
|
|
- <div className="hero-main-card bg-white border-radius-10px box-shadow-quadruple-large p-20px">
|
|
|
- <img src="/images/aitori-stylist-hero-ui.png" alt="Aitori Stylist" className="border-radius-8px w-100" />
|
|
|
- </div>
|
|
|
- <div className="hero-comparison-strip">
|
|
|
- <div className="hero-comparison-card bg-white border-radius-8px box-shadow-extra-large p-10px">
|
|
|
- <img src="/images/aitori-before-photo.png" className="border-radius-6px w-100" alt={page.results.items[0].title} />
|
|
|
- </div>
|
|
|
- <div className="hero-comparison-card bg-white border-radius-8px box-shadow-extra-large p-10px">
|
|
|
- <img src="/images/aitori-simulation-result.png" className="border-radius-6px w-100" alt={page.results.items[1].title} />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section className="half-section pb-0">
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center mb-4">
|
|
|
- <div className="col-lg-8 text-center">
|
|
|
- <span className="fs-19 alt-font d-inline-block text-dark-gray fw-600 ls-minus-05px">{page.highlights.title}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="row row-cols-1 row-cols-lg-4 row-cols-md-2 justify-content-center">
|
|
|
- {page.highlights.items.map((item) => (
|
|
|
- <div key={item.label} className="col md-mb-30px">
|
|
|
- <div className="bg-white border-radius-8px box-shadow-quadruple-large p-30px h-100 text-center">
|
|
|
- <h4 className="text-dark-gray fw-800 mb-10px">{item.value}</h4>
|
|
|
- <p className="mb-0">{item.label}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section id="about" className="position-relative overflow-hidden">
|
|
|
- <div className="container">
|
|
|
- <div className="row align-items-center justify-content-center">
|
|
|
- <div className="col-lg-8 md-mb-40px">
|
|
|
- <span className="bg-base-color d-inline-block mb-20px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.about.badge}</span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px mb-25px">{page.about.title}</h2>
|
|
|
- <p className="mb-20px">{page.about.description}</p>
|
|
|
- <ul className="p-0 m-0 list-style-02 text-dark-gray">
|
|
|
- {page.about.bullets.map((item, index) => (
|
|
|
- <li key={item} className={index < page.about.bullets.length - 1 ? 'pb-10px' : undefined}>
|
|
|
- <i className="feather icon-feather-check text-green me-10px"></i>{item}
|
|
|
- </li>
|
|
|
- ))}
|
|
|
- </ul>
|
|
|
- </div>
|
|
|
- <div className="col-12 mt-5">
|
|
|
- <div className="bg-white border-radius-10px box-shadow-quadruple-large p-25px">
|
|
|
- <div className="row row-cols-1 row-cols-md-3 g-4">
|
|
|
- {page.about.steps.map((item) => (
|
|
|
- <div key={item.title} className="col">
|
|
|
- <div className="about-step-card border-radius-8px bg-floral-white p-20px h-100">
|
|
|
- <img src={item.image} alt={item.alt} className="about-step-image border-radius-6px w-100 mb-15px" />
|
|
|
- <h6 className="text-dark-gray fw-700 mb-10px">{item.title}</h6>
|
|
|
- <p className="mb-0">{item.body}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section className="bg-gradient-very-light-gray">
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center mb-5">
|
|
|
- <div className="col-lg-8 text-center">
|
|
|
- <span className="bg-base-color d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.challenges.badge}</span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px">{page.challenges.title}</h2>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="row row-cols-1 row-cols-lg-2 justify-content-center">
|
|
|
- {page.challenges.items.map((item) => (
|
|
|
- <div key={item.title} className="col md-mb-30px">
|
|
|
- <div className="bg-white border-radius-8px box-shadow-extra-large p-35px h-100">
|
|
|
- <h6 className="text-dark-gray fw-700">{item.title}</h6>
|
|
|
- <p className="mb-0">{item.body}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section>
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center mb-5">
|
|
|
- <div className="col-lg-8 text-center">
|
|
|
- <span className="bg-base-color d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.process.badge}</span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px">{page.process.title}</h2>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="row row-cols-1 row-cols-lg-3 row-cols-md-2 justify-content-center">
|
|
|
- {page.process.items.map((item) => (
|
|
|
- <div key={item.index} className="col md-mb-30px">
|
|
|
- <div className="feature-box bg-white text-start justify-content-start h-100 border-radius-6px p-16 box-shadow-quadruple-large">
|
|
|
- <div className="feature-box-icon mb-25px">
|
|
|
- <span className="bg-linen text-dark-gray fw-700 border-radius-100 d-inline-flex align-items-center justify-content-center w-60px h-60px">{item.index}</span>
|
|
|
- </div>
|
|
|
- <div className="feature-box-content last-paragraph-no-margin">
|
|
|
- <span className="d-inline-block text-dark-gray fw-700 fs-18 mb-10px">{item.title}</span>
|
|
|
- <p>{item.body}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section id="features" className="bg-gradient-very-light-gray">
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center mb-5">
|
|
|
- <div className="col-lg-7 text-center">
|
|
|
- <span className="bg-base-color d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.features.badge}</span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px">{page.features.title}</h2>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="row row-cols-1 row-cols-lg-3 row-cols-md-2 justify-content-center">
|
|
|
- {page.features.items.map((item, index) => (
|
|
|
- <div key={item.title} className={`col ${index < 3 ? 'md-mb-30px' : index < 5 ? 'sm-mb-30px' : ''}`.trim()}>
|
|
|
- <div className="bg-white border-radius-8px box-shadow-extra-large p-30px h-100">
|
|
|
- <h6 className="text-dark-gray fw-700">{item.title}</h6>
|
|
|
- <p className="mb-0">{item.body}</p>
|
|
|
- </div>
|
|
|
+ <video className="aitori-invite-bg" autoPlay muted loop playsInline poster="/images/aitori-stylist-hairstyle-loop-poster.jpg" aria-hidden="true">
|
|
|
+ <source src="/images/aitori-hairstyle-three-style-loop-final-web.mp4" type="video/mp4" />
|
|
|
+ </video>
|
|
|
+ <div className="aitori-invite-shell">
|
|
|
+ <nav className="aitori-invite-nav" aria-label="主导航">
|
|
|
+ <Link className="aitori-invite-logo" to={path('')} aria-label="Aitori Stylist">
|
|
|
+ <img src="/images/logo_color.svg" alt="Aitori Stylist" />
|
|
|
+ </Link>
|
|
|
+ <div className="aitori-invite-links">
|
|
|
+ {inviteLinks.map((item) => <Link key={item.path} to={path(item.path)}>{item.label}</Link>)}
|
|
|
+ </div>
|
|
|
+ <button className="aitori-invite-menu-button" type="button" aria-label="打开菜单" aria-expanded={menuOpen} onClick={() => setMenuOpen(true)}>
|
|
|
+ <i className="feather icon-feather-menu"></i>
|
|
|
+ </button>
|
|
|
+ </nav>
|
|
|
+
|
|
|
+ <div className="aitori-invite-meta">
|
|
|
+ {inviteMeta.map((item) => (
|
|
|
+ <div key={item.label}>
|
|
|
+ <span className="aitori-invite-label">{item.label}</span>
|
|
|
+ <strong>{item.title}</strong>
|
|
|
+ <p>{item.body}</p>
|
|
|
</div>
|
|
|
))}
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section id="results">
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center mb-5">
|
|
|
- <div className="col-lg-8 text-center">
|
|
|
- <span className="bg-base-color d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.results.badge}</span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px">{page.results.title}</h2>
|
|
|
- <p className="w-80 lg-w-100 mx-auto">{page.results.body}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="gallery-box row row-cols-1 row-cols-lg-4 row-cols-md-2 justify-content-center g-4">
|
|
|
- {page.results.items.slice(0, 4).map((item) => (
|
|
|
- <div key={item.title} className="col">
|
|
|
- <div className="results-gallery-card bg-white border-radius-8px box-shadow-extra-large p-15px text-center h-100">
|
|
|
- <a href={item.image} data-group="results-gallery" title={item.title} className="d-block">
|
|
|
- <img src={item.image} alt={item.title} className="border-radius-6px w-100 mb-15px results-gallery-image" />
|
|
|
- </a>
|
|
|
- <span className="fw-700 text-dark-gray d-block">{item.title}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- <div className="col-lg-8 col-md-10">
|
|
|
- <div className="results-gallery-card bg-white border-radius-8px box-shadow-extra-large p-15px text-center h-100">
|
|
|
- <a href={page.results.items[4].image} data-group="results-gallery" title={page.results.items[4].title} className="d-block">
|
|
|
- <img src={page.results.items[4].image} alt={page.results.items[4].title} className="border-radius-6px w-100 mb-15px results-gallery-image results-gallery-image-wide" />
|
|
|
- </a>
|
|
|
- <span className="fw-700 text-dark-gray d-block">{page.results.items[4].title}</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="row justify-content-center mt-5">
|
|
|
- <div className="col-lg-8 text-center">
|
|
|
- <p className="mb-0">{page.results.caption}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section className="bg-floral-white">
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center mb-5">
|
|
|
- <div className="col-lg-7 text-center">
|
|
|
- <span className="bg-base-color d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.values.badge}</span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px">{page.values.title}</h2>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="row row-cols-1 row-cols-lg-5 row-cols-md-2 justify-content-center">
|
|
|
- {page.values.items.map((item) => (
|
|
|
- <div key={item.title} className="col md-mb-30px">
|
|
|
- <div className="bg-white border-radius-8px p-25px h-100 box-shadow-extra-large">
|
|
|
- <h6 className="fw-600 text-dark-gray">{item.title}</h6>
|
|
|
- <p className="mb-0">{item.body}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section>
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center mb-5">
|
|
|
- <div className="col-lg-7 text-center">
|
|
|
- <span className="bg-base-color d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.audiences.badge}</span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px">{page.audiences.title}</h2>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="row row-cols-1 row-cols-lg-3 row-cols-md-2 justify-content-center">
|
|
|
- {page.audiences.items.map((item, index) => (
|
|
|
- <div key={item} className={`col ${index < 3 ? 'md-mb-30px' : index < 5 ? 'sm-mb-30px' : ''}`.trim()}>
|
|
|
- <div className="bg-white border-radius-8px box-shadow-extra-large p-30px h-100">
|
|
|
- <p className="mb-0 fw-600 text-dark-gray">{item}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- ))}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <section id="sample-site" className="bg-gradient-very-light-gray">
|
|
|
- <div className="container">
|
|
|
- <div className="row align-items-center justify-content-center">
|
|
|
- <div className="col-lg-5 col-md-9 md-mb-40px">
|
|
|
- <div className="bg-white border-radius-8px box-shadow-quadruple-large p-15px">
|
|
|
- <img src="/images/stylist-profile/ogawa.jpeg" alt="美发师专用示例主页" className="border-radius-6px w-100" />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div className="col-lg-6 offset-lg-1">
|
|
|
- <span className="bg-base-color d-inline-block mb-20px fw-600 text-white border-radius-30px ps-20px pe-20px fs-12">{page.sample.badge}</span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px mb-25px">{page.sample.title}</h2>
|
|
|
- <p className="fs-18 lh-30 mb-20px">{page.sample.lead}</p>
|
|
|
- <p className="mb-30px">{page.sample.sublead}</p>
|
|
|
- <div className="d-flex flex-column flex-sm-row gap-3">
|
|
|
- <MarketingLink className="btn btn-extra-large btn-rounded btn-base-color btn-box-shadow fw-700" to={path('/profile')}>
|
|
|
- {page.sample.cta}
|
|
|
- </MarketingLink>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
|
|
|
- <section>
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center">
|
|
|
- <div className="col-lg-10">
|
|
|
- <div className="bg-white border-radius-10px p-50px lg-p-35px box-shadow-quadruple-large">
|
|
|
- <div className="row align-items-center">
|
|
|
- <div className="col-md-3 text-center sm-mb-25px">
|
|
|
- <img src="/images/stylist-profile/ogawa.jpeg" className="rounded-circle" alt="美发师 小川泰明" />
|
|
|
- </div>
|
|
|
- <div className="col-md-9 text-center text-md-start">
|
|
|
- <span className="bg-base-color d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.testimonial.badge}</span>
|
|
|
- <p className="fs-20 lh-34 text-dark-gray mb-15px">{page.testimonial.quote}</p>
|
|
|
- <div className="fw-700 text-dark-gray">{page.testimonial.author}</div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
+ <div className="aitori-invite-spacer"></div>
|
|
|
|
|
|
- <section id="faq">
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center mb-5">
|
|
|
- <div className="col-lg-7 text-center">
|
|
|
- <span className="bg-base-color d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">
|
|
|
- {locale === 'ja' ? 'FAQ' : '常见问题'}
|
|
|
- </span>
|
|
|
- <h2 className="fw-700 text-dark-gray ls-minus-1px">{locale === 'ja' ? 'FAQ' : '常见问题'}</h2>
|
|
|
+ <section className="aitori-invite-bottom" aria-labelledby="invite-heading">
|
|
|
+ <div className="aitori-invite-heading">
|
|
|
+ <span className="aitori-invite-kicker">Aitori Stylist Beta</span>
|
|
|
+ <h1 id="invite-heading">你设计的发型,<span>让顾客先用 AI 试试看。</span></h1>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- <div className="row justify-content-center">
|
|
|
- <div className="col-lg-9">
|
|
|
- <div className="accordion accordion-style-02" id="accordion-style-02">
|
|
|
- {page.faq.map((item, index) => {
|
|
|
- const panelId = `accordion-style-02-0${index + 1}`
|
|
|
- const active = index === 0
|
|
|
- return (
|
|
|
- <div key={item.q} className={`accordion-item ${active ? 'active-accordion' : ''}`.trim()}>
|
|
|
- <div className="accordion-header border-bottom border-color-extra-medium-gray">
|
|
|
- <a href="#" data-bs-toggle="collapse" data-bs-target={`#${panelId}`} aria-expanded={active} data-bs-parent="#accordion-style-02">
|
|
|
- <div className="accordion-title mb-0 position-relative text-dark-gray">
|
|
|
- <i className={`feather ${active ? 'icon-feather-minus' : 'icon-feather-plus'}`}></i>
|
|
|
- <span className="fw-600 fs-18">{item.q}</span>
|
|
|
- </div>
|
|
|
- </a>
|
|
|
- </div>
|
|
|
- <div id={panelId} className={`accordion-collapse collapse ${active ? 'show' : ''}`.trim()} data-bs-parent="#accordion-style-02">
|
|
|
- <div className={`accordion-body last-paragraph-no-margin ${index < page.faq.length - 1 ? 'border-bottom border-color-light-medium-gray' : ''}`.trim()}>
|
|
|
- <p>{item.a}</p>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- )
|
|
|
- })}
|
|
|
+ <div className="aitori-invite-side">
|
|
|
+ <p>Aitori Stylist 正在内测。让顾客在预约前用自己的照片尝试你设计的发型,减少不安,提高预约数和客户满意度。测试期间免费,正式上线后内测参与者也会获得折扣价格。</p>
|
|
|
+ <div className="aitori-invite-actions">
|
|
|
+ <Link to={path('/beta-apply')} className="aitori-invite-primary"><i className="feather icon-feather-mail"></i>申请参与测试</Link>
|
|
|
+ <Link to={path('/profile')} className="aitori-invite-secondary">查看设计师主页示例</Link>
|
|
|
</div>
|
|
|
+ <div className="aitori-invite-note"><span>一起测试的内容</span><strong>预约前试发型 · 设计师主页 · 发型模板 · 顾客咨询记录</strong></div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ </section>
|
|
|
</div>
|
|
|
- </section>
|
|
|
|
|
|
- <section id="contact" className="bg-dark-gray">
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center">
|
|
|
- <div className="col-lg-8 text-center">
|
|
|
- <span className="bg-white-transparent-very-light d-inline-block mb-15px fw-600 text-white text-uppercase border-radius-30px ps-20px pe-20px fs-12">{page.contact.badge}</span>
|
|
|
- <h2 className="fw-700 text-white ls-minus-1px mb-20px">{page.contact.title}</h2>
|
|
|
- <p className="text-white opacity-8 fs-18 mb-35px">{page.contact.body}</p>
|
|
|
- <div className="d-flex flex-column flex-sm-row justify-content-center gap-3">
|
|
|
- <a href="#" className="btn btn-extra-large btn-rounded btn-white btn-box-shadow fw-700">{page.contact.primaryCta}</a>
|
|
|
- <a href="#" className="btn btn-extra-large btn-rounded btn-transparent-white-light border border-1 border-color-white fw-700 text-white">{page.contact.secondaryCta}</a>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
+ <div className="aitori-invite-mobile-menu" aria-hidden={!menuOpen}>
|
|
|
+ <div className="aitori-invite-mobile-head">
|
|
|
+ <img src="/images/logo_color.svg" alt="Aitori Stylist" />
|
|
|
+ <button type="button" aria-label="关闭菜单" onClick={() => setMenuOpen(false)}><i className="feather icon-feather-x"></i></button>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </section>
|
|
|
-
|
|
|
- <footer className="p-0 footer-light position-relative">
|
|
|
- <div className="container">
|
|
|
- <div className="row justify-content-center pt-5 pb-5 sm-pt-40px sm-pb-40px">
|
|
|
- <div className="col-12 text-center">
|
|
|
- <img src="/images/logo_color.svg" alt="" className="footer-logo mb-20px" style={{ maxWidth: '160px' }} />
|
|
|
- <div className="fs-16 text-medium-gray">{page.footer}</div>
|
|
|
- </div>
|
|
|
+ <div className="aitori-invite-mobile-links">
|
|
|
+ {inviteLinks.map((item) => <Link key={item.path} to={path(item.path)} onClick={() => setMenuOpen(false)}>{item.label}</Link>)}
|
|
|
</div>
|
|
|
</div>
|
|
|
- </footer>
|
|
|
+ </main>
|
|
|
</>
|
|
|
)
|
|
|
}
|