x
This commit is contained in:
1 parent
3cacaacbeb
commit
8b73b8dd2f
52 files changed
+265
-265
No files matched your search
@@ -105,7 +105,7 @@ export default async function AboutPage({ params }: { params: Promise<{ lang: st
|
||||
<h2 className="text-4xl font-bold text-text-main">Ready to find your scent?</h2>
|
||||
<p className="mx-auto max-w-md text-muted-text">Let our Scent Guide help you discover the perfect blend for your moment.</p>
|
||||
<div className="flex flex-col justify-center gap-4 pt-4 sm:flex-row">
|
||||
<Link href="/scent-guide" className="rounded-full bg-text-main px-10 py-4 font-bold uppercase tracking-widest text-white transition hover:bg-brand-primary">
|
||||
<Link href="/scent-guide" className="rounded-full bg-text-main px-10 py-4 font-bold uppercase tracking-widest text-surface-card transition hover:bg-brand-primary">
|
||||
Take the Scent Guide
|
||||
</Link>
|
||||
<Link href="/shop" className="rounded-full border border-brand-primary bg-surface-card px-10 py-4 font-bold uppercase tracking-widest text-brand-primary transition hover:bg-surface-page">
|
||||
|
||||
@@ -124,7 +124,7 @@ export default async function CategoryPage({ params }: { params: Promise<{ id: s
|
||||
href={`/category/${item.id}`}
|
||||
className={`rounded-full px-5 py-2 text-xs font-bold uppercase tracking-widest transition ${
|
||||
isActive
|
||||
? 'bg-text-main text-white'
|
||||
? 'bg-text-main text-surface-card'
|
||||
: 'border border-line-primary/20 bg-surface-card text-muted-text hover:border-brand-primary hover:text-brand-primary'
|
||||
}`}
|
||||
>
|
||||
|
||||
@@ -75,7 +75,7 @@ export default async function CouponsPage({ params }: { params: Promise<{ lang:
|
||||
<p className="mb-6 text-muted-text">กรุณากลับมาตรวจสอบโปรโมชั่นใหม่ในภายหลัง</p>
|
||||
<Link
|
||||
href="/shop"
|
||||
className="inline-flex rounded-full bg-brand-primary px-8 py-3 font-bold text-white transition hover:bg-brand-primary-hover"
|
||||
className="inline-flex rounded-full bg-brand-primary px-8 py-3 font-bold text-surface-card transition hover:bg-brand-primary-hover"
|
||||
>
|
||||
ไปช้อปปิ้งกันก่อน
|
||||
</Link>
|
||||
@@ -116,7 +116,7 @@ export default async function CouponsPage({ params }: { params: Promise<{ lang:
|
||||
|
||||
<Link
|
||||
href={`/shop?coupon=${encodeURIComponent(coupon.code)}`}
|
||||
className="flex w-full items-center justify-center gap-2 rounded-full bg-text-main py-4 font-bold text-white transition hover:bg-brand-primary"
|
||||
className="flex w-full items-center justify-center gap-2 rounded-full bg-text-main py-4 font-bold text-surface-card transition hover:bg-brand-primary"
|
||||
>
|
||||
ช้อปพร้อมใช้คูปองเลย
|
||||
<ArrowRight className="h-4 w-4" />
|
||||
|
||||
@@ -83,7 +83,7 @@ export default function FaqPage() {
|
||||
onClick={() => setActiveCategory(category)}
|
||||
className={`flex items-center gap-2 rounded-full px-5 py-2 text-xs font-bold uppercase tracking-widest transition-all duration-300 ${
|
||||
activeCategory === category
|
||||
? 'ui-tab-button-active bg-text-main text-white shadow-card'
|
||||
? 'ui-tab-button-active bg-text-main text-surface-card shadow-card'
|
||||
: 'ui-tab-button-inactive border border-line-primary/20 bg-surface-card hover:border-brand-primary hover:text-brand-primary'
|
||||
}`}
|
||||
>
|
||||
@@ -119,7 +119,7 @@ export default function FaqPage() {
|
||||
<div className="text-3xl">💬</div>
|
||||
<h3 className="text-xl font-bold text-text-main">Still have questions?</h3>
|
||||
<p className="text-sm text-muted-text">Our team is here to help — usually responds within 2 hours.</p>
|
||||
<Link href="/contact" className="inline-block rounded-full bg-text-main px-8 py-3 text-xs font-bold uppercase tracking-widest text-white transition-colors duration-300 hover:bg-brand-primary">
|
||||
<Link href="/contact" className="inline-block rounded-full bg-text-main px-8 py-3 text-xs font-bold uppercase tracking-widest text-surface-card transition-colors duration-300 hover:bg-brand-primary">
|
||||
Contact Us
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
@@ -182,7 +182,7 @@ export default async function OrderStatusPage({ params }: { params: Promise<{ id
|
||||
<Link href="/track" className="rounded-full bg-surface-card px-6 py-3 font-semibold text-text-main shadow-card transition hover:text-brand-primary">
|
||||
ค้นหาออเดอร์อื่น
|
||||
</Link>
|
||||
<Link href="/shop" className="rounded-full bg-brand-primary px-6 py-3 font-semibold text-white transition hover:bg-brand-primary-hover">
|
||||
<Link href="/shop" className="rounded-full bg-brand-primary px-6 py-3 font-semibold text-surface-card transition hover:bg-brand-primary-hover">
|
||||
กลับไปช้อปต่อ
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
@@ -57,7 +57,7 @@ export default async function SearchPage({ searchParams, params }: { searchParam
|
||||
placeholder="Search by scent or product name..."
|
||||
className="min-w-0 flex-1 px-5 py-3 text-sm text-text-main outline-none placeholder:text-muted-text/70"
|
||||
/>
|
||||
<button className="bg-text-main px-6 py-3 text-sm font-bold uppercase tracking-widest text-white transition hover:bg-brand-primary">
|
||||
<button className="bg-text-main px-6 py-3 text-sm font-bold uppercase tracking-widest text-surface-card transition hover:bg-brand-primary">
|
||||
Search
|
||||
</button>
|
||||
</form>
|
||||
|
||||
@@ -61,7 +61,7 @@ export default async function ShopPage({ searchParams, params }: { searchParams:
|
||||
|
||||
<div className="mx-auto max-w-7xl space-y-10 px-6 py-12">
|
||||
<div className="flex flex-wrap gap-3">
|
||||
<Link className="rounded-full bg-text-main px-5 py-2 text-xs font-bold uppercase tracking-widest text-white transition hover:bg-brand-primary" href="/shop">
|
||||
<Link className="rounded-full bg-text-main px-5 py-2 text-xs font-bold uppercase tracking-widest text-surface-card transition hover:bg-brand-primary" href="/shop">
|
||||
All
|
||||
</Link>
|
||||
{categories.map((category) => {
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
--color-brand-soft: #D8BFD8;
|
||||
--color-surface-page: #FFF0F5;
|
||||
--color-surface-nav-rest: #F9F8F5;
|
||||
--color-surface-card: #FFFFFF;
|
||||
--color-surface-card: var(--color-surface-card);
|
||||
--color-text-main: #333333;
|
||||
--color-muted-text: #666666;
|
||||
--color-line-primary: #00B900;
|
||||
@@ -91,7 +91,7 @@
|
||||
|
||||
@layer components {
|
||||
.brutal-box {
|
||||
@apply bg-white border border-gray-100 rounded-2xl shadow-brutal transition-all duration-300;
|
||||
@apply bg-surface-card border border-line-primary/20 rounded-2xl shadow-brutal transition-all duration-300;
|
||||
}
|
||||
|
||||
.brutal-box-hover {
|
||||
@@ -99,15 +99,15 @@
|
||||
}
|
||||
|
||||
.brutal-button {
|
||||
@apply px-8 py-4 bg-brand-primary text-white font-medium rounded-full shadow-brutal transition-all duration-300 hover:bg-brand-primary-hover hover:-translate-y-1 hover:shadow-brutal-hover;
|
||||
@apply px-8 py-4 bg-brand-primary text-surface-card font-medium rounded-full shadow-brutal transition-all duration-300 hover:bg-brand-primary-hover hover:-translate-y-1 hover:shadow-brutal-hover;
|
||||
}
|
||||
|
||||
.brutal-button-alt {
|
||||
@apply px-8 py-4 bg-white text-brand-primary font-medium rounded-full border border-brand-primary shadow-brutal transition-all duration-300 hover:bg-surface-page hover:-translate-y-1 hover:shadow-brutal-hover;
|
||||
@apply px-8 py-4 bg-surface-card text-brand-primary font-medium rounded-full border border-brand-primary shadow-brutal transition-all duration-300 hover:bg-surface-page hover:-translate-y-1 hover:shadow-brutal-hover;
|
||||
}
|
||||
|
||||
.ui-card {
|
||||
@apply rounded-2xl border border-gray-100 bg-surface-card shadow-card transition-all duration-300;
|
||||
@apply rounded-2xl border border-line-primary/20 bg-surface-card shadow-card transition-all duration-300;
|
||||
}
|
||||
|
||||
.ui-card-hover {
|
||||
@@ -115,15 +115,15 @@
|
||||
}
|
||||
|
||||
.ui-button-primary {
|
||||
@apply inline-flex items-center justify-center rounded-full bg-text-main px-6 py-3 text-xs font-bold uppercase tracking-widest text-white transition-colors hover:bg-brand-primary;
|
||||
@apply inline-flex items-center justify-center rounded-full bg-text-main px-6 py-3 text-xs font-bold uppercase tracking-widest text-surface-card transition-colors hover:bg-brand-primary;
|
||||
}
|
||||
|
||||
.ui-button-brand {
|
||||
@apply inline-flex items-center justify-center rounded-full bg-brand-primary px-6 py-3 text-xs font-bold uppercase tracking-widest text-white transition-colors hover:bg-brand-primary-hover;
|
||||
@apply inline-flex items-center justify-center rounded-full bg-brand-primary px-6 py-3 text-xs font-bold uppercase tracking-widest text-surface-card transition-colors hover:bg-brand-primary-hover;
|
||||
}
|
||||
|
||||
.ui-button-line {
|
||||
@apply inline-flex items-center justify-center rounded-full bg-line-primary px-4 py-2 text-xs font-bold uppercase tracking-widest text-white shadow-sm transition-colors hover:bg-line-primary-hover;
|
||||
@apply inline-flex items-center justify-center rounded-full bg-line-primary px-4 py-2 text-xs font-bold uppercase tracking-widest text-surface-card shadow-sm transition-colors hover:bg-line-primary-hover;
|
||||
}
|
||||
|
||||
.ui-icon-button {
|
||||
@@ -135,11 +135,11 @@
|
||||
}
|
||||
|
||||
.ui-nav-chip {
|
||||
@apply flex items-center gap-1.5 rounded-full border border-brand-primary/30 bg-white px-3 py-2 text-[10px] font-bold uppercase tracking-wider text-text-main transition-all hover:bg-surface-page hover:text-brand-primary;
|
||||
@apply flex items-center gap-1.5 rounded-full border border-brand-primary/30 bg-surface-card px-3 py-2 text-[10px] font-bold uppercase tracking-wider text-text-main transition-all hover:bg-surface-page hover:text-brand-primary;
|
||||
}
|
||||
|
||||
.ui-nav-panel {
|
||||
@apply overflow-hidden rounded-xl border border-text-main/10 bg-white/95 shadow-2xl backdrop-blur-xl;
|
||||
@apply overflow-hidden rounded-xl border border-text-main/10 bg-surface-card shadow-2xl backdrop-blur-xl;
|
||||
}
|
||||
|
||||
.ui-menu-link {
|
||||
@@ -159,11 +159,11 @@
|
||||
}
|
||||
|
||||
.ui-muted-text {
|
||||
@apply text-gray-600;
|
||||
@apply text-muted-text;
|
||||
}
|
||||
|
||||
.ui-input-shell {
|
||||
@apply rounded-2xl border border-gray-200 bg-surface-page text-text-main outline-none transition focus:border-brand-primary focus:ring-2 focus:ring-brand-primary/20;
|
||||
@apply rounded-2xl border border-line-primary/20 bg-surface-page text-text-main outline-none transition focus:border-brand-primary focus:ring-2 focus:ring-brand-primary/20;
|
||||
}
|
||||
|
||||
.ui-footer-link {
|
||||
@@ -171,7 +171,7 @@
|
||||
}
|
||||
|
||||
.ui-footer-social {
|
||||
@apply flex h-9 w-9 items-center justify-center rounded-full border border-gray-200 bg-surface-page text-[10px] font-bold text-text-main transition-all duration-300 hover:border-brand-primary hover:bg-brand-primary hover:text-white;
|
||||
@apply flex h-9 w-9 items-center justify-center rounded-full border border-line-primary/20 bg-surface-page text-[10px] font-bold text-text-main transition-all duration-300 hover:border-brand-primary hover:bg-brand-primary hover:text-surface-card;
|
||||
}
|
||||
|
||||
.ui-section-band {
|
||||
@@ -187,11 +187,11 @@
|
||||
}
|
||||
|
||||
.ui-section-subtitle {
|
||||
@apply text-gray-500;
|
||||
@apply text-muted-text;
|
||||
}
|
||||
|
||||
.ui-section-card {
|
||||
@apply rounded-3xl bg-white shadow-card;
|
||||
@apply rounded-3xl bg-surface-card shadow-card;
|
||||
}
|
||||
|
||||
.ui-section-card-muted {
|
||||
@@ -215,7 +215,7 @@
|
||||
justify-content: center;
|
||||
overflow: hidden;
|
||||
background: var(--color-text-main);
|
||||
color: #fff;
|
||||
color: var(--color-surface-card);
|
||||
}
|
||||
|
||||
.ui-hero-overlay {
|
||||
@@ -236,7 +236,7 @@
|
||||
}
|
||||
|
||||
.ui-hero-title {
|
||||
color: #fff;
|
||||
color: var(--color-surface-card);
|
||||
font-family: var(--font-display-locale);
|
||||
font-size: 3rem;
|
||||
font-weight: 300;
|
||||
@@ -274,7 +274,7 @@
|
||||
align-items: center;
|
||||
gap: 0.5rem;
|
||||
padding: 1rem 2rem;
|
||||
color: #fff;
|
||||
color: var(--color-surface-card);
|
||||
font-size: 0.875rem;
|
||||
font-weight: 500;
|
||||
letter-spacing: 0.1em;
|
||||
@@ -308,7 +308,7 @@
|
||||
z-index: 10;
|
||||
max-width: 36rem;
|
||||
padding: 2rem;
|
||||
color: #fff;
|
||||
color: var(--color-surface-card);
|
||||
}
|
||||
|
||||
.ui-banner-content > * + * {
|
||||
@@ -318,7 +318,7 @@
|
||||
.ui-section-dark {
|
||||
background: var(--color-text-main);
|
||||
padding: 5rem 1.5rem;
|
||||
color: #fff;
|
||||
color: var(--color-surface-card);
|
||||
}
|
||||
|
||||
.ui-section-dark-card {
|
||||
@@ -329,7 +329,7 @@
|
||||
}
|
||||
|
||||
.ui-section-dark-card-title {
|
||||
color: #fff;
|
||||
color: var(--color-surface-card);
|
||||
font-size: 2.25rem;
|
||||
font-weight: 600;
|
||||
line-height: 2.5rem;
|
||||
@@ -389,7 +389,7 @@
|
||||
}
|
||||
|
||||
.ui-panel {
|
||||
@apply rounded-3xl bg-white shadow-card;
|
||||
@apply rounded-3xl bg-surface-card shadow-card;
|
||||
}
|
||||
|
||||
.ui-panel-muted {
|
||||
@@ -397,11 +397,11 @@
|
||||
}
|
||||
|
||||
.ui-panel-border {
|
||||
@apply rounded-3xl border border-gray-100 bg-white shadow-card;
|
||||
@apply rounded-3xl border border-line-primary/20 bg-surface-card shadow-card;
|
||||
}
|
||||
|
||||
.ui-panel-header {
|
||||
@apply flex items-center gap-3 border-b border-gray-100 pb-5;
|
||||
@apply flex items-center gap-3 border-b border-line-primary/20 pb-5;
|
||||
}
|
||||
|
||||
.ui-panel-title {
|
||||
@@ -409,31 +409,31 @@
|
||||
}
|
||||
|
||||
.ui-panel-subtitle {
|
||||
@apply text-sm text-gray-500;
|
||||
@apply text-sm text-muted-text;
|
||||
}
|
||||
|
||||
.ui-form-label {
|
||||
@apply text-xs font-bold uppercase tracking-[0.18em] text-gray-500;
|
||||
@apply text-xs font-bold uppercase tracking-[0.18em] text-muted-text;
|
||||
}
|
||||
|
||||
.ui-form-shell {
|
||||
@apply w-full rounded-2xl border border-gray-200 bg-surface-page px-4 py-3 text-sm text-text-main outline-none transition focus:border-brand-primary focus:ring-2 focus:ring-brand-primary/20;
|
||||
@apply w-full rounded-2xl border border-line-primary/20 bg-surface-page px-4 py-3 text-sm text-text-main outline-none transition focus:border-brand-primary focus:ring-2 focus:ring-brand-primary/20;
|
||||
}
|
||||
|
||||
.ui-form-shell-light {
|
||||
@apply w-full rounded-2xl border border-gray-200 bg-white px-4 py-3 text-sm text-text-main outline-none transition focus:border-brand-primary focus:ring-2 focus:ring-brand-primary/20;
|
||||
@apply w-full rounded-2xl border border-line-primary/20 bg-surface-card px-4 py-3 text-sm text-text-main outline-none transition focus:border-brand-primary focus:ring-2 focus:ring-brand-primary/20;
|
||||
}
|
||||
|
||||
.ui-form-inline-button {
|
||||
@apply inline-flex items-center justify-center gap-2 rounded-full bg-text-main px-6 py-4 text-sm font-bold uppercase tracking-[0.16em] text-white transition hover:bg-brand-primary disabled:cursor-not-allowed disabled:opacity-60;
|
||||
@apply inline-flex items-center justify-center gap-2 rounded-full bg-text-main px-6 py-4 text-sm font-bold uppercase tracking-[0.16em] text-surface-card transition hover:bg-brand-primary disabled:cursor-not-allowed disabled:opacity-60;
|
||||
}
|
||||
|
||||
.ui-form-inline-button-sm {
|
||||
@apply inline-flex items-center justify-center gap-2 rounded-full bg-text-main px-5 py-2 text-sm font-semibold text-white transition hover:bg-brand-primary disabled:cursor-not-allowed disabled:opacity-60;
|
||||
@apply inline-flex items-center justify-center gap-2 rounded-full bg-text-main px-5 py-2 text-sm font-semibold text-surface-card transition hover:bg-brand-primary disabled:cursor-not-allowed disabled:opacity-60;
|
||||
}
|
||||
|
||||
.ui-form-secondary-button {
|
||||
@apply rounded-full border border-gray-200 px-5 py-2 text-sm font-semibold text-gray-600 transition hover:text-brand-primary;
|
||||
@apply rounded-full border border-line-primary/20 px-5 py-2 text-sm font-semibold text-muted-text transition hover:text-brand-primary;
|
||||
}
|
||||
|
||||
.ui-form-danger-button {
|
||||
@@ -441,7 +441,7 @@
|
||||
}
|
||||
|
||||
.ui-form-checkbox {
|
||||
@apply h-4 w-4 rounded border-gray-300 text-brand-primary;
|
||||
@apply h-4 w-4 rounded border-line-primary/20 text-brand-primary;
|
||||
}
|
||||
|
||||
.ui-status-badge {
|
||||
@@ -523,7 +523,7 @@
|
||||
}
|
||||
|
||||
.ui-tab-button-inactive {
|
||||
@apply text-gray-500 hover:text-text-main;
|
||||
@apply text-muted-text hover:text-text-main;
|
||||
}
|
||||
|
||||
.ui-tab-count {
|
||||
@@ -531,7 +531,7 @@
|
||||
}
|
||||
|
||||
.ui-empty-panel {
|
||||
@apply rounded-3xl bg-white px-6 py-16 text-center shadow-card;
|
||||
@apply rounded-3xl bg-surface-card px-6 py-16 text-center shadow-card;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -545,11 +545,11 @@
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb {
|
||||
@apply bg-gray-300 rounded-full;
|
||||
@apply bg-surface-nav-rest rounded-full;
|
||||
}
|
||||
|
||||
::-webkit-scrollbar-thumb:hover {
|
||||
@apply bg-gray-400;
|
||||
@apply bg-surface-nav-rest;
|
||||
}
|
||||
|
||||
/* Smooth Scrolling */
|
||||
|
||||
@@ -70,12 +70,12 @@ export default function AddToCartSection({ product }: Props) {
|
||||
onClick={() => setSelectedVariant(index)}
|
||||
className={`rounded-xl border px-5 py-3 text-sm font-bold uppercase tracking-widest transition ${
|
||||
selectedVariant === index
|
||||
? 'border-brand-primary bg-brand-primary text-white shadow-card'
|
||||
? 'border-brand-primary bg-brand-primary text-surface-card shadow-card'
|
||||
: 'border-line-primary/20 bg-surface-card text-muted-text hover:border-brand-primary hover:text-brand-primary'
|
||||
}`}
|
||||
>
|
||||
{variant.size}
|
||||
<span className={`mt-1 block text-[10px] ${selectedVariant === index ? 'text-white/80' : 'text-muted-text/70'}`}>
|
||||
<span className={`mt-1 block text-[10px] ${selectedVariant === index ? 'text-surface-card' : 'text-muted-text/70'}`}>
|
||||
{formatPrice(variant.price)}
|
||||
</span>
|
||||
</button>
|
||||
@@ -124,7 +124,7 @@ export default function AddToCartSection({ product }: Props) {
|
||||
onClick={() => setSelectedVariant(index)}
|
||||
className={`flex-shrink-0 rounded-full border px-4 py-2 text-[10px] font-bold uppercase tracking-widest transition ${
|
||||
selectedVariant === index
|
||||
? 'border-brand-primary bg-brand-primary text-white'
|
||||
? 'border-brand-primary bg-brand-primary text-surface-card'
|
||||
: 'border-line-primary/20 bg-surface-card text-muted-text'
|
||||
}`}
|
||||
>
|
||||
|
||||
@@ -83,7 +83,7 @@ export default function CartDrawer() {
|
||||
<span className="text-brand-primary">{formatPrice(getCartTotal())}</span>
|
||||
</div>
|
||||
<p className="text-center text-xs text-muted-text">{t('cart.shippingNote')}</p>
|
||||
<Link href="/checkout" onClick={() => toggleCart(false)} className="block w-full rounded-full bg-text-main py-4 text-center text-sm font-bold uppercase tracking-widest text-white transition hover:bg-brand-primary">
|
||||
<Link href="/checkout" onClick={() => toggleCart(false)} className="block w-full rounded-full bg-text-main py-4 text-center text-sm font-bold uppercase tracking-widest text-surface-card transition hover:bg-brand-primary">
|
||||
{t('cart.proceed')}
|
||||
</Link>
|
||||
</div>
|
||||
|
||||
@@ -401,7 +401,7 @@ export default function CheckoutClient() {
|
||||
<ShoppingBag className="mx-auto h-14 w-14 text-brand-primary" />
|
||||
<h2 className="mt-5 text-3xl font-semibold text-text-main">ตะกร้าสินค้าว่าง</h2>
|
||||
<p className="mt-3 text-muted-text">เลือกสินค้าที่คุณชอบก่อน แล้วกลับมายืนยันคำสั่งซื้อที่หน้านี้ได้เลย</p>
|
||||
<Link href="/shop" className="mt-8 inline-flex rounded-full bg-text-main px-8 py-4 text-sm font-bold uppercase tracking-[0.16em] text-white transition hover:bg-brand-primary">
|
||||
<Link href="/shop" className="mt-8 inline-flex rounded-full bg-text-main px-8 py-4 text-sm font-bold uppercase tracking-[0.16em] text-surface-card transition hover:bg-brand-primary">
|
||||
กลับไปเลือกสินค้า
|
||||
</Link>
|
||||
</div>
|
||||
@@ -642,7 +642,7 @@ export default function CheckoutClient() {
|
||||
type="button"
|
||||
onClick={applyCoupon}
|
||||
disabled={couponLoading || !couponCode.trim()}
|
||||
className="rounded-2xl bg-text-main px-4 py-3 text-xs font-bold uppercase tracking-widest text-white transition hover:bg-brand-primary disabled:opacity-50"
|
||||
className="rounded-2xl bg-text-main px-4 py-3 text-xs font-bold uppercase tracking-widest text-surface-card transition hover:bg-brand-primary disabled:opacity-50"
|
||||
>
|
||||
{couponLoading ? <Loader2 className="h-4 w-4 animate-spin" /> : 'ใช้'}
|
||||
</button>
|
||||
@@ -756,7 +756,7 @@ export default function CheckoutClient() {
|
||||
type="submit"
|
||||
form="checkout-form"
|
||||
disabled={submitting || loadingSettings}
|
||||
className="hidden w-full items-center justify-between rounded-full bg-text-main px-6 py-4 text-sm font-bold uppercase tracking-[0.16em] text-white transition hover:bg-brand-primary disabled:cursor-not-allowed disabled:opacity-60 lg:flex"
|
||||
className="hidden w-full items-center justify-between rounded-full bg-text-main px-6 py-4 text-sm font-bold uppercase tracking-[0.16em] text-surface-card transition hover:bg-brand-primary disabled:cursor-not-allowed disabled:opacity-60 lg:flex"
|
||||
>
|
||||
<span className="flex items-center gap-2">
|
||||
{submitting && <Loader2 className="h-5 w-5 animate-spin" />}
|
||||
|
||||
@@ -231,7 +231,7 @@ export default function Navbar({ categories = [], initialMenu = [], settings = n
|
||||
>
|
||||
<Heart className="h-4 w-4 transition-colors" />
|
||||
{wishlistCount > 0 && (
|
||||
<span className="absolute -right-1 -top-1 flex h-4 w-4 items-center justify-center rounded-full bg-brand-primary text-[9px] font-bold text-white">
|
||||
<span className="absolute -right-1 -top-1 flex h-4 w-4 items-center justify-center rounded-full bg-brand-primary text-[9px] font-bold text-surface-card">
|
||||
{wishlistCount}
|
||||
</span>
|
||||
)}
|
||||
@@ -247,7 +247,7 @@ export default function Navbar({ categories = [], initialMenu = [], settings = n
|
||||
>
|
||||
<ShoppingBag className="h-4 w-4 transition-colors" />
|
||||
{cartCount > 0 && (
|
||||
<span className="absolute -right-1 -top-1 flex h-4 w-4 items-center justify-center rounded-full bg-brand-primary text-[9px] font-bold text-white">
|
||||
<span className="absolute -right-1 -top-1 flex h-4 w-4 items-center justify-center rounded-full bg-brand-primary text-[9px] font-bold text-surface-card">
|
||||
{cartCount}
|
||||
</span>
|
||||
)}
|
||||
@@ -353,7 +353,7 @@ export default function Navbar({ categories = [], initialMenu = [], settings = n
|
||||
className="w-full border-none bg-transparent p-4 pl-0 text-lg text-text-main outline-none placeholder:text-text-main/35 md:text-xl"
|
||||
autoFocus
|
||||
/>
|
||||
<button type="submit" className="shrink-0 bg-text-main px-4 text-xs font-bold uppercase tracking-widest text-white transition-colors hover:bg-brand-primary md:px-6">
|
||||
<button type="submit" className="shrink-0 bg-text-main px-4 text-xs font-bold uppercase tracking-widest text-surface-card transition-colors hover:bg-brand-primary md:px-6">
|
||||
Go
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -294,7 +294,7 @@ export default function ProfileClient() {
|
||||
<button
|
||||
type="button"
|
||||
onClick={handleLineLogin}
|
||||
className="mt-8 flex w-full items-center justify-center gap-3 rounded-full bg-line-primary px-6 py-4 text-sm font-bold uppercase tracking-[0.16em] text-white transition hover:bg-line-primary-hover"
|
||||
className="mt-8 flex w-full items-center justify-center gap-3 rounded-full bg-line-primary px-6 py-4 text-sm font-bold uppercase tracking-[0.16em] text-surface-card transition hover:bg-line-primary-hover"
|
||||
>
|
||||
<Award className="h-5 w-5" />
|
||||
เข้าสู่ระบบผ่าน LINE
|
||||
@@ -435,7 +435,7 @@ export default function ProfileClient() {
|
||||
สมุดที่อยู่จัดส่ง
|
||||
</h2>
|
||||
{!showAddressForm && (
|
||||
<button type="button" onClick={() => handleStartAddress()} className="inline-flex items-center justify-center gap-2 rounded-full bg-text-main px-5 py-3 text-xs font-bold uppercase tracking-[0.16em] text-white transition hover:bg-brand-primary">
|
||||
<button type="button" onClick={() => handleStartAddress()} className="inline-flex items-center justify-center gap-2 rounded-full bg-text-main px-5 py-3 text-xs font-bold uppercase tracking-[0.16em] text-surface-card transition hover:bg-brand-primary">
|
||||
<Plus className="h-4 w-4" />
|
||||
เพิ่มที่อยู่ใหม่
|
||||
</button>
|
||||
@@ -474,7 +474,7 @@ export default function ProfileClient() {
|
||||
<button type="button" onClick={resetAddressForm} className="ui-form-secondary-button">
|
||||
ยกเลิก
|
||||
</button>
|
||||
<button type="submit" disabled={submittingAddress} className="inline-flex items-center gap-2 rounded-full bg-brand-primary px-5 py-2 text-sm font-semibold text-white disabled:opacity-60">
|
||||
<button type="submit" disabled={submittingAddress} className="inline-flex items-center gap-2 rounded-full bg-brand-primary px-5 py-2 text-sm font-semibold text-surface-card disabled:opacity-60">
|
||||
{submittingAddress && <Loader2 className="h-4 w-4 animate-spin" />}
|
||||
บันทึกที่อยู่
|
||||
</button>
|
||||
@@ -534,7 +534,7 @@ export default function ProfileClient() {
|
||||
)}
|
||||
<TextInput label="อีเมล" value={settingsForm.email} onChange={(email) => setSettingsForm((current) => ({ ...current, email }))} type="email" />
|
||||
<TextInput label="เบอร์โทรศัพท์" value={settingsForm.phone} onChange={(phone) => setSettingsForm((current) => ({ ...current, phone }))} type="tel" />
|
||||
<button type="submit" disabled={submittingSettings} className="inline-flex w-full items-center justify-center gap-2 rounded-full bg-brand-primary px-6 py-3 text-sm font-bold uppercase tracking-[0.16em] text-white disabled:opacity-60">
|
||||
<button type="submit" disabled={submittingSettings} className="inline-flex w-full items-center justify-center gap-2 rounded-full bg-brand-primary px-6 py-3 text-sm font-bold uppercase tracking-[0.16em] text-surface-card disabled:opacity-60">
|
||||
{submittingSettings ? <Loader2 className="h-4 w-4 animate-spin" /> : <Check className="h-4 w-4" />}
|
||||
บันทึกข้อมูลติดต่อ
|
||||
</button>
|
||||
@@ -598,7 +598,7 @@ function EmptyPanel({
|
||||
<h3 className="text-xl font-semibold text-text-main">{title}</h3>
|
||||
<p className="mx-auto mt-2 max-w-md text-sm text-muted-text">{description}</p>
|
||||
{actionHref && actionText && (
|
||||
<Link href={actionHref} className="mt-6 inline-flex rounded-full bg-brand-primary px-6 py-3 text-sm font-bold text-white">
|
||||
<Link href={actionHref} className="mt-6 inline-flex rounded-full bg-brand-primary px-6 py-3 text-sm font-bold text-surface-card">
|
||||
{actionText}
|
||||
</Link>
|
||||
)}
|
||||
|
||||
@@ -174,7 +174,7 @@ export default function TrackOrderClient() {
|
||||
<p className="text-xs font-bold uppercase tracking-[0.22em] text-muted-text/70">Order</p>
|
||||
<p className="mt-1 font-mono text-2xl font-bold text-text-main">{orderLabel(id)}</p>
|
||||
</div>
|
||||
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-surface-page text-text-main transition group-hover:bg-brand-primary group-hover:text-white">
|
||||
<div className="flex h-10 w-10 items-center justify-center rounded-full bg-surface-page text-text-main transition group-hover:bg-brand-primary group-hover:text-surface-card">
|
||||
<ChevronRight className="h-5 w-5" />
|
||||
</div>
|
||||
</Link>
|
||||
|
||||
@@ -21,7 +21,7 @@ export default function WishlistClient() {
|
||||
</p>
|
||||
<Link
|
||||
href="/shop"
|
||||
className="mt-8 inline-flex rounded-full bg-brand-primary px-8 py-3 text-sm font-bold uppercase tracking-[0.18em] text-white transition hover:bg-brand-primary-hover"
|
||||
className="mt-8 inline-flex rounded-full bg-brand-primary px-8 py-3 text-sm font-bold uppercase tracking-[0.18em] text-surface-card transition hover:bg-brand-primary-hover"
|
||||
>
|
||||
Browse Shop
|
||||
</Link>
|
||||
|
||||
@@ -80,7 +80,7 @@ function AnnouncementBar({ payload, lang }: { payload: Record<string, unknown>,
|
||||
|
||||
return (
|
||||
<section
|
||||
className={`announcement-bar absolute left-0 top-0 z-[60] w-full overflow-hidden px-4 py-3 text-center text-sm font-semibold tracking-wide ${backgroundColor ? '' : 'bg-text-main'} ${textColor ? '' : 'text-white'}`}
|
||||
className={`announcement-bar absolute left-0 top-0 z-[60] w-full overflow-hidden px-4 py-3 text-center text-sm font-semibold tracking-wide ${backgroundColor ? '' : 'bg-text-main'} ${textColor ? '' : 'text-surface-card'}`}
|
||||
style={{ backgroundColor, color: textColor }}
|
||||
>
|
||||
<Swiper
|
||||
@@ -125,7 +125,7 @@ function HeroSection({ payload, lang }: { payload: Record<string, unknown>, lang
|
||||
<div className="relative z-10 mx-auto mt-16 w-full max-w-4xl space-y-6 px-8 text-center md:mt-0">
|
||||
<div className="space-y-6">
|
||||
{tagline && (
|
||||
<p className="text-xs font-semibold uppercase tracking-[0.3em] text-white drop-shadow-md md:text-sm">
|
||||
<p className="text-xs font-semibold uppercase tracking-[0.3em] text-surface-card drop-shadow-md md:text-sm">
|
||||
{tagline}
|
||||
</p>
|
||||
)}
|
||||
@@ -209,10 +209,10 @@ function CategoriesSection({
|
||||
className="absolute inset-0 h-full w-full object-cover transition duration-700 group-hover:scale-105"
|
||||
/>
|
||||
<div className="absolute inset-0 bg-gradient-to-t from-text-main/65 to-transparent" />
|
||||
<div className="absolute bottom-5 left-5 right-5 text-white">
|
||||
<div className="absolute bottom-5 left-5 right-5 text-surface-card">
|
||||
<span className="block text-lg font-semibold">{name}</span>
|
||||
{category._count && (
|
||||
<span className="text-sm text-white/80">
|
||||
<span className="text-sm text-surface-card">
|
||||
{category._count.products} {productsLabel[resolvedLang] ?? productsLabel.en}
|
||||
</span>
|
||||
)}
|
||||
@@ -290,7 +290,7 @@ function BannerSection({ payload, lang }: { payload: Record<string, unknown>, la
|
||||
<div className="ui-banner-overlay" />
|
||||
<div className="ui-banner-content">
|
||||
{title && <h2 className="text-3xl font-semibold md:text-5xl">{title}</h2>}
|
||||
{description && <p className="text-white/90">{description}</p>}
|
||||
{description && <p className="text-surface-card">{description}</p>}
|
||||
{buttonText && <span className="inline-flex rounded-full bg-surface-card px-6 py-3 font-semibold text-text-main">{buttonText}</span>}
|
||||
</div>
|
||||
</div>
|
||||
@@ -332,8 +332,8 @@ function NewsletterSection({ payload, lang }: { payload: Record<string, unknown>
|
||||
<section className="ui-section-dark">
|
||||
<div className="mx-auto grid max-w-5xl gap-8 md:grid-cols-[1fr_auto] md:items-end">
|
||||
<div className="space-y-3">
|
||||
<h2 className="text-3xl font-semibold text-white md:text-4xl">{title}</h2>
|
||||
{description && <p className="max-w-2xl text-white/75">{description}</p>}
|
||||
<h2 className="text-3xl font-semibold text-surface-card md:text-4xl">{title}</h2>
|
||||
{description && <p className="max-w-2xl text-surface-card">{description}</p>}
|
||||
</div>
|
||||
<form className="flex flex-col gap-3 sm:flex-row">
|
||||
<input className="ui-form-shell min-w-0 rounded-full" placeholder={placeholder} type="email" />
|
||||
@@ -381,7 +381,7 @@ function EditorialTileSection({ payload, lang }: { payload: Record<string, unkno
|
||||
<div className="h-px w-14 bg-brand-primary" />
|
||||
{description && <p className="whitespace-pre-line text-base leading-relaxed text-muted-text md:text-lg" style={{ color: textColor }}>{description}</p>}
|
||||
{buttonText && buttonLink && (
|
||||
<Link href={buttonLink} className="ui-section-link inline-flex rounded-full border border-current px-8 py-3 text-xs font-bold uppercase tracking-[0.22em] transition hover:bg-brand-primary hover:text-white">
|
||||
<Link href={buttonLink} className="ui-section-link inline-flex rounded-full border border-current px-8 py-3 text-xs font-bold uppercase tracking-[0.22em] transition hover:bg-brand-primary hover:text-surface-card">
|
||||
{buttonText}
|
||||
</Link>
|
||||
)}
|
||||
@@ -403,7 +403,7 @@ function EditorialCarouselSection({ payload, lang }: { payload: Record<string, u
|
||||
<div className="mx-auto max-w-7xl space-y-12">
|
||||
{title && (
|
||||
<div className="mx-auto max-w-3xl space-y-4 text-center">
|
||||
<h2 className="text-4xl font-semibold text-white md:text-5xl">{renderAccentTitle(title, 'ui-accent-text not-italic')}</h2>
|
||||
<h2 className="text-4xl font-semibold text-surface-card md:text-5xl">{renderAccentTitle(title, 'ui-accent-text not-italic')}</h2>
|
||||
<div className="mx-auto h-px w-16 bg-brand-accent" />
|
||||
</div>
|
||||
)}
|
||||
@@ -485,9 +485,9 @@ function HeroArticleSection({ payload, lang }: { payload: Record<string, unknown
|
||||
<div className="relative z-10 mx-auto max-w-4xl space-y-6">
|
||||
{category && <p className="text-xs font-bold uppercase tracking-[0.28em] text-brand-accent">{category}</p>}
|
||||
<h1 className="ui-hero-title">{title}</h1>
|
||||
{subtitle && <p className="mx-auto max-w-2xl text-lg text-white/85 md:text-xl">{subtitle}</p>}
|
||||
{subtitle && <p className="mx-auto max-w-2xl text-lg text-surface-card md:text-xl">{subtitle}</p>}
|
||||
{(author || date) && (
|
||||
<p className="text-xs font-bold uppercase tracking-[0.22em] text-white/70">
|
||||
<p className="text-xs font-bold uppercase tracking-[0.22em] text-surface-card">
|
||||
{[author && `${authorPrefix[resolvedLang] ?? authorPrefix.en} ${author}`, date].filter(Boolean).join(' / ')}
|
||||
</p>
|
||||
)}
|
||||
|
||||
@@ -213,7 +213,7 @@ export function MobileDrawer({
|
||||
<Link
|
||||
href="/shop"
|
||||
onClick={onClose}
|
||||
className="block w-full rounded-xl bg-text-main py-3.5 text-center text-xs font-bold uppercase tracking-widest text-white shadow-sm transition-colors hover:bg-brand-primary"
|
||||
className="block w-full rounded-xl bg-text-main py-3.5 text-center text-xs font-bold uppercase tracking-widest text-surface-card shadow-sm transition-colors hover:bg-brand-primary"
|
||||
>
|
||||
Shop Now
|
||||
</Link>
|
||||
|
||||
Reference in new issue
Block a user