Updated all the components to have relative (rem) dimensions

Updated a few of the theme files to have the correct layout.
If you wanna go thru and update the rest to match win95 and cyberpunk
Updated the theme stuff to apply site wide.
gotta update the home page and the rules to be same style
This commit is contained in:
2025-12-09 01:13:11 -06:00
parent 06c157d4af
commit 55f4cfaeef
13 changed files with 340 additions and 318 deletions

View File

@@ -3,7 +3,7 @@
</script> </script>
<div class="chart-display"> <div class="chart-display">
{#if chart} {#if chart.x != ''}
<div class="axis"> <div class="axis">
<div class="axis-label">X-Axis (Horizontal)</div> <div class="axis-label">X-Axis (Horizontal)</div>
<div>{chart.x[0]}{chart.x[1]}</div> <div>{chart.x[0]}{chart.x[1]}</div>
@@ -13,36 +13,41 @@
<div>{chart.y[0]}{chart.y[1]}</div> <div>{chart.y[0]}{chart.y[1]}</div>
</div> </div>
{:else} {:else}
<div class="empty-state">Click Generate!</div> <p class="empty-state">Click Generate!</p>
{/if} {/if}
</div> </div>
<style> <style>
.chart-display { .chart-display {
padding: 20px; padding: 1.5rem;
min-height: 120px; min-height: 7rem;
margin: 15px 0; display: flex;
gap: 1rem;
align-items: center;
justify-content: center;
} }
.axis { .axis {
margin: 10px 0; margin: 0.25rem 0;
padding: 10px; padding: 1rem;
border: 1px solid currentColor; border: 1px solid currentColor;
opacity: 0.9; opacity: 0.9;
display: flex;
flex-direction: column;
gap: 0.25rem;
} }
.axis-label { .axis-label {
font-weight: bold; font-weight: bold;
margin-bottom: 5px; font-size: 0.675rem;
font-size: 11px;
text-transform: uppercase; text-transform: uppercase;
} }
.empty-state { .empty-state {
font-style: italic; font-style: italic;
text-align: center; text-align: center;
padding: 20px;
opacity: 0.7; opacity: 0.7;
margin: auto;
} }
</style> </style>

View File

@@ -1,71 +1,43 @@
<script> <script>
export let roll; export let diceRoll;
</script> </script>
<div class="dice-display"> <div class="dice-display">
{#if roll} {#if diceRoll.x != 0}
<div class="dice-emoji">🎲 🎲</div> <div class="dice-emoji">🎲 🎲</div>
<div class="dice-result">X: {roll.x} | Y: {roll.y}</div> <div class="dice-result">X: {diceRoll.x} | Y: {diceRoll.y}</div>
{:else} {:else}
<div class="empty-state">Click Roll!</div> <div class="empty-state">Click Roll!</div>
{/if} {/if}
</div> </div>
<style> <style>
.dice-display { .dice-display {
padding: 20px; padding: 1.5rem;
min-height: 120px; min-height: 7rem;
margin: 15px 0; display: flex;
} flex-direction: column;
gap: 1rem;
align-items: center;
justify-content: center;
}
.theme-win95 .dice-display { .dice-emoji {
background: white; font-size: 3rem;
border: 2px inset #808080; text-align: center;
} }
.theme-cyberpunk .dice-display { .dice-result {
background: rgba(0, 255, 255, 0.05); font-size: 2rem;
border: 1px solid #00ffff; font-weight: bold;
} text-align: center;
}
.theme-typewriter .dice-display { .empty-state {
background: #fffef7; font-style: italic;
border: 1px solid #2c2416; text-align: center;
} opacity: 0.7;
margin: auto;
.theme-nightmare .dice-display { }
background: #000000;
border: 2px solid #8b0000;
}
.theme-vaporwave .dice-display {
background: rgba(255, 255, 255, 0.15);
border: 2px solid #ff6ad5;
}
.theme-nintendo .dice-display {
background: #fff;
border: 3px solid #00a3e0;
border-radius: 10px;
color: #484848;
}
.dice-emoji {
font-size: 48px;
text-align: center;
}
.dice-result {
font-size: 28px;
font-weight: bold;
margin-top: 10px;
text-align: center;
}
.empty-state {
font-style: italic;
text-align: center;
padding: 20px;
opacity: 0.7;
}
</style> </style>

View File

@@ -4,20 +4,29 @@
const themes = ['win95', 'cyberpunk', 'typewriter', 'nightmare', 'vaporwave', 'nintendo']; const themes = ['win95', 'cyberpunk', 'typewriter', 'nightmare', 'vaporwave', 'nintendo'];
</script> </script>
<div class="button-row"> <fieldset>
{#each themes as theme} <legend>Theme Selector</legend>
<button on:click={() => (currentTheme = theme)} class:active={currentTheme === theme}>
{theme.charAt(0).toUpperCase()} <div class="button-row">
</button> {#each themes as theme}
{/each} <button on:click={() => (currentTheme = theme)} class:active={currentTheme === theme}>
</div> {theme.charAt(0).toUpperCase()}
</button>
{/each}
</div>
</fieldset>
<style> <style>
fieldset {
display: inline-flex;
margin: 0 1rem 0 auto;
}
.button-row { .button-row {
display: flex; display: flex;
gap: 10px; gap: 1rem;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
margin-top: 10px; align-items: center;
} }
</style> </style>

View File

@@ -1,48 +1,52 @@
/* Cyberpunk Theme */ /* Cyberpunk Theme */
:global(.theme-cyberpunk) { :global{
font-family: 'Courier New', monospace; body:has(.theme-cyberpunk){
background: #0a0e27; background: #0a0e27;
color: #00ffff;
}
:global(.theme-cyberpunk .window){
background: rgba(10, 14, 39, 0.95);
border: 2px solid #00ffff;
box-shadow: 0 0 20px #ff00ff;
}
:global(.theme-cyberpunk .title-bar ){
background: linear-gradient(90deg, #ff00ff, #00ffff);
color: #000;
padding: 12px;
font-weight: bold;
text-transform: uppercase;
}
:global(.theme-cyberpunk fieldset ){
border: 1px solid #ff00ff;
}
:global(.theme-cyberpunk legend ){
color: #ff00ff;
text-transform: uppercase;
}
:global(.theme-cyberpunk button ){
background: transparent;
border: 2px solid #ff00ff;
color: #ff00ff;
font-family: 'Courier New', monospace;
text-transform: uppercase;
padding: 10px 25px;
}
:global(.theme-cyberpunk button:hover ){
background: #ff00ff;
color: #000;
}
:global(.theme-cyberpunk .chart-display) {
background: rgba(0, 255, 255, 0.05);
border: 1px solid #00ffff;
} }
.theme-cyberpunk {
font-family: 'Courier New', monospace;
background: #0a0e27;
color: #00ffff;
.dice-display {
background: rgba(0, 255, 255, 0.05);
border: 1px solid #00ffff;
}
.window{
background: rgba(10, 14, 39, 0.95);
border: 2px solid #00ffff;
box-shadow: 0 0 20px #ff00ff;
}
.title-bar {
background: linear-gradient(90deg, #ff00ff, #00ffff);
color: #000;
padding: 12px;
font-weight: bold;
text-transform: uppercase;
}
fieldset {
border: 1px solid #ff00ff;
}
legend {
color: #ff00ff;
text-transform: uppercase;
}
button {
background: transparent;
border: 2px solid #ff00ff;
color: #ff00ff;
font-family: 'Courier New', monospace;
text-transform: uppercase;
padding: 10px 25px;
&:hover {
background: #ff00ff;
color: #000;
}
}
.chart-display {
background: rgba(0, 255, 255, 0.05);
border: 1px solid #00ffff;
}
}
}

View File

@@ -47,4 +47,10 @@
background: #000000; background: #000000;
border: 2px solid #8b0000; border: 2px solid #8b0000;
} }
:global{
.theme-nightmare .dice-display {
background: #000000;
border: 2px solid #8b0000;
}
}

View File

@@ -61,3 +61,12 @@
border-radius: 10px; border-radius: 10px;
color: #484848; color: #484848;
} }
:global{
.theme-nintendo .dice-display {
background: #fff;
border: 3px solid #00a3e0;
border-radius: 10px;
color: #484848;
}
}

View File

@@ -34,4 +34,10 @@
background: #fffef7; background: #fffef7;
border: 1px solid #2c2416; border: 1px solid #2c2416;
} }
:global{
.theme-typewriter .dice-display {
background: #fffef7;
border: 1px solid #2c2416;
}
}

