Initial commit

This commit is contained in:
Azmat Ali
2026-03-02 13:22:47 +05:30
commit e4c373f050
36 changed files with 7304 additions and 0 deletions
+742
View File
@@ -0,0 +1,742 @@
/* ── ABOUT PAGE STYLES ── */
.about-page {
background: #f8fafc;
}
/* ── BREADCRUMB ── */
.breadcrumb-bar {
background: white;
border-bottom: 0.0625rem solid var(--gray-200);
padding: var(--space-3) 0;
}
.breadcrumb-inner {
max-width: 80rem;
margin: 0 auto;
padding: 0 var(--space-6);
display: flex;
align-items: center;
gap: var(--space-2);
font-size: var(--text-md);
color: var(--gray-400);
}
.breadcrumb-inner a {
color: var(--gray-600);
transition: color 0.2s;
}
.breadcrumb-inner a:hover {
color: var(--blue);
}
.breadcrumb-inner .sep {
color: var(--gray-300);
}
.breadcrumb-inner .current {
color: var(--blue);
font-weight: 600;
}
/* ── HERO BANNER ── */
.about-hero {
background: linear-gradient(135deg, #0e4da4 0%, #1a6fd4 50%, #17a2b8 100%);
padding: var(--space-14) var(--space-6);
position: relative;
overflow: hidden;
}
/* decorative circles */
.about-hero::before,
.about-hero::after {
content: "";
position: absolute;
border-radius: 50%;
opacity: 0.08;
background: white;
}
.about-hero::before {
width: 32rem;
height: 32rem;
top: -12rem;
right: -8rem;
}
.about-hero::after {
width: 20rem;
height: 20rem;
bottom: -8rem;
left: -4rem;
}
.about-hero-inner {
max-width: 80rem;
margin: 0 auto;
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-12);
align-items: center;
position: relative;
z-index: 1;
}
.about-hero-tag {
display: inline-flex;
align-items: center;
gap: var(--space-2);
background: rgba(255, 255, 255, 0.15);
color: rgba(255, 255, 255, 0.9);
font-size: var(--text-sm);
font-weight: 700;
letter-spacing: 0.08em;
text-transform: uppercase;
padding: var(--space-1) var(--space-3);
border-radius: var(--radius-full);
border: 0.0625rem solid rgba(255, 255, 255, 0.25);
margin-bottom: var(--space-4);
}
.about-hero h1 {
font-size: 2.75rem;
font-weight: 900;
color: white;
line-height: 1.15;
letter-spacing: -0.03em;
margin-bottom: var(--space-5);
}
.about-hero h1 em {
font-style: normal;
color: var(--yellow);
}
.about-hero-desc {
font-size: var(--text-xl);
color: rgba(255, 255, 255, 0.82);
line-height: 1.75;
margin-bottom: var(--space-6);
max-width: 30rem;
}
.about-hero-statement {
display: flex;
align-items: flex-start;
gap: var(--space-3);
background: rgba(255, 255, 255, 0.1);
border: 0.0625rem solid rgba(255, 255, 255, 0.2);
border-radius: var(--radius-xl);
padding: var(--space-4) var(--space-5);
backdrop-filter: blur(6px);
}
.about-hero-statement .quote-mark {
font-size: 3rem;
line-height: 1;
color: var(--yellow);
font-weight: 900;
margin-top: -0.5rem;
flex-shrink: 0;
}
.about-hero-statement p {
font-size: var(--text-lg);
color: rgba(255, 255, 255, 0.92);
font-style: italic;
line-height: 1.6;
font-weight: 500;
}
/* Hero right — identity cards */
.about-hero-cards {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.identity-card {
background: rgba(255, 255, 255, 0.12);
border: 0.0625rem solid rgba(255, 255, 255, 0.2);
border-radius: var(--radius-xl);
padding: var(--space-5) var(--space-6);
backdrop-filter: blur(8px);
display: flex;
align-items: center;
gap: var(--space-4);
transition: background 0.2s;
}
.identity-card:hover {
background: rgba(255, 255, 255, 0.18);
}
.identity-icon {
width: 3rem;
height: 3rem;
border-radius: var(--radius-lg);
background: rgba(255, 255, 255, 0.15);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
flex-shrink: 0;
}
.identity-label {
font-size: var(--text-sm);
color: rgba(255, 255, 255, 0.6);
font-weight: 600;
text-transform: uppercase;
letter-spacing: 0.06em;
margin-bottom: var(--space-1);
}
.identity-value {
font-size: var(--text-lg);
color: white;
font-weight: 700;
line-height: 1.3;
}
/* ── STATS STRIP ── */
.stats-strip {
background: white;
border-bottom: 0.0625rem solid var(--gray-200);
}
.stats-inner {
max-width: 80rem;
margin: 0 auto;
padding: var(--space-8) var(--space-6);
display: grid;
grid-template-columns: repeat(4, 1fr);
gap: var(--space-6);
}
.stat-item {
text-align: center;
padding: var(--space-5);
border-radius: var(--radius-xl);
transition: background 0.2s;
}
.stat-item:hover {
background: var(--gray-50);
}
.stat-num {
font-size: 2.5rem;
font-weight: 900;
color: var(--blue);
line-height: 1;
letter-spacing: -0.03em;
margin-bottom: var(--space-2);
}
.stat-num span {
color: var(--yellow);
}
.stat-label {
font-size: var(--text-md);
color: var(--gray-600);
font-weight: 500;
line-height: 1.4;
}
.stat-divider {
width: 0.0625rem;
background: var(--gray-200);
margin: var(--space-4) 0;
align-self: stretch;
}
/* ── SECTION WRAPPER ── */
.about-section {
max-width: 80rem;
margin: 0 auto;
padding: var(--space-12) var(--space-6);
}
.section-label {
display: inline-flex;
align-items: center;
gap: var(--space-2);
background: var(--blue-light);
color: var(--blue);
font-size: var(--text-sm);
font-weight: 700;
letter-spacing: 0.07em;
text-transform: uppercase;
padding: var(--space-1) var(--space-3);
border-radius: var(--radius-full);
margin-bottom: var(--space-4);
}
.section-heading {
font-size: var(--text-deal);
font-weight: 900;
color: var(--gray-800);
letter-spacing: -0.03em;
line-height: 1.15;
margin-bottom: var(--space-4);
}
.section-heading em {
font-style: normal;
color: var(--blue);
}
.section-subtext {
font-size: var(--text-xl);
color: var(--gray-600);
line-height: 1.75;
max-width: 40rem;
}
/* ── VISION & MISSION ── */
.vm-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-6);
margin-top: var(--space-8);
}
.vm-card {
background: white;
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-xl);
padding: var(--space-8);
position: relative;
overflow: hidden;
transition: box-shadow 0.25s, transform 0.25s;
}
.vm-card:hover {
box-shadow: 0 0.75rem 2rem rgba(26, 111, 212, 0.1);
transform: translateY(-0.25rem);
}
/* accent bar */
.vm-card::before {
content: "";
position: absolute;
top: 0;
left: 0;
right: 0;
height: 0.25rem;
background: linear-gradient(90deg, var(--blue), var(--teal));
border-radius: var(--radius-xl) var(--radius-xl) 0 0;
}
.vm-card.mission-card::before {
background: linear-gradient(90deg, var(--teal), #17a2b8cc);
}
.vm-icon {
width: 3.5rem;
height: 3.5rem;
border-radius: var(--radius-lg);
background: var(--blue-light);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.75rem;
margin-bottom: var(--space-5);
}
.mission-card .vm-icon {
background: #e6f9fb;
}
.vm-title {
font-size: var(--text-5xl);
font-weight: 800;
color: var(--gray-800);
margin-bottom: var(--space-3);
letter-spacing: -0.02em;
}
.vm-text {
font-size: var(--text-lg);
color: var(--gray-600);
line-height: 1.75;
}
/* ── MISSION PILLARS ── */
.pillars-grid {
display: grid;
grid-template-columns: repeat(2, 1fr);
gap: var(--space-4);
margin-top: var(--space-6);
}
.pillar-item {
display: flex;
align-items: flex-start;
gap: var(--space-4);
background: var(--gray-50);
border-radius: var(--radius-lg);
padding: var(--space-4) var(--space-5);
border: 0.0625rem solid var(--gray-200);
transition: all 0.2s;
}
.pillar-item:hover {
border-color: var(--blue);
background: var(--blue-light);
}
.pillar-dot {
width: 0.5rem;
height: 0.5rem;
background: var(--blue);
border-radius: var(--radius-full);
margin-top: 0.45rem;
flex-shrink: 0;
}
.pillar-title {
font-size: var(--text-md);
font-weight: 700;
color: var(--blue);
margin-bottom: var(--space-1);
}
.pillar-text {
font-size: var(--text-md);
color: var(--gray-600);
line-height: 1.6;
}
/* ── PHILOSOPHY STRIP ── */
.philosophy-strip {
background: linear-gradient(135deg, #edf4ff 0%, #e0edfc 50%, #d4e6f8 100%);
padding: var(--space-12) 0;
margin: var(--space-6) 0 0;
}
.philosophy-inner {
max-width: 80rem;
margin: 0 auto;
padding: 0 var(--space-6);
display: grid;
grid-template-columns: 1.1fr 1fr;
gap: var(--space-12);
align-items: center;
}
.philosophy-text-col .section-label {
margin-bottom: var(--space-4);
}
.philosophy-body {
font-size: var(--text-lg);
color: var(--gray-600);
line-height: 1.8;
margin-top: var(--space-5);
}
.philosophy-body p {
margin-bottom: var(--space-4);
}
.philosophy-body p:last-child {
margin-bottom: 0;
}
/* Philosophy values column */
.philosophy-values {
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.value-card {
background: white;
border-radius: var(--radius-xl);
padding: var(--space-5) var(--space-6);
border: 0.0625rem solid var(--gray-200);
display: flex;
align-items: center;
gap: var(--space-4);
transition: all 0.2s;
}
.value-card:hover {
border-color: var(--blue);
box-shadow: 0 0.25rem 1rem rgba(26, 111, 212, 0.1);
transform: translateX(0.25rem);
}
.value-icon {
width: 3rem;
height: 3rem;
border-radius: var(--radius-md);
background: var(--blue-light);
display: flex;
align-items: center;
justify-content: center;
font-size: 1.375rem;
flex-shrink: 0;
}
.value-title {
font-size: var(--text-md);
font-weight: 800;
color: var(--gray-800);
margin-bottom: var(--space-1);
}
.value-desc {
font-size: var(--text-sm);
color: var(--gray-400);
line-height: 1.5;
}
/* ── PRODUCT RANGE SECTION ── */
.range-section {
background: white;
padding: var(--space-12) 0;
}
.range-inner {
max-width: 80rem;
margin: 0 auto;
padding: 0 var(--space-6);
}
.range-grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: var(--space-5);
margin-top: var(--space-8);
}
.range-card {
border-radius: var(--radius-xl);
padding: var(--space-7, 1.75rem) var(--space-6);
display: flex;
flex-direction: column;
gap: var(--space-3);
border: 0.0625rem solid var(--gray-200);
transition: all 0.25s;
position: relative;
overflow: hidden;
}
.range-card::after {
content: "";
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 0.1875rem;
background: linear-gradient(90deg, var(--blue), var(--teal));
transform: scaleX(0);
transition: transform 0.3s;
transform-origin: left;
}
.range-card:hover {
box-shadow: 0 0.75rem 2rem rgba(26, 111, 212, 0.1);
transform: translateY(-0.25rem);
border-color: var(--blue);
}
.range-card:hover::after {
transform: scaleX(1);
}
.rc-1 {
background: linear-gradient(135deg, #f9efe7 0%, white 60%);
}
.rc-2 {
background: linear-gradient(135deg, #e4edf8 0%, white 60%);
}
.rc-3 {
background: linear-gradient(135deg, #e8f2e8 0%, white 60%);
}
.range-icon {
font-size: 2.25rem;
margin-bottom: var(--space-2);
}
.range-name {
font-size: var(--text-3xl);
font-weight: 800;
color: var(--gray-800);
letter-spacing: -0.02em;
}
.range-tag {
display: inline-block;
background: var(--blue-light);
color: var(--blue);
font-size: var(--text-sm);
font-weight: 700;
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-sm);
width: fit-content;
}
.range-desc {
font-size: var(--text-md);
color: var(--gray-600);
line-height: 1.65;
}
/* ── CTA SECTION ── */
.about-cta {
background: linear-gradient(135deg, #0e4da4 0%, #1a6fd4 60%, #17a2b8 100%);
padding: var(--space-14) var(--space-6);
text-align: center;
position: relative;
overflow: hidden;
}
.about-cta::before {
content: "";
position: absolute;
width: 28rem;
height: 28rem;
border-radius: 50%;
background: rgba(255, 255, 255, 0.06);
top: -10rem;
left: -6rem;
}
.about-cta::after {
content: "";
position: absolute;
width: 20rem;
height: 20rem;
border-radius: 50%;
background: rgba(255, 255, 255, 0.05);
bottom: -8rem;
right: -4rem;
}
.about-cta-inner {
max-width: 44rem;
margin: 0 auto;
position: relative;
z-index: 1;
}
.about-cta h2 {
font-size: var(--text-deal);
font-weight: 900;
color: white;
letter-spacing: -0.03em;
margin-bottom: var(--space-4);
line-height: 1.2;
}
.about-cta h2 em {
font-style: normal;
color: var(--yellow);
}
.about-cta p {
font-size: var(--text-xl);
color: rgba(255, 255, 255, 0.82);
line-height: 1.7;
margin-bottom: var(--space-8);
}
.cta-buttons {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-4);
flex-wrap: wrap;
}
.btn-cta-primary {
display: inline-flex;
align-items: center;
gap: var(--space-2);
background: white;
color: var(--blue);
border: none;
border-radius: var(--radius-md);
padding: var(--space-3) var(--space-7, 1.75rem);
font-size: var(--text-lg);
font-weight: 800;
cursor: pointer;
font-family: inherit;
text-decoration: none;
transition: all 0.2s;
}
.btn-cta-primary:hover {
background: var(--blue-light);
transform: translateY(-0.0625rem);
}
.btn-cta-outline {
display: inline-flex;
align-items: center;
gap: var(--space-2);
background: transparent;
color: white;
border: 0.125rem solid rgba(255, 255, 255, 0.5);
border-radius: var(--radius-md);
padding: var(--space-3) var(--space-7, 1.75rem);
font-size: var(--text-lg);
font-weight: 700;
cursor: pointer;
font-family: inherit;
text-decoration: none;
transition: all 0.2s;
}
.btn-cta-outline:hover {
border-color: white;
background: rgba(255, 255, 255, 0.1);
}
/* ── RESPONSIVE ── */
@media (max-width: 56.25rem) {
.about-hero-inner {
grid-template-columns: 1fr;
}
.about-hero h1 {
font-size: 2rem;
}
.stats-inner {
grid-template-columns: repeat(2, 1fr);
}
.vm-grid {
grid-template-columns: 1fr;
}
.pillars-grid {
grid-template-columns: 1fr;
}
.philosophy-inner {
grid-template-columns: 1fr;
}
.range-grid {
grid-template-columns: 1fr;
}
.about-cta h2 {
font-size: var(--text-6xl);
}
}
@media (max-width: 40rem) {
.stats-inner {
grid-template-columns: 1fr 1fr;
}
.nav-links,
.search-box {
display: none;
}
.topbar-right {
display: none;
}
.about-hero {
padding: var(--space-10) var(--space-4);
}
}
+595
View File
@@ -0,0 +1,595 @@
/* ── PAGE BASE ── */
body {
background: #f8fafc;
}
/* ── PAGE BACKGROUND ── */
.cart-page {
max-width: 100rem;
margin: 0 auto;
padding: var(--space-6);
}
/* ── PAGE TITLE ── */
.cart-page-title {
margin: 0 auto var(--space-6);
display: flex;
align-items: center;
gap: var(--space-3);
}
.cart-page-title h1 {
font-size: var(--text-deal, 2.125rem);
font-weight: 900;
color: var(--gray-800);
letter-spacing: -0.04em;
}
.cart-page-title .item-count {
background: var(--blue);
color: white;
font-size: var(--text-md);
font-weight: 700;
padding: var(--space-1) var(--space-3);
border-radius: var(--radius-full);
}
/* ── CART LAYOUT ── */
.cart-layout {
margin: 0 auto;
display: grid;
grid-template-columns: 3fr 1fr;
gap: var(--space-4);
align-items: start;
}
/* ── CART ITEMS PANEL ── */
.cart-items-panel {
display: flex;
flex-direction: column;
gap: var(--space-3);
}
/* Column headers */
.cart-col-headers {
display: grid;
grid-template-columns: 2fr 1fr 1fr 1fr auto;
gap: var(--space-4);
padding: 0 var(--space-5);
font-size: var(--text-sm);
font-weight: 700;
color: var(--gray-400);
text-transform: uppercase;
letter-spacing: 0.06em;
}
/* Single cart item card */
.cart-item {
margin-bottom: 1rem;
background: white;
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-xl);
padding: var(--space-5);
display: grid;
grid-template-columns: 2fr 1fr 1fr 1fr auto;
gap: var(--space-4);
align-items: center;
transition: box-shadow 0.2s, border-color 0.2s;
}
.cart-item:hover {
border-color: var(--gray-300);
box-shadow: 0 0.25rem 1rem rgba(0, 0, 0, 0.06);
}
/* Product info cell */
.cart-item-info {
display: flex;
align-items: center;
gap: var(--space-4);
}
.cart-item-img {
width: 4.5rem;
height: 4.5rem;
border-radius: var(--radius-lg);
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
overflow: hidden;
background: var(--gray-50);
}
/* when a real image is present */
.cart-item-img.has-image img {
width: 100%;
height: 100%;
object-fit: fill;
}
/* fallback emoji when no image */
.cart-item-img.no-image {
background: linear-gradient(135deg, #f5ece6, #e8d4c8);
font-size: 2rem;
}
.img-cream {
background: linear-gradient(135deg, #f9efe7, #eed9c4);
}
.img-fair {
background: linear-gradient(135deg, #f5ece6, #e8d4c8);
}
.img-oil {
background: linear-gradient(135deg, #e4edf8, #c8d8f0);
}
.img-wash {
background: linear-gradient(135deg, #e8f2e8, #c8dcc8);
}
.cart-item-name {
font-size: var(--text-md);
font-weight: 700;
color: var(--gray-800);
line-height: 1.4;
margin-bottom: var(--space-1);
}
.cart-item-sku {
font-size: var(--text-sm);
color: var(--gray-400);
}
/* Price cell */
.cart-item-price {
font-size: var(--text-xl);
font-weight: 700;
color: var(--gray-700);
}
/* Quantity cell */
.qty-control {
display: flex;
align-items: center;
gap: var(--space-2);
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-md);
padding: var(--space-1) var(--space-2);
width: fit-content;
background: var(--gray-50);
}
.qty-btn {
background: none;
border: none;
cursor: pointer;
width: 1.5rem;
height: 1.5rem;
border-radius: var(--radius-sm);
display: flex;
align-items: center;
justify-content: center;
font-size: var(--text-lg);
font-weight: 700;
color: var(--gray-600);
transition: background 0.15s, color 0.15s;
line-height: 1;
}
.qty-btn:hover {
background: var(--blue-light);
color: var(--blue);
}
.qty-num {
font-size: var(--text-md);
font-weight: 700;
color: var(--gray-800);
min-width: 1.5rem;
text-align: center;
}
/* Subtotal cell */
.cart-item-subtotal {
font-size: var(--text-xl);
font-weight: 800;
color: var(--red);
}
/* Remove button */
.remove-btn {
background: none;
border: none;
cursor: pointer;
width: 2rem;
height: 2rem;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
color: var(--gray-400);
transition: background 0.2s, color 0.2s;
flex-shrink: 0;
}
.remove-btn:hover {
background: #fef2f2;
color: var(--red);
}
/* Empty cart state */
.empty-cart {
background: white;
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-xl);
padding: var(--space-14) var(--space-10);
text-align: center;
display: none;
}
.empty-cart.visible {
display: block;
}
.empty-icon {
font-size: 4rem;
margin-bottom: var(--space-4);
opacity: 0.35;
}
.empty-cart h3 {
font-size: var(--text-4xl);
font-weight: 800;
color: var(--gray-800);
margin-bottom: var(--space-2);
}
.empty-cart p {
font-size: var(--text-md);
color: var(--gray-400);
margin-bottom: var(--space-6);
}
/* ── CART SUMMARY PANEL ── */
.cart-summary {
position: sticky;
top: calc(4.125rem + var(--space-4));
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.summary-card {
background: white;
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-xl);
overflow: hidden;
}
.summary-header {
padding: var(--space-5) var(--space-6);
border-bottom: 0.0625rem solid var(--gray-100);
}
.summary-header h2 {
font-size: var(--text-3xl);
font-weight: 800;
color: var(--gray-800);
}
.summary-body {
padding: var(--space-5) var(--space-6);
display: flex;
flex-direction: column;
gap: var(--space-4);
}
.summary-row {
display: flex;
align-items: center;
justify-content: space-between;
font-size: var(--text-md);
color: var(--gray-600);
}
.summary-row .label {
font-weight: 500;
}
.summary-row .value {
font-weight: 600;
color: var(--gray-800);
}
.summary-row .value.free {
color: var(--teal);
font-weight: 700;
}
.summary-divider {
border: none;
border-top: 0.0625rem solid var(--gray-100);
}
.summary-total-row {
display: flex;
align-items: center;
justify-content: space-between;
padding: var(--space-5) var(--space-6);
border-top: 0.0625rem solid var(--gray-200);
background: var(--gray-50);
}
.summary-total-row .total-label {
font-size: var(--text-lg);
font-weight: 800;
color: var(--gray-800);
}
.summary-total-row .total-value {
font-size: var(--text-deal-price, 1.625rem);
font-weight: 900;
color: var(--red);
}
/* Coupon input */
.coupon-card {
background: white;
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-xl);
padding: var(--space-5) var(--space-6);
}
.coupon-card h3 {
font-size: var(--text-md);
font-weight: 700;
color: var(--gray-800);
margin-bottom: var(--space-3);
display: flex;
align-items: center;
gap: var(--space-2);
}
.coupon-field {
display: flex;
gap: var(--space-2);
}
.coupon-field input {
flex: 1;
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-md);
padding: var(--space-2) var(--space-3);
font-size: var(--text-md);
font-family: inherit;
color: var(--gray-800);
outline: none;
transition: border-color 0.2s;
}
.coupon-field input::placeholder {
color: var(--gray-400);
}
.coupon-field input:focus {
border-color: var(--blue);
}
.coupon-field button {
background: var(--blue-light);
color: var(--blue);
border: none;
border-radius: var(--radius-md);
padding: var(--space-2) var(--space-4);
font-size: var(--text-md);
font-weight: 700;
cursor: pointer;
font-family: inherit;
transition: background 0.2s, color 0.2s;
white-space: nowrap;
}
.coupon-field button:hover {
background: var(--blue);
color: white;
}
/* CTA buttons */
.btn-checkout {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
background: var(--blue);
color: white;
border: none;
border-radius: var(--radius-md);
padding: var(--space-4) var(--space-6);
font-size: var(--text-xl);
font-weight: 700;
cursor: pointer;
font-family: inherit;
width: 100%;
transition: background 0.2s, transform 0.15s;
}
.btn-checkout:hover {
background: var(--blue-dark);
transform: translateY(-0.0625rem);
}
.btn-checkout::after {
content: "→";
}
.btn-continue {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
background: white;
color: var(--blue);
border: 0.09375rem solid var(--blue);
border-radius: var(--radius-md);
padding: var(--space-3) var(--space-6);
font-size: var(--text-md);
font-weight: 600;
cursor: pointer;
font-family: inherit;
width: 100%;
transition: background 0.2s, color 0.2s;
text-decoration: none;
}
.btn-continue:hover {
background: var(--blue-light);
}
.btn-continue::before {
content: "←";
}
.btn-clear {
display: flex;
align-items: center;
justify-content: center;
gap: var(--space-2);
background: none;
color: var(--gray-400);
border: none;
font-size: var(--text-md);
font-weight: 500;
cursor: pointer;
font-family: inherit;
width: 100%;
padding: var(--space-2);
border-radius: var(--radius-md);
transition: color 0.2s, background 0.2s;
}
.btn-clear:hover {
color: var(--red);
background: #fef2f2;
}
/* Trust badges */
.trust-badges {
display: flex;
flex-direction: column;
gap: var(--space-3);
padding: var(--space-5) var(--space-6);
border-top: 0.0625rem solid var(--gray-100);
}
.trust-item {
display: flex;
align-items: center;
gap: var(--space-3);
font-size: var(--text-md);
color: var(--gray-600);
}
.trust-item .ti-icon {
width: 2rem;
height: 2rem;
border-radius: var(--radius-md);
background: var(--blue-light);
display: flex;
align-items: center;
justify-content: center;
font-size: var(--text-xl);
flex-shrink: 0;
}
.trust-item .ti-text strong {
display: block;
font-weight: 700;
color: var(--gray-800);
font-size: var(--text-md);
}
.trust-item .ti-text span {
font-size: var(--text-sm);
color: var(--gray-400);
}
@media (max-width: 56.25rem) {
.cart-layout {
grid-template-columns: 1fr !important;
}
.cart-summary {
position: static;
width: 100%;
}
.cart-col-headers {
display: none;
}
.cart-item {
grid-template-columns: 1fr;
gap: var(--space-4);
padding: var(--space-4);
}
/* Keep price visible */
.cart-item-price {
font-size: var(--text-md);
font-weight: 600;
color: var(--gray-600);
}
/* Show subtotal but move below */
.cart-item-subtotal {
font-size: var(--text-lg);
font-weight: 800;
color: var(--red);
}
/* Stack quantity & remove nicely */
.qty-control {
margin-top: var(--space-2);
}
.remove-btn {
align-self: flex-end;
}
}
@media (max-width: 30rem) {
/* 480px */
.cart-page {
padding: var(--space-6) var(--space-4);
}
.cart-page-title {
flex-direction: column;
align-items: flex-start;
gap: var(--space-2);
}
.cart-item-info {
flex-direction: column;
align-items: flex-start;
gap: var(--space-2);
}
.cart-item-img {
width: 4rem;
height: 4rem;
}
.qty-control {
transform: scale(0.95);
}
.summary-header h2 {
font-size: var(--text-xl);
}
.summary-total-row .total-value {
font-size: var(--text-xl);
}
}
+165
View File
@@ -0,0 +1,165 @@
/* ── PAGE BASE ── */
body {
background: #f8fafc;
}
.checkout-page {
max-width: 100rem;
margin: 0 auto;
padding: var(--space-6);
}
/* ── PAGE TITLE ── */
.checkout-page-title {
margin: 0 auto var(--space-6);
display: flex;
align-items: center;
gap: var(--space-3);
}
.checkout-page-title h1 {
font-size: var(--text-deal, 2.125rem);
font-weight: 900;
color: var(--gray-800);
letter-spacing: -0.04em;
}
.checkout-layout {
margin: 0 auto;
display: grid;
grid-template-columns: 3fr 1fr;
gap: var(--space-4);
align-items: start;
}
.checkout-form-card,
.checkout-summary-card {
background: white;
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-xl);
padding: var(--space-6);
}
.checkout-title {
font-size: var(--text-3xl);
font-weight: 800;
margin-bottom: var(--space-4);
color: var(--gray-800);
}
.checkout-form {
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.checkout-form input {
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-md);
padding: var(--space-3);
font-size: var(--text-md);
font-family: inherit;
outline: none;
transition: border-color 0.2s;
}
.checkout-form input:focus {
border-color: var(--blue);
}
.form-group {
display: flex;
flex-direction: column;
gap: var(--space-1);
flex: 1;
}
.form-group label {
font-size: var(--text-sm);
font-weight: 600;
color: var(--gray-700);
}
.form-group label span {
color: var(--red);
font-weight: 700;
}
.form-group input {
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-md);
padding: var(--space-3);
font-size: var(--text-md);
font-family: inherit;
outline: none;
transition: border-color 0.2s, box-shadow 0.2s;
}
.form-group input:focus {
border-color: var(--blue);
box-shadow: 0 0 0 0.125rem rgba(26, 111, 212, 0.15);
}
.form-row {
display: flex;
gap: var(--space-4);
}
@media (max-width: 56.25rem) {
.form-row {
flex-direction: column;
}
}
.checkout-continue {
margin-top: var(--space-4);
}
.checkout-summary {
margin-top: var(--space-4);
display: flex;
flex-direction: column;
gap: var(--space-3);
}
.summary-row {
display: flex;
justify-content: space-between;
font-size: var(--text-md);
}
.total-row {
font-size: var(--text-xl);
font-weight: 800;
color: var(--red);
}
.qr-section {
margin-top: var(--space-6);
text-align: center;
}
.qr-wrapper {
margin-top: var(--space-3);
border-radius: var(--radius-lg);
overflow: hidden;
transition: filter 0.3s ease;
}
.qr-wrapper img {
width: 100%;
height: auto;
display: block;
}
.qr-wrapper.blurred {
filter: blur(12px);
pointer-events: none;
}
/* Responsive */
@media (max-width: 56.25rem) {
.checkout-layout {
grid-template-columns: 1fr;
}
}
+123
View File
@@ -0,0 +1,123 @@
.product-card {
background: white;
border: 0.0625rem solid var(--gray-200);
border-radius: var(--radius-xl);
overflow: hidden;
cursor: pointer;
transition: all 0.25s;
position: relative;
}
.product-card-link {
position: absolute;
inset: 0;
z-index: 1;
}
.product-card:hover {
border-color: var(--blue);
box-shadow: 0 0.5rem 1.5rem rgba(26, 111, 212, 0.12);
transform: translateY(-0.25rem);
}
.product-img {
height: 18rem;
background: var(--gray-50); /* neutral fallback while image loads */
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
}
.product-img img {
width: 100%;
height: 100%;
object-fit: cover;
display: block;
transition: transform 0.35s ease;
}
.product-card:hover .product-img img {
transform: scale(1.05); /* subtle zoom on hover */
}
.product-disc {
position: absolute;
top: var(--space-3);
left: var(--space-3);
background: var(--red);
color: white;
font-size: var(--text-xs);
font-weight: 800;
padding: var(--space-1) var(--space-2);
border-radius: var(--radius-sm);
z-index: 3;
pointer-events: none;
}
.product-body {
padding: var(--space-4);
}
.product-name {
font-size: var(--text-md);
font-weight: 700;
color: var(--gray-800);
margin-bottom: var(--space-2);
line-height: 1.4;
}
.product-rating {
font-size: var(--text-sm);
color: #f4b400;
margin-bottom: var(--space-2);
}
.product-price {
display: flex;
align-items: baseline;
gap: var(--space-2);
margin-bottom: var(--space-3);
}
.product-price .rp-now {
font-size: var(--text-xl);
font-weight: 800;
color: var(--blue);
}
.product-price .rp-old {
font-size: var(--text-md);
color: var(--gray-400);
text-decoration: line-through;
}
.product-add-btn {
display: flex;
align-items: center;
justify-content: center;
place-self: end;
gap: var(--space-2);
width: 100%;
background: var(--blue-light);
color: var(--blue);
border: none;
border-radius: var(--radius-md);
padding: var(--space-3);
font-size: var(--text-md);
font-weight: 700;
cursor: pointer;
font-family: inherit;
transition: all 0.25s ease;
position: relative;
overflow: hidden;
position: relative;
z-index: 2;
}
.product-add-btn svg {
width: 18px;
height: 18px;
}
.product-add-btn:hover {
background: var(--blue);
color: white;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 123 KiB

+110
View File
@@ -0,0 +1,110 @@
const Cart = (function () {
const STORAGE_KEY = "cart";
const TAX_RATE = 0.05;
let couponDiscount = 0;
// ─────────────────────────────
// Internal
// ─────────────────────────────
function getCart() {
return JSON.parse(localStorage.getItem(STORAGE_KEY)) || [];
}
function saveCart(cart) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(cart));
window.dispatchEvent(new Event("cartUpdated"));
}
function findItem(cart, id) {
return cart.find((item) => item.id === id);
}
// ─────────────────────────────
// Public API
// ─────────────────────────────
function addItem(product, quantity = 1) {
const cart = getCart();
const existing = findItem(cart, product.id);
if (existing) {
existing.quantity += quantity;
} else {
cart.push({
id: product.id,
name: product.basic.name,
price: product.pricing.price,
image: product.media.mainImage,
quantity,
});
}
saveCart(cart);
}
function removeItem(id) {
const cart = getCart().filter((item) => item.id !== id);
saveCart(cart);
}
function updateQuantity(id, quantity) {
const cart = getCart();
const item = findItem(cart, id);
if (!item) return;
item.quantity = Math.max(1, quantity);
saveCart(cart);
}
function clear() {
localStorage.removeItem(STORAGE_KEY);
window.dispatchEvent(new Event("cartUpdated"));
}
function applyCoupon(code) {
if (code === "MEDI10") {
couponDiscount = 0.1;
window.dispatchEvent(new Event("cartUpdated"));
return true;
}
couponDiscount = 0;
window.dispatchEvent(new Event("cartUpdated"));
return false;
}
function getTotals() {
const cart = getCart();
const subtotal = cart.reduce(
(sum, item) => sum + item.price * item.quantity,
0
);
const tax = subtotal * TAX_RATE;
const discount = subtotal * couponDiscount;
const total = subtotal - discount;
return {
subtotal,
tax,
discount,
total,
};
}
function getTotalCount() {
return getCart().reduce((sum, item) => sum + item.quantity, 0);
}
return {
getCart,
addItem,
removeItem,
updateQuantity,
clear,
applyCoupon,
getTotals,
getTotalCount,
};
})();
+43
View File
@@ -0,0 +1,43 @@
document.addEventListener("DOMContentLoaded", () => {
const cartItemsContainer = document.getElementById("checkout-items");
const subtotalEl = document.getElementById("checkout-subtotal");
const totalEl = document.getElementById("checkout-total");
const qrWrapper = document.getElementById("qr-wrapper");
const form = document.getElementById("checkout-form");
const cart = Cart.getCart();
if (cart.length === 0) {
cartItemsContainer.innerHTML = "<p>Your cart is empty.</p>";
return;
}
let subtotal = 0;
cart.forEach((item) => {
subtotal += item.price * item.quantity;
const row = document.createElement("div");
row.className = "summary-row";
row.innerHTML = `
<span>${item.name} × ${item.quantity}</span>
<span>₹${(item.price * item.quantity).toFixed(2)}</span>
`;
cartItemsContainer.appendChild(row);
});
const total = subtotal;
subtotalEl.textContent = `₹${subtotal.toFixed(2)}`;
totalEl.textContent = `₹${total.toFixed(2)}`;
// Unlock QR on valid form submit
form.addEventListener("submit", (e) => {
e.preventDefault();
if (!form.checkValidity()) return;
qrWrapper.classList.remove("blurred");
});
});
+49
View File
@@ -0,0 +1,49 @@
async function loadComponent(id, file) {
const el = document.getElementById(id);
if (!el) return;
const res = await fetch(file);
const html = await res.text();
el.innerHTML = html;
}
async function initComponents() {
console.log("init");
await Promise.all([
loadComponent("topbar-placeholder", "components/topbar.html"),
loadComponent("navbar-placeholder", "components/navbar.html"),
loadComponent("footer-placeholder", "components/footer.html"),
loadComponent("toast-placeholder", "components/toast.html"),
]);
// ✅ DOM is fully ready now — safe to run these
setActiveNavLink();
updateCartCount();
// ✅ Tell cart.js it can now render
document.dispatchEvent(new Event("components:ready"));
const menuToggle = document.getElementById("menu-toggle");
const mobileMenu = document.getElementById("mobile-menu");
if (!menuToggle || !mobileMenu) return;
menuToggle.addEventListener("click", () => {
mobileMenu.classList.toggle("active");
});
}
function setActiveNavLink() {
const page = window.location.pathname.split("/").pop() || "index.html";
document.querySelectorAll(".nav-links a").forEach((a) => {
a.parentElement.classList.toggle("active", a.getAttribute("href") === page);
});
}
function updateCartCount() {
const cart = JSON.parse(localStorage.getItem("cart")) || [];
const total = cart.reduce((s, i) => s + i.quantity, 0);
const el = document.getElementById("nav-cart-count");
if (el) el.textContent = total;
}
initComponents();
+300
View File
@@ -0,0 +1,300 @@
function renderRelatedProducts(product) {
const container = document.querySelector(".related-grid");
if (!container || !product.relatedProductIds) return;
const relatedProducts = product.relatedProductIds
.map((id) => PRODUCTS.find((p) => p.id === id))
.filter(Boolean);
container.innerHTML = relatedProducts
.map(
(p) => `
<div class="product-card">
<div class="product-img">
${
p.pricing.discountPercent
? `<div class="product-disc">-${p.pricing.discountPercent}%</div>`
: ""
}
<img
src="${p.media.mainImage}"
alt="${p.basic.name}"
width="200"
height="200"
loading="lazy"
decoding="async"
draggable="false" />
</div>
<div class="product-body">
<div class="product-name">${p.basic.name}</div>
<div class="product-rating">★★★★★</div>
<div class="product-price">
<span class="rp-now">₹${p.pricing.price}</span>
${
p.pricing.originalPrice
? `<span class="rp-old">₹${p.pricing.originalPrice}</span>`
: ""
}
</div>
<a href="product.html?id=${
p.id
}" target="_blank" class="product-add-btn">
View Product
</a>
</div>
</div>
`
)
.join("");
}
function renderProduct(productId) {
const product = PRODUCTS.find((p) => p.id === productId);
if (!product) {
console.error("Product not found:", productId);
return;
}
// =========================
// BASIC INFO
// =========================
const { basic, pricing, media, rating } = product;
// Title
document.title = product.seo?.title || basic.name;
document.querySelector(".product-title").textContent = basic.name;
// Breadcrumb
const breadcrumbCurrent = document.querySelector(".breadcrumb-bar .current");
if (breadcrumbCurrent)
breadcrumbCurrent.textContent = basic.shortName || basic.name;
// Image
const mainImg = document.querySelector(".gallery-main img");
if (mainImg && media?.mainImage) {
mainImg.src = media.mainImage;
mainImg.alt = basic.name;
}
// =========================
// PRICING
// =========================
document.querySelector(".price-current").textContent = `₹${pricing.price}`;
document.querySelector(".price-original").textContent = pricing.originalPrice
? `₹${pricing.originalPrice}`
: "";
document.querySelector(".price-badge").textContent = pricing.discountPercent
? `-${pricing.discountPercent}%`
: "";
// Stock
const stockStatus = document.querySelector(".stock-status");
if (stockStatus) {
stockStatus.innerHTML = `
<span class="stock-dot"></span>
${pricing.stockStatus} — Ships within ${pricing.shipsWithin}
`;
}
// =========================
// RATING
// =========================
if (rating) {
document.querySelector(".rating-count").textContent =
rating.average.toFixed(1);
document.querySelector(
".review-link"
).textContent = `${rating.totalReviews} Reviews`;
const soldText = document.querySelector(".rating-row span[style]");
if (soldText) soldText.textContent = `${rating.sold} sold`;
// Reviews tab count
const reviewTabBtn = document.querySelectorAll(".tab-nav-btn")[2];
if (reviewTabBtn)
reviewTabBtn.textContent = `Reviews (${rating.totalReviews})`;
// Big rating
const scoreEl = document.querySelector(".rating-big .score");
if (scoreEl) scoreEl.textContent = rating.average.toFixed(1);
const totalEl = document.querySelector(".rating-big .total");
if (totalEl)
totalEl.textContent = `Based on ${rating.totalReviews} reviews`;
// Rating bars
const bars = document.querySelectorAll(".rating-bar-row");
bars.forEach((bar) => {
const label = bar.querySelector(".bar-label").textContent.trim()[0];
const count = rating.breakdown[label] || 0;
const percent = rating.totalReviews
? (count / rating.totalReviews) * 100
: 0;
bar.querySelector(".bar-fill").style.width = `${percent}%`;
bar.querySelector(".bar-count").textContent = count;
});
}
// =========================
// SUMMARY
// =========================
document.querySelector(".product-short-desc").textContent =
product.summary.shortDescription;
// Benefit pills
const pillsContainer = document.querySelector(".benefit-pills");
if (pillsContainer) {
pillsContainer.innerHTML = product.summary.benefitPills
.map((p) => `<span class="benefit-pill">${p.icon} ${p.text}</span>`)
.join("");
}
// Meta
document.querySelector(".meta-row span:last-child").textContent = basic.sku;
document
.querySelectorAll(".meta-row")[1]
.querySelector("span:last-child").textContent = basic.weight;
document
.querySelectorAll(".meta-row")[2]
.querySelector("span:last-child").textContent = `₹${pricing.price}`;
// Categories
const categoryContainer = document
.querySelectorAll(".meta-row")[3]
.querySelector("div");
categoryContainer.innerHTML = basic.category
.map((c) => `<span class="meta-tag">${c}</span>`)
.join("");
// Tags
const tagContainer = document
.querySelectorAll(".meta-row")[4]
.querySelector("div");
tagContainer.innerHTML = basic.tags
.map((t) => `<span class="meta-tag">${t}</span>`)
.join("");
// Ideal for
document
.querySelectorAll(".meta-row")[5]
.querySelector("span:last-child").textContent = basic.idealFor;
// =========================
// DESCRIPTION TAB
// =========================
const descTab = product.descriptionTab;
document.querySelector(".desc-lead").textContent = descTab.lead;
const descBody = document.querySelector(".desc-body");
descBody.innerHTML = descTab.paragraphs.map((p) => `<p>${p}</p>`).join("");
// Features
const featuresContainer = document.querySelector(".desc-features");
featuresContainer.innerHTML = descTab.features
.map(
(f) => `
<div class="desc-feature">
<div class="feat-icon">${f.icon}</div>
<div class="feat-text">
<strong>${f.title}</strong>
<span>${f.text}</span>
</div>
</div>
`
)
.join("");
// How To Use
const howSteps = document.querySelector(".how-steps");
howSteps.innerHTML = descTab.howToUse
.map(
(step, i) => `
<div class="how-step">
<div class="step-num">${i + 1}</div>
${step}
</div>
`
)
.join("");
// =========================
// INGREDIENTS TAB
// =========================
const ingTab = product.ingredientsTab;
document
.querySelectorAll(".tab-pane")[1]
.querySelector(".desc-lead").textContent = ingTab.lead;
const ingGrid = document.querySelector(".ingredients-grid");
ingGrid.innerHTML = ingTab.ingredients
.map(
(i) => `
<div class="ingredient-card">
<div class="ing-icon">${i.icon}</div>
<div class="ing-name">${i.name}</div>
<div class="ing-role">${i.role}</div>
</div>
`
)
.join("");
document.querySelector(
".full-ingredients"
).innerHTML = `<strong>Full Ingredient List:</strong> ${ingTab.fullIngredients}`;
// =========================
// REVIEWS TAB
// =========================
const reviewList = document.querySelector(".review-list");
reviewList.innerHTML = product.reviews
.map(
(r) => `
<div class="review-card">
<div class="review-header">
<div class="reviewer-info">
<div class="reviewer-avatar">${r.avatarLetter}</div>
<div>
<div class="reviewer-name">${r.name}</div>
<div class="reviewer-date">${r.date}</div>
</div>
</div>
<div class="review-stars">${"★".repeat(r.rating)}${"☆".repeat(
5 - r.rating
)}</div>
</div>
<div class="review-title">${r.title}</div>
<div class="review-text">${r.text}</div>
${
r.verified
? `<div class="verified-badge">✓ Verified Purchase</div>`
: ""
}
</div>
`
)
.join("");
// =========================
// SHIPPING TAB
// =========================
const shippingTab = product.shipping;
const shippingLead = document
.querySelectorAll(".tab-pane")[3]
.querySelector(".desc-lead");
shippingLead.textContent = shippingTab.lead;
const shippingBody = document
.querySelectorAll(".tab-pane")[3]
.querySelector(".desc-body");
shippingBody.innerHTML = shippingTab.policies
.map((p) => `<p><strong>${p.title}:</strong> ${p.text}</p>`)
.join("");
renderRelatedProducts(product);
}
File diff suppressed because it is too large Load Diff