File size: 13,909 Bytes
e02efab
2d2eed9
 
 
 
e02efab
 
2d2eed9
 
 
 
 
 
 
 
 
 
 
 
e02efab
 
 
 
 
 
 
 
 
 
 
 
 
 
ad9a562
e02efab
2d2eed9
e02efab
 
 
 
 
 
2d2eed9
 
e02efab
 
 
 
 
 
 
 
 
 
 
 
2d2eed9
e02efab
 
 
 
 
2d2eed9
e02efab
 
2d2eed9
 
e02efab
 
 
 
 
2d2eed9
ad9a562
 
 
 
2d2eed9
 
 
 
e02efab
 
2d2eed9
 
e02efab
2d2eed9
 
 
e02efab
2d2eed9
e02efab
2d2eed9
e02efab
 
2d2eed9
e02efab
 
 
 
 
 
2d2eed9
 
e02efab
 
2d2eed9
e02efab
2d2eed9
 
 
e02efab
 
2d2eed9
 
 
 
 
 
 
 
 
 
 
 
 
ad9a562
2d2eed9
ad9a562
 
2d2eed9
 
 
 
ad9a562
 
2d2eed9
 
 
 
 
 
 
e02efab
2d2eed9
e02efab
2d2eed9
e02efab
2d2eed9
 
 
 
e02efab
2d2eed9
e02efab
2d2eed9
 
e02efab
 
2d2eed9
 
 
 
e02efab
2d2eed9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e02efab
2d2eed9
 
 
 
e02efab
2d2eed9
e02efab
2d2eed9
 
 
0f0b1ea
 
 
 
 
 
 
 
2d2eed9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e02efab
 
 
2d2eed9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
ad9a562
2d2eed9
e02efab
2d2eed9
 
e02efab
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
/* FrogQuest — 8-bit / NES-RPG pixel-art theme for plain Gradio (gr.Blocks).
   Single-page master-detail layout (left = hero/stats/settings, center = selected scene +
   actions, right = task list, bottom = Frog Master chat). Palette is the fixed "Eat That Frog"
   green / black / red scheme; the cyberpunk/fantasy/space theme only flavors the generated
   images, never the UI. */

:root {
  --bg: #0a0f0a;       /* near-black green-tinted background */
  --bg2: #10180f;      /* raised surfaces / inputs */
  --panel: #16241a;    /* panels & cards */
  --ink: #eafbe2;      /* primary text */
  --dim: #8fae84;      /* muted text */
  --accent: #4ade5b;   /* FROG GREEN — primary actions, borders, logo */
  --accent2: #e5484d;  /* RED — danger / couldn't */
  --select: #ff8a1f;   /* ORANGE — currently-selected task highlight */
  --success: #4ade5b;  /* green — done */
  --danger: #e5484d;   /* red — couldn't */
  --gold: #ffd23f;     /* XP / accents */
  --frog: #4ade5b;     /* frog-quest border */
  --shadow: #000;
  --border: 4px;
}

/* ================= Gradio chrome neutralization ================= */
*, *::before, *::after { box-sizing: border-box; }

body, gradio-app, .gradio-container {
  background: var(--bg) !important;
  color: var(--ink) !important;
  font-family: "Press Start 2P", monospace !important;
  image-rendering: pixelated;
}
.gradio-container {
  max-width: min(1720px, 97vw) !important;  /* use the screen — was 1240px w/ huge dead margins */
  margin: 0 auto !important;
  padding: 0 16px 32px !important;
  font-size: 11px !important;
  line-height: 1.7 !important;
}
/* faint background grid */
.gradio-container {
  background-image:
    repeating-linear-gradient(0deg, transparent 0 38px, rgba(120,255,120,0.02) 38px 39px),
    repeating-linear-gradient(90deg, transparent 0 38px, rgba(120,255,120,0.02) 38px 39px) !important;
}
/* CRT scanlines overlay */
body::after {
  content: ""; position: fixed; inset: 0; pointer-events: none; z-index: 9000;
  background: repeating-linear-gradient(0deg, rgba(0,0,0,0.16) 0 2px, transparent 2px 4px);
  mix-blend-mode: multiply;
}
/* hide Gradio's footer & progress chrome */
footer, .gradio-container > .main > .wrap > .contain > div > .built-with,
.show-api, .built-with { display: none !important; }

