:root{color-scheme:dark;--app-bg:#101012;--app-fg:#f5f5f5}html[data-theme=light]{color-scheme:light;--app-bg:#faf9f7;--app-fg:#171717}html,body{margin:0;width:100%;height:100%;overflow:hidden;background:var(--app-bg);color:var(--app-fg);font-family:system-ui,sans-serif}*{box-sizing:border-box}[hidden]{display:none!important}.app-view{position:fixed;inset:0;width:100%;height:100%;border:0;background:var(--app-bg);visibility:hidden;opacity:0;pointer-events:none;z-index:2}.app-view.is-preparing{visibility:visible}.app-view.is-active{visibility:visible;opacity:1;pointer-events:auto}.app-view.is-active{z-index:3}.app-view.is-leaving{visibility:visible;opacity:1;z-index:2;pointer-events:none}.app-view.is-entering{animation:app-in .2s cubic-bezier(.2,0,0,1) both}@keyframes app-in{from{opacity:0}}#appProgress{position:fixed;inset:0 0 auto;height:3px;z-index:20;background:#f98b31;transform-origin:left;animation:app-loading 4s ease-out infinite}#appNotice{position:fixed;z-index:30;left:50%;bottom:max(24px,env(safe-area-inset-bottom));transform:translateX(-50%);width:min(92%,480px);padding:18px;border:1px solid #8885;border-radius:20px;background:var(--app-bg);box-shadow:0 8px 30px #0003;display:flex;flex-wrap:wrap;gap:12px}#appNotice span{width:100%;line-height:1.5}#appNotice button,#appCall{font:inherit;color:inherit;cursor:pointer;border:1px solid #8885;background:var(--app-bg);border-radius:999px;padding:12px 18px}#appCall{position:fixed;right:16px;bottom:calc(104px + env(safe-area-inset-bottom));z-index:25;border-color:#f98b31;box-shadow:0 4px 18px #0002}@keyframes app-loading{from{transform:scaleX(.08)}to{transform:scaleX(.92)}}@media(prefers-reduced-motion:reduce){#appProgress,.app-view.is-entering{animation:none}}
/* หน้าเปิดแอป = หน้าเปิดของ Android เอง ไม่มีหน้าเปิดที่สอง (เจ้าของสั่งเอาหน้าคลื่นออก)
   Android วาด icon-splash.png (โลโก้ + แสงนุ่ม บนพื้น #0B0B0E = background_color) กลางจอขนาดราว 240dp จนหน้านี้วาดเนื้อหาครั้งแรก
   แล้วจางของมันออก 0.3 วิ · หน้านี้จึงวาดภาพเดียวกันเป๊ะ (.op-mark กล่อง 240 กลางจอ) นิ่ง ๆ ต่อจนหน้าแรกพร้อม แล้วจางออก
   โลโก้เป็น <img> จริง: Chrome นับว่า "มีเนื้อหาแล้ว" ทันทีที่ภาพขึ้น (รูป > 32×32) ไม่ต้องรอสคริปต์ · ไม่มีจอว่างคั่นระหว่างหน้าเปิดกับหน้าแรก */
#appOpening{position:fixed;inset:0;z-index:10;pointer-events:auto;animation:opBail .3s ease-in 10s forwards}
/* กันค้างชั้นสุดท้าย (แม้สคริปต์โหลดไม่ขึ้นเลย): 10 วิแล้วหายเอง */
@keyframes opBail{to{opacity:0;visibility:hidden;pointer-events:none}}
#appOpening.is-ready{pointer-events:none}
#appOpening>*{position:absolute;display:block;margin:0}
#appOpening .op-bg{inset:0;background:#0B0B0E}
#appOpening .op-mark{left:50%;top:50%;width:240px;height:240px;margin:-120px 0 0 -120px}
#appOpening .op-halo{position:absolute;inset:0;display:block;border-radius:50%;background:radial-gradient(closest-side,rgba(242,140,56,.34),rgba(255,77,122,.12) 58%,transparent)}
#appOpening .op-logo{position:absolute;left:90px;top:84px;width:60px;height:72px;filter:drop-shadow(0 8px 24px rgba(242,140,56,.55))}
#appOpening.is-out{animation:opOut .28s ease-out both}
@keyframes opOut{from{opacity:1}to{opacity:0}}
@media(prefers-reduced-motion:reduce){#appOpening.is-out{animation-duration:.12s}}
