Compare commits

...

10 Commits

Author SHA1 Message Date
4282c80a34 Adding themes to the selector, there might be a way to do this without
duplicating buttons but i couldnt figure out the cascade

Also added a favicon this should be able to be themed i haven't tried

removed chartDisplay and diceRoller as they are not used anymore

renamed generator to gameboard

updated the logic in the gameboard to use .empty instead of the numbers
it is easier to read
2025-12-15 22:49:17 -06:00
9cd2a59039 added the themes to the theme selector so you can preview it 2025-12-15 21:33:58 -06:00
Giac
85a51a1fda Added Chalkboard and Classroom themes
Combined DicerRoller and Chart
Centered Title
Standardized UI Sizes across themes.
2025-12-14 15:52:16 -06:00
f161d4f5c0 Should be updating a bunch of the CSS to have some better mobile UX 2025-12-09 20:10:50 -06:00
Giac
216c53aade rules 2025-12-09 17:15:27 -06:00
Giac
551a2ff325 Build folder 2025-12-09 16:14:15 -06:00
Giac
50138d6b8b Moved themes from diceRoller 2025-12-09 15:47:41 -06:00
Giac
4aa3f27131 -5 to 5 2025-12-09 15:03:11 -06:00
Giac
a95e085b23 SVG overflow: visible; 2025-12-09 14:06:09 -06:00
Giac
427d58d61d Fixed chart to use 2d10 2025-12-09 13:51:30 -06:00
28 changed files with 2940 additions and 1073 deletions

1
.gitignore vendored
View File

@@ -7,6 +7,7 @@ node_modules
.wrangler .wrangler
/.svelte-kit /.svelte-kit
/build /build
*.zip
# OS # OS
.DS_Store .DS_Store

View File

