diff --git a/index.html b/index.html index e700fa7..e93b5ff 100644 --- a/index.html +++ b/index.html @@ -11,175 +11,207 @@ <div class="container"> <div class="row"> <div class="col pt-3 pt-lg-5"> - <h1>Tripeaks Solver</h1> + <h1 class="mb-3">Tripeaks Solver</h1> - <p> - Enter cards representing a Tripeaks game below. Enter each card as 2 - characters representing the rank (A, 2, 3, 4, 5, 6, 7, 8, 9, T, J, - Q, K) and suit (C, D, H, S). For example, "TH" is the Ten of Hearts. - </p> + <div x-data="{show: false}" class="accordion mb-3" id="readMeAccordion"> + <div class="accordion-item"> + <h2 id="readMeHeader" class="accordion-header" > + <button + class="accordion-button" + :class="{'collapsed': !show}" + type="button" + :aria-expanded="show ? 'true' : 'false'" + aria-controls="collapseOne" + @click="show = !show"> + Read Me / How To + </button> + </h2> + <div id="collapseOne" class="accordion-collapse collapse" :class="{'show': show}" aria-labelledby="headingOne"> + <div class="accordion-body"> - <p> - Use a single zero ("0") for unknown cards. However, the last 34 - cards (bottom row & stock) must be known, and you don't need to - enter unknown cards before the first card you know. - </p> + <p> + Enter cards representing a Tripeaks game below. Enter each card as 2 + characters representing the rank (A, 2, 3, 4, 5, 6, 7, 8, 9, T, J, + Q, K) and suit (C, D, H, S). For example, "TH" is the Ten of Hearts. + </p> + + <p> + Use a single zero ("0") for unknown cards. However, the last 34 + cards (bottom row & stock) must be known, and you don't need to + enter unknown cards before the first card you know. + </p> + + <p> + Entry is case-insensitive, and you can separate cards with any + character (space, comma, etc), or use no separator. Valid examples: + </p> + + <ul> + <li> + 7S 5D 7C 2D 0 0 3S 2H 3H 9H KC QC TD 8D 9C 7H 9D JS QS 4H 5C 5S 4C + 2C QD 8C KD 3D KS JD 2S 7D KH AH 5H 9S 4S QH 6S 6D 3C JC TC 8H 6C + TH AS AD 6H + </li> + <li> + jc, ts, 6d, 7h, qh, 3s, 5h, jh, 6h, 2d, ac, 7s, 7c, 3d, kd, 9s, + 3c, th, 6c, ah, 8h, tc, 4s, 8c, ad, 3h, ks, 6s, js, 7d, jd, td, + 2c, kh + </li> + <li> + 7c03s0qsjc00JSasTSadtcqd9s4s2h9h8sjh6c3dks5s5c6h9C2Cac8C6d5DTH8dkckd9d4c5h8hqh6s + </li> + </ul> + + </div> + </div> + </div> - <p> - Entry is case-insensitive, and you can separate cards with any - character (space, comma, etc), or use no separator. Valid examples: - </p> + </div> - <ul> - <li> - 7S 5D 7C 2D 0 0 3S 2H 3H 9H KC QC TD 8D 9C 7H 9D JS QS 4H 5C 5S 4C - 2C QD 8C KD 3D KS JD 2S 7D KH AH 5H 9S 4S QH 6S 6D 3C JC TC 8H 6C - TH AS AD 6H - </li> - <li> - jc, ts, 6d, 7h, qh, 3s, 5h, jh, 6h, 2d, ac, 7s, 7c, 3d, kd, 9s, - 3c, th, 6c, ah, 8h, tc, 4s, 8c, ad, 3h, ks, 6s, js, 7d, jd, td, - 2c, kh - </li> - <li> - 7c03s0qsjc00JSasTSadtcqd9s4s2h9h8sjh6c3dks5s5c6h9C2Cac8C6d5DTH8dkckd9d4c5h8hqh6s - </li> - </ul> + <div class="row"> - <!-- User input of game cards --> - <form - id="cardsInputForm" - x-data="cardsInputForm" - @submit.prevent="$dispatch('solve-game')" - class="needs-validation" - :class="{'was-validated': isFormValid && inputValue.length > 2 }" - novalidate - > - <h3 id="cardsInputLabel" for="cardsInput" class="form-label"> - Enter Your Cards - </h3> - <div class="input-group"> - <input - id="cardsInput" - aria-describedby="cardsInputLabel" - type="text" - x-model="inputValue" - class="form-control" - :class="{ 'is-valid': isFormValid && inputValue.length > 2, 'is-invalid': !isFormValid && inputValue.length > 2 }" - maxlength="206" - @keyup.debounce="validateCardsInput()" - placeholder="e.g., 2S TC 4S QD KH 5S 9S ..." - :disabled="$store.global.solvingInProgress" - /> - <button - id="cardsInputButton" - type="submit" - class="btn btn-outline-primary" - :disabled="!isFormValid || $store.global.solvingInProgress" + <div class="col-12 col-lg-9 col-xl-8"> + <!-- User input of game cards --> + <form + id="cardsInputForm" + x-data="cardsInputForm" + @submit.prevent="$dispatch('solve-game')" + class="needs-validation" + :class="{'was-validated': isFormValid && inputValue.length > 2 }" + novalidate > - Solve - </button> - </div> - <div class="mb-3"> - <template x-for="msg in validMessages"> - <div - class="valid-feedback" - :class="{ 'd-block': validCards.length > 0 }" - x-text="msg" - ></div> - </template> - <template x-for="msg in invalidMessages"> - <div - class="invalid-feedback" - :class="{ 'd-block': invalidMessages.length > 0 && inputValue.length > 2 }" - x-text="msg" - ></div> - </template> - </div> - </form> + <h3 id="cardsInputLabel" for="cardsInput" class="form-label"> + Enter Your Cards + </h3> + <div class="input-group"> + <input + id="cardsInput" + aria-describedby="cardsInputLabel" + type="text" + x-model="inputValue" + class="form-control" + :class="{ 'is-valid': isFormValid && inputValue.length > 2, 'is-invalid': !isFormValid && inputValue.length > 2 }" + maxlength="206" + @keyup.debounce="validateCardsInput()" + placeholder="e.g., 2S TC 4S QD KH 5S 9S ..." + :disabled="$store.global.solvingInProgress" + /> + <button + id="cardsInputButton" + type="submit" + class="btn btn-outline-primary" + :disabled="!isFormValid || $store.global.solvingInProgress" + > + Solve + </button> + </div> + <div class="mb-3"> + <template x-for="msg in validMessages"> + <div + class="valid-feedback" + :class="{ 'd-block': validCards.length > 0 }" + x-text="msg" + ></div> + </template> + <template x-for="msg in invalidMessages"> + <div + class="invalid-feedback" + :class="{ 'd-block': invalidMessages.length > 0 && inputValue.length > 2 }" + x-text="msg" + ></div> + </template> + </div> + </form> - <!-- Friendly display of game cards --> - <div - id="playingCardsPreview" - x-data="playingCardsPreview" - class="mb-4" - > - <div - id="gamePyramid" - class="game-pyramid-container p-2 p-md-3 p-lg-4" - > - <!-- first/top row (index 0, row 1) --> - <span class="visually-hidden">Game Row 1, Top of Peaks</span> - <template x-for="(card, index) in cardsBySlice(0, 3)"> - <div - x-html="cardSvg(card)" - :class="`game-pyramid-card game-pyramid-card-0-${index}`" - ></div> - </template> - - <!-- second row (index 1, row 2) --> - <span class="visually-hidden">Game Row 2, Second Row</span> - <template x-for="(card, index) in cardsBySlice(3, 9)"> - <div - x-html="cardSvg(card)" - :class="`game-pyramid-card game-pyramid-card-1-${index}`" - ></div> - </template> - - <!-- third row (index 2, row 3) --> - <span class="visually-hidden">Game Row 3, Third Row</span> - <template x-for="(card, index) in cardsBySlice(9, 18)"> - <div - x-html="cardSvg(card)" - :class="`game-pyramid-card game-pyramid-card-2-${index}`" - ></div> - </template> - - <!-- last/bottom row (index 3, row 4) --> - <span class="visually-hidden">Game Row 4, Base of Peaks</span> - <template x-for="(card, index) in cardsBySlice(18, 28)"> - <div - x-html="cardSvg(card)" - :class="`game-pyramid-card game-pyramid-card-3-${index}`" - ></div> - </template> - - <!-- stock cards --> - <span class="visually-hidden">Game Stock, the Draw Cards</span> - <template x-for="(card, index) in cardsBySlice(28, 52)"> - <div - x-html="card === 0 || card === '0' ? cardSvgs['2B'] : cardSvgs[card]" - :class="`game-pyramid-card game-pyramid-card-4-${index}`" - ></div> - </template> - </div> - </div> - - <!-- Display of solvingprogress or solution --> - <div id="gameSolving" x-data="gameSolving" x-init="onInit()"> - <div class="d-flex justify-content-start"> + <!-- Friendly display of game cards --> <div - class="spinner-border me-2" - role="status" - x-show="$store.global.solvingInProgress" - ></div> - <h3 @solve-game.window="startSolver()" x-text="headerText"></h3> + id="playingCardsPreview" + x-data="playingCardsPreview" + class="mb-4" + > + <div + id="gamePyramid" + class="game-pyramid-container p-2 p-md-3 p-lg-4" + > + <!-- first/top row (index 0, row 1) --> + <span class="visually-hidden">Game Row 1, Top of Peaks</span> + <template x-for="(card, index) in cardsBySlice(0, 3)"> + <div + x-html="cardSvg(card)" + :class="`game-pyramid-card game-pyramid-card-0-${index}`" + ></div> + </template> + + <!-- second row (index 1, row 2) --> + <span class="visually-hidden">Game Row 2, Second Row</span> + <template x-for="(card, index) in cardsBySlice(3, 9)"> + <div + x-html="cardSvg(card)" + :class="`game-pyramid-card game-pyramid-card-1-${index}`" + ></div> + </template> + + <!-- third row (index 2, row 3) --> + <span class="visually-hidden">Game Row 3, Third Row</span> + <template x-for="(card, index) in cardsBySlice(9, 18)"> + <div + x-html="cardSvg(card)" + :class="`game-pyramid-card game-pyramid-card-2-${index}`" + ></div> + </template> + + <!-- last/bottom row (index 3, row 4) --> + <span class="visually-hidden">Game Row 4, Base of Peaks</span> + <template x-for="(card, index) in cardsBySlice(18, 28)"> + <div + x-html="cardSvg(card)" + :class="`game-pyramid-card game-pyramid-card-3-${index}`" + ></div> + </template> + + <!-- stock cards --> + <span class="visually-hidden">Game Stock, the Draw Cards</span> + <template x-for="(card, index) in cardsBySlice(28, 52)"> + <div + x-html="card === 0 || card === '0' ? cardSvgs['2B'] : cardSvgs[card]" + :class="`game-pyramid-card game-pyramid-card-4-${index}`" + ></div> + </template> + </div> + </div> </div> - <ul x-show="$store.global.solvingInProgress"> - <template x-for="msg in statusMessages"> - <li x-text="msg"></li> - </template> - </ul> - <!-- <p x-show="" x-text="statusMessage"></p> --> + <div class="col-12 col-lg-3 col-xl-4"> + <!-- Display of solvingprogress or solution --> + <div id="gameSolving" x-data="gameSolving" x-init="onInit()"> + <div class="d-flex justify-content-start"> + <div + class="spinner-border me-2" + role="status" + x-show="$store.global.solvingInProgress" + ></div> + <h3 @solve-game.window="startSolver()" x-text="headerText"></h3> + </div> + + <ul x-show="$store.global.solvingInProgress"> + <template x-for="msg in statusMessages"> + <li x-text="msg"></li> + </template> + </ul> + + <!-- <p x-show="" x-text="statusMessage"></p> --> + + <ol x-show="solutionMoves.length > 0"> + <template x-for="move in solutionMoves"> + <li x-text="move"></li> + </template> + </ol> + </div> + </div> - <ol x-show="solutionMoves.length > 0"> - <template x-for="move in solutionMoves"> - <li x-text="move"></li> - </template> - </ol> </div> + </div> </div> </div> diff --git a/main.js b/main.js index d7d7545..cb4bde2 100644 --- a/main.js +++ b/main.js @@ -1,5 +1,6 @@ import "./style.scss"; //import 'bootstrap'; +import './node_modules/bootstrap/js/src/collapse'; import Alpine from "alpinejs"; import cardSvgs from "./cardSvgs"; import SolverWorker from "./solverWorker?worker"; @@ -225,7 +226,7 @@ const encouragements = [ Alpine.data("gameSolving", () => ({ encouragements, solverWorker: null, - headerText: "", + headerText: "Solution will go here:", moveCount: 23, statusMessages: [], solutionMoves: [], diff --git a/vite.config.js b/vite.config.js new file mode 100644 index 0000000..d06f98d --- /dev/null +++ b/vite.config.js @@ -0,0 +1,6 @@ +import { defineConfig } from 'vite' + +export default defineConfig({ + // ... + base: './' +}) \ No newline at end of file