From f682502e192f879d869cabe930d606107fc2b59b Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Sun, 1 Feb 2026 13:45:38 -0600 Subject: [PATCH 01/24] import React --- src/components/unlocksModal.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/unlocksModal.tsx b/src/components/unlocksModal.tsx index 647d46a..6bffc0e 100644 --- a/src/components/unlocksModal.tsx +++ b/src/components/unlocksModal.tsx @@ -1,6 +1,7 @@ import { useCardStore } from "../modules/state/store.ts"; import { Button, Container, Group, Modal, SimpleGrid, Switch } from "@mantine/core"; import { options } from "../modules/const.ts"; +import React from "react"; export default function UnlocksModal() { const selectOptionsModalOpen = useCardStore(state => state.applicationState.selectOptionsModalOpen); From 5d7fb644ea73453c02a3a048eaf1c9d5722884a3 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Sun, 1 Feb 2026 13:45:44 -0600 Subject: [PATCH 02/24] import react --- src/components/RerollCalculatorModal.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/RerollCalculatorModal.tsx b/src/components/RerollCalculatorModal.tsx index 82f744c..39eb033 100644 --- a/src/components/RerollCalculatorModal.tsx +++ b/src/components/RerollCalculatorModal.tsx @@ -3,6 +3,7 @@ import { useMemo, useState } from "react"; import { useCardStore } from "../modules/state/store.ts"; import { Voucher } from "../modules/balatrots/enum/Voucher.ts"; import { BuyMetaData } from "../modules/classes/BuyMetaData.ts"; +import React from "react"; interface RerollCalculatorModalProps { opened: boolean; From 651bb2b2d9be237fba1373db52788a1095471229 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Sun, 1 Feb 2026 13:45:54 -0600 Subject: [PATCH 03/24] consolidate duplicate component using props --- src/components/SeedInputAutoComplete.tsx | 35 +++++++----------------- 1 file changed, 10 insertions(+), 25 deletions(-) diff --git a/src/components/SeedInputAutoComplete.tsx b/src/components/SeedInputAutoComplete.tsx index 37517f5..13682bd 100644 --- a/src/components/SeedInputAutoComplete.tsx +++ b/src/components/SeedInputAutoComplete.tsx @@ -1,8 +1,8 @@ +import React from "react"; import {Autocomplete, Button, Group, NativeSelect, Paper} from "@mantine/core"; import {popularSeeds, SeedsWithLegendary} from "../modules/const.ts"; import {useCardStore} from "../modules/state/store.ts"; - export function QuickAnalyze() { const seed = useCardStore(state => state.immolateState.seed); const setSeed = useCardStore(state => state.setSeed); @@ -45,42 +45,27 @@ export function QuickAnalyze() { return ( - setSeed(e)} - rightSection={select} - rightSectionWidth={sectionWidth} - /> - + seed={seed} + setSeed={setSeed} /> + ); } -export default function SeedInputAutoComplete({seed, setSeed}: { seed: string, setSeed: (seed: string) => void }) { +export default function SeedInputAutoComplete({width, label, seed, setSeed}: { width: number, label: string, seed: string, setSeed: (seed: string) => void }) { return ( setSeed(e)} + onChange={(e) => setSeed(e.replace('0', 'O').trim())} data={[ { group: 'Popular Seeds', From 0fb8611a6d3c6fbb3083e33432a514e97101742e Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Sun, 1 Feb 2026 13:46:16 -0600 Subject: [PATCH 04/24] require seed to enable analyze button --- src/components/blueprint/layout/navbar.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/blueprint/layout/navbar.tsx b/src/components/blueprint/layout/navbar.tsx index 00189ee..7bab954 100644 --- a/src/components/blueprint/layout/navbar.tsx +++ b/src/components/blueprint/layout/navbar.tsx @@ -271,7 +271,7 @@ export default function NavBar() { From de59ba41084f6e672970f9a65635c8c562c68af5 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Sun, 1 Feb 2026 15:57:32 -0600 Subject: [PATCH 08/24] Allow unset/auto width prop --- src/components/SeedInputAutoComplete.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SeedInputAutoComplete.tsx b/src/components/SeedInputAutoComplete.tsx index 13682bd..79c4232 100644 --- a/src/components/SeedInputAutoComplete.tsx +++ b/src/components/SeedInputAutoComplete.tsx @@ -57,7 +57,7 @@ export function QuickAnalyze() { } -export default function SeedInputAutoComplete({width, label, seed, setSeed}: { width: number, label: string, seed: string, setSeed: (seed: string) => void }) { +export default function SeedInputAutoComplete({width, label, seed, setSeed}: { width?: number, label: string, seed: string, setSeed: (seed: string) => void }) { return ( Date: Sun, 1 Feb 2026 16:32:29 -0600 Subject: [PATCH 09/24] Always show home if no seeds! set v1 --- package-lock.json | 4 ++-- package.json | 2 +- .../blueprint/standardView/index.tsx | 21 ++++++++++++------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0c2caba..2c8d220 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "blueprint", - "version": "0.0.0", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "blueprint", - "version": "0.0.0", + "version": "1.0.0", "dependencies": { "@mantine/carousel": "8.2.8", "@mantine/code-highlight": "8.2.8", diff --git a/package.json b/package.json index 61628ae..9a594e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "blueprint", - "version": "0.0.0", + "version": "1.0.0", "type": "module", "scripts": { "dev": "vite dev --host --port 3000", diff --git a/src/components/blueprint/standardView/index.tsx b/src/components/blueprint/standardView/index.tsx index a3daa39..9f7a2cd 100644 --- a/src/components/blueprint/standardView/index.tsx +++ b/src/components/blueprint/standardView/index.tsx @@ -524,17 +524,24 @@ function SeedExplorer() { } function Main() { - const SeedResults = useSeedResultsContainer() + const SeedResults = useSeedResultsContainer(); const viewMode = useCardStore(state => state.applicationState.viewMode); + // If no seed results or seed is empty, show HomePage only + if (!SeedResults || !SeedResults.antes || Object.keys(SeedResults.antes).length === 0) { + return ( + + + + ); + } return ( - {!SeedResults && } - {SeedResults && viewMode === 'blueprint' && } - {SeedResults && viewMode === 'text' && } - {SeedResults && viewMode === 'simple' && } - {SeedResults && } + {viewMode === 'blueprint' && } + {viewMode === 'text' && } + {viewMode === 'simple' && } + - ) + ); } // declare window module and saveSeedDebug function declare global { From 7526ee249bef6931f35ab3c5932eb9393d9f6f96 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Sun, 1 Feb 2026 17:13:50 -0600 Subject: [PATCH 10/24] tighten up the footer --- src/components/blueprint/layout/footer.tsx | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/blueprint/layout/footer.tsx b/src/components/blueprint/layout/footer.tsx index f3e1025..00e6bf0 100644 --- a/src/components/blueprint/layout/footer.tsx +++ b/src/components/blueprint/layout/footer.tsx @@ -33,13 +33,13 @@ export default function Footer() { return (
- + Made by Michael Walker with {' '} - Mantine , - Vite , - Zustand , - Immolate . + Mantine, + Vite, + Zustand, + Immolate. + ); @@ -58,14 +58,24 @@ export function QuickAnalyze() { } export default function SeedInputAutoComplete({width, label, seed, setSeed}: { width?: number, label: string, seed: string, setSeed: (seed: string) => void }) { + const [localValue, setLocalValue] = useState(seed); + + // Sync local value when external seed changes (e.g., from reset) + React.useEffect(() => { + setLocalValue(seed); + }, [seed]); + return ( setSeed(e.replace('0', 'O').trim())} + value={localValue} + onChange={setLocalValue} + onBlur={() => { + setSeed(localValue); + }} data={[ { group: 'Popular Seeds', From 439af7fcfcc253f31b9618caf225f7e1bb6d772c Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 09:35:27 -0600 Subject: [PATCH 14/24] Update package-lock.json --- package-lock.json | 289 ++++++++++++++++++++++++++-------------------- 1 file changed, 165 insertions(+), 124 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2c8d220..650447a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -84,6 +84,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", "dev": true, + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.27.1", @@ -275,12 +276,10 @@ } }, "node_modules/@babel/runtime": { - "version": "7.26.9", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.9.tgz", - "integrity": "sha512-aA63XwOkcl4xxQa3HjPMqOP6LiK0ZDv3mUPYEFXkpHbaFjtGggE1A61FjFzJnB+p7/oy2gA8E+rcBNl/zC1tMg==", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.6.tgz", + "integrity": "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -365,12 +364,13 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.9.tgz", - "integrity": "sha512-OaGtL73Jck6pBKjNIe24BnFE6agGl+6KxDtTfHhy1HmhthfKouEcOhqpSL64K4/0WCtbKFLOdzD/44cJ4k9opA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", "cpu": [ "ppc64" ], + "license": "MIT", "optional": true, "os": [ "aix" @@ -380,12 +380,13 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.9.tgz", - "integrity": "sha512-5WNI1DaMtxQ7t7B6xa572XMXpHAaI/9Hnhk8lcxF4zVN4xstUgTlvuGDorBguKEnZO70qwEcLpfifMLoxiPqHQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -395,12 +396,13 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.9.tgz", - "integrity": "sha512-IDrddSmpSv51ftWslJMvl3Q2ZT98fUSL2/rlUXuVqRXHCs5EUF1/f+jbjF5+NG9UffUDMCiTyh8iec7u8RlTLg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -410,12 +412,13 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.9.tgz", - "integrity": "sha512-I853iMZ1hWZdNllhVZKm34f4wErd4lMyeV7BLzEExGEIZYsOzqDWDf+y082izYUE8gtJnYHdeDpN/6tUdwvfiw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "android" @@ -425,12 +428,13 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.9.tgz", - "integrity": "sha512-XIpIDMAjOELi/9PB30vEbVMs3GV1v2zkkPnuyRRURbhqjyzIINwj+nbQATh4H9GxUgH1kFsEyQMxwiLFKUS6Rg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -440,12 +444,13 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.9.tgz", - "integrity": "sha512-jhHfBzjYTA1IQu8VyrjCX4ApJDnH+ez+IYVEoJHeqJm9VhG9Dh2BYaJritkYK3vMaXrf7Ogr/0MQ8/MeIefsPQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "darwin" @@ -455,12 +460,13 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.9.tgz", - "integrity": "sha512-z93DmbnY6fX9+KdD4Ue/H6sYs+bhFQJNCPZsi4XWJoYblUqT06MQUdBCpcSfuiN72AbqeBFu5LVQTjfXDE2A6Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -470,12 +476,13 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.9.tgz", - "integrity": "sha512-mrKX6H/vOyo5v71YfXWJxLVxgy1kyt1MQaD8wZJgJfG4gq4DpQGpgTB74e5yBeQdyMTbgxp0YtNj7NuHN0PoZg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "freebsd" @@ -485,12 +492,13 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.9.tgz", - "integrity": "sha512-HBU2Xv78SMgaydBmdor38lg8YDnFKSARg1Q6AT0/y2ezUAKiZvc211RDFHlEZRFNRVhcMamiToo7bDx3VEOYQw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", "cpu": [ "arm" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -500,12 +508,13 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.9.tgz", - "integrity": "sha512-BlB7bIcLT3G26urh5Dmse7fiLmLXnRlopw4s8DalgZ8ef79Jj4aUcYbk90g8iCa2467HX8SAIidbL7gsqXHdRw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -515,12 +524,13 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.9.tgz", - "integrity": "sha512-e7S3MOJPZGp2QW6AK6+Ly81rC7oOSerQ+P8L0ta4FhVi+/j/v2yZzx5CqqDaWjtPFfYz21Vi1S0auHrap3Ma3A==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", "cpu": [ "ia32" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -530,12 +540,13 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.9.tgz", - "integrity": "sha512-Sbe10Bnn0oUAB2AalYztvGcK+o6YFFA/9829PhOCUS9vkJElXGdphz0A3DbMdP8gmKkqPmPcMJmJOrI3VYB1JQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", "cpu": [ "loong64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -545,12 +556,13 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.9.tgz", - "integrity": "sha512-YcM5br0mVyZw2jcQeLIkhWtKPeVfAerES5PvOzaDxVtIyZ2NUBZKNLjC5z3/fUlDgT6w89VsxP2qzNipOaaDyA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", "cpu": [ "mips64el" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -560,12 +572,13 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.9.tgz", - "integrity": "sha512-++0HQvasdo20JytyDpFvQtNrEsAgNG2CY1CLMwGXfFTKGBGQT3bOeLSYE2l1fYdvML5KUuwn9Z8L1EWe2tzs1w==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", "cpu": [ "ppc64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -575,12 +588,13 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.9.tgz", - "integrity": "sha512-uNIBa279Y3fkjV+2cUjx36xkx7eSjb8IvnL01eXUKXez/CBHNRw5ekCGMPM0BcmqBxBcdgUWuUXmVWwm4CH9kg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", "cpu": [ "riscv64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -590,12 +604,13 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.9.tgz", - "integrity": "sha512-Mfiphvp3MjC/lctb+7D287Xw1DGzqJPb/J2aHHcHxflUo+8tmN/6d4k6I2yFR7BVo5/g7x2Monq4+Yew0EHRIA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", "cpu": [ "s390x" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -605,12 +620,13 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.9.tgz", - "integrity": "sha512-iSwByxzRe48YVkmpbgoxVzn76BXjlYFXC7NvLYq+b+kDjyyk30J0JY47DIn8z1MO3K0oSl9fZoRmZPQI4Hklzg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "linux" @@ -620,12 +636,13 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.9.tgz", - "integrity": "sha512-9jNJl6FqaUG+COdQMjSCGW4QiMHH88xWbvZ+kRVblZsWrkXlABuGdFJ1E9L7HK+T0Yqd4akKNa/lO0+jDxQD4Q==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -635,12 +652,13 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.9.tgz", - "integrity": "sha512-RLLdkflmqRG8KanPGOU7Rpg829ZHu8nFy5Pqdi9U01VYtG9Y0zOG6Vr2z4/S+/3zIyOxiK6cCeYNWOFR9QP87g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "netbsd" @@ -650,12 +668,13 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.9.tgz", - "integrity": "sha512-YaFBlPGeDasft5IIM+CQAhJAqS3St3nJzDEgsgFixcfZeyGPCd6eJBWzke5piZuZ7CtL656eOSYKk4Ls2C0FRQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -665,12 +684,13 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.9.tgz", - "integrity": "sha512-1MkgTCuvMGWuqVtAvkpkXFmtL8XhWy+j4jaSO2wxfJtilVCi0ZE37b8uOdMItIHz4I6z1bWWtEX4CJwcKYLcuA==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "openbsd" @@ -680,12 +700,13 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.9.tgz", - "integrity": "sha512-4Xd0xNiMVXKh6Fa7HEJQbrpP3m3DDn43jKxMjxLLRjWnRsfxjORYJlXPO4JNcXtOyfajXorRKY9NkOpTHptErg==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "openharmony" @@ -695,12 +716,13 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.9.tgz", - "integrity": "sha512-WjH4s6hzo00nNezhp3wFIAfmGZ8U7KtrJNlFMRKxiI9mxEK1scOMAaa9i4crUtu+tBr+0IN6JCuAcSBJZfnphw==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "sunos" @@ -710,12 +732,13 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.9.tgz", - "integrity": "sha512-mGFrVJHmZiRqmP8xFOc6b84/7xa5y5YvR1x8djzXpJBSv/UsNK6aqec+6JDjConTgvvQefdGhFDAs2DLAds6gQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", "cpu": [ "arm64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -725,12 +748,13 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.9.tgz", - "integrity": "sha512-b33gLVU2k11nVx1OhX3C8QQP6UHQK4ZtN56oFWvVXvz2VkDoe6fbG8TOgHFxEvqeqohmRnIHe5A1+HADk4OQww==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", "cpu": [ "ia32" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -740,12 +764,13 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.9.tgz", - "integrity": "sha512-PPOl1mi6lpLNQxnGoyAfschAodRFYXJ+9fs6WHXz7CSWKbOqiMZsubC+BQsVKuul+3vKLuwTHsS2c2y9EoKwxQ==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", "cpu": [ "x64" ], + "license": "MIT", "optional": true, "os": [ "win32" @@ -1100,6 +1125,7 @@ "version": "8.2.8", "resolved": "https://registry.npmjs.org/@mantine/core/-/core-8.2.8.tgz", "integrity": "sha512-dybAXrlQ+QiIhpnVCkdH6P4Sjm9I9RymYXfDp97oj9KfGRMEJGLDdPAwp/2GhXe7UdDkzqD48JCkbfRWF2Q+qA==", + "peer": true, "dependencies": { "@floating-ui/react": "^0.26.28", "clsx": "^2.1.1", @@ -1118,6 +1144,7 @@ "version": "8.2.8", "resolved": "https://registry.npmjs.org/@mantine/hooks/-/hooks-8.2.8.tgz", "integrity": "sha512-KK1krCcXizWT6JF8gWexv58imQBbviylAJqSqdZ4zUPgrpe81ehMyfxo5Z9EZsnSwMxkB4RLMhCCJhC5g8GvLA==", + "peer": true, "peerDependencies": { "react": "^18.x || ^19.x" } @@ -1600,6 +1627,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.18.tgz", "integrity": "sha512-t4yC+vtgnkYjNSKlFx1jkAhH8LgTo2N/7Qvi83kdEaUtMDiwpbLAktKDaAMlRcJ5eSxZkH74eEGt1ky31d7kfQ==", "devOptional": true, + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -1660,6 +1688,7 @@ "integrity": "sha512-PC0PDZfJg8sP7cmKe6L3QIL8GZwU5aRvUFedqSIpw3B+QjRSUZeeITC2M5XKeMXEzL6wccN196iy3JLwKNvDVA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.48.1", "@typescript-eslint/types": "8.48.1", @@ -1848,6 +1877,7 @@ "integrity": "sha512-fAnhLrDjiVfey5wwFRwrweyRlCmdz5ZxXz2G/4cLn0YDLjTapmN4gcCsTBR1N2rWnZSDeWpYtgLDsJt+FpmcwA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.48.1", @@ -2287,6 +2317,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2554,6 +2585,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001737", "electron-to-chromium": "^1.5.211", @@ -2956,12 +2988,14 @@ "node_modules/embla-carousel": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.6.0.tgz", - "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==" + "integrity": "sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==", + "peer": true }, "node_modules/embla-carousel-react": { "version": "8.6.0", "resolved": "https://registry.npmjs.org/embla-carousel-react/-/embla-carousel-react-8.6.0.tgz", "integrity": "sha512-0/PjqU7geVmo6F734pmPqpyHqiM99olvyecY7zdweCw+6tKEXnrE90pBiBbMMU8s5tICemzpQ3hi5EpxzGW+JA==", + "peer": true, "dependencies": { "embla-carousel": "8.6.0", "embla-carousel-reactive-utils": "8.6.0" @@ -3176,10 +3210,11 @@ } }, "node_modules/esbuild": { - "version": "0.25.9", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.9.tgz", - "integrity": "sha512-CRbODhYyQx3qp7ZEwzxOk4JBqmD/seJrzPa/cGjY1VtIn5E09Oi9/dB4JwctnfZ8Q8iT7rioVv5k/FNT/uf54g==", + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", "hasInstallScript": true, + "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -3187,32 +3222,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.9", - "@esbuild/android-arm": "0.25.9", - "@esbuild/android-arm64": "0.25.9", - "@esbuild/android-x64": "0.25.9", - "@esbuild/darwin-arm64": "0.25.9", - "@esbuild/darwin-x64": "0.25.9", - "@esbuild/freebsd-arm64": "0.25.9", - "@esbuild/freebsd-x64": "0.25.9", - "@esbuild/linux-arm": "0.25.9", - "@esbuild/linux-arm64": "0.25.9", - "@esbuild/linux-ia32": "0.25.9", - "@esbuild/linux-loong64": "0.25.9", - "@esbuild/linux-mips64el": "0.25.9", - "@esbuild/linux-ppc64": "0.25.9", - "@esbuild/linux-riscv64": "0.25.9", - "@esbuild/linux-s390x": "0.25.9", - "@esbuild/linux-x64": "0.25.9", - "@esbuild/netbsd-arm64": "0.25.9", - "@esbuild/netbsd-x64": "0.25.9", - "@esbuild/openbsd-arm64": "0.25.9", - "@esbuild/openbsd-x64": "0.25.9", - "@esbuild/openharmony-arm64": "0.25.9", - "@esbuild/sunos-x64": "0.25.9", - "@esbuild/win32-arm64": "0.25.9", - "@esbuild/win32-ia32": "0.25.9", - "@esbuild/win32-x64": "0.25.9" + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" } }, "node_modules/escalade": { @@ -3243,6 +3278,7 @@ "integrity": "sha512-BhHmn2yNOFA9H9JmmIVKJmd288g9hrVRDkdoIgRCRuSySRUHH7r/DI6aAXW9T1WwUuY3DFgrcaqB+deURBLR5g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -4122,6 +4158,7 @@ "version": "10.1.3", "resolved": "https://registry.npmjs.org/immer/-/immer-10.1.3.tgz", "integrity": "sha512-tmjF/k8QDKydUlm3mZU+tjM6zeq9/fFpPqH9SzWmBnVVKsPBg/V66qsMwb3/Bo90cgUN+ghdVBess+hPsxUyRw==", + "peer": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/immer" @@ -4589,6 +4626,7 @@ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "devOptional": true, "license": "MIT", + "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -5108,6 +5146,7 @@ "url": "https://github.com/sponsors/ai" } ], + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -5267,6 +5306,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -5278,6 +5318,7 @@ "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -5427,11 +5468,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", @@ -6199,6 +6235,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", "dev": true, + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6257,6 +6294,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "napi-postinstall": "^0.3.0" }, @@ -6415,16 +6453,18 @@ "dev": true }, "node_modules/vite": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.4.tgz", - "integrity": "sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==", + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "license": "MIT", + "peer": true, "dependencies": { - "esbuild": "^0.25.0", + "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", - "tinyglobby": "^0.2.14" + "tinyglobby": "^0.2.15" }, "bin": { "vite": "bin/vite.js" @@ -6774,6 +6814,7 @@ "integrity": "sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } From 13d6e484894f7d0fb151f36f58c3d9722c4d2406 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 09:36:16 -0600 Subject: [PATCH 15/24] Use CSS vars for breakpoints and clean CSS Replace Sass-style breakpoint variables ($mantine-breakpoint-*) with CSS custom properties (var(--mantine-breakpoint-...)) across Hero.module.css and Homepage.module.css. Fix media query syntax in Homepage.module.css, remove commented/unused padding in Hero.wrapper and set Homepage.wrapper paddings to 0, and simplify the font-family declaration. These edits tidy styles and prepare the files for pure CSS variable usage and consistent responsive behavior. --- .../blueprint/homePage/Hero.module.css | 17 ++++++----------- .../blueprint/homePage/Homepage.module.css | 14 +++++++------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/components/blueprint/homePage/Hero.module.css b/src/components/blueprint/homePage/Hero.module.css index 2b28038..c53d496 100644 --- a/src/components/blueprint/homePage/Hero.module.css +++ b/src/components/blueprint/homePage/Hero.module.css @@ -1,12 +1,7 @@ .wrapper { position: relative; - /*padding-top: 120px;*/ - padding-bottom: 80px; - @media (max-width: $mantine-breakpoint-sm) { - /*padding-top: 80px;*/ - padding-bottom: 60px; - } + } .inner { @@ -18,7 +13,7 @@ position: absolute; color: light-dark(var(--mantine-color-gray-1), var(--mantine-color-dark-5)); - @media (max-width: $mantine-breakpoint-sm) { + @media (max-width: var(--mantine-breakpoint-sm)) { display: none; } } @@ -39,7 +34,7 @@ Greycliff CF, var(--mantine-font-family); - @media (max-width: $mantine-breakpoint-xs) { + @media (max-width: var(--mantine-breakpoint-xs)) { font-size: 28px; text-align: left; } @@ -52,7 +47,7 @@ .description { text-align: center; - @media (max-width: $mantine-breakpoint-xs) { + @media (max-width: var(--mantine-breakpoint-xs)) { text-align: left; font-size: var(--mantine-font-size-md); } @@ -63,7 +58,7 @@ display: flex; justify-content: center; - @media (max-width: $mantine-breakpoint-xs) { + @media (max-width: var(--mantine-breakpoint-xs)) { flex-direction: column; } } @@ -73,7 +68,7 @@ margin-left: var(--mantine-spacing-md); } - @media (max-width: $mantine-breakpoint-xs) { + @media (max-width: var(--mantine-breakpoint-xs)) { height: 42px; font-size: var(--mantine-font-size-md); diff --git a/src/components/blueprint/homePage/Homepage.module.css b/src/components/blueprint/homePage/Homepage.module.css index 36bd9fc..57d2257 100644 --- a/src/components/blueprint/homePage/Homepage.module.css +++ b/src/components/blueprint/homePage/Homepage.module.css @@ -1,17 +1,16 @@ .wrapper { - padding-top: calc(var(--mantine-spacing-xl) * 4); - padding-bottom: calc(var(--mantine-spacing-xl) * 4); + padding-top: calc(var(--mantine-spacing-xl) * 0); + padding-bottom: calc(var(--mantine-spacing-xl) * 0); } .title { - font-family: - Greycliff CF, - var(--mantine-font-family); + font-family: "Greycliff CF", var(--mantine-font-family); font-weight: 900; margin-bottom: var(--mantine-spacing-md); text-align: center; - @media (max-width: $mantine-breakpoint-sm) { + /* Correcting media query syntax */ + @media screen and (max-width: var(--mantine-breakpoint-sm)) { font-size: 28px; text-align: left; } @@ -20,7 +19,8 @@ .description { text-align: center; - @media (max-width: $mantine-breakpoint-sm) { + /* Correcting media query syntax */ + @media screen and (max-width: var(--mantine-breakpoint-sm)) { text-align: left; } } From 6ac824241dcff8c9ecbac9ea492af422a283c074 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 09:36:51 -0600 Subject: [PATCH 16/24] Tighten up simple view --- src/components/blueprint/simpleView/simple.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/blueprint/simpleView/simple.tsx b/src/components/blueprint/simpleView/simple.tsx index 0738480..b4c682e 100644 --- a/src/components/blueprint/simpleView/simple.tsx +++ b/src/components/blueprint/simpleView/simple.tsx @@ -299,7 +299,7 @@ function SimpleBoss({bossName}: { bossName: string }) { function AnteSkeletonLoader() { return ( - + {/* Shop section */} @@ -341,7 +341,7 @@ function AnteSkeletonLoader() { - + ); } @@ -392,7 +392,7 @@ function Simple() { }; return ( - + {hasLockedCards && ( @@ -426,8 +426,8 @@ function Simple() { const blinds = value.blinds; return ( - - Ante {key} + + Ante {key} @@ -444,7 +444,7 @@ function Simple() { {/* Shop section */} Shop - + {value.queue.map((card, index) => ( - + {pack.cards.map((card, cardIndex) => ( - + ); })} From 00511fb38d3a67a6f20e1e6bd437b8f69de9a1e0 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 09:37:12 -0600 Subject: [PATCH 17/24] simple drag -vs- reroll hold FIGHT! --- .../blueprint/simpleView/simpleBuyWrapper.tsx | 67 +++++++++++++++---- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/src/components/blueprint/simpleView/simpleBuyWrapper.tsx b/src/components/blueprint/simpleView/simpleBuyWrapper.tsx index 66bd201..8e45b05 100644 --- a/src/components/blueprint/simpleView/simpleBuyWrapper.tsx +++ b/src/components/blueprint/simpleView/simpleBuyWrapper.tsx @@ -1,8 +1,7 @@ // src/components/SimpleBuyerWrapper.tsx -import React from "react"; +import React, {useRef} from "react"; import {IconLock} from "@tabler/icons-react"; import {ActionIcon, Box, Tooltip} from "@mantine/core"; -import {useLongPress} from "@mantine/hooks" import {useCardStore} from "../../../modules/state/store.ts"; @@ -17,14 +16,11 @@ export function SimpleBuyerWrapper({card, cardId, children}: SimpleBuyerWrapperP const lockCard = useCardStore(state => state.lockCard); const unlockCard = useCardStore(state => state.unlockCard); const isLocked = cardId in lockedCards; - - const handlers = useLongPress(()=>{ - if (isLocked) { - unlockCard(cardId); - } else { - lockCard(cardId, card); - } - }); + + const startXRef = useRef(0); + const startYRef = useRef(0); + const timeoutRef = useRef(null); + const longPressTriggeredRef = useRef(false); const handleContextMenu = (e: React.MouseEvent) => { e.preventDefault(); @@ -35,10 +31,53 @@ export function SimpleBuyerWrapper({card, cardId, children}: SimpleBuyerWrapperP } }; + const handleMouseDown = (e: React.MouseEvent) => { + startXRef.current = e.clientX; + startYRef.current = e.clientY; + longPressTriggeredRef.current = false; + + // Set up long press timer + timeoutRef.current = setTimeout(() => { + longPressTriggeredRef.current = true; + if (isLocked) { + unlockCard(cardId); + } else { + lockCard(cardId, card); + } + }, 500); // 500ms long press duration + }; + + const handleMouseMove = (e: React.MouseEvent) => { + // If already triggered, don't cancel + if (longPressTriggeredRef.current) return; + + const deltaX = Math.abs(e.clientX - startXRef.current); + const deltaY = Math.abs(e.clientY - startYRef.current); + + // If mouse moved more than threshold, cancel the long press + if (deltaX+deltaY > 4) { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + timeoutRef.current = null; + } + } + }; + + const handleMouseUp = () => { + if (timeoutRef.current) { + clearTimeout(timeoutRef.current); + timeoutRef.current = null; + } + longPressTriggeredRef.current = false; + }; + return ( {children} From 80f54effe96f444f91e9108da08fe0fe01c100a9 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 09:37:59 -0600 Subject: [PATCH 18/24] Tighten standard view and memoize --- .../blueprint/standardView/index.tsx | 61 ++++++++++++------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/components/blueprint/standardView/index.tsx b/src/components/blueprint/standardView/index.tsx index 9f7a2cd..6f6868b 100644 --- a/src/components/blueprint/standardView/index.tsx +++ b/src/components/blueprint/standardView/index.tsx @@ -26,7 +26,7 @@ import {BuyWrapper} from "../../buyerWrapper.tsx"; import {LOCATIONS, LOCATION_TYPES, blinds, tagDescriptions} from "../../../modules/const.ts"; import { useCardStore} from "../../../modules/state/store.ts"; import {GameCard} from "../../Rendering/cards.tsx"; -import Header from "../layout/header.tsx"; +import Header, {HEADER_HEIGHT} from "../layout/header.tsx"; import NavBar from "../layout/navbar.tsx"; import {Aside} from "../layout/aside.tsx"; import Footer from "../layout/footer.tsx"; @@ -69,7 +69,7 @@ function QueueCarousel({ queue, tabName }: { queue: Array, tabName: string slideGap={{ base: 'sm' }} slideSize={{ base: 90 }} withControls={false} - height={190} + height={140} emblaOptions={{ dragFree: true, containScroll: "keepSnaps" }} type={'container'} > @@ -110,14 +110,13 @@ function AntePanel({ ante, tabName, timeTravelVoucherOffset }: { const selectedBlind = useCardStore(state => state.applicationState.selectedBlind); const packs = ante.blinds[selectedBlind].packs; return ( - - - + +
- + Voucher name) ?? []} w={'100%'} - variant={'separated'}> + variant={'separated'} styles={{ + item: { marginBottom: '0.5rem' }, + control: { padding: '0.75rem' }, + content: { padding: '0.5rem' } + }}> { packs.map((pack: Pack, index: number) => { return ( @@ -159,14 +162,14 @@ function AntePanel({ ante, tabName, timeTravelVoucherOffset }: { - + - ) } @@ -430,13 +432,27 @@ function SeedExplorer() { const pool = SeedResults.antes + const anteKeys = useMemo(() => Object.keys(pool), [pool]) + useEffect(() => { + if (!anteKeys.length) { + return + } + if (!anteKeys.includes(String(selectedAnte))) { + setSelectedAnte(Number(anteKeys[0])) + } + }, [anteKeys, selectedAnte, setSelectedAnte]) + + if (anteKeys.length === 0) { + return null + } + + const resolvedAnte = pool[Number(anteKeys[0])] const itemPool = selectedAnte return ( <> setSelectedAnte(Number(e.currentTarget.value))} @@ -450,14 +466,13 @@ function SeedExplorer() { onChange={(v)=>setSelectedBlind(v as Blinds)} fullWidth radius="xl" - size="md" - mb={'sm'} + size="xs" data={blinds.map((blind: string, i: number) => ({ value: ['smallBlind', 'bigBlind', 'bossBlind'][i], - label: - {blind} - {i < 2 && ( - + label: + {blind} + {i < 2 && resolvedAnte && ( + ) } { @@ -465,12 +480,12 @@ function SeedExplorer() { - + - {pool[itemPool].boss} + {resolvedAnte?.boss} @@ -563,7 +578,7 @@ export function Blueprint() { return ( Date: Mon, 2 Feb 2026 10:21:10 -0600 Subject: [PATCH 19/24] fix no refs for functional components crash --- src/components/Rendering/canvasRenderer.tsx | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/components/Rendering/canvasRenderer.tsx b/src/components/Rendering/canvasRenderer.tsx index 6a52cd5..59de194 100644 --- a/src/components/Rendering/canvasRenderer.tsx +++ b/src/components/Rendering/canvasRenderer.tsx @@ -110,10 +110,11 @@ interface SimpleRenderProps { -export function SimpleRenderCanvas({ layers, invert = false }: SimpleRenderProps) { - const canvasRef = useRef(null); - const [ratio, setRatio] = useState(3 / 4); - const forceUpdate = useForceUpdate(); +export const SimpleRenderCanvas = React.forwardRef( + ({ layers, invert = false }, ref) => { + const canvasRef = useRef(null); + const [ratio, setRatio] = useState(3 / 4); + const forceUpdate = useForceUpdate(); useEffect(() => { if (!canvasRef.current || !layers || layers.length === 0) return; const canvas = canvasRef.current; @@ -152,7 +153,7 @@ export function SimpleRenderCanvas({ layers, invert = false }: SimpleRenderProps }, [layers, invert]); return ( - + ); -} +}); + +SimpleRenderCanvas.displayName = 'SimpleRenderCanvas'; // Advanced card rendering with canvas From 8ec006936f8fd8d69e535b55896febdbdd9352ee Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 15:58:41 -0600 Subject: [PATCH 20/24] Snug fit for seed input on hero page MOBILE ONLY --- src/components/blueprint/homePage/Hero.module.css | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/blueprint/homePage/Hero.module.css b/src/components/blueprint/homePage/Hero.module.css index c53d496..18bee8a 100644 --- a/src/components/blueprint/homePage/Hero.module.css +++ b/src/components/blueprint/homePage/Hero.module.css @@ -60,6 +60,9 @@ @media (max-width: var(--mantine-breakpoint-xs)) { flex-direction: column; + max-width: 340px; + margin-left: auto; + margin-right: auto; } } From 1f713447d58dd13408e67bab80bf7cf304ddce31 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 15:58:52 -0600 Subject: [PATCH 21/24] found the stupid scrolling thing --- src/App.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/App.tsx b/src/App.tsx index dcbacfa..ed90d17 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -39,7 +39,6 @@ export default function App() { - ); From e65a59b84a75af3333e0603a7a0e2a9fd986c5a6 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 15:59:25 -0600 Subject: [PATCH 22/24] Add Seed label back to the header/left-side --- src/components/blueprint/layout/navbar.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/blueprint/layout/navbar.tsx b/src/components/blueprint/layout/navbar.tsx index 7bab954..53823de 100644 --- a/src/components/blueprint/layout/navbar.tsx +++ b/src/components/blueprint/layout/navbar.tsx @@ -149,6 +149,7 @@ export default function NavBar() { From c7c387320461aa99fba49b1cbf8c2a2d2bf9eff9 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 20:25:16 -0600 Subject: [PATCH 23/24] crash fix on weird go back and forth between pages and modes: antes undefined if search string is undefined.? and zome buy button z index for smaller view --- src/components/SeedInputAutoComplete.tsx | 4 ++++ src/components/buyerWrapper.tsx | 5 +++-- src/components/searchInput.tsx | 6 +++--- src/modules/state/analysisResultProvider.tsx | 3 --- src/modules/state/downloadProvider.tsx | 3 +++ 5 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/components/SeedInputAutoComplete.tsx b/src/components/SeedInputAutoComplete.tsx index 43099e4..00a0cc4 100644 --- a/src/components/SeedInputAutoComplete.tsx +++ b/src/components/SeedInputAutoComplete.tsx @@ -73,6 +73,10 @@ export default function SeedInputAutoComplete({width, label, seed, setSeed}: { w placeholder={'Enter Seed'} value={localValue} onChange={setLocalValue} + onOptionSubmit={(val) => { + setSeed(val); + setLocalValue(val); + }} onBlur={() => { setSeed(localValue); }} diff --git a/src/components/buyerWrapper.tsx b/src/components/buyerWrapper.tsx index 17eee33..9fb2325 100644 --- a/src/components/buyerWrapper.tsx +++ b/src/components/buyerWrapper.tsx @@ -108,7 +108,8 @@ export function BuyWrapper({ children, bottomOffset, metaData, horizontal = fals boxShadow: isSelected ? '0 0 12px 12px rgba(255,255,255,0.3)' : 'none', transform: hasUserAttention ? 'scale(1.15)' : 'none', transition: 'transform 0.4s ease', - zIndex: hasUserAttention ? 20 : 0 + zIndex: hasUserAttention ? 100 : 0, + position: 'relative' }} > @@ -149,7 +150,7 @@ export function BuyWrapper({ children, bottomOffset, metaData, horizontal = fals wrap="nowrap" gap={0} pos={'absolute'} - style={{ ...styles, zIndex: 1 }} + style={{ ...styles, zIndex: 101 }} left={horizontal ? "200px" : 'unset'} top={horizontal ? 'unset' : bottomOffset ? `calc(80% + ${bottomOffset}px)` : '80%'} > diff --git a/src/components/searchInput.tsx b/src/components/searchInput.tsx index a63e4d9..fa74064 100644 --- a/src/components/searchInput.tsx +++ b/src/components/searchInput.tsx @@ -76,9 +76,9 @@ export default function SearchSeedInput() { const searchResults = useMemo(() => { - if (searchString === '' || !searchActive) return []; + if (!searchActive || !SeedResults || searchString === '') return []; const cards: Array = []; - const antes: Array = Object.values(SeedResults?.antes ?? {}); + const antes: Array = Object.values(SeedResults.antes); antes.forEach((ante: Ante) => { ante.queue.forEach((card, index) => { const cardString = `${(card.edition && card.edition !== 'No Edition') ? card.edition : ''} ${card.name}`.trim(); @@ -158,7 +158,7 @@ export default function SearchSeedInput() { } return false; }) - }, [searchString, searchActive, SeedResults?.antes, sourceFilterConfig.shop.enabled, sourceFilterConfig.packs.enabled, sourceFilterConfig.misc]) + }, [searchString, searchActive, SeedResults, sourceFilterConfig.shop.enabled, sourceFilterConfig.packs.enabled, sourceFilterConfig.misc]) return ( <> { + if (!SeedResults) { + return; + } const dataStr = "data:text/json;charset=utf-8," + encodeURIComponent( JSON.stringify({ analyzeState: analyzeState, From a2b80dbe3b7b735e67ebc6139ef158088355dbb0 Mon Sep 17 00:00:00 2001 From: "Nathanial P. Howard" Date: Mon, 2 Feb 2026 20:28:13 -0600 Subject: [PATCH 24/24] Update index.tsx --- src/components/blueprint/standardView/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/blueprint/standardView/index.tsx b/src/components/blueprint/standardView/index.tsx index 6f6868b..31529d1 100644 --- a/src/components/blueprint/standardView/index.tsx +++ b/src/components/blueprint/standardView/index.tsx @@ -578,7 +578,7 @@ export function Blueprint() { return (