add product site ui refresh

This commit is contained in:
Ermin Zoronjic 2026-04-29 06:33:56 +02:00
parent 5ca7152011
commit 088d01b256
24 changed files with 1907 additions and 2359 deletions

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#eaeaea" viewBox="0 0 256 256"><path d="M224,128a8,8,0,0,1-8,8H59.31l58.35,58.34a8,8,0,0,1-11.32,11.32l-72-72a8,8,0,0,1,0-11.32l72-72a8,8,0,0,1,11.32,11.32L59.31,120H216A8,8,0,0,1,224,128Z"></path></svg>

After

Width:  |  Height:  |  Size: 273 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#eaeaea" viewBox="0 0 256 256"><path d="M216,48H40A16,16,0,0,0,24,64V224a15.84,15.84,0,0,0,9.25,14.5A16.05,16.05,0,0,0,40,240a15.89,15.89,0,0,0,10.25-3.78l.09-.07L83,208H216a16,16,0,0,0,16-16V64A16,16,0,0,0,216,48ZM40,224h0ZM216,192H80a8,8,0,0,0-5.23,1.95L40,224V64H216Z"></path></svg>

After

Width:  |  Height:  |  Size: 355 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32" fill="#eaeaea" viewBox="0 0 256 256"><path d="M205.66,194.34a8,8,0,0,1-11.32,11.32L128,139.31,61.66,205.66a8,8,0,0,1-11.32-11.32L116.69,128,50.34,61.66A8,8,0,0,1,61.66,50.34L128,116.69l66.34-66.35a8,8,0,0,1,11.32,11.32L139.31,128Z"></path></svg>

After

Width:  |  Height:  |  Size: 309 B

View File