/* strip default block styling so our panels/cards control the look */
.block, .form, .gr-box, .gr-block, .styler,
.gradio-container .prose { background: transparent !important; border: none !important;
  box-shadow: none !important; border-radius: 0 !important; }
.gr-padded, .block.padded { padding: 0 !important; }
.gap, .gradio-container .gap { gap: 0 !important; }

/* ================= top bar ================= */
.fq-topbar {
  display: flex; align-items: center; justify-content: space-between;
  padding: 14px 4px; border-bottom: var(--border) solid var(--accent);
  background: var(--bg2); margin-bottom: 16px;
}
.fq-logo { margin: 0; font-size: 20px; letter-spacing: 2px; color: var(--accent);
  text-shadow: 3px 3px 0 var(--shadow); }
.fq-logo b { color: var(--accent2); font-weight: normal; }

/* ================= master-detail grid ================= */
/* the wrapping gr.Row becomes a 3-column grid; its child gr.Columns are the cells.
   Wider side panels (hero content fits without endless wrapping -> shorter panel);
   the center takes everything else. */
.fq-app-grid { display: grid !important; grid-template-columns: 320px minmax(0, 1fr) 320px !important;
  gap: 16px !important; align-items: start !important; flex-wrap: nowrap !important; }
.fq-app-grid > .fq-left, .fq-app-grid > .fq-center, .fq-app-grid > .fq-right { min-width: 0 !important; }

.panel, .fq-left, .fq-center, .fq-right {
  background: var(--panel) !important;
  border: var(--border) solid var(--ink) !important;
  box-shadow: 6px 6px 0 var(--shadow) !important;
  padding: 16px !important;
}
.panel-title { margin: 0 0 12px; font-size: 12px; color: var(--gold); text-shadow: 2px 2px 0 var(--shadow); }
.panel-subtitle { margin: 16px 0 10px; font-size: 10px; color: var(--accent); }
.hint { color: var(--dim); font-size: 9px; line-height: 1.9; }

/* ================= buttons ================= */
button.pix-btn, .pix-btn button, .pix-btn {
  font-family: "Press Start 2P", monospace !important; font-size: 10px !important;
  color: var(--ink) !important; cursor: pointer;
  background: var(--bg2) !important; border: var(--border) solid var(--ink) !important;
  box-shadow: 4px 4px 0 var(--shadow) !important; padding: 12px 14px !important;
  text-transform: uppercase; border-radius: 0 !important;
  transition: transform .05s, box-shadow .05s; min-width: 0 !important;
}
button.pix-btn:hover, .pix-btn button:hover { background: var(--accent) !important; color: var(--bg) !important; }
button.pix-btn:active, .pix-btn button:active { transform: translate(4px, 4px); box-shadow: 0 0 0 var(--shadow) !important; }
.pix-btn.primary, .pix-btn.primary button {
  background: var(--accent) !important; color: var(--bg) !important; border-color: #fff !important;
  width: 100% !important; font-size: 11px !important; padding: 14px !important;
}
.pix-btn.primary:hover, .pix-btn.primary button:hover { background: var(--gold) !important; color: var(--bg) !important; }
.pix-btn.small, .pix-btn.small button { font-size: 8px !important; padding: 9px 10px !important; box-shadow: 3px 3px 0 var(--shadow) !important; }

/* ================= LEFT: hero photo / stats / settings ================= */
.fq-photo .image-container, .fq-photo .upload-container, .fq-photo [data-testid="image"] {
  min-height: 180px !important; background: var(--bg2) !important;
  border: var(--border) dashed var(--accent) !important; border-radius: 0 !important;
}
.fq-photo .image-container img { image-rendering: pixelated; object-fit: cover; }
.fq-photo .wrap, .fq-photo .icon-wrap, .fq-photo .upload-text { color: var(--dim) !important;
  font-family: "Press Start 2P", monospace !important; font-size: 8px !important; }

.fq-stats { margin: 14px 0; padding: 12px; background: var(--bg2);
  border: 2px solid var(--dim); }