View File

@@ -43,4 +43,10 @@
background: rgba(255, 255, 255, 0.15); background: rgba(255, 255, 255, 0.15);
border: 2px solid #ff6ad5; border: 2px solid #ff6ad5;
} }
:global{
.theme-vaporwave .dice-display {
background: rgba(255, 255, 255, 0.15);
border: 2px solid #ff6ad5;
}
}

View File

@@ -1,39 +1,48 @@
/* Windows 95 Theme */ /* Windows 95 Theme */
:global(.theme-win95 ){ :global{
font-family: 'MS Sans Serif', Arial, sans-serif; body:has(.theme-win95){
background: #008080; background: #008080;
}
:global(.theme-win95 .window) {
background: #c0c0c0;
border: 2px solid;
border-color: #dfdfdf #808080 #808080 #dfdfdf;
box-shadow: 2px 2px 0 rgba(0,0,0,0.5);
}
:global(.theme-win95 .title-bar ){
background: linear-gradient(to right, #000080, #1084d0);
color: white;
padding: 8px;
font-weight: bold;
}
:global(.theme-win95 fieldset ){
border: 2px groove #c0c0c0;
}
:global(.theme-win95 button ){
background: #c0c0c0;
border: 2px solid;
border-color: #ffffff #000000 #000000 #ffffff;
font-family: 'MS Sans Serif', Arial, sans-serif;
}
:global(.theme-win95 button:active) {
border-color: #000000 #ffffff #ffffff #000000;
}
:global(.theme-win95 .chart-display) {
background: white;
border: 2px inset #808080;
} }
.theme-win95 {
font-family: 'MS Sans Serif', Arial, sans-serif;
background: #008080;
color: black;
.dice-display {
background: white;
border: 2px inset #808080;
}
.window{
background: #c0c0c0;
border: 2px solid;
border-color: #dfdfdf #808080 #808080 #dfdfdf;
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;
}
fieldset {
border: 2px groove #c0c0c0;
}
button {
background: #c0c0c0;
border: 2px solid;
border-color: #ffffff #000000 #000000 #ffffff;
font-family: 'MS Sans Serif', Arial, sans-serif;
&:active {
border-color: #000000 #ffffff #ffffff #000000;
}
}
.chart-display {
background: white;
border: 2px inset #808080;
}
}
}

View File

@@ -10,17 +10,16 @@
<link rel="icon" href={favicon} /> <link rel="icon" href={favicon} />
</svelte:head> </svelte:head>
<nav class="titlebar theme-{currentTheme}"> <!-- <svelte:body class="theme-{currentTheme}" /> -->
<nav class="title-bar theme-{currentTheme}">
<h1><a href="/">On the Spectrum</a></h1> <h1><a href="/">On the Spectrum</a></h1>
<ul> <ul>
<li><a href="play">Play</a></li> <li><a href="play">Play</a></li>
<li><a href="rules">Rules</a></li> <li><a href="rules">Rules</a></li>
<li><a href="submit">Submit</a></li> <li><a href="submit">Submit</a></li>
</ul> </ul>
<fieldset> <ThemeSelector bind:currentTheme />
<legend>Theme Selector</legend>
<ThemeSelector bind:currentTheme />
</fieldset>
</nav> </nav>
<section class="theme-{currentTheme}"> <section class="theme-{currentTheme}">
@@ -37,59 +36,24 @@
:global(body) { :global(body) {
margin: 0; margin: 0;
padding: 0; height: 100vh;
}
:global(.container) {
padding: 20px;
min-height: 100vh;
}
:global(.window) {
max-width: 800px;
margin: 0 auto;
}
:global(.window-body) {
padding: 20px;
}
:global(fieldset) {
padding: 15px;
margin: 15px 0;
}
:global(legend) {
font-weight: bold;
padding: 0 5px;
}
:global(.button-row) {
display: flex;
gap: 10px;
justify-content: center;
margin-top: 10px;
}
:global(button) {
padding: 8px 24px;
cursor: pointer;
font-weight: bold;
} }
nav { nav {
display: inline-flex; display: inline-flex;
width: 100vw;
a { a {
text-decoration: none; text-decoration: none;
color: black;
font-weight: 600; font-weight: 600;
&:visited {
color: inherit;
}
&:hover { &:hover {
color: oklch(0.6 0.186 25); color: oklch(0.6 0.186 25);
} }
} }
ul { ul {
list-style: none; list-style: none;
padding: none;
display: inline-flex; display: inline-flex;
gap: 1rem; gap: 1rem;
align-items: end; align-items: end;

View File

@@ -1,111 +1,108 @@
<script lang="ts"> <script lang="ts">
import { goto } from '$app/navigation';
function navigate(page: string) {
goto(`/${page}`);
}
</script> </script>
<div class="home-container"> <div class="home-container">
<div class="home-content"> <div class="home-content">
<h1 class="title">On the Spectrum!</h1> <h1 class="title">On the Spectrum!</h1>
<p class="subtitle">Well...are ya?</p> <p class="subtitle">Well...are ya?</p>
<div class="tabs"> <div class="tabs">
<button class="tab-button" on:click={() => navigate('play')}> <a href="/play" class="tab-button">
<span class="tab-icon">🎮</span> <span class="tab-icon">🎮</span>
<span>Play</span> <span>Play</span>
</button> </a>
<button class="tab-button" on:click={() => navigate('rules')}> <a href="/rules" class="tab-button">
<span class="tab-icon">📖</span> <span class="tab-icon">📖</span>
<span>Rules</span> <span>Rules</span>
</button> </a>
</div> </div>
</div> </div>
</div> </div>
<style> <style>
.home-container { .home-container {
min-height: 100vh; min-height: 100vh;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
padding: 20px; padding: 20px;
} }
.home-content { .home-content {
text-align: center; text-align: center;
max-width: 600px; max-width: 600px;
width: 100%; width: 100%;
} }
.title { .title {
font-size: 3.5rem; font-size: 3.5rem;
font-weight: bold; font-weight: bold;
color: white; color: white;
margin-bottom: 1rem; margin-bottom: 1rem;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3); text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
line-height: 1.2; line-height: 1.2;
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.title { .title {
font-size: 2.5rem; font-size: 2.5rem;
} }
} }
.subtitle { .subtitle {
font-size: 1.5rem; font-size: 1.5rem;
color: rgba(255, 255, 255, 0.9); color: rgba(255, 255, 255, 0.9);
margin-bottom: 3rem; margin-bottom: 3rem;
text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2); text-shadow: 1px 1px 2px rgba(0, 0, 0, 0.2);
} }
.tabs { .tabs {
display: flex; display: flex;
gap: 20px; gap: 20px;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
} }
.tab-button { .tab-button {
background: white; text-decoration: none;
border: none; background: white;
border-radius: 15px; border: none;
padding: 30px 50px; border-radius: 15px;
font-size: 1.5rem; padding: 30px 50px;
font-weight: bold; font-size: 1.5rem;
cursor: pointer; font-weight: bold;
transition: all 0.3s ease; cursor: pointer;
box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); transition: all 0.3s ease;
display: flex; box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2);
flex-direction: column; display: flex;
align-items: center; flex-direction: column;
gap: 10px; align-items: center;
min-width: 200px; gap: 10px;
} min-width: 200px;
}
.tab-button:hover { .tab-button:hover {
transform: translateY(-5px); transform: translateY(-5px);
box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3); box-shadow: 0 8px 25px rgba(0, 0, 0, 0.3);
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white; color: white;
} }
.tab-icon { .tab-icon {
font-size: 3rem; font-size: 3rem;
} }
@media (max-width: 768px) { @media (max-width: 768px) {
.tab-button { .tab-button {
padding: 20px 40px; padding: 20px 40px;
font-size: 1.2rem; font-size: 1.2rem;
min-width: 150px; min-width: 150px;
} }
.tab-icon { .tab-icon {
font-size: 2rem; font-size: 2rem;
} }
} }
</style> </style>

