some error debugging and for frontend thicker lines around blocks

This commit is contained in:
jenz
2026-08-24 12:59:16 +02:00
parent 1ae342151e
commit 9c4c02c532
13 changed files with 27 additions and 15 deletions
@@ -62,7 +62,7 @@ export default async function CountryPlayersPage({
</div> </div>
</div> </div>
<div className="panel divide-y divide-base-border"> <div className="panel row-divide">
{players.map((p) => ( {players.map((p) => (
<Link <Link
key={p.steamid} key={p.steamid}
@@ -22,7 +22,7 @@ export default async function CountriesPage() {
{countries.length === 0 ? ( {countries.length === 0 ? (
<div className="panel p-6 text-sm text-ink-muted">No countries recorded yet.</div> <div className="panel p-6 text-sm text-ink-muted">No countries recorded yet.</div>
) : ( ) : (
<div className="panel divide-y divide-base-border"> <div className="panel row-divide">
<div className="grid grid-cols-[1fr_auto_auto] gap-6 px-4 py-2 text-xs text-ink-faint uppercase tracking-wide"> <div className="grid grid-cols-[1fr_auto_auto] gap-6 px-4 py-2 text-xs text-ink-faint uppercase tracking-wide">
<div>Country</div> <div>Country</div>
<div className="text-right w-24">Total playtime</div> <div className="text-right w-24">Total playtime</div>
@@ -45,4 +45,12 @@
.row-interactive:hover { .row-interactive:hover {
background-color: rgba(63, 211, 122, 0.05); background-color: rgba(63, 211, 122, 0.05);
} }
/* Clearly visible separation between stacked list rows — a plain 1px
divide-y read as almost invisible once rows have very different
heights (e.g. a session with 15 map names next to one with 2). */
.row-divide > * + * {
border-top-width: 2px;
border-top-color: theme('colors.base.divider');
}
} }
@@ -35,7 +35,7 @@ export default async function MapPeriodsPage({
</p> </p>
</div> </div>
<div className="panel divide-y divide-base-border"> <div className="panel row-divide">
<div className="grid grid-cols-[1fr_auto_auto] gap-4 px-4 py-2 text-xs text-ink-faint uppercase tracking-wide"> <div className="grid grid-cols-[1fr_auto_auto] gap-4 px-4 py-2 text-xs text-ink-faint uppercase tracking-wide">
<div>Session</div> <div>Session</div>
<div className="text-right w-16">Players</div> <div className="text-right w-16">Players</div>
@@ -107,7 +107,7 @@ export default async function MapPeriodDetailPage({
{players.length === 0 ? ( {players.length === 0 ? (
<div className="text-sm text-ink-muted">No recorded players during this period.</div> <div className="text-sm text-ink-muted">No recorded players during this period.</div>
) : ( ) : (
<div className="divide-y divide-base-border"> <div className="row-divide">
{players.map((p, i) => ( {players.map((p, i) => (
<Link <Link
key={`${p.steamid}-${i}`} key={`${p.steamid}-${i}`}
@@ -145,7 +145,7 @@ export default async function MapPeriodDetailPage({
</div> </div>
<div className="text-sm text-accent">Result: {event.result ?? '—'}</div> <div className="text-sm text-accent">Result: {event.result ?? '—'}</div>
</div> </div>
<div className="divide-y divide-base-border"> <div className="row-divide">
{event.choices.map((c, i) => ( {event.choices.map((c, i) => (
<Link <Link
key={`${c.steamid}-${i}`} key={`${c.steamid}-${i}`}
@@ -123,7 +123,7 @@ export default async function PlayerDetailPage({
{sessions.length === 0 ? ( {sessions.length === 0 ? (
<div className="text-sm text-ink-muted">No recorded sessions yet.</div> <div className="text-sm text-ink-muted">No recorded sessions yet.</div>
) : ( ) : (
<div className="divide-y divide-base-border"> <div className="row-divide">
<div className="grid grid-cols-[1fr_1fr_100px] gap-4 pb-2 text-xs text-ink-faint uppercase tracking-wide"> <div className="grid grid-cols-[1fr_1fr_100px] gap-4 pb-2 text-xs text-ink-faint uppercase tracking-wide">
<div>Started</div> <div>Started</div>
<div>Map(s)</div> <div>Map(s)</div>
@@ -366,7 +366,7 @@ export default function MapPopulationChart() {
)} )}
{selectedMap && ( {selectedMap && (
<div className="mt-4 pt-4 border-t border-base-border"> <div className="mt-4 pt-4 border-t-2 border-base-divider">
<div className="stat-label mb-1"> <div className="stat-label mb-1">
Players during{' '} Players during{' '}
<Link href={`/maps/period/${selectedMap.map_id}`} className="text-accent hover:underline"> <Link href={`/maps/period/${selectedMap.map_id}`} className="text-accent hover:underline">
@@ -38,7 +38,7 @@ export default function MapSearch() {
className="w-full bg-base-panel border border-base-border rounded-lg px-4 py-3 text-ink placeholder:text-ink-faint focus:border-accent/50 transition-colors" className="w-full bg-base-panel border border-base-border rounded-lg px-4 py-3 text-ink placeholder:text-ink-faint focus:border-accent/50 transition-colors"
/> />
<div className="panel divide-y divide-base-border"> <div className="panel row-divide">
{loading ? ( {loading ? (
<div className="p-4 text-sm text-ink-faint font-mono">loading</div> <div className="p-4 text-sm text-ink-faint font-mono">loading</div>
) : maps.length === 0 ? ( ) : maps.length === 0 ? (
@@ -52,7 +52,7 @@ export default function PlayerSearch() {
</select> </select>
</div> </div>
<div className="panel divide-y divide-base-border"> <div className="panel row-divide">
{loading ? ( {loading ? (
<div className="p-4 text-sm text-ink-faint font-mono">loading</div> <div className="p-4 text-sm text-ink-faint font-mono">loading</div>
) : players.length === 0 ? ( ) : players.length === 0 ? (
@@ -370,7 +370,7 @@ export default function PopulationChart() {
return ( return (
<div className="panel p-6"> <div className="panel p-6">
{/* Currently online — always visible, always live, not tied to the date range below */} {/* Currently online — always visible, always live, not tied to the date range below */}
<div className="mb-6 pb-6 border-b border-base-border"> <div className="mb-6 pb-6 border-b-2 border-base-divider">
<div className="flex items-center justify-between mb-3"> <div className="flex items-center justify-between mb-3">
<div className="flex items-center gap-2"> <div className="flex items-center gap-2">
<span className="relative flex w-2 h-2"> <span className="relative flex w-2 h-2">
@@ -553,7 +553,7 @@ export default function PopulationChart() {
</div> </div>
{selectedPoint && ( {selectedPoint && (
<div className="mt-4 pt-4 border-t border-base-border"> <div className="mt-4 pt-4 border-t-2 border-base-divider">
<div className="stat-label mb-3"> <div className="stat-label mb-3">
Online at {new Date(selectedPoint.t).toLocaleString()} Online at {new Date(selectedPoint.t).toLocaleString()}
{selectedPoint.mapName && ( {selectedPoint.mapName && (
@@ -279,7 +279,7 @@ export default function RecurringWindowChart() {
)} )}
{selected && ( {selected && (
<div className="mt-4 pt-4 border-t border-base-border"> <div className="mt-4 pt-4 border-t-2 border-base-divider">
<div className="stat-label mb-3"> <div className="stat-label mb-3">
{new Date(`${selected.date}T00:00:00Z`).toLocaleDateString(undefined, { weekday: 'long', month: 'short', day: 'numeric' })}, {startTime}{endTime} — {selectedPlayers.length} player {new Date(`${selected.date}T00:00:00Z`).toLocaleDateString(undefined, { weekday: 'long', month: 'short', day: 'numeric' })}, {startTime}{endTime} — {selectedPlayers.length} player
{selectedPlayers.length === 1 ? '' : 's'}, sorted by time spent in the window {selectedPlayers.length === 1 ? '' : 's'}, sorted by time spent in the window
@@ -11,6 +11,7 @@ module.exports = {
DEFAULT: '#0B0F0E', // near-black, slight green cast — server-ops feel DEFAULT: '#0B0F0E', // near-black, slight green cast — server-ops feel
panel: '#121715', panel: '#121715',
border: '#1F2723', border: '#1F2723',
divider: '#3C4A44', // brighter, deliberately higher-contrast — for separating list rows, not just outlining a panel
}, },
accent: { accent: {
DEFAULT: '#3FD37A', // "server online" green DEFAULT: '#3FD37A', // "server online" green
@@ -102,8 +102,9 @@ public void select_user_session(int client)
public void SQL_FinishedQuerySelectUserSession(Database db, DBResultSet results, const char[] error, int Serial) public void SQL_FinishedQuerySelectUserSession(Database db, DBResultSet results, const char[] error, int Serial)
{ {
if (!db) if (!db || strlen(error))
{ {
LogError("Query error 3: %s", error);
delete results; delete results;
return; return;
} }
@@ -168,8 +169,9 @@ public void upsert_player(int client)
public void SQL_FinishedQueryUpsertPlayerCallback(Database db, DBResultSet results, const char[] error, int Serial) public void SQL_FinishedQueryUpsertPlayerCallback(Database db, DBResultSet results, const char[] error, int Serial)
{ {
if (!db) if (!db || strlen(error))
{ {
LogError("Query error 3: %s", error);
delete results; delete results;
return; return;
} }
@@ -205,8 +207,9 @@ public void upsert_name_history(int client)
public void SQL_FinishedQueryUpsertNameHistoryCallback(Database db, DBResultSet results, const char[] error, int Serial) public void SQL_FinishedQueryUpsertNameHistoryCallback(Database db, DBResultSet results, const char[] error, int Serial)
{ {
if (!db) if (!db || strlen(error))
{ {
LogError("Query error 3: %s", error);
delete results; delete results;
return; return;
} }