/*
 * NOTE: this stylesheet deliberately contains no
 * @media (prefers-reduced-motion: reduce) blocks.
 *
 * They were removed on purpose so the ambient motion (marching squiggles,
 * the drifting category icon fields, the mesh gradient, the wordmark) runs
 * for every visitor regardless of their OS accessibility setting.
 *
 * Do not re-add them without asking - their absence is a decision, not an
 * oversight. The trade-off is that visitors who set reduced-motion for
 * medical reasons will still see all of it.
 */

body {
  background-color: #fbf9f8;
  color: #1b1c1c;
  font-family: 'Plus Jakarta Sans', sans-serif;
  overflow-x: hidden;
}

/* Lenis base styles.
 *
 * Rescued from assets/css/main.css, which was never enqueued - so these rules
 * were missing while main.js has been initialising Lenis on every page. Lenis
 * puts .lenis / .lenis-smooth / .lenis-stopped on <html>, and without these
 * the native scroll-behaviour fights the smooth scroll.
 *
 * The preloader / page-curtain rules that used to sit alongside these were
 * dropped with assets/js/modules/page-transitions.js - see that removal.
 */
html.lenis, html.lenis body {
  height: auto;
}
.lenis.lenis-smooth {
  scroll-behavior: auto !important;
}
.lenis.lenis-smooth [data-lenis-prevent] {
  overscroll-behavior: contain;
}
.lenis.lenis-stopped {
  overflow: hidden;
}
.lenis.lenis-scrolling iframe {
  pointer-events: none;
}

.glass-panel, .glass-card {
  background: rgba(255, 255, 255, 0.8);
  backdrop-filter: blur(16px);
  -webkit-backdrop-filter: blur(16px);
  border: 1px solid rgba(255, 255, 255, 0.5);
  box-shadow: 0 8px 32px 0 rgba(255, 218, 185, 0.15);
}

.soft-shadow {
  box-shadow: 0 8px 32px 0 rgba(255, 218, 185, 0.2);
}

/* New Playful Animations & Styles */
@keyframes float {
  0%, 100% {
    transform: translateY(0) rotate(0deg);
  }
  50% {
    transform: translateY(-15px) rotate(4deg);
  }
}

.animate-float {
  animation: float 6s ease-in-out infinite;
}

.animate-float-delayed {
  animation: float 7s ease-in-out infinite 2s;
}

@keyframes drawSquiggle {
  to {
    stroke-dashoffset: -200;
  }
}

.squiggle-path {
  stroke-dasharray: 20 15;
  animation: drawSquiggle 3s linear infinite;
}

