From 839eec1acdbf5c3def04f9d6339f9e1e49087a9c Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sat, 9 Aug 2025 11:27:15 +0200 Subject: [PATCH 01/11] refacto: extract the toolbox component --- src/modules/5s/BoardGameToolbox.vue | 44 ++++++++++++ src/modules/5s/BoardGameWorkshop.vue | 102 ++++++++++++++------------- src/modules/5s/board-game-store.ts | 46 ++++++++---- src/modules/5s/types/5s.ts | 6 ++ src/utils.ts | 6 +- 5 files changed, 135 insertions(+), 69 deletions(-) create mode 100644 src/modules/5s/BoardGameToolbox.vue create mode 100644 src/modules/5s/types/5s.ts diff --git a/src/modules/5s/BoardGameToolbox.vue b/src/modules/5s/BoardGameToolbox.vue new file mode 100644 index 0000000..2b23943 --- /dev/null +++ b/src/modules/5s/BoardGameToolbox.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/modules/5s/BoardGameWorkshop.vue b/src/modules/5s/BoardGameWorkshop.vue index 762fc6e..041965f 100644 --- a/src/modules/5s/BoardGameWorkshop.vue +++ b/src/modules/5s/BoardGameWorkshop.vue @@ -1,54 +1,56 @@ From 09e408bd4a9f5f4abeaa7f3a4053b85f3a4bb6a3 Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sat, 9 Aug 2025 15:28:35 +0200 Subject: [PATCH 06/11] feat: facilitate chess boards --- src/modules/5s/types/board-games.ts | 20 +++++------- src/modules/5s/types/tools.ts | 47 ++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 16 deletions(-) diff --git a/src/modules/5s/types/board-games.ts b/src/modules/5s/types/board-games.ts index 03ab64f..f337730 100644 --- a/src/modules/5s/types/board-games.ts +++ b/src/modules/5s/types/board-games.ts @@ -8,7 +8,7 @@ export const boardGames: BoardGame[] = [ { name: 'Chessboard Engraving', tasks: [ - { name: 'Cut the board base', tools: chooseTools('board-cutter') }, + { name: 'Cut the board base', tools: chooseTools('cutter') }, { name: 'Apply lamination', tools: chooseTools('laminator', 'painter') @@ -19,12 +19,8 @@ export const boardGames: BoardGame[] = [ name: 'Piece Creation', tasks: [ { - name: 'Mold pawns', - tools: chooseTools('mini-mold', 'painter') - }, - { - name: 'Engrave royalty', - tools: chooseTools('dice-engraver', 'mini-mold') + name: 'Mold pieces', + tools: chooseTools('mini-mold', 'cutter') }, { name: 'Paint pieces', @@ -68,7 +64,7 @@ export const boardGames: BoardGame[] = [ tasks: [ { name: 'Cut dungeon tiles', - tools: chooseTools('board-cutter', 'laminator') + tools: chooseTools('cutter', 'laminator') } ] } @@ -82,7 +78,7 @@ export const boardGames: BoardGame[] = [ tasks: [ { name: 'Print scenario deck', - tools: chooseTools('card-printer', 'rulebook-dzn') + tools: chooseTools('card-prisnter', 'rulebook-dzn') }, { name: 'Apply finish', @@ -113,7 +109,7 @@ export const boardGames: BoardGame[] = [ tasks: [ { name: 'Print map base', - tools: chooseTools('board-cutter', 'laminator') + tools: chooseTools('cutter', 'laminator') }, { name: 'Add compass', @@ -171,7 +167,7 @@ export const boardGames: BoardGame[] = [ tasks: [ { name: 'Print jungle layout', - tools: chooseTools('board-cutter', 'painter') + tools: chooseTools('cutter', 'painter') }, { name: 'Seal board', @@ -216,7 +212,7 @@ export const boardGames: BoardGame[] = [ tasks: [ { name: 'Cut castle walls', - tools: chooseTools('board-cutter', 'painter') + tools: chooseTools('cutter', 'painter') }, { name: 'Reinforce walls', diff --git a/src/modules/5s/types/tools.ts b/src/modules/5s/types/tools.ts index ddf7b75..0e263ca 100644 --- a/src/modules/5s/types/tools.ts +++ b/src/modules/5s/types/tools.ts @@ -4,15 +4,54 @@ export const tools: Tool[] = [ { name: 'Card Printer', id: 'card-printer', reference: '', cooldown: 5 }, { name: 'Miniature Mold', id: 'mini-mold', reference: '', cooldown: 15 }, { name: 'Dice Engraver', id: 'dice-engraver', reference: '', cooldown: 10 }, - { name: 'Board Cutter', id: 'board-cutter', reference: '', cooldown: 8 }, + { name: 'Cutter', id: 'cutter', reference: '', cooldown: 8 }, { name: 'Rulebook Designer', id: 'rulebook-dzn', reference: '', cooldown: 6 }, { name: 'Box Assembler', id: 'box-asm', reference: '', cooldown: 4 }, { name: 'Component Painter', id: 'painter', reference: '', cooldown: 12 }, - { name: 'Lamination Machine', id: 'laminator', reference: '', cooldown: 7 } + { name: 'Lamination Machine', id: 'laminator', reference: '', cooldown: 7 }, + // Additional realistic tools + { + name: 'Shrink Wrap Machine', + id: 'shrink-wrap', + reference: '', + cooldown: 9 + }, + { + name: 'Punch Board Cutter', + id: 'punch-cutter', + reference: '', + cooldown: 11 + }, + { + name: 'Sticker Applicator', + id: 'sticker-applicator', + reference: '', + cooldown: 6 + }, + { + name: 'Foil Stamping Press', + id: 'foil-stamp', + reference: '', + cooldown: 13 + }, + { + name: 'Scanner', + id: 'scanner', + reference: '', + cooldown: 5 + }, + { + name: 'Instruction Sheet Folder', + id: 'sheet-folder', + reference: '', + cooldown: 7 + }, + { name: 'Plastic Bag Sealer', id: 'bag-sealer', reference: '', cooldown: 4 }, + { name: 'Barcode Printer', id: 'barcode-printer', reference: '', cooldown: 8 } ] export type NonEmptyArray = [T, ...T[]] export const idToTools = (id: string): Tool => tools.find((t) => t.id === id)! -export const chooseTools = (...ides: string[]): NonEmptyArray => - ides.map(idToTools) as NonEmptyArray +export const chooseTools = (...ids: string[]): NonEmptyArray => + ids.map(idToTools) as NonEmptyArray From 9350bc7bb2b0c74bf85ed6d61292902e260a2247 Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sat, 9 Aug 2025 15:30:15 +0200 Subject: [PATCH 07/11] chore: start on mount on dev --- src/modules/5s/BoardGameWorkshop.vue | 25 ++++++++++++++----------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git a/src/modules/5s/BoardGameWorkshop.vue b/src/modules/5s/BoardGameWorkshop.vue index c72ae00..bb9f313 100644 --- a/src/modules/5s/BoardGameWorkshop.vue +++ b/src/modules/5s/BoardGameWorkshop.vue @@ -3,13 +3,19 @@ import { useBoardGameStore } from '@/modules/5s/board-game-store' import BoardGameToolbox from '@/modules/5s/BoardGameToolbox.vue' import { _5S, is5S } from '@/modules/5s/types/5s' import { toDuration } from '@/modules/5s/utils' -import { ref, toValue } from 'vue' +import { onMounted, ref, toValue } from 'vue' const userInput = ref('') const mode = ref<_5S | null>(null) const boardGameStore = useBoardGameStore() const duration = ref(null) +if (import.meta.env.DEV) { + onMounted(() => { + boardGameStore.initGame() + }) +} + setInterval(() => { duration.value = boardGameStore.meta.start ? toDuration( @@ -47,16 +53,16 @@ const submit = () => { From 23cc172f77a13ccc594e6fd179f842be163a1ac4 Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sat, 9 Aug 2025 17:12:32 +0200 Subject: [PATCH 08/11] feat: counting used tools to sort --- src/modules/5s/BoardGamePerformance.vue | 68 +++++++++++++++++++++++++ src/modules/5s/BoardGameToolbox.vue | 38 +++++++++++--- src/modules/5s/BoardGameWorkshop.vue | 41 ++++----------- src/modules/5s/board-game-store.ts | 68 +++++++++++++++++++++++-- src/modules/5s/plan.md | 17 +++---- src/modules/5s/types/tools.ts | 38 ++++++-------- src/modules/5s/types/workshop.ts | 1 - src/modules/5s/utils.ts | 4 ++ src/utils.ts | 10 ++++ 9 files changed, 210 insertions(+), 75 deletions(-) create mode 100644 src/modules/5s/BoardGamePerformance.vue diff --git a/src/modules/5s/BoardGamePerformance.vue b/src/modules/5s/BoardGamePerformance.vue new file mode 100644 index 0000000..ab6e34b --- /dev/null +++ b/src/modules/5s/BoardGamePerformance.vue @@ -0,0 +1,68 @@ + + + + + diff --git a/src/modules/5s/BoardGameToolbox.vue b/src/modules/5s/BoardGameToolbox.vue index 626315b..e59bd1b 100644 --- a/src/modules/5s/BoardGameToolbox.vue +++ b/src/modules/5s/BoardGameToolbox.vue @@ -4,14 +4,36 @@ import { shuffleArray } from '@/utils' import { computed } from 'vue' const boardGameStore = useBoardGameStore() + +const isSeiriActivated = computed(() => boardGameStore.sUsed.includes('seiri')) const isSeitonActivated = computed(() => boardGameStore.sUsed.includes('seiton') ) +// const isSeisoActivated = computed(() => boardGameStore.sUsed.includes('seiso')) -const rawTools = computed(() => - shuffleArray( - boardGameStore.tools.map((t) => `${t.name} (ref: ${t.reference})`) - ).join(', ') +const neededTools = computed( + () => + new Set( + boardGameStore.boardGames + .flatMap((g) => g.parts) + .flatMap((p) => p.tasks) + .flatMap((t) => t.tools) + .map((t) => t.id) + ) +) + +const tools = computed(() => { + if (isSeiriActivated.value) { + return boardGameStore.tools.filter((t) => neededTools.value.has(t.id)) + } else { + return boardGameStore.tools + } +}) + +const toolsToDisplay = computed(() => + shuffleArray(tools.value.map((t) => `${t.name} (ref: ${t.reference})`)).join( + ', ' + ) ) @@ -23,18 +45,20 @@ const rawTools = computed(() => Tool Reference + Used - + {{ tool.name }} - {{ tool.reference }} + {{ tool.reference }} + {{ boardGameStore.countUsedTools[tool.id] }}
- {{ rawTools }} + {{ toolsToDisplay }}
diff --git a/src/modules/5s/BoardGameWorkshop.vue b/src/modules/5s/BoardGameWorkshop.vue index bb9f313..a02756f 100644 --- a/src/modules/5s/BoardGameWorkshop.vue +++ b/src/modules/5s/BoardGameWorkshop.vue @@ -1,30 +1,19 @@ @@ -151,18 +145,7 @@ const submit = () => { @@ -171,12 +154,6 @@ const submit = () => { @import url('https://fonts.googleapis.com/css2?family=Google+Sans+Code&display=swap'); .board-game-workshop { - flex: 1; - font-family: 'Google Sans Code', monospace; - font-optical-sizing: auto; - font-weight: 400; - font-style: normal; - font-size: 14px; display: flex; gap: 1rem; padding: 1rem; @@ -218,7 +195,7 @@ aside, margin: 1rem; } -.duration { - text-align: right; +.card-title { + justify-content: center; } diff --git a/src/modules/5s/board-game-store.ts b/src/modules/5s/board-game-store.ts index e1f228a..864f28b 100644 --- a/src/modules/5s/board-game-store.ts +++ b/src/modules/5s/board-game-store.ts @@ -3,7 +3,7 @@ import { boardGames } from '@/modules/5s/types/board-games' import { tools } from '@/modules/5s/types/tools' import { BoardGame, Part, Task, Tool } from '@/modules/5s/types/workshop' import { toDuration } from '@/modules/5s/utils' -import { randomAlias } from '@/utils' +import { accumulate, randomAlias } from '@/utils' import { defineStore } from 'pinia' type State = { @@ -17,14 +17,20 @@ type State = { meta: { start: string | null end: string | null - perfs: Array<[string, string]> + perfs: Array<{ + start: string + end: string + boardGames: BoardGame[] + countGames: Record + totalGames: number + }> } } const firstDemands = [ + boardGames[0], boardGames[0] // boardGames[0], - // boardGames[0], // boardGames[0] ] @@ -113,7 +119,17 @@ export const useBoardGameStore = defineStore('board-game', { // All board games complete this.meta.end = new Date().toISOString() - this.meta.perfs = [...this.meta.perfs, [this.meta.start, this.meta.end]] + const countGames = accumulate(this.boardGames.map((b) => b.name)) + this.meta.perfs = [ + ...this.meta.perfs, + { + start: this.meta.start, + end: this.meta.end, + boardGames: [...this.boardGames], + countGames, + totalGames: this.boardGames.length + } + ] this.currentBoardGameIndex = null this.currentPartIndex = null this.currentTaskIndex = null @@ -162,6 +178,50 @@ export const useBoardGameStore = defineStore('board-game', { } return toDuration(new Date(this.meta.start), new Date(this.meta.end)) + }, + countUsedTools(): Record { + const metaToolIds = this.meta.perfs + .flatMap((p) => p.boardGames) + .flatMap((b) => b.parts) + .flatMap((p) => p.tasks) + .flatMap((t) => t.tools) + .map((t) => t.id) + + if ( + !this.meta.start || + !this.currentTask || + !this.currentPart || + !this.currentBoardGame || + this.currentTaskIndex === null || + this.currentPartIndex === null || + this.currentBoardGameIndex === null + ) { + return accumulate(metaToolIds) + } + + const currentBoardGameIndex = this.currentBoardGameIndex + const currentPartIndex = this.currentPartIndex + const currentTaskIndex = this.currentTaskIndex + + const toolIds = this.boardGames + .filter((_, i) => i <= currentBoardGameIndex) + .flatMap((b, boardIndex) => + boardIndex === currentBoardGameIndex + ? b.parts.filter((_, i) => i <= currentPartIndex) + : b.parts + ) + .flatMap((p, partIndex) => + partIndex === currentPartIndex + ? p.tasks.filter((_, i) => i <= currentTaskIndex) + : p.tasks + ) + .flatMap((t, taskIndex) => + taskIndex === currentTaskIndex + ? this.usedTools + : t.tools.map((t) => t.id) + ) + + return accumulate([...metaToolIds, ...toolIds]) } } }) diff --git a/src/modules/5s/plan.md b/src/modules/5s/plan.md index 1555350..fea00c5 100644 --- a/src/modules/5s/plan.md +++ b/src/modules/5s/plan.md @@ -10,7 +10,6 @@ import { NonEmptyArray } from '@/modules/5s/types/tools' export type Tool = { name: string alias: string - cooldown: number } export type Task = { @@ -29,14 +28,14 @@ export type BoardGame = { } export const tools: Tool[] = [ - { name: 'Card Printer', alias: 'card-printer', cooldown: 5 }, - { name: 'Miniature Mold', alias: 'mini-mold', cooldown: 15 }, - { name: 'Dice Engraver', alias: 'dice-engraver', cooldown: 10 }, - { name: 'Board Cutter', alias: 'board-cutter', cooldown: 8 }, - { name: 'Rulebook Designer', alias: 'rulebook-dzn', cooldown: 6 }, - { name: 'Box Assembler', alias: 'box-asm', cooldown: 4 }, - { name: 'Component Painter', alias: 'painter', cooldown: 12 }, - { name: 'Lamination Machine', alias: 'laminator', cooldown: 7 } + { name: 'Card Printer', alias: 'card-printer' }, + { name: 'Miniature Mold', alias: 'mini-mold' }, + { name: 'Dice Engraver', alias: 'dice-engraver' }, + { name: 'Board Cutter', alias: 'board-cutter' }, + { name: 'Rulebook Designer', alias: 'rulebook-dzn' }, + { name: 'Box Assembler', alias: 'box-asm' }, + { name: 'Component Painter', alias: 'painter' }, + { name: 'Lamination Machine', alias: 'laminator' } ] export type NonEmptyArray = [T, ...T[]] diff --git a/src/modules/5s/types/tools.ts b/src/modules/5s/types/tools.ts index 0e263ca..3f68151 100644 --- a/src/modules/5s/types/tools.ts +++ b/src/modules/5s/types/tools.ts @@ -1,53 +1,47 @@ import { Tool } from '@/modules/5s/types/workshop' export const tools: Tool[] = [ - { name: 'Card Printer', id: 'card-printer', reference: '', cooldown: 5 }, - { name: 'Miniature Mold', id: 'mini-mold', reference: '', cooldown: 15 }, - { name: 'Dice Engraver', id: 'dice-engraver', reference: '', cooldown: 10 }, - { name: 'Cutter', id: 'cutter', reference: '', cooldown: 8 }, - { name: 'Rulebook Designer', id: 'rulebook-dzn', reference: '', cooldown: 6 }, - { name: 'Box Assembler', id: 'box-asm', reference: '', cooldown: 4 }, - { name: 'Component Painter', id: 'painter', reference: '', cooldown: 12 }, - { name: 'Lamination Machine', id: 'laminator', reference: '', cooldown: 7 }, + { name: 'Card Printer', id: 'card-printer', reference: '' }, + { name: 'Miniature Mold', id: 'mini-mold', reference: '' }, + { name: 'Dice Engraver', id: 'dice-engraver', reference: '' }, + { name: 'Cutter', id: 'cutter', reference: '' }, + { name: 'Rulebook Designer', id: 'rulebook-dzn', reference: '' }, + { name: 'Box Assembler', id: 'box-asm', reference: '' }, + { name: 'Component Painter', id: 'painter', reference: '' }, + { name: 'Lamination Machine', id: 'laminator', reference: '' }, // Additional realistic tools { name: 'Shrink Wrap Machine', id: 'shrink-wrap', - reference: '', - cooldown: 9 + reference: '' }, { name: 'Punch Board Cutter', id: 'punch-cutter', - reference: '', - cooldown: 11 + reference: '' }, { name: 'Sticker Applicator', id: 'sticker-applicator', - reference: '', - cooldown: 6 + reference: '' }, { name: 'Foil Stamping Press', id: 'foil-stamp', - reference: '', - cooldown: 13 + reference: '' }, { name: 'Scanner', id: 'scanner', - reference: '', - cooldown: 5 + reference: '' }, { name: 'Instruction Sheet Folder', id: 'sheet-folder', - reference: '', - cooldown: 7 + reference: '' }, - { name: 'Plastic Bag Sealer', id: 'bag-sealer', reference: '', cooldown: 4 }, - { name: 'Barcode Printer', id: 'barcode-printer', reference: '', cooldown: 8 } + { name: 'Plastic Bag Sealer', id: 'bag-sealer', reference: '' }, + { name: 'Barcode Printer', id: 'barcode-printer', reference: '' } ] export type NonEmptyArray = [T, ...T[]] diff --git a/src/modules/5s/types/workshop.ts b/src/modules/5s/types/workshop.ts index 5f04901..7708baa 100644 --- a/src/modules/5s/types/workshop.ts +++ b/src/modules/5s/types/workshop.ts @@ -4,7 +4,6 @@ export type Tool = { name: string id: string reference: string - cooldown: number } export type Task = { diff --git a/src/modules/5s/utils.ts b/src/modules/5s/utils.ts index a1c350e..7fe521f 100644 --- a/src/modules/5s/utils.ts +++ b/src/modules/5s/utils.ts @@ -22,3 +22,7 @@ export const toDuration = (startDate: Date, endDate: Date = new Date()) => { return parts.join(' ') } + +export const toSeconds = (start: Date, endDate: Date): number => { + return Math.floor((endDate.getTime() - start.getTime()) / 1000) +} diff --git a/src/utils.ts b/src/utils.ts index 78a9187..40ba381 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -21,6 +21,9 @@ export const getMean = (data: number[]) => export const getRound = (data: number, total: number) => (Math.round(100 * (data / total)) / 100 || 0).toFixed(2) +export const getNatural = (data: number, total: number) => + (Math.round(100 * (data / total)) / 100 || 0).toFixed(0) + export const shuffleArray = (array: T[]) => { let currentIndex = array.length, randomIndex @@ -37,6 +40,13 @@ export const shuffleArray = (array: T[]) => { return array } +export const accumulate = (array: string[]) => { + return array.reduce>((acc, toolId) => { + acc[toolId] = (acc[toolId] || 0) + 1 + return acc + }, {}) +} + export const popNElement = (array: T[], numberOfElements: number) => { const poppedElements: T[] = [] From 46a5a9e58867f3b744f82f54af0c4b42487de4ac Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sat, 9 Aug 2025 17:26:56 +0200 Subject: [PATCH 09/11] feat: seiton - sort lines --- src/modules/5s/BoardGameToolbox.vue | 42 ++++++++++++++++++++++------- 1 file changed, 32 insertions(+), 10 deletions(-) diff --git a/src/modules/5s/BoardGameToolbox.vue b/src/modules/5s/BoardGameToolbox.vue index e59bd1b..6bc7bc4 100644 --- a/src/modules/5s/BoardGameToolbox.vue +++ b/src/modules/5s/BoardGameToolbox.vue @@ -23,11 +23,17 @@ const neededTools = computed( ) const tools = computed(() => { - if (isSeiriActivated.value) { - return boardGameStore.tools.filter((t) => neededTools.value.has(t.id)) - } else { - return boardGameStore.tools - } + const toolsToUse = isSeiriActivated.value + ? boardGameStore.tools.filter((t) => neededTools.value.has(t.id)) + : boardGameStore.tools + + return isSeitonActivated.value + ? [...toolsToUse].sort( + (a, b) => + (boardGameStore.countUsedTools[b.id] || 0) - + (boardGameStore.countUsedTools[a.id] || 0) + ) + : toolsToUse }) const toolsToDisplay = computed(() => @@ -40,7 +46,7 @@ const toolsToDisplay = computed(() => From 1916c5ee4d5686e308f98fbbb08be0f4d394d74f Mon Sep 17 00:00:00 2001 From: Julien Calixte Date: Sun, 10 Aug 2025 13:08:36 +0200 Subject: [PATCH 11/11] feat: add kaizen indicator --- package.json | 2 + pnpm-lock.yaml | 30 ++++++++++ src/modules/5s/BoardGamePerformance.vue | 78 ++++++++++++++++--------- src/modules/5s/BoardGameWorkshop.vue | 11 +--- 4 files changed, 86 insertions(+), 35 deletions(-) diff --git a/package.json b/package.json index 07abd92..3758c85 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "dependencies": { "@tailwindcss/vite": "^4.1.11", "@vueuse/core": "^12.2.0", + "chart.js": "^4.5.0", "chart.xkcd": "^1.1.15", "comlink": "^4.4.2", "daisyui": "^5.0.50", @@ -26,6 +27,7 @@ "random-js": "^2.1.0", "tailwindcss": "^4.1.11", "vue": "^3.5.13", + "vue-chartjs": "^5.3.2", "vue-starport": "^0.4.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 708198a..17fd67a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: '@vueuse/core': specifier: ^12.2.0 version: 12.2.0(typescript@5.7.2) + chart.js: + specifier: ^4.5.0 + version: 4.5.0 chart.xkcd: specifier: ^1.1.15 version: 1.1.15 @@ -41,6 +44,9 @@ importers: vue: specifier: ^3.5.13 version: 3.5.13(typescript@5.7.2) + vue-chartjs: + specifier: ^5.3.2 + version: 5.3.2(chart.js@4.5.0)(vue@3.5.13(typescript@5.7.2)) vue-starport: specifier: ^0.4.0 version: 0.4.0(typescript@5.7.2) @@ -408,6 +414,9 @@ packages: '@jridgewell/trace-mapping@0.3.29': resolution: {integrity: sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==} + '@kurkle/color@0.3.4': + resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + '@parcel/watcher-android-arm64@2.5.1': resolution: {integrity: sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==} engines: {node: '>= 10.0.0'} @@ -889,6 +898,10 @@ packages: resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} + chart.js@4.5.0: + resolution: {integrity: sha512-aYeC/jDgSEx8SHWZvANYMioYMZ2KX02W6f6uVfyteuCGcadDLcYVHdfdygsTQkQ4TKn5lghoojAsPj5pu0SnvQ==} + engines: {pnpm: '>=8'} + chart.xkcd@1.1.15: resolution: {integrity: sha512-FPpNCkaVSPyB6GIb9eXKEAjKSnr6hA7blzQFUeTkZKvSr9wcg1eSK73V6APgfrzkDDK7X+iVtLXJXIGPrCFj8g==} @@ -1387,6 +1400,12 @@ packages: jsdom: optional: true + vue-chartjs@5.3.2: + resolution: {integrity: sha512-NrkbRRoYshbXbWqJkTN6InoDVwVb90C0R7eAVgMWcB9dPikbruaOoTFjFYHE/+tNPdIe6qdLCDjfjPHQ0fw4jw==} + peerDependencies: + chart.js: ^4.1.1 + vue: ^3.0.0-0 || ^2.7.0 + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -1602,6 +1621,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@kurkle/color@0.3.4': {} + '@parcel/watcher-android-arm64@2.5.1': optional: true @@ -2020,6 +2041,10 @@ snapshots: loupe: 3.1.3 pathval: 2.0.0 + chart.js@4.5.0: + dependencies: + '@kurkle/color': 0.3.4 + chart.xkcd@1.1.15: dependencies: d3-axis: 1.0.12 @@ -2507,6 +2532,11 @@ snapshots: - supports-color - terser + vue-chartjs@5.3.2(chart.js@4.5.0)(vue@3.5.13(typescript@5.7.2)): + dependencies: + chart.js: 4.5.0 + vue: 3.5.13(typescript@5.7.2) + vue-demi@0.14.10(vue@3.5.13(typescript@5.7.2)): dependencies: vue: 3.5.13(typescript@5.7.2) diff --git a/src/modules/5s/BoardGamePerformance.vue b/src/modules/5s/BoardGamePerformance.vue index 9b2a754..0c72ef3 100644 --- a/src/modules/5s/BoardGamePerformance.vue +++ b/src/modules/5s/BoardGamePerformance.vue @@ -1,8 +1,13 @@