Compare commits
5
Commits
8b40864cc4
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
83b8ed0411 | ||
|
|
79f3d40fcd | ||
|
|
4eb9e6c96a | ||
|
|
6e5d57e4fc | ||
|
|
c4f5980fbb |
@@ -42,9 +42,16 @@ When you run into a repeatable problem during testing (e.g. port assignment coll
|
|||||||
|
|
||||||
The app shows its version number and a player-facing changelog in the ☰ menu → About. Both come from `frontend/src/lib/changelog.js` (rendered by `frontend/src/components/AboutModal.svelte`).
|
The app shows its version number and a player-facing changelog in the ☰ menu → About. Both come from `frontend/src/lib/changelog.js` (rendered by `frontend/src/components/AboutModal.svelte`).
|
||||||
|
|
||||||
- Bump `VERSION` by one on **every** commit.
|
- Ordinary commits do **not** bump `VERSION` or the Nix package versions.
|
||||||
- When a commit changes something players can see, add an entry to the **top** of `CHANGELOG` (`{ version, date, changes: [...] }`) describing it in player-facing terms. Group everything shipping under one version into a single entry.
|
- Accumulate player-visible changes in one entry at the **top** of `CHANGELOG` with `version: null` and `changes: [...]`. The About dialog labels it **In testing**. Append to or consolidate this batch across commits; do not create a separate entry per commit or assign a release date yet.
|
||||||
- The changelog is for players: skip refactors, tests, tooling, and other internal-only changes. A commit with no user-facing change bumps `VERSION` but adds no entry.
|
- Omit the In testing entry when there are no unreleased player-facing changes; empty batches are hidden. Do not add placeholder entries just to describe changelog maintenance.
|
||||||
|
- The changelog is for players: skip refactors, tests, tooling, and other internal-only changes. Internal-only commits need no changelog entry.
|
||||||
|
- Release labeling is a separate process, performed only when explicitly requested. At release time:
|
||||||
|
1. Consolidate the In testing batch into meaningful player-facing groups using `groups: [{ title, changes: [...] }]`, replacing its flat `changes` list. Remove duplicates and describe the final behavior.
|
||||||
|
2. Bump `VERSION` by one and give the batch that numeric `version` plus the release `date` (`YYYY-MM-DD`).
|
||||||
|
3. Bump **both** package `version` values in `flake.nix` (`pirats-frontend` and `pirats`) to the same new Nix release version. Preserve the Nix version scheme; do not equate its semantic version with the app's integer V number.
|
||||||
|
4. Commit the release metadata together. The next player-visible development change starts a fresh In testing entry.
|
||||||
|
- Preserve already numbered history unless the user explicitly requests reorganizing past releases.
|
||||||
|
|
||||||
## Work order
|
## Work order
|
||||||
|
|
||||||
|
|||||||
@@ -8,6 +8,14 @@
|
|||||||
|
|
||||||
## Polish
|
## Polish
|
||||||
|
|
||||||
|
- [x] Hide In testing when there are no unreleased changes and remove the placeholder batch.
|
||||||
|
|
||||||
|
- [x] Consolidate the September 4 changelog entries into one grouped version, v26 (following the previous v25 release).
|
||||||
|
|
||||||
|
- [x] Accumulate In testing changelog batches and reserve app/Nix version bumps for grouped releases.
|
||||||
|
|
||||||
|
- [x] Apply the refreshed light and dark themes to the full rulebook and TL;DR rules.
|
||||||
|
|
||||||
- [x] Refresh both themes with legible texture and nautical flair, and give the Event Log / My Notes the regular panel surface.
|
- [x] Refresh both themes with legible texture and nautical flair, and give the Event Log / My Notes the regular panel surface.
|
||||||
|
|
||||||
- [x] Do a pass on condensing overly verbose UI elements. For example, "Current Difficulty" could be replaced by "Difficulty" and "The Obstacle List" could be replaced by "Obstacles"
|
- [x] Do a pass on condensing overly verbose UI elements. For example, "Current Difficulty" could be replaced by "Difficulty" and "The Obstacle List" could be replaced by "Obstacles"
|
||||||
|
|||||||
@@ -2,6 +2,12 @@
|
|||||||
import { createEventDispatcher } from 'svelte';
|
import { createEventDispatcher } from 'svelte';
|
||||||
import { VERSION, CHANGELOG } from '../lib/changelog';
|
import { VERSION, CHANGELOG } from '../lib/changelog';
|
||||||
|
|
||||||
|
const visibleEntries = CHANGELOG.filter((entry) =>
|
||||||
|
entry.version !== null ||
|
||||||
|
(entry.groups ?? [{ changes: entry.changes ?? [] }])
|
||||||
|
.some((group) => group.changes.some((change) => change.trim()))
|
||||||
|
);
|
||||||
|
|
||||||
const dispatch = createEventDispatcher();
|
const dispatch = createEventDispatcher();
|
||||||
function close() { dispatch('close'); }
|
function close() { dispatch('close'); }
|
||||||
</script>
|
</script>
|
||||||
@@ -17,17 +23,20 @@
|
|||||||
|
|
||||||
<h4 class="about-heading">What's New</h4>
|
<h4 class="about-heading">What's New</h4>
|
||||||
<ul class="changelog">
|
<ul class="changelog">
|
||||||
{#each CHANGELOG as entry (entry.version)}
|
{#each visibleEntries as entry (entry.version)}
|
||||||
<li class="changelog-entry">
|
<li class="changelog-entry">
|
||||||
<div class="changelog-head">
|
<div class="changelog-head">
|
||||||
<span class="changelog-ver">v{entry.version}</span>
|
<span class="changelog-ver">{entry.version === null ? 'In testing' : `v${entry.version}`}</span>
|
||||||
<span class="changelog-date text-muted">{entry.date}</span>
|
{#if entry.date}<span class="changelog-date text-muted">{entry.date}</span>{/if}
|
||||||
</div>
|
</div>
|
||||||
|
{#each entry.groups ?? [{ title: null, changes: entry.changes }] as group}
|
||||||
|
{#if group.title}<h5 class="changelog-group">{group.title}</h5>{/if}
|
||||||
<ul class="changelog-changes">
|
<ul class="changelog-changes">
|
||||||
{#each entry.changes as change}
|
{#each group.changes as change}
|
||||||
<li>{change}</li>
|
<li>{change}</li>
|
||||||
{/each}
|
{/each}
|
||||||
</ul>
|
</ul>
|
||||||
|
{/each}
|
||||||
</li>
|
</li>
|
||||||
{/each}
|
{/each}
|
||||||
</ul>
|
</ul>
|
||||||
@@ -72,6 +81,11 @@
|
|||||||
.changelog-date {
|
.changelog-date {
|
||||||
font-size: 0.85rem;
|
font-size: 0.85rem;
|
||||||
}
|
}
|
||||||
|
.changelog-group {
|
||||||
|
margin: 0.75rem 0 0.3rem;
|
||||||
|
font-size: 1rem;
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
.changelog-changes {
|
.changelog-changes {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding-left: 1.2rem;
|
padding-left: 1.2rem;
|
||||||
|
|||||||
@@ -2,36 +2,47 @@
|
|||||||
// (rendered by AboutModal.svelte).
|
// (rendered by AboutModal.svelte).
|
||||||
//
|
//
|
||||||
// Maintenance (see AGENTS.md "Versioning & changelog"):
|
// Maintenance (see AGENTS.md "Versioning & changelog"):
|
||||||
// - Bump VERSION by one on every commit.
|
// - Accumulate player-facing development changes in one version: null entry.
|
||||||
// - Add a CHANGELOG entry only when a commit changes something players can
|
// - Only an explicitly requested release bumps VERSION and both flake.nix versions.
|
||||||
// see. Skip refactors, tests, and tooling. Keep wording player-facing.
|
// - At release, consolidate the batch into titled groups and add its version/date.
|
||||||
|
|
||||||
export const VERSION = 49;
|
export const VERSION = 26;
|
||||||
|
|
||||||
// Newest first. Each entry: { version, date: 'YYYY-MM-DD', changes: [string, ...] }.
|
// Newest first. In testing: { version: null, changes: [string, ...] }.
|
||||||
|
// Release: { version, date: 'YYYY-MM-DD', groups: [{ title, changes: [...] }] }.
|
||||||
|
// Historical flat changes arrays are also supported. Omit the testing entry when empty.
|
||||||
export const CHANGELOG = [
|
export const CHANGELOG = [
|
||||||
{ version: 49, date: '2026-09-04', changes: ['Freshened both themes with nautical chart lines, woven panel textures, and richer sea-and-brass colors while keeping text clear.', 'The Event Log and My Notes now use the regular solid panel surface.'] },
|
{
|
||||||
{ version: 48, date: '2026-09-04', changes: ['Keep your own notes alongside the Event Log. Notes save automatically between sessions, including when you close the panel, and stay intact when the game rewinds or you create a new Pi-Rat.'] },
|
version: 26,
|
||||||
{ version: 47, date: '2026-09-04', changes: ['Rewrote character suggestions with scrappy pirate looks, distinctive smells, first words, and crew quirks that fit Yeld.'] },
|
date: '2026-09-04',
|
||||||
{ version: 46, date: '2026-09-04', changes: ['Added a printable TL;DR rules page, linked at the top of the full rulebook.'] },
|
groups: [
|
||||||
{ version: 44, date: '2026-09-04', changes: ['Crew Objectives opens as one connected panel, with the toggle and checklist sharing a border and background.'] },
|
{ title: 'Themes & table layout', changes: [
|
||||||
{ version: 43, date: '2026-09-04', changes: ['The crew roster keeps players in the same order when roles or ranks change, including when someone becomes the Deep.'] },
|
'Refreshed both themes across the game, full rulebook, and TL;DR rules with nautical chart backgrounds, woven solid panels, and richer sea-and-brass colors.',
|
||||||
{ version: 42, date: '2026-09-04', changes: ['Gats require a description, including older Gats that were left blank. Read descriptions on character sheets or hover over Gat icons in the crew roster.', 'Gat descriptions and prompts follow Gat Taxes correctly and clear when you create a new recruit.'] },
|
'The Event Log and My Notes use the regular panel surface. Log controls stay the same size when opened or closed, and Dev Mode changes no longer clutter the log.',
|
||||||
{ version: 41, date: '2026-09-04', changes: ['Dismiss a completed duel once you have read the result. Other players can still read it, and dismissed results stay hidden after a reload.'] },
|
'Shorter labels, aligned Difficulty and Successes boxes, and a connected Crew Objectives panel make the table easier to scan. Removed the deck count.',
|
||||||
{ version: 40, date: '2026-09-04', changes: ['Played cards show a check or cross in the upper corner instead of a green or red outline, so results remain clear in stacked cards.'] },
|
'Played cards show a check or cross in the corner so results stay clear in stacked cards.',
|
||||||
{ version: 39, date: '2026-09-04', changes: ['Completed duels stay visible for the rest of the scene, showing the winner, both cards, and how the defense resolved.'] },
|
] },
|
||||||
{ version: 38, date: '2026-09-04', changes: ['The crew roster shows who is online, with hat and gun icons for the Captain and Pi-Rats who have a Gat.'] },
|
{ title: 'Notes, characters & rules', changes: [
|
||||||
{ version: 37, date: '2026-09-04', changes: ['Color-match replacement cards arrive after the Deep resolves a Challenge. Each applied Obstacle accepts one card per Challenge, and each assistant can contribute one card.'] },
|
'Keep private notes alongside the Event Log. Notes save automatically between sessions and stay intact when the game rewinds or you create a new Pi-Rat.',
|
||||||
{ version: 36, date: '2026-09-04', changes: ['Duel instructions clarify that only the defender draws a replacement for matching the Obstacle’s color, even when the defense fails.'] },
|
'Rewrote character suggestions with scrappy pirate looks, distinctive smells, first words, and crew quirks that fit Yeld.',
|
||||||
{ version: 35, date: '2026-09-04', changes: ['Personal objectives now require a group vote. Propose the next objective from a character sheet, then vote Yes or No at the table. A majority approves; the Captain breaks tied votes.'] },
|
'Added a printable TL;DR rules page, linked from the full rulebook.',
|
||||||
{ version: 34, date: '2026-09-04', changes: ['Assistance is available only when a Challenge has multiple active Obstacles. Gat and Name Tax takeovers still work against a single Obstacle.'] },
|
'Gats require descriptions, including older Gats. Read them on character sheets or hover over Gat icons in the roster. Descriptions follow Gat Taxes and clear for new recruits.',
|
||||||
{ version: 33, date: '2026-09-04', changes: ['Hand sizes compare ranks across the crew, including Pi-Rats whose players are the Deep.', 'Discarded cards return to the deck at scene setup. Only the previous Deep can refresh their hand during upkeep, once per scene.'] },
|
] },
|
||||||
{ version: 32, date: '2026-09-04', changes: ['Obstacles are automatically discarded with their columns once they reach one success per player. Unfinished obstacles carry over between scenes.'] },
|
{ title: 'Crew & voting', changes: [
|
||||||
{ version: 31, date: '2026-09-04', changes: ['Change your rank-up vote until everyone has voted. The final vote now reveals the result and advances automatically, without a Ready button.', 'The vote result stays visible through upkeep and next-scene setup.'] },
|
'The roster keeps a consistent player order and shows who is online, who is Captain, and who has a Gat.',
|
||||||
{ version: 30, date: '2026-09-04', changes: ['The crew roster shows voting progress with icons.', 'Your submitted vote now shows the crewmate you nominated.'] },
|
'Personal objectives use a group vote from the character sheet. A majority approves; the Captain breaks tied votes.',
|
||||||
{ version: 29, date: '2026-09-04', changes: ['Removed the remaining deck count from the table.'] },
|
'Change your rank-up vote until everyone has voted. Roster icons show voting progress and your chosen crewmate. The result advances play automatically and stays visible through upkeep and next-scene setup.',
|
||||||
{ version: 28, date: '2026-09-04', changes: ['The Event Log toggle keeps the same size when opened or closed.', 'Dev Mode changes no longer clutter the Event Log.'] },
|
] },
|
||||||
{ version: 27, date: '2026-09-04', changes: ['Shorter labels make the table easier to scan.', 'Difficulty and Successes now line up side by side, including on small screens.'] },
|
{ title: 'Challenges, cards & upkeep', changes: [
|
||||||
|
'Completed duels stay visible with the winner, both cards, and the defense result. Dismiss each result for yourself; your choice survives a reload.',
|
||||||
|
'Color-match replacement cards arrive after the Deep resolves a Challenge. Each Obstacle accepts one card per Challenge, and each assistant can contribute one card.',
|
||||||
|
'Assistance requires multiple Obstacles. Gat and Name Tax takeovers still work against a single Obstacle.',
|
||||||
|
'Duel instructions clarify that only the defender draws a replacement for matching the Obstacle’s color, including on failure.',
|
||||||
|
'Hand sizes compare ranks across the whole crew, including players acting as the Deep. Discards return to the deck at scene setup; only the previous Deep can refresh their hand during upkeep, once per scene.',
|
||||||
|
'Obstacles and their card columns are discarded after one success per player. Unfinished Obstacles carry over between scenes.',
|
||||||
|
] },
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
version: 25,
|
version: 25,
|
||||||
date: '2026-07-10',
|
date: '2026-07-10',
|
||||||
|
|||||||
+37
-14
@@ -14,39 +14,55 @@ document.documentElement.dataset.theme =
|
|||||||
</script>
|
</script>
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
--bg-dark: #9fc9e2;
|
--bg-dark: #8dbcc4;
|
||||||
--bg-ocean: #cde6f5;
|
--bg-ocean: #c9e4e5;
|
||||||
--gold: #a8770f;
|
--gold: #8c6010;
|
||||||
--neon-cyan: #0c8d96;
|
--neon-cyan: #08747d;
|
||||||
--red-suit: #c92a35;
|
--red-suit: #c92a35;
|
||||||
--black-suit: #2c3245;
|
--black-suit: #2c3245;
|
||||||
--glass-bg: rgba(248, 241, 221, 0.92);
|
--glass-bg: #f8f1dd;
|
||||||
--glass-border: rgba(168, 119, 15, 0.35);
|
--glass-border: rgba(168, 119, 15, 0.35);
|
||||||
--text-primary: #33291a;
|
--text-primary: #33291a;
|
||||||
--text-muted: #7d6e54;
|
--text-muted: #6e604b;
|
||||||
--well-bg: rgba(51, 41, 26, 0.06);
|
--well-bg: rgba(51, 41, 26, 0.06);
|
||||||
--row-border: rgba(168, 119, 15, 0.2);
|
--row-border: rgba(168, 119, 15, 0.2);
|
||||||
--solid-bg: rgba(255, 250, 236, 0.95);
|
--solid-bg: #fffaec;
|
||||||
--shadow-panel: 0 8px 32px rgba(36, 62, 87, 0.2);
|
--shadow-panel: 0 8px 32px rgba(36, 62, 87, 0.2);
|
||||||
|
/* Match the app's chart backdrop and opaque sailcloth panels. */
|
||||||
|
--bg: var(--bg-ocean);
|
||||||
|
--bg-deep: var(--bg-dark);
|
||||||
|
--chart-line: color-mix(in srgb, var(--neon-cyan) 9%, transparent);
|
||||||
|
--chart-glow: color-mix(in srgb, #fffaec 48%, transparent);
|
||||||
|
--weave: color-mix(in srgb, var(--text-primary) 3%, transparent);
|
||||||
|
--panel-sheen: color-mix(in srgb, var(--gold) 7%, transparent);
|
||||||
|
--panel-texture:
|
||||||
|
linear-gradient(135deg, var(--panel-sheen), transparent 48%),
|
||||||
|
repeating-linear-gradient(0deg, var(--weave) 0 1px, transparent 1px 4px),
|
||||||
|
repeating-linear-gradient(90deg, var(--weave) 0 1px, transparent 1px 5px);
|
||||||
|
--panel-highlight: inset 0 1px 0 color-mix(in srgb, var(--solid-bg) 70%, transparent);
|
||||||
--font-display: 'Pirata One', 'Alegreya SC', serif;
|
--font-display: 'Pirata One', 'Alegreya SC', serif;
|
||||||
--font-heading: 'Alegreya SC', serif;
|
--font-heading: 'Alegreya SC', serif;
|
||||||
--font-body: 'Alegreya Sans', sans-serif;
|
--font-body: 'Alegreya Sans', sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root[data-theme="dark"] {
|
:root[data-theme="dark"] {
|
||||||
--bg-dark: #0a0d13;
|
--chart-line: color-mix(in srgb, var(--neon-cyan) 6%, transparent);
|
||||||
--bg-ocean: #131822;
|
--chart-glow: color-mix(in srgb, var(--gold) 12%, transparent);
|
||||||
|
--weave: color-mix(in srgb, var(--text-primary) 2%, transparent);
|
||||||
|
--panel-sheen: color-mix(in srgb, var(--gold) 9%, transparent);
|
||||||
|
--bg-dark: #09131c;
|
||||||
|
--bg-ocean: #101f27;
|
||||||
--gold: #d9a23c;
|
--gold: #d9a23c;
|
||||||
--neon-cyan: #41c9bd;
|
--neon-cyan: #41c9bd;
|
||||||
--red-suit: #e8606e;
|
--red-suit: #e8606e;
|
||||||
--black-suit: #dfe6ef;
|
--black-suit: #dfe6ef;
|
||||||
--glass-bg: rgba(27, 33, 46, 0.85);
|
--glass-bg: #1c2c32;
|
||||||
--glass-border: rgba(217, 162, 60, 0.25);
|
--glass-border: rgba(217, 162, 60, 0.25);
|
||||||
--text-primary: #efe7d3;
|
--text-primary: #efe7d3;
|
||||||
--text-muted: #a89e8a;
|
--text-muted: #a89e8a;
|
||||||
--well-bg: rgba(10, 13, 19, 0.5);
|
--well-bg: rgba(10, 13, 19, 0.5);
|
||||||
--row-border: rgba(217, 162, 60, 0.12);
|
--row-border: rgba(217, 162, 60, 0.12);
|
||||||
--solid-bg: rgba(10, 13, 19, 0.9);
|
--solid-bg: #293c42;
|
||||||
--shadow-panel: 0 8px 32px rgba(0, 0, 0, 0.4);
|
--shadow-panel: 0 8px 32px rgba(0, 0, 0, 0.4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -55,7 +71,14 @@ document.documentElement.dataset.theme =
|
|||||||
html { scroll-behavior: smooth; }
|
html { scroll-behavior: smooth; }
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background: radial-gradient(circle at 50% 50%, var(--bg-ocean) 0%, var(--bg-dark) 100%);
|
background-color: var(--bg-deep);
|
||||||
|
background-image:
|
||||||
|
radial-gradient(ellipse at 15% 0%, var(--chart-glow), transparent 55%),
|
||||||
|
repeating-linear-gradient(30deg, transparent 0 159px, var(--chart-line) 159px 160px),
|
||||||
|
repeating-linear-gradient(150deg, transparent 0 159px, var(--chart-line) 159px 160px),
|
||||||
|
repeating-radial-gradient(circle at 85% 15%, transparent 0 119px, var(--chart-line) 119px 120px, transparent 120px 240px),
|
||||||
|
radial-gradient(ellipse at 50% 20%, var(--bg), var(--bg-deep));
|
||||||
|
background-attachment: fixed;
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
font-family: var(--font-body);
|
font-family: var(--font-body);
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
@@ -66,10 +89,10 @@ body {
|
|||||||
a { color: var(--neon-cyan); }
|
a { color: var(--neon-cyan); }
|
||||||
|
|
||||||
.glass-panel {
|
.glass-panel {
|
||||||
background: var(--glass-bg);
|
background: var(--panel-texture), var(--glass-bg);
|
||||||
border: 1px solid var(--glass-border);
|
border: 1px solid var(--glass-border);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
box-shadow: var(--shadow-panel);
|
box-shadow: var(--panel-highlight), var(--shadow-panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
+37
-14
@@ -18,39 +18,55 @@ document.documentElement.dataset.theme =
|
|||||||
If you re-theme the app, update these values too. The theme is read from
|
If you re-theme the app, update these values too. The theme is read from
|
||||||
the same localStorage key the SPA uses ("pirats-theme"). */
|
the same localStorage key the SPA uses ("pirats-theme"). */
|
||||||
:root {
|
:root {
|
||||||
--bg-dark: #9fc9e2;
|
--bg-dark: #8dbcc4;
|
||||||
--bg-ocean: #cde6f5;
|
--bg-ocean: #c9e4e5;
|
||||||
--gold: #a8770f;
|
--gold: #8c6010;
|
||||||
--neon-cyan: #0c8d96;
|
--neon-cyan: #08747d;
|
||||||
--red-suit: #c92a35;
|
--red-suit: #c92a35;
|
||||||
--black-suit: #2c3245;
|
--black-suit: #2c3245;
|
||||||
--glass-bg: rgba(248, 241, 221, 0.92);
|
--glass-bg: #f8f1dd;
|
||||||
--glass-border: rgba(168, 119, 15, 0.35);
|
--glass-border: rgba(168, 119, 15, 0.35);
|
||||||
--text-primary: #33291a;
|
--text-primary: #33291a;
|
||||||
--text-muted: #7d6e54;
|
--text-muted: #6e604b;
|
||||||
--well-bg: rgba(51, 41, 26, 0.06);
|
--well-bg: rgba(51, 41, 26, 0.06);
|
||||||
--row-border: rgba(168, 119, 15, 0.2);
|
--row-border: rgba(168, 119, 15, 0.2);
|
||||||
--solid-bg: rgba(255, 250, 236, 0.95);
|
--solid-bg: #fffaec;
|
||||||
--shadow-panel: 0 8px 32px rgba(36, 62, 87, 0.2);
|
--shadow-panel: 0 8px 32px rgba(36, 62, 87, 0.2);
|
||||||
|
/* Match the app's chart backdrop and opaque sailcloth panels. */
|
||||||
|
--bg: var(--bg-ocean);
|
||||||
|
--bg-deep: var(--bg-dark);
|
||||||
|
--chart-line: color-mix(in srgb, var(--neon-cyan) 9%, transparent);
|
||||||
|
--chart-glow: color-mix(in srgb, #fffaec 48%, transparent);
|
||||||
|
--weave: color-mix(in srgb, var(--text-primary) 3%, transparent);
|
||||||
|
--panel-sheen: color-mix(in srgb, var(--gold) 7%, transparent);
|
||||||
|
--panel-texture:
|
||||||
|
linear-gradient(135deg, var(--panel-sheen), transparent 48%),
|
||||||
|
repeating-linear-gradient(0deg, var(--weave) 0 1px, transparent 1px 4px),
|
||||||
|
repeating-linear-gradient(90deg, var(--weave) 0 1px, transparent 1px 5px);
|
||||||
|
--panel-highlight: inset 0 1px 0 color-mix(in srgb, var(--solid-bg) 70%, transparent);
|
||||||
--font-display: 'Pirata One', 'Alegreya SC', serif;
|
--font-display: 'Pirata One', 'Alegreya SC', serif;
|
||||||
--font-heading: 'Alegreya SC', serif;
|
--font-heading: 'Alegreya SC', serif;
|
||||||
--font-body: 'Alegreya Sans', sans-serif;
|
--font-body: 'Alegreya Sans', sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
:root[data-theme="dark"] {
|
:root[data-theme="dark"] {
|
||||||
--bg-dark: #0a0d13;
|
--chart-line: color-mix(in srgb, var(--neon-cyan) 6%, transparent);
|
||||||
--bg-ocean: #131822;
|
--chart-glow: color-mix(in srgb, var(--gold) 12%, transparent);
|
||||||
|
--weave: color-mix(in srgb, var(--text-primary) 2%, transparent);
|
||||||
|
--panel-sheen: color-mix(in srgb, var(--gold) 9%, transparent);
|
||||||
|
--bg-dark: #09131c;
|
||||||
|
--bg-ocean: #101f27;
|
||||||
--gold: #d9a23c;
|
--gold: #d9a23c;
|
||||||
--neon-cyan: #41c9bd;
|
--neon-cyan: #41c9bd;
|
||||||
--red-suit: #e8606e;
|
--red-suit: #e8606e;
|
||||||
--black-suit: #dfe6ef;
|
--black-suit: #dfe6ef;
|
||||||
--glass-bg: rgba(27, 33, 46, 0.85);
|
--glass-bg: #1c2c32;
|
||||||
--glass-border: rgba(217, 162, 60, 0.25);
|
--glass-border: rgba(217, 162, 60, 0.25);
|
||||||
--text-primary: #efe7d3;
|
--text-primary: #efe7d3;
|
||||||
--text-muted: #a89e8a;
|
--text-muted: #a89e8a;
|
||||||
--well-bg: rgba(10, 13, 19, 0.5);
|
--well-bg: rgba(10, 13, 19, 0.5);
|
||||||
--row-border: rgba(217, 162, 60, 0.12);
|
--row-border: rgba(217, 162, 60, 0.12);
|
||||||
--solid-bg: rgba(10, 13, 19, 0.9);
|
--solid-bg: #293c42;
|
||||||
--shadow-panel: 0 8px 32px rgba(0, 0, 0, 0.4);
|
--shadow-panel: 0 8px 32px rgba(0, 0, 0, 0.4);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,7 +75,14 @@ document.documentElement.dataset.theme =
|
|||||||
html { scroll-behavior: smooth; }
|
html { scroll-behavior: smooth; }
|
||||||
|
|
||||||
body {
|
body {
|
||||||
background: radial-gradient(circle at 50% 50%, var(--bg-ocean) 0%, var(--bg-dark) 100%);
|
background-color: var(--bg-deep);
|
||||||
|
background-image:
|
||||||
|
radial-gradient(ellipse at 15% 0%, var(--chart-glow), transparent 55%),
|
||||||
|
repeating-linear-gradient(30deg, transparent 0 159px, var(--chart-line) 159px 160px),
|
||||||
|
repeating-linear-gradient(150deg, transparent 0 159px, var(--chart-line) 159px 160px),
|
||||||
|
repeating-radial-gradient(circle at 85% 15%, transparent 0 119px, var(--chart-line) 119px 120px, transparent 120px 240px),
|
||||||
|
radial-gradient(ellipse at 50% 20%, var(--bg), var(--bg-deep));
|
||||||
|
background-attachment: fixed;
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
font-family: var(--font-body);
|
font-family: var(--font-body);
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
@@ -70,10 +93,10 @@ body {
|
|||||||
a { color: var(--neon-cyan); }
|
a { color: var(--neon-cyan); }
|
||||||
|
|
||||||
.glass-panel {
|
.glass-panel {
|
||||||
background: var(--glass-bg);
|
background: var(--panel-texture), var(--glass-bg);
|
||||||
border: 1px solid var(--glass-border);
|
border: 1px solid var(--glass-border);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
box-shadow: var(--shadow-panel);
|
box-shadow: var(--panel-highlight), var(--shadow-panel);
|
||||||
}
|
}
|
||||||
|
|
||||||
.rules-page {
|
.rules-page {
|
||||||
|
|||||||
Reference in New Issue
Block a user