:root{--bg:#f4f7ff;--surface:#ffffff;--surface-2:#eef3fb;--surface-blur:rgba(255,255,255,0.92);--text:#0b1533;--muted:#5b6b8c;--primary:#1d4ed8;--primary-dark:#1e3a8a;--border:#d7e2f5;--ring:rgba(29,78,216,0.18);--danger:#dc2626;--hero-blue:#2563eb;--hero-blue-deep:#1e3a8a;--hero-glow:rgba(255,255,255,0.22);--accent:#ffffff;--accent-strong:#e7efff;--accent-ink:#1e3a8a;--space-1:4px;--space-2:8px;--space-3:12px;--space-4:16px;--space-5:24px;--space-6:32px;--space-7:40px;--text-xs:11px;--text-sm:13px;--text-base:15px;--text-md:16px;--text-lg:18px;--text-xl:22px;--text-2xl:27px;--radius-sm:10px;--radius:14px;--radius-pill:999px;--touch:44px}@media (prefers-color-scheme:dark){:root{--bg:#05070f;--surface:#0e1526;--surface-2:#161f36;--surface-blur:rgba(14,21,38,0.92);--text:#eaf0ff;--muted:#93a4c8;--primary:#3b82f6;--primary-dark:#93c5fd;--border:#1e2b48;--ring:rgba(59,130,246,0.28);--danger:#f87171;--hero-blue:#1d4ed8;--hero-blue-deep:#0b1d4a;--hero-glow:rgba(255,255,255,0.14);--accent:#ffffff;--accent-strong:#cdddff;--accent-ink:#0b1d4a}}*{box-sizing:border-box}body,html{margin:0;padding:0;color-scheme:light dark}body{color:var(--text);font-family:system-ui,-apple-system,Segoe UI,Roboto,Noto Sans Lao,sans-serif;-webkit-font-smoothing:antialiased}.app-shell,body{background:var(--bg)}.app-shell{max-width:480px;margin:0 auto;min-height:100vh;padding:20px 18px 40px}.topbar{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);margin-bottom:24px}.brand{font-weight:700;font-size:18px}.brand,.topbar a.brand{color:var(--primary-dark)}.topbar a.brand{flex:none;display:inline-flex;align-items:center;justify-content:center;width:var(--touch);height:var(--touch);border-radius:50%;border:1px solid var(--border);background:var(--surface);font-size:var(--text-xl);line-height:1;text-decoration:none}.topbar a.brand:active{background:var(--surface-2)}.topbar span.brand{flex:1 1 auto;min-width:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:var(--text-md)}.topbar span.brand-home{display:inline-flex;align-items:center;gap:10px;overflow:visible;white-space:normal;text-overflow:clip}.brand-logo{flex:none;width:34px;height:34px;display:block}.brand-name{min-width:0}.topbar .lang-select{flex:none}.hero{margin:24px 0 28px}.hero h1{font-size:26px;line-height:1.25;margin:0 0 10px}.hero p{color:var(--muted);margin:0;font-size:15px}.card{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);padding:18px;margin-bottom:16px}.stack{display:flex;flex-direction:column;gap:12px}label{font-size:14px;font-weight:600}input,label{color:var(--text)}input{width:100%;min-height:var(--touch);padding:var(--space-3) var(--space-4);font-size:var(--text-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}input:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px var(--ring)}.btn{display:inline-flex;align-items:center;justify-content:center;width:100%;min-height:var(--touch);padding:var(--space-3) var(--space-4);font-size:var(--text-md);font-weight:600;border:none;border-radius:var(--radius-sm);cursor:pointer;text-decoration:none}.btn-primary{background:var(--primary);color:#fff}.btn-primary:active{background:var(--primary-dark)}.btn-primary:disabled{opacity:.6;cursor:default}.btn-secondary{background:transparent;color:var(--primary-dark);border:1px solid var(--border)}.btn-link{display:inline-flex;align-items:center;justify-content:center;min-height:var(--touch);background:none;border:none;color:var(--muted);font-size:var(--text-base);cursor:pointer;padding:var(--space-2)}.error{color:var(--danger);font-size:14px;margin:0}.hint{color:var(--muted);font-size:13px;margin:0}.empty-state{display:flex;flex-direction:column;align-items:center;text-align:center;gap:var(--space-2);padding:var(--space-7) var(--space-4)}.empty-state-icon{font-size:40px;line-height:1;margin-bottom:var(--space-1)}.empty-state-title{margin:0;font-size:var(--text-lg);font-weight:700}.empty-state-body{margin:0;max-width:30ch;color:var(--muted);font-size:var(--text-base);line-height:1.5}.empty-state-action{width:100%;margin-top:var(--space-3)}.skeleton{display:block;position:relative;overflow:hidden;background:var(--border);border-radius:var(--radius-sm)}.skeleton:after{content:"";position:absolute;inset:0;transform:translateX(-100%);background:linear-gradient(90deg,transparent,rgba(255,255,255,.55),transparent);animation:skeleton-shimmer 1.4s ease-in-out infinite}@keyframes skeleton-shimmer{to{transform:translateX(100%)}}@media (prefers-reduced-motion:reduce){.skeleton:after{animation:none}}.skeleton-line{height:12px;margin:4px 0;border-radius:var(--radius-sm)}.skeleton-title{height:22px;width:65%;margin-bottom:10px}.skeleton-input{height:var(--touch)}.skeleton-thumb{width:100%;aspect-ratio:16/9;margin-bottom:8px}.skeleton-cover{width:100%;aspect-ratio:16/10;margin-bottom:16px;border-radius:var(--radius)}select{width:100%;min-height:var(--touch);padding:var(--space-3) var(--space-4);font-size:var(--text-md);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text)}select:focus{outline:none;border-color:var(--primary);box-shadow:0 0 0 3px var(--ring)}.section-title{font-size:18px;margin:24px 0 12px}.section-head{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin:24px 0 12px}.section-head .section-title{margin:0}.home-find{margin-top:8px}.home-find-title{font-size:24px;line-height:1.2;margin:8px 0 14px}.home-find-form{gap:12px}.field-label{display:block;font-size:14px;font-weight:600;color:var(--text)}.sport-tiles{display:grid;grid-template-columns:1fr 1fr;grid-gap:12px;gap:12px;margin-top:-4px}.sport-tile{position:relative;display:flex;flex-direction:column;border:2px solid var(--border);border-radius:var(--radius);overflow:hidden;background:var(--surface);cursor:pointer;transition:border-color .12s ease,box-shadow .12s ease}.sport-tile input{position:absolute;width:1px;height:1px;opacity:0;pointer-events:none}.sport-tile-img{display:block;width:100%;aspect-ratio:16/11;background-color:var(--surface-2);background-size:cover;background-position:50%}.sport-tile-name{padding:10px 8px;text-align:center;font-weight:700;font-size:var(--text-md);color:var(--text)}.sport-tile:has(input:checked){border-color:var(--primary);box-shadow:0 0 0 3px rgba(58,87,240,.18)}.sport-tile:has(input:checked):after{content:"✓";position:absolute;top:8px;right:8px;width:24px;height:24px;display:flex;align-items:center;justify-content:center;border-radius:50%;background:var(--primary);color:#fff;font-size:14px;font-weight:700;line-height:1}.sport-tile:has(input:focus-visible){outline:2px solid var(--primary);outline-offset:2px}.home-login{margin-top:20px}.home-login>.btn{width:100%}.avail-venue-head{gap:2px;padding-bottom:8px;border-bottom:1px solid var(--border)}.avail-court{gap:8px}.avail-court+.avail-court{padding-top:12px;border-top:1px dashed var(--border)}.avail-court-name{font-size:var(--text-md)}.btn-accent{background:var(--accent);color:var(--accent-ink);font-weight:700}.btn-accent:active{background:var(--accent-strong)}.venue-card{display:flex;flex-direction:column;gap:4px;text-decoration:none;color:inherit}.venue-card:active{border-color:var(--primary)}.field-name,.venue-name{font-weight:600;font-size:16px;color:var(--text)}.venue-meta{color:var(--muted);font-size:13px;margin:0}.field-card{display:flex;flex-direction:column;gap:4px}.location-link{text-decoration:none;color:inherit;gap:4px}.location-link:active .field-cta{color:var(--primary)}.field-link{text-decoration:none;color:inherit}.field-link:active .field-name{color:var(--primary-dark)}.owner-field-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-2)}.owner-field-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);min-height:var(--touch);padding:var(--space-2) var(--space-3);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);text-decoration:none;color:inherit}.owner-field-row .field-name{font-size:var(--text-md)}.field-cta{font-size:13px;font-weight:600;color:var(--primary-dark)}.date-nav{display:flex;align-items:center;justify-content:space-between;gap:8px}.date-nav-sticky{position:-webkit-sticky;position:sticky;top:0;z-index:10;margin:0 -18px 16px;border-radius:0;border-left:none;border-right:none;background:var(--surface-blur);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px)}.date-current{font-weight:700;font-size:16px}.next-free{display:flex;flex-direction:column;gap:4px;text-decoration:none;color:inherit;border-color:var(--primary);background:var(--ring)}.next-free:active{background:var(--ring);filter:brightness(.97)}.next-free-label{font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--primary-dark)}.next-free-time{display:flex;align-items:center;gap:8px;font-weight:700;font-size:18px}.next-free-cta{font-size:14px;font-weight:600;color:var(--primary-dark)}.slot-badge{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:999px;font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;vertical-align:middle}.slot-badge-peak{background:#fef3c7;color:#92400e}.slot-grid{list-style:none;padding:0;margin:0 0 16px;display:grid;grid-template-columns:repeat(2,1fr);grid-gap:10px;gap:10px}.slot{display:flex;flex-direction:column;gap:4px;border:1px solid var(--border);border-radius:10px;padding:12px;background:var(--surface)}.slot-time{font-weight:600;font-size:15px}.slot-state{font-size:12px;color:var(--muted)}.slot-price{font-size:13px;font-weight:600;color:var(--text)}.slot-free{border-color:var(--primary)}.slot-peak{border-color:#f59e0b}.slot-free .slot-state{color:var(--primary-dark)}.slot-booked,.slot-past{background:var(--surface-2)}.slot-booked .slot-time,.slot-past .slot-time{color:var(--muted);text-decoration:line-through}.slot-link{display:flex;flex-direction:column;gap:4px;color:inherit;text-decoration:none}.booker-steps{list-style:none;padding:0;margin:0 0 var(--space-2)}.booker-steps,.booker-steps li{display:flex;gap:var(--space-2)}.booker-steps li{flex:1 1;align-items:center;padding:var(--space-2) var(--space-3);border:1px solid var(--border);border-radius:var(--radius-sm);font-size:13px;font-weight:600;color:var(--muted)}.booker-steps .step-num{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:999px;background:var(--surface-2);color:var(--muted);font-size:12px;font-weight:700;flex:none}.booker-steps .step-active{border-color:var(--primary);color:var(--primary-dark);background:var(--ring)}.booker-steps .step-active .step-num{background:var(--primary);color:#fff}.booker-steps .step-done{border-color:var(--primary);color:var(--primary-dark)}.booker-steps .step-done .step-num:after{content:"✓"}.booker-steps .step-done .step-num{color:transparent;width:22px;background:var(--primary)}.booker-steps .step-done .step-num:after{color:#fff}.booker-step-hint{margin-top:0}.block-grid{list-style:none;padding:0;margin:0 0 16px;display:grid;grid-template-columns:repeat(4,1fr);grid-gap:8px;gap:8px}.block,.block-btn{display:flex}.block-btn{flex:1 1;flex-direction:column;align-items:center;justify-content:center;gap:2px;min-height:var(--touch);padding:var(--space-2) 4px;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);font:inherit;cursor:pointer;text-align:center}.block-time{font-weight:600;font-size:14px}.block-state{font-size:10px;color:var(--muted)}.block-free .block-btn,.block-reachable .block-btn{border-color:var(--primary);color:var(--primary-dark)}.block-reachable .block-btn{border-style:dashed}.block-selected .block-btn{border-color:var(--primary);background:var(--primary);color:#fff}.block-tag{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;opacity:.9}.block-end .block-btn,.block-start .block-btn{box-shadow:inset 0 0 0 2px #fff}.block-dim .block-btn{opacity:.4}.block-booked .block-btn,.block-past .block-btn{background:var(--surface-2);border-color:var(--border);color:var(--muted);cursor:not-allowed}.block-booked .block-time,.block-past .block-time{text-decoration:line-through}.block-peak.block-free .block-btn,.block-peak.block-reachable .block-btn{border-color:#f59e0b}.booker-summary{position:-webkit-sticky;position:sticky;bottom:var(--space-3);gap:var(--space-3);border-color:var(--primary)}.booker-range,.booker-summary{display:flex;flex-direction:column}.booker-range{gap:2px}.booker-time{font-weight:700;font-size:18px}.booker-total{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-3)}.booker-price{font-weight:700;font-size:18px;color:var(--primary-dark)}.booker-actions{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3)}.booker-actions .btn{flex:1 1}.summary{margin:0;display:flex;flex-direction:column;gap:8px}.summary>div{display:flex;justify-content:space-between;gap:12px}.summary dt{color:var(--muted)}.summary dd{margin:0;font-weight:600;text-align:right}.payment-option{display:flex;align-items:flex-start;gap:10px;border:1px solid var(--border);border-radius:10px;padding:12px;cursor:pointer}.payment-option input[type=radio]{flex:none;width:auto;margin:3px 0 0;padding:0}.payment-option .payment-name{display:block;font-weight:600}.payment-option .hint{display:block;margin:2px 0 0}.btn-danger{background:transparent;color:var(--danger);border:1px solid var(--danger)}.btn-danger:active{background:var(--danger);color:#fff}.booking-list{list-style:none;padding:0;margin:0 0 var(--space-4)}.booking-row{display:flex;flex-direction:column;gap:4px;color:inherit;text-decoration:none}.booking-row-head{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2)}.booking-row-venue{font-weight:600;font-size:var(--text-md)}.booking-row-field,.booking-row-when{font-size:var(--text-sm)}.booking-row-when{color:var(--text)}.booking-row-meta,.status-badge{font-size:var(--text-xs);color:var(--muted)}.status-badge{display:inline-block;padding:2px 8px;border-radius:var(--radius-pill);font-weight:700;text-transform:uppercase;letter-spacing:.03em;background:var(--surface-2);white-space:nowrap}.status-completed,.status-confirmed,.status-published{background:#d1fae5;color:#065f46}.status-pending{background:#fef3c7;color:#92400e}.status-cancelled,.status-no_show,.status-suspended{background:#fee2e2;color:#991b1b}.status-expired,.status-inactive{background:var(--surface-2);color:var(--muted)}@media (prefers-color-scheme:dark){.status-active,.status-completed,.status-confirmed,.status-published{background:rgba(34,197,94,.18);color:#86efac}.slot-badge-peak,.status-pending{background:rgba(245,158,11,.2);color:#fcd34d}.status-blocked,.status-cancelled,.status-no_show,.status-suspended{background:rgba(248,113,113,.18);color:#fca5a5}.status-admin{background:rgba(59,130,246,.22);color:#bfdbfe}}.status-active{background:#d1fae5;color:#065f46}.status-blocked{background:#fee2e2;color:#991b1b}.status-admin{background:#e0e7ff;color:#3730a3}.venue-thumb{display:block;width:100%;aspect-ratio:16/9;border-radius:10px;margin-bottom:8px;background-color:#fff;background-size:contain;background-repeat:no-repeat;background-position:50%}.carousel{position:relative;margin-bottom:16px}.carousel-track{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;border-radius:var(--radius);-webkit-overflow-scrolling:touch;scrollbar-width:none}.carousel-track::-webkit-scrollbar{display:none}.carousel-slide{flex:0 0 100%;scroll-snap-align:start;aspect-ratio:16/10;background-color:#fff;background-size:contain;background-repeat:no-repeat;background-position:50%}.carousel-sm .carousel-slide{aspect-ratio:16/9}.carousel-arrow{position:absolute;top:50%;transform:translateY(-50%);width:var(--touch);height:var(--touch);border:none;border-radius:50%;background:rgba(15,23,42,.45);color:#fff;font-size:var(--text-xl);line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center}.carousel-arrow:disabled{opacity:0;pointer-events:none}.carousel-prev{left:8px}.carousel-next{right:8px}.carousel-dots{position:absolute;bottom:10px;left:0;right:0;display:flex;justify-content:center;gap:6px}.carousel-dot{width:8px;height:8px;padding:0;border:none;border-radius:50%;background:rgba(255,255,255,.6);cursor:pointer}.carousel-dot.active{background:#fff;transform:scale(1.25)}.lang-select{width:auto;min-height:var(--touch);padding:var(--space-2) var(--space-3);font-size:var(--text-sm);font-weight:600;border-radius:var(--radius-pill);background:var(--surface);color:var(--text)}.lang-select:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--ring)}.schedule-grid{display:flex;flex-direction:column;gap:var(--space-3)}.schedule-row{display:grid;grid-template-columns:1fr 1fr;grid-gap:var(--space-2)}.schedule-day,.schedule-row{align-items:center;gap:var(--space-2)}.schedule-day{grid-column:1/-1;display:flex;font-weight:600}.schedule-day input[type=checkbox]{width:auto;min-height:auto;margin:0}.schedule-row>input[type=time],.schedule-row>select{min-width:0}.schedule-row>select{grid-column:1/-1}.exception-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2)}.exception-row>div{display:flex;flex-direction:column;gap:2px}.stack-inline{display:flex;flex-direction:row;align-items:center;gap:var(--space-1)}.owner-booking-info{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-1);min-width:0}.owner-booking-actions{display:flex;flex-wrap:wrap;justify-content:flex-end;gap:var(--space-2);flex:0 0 auto}.owner-booking-actions>form{flex:0 0 auto}.owner-action-btn{display:inline-flex;align-items:center;justify-content:center;min-width:40px;min-height:36px;padding:0 var(--space-3);font-size:16px;font-weight:700;line-height:1;border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface);color:var(--text);cursor:pointer}.owner-action-confirm{background:var(--primary);border-color:var(--primary);color:#fff}.owner-action-complete,.owner-action-noshow{background:var(--surface);border-color:var(--border);color:var(--text)}.owner-booking-days{display:flex;flex-direction:column;gap:var(--space-6)}.owner-booking-groups{gap:var(--space-4)}.owner-booking-court{margin:0 0 var(--space-2);font-size:var(--text-sm);font-weight:700;color:var(--muted)}.owner-booking-list{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:var(--space-2)}.owner-booking-row{display:flex;align-items:center;justify-content:space-between;gap:var(--space-3);padding:var(--space-2) var(--space-3);border:1px solid var(--border);border-radius:var(--radius-sm);background:var(--surface)}.owner-booking-headline{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2)}.owner-booking-when{color:var(--text)}.label-text,.owner-booking-when{font-size:var(--text-sm);font-weight:600}.label-text{display:block}.day-toggles{display:flex;flex-wrap:wrap;gap:var(--space-2)}.day-toggle{display:inline-flex;align-items:center;gap:4px;min-height:var(--touch);font-size:var(--text-sm)}