diff --git a/src/algo.ts b/src/algo.ts index 71a4b12..fbb8d00 100644 --- a/src/algo.ts +++ b/src/algo.ts @@ -1,10 +1,22 @@ import { operators, pool } from './globals' -import { OperatorType } from './types' +import { Operation, OperatorType } from './types' import { randRange } from './utils' type HistoryType = { a: number; b: number; op: OperatorType }[] -export function operate(operator: OperatorType, valA: number, valB: number): number { +export function isOperationValid(op: Operation): boolean { + return ( + !!op.operator && + !!op.left && + !!op.right && + Number.isInteger(operate(op.operator, op.left?.value, op.right?.value)) + ) +} +export function operate( + operator: OperatorType, + valA: number, + valB: number, +): number { switch (operator) { case '+': return valA + valB diff --git a/src/components/HelloWorld.vue b/src/components/HelloWorld.vue index 85e9e42..378fc6e 100644 --- a/src/components/HelloWorld.vue +++ b/src/components/HelloWorld.vue @@ -1,16 +1,22 @@ diff --git a/src/components/TheWelcome.vue b/src/components/TheWelcome.vue index f9e3f17..432add5 100644 --- a/src/components/TheWelcome.vue +++ b/src/components/TheWelcome.vue @@ -1,10 +1,10 @@ diff --git a/src/components/WelcomeItem.vue b/src/components/WelcomeItem.vue index 6cff194..9a9f78d 100644 --- a/src/components/WelcomeItem.vue +++ b/src/components/WelcomeItem.vue @@ -1,13 +1,13 @@ diff --git a/src/components/__tests__/HelloWorld.spec.ts b/src/components/__tests__/HelloWorld.spec.ts index da11e2e..acfdac7 100644 --- a/src/components/__tests__/HelloWorld.spec.ts +++ b/src/components/__tests__/HelloWorld.spec.ts @@ -1,11 +1,11 @@ -import { describe, it, expect } from "vitest"; +import { mount } from '@vue/test-utils' +import { describe, expect, it } from 'vitest' -import { mount } from "@vue/test-utils"; -import HelloWorld from "../HelloWorld.vue"; +import HelloWorld from '../HelloWorld.vue' -describe("HelloWorld", () => { - it("renders properly", () => { - const wrapper = mount(HelloWorld, { props: { msg: "Hello Vitest" } }); - expect(wrapper.text()).toContain("Hello Vitest"); - }); -}); +describe('HelloWorld', () => { + it('renders properly', () => { + const wrapper = mount(HelloWorld, { props: { msg: 'Hello Vitest' } }) + expect(wrapper.text()).toContain('Hello Vitest') + }) +}) diff --git a/src/components/common/NumberBox.vue b/src/components/common/NumberBox.vue index c20dc39..a8569b4 100644 --- a/src/components/common/NumberBox.vue +++ b/src/components/common/NumberBox.vue @@ -1,6 +1,6 @@ diff --git a/src/components/icons/IconCommunity.vue b/src/components/icons/IconCommunity.vue index ea8ddef..074ac1b 100644 --- a/src/components/icons/IconCommunity.vue +++ b/src/components/icons/IconCommunity.vue @@ -3,10 +3,8 @@ xmlns="http://www.w3.org/2000/svg" width="20" height="20" - fill="currentColor" - > + fill="currentColor"> + d="M15 4a1 1 0 1 0 0 2V4zm0 11v-1a1 1 0 0 0-1 1h1zm0 4l-.707.707A1 1 0 0 0 16 19h-1zm-4-4l.707-.707A1 1 0 0 0 11 14v1zm-4.707-1.293a1 1 0 0 0-1.414 1.414l1.414-1.414zm-.707.707l-.707-.707.707.707zM9 11v-1a1 1 0 0 0-.707.293L9 11zm-4 0h1a1 1 0 0 0-1-1v1zm0 4H4a1 1 0 0 0 1.707.707L5 15zm10-9h2V4h-2v2zm2 0a1 1 0 0 1 1 1h2a3 3 0 0 0-3-3v2zm1 1v6h2V7h-2zm0 6a1 1 0 0 1-1 1v2a3 3 0 0 0 3-3h-2zm-1 1h-2v2h2v-2zm-3 1v4h2v-4h-2zm1.707 3.293l-4-4-1.414 1.414 4 4 1.414-1.414zM11 14H7v2h4v-2zm-4 0c-.276 0-.525-.111-.707-.293l-1.414 1.414C5.42 15.663 6.172 16 7 16v-2zm-.707 1.121l3.414-3.414-1.414-1.414-3.414 3.414 1.414 1.414zM9 12h4v-2H9v2zm4 0a3 3 0 0 0 3-3h-2a1 1 0 0 1-1 1v2zm3-3V3h-2v6h2zm0-6a3 3 0 0 0-3-3v2a1 1 0 0 1 1 1h2zm-3-3H3v2h10V0zM3 0a3 3 0 0 0-3 3h2a1 1 0 0 1 1-1V0zM0 3v6h2V3H0zm0 6a3 3 0 0 0 3 3v-2a1 1 0 0 1-1-1H0zm3 3h2v-2H3v2zm1-1v4h2v-4H4zm1.707 4.707l.586-.586-1.414-1.414-.586.586 1.414 1.414z" /> diff --git a/src/components/icons/IconDocumentation.vue b/src/components/icons/IconDocumentation.vue index 63a8534..3a77cbe 100644 --- a/src/components/icons/IconDocumentation.vue +++ b/src/components/icons/IconDocumentation.vue @@ -3,10 +3,8 @@ xmlns="http://www.w3.org/2000/svg" width="20" height="17" - fill="currentColor" - > + fill="currentColor"> + d="M11 2.253a1 1 0 1 0-2 0h2zm-2 13a1 1 0 1 0 2 0H9zm.447-12.167a1 1 0 1 0 1.107-1.666L9.447 3.086zM1 2.253L.447 1.42A1 1 0 0 0 0 2.253h1zm0 13H0a1 1 0 0 0 1.553.833L1 15.253zm8.447.833a1 1 0 1 0 1.107-1.666l-1.107 1.666zm0-14.666a1 1 0 1 0 1.107 1.666L9.447 1.42zM19 2.253h1a1 1 0 0 0-.447-.833L19 2.253zm0 13l-.553.833A1 1 0 0 0 20 15.253h-1zm-9.553-.833a1 1 0 1 0 1.107 1.666L9.447 14.42zM9 2.253v13h2v-13H9zm1.553-.833C9.203.523 7.42 0 5.5 0v2c1.572 0 2.961.431 3.947 1.086l1.107-1.666zM5.5 0C3.58 0 1.797.523.447 1.42l1.107 1.666C2.539 2.431 3.928 2 5.5 2V0zM0 2.253v13h2v-13H0zm1.553 13.833C2.539 15.431 3.928 15 5.5 15v-2c-1.92 0-3.703.523-5.053 1.42l1.107 1.666zM5.5 15c1.572 0 2.961.431 3.947 1.086l1.107-1.666C9.203 13.523 7.42 13 5.5 13v2zm5.053-11.914C11.539 2.431 12.928 2 14.5 2V0c-1.92 0-3.703.523-5.053 1.42l1.107 1.666zM14.5 2c1.573 0 2.961.431 3.947 1.086l1.107-1.666C18.203.523 16.421 0 14.5 0v2zm3.5.253v13h2v-13h-2zm1.553 12.167C18.203 13.523 16.421 13 14.5 13v2c1.573 0 2.961.431 3.947 1.086l1.107-1.666zM14.5 13c-1.92 0-3.703.523-5.053 1.42l1.107 1.666C11.539 15.431 12.928 15 14.5 15v-2z" /> diff --git a/src/components/icons/IconEcosystem.vue b/src/components/icons/IconEcosystem.vue index 385a202..916de46 100644 --- a/src/components/icons/IconEcosystem.vue +++ b/src/components/icons/IconEcosystem.vue @@ -3,10 +3,8 @@ xmlns="http://www.w3.org/2000/svg" width="18" height="20" - fill="currentColor" - > + fill="currentColor"> + d="M11.447 8.894a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm0 1.789a1 1 0 1 0 .894-1.789l-.894 1.789zM7.447 7.106a1 1 0 1 0-.894 1.789l.894-1.789zM10 9a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0H8zm9.447-5.606a1 1 0 1 0-.894-1.789l.894 1.789zm-2.894-.789a1 1 0 1 0 .894 1.789l-.894-1.789zm2 .789a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zM18 5a1 1 0 1 0-2 0h2zm-2 2.5a1 1 0 1 0 2 0h-2zm-5.447-4.606a1 1 0 1 0 .894-1.789l-.894 1.789zM9 1l.447-.894a1 1 0 0 0-.894 0L9 1zm-2.447.106a1 1 0 1 0 .894 1.789l-.894-1.789zm-6 3a1 1 0 1 0 .894 1.789L.553 4.106zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zm-2-.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 2.789a1 1 0 1 0 .894-1.789l-.894 1.789zM2 5a1 1 0 1 0-2 0h2zM0 7.5a1 1 0 1 0 2 0H0zm8.553 12.394a1 1 0 1 0 .894-1.789l-.894 1.789zm-1.106-2.789a1 1 0 1 0-.894 1.789l.894-1.789zm1.106 1a1 1 0 1 0 .894 1.789l-.894-1.789zm2.894.789a1 1 0 1 0-.894-1.789l.894 1.789zM8 19a1 1 0 1 0 2 0H8zm2-2.5a1 1 0 1 0-2 0h2zm-7.447.394a1 1 0 1 0 .894-1.789l-.894 1.789zM1 15H0a1 1 0 0 0 .553.894L1 15zm1-2.5a1 1 0 1 0-2 0h2zm12.553 2.606a1 1 0 1 0 .894 1.789l-.894-1.789zM17 15l.447.894A1 1 0 0 0 18 15h-1zm1-2.5a1 1 0 1 0-2 0h2zm-7.447-5.394l-2 1 .894 1.789 2-1-.894-1.789zm-1.106 1l-2-1-.894 1.789 2 1 .894-1.789zM8 9v2.5h2V9H8zm8.553-4.894l-2 1 .894 1.789 2-1-.894-1.789zm.894 0l-2-1-.894 1.789 2 1 .894-1.789zM16 5v2.5h2V5h-2zm-4.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zm-2.894-1l-2 1 .894 1.789 2-1L8.553.106zM1.447 5.894l2-1-.894-1.789-2 1 .894 1.789zm-.894 0l2 1 .894-1.789-2-1-.894 1.789zM0 5v2.5h2V5H0zm9.447 13.106l-2-1-.894 1.789 2 1 .894-1.789zm0 1.789l2-1-.894-1.789-2 1 .894 1.789zM10 19v-2.5H8V19h2zm-6.553-3.894l-2-1-.894 1.789 2 1 .894-1.789zM2 15v-2.5H0V15h2zm13.447 1.894l2-1-.894-1.789-2 1 .894 1.789zM18 15v-2.5h-2V15h2z" /> diff --git a/src/components/icons/IconSupport.vue b/src/components/icons/IconSupport.vue index 7db961e..565555b 100644 --- a/src/components/icons/IconSupport.vue +++ b/src/components/icons/IconSupport.vue @@ -3,10 +3,8 @@ xmlns="http://www.w3.org/2000/svg" width="20" height="20" - fill="currentColor" - > + fill="currentColor"> + d="M10 3.22l-.61-.6a5.5 5.5 0 0 0-7.666.105 5.5 5.5 0 0 0-.114 7.665L10 18.78l8.39-8.4a5.5 5.5 0 0 0-.114-7.665 5.5 5.5 0 0 0-7.666-.105l-.61.61z" /> diff --git a/src/components/icons/IconTooling.vue b/src/components/icons/IconTooling.vue index 660598d..4bcec97 100644 --- a/src/components/icons/IconTooling.vue +++ b/src/components/icons/IconTooling.vue @@ -9,11 +9,9 @@ width="24" height="24" preserveAspectRatio="xMidYMid meet" - viewBox="0 0 24 24" - > + viewBox="0 0 24 24"> + fill="currentColor" /> diff --git a/src/main.ts b/src/main.ts index b577dfa..6e224c7 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,7 +1,9 @@ +import './index.css' + import { createApp } from 'vue' + import App from './App.vue' import router from './router' -import './index.css' const app = createApp(App) diff --git a/src/router/index.ts b/src/router/index.ts index 595a422..64440a2 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,4 +1,5 @@ import { createRouter, createWebHistory } from 'vue-router' + import GameView from '../views/GameView.vue' const router = createRouter({ @@ -7,9 +8,9 @@ const router = createRouter({ { path: '/', name: 'game', - component: GameView - } - ] + component: GameView, + }, + ], }) export default router diff --git a/src/types.ts b/src/types.ts index aaaed90..692003d 100644 --- a/src/types.ts +++ b/src/types.ts @@ -1,6 +1,13 @@ export type OperatorType = '+' | '-' | '*' | '/' -export type Operation = { - left: number | null - right: number | null - operator: OperatorType | null + +export type Plaquette = { + value: number + free: boolean +} + +export type Operation = { + left: Plaquette | null + right: Plaquette | null + operator: OperatorType | null + executed: boolean } diff --git a/src/views/GameView.vue b/src/views/GameView.vue index 35bf895..19b3639 100644 --- a/src/views/GameView.vue +++ b/src/views/GameView.vue @@ -5,22 +5,28 @@ - + {{ result }} -
- - {{ item }} - +
+ + + {{ item.value }} + +
-
+ +
@@ -28,57 +34,124 @@
-
+
+ +
-
-
- {{ operation.left ?? '?' }} {{ operation.operator ?? '?' }} - {{ operation.right ?? '?' }} -
-
- = -
-
- {{ operate(operation.operator, operation.left, operation.right) }} -
+ +
+ + {{ operation.left?.value ?? '?' }} + + + {{ operation.operator ?? '' }} + + + {{ operation.right?.value ?? '?' }} +
+ + + + = + + + + + + {{ + operate( + operation.operator, + operation.left.value, + operation.right.value + ) + }} + + ? +
+ + diff --git a/tailwind.config.js b/tailwind.config.js index d37e375..e10c99a 100644 --- a/tailwind.config.js +++ b/tailwind.config.js @@ -3,8 +3,8 @@ module.exports = { theme: { extend: {}, fontFamily: { - sans: ['Manrope', 'ui-sans-serif', 'system-ui', 'apple-system'] - } + sans: ['Manrope', 'ui-sans-serif', 'system-ui', 'apple-system'], + }, }, - plugins: [] + plugins: [], } diff --git a/vite.config.ts b/vite.config.ts index 5d02fc2..391001f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,14 +1,13 @@ -import { fileURLToPath, URL } from "url"; - -import { defineConfig } from "vite"; -import vue from "@vitejs/plugin-vue"; +import vue from '@vitejs/plugin-vue' +import { fileURLToPath, URL } from 'url' +import { defineConfig } from 'vite' // https://vitejs.dev/config/ export default defineConfig({ plugins: [vue()], resolve: { alias: { - "@": fileURLToPath(new URL("./src", import.meta.url)), + '@': fileURLToPath(new URL('./src', import.meta.url)), }, }, -}); +})