View File

@@ -3,7 +3,6 @@
import ChartDisplay from '$components/chartDisplay.svelte'; import ChartDisplay from '$components/chartDisplay.svelte';
import DiceRoller from '$components/diceRoller.svelte'; import DiceRoller from '$components/diceRoller.svelte';
let { data } = $props();
let adultMode = $state(false); let adultMode = $state(false);
let currentChart = $state({ x: [''], y: [''] }); let currentChart = $state({ x: [''], y: [''] });
let diceRoll = $state({ x: 0, y: 0 }); let diceRoll = $state({ x: 0, y: 0 });
@@ -29,24 +28,60 @@
} }
</script> </script>
<div class="container theme-{data.currentTheme}"> <div class="container">
<div class="window"> <div class="window">
<div class="window-body"> <fieldset>
<fieldset> <legend>Chart Generator</legend>
<legend>Chart Generator</legend> <ChartDisplay chart={currentChart} />
<ChartDisplay chart={currentChart} /> <div class="button-row">
<div class="button-row"> <button onclick={generateChart}>Generate</button>
<button onclick={generateChart}>Generate</button> </div>
</div> </fieldset>
</fieldset>
<fieldset> <fieldset>
<legend>Position Roller</legend> <legend>Position Roller</legend>
<DiceRoller roll={diceRoll} /> <DiceRoller {diceRoll} />
<div class="button-row"> <div class="button-row">
<button onclick={rollDice}>Roll Dice</button> <button onclick={rollDice}>Roll Dice</button>
</div> </div>
</fieldset> </fieldset>
</div>
</div> </div>
</div> </div>
<style>
.container {
margin: 2rem;
}
.window {
max-width: 60rem;
margin: 0 auto;
padding: 1.5rem;
display: flex;
flex-direction: column;
gap: 1rem;
}
fieldset {
padding: 1.25rem;
margin: 0;
}
legend {
font-weight: bold;
padding: 0 0.5rem;
}
.button-row {
display: flex;
gap: 10px;
justify-content: center;
margin-top: 10px;
}
button {
padding: 0.5rem 1.75rem;
cursor: pointer;
font-weight: bold;
}
</style>