quilltale / assets /styles.css
aeesh1's picture
fix mobile layout
c9dd31e
/* =============================================================
QUILLTALE — Stylesheet
Dark: deep slate-navy with vivid teal + ember-gold accents
Light: blush parchment · dusty rose + warm taupe
============================================================= */
@import url('https://fonts.googleapis.com/css2?family=Cinzel:wght@400;600;700&family=Crimson+Pro:ital,wght@0,300;0,400;0,600;1,300;1,400&family=JetBrains+Mono:wght@300;400&display=swap');
/* =============================================================
Design Tokens — Dark (default)
============================================================= */
:root {
/* Surfaces — deep slate navy */
--bg: #0b0e14;
--bg-panel: #111520;
--bg-raised: #181e2e;
--bg-input: #0d1018;
--bg-card: #141929;
/* Text */
--ink: #e2ddd6;
--ink-muted: #8896b0;
--ink-faint: #3d4a62;
--ink-on-raised: #ddd8d0;
/* Primary accent — electric teal */
--teal: #2dd4bf;
--teal-glow: rgba(45, 212, 191, 0.15);
--teal-glow-lg: rgba(45, 212, 191, 0.06);
/* Secondary accent — ember gold */
--gold: #f59e0b;
--gold-glow: rgba(245, 158, 11, 0.18);
/* Borders */
--border: rgba(45, 212, 191, 0.08);
--border-mid: rgba(45, 212, 191, 0.2);
--border-hi: rgba(45, 212, 191, 0.45);
--border-gold: rgba(245, 158, 11, 0.22);
/* Shadows */
--shadow-md: 0 6px 32px rgba(0, 0, 0, 0.8);
--shadow-lg: 0 12px 60px rgba(0, 0, 0, 0.9);
--teal-halo: 0 0 40px rgba(45, 212, 191, 0.1);
/* Typography */
--font-display: 'Cinzel', serif;
--font-body: 'Crimson Pro', serif;
--font-mono: 'JetBrains Mono', monospace;
/* Layout */
--r-sm: 4px;
--r: 8px;
--r-lg: 14px;
--ease: 0.2s cubic-bezier(0.4, 0, 0.2, 1);
}
/* =============================================================
Light Mode — blush parchment palette
============================================================= */
body.light-mode {
--bg: #f5eaed;
--bg-panel: #ecdde1;
--bg-raised: #e2cfD4;
--bg-input: #f9f1f3;
--bg-card: #eedfe3;
--ink: #2a1519;
--ink-muted: #6b454e;
--ink-faint: #a87e87;
--ink-on-raised: #1e0f13;
--teal: #7a4f58;
--teal-glow: rgba(122, 79, 88, 0.12);
--teal-glow-lg: rgba(122, 79, 88, 0.05);
--gold: #b06030;
--gold-glow: rgba(176, 96, 48, 0.14);
--border: rgba(42, 21, 25, 0.09);
--border-mid: rgba(42, 21, 25, 0.18);
--border-hi: rgba(42, 21, 25, 0.32);
--border-gold: rgba(176, 96, 48, 0.22);
--shadow-md: 0 6px 28px rgba(0, 0, 0, 0.09);
--shadow-lg: 0 12px 50px rgba(0, 0, 0, 0.13);
--teal-halo: 0 0 30px rgba(122, 79, 88, 0.08);
}
/* =============================================================
Reset & Base
============================================================= */
*, *::before, *::after {
box-sizing: border-box;
margin: 0;
padding: 0;
}
html { height: 100%; scroll-behavior: smooth; }
body,
.gradio-container {
background: var(--bg) !important;
color: var(--ink) !important;
font-family: var(--font-body) !important;
font-size: 17px !important;
line-height: 1.8 !important;
min-height: 100vh;
transition: background 0.35s ease, color 0.35s ease !important;
}
.gradio-container {
max-width: 100% !important;
width: 100% !important;
margin: 0 !important;
padding: 0 2rem 0rem !important;
position: relative;
z-index: 1;
}
/* Dark ambient layers */
body:not(.light-mode)::before {
content: '';
position: fixed;
inset: 0;
z-index: 0;
pointer-events: none;
background: repeating-linear-gradient(
0deg,
transparent,
transparent 3px,
rgba(0,0,0,0.04) 3px,
rgba(0,0,0,0.04) 4px
);
}
body:not(.light-mode)::after {
content: '';
position: fixed;
inset: 0;
z-index: 0;
pointer-events: none;
background:
radial-gradient(ellipse 60% 40% at 15% 20%, rgba(45,212,191,0.04) 0%, transparent 70%),
radial-gradient(ellipse 50% 35% at 85% 75%, rgba(245,158,11,0.04) 0%, transparent 70%);
}
/* Light grain */
body.light-mode::before {
content: '';
position: fixed;
inset: 0;
z-index: 0;
pointer-events: none;
opacity: 0.04;
background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 300 300' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.75' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)'/%3E%3C/svg%3E");
background-size: 200px;
}
footer, .footer, #footer { display: none !important; }
* { scrollbar-width: thin; scrollbar-color: var(--border-hi) transparent; }
::-webkit-scrollbar { width: 3px; height: 3px; }
::-webkit-scrollbar-thumb { background: var(--border-hi); border-radius: 2px; }
/* =============================================================
Top Bar
============================================================= */
.qt-topbar {
display: flex !important;
align-items: center !important;
justify-content: space-between !important;
padding: 0rem !important;
border-bottom: 1px solid var(--border-mid) !important;
margin-bottom: 0 !important;
gap: 1rem !important;
position: relative !important;
}
/* Horizontal rule glow line */
.qt-topbar::after {
content: '';
position: absolute; bottom: -1px; left: 0; right: 0; height: 1px;
background: linear-gradient(90deg, transparent, var(--teal) 30%, var(--gold) 70%, transparent);
opacity: 0.45;
}
.qt-brand {
display: flex;
align-items: center;
gap: 0.85rem;
}
.qt-rune {
font-family: var(--font-display);
font-size: 1.1rem;
color: var(--teal);
opacity: 0.65;
}
/* Brand name */
.qt-brand-name {
font-family: var(--font-display) !important;
font-size: clamp(1.8rem, 3.5vw, 2.8rem) !important;
font-weight: 700 !important;
letter-spacing: 0.1em !important;
color: var(--teal) !important;
text-shadow: 0 0 40px var(--teal-glow), 0 2px 0 rgba(0,0,0,0.5) !important;
animation: brandReveal 1.2s ease forwards;
background: none !important;
-webkit-text-fill-color: unset !important;
}
@keyframes brandReveal {
from { opacity: 0; letter-spacing: 0.35em; }
to { opacity: 1; letter-spacing: 0.1em; }
}
/* Theme toggle */
.qt-toggle-btn button {
background: var(--bg-raised) !important;
color: var(--teal) !important;
border: 1px solid var(--border-mid) !important;
border-radius: 30px !important;
font-family: var(--font-mono) !important;
font-size: 0.64rem !important;
letter-spacing: 0.14em !important;
padding: 0.4rem 1.2rem !important;
cursor: pointer !important;
transition: all var(--ease) !important;
}
.qt-toggle-btn button:hover {
background: var(--teal) !important;
color: var(--bg) !important;
border-color: var(--teal) !important;
box-shadow: 0 0 18px var(--teal-glow) !important;
transform: none !important;
}
/* =============================================================
Tagline
============================================================= */
.qt-tagline {
font-family: var(--font-body) !important;
font-style: italic !important;
font-size: 0.93rem !important;
font-weight: 300 !important;
color: var(--ink-muted) !important;
text-align: center !important;
letter-spacing: 0.05em !important;
padding: 0.9rem 0 0.4rem !important;
border-bottom: 1px solid var(--border) !important;
margin-bottom: 1.5rem !important;
animation: fadeIn 1.6s ease forwards;
}
@keyframes fadeIn {
from { opacity: 0; transform: translateY(4px); }
to { opacity: 1; transform: translateY(0); }
}
/* =============================================================
Main layout
============================================================= */
.qt-main-row {
align-items: flex-start !important;
gap: 1.5rem !important;
width: 100% !important;
}
.qt-left-col,
.qt-right-col {
display: flex !important;
flex-direction: column !important;
gap: 0.9rem !important;
}
/* =============================================================
Panel Labels
============================================================= */
.qt-panel-label,
.qt-input-label {
font-family: var(--font-mono) !important;
font-size: 0.59rem !important;
font-weight: 400 !important;
letter-spacing: 0.3em !important;
text-transform: uppercase !important;
color: var(--teal) !important;
padding: 0 0 0.5rem !important;
border-bottom: 1px solid var(--border-mid) !important;
margin-bottom: 0.5rem !important;
display: flex !important;
align-items: center !important;
gap: 0.5rem !important;
}
.qt-panel-label::before,
.qt-input-label::before {
content: '';
display: inline-block;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--teal);
box-shadow: 0 0 8px var(--teal);
animation: dotPulse 2.5s ease-in-out infinite;
flex-shrink: 0;
}
@keyframes dotPulse {
0%,100% { opacity:1; box-shadow: 0 0 8px var(--teal); }
50% { opacity:0.35; box-shadow: 0 0 3px var(--teal); }
}
.qt-input-label {
margin-top: 0.75rem !important;
color: var(--gold) !important;
}
.qt-input-label::before {
background: var(--gold) !important;
box-shadow: 0 0 8px var(--gold) !important;
}
/* =============================================================
Scene Image
============================================================= */
.qt-scene {
background: var(--bg-panel) !important;
border: 1px solid var(--border-mid) !important;
border-radius: var(--r-lg) !important;
overflow: hidden !important;
box-shadow: var(--shadow-md), var(--teal-halo) !important;
transition: border-color var(--ease), box-shadow var(--ease) !important;
min-height: 280px;
}
.qt-scene:hover {
border-color: var(--border-hi) !important;
box-shadow: var(--shadow-lg), 0 0 55px rgba(45,212,191,0.16) !important;
}
.qt-scene .image-frame {
width: 100% !important;
}
.qt-scene img {
width: 100% !important;
object-fit: cover !important;
display: block !important;
border-radius: 0 !important;
transition: transform 0.8s cubic-bezier(0.4,0,0.2,1) !important;
}
.qt-scene:hover img { transform: scale(1.025) !important; }
.qt-scene .empty,
.qt-scene .wrap,
.qt-scene [data-testid="empty-img"] {
min-height: 280px !important;
display: flex !important;
align-items: center !important;
justify-content: center !important;
background:
radial-gradient(ellipse 60% 60% at 50% 50%, var(--teal-glow-lg) 0%, transparent 70%),
repeating-linear-gradient(0deg, transparent 0, transparent 39px, var(--border) 39px, var(--border) 40px),
repeating-linear-gradient(90deg, transparent 0, transparent 39px, var(--border) 39px, var(--border) 40px),
var(--bg-panel) !important;
}
.qt-scene [data-testid="upload-button"],
.qt-scene .icon-button-wrapper,
.qt-scene .upload-btn,
.qt-scene .toolbar-wrap { display: none !important; }
/* World State accordion */
.qt-accord {
background: var(--bg-panel) !important;
border: 1px solid var(--border) !important;
border-radius: var(--r) !important;
overflow: hidden !important;
transition: border-color var(--ease) !important;
max-height: 420px;
}
.qt-accord:hover { border-color: var(--border-mid) !important; }
.qt-accord > .label-wrap > span,
.qt-accord summary,
.qt-accord button {
font-family: var(--font-mono) !important;
font-size: 0.57rem !important;
letter-spacing: 0.24em !important;
text-transform: uppercase !important;
color: var(--ink-muted) !important;
background: transparent !important;
padding: 0.7rem 1rem !important;
transition: color var(--ease) !important;
}
.qt-accord > .label-wrap > span:hover,
.qt-accord summary:hover,
.qt-accord button:hover { color: var(--teal) !important; }
.qt-world-text textarea {
font-family: var(--font-mono) !important;
font-size: 11px !important;
line-height: 1.7 !important;
color: var(--ink-muted) !important;
background: var(--bg) !important;
border: none !important;
padding: 0.9rem 1rem !important;
resize: none !important;
max-height: 300px;
overflow-y: auto;
}
/* =============================================================
Restart button
============================================================= */
.qt-btn-new button {
background: transparent !important;
color: var(--teal) !important;
border: 1px solid var(--border-mid) !important;
border-radius: var(--r) !important;
font-family: var(--font-mono) !important;
font-size: 0.64rem !important;
letter-spacing: 0.18em !important;
padding: 0.75rem 1rem !important;
width: 100% !important;
transition: all var(--ease) !important;
cursor: pointer !important;
}
.qt-btn-new button:hover {
background: var(--teal) !important;
color: var(--bg) !important;
border-color: var(--teal) !important;
box-shadow: 0 0 22px var(--teal-glow) !important;
transform: none !important;
}
/* =============================================================
Chronicle (Chatbot)
============================================================= */
.qt-chronicle {
background: var(--bg-panel) !important;
border: 1px solid var(--border-mid) !important;
border-radius: var(--r-lg) !important;
box-shadow: var(--shadow-md) !important;
overflow: hidden !important;
height:280px !important;
min-height: 280px !important;
max-height: 280px !important;
}
.qt-chronicle > div,
.qt-chronicle .wrap,
.qt-chronicle .bot-row,
.qt-chronicle .message-wrap,
.qt-chronicle .messages,
.qt-chronicle [data-testid="chatbot"],
.qt-chronicle .chatbot {
background: transparent !important;
border: none !important;
}
/* GM narration — teal left bar */
.qt-chronicle .message.bot p,
.qt-chronicle .message.bot,
.qt-chronicle [data-testid="bot"] p,
.qt-chronicle [data-testid="bot"],
.qt-chronicle .bot p,
.qt-chronicle .bot,
.qt-chronicle .prose p,
.qt-chronicle .prose {
color: var(--ink-on-raised) !important;
font-family: var(--font-body) !important;
font-size: 1.06rem !important;
font-weight: 300 !important;
line-height: 1.9 !important;
}
/* Bot bubble wrapper */
.qt-chronicle .message.bot,
.qt-chronicle [data-testid="bot"],
.qt-chronicle .bot {
background: var(--bg-raised) !important;
border: none !important;
border-left: 3px solid var(--teal) !important;
border-radius: 0 var(--r) var(--r) 0 !important;
margin: 0.75rem 1rem 0.75rem 0.5rem !important;
padding: 0.8rem 1.2rem !important;
box-shadow: none !important;
max-width: 100% !important;
animation: storyIn 0.4s ease forwards !important;
}
/* Player action */
.qt-chronicle .message.user,
.qt-chronicle [data-testid="user"],
.qt-chronicle .user {
background: transparent !important;
border: none !important;
border-right: 3px solid var(--gold) !important;
border-radius: var(--r) 0 0 var(--r) !important;
margin: 0.5rem 0.5rem 0.5rem 3rem !important;
padding: 0.5rem 1.2rem 0.5rem 1rem !important;
font-family: var(--font-body) !important;
font-style: italic !important;
font-size: 0.95rem !important;
color: var(--gold) !important;
text-align: right !important;
box-shadow: none !important;
max-width: 100% !important;
animation: actionIn 0.3s ease forwards !important;
}
/* Ensure user text color holds */
.qt-chronicle .message.user p,
.qt-chronicle [data-testid="user"] p,
.qt-chronicle .user p {
color: var(--gold) !important;
font-family: var(--font-body) !important;
font-style: italic !important;
}
@keyframes storyIn { from { opacity:0; transform:translateX(-8px); } to { opacity:1; transform:translateX(0); } }
@keyframes actionIn { from { opacity:0; transform:translateX(8px); } to { opacity:1; transform:translateX(0); } }
/* =============================================================
Input Row
============================================================= */
.qt-input-row { gap: 0.75rem !important; align-items: flex-end !important; }
.qt-action-box textarea {
background: var(--bg-input) !important;
border: 1px solid var(--border-mid) !important;
border-radius: var(--r) !important;
color: var(--ink) !important;
font-family: var(--font-body) !important;
font-size: 1rem !important;
line-height: 1.6 !important;
padding: 0.7rem 1.1rem !important;
resize: none !important;
transition: border-color var(--ease), box-shadow var(--ease) !important;
}
.qt-action-box textarea:focus {
border-color: var(--teal) !important;
outline: none !important;
box-shadow: 0 0 0 3px var(--teal-glow) !important;
}
.qt-action-box textarea::placeholder {
color: var(--ink-faint) !important;
font-style: italic !important;
}
.qt-btn-act button {
background: var(--teal) !important;
color: var(--bg) !important;
border: none !important;
border-radius: var(--r) !important;
font-family: var(--font-mono) !important;
font-size: 0.7rem !important;
letter-spacing: 0.22em !important;
min-height: 48px !important;
box-shadow: 0 4px 20px var(--teal-glow) !important;
transition: all var(--ease) !important;
cursor: pointer !important;
position: relative; overflow: hidden;
}
.qt-btn-act button:hover {
background: color-mix(in srgb, var(--teal) 80%, black) !important;
transform: translateY(-2px) !important;
box-shadow: 0 8px 28px var(--teal-glow) !important;
}
.qt-btn-act button:active { transform: translateY(0) !important; }
/* Shimmer */
.qt-btn-act button::before {
content: '';
position: absolute; top: 0; left: -100%; width: 60%; height: 100%;
background: linear-gradient(90deg, transparent, rgba(255,255,255,0.16), transparent);
transition: left 0.5s ease;
}
.qt-btn-act button:hover::before { left: 160%; }
/* =============================================================
Footer
============================================================= */
.qt-footer {
display: flex !important;
align-items: center !important;
justify-content: center !important;
gap: 1.25rem !important;
margin-top: 0.5rem !important;
padding-top: 1.25rem !important;
border-top: 1px solid var(--border) !important;
}
.qt-footer-rule {
font-family: var(--font-mono);
color: var(--teal);
opacity: 0.28;
font-size: 0.63rem;
letter-spacing: 0.35em;
}
.qt-footer-text {
font-family: var(--font-body);
font-style: italic;
color: var(--ink-faint);
font-size: 0.8rem;
letter-spacing: 0.05em;
}
/* =============================================================
Gradio internals cleanup
============================================================= */
.gradio-container .block,
.gradio-container .form {
background: transparent !important;
border: none !important;
box-shadow: none !important;
padding: 0 !important;
}
.gradio-container label > span:first-child:empty,
.qt-chronicle ~ * label > span { display: none !important; }
.gradio-container .gap,
.gradio-container .row {
gap: 0.75rem !important;
}
.qt-accord svg { stroke: var(--ink-muted) !important; }
.qt-chronicle .share-button,
.qt-chronicle .copy-button,
.qt-chronicle [aria-label="Share"],
.qt-chronicle [aria-label="Copy"] {
opacity: 0.25 !important;
transition: opacity 0.2s !important;
}
.qt-chronicle:hover .share-button,
.qt-chronicle:hover .copy-button { opacity: 0.6 !important; }
/* =============================================================
Responsive
============================================================= */
@media (max-width: 900px) {
.gradio-container {
padding: 0 1rem 3rem !important;
}
.qt-left-col { min-width: 0 !important; }
.qt-brand-name { font-size: 1.6rem !important; }
.qt-chronicle { height: 380px !important; min-height: 380px !important; max-height: 380px !important; }
}