.fq-stats h4 { margin: 0 0 8px; font-size: 9px; color: var(--accent); }
.fq-stats .stat-row { display: flex; justify-content: space-between; font-size: 9px;
  color: var(--ink); margin: 6px 0; }
.fq-stats .stat-row b { color: var(--gold); }

.fq-settings { margin-top: 12px; }

/* world picker (gr.Radio styled to fit the pixel theme) — one row in the 320px panel */
.fq-theme, .fq-theme * { color: var(--ink) !important; }
.fq-theme .wrap { gap: 6px !important; display: flex !important; flex-direction: row !important;
  flex-wrap: nowrap !important; }
.fq-theme label, .fq-theme .wrap label {
  background: var(--bg2) !important; border: 3px solid var(--dim) !important;
  box-shadow: 3px 3px 0 var(--shadow) !important; border-radius: 0 !important;
  font-family: "Press Start 2P", monospace !important; font-size: 8px !important;
  padding: 8px 6px !important; cursor: pointer; text-transform: uppercase;
  flex: 1 1 0 !important; justify-content: center !important; white-space: nowrap;
}
.fq-theme label:hover { border-color: var(--accent) !important; }
.fq-theme label.selected, .fq-theme input:checked ~ * {
  border-color: var(--select) !important; color: var(--select) !important;
  box-shadow: 3px 3px 0 var(--select) !important;
}
.fq-theme input[type="radio"] { accent-color: var(--accent); }

/* theme picker (3 buttons styled as small cards) */
.theme-card, .theme-card button {
  font-family: "Press Start 2P", monospace !important; font-size: 8px !important;
  color: var(--ink) !important; cursor: pointer; height: 100%;
  display: flex !important; flex-direction: column; align-items: center; gap: 6px;
  padding: 10px 4px !important; background: var(--bg2) !important;
  border: 3px solid var(--dim) !important; box-shadow: 3px 3px 0 var(--shadow) !important;
  border-radius: 0 !important; white-space: pre-line; line-height: 1.5;
}
.theme-card:hover, .theme-card button:hover { border-color: var(--accent) !important; }
.theme-card.selected, .theme-card.selected button {
  border-color: var(--select) !important; background: var(--panel) !important;
  box-shadow: 3px 3px 0 var(--select) !important;
}

/* ================= CENTER: scene / description / actions ================= */
.fq-scene .image-container, .fq-scene [data-testid="image"] {
  min-height: 360px !important; background: var(--bg2) !important; border-radius: 0 !important;
  border: var(--border) solid var(--ink) !important;
}
.fq-scene img { image-rendering: pixelated; object-fit: contain; width: 100%; }

.fq-detail { display: flex; gap: 14px; align-items: stretch; margin-top: 14px; }
.fq-desc { flex: 1; background: var(--bg2); border: var(--border) solid var(--ink);
  box-shadow: 4px 4px 0 var(--shadow); padding: 14px 16px; min-height: 96px; }
.fq-desc .adventure-header h2 { font-size: 13px; color: var(--gold); text-shadow: 2px 2px 0 var(--shadow); margin: 0 0 8px; }
.fq-desc .quest-title { margin: 0 0 8px; font-size: 12px; color: var(--ink); line-height: 1.6; }
.fq-desc .quest-badges { display: flex; flex-wrap: wrap; gap: 6px; margin-bottom: 8px; }
.fq-desc .quest-narrative { margin: 0 0 10px; font-size: 9px; color: var(--dim); line-height: 1.9; }
.fq-desc .quest-task { margin: 0 0 8px; font-size: 9px; color: var(--accent); line-height: 1.8; }
.fq-desc .quest-task::before { content: "▸ TASK: "; color: var(--dim); }
.fq-desc .xp { font-size: 9px; color: var(--gold); }
.fq-desc .xp::before { content: "★ "; }
.fq-desc.state-success { border-color: var(--success); box-shadow: 4px 4px 0 var(--success); }
.fq-desc.state-failure { border-color: var(--danger); box-shadow: 4px 4px 0 var(--danger); }
.fq-desc .result-msg { font-size: 10px; line-height: 1.9; }
.fq-desc.state-success .result-msg { color: var(--success); }
.fq-desc.state-failure .result-msg { color: var(--danger); }
.fq-empty { color: var(--dim); font-size: 10px; line-height: 1.9; }

