:root{--black:#080808;--panel:#141414;--soft:#212121;--red:#a91e2c;--red-bright:#e9333e;--cream:#f7ead5;--muted:#a69f98;--yellow:#f2b544;--font-display:'Kanit',sans-serif;--font-body:'Prompt',sans-serif}*{box-sizing:border-box}html{scroll-behavior:smooth}body{margin:0;background:var(--black);color:var(--cream);font-family:var(--font-body);min-height:100vh}.grain{position:fixed;inset:0;pointer-events:none;opacity:.06;background-image:url("data:image/svg+xml,%3Csvg viewBox='0 0 160 160' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.8' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='.5'/%3E%3C/svg%3E");z-index:5}.topbar{height:120px;padding:0 20px;display:flex;align-items:center;justify-content:space-between;position:sticky;top:0;background:rgba(8,8,8,.9);backdrop-filter:blur(12px);z-index:4}.brand{color:var(--cream);text-decoration:none;font:700 25px var(--font-display);letter-spacing:1px}.brand span{color:var(--red-bright)}
.brand-logo{height:104px;width:auto;display:block}.icon-button{background:var(--soft);border:0;border-radius:50%;width:38px;height:38px;display:flex;align-items:center;justify-content:center;color:var(--cream)}.icon-button svg{width:19px;height:19px}.topbar-left{display:flex;align-items:center;gap:10px;min-width:0}.social-icons{display:flex;align-items:center;gap:6px}.social-icon{display:flex;align-items:center;justify-content:center;width:26px;height:26px;flex-shrink:0;transition:transform .15s ease}.social-icon svg{width:26px;height:26px;display:block}.social-icon:hover{transform:scale(1.12)}.social-icon:active{transform:scale(.9)}@media(max-width:360px){.social-icons{gap:3px}.social-icon{width:23px;height:23px}.social-icon svg{width:23px;height:23px}}.view{display:none;max-width:760px;margin:auto;padding:8px 20px 108px;animation:rise .35s ease both}.view.active{display:block}@keyframes rise{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}/* ลดขนาด hero ลงจากเดิมนิดหน่อยตั้งใจ (min-height, padding, ขนาดหัวข้อ, ระยะห่างต่างๆ) เพื่อให้แบนเนอร์โปสเตอร์งาน
   ที่อยู่ถัดลงไปเด่นขึ้นเมื่อเทียบกัน ไม่ใช่ถูก hero ที่สูงมากกินพื้นที่/ความสนใจไปก่อนเข้าเรื่อง */
.hero{min-height:320px;margin:10px 0 42px;padding:20px 20px;display:flex;overflow:hidden;position:relative;background:linear-gradient(130deg,#1b1010,#101010 65%);border:1px solid #30201f}.hero:after{content:'';position:absolute;width:260px;height:260px;border:1px solid #6d2327;border-radius:50%;right:-95px;bottom:-110px;box-shadow:0 0 0 25px #3a1719,0 0 0 26px #632126,0 0 0 52px #231316}.eyebrow{color:var(--red-bright);font:600 12px var(--font-body);letter-spacing:2px;margin:0 0 10px}
/* เครดิต Sponsor เหนือหัวข้อหลัก: มีโลโก้ก็โชว์โลโก้ ไม่มีก็โชว์แค่ชื่อเป็นตัวหนังสือ (ดู renderSponsor() ใน app.js)
   ไม่มีข้อมูล Sponsor เลยก็ซ่อนทั้งบรรทัด ไม่ปล่อยให้ "Presented by" ค้างอยู่เฉยๆ โดยไม่มีชื่อต่อท้าย */
.hero-sponsor{display:flex;align-items:center;gap:8px;margin:0 0 12px;position:relative;z-index:1}
.hero-sponsor-label{color:var(--muted);font:600 10px var(--font-body);letter-spacing:1.5px}
.hero-sponsor-logos{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.hero-sponsor-logos img{height:40px;max-width:180px;object-fit:contain}
.hero-sponsor-text{color:var(--yellow);font:800 26px var(--font-display);letter-spacing:.5px;text-shadow:0 0 16px #f2b5447a}.hero h1,h2,h3{font-family:var(--font-display);margin:0}.hero h1{font-size:44px;line-height:.98;letter-spacing:-1px;position:relative;z-index:1}.hero h1 em{font-style:normal;color:var(--yellow)}.hero-subtitle{color:#c5bcb2;line-height:1.8;font-size:13px;max-width:270px;margin:10px 0 16px}.hero-art{position:absolute;right:12px;top:47px;color:var(--yellow);font:700 28px var(--font-display);line-height:.82;transform:rotate(8deg);text-align:center}.hero-art .sun{display:block;width:145px;height:145px;border-radius:50%;background:var(--red);opacity:.7;margin-bottom:-110px;margin-left:-20px}.spark{position:absolute;color:var(--cream);font-size:22px}.spark-one{top:5px;right:-3px}.spark-two{top:128px;left:-15px}.primary-button{border:0;background:var(--red-bright);color:white;padding:13px 21px;border-radius:4px;font:600 14px var(--font-body);cursor:pointer;display:inline-flex;justify-content:space-between;gap:25px;align-items:center;text-decoration:none}.primary-button:hover{background:#ff4953}.wide{width:100%}.section-heading{display:flex;align-items:end;justify-content:space-between;margin-bottom:18px}.section-heading h2{font-size:28px;line-height:1.15}.compact{margin:25px 0 25px}.text-button{background:0;border:0;color:var(--yellow);font:500 12px var(--font-body);padding:5px}#featured-artists{margin-bottom:35px}.lineup-day-row+.lineup-day-row{margin-top:20px}.lineup-day-label{margin:0 0 10px;font:600 11px var(--font-body);letter-spacing:1.5px;text-transform:uppercase;color:var(--yellow)}/* ริบบิ้นจางที่ขอบขวาบอกใบ้ว่ายังเลื่อนดูต่อได้ — เดิมซ่อนแถบเลื่อนของเบราว์เซอร์ไปแล้ว (เปลี่ยนเป็นลากด้วยการ์ดแทน)
   เหลือแค่การ์ดโผล่ครึ่งใบที่ขอบจออย่างเดียวไม่พอ ลูกค้าไม่รู้ว่าเลื่อนได้ (ดู #lineup-scroll-hint ใน index.html ที่ช่วยบอกตรงๆ อีกชั้น)
   ลองใช้ mask-image ทำจางไปก่อนรอบแรก แต่ลูกค้าทดสอบจริงบอกไม่เห็นเลย — คาดว่าเจอปัญหา mask-image รองรับไม่ทั่วถึงใน
   WebView ในแอป LINE (ลูกค้าส่วนใหญ่เปิดผ่านตรงนี้ ไม่ใช่เบราว์เซอร์ปกติ) เปลี่ยนมาใช้ div จริงพื้นหลัง gradient ทึบแทน
   (ดู .lineup-strip-wrap ด้านล่าง) ซึ่งรองรับได้ทุกเบราว์เซอร์แน่นอนกว่า ไม่ต้องพึ่ง CSS feature ใหม่เลย */
/* ริบบิ้นเดิมอยู่แค่ขอบกล่องเนื้อหา (.view มี padding-right 20px) ไม่ใช่ขอบจอจริง ห่างจากขอบจอจริงไป 20px
   เห็นได้ไม่ชัดเท่าที่ควร — ให้แถบการ์ด "ล้น" ออกไปจนสุดขอบจอจริงแทน (แบบ Netflix/แอปทั่วไป) ริบบิ้นจะได้ไปอยู่ที่ขอบจอจริง
   เห็นชัดกว่าเดิมมาก ใช้ margin-right ติดลบเท่ากับ padding ของ .view หักล้างออกไป — ระยะหายใจกลับมาของการ์ดใบสุดท้าย
   (กันไม่ให้เบียดติดขอบจอจริงพอดีเป๊ะตอนเลื่อนสุด) ไปกำหนดที่ festival.css แทน เพราะ .lineup-strip ที่นั่นตั้ง
   padding แบบ shorthand ทับ padding-right จากตรงนี้อยู่แล้ว (โหลดทีหลัง ชนะเสมอ) ตั้งซ้ำสองที่จะสับสนว่าอันไหนจริง */
.lineup-strip{display:flex;gap:12px;overflow:auto;padding-bottom:8px;scrollbar-width:none;-ms-overflow-style:none;cursor:grab}
.lineup-strip-wrap{position:relative;margin-right:-20px}
.lineup-strip-wrap:after{content:'';position:absolute;top:0;right:0;bottom:8px;width:44px;background:linear-gradient(to right,transparent,var(--black) 75%);pointer-events:none}
.lineup-scroll-hint{display:flex;align-items:center;gap:5px;margin:-8px 0 14px;font-size:11px;color:var(--muted)}
.lineup-scroll-hint svg{width:14px;height:14px;flex-shrink:0;animation:lineup-hint-nudge 1.6s ease-in-out infinite}
@keyframes lineup-hint-nudge{0%,100%{transform:translateX(0)}50%{transform:translateX(3px)}}
@media(prefers-reduced-motion:reduce){.lineup-scroll-hint svg{animation:none}}.lineup-strip::-webkit-scrollbar{display:none}.lineup-strip.dragging{cursor:grabbing;user-select:none}/* การ์ดศิลปิน: เดิมเป็นรูป/สีเต็มใบแล้วเขียนชื่อทับด้านล่าง ปัญหาคือตัวหนังสือ (โดยเฉพาะป้ายวันที่มุมบน) ไปทับ
   รูปถ่ายจริงตรงๆ พอรูปมีโทนสว่าง/ลายเยอะก็กลืนจนอ่านไม่ออก จึงแยกเป็น 2 ส่วนชัดเจน: รูป/สีอยู่ครึ่งบน (.artist-photo)
   ส่วนชื่อ+เวลา+สถานที่ (.artist-info) อยู่ครึ่งล่างบนพื้นการ์ดทึบของ THAICON เอง ไม่ทับรูปเลย อ่านออกชัดเจนทุกกรณี */
.artist-card{min-width:180px;display:flex;flex-direction:column;position:relative;overflow:hidden;background:var(--panel)}
/* เดิมใช้ background-size:cover ภาพที่สัดส่วนไม่พอดีกับกล่อง (เช่นภาพโปสเตอร์แนวตั้ง) จะโดนครอปหัว/ขอบภาพหายไป
   เปลี่ยนเป็น contain ให้เห็นภาพเต็มเสมอ ไม่มีส่วนไหนถูกตัด ช่องว่างที่เหลือ (ถ้าสัดส่วนไม่พอดีกัน) ใช้พื้นดำกลืนไปกับธีมเว็บแทน */
.artist-photo{height:160px;flex-shrink:0;position:relative;overflow:hidden;background-size:contain;background-repeat:no-repeat;background-position:center;background-color:#000}
.artist-photo:before{content:'';position:absolute;width:160px;height:160px;border-radius:50%;background:#fff3;right:-58px;top:-50px}
.artist-card.has-photo .artist-photo:before{display:none}
.artist-info{padding:12px 14px 14px;display:flex;flex-direction:column;gap:5px;flex:1}
.artist-info h3{font-size:17px;line-height:1.25;margin:0;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.artist-meta{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--muted);margin:0}
.artist-meta-icon{width:12px;height:12px;flex-shrink:0;display:flex;color:var(--yellow)}
.artist-meta-icon svg{width:100%;height:100%}
.artist-meta-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0;flex:1}
.artist-red .artist-photo{background:linear-gradient(155deg,#bd2a35,#54111d)}
.artist-yellow .artist-photo{background:linear-gradient(155deg,#d69a25,#654417)}
.artist-blue .artist-photo{background:linear-gradient(155deg,#3c6d72,#182f37)}.quick-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}
/* โปสเตอร์งาน: แอดมินอัปโหลด ไม่บังคับ ไม่มีก็ซ่อนบล็อกนี้ทั้งหมด (ดู renderEventPoster() ใน app.js)
   ใช้ width:100%;height:auto ไม่ครอปรูปเลย (เรียนรู้จากปัญหาการ์ดศิลปินที่ครอปหัวรูปไปแล้วรอบก่อน)
   max-height ไว้กันเคสรูปสูงมากผิดปกติเท่านั้น ปกติจะไม่โดนจำกัดเลย */
.poster-banner{display:flex;justify-content:center;flex:0 0 100%;scroll-snap-align:start;padding:0;border:0;background:#000;cursor:pointer;position:relative;overflow:hidden;border-radius:2px}
.poster-banner img{display:block;width:100%;height:auto;max-height:480px;object-fit:contain}
.poster-banner-hint{position:absolute;right:10px;bottom:10px;display:flex;align-items:center;gap:6px;background:#000a;backdrop-filter:blur(2px);color:var(--cream);font:500 11px var(--font-body);padding:7px 11px;border-radius:20px;transition:background .15s}
.poster-banner-hint svg{width:14px;height:14px;flex-shrink:0}
.poster-banner:hover .poster-banner-hint,.poster-banner:focus-visible .poster-banner-hint{background:var(--red-bright)}
.poster-banner:focus-visible{outline:3px solid var(--yellow);outline-offset:3px}
@media(prefers-reduced-motion:reduce){.poster-banner-hint{transition:none}}
/* หลายโปสเตอร์เลื่อนดูได้ทีละรูป (scroll-snap) แบบเดียวกับ .lineup-strip-wrap ทุกอย่าง (ล้นขอบจอจริง+ริบบิ้นจาง)
   ดูเหตุผลเต็ม ๆ ที่คอมเมนต์ของ .lineup-strip-wrap — ไม่ใช้ mask-image เหตุผลเดียวกัน (WebView ในแอป LINE) */
.poster-strip-wrap{position:relative;margin:0 0 25px;margin-right:-20px}
.poster-strip-wrap:after{content:'';position:absolute;top:0;right:0;bottom:0;width:44px;background:linear-gradient(to right,transparent,var(--black) 75%);pointer-events:none}
.poster-strip{display:flex;overflow-x:auto;scroll-snap-type:x mandatory;padding-right:20px;scrollbar-width:none;-ms-overflow-style:none}
.poster-strip::-webkit-scrollbar{display:none}
@media(min-width:700px){.poster-strip-wrap{margin-right:0}.poster-strip{padding-right:0}}

/* ไลท์บ็อกซ์ขยายรูปเต็มจอ: ใช้ร่วมกับโปสเตอร์งาน กด/แตะพื้นหลังหรือปุ่ม ✕ หรือ Esc เพื่อปิด (ดู app.js) */
.lightbox{position:fixed;inset:0;z-index:50;background:#000d;display:flex;align-items:center;justify-content:center;padding:24px}
.lightbox img{max-width:100%;max-height:100%;object-fit:contain}
.lightbox-close{position:absolute;top:16px;right:16px;width:40px;height:40px;border-radius:50%;border:1px solid #ffffff33;background:#000a;color:var(--cream);font-size:16px;cursor:pointer;display:flex;align-items:center;justify-content:center}
.lightbox-close:hover,.lightbox-close:focus-visible{background:var(--red-bright);border-color:var(--red-bright)}
.lightbox-close:focus-visible{outline:2px solid var(--yellow);outline-offset:2px}
/* การ์ดแต่ละใบยืมโทนสีจากหน้ารายละเอียดของตัวเอง (VIP/Camping ใช้ gradient เดียวกับหน้านั้นเป๊ะ, การเดินทาง/ติดต่อเรา
   ยืม gradient ที่มีอยู่แล้วจากการ์ดไลน์อัพ) ตั้งใจไม่คิดสีใหม่ ให้เห็นแล้วเชื่อมโยงกับหน้าที่จะกดเข้าไปได้ทันที */
.quick-card{position:relative;border:0;color:var(--cream);padding:12px 13px;text-align:left;min-height:88px;cursor:pointer;box-shadow:2px 2px 0 #00000055;transition:transform .12s ease,box-shadow .12s ease;overflow:hidden}
@media(hover:hover){.quick-card:hover{transform:translate(-1px,-1px);box-shadow:3px 3px 0 #00000055}}
.quick-card:active{transform:translate(1px,1px);box-shadow:1px 1px 0 #00000055}
.quick-teal{background:linear-gradient(155deg,#3c6d72,#182f37)}
.quick-vip{background:linear-gradient(135deg,#52121a,#191010)}
.quick-camp{background:linear-gradient(135deg,#1c2620,#101010)}
.quick-contact{background:linear-gradient(155deg,#bd2a35,#54111d)}
.quick-icon{display:flex;color:var(--yellow);margin-bottom:8px}
.quick-icon svg{width:18px;height:18px}
.quick-card strong,.quick-card small{display:block;position:relative}
.quick-card strong{font:500 12px var(--font-display)}
.quick-card small{font-size:9px;color:#ffffffb0;margin-top:2px;line-height:1.4}
.quick-card i{position:absolute;right:11px;bottom:11px;font-style:normal;color:#ffffff80;font-size:12px}.notice{background:#211718;border:1px solid #5c292b;padding:13px;display:flex;gap:12px;align-items:center;margin-bottom:18px}.notice span{font-size:22px}.notice p{font-size:12px;line-height:1.5;margin:0}.ticket-options{display:grid;gap:10px}.ticket-option{background:var(--panel);color:var(--cream);border:1px solid #302e2e;padding:16px 13px;display:grid;grid-template-columns:65px 1fr auto;gap:10px;text-align:left;align-items:center;cursor:pointer;border-radius:3px}.ticket-option.selected{border-color:var(--red-bright);box-shadow:inset 4px 0 var(--red-bright)}.ticket-option.featured{border-color:#86651f}.ticket-date{font:600 13px var(--font-display);color:var(--yellow)}.ticket-option b{font:500 14px var(--font-display);display:block}.ticket-option small{font-size:10px;color:var(--muted);display:block;margin-top:3px}.ticket-option strong{font:600 19px var(--font-display)}.quantity-row{display:flex;align-items:center;justify-content:space-between;border-bottom:1px solid #2a2828;padding:25px 0;margin-bottom:18px;font-size:13px}.quantity-row small{color:var(--muted);font-size:10px}.stepper{display:flex;align-items:center;gap:17px}.stepper button{background:var(--soft);border:0;color:var(--cream);border-radius:50%;width:30px;height:30px;font-size:20px;cursor:pointer}.order-summary{display:flex;justify-content:space-between;align-items:end;margin-bottom:20px}.order-summary span{font-size:12px;color:var(--muted)}.order-summary strong{display:block;font:600 31px var(--font-display);color:var(--yellow)}.order-summary small{max-width:190px;text-align:right;color:var(--muted);font-size:9px;line-height:1.5}.fine-print{font-size:10px;text-align:center;color:#766f6a;line-height:1.7}.day-tabs{display:flex;border-bottom:1px solid #332d2a;margin-bottom:10px}.day-tabs button{background:0;border:0;border-bottom:2px solid transparent;color:var(--muted);padding:11px 15px;font:500 13px var(--font-body);cursor:pointer}.day-tabs button.active{color:var(--cream);border-color:var(--red-bright)}.full-lineup div{padding:20px 0;border-bottom:1px solid #282525;display:flex;flex-wrap:wrap;gap:6px 20px;align-items:center}.full-lineup span{font:500 12px var(--font-display);color:var(--red-bright)}.full-lineup b{font:500 20px var(--font-display)}.full-lineup small{flex-basis:100%;color:var(--muted);font-size:11px}.lineup-thumb{width:44px;height:44px;border-radius:50%;object-fit:cover;flex-shrink:0}.day-note{margin-top:25px;border-left:3px solid var(--yellow);padding:10px 15px;color:var(--muted);font-size:12px}.map-art{height:330px;background:#17231f;border:1px solid #31453b;position:relative;overflow:hidden;background-image:linear-gradient(30deg,#ffffff08 12%,transparent 12.5%,transparent 87%,#ffffff08 87.5%);background-size:31px 31px}
/* รูปผังงานที่แอดมินอัปโหลดเอง แทนที่ .map-art ทั้งชุด — ไม่บังคับความสูงคงที่แบบผังวาดมือ เพราะรูปจริงมีสัดส่วนไม่แน่นอน
   ปล่อยความสูงตามสัดส่วนรูปจริง (แค่กันไม่ให้สูงเกินจอ) ไม่ครอบ/บีบภาพจนเสียสัดส่วน */
.map-image{display:block;width:100%;max-height:520px;object-fit:contain;background:#17231f;border:1px solid #31453b}.stage{position:absolute;background:var(--red-bright);top:27px;left:16%;right:16%;text-align:center;padding:14px;font:600 15px var(--font-display);transform:skew(-12deg)}.zone{position:absolute;border:1px dashed #d6ae63;color:#d6ae63;text-align:center;font:500 12px var(--font-display);padding:35px 14px}.camping{bottom:20px;left:7%;width:43%;height:120px}.entrance{bottom:20px;right:7%;width:32%;height:75px;padding-top:22px}.amenity{position:absolute;background:#e9cf91;color:#31291a;padding:7px;font-size:10px}.toilet{top:140px;left:10%}.service{top:140px;right:10%}.address{padding:18px 0}.address b{font:500 19px var(--font-display)}.address p{font-size:12px;color:var(--muted);line-height:1.7}.empty-state{text-align:center;padding:90px 20px;color:var(--muted)}.empty-state div{font-size:45px;filter:grayscale(1);opacity:.5}.empty-state h3{color:var(--cream);font-size:20px;margin:16px 0 7px}.empty-state p{font-size:12px;line-height:1.7;margin-bottom:22px}.vip-card{background:linear-gradient(135deg,#52121a,#191010);padding:35px 25px;min-height:300px;border:1px solid #68242a;position:relative;overflow:hidden}.vip-card:after{content:'VIP';position:absolute;font:700 130px var(--font-display);color:#ffffff08;right:-20px;bottom:-35px}.vip-card>span{color:var(--yellow);font-size:30px}.vip-card h3{font-size:35px;line-height:1.1;margin:25px 0 12px}.vip-card p{color:#c4aaa0;font-size:12px;line-height:1.8;max-width:220px}.bottom-nav{position:fixed;bottom:0;left:0;right:0;height:72px;background:rgba(13,13,13,.96);border-top:1px solid #282626;display:flex;justify-content:center;z-index:4}.bottom-nav button{background:0;border:0;color:#777;padding:8px 14px;min-width:70px;font:10px var(--font-body);cursor:pointer}.bottom-nav span{display:block;font-size:21px;height:29px}.bottom-nav button.active{color:var(--red-bright)}@media(min-width:700px){.topbar{padding:0 calc((100% - 720px)/2)}.view{padding-left:0;padding-right:0}.hero{min-height:360px}.bottom-nav button{min-width:110px}.lineup-strip-wrap{margin-right:0}}
