Added routs/Lib Components and assets.

This commit is contained in:
Giac
2025-12-08 20:45:05 -06:00
parent 250cad6dab
commit 9d06bd7610
13 changed files with 1193 additions and 70 deletions

View File

@@ -1,72 +1,376 @@
<script>
let { data } = $props();
import { goto } from '$app/navigation';
import { xAxes } from '$lib/data/xAxes.js';
import { yAxes } from '$lib/data/yAxes.js';
import ChartDisplay from '$lib/components/chartDisplay.svelte';
import DiceRoller from '$lib/components/diceRoller.svelte';
import ThemeSelector from '$lib/components/themeSelector.svelte';
import Toggle from '$lib/components/toggle.svelte';
let mode = $state('adult');
let axes = $state({ x: [''], y: [''], empty: true });
let position = $state({ x: 0, y: 0 });
function generateAxes() {
// pull Axes in from data using a database
axes = { x: ['Spicy', 'Mild'], y: ['Expensive', 'Cheap'], empty: false };
}
function rollPosition() {
function rollD10() {
return Math.floor(Math.random() * 10) + 1;
}
position = { x: rollD10(), y: rollD10() };
}
let currentTheme = 'win95';
let adultMode = false;
let currentChart = null;
let diceRoll = null;
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
};
}
function rollDice() {
diceRoll = {
x: Math.floor(Math.random() * 10) + 1,
y: Math.floor(Math.random() * 10) + 1
};
}
function goHome() {
goto('/');
}
</script>
<div>
<h2>On the Spectrum</h2>
<fieldset>
<legend>Adult Mode (18+)</legend>
<div>
<label>
<span>Adult</span>
<input bind:group={mode} type="radio" value="adult" />
</label>
<label>
<span>Family Friendly</span>
<input bind:group={mode} type="radio" value="family" />
</label>
</div>
</fieldset>
<fieldset>
<legend>Axes Generator</legend>
{#if axes.empty}
<div>
<h3>Click Generate!</h3>
</div>
{:else}
<div>
<div>
<h4>X-Axis</h4>
<p>{axes.x[0]}{axes.x[1]}</p>
</div>
<div>
<h4>Y-Axis</h4>
<p>{axes.y[0]}{axes.y[1]}</p>
</div>
</div>
{/if}
<div>
<button onclick={generateAxes}>Generate</button>
</div>
</fieldset>
<fieldset>
<legend>Position Roller</legend>
{#if position.x == 0}
<div>
<h3>Click Roll!</h3>
</div>
{:else}
<div>
<h4>Position</h4>
<p>X:{position.x} | Y:{position.y}</p>
</div>
{/if}
<div>
<button onclick={rollPosition}>Generate</button>
</div>
</fieldset>
<div class="container theme-{currentTheme}">
<div class="window">
<div class="title-bar">
<button class="home-button" on:click={goHome}> Home</button>
<span>On the Spectrum - Party Game</span>
</div>
<div class="window-body">
<fieldset>
<legend>Theme Selector</legend>
<ThemeSelector bind:currentTheme />
</fieldset>
<fieldset>
<legend>Adult Mode (18+)</legend>
<Toggle bind:checked={adultMode} />
</fieldset>
<fieldset>
<legend>Chart Generator</legend>
<ChartDisplay chart={currentChart} />
<div class="button-row">
<button on:click={generateChart}>Generate</button>
</div>
</fieldset>
<fieldset>
<legend>Position Roller</legend>
<DiceRoller roll={diceRoll} />
<div class="button-row">
<button on:click={rollDice}>Roll Dice</button>
</div>
</fieldset>
</div>
</div>
</div>
<style>
:global(body) {
margin: 0;
padding: 0;
}
.container {
padding: 20px;
min-height: 100vh;
}
.window {
max-width: 800px;
margin: 0 auto;
}
.window-body {
padding: 20px;
}
fieldset {
padding: 15px;
margin: 15px 0;
}
legend {
font-weight: bold;
padding: 0 5px;
}
.button-row {
display: flex;
gap: 10px;
justify-content: center;
margin-top: 10px;
}
button {
padding: 8px 24px;
cursor: pointer;
font-weight: bold;
}
/* Windows 95 Theme */
.theme-win95 {
font-family: 'MS Sans Serif', Arial, sans-serif;
background: #008080;
}
.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);
}
.theme-win95 .title-bar {
background: linear-gradient(to right, #000080, #1084d0);
color: white;
padding: 8px;
font-weight: bold;
}
.theme-win95 fieldset {
border: 2px groove #c0c0c0;
}
.theme-win95 button {
background: #c0c0c0;
border: 2px solid;
border-color: #ffffff #000000 #000000 #ffffff;
font-family: 'MS Sans Serif', Arial, sans-serif;
}
.theme-win95 button:active {
border-color: #000000 #ffffff #ffffff #000000;
}
/* Cyberpunk Theme */
.theme-cyberpunk {
font-family: 'Courier New', monospace;
background: #0a0e27;
color: #00ffff;
}
.theme-cyberpunk .window {
background: rgba(10, 14, 39, 0.95);
border: 2px solid #00ffff;
box-shadow: 0 0 20px #ff00ff;
}
.theme-cyberpunk .title-bar {
background: linear-gradient(90deg, #ff00ff, #00ffff);
color: #000;
padding: 12px;
font-weight: bold;
text-transform: uppercase;
}
.theme-cyberpunk fieldset {
border: 1px solid #ff00ff;
}
.theme-cyberpunk legend {
color: #ff00ff;
text-transform: uppercase;
}
.theme-cyberpunk button {
background: transparent;
border: 2px solid #ff00ff;
color: #ff00ff;
font-family: 'Courier New', monospace;
text-transform: uppercase;
padding: 10px 25px;
}
.theme-cyberpunk button:hover {
background: #ff00ff;
color: #000;
}
/* Typewriter Theme */
.theme-typewriter {
font-family: 'Courier', monospace;
background: #f4e8d0;
color: #2c2416;
}
.theme-typewriter .window {
background: #fffef7;
border: 3px double #2c2416;
box-shadow: 5px 5px 15px rgba(0,0,0,0.3);
}
.theme-typewriter .title-bar {
background: #2c2416;
color: #f4e8d0;
padding: 12px;
text-align: center;
text-transform: uppercase;
letter-spacing: 3px;
}
.theme-typewriter fieldset {
border: 2px solid #2c2416;
}
.theme-typewriter button {
background: #2c2416;
border: 2px solid #2c2416;
color: #f4e8d0;
font-family: 'Courier', monospace;
}
/* Nightmare Theme */
.theme-nightmare {
font-family: 'Georgia', serif;
background: #000000;
color: #8b0000;
}
.theme-nightmare .window {
background: #0d0000;
border: 3px solid #8b0000;
box-shadow: 0 0 30px #ff0000;
}
.theme-nightmare .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;
}
.theme-nightmare fieldset {
border: 2px solid #8b0000;
}
.theme-nightmare legend {
color: #ff0000;
text-shadow: 0 0 5px #ff0000;
}
.theme-nightmare button {
background: #3a0000;
border: 2px solid #8b0000;
color: #ff0000;
font-family: 'Georgia', serif;
text-transform: uppercase;
padding: 10px 25px;
}
.theme-nightmare button:hover {
background: #8b0000;
}
/* Vaporwave Theme */
.theme-vaporwave {
font-family: 'Arial', sans-serif;
background: linear-gradient(180deg, #ff6ad5 0%, #c774e8 50%, #ad8cff 100%);
color: #fff;
}
.theme-vaporwave .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 .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 fieldset {
border: 2px solid #00f0ff;
background: rgba(255, 255, 255, 0.1);
}
.theme-vaporwave legend {
color: #00f0ff;
text-transform: uppercase;
}
.theme-vaporwave button {
background: linear-gradient(135deg, #ff6ad5, #c774e8);
border: 2px solid #00f0ff;
color: #fff;
text-transform: uppercase;
padding: 12px 30px;
}
/* Nintendo Theme */
.theme-nintendo {
font-family: 'Arial', sans-serif;
background: #e60012;
color: #fff;
}
.theme-nintendo .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 .title-bar {
background: #e60012;
color: #fff;
padding: 20px;
text-align: center;
font-weight: bold;
font-size: 24px;
letter-spacing: 2px;
}
.theme-nintendo .window-body {
color: #484848;
}
.theme-nintendo fieldset {
border: 3px solid #e60012;
border-radius: 15px;
background: #f7f7f7;
}
.theme-nintendo legend {
color: #e60012;
}
.theme-nintendo button {
background: #e60012;
border: none;
border-radius: 25px;
color: #fff;
text-transform: uppercase;
padding: 12px 30px;
box-shadow: 0 4px 0 #a00009;
}
.theme-nintendo button:hover {
background: #ff0018;
}
.theme-nintendo button:active {
box-shadow: 0 2px 0 #a00009;
transform: translateY(2px);
}
</style>