@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(30px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.stagger-in {
  opacity: 0;
  animation: fadeInUp 0.8s ease-out forwards;
}

.delay-100 { animation-delay: 100ms; }
.delay-200 { animation-delay: 200ms; }
.delay-300 { animation-delay: 300ms; }
.delay-400 { animation-delay: 400ms; }

/* Sticker Sprite Mapping */
.sticker {
  width: 80px;
  height: 80px;
  background-image: url("../assets/images/stickers.png");
  background-size: 200% 200%;
  background-repeat: no-repeat;
  pointer-events: none;
}

.sticker-sun { background-position: 0 0; }
.sticker-cloud { background-position: 100% 0; }
.sticker-heart { background-position: 0 100%; }
.sticker-star { background-position: 100% 100%; }



/* --- Hero Section - Mesh & Organic Styles --- */
.mesh-gradient {
    background-color: #fbf9f7;
    background-image: 
        radial-gradient(at 0% 0%, #FFECF0 0px, transparent 50%),
        radial-gradient(at 100% 0%, #ffdcc2 0px, transparent 50%),
        radial-gradient(at 100% 100%, #C4D7FF 0px, transparent 50%),
        radial-gradient(at 0% 100%, #eedbdf 0px, transparent 50%);
    animation: gradient-shift 15s ease infinite;
    background-size: 200% 200%;
}

@keyframes gradient-shift {
    0% { background-position: 0% 0%; }
    50% { background-position: 100% 100%; }
    100% { background-position: 0% 0%; }
}

.glass-platter {
    background: rgba(255, 255, 255, 0.7);
    backdrop-filter: blur(24px);
    -webkit-backdrop-filter: blur(24px);
    border: 1px solid rgba(255, 255, 255, 0.5);
    box-shadow: 0 4px 24px rgba(138, 101, 68, 0.05);
}

.organic-shape {
    border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%;
    animation: morph 8s ease-in-out infinite;
}

@keyframes morph {
    0% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; }
    50% { border-radius: 30% 60% 70% 40% / 50% 60% 30% 60%; }
    100% { border-radius: 60% 40% 30% 70% / 60% 30% 70% 40%; }
}

.float-slow {
    animation: floating 6s ease-in-out infinite;
}

@keyframes floating {
    0% { transform: translateY(0px) rotate(0deg); }
    50% { transform: translateY(-15px) rotate(2deg); }
    100% { transform: translateY(0px) rotate(0deg); }
}

.animated-squiggly-line {
	padding-bottom: 2.5rem;
}



/* --- WooCommerce Shop Mobile Grid & Layout Fixes --- */

/* 1. Force 2 columns on mobile for product grid */
.woocommerce ul.products {
    display: grid !important;
    grid-template-columns: repeat(2, 1fr) !important;
    gap: 1rem !important; /* Gutter on mobile */
    padding: 0 !important;
    margin: 0 !important;
}

/* Remove default WooCommerce floats and pseudo-elements */
.woocommerce ul.products::before,
.woocommerce ul.products::after {
    display: none !important;
}

.woocommerce ul.products li.product {
    width: 100% !important;
    margin: 0 !important;
    float: none !important;
}

/* 3 columns on tablets */
@media (min-width: 768px) {
    .woocommerce ul.products {
        grid-template-columns: repeat(3, 1fr) !important;
        gap: 1.5rem !important;
    }
}

/* 4 columns on desktop */
@media (min-width: 1024px) {
    .woocommerce ul.products {
        grid-template-columns: repeat(4, 1fr) !important;
    }
}

/* 2. Fix Top Bar squishing on mobile */
.woocommerce-result-count {
    margin: 0 0 0.5rem 0 !important; /* Adds spacing below count on mobile */
}

@media (min-width: 640px) {
    .woocommerce-result-count {
        margin: 0 1rem 0 0 !important;
    }
}

.woocommerce-ordering select.orderby {
    width: 100% !important; /* Full width dropdown on very small screens */
}

@media (min-width: 640px) {
    .woocommerce-ordering select.orderby {
        width: auto !important;
    }
}

/* --- WooCommerce Quantity Input Styling --- */

form.cart {
    display: flex !important;
    align-items: center !important;
    flex-wrap: wrap !important;
    gap: 1rem !important;
    margin-bottom: 1.5rem !important;
}

.woocommerce .quantity {
    display: inline-flex !important;
    align-items: center !important;
    padding: 0.5rem !important;
    margin: 0 !important;
}

/* Remove all borders, shadows, and rings from the inner number input */
.woocommerce .quantity input.qty {
    width: 3rem !important;
    text-align: center !important;
    background: transparent !important;
    border: 0 !important;
    padding: 0 !important;
    margin: 0 !important;
    font-family: 'Plus Jakarta Sans', sans-serif !important;
    color: #1b1c1b !important;
    font-size: 1rem !important;
    font-weight: 600 !important;
    box-shadow: none !important;
    outline: none !important;
    -moz-appearance: textfield !important; /* Hide Firefox arrows */
}

/* Ensure no border appears when clicking/typing inside it */
.woocommerce .quantity input.qty:focus,
.woocommerce .quantity input.qty:active {
    border: 0 !important;
    box-shadow: none !important;
    outline: none !important;
    background: transparent !important;
    ring: 0 !important;
}
/* Hide Chrome/Safari/Edge arrows */
.woocommerce .quantity input.qty::-webkit-outer-spin-button,
.woocommerce .quantity input.qty::-webkit-inner-spin-button {
    -webkit-appearance: none !important;
    margin: 0 !important;
}

/* Style the Add to Cart button to match the mockup */
.woocommerce button.single_add_to_cart_button {
    background-color: #ffdab9 !important; /* primary-container */
    color: #795e44 !important; /* on-primary-container */
    border-radius: 9999px !important;
    padding: 0.85rem 2rem !important;
    font-family: 'Plus Jakarta Sans', sans-serif !important;
    font-size: 1rem !important;
    font-weight: 600 !important;
    transition: all 0.3s ease !important;
    border: none !important;
    box-shadow: 0 4px 12px rgba(255, 218, 185, 0.3) !important;
}

.woocommerce button.single_add_to_cart_button:hover {
    box-shadow: 0 6px 16px rgba(255, 218, 185, 0.5) !important;
    transform: translateY(-1px) !important;
}

/* Superseded by the consolidated qty rule at the end of
   css/woocommerce-blocks.css, which covers this selector and
   form.cart .quantity input.qty together. */

/* Large blurs are costly to paint. Giving them their own compositor layer
   means the blurred result is cached rather than recalculated every frame. */
.blur-\[80px\],
.blur-\[100px\] {
    will-change: transform;
    transform: translateZ(0);
}

/* --- Front page: mesh gradient behind the entire page --- */
body.home::before {
    content: "";
    position: fixed;
    /* Oversized so the drift below never exposes an edge. */
    top: -20%;
    left: -20%;
    width: 140%;
    height: 140%;
    z-index: -50;
    pointer-events: none;
    background-color: #fbf9f7;
    background-image:
        radial-gradient(at 0% 0%, #FFECF0 0px, transparent 50%),
        radial-gradient(at 100% 0%, #ffdcc2 0px, transparent 50%),
        radial-gradient(at 100% 100%, #C4D7FF 0px, transparent 50%),
        radial-gradient(at 0% 100%, #eedbdf 0px, transparent 50%);
    background-size: 100% 100%;
    /* Drifts via transform rather than background-position. The old version
       animated background-position on a fixed, full-viewport element, which
       forces a full-screen repaint on every frame - the single most expensive
       thing on the front page. transform is composited on the GPU instead. */
    will-change: transform;
    animation: kk-mesh-drift 20s ease-in-out infinite;
}

@keyframes kk-mesh-drift {
    0%, 100% { transform: translate3d(-3%, -2%, 0) scale(1.02); }
    50%      { transform: translate3d(3%, 2%, 0) scale(1.06); }
}





/* --- Search Overlay --- */

/* Kill the browser's native search widgets (the stray blue "x" in Chrome/Edge)
   so the themed #clear-search button is the only clear control. */
#search-input::-webkit-search-cancel-button,
#search-input::-webkit-search-decoration,
#search-input::-webkit-search-results-button,
#search-input::-webkit-search-results-decoration {
    -webkit-appearance: none;
    appearance: none;
    display: none;
}

#search-input::-ms-clear {
    display: none;
}

/* Same animated mesh gradient the hero and front page use */
.search-scrim {
    background-color: #fbf9f7;
    background-image:
        radial-gradient(at 0% 0%, #FFECF0 0px, transparent 50%),
        radial-gradient(at 100% 0%, #ffdcc2 0px, transparent 50%),
        radial-gradient(at 100% 100%, #C4D7FF 0px, transparent 50%),
        radial-gradient(at 0% 100%, #eedbdf 0px, transparent 50%);
    background-size: 200% 200%;
    animation: gradient-shift 15s ease infinite;
}

/* The pill lifts and warms as you focus it */
.search-field {
    box-shadow: 0 8px 32px 0 rgba(255, 218, 185, 0.25);
}

.search-field:focus-within {
    border-color: rgba(255, 218, 185, 0.9);
    box-shadow: 0 12px 40px 0 rgba(138, 101, 68, 0.14), 0 0 0 4px rgba(255, 218, 185, 0.45);
    transform: translateY(-2px);
}

/* Panel eases in with the overlay */
#search-overlay:not(.opacity-0) .search-panel {
    animation: fadeInUp 0.5s ease-out both;
}

/* Result rows cascade in */
.kk-result-row {
    opacity: 0;
    animation: fadeInUp 0.35s ease-out forwards;
}




/* --- Search Results Pagination --- */
.kk-pagination .nav-links {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    flex-wrap: wrap;
    justify-content: center;
}

.kk-pagination .page-numbers {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-width: 2.75rem;
    height: 2.75rem;
    padding: 0 0.75rem;
    border-radius: 9999px;
    background: rgba(255, 255, 255, 0.7);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border: 1px solid rgba(255, 255, 255, 0.6);
    color: #4f453d;
    font-weight: 600;
    font-size: 14px;
    text-decoration: none;
    transition: all 0.3s ease;
}

.kk-pagination .page-numbers:hover {
    background: #ffdab9;
    color: #795e44;
    border-color: transparent;
    transform: translateY(-2px);
}

.kk-pagination .page-numbers.current {
    background: #ffdab9;
    color: #795e44;
    border-color: transparent;
    box-shadow: 0 4px 16px rgba(138, 101, 68, 0.15);
}

.kk-pagination .page-numbers.dots {
    background: transparent;
    border-color: transparent;
    min-width: auto;
    padding: 0 0.25rem;
}

.kk-pagination .page-numbers.dots:hover {
    transform: none;
    background: transparent;
    color: #4f453d;
}

/* the_posts_pagination prints a heading for screen readers only */
.kk-pagination .screen-reader-text {
    position: absolute;
    width: 1px;
    height: 1px;
    padding: 0;
    margin: -1px;
    overflow: hidden;
    clip: rect(0, 0, 0, 0);
    white-space: nowrap;
    border: 0;
}

/* Secondary group in the live-search dropdown */
.kk-result-group-label {
    padding: 0.75rem 0.75rem 0.35rem;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 0.12em;
    text-transform: uppercase;
    color: rgba(79, 69, 61, 0.55);
}




/* --- WooCommerce Notices --- */
/* Woo's own stylesheet is still enqueued and sets a grey background, a 3px
   coloured top border and a ::before glyph, so these rules have to override it. */
.woocommerce-message,
.woocommerce-error,
.woocommerce-info,
.kk-notice {
    display: flex !important;
    align-items: flex-start;
    gap: 0.85rem;
    width: 100%;
    margin: 0 0 1.5rem;
    padding: 1rem 1.25rem !important;
    border: 1px solid transparent;
    border-top-width: 1px !important;
    border-radius: 1rem;
    background-color: rgba(255, 255, 255, 0.8);
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
    box-shadow: 0 8px 32px 0 rgba(255, 218, 185, 0.2);
    color: #1b1c1c;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
    line-height: 1.55;
    list-style: none;
}

/* Woo injects a tick/cross glyph via ::before - ours is a real element */
.woocommerce-message::before,
.woocommerce-error::before,
.woocommerce-info::before {
    content: none !important;
}

.kk-notice__icon {
    flex-shrink: 0;
    font-size: 22px;
    line-height: 1.4;
}

.kk-notice__body {
    flex-grow: 1;
    min-width: 0;
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
}

.kk-notice__body li {
    list-style: none;
    margin: 0;
    padding: 0;
}

/* Success: the warm peach of the rest of the site */
.kk-notice.kk-notice--success {
    border-color: rgba(255, 218, 185, 0.9) !important;
    background-color: rgba(255, 245, 235, 0.85);
}

.kk-notice--success .kk-notice__icon {
    color: #5f7d52;
}

/* Error: soft rose rather than a hard red slab */
.kk-notice.kk-notice--error {
    border-color: rgba(255, 218, 214, 0.95);
    background-color: rgba(255, 240, 238, 0.9);
}

.kk-notice--error .kk-notice__icon {
    color: #ba1a1a;
}

/* Info: cool tint so it reads as neutral, never as a failure */
.kk-notice.kk-notice--info {
    border-color: rgba(210, 228, 233, 0.95);
    background-color: rgba(238, 246, 248, 0.9);
}

.kk-notice--info .kk-notice__icon {
    color: #4a6b73;
}

/* Woo puts an action button (View cart / Undo) inside the notice */
.kk-notice .button,
.kk-notice .woocommerce-Button {
    align-self: flex-start;
    margin-top: 0.35rem;
    padding: 0.6rem 1.35rem !important;
    border-radius: 9999px !important;
    background: #ffdab9 !important;
    color: #795e44 !important;
    font-size: 13px;
    font-weight: 600;
    letter-spacing: 0.05em;
    text-decoration: none;
    transition: all 0.3s ease;
}

.kk-notice .button:hover,
.kk-notice .woocommerce-Button:hover {
    box-shadow: 0 6px 20px rgba(138, 101, 68, 0.18);
    transform: translateY(-1px);
}

/* Woo floats its notice buttons to the right by default */
.woocommerce-message .button,
.woocommerce-error .button,
.woocommerce-info .button {
    float: none !important;
}




/* --- "View cart" link injected after an AJAX add-to-cart --- */
/* WooCommerce's add-to-cart.js appends this <a>, so it cannot be styled from
   content-product.php. Note the card is a div.product, not li.product, so any
   rule requiring "ul.products li.product" will never match it. */
.woocommerce a.added_to_cart,
a.added_to_cart {
    display: flex !important;
    align-items: center;
    justify-content: center;
    gap: 0.4rem;
    width: 100%;
    box-sizing: border-box;
    margin-top: 0.5rem;
    padding: 0.65rem 1.5rem;
    border: 1.5px solid #ffdab9;
    border-radius: 0.5rem;
    background-color: transparent;
    color: #8a6544;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 0.875rem;
    font-weight: 600;
    text-align: center;
    text-decoration: none !important;
    transition: all 0.3s ease;
}

.woocommerce a.added_to_cart::after,
a.added_to_cart::after {
    content: "\2192"; /* → */
    font-size: 1rem;
    line-height: 1;
    transition: transform 0.3s ease;
}

.woocommerce a.added_to_cart:hover,
a.added_to_cart:hover {
    background-color: #ffdab9;
    color: #795e44;
    box-shadow: 0 4px 16px rgba(255, 218, 185, 0.55);
    transform: translateY(-1px);
}

.woocommerce a.added_to_cart:hover::after,
a.added_to_cart:hover::after {
    transform: translateX(3px);
}




/* --- Notice placement & responsive sizing --- */

/* Cap notices to the site width wherever WooCommerce drops them. */
.woocommerce-notices-wrapper {
    width: 100%;
    max-width: 1280px;
    margin-inline: auto;
    box-sizing: border-box;
}

/* Plain pages (My Account, etc.) render through index.php's bare .container,
   which has no gutters - notices there would otherwise touch the screen edge. */
.container > .woocommerce-notices-wrapper,
.container > .woocommerce > .woocommerce-notices-wrapper {
    padding-inline: 20px; /* margin-mobile */
}

@media (min-width: 768px) {
    .container > .woocommerce-notices-wrapper,
    .container > .woocommerce > .woocommerce-notices-wrapper {
        padding-inline: 64px; /* margin-desktop */
    }
}

/* Mobile: tighter box, smaller type, and the action button drops onto its
   own line instead of being crushed against the text. */
@media (max-width: 640px) {
    .woocommerce-message,
    .woocommerce-error,
    .woocommerce-info,
    .kk-notice {
        gap: 0.65rem;
        padding: 0.85rem 1rem !important;
        margin-bottom: 1rem;
        border-radius: 0.875rem;
        font-size: 14px;
    }

    .kk-notice__icon {
        font-size: 20px;
    }

    .kk-notice .button,
    .kk-notice .woocommerce-Button {
        width: 100%;
        text-align: center;
        padding: 0.6rem 1rem !important;
    }
}


/* --- Editor content (page.php / single.php) --- */
/* Tailwind's preflight removes default heading, list and quote styling, so
   anything coming out of the_content() needs it put back deliberately. */
.kk-prose {
    color: #1b1c1c;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 16px;
    line-height: 1.7;
}

.kk-prose > *:first-child { margin-top: 0; }
.kk-prose > *:last-child  { margin-bottom: 0; }

.kk-prose h1,
.kk-prose h2,
.kk-prose h3,
.kk-prose h4 {
    color: #1b1c1c;
    font-weight: 600;
    line-height: 1.3;
    margin: 2rem 0 0.75rem;
}

.kk-prose h1 { font-size: 32px; letter-spacing: -0.01em; }
.kk-prose h2 { font-size: 26px; color: #8a6544; }
.kk-prose h3 { font-size: 20px; }
.kk-prose h4 { font-size: 17px; }

.kk-prose p { margin: 0 0 1.15rem; }

.kk-prose a {
    color: #8a6544;
    font-weight: 600;
    text-decoration: underline;
    text-underline-offset: 3px;
    text-decoration-thickness: 1px;
    transition: opacity 0.2s ease;
}

.kk-prose a:hover { opacity: 0.7; }

.kk-prose strong { font-weight: 700; }

.kk-prose ul,
.kk-prose ol {
    margin: 0 0 1.15rem;
    padding-left: 1.35rem;
}

.kk-prose ul { list-style: disc; }
.kk-prose ol { list-style: decimal; }
.kk-prose li { margin-bottom: 0.4rem; padding-left: 0.25rem; }
.kk-prose li::marker { color: #ffdab9; }
.kk-prose ol li::marker { color: #8a6544; font-weight: 600; }

.kk-prose blockquote {
    margin: 1.5rem 0;
    padding: 1rem 1.25rem;
    border-left: 3px solid #ffdab9;
    border-radius: 0 0.75rem 0.75rem 0;
    background: rgba(255, 245, 235, 0.6);
    color: #4f453d;
    font-style: italic;
}

.kk-prose blockquote p:last-child { margin-bottom: 0; }

.kk-prose img,
.kk-prose iframe,
.kk-prose video {
    max-width: 100%;
    height: auto;
    border-radius: 0.75rem;
    margin: 1.5rem 0;
}

.kk-prose figure { margin: 1.5rem 0; }

.kk-prose figcaption {
    margin-top: 0.5rem;
    color: rgba(79, 69, 61, 0.7);
    font-size: 13px;
    text-align: center;
}

.kk-prose hr {
    margin: 2rem 0;
    border: 0;
    border-top: 2px dashed rgba(228, 226, 225, 0.9);
}

.kk-prose code {
    padding: 0.15em 0.4em;
    border-radius: 0.35rem;
    background: rgba(255, 218, 185, 0.35);
    font-size: 0.9em;
}

.kk-prose pre {
    margin: 1.5rem 0;
    padding: 1rem 1.25rem;
    border-radius: 0.75rem;
    background: #f6f3f2;
    overflow-x: auto;
}

.kk-prose pre code { background: none; padding: 0; }

/* Tables scroll rather than breaking the layout on narrow screens */
.kk-prose table {
    width: 100%;
    margin: 1.5rem 0;
    border-collapse: collapse;
    font-size: 15px;
}

.kk-prose th,
.kk-prose td {
    padding: 0.75rem 1rem;
    border-bottom: 1px solid rgba(228, 226, 225, 0.8);
    text-align: left;
}

.kk-prose th { color: #8a6544; font-weight: 600; }

@media (max-width: 640px) {
    .kk-prose { font-size: 15px; }
    .kk-prose h1 { font-size: 26px; }
    .kk-prose h2 { font-size: 22px; }
    .kk-prose h3 { font-size: 18px; }
}


/* ==========================================================================
   WooCommerce Blocks - Cart & Checkout
   These render as React components, so the PHP notice templates never reach
   them. Everything below is the block-side equivalent of the .kk-notice work.
   ========================================================================== */

/* --- Field error states ---------------------------------------------------
   Block checkout marks invalid fields with .has-error on the wrapper, but the
   Customizer rule for .wc-block-components-text-input input sets a border with
   !important, which cancels WooCommerce's error border. The result was six
   invalid fields that looked completely normal. These rules put the error
   state back, and need !important to win against that same rule. */
.wc-block-components-text-input.has-error input,
.wc-blocks-components-select.has-error .wc-blocks-components-select__container,
.wc-block-components-address-form .has-error input {
    border-color: #ba1a1a !important;
    background-color: rgba(255, 240, 238, 0.75) !important;
    box-shadow: 0 0 0 3px rgba(186, 26, 26, 0.1) !important;
}

.wc-block-components-text-input.has-error input:focus,
.wc-block-components-address-form .has-error input:focus {
    border-color: #ba1a1a !important;
    box-shadow: 0 0 0 4px rgba(186, 26, 26, 0.18) !important;
}

/* The floating label should turn too, so the error reads at a glance */
.wc-block-components-text-input.has-error label,
.wc-blocks-components-select.has-error .wc-blocks-components-select__label {
    color: #ba1a1a !important;
}

/* The message under the field: larger, aligned with its icon */
.wc-block-components-validation-error {
    margin-top: 0.4rem;
}

.wc-block-components-validation-error p {
    display: flex;
    align-items: center;
    gap: 0.35rem;
    margin: 0;
    color: #ba1a1a;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 13px;
    font-weight: 500;
    line-height: 1.45;
}

.wc-block-components-validation-error svg {
    flex-shrink: 0;
    width: 16px;
    height: 16px;
    fill: #ba1a1a;
}


/* --- Notice banners -------------------------------------------------------
   The block equivalent of .kk-notice: "Coupon applied", payment failures,
   stock problems. Mirrors the PHP notice design so both halves of the site
   speak the same language. */
.wc-block-components-notice-banner {
    align-items: flex-start !important;
    gap: 0.85rem !important;
    margin: 0 0 1.5rem !important;
    padding: 1rem 1.25rem !important;
    border: 1px solid transparent !important;
    border-radius: 1rem !important;
    background-color: rgba(255, 255, 255, 0.85) !important;
    color: #1b1c1c !important;
    font-family: 'Plus Jakarta Sans', sans-serif !important;
    font-size: 15px !important;
    line-height: 1.55 !important;
    box-shadow: 0 8px 32px 0 rgba(255, 218, 185, 0.2) !important;
}

.wc-block-components-notice-banner > svg {
    flex-shrink: 0;
    width: 22px !important;
    height: 22px !important;
    margin: 0 !important;
}

.wc-block-components-notice-banner > .wc-block-components-notice-banner__content {
    padding: 0 !important;
    font-size: 15px !important;
}

.wc-block-components-notice-banner__summary {
    margin-bottom: 0.25rem !important;
    font-weight: 700 !important;
}

/* Success - the same warm peach as the PHP success notice */
.wc-block-components-notice-banner.is-success {
    border-color: rgba(255, 218, 185, 0.9) !important;
    background-color: rgba(255, 245, 235, 0.9) !important;
}

.wc-block-components-notice-banner.is-success > svg {
    fill: #5f7d52 !important;
}

/* Error - soft rose, not a hard red slab */
.wc-block-components-notice-banner.is-error {
    border-color: rgba(255, 218, 214, 0.95) !important;
    background-color: rgba(255, 240, 238, 0.9) !important;
}

.wc-block-components-notice-banner.is-error > svg {
    fill: #ba1a1a !important;
}

/* Info - cool tint so it never reads as a failure */
.wc-block-components-notice-banner.is-info {
    border-color: rgba(210, 228, 233, 0.95) !important;
    background-color: rgba(238, 246, 248, 0.9) !important;
}

.wc-block-components-notice-banner.is-info > svg {
    fill: #4a6b73 !important;
}

/* Warning - warm amber, distinct from both success and error */
.wc-block-components-notice-banner.is-warning {
    border-color: rgba(255, 224, 178, 0.95) !important;
    background-color: rgba(255, 248, 237, 0.9) !important;
}

.wc-block-components-notice-banner.is-warning > svg {
    fill: #9a6b1f !important;
}

/* Links inside a banner ("View cart") match the PHP notice buttons */
.wc-block-components-notice-banner > .wc-block-components-notice-banner__content .wc-forward {
    display: inline-flex;
    align-items: center;
    margin-top: 0.4rem;
    padding: 0.55rem 1.25rem !important;
    border-radius: 9999px !important;
    background: #ffdab9 !important;
    color: #795e44 !important;
    font-size: 13px;
    font-weight: 600;
    text-decoration: none !important;
    transition: all 0.3s ease;
}

.wc-block-components-notice-banner > .wc-block-components-notice-banner__content .wc-forward:hover {
    box-shadow: 0 6px 20px rgba(138, 101, 68, 0.18);
    transform: translateY(-1px);
}

/* Dismiss button */
.wc-block-components-notice-banner > .wc-block-components-button {
    flex-shrink: 0;
    opacity: 0.5;
    transition: opacity 0.2s ease;
}

.wc-block-components-notice-banner > .wc-block-components-button:hover {
    opacity: 1;
}

@media (max-width: 640px) {
    .wc-block-components-notice-banner {
        gap: 0.65rem !important;
        padding: 0.85rem 1rem !important;
        border-radius: 0.875rem !important;
        font-size: 14px !important;
    }

    .wc-block-components-notice-banner > .wc-block-components-notice-banner__content .wc-forward {
        width: 100%;
        justify-content: center;
    }
}




/* ==========================================================================
   The Kinderkutak wordmark
   Still a plain <a href> - all motion is CSS, nothing intercepts the click.
   ========================================================================== */
.kk-wordmark {
    position: relative;
    display: inline-flex;
    flex-direction: column;
    align-items: flex-start;
    gap: 2px;
    line-height: 1;
    text-decoration: none;
    -webkit-tap-highlight-color: transparent;
}

.kk-wordmark__word {
    display: inline-flex;
    /* Mostly solid primary, with a peach band parked off-screen that sweeps
       across on hover - the wordmark reads as one colour at rest. */
    background-image: linear-gradient(
        100deg,
        #8a6544 0%, #8a6544 38%,
        #ffdab9 50%,
        #8a6544 62%, #8a6544 100%
    );
    background-size: 250% 100%;
    background-position: 100% 0;
    -webkit-background-clip: text;
    background-clip: text;
    color: transparent;
    -webkit-text-fill-color: transparent;
}

.kk-wordmark__letter {
    display: inline-block;
    transform-origin: 50% 90%;
    will-change: transform;
}

.kk-wordmark__space {
    display: inline-block;
    width: 0.3em;
}

/* --- The squiggle rule and its travelling dot --- */
.kk-wordmark__rule {
    position: relative;
    display: block;
    width: 100%;
    height: 8px;
    color: #ffdab9;
    pointer-events: none;
}

.kk-wordmark__rule-svg {
    display: block;
    width: 100%;
    height: 100%;
    overflow: visible;
}

/* Progress layer sits exactly on top of the resting rule and is revealed by
   clipping from the right. Clipping (rather than stroke-dashoffset) is what
   lets the progress path keep its own dash pattern, so the brown fills the
   existing dashes in step-by-step instead of drawing a continuous line. */
.kk-wordmark__progress-wrap {
    position: absolute;
    inset: 0;
    clip-path: inset(0 calc(100% - var(--kk-progress, 0) * 100%) 0 0);
    /* No transition on clip-path: the value is now recomputed every frame from
       gsap.ticker, in step with Lenis. A transition here would make the fill
       chase the scroll rather than track it. */
    opacity: 0;
    pointer-events: none;
}

.kk-wordmark__squiggle {
    opacity: 0.75;
    /* Marching dashes: the rule reads as hand-drawn and always slightly alive.
       Offset moves by a whole number of dash cycles (7+5=12, so -24) so the
       loop is seamless. The solid progress path sits on top of this. */
    stroke-dasharray: 7 5;
    animation: kk-squiggle-march 2.6s linear infinite;
    transition: opacity 0.4s ease, color 0.4s ease;
}

@keyframes kk-squiggle-march {
    to { stroke-dashoffset: -24; }
}

/* Outer element carries the horizontal travel, the inner <i> bobs vertically.
   Combined they trace the squiggle without hand-writing a motion path. */
.kk-wordmark__dot {
    position: absolute;
    top: 50%;
    left: 0;
    margin-top: -2.5px;
    animation: kk-dot-travel 6s linear infinite;
}

.kk-wordmark__dot i {
    display: block;
    width: 5px;
    height: 5px;
    border-radius: 9999px;
    background: #8a6544;
    box-shadow: 0 0 0 2px rgba(255, 218, 185, 0.55);
    animation: kk-dot-bob 0.5s ease-in-out infinite alternate;
}

@keyframes kk-dot-travel {
    0%   { transform: translateX(0);          opacity: 0; }
    8%   {                                    opacity: 1; }
    92%  {                                    opacity: 1; }
    100% { transform: translateX(calc(100% - 5px)); opacity: 0; }
}

/* The parent is 100% of the rule, so translateX above uses the dot's own
   width; shift it across the full rule instead. */
.kk-wordmark__dot {
    width: 100%;
}

@keyframes kk-dot-bob {
    from { transform: translateY(-2.5px); }
    to   { transform: translateY(2.5px); }
}

@keyframes kk-letter-hop {
    0%   { transform: translateY(0) rotate(0deg); }
    35%  { transform: translateY(-7px) rotate(-5deg); }
    65%  { transform: translateY(1px) rotate(2deg); }
    100% { transform: translateY(0) rotate(0deg); }
}

@keyframes kk-shine {
    to { background-position: -20% 0; }
}

/* --- Pointer-capable devices: the full hover choreography ---------------- */
@media (hover: hover) and (pointer: fine) {
    .kk-wordmark:hover .kk-wordmark__letter,
    .kk-wordmark:focus-visible .kk-wordmark__letter {
        animation: kk-letter-hop 0.55s ease both;
        animation-delay: calc(var(--kk-i) * 35ms);
    }

    .kk-wordmark:hover .kk-wordmark__word,
    .kk-wordmark:focus-visible .kk-wordmark__word {
        animation: kk-shine 0.9s ease forwards;
    }

    .kk-wordmark:hover .kk-wordmark__squiggle,
    .kk-wordmark:focus-visible .kk-wordmark__squiggle {
        opacity: 1;
        color: #e3c0a0;
    }

    /* The dot hurries along while you are looking at it */
    .kk-wordmark:hover .kk-wordmark__dot {
        animation-duration: 2.4s;
    }
}

/* --- Touch devices: no hover, so the tap carries the delight ------------- */
@media (hover: none) {
    .kk-wordmark:active .kk-wordmark__letter {
        animation: kk-letter-hop 0.5s ease both;
        animation-delay: calc(var(--kk-i) * 30ms);
    }

    .kk-wordmark:active .kk-wordmark__word {
        animation: kk-shine 0.8s ease forwards;
    }
}

/* Keyboard focus needs a visible ring, not just the animation */
.kk-wordmark:focus-visible {
    outline: 2px solid #8a6544;
    outline-offset: 6px;
    border-radius: 4px;
}

/* --- Phones: quieter. The looping dot is charming at 24px on a desktop
       header and just visual noise on a 375px screen, so it stands down. --- */
@media (max-width: 640px) {
    .kk-wordmark {
        gap: 1px;
    }

    .kk-wordmark__rule {
        height: 6px;
    }

    .kk-wordmark__dot {
        display: none;
    }

    .kk-wordmark__squiggle {
        opacity: 0.6;
    }
}

/* --- Tablets: touch, but roomy - keep the loop, slow it down ------------- */
@media (min-width: 641px) and (max-width: 1024px) {
    .kk-wordmark__dot {
        animation-duration: 8s;
    }
}




/* --- Scroll behaviour ------------------------------------------------------
   Past the top of the page the wordmark condenses and its squiggle turns into
   a reading-progress indicator: the rule draws itself in as you go and the dot
   rides the leading edge. The idle time-based loop stands down while that runs,
   so there is only ever one thing moving. */
.kk-wordmark__progress {
    stroke: #8a6544;
    /* Identical dash pattern and march to .kk-wordmark__squiggle - both start
       at page load with no delay, so the dashes stay perfectly in phase. */
    stroke-dasharray: 7 5;
    animation: kk-squiggle-march 2.6s linear infinite;
}

.kk-wordmark.is-scrolled .kk-wordmark__progress-wrap {
    opacity: 1;
    transition: opacity 0.35s ease;
}

.kk-wordmark.is-scrolled .kk-wordmark__squiggle {
    opacity: 0.35;
}

.kk-wordmark.is-scrolled .kk-wordmark__dot {
    animation: none;
    opacity: 1;
    transform: translateX(calc(var(--kk-progress, 0) * (100% - 5px)));
    transition: transform 0.15s linear;
}

.kk-wordmark.is-scrolled .kk-wordmark__dot i {
    animation: none;
    transform: none;
}

/* The whole mark tightens slightly once the header is docked */
.kk-wordmark {
    transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1), letter-spacing 0.4s ease;
    transform-origin: left center;
}

.kk-wordmark.is-scrolled {
    transform: scale(0.94);
    letter-spacing: -0.01em;
}

.kk-wordmark.is-scrolled .kk-wordmark__rule {
    height: 7px;
}

@media (max-width: 640px) {
    /* The dot is hidden at this size, so the drawn rule carries the progress */
    .kk-wordmark.is-scrolled {
        transform: scale(0.96);
    }
}




/* ==========================================================================
   Primary navigation
   ========================================================================== */

/* --- Desktop bar ---------------------------------------------------------- */
.kk-nav {
    gap: 1.75rem;
}

.kk-nav__link {
    position: relative;
    display: inline-flex;
    flex-direction: column;
    align-items: center;
    gap: 3px;
    padding: 0.35rem 0 0.15rem;
    color: #4f453d;
    text-decoration: none;
    transition: color 0.3s ease, transform 0.35s cubic-bezier(0.22, 1, 0.36, 1);
}

.kk-nav__label {
    display: block;
    transition: letter-spacing 0.35s ease;
}

/* The squiggle rule: same hand-drawn language as the wordmark */
.kk-nav__rule {
    display: block;
    width: 100%;
    height: 6px;
    color: #ffdab9;
    pointer-events: none;
}

.kk-nav__rule svg {
    display: block;
    width: 100%;
    height: 100%;
    overflow: visible;
}

/* The rule wipes in from the left with clip-path rather than dashoffset,
   which frees stroke-dasharray up for the marching animation. Paused until
   the link is hovered or current, so idle links cost nothing. */
.kk-nav__rule {
    clip-path: inset(0 100% 0 0);
    transition: clip-path 0.45s cubic-bezier(0.22, 1, 0.36, 1);
}

.kk-nav__rule path {
    stroke-dasharray: 6 4;
    animation: kk-nav-march 2s linear infinite;
    animation-play-state: paused;
}

@keyframes kk-nav-march {
    to { stroke-dashoffset: -20; }
}

@media (hover: hover) and (pointer: fine) {
    .kk-nav__link:hover,
    .kk-nav__link:focus-visible {
        color: #8a6544;
        transform: translateY(-2px);
    }

    .kk-nav__link:hover .kk-nav__label,
    .kk-nav__link:focus-visible .kk-nav__label {
        letter-spacing: 0.02em;
    }

    /* Wipe the rule in and set the dashes marching */
    .kk-nav__link:hover .kk-nav__rule,
    .kk-nav__link:focus-visible .kk-nav__rule {
        clip-path: inset(0 0 0 0);
    }

    .kk-nav__link:hover .kk-nav__rule path,
    .kk-nav__link:focus-visible .kk-nav__rule path {
        animation-play-state: running;
    }
}

/* Current page keeps its rule drawn, in the darker brand brown */
.kk-nav__link.is-current {
    color: #8a6544;
    font-weight: 600;
}

.kk-nav__link.is-current .kk-nav__rule {
    color: #8a6544;
}

.kk-nav__link.is-current .kk-nav__rule {
    clip-path: inset(0 0 0 0);
}

.kk-nav__link.is-current .kk-nav__rule path {
    animation-play-state: running;
    animation-duration: 3.6s; /* calmer than hover - it is a state, not feedback */
}

.kk-nav__link:focus-visible {
    outline: 2px solid #8a6544;
    outline-offset: 4px;
    border-radius: 4px;
}


/* --- Mobile overlay ------------------------------------------------------- */
.kk-mnav__link {
    position: relative;
    display: flex;
    align-items: center;
    gap: 1rem;
    padding: 1rem 0.5rem 1rem 0;
    border-bottom: 1px solid rgba(228, 226, 225, 0.6);
    color: #1b1c1c;
    text-decoration: none;
    font-family: 'Plus Jakarta Sans', sans-serif;
    transition: padding-left 0.35s cubic-bezier(0.22, 1, 0.36, 1), color 0.3s ease;
}

.kk-mnav__link:last-child {
    border-bottom: 0;
}

.kk-mnav__index {
    flex-shrink: 0;
    width: 1.75rem;
    color: rgba(138, 101, 68, 0.45);
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.08em;
}

.kk-mnav__icon {
    flex-shrink: 0;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 2.75rem;
    height: 2.75rem;
    border-radius: 9999px;
    background: rgba(255, 218, 185, 0.4);
    color: #8a6544;
    transition: background 0.3s ease, transform 0.35s cubic-bezier(0.22, 1, 0.36, 1);
}

.kk-mnav__icon .material-symbols-outlined {
    font-size: 22px;
}

.kk-mnav__label {
    flex-grow: 1;
    font-size: 26px;
    font-weight: 600;
    letter-spacing: -0.01em;
    line-height: 1.2;
}

.kk-mnav__arrow {
    flex-shrink: 0;
    color: rgba(79, 69, 61, 0.25);
    font-size: 22px;
    transition: transform 0.35s cubic-bezier(0.22, 1, 0.36, 1), color 0.3s ease;
}

/* Touch feedback - these are tapped, not hovered */
.kk-mnav__link:active {
    padding-left: 0.5rem;
    color: #8a6544;
}

.kk-mnav__link:active .kk-mnav__icon {
    background: #ffdab9;
    transform: scale(1.06);
}

.kk-mnav__link:active .kk-mnav__arrow {
    color: #8a6544;
    transform: translateX(4px);
}

.kk-mnav__link.is-current {
    color: #8a6544;
}

.kk-mnav__link.is-current .kk-mnav__icon {
    background: #ffdab9;
}

.kk-mnav__link.is-current .kk-mnav__arrow {
    color: #8a6544;
}

/* Cascade the rows in as the menu slides open */
#mobile-menu:not(.-translate-x-full) .kk-mnav__link {
    opacity: 0;
    animation: fadeInUp 0.5s cubic-bezier(0.22, 1, 0.36, 1) forwards;
    animation-delay: calc(180ms + var(--kk-i) * 70ms);
}




.category-card {
    /* Gives the pattern's rotateX real depth. Without a perspective the 3D
       rotation just squashes the plane flat. */
    perspective: 700px;
}

/* --- Category card: drifting icon field on hover --------------------------
   A tiled field of the category's own icon, tilted and travelling diagonally,
   fading out toward the direction it is heading. The grid cell is a fixed
   size so the drift can translate by exactly one cell and repeat seamlessly -
   any other distance would visibly jump on loop. */
.category-card__pattern {
    position: absolute;
    /* Oversized so the 3D tilt never exposes a corner of the grid */
    top: -40%;
    left: -32%;
    width: 165%;
    height: 190%;
    z-index: 0;
    pointer-events: none;
    opacity: 0;
    /* Leaned back on the X axis as well as rotated flat, so the field reads as
       a plane receding into the card rather than a flat sticker. The recede
       direction matches the mask and the drift: away toward the top-left. */
    transform: rotateX(24deg) rotateZ(-14deg) scale(1.1);
    transform-origin: 50% 65%;
    transition: opacity 0.3s ease;

    /* Fade toward the top-left, which is where the field is travelling */
    -webkit-mask-image: linear-gradient(to top left, rgba(0, 0, 0, 0.85) 15%, rgba(0, 0, 0, 0) 78%);
    mask-image: linear-gradient(to top left, rgba(0, 0, 0, 0.85) 15%, rgba(0, 0, 0, 0) 78%);
}

.category-card__pattern-grid {
    display: grid;
    grid-template-columns: repeat(12, 40px);
    grid-auto-rows: 40px;
    place-items: center;
    /* Paused until hover so idle cards cost nothing */
    animation: kk-cat-drift 11s linear infinite;
    animation-play-state: paused;
}

.category-card__pattern-grid .material-symbols-outlined {
    font-size: 20px;
    line-height: 1;
}

/* Travels up and to the left - the same direction the mask fades - so the
   icons visibly dissolve as they reach the transparent corner.
   The distance must stay an exact multiple of the 64px grid cell, or the loop
   jumps. Two cells rather than one simply doubles the speed. */
@keyframes kk-cat-drift {
    from { transform: translate3d(0, 0, 0); }
    to   { transform: translate3d(-80px, -80px, 0); }
}

@media (hover: hover) and (pointer: fine) {
    .category-card:hover .category-card__pattern {
        opacity: 0.22;
        /* The card's background tint (Tailwind's hover:bg-* + duration-300)
           starts immediately; the icon field follows a beat later so the
           two read as one gesture rather than the pattern arriving first.
           Only hover-IN is delayed - hover-out falls back to the base rule
           above, so the field clears the moment the pointer leaves. */
        transition: opacity 0.4s ease 0.12s;
    }

    .category-card:hover .category-card__pattern-grid {
        animation-play-state: running;
    }
}

/* Touch devices get it on press instead */
@media (hover: none) {
    .category-card:active .category-card__pattern {
        opacity: 0.14;
    }

    .category-card:active .category-card__pattern-grid {
        animation-play-state: running;
    }
}




/* Touch devices: the tint and the drifting field arrive together while the
   card is on screen, and both leave again as it scrolls away. There is no
   hover here, and :active is far too brief to notice.
   The tint colour comes from a --kk-tint variable set per card in
   front-page.php, so one rule covers every category.

   Gated on width rather than (hover: none). Pointer/hover capability is
   reported inconsistently - a touchscreen laptop claims both - and this should
   simply never happen on a desktop layout. The JS uses the same 767px test, so
   the two cannot disagree. */
@media (max-width: 767px) {
    .category-card.is-onscreen {
        background-color: var(--kk-tint);
    }

    .category-card.is-onscreen .category-card__pattern {
        opacity: 0.13;
    }

    .category-card.is-onscreen .category-card__pattern-grid {
        animation-play-state: running;
        /* Calmer than the desktop hover - it is ambient here, not feedback */
        animation-duration: 20s;
    }
}


/* ==========================================================================
   "The Way We Grow" - the buy / rent / sell cycle
   Mobile: a vertical timeline with a dashed rail linking the steps.
   Desktop: the same steps opened out into three cards, rail running across.
   ========================================================================== */
.kk-grow {
    list-style: none;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    gap: 0;
}

.kk-grow__step {
    position: relative;
    display: grid;
    grid-template-columns: 72px 1fr;
    align-items: start;
    gap: 1rem;
    padding: 0 0 2rem;
    text-align: left;
    /* Revealed by JS as the step scrolls into view */
    opacity: 0;
    transform: translateY(22px);
    transition: opacity 0.6s cubic-bezier(0.22, 1, 0.36, 1),
                transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: calc(var(--kk-i, 0) * 110ms);
}

.kk-grow__step.is-revealed {
    opacity: 1;
    transform: translateY(0);
}

/* The dashed rail joining one marker to the next */
.kk-grow__rail {
    position: absolute;
    top: 72px;
    left: 35px;
    width: 2px;
    height: calc(100% - 72px);
    background-image: linear-gradient(to bottom, #ffdab9 0 6px, transparent 6px 12px);
    background-size: 2px 12px;
    background-repeat: repeat-y;
    /* Draws downward once the step is revealed */
    transform: scaleY(0);
    transform-origin: top;
    transition: transform 0.7s ease;
    transition-delay: calc(var(--kk-i, 0) * 110ms + 260ms);
}

.kk-grow__step.is-revealed .kk-grow__rail {
    transform: scaleY(1);
}

.kk-grow__step:last-child .kk-grow__rail {
    display: none;
}

.kk-grow__marker {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 72px;
    height: 72px;
    border-radius: 9999px;
    background: var(--kk-step-bg, #ffdab9);
    color: var(--kk-step-fg, #795e44);
    box-shadow: 0 8px 24px 0 rgba(255, 218, 185, 0.35);
    transition: transform 0.4s cubic-bezier(0.22, 1, 0.36, 1),
                box-shadow 0.4s ease;
}

.kk-grow__marker .material-symbols-outlined {
    font-size: 30px;
    transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
}

/* Step number tucked onto the marker */
.kk-grow__index {
    position: absolute;
    top: -4px;
    right: -4px;
    display: flex;
    align-items: center;
    justify-content: center;
    min-width: 24px;
    height: 24px;
    padding: 0 6px;
    border-radius: 9999px;
    background: #fff;
    color: rgba(138, 101, 68, 0.75);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.06em;
    box-shadow: 0 2px 8px rgba(138, 101, 68, 0.12);
}

.kk-grow__body {
    display: flex;
    flex-direction: column;
    gap: 0.35rem;
    padding-top: 0.6rem;
}

.kk-grow__title {
    color: #1b1c1c;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 22px;
    font-weight: 600;
    line-height: 1.2;
}

.kk-grow__text {
    color: #4f453d;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
    line-height: 1.6;
}

/* Feedback on press (touch) and hover (pointer) */
.kk-grow__step:active .kk-grow__marker {
    transform: scale(1.06);
}

@media (hover: hover) and (pointer: fine) {
    .kk-grow__step:hover .kk-grow__marker {
        transform: translateY(-4px) scale(1.05);
        box-shadow: 0 14px 32px 0 rgba(255, 218, 185, 0.5);
    }

    /* "Rent" is a cycle - its icon turns */
    .kk-grow__step:hover .kk-grow__marker .material-symbols-outlined {
        transform: rotate(180deg);
    }
}

/* --- Desktop: three cards, rail running between them --------------------- */
@media (min-width: 768px) {
    .kk-grow {
        flex-direction: row;
        gap: var(--kk-grow-gap, 1.5rem);
    }

    .kk-grow__step {
        flex: 1 1 0;
        grid-template-columns: 1fr;
        justify-items: center;
        gap: 1rem;
        padding: 2rem 1.25rem 2.25rem;
        text-align: center;
        transition: opacity 0.6s cubic-bezier(0.22, 1, 0.36, 1),
                    transform 0.6s cubic-bezier(0.22, 1, 0.36, 1),
                    box-shadow 0.4s ease;
    }

    @media (hover: hover) and (pointer: fine) {
        .kk-grow__step.is-revealed:hover {
            transform: translateY(-6px);
            box-shadow: 0 18px 44px 0 rgba(255, 218, 185, 0.4);
        }
    }

    /* Rail becomes horizontal, sitting in the gap between cards */
    .kk-grow__rail {
        top: 62px;
        left: auto;
        right: calc(var(--kk-grow-gap, 1.5rem) * -1);
        width: var(--kk-grow-gap, 1.5rem);
        height: 2px;
        background-image: linear-gradient(to right, #ffdab9 0 6px, transparent 6px 12px);
        background-size: 12px 2px;
        background-repeat: repeat-x;
        transform: scaleX(0);
        transform-origin: left;
    }

    .kk-grow__step.is-revealed .kk-grow__rail {
        transform: scaleX(1);
    }

    .kk-grow__body {
        padding-top: 0;
        align-items: center;
    }

    .kk-grow__title {
        font-size: 24px;
    }
}




/* ==========================================================================
   Scroll reveal - generic, reusable on any page
   Add .kk-reveal and (optionally) style="--kk-i:N" to stagger siblings.
   ========================================================================== */
.kk-reveal {
    opacity: 0;
    transform: translateY(26px);
    transition: opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1),
                transform 0.7s cubic-bezier(0.22, 1, 0.36, 1);
    transition-delay: calc(var(--kk-i, 0) * 120ms);
}

.kk-reveal.is-revealed {
    opacity: 1;
    transform: translateY(0);
}


/* --- About page: value cards --------------------------------------------- */
.kk-value {
    position: relative;
    gap: 0.85rem;
    overflow: hidden;
    transition: transform 0.45s cubic-bezier(0.22, 1, 0.36, 1),
                box-shadow 0.45s ease,
                opacity 0.7s cubic-bezier(0.22, 1, 0.36, 1);
}

/* A wash of the card's own colour, revealed from the bottom on hover */
.kk-value::before {
    content: "";
    position: absolute;
    inset: 0;
    z-index: 0;
    background: linear-gradient(to top, var(--kk-tint, #ffdab9) 0%, transparent 75%);
    opacity: 0;
    transition: opacity 0.45s ease;
    pointer-events: none;
}

.kk-value > * {
    position: relative;
    z-index: 1;
}

.kk-value__icon {
    display: flex;
    align-items: center;
    justify-content: center;
    width: 72px;
    height: 72px;
    border-radius: 9999px;
    background: var(--kk-tint, #ffdab9);
    color: var(--kk-fg, #795e44);
    box-shadow: 0 8px 24px 0 rgba(255, 218, 185, 0.35);
    transition: transform 0.5s cubic-bezier(0.22, 1, 0.36, 1);
}

.kk-value__icon .material-symbols-outlined {
    font-size: 32px;
}

.kk-value__title {
    color: #1b1c1c;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 22px;
    font-weight: 600;
}

.kk-value__text {
    color: #4f453d;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
    line-height: 1.65;
}

@media (hover: hover) and (pointer: fine) {
    .kk-value:hover {
        transform: translateY(-6px);
        box-shadow: 0 18px 44px 0 rgba(255, 218, 185, 0.45);
    }

    .kk-value:hover::before {
        opacity: 0.35;
    }

    .kk-value:hover .kk-value__icon {
        transform: translateY(-3px) scale(1.06) rotate(-6deg);
    }
}

.kk-value:active .kk-value__icon {
    transform: scale(1.04);
}


/* --- About page: pull quote ---------------------------------------------- */
.kk-quote {
    position: relative;
    margin: 0.5rem 0;
    padding: 1.15rem 1.25rem 1.15rem 3rem;
    border-radius: 0 1rem 1rem 0;
    border-left: 3px solid #ffdab9;
    background: rgba(255, 245, 235, 0.6);
    color: #8a6544;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 19px;
    font-weight: 600;
    font-style: italic;
    line-height: 1.5;
}

/* Oversized opening quote mark */
.kk-quote::before {
    content: "\201C";
    position: absolute;
    top: 0.1em;
    left: 0.55rem;
    color: rgba(255, 218, 185, 0.95);
    font-size: 54px;
    font-style: normal;
    line-height: 1;
}

@media (max-width: 640px) {
    .kk-quote {
        padding: 1rem 1rem 1rem 2.5rem;
        font-size: 17px;
    }

    .kk-quote::before {
        font-size: 42px;
        left: 0.35rem;
    }
}


/* ==========================================================================
   Accordions (<details>) - FAQ and Returns
   Native <details> snaps open and shut with no way to transition it, so the
   answer is wrapped at runtime in .kk-acc__panel and its height is animated.
   See the accordion module in assets/js/main.js.
   ========================================================================== */
.kk-acc__panel {
    overflow: hidden;
    transition: height 0.38s cubic-bezier(0.22, 1, 0.36, 1);
}

/* Summary keeps its own marker hidden across browsers */
details.group > summary {
    list-style: none;
}

details.group > summary::-webkit-details-marker {
    display: none;
}

details.group > summary::marker {
    content: "";
}

/* While collapsing, the [open] attribute is still present (it is removed only
   once the height animation finishes), so the chevron would stay flipped until
   the very end. Spin it back immediately instead.
   Needs to outrank Tailwind's .group[open] .group-open\:rotate-180, hence the
   extra element selector. */
details.group.is-closing span.material-symbols-outlined {
    transform: rotate(0deg);
}


/* --- Privacy policy sections ---------------------------------------------- */
.kk-policy {
    scroll-margin-top: 6rem; /* clears the sticky header when jumped to */
}

.kk-policy__title {
    display: flex;
    align-items: center;
    gap: 0.65rem;
    margin: 0 0 1rem;
    color: #1b1c1c;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 21px;
    font-weight: 600;
    line-height: 1.3;
}

.kk-policy__title .material-symbols-outlined {
    flex-shrink: 0;
    width: 40px;
    height: 40px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 9999px;
    background: rgba(255, 218, 185, 0.5);
    color: #8a6544;
    font-size: 22px;
}

.kk-policy__sub {
    margin: 1.5rem 0 0.5rem;
    color: #8a6544;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
    font-weight: 700;
    letter-spacing: 0.02em;
}

.kk-policy__sub:first-of-type {
    margin-top: 0.5rem;
}

.kk-policy__text {
    margin: 0 0 0.9rem;
    color: #4f453d;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
    line-height: 1.7;
}

.kk-policy__text:last-child {
    margin-bottom: 0;
}

@media (max-width: 640px) {
    .kk-policy__title {
        font-size: 18px;
    }

    .kk-policy__title .material-symbols-outlined {
        width: 34px;
        height: 34px;
        font-size: 19px;
    }
}


/* ==========================================================================
   .input-glass
   This class is applied to inputs across the theme - the login and lost
   password forms, account details, the contact form, and every WooCommerce
   field via the woocommerce_form_field_args filter in functions.php - but it
   had no styles defined anywhere, so all of those fell back to the Tailwind
   forms plugin's plain grey-bordered box.

   Element selectors are used (input./textarea./select.) so these beat the
   forms plugin's [type='text'] rules, which are equal specificity and load
   after main.css.
   ========================================================================== */
input.input-glass,
textarea.input-glass,
select.input-glass {
    background-color: rgba(255, 255, 255, 0.75);
    backdrop-filter: blur(12px);
    -webkit-backdrop-filter: blur(12px);
    border: 1px solid rgba(128, 117, 108, 0.25);
    color: #1b1c1c;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 16px; /* keeps iOS from zooming the page on focus */
    transition: border-color 0.3s ease, box-shadow 0.3s ease, background-color 0.3s ease;
}

input.input-glass::placeholder,
textarea.input-glass::placeholder {
    color: rgba(79, 69, 61, 0.45);
}

input.input-glass:hover,
textarea.input-glass:hover,
select.input-glass:hover {
    border-color: rgba(128, 117, 108, 0.4);
}

input.input-glass:focus,
textarea.input-glass:focus,
select.input-glass:focus {
    outline: none;
    background-color: #ffffff;
    border-color: rgba(255, 218, 185, 0.95);
    box-shadow: 0 0 0 4px rgba(255, 218, 185, 0.45);
}

/* Invalid fields, once the browser or WooCommerce has flagged them */
input.input-glass[aria-invalid="true"],
input.input-glass.woocommerce-invalid-required-field {
    border-color: #ba1a1a;
    background-color: rgba(255, 240, 238, 0.75);
}


/* --- WooCommerce form fields: catch anything .input-glass misses -----------
   Safety net for the account, address and classic checkout forms. Some fields
   are rendered by WooCommerce itself and never receive the theme class, so they
   fell back to Tailwind's grey border, which reads as near-black against the
   warm palette. Checkboxes, radios and buttons are excluded deliberately. */
.woocommerce-EditAccountForm input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]),
.woocommerce-EditAccountForm textarea,
.woocommerce-EditAccountForm select,
.woocommerce-address-fields input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]),
.woocommerce-address-fields textarea,
.woocommerce-address-fields select,
.woocommerce-form input:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]),
.woocommerce-form select {
    background-color: rgba(255, 255, 255, 0.75);
    border: 1px solid rgba(128, 117, 108, 0.25);
    border-radius: 0.5rem;
    color: #1b1c1c;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 16px;
    padding: 0.75rem;
    transition: border-color 0.3s ease, box-shadow 0.3s ease, background-color 0.3s ease;
}

.woocommerce-EditAccountForm input:focus,
.woocommerce-EditAccountForm textarea:focus,
.woocommerce-EditAccountForm select:focus,
.woocommerce-address-fields input:focus,
.woocommerce-address-fields textarea:focus,
.woocommerce-address-fields select:focus,
.woocommerce-form input:focus,
.woocommerce-form select:focus {
    outline: none;
    background-color: #ffffff;
    border-color: rgba(255, 218, 185, 0.95);
    box-shadow: 0 0 0 4px rgba(255, 218, 185, 0.45);
}

/* --- select2 / selectWoo -------------------------------------------------
   WooCommerce swaps the Country and State selects for a select2 widget, which
   builds its own markup and carries a hard grey border of its own. None of the
   rules above can reach it, so it is matched directly. */
.select2-container .select2-selection--single,
.select2-container .select2-selection--multiple {
    height: auto !important;
    min-height: 48px;
    padding: 0.35rem 0.4rem;
    background-color: rgba(255, 255, 255, 0.75) !important;
    border: 1px solid rgba(128, 117, 108, 0.25) !important;
    border-radius: 0.5rem !important;
    font-family: 'Plus Jakarta Sans', sans-serif;
    transition: border-color 0.3s ease, box-shadow 0.3s ease;
}

.select2-container .select2-selection--single .select2-selection__rendered {
    padding-left: 0.35rem;
    color: #1b1c1c;
    line-height: 34px;
}

.select2-container .select2-selection--single .select2-selection__arrow {
    height: 46px;
}

.select2-container--open .select2-selection--single,
.select2-container--focus .select2-selection--single {
    border-color: rgba(255, 218, 185, 0.95) !important;
    box-shadow: 0 0 0 4px rgba(255, 218, 185, 0.45);
}

/* The dropdown panel itself */
.select2-dropdown {
    border: 1px solid rgba(128, 117, 108, 0.25) !important;
    border-radius: 0.75rem !important;
    overflow: hidden;
    background-color: #ffffff;
    box-shadow: 0 8px 32px 0 rgba(255, 218, 185, 0.25);
}

.select2-container .select2-search--dropdown .select2-search__field {
    border: 1px solid rgba(128, 117, 108, 0.25) !important;
    border-radius: 0.5rem;
    padding: 0.5rem;
    font-family: 'Plus Jakarta Sans', sans-serif;
}

.select2-container .select2-results__option--highlighted[aria-selected],
.select2-container .select2-results__option--highlighted {
    background-color: #ffdab9 !important;
    color: #795e44 !important;
}

/* WooCommerce's show/hide password toggle sits inside a wrapper - keep the
   field and its eye button on the same rounded surface. */
.woocommerce .password-input,
.woocommerce-page .password-input {
    display: block;
    position: relative;
    width: 100%;
}

.woocommerce .password-input .show-password-input,
.woocommerce-page .password-input .show-password-input {
    top: 50%;
    transform: translateY(-50%);
    right: 0.85rem;
    color: rgba(79, 69, 61, 0.6);
}


/* --- Form rows inside a CSS grid ------------------------------------------
   WooCommerce styles .form-row-first / .form-row-last as 47%-wide floats,
   which suits its own float-based layout. These templates put the rows in a
   CSS grid instead: the float is ignored, but the 47% width is not - so each
   field rendered at roughly half the width of its own grid column.

   Needs to outrank ".woocommerce form .form-row-first" (0,2,1), hence the
   extra .grid in the chain. */
.woocommerce form .grid > .form-row,
.woocommerce-page form .grid > .form-row,
.woocommerce form .grid > .woocommerce-form-row,
.woocommerce-page form .grid > .woocommerce-form-row {
    width: 100%;
    float: none;
    margin: 0;
    padding: 0;
}

/* Same problem wherever a first/last pair is laid out with flex or grid */
.woocommerce form .flex > .form-row-first,
.woocommerce form .flex > .form-row-last,
.woocommerce-page form .flex > .form-row-first,
.woocommerce-page form .flex > .form-row-last {
    width: 100%;
    float: none;
}

/* WooCommerce wraps some fields in an inline span, which stops a width:100%
   input from filling the row. */
.woocommerce form .woocommerce-input-wrapper,
.woocommerce-page form .woocommerce-input-wrapper {
    display: block;
    width: 100%;
}


/* ==========================================================================
   My Account: orders, downloads, single order
   ========================================================================== */

/* --- Status pill ---------------------------------------------------------
   One class per WooCommerce order status so the state is readable at a glance
   rather than being plain text in a table cell. */
.kk-order__status {
    display: inline-flex;
    align-items: center;
    padding: 0.3rem 0.75rem;
    border-radius: 9999px;
    background: #f0eded;
    color: #4f453d;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 0.04em;
    text-transform: uppercase;
    white-space: nowrap;
}

.kk-order__status--completed  { background: #dcedc8; color: #445c30; }
.kk-order__status--processing { background: #ffdab9; color: #795e44; }
.kk-order__status--on-hold    { background: #fff3c4; color: #735c1c; }
.kk-order__status--pending    { background: #e6e6fa; color: #4d4d80; }
.kk-order__status--cancelled,
.kk-order__status--failed     { background: #ffdad6; color: #93000a; }
.kk-order__status--refunded   { background: #d2e4e9; color: #45585d; }

/* --- Order row actions (View, Pay, Cancel, Track...) --------------------- */
.kk-order__action {
    display: inline-flex;
    align-items: center;
    padding: 0.5rem 1.1rem;
    border-radius: 9999px;
    background: rgba(255, 255, 255, 0.8);
    border: 1px solid rgba(210, 196, 185, 0.9);
    color: #8a6544;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    transition: all 0.3s ease;
}

.kk-order__action:hover {
    background: #ffdab9;
    color: #795e44;
    border-color: transparent;
    transform: translateY(-1px);
}

/* "Pay" is the one that matters when an order is awaiting payment */
.kk-order__action.pay {
    background: #ffdab9;
    border-color: transparent;
    color: #795e44;
}

.kk-order__action.cancel:hover {
    background: #ffdad6;
    color: #93000a;
}

/* --- Downloads ----------------------------------------------------------- */
.kk-download__link {
    color: #1b1c1c;
    text-decoration: none;
    transition: color 0.3s ease;
}

.kk-download__link:hover {
    color: #8a6544;
}

/* --- The tables WooCommerce renders inside woocommerce_view_order ---------
   Items, totals and addresses come from Woo's own templates, so they arrive as
   bare tables. These are restyled in place rather than overridden, and made to
   scroll instead of overflowing on a phone. */
.kk-order-details table.shop_table {
    width: 100%;
    margin: 0;
    border: 0;
    border-collapse: collapse;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
}

.kk-order-details table.shop_table th,
.kk-order-details table.shop_table td {
    padding: 0.85rem 0.75rem;
    border: 0;
    border-bottom: 1px solid rgba(228, 226, 225, 0.8);
    text-align: left;
    vertical-align: top;
}

.kk-order-details table.shop_table thead th {
    color: #8a6544;
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 0.06em;
    text-transform: uppercase;
}

.kk-order-details table.shop_table tfoot th,
.kk-order-details table.shop_table tfoot td {
    font-weight: 600;
}

/* The grand total, addressed by name rather than by position. WooCommerce
   appends the payment-method row *after* order_total, so `tfoot tr:last-child`
   put the brown emphasis on "Direct bank transfer" and left the actual total
   in plain text. The class comes from the order/order-details.php override. */
.kk-order-details table.shop_table tfoot tr.woocommerce-table__total--order_total th,
.kk-order-details table.shop_table tfoot tr.woocommerce-table__total--order_total td {
    color: #8a6544;
    font-size: 17px;
    font-weight: 700;
}

/* Payment method, customer note and actions trail after the total as
   footnotes, so they read quieter than the figures above them. */
.kk-order-details table.shop_table tfoot tr.woocommerce-table__total--payment_method td,
.kk-order-details table.shop_table tfoot tr.woocommerce-table__total--customer_note td {
    font-size: 14px;
    font-weight: 600;
    color: #4f453d;
}

.kk-order-details table.shop_table tfoot tr.woocommerce-table__total--payment_method th,
.kk-order-details table.shop_table tfoot tr.woocommerce-table__total--customer_note th {
    font-size: 14px;
    font-weight: 500;
    color: #80756c;
}

/* Nothing rules off under the final row, whichever one that turns out to be */
.kk-order-details table.shop_table tfoot tr:last-child th,
.kk-order-details table.shop_table tfoot tr:last-child td {
    border-bottom: 0;
}

.kk-order-details table.shop_table a {
    color: #1b1c1c;
    text-decoration: none;
}

.kk-order-details table.shop_table a:hover {
    color: #8a6544;
}

.kk-order-details .woocommerce-order-details__title,
.kk-order-details .woocommerce-column__title {
    margin: 0 0 0.75rem;
    color: #1b1c1c;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 20px;
    font-weight: 600;
}

/* --- Billing / shipping address cards ------------------------------------
   Markup comes from the theme's order/order-details-customer.php override,
   which drops WooCommerce's col2-set float scaffolding - see the note at the
   top of that file for why. Equal-height cards, side by side from 640px up. */
.kk-addresses {
    margin-top: 2rem;
}

.kk-addresses__grid {
    display: grid;
    grid-template-columns: 1fr;
    gap: 1.5rem;
    align-items: stretch;
}

@media (min-width: 640px) {
    .kk-addresses__grid:not(.kk-addresses__grid--single) {
        grid-template-columns: repeat(2, minmax(0, 1fr));
    }
}

.kk-addresses__grid--single {
    max-width: 30rem;
}

.kk-address {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    min-width: 0;
}

.kk-order-details .kk-address__title {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    margin: 0;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: #8a6544;
}

.kk-address__title .material-symbols-outlined {
    font-size: 20px;
    color: rgba(138, 101, 68, 0.75);
}

.kk-order-details .kk-address address {
    display: flex;
    flex-direction: column;
    flex-grow: 1;
    gap: 0.35rem;
    min-width: 0;
    margin: 0;
    padding: 1.1rem 1.25rem;
    border: 1px solid rgba(228, 226, 225, 0.9);
    border-radius: 0.75rem;
    background: rgba(255, 255, 255, 0.6);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 15px;
    font-style: normal;
    line-height: 1.65;
    color: #4f453d;
    overflow-wrap: anywhere;
}

.kk-address__lines {
    display: block;
    font-weight: 500;
}

/* Phone and email sit under the address block, divided off from it */
.kk-address__row {
    display: flex;
    align-items: center;
    gap: 0.5rem;
    min-width: 0;
    font-size: 14px;
    color: rgba(79, 69, 61, 0.85);
}

.kk-address__row:first-of-type,
.kk-address__lines + .kk-address__row {
    margin-top: 0.5rem;
    padding-top: 0.6rem;
    border-top: 1px solid rgba(228, 226, 225, 0.8);
}

.kk-address__row .material-symbols-outlined {
    flex: 0 0 auto;
    font-size: 18px;
    color: rgba(138, 101, 68, 0.7);
}

/* WooCommerce hangs its own icon-font glyph off these two classes. The markup
   now carries a Material icon instead, so the pseudo-element has to go or
   every row gets two icons. */
.kk-address__row::before {
    content: none !important;
    display: none !important;
}

/* Safety net: should any other Woo template render col2-set inside this panel,
   neutralise the float widths and the clearfix pseudo-elements that would
   otherwise become stray grid items. */
.kk-order-details .col2-set::before,
.kk-order-details .col2-set::after {
    display: none !important;
}

.woocommerce .kk-order-details .col2-set .col-1,
.woocommerce .kk-order-details .col2-set .col-2 {
    float: none;
    width: auto;
}


/* Money reads right-aligned, the way it does on a receipt */
.kk-order-details table.shop_table thead th:last-child,
.kk-order-details table.shop_table tbody td.product-total,
.kk-order-details table.shop_table tfoot td {
    text-align: right;
    white-space: nowrap;
}

.kk-order-details table.shop_table tbody td,
.kk-order-details table.shop_table tfoot th,
.kk-order-details table.shop_table tfoot td {
    vertical-align: middle;
}

.kk-order-details table.shop_table tbody tr:last-child td {
    border-bottom: 1px solid rgba(228, 226, 225, 0.8);
}

/* The line item: thumbnail, then name over quantity / meta */
.kk-order-item {
    display: flex;
    align-items: center;
    gap: 0.85rem;
    min-width: 0;
}

.kk-order-item__thumb {
    flex: 0 0 auto;
    width: 56px;
    height: 56px;
    border-radius: 0.75rem;
    overflow: hidden;
    background: #f0eded;
    border: 1px solid rgba(255, 255, 255, 0.7);
    display: flex;
    align-items: center;
    justify-content: center;
}

.kk-order-item__thumb img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
    /* Beats the blanket `.woocommerce img { border-radius: 10px }`, which
       otherwise rounds the image inside an already-rounded frame. */
    border-radius: 0;
    mix-blend-mode: multiply;
}

.kk-order-item__thumb .material-symbols-outlined {
    font-size: 24px;
    color: rgba(79, 69, 61, 0.4);
}

.kk-order-item__body {
    display: flex;
    flex-direction: column;
    gap: 0.15rem;
    min-width: 0;
}

.kk-order-item__name {
    font-weight: 600;
    line-height: 1.35;
}

.kk-order-item__meta {
    font-size: 13px;
    color: #80756c;
    line-height: 1.5;
}

.kk-order-details table.shop_table .product-quantity {
    font-weight: 600;
    color: #80756c;
}

/* Woo renders item meta as <ul class="wc-item-meta"> with <p> inside */
.kk-order-details .wc-item-meta {
    margin: 0.15rem 0 0;
    padding: 0;
    list-style: none;
}

.kk-order-details .wc-item-meta li {
    margin: 0;
}

.kk-order-details .wc-item-meta strong {
    font-weight: 600;
    color: #4f453d;
}

.kk-order-details .wc-item-meta p {
    display: inline;
    margin: 0;
}

/* A little air above the grand total so it separates from the tax lines */
.kk-order-details table.shop_table tfoot tr.woocommerce-table__total--order_total th,
.kk-order-details table.shop_table tfoot tr.woocommerce-table__total--order_total td {
    padding-top: 1.1rem;
}

/* Purchase notes and the customer note */
.kk-order-details .product-purchase-note td {
    color: #4f453d;
    font-size: 14px;
    background: rgba(255, 218, 185, 0.16);
}

/* Offline gateways (bank transfer, cheque) print their instructions here */
.kk-order-details .wc-bacs-bank-details-heading,
.kk-order-details .wc-bacs-bank-details-account-name {
    margin: 0 0 0.6rem;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 17px;
    font-weight: 600;
    color: #1b1c1c;
}

.kk-order-details ul.wc-bacs-bank-details,
.kk-order-details ul.order_details.bacs_details {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
    gap: 0.5rem 1.5rem;
    margin: 0 0 1.5rem;
    padding: 1rem 1.25rem;
    list-style: none;
    border: 1px solid rgba(228, 226, 225, 0.9);
    border-radius: 0.75rem;
    background: rgba(255, 255, 255, 0.6);
    font-size: 14px;
    color: #4f453d;
}

.kk-order-details ul.wc-bacs-bank-details li,
.kk-order-details ul.order_details.bacs_details li {
    margin: 0;
}

.kk-order-details ul.wc-bacs-bank-details li strong,
.kk-order-details ul.order_details.bacs_details li strong {
    display: block;
    color: #1b1c1c;
    font-weight: 600;
}

/* Order actions (pay / cancel) that Woo puts in the table foot */
.kk-order-details .order-actions-button {
    display: inline-flex;
    align-items: center;
    margin: 0 0.4rem 0.4rem 0;
    padding: 0.5rem 1.1rem;
    border-radius: 9999px;
    background: #ffdab9;
    color: #795e44;
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    transition: box-shadow 0.3s ease, transform 0.3s ease;
}

.kk-order-details .order-actions-button:hover {
    box-shadow: 0 6px 18px rgba(255, 218, 185, 0.5);
    transform: translateY(-1px);
}

@media (max-width: 640px) {
    /* Two columns fit a phone unaided, so the table no longer needs a minimum
       width. overflow-x stays as a safety net for plugins that add columns. */
    .kk-order-details {
        overflow-x: auto;
    }

    .kk-order-details table.shop_table th,
    .kk-order-details table.shop_table td {
        padding: 0.7rem 0.4rem;
    }

    .kk-order-details table.shop_table {
        font-size: 14px;
    }

    .kk-order-item {
        gap: 0.65rem;
    }

    .kk-order-item__thumb {
        width: 44px;
        height: 44px;
        border-radius: 0.6rem;
    }

    .kk-order-details .woocommerce-order-details__title,
    .kk-order-details .woocommerce-column__title {
        font-size: 18px;
    }

    .kk-order__status {
        font-size: 10px;
        padding: 0.25rem 0.6rem;
    }
}


/* ==========================================================================
   .kk-field - floating-label text field
   The same field the Blocks checkout uses, rebuilt for the hand-written forms
   (login, register, inline login). No JavaScript: the label lifts on :focus
   and stays lifted on :not(:placeholder-shown), which is why every input in
   these templates carries placeholder=" ".

   Markup contract:  <p class="kk-field"><input placeholder=" "><label></p>
   The label must follow the input for the sibling selector to reach it.
   ========================================================================== */
.kk-field {
    position: relative;
    margin: 0;
}

/* The :not() chain is not filtering anything - every one of these inputs is
   a text field. It is there to lift this rule past the .woocommerce-form
   safety net further up this file, which scores (0,5,1) thanks to its own
   four :not()s and would otherwise repaint these fields. */
.kk-field input.input-text:not([type="checkbox"]):not([type="radio"]):not([type="submit"]):not([type="button"]):not([type="hidden"]) {
    width: 100%;
    height: 60px;
    box-sizing: border-box;
    padding: 1.5rem 1rem 0.5rem;
    background-color: #faf7f2;
    border: 1px solid rgba(128, 117, 108, 0.32);
    border-radius: 0.75rem;
    box-shadow: inset 0 1px 2px rgba(43, 32, 22, 0.04);
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 16px; /* keeps iOS from zooming the page on focus */
    font-weight: 500;
    color: #1b1c1c;
    outline: none;
    transition: border-color 0.2s ease, background-color 0.2s ease, box-shadow 0.2s ease;
}

.kk-field input.input-text:hover:not(:focus) {
    border-color: rgba(138, 101, 68, 0.4);
    background-color: #fdfbf8;
}

.kk-field input.input-text:focus {
    border-color: #8a6544;
    background-color: #ffffff;
    box-shadow: 0 0 0 3px rgba(138, 101, 68, 0.14);
}

.kk-field input.input-text[aria-invalid="true"],
.kk-field input.input-text.woocommerce-invalid-required-field {
    border-color: #ba1a1a;
    background-color: #fffafa;
}

.kk-field input.input-text:-webkit-autofill,
.kk-field input.input-text:-webkit-autofill:hover,
.kk-field input.input-text:-webkit-autofill:focus {
    -webkit-text-fill-color: #1b1c1c;
    -webkit-box-shadow: 0 0 0 100px #faf7f2 inset;
}

.kk-field > label {
    position: absolute;
    left: 1rem;
    top: 50%;
    transform: translateY(-50%);
    max-width: calc(100% - 2rem);
    overflow: hidden;
    white-space: nowrap;
    text-overflow: ellipsis;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 0.95rem;
    font-weight: 500;
    line-height: 1;
    letter-spacing: 0;
    text-transform: none;
    color: #80756c;
    pointer-events: none;
    margin: 0;
    padding: 0;
    transition: top 0.18s cubic-bezier(0.4, 0, 0.2, 1), font-size 0.18s cubic-bezier(0.4, 0, 0.2, 1), color 0.18s ease, letter-spacing 0.18s ease;
}

.kk-field input.input-text:focus + label,
.kk-field input.input-text:not(:placeholder-shown) + label {
    top: 0.85rem;
    font-size: 0.7rem;
    font-weight: 700;
    letter-spacing: 0.05em;
    text-transform: uppercase;
    color: #8a6544;
}

.kk-field > label .required {
    color: rgba(138, 101, 68, 0.55);
    text-decoration: none;
    border: 0;
}


/* ==========================================================================
   .kk-check - checkbox for the hand-written forms
   Matches the Blocks checkout checkbox. The tick is a background image rather
   than Woo's inline SVG, since these forms have no SVG of their own.
   ========================================================================== */
.kk-check input[type="checkbox"] {
    appearance: none;
    -webkit-appearance: none;
    flex: 0 0 auto;
    width: 20px;
    height: 20px;
    margin: 0;
    padding: 0;
    border: 1px solid rgba(128, 117, 108, 0.4);
    border-radius: 0.45rem;
    background-color: #ffffff;
    background-repeat: no-repeat;
    background-position: center;
    background-size: 13px 13px;
    box-shadow: inset 0 1px 2px rgba(43, 32, 22, 0.05);
    cursor: pointer;
    outline: none;
    transition: background-color 0.18s ease, border-color 0.18s ease, box-shadow 0.18s ease;
}

.kk-check:hover input[type="checkbox"]:not(:checked) {
    border-color: #8a6544;
    background-color: #fffaf5;
}

.kk-check input[type="checkbox"]:checked {
    background-color: #8a6544;
    border-color: #8a6544;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='%23ffffff'%3E%3Cpath d='M9 16.2 4.8 12l-1.4 1.4L9 19 21 7l-1.4-1.4z'/%3E%3C/svg%3E");
    box-shadow: 0 2px 8px rgba(138, 101, 68, 0.28);
}

.kk-check input[type="checkbox"]:focus-visible {
    border-color: #8a6544;
    box-shadow: 0 0 0 3px rgba(138, 101, 68, 0.18);
}


/* ==========================================================================
   Login / Register screen
   The two cards are deliberately not twins - logging in is the routine case
   and stays plain, registering is a pitch and gets the warm panel.
   ========================================================================== */
.kk-auth-card {
    box-sizing: border-box;
}

.kk-auth-card--accent {
    background: linear-gradient(160deg, rgba(255, 218, 185, 0.5) 0%, rgba(255, 255, 255, 0.86) 52%, rgba(210, 228, 233, 0.42) 100%);
    border: 1px solid rgba(255, 255, 255, 0.7);
    backdrop-filter: blur(16px);
    -webkit-backdrop-filter: blur(16px);
}

/* Soft glow tucked into the bottom corner, behind the form */
.kk-auth-card--accent::after {
    content: "";
    position: absolute;
    right: -80px;
    bottom: -100px;
    width: 240px;
    height: 240px;
    border-radius: 9999px;
    background: radial-gradient(circle, rgba(255, 218, 185, 0.55) 0%, rgba(255, 218, 185, 0) 70%);
    pointer-events: none;
    z-index: 0;
}

.kk-auth-perks {
    display: flex;
    flex-direction: column;
    gap: 0.6rem;
    margin: 0;
    padding: 0.9rem 1rem;
    list-style: none;
    border: 1px solid rgba(255, 255, 255, 0.7);
    border-radius: 0.75rem;
    background: rgba(255, 255, 255, 0.5);
}

.kk-auth-perks li {
    display: flex;
    align-items: flex-start;
    gap: 0.6rem;
    margin: 0;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 14px;
    font-weight: 500;
    line-height: 1.45;
    color: #4f453d;
}

.kk-auth-perks .material-symbols-outlined {
    flex: 0 0 auto;
    margin-top: 1px;
    font-size: 20px;
    color: #8a6544;
}

/* WooCommerce drops its privacy-policy notice inside the register form */
.kk-auth-card .woocommerce-privacy-policy-text p {
    margin: 0;
    font-family: 'Plus Jakarta Sans', sans-serif;
    font-size: 13px;
    line-height: 1.55;
    color: rgba(79, 69, 61, 0.85);
}

.kk-auth-card .woocommerce-privacy-policy-text a {
    color: #8a6544;
    text-decoration: underline;
}


/* WooCommerce's stylesheet gives form.login and form.register a grey box -
   1px #cfc8d8 border, 20px padding, 2em margin, 5px radius - and it loads
   after main.css, so the utility classes on the card lose to it. Undoing it
   needs the class names back in the selector to get past (0,2,1). */
.woocommerce form.login.kk-auth-form,
.woocommerce form.register.kk-auth-form,
form.login.kk-auth-form,
form.register.kk-auth-form {
    margin: 0;
    padding: 1.5rem;
    border: 1px solid rgba(255, 255, 255, 0.6);
    border-radius: 1.5rem;
    text-align: left;
}

@media (min-width: 768px) {
    .woocommerce form.login.kk-auth-form,
    .woocommerce form.register.kk-auth-form,
    form.login.kk-auth-form,
    form.register.kk-auth-form {
        padding: 2rem;
    }
}
