/* Admin — JD JUSTICE DIVERS · UX-focused responsive layout */ :root { --bg: #0b0d14; --bg-elevated: #12141f; --card: #161822; --card-hover: #1c1e2e; --border: rgba(90, 100, 140, 0.35); --border-strong: rgba(122, 162, 247, 0.35); --text: #c8d3f5; --muted: #6b7394; --accent: #7aa2f7; --accent-dim: rgba(122, 162, 247, 0.14); --accent2: #9ece6a; --danger: #f7768e; --success: #9ece6a; --font: 'Kanit', system-ui, -apple-system, sans-serif; --radius: 12px; --radius-lg: 16px; --shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.35); --shadow-md: 0 8px 32px rgba(0, 0, 0, 0.45); --header-blur: 16px; --space: clamp(0.75rem, 2vw, 1.5rem); --shell-max: 1180px; --transition: 0.18s ease; } @media (prefers-reduced-motion: reduce) { *, *::before, *::after { animation-duration: 0.01ms !important; animation-iteration-count: 1 !important; transition-duration: 0.01ms !important; } } * { box-sizing: border-box; } html { scroll-behavior: smooth; } body { margin: 0; min-height: 100vh; min-height: 100dvh; font-family: var(--font); color: var(--text); background: var(--bg); line-height: 1.5; -webkit-font-smoothing: antialiased; } /* Skip link — accessibility */ .skip-link { position: absolute; top: -100px; left: var(--space); z-index: 9999; padding: 0.5rem 1rem; background: var(--accent); color: #0b0d14; font-weight: 600; border-radius: 8px; text-decoration: none; transition: top var(--transition); } .skip-link:focus { top: var(--space); outline: 2px solid #fff; outline-offset: 2px; } .admin-bg { position: fixed; inset: 0; background: radial-gradient(ellipse 100% 80% at 50% -30%, rgba(122, 162, 247, 0.22), transparent 55%), radial-gradient(ellipse 50% 50% at 100% 20%, rgba(158, 206, 106, 0.1), transparent), radial-gradient(ellipse 40% 40% at 0% 80%, rgba(247, 118, 142, 0.06), transparent), var(--bg); pointer-events: none; z-index: 0; } .admin-shell { position: relative; z-index: 1; width: 100%; max-width: var(--shell-max); margin: 0 auto; padding: var(--space); padding-bottom: max(var(--space), env(safe-area-inset-bottom)); } /* Center auth cards vertically */ .admin-shell:has(#panel-login:not([hidden])), .admin-shell:has(#panel-setup:not([hidden])) { display: flex; flex-direction: column; justify-content: center; min-height: min(100vh, 100dvh); padding-top: max(var(--space), env(safe-area-inset-top)); } /* —— Header —— */ .admin-header-bar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 1rem; margin: calc(-0.25 * var(--space)) 0 1.25rem; padding: 0.85rem 1rem; background: rgba(18, 20, 34, 0.72); backdrop-filter: blur(var(--header-blur)); -webkit-backdrop-filter: blur(var(--header-blur)); border: 1px solid var(--border); border-radius: var(--radius-lg); box-shadow: var(--shadow-sm); position: sticky; top: max(0.5rem, env(safe-area-inset-top)); z-index: 40; } .admin-brand { display: flex; align-items: center; gap: 0.85rem; min-width: 0; } .admin-brand-mark { width: 44px; height: 44px; flex-shrink: 0; border-radius: 12px; background: linear-gradient(135deg, #3d59a1, #7aa2f7 45%, #9ece6a); box-shadow: 0 0 0 2px rgba(122, 162, 247, 0.25), 0 4px 16px rgba(0, 0, 0, 0.35); } .admin-brand-text { min-width: 0; } .admin-title { margin: 0; font-size: clamp(1.15rem, 3.5vw, 1.45rem); font-weight: 700; letter-spacing: -0.02em; line-height: 1.2; } .admin-tagline { margin: 0.15rem 0 0; font-size: 0.72rem; font-weight: 500; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted); } .admin-top-actions { display: flex; flex-wrap: wrap; align-items: center; justify-content: flex-end; gap: 0.65rem; } /* แอตทริบิวต์ hidden ต้องชนะ display:flex — ไม่งั้นปุ่มออกจากระบบโผล่ตอนหน้า login */ .admin-top-actions[hidden] { display: none !important; } .admin-user { font-size: 0.82rem; color: var(--muted); padding: 0.35rem 0.75rem; background: var(--accent-dim); border-radius: 999px; border: 1px solid rgba(122, 162, 247, 0.2); max-width: min(220px, 50vw); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .btn-logout { flex-shrink: 0; } /* —— Cards —— */ .card { background: var(--card); border: 1px solid var(--border); border-radius: var(--radius-lg); padding: clamp(1.1rem, 3vw, 1.65rem); margin-bottom: 1rem; box-shadow: var(--shadow-sm); transition: border-color var(--transition), box-shadow var(--transition); } .card:hover { border-color: rgba(122, 162, 247, 0.22); } .card--auth { max-width: 440px; width: 100%; margin-left: auto; margin-right: auto; box-shadow: var(--shadow-md); border-color: rgba(122, 162, 247, 0.2); } .card--password { background: linear-gradient(180deg, rgba(122, 162, 247, 0.06), transparent 48%), var(--card); border-color: rgba(122, 162, 247, 0.18); } .card h2, .card-title-icon { margin: 0 0 0.65rem; font-size: clamp(1rem, 2.5vw, 1.15rem); font-weight: 600; color: var(--text); } .admin-subheading { margin: 1.5rem 0 0.4rem; font-size: 0.98rem; font-weight: 600; color: var(--accent); } .muted { color: var(--muted); font-size: 0.86rem; line-height: 1.55; margin: 0 0 1rem; } /* —— Forms —— */ .form-grid { display: flex; flex-direction: column; gap: 1rem; max-width: 420px; } .form-grid label, .form-inline label { display: flex; flex-direction: column; gap: 0.4rem; font-size: 0.82rem; font-weight: 500; color: var(--muted); } .form-inline { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 168px), 1fr)); gap: 0.85rem; align-items: end; max-width: none; margin-bottom: 1rem; } .form-inline .check { flex-direction: row; align-items: center; gap: 0.5rem; } input, select { font: inherit; padding: 0.6rem 0.75rem; border-radius: 10px; border: 1px solid var(--border); background: var(--bg-elevated); color: var(--text); width: 100%; transition: border-color var(--transition), box-shadow var(--transition); } input::placeholder { color: rgba(107, 115, 148, 0.75); } input:hover, select:hover { border-color: rgba(122, 162, 247, 0.28); } input:focus, select:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px var(--accent-dim); } .password-input-wrap { position: relative; display: block; width: 100%; } .password-input-wrap input { padding-right: 4.5rem; } .btn-password-toggle { position: absolute; right: 8px; top: 50%; transform: translateY(-50%); font: inherit; font-size: 0.76rem; font-weight: 600; cursor: pointer; padding: 0.4rem 0.7rem; border-radius: 8px; border: 1px solid var(--border); background: #24283b; color: var(--accent); line-height: 1.2; transition: background var(--transition), color var(--transition); } .btn-password-toggle:hover { background: #2f3550; color: var(--text); } .btn-password-toggle:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } fieldset { border: 1px solid var(--border); border-radius: var(--radius); padding: 1rem 1.1rem; margin: 0; background: rgba(0, 0, 0, 0.15); } legend { padding: 0 0.5rem; font-weight: 600; font-size: 0.88rem; color: var(--accent2); } .form-oauth { max-width: none; gap: 1.35rem; } /* —— Buttons —— */ .btn { font: inherit; cursor: pointer; border-radius: 10px; padding: 0.6rem 1.15rem; border: 1px solid var(--border); background: #24283b; color: var(--text); font-weight: 500; transition: transform var(--transition), background var(--transition), border-color var(--transition), box-shadow var(--transition); } .btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } .btn:active:not(:disabled) { transform: scale(0.98); } .btn-primary { background: linear-gradient(135deg, #3d59a1, #7aa2f7); border-color: transparent; font-weight: 600; box-shadow: 0 2px 12px rgba(122, 162, 247, 0.25); } .btn-primary:hover:not(:disabled) { box-shadow: 0 4px 20px rgba(122, 162, 247, 0.35); filter: brightness(1.05); } .btn-ghost { background: transparent; border-color: var(--border); } .btn-ghost:hover:not(:disabled) { background: rgba(255, 255, 255, 0.04); border-color: rgba(122, 162, 247, 0.35); } .btn-danger { color: var(--danger); border-color: rgba(247, 118, 142, 0.45); font-size: 0.78rem; padding: 0.38rem 0.65rem; } .btn:disabled { opacity: 0.45; cursor: not-allowed; } /* —— Messages —— */ .msg { min-height: 1.35rem; margin: 0.85rem 0 0; font-size: 0.86rem; padding: 0.35rem 0; } .msg.error { color: var(--danger); } .msg.ok { color: var(--success); } /* —— App layout & tabs —— */ .admin-main-flow { display: block; } .admin-app { margin-top: 0.25rem; } .admin-tabs { display: flex; flex-wrap: nowrap; gap: 0.5rem; margin: 0 0 1rem; padding: 0.35rem; overflow-x: auto; overflow-y: hidden; -webkit-overflow-scrolling: touch; scroll-snap-type: x proximity; scrollbar-width: thin; scrollbar-color: var(--border) transparent; background: rgba(0, 0, 0, 0.2); border: 1px solid var(--border); border-radius: var(--radius-lg); } .admin-tabs::-webkit-scrollbar { height: 6px; } .admin-tabs::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; } .tab { font: inherit; cursor: pointer; flex: 0 0 auto; scroll-snap-align: start; display: flex; flex-direction: column; align-items: flex-start; gap: 0.1rem; padding: 0.55rem 1rem; min-height: 3.1rem; justify-content: center; border-radius: 10px; border: 1px solid transparent; background: transparent; color: var(--muted); text-align: left; transition: background var(--transition), color var(--transition), border-color var(--transition), box-shadow var(--transition); } .tab-label { font-size: 0.88rem; font-weight: 600; color: inherit; line-height: 1.2; } .tab-desc { font-size: 0.68rem; font-weight: 400; opacity: 0.88; line-height: 1.2; max-width: 140px; } .tab-desc--wide { max-width: 12.5rem; } .tab:hover { color: var(--text); background: rgba(255, 255, 255, 0.04); } .tab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; } .tab.is-active { color: var(--text); border-color: var(--border-strong); background: var(--accent-dim); box-shadow: 0 0 0 1px rgba(122, 162, 247, 0.15); } .tab.is-active .tab-label { color: var(--accent); } .tab-panel[hidden] { display: none !important; } .tab-panel.card { margin-bottom: 1.25rem; } /* —— Tables —— */ .table-wrap { overflow-x: auto; margin-top: 1rem; margin-left: -0.25rem; margin-right: -0.25rem; padding: 0 0.25rem 0.25rem; border-radius: var(--radius); -webkit-overflow-scrolling: touch; } .data-table { width: 100%; min-width: 520px; border-collapse: collapse; font-size: 0.8rem; border-radius: 10px; overflow: hidden; } .data-table th, .data-table td { text-align: left; padding: 0.65rem 0.7rem; border-bottom: 1px solid var(--border); vertical-align: middle; } .data-table tbody tr { transition: background var(--transition); } .data-table tbody tr:hover { background: rgba(122, 162, 247, 0.05); } .data-table th { color: var(--muted); font-weight: 600; font-size: 0.72rem; text-transform: uppercase; letter-spacing: 0.04em; background: rgba(0, 0, 0, 0.25); } .data-table tbody tr:last-child td { border-bottom: none; } code { font-size: 0.84em; font-family: ui-monospace, monospace; background: var(--bg-elevated); padding: 0.15em 0.4em; border-radius: 6px; border: 1px solid var(--border); } .input-coins { width: 5.5rem; min-width: 0; } .btn-coins-save { font-size: 0.74rem; padding: 0.32rem 0.55rem; margin-top: 0.3rem; } /* —— Map editor iframe —— */ .admin-editor-panel { max-width: none; display: flex; flex-direction: column; min-height: 0; } .admin-editor-panel-head { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 0.65rem 1rem; margin-bottom: 0.65rem; flex-shrink: 0; } .admin-editor-panel-intro { flex: 1 1 240px; min-width: 0; } .admin-editor-panel-intro h2 { margin: 0 0 0.35rem; } .admin-editor-panel-intro .muted { margin-bottom: 0; } .btn-editor-fs { flex-shrink: 0; align-self: flex-start; font-weight: 600; border-color: rgba(122, 162, 247, 0.35); } .admin-editor-panel.is-fullscreen { position: fixed; inset: 0; z-index: 200; margin: 0 !important; border-radius: 0 !important; max-width: none !important; width: 100% !important; height: 100% !important; max-height: none !important; padding: clamp(0.5rem, 2vw, 1rem) !important; overflow: hidden; box-shadow: none; } .admin-editor-panel.is-fullscreen .admin-editor-iframe { flex: 1 1 auto; min-height: 0; height: auto !important; min-height: 0 !important; max-height: none !important; border-radius: var(--radius); } .admin-editor-iframe { display: block; width: 100%; flex: 1 1 auto; min-height: min(72vh, 800px); height: 72vh; border: 1px solid var(--border); border-radius: var(--radius-lg); background: var(--bg); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04); } /* —— Quiz game settings —— */ .quiz-timing-fieldset { margin-bottom: 1.25rem; } .quiz-timing-grid { margin-top: 0.35rem; } .quiz-admin-questions-list { display: flex; flex-direction: column; gap: 0.75rem; margin-bottom: 1rem; } .quiz-admin-q-row { display: grid; grid-template-columns: 1fr auto auto; gap: 0.65rem 0.85rem; align-items: end; padding: 0.75rem 0.85rem; border: 1px solid var(--border); border-radius: var(--radius); background: rgba(0, 0, 0, 0.12); } .quiz-admin-q-label, .quiz-admin-ans-label { display: flex; flex-direction: column; gap: 0.35rem; font-size: 0.86rem; font-weight: 500; margin: 0; } .quiz-admin-q-text { font: inherit; padding: 0.45rem 0.6rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); min-width: 0; } .quiz-admin-q-ans { font: inherit; padding: 0.45rem 0.5rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); min-width: 9rem; } .quiz-admin-q-remove { align-self: end; white-space: nowrap; } .quiz-admin-actions { display: flex; flex-wrap: wrap; gap: 0.65rem; align-items: center; } /* —— Quiz carry (หลายตัวเลือก) —— */ .quiz-carry-admin-list { display: flex; flex-direction: column; gap: 1rem; margin-bottom: 1rem; } .quiz-carry-admin-block { display: flex; flex-direction: column; gap: 0.65rem; padding: 0.85rem 0.95rem; border: 1px solid var(--border); border-radius: var(--radius); background: rgba(0, 0, 0, 0.12); } .quiz-carry-admin-block-head { display: flex; flex-wrap: wrap; align-items: flex-end; justify-content: space-between; gap: 0.65rem; } .quiz-carry-q-label { flex: 1 1 220px; min-width: 0; display: flex; flex-direction: column; gap: 0.35rem; font-size: 0.86rem; font-weight: 500; margin: 0; } .quiz-carry-q-text { font: inherit; padding: 0.45rem 0.6rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); width: 100%; min-width: 0; } .quiz-carry-choice-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(min(100%, 11rem), 1fr)); gap: 0.5rem 0.75rem; } .quiz-carry-slot-label { display: flex; flex-direction: column; gap: 0.28rem; font-size: 0.78rem; font-weight: 500; color: var(--muted); margin: 0; } .quiz-carry-slot-inp { font: inherit; padding: 0.38rem 0.5rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); width: 100%; min-width: 0; } .quiz-carry-correct-wrap { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 0.65rem; } .quiz-carry-correct-label { display: flex; flex-direction: column; gap: 0.35rem; font-size: 0.86rem; font-weight: 500; margin: 0; } .quiz-carry-correct-sel { font: inherit; padding: 0.45rem 0.55rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); min-width: 12rem; } .quiz-carry-block-remove { flex-shrink: 0; align-self: flex-end; } /* —— Gauntlet: Editor-style shell (โทน editor.html + HUD พรมแดง) —— */ .gauntlet-timing-fieldset { border: 1px solid rgba(65, 72, 104, 0.85); border-radius: var(--radius-lg); background: linear-gradient(165deg, rgba(26, 27, 38, 0.96) 0%, rgba(14, 15, 22, 0.99) 100%); padding: 0.5rem 0.85rem 1rem; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.04), 0 12px 40px rgba(0, 0, 0, 0.28); } .gauntlet-timing-fieldset > legend { padding: 0 0.45rem; color: #7aa2f7; font-weight: 600; } .gauntlet-editor-shell { margin-top: 0.35rem; border-radius: 10px; border: 1px solid #414868; background: #1a1b26; overflow: hidden; } .gauntlet-editor-toolbar { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 0.65rem 1rem; padding: 0.55rem 0.85rem; border-bottom: 1px solid rgba(65, 72, 104, 0.9); background: linear-gradient(180deg, #1f2230 0%, #1a1b26 100%); } .gauntlet-editor-toolbar-title { margin: 0; font-size: 1.02rem; font-weight: 600; color: #7aa2f7; letter-spacing: 0.02em; } .gauntlet-editor-toolbar-actions { display: flex; flex-wrap: wrap; gap: 0.5rem 0.75rem; align-items: center; } .gauntlet-editor-link { font-size: 0.86rem; font-weight: 600; color: #9ece6a; text-decoration: none; padding: 0.35rem 0.65rem; border-radius: 6px; border: 1px solid rgba(158, 206, 106, 0.4); background: rgba(158, 206, 106, 0.09); transition: background var(--transition), border-color var(--transition); } .gauntlet-editor-link:hover { background: rgba(158, 206, 106, 0.18); border-color: rgba(158, 206, 106, 0.55); } .gauntlet-editor-link-secondary { color: #7dcfff; border-color: rgba(125, 207, 255, 0.38); background: rgba(125, 207, 255, 0.08); } .gauntlet-editor-link-secondary:hover { background: rgba(125, 207, 255, 0.16); border-color: rgba(125, 207, 255, 0.52); } .gauntlet-editor-legend { margin: 0; padding: 0.55rem 0.85rem 0.65rem; font-size: 0.88rem; line-height: 1.45; color: #a9b1d6; border-bottom: 1px solid rgba(65, 72, 104, 0.55); background: rgba(15, 16, 24, 0.4); } .gauntlet-editor-legend a { color: #9ece6a; } .gauntlet-editor-panels { padding: 0.75rem; display: flex; flex-direction: column; gap: 0.85rem; } @media (min-width: 960px) { .gauntlet-editor-panels { display: grid; grid-template-columns: 1fr 1.08fr; align-items: start; gap: 1rem; } } .gauntlet-editor-panel { margin: 0; padding: 0.75rem 0.85rem; border-radius: 8px; border: 1px solid #414868; background: #24283b; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.03); } .gauntlet-editor-panel-title { margin: 0 0 0.5rem; font-size: 0.95rem; font-weight: 600; color: #7aa2f7; } .gauntlet-editor-panel--stage { background: linear-gradient(180deg, #1e2030 0%, #24283b 42%, #26191c 100%); border-color: rgba(180, 90, 100, 0.4); box-shadow: inset 0 0 0 1px rgba(125, 207, 255, 0.07), 0 0 28px rgba(239, 68, 68, 0.07); } .gauntlet-editor-shell .gauntlet-asset-library { margin: 0; padding: 0; border: none; background: transparent; } .gauntlet-editor-shell .gauntlet-asset-library-intro { margin-top: 0; } .gauntlet-editor-shell .gauntlet-asset-drop { border: 1px solid #414868; background: #0f1018; min-height: 6rem; box-shadow: inset 0 0 28px rgba(127, 29, 29, 0.14), inset 0 -10px 36px rgba(185, 28, 28, 0.09); } .gauntlet-editor-shell .gauntlet-asset-drop:hover, .gauntlet-editor-shell .gauntlet-asset-drop:focus { border-color: #7aa2f7; box-shadow: inset 0 0 32px rgba(127, 29, 29, 0.16), 0 0 0 1px rgba(125, 207, 255, 0.22); } .gauntlet-editor-shell .gauntlet-asset-drop.is-dragover { border-color: #7dcfff; box-shadow: 0 0 0 2px rgba(125, 207, 255, 0.25); } .gauntlet-editor-shell .gauntlet-asset-card { background: #1a1b26; border-color: #414868; transition: box-shadow var(--transition), border-color var(--transition); } .gauntlet-editor-shell .gauntlet-asset-card:hover { border-color: rgba(125, 207, 255, 0.5); box-shadow: 0 0 0 1px rgba(125, 207, 255, 0.28), 0 0 22px rgba(125, 207, 255, 0.1); } .gauntlet-editor-panel--stage .game-timing-assigned-visuals { margin: 0; gap: 1rem; } .gauntlet-editor-panel--stage .game-timing-visual-block { background: rgba(15, 16, 24, 0.5); border: 1px solid rgba(65, 72, 104, 0.85); } .gauntlet-editor-panel--stage .game-timing-visual-title { color: #c0caf5; font-size: 0.95rem; } .gauntlet-editor-panel--stage .game-timing-visual-block--lanes .game-timing-visual-grid { padding: 0.5rem; border-radius: 8px; background: linear-gradient(180deg, rgba(185, 28, 28, 0.14) 0%, rgba(26, 27, 38, 0.55) 50%); border: 1px solid rgba(212, 175, 55, 0.22); } .gauntlet-editor-panel--stage .game-timing-visual-card { box-shadow: 0 0 0 1px rgba(125, 207, 255, 0.2), 0 4px 14px rgba(0, 0, 0, 0.4); } .gauntlet-editor-panel--stage .game-timing-laser-preview { border-color: rgba(239, 68, 68, 0.25); } .game-timing-laser-slot--beam .game-timing-laser-preview { position: relative; } .game-timing-laser-slot--beam .game-timing-laser-preview::after { content: ''; position: absolute; left: 50%; top: 8%; bottom: 8%; width: 3px; transform: translateX(-50%); border-radius: 2px; background: linear-gradient(180deg, rgba(252, 165, 165, 0.15), rgba(239, 68, 68, 0.9), rgba(252, 165, 165, 0.15)); box-shadow: 0 0 14px rgba(239, 68, 68, 0.45); pointer-events: none; opacity: 0.9; } .game-timing-laser-slot--beam .game-timing-laser-preview:has(.game-timing-laser-preview-img)::after { opacity: 0.4; } @media (min-width: 700px) { .gauntlet-editor-panel--stage .game-timing-laser-slots-grid { grid-template-columns: 1fr 1fr 1fr; gap: 0; } .gauntlet-editor-panel--stage .game-timing-laser-slot { border-radius: 0; border: none; border-right: 1px solid rgba(239, 68, 68, 0.22); background: transparent; padding-left: 0.65rem; padding-right: 0.65rem; } .gauntlet-editor-panel--stage .game-timing-laser-slot:last-child { border-right: none; } .gauntlet-editor-panel--stage .game-timing-laser-slot--beam { border-left: 1px solid rgba(125, 207, 255, 0.15); border-right: 1px solid rgba(125, 207, 255, 0.15); } } .gauntlet-editor-laser-colors { margin-top: 0.35rem; padding: 0.65rem 0.75rem; border-radius: 8px; background: rgba(26, 27, 38, 0.7); border: 1px solid #414868; } .gauntlet-editor-laser-colors label { font-size: 0.82rem; } .gauntlet-editor-laser-colors input[type='text'], .gauntlet-editor-laser-colors input[type='number'] { background: #1a1b26; border-color: #414868; color: #c0caf5; } /* —— Gauntlet asset library (game timing) —— */ .gauntlet-asset-library { margin: 0.75rem 0 1rem; padding: 0.85rem 1rem; border: 1px solid var(--border); border-radius: var(--radius); background: rgba(0, 0, 0, 0.1); } .gauntlet-asset-library-intro { margin: 0 0 0.65rem; line-height: 1.45; } .gauntlet-asset-drop { display: flex; align-items: center; justify-content: center; min-height: 5.5rem; padding: 1rem; border: 2px dashed var(--border); border-radius: var(--radius); background: rgba(255, 255, 255, 0.03); cursor: pointer; text-align: center; transition: border-color 0.15s ease, background 0.15s ease; } .gauntlet-asset-drop:hover, .gauntlet-asset-drop:focus { outline: none; border-color: var(--accent, #7aa2f7); background: rgba(122, 162, 247, 0.08); } .gauntlet-asset-drop.is-dragover { border-color: var(--accent, #7aa2f7); background: rgba(122, 162, 247, 0.12); } .gauntlet-asset-drop-text { font-size: 0.92rem; font-weight: 500; } .gauntlet-asset-upload-msg { margin: 0.4rem 0 0; min-height: 1.25em; } .gauntlet-asset-list { display: grid; grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); gap: 0.85rem; margin-top: 0.85rem; } .gauntlet-asset-card { display: flex; flex-direction: column; gap: 0.45rem; padding: 0.65rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg); } .gauntlet-asset-card-preview { display: block; width: 100%; height: 100px; object-fit: contain; background: repeating-conic-gradient(#222 0% 25%, #333 0% 50%) 50% / 12px 12px; border-radius: 6px; } .gauntlet-asset-card-label-wrap { display: flex; flex-direction: column; gap: 0.25rem; } .gauntlet-asset-card-label-wrap label { font-size: 0.78rem; color: var(--muted, #888); margin: 0; } .gauntlet-asset-card-label-wrap input { font: inherit; padding: 0.35rem 0.45rem; border-radius: 6px; border: 1px solid var(--border); background: var(--bg); color: var(--text); width: 100%; box-sizing: border-box; } .gauntlet-asset-card-url { font-size: 0.72rem; word-break: break-all; color: var(--muted, #888); margin: 0; } .gauntlet-asset-card-actions { display: flex; flex-wrap: wrap; gap: 0.35rem; } .gauntlet-asset-card-actions .btn { font-size: 0.78rem; padding: 0.28rem 0.45rem; } /* —— Game timing: lane / laser visual assignment (no visible URL paths) —— */ .game-timing-assigned-visuals { margin-top: 1rem; display: flex; flex-direction: column; gap: 1.25rem; } .game-timing-visual-block { padding: 0.85rem 1rem; border: 1px solid var(--border); border-radius: var(--radius); background: rgba(0, 0, 0, 0.08); } .game-timing-visual-title { margin: 0 0 0.35rem; font-size: 1rem; font-weight: 600; } .game-timing-visual-hint { margin: 0 0 0.65rem; font-size: 0.84rem; line-height: 1.4; } .game-timing-visual-grid { display: flex; flex-wrap: wrap; gap: 0.65rem; align-items: flex-start; } .game-timing-visual-card { display: flex; flex-direction: column; gap: 0.35rem; width: 118px; padding: 0.45rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg); } .game-timing-visual-card-img { width: 100%; height: 72px; object-fit: contain; background: repeating-conic-gradient(#1a1a1c 0% 25%, #252528 0% 50%) 50% / 10px 10px; border-radius: 6px; } .game-timing-visual-card-img.is-broken { opacity: 0.35; } .game-timing-visual-card-actions { display: flex; flex-wrap: wrap; gap: 0.2rem; justify-content: center; } .game-timing-visual-card-actions .btn { font-size: 0.72rem; padding: 0.2rem 0.35rem; min-width: 0; } .game-timing-laser-slots-grid { display: grid; grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); gap: 0.85rem; } .game-timing-laser-slot { display: flex; flex-direction: column; gap: 0.35rem; padding: 0.5rem; border: 1px solid var(--border); border-radius: var(--radius); background: var(--bg); } .game-timing-laser-slot-label { font-size: 0.8rem; font-weight: 600; color: var(--muted, #888); } .game-timing-laser-preview { min-height: 88px; display: flex; align-items: center; justify-content: center; border-radius: 6px; background: repeating-conic-gradient(#1a1a1c 0% 25%, #252528 0% 50%) 50% / 10px 10px; border: 1px dashed var(--border); } .game-timing-laser-placeholder { font-size: 0.78rem; color: var(--muted, #888); text-align: center; padding: 0.5rem; line-height: 1.35; } .game-timing-laser-preview-img { max-width: 100%; max-height: 120px; object-fit: contain; border-radius: 4px; } .game-timing-laser-preview-img.is-broken { opacity: 0.35; } .game-timing-laser-slot-actions { display: flex; flex-wrap: wrap; gap: 0.35rem; } .game-timing-laser-colors-row { margin-top: 0; } @media (max-width: 720px) { .quiz-admin-q-row { grid-template-columns: 1fr; align-items: stretch; } .quiz-admin-q-remove { align-self: stretch; } } /* —— Responsive —— */ @media (max-width: 640px) { :root { --shell-max: 100%; } .admin-header-bar { flex-direction: column; align-items: stretch; padding: 1rem; } .admin-brand { justify-content: flex-start; } .admin-top-actions { justify-content: stretch; flex-direction: column; align-items: stretch; } .admin-user { max-width: none; text-align: center; } .btn-logout { width: 100%; } .tab { min-width: 118px; } .admin-editor-iframe { min-height: min(62vh, 680px); height: 62vh; border-radius: var(--radius); } .admin-editor-panel.is-fullscreen .admin-editor-iframe { height: auto !important; } .form-grid { max-width: none; } } @media (min-width: 900px) { .admin-tabs { flex-wrap: wrap; overflow: visible; } .tab { flex: 1 1 0; min-width: 140px; max-width: 220px; align-items: center; text-align: center; } .tab-desc { max-width: none; } } @media (min-width: 1100px) { :root { --shell-max: 1240px; } } /* —— Quiz Battle admin (โดม + ป๊อปอัป cyber) —— */ .tab-panel-quiz-battle { --qb-cyan: #00f2ff; --qb-cyan-dim: rgba(0, 242, 255, 0.45); --qb-magenta: #ff2ee5; --qb-magenta-dim: rgba(255, 46, 229, 0.5); --qb-green: #40ff70; --qb-red: #ff3355; --qb-gold: #ffc14d; --qb-bg-modal: rgba(12, 18, 32, 0.92); } .qb-admin-layout { display: grid; gap: 1.25rem; margin-top: 0.75rem; } @media (min-width: 960px) { .qb-admin-layout { grid-template-columns: 1fr min(420px, 38vw); align-items: start; } } .qb-admin-toolbar { margin-bottom: 0.5rem; } .qb-filter-label { display: flex; flex-direction: column; gap: 0.35rem; font-size: 0.88rem; font-weight: 500; } .qb-battle-filter-cat { max-width: 100%; font: inherit; padding: 0.45rem 0.55rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); } .qb-battle-admin-list { display: flex; flex-direction: column; gap: 1rem; margin-bottom: 1rem; } .qb-battle-block { padding: 0.9rem 1rem; border-radius: var(--radius); border: 1px solid var(--border); background: rgba(0, 0, 0, 0.14); display: flex; flex-direction: column; gap: 0.65rem; } .qb-battle-block-head { display: flex; flex-wrap: wrap; gap: 0.65rem; align-items: flex-end; justify-content: space-between; } .qb-battle-cat-label { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.86rem; margin: 0; flex: 1 1 12rem; } .qb-battle-cat { font: inherit; padding: 0.4rem 0.5rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); } .qb-battle-q-label { display: flex; flex-direction: column; gap: 0.35rem; font-size: 0.86rem; margin: 0; } .qb-battle-q-text { font: inherit; padding: 0.45rem 0.6rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); } .qb-battle-abc-grid { display: grid; gap: 0.5rem; } @media (min-width: 640px) { .qb-battle-abc-grid { grid-template-columns: repeat(3, 1fr); } } .qb-battle-opt-label { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.82rem; margin: 0; } .qb-battle-opt-label input { font: inherit; padding: 0.4rem 0.55rem; border-radius: 8px; border: 1px solid var(--border); background: var(--bg); color: var(--text); } .qb-battle-correct-fs { margin: 0; padding: 0.5rem 0.75rem; border: 1px dashed var(--border-strong); border-radius: 8px; } .qb-battle-correct-fs legend { padding: 0 0.35rem; font-size: 0.82rem; } .qb-battle-correct-rg { display: flex; flex-wrap: wrap; gap: 0.75rem 1rem; } .qb-battle-radio-label { display: inline-flex; align-items: center; gap: 0.35rem; font-size: 0.86rem; cursor: pointer; } .qb-preview-col { position: sticky; top: 0.5rem; } .qb-preview-heading { margin-bottom: 0.35rem; } .qb-preview-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: 0.5rem 0.75rem; margin-bottom: 0.5rem; } .qb-preview-toolbar-label { font-size: 0.82rem; color: var(--muted); } .qb-preview-mode-btns { display: flex; flex-wrap: wrap; gap: 0.35rem; } .qb-preview-mode-btn.is-active { border-color: var(--accent); background: var(--accent-dim); color: var(--text); } .qb-preview-stage { position: relative; min-height: 440px; border-radius: var(--radius-lg); overflow: hidden; background: linear-gradient(165deg, #070b14 0%, #0e1528 45%, #0a0e18 100%); border: 1px solid rgba(0, 242, 255, 0.22); box-shadow: inset 0 0 80px rgba(0, 80, 120, 0.15), 0 0 24px rgba(255, 46, 229, 0.08); } .qb-preview-hud { display: grid; grid-template-columns: 1fr auto 1fr; gap: 0.35rem; align-items: center; padding: 0.45rem 0.55rem; font-size: 0.62rem; letter-spacing: 0.04em; text-transform: uppercase; border-bottom: 1px solid rgba(0, 242, 255, 0.2); background: rgba(0, 0, 0, 0.35); } @media (min-width: 400px) { .qb-preview-hud { font-size: 0.68rem; padding: 0.5rem 0.65rem; } } .qb-hud-left { display: flex; align-items: center; gap: 0.35rem; min-width: 0; } .qb-hud-icon { width: 1.35rem; height: 1.35rem; display: inline-flex; align-items: center; justify-content: center; border: 1px solid var(--qb-cyan-dim); border-radius: 4px; font-size: 0.75rem; box-shadow: 0 0 8px var(--qb-cyan-dim); } .qb-hud-cat { color: #e8f4ff; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 9rem; text-transform: none; font-size: 0.65rem; letter-spacing: 0; } .qb-hud-center, .qb-hud-right { text-align: center; color: var(--qb-cyan); text-shadow: 0 0 10px var(--qb-cyan-dim); } .qb-hud-right { text-align: right; } .qb-preview-floor { position: relative; height: 200px; background-image: linear-gradient(rgba(0, 242, 255, 0.04) 1px, transparent 1px), linear-gradient(90deg, rgba(0, 242, 255, 0.04) 1px, transparent 1px); background-size: 20px 20px; } .qb-path { position: absolute; left: 50%; top: 12%; bottom: 8%; width: 44px; transform: translateX(-50%); border-radius: 22px; background: linear-gradient(180deg, rgba(180, 80, 255, 0.35), rgba(80, 40, 160, 0.5)); border: 2px solid rgba(0, 242, 255, 0.55); box-shadow: 0 0 16px rgba(255, 46, 229, 0.35), inset 0 0 20px rgba(0, 242, 255, 0.12); } .qb-dome-scene { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -42%); display: flex; flex-direction: column; align-items: center; pointer-events: none; } .qb-dome-float { display: flex; flex-direction: column; align-items: center; margin-bottom: 2px; } .qb-dome-qbadge { width: 28px; height: 28px; display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 1rem; color: #fff; border: 2px solid var(--qb-cyan); border-radius: 4px; background: rgba(0, 30, 45, 0.85); box-shadow: 0 0 14px var(--qb-cyan-dim), 0 0 4px var(--qb-magenta-dim); } .qb-dome-chevron { width: 0; height: 0; border-left: 7px solid transparent; border-right: 7px solid transparent; border-top: 9px solid var(--qb-gold); filter: drop-shadow(0 0 4px rgba(255, 193, 77, 0.8)); margin-top: 2px; } .qb-dome-glass { position: relative; width: 72px; height: 110px; border-radius: 36px 36px 10px 10px; background: linear-gradient( 90deg, rgba(0, 242, 255, 0.08) 0%, rgba(0, 242, 255, 0.22) 45%, rgba(0, 242, 255, 0.1) 100% ); border: 2px solid rgba(0, 242, 255, 0.65); box-shadow: 0 0 20px rgba(0, 242, 255, 0.35), inset 0 0 30px rgba(0, 180, 220, 0.12); backdrop-filter: blur(2px); display: flex; flex-direction: column; align-items: center; justify-content: flex-end; padding-bottom: 8px; overflow: hidden; } .qb-dome-scanlines { position: absolute; inset: 0; background: repeating-linear-gradient( 0deg, transparent, transparent 2px, rgba(0, 0, 0, 0.07) 2px, rgba(0, 0, 0, 0.07) 3px ); pointer-events: none; opacity: 0.5; } .qb-dome-pedestal { width: 48px; height: 14px; border-radius: 50%; background: radial-gradient(ellipse at center, #4a5568 0%, #1f2937 70%); box-shadow: 0 3px 8px rgba(0, 0, 0, 0.5); margin-bottom: 2px; } .qb-dome-lock { font-size: 1.15rem; line-height: 1; filter: drop-shadow(0 0 6px rgba(255, 193, 77, 0.6)); } .qb-modal-layer { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 0.5rem; pointer-events: none; } .qb-modal-layer--summary .qb-cyber-modal--question { display: none; } .qb-cyber-modal { position: relative; width: 100%; max-width: 340px; padding: 1.35rem 1rem 1rem; background: var(--qb-bg-modal); border-radius: 14px; border: 2px solid var(--qb-cyan); box-shadow: 0 0 0 1px rgba(255, 46, 229, 0.4), 0 0 28px rgba(0, 242, 255, 0.25), 0 0 60px rgba(255, 46, 229, 0.12); pointer-events: none; } .qb-cyber-bracket { position: absolute; width: 18px; height: 18px; border: 3px solid var(--qb-magenta); box-shadow: 0 0 10px var(--qb-magenta-dim); pointer-events: none; } .qb-cyber-bracket--tl { top: 6px; left: 6px; border-right: none; border-bottom: none; border-radius: 4px 0 0 0; } .qb-cyber-bracket--tr { top: 6px; right: 6px; border-left: none; border-bottom: none; border-radius: 0 4px 0 0; } .qb-cyber-bracket--bl { bottom: 6px; left: 6px; border-right: none; border-top: none; border-radius: 0 0 0 4px; } .qb-cyber-bracket--br { bottom: 6px; right: 6px; border-left: none; border-top: none; border-radius: 0 0 4px 0; } .qb-cyber-close { position: absolute; top: 8px; right: 10px; width: 28px; height: 28px; padding: 0; border: 1px solid var(--qb-cyan); border-radius: 4px; background: rgba(0, 20, 35, 0.9); color: #fff; font-size: 1.1rem; line-height: 1; cursor: default; } .qb-cyber-title-tab { position: absolute; top: -14px; left: 50%; transform: translateX(-50%); padding: 0.25rem 0.75rem; font-size: 0.72rem; font-weight: 700; letter-spacing: 0.06em; color: #fff; background: rgba(8, 14, 28, 0.95); border: 2px solid var(--qb-cyan); border-radius: 4px; box-shadow: 0 0 12px var(--qb-cyan-dim); white-space: nowrap; } .qb-cyber-qtext { margin: 0.85rem 0 0.75rem; text-align: center; font-size: 0.88rem; line-height: 1.45; color: #f0f6ff; font-weight: 500; } .qb-cyber-choices { display: flex; flex-direction: column; gap: 0.5rem; } .qb-cyber-choice { display: grid; grid-template-columns: auto 1fr auto; gap: 0.45rem; align-items: center; padding: 0.55rem 0.65rem; border-radius: 999px; border: 1px solid var(--qb-cyan-dim); background: rgba(0, 25, 40, 0.55); font-size: 0.78rem; line-height: 1.35; color: #e8f0ff; box-shadow: 0 0 8px rgba(0, 242, 255, 0.08); } .qb-cyber-choice-label { font-weight: 700; color: var(--qb-cyan); } .qb-cyber-choice-txt { text-align: left; min-width: 0; word-break: break-word; } .qb-cyber-choice-mark { font-size: 1rem; font-weight: 800; min-width: 1.25rem; text-align: center; } .qb-cyber-choice--correct { border-color: var(--qb-green); background: rgba(20, 60, 35, 0.65); box-shadow: 0 0 14px rgba(64, 255, 112, 0.35); } .qb-cyber-choice--correct .qb-cyber-choice-label { color: var(--qb-green); } .qb-cyber-choice--wrong { border-color: var(--qb-red); background: rgba(70, 20, 30, 0.65); box-shadow: 0 0 14px rgba(255, 51, 85, 0.35); } .qb-cyber-choice--wrong .qb-cyber-choice-label { color: var(--qb-red); } .qb-cyber-choice--wrong .qb-cyber-choice-mark { color: var(--qb-red); } .qb-cyber-choice--neutral { opacity: 0.75; } .qb-cyber-modal--summary { max-width: 360px; padding-top: 1.5rem; } .qb-summary-header { text-align: center; font-size: 1.05rem; font-weight: 700; color: #fff; margin-bottom: 0.5rem; padding: 0.35rem; border: 1px solid var(--qb-cyan-dim); border-radius: 6px; background: rgba(0, 40, 55, 0.4); } .qb-summary-msg { text-align: center; font-size: 0.82rem; color: #dbe7ff; margin: 0 0 0.85rem; line-height: 1.45; } .qb-summary-stats { display: grid; grid-template-columns: repeat(3, 1fr); gap: 0.4rem; margin-bottom: 0.85rem; } .qb-summary-card { display: flex; flex-direction: column; align-items: center; gap: 0.2rem; padding: 0.45rem 0.25rem; border: 1px solid var(--qb-cyan-dim); border-radius: 8px; background: rgba(0, 20, 35, 0.5); font-size: 0.65rem; } .qb-summary-card-icon { font-size: 0.9rem; opacity: 0.9; } .qb-summary-card-label { color: var(--muted); text-transform: uppercase; letter-spacing: 0.04em; } .qb-summary-card-val { font-size: 1.05rem; font-weight: 700; } .qb-summary-card-val--green { color: var(--qb-green); text-shadow: 0 0 10px rgba(64, 255, 112, 0.4); } .qb-summary-card-val--cyan { color: var(--qb-cyan); text-shadow: 0 0 10px var(--qb-cyan-dim); } .qb-summary-card-val--gold { color: var(--qb-gold); text-shadow: 0 0 10px rgba(255, 193, 77, 0.35); } .qb-summary-footer-btn { text-align: center; padding: 0.55rem 0.75rem; border-radius: 999px; border: 1px solid var(--qb-cyan-dim); font-size: 0.82rem; color: #eef6ff; background: rgba(0, 35, 50, 0.5); box-shadow: 0 0 12px rgba(0, 242, 255, 0.12); }