Added themes to home and rules pages

This commit is contained in:
Giac
2025-12-09 09:30:37 -06:00
parent fbf7dee0f0
commit 20c642847a
13 changed files with 900 additions and 285 deletions

View File

@@ -1,18 +1,18 @@
<script>
export let chart;
export let chart;
</script>
<div class="chart-display">
{#if chart.x != ''}
<div class="axis">
<div class="axis-label">X-Axis (Horizontal)</div>
<div>{chart.x[0]}{chart.x[1]}</div>
</div>
<div class="axis">
<div class="axis-label">Y-Axis (Vertical)</div>
<div>{chart.y[0]}{chart.y[1]}</div>
</div>
{:else}
<p class="empty-state">Click Generate!</p>
{/if}
{#if chart && chart.x && chart.y}
<div class="axis">
<div class="axis-label">X-Axis (Horizontal)</div>
<div>{chart.x[0]}{chart.x[1]}</div>
</div>
<div class="axis">
<div class="axis-label">Y-Axis (Vertical)</div>
<div>{chart.y[0]}{chart.y[1]}</div>
</div>
{:else}
<div class="empty-state">Click Generate!</div>
{/if}
</div>

View File

@@ -1,14 +1,14 @@
<script>
export let diceRoll;
export let diceRoll;
</script>
<div class="dice-display">
{#if diceRoll.x != 0}
<div class="dice-emoji">🎲 🎲</div>
<div class="dice-result">X: {diceRoll.x} | Y: {diceRoll.y}</div>
{:else}
<div class="empty-state">Click Roll!</div>
{/if}
{#if diceRoll}
<div class="dice-emoji">🎲 🎲</div>
<div class="dice-result">X: {diceRoll.x} | Y: {diceRoll.y}</div>
{:else}
<div class="empty-state">Click Roll!</div>
{/if}
</div>
<style>
@@ -23,5 +23,4 @@
margin-top: 10px;
text-align: center;
}
</style>
</style>

View File

@@ -3,16 +3,13 @@
export let currentTheme;
</script>
<fieldset>
<legend>Theme Selector</legend>
<div class="button-row">
{#each themes as theme}
{#each themeNames as theme}
<button
on:click={() => currentTheme = theme}
class:active={currentTheme === theme}
>
{theme.charAt(0).toUpperCase() + theme.slice(1)}
{themeDisplayNames[theme]}
</button>
{/each}
</div>
@@ -25,4 +22,4 @@
flex-wrap: wrap;
margin-top: 10px;
}
</style>
</style>

View File

@@ -45,4 +45,92 @@
.theme-cyberpunk .dice-display {
background: rgba(0, 255, 255, 0.05);
border: 1px solid #00ffff;
}
/* Home Page Styles */
.theme-cyberpunk .home-wrapper {
background: #0a0e27;
color: #00ffff;
}
.theme-cyberpunk .home-window {
background: rgba(10, 14, 39, 0.95);
border: 2px solid #00ffff;
box-shadow: 0 0 30px #ff00ff;
}
.theme-cyberpunk .home-title-bar {
background: linear-gradient(90deg, #ff00ff, #00ffff);
color: #000;
padding: 12px;
font-weight: bold;
text-transform: uppercase;
text-align: center;
letter-spacing: 3px;
}
.theme-cyberpunk .home-content {
background: rgba(10, 14, 39, 0.5);
}
.theme-cyberpunk .title {
color: #00ffff;
text-shadow: 0 0 20px #00ffff;
}
.theme-cyberpunk .subtitle {
color: #ff00ff;
}
.theme-cyberpunk .tab-button {
background: transparent;
border: 2px solid #ff00ff;
color: #ff00ff;
text-transform: uppercase;
}
.theme-cyberpunk .tab-button:hover {
background: #ff00ff;
color: #000;
box-shadow: 0 0 20px #ff00ff;
}
/* Rules Page Styles */
.theme-cyberpunk .rules-wrapper {
background: #0a0e27;
color: #00ffff;
}
.theme-cyberpunk .back-button {
background: transparent;
border: 1px solid #ff00ff;
color: #ff00ff;
}
.theme-cyberpunk .back-button:hover {
background: #ff00ff;
color: #000;
}
.theme-cyberpunk .rules-content {
color: #00ffff;
}
.theme-cyberpunk h1 {
color: #00ffff;
text-shadow: 0 0 20px #00ffff;
}
.theme-cyberpunk h2 {
color: #ff00ff;
text-shadow: 0 0 15px #ff00ff;
}
.theme-cyberpunk h3 {
color: #00ffff;
}
.theme-cyberpunk p,
.theme-cyberpunk li {
color: #00ffff;
}

View File

@@ -46,4 +46,99 @@
.theme-nightmare .dice-display {
background: #000000;
border: 2px solid #8b0000;
}
/* Home Page Styles */
.theme-nightmare .home-wrapper {
background: #000000;
color: #8b0000;
}
.theme-nightmare .home-window {
background: #0d0000;
border: 3px solid #8b0000;
box-shadow: 0 0 30px #ff0000;
}
.theme-nightmare .home-title-bar {
background: linear-gradient(180deg, #3a0000, #000000);
color: #ff0000;
padding: 15px;
text-align: center;
text-transform: uppercase;
letter-spacing: 5px;
text-shadow: 0 0 10px #ff0000;
font-family: 'Georgia', serif;
}
.theme-nightmare .home-content {
background: #0d0000;
font-family: 'Georgia', serif;
}
.theme-nightmare .title {
color: #ff0000;
text-shadow: 0 0 15px #ff0000;
}
.theme-nightmare .subtitle {
color: #cc0000;
text-shadow: 0 0 10px #cc0000;
}
.theme-nightmare .tab-button {
background: #3a0000;
border: 2px solid #8b0000;
color: #ff0000;
font-family: 'Georgia', serif;
text-transform: uppercase;
}
.theme-nightmare .tab-button:hover {
background: #8b0000;
box-shadow: 0 0 20px #ff0000;
}
/* Rules Page Styles */
.theme-nightmare .rules-wrapper {
background: #000000;
color: #8b0000;
}
.theme-nightmare .back-button {
background: #3a0000;
border: 2px solid #8b0000;
color: #ff0000;
}
.theme-nightmare .back-button:hover {
background: #8b0000;
box-shadow: 0 0 15px #ff0000;
}
.theme-nightmare .rules-content {
color: #8b0000;
font-family: 'Georgia', serif;
}
.theme-nightmare h1 {
color: #ff0000;
text-shadow: 0 0 15px #ff0000;
font-family: 'Georgia', serif;
}
.theme-nightmare h2 {
color: #cc0000;
text-shadow: 0 0 10px #cc0000;
font-family: 'Georgia', serif;
}
.theme-nightmare h3 {
color: #ff0000;
font-family: 'Georgia', serif;
}
.theme-nightmare p,
.theme-nightmare li {
color: #8b0000;
}

View File

@@ -61,4 +61,106 @@
border: 3px solid #00a3e0;
border-radius: 10px;
color: #484848;
}
/* Home Page Styles */
.theme-nintendo .home-wrapper {
background: #e60012;
color: #fff;
}
.theme-nintendo .home-window {
background: #fff;
border: 8px solid #e60012;
border-radius: 20px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
overflow: hidden;
}
.theme-nintendo .home-title-bar {
background: #e60012;
color: #fff;
padding: 20px;
text-align: center;
font-weight: bold;
font-size: 24px;
letter-spacing: 2px;
}
.theme-nintendo .home-content {
background: #fff;
color: #484848;
}
.theme-nintendo .title {
color: #e60012;
}
.theme-nintendo .subtitle {
color: #484848;
}
.theme-nintendo .tab-button {
background: #e60012;
border: none;
border-radius: 25px;
color: #fff;
text-transform: uppercase;
box-shadow: 0 4px 0 #a00009;
}
.theme-nintendo .tab-button:hover {
background: #ff0018;
transform: translateY(-2px);
}
.theme-nintendo .tab-button:active {
box-shadow: 0 2px 0 #a00009;
transform: translateY(2px);
}
/* Rules Page Styles */
.theme-nintendo .rules-wrapper {
background: #e60012;
color: #fff;
}
.theme-nintendo .back-button {
background: #e60012;
border: none;
border-radius: 25px;
color: #fff;
box-shadow: 0 4px 0 #a00009;
padding: 8px 20px;
}
.theme-nintendo .back-button:hover {
background: #ff0018;
transform: translateY(-2px);
}
.theme-nintendo .back-button:active {
box-shadow: 0 2px 0 #a00009;
transform: translateY(2px);
}
.theme-nintendo .rules-content {
color: #484848;
}
.theme-nintendo h1 {
color: #e60012;
}
.theme-nintendo h2 {
color: #e60012;
}
.theme-nintendo h3 {
color: #00a3e0;
}
.theme-nintendo p,
.theme-nintendo li {
color: #484848;
}

View File

@@ -39,4 +39,78 @@
.theme-typewriter .dice-display {
background: #fffef7;
border: 1px solid #2c2416;
}
/* Home Page Styles */
.theme-typewriter .home-wrapper {
background: #f4e8d0;
color: #2c2416;
}
.theme-typewriter .home-window {
background: #fffef7;
border: 3px double #2c2416;
box-shadow: 5px 5px 15px rgba(0,0,0,0.3);
}
.theme-typewriter .home-title-bar {
background: #2c2416;
color: #f4e8d0;
padding: 12px;
text-align: center;
text-transform: uppercase;
letter-spacing: 3px;
font-family: 'Courier', monospace;
}
.theme-typewriter .home-content {
background: #fffef7;
font-family: 'Courier', monospace;
}
.theme-typewriter .title {
color: #2c2416;
}
.theme-typewriter .subtitle {
color: #4a3a28;
}
.theme-typewriter .tab-button {
background: #2c2416;
border: 2px solid #2c2416;
color: #f4e8d0;
font-family: 'Courier', monospace;
}
.theme-typewriter .tab-button:hover {
background: #4a3a28;
}
/* Rules Page Styles */
.theme-typewriter .rules-wrapper {
background: #f4e8d0;
color: #2c2416;
}
.theme-typewriter .back-button {
background: #2c2416;
color: #f4e8d0;
border: 2px solid #2c2416;
}
.theme-typewriter .back-button:hover {
background: #4a3a28;
}
.theme-typewriter .rules-content {
color: #2c2416;
font-family: 'Courier', monospace;
}
.theme-typewriter h1,
.theme-typewriter h2,
.theme-typewriter h3 {
color: #2c2416;
font-family: 'Courier', monospace;
}

View File

@@ -43,4 +43,92 @@
.theme-vaporwave .dice-display {
background: rgba(255, 255, 255, 0.15);
border: 2px solid #ff6ad5;
}
/* Home Page Styles */
.theme-vaporwave .home-wrapper {
background: linear-gradient(180deg, #ff6ad5 0%, #c774e8 50%, #ad8cff 100%);
color: #fff;
}
.theme-vaporwave .home-window {
background: rgba(255, 106, 213, 0.3);
backdrop-filter: blur(10px);
border: 3px solid #00f0ff;
box-shadow: 0 8px 32px rgba(0, 240, 255, 0.4);
}
.theme-vaporwave .home-title-bar {
background: linear-gradient(90deg, #ff6ad5, #00f0ff);
color: #fff;
padding: 15px;
text-align: center;
text-transform: uppercase;
letter-spacing: 4px;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
.theme-vaporwave .home-content {
background: rgba(255, 255, 255, 0.1);
}
.theme-vaporwave .title {
color: #fff;
text-shadow: 2px 2px 8px rgba(0, 240, 255, 0.6);
}
.theme-vaporwave .subtitle {
color: rgba(255, 255, 255, 0.95);
}
.theme-vaporwave .tab-button {
background: linear-gradient(135deg, #ff6ad5, #c774e8);
border: 2px solid #00f0ff;
color: #fff;
text-transform: uppercase;
}
.theme-vaporwave .tab-button:hover {
transform: translateY(-3px);
box-shadow: 0 8px 25px rgba(0, 240, 255, 0.6);
}
/* Rules Page Styles */
.theme-vaporwave .rules-wrapper {
background: linear-gradient(180deg, #ff6ad5 0%, #c774e8 50%, #ad8cff 100%);
color: #fff;
}
.theme-vaporwave .back-button {
background: linear-gradient(135deg, #ff6ad5, #c774e8);
border: 2px solid #00f0ff;
color: #fff;
}
.theme-vaporwave .back-button:hover {
transform: translateY(-2px);
box-shadow: 0 4px 15px rgba(0, 240, 255, 0.6);
}
.theme-vaporwave .rules-content {
color: #fff;
}
.theme-vaporwave h1 {
color: #fff;
text-shadow: 2px 2px 8px rgba(0, 240, 255, 0.6);
}
.theme-vaporwave h2 {
color: #00f0ff;
text-shadow: 0 0 10px #00f0ff;
}
.theme-vaporwave h3 {
color: #ff6ad5;
}
.theme-vaporwave p,
.theme-vaporwave li {
color: rgba(255, 255, 255, 0.95);
}

View File

@@ -10,16 +10,16 @@
box-shadow: 2px 2px 0 rgba(0,0,0,0.5);
}
.title-bar {
background: linear-gradient(to right, #000080, #1084d0);
color: white;
padding: 8px;
font-weight: bold;
}
.theme-win95 .title-bar {
background: linear-gradient(to right, #000080, #1084d0);
color: white;
padding: 8px;
font-weight: bold;
}
fieldset {
border: 2px groove #c0c0c0;
}
.theme-win95 fieldset {
border: 2px groove #c0c0c0;
}
.theme-win95 button {
background: #c0c0c0;
@@ -36,4 +36,71 @@
.theme-win95 .dice-display {
background: white;
border: 2px inset #808080;
}
/* Home Page Styles */
.theme-win95 .home-wrapper {
background: #008080;
}
.theme-win95 .home-window {
background: #c0c0c0;
border: 2px solid;
border-color: #dfdfdf #808080 #808080 #dfdfdf;
box-shadow: 2px 2px 0 rgba(0,0,0,0.5);
}
.theme-win95 .home-title-bar {
background: linear-gradient(to right, #000080, #1084d0);
color: white;
padding: 8px;
font-weight: bold;
text-align: center;
}
.theme-win95 .home-content {
background: #c0c0c0;
color: #000;
}
.theme-win95 .tab-button {
background: #c0c0c0;
border: 2px solid;
border-color: #ffffff #000000 #000000 #ffffff;
color: #000;
}
.theme-win95 .tab-button:hover {
background: #dfdfdf;
}
.theme-win95 .tab-button:active {
border-color: #000000 #ffffff #ffffff #000000;
}
/* Rules Page Styles */
.theme-win95 .rules-wrapper {
background: #008080;
}
.theme-win95 .back-button {
background: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.3);
}
.theme-win95 .back-button:hover {
background: rgba(255, 255, 255, 0.3);
}
.theme-win95 .rules-content {
color: #000;
}
.theme-win95 h1,
.theme-win95 h2 {
color: #000080;
}
.theme-win95 h3 {
color: #1084d0;
}

View File

@@ -1,67 +1,29 @@
<script lang="ts">
import favicon from '$lib/assets/favicon.svg';
import ThemeSelector from '$components/themeSelector.svelte';
<script>
import '$lib/styles/themes.js';
import { writable } from 'svelte/store';
import { setContext } from 'svelte';
let currentTheme = $state('win95');
let { children } = $props();
// Create a theme store that persists across pages
const theme = writable('win95');
setContext('theme', theme);
let currentTheme;
theme.subscribe(value => {
currentTheme = value;
});
</script>
<svelte:head>
<link rel="icon" href={favicon} />
</svelte:head>
<!-- <svelte:body class="theme-{currentTheme}" /> -->
<nav class="title-bar theme-{currentTheme}">
<h1><a href="/">On the Spectrum</a></h1>
<ul>
<li><a href="play">Play</a></li>
<li><a href="rules">Rules</a></li>
<li><a href="submit">Submit</a></li>
</ul>
<ThemeSelector bind:currentTheme />
</nav>
<section class="theme-{currentTheme}">
{@render children()}
</section>
<div class="app-container theme-{currentTheme}">
<slot />
</div>
<style>
@import '$lib/styles/cyberpunk.css';
@import '$lib/styles/nightmare.css';
@import '$lib/styles/nintendo.css';
@import '$lib/styles/typewriter.css';
@import '$lib/styles/vaporwave.css';
@import '$lib/styles/win95.css';
:global(body) {
margin: 0;
padding: 0;
}
:global(body) {
margin: 0;
height: 100vh;
}
nav {
display: inline-flex;
width: 100vw;
a {
text-decoration: none;
font-weight: 600;
&:visited {
color: inherit;
}
&:hover {
color: oklch(0.6 0.186 25);
}
}
ul {
list-style: none;
display: inline-flex;
gap: 1rem;
align-items: end;
font-size: 1.25rem;
}
}
section {
display: flex;
flex-direction: column;
}
</style>
.app-container {
min-height: 100vh;
}
</style>

View File

@@ -1,108 +1,144 @@
<script lang="ts">
<script>
import { getContext } from 'svelte';
import ThemeSelector from '$lib/components/ThemeSelector.svelte';
const themeStore = getContext('theme');
let currentTheme = $themeStore;
$: themeStore.set(currentTheme);
</script>
<div class="home-container">
<div class="home-content">
<h1 class="title">On the Spectrum!</h1>
<p class="subtitle">Well...are ya?</p>
<div class="home-wrapper">
<div class="home-container">
<div class="home-window">
<div class="home-title-bar">
<span>On the Spectrum</span>
</div>
<div class="home-content">
<h1 class="title">Are you on the Spectrum?</h1>
<p class="subtitle">A party game about preferences</p>
<div class="tabs">
<a href="/play" class="tab-button">
<span class="tab-icon">🎮</span>
<span>Play</span>
</a>
<a href="/rules" class="tab-button">
<span class="tab-icon">📖</span>
<span>Rules</span>
</a>
</div>
<div class="tabs">
<a href="/play" class="tab-button">
<span class="tab-icon">🎮</span>
<span>Play</span>
</a>
<a href="/rules" class="tab-button">
<span class="tab-icon">📖</span>
<span>Rules</span>
</a>
</div>
</div>
<div class="theme-selector-container">
<fieldset>
<legend>Theme Selector</legend>
<ThemeSelector bind:currentTheme />
</fieldset>
</div>
</div>
</div>
</div>
</div>
<style>
.home-container {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 20px;
}
.home-wrapper {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
padding: 20px;
}
.home-content {
text-align: center;
max-width: 600px;
width: 100%;
}
.home-container {
width: 100%;
max-width: 700px;
}
.title {
font-size: 3.5rem;
font-weight: bold;
color: white;
margin-bottom: 1rem;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
line-height: 1.2;
}
.home-window {
width: 100%;
}
@media (max-width: 768px) {
.title {
font-size: 2.5rem;
}
}
.home-content {
padding: 40px;
text-align: center;
}
.subtitle {
font-size: 1.5rem;
color: rgba(255, 255, 255, 0.9);
margin-bottom: 3rem;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
}
.title {
font-size: 3rem;
font-weight: bold;
margin-bottom: 1rem;
line-height: 1.2;
}
.tabs {
display: flex;
gap: 20px;
justify-content: center;
flex-wrap: wrap;
}
.subtitle {
font-size: 1.3rem;
margin-bottom: 2.5rem;
opacity: 0.9;
}
.tab-button {
text-decoration: none;
background: white;
border: none;
border-radius: 15px;
padding: 30px 50px;
font-size: 1.5rem;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
min-width: 200px;
}
.tabs {
display: flex;
gap: 20px;
justify-content: center;
flex-wrap: wrap;
margin-bottom: 2.5rem;
}
.tab-button:hover {
transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.tab-button {
border: none;
border-radius: 10px;
padding: 25px 40px;
font-size: 1.3rem;
font-weight: bold;
cursor: pointer;
transition: all 0.3s ease;
display: flex;
flex-direction: column;
align-items: center;
gap: 10px;
min-width: 180px;
text-decoration: none;
}
.tab-icon {
font-size: 3rem;
}
.tab-icon {
font-size: 2.5rem;
}
@media (max-width: 768px) {
.tab-button {
padding: 20px 40px;
font-size: 1.2rem;
min-width: 150px;
}
.theme-selector-container {
margin-top: 2rem;
}
.tab-icon {
font-size: 2rem;
}
}
</style>
.theme-selector-container fieldset {
padding: 20px;
}
.theme-selector-container legend {
font-weight: bold;
padding: 0 10px;
}
@media (max-width: 768px) {
.title {
font-size: 2rem;
}
.subtitle {
font-size: 1.1rem;
}
.tab-button {
padding: 20px 30px;
font-size: 1.1rem;
min-width: 150px;
}
.tab-icon {
font-size: 2rem;
}
.home-content {
padding: 30px 20px;
}
}
</style>

View File

@@ -1,34 +1,44 @@
<script>
import { xAxes, yAxes } from '$lib';
import ChartDisplay from '$components/chartDisplay.svelte';
import DiceRoller from '$components/diceRoller.svelte';
import { getContext } from 'svelte';
import xAxes from '$lib/data/xAxes.js';
import yAxes from '$lib/data/yAxes.js';
import ChartDisplay from '$components/ChartDisplay.svelte';
import DiceRoller from '$components/DiceRoller.svelte';
import ThemeSelector from '$components/ThemeSelector.svelte';
import Toggle from '$components/Toggle.svelte';
let adultMode = $state(false);
let currentChart = $state({ x: [''], y: [''] });
let diceRoll = $state({ x: 0, y: 0 });
const theme = getContext('theme');
let currentTheme;
theme.subscribe(value => {
currentTheme = value;
});
function generateChart() {
const availableXAxes = adultMode ? xAxes : xAxes.filter((axis) => !axis.adult);
const availableYAxes = adultMode ? yAxes : yAxes.filter((axis) => !axis.adult);
let adultMode = false;
let currentChart = null;
let diceRoll = null;
const randomX = availableXAxes[Math.floor(Math.random() * availableXAxes.length)];
const randomY = availableYAxes[Math.floor(Math.random() * availableYAxes.length)];
function generateChart() {
const availableXAxes = adultMode ? xAxes : xAxes.filter(axis => !axis.adult);
const availableYAxes = adultMode ? yAxes : yAxes.filter(axis => !axis.adult);
const randomX = availableXAxes[Math.floor(Math.random() * availableXAxes.length)];
const randomY = availableYAxes[Math.floor(Math.random() * availableYAxes.length)];
currentChart = {
x: randomX.values,
y: randomY.values
};
}
currentChart = {
x: randomX.values,
y: randomY.values
};
}
function rollDice() {
diceRoll = {
x: Math.floor(Math.random() * 10) + 1,
y: Math.floor(Math.random() * 10) + 1
};
}
function rollDice() {
diceRoll = {
x: Math.floor(Math.random() * 10) + 1,
y: Math.floor(Math.random() * 10) + 1
};
}
</script>
<div class="container theme-{currentTheme}">
<div class="container">
<div class="window">
<div class="title-bar">
<a href="/" class="home-button">← Home</a>
@@ -38,7 +48,7 @@
<div class="window-body">
<fieldset>
<legend>Theme Selector</legend>
<ThemeSelector bind:currentTheme />
<ThemeSelector bind:currentTheme={$theme} />
</fieldset>
<fieldset>
@@ -56,7 +66,7 @@
<fieldset>
<legend>Position Roller</legend>
<DiceRoller roll={diceRoll} />
<DiceRoller diceRoll={diceRoll} />
<div class="button-row">
<button on:click={rollDice}>Roll Dice</button>
</div>

View File

@@ -1,105 +1,200 @@
<script lang="ts">
import { goto } from '$app/navigation';
<script>
import { getContext } from 'svelte';
import ThemeSelector from '$lib/components/ThemeSelector.svelte';
const themeStore = getContext('theme');
let currentTheme = $themeStore;
function goHome() {
goto('/');
}
$: themeStore.set(currentTheme);
</script>
<div class="rules-container">
<div class="rules-content">
<button class="back-button" on:click={() => goHome()}> Back to Home</button>
<h1>How to Play</h1>
<section>
<h2>🎯 Objective</h2>
<p>--</p>
</section>
<div class="rules-wrapper">
<div class="rules-container">
<div class="window">
<div class="title-bar">
<a href="/" class="back-button">← Back</a>
<span>Rules</span>
</div>
<div class="window-body">
<fieldset>
<legend>Theme Selector</legend>
<ThemeSelector bind:currentTheme />
</fieldset>
<section>
<h2>🎮 Setup</h2>
<ol>
<li></li>
<li></li>
<li></li>
</ol>
</section>
<div class="rules-content">
<h1>How to Play</h1>
<section>
<h2>🎲 Setup</h2>
<ol>
<li>Gather 2+ players</li>
<li>Each player needs paper and something to write with</li>
<li>Choose a theme (optional but fun!)</li>
<li>Decide if you want Adult Mode enabled (18+)</li>
</ol>
</section>
<section>
<h2>📊 How to Play</h2>
<ol>
<li><strong>Generate a Chart:</strong> Click "Generate" to get a random spectrum with X and Y axes</li>
</ol>
</section>
<section>
<h2>📊 Basic Gameplay</h2>
<ol>
<li><strong>Generate:</strong> Click "Generate" to create a random 2D spectrum with X and Y axes</li>
<li><strong>Plot:</strong> Each player marks where they fall on the spectrum (1-10 on each axis)</li>
<li><strong>Reveal:</strong> Players show their positions simultaneously</li>
<li><strong>Discuss:</strong> Talk about why you're positioned where you are</li>
<li><strong>Repeat:</strong> Generate a new spectrum and keep playing!</li>
</ol>
</section>
<section>
<h2>Points</h2>
<p><strong>5 Points:</strong>0 away</p>
<p><strong>4 Points:</strong>1 away</p>
<p><strong>3 Points:</strong>2 away</p>
<p><strong>2 Points:</strong>3 away</p>
<p><strong>1 Point:</strong>4 away</p>
<p><strong>0 Points:</strong>5+ away</p>
</section>
<section>
<h2>🎮 Game Variants</h2>
<h3>Classic Mode</h3>
<p>Players honestly plot their positions and discuss their reasoning. Great for getting to know each other!</p>
<h3>Dice Challenge</h3>
<p>Click "Roll Dice" to get random coordinates (X and Y). Players must defend that position as if it were their true preference. First player to convince the group wins that round!</p>
<h3>Prediction Mode</h3>
<p>Before revealing, each player predicts where another player will land. Earn points for accurate predictions!</p>
<h3>Debate Mode</h3>
<p>Players on opposite extremes of a spectrum engage in a friendly debate. The group votes on the most convincing argument.</p>
<section>
<h2>💡 Tips</h2>
<ul>
<li>--</li>
</ul>
</section>
<h3>Speed Round</h3>
<p>Generate 5 spectrums. Players have only 10 seconds to plot each position. Quick thinking required!</p>
</section>
<section>
<h2>📏 Understanding the Scale</h2>
<p>Each axis uses a 1-10 scale:</p>
<ul>
<li><strong>1-2:</strong> Strongly aligned with left/bottom option</li>
<li><strong>3-4:</strong> Prefer left/bottom, but not extremely</li>
<li><strong>5-6:</strong> Slightly prefer right/top</li>
<li><strong>7-8:</strong> Prefer right/top, but not extremely</li>
<li><strong>9-10:</strong> Strongly aligned with right/top option</li>
</ul>
<p><em>Note: You can land anywhere on the spectrum, including exactly in the middle!</em></p>
</section>
<section>
<h2>🏆 Scoring (Optional)</h2>
<p>Want to make it competitive? Try these scoring systems:</p>
<ul>
<li><strong>Uniqueness Points:</strong> Award 1 point to the player whose position is most different from others</li>
<li><strong>Prediction Points:</strong> 3 points for exact predictions, 1 point for being within 2 units on both axes</li>
<li><strong>Debate Points:</strong> Winner of each debate gets 2 points</li>
<li><strong>Dice Challenge:</strong> 3 points for successfully defending a random position</li>
</ul>
<p>First to 15 points wins!</p>
</section>
<section>
<h2>🔞 Adult Mode</h2>
<p>Toggle Adult Mode to include spectrums about:</p>
<ul>
<li>Relationships and dating</li>
<li>Social drinking and nightlife</li>
<li>Personal boundaries</li>
<li>Other mature topics</li>
</ul>
<p><strong>Adult Mode is intended for players 18+ only.</strong> Make sure everyone is comfortable before enabling it.</p>
</section>
<section>
<h2>💡 Pro Tips</h2>
<ul>
<li><strong>Be honest:</strong> The game is most fun when people share their real preferences</li>
<li><strong>Ask questions:</strong> Don't just see where people land—ask them why!</li>
<li><strong>No judgment:</strong> Remember, these are preferences, not right or wrong answers</li>
<li><strong>Embrace extremes:</strong> Landing at 1 or 10 often leads to the best discussions</li>
<li><strong>Change your mind:</strong> It's okay to revise your position after hearing others' perspectives</li>
<li><strong>Keep it light:</strong> Even in debate mode, keep things fun and friendly</li>
</ul>
</section>
<section>
<h2>🎨 About Themes</h2>
<p>Choose from six visual themes to customize your experience:</p>
<ul>
<li><strong>Windows 95:</strong> Nostalgic retro computing vibes</li>
<li><strong>Cyberpunk:</strong> Neon-soaked futuristic aesthetic</li>
<li><strong>Typewriter:</strong> Classic vintage paper look</li>
<li><strong>Nightmare:</strong> Dark and spooky atmosphere</li>
<li><strong>Vaporwave:</strong> Dreamy 80s-90s nostalgia</li>
<li><strong>Nintendo:</strong> Bold and playful gaming style</li>
</ul>
<p>Themes are purely cosmetic—pick what speaks to your vibe!</p>
</section>
<section>
<h2>❓ FAQ</h2>
<p><strong>Can I play solo?</strong><br>
While designed for groups, you can use it for self-reflection or to prep for game night!</p>
<p><strong>How many spectrums are there?</strong><br>
Hundreds! The X and Y axes are randomly combined, creating thousands of possible spectrums.</p>
<p><strong>What if I'm perfectly neutral?</strong><br>
Mark yourself at 5 or 6 on that axis. True neutrality is rare and interesting!</p>
<p><strong>Can we make our own rules?</strong><br>
Absolutely! These are guidelines. House rules are encouraged!</p>
</section>
</div>
</div>
</div>
</div>
</div>
<style>
.rules-container {
.rules-wrapper {
min-height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
display: flex;
align-items: center;
justify-content: center;
padding: 40px 20px;
}
.rules-content {
max-width: 800px;
margin: 0 auto;
background: white;
border-radius: 20px;
padding: 40px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);
.rules-container {
width: 100%;
max-width: 900px;
}
.title-bar {
display: flex;
align-items: center;
gap: 15px;
}
.back-button {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
border: none;
border-radius: 8px;
padding: 10px 20px;
font-size: 16px;
padding: 5px 15px;
cursor: pointer;
margin-bottom: 30px;
transition: transform 0.2s;
border-radius: 4px;
text-decoration: none;
color: inherit;
font-weight: bold;
transition: all 0.2s;
}
.back-button:hover {
transform: translateY(-2px);
.rules-content {
padding: 20px 0;
}
h1 {
color: #333;
font-size: 2.5rem;
margin-bottom: 30px;
text-align: center;
}
h2 {
color: #667eea;
font-size: 1.8rem;
margin-top: 30px;
margin-bottom: 15px;
}
h3 {
color: #764ba2;
font-size: 1.3rem;
margin-top: 20px;
margin-bottom: 10px;
@@ -110,13 +205,11 @@
}
p {
color: #555;
line-height: 1.6;
margin-bottom: 10px;
}
ol, ul {
color: #555;
line-height: 1.8;
padding-left: 25px;
}
@@ -126,11 +219,15 @@
}
strong {
color: #333;
font-weight: bold;
}
em {
font-style: italic;
}
@media (max-width: 768px) {
.rules-content {
.rules-wrapper {
padding: 20px;
}