.fq-actions { display: flex; flex-direction: column; gap: 12px; justify-content: center; min-width: 132px; }
.btn-done, .btn-done button {
  background: var(--success) !important; color: var(--bg) !important; border-color: #fff !important;
  font-size: 11px !important;
}
.btn-done:hover, .btn-done button:hover { background: var(--gold) !important; }
.btn-couldnt, .btn-couldnt button {
  background: var(--danger) !important; color: #fff !important; border-color: #fff !important;
  font-size: 9px !important;
}
.btn-couldnt:hover, .btn-couldnt button:hover { background: #ff7a7e !important; color: var(--bg) !important; }

/* ================= RIGHT: task list ================= */
.fq-right .panel-title { margin-bottom: 12px; }
.fq-tasklist { display: flex; flex-direction: column; gap: 10px; }
.fq-task-row { display: flex !important; gap: 6px !important; align-items: stretch !important;
  flex-wrap: nowrap !important; }
.fq-task-row .fq-task-item { flex: 1 1 auto !important; }
.fq-task-clear, .fq-task-clear button {
  flex: 0 0 auto !important; width: 40px !important; min-width: 40px !important;
  padding: 8px !important; color: var(--danger) !important; font-size: 11px !important;
}
.fq-task-clear:hover, .fq-task-clear button:hover { background: var(--danger) !important; color: #fff !important; }
.fq-task-item, .fq-task-item button {
  font-family: "Press Start 2P", monospace !important; font-size: 9px !important;
  text-align: left !important; color: var(--ink) !important; cursor: pointer;
  background: var(--bg2) !important; border: 3px solid var(--ink) !important;
  box-shadow: 3px 3px 0 var(--shadow) !important; padding: 11px 12px !important;
  border-radius: 0 !important; width: 100% !important; line-height: 1.6; white-space: normal;
}
.fq-task-item:hover, .fq-task-item button:hover { border-color: var(--accent) !important; }
.fq-task-item.selected, .fq-task-item.selected button {
  border-color: var(--select) !important; box-shadow: 4px 4px 0 var(--select) !important;
  color: var(--select) !important; background: var(--panel) !important;
}
.fq-task-item.is-frog, .fq-task-item.is-frog button { border-color: var(--frog) !important; }
.fq-task-item.done, .fq-task-item.done button { opacity: 0.7; border-color: var(--success) !important; }
.fq-task-item.failed, .fq-task-item.failed button { opacity: 0.6; border-style: dashed !important; }

/* badges (reused in the description pane and task items) */
.badge { font-size: 8px; padding: 4px 6px; border: 2px solid currentColor; display: inline-block; }
.frog-badge { color: var(--frog); }
.bonus-badge { color: var(--accent); }
.group-badge { color: var(--gold); }

/* ================= BOTTOM: Frog Master chat bar ================= */
.fq-chatbar { display: flex !important; gap: 12px !important; align-items: stretch !important;
  margin-top: 16px !important; flex-wrap: nowrap !important; }
.fq-chatbar .fq-chat-input { flex: 1 !important; min-width: 0 !important; }
.fq-chatbar .fq-chat-send { width: 150px !important; flex: 0 0 auto !important; }
.compose textarea {
  width: 100%; resize: none; font-family: "Press Start 2P", monospace !important;
  font-size: 10px !important; line-height: 1.8 !important; color: var(--ink) !important;
  background: var(--bg2) !important; border: var(--border) solid var(--accent) !important;
  padding: 14px !important; box-shadow: inset 3px 3px 0 var(--shadow); border-radius: 0 !important;
}
.compose textarea:focus { outline: none; border-color: var(--gold) !important; box-shadow: inset 3px 3px 0 var(--shadow) !important; }
.fq-chat-hint { color: var(--dim); font-size: 8px; margin: 8px 2px 0; line-height: 1.8; }

/* ================= responsive: stack on narrow screens ================= */
@media (max-width: 1100px) {
  .fq-app-grid { grid-template-columns: 1fr !important; }
  .fq-logo { font-size: 16px; }
  .fq-detail { flex-direction: column; }
  .fq-actions { flex-direction: row; min-width: 0; }
}