@ -24,17 +24,56 @@ main {
min-width: 0;
}
.shell {
width: var(--container-wide);
margin: 0 auto;
padding: 0 0 clamp(2.2rem, 6vw, 5rem);
background: transparent;
border: 0;
box-shadow: none;
}
.page,
.detail-page,
.discovery-page,
.about-page,
.support-page,
.small-page {
.small-page,
.impressum-page,
.datenschutz-page {
isolation: isolate;
}
.detail-page .navbar--light,
.discovery-page .navbar--light,
.about-page .navbar--light,
.support-page .navbar--light,
.small-page .navbar--light,
.impressum-page .navbar--light,
.datenschutz-page .navbar--light {
position: fixed;
top: clamp(0.75rem, 2.1vw, 1.4rem);
right: 0;
left: 0;
z-index: 998;
margin-bottom: 0;
padding-top: 0;
pointer-events: none;
}
.detail-page .navbar--light .nav-pill,
.discovery-page .navbar--light .nav-pill,
.about-page .navbar--light .nav-pill,
.support-page .navbar--light .nav-pill,
.small-page .navbar--light .nav-pill,
.impressum-page .navbar--light .nav-pill,
.datenschutz-page .navbar--light .nav-pill {
pointer-events: auto;
}
.navbar--light .nav-pill,
.navbar--light .nav-link,
.shell,
[class*="-page"],
[class*="-shell"],
[class*="-card"],

View File

@ -5,25 +5,6 @@
background: var(--theme-bg);
}
.detail-page .navbar--light {
position: fixed;
top: clamp(0.75rem, 2.1vw, 1.4rem);
right: 0;
left: 0;
z-index: 998;
margin-bottom: 0;
padding-top: 0;
}
.detail-shell {
width: var(--container-wide);
margin: 0 auto;
padding: 0 0 clamp(2.2rem, 6vw, 5rem);
background: transparent;
border: 0;
box-shadow: none;
}
.detail-topbar {
position: fixed;
top: clamp(0.75rem, 2.1vw, 1.4rem);
@ -63,7 +44,13 @@
}
.back-link-arrow {
line-height: 1;
display: inline-block;
width: 1rem;
height: 1rem;
flex: 0 0 auto;
background: currentColor;
-webkit-mask: url("/icon-arrow-left.svg") center / contain no-repeat;
mask: url("/icon-arrow-left.svg") center / contain no-repeat;
}
.detail-topbar-meta {
@ -105,7 +92,7 @@
grid-template-columns: repeat(12, minmax(0, 1fr));
gap: var(--gap-md);
align-items: center;
min-height: 100svh;
min-height: clamp(680px, 100svh, 940px);
padding-block: 0;
border-bottom: 0;
isolation: isolate;
@ -116,13 +103,18 @@
grid-column: 1 / -1;
grid-row: 1;
display: grid;
place-items: center;
grid-template-columns: repeat(12, minmax(0, 1fr));
align-items: center;
min-height: inherit;
min-width: 0;
}
.product-hero-visual {
position: relative;
grid-column: 4 / 10;
grid-row: 1;
justify-self: center;
align-self: center;
display: grid;
place-items: center;
width: 100%;
@ -140,7 +132,7 @@
position: absolute;
top: clamp(6.5rem, 11vw, 9rem);
left: 0;
z-index: 2;
z-index: 5;
width: min(26vw, 390px);
}
@ -167,7 +159,7 @@
.product-hero-image {
position: relative;
z-index: 1;
width: min(36vw, 600px);
width: min(100%, 600px);
max-height: min(62svh, 700px);
height: auto;
object-fit: contain;
@ -198,7 +190,7 @@
min-height: 44px;
padding: 0;
border: 1px solid var(--theme-border);
background: var(--theme-paper);
background: transparent;
overflow: hidden;
cursor: pointer;
transition:
@ -222,25 +214,26 @@
.thumb-btn img {
width: 100%;
height: 100%;
object-fit: cover;
object-fit: contain;
display: block;
}
.hero-fact-grid {
position: absolute;
left: 0;
top: 50%;
top: auto;
bottom: clamp(4rem, 9svh, 7rem);
z-index: 3;
width: min(22vw, 310px);
display: grid;
grid-template-columns: 1fr;
gap: var(--gap-md);
margin-top: 0;
transform: translateY(-42%);
transform: none;
}
.hero-fact-grid div,
.character-facts div,
.character-facts > div,
.meta-card,
.delivery-grid div {
padding-top: 1rem;
@ -514,6 +507,14 @@
line-height: 1.62;
}
.story-copy .character-facts p {
max-width: none;
margin: 0;
color: var(--theme-text);
font-size: var(--text-base);
line-height: 1.55;
}
.story-visual-panel {
min-height: clamp(360px, 42vw, 620px);
display: flex;
@ -529,21 +530,21 @@
.character-facts {
display: grid;
grid-template-columns: 1fr 1fr;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: var(--gap-sm);
margin-top: clamp(1.4rem, 3vw, 2.4rem);
max-width: 58rem;
}
.character-facts div:last-child {
grid-column: 1 / -1;
.character-facts > div {
min-height: 132px;
}
.story-visual-panel > div {
width: 100%;
}
.story-visual-panel span:first-child {
.story-visual-panel > div > span:first-child {
display: block;
margin-bottom: var(--gap-sm);
color: var(--theme-text-muted);
@ -567,6 +568,8 @@
background: rgba(255, 255, 255, 0.035);
color: var(--theme-text);
font-size: var(--text-sm);
letter-spacing: 0;
text-transform: none;
}
.product-structure-section,
@ -922,10 +925,8 @@
}
.recommendation-heading {
display: flex;
justify-content: space-between;
align-items: end;
gap: var(--gap-lg);
display: block;
max-width: 74rem;
}
.recommendation-grid {
@ -992,7 +993,6 @@
}
@media (max-width: 1180px) {
.product-hero,
.product-story-grid,
.product-meta-section,
.detail-bottom-cta {
@ -1000,33 +1000,44 @@
}
.product-hero {
min-height: auto;
grid-template-columns: minmax(0, 1fr) minmax(18rem, 0.72fr);
align-items: center;
min-height: 100svh;
padding-top: clamp(5.6rem, 9vw, 7.4rem);
padding-bottom: clamp(1rem, 2vw, 1.6rem);
}
.product-media-column,
.product-purchase-panel {
.product-media-column {
grid-column: 1;
grid-row: auto;
grid-row: 1;
}
.product-media-column {
min-height: 0;
display: block;
display: grid;
grid-template-columns: 1fr;
grid-template-rows: auto minmax(0, 1fr) auto auto;
gap: clamp(0.65rem, 1.4vw, 1rem);
align-self: stretch;
place-items: stretch;
}
.product-hero-copy {
position: static;
width: min(100%, 720px);
margin-bottom: var(--gap-md);
margin-bottom: 0;
}
.product-hero-visual {
min-height: clamp(520px, 66vw, 760px);
grid-column: auto;
grid-row: auto;
min-height: 0;
height: min(42svh, 420px);
}
.product-hero-image {
width: min(66vw, 640px);
max-height: none;
width: min(74%, 430px);
max-height: 100%;
}
.product-thumbs,
@ -1041,16 +1052,46 @@
justify-content: center;
}
.thumb-btn {
width: clamp(3.6rem, 6vw, 4.8rem);
height: clamp(3.6rem, 6vw, 4.8rem);
}
.hero-fact-grid {
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: var(--gap-xs);
}
.hero-fact-grid div {
padding-top: 0.75rem;
}
.hero-fact-grid span {
margin-bottom: 0.4rem;
font-size: 0.72rem;
letter-spacing: 0.16em;
}
.hero-fact-grid p {
font-size: var(--text-sm);
line-height: 1.38;
}
.product-purchase-panel {
position: static;
justify-self: center;
width: min(100%, 720px);
grid-column: 2;
grid-row: 1;
position: relative;
justify-self: stretch;
align-self: center;
width: 100%;
max-height: none;
overflow: visible;
gap: var(--gap-xs);
}
.product-hero-copy h1 {
max-width: 12ch;
font-size: clamp(2.4rem, 5.5vw, 4.6rem);
}
.structure-timeline,
@ -1064,13 +1105,8 @@
padding: 0;
}
.detail-shell {
width: var(--container-wide);
padding-inline: 0;
}
.detail-topbar {
top: clamp(4.65rem, 15vw, 5.5rem);
top: clamp(4.35rem, 14vw, 5.05rem);
z-index: 999;
right: clamp(0.75rem, 4vw, 1rem);
left: clamp(0.75rem, 4vw, 1rem);
@ -1083,20 +1119,30 @@
}
.product-hero {
padding-top: clamp(7.6rem, 25vw, 9rem);
grid-template-columns: 1fr;
align-content: start;
gap: clamp(0.5rem, 1.8vw, 0.8rem);
min-height: 100svh;
padding-top: clamp(6.7rem, 20vw, 7.25rem);
padding-bottom: clamp(0.75rem, 2.4vw, 1rem);
}
.product-media-column,
.product-purchase-panel {
grid-column: 1;
grid-row: auto;
}
.product-hero-visual {
min-height: clamp(390px, 102vw, 620px);
height: min(29svh, 250px);
min-height: 198px;
}
.product-hero-image {
width: min(88%, 560px);
width: min(74%, 292px);
}
.hero-fact-grid,
.character-facts,
.size-grid,
.meta-grid,
.delivery-grid,
.comment-spotlight-grid,
@ -1105,6 +1151,99 @@
grid-template-columns: 1fr;
}
.hero-fact-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.hero-fact-grid div:last-child {
grid-column: 1 / -1;
}
.size-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.product-hero-copy span {
margin-bottom: 0.35rem;
font-size: 0.68rem;
letter-spacing: 0.16em;
}
.product-hero-copy h1 {
font-size: clamp(2rem, 10.4vw, 3rem);
line-height: 0.9;
}
.thumb-btn {
width: clamp(2.8rem, 11vw, 3.25rem);
height: clamp(2.8rem, 11vw, 3.25rem);
}
.product-thumbs {
margin-top: -0.6rem;
}
.hero-fact-grid {
gap: 0.45rem;
}
.hero-fact-grid div {
min-width: 0;
padding-top: 0.45rem;
}
.hero-fact-grid span {
margin-bottom: 0.25rem;
font-size: 0.58rem;
letter-spacing: 0.09em;
}
.hero-fact-grid p {
font-size: 0.72rem;
line-height: 1.22;
overflow-wrap: anywhere;
}
.product-purchase-panel {
min-width: 0;
gap: 0.48rem;
}
.purchase-price-row {
display: none;
}
.purchase-price-row strong {
font-size: clamp(1.1rem, 5vw, 1.35rem);
white-space: nowrap;
}
.size-card {
min-height: 62px;
padding: 0.55rem 0.6rem;
}
.size-title {
margin-bottom: 0.25rem;
font-size: 0.76rem;
}
.size-card strong {
margin-bottom: 0;
font-size: 0.95rem;
}
.size-card small,
.purchase-discovery-note {
display: none;
}
.buy-button,
.restock-button {
min-height: 38px;
font-size: 0.72rem;
}
.purchase-discovery-note,
.reviews-heading,
.recommendation-heading {
@ -1122,17 +1261,11 @@
width: min(100%, 24rem);
}
.purchase-discovery-note a,
.buy-button,
.restock-button {
width: 100%;
}
.purchase-price-row {
align-items: flex-start;
flex-direction: column;
}
.review-score-block {
justify-items: start;
}
@ -1148,13 +1281,21 @@
@media (max-width: 480px) {
.product-hero-copy h1 {
font-size: clamp(2.6rem, 15vw, 4rem);
font-size: clamp(1.95rem, 10.2vw, 2.85rem);
}
.hero-fact-grid {
grid-template-columns: 1fr;
}
.product-thumbs {
flex-wrap: wrap;
}
.restock-button {
display: none;
}
.review-detail-row {
grid-template-columns: 1fr;
align-items: start;

View File

@ -530,10 +530,10 @@ function ProductDetailContent({ perfumeSlug }) {
<div className={`detail-page ${isTransitionArriving ? "is-transition-arriving" : ""}`}>
<SharedNavbar variant="light" />
<main className="detail-shell">
<main className="shell">
<div className="detail-topbar" data-product-transition-reveal>
<button className="back-link" type="button" onClick={() => navigate("/")}>
<span className="back-link-arrow"></span>
<span className="back-link-arrow" aria-hidden="true" />
<span>Zurück zur Startseite</span>
</button>

View File

@ -11,11 +11,7 @@
.product-transition__wash {
position: absolute;
inset: 0;
background:
radial-gradient(circle at 50% 50%, rgba(var(--theme-accent-rgb) / 0.16), transparent 32rem),
rgba(12, 12, 12, 0.78);
backdrop-filter: blur(14px) saturate(0.9);
-webkit-backdrop-filter: blur(14px) saturate(0.9);
background: var(--theme-bg);
}
.product-transition__image {
@ -23,6 +19,7 @@
top: 0;
left: 0;
display: block;
max-width: none;
object-fit: contain;
transform-origin: 0 0;
will-change: transform, opacity;

View File

@ -50,12 +50,21 @@ const getStageRect = (sourceRect) => {
};
};
const getTransformForRect = (rect, sourceRect) => ({
x: rect.left,
y: rect.top,
scaleX: rect.width / sourceRect.width,
scaleY: rect.height / sourceRect.height,
});
const getTransformForRect = (rect, sourceRect) => {
const scale = Math.min(
rect.width / sourceRect.width,
rect.height / sourceRect.height
);
const width = sourceRect.width * scale;
const height = sourceRect.height * scale;
return {
x: rect.left + (rect.width - width) / 2,
y: rect.top + (rect.height - height) / 2,
scaleX: scale,
scaleY: scale,
};
};
export function ProductTransitionProvider({ children }) {
const navigate = useNavigate();
@ -171,9 +180,9 @@ export function ProductTransitionProvider({ children }) {
.to(
routeContent,
{
autoAlpha: 0.16,
filter: "blur(10px)",
scale: 0.985,
autoAlpha: 0,
filter: "none",
scale: 1,
duration: 0.62,
ease: "power3.out",
},
@ -277,7 +286,7 @@ export function ProductTransitionProvider({ children }) {
duration: 0.82,
stagger: 0.07,
ease: "power4.out",
clearProps: "transform,opacity,visibility",
clearProps: "transform",
},
">-0.05"
);

View File

@ -278,12 +278,48 @@
/* --- Design System Refinement Start --- */
.chatbot-trigger {
min-height: 48px;
right: var(--page-x);
bottom: var(--page-x);
right: max(0.9rem, env(safe-area-inset-right));
bottom: max(0.9rem, env(safe-area-inset-bottom));
width: 52px;
height: 52px;
min-height: 52px;
min-width: 52px;
padding: 0;
display: inline-grid;
place-items: center;
font-size: 0;
box-shadow: var(--theme-shadow-soft);
}
.chatbot-trigger.is-open {
padding: 0;
}
.chatbot-trigger-icon,
.chatbot-close-icon {
display: block;
width: 1.45rem;
height: 1.45rem;
background: currentColor;
-webkit-mask-position: center;
mask-position: center;
-webkit-mask-repeat: no-repeat;
mask-repeat: no-repeat;
-webkit-mask-size: contain;
mask-size: contain;
}
.chatbot-trigger-icon {
-webkit-mask-image: url("/icon-chat.svg");
mask-image: url("/icon-chat.svg");
}
.chatbot-trigger.is-open .chatbot-trigger-icon,
.chatbot-close-icon {
-webkit-mask-image: url("/icon-x.svg");
mask-image: url("/icon-x.svg");
}
.chatbot-trigger:hover,
.chatbot-trigger:focus-visible {
transform: translateY(-2px);
@ -338,8 +374,8 @@
@media (max-width: 700px) {
.chatbot-trigger {
right: var(--page-x);
bottom: var(--page-x);
right: max(0.75rem, env(safe-area-inset-right));
bottom: max(0.75rem, env(safe-area-inset-bottom));
}
.chatbot-window {

View File

@ -216,7 +216,7 @@ function SupportChatbot() {
onClick={() => setIsOpen((prev) => !prev)}
aria-label={isOpen ? "Chat schliessen" : "Support Chat öffnen"}
>
{isOpen ? "×" : "Support"}
<span className="chatbot-trigger-icon" aria-hidden="true" />
</button>
{isOpen && (
@ -232,7 +232,7 @@ function SupportChatbot() {
onClick={() => setIsOpen(false)}
aria-label="Chat schliessen"
>
×
<span className="chatbot-close-icon" aria-hidden="true" />
</button>
</div>

View File

@ -1,543 +1,121 @@
.about-page {
min-height: 100vh;
padding: 0 0 var(--section-y-sm);
color: var(--theme-text);
padding: 26px 38px 38px;
background:
linear-gradient(to right, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0.1)),
linear-gradient(to bottom, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.45));
}
.about-shell {
background: var(--theme-surface);
border: 1px solid var(--theme-border);
padding: 38px;
radial-gradient(circle at 86% 8%, rgba(var(--theme-accent-rgb) / 0.13), transparent 28rem),
linear-gradient(180deg, var(--theme-bg), color-mix(in srgb, var(--theme-bg) 88%, #000 12%));
}
.about-kicker,
.about-label,
.about-panel-label,
.about-origin-box span,
.about-panel-meta span {
display: block;
font-size: 10px;
letter-spacing: 0.22em;
color: var(--theme-text-muted);
}
.about-hero {
display: grid;
grid-template-columns: minmax(0, 1.35fr) minmax(280px, 0.8fr);
gap: 28px;
align-items: end;
padding-bottom: 36px;
border-bottom: 1px solid var(--theme-border);
}
.about-hero-copy h1 {
margin: 14px 0 18px;
font-size: 68px;
line-height: 0.92;
font-weight: 300;
letter-spacing: 0;
color: var(--theme-text);
}
.about-intro {
max-width: 720px;
margin: 0;
font-size: 18px;
line-height: 1.65;
color: var(--theme-text-muted);
}
.about-hero-panel {
padding: 24px;
background: linear-gradient(
180deg,
rgba(255, 106, 0, 0.08),
rgba(255, 106, 0, 0.03)
);
border: 1px solid rgba(255, 106, 0, 0.18);
}
.about-hero-panel p {
margin: 10px 0 0;
font-size: 16px;
line-height: 1.6;
color: var(--theme-text);
}
.about-panel-meta {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
margin-top: 24px;
padding-top: 20px;
border-top: 1px solid rgba(255, 106, 0, 0.14);
}
.about-panel-meta p,
.about-origin-box p {
margin: 8px 0 0;
font-size: 14px;
line-height: 1.55;
color: var(--theme-text);
}
.about-section {
padding-top: 38px;
}
.about-section--split {
display: grid;
grid-template-columns: minmax(260px, 0.7fr) minmax(0, 1.3fr);
gap: 28px;
align-items: start;
}
.about-section-heading h2,
.about-origin-copy h2,
.about-bottom-copy h2 {
margin: 10px 0 0;
font-size: 42px;
line-height: 0.98;
font-weight: 300;
letter-spacing: 0;
color: var(--theme-text);
}
.about-section-copy {
display: flex;
flex-direction: column;
gap: 18px;
}
.about-section-copy p,
.about-origin-copy p,
.about-bottom-copy p {
margin: 0;
font-size: 16px;
line-height: 1.7;
color: var(--theme-text-muted);
}
.about-quote-block {
margin-top: 38px;
padding: 32px 36px;
background: #1f1f1f;
border-left: 3px solid #ff6a00;
}
.about-quote-block p {
margin: 0;
font-size: 28px;
line-height: 1.3;
font-weight: 300;
letter-spacing: 0;
color: #fff;
max-width: 900px;
}
.about-grid-section {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 18px;
margin-top: 38px;
}
.about-card {
padding: 24px;
background: var(--theme-bg);
border: 1px solid var(--theme-border);
min-height: 260px;
}
.about-card h3 {
margin: 14px 0 12px;
font-size: 24px;
line-height: 1.05;
font-weight: 400;
color: var(--theme-text);
}
.about-card p {
margin: 0;
font-size: 15px;
line-height: 1.65;
color: var(--theme-text-muted);
}
.about-origin-section {
display: grid;
grid-template-columns: minmax(0, 1.2fr) minmax(280px, 0.8fr);
gap: 28px;
margin-top: 38px;
padding-top: 38px;
border-top: 1px solid var(--theme-border);
}
.about-origin-box {
display: flex;
flex-direction: column;
gap: 18px;
background: var(--theme-bg);
border: 1px solid var(--theme-border);
padding: 24px;
}
.about-origin-box > div {
padding-bottom: 16px;
border-bottom: 1px solid var(--theme-border);
}
.about-origin-box > div:last-child {
border-bottom: none;
padding-bottom: 0;
}
.about-bottom-cta {
margin-top: 38px;
padding: 38px;
background: #ff6a00;
display: grid;
grid-template-columns: minmax(0, 1.2fr) auto;
gap: 24px;
align-items: end;
}
.about-bottom-copy .about-label,
.about-bottom-copy h2,
.about-bottom-copy p {
color: #fff;
}
.about-bottom-copy .about-label {
opacity: 0.85;
}
.about-bottom-copy p {
margin-top: 16px;
max-width: 700px;
}
.about-bottom-actions {
display: flex;
gap: 12px;
flex-wrap: wrap;
}
.about-btn {
display: inline-flex;
align-items: center;
justify-content: center;
text-decoration: none;
padding: 12px 18px;
font-size: 14px;
border-radius: 999px;
transition: transform 0.2s ease, opacity 0.2s ease, box-shadow 0.2s ease;
}
.about-btn:hover {
transform: translateY(-1px);
}
.about-btn--primary {
background: var(--theme-paper);
color: #ff6a00;
}
.about-btn--secondary {
background: rgba(255, 255, 255, 0.14);
color: #fff;
backdrop-filter: blur(8px);
}
.about-proof-strip {
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: 14px;
margin-top: 38px;
}
.about-proof-item {
padding: 18px;
border: 1px solid var(--theme-border);
background: var(--theme-surface-soft);
}
.about-proof-item p {
margin: 10px 0 0;
font-size: 14px;
line-height: 1.55;
color: var(--theme-text-muted);
}
.about-process-section {
margin-top: 38px;
padding-top: 38px;
border-top: 1px solid var(--theme-border);
}
.about-credentials-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 18px;
margin-top: 38px;
}
.about-credential-card {
padding: 24px;
background: linear-gradient(
180deg,
rgba(255, 106, 0, 0.06),
rgba(255, 106, 0, 0.02)
);
border: 1px solid rgba(255, 106, 0, 0.16);
min-height: 220px;
}
.about-credential-card h3 {
margin: 14px 0 12px;
font-size: 24px;
line-height: 1.08;
font-weight: 400;
color: var(--theme-text);
}
.about-credential-card p {
margin: 0;
font-size: 15px;
line-height: 1.65;
color: var(--theme-text-muted);
}
.about-method-section {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(320px, 0.95fr);
gap: 28px;
margin-top: 38px;
padding: 28px;
background: var(--theme-bg);
border: 1px solid var(--theme-border);
}
.about-method-copy h2 {
margin: 10px 0 16px;
font-size: 40px;
line-height: 0.98;
font-weight: 300;
letter-spacing: 0;
color: var(--theme-text);
}
.about-method-copy p {
margin: 0;
font-size: 16px;
line-height: 1.7;
color: var(--theme-text-muted);
}
.about-method-points {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
}
.about-method-points > div {
padding-bottom: 14px;
border-bottom: 1px solid var(--theme-border);
}
.about-method-points > div:last-child {
border-bottom: none;
padding-bottom: 0;
}
.about-panel-meta span,
.about-method-points span {
display: block;
font-size: 10px;
letter-spacing: 0.22em;
color: var(--theme-text-muted);
}
.about-method-points p {
margin: 8px 0 0;
font-size: 14px;
line-height: 1.55;
color: var(--theme-text);
}
.about-trust-note {
margin-top: 38px;
padding: 22px;
border: 1px solid rgba(255, 106, 0, 0.18);
background: linear-gradient(
180deg,
rgba(255, 106, 0, 0.08),
rgba(255, 106, 0, 0.03)
);
}
.about-trust-note p {
margin: 10px 0 0;
font-size: 15px;
line-height: 1.65;
color: var(--theme-text);
}
@media (max-width: 1100px) {
.about-hero,
.about-section--split,
.about-origin-section,
.about-bottom-cta,
.about-method-section {
grid-template-columns: 1fr;
}
.about-hero-copy h1 {
font-size: 52px;
}
.about-grid-section,
.about-proof-strip,
.about-credentials-grid {
grid-template-columns: 1fr;
}
.about-method-copy h2 {
font-size: 32px;
}
}
@media (max-width: 700px) {
.about-page {
padding: 18px;
}
.about-shell {
padding: 24px 18px;
}
.about-hero-copy h1 {
font-size: 38px;
}
.about-section-heading h2,
.about-origin-copy h2,
.about-bottom-copy h2,
.about-method-copy h2 {
font-size: 30px;
}
.about-intro,
.about-section-copy p,
.about-origin-copy p,
.about-bottom-copy p,
.about-method-copy p,
.about-credential-card p,
.about-proof-item p,
.about-trust-note p {
font-size: 15px;
}
.about-quote-block {
padding: 24px 20px;
}
.about-quote-block p {
font-size: 22px;
}
.about-method-section,
.about-bottom-cta {
padding: 26px 20px;
}
}
/* --- Design System Refinement Start --- */
.about-page {
padding: clamp(1rem, 3vw, 2.4rem) var(--page-x) clamp(2rem, 5vw, 4rem);
background:
radial-gradient(circle at 88% 9%, rgba(var(--theme-accent-rgb) / 0.12), transparent 28rem),
linear-gradient(135deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.08)),
var(--theme-bg);
}
.about-shell {
width: var(--container-wide);
margin: 0 auto;
padding: clamp(1.25rem, 3vw, 2.8rem);
border-radius: var(--radius-lg);
box-shadow: var(--theme-shadow);
}
.about-kicker,
.about-label,
.about-panel-label,
.about-origin-box span,
.about-panel-meta span {
font-size: var(--text-xs);
letter-spacing: 0.22em;
text-transform: uppercase;
}
.about-hero {
display: grid;
grid-template-columns: minmax(0, 1.45fr) minmax(18rem, 0.72fr);
gap: var(--gap-lg);
padding-bottom: var(--section-y-xs);
align-items: end;
padding: clamp(2rem, 5vw, 5rem) 0 var(--section-y-sm);
border-bottom: 1px solid var(--theme-border);
}
.about-hero-copy {
min-width: 0;
}
.about-hero-copy h1 {
max-width: 11.4ch;
margin: clamp(0.85rem, 2vw, 1.2rem) 0 clamp(1rem, 2vw, 1.35rem);
color: var(--theme-text);
font-size: clamp(3rem, 7.4vw, 8.8rem);
line-height: 0.9;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
text-wrap: balance;
}
.about-intro {
max-width: var(--text-measure);
margin: 0;
color: var(--theme-text-muted);
font-size: var(--text-lg);
}
.about-hero-panel,
.about-card,
.about-origin-box,
.about-bottom-cta,
.about-proof-item,
.about-credential-card,
.about-method-section,
.about-trust-note,
.about-quote-block {
border-radius: var(--radius-lg);
line-height: 1.65;
}
.about-hero-panel {
padding: clamp(1.25rem, 3vw, 2rem);
border: 1px solid rgba(var(--theme-accent-rgb) / 0.2);
background:
linear-gradient(135deg, rgba(var(--theme-accent-rgb) / 0.1), transparent 62%),
var(--theme-surface-soft);
}
.about-hero-panel p {
margin: 0.75rem 0 0;
color: var(--theme-text);
font-size: var(--text-base);
line-height: 1.62;
}
.about-panel-meta {
display: grid;
gap: var(--gap-sm);
margin-top: clamp(1.2rem, 2.6vw, 2rem);
padding-top: var(--gap-sm);
border-top: 1px solid rgba(var(--theme-accent-rgb) / 0.2);
}
.about-panel-meta p,
.about-origin-box p,
.about-method-points p {
margin: 0.45rem 0 0;
color: var(--theme-text);
font-size: var(--text-sm);
line-height: 1.55;
}
.about-section {
padding-top: var(--section-y-xs);
padding-top: var(--section-y-sm);
}
.about-section--split,
.about-origin-section,
.about-method-section {
display: grid;
grid-template-columns: minmax(16rem, 0.72fr) minmax(0, 1.28fr);
gap: var(--gap-lg);
align-items: start;
}
.about-section-heading h2,
.about-origin-copy h2,
.about-bottom-copy h2,
.about-method-copy h2 {
margin: 0.75rem 0 0;
color: var(--theme-text);
font-size: clamp(2.15rem, 5.2vw, 6rem);
line-height: 0.94;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
text-wrap: balance;
}
.about-section-copy,
.about-method-points {
display: flex;
flex-direction: column;
gap: var(--gap-sm);
}
@ -549,31 +127,54 @@
.about-card p,
.about-proof-item p,
.about-trust-note p {
margin: 0;
color: var(--theme-text-muted);
font-size: var(--text-base);
line-height: 1.7;
}
.about-section-copy p + p,
.about-origin-copy p + p {
margin-top: var(--gap-sm);
}
.about-proof-strip,
.about-grid-section,
.about-credentials-grid {
display: grid;
gap: var(--gap-sm);
margin-top: var(--section-y-xs);
margin-top: var(--section-y-sm);
}
.about-proof-strip {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 14rem), 1fr));
grid-template-columns: repeat(4, minmax(0, 1fr));
}
.about-grid-section {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
grid-template-columns: repeat(3, minmax(0, 1fr));
}
.about-credentials-grid {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 22rem), 1fr));
grid-template-columns: repeat(2, minmax(0, 1fr));
}
.about-card,
.about-proof-item,
.about-credential-card,
.about-origin-box,
.about-method-section,
.about-trust-note {
border: 1px solid var(--theme-border);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.035), rgba(255, 255, 255, 0.008)),
var(--theme-surface-soft);
}
.about-card,
.about-proof-item,
.about-credential-card {
min-height: 100%;
padding: clamp(1.1rem, 2.4vw, 1.8rem);
transition:
transform var(--duration-med) var(--ease-out),
border-color var(--duration-med) var(--ease-out),
@ -590,79 +191,184 @@
.about-card h3,
.about-credential-card h3 {
margin: 0.9rem 0 0.75rem;
color: var(--theme-text);
font-size: var(--text-xl);
line-height: 1.08;
font-weight: 400;
letter-spacing: 0;
}
.about-proof-item {
min-height: 9rem;
}
.about-proof-item p {
margin-top: 0.7rem;
}
.about-quote-block {
margin-top: var(--section-y-xs);
margin-top: var(--section-y-sm);
padding: clamp(1.4rem, 4vw, 3rem);
overflow: hidden;
border-left: 3px solid var(--theme-accent);
background:
radial-gradient(circle at 100% 0%, rgba(var(--theme-accent-rgb) / 0.18), transparent 18rem),
#171717;
}
.about-quote-block p {
max-width: 58rem;
margin: 0;
color: #fff;
font-size: clamp(1.7rem, 4vw, 4.2rem);
line-height: 1.08;
font-weight: 300;
letter-spacing: 0;
}
.about-origin-section,
.about-process-section,
.about-faq-section {
margin-top: var(--section-y-xs);
padding-top: var(--section-y-xs);
.about-origin-section {
margin-top: var(--section-y-sm);
padding-top: var(--section-y-sm);
border-top: 1px solid var(--theme-border);
}
.about-method-section {
margin-top: var(--section-y-sm);
padding: clamp(1.25rem, 3vw, 2.4rem);
}
.about-method-points > div,
.about-origin-box > div {
padding-top: 1rem;
border-top: 1px solid var(--theme-border);
}
.about-origin-box {
display: grid;
gap: var(--gap-sm);
padding: clamp(1.1rem, 2.4vw, 1.8rem);
}
.about-trust-note {
margin-top: var(--section-y-sm);
padding: clamp(1.1rem, 2.4vw, 1.8rem);
border-color: rgba(var(--theme-accent-rgb) / 0.24);
background:
linear-gradient(135deg, rgba(var(--theme-accent-rgb) / 0.11), transparent 60%),
var(--theme-surface-soft);
}
.about-trust-note p {
max-width: 72rem;
margin-top: 0.75rem;
color: var(--theme-text);
}
.about-bottom-cta {
margin-top: var(--section-y-xs);
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: var(--gap-lg);
align-items: end;
margin-top: var(--section-y-sm);
padding: clamp(1.5rem, 4vw, 3.5rem);
overflow: hidden;
background:
radial-gradient(circle at 92% 0%, rgba(255, 255, 255, 0.22), transparent 20rem),
var(--theme-accent);
}
.about-bottom-copy .about-label,
.about-bottom-copy h2,
.about-bottom-copy p {
color: #fff;
}
.about-bottom-copy p {
max-width: 48rem;
margin-top: 1rem;
}
.about-bottom-actions {
display: flex;
flex-wrap: wrap;
gap: var(--gap-xs);
justify-content: flex-end;
}
.about-btn {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 48px;
padding: 0 1.1rem;
border: 1px solid transparent;
border-radius: 999px;
color: inherit;
font-size: var(--text-sm);
text-decoration: none;
transition:
transform var(--duration-med) var(--ease-out),
box-shadow var(--duration-med) var(--ease-out),
background-color var(--duration-med) var(--ease-out);
}
.about-btn:hover,
.about-btn:focus-visible {
transform: translateY(-2px);
box-shadow: var(--theme-shadow-soft);
}
@media (max-width: 1100px) {
.about-btn--primary {
background: #fff;
color: var(--theme-accent);
}
.about-btn--secondary {
border-color: rgba(255, 255, 255, 0.22);
background: rgba(255, 255, 255, 0.14);
color: #fff;
backdrop-filter: blur(8px);
}
@media (max-width: 1180px) {
.about-hero,
.about-section--split,
.about-origin-section,
.about-bottom-cta,
.about-method-section {
.about-method-section,
.about-bottom-cta {
grid-template-columns: 1fr;
}
.about-proof-strip,
.about-grid-section,
.about-credentials-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 700px) {
.about-page {
padding-inline: var(--page-x);
}
.about-shell {
width: var(--container-wide);
padding-inline: clamp(0.9rem, 4vw, 1.1rem);
@media (max-width: 760px) {
.about-hero {
padding-top: clamp(1.4rem, 5vw, 2rem);
}
.about-hero-copy h1 {
font-size: clamp(2.55rem, 13vw, 4.4rem);
}
.about-proof-strip,
.about-grid-section,
.about-credentials-grid {
grid-template-columns: 1fr;
}
.about-bottom-actions {
display: grid;
justify-content: stretch;
}
.about-btn {
width: 100%;
}
}
/* --- Design System Refinement End --- */

View File

@ -7,7 +7,7 @@ function AboutPage() {
<div className="about-page">
<SharedNavbar variant="light" />
<main className="about-shell">
<main className="shell">
<section className="about-hero" data-reveal-group>
<div className="about-hero-copy">
<span className="about-kicker" data-reveal="fade">

View File

@ -1,210 +1,108 @@
.datenschutz-page {
min-height: 100vh;
padding: 0 0 var(--section-y-sm);
color: var(--theme-text);
padding: 26px 38px 38px;
background:
linear-gradient(to right, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0.1)),
linear-gradient(to bottom, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.45));
}
.datenschutz-shell {
background: var(--theme-surface);
border: 1px solid var(--theme-border);
padding: 38px;
radial-gradient(circle at 86% 8%, rgba(var(--theme-accent-rgb) / 0.12), transparent 28rem),
linear-gradient(180deg, var(--theme-bg), color-mix(in srgb, var(--theme-bg) 88%, #000 12%));
}
.datenschutz-kicker,
.datenschutz-label {
display: block;
font-size: 10px;
letter-spacing: 0.22em;
color: var(--theme-text-muted);
font-size: var(--text-xs);
letter-spacing: 0.22em;
text-transform: uppercase;
}
.datenschutz-hero {
padding-bottom: 32px;
padding: clamp(2rem, 5vw, 5rem) 0 var(--section-y-sm);
border-bottom: 1px solid var(--theme-border);
}
.datenschutz-hero h1 {
margin: 14px 0 16px;
font-size: 64px;
line-height: 0.92;
font-weight: 300;
letter-spacing: 0;
margin: clamp(0.85rem, 2vw, 1.2rem) 0 clamp(1rem, 2vw, 1.35rem);
color: var(--theme-text);
}
.datenschutz-intro {
max-width: 820px;
margin: 0;
font-size: 17px;
line-height: 1.7;
color: var(--theme-text-muted);
}
.datenschutz-section {
display: grid;
grid-template-columns: minmax(260px, 0.7fr) minmax(0, 1.3fr);
gap: 28px;
align-items: start;
margin-top: 38px;
padding-top: 38px;
border-top: 1px solid var(--theme-border);
}
.datenschutz-section-heading h2 {
margin: 10px 0 0;
font-size: 38px;
line-height: 0.98;
font-weight: 300;
letter-spacing: 0;
color: var(--theme-text);
}
.datenschutz-section-copy p {
margin: 0 0 16px;
font-size: 16px;
line-height: 1.75;
color: var(--theme-text-muted);
}
.datenschutz-list {
margin: 0;
padding-left: 18px;
display: grid;
gap: 10px;
}
.datenschutz-list li {
font-size: 16px;
line-height: 1.7;
color: var(--theme-text-muted);
}
.datenschutz-note-box {
padding: 22px;
border: 1px solid rgba(255, 106, 0, 0.18);
background: linear-gradient(
180deg,
rgba(255, 106, 0, 0.08),
rgba(255, 106, 0, 0.03)
);
}
.datenschutz-note-box p {
margin: 0;
font-size: 15px;
line-height: 1.65;
color: var(--theme-text);
}
@media (max-width: 1100px) {
.datenschutz-section {
grid-template-columns: 1fr;
}
.datenschutz-hero h1 {
font-size: 48px;
}
}
@media (max-width: 700px) {
.datenschutz-page {
padding: 18px;
}
.datenschutz-shell {
padding: 24px 18px;
}
.datenschutz-hero h1 {
font-size: 36px;
}
.datenschutz-section-heading h2 {
font-size: 28px;
}
.datenschutz-intro,
.datenschutz-section-copy p,
.datenschutz-list li {
font-size: 15px;
}
}
/* --- Design System Refinement Start --- */
.datenschutz-page {
padding: clamp(1rem, 3vw, 2.4rem) var(--page-x) clamp(2rem, 5vw, 4rem);
background:
radial-gradient(circle at 88% 9%, rgba(var(--theme-accent-rgb) / 0.12), transparent 28rem),
linear-gradient(135deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.08)),
var(--theme-bg);
}
.datenschutz-shell {
width: var(--container-narrow);
margin: 0 auto;
padding: clamp(1.25rem, 3vw, 2.8rem);
border-radius: var(--radius-lg);
box-shadow: var(--theme-shadow);
}
.datenschutz-kicker,
.datenschutz-label {
font-size: var(--text-xs);
}
.datenschutz-hero {
padding-bottom: var(--section-y-xs);
}
.datenschutz-hero h1 {
font-size: clamp(3rem, 8vw, 7.2rem);
line-height: 0.9;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
}
.datenschutz-intro {
max-width: var(--text-measure);
margin: 0;
color: var(--theme-text-muted);
font-size: var(--text-lg);
line-height: 1.7;
}
.datenschutz-section {
display: grid;
grid-template-columns: minmax(14rem, 0.72fr) minmax(0, 1.28fr);
gap: var(--gap-lg);
margin-top: var(--section-y-xs);
padding-top: var(--section-y-xs);
align-items: start;
margin-top: var(--section-y-sm);
padding-top: var(--section-y-sm);
border-top: 1px solid var(--theme-border);
}
.datenschutz-section-heading h2 {
margin: 0.75rem 0 0;
color: var(--theme-text);
font-size: clamp(2rem, 4.2vw, 4.5rem);
line-height: 0.96;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
text-wrap: balance;
}
.datenschutz-section-copy p,
.datenschutz-list li,
.datenschutz-note-box p {
.datenschutz-section-copy p {
margin: 0 0 1rem;
color: var(--theme-text-muted);
font-size: var(--text-base);
line-height: 1.75;
}
.datenschutz-list {
display: grid;
gap: 0.75rem;
margin: 0;
padding-left: 1.1rem;
}
.datenschutz-list li {
color: var(--theme-text-muted);
font-size: var(--text-base);
line-height: 1.7;
}
.datenschutz-note-box {
border-radius: var(--radius-lg);
padding: clamp(1.1rem, 2.4vw, 1.8rem);
border: 1px solid rgba(var(--theme-accent-rgb) / 0.24);
background:
linear-gradient(135deg, rgba(var(--theme-accent-rgb) / 0.11), transparent 60%),
var(--theme-surface-soft);
}
.datenschutz-note-box p {
margin: 0;
color: var(--theme-text);
font-size: var(--text-base);
line-height: 1.65;
}
@media (max-width: 900px) {
.datenschutz-section {
grid-template-columns: 1fr;
}
}
@media (max-width: 700px) {
.datenschutz-page {
padding-inline: var(--page-x);
}
.datenschutz-shell {
width: var(--container-wide);
padding-inline: clamp(0.9rem, 4vw, 1.1rem);
.datenschutz-hero {
padding-top: clamp(1.4rem, 5vw, 2rem);
}
}
/* --- Design System Refinement End --- */

View File

@ -6,7 +6,7 @@ function DatenschutzPage() {
<div className="datenschutz-page">
<SharedNavbar variant="light" />
<main className="datenschutz-shell">
<main className="shell">
<section className="datenschutz-hero" data-reveal-group>
<span className="datenschutz-kicker" data-reveal="fade">RECHTLICHE ANGABEN</span>
<h1 data-reveal="lines">DATENSCHUTZ</h1>

File diff suppressed because it is too large Load Diff

View File

@ -4,15 +4,271 @@ import SharedNavbar from "../components/SharedNavbar";
import { useShop } from "../shop/useShop";
import "./DiscoverySetPage.css";
const moodImages = [
"/DISCOVERYSET.png",
"/DISCOVERYSET.png",
"/DISCOVERYSET.png",
"/DISCOVERYSET.png",
"/DISCOVERYSET.png",
"/DISCOVERYSET.png",
const DISCOVERY_SET_IMAGE = "/DISCOVERYSET.png";
const discoveryPanelFacts = [
{ label: "Umfang", value: "6 × 2ml" },
{ label: "Gutschrift", value: "CHF 48 werden beim späteren Full-Size-Kauf berücksichtigt." },
];
const discoveryBenefits = [
{
title: "6 × 2ml Samples aller Signature-Düfte",
text: "Kalter Beton, Schwarzes Benzin, Verbranntes Chrom, Blasse Seide, Weisse Asche und Nasser Marmor.",
},
{
title: "CHF 48 Gutschein automatisch im Set",
text: "Nur das erste Discovery Set erstellt den einmaligen Rabatt. Er wird bei einem späteren Full-Size-Kauf automatisch angerechnet.",
},
{
title: "Jedes Sample = ca. 20 Anwendungen",
text: "Genug, um jeden Duft mehrere Tage im Alltag und in unterschiedlichen Situationen zu testen.",
},
{
title: "Hochwertige Mini-Flacons",
text: "Sorgfältig zusammengestellt, reduziert gestaltet und als Teil des atmos Konzepts gedacht.",
},
];
const discoverySteps = [
{
number: "01",
title: "Bestellen",
text: "Discovery Set für CHF 48 bestellen. Nur dein erstes Set erzeugt automatisch einen einmaligen Rabatt.",
},
{
number: "02",
title: "Testen",
text: "Jeden Duft mindestens einige Tage tragen. Im Alltag, zu verschiedenen Anlässen und auf der eigenen Haut.",
},
{
number: "03",
title: "Entscheiden",
text: "Full-Size bestellen. CHF 48 werden automatisch angerechnet, sofern der Rabatt noch nicht genutzt wurde.",
},
];
const discoveryComparison = [
{
icon: "×",
title: "Traditioneller Weg",
text: "CHF 180+ für eine Full Size ausgeben, ohne zu wissen, ob sie wirklich passt. Risiko: Fehlkauf, Überforderung oder ein Duft, der im Regal bleibt.",
},
{
icon: "✓",
title: "Discovery Set Weg",
text: "CHF 48 investieren, alle Düfte testen, bewusst entscheiden. Die erste Investition wird einmalig angerechnet der Einstieg bleibt kontrolliert, nachvollziehbar und fair.",
highlight: true,
},
];
function DiscoveryOrderPanel({ onBuy }) {
return (
<aside className="discovery-order-panel">
<div className="discovery-price-row">
<span>Preis</span>
<strong>CHF 48.</strong>
</div>
<div className="discovery-panel-facts">
{discoveryPanelFacts.map((item) => (
<div key={item.label}>
<span>{item.label}</span>
<p>{item.value}</p>
</div>
))}
</div>
<div className="discovery-panel-actions">
<button type="button" className="discovery-primary-btn" onClick={onBuy}>
DISCOVERY SET BESTELLEN CHF 48.
</button>
<p>Nur das erste Set erstellt einen einmaligen CHF 48 Full-Size-Rabatt</p>
</div>
</aside>
);
}
function DiscoveryHero({ onBuy }) {
return (
<section className="discovery-hero">
<div className="discovery-hero-stage">
<div className="discovery-hero-copy">
<span className="discovery-kicker">DISCOVERY SET</span>
<h1>
DER SICHERSTE EINSTIEG
<br />
IN DIE WELT DER NISCHEN-
<br />
DÜFTE
</h1>
<p className="discovery-intro">
6 Düfte × 2ml. Jeden Duft eine Woche tragen. Verstehen, was
wirklich funktioniert. Ohne Risiko.
</p>
</div>
<figure className="discovery-hero-visual">
<img
src={DISCOVERY_SET_IMAGE}
alt="Atmos Discovery Set"
loading="eager"
decoding="async"
/>
</figure>
</div>
<DiscoveryOrderPanel onBuy={onBuy} />
</section>
);
}
function DiscoveryStorySection() {
return (
<section className="discovery-story-grid" data-reveal-group>
<div className="discovery-story-copy">
<span className="discovery-label" data-reveal="fade">
WARUM DISCOVERY SET
</span>
<h2 data-reveal="lines">DER KLÜGERE EINSTIEG IN NISCHENDÜFTE.</h2>
<p data-reveal="fade">
Nischen-Parfums sind keine Impulskäufe. Sie brauchen Zeit, um zu
verstehen, wie sie auf deiner Haut funktionieren, wie sie sich im
Alltag entwickeln und ob sie wirklich zu dir passen.
</p>
</div>
<div className="discovery-benefit-panel" data-reveal="fade">
{discoveryBenefits.map((benefit) => (
<article className="discovery-benefit" key={benefit.title}>
<span className="discovery-benefit-icon" aria-hidden="true">
</span>
<div>
<strong>{benefit.title}</strong>
<p>{benefit.text}</p>
</div>
</article>
))}
</div>
</section>
);
}
function DiscoveryProcessSection() {
return (
<section className="discovery-process-section" data-reveal-group>
<div className="discovery-section-intro">
<span className="discovery-label" data-reveal="fade">
ABLAUF
</span>
<h2 data-reveal="lines">So funktioniert&apos;s</h2>
</div>
<div className="discovery-steps-grid">
{discoverySteps.map((step) => (
<article className="discovery-step-card" key={step.number} data-reveal="fade">
<span className="discovery-step-number">{step.number}</span>
<h3>{step.title}</h3>
<p>{step.text}</p>
</article>
))}
</div>
</section>
);
}
function DiscoveryIncludedSection() {
return (
<section className="discovery-included" data-reveal-group>
<div className="discovery-section-heading">
<span className="discovery-label" data-reveal="fade">
IM SET ENTHALTEN
</span>
<h2 data-reveal="lines">ALLE 6 SIGNATURE-DÜFTE ZUM TESTEN.</h2>
</div>
<div className="discovery-products-grid">
{perfumes.map((perfume) => (
<article className="discovery-product-card" key={perfume.id} data-reveal="fade">
<span className="discovery-product-index">{perfume.id}</span>
<div className="discovery-product-image">
<img
src={perfume.image}
alt={perfume.name}
loading="lazy"
decoding="async"
/>
</div>
<div className="discovery-product-copy">
<h3>{perfume.name}</h3>
<p>{perfume.text}</p>
<div className="discovery-product-tags">
{perfume.materialTags.slice(0, 3).map((tag) => (
<span key={tag}>{tag}</span>
))}
</div>
</div>
</article>
))}
</div>
</section>
);
}
function DiscoveryComparisonSection() {
return (
<section className="discovery-comparison-section" data-reveal-group>
<div className="discovery-comparison-grid">
{discoveryComparison.map((item) => (
<article
className={`discovery-comparison-card${
item.highlight ? " discovery-comparison-card--highlight" : ""
}`}
key={item.title}
data-reveal="fade"
>
<div className="discovery-comparison-head">
<span className="discovery-comparison-icon" aria-hidden="true">
{item.icon}
</span>
<h3>{item.title}</h3>
</div>
<p>{item.text}</p>
</article>
))}
</div>
</section>
);
}
function DiscoveryFinalCta({ onBuy }) {
return (
<section className="discovery-final-cta" data-reveal-group>
<div>
<span className="discovery-label" data-reveal="fade">
DISCOVERY SET
</span>
<h2 data-reveal="lines">DER SICHERSTE EINSTIEG.</h2>
<p data-reveal="fade">
Kostenloser Versand · 23 Werktage · Einmalige Anrechnung bei Full-Size
</p>
</div>
<div className="discovery-final-actions" data-reveal="fade">
<button type="button" className="discovery-primary-btn" onClick={onBuy}>
DISCOVERY SET BESTELLEN CHF 48.
</button>
</div>
</section>
);
}
function DiscoverySetPage() {
const navigate = useNavigate();
const { addToCart } = useShop();
@ -23,219 +279,20 @@ function DiscoverySetPage() {
<div className="discovery-page">
<SharedNavbar variant="light" active="testen" />
<main className="discovery-shell">
<main className="shell">
<div className="discovery-topbar">
<button className="discovery-back-link" type="button" onClick={() => navigate("/")}>
<span className="discovery-back-arrow"></span>
<span className="discovery-back-arrow" aria-hidden="true" />
<span>Zurück zur Startseite</span>
</button>
</div>
<section className="discovery-hero" data-reveal-group>
<div className="discovery-hero-copy">
<span className="discovery-kicker" data-reveal="fade">
DISCOVERY SET
</span>
<h1 data-reveal="lines">
DER SICHERSTE EINSTIEG
<br />
IN DIE WELT DER NISCHEN-
<br />
DÜFTE
</h1>
<p className="discovery-intro" data-reveal="fade">
6 Düfte × 2ml. Jeden Duft eine Woche tragen. Verstehen, was
wirklich funktioniert. Ohne Risiko.
</p>
<div className="discovery-benefits" data-reveal="fade">
<div className="discovery-benefit">
<span className="discovery-benefit-icon"></span>
<div>
<strong>6 × 2ml Samples aller Signature-Düfte</strong>
<p>
Kalter Beton, Schwarzes Benzin, Verbranntes Chrom, Blasse
Seide, Weisse Asche und Nasser Marmor.
</p>
</div>
</div>
<div className="discovery-benefit">
<span className="discovery-benefit-icon"></span>
<div>
<strong>CHF 48 Gutschein automatisch im Set</strong>
<p>
Nur das erste Discovery Set erstellt den einmaligen Rabatt.
Er wird bei einem späteren Full-Size-Kauf automatisch angerechnet.
</p>
</div>
</div>
<div className="discovery-benefit">
<span className="discovery-benefit-icon"></span>
<div>
<strong>Jedes Sample = ca. 20 Anwendungen</strong>
<p>
Genug, um jeden Duft mehrere Tage im Alltag und in
unterschiedlichen Situationen zu testen.
</p>
</div>
</div>
<div className="discovery-benefit">
<span className="discovery-benefit-icon"></span>
<div>
<strong>Hochwertige Mini-Flacons</strong>
<p>
Sorgfältig zusammengestellt, reduziert gestaltet und als
Teil des atmos Konzepts gedacht.
</p>
</div>
</div>
</div>
<div className="discovery-hero-actions" data-reveal="fade">
<button type="button" className="discovery-primary-btn" onClick={buyDiscoverySet}>
DISCOVERY SET BESTELLEN CHF 48.
</button>
<p>Nur das erste Set erstellt einen einmaligen CHF 48 Full-Size-Rabatt</p>
</div>
</div>
<div className="discovery-mood-grid">
{moodImages.map((image, index) => (
<div className="discovery-mood-tile" key={index}>
<img
src={image}
alt={`Discovery Mood ${index + 1}`}
loading={index === 0 ? "eager" : "lazy"}
decoding="async"
/>
</div>
))}
</div>
</section>
<section className="discovery-included" data-reveal-group>
<div className="discovery-section-heading">
<span className="discovery-label" data-reveal="fade">
IM SET ENTHALTEN
</span>
<h2 data-reveal="lines">ALLE 6 SIGNATURE-DÜFTE ZUM TESTEN.</h2>
</div>
<div className="discovery-products-grid">
{perfumes.map((perfume) => (
<article className="discovery-product-card" key={perfume.id}>
<div className="discovery-product-image">
<img
src={perfume.image}
alt={perfume.name}
loading="lazy"
decoding="async"
/>
</div>
<div className="discovery-product-copy">
<h3>{perfume.name}</h3>
<p>{perfume.text}</p>
<div className="discovery-product-tags">
{perfume.materialTags.slice(0, 3).map((tag) => (
<span key={tag}>{tag}</span>
))}
</div>
</div>
</article>
))}
</div>
</section>
<section className="discovery-steps-section">
<div className="discovery-steps-shell" data-reveal-group>
<h2 data-reveal="lines">So funktioniert&apos;s</h2>
<div className="discovery-steps-grid">
<article className="discovery-step-card" data-reveal="fade">
<div className="discovery-step-number">1</div>
<h3>Bestellen</h3>
<p>
Discovery Set für CHF 48 bestellen. Nur dein erstes Set erzeugt
automatisch einen einmaligen Rabatt.
</p>
</article>
<article className="discovery-step-card" data-reveal="fade">
<div className="discovery-step-number">2</div>
<h3>Testen</h3>
<p>
Jeden Duft mindestens einige Tage tragen. Im Alltag, zu
verschiedenen Anlässen und auf der eigenen Haut.
</p>
</article>
<article className="discovery-step-card" data-reveal="fade">
<div className="discovery-step-number">3</div>
<h3>Entscheiden</h3>
<p>
Full-Size bestellen. CHF 48 werden automatisch angerechnet,
sofern der Rabatt noch nicht genutzt wurde.
</p>
</article>
</div>
</div>
</section>
<section className="discovery-comparison-section" data-reveal-group>
<div className="discovery-section-heading discovery-section-heading--center">
<span className="discovery-label" data-reveal="fade">
WARUM DISCOVERY SET
</span>
<h2 data-reveal="lines">DER KLÜGERE EINSTIEG IN NISCHENDÜFTE.</h2>
<p data-reveal="fade">
Nischen-Parfums sind keine Impulskäufe. Sie brauchen Zeit, um zu
verstehen, wie sie auf deiner Haut funktionieren, wie sie sich im
Alltag entwickeln und ob sie wirklich zu dir passen.
</p>
</div>
<div className="discovery-comparison-grid">
<div className="discovery-comparison-card" data-reveal="fade">
<div className="discovery-comparison-head">
<span className="discovery-comparison-icon">×</span>
<h3>Traditioneller Weg</h3>
</div>
<p>
CHF 180+ für eine Full Size ausgeben, ohne zu wissen, ob sie
wirklich passt. Risiko: Fehlkauf, Überforderung oder ein Duft,
der im Regal bleibt.
</p>
</div>
<div
className="discovery-comparison-card discovery-comparison-card--highlight"
data-reveal="fade"
>
<div className="discovery-comparison-head">
<span className="discovery-comparison-icon"></span>
<h3>Discovery Set Weg</h3>
</div>
<p>
CHF 48 investieren, alle Düfte testen, bewusst entscheiden. Die
erste Investition wird einmalig angerechnet der Einstieg bleibt
kontrolliert, nachvollziehbar und fair.
</p>
</div>
</div>
<div className="discovery-bottom-cta" data-reveal="fade">
<button type="button" className="discovery-primary-btn" onClick={buyDiscoverySet}>
DISCOVERY SET BESTELLEN CHF 48.
</button>
<p>Kostenloser Versand · 23 Werktage · Einmalige Anrechnung bei Full-Size</p>
</div>
</section>
<DiscoveryHero onBuy={buyDiscoverySet} />
<DiscoveryStorySection />
<DiscoveryIncludedSection />
<DiscoveryProcessSection />
<DiscoveryComparisonSection />
<DiscoveryFinalCta onBuy={buyDiscoverySet} />
</main>
</div>
);

View File

@ -1,206 +1,62 @@
.impressum-page {
min-height: 100vh;
padding: 0 0 var(--section-y-sm);
color: var(--theme-text);
padding: 26px 38px 38px;
background:
linear-gradient(to right, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0.1)),
linear-gradient(to bottom, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.45));
}
.impressum-shell {
background: var(--theme-surface);
border: 1px solid var(--theme-border);
padding: 38px;
radial-gradient(circle at 86% 8%, rgba(var(--theme-accent-rgb) / 0.12), transparent 28rem),
linear-gradient(180deg, var(--theme-bg), color-mix(in srgb, var(--theme-bg) 88%, #000 12%));
}
.impressum-kicker,
.impressum-label {
display: block;
font-size: 10px;
letter-spacing: 0.22em;
color: var(--theme-text-muted);
font-size: var(--text-xs);
letter-spacing: 0.22em;
text-transform: uppercase;
}
.impressum-hero {
padding-bottom: 32px;
padding: clamp(2rem, 5vw, 5rem) 0 var(--section-y-sm);
border-bottom: 1px solid var(--theme-border);
}
.impressum-hero h1 {
margin: 14px 0 16px;
font-size: 64px;
line-height: 0.92;
font-weight: 300;
letter-spacing: 0;
margin: clamp(0.85rem, 2vw, 1.2rem) 0 clamp(1rem, 2vw, 1.35rem);
color: var(--theme-text);
}
.impressum-intro {
max-width: 760px;
margin: 0;
font-size: 17px;
line-height: 1.65;
color: var(--theme-text-muted);
}
.impressum-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 18px;
margin-top: 38px;
}
.impressum-card {
padding: 24px;
background: var(--theme-bg);
border: 1px solid var(--theme-border);
min-height: 210px;
}
.impressum-card h2 {
margin: 14px 0 12px;
font-size: 26px;
line-height: 1.05;
font-weight: 400;
color: var(--theme-text);
}
.impressum-card p {
margin: 0;
font-size: 15px;
line-height: 1.7;
color: var(--theme-text-muted);
}
.impressum-section {
display: grid;
grid-template-columns: minmax(260px, 0.7fr) minmax(0, 1.3fr);
gap: 28px;
align-items: start;
margin-top: 38px;
padding-top: 38px;
border-top: 1px solid var(--theme-border);
}
.impressum-section-heading h2 {
margin: 10px 0 0;
font-size: 38px;
line-height: 0.98;
font-weight: 300;
letter-spacing: 0;
color: var(--theme-text);
}
.impressum-section-copy p {
margin: 0 0 16px;
font-size: 16px;
line-height: 1.75;
color: var(--theme-text-muted);
}
.impressum-note-box {
padding: 22px;
border: 1px solid rgba(255, 106, 0, 0.18);
background: linear-gradient(
180deg,
rgba(255, 106, 0, 0.08),
rgba(255, 106, 0, 0.03)
);
}
.impressum-note-box p {
margin: 0;
font-size: 15px;
line-height: 1.65;
color: var(--theme-text);
}
@media (max-width: 1100px) {
.impressum-grid,
.impressum-section {
grid-template-columns: 1fr;
}
.impressum-hero h1 {
font-size: 48px;
}
}
@media (max-width: 700px) {
.impressum-page {
padding: 18px;
}
.impressum-shell {
padding: 24px 18px;
}
.impressum-hero h1 {
font-size: 36px;
}
.impressum-section-heading h2 {
font-size: 28px;
}
.impressum-intro,
.impressum-card p,
.impressum-section-copy p {
font-size: 15px;
}
}
/* --- Design System Refinement Start --- */
.impressum-page {
padding: clamp(1rem, 3vw, 2.4rem) var(--page-x) clamp(2rem, 5vw, 4rem);
background:
radial-gradient(circle at 88% 9%, rgba(var(--theme-accent-rgb) / 0.12), transparent 28rem),
linear-gradient(135deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.08)),
var(--theme-bg);
}
.impressum-shell {
width: var(--container-narrow);
margin: 0 auto;
padding: clamp(1.25rem, 3vw, 2.8rem);
border-radius: var(--radius-lg);
box-shadow: var(--theme-shadow);
}
.impressum-kicker,
.impressum-label {
font-size: var(--text-xs);
}
.impressum-hero {
padding-bottom: var(--section-y-xs);
}
.impressum-hero h1 {
font-size: clamp(3rem, 8vw, 7.2rem);
line-height: 0.9;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
}
.impressum-intro {
max-width: var(--text-measure);
margin: 0;
color: var(--theme-text-muted);
font-size: var(--text-lg);
line-height: 1.65;
}
.impressum-grid {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: var(--gap-sm);
margin-top: var(--section-y-xs);
margin-top: var(--section-y-sm);
}
.impressum-card,
.impressum-note-box {
border-radius: var(--radius-lg);
border: 1px solid var(--theme-border);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.035), rgba(255, 255, 255, 0.008)),
var(--theme-surface-soft);
}
.impressum-card {
min-height: 210px;
padding: clamp(1.1rem, 2.4vw, 1.8rem);
transition:
transform var(--duration-med) var(--ease-out),
border-color var(--duration-med) var(--ease-out),
@ -213,42 +69,74 @@
box-shadow: var(--theme-shadow-soft);
}
.impressum-card h2,
.impressum-section-heading h2 {
.impressum-card h2 {
margin: 0.9rem 0 0.75rem;
color: var(--theme-text);
font-size: var(--text-xl);
line-height: 1.08;
font-weight: 400;
letter-spacing: 0;
}
.impressum-card h2 {
font-size: var(--text-xl);
.impressum-card p {
margin: 0;
color: var(--theme-text-muted);
font-size: var(--text-base);
line-height: 1.7;
}
.impressum-section {
display: grid;
grid-template-columns: minmax(14rem, 0.72fr) minmax(0, 1.28fr);
gap: var(--gap-lg);
margin-top: var(--section-y-xs);
padding-top: var(--section-y-xs);
align-items: start;
margin-top: var(--section-y-sm);
padding-top: var(--section-y-sm);
border-top: 1px solid var(--theme-border);
}
.impressum-section-heading h2 {
margin: 0.75rem 0 0;
color: var(--theme-text);
font-size: clamp(2rem, 4.2vw, 4.5rem);
line-height: 0.96;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
text-wrap: balance;
}
.impressum-card p,
.impressum-section-copy p,
.impressum-note-box p {
.impressum-section-copy p {
margin: 0 0 1rem;
color: var(--theme-text-muted);
font-size: var(--text-base);
line-height: 1.75;
}
.impressum-note-box {
padding: clamp(1.1rem, 2.4vw, 1.8rem);
border-color: rgba(var(--theme-accent-rgb) / 0.24);
background:
linear-gradient(135deg, rgba(var(--theme-accent-rgb) / 0.11), transparent 60%),
var(--theme-surface-soft);
}
.impressum-note-box p {
margin: 0;
color: var(--theme-text);
font-size: var(--text-base);
line-height: 1.65;
}
@media (max-width: 900px) {
.impressum-grid,
.impressum-section {
grid-template-columns: 1fr;
}
}
@media (max-width: 700px) {
.impressum-page {
padding-inline: var(--page-x);
}
.impressum-shell {
width: var(--container-wide);
padding-inline: clamp(0.9rem, 4vw, 1.1rem);
.impressum-hero {
padding-top: clamp(1.4rem, 5vw, 2rem);
}
}
/* --- Design System Refinement End --- */

View File

@ -6,7 +6,7 @@ function ImpressumPage() {
<div className="impressum-page">
<SharedNavbar variant="light" />
<main className="impressum-shell">
<main className="shell">
<section className="impressum-hero" data-reveal-group>
<span className="impressum-kicker" data-reveal="fade">
RECHTLICHE ANGABEN

View File

@ -447,9 +447,22 @@
align-items: center;
justify-content: center;
min-width: 2rem;
width: 2rem;
height: 2rem;
color: var(--theme-accent);
font-size: clamp(1.5rem, 2.5vw, 2rem);
line-height: 1;
font-size: 0;
line-height: 0;
}
.arrow::before {
content: "";
display: block;
width: clamp(1.35rem, 2.2vw, 1.75rem);
height: clamp(1.35rem, 2.2vw, 1.75rem);
background: currentColor;
transform: rotate(180deg);
-webkit-mask: url("/icon-arrow-left.svg") center / contain no-repeat;
mask: url("/icon-arrow-left.svg") center / contain no-repeat;
}
.product-id,

View File

@ -450,7 +450,7 @@ function LandingPage() {
<div className="product-bottom">
<p>{item.text}</p>
<span className="arrow">&rarr;</span>
<span className="arrow" aria-hidden="true" />
</div>
</Link>
))}

View File

@ -1,193 +1,90 @@
.small-page {
min-height: 100vh;
padding: 26px 38px 38px;
background: var(--theme-bg);
padding: 0 0 var(--section-y-sm);
color: var(--theme-text);
}
.small-shell {
background: var(--theme-surface);
border: 1px solid var(--theme-border);
padding: 38px;
}
.small-hero {
max-width: 780px;
padding-bottom: 34px;
border-bottom: 1px solid var(--theme-border);
margin-bottom: 28px;
}
.small-kicker {
display: block;
margin-bottom: 12px;
color: var(--theme-text-muted);
font-size: 10px;
letter-spacing: 0.22em;
}
.small-hero h1,
.small-panel h2 {
margin: 0 0 14px;
letter-spacing: 0;
}
.small-hero h1 {
font-size: clamp(42px, 8vw, 92px);
line-height: 0.92;
}
.small-hero p,
.small-panel p,
.release-card p {
margin: 0;
color: var(--theme-text-muted);
line-height: 1.55;
}
.small-panel,
.release-card,
.small-error {
background: var(--theme-surface-soft);
border: 1px solid var(--theme-border);
padding: 22px;
}
.small-panel button,
.release-card button {
min-height: 44px;
margin-top: 18px;
border: 1px solid #1f1f1f;
border-radius: 0;
background: #1f1f1f;
color: #fff;
padding: 0 18px;
cursor: pointer;
}
.small-requirements {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 12px;
margin-top: 18px;
}
.small-requirement {
display: flex;
justify-content: space-between;
gap: 12px;
padding: 14px;
background: var(--theme-surface-soft);
border: 1px solid var(--theme-border);
}
.small-requirement span,
.release-card span {
color: var(--theme-text-muted);
font-size: 10px;
letter-spacing: 0.18em;
text-transform: uppercase;
}
.small-requirement strong.met {
color: #ff6a00;
}
.release-grid {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 16px;
margin-top: 22px;
}
.release-card h3 {
margin: 10px 0 12px;
}
.small-error {
margin: 16px 0 0;
border-color: #ff6a00;
}
@media (max-width: 760px) {
.small-page {
padding: 18px;
}
.small-shell {
padding: 24px 18px;
}
.small-requirements,
.release-grid {
grid-template-columns: 1fr;
}
}
/* --- Design System Refinement Start --- */
.small-page {
padding: clamp(1rem, 3vw, 2.4rem) var(--page-x) clamp(2rem, 5vw, 4rem);
background:
radial-gradient(circle at 84% 7%, rgba(var(--theme-accent-rgb) / 0.12), transparent 28rem),
var(--theme-bg);
}
.small-shell {
width: var(--container-wide);
margin: 0 auto;
padding: clamp(1.25rem, 3vw, 2.8rem);
border-radius: var(--radius-lg);
box-shadow: var(--theme-shadow);
radial-gradient(circle at 84% 8%, rgba(var(--theme-accent-rgb) / 0.13), transparent 28rem),
linear-gradient(180deg, var(--theme-bg), color-mix(in srgb, var(--theme-bg) 88%, #000 12%));
}
.small-hero {
max-width: min(100%, 58rem);
padding-bottom: var(--section-y-xs);
margin-bottom: var(--gap-lg);
max-width: 64rem;
padding: clamp(2rem, 5vw, 5rem) 0 var(--section-y-sm);
border-bottom: 1px solid var(--theme-border);
}
.small-kicker,
.small-requirement span,
.release-card span {
display: block;
margin-bottom: 0.75rem;
color: var(--theme-text-muted);
font-size: var(--text-xs);
letter-spacing: 0.22em;
text-transform: uppercase;
}
.small-hero h1,
.small-panel h2 {
margin: 0 0 clamp(0.85rem, 2vw, 1.2rem);
color: var(--theme-text);
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
}
.small-hero h1 {
font-size: clamp(3rem, 9vw, 9rem);
font-size: clamp(3rem, 8.6vw, 9rem);
line-height: 0.88;
text-wrap: balance;
}
.small-panel h2 {
font-size: clamp(2.2rem, 5vw, 5.4rem);
line-height: 0.94;
}
.small-hero p,
.small-panel p,
.release-card p {
max-width: var(--text-measure);
margin: 0;
color: var(--theme-text-muted);
font-size: var(--text-base);
line-height: 1.65;
}
.small-panel,
.release-card,
.small-error,
.small-requirement {
border-radius: var(--radius-lg);
.small-error {
border: 1px solid var(--theme-border);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.035), rgba(255, 255, 255, 0.008)),
var(--theme-surface-soft);
}
.small-panel,
.release-card {
padding: clamp(1.2rem, 3vw, 2rem);
.small-panel {
max-width: 68rem;
margin-top: var(--section-y-sm);
padding: clamp(1.25rem, 3vw, 2.2rem);
}
.small-panel button,
.release-card button {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 48px;
margin-top: 1.2rem;
padding: 0 1.1rem;
border: 1px solid #111;
border-radius: 999px;
background: #111;
color: #fff;
cursor: pointer;
font-size: var(--text-sm);
text-transform: uppercase;
letter-spacing: 0.1em;
transition:
transform var(--duration-med) var(--ease-out),
box-shadow var(--duration-med) var(--ease-out),
@ -203,21 +100,60 @@
}
.small-requirements {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 15rem), 1fr));
display: grid;
grid-template-columns: repeat(4, minmax(0, 1fr));
gap: var(--gap-sm);
margin-top: clamp(1.4rem, 3vw, 2.4rem);
}
.small-requirement {
min-height: 4.5rem;
min-height: 7rem;
display: flex;
flex-direction: column;
justify-content: space-between;
gap: var(--gap-xs);
padding: clamp(1rem, 2vw, 1.4rem);
border: 1px solid var(--theme-border);
background: var(--theme-paper);
}
.small-requirement span {
margin-bottom: 0;
}
.small-requirement strong {
color: var(--theme-text);
font-size: var(--text-base);
font-weight: 400;
line-height: 1.3;
}
.small-requirement strong.met {
color: var(--theme-accent);
}
.small-error {
max-width: 68rem;
margin: var(--gap-sm) 0 0;
padding: clamp(1rem, 2vw, 1.4rem);
border-color: rgba(var(--theme-accent-rgb) / 0.45);
color: var(--theme-text);
}
.release-grid {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: var(--gap-sm);
margin-top: var(--gap-lg);
margin-top: var(--section-y-sm);
}
.release-card {
min-height: 280px;
display: flex;
flex-direction: column;
justify-content: space-between;
gap: var(--gap-sm);
padding: clamp(1.1rem, 2.4vw, 1.8rem);
transition:
transform var(--duration-med) var(--ease-out),
border-color var(--duration-med) var(--ease-out),
@ -230,23 +166,42 @@
box-shadow: var(--theme-shadow-soft);
}
.release-card span {
margin-bottom: 0;
}
.release-card h3 {
margin: 0;
color: var(--theme-text);
font-size: var(--text-xl);
line-height: 1.08;
font-weight: 400;
letter-spacing: 0;
}
@media (max-width: 760px) {
.small-page {
padding-inline: var(--page-x);
}
.small-shell {
width: var(--container-wide);
padding-inline: clamp(0.9rem, 4vw, 1.1rem);
@media (max-width: 1180px) {
.small-requirements,
.release-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
/* --- Design System Refinement End --- */
@media (max-width: 760px) {
.small-hero {
padding-top: clamp(1.4rem, 5vw, 2rem);
}
.small-hero h1 {
font-size: clamp(2.55rem, 13vw, 4.4rem);
}
.small-requirements,
.release-grid {
grid-template-columns: 1fr;
}
.small-panel button,
.release-card button {
width: 100%;
}
}

View File

@ -62,7 +62,7 @@ function SmallBatchPage() {
<div className="small-page">
<SharedNavbar variant="light" />
<main className="small-shell">
<main className="shell">
<section className="small-hero" data-reveal-group>
<span className="small-kicker" data-reveal="fade">
SMALL BATCH / ARCHIVE / PROTOTYPE

View File

@ -1,16 +1,10 @@
.support-page {
min-height: 100vh;
padding: 0 0 var(--section-y-sm);
color: var(--theme-text);
padding: 26px 38px 38px;
background:
linear-gradient(to right, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0.1)),
linear-gradient(to bottom, rgba(0, 0, 0, 0.2), rgba(0, 0, 0, 0.45));
}
.support-shell {
background: var(--theme-surface);
border: 1px solid var(--theme-border);
padding: 38px;
radial-gradient(circle at 86% 8%, rgba(var(--theme-accent-rgb) / 0.13), transparent 28rem),
linear-gradient(180deg, var(--theme-bg), color-mix(in srgb, var(--theme-bg) 88%, #000 12%));
}
.support-kicker,
@ -18,435 +12,119 @@
.support-panel-label,
.support-panel-meta span {
display: block;
font-size: 10px;
letter-spacing: 0.22em;
color: var(--theme-text-muted);
font-size: var(--text-xs);
letter-spacing: 0.22em;
text-transform: uppercase;
}
.support-hero {
display: grid;
grid-template-columns: minmax(0, 1.35fr) minmax(280px, 0.8fr);
gap: 28px;
grid-template-columns: minmax(0, 1.45fr) minmax(18rem, 0.72fr);
gap: var(--gap-lg);
align-items: end;
padding-bottom: 36px;
padding: clamp(2rem, 5vw, 5rem) 0 var(--section-y-sm);
border-bottom: 1px solid var(--theme-border);
}
.support-hero-copy h1 {
margin: 14px 0 18px;
font-size: 68px;
line-height: 0.92;
font-weight: 300;
letter-spacing: 0;
color: var(--theme-text);
}
.support-intro {
max-width: 720px;
margin: 0;
font-size: 18px;
line-height: 1.65;
color: var(--theme-text-muted);
}
.support-hero-panel {
padding: 24px;
background: linear-gradient(
180deg,
rgba(255, 106, 0, 0.08),
rgba(255, 106, 0, 0.03)
);
border: 1px solid rgba(255, 106, 0, 0.18);
}
.support-hero-panel p {
margin: 10px 0 0;
font-size: 16px;
line-height: 1.6;
color: var(--theme-text);
}
.support-panel-meta {
display: grid;
grid-template-columns: 1fr;
gap: 16px;
margin-top: 24px;
padding-top: 20px;
border-top: 1px solid rgba(255, 106, 0, 0.14);
}
.support-panel-meta p {
margin: 8px 0 0;
font-size: 14px;
line-height: 1.55;
color: var(--theme-text);
}
.support-quick-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 18px;
margin-top: 38px;
}
.support-quick-card {
padding: 24px;
background: var(--theme-bg);
border: 1px solid var(--theme-border);
min-height: 240px;
}
.support-quick-card h3 {
margin: 14px 0 12px;
font-size: 24px;
line-height: 1.08;
font-weight: 400;
color: var(--theme-text);
}
.support-quick-card p {
margin: 0;
font-size: 15px;
line-height: 1.65;
color: var(--theme-text-muted);
}
.support-section {
padding-top: 38px;
}
.support-section--split {
display: grid;
grid-template-columns: minmax(260px, 0.7fr) minmax(0, 1.3fr);
gap: 28px;
align-items: start;
}
.support-section-heading h2,
.support-bottom-copy h2 {
margin: 10px 0 0;
font-size: 42px;
line-height: 0.98;
font-weight: 300;
letter-spacing: 0;
color: var(--theme-text);
}
.support-section-copy {
display: flex;
flex-direction: column;
gap: 18px;
}
.support-section-copy p,
.support-bottom-copy p {
margin: 0;
font-size: 16px;
line-height: 1.7;
color: var(--theme-text-muted);
}
.support-info-grid {
display: grid;
grid-template-columns: minmax(0, 1fr) minmax(320px, 0.9fr);
gap: 18px;
margin-top: 38px;
}
.support-info-box {
padding: 24px;
border: 1px solid var(--theme-border);
background: var(--theme-surface-soft);
}
.support-info-box h3 {
margin: 14px 0 12px;
font-size: 28px;
line-height: 1.02;
font-weight: 400;
color: #fff;
}
.support-info-box p {
margin: 0;
font-size: 15px;
line-height: 1.65;
color: var(--theme-text-muted);
}
.support-info-box--dark {
background: #1f1f1f;
border-color: var(--theme-text);
}
.support-info-box--dark .support-label,
.support-info-box--dark p {
color: rgba(255, 255, 255, 0.78);
}
.support-list {
margin: 14px 0 0;
padding-left: 18px;
display: grid;
gap: 10px;
}
.support-list li {
font-size: 15px;
line-height: 1.6;
color: var(--theme-text);
}
.support-mail-btn {
display: inline-flex;
align-items: center;
justify-content: center;
margin-top: 18px;
text-decoration: none;
padding: 12px 18px;
border-radius: 999px;
background: #ff6a00;
color: #fff;
font-size: 14px;
transition: transform 0.2s ease, opacity 0.2s ease, box-shadow 0.2s ease;
}
.support-mail-btn:hover {
transform: translateY(-1px);
}
.support-faq-section {
margin-top: 38px;
padding-top: 38px;
border-top: 1px solid var(--theme-border);
}
.support-faq-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: 18px;
margin-top: 28px;
}
.support-faq-card {
padding: 24px;
border: 1px solid var(--theme-border);
background: var(--theme-bg);
min-height: 210px;
}
.support-faq-card h3 {
margin: 0 0 12px;
font-size: 22px;
line-height: 1.08;
font-weight: 400;
color: var(--theme-text);
}
.support-faq-card p {
margin: 0;
font-size: 15px;
line-height: 1.65;
color: var(--theme-text-muted);
}
.support-bottom-cta {
margin-top: 38px;
padding: 38px;
background: #ff6a00;
display: grid;
grid-template-columns: minmax(0, 1.2fr) auto;
gap: 24px;
align-items: end;
}
.support-bottom-copy .support-label,
.support-bottom-copy h2,
.support-bottom-copy p {
color: #fff;
}
.support-bottom-copy .support-label {
opacity: 0.85;
}
.support-bottom-copy p {
margin-top: 16px;
max-width: 700px;
}
.support-bottom-actions {
display: flex;
gap: 12px;
flex-wrap: wrap;
}
.support-btn {
display: inline-flex;
align-items: center;
justify-content: center;
text-decoration: none;
padding: 12px 18px;
font-size: 14px;
border-radius: 999px;
transition: transform 0.2s ease, opacity 0.2s ease, box-shadow 0.2s ease;
}
.support-btn:hover {
transform: translateY(-1px);
}
.support-btn--primary {
background: var(--theme-paper);
color: #ff6a00;
}
.support-btn--secondary {
background: rgba(255, 255, 255, 0.14);
color: #fff;
backdrop-filter: blur(8px);
}
@media (max-width: 1100px) {
.support-hero,
.support-section--split,
.support-info-grid,
.support-bottom-cta {
grid-template-columns: 1fr;
}
.support-hero-copy h1 {
font-size: 52px;
}
.support-quick-grid,
.support-faq-grid {
grid-template-columns: 1fr;
}
}
@media (max-width: 700px) {
.support-page {
padding: 18px;
}
.support-shell {
padding: 24px 18px;
}
.support-hero-copy h1 {
font-size: 38px;
}
.support-section-heading h2,
.support-bottom-copy h2 {
font-size: 30px;
}
.support-intro,
.support-section-copy p,
.support-bottom-copy p,
.support-quick-card p,
.support-faq-card p {
font-size: 15px;
}
.support-bottom-cta {
padding: 26px 20px;
}
}
/* --- Design System Refinement Start --- */
.support-page {
padding: clamp(1rem, 3vw, 2.4rem) var(--page-x) clamp(2rem, 5vw, 4rem);
background:
radial-gradient(circle at 88% 9%, rgba(var(--theme-accent-rgb) / 0.12), transparent 28rem),
linear-gradient(135deg, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0.08)),
var(--theme-bg);
}
.support-shell {
width: var(--container-wide);
margin: 0 auto;
padding: clamp(1.25rem, 3vw, 2.8rem);
border-radius: var(--radius-lg);
box-shadow: var(--theme-shadow);
}
.support-kicker,
.support-label,
.support-panel-label,
.support-panel-meta span {
font-size: var(--text-xs);
}
.support-hero {
grid-template-columns: minmax(0, 1.45fr) minmax(18rem, 0.72fr);
gap: var(--gap-lg);
padding-bottom: var(--section-y-xs);
.support-hero-copy {
min-width: 0;
}
.support-hero-copy h1 {
max-width: 10.8ch;
margin: clamp(0.85rem, 2vw, 1.2rem) 0 clamp(1rem, 2vw, 1.35rem);
color: var(--theme-text);
font-size: clamp(3rem, 7.4vw, 8.8rem);
line-height: 0.9;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
text-wrap: balance;
}
.support-intro {
max-width: var(--text-measure);
margin: 0;
color: var(--theme-text-muted);
font-size: var(--text-lg);
}
.support-hero-panel,
.support-quick-card,
.support-info-box,
.support-faq-card,
.support-bottom-cta {
border-radius: var(--radius-lg);
line-height: 1.65;
}
.support-hero-panel {
padding: clamp(1.25rem, 3vw, 2rem);
border: 1px solid rgba(var(--theme-accent-rgb) / 0.2);
background:
linear-gradient(135deg, rgba(var(--theme-accent-rgb) / 0.1), transparent 62%),
var(--theme-surface-soft);
}
.support-hero-panel p {
margin: 0.75rem 0 0;
color: var(--theme-text);
font-size: var(--text-base);
line-height: 1.62;
}
.support-panel-meta {
display: grid;
gap: var(--gap-sm);
margin-top: clamp(1.2rem, 2.6vw, 2rem);
padding-top: var(--gap-sm);
border-top: 1px solid rgba(var(--theme-accent-rgb) / 0.2);
}
.support-panel-meta p {
margin: 0.45rem 0 0;
color: var(--theme-text);
font-size: var(--text-sm);
line-height: 1.55;
}
.support-quick-grid,
.support-info-grid,
.support-faq-grid {
display: grid;
gap: var(--gap-sm);
margin-top: var(--section-y-xs);
}
.support-quick-grid {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 18rem), 1fr));
grid-template-columns: repeat(3, minmax(0, 1fr));
margin-top: var(--section-y-sm);
}
.support-faq-grid {
grid-template-columns: repeat(auto-fit, minmax(min(100%, 24rem), 1fr));
}
.support-section {
padding-top: var(--section-y-xs);
.support-section,
.support-faq-section {
padding-top: var(--section-y-sm);
}
.support-section--split,
.support-info-grid,
.support-bottom-cta {
.support-info-grid {
display: grid;
grid-template-columns: minmax(16rem, 0.72fr) minmax(0, 1.28fr);
gap: var(--gap-lg);
align-items: start;
}
.support-info-grid {
margin-top: var(--section-y-sm);
}
.support-section-heading h2,
.support-bottom-copy h2 {
margin: 0.75rem 0 0;
color: var(--theme-text);
font-size: clamp(2.15rem, 5.2vw, 6rem);
line-height: 0.94;
font-weight: 300;
letter-spacing: 0;
text-transform: uppercase;
text-wrap: balance;
}
.support-section-copy {
display: flex;
flex-direction: column;
gap: var(--gap-sm);
}
@ -456,12 +134,21 @@
.support-faq-card p,
.support-info-box p,
.support-list li {
margin: 0;
color: var(--theme-text-muted);
font-size: var(--text-base);
line-height: 1.7;
}
.support-quick-card,
.support-faq-card,
.support-info-box {
min-height: 100%;
padding: clamp(1.1rem, 2.4vw, 1.8rem);
border: 1px solid var(--theme-border);
background:
linear-gradient(180deg, rgba(255, 255, 255, 0.035), rgba(255, 255, 255, 0.008)),
var(--theme-surface-soft);
transition:
transform var(--duration-med) var(--ease-out),
border-color var(--duration-med) var(--ease-out),
@ -479,72 +166,170 @@
.support-quick-card h3,
.support-faq-card h3,
.support-info-box h3 {
margin: 0.9rem 0 0.75rem;
color: var(--theme-text);
font-size: var(--text-xl);
line-height: 1.08;
font-weight: 400;
letter-spacing: 0;
}
.support-info-box--dark {
border-color: rgba(255, 255, 255, 0.16);
background:
radial-gradient(circle at 100% 0%, rgba(var(--theme-accent-rgb) / 0.18), transparent 18rem),
#171717;
}
.support-info-box--dark .support-label,
.support-info-box--dark p {
color: rgba(255, 255, 255, 0.78);
}
.support-info-box--dark h3 {
color: #fff;
}
.support-list {
display: grid;
gap: 0.75rem;
margin: 1rem 0 0;
padding-left: 1.1rem;
}
.support-mail-btn {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 48px;
margin-top: 1.15rem;
padding: 0 1.1rem;
border-radius: 999px;
background: var(--theme-accent);
color: #fff;
font-size: var(--text-sm);
text-decoration: none;
transition:
transform var(--duration-med) var(--ease-out),
box-shadow var(--duration-med) var(--ease-out);
}
.support-mail-btn:hover,
.support-mail-btn:focus-visible {
transform: translateY(-2px);
box-shadow: var(--theme-shadow-soft);
}
.support-faq-section {
margin-top: var(--section-y-xs);
padding-top: var(--section-y-xs);
margin-top: var(--section-y-sm);
border-top: 1px solid var(--theme-border);
}
.support-faq-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
margin-top: clamp(1.6rem, 4vw, 3rem);
}
.support-bottom-cta {
margin-top: var(--section-y-xs);
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: var(--gap-lg);
align-items: end;
margin-top: var(--section-y-sm);
padding: clamp(1.5rem, 4vw, 3.5rem);
overflow: hidden;
background:
radial-gradient(circle at 92% 0%, rgba(255, 255, 255, 0.22), transparent 20rem),
var(--theme-accent);
}
.support-btn,
.support-mail-btn {
.support-bottom-copy .support-label,
.support-bottom-copy h2,
.support-bottom-copy p {
color: #fff;
}
.support-bottom-copy p {
max-width: 48rem;
margin-top: 1rem;
}
.support-bottom-actions {
display: flex;
flex-wrap: wrap;
gap: var(--gap-xs);
justify-content: flex-end;
}
.support-btn {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 48px;
padding: 0 1.1rem;
border: 1px solid transparent;
border-radius: 999px;
color: inherit;
font-size: var(--text-sm);
text-decoration: none;
transition:
transform var(--duration-med) var(--ease-out),
box-shadow var(--duration-med) var(--ease-out),
background-color var(--duration-med) var(--ease-out);
}
.support-btn:hover,
.support-btn:focus-visible,
.support-mail-btn:hover,
.support-mail-btn:focus-visible {
.support-btn:focus-visible {
transform: translateY(-2px);
box-shadow: var(--theme-shadow-soft);
}
@media (max-width: 1100px) {
.support-btn--primary {
background: #fff;
color: var(--theme-accent);
}
.support-btn--secondary {
border-color: rgba(255, 255, 255, 0.22);
background: rgba(255, 255, 255, 0.14);
color: #fff;
backdrop-filter: blur(8px);
}
@media (max-width: 1180px) {
.support-hero,
.support-section--split,
.support-info-grid,
.support-bottom-cta {
grid-template-columns: 1fr;
}
.support-quick-grid,
.support-faq-grid {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
}
@media (max-width: 700px) {
.support-page {
padding-inline: var(--page-x);
}
.support-shell {
width: var(--container-wide);
padding-inline: clamp(0.9rem, 4vw, 1.1rem);
@media (max-width: 760px) {
.support-hero {
padding-top: clamp(1.4rem, 5vw, 2rem);
}
.support-hero-copy h1 {
font-size: clamp(2.55rem, 13vw, 4.4rem);
}
.support-quick-grid,
.support-faq-grid {
grid-template-columns: 1fr;
}
.support-bottom-actions {
display: grid;
justify-content: stretch;
}
.support-btn {
width: 100%;
}
}
/* --- Design System Refinement End --- */

View File

@ -7,7 +7,7 @@ function SupportPage() {
<div className="support-page">
<SharedNavbar variant="light" />
<main className="support-shell">
<main className="shell">
<section className="support-hero" data-reveal-group>
<div className="support-hero-copy">
<span className="support-kicker" data-reveal="fade">