@@ -1,11 +1,11 @@
{ {
"lockfileVersion": 1, "lockfileVersion": 1,
"configVersion": 0,
"workspaces": { "workspaces": {
"": { "": {
"name": "on-the-spectrum", "name": "on-the-spectrum",
"devDependencies": { "devDependencies": {
"@sveltejs/adapter-auto": "^7.0.0", "@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.48.5", "@sveltejs/kit": "^2.48.5",
"@sveltejs/vite-plugin-svelte": "^6.2.1", "@sveltejs/vite-plugin-svelte": "^6.2.1",
"prettier": "^3.6.2", "prettier": "^3.6.2",
@@ -132,6 +132,8 @@
"@sveltejs/adapter-auto": ["@sveltejs/adapter-auto@7.0.0", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw=="], "@sveltejs/adapter-auto": ["@sveltejs/adapter-auto@7.0.0", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-ImDWaErTOCkRS4Gt+5gZuymKFBobnhChXUZ9lhUZLahUgvA4OOvRzi3sahzYgbxGj5nkA6OV0GAW378+dl/gyw=="],
"@sveltejs/adapter-static": ["@sveltejs/adapter-static@3.0.10", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew=="],
"@sveltejs/kit": ["@sveltejs/kit@2.49.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.3.2", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["@opentelemetry/api"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-vByReCTTdlNM80vva8alAQC80HcOiHLkd8XAxIiKghKSHcqeNfyhp3VsYAV8VSiPKu4Jc8wWCfsZNAIvd1uCqA=="], "@sveltejs/kit": ["@sveltejs/kit@2.49.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.3.2", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0" }, "optionalPeers": ["@opentelemetry/api"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-vByReCTTdlNM80vva8alAQC80HcOiHLkd8XAxIiKghKSHcqeNfyhp3VsYAV8VSiPKu4Jc8wWCfsZNAIvd1uCqA=="],
"@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.2.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ=="], "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@6.2.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^5.0.0", "debug": "^4.4.1", "deepmerge": "^4.3.1", "magic-string": "^0.30.17", "vitefu": "^1.1.1" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.3.0 || ^7.0.0" } }, "sha512-YZs/OSKOQAQCnJvM/P+F1URotNnYNeU3P2s4oIpzm1uFaqUEqRxUB0g5ejMjEb5Gjb9/PiBI5Ktrq4rUUF8UVQ=="],

1504
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -15,6 +15,7 @@
}, },
"devDependencies": { "devDependencies": {
"@sveltejs/adapter-auto": "^7.0.0", "@sveltejs/adapter-auto": "^7.0.0",
"@sveltejs/adapter-static": "^3.0.10",
"@sveltejs/kit": "^2.48.5", "@sveltejs/kit": "^2.48.5",
"@sveltejs/vite-plugin-svelte": "^6.2.1", "@sveltejs/vite-plugin-svelte": "^6.2.1",
"prettier": "^3.6.2", "prettier": "^3.6.2",

View File

@@ -1 +1,47 @@
<svg xmlns="http://www.w3.org/2000/svg" width="107" height="128" viewBox="0 0 107 128"><title>svelte-logo</title><path d="M94.157 22.819c-10.4-14.885-30.94-19.297-45.792-9.835L22.282 29.608A29.92 29.92 0 0 0 8.764 49.65a31.5 31.5 0 0 0 3.108 20.231 30 30 0 0 0-4.477 11.183 31.9 31.9 0 0 0 5.448 24.116c10.402 14.887 30.942 19.297 45.791 9.835l26.083-16.624A29.92 29.92 0 0 0 98.235 78.35a31.53 31.53 0 0 0-3.105-20.232 30 30 0 0 0 4.474-11.182 31.88 31.88 0 0 0-5.447-24.116" style="fill:#ff3e00"/><path d="M45.817 106.582a20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.503 18 18 0 0 1 .624-2.435l.49-1.498 1.337.981a33.6 33.6 0 0 0 10.203 5.098l.97.294-.09.968a5.85 5.85 0 0 0 1.052 3.878 6.24 6.24 0 0 0 6.695 2.485 5.8 5.8 0 0 0 1.603-.704L69.27 76.28a5.43 5.43 0 0 0 2.45-3.631 5.8 5.8 0 0 0-.987-4.371 6.24 6.24 0 0 0-6.698-2.487 5.7 5.7 0 0 0-1.6.704l-9.953 6.345a19 19 0 0 1-5.296 2.326 20.72 20.72 0 0 1-22.237-8.243 19.17 19.17 0 0 1-3.277-14.502 17.99 17.99 0 0 1 8.13-12.052l26.081-16.623a19 19 0 0 1 5.3-2.329 20.72 20.72 0 0 1 22.237 8.243 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-.624 2.435l-.49 1.498-1.337-.98a33.6 33.6 0 0 0-10.203-5.1l-.97-.294.09-.968a5.86 5.86 0 0 0-1.052-3.878 6.24 6.24 0 0 0-6.696-2.485 5.8 5.8 0 0 0-1.602.704L37.73 51.72a5.42 5.42 0 0 0-2.449 3.63 5.79 5.79 0 0 0 .986 4.372 6.24 6.24 0 0 0 6.698 2.486 5.8 5.8 0 0 0 1.602-.704l9.952-6.342a19 19 0 0 1 5.295-2.328 20.72 20.72 0 0 1 22.237 8.242 19.17 19.17 0 0 1 3.277 14.503 18 18 0 0 1-8.13 12.053l-26.081 16.622a19 19 0 0 1-5.3 2.328" style="fill:#fff"/></svg> <svg width="400" height="400" viewbox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
<!-- Axes -->
<line x1="50" y1="350" x2="350" y2="350" stroke="black" stroke-width="8" />
<!-- X-axis -->
<line x1="50" y1="350" x2="50" y2="50" stroke="black" stroke-width="8" />
<!-- Y-axis -->
<!-- Axis Labels -->
<text x="340" y="370" font-size="16" fill="black">x</text>
<text x="35" y="60" font-size="16" fill="black">y</text>
<!-- Tick Marks and Labels -->
<g font-size="12" fill="black">
<!-- X-axis ticks -->
<line x1="100" y1="345" x2="100" y2="355" stroke="black" />
<text x="95" y="370">1</text>
<line x1="150" y1="345" x2="150" y2="355" stroke="black" />
<text x="145" y="370">2</text>
<line x1="200" y1="345" x2="200" y2="355" stroke="black" />
<text x="195" y="370">3</text>
<line x1="250" y1="345" x2="250" y2="355" stroke="black" />
<text x="245" y="370">4</text>
<line x1="300" y1="345" x2="300" y2="355" stroke="black" />
<text x="295" y="370">5</text>
<!-- Y-axis ticks -->
<line x1="45" y1="300" x2="55" y2="300" stroke="black" />
<text x="60" y="305">1</text>
<line x1="45" y1="250" x2="55" y2="250" stroke="black" />
<text x="60" y="255">2</text>
<line x1="45" y1="200" x2="55" y2="200" stroke="black" />
<text x="60" y="205">3</text>
<line x1="45" y1="150" x2="55" y2="150" stroke="black" />
<text x="60" y="155">4</text>
<line x1="45" y1="100" x2="55" y2="100" stroke="black" />
<text x="60" y="105">5</text>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -1,20 +0,0 @@
<script>
export let chart;
console.log(chart, chart.x != [''], chart.x);
</script>
<div class="chart-display">
{#if chart.x.length > 1}
<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,102 +0,0 @@
<script>
export let roll;
</script>
<div class="dice-display">
{#if roll && roll.x && roll.y}
<div class="dice-result">X: {roll.x} | Y: {roll.y}</div>
<div class="chart-container">
<svg viewBox="0 0 240 240">
<!-- Grid -->
{#each {length: 11} as _, i}
<line x1={20 + i * 20} y1="20" x2={20 + i * 20} y2="220" stroke="currentColor" stroke-width="0.5" opacity="0.2" />
<line x1="20" y1={20 + i * 20} x2="220" y2={20 + i * 20} stroke="currentColor" stroke-width="0.5" opacity="0.2" />
{/each}
<!-- Axes -->
<line x1="20" y1="220" x2="220" y2="220" stroke="currentColor" stroke-width="2" />
<line x1="20" y1="20" x2="20" y2="220" stroke="currentColor" stroke-width="2" />
<!-- Quadrent lines -->
<line x1="20" y1="120" x2="220" y2="120" stroke="currentColor" stroke-width="2" />
<line x1="120" y1="20" x2="120" y2="220" stroke="currentColor" stroke-width="2" />
<!-- Numbers -->
{#each {length: 11} as _, i}
<text x={20 + i * 20} y="235" text-anchor="middle" font-size="10" fill="currentColor">{i}</text>
<text x="8" y={225 - i * 20} text-anchor="end" font-size="10" fill="currentColor">{i}</text>
{/each}
<!-- Crosshairs -->
<line
x1={20 + roll.x * 20}
y1="20"
x2={20 + roll.x * 20}
y2="220"
stroke="currentColor"
stroke-width="1"
stroke-dasharray="3,3"
opacity="0.4"
/>
<line
x1="20"
y1={220 - roll.y * 20}
x2="220"
y2={220 - roll.y * 20}
stroke="currentColor"
stroke-width="1"
stroke-dasharray="3,3"
opacity="0.4"
/>
<!-- Point -->
<circle
cx={20 + roll.x * 20}
cy={220 - roll.y * 20}
r="6"
class="point"
/>
</svg>
</div>
{:else}
<div class="empty-state">Click Roll!</div>
{/if}
</div>
<style>
.dice-result {
font-size: 28px;
font-weight: bold;
margin-top: 10px;
text-align: center;
margin-bottom: 20px;
}
.chart-container {
display: flex;
justify-content: center;
margin-top: 20px;
}
svg {
width: 100%;
max-width: 300px;
height: auto;
}
.point {
fill: currentColor;
stroke: none;
}
:global(.theme-cyberpunk) .point {
fill: #ff00ff;
filter: drop-shadow(0 0 8px #ff00ff);
}
:global(.theme-nightmare) .point {
fill: #ff0000;
filter: drop-shadow(0 0 10px #ff0000);
}
</style>

View File

@@ -0,0 +1,294 @@
<script>
export let chart;
export let roll;
console.log(chart);
</script>
<div class="unified-chart">
<div class="main-row">
<!-- Y-axis vertical on left -->
<div class="y-axis-container">
<div class="y-extreme" class:placeholder={chart.empty}>
{#if !chart.empty}
{chart.y[1]}
{:else}
(Top Value)
{/if}
</div>
<div class="y-arrow"></div>
<div class="y-extreme" class:placeholder={chart.empty}>
{#if !chart.empty}
{chart.y[0]}
{:else}
(Bottom Value)
{/if}
</div>
</div>
<!-- Chart -->
<div class="chart-wrapper">
<svg viewBox="0 20 220 235" class="chart-svg">
<!-- Grid -->
{#each { length: 9 } as _, i}
<line
x1={40 + i * 20}
y1="40"
x2={40 + i * 20}
y2="220"
stroke="currentColor"
stroke-width="0.5"
opacity="0.2"
/>
<line
x1="20"
y1={40 + i * 20}
x2="200"
y2={40 + i * 20}
stroke="currentColor"
stroke-width="0.5"
opacity="0.2"
/>
{/each}
<!-- Main Axes -->
<line x1="20" y1="220" x2="200" y2="220" stroke="currentColor" stroke-width="2" />
<line x1="20" y1="40" x2="20" y2="220" stroke="currentColor" stroke-width="2" />
<!-- Center lines (between 5 and 6) -->
<line
x1="20"
y1="130"
x2="200"
y2="130"
stroke="currentColor"
stroke-width="20"
opacity="0.2"
/>
<line
x1="110"
y1="40"
x2="110"
y2="220"
stroke="currentColor"
stroke-width="20"
opacity="0.2"
/>
<!-- Axis Numbers (1-10) -->
{#each { length: 10 } as _, i}
<text
x={20 + i * 20}
y="238"
text-anchor="middle"
font-size="10"
fill="currentColor"
opacity="0.6">{i + 1}</text
>
<text
x="10"
y={224 - i * 20}
text-anchor="end"
font-size="10"
fill="currentColor"
opacity="0.6">{i + 1}</text
>
{/each}
<!-- Crosshairs (only show when roll exists) -->
{#if !roll.empty}
<line
x1={20 + (roll.x - 1) * 20}
y1="40"
x2={20 + (roll.x - 1) * 20}
y2="220"
stroke="currentColor"
stroke-width="1"
stroke-dasharray="3,3"
opacity="0.4"
/>
<line
x1="20"
y1={220 - (roll.y - 1) * 20}
x2="200"
y2={220 - (roll.y - 1) * 20}
stroke="currentColor"
stroke-width="1"
stroke-dasharray="3,3"
opacity="0.4"
/>
<!-- Point -->
<circle cx={20 + (roll.x - 1) * 20} cy={220 - (roll.y - 1) * 20} r="6" class="point" />
{/if}
</svg>
</div>
</div>
<!-- X-axis horizontal below chart (always visible) -->
<div class="x-axis-container">
<div class="x-extreme" class:placeholder={chart.empty}>
{#if !chart.empty}
{chart.x[0]}
{:else}
(Left Value)
{/if}
</div>
<div class="x-arrow"></div>
<div class="x-extreme" class:placeholder={chart.empty}>
{#if !chart.empty}
{chart.x[1]}
{:else}
(Right Value)
{/if}
</div>
</div>
<!-- Coordinates Display (always visible) -->
<div class="coordinates" class:placeholder={roll.empty}>
{#if roll.empty}
(X, Y)
{:else}
({roll.x}, {roll.y})
{/if}
</div>
</div>
<style>
.unified-chart {
padding-bottom: 20px;
min-height: 120px;
display: flex;
flex-direction: column;
align-items: center;
gap: 15px;
}
.main-row {
display: flex;
align-items: center;
width: 100%;
justify-content: center;
}
.y-axis-container {
display: flex;
flex-direction: column;
align-items: center;
gap: 8px;
width: 150px;
flex-shrink: 0;
}
.y-extreme {
text-align: center;
font-weight: bold;
font-size: 14px;
line-height: 1.3;
word-wrap: break-word;
overflow-wrap: break-word;
hyphens: auto;
width: 100%;
}
.y-extreme.placeholder,
.x-extreme.placeholder {
opacity: 0.5;
font-style: italic;
font-weight: normal;
}
.y-arrow {
font-size: 28px;
opacity: 0.6;
flex-shrink: 0;
}
.x-axis-container {
display: flex;
align-items: center;
justify-content: center;
gap: 15px;
width: 100%;
max-width: 500px;
}
.x-extreme {
flex: 1;
text-align: center;
font-weight: bold;
font-size: 14px;
line-height: 1.3;
word-wrap: break-word;
overflow-wrap: break-word;
hyphens: auto;
}
.x-arrow {
font-size: 24px;
opacity: 0.6;
flex-shrink: 0;
}
.chart-wrapper {
display: flex;
justify-content: center;
flex: 0.9;
}
.chart-svg {
width: 100%;
max-width: 500px;
height: auto;
overflow: visible;
}
.coordinates {
font-size: 24px;
font-weight: bold;
text-align: center;
margin-top: 5px;
}
.coordinates.placeholder {
opacity: 0.5;
font-style: italic;
font-weight: normal;
}
.point {
fill: currentColor;
stroke: none;
}
@media (max-width: 768px) {
.main-row {
flex-direction: column;
gap: 10px;
}
.y-axis-container {
/* Keep vertical stacking on mobile */
width: 100%;
max-width: 500px;
}
.y-extreme {
width: 100%;
}
.y-extreme,
.x-extreme {
font-size: 12px;
}
.y-arrow,
.x-arrow {
font-size: 20px;
}
.coordinates {
font-size: 20px;
}
}
</style>

View File

@@ -5,7 +5,11 @@
<div class="button-row"> <div class="button-row">
{#each themeNames as theme} {#each themeNames as theme}
<button on:click={() => (currentTheme = theme)} class:active={currentTheme === theme}> <button
class="theme-{theme}"
on:click={() => (currentTheme = theme)}
class:active={currentTheme === theme}
>
{themeDisplayNames[theme]} {themeDisplayNames[theme]}
</button> </button>
{/each} {/each}
@@ -17,9 +21,126 @@
gap: 1rem; gap: 1rem;
justify-content: center; justify-content: center;
flex-wrap: wrap; flex-wrap: wrap;
button {
width: 45%;
}
}
.theme-chalkboard {
background: rgba(245, 245, 220, 0.15);
border-color: #f5f5dc;
color: #f5f5dc;
font-family: 'Comic Sans MS', 'Chalkboard SE', cursive;
text-transform: uppercase;
&:hover {
background: rgba(245, 245, 220, 0.25);
box-shadow: 0 0 10px rgba(245, 245, 220, 0.3);
}
}
.theme-classroom {
background: #f44336;
border-color: #d32f2f;
border-radius: 12px;
color: #fff;
font-family: 'Comic Sans MS', cursive;
text-transform: uppercase;
font-weight: bold;
box-shadow: 5px 5px 0 rgba(0, 0, 0, 0.2);
&:hover {
background: #e53935;
transform: translate(-2px, -2px);
box-shadow: 7px 7px 0 rgba(0, 0, 0, 0.2);
}
&:active {
transform: translate(2px, 2px);
box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.2);
}
}
.theme-cyberpunk {
background: transparent;
border: 2px solid #ff00ff;
color: #ff00ff;
font-family: 'Courier New', monospace;
text-transform: uppercase;
padding: 10px 25px;
&:hover {
background: #ff00ff;
color: #000;
}
}
.theme-nightmare {
background: #3a0000;
border: 2px solid #8b0000;
color: #ff0000;
font-family: 'Georgia', serif;
text-transform: uppercase;
padding: 10px 25px;
&:hover {
background: #8b0000;
}
}
.theme-nintendo {
background: #e60012;
border: none;
border-radius: 25px;
color: #fff;
text-transform: uppercase;
padding: 12px 30px;
box-shadow: 0 4px 0 #a00009;
&:hover {
background: #ff0018;
}
&:active {
box-shadow: 0 2px 0 #a00009;
transform: translateY(2px);
}
}
.theme-sludge {
background: linear-gradient(180deg, #6d6750 0%, #5c5544 100%);
border: 3px solid #8b8555;
border-bottom-width: 5px;
color: #c4b896;
text-transform: uppercase;
padding: 12px 30px;
box-shadow:
0 2px 0 rgba(0, 0, 0, 0.3),
inset 0 1px 0 rgba(255, 255, 255, 0.15);
&:hover {
background: linear-gradient(180deg, #7a7558 0%, #6d6750 100%);
border-color: #9a9565;
}
&:active {
border-bottom-width: 3px;
transform: translateY(2px);
}
}
.theme-typewriter {
background: #2c2416;
border: 2px solid #2c2416;
color: #f4e8d0;
font-family: 'Courier', monospace;
}
.theme-win95 {
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;
}
}
@media screen and (min-width: 450px) {
button { button {
width: 25%; width: 25%;
} }
} }
</style> </style>

View File

@@ -1,58 +0,0 @@
<!-- <script>
export let checked = false;
</script>
<div class="toggle-container">
<span>Family Friendly</span>
<div
class="toggle-switch"
class:active={checked}
on:click={() => checked = !checked}
on:keypress={(e) => e.key === 'Enter' && (checked = !checked)}
role="switch"
aria-checked={checked}
tabindex="0"
>
<div class="toggle-slider"></div>
</div>
<span>Adult</span>
</div>
<style>
.toggle-container {
display: flex;
align-items: center;
gap: 10px;
justify-content: center;
margin: 10px 0;
}
.toggle-switch {
position: relative;
width: 50px;
height: 24px;
background: #ccc;
border-radius: 12px;
cursor: pointer;
transition: background 0.3s;
}
.toggle-switch.active {
background: #ff6b6b;
}
.toggle-slider {
position: absolute;
top: 2px;
left: 2px;
width: 20px;
height: 20px;
background: white;
border-radius: 50%;
transition: transform 0.3s;
}
.toggle-switch.active .toggle-slider {
transform: translateX(26px);
}
</style> -->

View File

@@ -0,0 +1,110 @@
.theme-chalkboard {
font-family: 'Comic Sans MS', 'Chalkboard SE', cursive;
background: #1a3a1a;
color: #f5f5dc;
.window {
background: #2d4a2d;
border-color: #8b7355;
box-shadow:
inset 0 0 100px rgba(0, 0, 0, 0.3),
0 4px 15px rgba(0, 0, 0, 0.5);
}
.title-bar {
background: #8b7355;
color: #f5f5dc;
text-align: center;
font-weight: bold;
border-bottom: 3px solid #6d5a45;
}
fieldset {
border-color: rgba(245, 245, 220, 0.5);
background: rgba(26, 58, 26, 0.3);
}
legend {
color: #f5f5dc;
text-transform: uppercase;
font-weight: bold;
}
button {
background: rgba(245, 245, 220, 0.15);
border-color: #f5f5dc;
color: #f5f5dc;
font-family: 'Comic Sans MS', 'Chalkboard SE', cursive;
text-transform: uppercase;
&:hover {
background: rgba(245, 245, 220, 0.25);
box-shadow: 0 0 10px rgba(245, 245, 220, 0.3);
}
}
.chart-display,
.dice-display {
background: rgba(26, 58, 26, 0.5);
border-color: rgba(245, 245, 220, 0.4);
}
.title {
color: #f5f5dc;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
.subtitle {
color: #e8e8c8;
}
.tab-button {
background: rgba(245, 245, 220, 0.15);
border-color: #f5f5dc;
color: #f5f5dc;
text-transform: uppercase;
&:hover {
background: rgba(245, 245, 220, 0.25);
transform: translateY(-2px);
}
}
.back-button {
background: rgba(245, 245, 220, 0.15);
border-color: #f5f5dc;
color: #f5f5dc;
&:hover {
background: rgba(245, 245, 220, 0.25);
}
}
h1 {
color: #f5f5dc;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.5);
}
h2 {
color: #e8e8c8;
text-decoration: underline;
}
h3 {
color: #f5f5dc;
}
p,
li {
color: #f5f5dc;
line-height: 1.6;
}
.point {
fill: #ffeb3b;
stroke: #ffeb3b;
}
svg line,
svg text {
stroke: rgba(245, 245, 220, 0.7);
fill: rgba(245, 245, 220, 0.7);
}
}

View File

@@ -0,0 +1,134 @@
.theme-classroom {
font-family: 'Comic Sans MS', 'Marker Felt', 'Bradley Hand', cursive;
background: #ffeb3b;
color: #333;
.window {
background: #ffffff;
border-color: #f44336;
box-shadow: 10px 10px 0 rgba(0, 0, 0, 0.15);
}
.title-bar {
background: #f44336;
color: #fff;
text-align: center;
font-weight: bold;
text-transform: uppercase;
}
fieldset {
border-color: #2196f3;
background: #fff;
}
legend {
color: #2196f3;
text-transform: uppercase;
font-weight: bold;
background: #fff;
}
button {
background: #f44336;
border-color: #d32f2f;
border-radius: 12px;
color: #fff;
font-family: 'Comic Sans MS', cursive;
text-transform: uppercase;
font-weight: bold;
box-shadow: 5px 5px 0 rgba(0, 0, 0, 0.2);
&:hover {
background: #e53935;
transform: translate(-2px, -2px);
box-shadow: 7px 7px 0 rgba(0, 0, 0, 0.2);
}
&:active {
transform: translate(2px, 2px);
box-shadow: 3px 3px 0 rgba(0, 0, 0, 0.2);
}
}
.chart-display,
.dice-display {
background: #ffffff;
border-color: #2196f3;
box-shadow: 5px 5px 0 rgba(0, 0, 0, 0.1);
}
.title {
color: #f44336;
text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
}
.subtitle {
color: #2196f3;
font-weight: bold;
}
.tab-button {
background: #2196f3;
border-color: #1976d2;
border-radius: 12px;
color: #fff;
text-transform: uppercase;
font-weight: bold;
box-shadow: 5px 5px 0 rgba(0, 0, 0, 0.2);
&:hover {
background: #1e88e5;
transform: translate(-2px, -2px);
box-shadow: 7px 7px 0 rgba(0, 0, 0, 0.2);
}
}
.back-button {
background: #ffeb3b;
border-color: #fbc02d;
border-radius: 8px;
color: #333;
font-weight: bold;
&:hover {
background: #fdd835;
box-shadow: 0 0 10px rgba(255, 235, 59, 0.5);
}
}
h1 {
color: #f44336;
text-shadow: 4px 4px 0 rgba(0, 0, 0, 0.1);
}
h2 {
color: #2196f3;
}
h3 {
color: #ffeb3b;
text-shadow: 2px 2px 0 rgba(0, 0, 0, 0.1);
}
p,
li {
color: #333;
font-weight: 500;
}
.point {
fill: #f44336;
stroke: #d32f2f;
filter: drop-shadow(3px 3px 2px rgba(0, 0, 0, 0.2));
}
svg line {
stroke: #2196f3;
}
svg text {
fill: #333;
font-weight: bold;
}
}

View File

@@ -2,135 +2,99 @@
font-family: 'Courier New', monospace; font-family: 'Courier New', monospace;
background: #0a0e27; background: #0a0e27;
color: #00ffff; color: #00ffff;
}
.theme-cyberpunk .window { .window {
background: rgba(10, 14, 39, 0.95); background: rgba(10, 14, 39, 0.95);
border: 2px solid #00ffff; border-color: #00ffff;
box-shadow: 0 0 20px #ff00ff; box-shadow: 0 0 20px #ff00ff;
} }
.theme-cyberpunk .title-bar { .title-bar {
background: linear-gradient(90deg, #ff00ff, #00ffff); background: linear-gradient(90deg, #ff00ff, #00ffff);
color: #000; color: #000;
padding: 12px; font-weight: bold;
font-weight: bold; text-transform: uppercase;
text-transform: uppercase; }
}
.theme-cyberpunk fieldset { fieldset {
border: 1px solid #ff00ff; border-color: #ff00ff;
} }
.theme-cyberpunk legend { legend {
color: #ff00ff; color: #ff00ff;
text-transform: uppercase; text-transform: uppercase;
} }
.theme-cyberpunk button { button {
background: transparent; background: transparent;
border: 2px solid #ff00ff; border-color: #ff00ff;
color: #ff00ff; color: #ff00ff;
font-family: 'Courier New', monospace; font-family: 'Courier New', monospace;
text-transform: uppercase; text-transform: uppercase;
padding: 10px 25px; &:hover {
} background: #ff00ff;
color: #000;
}
}
.theme-cyberpunk button:hover { .chart-display,
background: #ff00ff; .dice-display {
color: #000; background: rgba(0, 255, 255, 0.05);
} border-color: #00ffff;
}
.theme-cyberpunk .chart-display, .title {
.theme-cyberpunk .dice-display { color: #00ffff;
background: rgba(0, 255, 255, 0.05); text-shadow: 0 0 20px #00ffff;
border: 1px solid #00ffff; }
}
/* Home Page Styles */ .subtitle {
.theme-cyberpunk .home-wrapper { color: #ff00ff;
background: #0a0e27; }
color: #00ffff;
}
.theme-cyberpunk .home-window { .tab-button {
background: rgba(10, 14, 39, 0.95); background: transparent;
border: 2px solid #00ffff; border-color: #ff00ff;
box-shadow: 0 0 30px #ff00ff; color: #ff00ff;
} text-transform: uppercase;
&:hover {
background: #ff00ff;
color: #000;
box-shadow: 0 0 20px #ff00ff;
}
}
.theme-cyberpunk .home-title-bar { .back-button {
background: linear-gradient(90deg, #ff00ff, #00ffff); background: transparent;
color: #000; border-color: #ff00ff;
padding: 12px; color: #ff00ff;
font-weight: bold; &:hover {
text-transform: uppercase; background: #ff00ff;
text-align: center; color: #000;
letter-spacing: 3px; }
} }
.theme-cyberpunk .home-content { h1 {
background: rgba(10, 14, 39, 0.5); color: #00ffff;
} text-shadow: 0 0 20px #00ffff;
}
.theme-cyberpunk .title { h2 {
color: #00ffff; color: #ff00ff;
text-shadow: 0 0 20px #00ffff; text-shadow: 0 0 15px #ff00ff;
} }
.theme-cyberpunk .subtitle { h3 {
color: #ff00ff; color: #00ffff;
} }
.theme-cyberpunk .tab-button { p,
background: transparent; li {
border: 2px solid #ff00ff; color: #00ffff;
color: #ff00ff; }
text-transform: uppercase;
}
.theme-cyberpunk .tab-button:hover { .point {
background: #ff00ff; fill: #ff00ff;
color: #000; filter: drop-shadow(0 0 5px #ff00ff);
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

@@ -1,87 +0,0 @@
/* Base styles that apply to all themes */
.container {
padding: 2rem;
}
.window {
max-width: 800px;
margin: 0 auto;
}
.window-body {
padding: 20px;
}
.title-bar {
display: flex;
align-items: center;
span{
text-align: center;
flex-grow: .75;
}
}
.home-button {
background: rgba(255, 255, 255, 0.2);
border: 1px solid rgba(255, 255, 255, 0.3);
color: inherit;
padding: 5px 10px;
cursor: pointer;
border-radius: 4px;
font-size: 14px;
}
.home-button:hover {
background: rgba(255, 255, 255, 0.3);
}
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;
flex-wrap: wrap;
}
button {
padding: 8px 24px;
cursor: pointer;
font-weight: bold;
}
.chart-display,
.dice-display {
padding: 20px;
min-height: 120px;
margin: 15px 0;
}
.axis {
margin: 10px 0;
padding: 10px;
border: 1px solid currentColor;
opacity: 0.9;
}
.axis-label {
font-weight: bold;
margin-bottom: 5px;
font-size: 11px;
text-transform: uppercase;
}
.empty-state {
font-style: italic;
text-align: center;
opacity: 0.7;
}

View File

@@ -2,143 +2,109 @@
font-family: 'Georgia', serif; font-family: 'Georgia', serif;
background: #000000; background: #000000;
color: #8b0000; color: #8b0000;
}
.theme-nightmare .window { .window {
background: #0d0000; background: #0d0000;
border: 3px solid #8b0000; border-color: #8b0000;
box-shadow: 0 0 30px #ff0000; box-shadow: 0 0 30px #ff0000;
} }
.theme-nightmare .title-bar { .title-bar {
background: linear-gradient(180deg, #3a0000, #000000); background: linear-gradient(180deg, #3a0000, #000000);
color: #ff0000; color: #ff0000;
padding: 15px; text-align: center;
text-align: center; text-transform: uppercase;
text-transform: uppercase; text-shadow: 0 0 10px #ff0000;
letter-spacing: 5px; }
text-shadow: 0 0 10px #ff0000;
}
.theme-nightmare fieldset { fieldset {
border: 2px solid #8b0000; border-color: #8b0000;
} }
.theme-nightmare legend { legend {
color: #ff0000; color: #ff0000;
text-shadow: 0 0 5px #ff0000; text-shadow: 0 0 5px #ff0000;
} }
.theme-nightmare button { button {
background: #3a0000; background: #3a0000;
border: 2px solid #8b0000; border-color: #8b0000;
color: #ff0000; color: #ff0000;
font-family: 'Georgia', serif; font-family: 'Georgia', serif;
text-transform: uppercase; text-transform: uppercase;
padding: 10px 25px; &:hover {
} background: #8b0000;
}
}
.theme-nightmare button:hover { .chart-display,
background: #8b0000; .dice-display {
} background: #000000;
border-color: #8b0000;
}
.theme-nightmare .chart-display, .title {
.theme-nightmare .dice-display { color: #ff0000;
background: #000000; text-shadow: 0 0 15px #ff0000;
border: 2px solid #8b0000; }
}
/* Home Page Styles */ .subtitle {
.theme-nightmare .home-wrapper { color: #cc0000;
background: #000000; text-shadow: 0 0 10px #cc0000;
color: #8b0000; }
}
.theme-nightmare .home-window { .tab-button {
background: #0d0000; background: #3a0000;
border: 3px solid #8b0000; border-color: #8b0000;
box-shadow: 0 0 30px #ff0000; color: #ff0000;
} font-family: 'Georgia', serif;
text-transform: uppercase;
&:hover {
background: #8b0000;
box-shadow: 0 0 20px #ff0000;
}
}
.theme-nightmare .home-title-bar { .back-button {
background: linear-gradient(180deg, #3a0000, #000000); background: #3a0000;
color: #ff0000; border-color: #8b0000;
padding: 15px; color: #ff0000;
text-align: center; &:hover {
text-transform: uppercase; background: #8b0000;
letter-spacing: 5px; box-shadow: 0 0 15px #ff0000;
text-shadow: 0 0 10px #ff0000; }
font-family: 'Georgia', serif; }
}
.theme-nightmare .home-content { .rules-content {
background: #0d0000; color: #8b0000;
font-family: 'Georgia', serif; font-family: 'Georgia', serif;
} }
.theme-nightmare .title { h1 {
color: #ff0000; color: #ff0000;
text-shadow: 0 0 15px #ff0000; text-shadow: 0 0 15px #ff0000;
} font-family: 'Georgia', serif;
}
.theme-nightmare .subtitle { h2 {
color: #cc0000; color: #cc0000;
text-shadow: 0 0 10px #cc0000; text-shadow: 0 0 10px #cc0000;
} font-family: 'Georgia', serif;
}
.theme-nightmare .tab-button { h3 {
background: #3a0000; color: #ff0000;
border: 2px solid #8b0000; font-family: 'Georgia', serif;
color: #ff0000; }
font-family: 'Georgia', serif;
text-transform: uppercase;
}
.theme-nightmare .tab-button:hover { p,
background: #8b0000; li {
box-shadow: 0 0 20px #ff0000; color: #8b0000;
} }
/* Rules Page Styles */ .point {
.theme-nightmare .rules-wrapper { fill: #ff0000;
background: #000000; stroke: #ff0000;
color: #8b0000; filter: drop-shadow(0 0 10px #ff0000);
} }
.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

@@ -1,166 +1,129 @@
.theme-nintendo { .theme-nintendo {
font-family: 'Arial', sans-serif; font-family: 'Arial', sans-serif;
background: #e60012; background: #e60012;
color: #fff; color: #a00009;
}
.theme-nintendo .window { .window {
background: #fff; background: #fff;
border: 8px solid #e60012; border-color: #e60012;
border-radius: 20px; border-radius: 20px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3); box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3);
overflow: hidden; overflow: hidden;
} }
.theme-nintendo .title-bar { .title-bar {
background: #e60012; background: #e60012;
color: #fff; color: #fff;
padding: 20px; text-align: center;
text-align: center; font-weight: bold;
font-weight: bold; }
font-size: 24px;
letter-spacing: 2px;
}
.theme-nintendo .window-body { fieldset {
color: #484848; border-color: #e60012;
} border-radius: 15px;
background: #f7f7f7;
}
.theme-nintendo fieldset { legend {
border: 3px solid #e60012; color: #e60012;
border-radius: 15px; font-weight: bold;
background: #f7f7f7; background: #ffffff;
} text-transform: uppercase;
font-size: 0.9em;
}
.theme-nintendo legend { button {
color: #e60012; background: #e60012;
} border-color: #b80010;
border-radius: 12px;
color: #ffffff;
font-weight: bold;
text-transform: uppercase;
box-shadow: 0 4px 0 #b80010;
.theme-nintendo button { &:hover {
background: #e60012; background: #ff1a2e;
border: none; transform: translateY(-2px);
border-radius: 25px; box-shadow: 0 6px 0 #b80010;
color: #fff; }
text-transform: uppercase;
padding: 12px 30px;
box-shadow: 0 4px 0 #a00009;
}
.theme-nintendo button:hover { &:active {
background: #ff0018; transform: translateY(2px);
} box-shadow: 0 2px 0 #b80010;
}
}
.theme-nintendo button:active { .chart-display,
box-shadow: 0 2px 0 #a00009; .dice-display {
transform: translateY(2px); background: #ffffff;
} border-color: #e0e0e0;
border-radius: 12px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.theme-nintendo .chart-display, .title {
.theme-nintendo .dice-display { color: #e60012;
background: #fff; }
border: 3px solid #00a3e0;
border-radius: 10px;
color: #484848;
}
/* Home Page Styles */ .subtitle {
.theme-nintendo .home-wrapper { color: #a00009;
background: #e60012; font-weight: 600;
color: #fff; }
}
.theme-nintendo .home-window { .tab-button {
background: #fff; background: #e60012;
border: 8px solid #e60012; border: none;
border-radius: 20px; border-radius: 25px;
box-shadow: 0 10px 40px rgba(0, 0, 0, 0.3); color: #fff;
overflow: hidden; text-transform: uppercase;
} box-shadow: 0 4px 0 #a00009;
&:hover {
background: #ff0018;
transform: translateY(-2px);
}
&:active {
box-shadow: 0 2px 0 #a00009;
transform: translateY(2px);
}
}
.theme-nintendo .home-title-bar { .back-button {
background: #e60012; background: #e60012;
color: #fff; border: none;
padding: 20px; border-radius: 25px;
text-align: center; color: #fff;
font-weight: bold; box-shadow: 0 4px 0 #a00009;
font-size: 24px;
letter-spacing: 2px;
}
.theme-nintendo .home-content { &:hover {
background: #fff; background: #ff0018;
color: #484848; transform: translateY(-2px);
} }
.theme-nintendo .title { &:active {
color: #e60012; box-shadow: 0 2px 0 #a00009;
} transform: translateY(2px);
}
}
.theme-nintendo .subtitle { h1 {
color: #484848; color: #e60012;
} }
.theme-nintendo .tab-button { h2 {
background: #e60012; color: #e60012;
border: none; }
border-radius: 25px;
color: #fff;
text-transform: uppercase;
box-shadow: 0 4px 0 #a00009;
}
.theme-nintendo .tab-button:hover { h3 {
background: #ff0018; color: #00a3e0;
transform: translateY(-2px); }
}
.theme-nintendo .tab-button:active { p,
box-shadow: 0 2px 0 #a00009; li {
transform: translateY(2px); color: #484848;
} }
/* Rules Page Styles */ .point {
.theme-nintendo .rules-wrapper { fill: #e60012;
background: #e60012; stroke: #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;
} }

106
src/lib/styles/sludge.css Normal file
View File

@@ -0,0 +1,106 @@
.theme-sludge {
font-family: 'Arial', sans-serif;
background: linear-gradient(180deg, #2a251a 0%, #3d372a 50%, #4a4235 100%);
color: #c4b896;
.window {
background: rgba(61, 55, 42, 0.95);
border-color: #8b8555;
box-shadow: 0 4px 0 rgba(0, 0, 0, 0.3), inset 0 2px 0 rgba(255, 255, 255, 0.1);
}
.title-bar {
background: linear-gradient(180deg, #8b8555 0%, #6d6750 100%);
color: #c4b896;
text-align: center;
text-transform: uppercase;
border-bottom: 3px solid rgba(0, 0, 0, 0.3);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2);
}
fieldset {
border-color: #8b8555;
background: rgba(58, 52, 38, 0.5);
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.2);
}
legend {
color: #c4b896;
text-transform: uppercase;
background: #4a4235;
border: 2px solid #8b8555;
}
button {
background: linear-gradient(180deg, #6d6750 0%, #5c5544 100%);
border-color: #8b8555;
color: #c4b896;
text-transform: uppercase;
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
&:hover {
background: linear-gradient(180deg, #7a7558 0%, #6d6750 100%);
border-color: #9a9565;
}
}
.chart-display,
.dice-display {
background: rgba(42, 37, 26, 0.8);
border-color: #8b8555;
box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.3);
}
.title {
color: #c4b896;
}
.subtitle {
color: #aaa67d;
}
.tab-button {
background: linear-gradient(180deg, #6d6750 0%, #5c5544 100%);
border-color: #8b8555;
color: #c4b896;
text-transform: uppercase;
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
&:hover {
background: linear-gradient(180deg, #7a7558 0%, #6d6750 100%);
transform: translateY(-2px);
border-color: #9a9565;
}
}
.back-button {
background: linear-gradient(180deg, #6d6750 0%, #5c5544 100%);
border-color: #8b8555;
color: #c4b896;
box-shadow: 0 2px 0 rgba(0, 0, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15);
&:hover {
background: linear-gradient(180deg, #7a7558 0%, #6d6750 100%);
transform: translateY(-2px);
}
}
h1 {
color: #c4b896;
}
h2 {
color: #aaa67d;
}
h3 {
color: #8b8555;
}
p,
li {
color: #b5ad88;
}
.point {
fill: #b5ad88;
filter: drop-shadow(0 0 5px #b5ad88);
}
}

View File

@@ -1,20 +1,23 @@
export const themeNames = ['win95', 'cyberpunk', 'typewriter', 'nightmare', 'vaporwave', 'nintendo']; export const themeNames = ['chalkboard', 'classroom', 'cyberpunk', 'nightmare', 'nintendo', 'sludge', 'typewriter', 'win95'];
export const themeDisplayNames = { export const themeDisplayNames = {
win95: 'Windows 95', chalkboard: 'Chalkboard',
classroom: 'Classroom',
cyberpunk: 'Cyberpunk', cyberpunk: 'Cyberpunk',
typewriter: 'Typewriter',
nightmare: 'Nightmare', nightmare: 'Nightmare',
vaporwave: 'Vaporwave', nintendo: 'Nintendo',
nintendo: 'Nintendo' sludge: 'Sludge',
typewriter: 'Typewriter',
win95: 'Win 95'
}; };
// Import all theme CSS files // Import all theme CSS files
// These will be bundled and applied globally // These will be bundled and applied globally
import './win95.css'; import './chalkboard.css';
import './classroom.css';
import './cyberPunk.css'; import './cyberPunk.css';
import './typewriter.css';
import './nightmare.css'; import './nightmare.css';
import './vaporWave.css';
import './nintendo.css'; import './nintendo.css';
import './general.css'; import './sludge.css';
import './typewriter.css';
import './win95.css';

View File

@@ -2,115 +2,84 @@
font-family: 'Courier', monospace; font-family: 'Courier', monospace;
background: #f4e8d0; background: #f4e8d0;
color: #2c2416; color: #2c2416;
}
.theme-typewriter .window { .window {
background: #fffef7; background: #fffef7;
border: 3px double #2c2416; border-style: double;
box-shadow: 5px 5px 15px rgba(0,0,0,0.3); border-color: #2c2416;
} box-shadow: 5px 5px 15px rgba(0,0,0,0.3);
}
.theme-typewriter .title-bar { .title-bar {
background: #2c2416; background: #2c2416;
color: #f4e8d0; color: #f4e8d0;
padding: 12px; text-align: center;
text-align: center; text-transform: uppercase;
text-transform: uppercase; }
letter-spacing: 3px;
}
.theme-typewriter fieldset { fieldset {
border: 2px solid #2c2416; border-color: #2c2416;
} }
.theme-typewriter legend { legend {
font-weight: bold; font-weight: bold;
text-decoration: underline; text-decoration: underline;
} }
.theme-typewriter button { button {
background: #2c2416; background: #2c2416;
border: 2px solid #2c2416; border-color: #2c2416;
color: #f4e8d0; color: #f4e8d0;
font-family: 'Courier', monospace; font-family: 'Courier', monospace;
} }
.theme-typewriter .chart-display, .chart-display,
.theme-typewriter .dice-display { .dice-display {
background: #fffef7; background: #fffef7;
border: 1px solid #2c2416; border-color: #2c2416;
} }
/* Home Page Styles */ .home-content {
.theme-typewriter .home-wrapper { background: #fffef7;
background: #f4e8d0; font-family: 'Courier', monospace;
color: #2c2416; }
}
.theme-typewriter .home-window { .title {
background: #fffef7; color: #2c2416;
border: 3px double #2c2416; }
box-shadow: 5px 5px 15px rgba(0,0,0,0.3);
}
.theme-typewriter .home-title-bar { .subtitle {
background: #2c2416; color: #4a3a28;
color: #f4e8d0; }
padding: 12px;
text-align: center;
text-transform: uppercase;
letter-spacing: 3px;
font-family: 'Courier', monospace;
}
.theme-typewriter .home-content { .tab-button {
background: #fffef7; background: #2c2416;
font-family: 'Courier', monospace; border-color: #2c2416;
} color: #f4e8d0;
font-family: 'Courier', monospace;
&:hover {
background: #4a3a28;
}
}
.theme-typewriter .title { .back-button {
color: #2c2416; background: #2c2416;
} color: #f4e8d0;
border-color: #2c2416;
&:hover {
background: #4a3a28;
}
}
.theme-typewriter .subtitle { h1,
color: #4a3a28; h2,
} h3 {
color: #2c2416;
font-family: 'Courier', monospace;
}
.theme-typewriter .tab-button { .point {
background: #2c2416; fill: #2c2416;
border: 2px solid #2c2416; stroke: #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

@@ -1,134 +0,0 @@
.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;
}
.theme-vaporwave .chart-display,
.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

@@ -1,106 +1,77 @@
.theme-win95 { .theme-win95 {
font-family: 'MS Sans Serif', Arial, sans-serif; font-family: 'MS Sans Serif', Arial, sans-serif;
background: #008080; background: #008080;
}
.theme-win95 .window { .window {
background: #c0c0c0; background: #c0c0c0;
border: 2px solid; border-color: #dfdfdf #808080 #808080 #dfdfdf;
border-color: #dfdfdf #808080 #808080 #dfdfdf; border-style: solid;
box-shadow: 2px 2px 0 rgba(0,0,0,0.5); box-shadow: 2px 2px 0 rgba(0,0,0,0.5);
} }
.theme-win95 .title-bar { .title-bar {
background: linear-gradient(to right, #000080, #1084d0); background: linear-gradient(to right, #000080, #1084d0);
color: white; color: white;
padding: 8px; font-weight: bold;
font-weight: bold; }
}
.theme-win95 fieldset { fieldset {
border: 2px groove #c0c0c0; border-style: groove;
} border-color: #c0c0c0;
}
.theme-win95 button { button {
background: #c0c0c0; background: #c0c0c0;
border: 2px solid; border-color: #ffffff #000000 #000000 #ffffff;
border-color: #ffffff #000000 #000000 #ffffff; border-style: solid;
font-family: 'MS Sans Serif', Arial, sans-serif; font-family: 'MS Sans Serif', Arial, sans-serif;
} &:active {
border-color: #000000 #ffffff #ffffff #000000;
}
}
.theme-win95 button:active { .chart-display,
border-color: #000000 #ffffff #ffffff #000000; .dice-display {
} background: white;
border-style: inset;
border-color: #808080;
}
.theme-win95 .chart-display, .tab-button {
.theme-win95 .dice-display { background: #c0c0c0;
background: white; border-color: #ffffff #000000 #000000 #ffffff;
border: 2px inset #808080; border-style: solid;
} color: #000;
}
/* Home Page Styles */ .tab-button:hover {
.theme-win95 .home-wrapper { background: #dfdfdf;
background: #008080; }
}
.theme-win95 .home-window { .tab-button:active {
background: #c0c0c0; border-color: #000000 #ffffff #ffffff #000000;
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 { .back-button {
background: linear-gradient(to right, #000080, #1084d0); background: rgba(255, 255, 255, 0.2);
color: white; border-color: rgba(255, 255, 255, 0.3);
padding: 8px; }
font-weight: bold;
text-align: center;
}
.theme-win95 .home-content { .back-button:hover {
background: #c0c0c0; background: rgba(255, 255, 255, 0.3);
color: #000; }
}
.theme-win95 .tab-button { h1,
background: #c0c0c0; h2 {
border: 2px solid; color: #000080;
border-color: #ffffff #000000 #000000 #ffffff; }
color: #000;
}
.theme-win95 .tab-button:hover { h3 {
background: #dfdfdf; color: #1084d0;
} }
.theme-win95 .tab-button:active { .point {
border-color: #000000 #ffffff #ffffff #000000; fill: #000080;
} stroke: #000080;
}
/* 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;
} }

2
src/routes/+layout.js Normal file
View File

@@ -0,0 +1,2 @@
export const prerender = true;
export const trailingSlash = 'always';

View File

@@ -1,10 +1,11 @@
<script> <script>
import '$lib/styles/themes.js'; import '$lib/styles/themes.js';
import favicon from '$lib/assets/favicon.svg';
import { writable } from 'svelte/store'; import { writable } from 'svelte/store';
import { setContext } from 'svelte'; import { setContext } from 'svelte';
import { page } from '$app/state';
// Create a theme store that persists across pages // Create a theme store that persists across pages
const theme = writable('win95'); const theme = writable('chalkboard');
setContext('theme', theme); setContext('theme', theme);
let currentTheme; let currentTheme;
@@ -13,26 +14,27 @@
}); });
</script> </script>
<div class="app-container theme-{currentTheme}"> <svelte:head>
<div class="wrapper"> <link rel="icon" href="$lib/assests/favicon.ico" sizes="any" />
<div class="container"> <link rel="icon" href={favicon} type="image/svg+xml" />
<div class="window"> </svelte:head>
<div class="title-bar">
<a href="/" class="back-button">←Back</a> <div class="theme-{currentTheme} app-container">
<span>A Sludge & Friends game</span> <div class="window">
</div> <div class="title-bar">
<slot /> {#if page.url.pathname != '/'}
</div> <a href="/" class="back-button">←Back</a>
{/if}
<span>A Sludge & Friends Game</span>
</div> </div>
<slot />
</div> </div>
</div> </div>
<style> <style>
:global(body) {
margin: 0;
padding: 0;
}
.back-button { .back-button {
position: absolute;
left: 10px;
padding: 5px 15px; padding: 5px 15px;
cursor: pointer; cursor: pointer;
border-radius: 4px; border-radius: 4px;
@@ -40,25 +42,105 @@
color: inherit; color: inherit;
font-weight: bold; font-weight: bold;
transition: all 0.2s; transition: all 0.2s;
border: 2px solid;
} }
.wrapper {
.app-container {
min-height: 100vh; min-height: 100vh;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
padding: 20px; padding: 0.25rem;
}
.container {
width: 100%;
max-width: 700px;
} }
.window { .window {
max-width: 55rem;
width: 100%; width: 100%;
margin: 0 auto;
border-width: 4px;
border-style: solid;
} }
.app-container {
min-height: 100vh; .title-bar {
position: relative;
display: flex;
align-items: center;
justify-content: center;
padding: 12px;
span {
text-align: center;
}
}
@media screen and (min-width: 450px) {
}
:global {
body {
margin: 0;
padding: 0;
min-height: 100vh;
}
fieldset {
padding: 15px;
margin: 15px 0;
border: 2px solid;
}
legend {
font-weight: bold;
padding: 0 5px;
}
.button-row {
display: flex;
gap: 10px;
justify-content: center;
margin-top: 10px;
flex-wrap: wrap;
}
button {
padding: 8px 24px;
cursor: pointer;
font-weight: bold;
border: 2px solid;
}
.tab-button {
border: 2px solid;
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: 2.5rem;
}
.chart-display,
.dice-display {
padding: 20px;
min-height: 120px;
margin: 15px 0;
border: 2px solid;
}
.empty-state {
font-style: italic;
text-align: center;
opacity: 0.7;
}
} }
</style> </style>

View File

@@ -8,6 +8,10 @@
$: themeStore.set(currentTheme); $: themeStore.set(currentTheme);
</script> </script>
<svelte:head>
<title>On the Spectrum</title>
</svelte:head>
<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>
@@ -57,7 +61,7 @@
} }
.tab-button { .tab-button {
border:color(from color srgb r g b); border: color(from color srgb r g b);
border-radius: 10px; border-radius: 10px;
padding: 25px 40px; padding: 25px 40px;
font-size: 1.3rem; font-size: 1.3rem;

View File

@@ -1,11 +1,10 @@
<script> <script>
import { xAxes, yAxes } from '$lib'; import { xAxes, yAxes } from '$lib';
import ChartDisplay from '$components/chartDisplay.svelte'; import Gameboard from '$components/gameboard.svelte';
import DiceRoller from '$components/diceRoller.svelte';
let adultMode = $state(false); let adultMode = $state(false);
let currentChart = $state({ x: [''], y: [''] }); let currentChart = $state({ x: [''], y: [''], empty: true });
let diceRoll = $state({ x: 0, y: 0 }); let diceRoll = $state({ x: 0, y: 0, empty: true });
function generateChart() { function generateChart() {
const availableXAxes = adultMode ? xAxes : xAxes.filter((axis) => !axis.adult); const availableXAxes = adultMode ? xAxes : xAxes.filter((axis) => !axis.adult);
@@ -16,37 +15,44 @@
currentChart = { currentChart = {
x: randomX.values, x: randomX.values,
y: randomY.values y: randomY.values,
empty: false
}; };
// Reset dice roll when generating new chart
diceRoll = { x: 0, y: 0, empty: true };
} }
function rollDice() { function rollDice() {
diceRoll = { diceRoll = {
x: Math.floor(Math.random() * 10) + 1, x: Math.floor(Math.random() * 10) + 1,
y: Math.floor(Math.random() * 10) + 1 y: Math.floor(Math.random() * 10) + 1,
empty: false
}; };
} }
// $inspect(currentChart, diceRoll);
</script> </script>
<div class="container"> <svelte:head>
<fieldset> <title>Play On the Spectrum</title>
<legend>Chart Generator</legend> </svelte:head>
<ChartDisplay chart={currentChart} />
<div class="button-row">
<button onclick={generateChart}>Generate</button>
</div>
</fieldset>
<fieldset> <div class="container">
<legend>Position Roller</legend> <fieldset>
<DiceRoller roll={diceRoll} /> <legend>On The Spectrum</legend>
<div class="button-row"> <Gameboard chart={currentChart} roll={diceRoll} />
<button onclick={rollDice}>Roll Dice</button> <div class="button-row">
</div> <button onclick={generateChart}>Generate Axes</button>
</fieldset> <button onclick={rollDice} disabled={currentChart.empty}>Roll Dice</button>
</div>
</fieldset>
</div> </div>
<style> <style>
.container {
padding: 1rem;
}
fieldset { fieldset {
padding: 1.25rem; padding: 1.25rem;
margin: 0; margin: 0;
@@ -62,12 +68,20 @@
gap: 10px; gap: 10px;
justify-content: center; justify-content: center;
margin-top: 10px; margin-top: 10px;
flex-wrap: wrap;
} }
button { button {
padding: 0.5rem 1.75rem; padding: 0.5rem 1.75rem;
cursor: pointer; cursor: pointer;
font-weight: bold; font-weight: bold;
flex: 1;
min-width: 140px;
}
button:disabled {
opacity: 0.5;
cursor: not-allowed;
} }
</style> </style>

View File

@@ -8,12 +8,11 @@
$: themeStore.set(currentTheme); $: themeStore.set(currentTheme);
</script> </script>
<div class="window-body"> <svelte:head>
<fieldset> <title>Rules For On the Spectrum</title>
<legend>Theme Selector</legend> </svelte:head>
<ThemeSelector bind:currentTheme />
</fieldset>
<div class="window-body">
<div class="rules-content"> <div class="rules-content">
<h1>How to Play</h1> <h1>How to Play</h1>
@@ -24,10 +23,13 @@
<strong>Generate:</strong> Click "Generate" to create a random 2D spectrum with X and Y axes <strong>Generate:</strong> Click "Generate" to create a random 2D spectrum with X and Y axes
</li> </li>
<li> <li>
<strong>Play:</strong>Have the clue-giver roll 2d10 with one d10 being X and the other d10 <strong>Roll:</strong> Have the clue-giver roll 2d10 with one d10 being X and the other d10
being Y (The axes run 1-10 with 5 being the centerline on each). Try to select a being Y (The axes run 1-10 with 5 being the centerline on each). Try to select a phrase-person-vibe
phrase-person-vibe that fits the X,Y coordinates you just rolled and inform the other that fits the X,Y coordinates you just rolled and inform the other players.
players. </li>
<li>
<strong>Guess:</strong> Guessers now argue about where the clue should be situated on the quadrant
plot. They guess some coordinates and the clue giver reveals where the clue was.
</li> </li>
<li><strong>Repeat:</strong> Generate a new spectrum and keep playing!</li> <li><strong>Repeat:</strong> Generate a new spectrum and keep playing!</li>
</ol> </ol>
@@ -84,22 +86,24 @@
Hundreds! The X and Y axes are randomly combined, creating thousands of possible spectrums. Hundreds! The X and Y axes are randomly combined, creating thousands of possible spectrums.
</p> </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> <p>
<strong>Can we make our own rules?</strong><br /> <strong>Can we make our own rules?</strong><br />
Absolutely! These are guidelines. House rules are encouraged! Absolutely! These are guidelines. House rules are encouraged!
</p> </p>
</section> </section>
<fieldset>
<legend>Theme Selector</legend>
<ThemeSelector bind:currentTheme />
</fieldset>
</div> </div>
</div> </div>
<style> <style>
.rules-content { .rules-content {
padding: 20px 0; margin: 0.5rem;
display: flex;
flex-direction: column;
align-items: center;
} }
h1 { h1 {
@@ -109,17 +113,15 @@
} }
h2 { h2 {
font-size: 1.8rem;
margin-top: 30px; margin-top: 30px;
margin-bottom: 15px; margin-bottom: 15px;
} }
section { section {
margin-bottom: 30px; width: 95%;
} }
p { p {
line-height: 1.6;
margin-bottom: 10px; margin-bottom: 10px;
} }

View File

@@ -1,4 +1,5 @@
import adapter from '@sveltejs/adapter-auto'; //import adapter from '@sveltejs/adapter-auto';
import adapter from '@sveltejs/adapter-static';
import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; import { vitePreprocess } from '@sveltejs/vite-plugin-svelte';
import path from 'path' import path from 'path'
@@ -12,7 +13,15 @@ const config = {
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list. // adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
// If your environment is not supported, or you settled on a specific environment, switch out the adapter. // If your environment is not supported, or you settled on a specific environment, switch out the adapter.
// See https://svelte.dev/docs/kit/adapters for more information about adapters. // See https://svelte.dev/docs/kit/adapters for more information about adapters.
adapter: adapter(), adapter: adapter({
// default options are shown. On some platforms
// these options are set automatically — see below
pages: 'build',
assets: 'build',
fallback: undefined,
precompress: false,
strict: true
}),
alias: { alias: {
$components: path.resolve('./src/lib/components'), $components: path.resolve('./src/lib/components'),
} }

View File

@@ -1,21 +1,21 @@
{ {
"extends": "./.svelte-kit/tsconfig.json", "extends": "./.svelte-kit/tsconfig.json",
"compilerOptions": { "compilerOptions": {
"rewriteRelativeImportExtensions": true, "rewriteRelativeImportExtensions": true,
"allowJs": true, "allowJs": true,
"checkJs": true, "checkJs": true,
"esModuleInterop": true, "esModuleInterop": true,
"forceConsistentCasingInFileNames": true, "forceConsistentCasingInFileNames": true,
"resolveJsonModule": true, "resolveJsonModule": true,
"skipLibCheck": true, "skipLibCheck": true,
"sourceMap": true, "sourceMap": true,
"strict": true, "strict": true,
"moduleResolution": "bundler", "moduleResolution": "bundler",
"noImplicitAny": false "noImplicitAny": false
} }
// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
// //
// To make changes to top-level options such as include and exclude, we recommend extending // To make changes to top-level options such as include and exclude, we recommend extending
// the generated config; see https://svelte.dev/docs/kit/configuration#typescript // the generated config; see https://svelte.dev/docs/kit/configuration#typescript
} }