+ Version Nomenclature
+
+ Following the release of 2.00 Argonaut, EPCC now uses a consistent naming convention
+ for version numbering that prioritises inter-version character sheet compatibility:
+
+
+ -
+ The EPCC version number must be a float number. It must always increase with the
+ release of new versions.
+
+ -
+ Any change that does impact character sheet compatibility will
+ increment the integer component (i.e., the number to the left of the decimal point)
+ of the version number.
+
+ -
+ Incrementing this number will result in a new version codename assigned
+ (which may or may not be alphabetical).
+
+
+
+ -
+ Any change that does not impact character sheet compatibility will
+ increment the decimal component (i.e., the number to the right of the decimal point)
+ of the version number.
+
+ -
+ Generally, the minor version number has two digits, giving up to 99 versions
+ before we end up in an awkward situation if we want to keep the version a float
+ without rolling over.
+
+ -
+ In the event that we for some reason were to get over 99 releases in a minor
+ version, we will start incrementing to the right. For example, the next minor
+ version after
X.99 would be X.991 and so on. I don't
+ expect this to ever happen.
+
+
+
+
+
+
+# 2.01 Argonaut (2026-01-16)
+This release includes UI fixes as well as introduces a new dark mode (enabled by default).
+- Dark Mode π
+- Added a settings menu (replaces "About" menu) to include a toggle for dark mode as well as for whether to show background images.
+- Reworked landing page styling to properly fit all elements as page shifts
+- Cleaned up column wrapping to remove awkward spacing on mobile
+- Fixed mojibake database entries for some flavour texts in various gear/traits.
+- Fixed popup modals getting cut off and rendering off-screen on mobile
+
# 2.00 Argonaut (2026-01-15)
This release is the first EPCC release under [neonspectra/epcc](https://github.com/neonspectra/epcc). This release focuses on long-overdue plumbing updates as well as automating testing and build processes for further new releases.
diff --git a/DESIGN-STYLEGUIDE.md b/DESIGN-STYLEGUIDE.md
new file mode 100644
index 0000000..531bc75
--- /dev/null
+++ b/DESIGN-STYLEGUIDE.md
@@ -0,0 +1,138 @@
+# EPCC Design Styleguide
+
+This styleguide documents the theme tokens and how to apply them consistently across EPCC. Use the CSS custom properties defined in `resources/sass/theme.css` to keep light/dark themes aligned.
+
+## Named Palette (Light & Dark)
+
+Use these names in discussions and future docs. Actual values live in `resources/sass/theme.css`.
+
+### Light Mode
+
+- **Void White** β `#ffffff` (`--epcc-body-bg`, `--epcc-surface-solid`)
+- **Steel Text** β `hsl(200,10%,40%)` (`--epcc-text`)
+- **Ink Black** β `#000000` (`--epcc-text-strong`)
+- **Signal Rose** β `rgb(186, 0, 80)` (`--epcc-accent`, `--epcc-accent-bg`)
+- **Mist Surface** β `rgba(242, 242, 242, 0.8)` (`--epcc-surface`)
+- **Mist Surface Strong** β `rgba(242, 242, 242, 0.9)` (`--epcc-surface-strong`)
+- **Mist Hover** β `rgba(254, 254, 254, 0.85)` (`--epcc-surface-hover`)
+- **Steel Panel** β `rgba(211, 211, 211, 0.8)` (`--epcc-surface-panel`)
+- **Muted Rose** β `rgba(202, 194, 194, 0.61)` (`--epcc-surface-muted`)
+- **Overlay White** β `rgba(255, 255, 255, 0.95)` (`--epcc-surface-overlay`)
+- **Light Border** β `rgba(245, 245, 245, 0.8)` (`--epcc-border-light`)
+- **Light Border Soft** β `rgba(245, 245, 245, 0.6)` (`--epcc-border-light-soft`)
+- **Dark Divider** β `rgba(148, 155, 153, 0.8)` (`--epcc-border-dark`)
+- **Dark Divider Soft** β `rgba(148, 155, 153, 0.6)` (`--epcc-border-dark-soft`)
+- **Panel Outline** β `grey` (`--epcc-border-panel`)
+- **Input Outline** β `#000000` (`--epcc-input-border`)
+- **Shadow** β `rgba(0, 0, 0, 0.6)` (`--epcc-shadow`)
+
+### Dark Mode
+
+- **Void Black** β `#0f1114` (`--epcc-body-bg`)
+- **Steel Text (Dark)** β `#868f96` (`--epcc-text`)
+- **Fog White** β `#eef2f4` (`--epcc-text-strong`)
+- **Signal Rose Light** β `#f598c6` (`--epcc-accent`)
+- **Signal Rose Deep** β `#b41b5c` (`--epcc-accent-bg`)
+- **Ash Surface** β `rgba(22, 26, 30, 0.85)` (`--epcc-surface`)
+- **Ash Surface Strong** β `rgba(28, 33, 38, 0.9)` (`--epcc-surface-strong`)
+- **Ash Hover** β `rgba(40, 46, 54, 0.9)` (`--epcc-surface-hover`)
+- **Ash Solid** β `#1a1f24` (`--epcc-surface-solid`)
+- **Panel Steel** β `rgba(26, 31, 36, 0.85)` (`--epcc-surface-panel`)
+- **Muted Rose (Dark)** β `rgba(71, 58, 66, 0.7)` (`--epcc-surface-muted`)
+- **Overlay Ash** β `rgba(20, 24, 28, 0.95)` (`--epcc-surface-overlay`)
+- **Light Edge** β `rgba(255, 255, 255, 0.08)` (`--epcc-border-light`)
+- **Light Edge Soft** β `rgba(255, 255, 255, 0.05)` (`--epcc-border-light-soft`)
+- **Dark Edge** β `rgba(0, 0, 0, 0.6)` (`--epcc-border-dark`)
+- **Dark Edge Soft** β `rgba(0, 0, 0, 0.4)` (`--epcc-border-dark-soft`)
+- **Panel Outline (Dark)** β `rgba(255, 255, 255, 0.18)` (`--epcc-border-panel`)
+- **Input Outline (Dark)** β `rgba(255, 255, 255, 0.35)` (`--epcc-input-border`)
+- **Shadow (Dark)** β `rgba(0, 0, 0, 0.7)` (`--epcc-shadow`)
+
+## Theme Tokens
+
+All tokens are CSS variables on `:root` (light) and `[data-theme="dark"]` (dark). Use tokens instead of hard-coded colors.
+
+### Core Colors
+
+- `--epcc-body-bg` β Global page background.
+- `--epcc-text` β Default body text color for paragraphs, labels, meta text, and standard UI copy.
+- `--epcc-text-strong` β Headings and emphasized text on dark surfaces.
+- `--epcc-text-inverse` β Text on strong accent backgrounds.
+- `--epcc-accent` β Accent/brand color for links, hover text, and non-solid highlights.
+- `--epcc-accent-bg` β Solid accent background for selected/active states.
+
+### Surfaces
+
+- `--epcc-surface` β Primary panel and card backgrounds; used for most containers.
+- `--epcc-surface-strong` β Dropdown/menu containers or slightly stronger panels.
+- `--epcc-surface-hover` β Hover background for list items and buttons.
+- `--epcc-surface-solid` β Inputs, popovers, and tooltip backgrounds.
+- `--epcc-surface-panel` β Game-style box backgrounds (`.game-box`).
+- `--epcc-surface-muted` β Section headers and subtle group labels.
+- `--epcc-surface-overlay` β Floating message overlay background.
+
+### Borders & Shadows
+
+- `--epcc-border-light` β Light inner borders (top separators).
+- `--epcc-border-light-soft` β Light divider lines.
+- `--epcc-border-dark` β Dark border on inputs and panels.
+- `--epcc-border-dark-soft` β Dark divider lines.
+- `--epcc-border-panel` β Panel border outline (game-style border + tooltips).
+- `--epcc-input-border` β Thick checkbox/legacy input outline.
+- `--epcc-shadow` β Shadows for popovers/tooltips.
+
+## Component Usage
+
+### Layout & Containers
+
+- **Body**: `background-color: var(--epcc-body-bg)` and `color: var(--epcc-text)`.
+- **Panels (`section.panel`, `.mainlist`, `.skills`)**: `var(--epcc-surface)` background with `--epcc-text` text.
+- **Game boxes (`.game-box`)**: `background: var(--epcc-surface-panel)` with `border: 2px solid var(--epcc-border-panel)`.
+- **Modal dialogs (`.uk-modal-dialog`)**: `background: var(--epcc-surface)` and text `var(--epcc-text)`.
+
+### Navigation & Selection
+
+- **Active list item**: `background: var(--epcc-accent-bg)` and `color: var(--epcc-text-inverse)`.
+- **Hover list item**: `background: var(--epcc-surface-hover)` and `color: var(--epcc-accent)`.
+- **Section headers (`.listSection`, `.foldingListSection`)**: `background: var(--epcc-surface-muted)` and `color: var(--epcc-accent)`.
+
+### Buttons
+
+- **Primary buttons (`.uk-button-primary`)**: `background: var(--epcc-accent-bg)` + `color: var(--epcc-text-inverse)`.
+- **Secondary/default buttons (`.uk-button-secondary`, `.uk-button-default`, `.popupButton`)**: `background: var(--epcc-surface)` + `color: var(--epcc-text)`.
+- **Hover state**: `background: var(--epcc-surface-hover)` + `color: var(--epcc-accent)`.
+
+### Links
+
+- **Links**: `color: var(--epcc-accent)`.
+- **Hover**: keep `var(--epcc-accent)` to maintain emphasis and contrast.
+
+### Forms & Inputs
+
+- **Inputs/select/textarea**: `background: var(--epcc-surface-solid)` + `color: var(--epcc-text-strong)` + `border: 1px solid var(--epcc-border-dark)`.
+- **Focus**: `border-color: var(--epcc-accent)`.
+- **Checkboxes**: `background: var(--epcc-surface-solid)` + `border-color: var(--epcc-border-dark)`.
+- **Legacy checkbox outline**: use `var(--epcc-input-border)`.
+
+### Tooltips & Help
+
+- **Help icons (`.btnhelp`)**: `color: var(--epcc-text)` for default state.
+- **Tooltips (`.ui-tooltip`)**: `background: var(--epcc-surface-solid)`, `border: 1px solid var(--epcc-border-panel)`, `color: var(--epcc-text)`, `box-shadow: var(--epcc-shadow)`.
+
+### Messages & Alerts
+
+- **Message banner (`#messages`)**: `background: var(--epcc-surface-overlay)`, `color: var(--epcc-text)`.
+- **Error/invalid highlight**: use `var(--epcc-accent-bg)` as the background and `var(--epcc-text-inverse)` for readability.
+
+## Do/Donβt
+
+- Do use the tokens above instead of hard-coded colors.
+- Do keep hover/active contrast consistent with the reference styles.
+- Donβt introduce new hard-coded colors without updating `resources/sass/theme.css`.
+- Donβt use `var(--epcc-accent)` as a solid background; use `--epcc-accent-bg` instead.
+
+## File References
+
+- Theme tokens: `resources/sass/theme.css`
+- Legacy UI styles: `resources/sass/main7.css`, `resources/sass/ui.css`, `resources/sass/popup.css`
+- Game UI components: `resources/sass/new-ui.scss`
diff --git a/README.md b/README.md
index 8442037..b23ba30 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
# EPCC β Eclipse Phase 1E Character Creator
-This repo is a fork of the [original web-based character creator application](https://github.com/Eclipse-Phase-Unofficial/ep-character-creator) for the [Eclipse Phase First Edition (1E)](https://www.drivethrurpg.com/en/product/64135/eclipse-phase-first-edition) role-playing game, because I prefer Eclipse Phase 1E over the newer Second Edition.
+This repo is a fork of the [original web-based character creator application](https://github.com/Eclipse-Phase-Unofficial/ep-character-creator) for the [Eclipse Phase First Edition (1E)](https://posthuman.shop/products/eclipse-phase-first-edition-pdf) role-playing game, because I prefer Eclipse Phase 1E over the newer Second Edition.
While I think that Posthuman Studios are a great team ([support them and buy their stuff!](https://posthuman.shop/)), Eclipse Phase has always had a problem of not really knowing what it wants to be. Although the second edition is more streamlined, I think Eclipse Phase 2E really lost sight of its roots as a simulationist game system focused on accurately and consistently depicting the minutiae of how its hard-scifi setting works.
@@ -14,6 +14,7 @@ The original upstream EPCC repo is no longer maintained, so I forked it to bring
* [Issues](https://github.com/neonspectra/epcc/issues)
* Websites that Host EPCC
* [epcc.neosynth.net](https://epcc.neosynth.net)
+ * [epcc.onrender.com](https://epcc.onrender.com) (*Mirror, has delayed startup on inactivity*)
## License
This work is licensed under the **Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License**.
@@ -24,7 +25,7 @@ You can read the full license description [here](https://github.com/neonspectra/
See [here](https://github.com/neonspectra/epcc/blob/main/Authors.md) for a list of everyone who has contributed to this project.
## Version
-The current version is **2.00 (Argonaut)**! See the [Changelog](https://github.com/neonspectra/epcc/blob/main/CHANGELOG.md).
+The current version is **2.01 (Argonaut)**! See the [Changelog](https://github.com/neonspectra/epcc/blob/main/CHANGELOG.md).
## EPCC Configuration
There is a single configuration file for EPCC: `src/php/config.ini`.
diff --git a/app/Http/Controllers/HighLevelCreatorController.php b/app/Http/Controllers/HighLevelCreatorController.php
index d3928b8..bd5c31b 100644
--- a/app/Http/Controllers/HighLevelCreatorController.php
+++ b/app/Http/Controllers/HighLevelCreatorController.php
@@ -25,7 +25,7 @@ class HighLevelCreatorController extends Controller
*/
public function __construct()
{
- $this->middleware('creator', ['except' => ['store', 'update']]);
+ $this->middleware('creator', ['except' => ['store', 'update', 'destroy']]);
}
/**
@@ -137,6 +137,19 @@ public function update(Request $request)
return response(['Success' => True]);
}
+ /**
+ * Clear the current session creator (and related session data).
+ *
+ * @param Request $request
+ * @return Response
+ */
+ public function destroy(Request $request)
+ {
+ $request->session()->invalidate();
+ $request->session()->regenerateToken();
+ return response(['Success' => True]);
+ }
+
private static function buildValidationResponsePart(string $name, bool $isValid, string $errorMessage): array
{
return [
diff --git a/database/database.sql b/database/database.sql
index b8671ab..2d825f6 100644
--- a/database/database.sql
+++ b/database/database.sql
@@ -2284,7 +2284,7 @@ INSERT INTO backgrounds VALUES(3,'Argonaut','You are part of a scientific techno
INSERT INTO backgrounds VALUES(4,'Barsoomian','You call the Martian outback and wilds your home. You are a "redneck," a lower-class Martian from the rural areas that often\nfind themselves in conflict with the policies and goals of the hyper- corp domes and Tharsis League.