From 34dcfc200c6a198d36488d853c673aea43f8599d Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Mon, 1 Jul 2024 00:42:17 +0900 Subject: [PATCH 01/17] stash --- .storybook/main.ts | 5 + README.md | 5 +- package-lock.json | 56 +++++++- package.json | 2 + src/domain/japanese/index.ts | 15 ++ src/sing/domain.ts | 17 +-- src/store/proxy.ts | 2 +- src/storybook/engineMock/index.ts | 76 ++++++++++ src/storybook/engineMock/phonemeMock.ts | 168 ++++++++++++++++++++++ src/storybook/engineMock/talkModelMock.ts | 126 ++++++++++++++++ src/storybook/engineMock/test.stories.ts | 26 ++++ 11 files changed, 477 insertions(+), 21 deletions(-) create mode 100644 src/storybook/engineMock/index.ts create mode 100644 src/storybook/engineMock/phonemeMock.ts create mode 100644 src/storybook/engineMock/talkModelMock.ts create mode 100644 src/storybook/engineMock/test.stories.ts diff --git a/.storybook/main.ts b/.storybook/main.ts index b7b5f01ea5..b7d5c9a859 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,3 +1,4 @@ +import { dicPath } from "@/storybook/engineMock"; import type { StorybookConfig } from "@storybook/vue3-vite"; const config: StorybookConfig = { @@ -14,6 +15,10 @@ const config: StorybookConfig = { docgen: "vue-component-meta", }, }, + staticDirs: [ + // モックエンジン用のファイル + { from: "../node_modules/kuromoji/dict", to: dicPath } + ], }; export default config; diff --git a/README.md b/README.md index 93aa208cf6..e5c586b509 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,9 @@ Storybook を使ってコンポーネントを開発することができます npm run storybook ``` +また、main ブランチの Storybook が Chromatic から見れます。 + + ### ブラウザ版の実行(開発中) 別途音声合成エンジンを起動し、以下を実行して表示された localhost へアクセスします。 @@ -91,7 +94,7 @@ npm run storybook npm run browser:serve ``` -また、main ブランチのビルド結果がこちらにデプロイされています +また、main ブランチのビルド結果がこちらにデプロイされています。 今はローカル PC 上で音声合成エンジンを起動する必要があります。 ## ビルド diff --git a/package-lock.json b/package-lock.json index 3c5b2b83a4..a7ef917732 100644 --- a/package-lock.json +++ b/package-lock.json @@ -52,6 +52,7 @@ "@types/async-lock": "1.4.0", "@types/encoding-japanese": "1.0.18", "@types/glob": "8.0.0", + "@types/kuromoji": "0.1.3", "@types/markdown-it": "12.2.0", "@types/multistream": "4.1.0", "@types/semver": "7.3.9", @@ -79,6 +80,7 @@ "eslint-plugin-storybook": "0.8.0", "eslint-plugin-vue": "9.26.0", "happy-dom": "8.4.2", + "kuromoji": "0.1.2", "license-checker-rseidelsohn": "4.3.0", "markdownlint-cli": "0.37.0", "prettier": "3.2.5", @@ -7355,6 +7357,12 @@ "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==", "dev": true }, + "node_modules/@types/doublearray": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/doublearray/-/doublearray-0.0.32.tgz", + "integrity": "sha512-HloTru3I3a55runIVqZX1YBQi2L5A4peNQPh33yshzB4ttt1qHCnHPkuhy9Djy/cTx7i5xJvxItKRPCmvnfpGw==", + "dev": true + }, "node_modules/@types/earcut": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", @@ -7503,9 +7511,7 @@ "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "optional": true, - "peer": true + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -7522,6 +7528,15 @@ "@types/node": "*" } }, + "node_modules/@types/kuromoji": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@types/kuromoji/-/kuromoji-0.1.3.tgz", + "integrity": "sha512-u+YwX6eJj6Fmm0F5qunsyA+X8HSiyRNNE5ON3itD3tERax4meq9tv+S7bjTMXkPjqbdBGUmH2maGDCuEvpODwg==", + "dev": true, + "dependencies": { + "@types/doublearray": "*" + } + }, "node_modules/@types/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", @@ -11558,6 +11573,12 @@ "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==", "dev": true }, + "node_modules/doublearray": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/doublearray/-/doublearray-0.0.2.tgz", + "integrity": "sha512-aw55FtZzT6AmiamEj2kvmR6BuFqvYgKZUkfQ7teqVRNqD5UE0rw8IeW/3gieHNKQ5sPuDKlljWEn4bzv5+1bHw==", + "dev": true + }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -16877,6 +16898,26 @@ "node": ">=6" } }, + "node_modules/kuromoji": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/kuromoji/-/kuromoji-0.1.2.tgz", + "integrity": "sha512-V0dUf+C2LpcPEXhoHLMAop/bOht16Dyr+mDiIE39yX3vqau7p80De/koFqpiTcL1zzdZlc3xuHZ8u5gjYRfFaQ==", + "dev": true, + "dependencies": { + "async": "^2.0.1", + "doublearray": "0.0.2", + "zlibjs": "^0.3.1" + } + }, + "node_modules/kuromoji/node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, "node_modules/lazy-universal-dotenv": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-4.0.0.tgz", @@ -23794,6 +23835,15 @@ "node": "*" } }, + "node_modules/zlibjs": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/zlibjs/-/zlibjs-0.3.1.tgz", + "integrity": "sha512-+J9RrgTKOmlxFSDHo0pI1xM6BLVUv+o0ZT9ANtCxGkjIVCCUdx9alUF8Gm+dGLKbkkkidWIHFDZHDMpfITt4+w==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/zod": { "version": "3.22.4", "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", diff --git a/package.json b/package.json index 1a5531a142..b2f6a0e1db 100644 --- a/package.json +++ b/package.json @@ -83,6 +83,7 @@ "@types/async-lock": "1.4.0", "@types/encoding-japanese": "1.0.18", "@types/glob": "8.0.0", + "@types/kuromoji": "0.1.3", "@types/markdown-it": "12.2.0", "@types/multistream": "4.1.0", "@types/semver": "7.3.9", @@ -110,6 +111,7 @@ "eslint-plugin-storybook": "0.8.0", "eslint-plugin-vue": "9.26.0", "happy-dom": "8.4.2", + "kuromoji": "0.1.2", "license-checker-rseidelsohn": "4.3.0", "markdownlint-cli": "0.37.0", "prettier": "3.2.5", diff --git a/src/domain/japanese/index.ts b/src/domain/japanese/index.ts index e9a90bdfad..44c606e9f1 100644 --- a/src/domain/japanese/index.ts +++ b/src/domain/japanese/index.ts @@ -40,3 +40,18 @@ export const convertLongVowel = (text: string): string => { .replace(/(?<=[ん]ー*)ー/g, "ん") .replace(/(?<=[っ]ー*)ー/g, "っ"); }; + +// 参考:https://github.com/VOICEVOX/voicevox_core/blob/0848630d81ae3e917c6ff2038f0b15bbd4270702/crates/voicevox_core/src/user_dict/word.rs#L83-L90 +export const moraPattern = new RegExp( + "(?:" + + "[イ][ェ]|[ヴ][ャュョ]|[トド][ゥ]|[テデ][ィャュョ]|[デ][ェ]|[クグ][ヮ]|" + // rule_others + "[キシチニヒミリギジビピ][ェャュョ]|" + // rule_line_i + "[ツフヴ][ァ]|[ウスツフヴズ][ィ]|[ウツフヴ][ェォ]|" + // rule_line_u + "[ァ-ヴー]|" + // rule_one_mora + "[い][ぇ]|[ゃゅょ]|[とど][ぅ]|[てで][ぃゃゅょ]|[で][ぇ]|[くぐ][ゎ]|" + // rule_others + "[きしちにひみりぎじびぴ][ぇゃゅょ]|" + // rule_line_i + "[つふゔ][ぁ]|[うすつふゔず][ぃ]|[うつふゔ][ぇぉ]|" + // rule_line_u + "[ぁ-ゔー]" + // rule_one_mora + ")", + "g", +); diff --git a/src/sing/domain.ts b/src/sing/domain.ts index a7ad7591c9..9e9dbe395b 100644 --- a/src/sing/domain.ts +++ b/src/sing/domain.ts @@ -1,5 +1,5 @@ import { calculateHash } from "./utility"; -import { convertLongVowel } from "@/domain/japanese"; +import { convertLongVowel, moraPattern } from "@/domain/japanese"; import { Note, Phrase, @@ -490,21 +490,6 @@ export function applyPitchEdit( } } -// 参考:https://github.com/VOICEVOX/voicevox_core/blob/0848630d81ae3e917c6ff2038f0b15bbd4270702/crates/voicevox_core/src/user_dict/word.rs#L83-L90 -export const moraPattern = new RegExp( - "(?:" + - "[イ][ェ]|[ヴ][ャュョ]|[トド][ゥ]|[テデ][ィャュョ]|[デ][ェ]|[クグ][ヮ]|" + // rule_others - "[キシチニヒミリギジビピ][ェャュョ]|" + // rule_line_i - "[ツフヴ][ァ]|[ウスツフヴズ][ィ]|[ウツフヴ][ェォ]|" + // rule_line_u - "[ァ-ヴー]|" + // rule_one_mora - "[い][ぇ]|[ゃゅょ]|[とど][ぅ]|[てで][ぃゃゅょ]|[で][ぇ]|[くぐ][ゎ]|" + // rule_others - "[きしちにひみりぎじびぴ][ぇゃゅょ]|" + // rule_line_i - "[つふゔ][ぁ]|[うすつふゔず][ぃ]|[うつふゔ][ぇぉ]|" + // rule_line_u - "[ぁ-ゔー]" + // rule_one_mora - ")", - "g", -); - /** * 文字列をモーラと非モーラに分割する。長音は展開される。連続する非モーラはまとめる。 * 例:"カナー漢字" -> ["カ", "ナ", "ア", "漢字"] diff --git a/src/store/proxy.ts b/src/store/proxy.ts index 799ef3e069..8ed9d81961 100644 --- a/src/store/proxy.ts +++ b/src/store/proxy.ts @@ -9,7 +9,7 @@ import { EngineInfo } from "@/type/preload"; export const proxyStoreState: ProxyStoreState = {}; -const proxyStoreCreator = (_engineFactory: IEngineConnectorFactory) => { +export const proxyStoreCreator = (_engineFactory: IEngineConnectorFactory) => { const proxyStore = createPartialStore({ INSTANTIATE_ENGINE_CONNECTOR: { action({ state }, payload) { diff --git a/src/storybook/engineMock/index.ts b/src/storybook/engineMock/index.ts new file mode 100644 index 0000000000..5df6a40d6b --- /dev/null +++ b/src/storybook/engineMock/index.ts @@ -0,0 +1,76 @@ +import kuromoji, { IpadicFeatures, Tokenizer } from "kuromoji"; +import { tokensToActtentPhrases } from "./talkModelMock"; +import { IEngineConnectorFactory } from "@/infrastructures/EngineConnector"; +import { + AccentPhrase, + AccentPhrasesAccentPhrasesPostRequest, + DefaultApiInterface, + Mora, +} from "@/openapi"; +import { moraPattern } from "@/domain/japanese"; + +export const dicPath = "/kuromoji/dict"; + +export const mockHost = "mock"; + +export function createOpenAPIEngineMock(): IEngineConnectorFactory { + let mockApi: Partial | undefined = undefined; + return { + instance: (host: string) => { + if (host !== mockHost) { + throw new Error(`Invalid host: ${host}`); + } + + if (mockApi == undefined) { + // テキスト形態素解析器 + const tokenizerPromise = new Promise>( + (resolve, reject) => { + kuromoji + .builder({ + dicPath, + }) + .build(function (err, tokenizer) { + if (err) { + reject(err); + } else { + resolve(tokenizer); + } + }); + }, + ); + + mockApi = { + async accentPhrasesAccentPhrasesPost( + payload: AccentPhrasesAccentPhrasesPostRequest, + ): Promise { + if (payload.isKana == true) + throw new Error("AquesTalk風記法は未対応です"); + + const tokenizer = await tokenizerPromise; + const tokens = tokenizer.tokenize(payload.text); + const accentPhrases = tokensToActtentPhrases(tokens); + + // 話者ごとに同じにならないように適当にずらす + const speaker = payload.speaker; + const diff = speaker * 0.03; + for (const accentPhrase of accentPhrases) { + for (const mora of accentPhrase.moras) { + if (mora.consonantLength != undefined) + mora.consonantLength += diff; + mora.vowelLength += diff; + if (mora.pitch > 0) mora.pitch += diff; + } + if (accentPhrase.pauseMora != undefined) { + accentPhrase.pauseMora.vowelLength += diff; + } + } + + return accentPhrases; + }, + }; + } + + return mockApi as DefaultApiInterface; + }, + }; +} diff --git a/src/storybook/engineMock/phonemeMock.ts b/src/storybook/engineMock/phonemeMock.ts new file mode 100644 index 0000000000..d128b1648e --- /dev/null +++ b/src/storybook/engineMock/phonemeMock.ts @@ -0,0 +1,168 @@ +/** カタカナを音素に変換する */ +export const moraToPhonemes: { + [key: string]: [string | undefined, string]; +} = { + ヴォ: ["v", "o"], + ヴェ: ["v", "e"], + ヴィ: ["v", "i"], + ヴァ: ["v", "a"], + ヴ: ["v", "u"], + ン: [undefined, "N"], + ワ: ["w", "a"], + ロ: ["r", "o"], + レ: ["r", "e"], + ル: ["r", "u"], + リョ: ["ry", "o"], + リュ: ["ry", "u"], + リャ: ["ry", "a"], + リェ: ["ry", "e"], + リ: ["r", "i"], + ラ: ["r", "a"], + ヨ: ["y", "o"], + ユ: ["y", "u"], + ヤ: ["y", "a"], + モ: ["m", "o"], + メ: ["m", "e"], + ム: ["m", "u"], + ミョ: ["my", "o"], + ミュ: ["my", "u"], + ミャ: ["my", "a"], + ミェ: ["my", "e"], + ミ: ["m", "i"], + マ: ["m", "a"], + ポ: ["p", "o"], + ボ: ["b", "o"], + ホ: ["h", "o"], + ペ: ["p", "e"], + ベ: ["b", "e"], + ヘ: ["h", "e"], + プ: ["p", "u"], + ブ: ["b", "u"], + フォ: ["f", "o"], + フェ: ["f", "e"], + フィ: ["f", "i"], + ファ: ["f", "a"], + フ: ["f", "u"], + ピョ: ["py", "o"], + ピュ: ["py", "u"], + ピャ: ["py", "a"], + ピェ: ["py", "e"], + ピ: ["p", "i"], + ビョ: ["by", "o"], + ビュ: ["by", "u"], + ビャ: ["by", "a"], + ビェ: ["by", "e"], + ビ: ["b", "i"], + ヒョ: ["hy", "o"], + ヒュ: ["hy", "u"], + ヒャ: ["hy", "a"], + ヒェ: ["hy", "e"], + ヒ: ["h", "i"], + パ: ["p", "a"], + バ: ["b", "a"], + ハ: ["h", "a"], + ノ: ["n", "o"], + ネ: ["n", "e"], + ヌ: ["n", "u"], + ニョ: ["ny", "o"], + ニュ: ["ny", "u"], + ニャ: ["ny", "a"], + ニェ: ["ny", "e"], + ニ: ["n", "i"], + ナ: ["n", "a"], + ドゥ: ["d", "u"], + ド: ["d", "o"], + トゥ: ["t", "u"], + ト: ["t", "o"], + デョ: ["dy", "o"], + デュ: ["dy", "u"], + デャ: ["dy", "a"], + デェ: ["dy", "e"], + ディ: ["d", "i"], + デ: ["d", "e"], + テョ: ["ty", "o"], + テュ: ["ty", "u"], + テャ: ["ty", "a"], + ティ: ["t", "i"], + テ: ["t", "e"], + ツォ: ["ts", "o"], + ツェ: ["ts", "e"], + ツィ: ["ts", "i"], + ツァ: ["ts", "a"], + ツ: ["ts", "u"], + ッ: [undefined, "cl"], + チョ: ["ch", "o"], + チュ: ["ch", "u"], + チャ: ["ch", "a"], + チェ: ["ch", "e"], + チ: ["ch", "i"], + ダ: ["d", "a"], + タ: ["t", "a"], + ゾ: ["z", "o"], + ソ: ["s", "o"], + ゼ: ["z", "e"], + セ: ["s", "e"], + ズィ: ["z", "i"], + ズ: ["z", "u"], + スィ: ["s", "i"], + ス: ["s", "u"], + ジョ: ["j", "o"], + ジュ: ["j", "u"], + ジャ: ["j", "a"], + ジェ: ["j", "e"], + ジ: ["j", "i"], + ショ: ["sh", "o"], + シュ: ["sh", "u"], + シャ: ["sh", "a"], + シェ: ["sh", "e"], + シ: ["sh", "i"], + ザ: ["z", "a"], + サ: ["s", "a"], + ゴ: ["g", "o"], + コ: ["k", "o"], + ゲ: ["g", "e"], + ケ: ["k", "e"], + グヮ: ["gw", "a"], + グ: ["g", "u"], + クヮ: ["kw", "a"], + ク: ["k", "u"], + ギョ: ["gy", "o"], + ギュ: ["gy", "u"], + ギャ: ["gy", "a"], + ギェ: ["gy", "e"], + ギ: ["g", "i"], + キョ: ["ky", "o"], + キュ: ["ky", "u"], + キャ: ["ky", "a"], + キェ: ["ky", "e"], + キ: ["k", "i"], + ガ: ["g", "a"], + カ: ["k", "a"], + オ: [undefined, "o"], + エ: [undefined, "e"], + ウォ: ["w", "o"], + ウェ: ["w", "e"], + ウィ: ["w", "i"], + ウ: [undefined, "u"], + イェ: ["y", "e"], + イ: [undefined, "i"], + ア: [undefined, "a"], + ヴョ: ["by", "o"], + ヴュ: ["by", "u"], + ヴャ: ["by", "a"], + ヲ: [undefined, "o"], + ヱ: [undefined, "e"], + ヰ: [undefined, "i"], + ヮ: ["w", "a"], + ョ: ["y", "o"], + ュ: ["y", "u"], + ヅ: ["z", "u"], + ヂ: ["j", "i"], + ヶ: ["k", "e"], + ャ: ["y", "a"], + ォ: [undefined, "o"], + ェ: [undefined, "e"], + ゥ: [undefined, "u"], + ィ: [undefined, "i"], + ァ: [undefined, "a"], +}; diff --git a/src/storybook/engineMock/talkModelMock.ts b/src/storybook/engineMock/talkModelMock.ts new file mode 100644 index 0000000000..5cdb0f652c --- /dev/null +++ b/src/storybook/engineMock/talkModelMock.ts @@ -0,0 +1,126 @@ +/** + * トーク系の構造体を作るモック。 + */ + +import { IpadicFeatures } from "kuromoji"; +import { moraToPhonemes } from "./phonemeMock"; +import { convertHiraToKana, moraPattern } from "@/domain/japanese"; +import { AccentPhrase, Mora } from "@/openapi"; + +/** アルファベット文字列を適当な0~1の適当な数値に変換する */ +function alphabetsToNumber(text: string): number { + const codes = text.split("").map((c) => c.charCodeAt(0)); + const sum = codes.reduce((a, b) => a + b); + return (sum % 256) / 256; +} + +// 0.1~1になるように適当な長さを求める +function phonemeToLengthMock(phoneme: string): number { + return alphabetsToNumber(phoneme) * 0.9 + 0.1; +} + +// 3~6になるように適当なピッチを求める +function phonemeToPitchMock(phoneme: string): number { + return (1 - alphabetsToNumber(phoneme)) * 3 + 3; +} + +/** カタカナテキストを適当なモーラに変換する */ +function textToMoraMock(text: string): Mora { + const phonemes = moraToPhonemes[text]; + if (phonemes == undefined) throw new Error(`モーラに変換できません: ${text}`); + + return { + text, + consonant: phonemes[0], + consonantLength: + phonemes[0] == undefined ? undefined : phonemeToLengthMock(phonemes[0]), + vowel: phonemes[1], + vowelLength: phonemeToLengthMock(phonemes[1]), + pitch: phonemeToPitchMock((phonemes[0] ?? "") + phonemes[1]), + }; +} + +/** カタカナテキストを適当なアクセント句に変換する */ +function textToAccentPhrase(text: string): AccentPhrase { + const moras: Mora[] = [...text.matchAll(moraPattern)].map((m) => + textToMoraMock(m[0]), + ); + const alphabets = moras.map((m) => (m.consonant ?? "") + m.vowel).join(""); + const accent = + 1 + Math.round(alphabetsToNumber(alphabets) * (moras.length - 1)); + return { moras, accent }; +} + +/** + * テキストを適当なアクセント句に分割する。 + * 助詞ごとに区切る。記号ごとに無音を入れる。 + * 無音で終わるアクセント句の最後のモーラが「す」「つ」の場合は無声化する。 + */ +export function tokensToActtentPhrases(tokens: IpadicFeatures[]) { + // TODO: 先にアクセントを求めてから長さなどを求める + const accentPhrases: AccentPhrase[] = []; + let textPhrase = ""; + for (const token of tokens) { + // 記号の場合は無音を入れて区切る + if (token.pos == "記号") { + if (textPhrase.length == 0) continue; + + const accentPhrase = textToAccentPhrase(textPhrase); + accentPhrase.pauseMora = { + text: "、", + vowel: "", + vowelLength: 1 - 1 / (accentPhrases.length + 1), + pitch: 0, + }; + accentPhrases.push(accentPhrase); + textPhrase = ""; + continue; + } + + // 記号以外は連結 + if (token.reading == undefined) + throw new Error(`発音がないトークン: ${token.surface_form}`); + textPhrase += token.reading; + + // 助詞の場合は区切る + if (token.pos == "助詞") { + accentPhrases.push(textToAccentPhrase(textPhrase)); + textPhrase = ""; + } + } + if (textPhrase != "") { + accentPhrases.push(textToAccentPhrase(textPhrase)); + } + + // 最後のアクセント句の無音をなくす + if (accentPhrases.length > 0) { + const lastPhrase = accentPhrases[accentPhrases.length - 1]; + lastPhrase.pauseMora = undefined; + } + + // 無音のあるアクセント句を無声化 + for (const phrase of accentPhrases) { + if (phrase.pauseMora == undefined) continue; + const lastMora = phrase.moras[phrase.moras.length - 1]; + if (lastMora.text == "ス" || lastMora.text == "ツ") { + lastMora.vowel = "U"; + lastMora.pitch = 0; + } + } + + // 別のアクセント句で同じにならないように適当に値をずらす + for (let i = 0; i < accentPhrases.length; i++) { + const diff = i * 0.01; + const accentPhrase = accentPhrases[i]; + for (const mora of accentPhrase.moras) { + if (mora.consonantLength != undefined) mora.consonantLength += diff; + mora.vowelLength += diff; + if (mora.pitch > 0) mora.pitch += diff; + } + if (accentPhrase.pauseMora != undefined) { + accentPhrase.pauseMora.vowelLength += diff; + } + } + + return accentPhrases; +} diff --git a/src/storybook/engineMock/test.stories.ts b/src/storybook/engineMock/test.stories.ts new file mode 100644 index 0000000000..27040e1b8d --- /dev/null +++ b/src/storybook/engineMock/test.stories.ts @@ -0,0 +1,26 @@ +import { userEvent, within, expect, fn } from "@storybook/test"; + +import { Meta, StoryObj } from "@storybook/vue3"; +import { createOpenAPIEngineMock, mockHost } from "@/storybook/engineMock"; + +const meta: Meta = { + render: () => { + return { template: "
" }; + }, +}; + +export default meta; +type Story = StoryObj; + +export const OpenOfficialSite: Story = { + name: "公式サイトを開くボタンを押す", + play: async ({ args }) => { + const mockApi = createOpenAPIEngineMock(); + const api = mockApi.instance(mockHost); + const result = await api.accentPhrasesAccentPhrasesPost({ + text: "そうです、そのとおりだと思いますね", + speaker: 1, + }); + console.log(result); + }, +}; From c05f3b6d1e3699b9c0804dc91f915fa2cdcabc05 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Tue, 2 Jul 2024 09:15:54 +0900 Subject: [PATCH 02/17] =?UTF-8?q?scss=E3=81=8C=E8=AA=AD=E3=81=BF=E8=BE=BC?= =?UTF-8?q?=E3=82=81=E3=81=AA=E3=81=84=EF=BC=81=EF=BC=81=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storybook/main.ts | 8 +- package-lock.json | 1 + package.json | 1 + src/components/Talk/TalkEditor.stories.ts | 122 +++++++++++++++ src/plugins/hotkeyPlugin.ts | 2 +- src/store/audio.ts | 38 ++--- src/store/index.ts | 142 +++++++++--------- src/storybook/engineMock/index.ts | 105 ++++++++++--- src/storybook/engineMock/manifestMock.ts | 34 +++++ .../engineMock/speakerResourceMock.ts | 69 +++++++++ src/storybook/engineMock/talkModelMock.ts | 120 +++++++++++---- src/storybook/engineMock/test.stories.ts | 2 +- tests/{e2e/browser => }/assets/icon_1.png | Bin tests/{e2e/browser => }/assets/icon_2.png | Bin tests/{e2e/browser => }/assets/icon_3.png | Bin tests/{e2e/browser => }/assets/icon_4.png | Bin tests/{e2e/browser => }/assets/portrait_1.png | Bin tests/{e2e/browser => }/assets/portrait_2.png | Bin tests/{e2e/browser => }/assets/portrait_3.png | Bin tests/{e2e/browser => }/assets/portrait_4.png | Bin ...3\203\247\343\203\203\343\203\210.spec.ts" | 2 +- 21 files changed, 506 insertions(+), 140 deletions(-) create mode 100644 src/components/Talk/TalkEditor.stories.ts create mode 100644 src/storybook/engineMock/manifestMock.ts create mode 100644 src/storybook/engineMock/speakerResourceMock.ts rename tests/{e2e/browser => }/assets/icon_1.png (100%) rename tests/{e2e/browser => }/assets/icon_2.png (100%) rename tests/{e2e/browser => }/assets/icon_3.png (100%) rename tests/{e2e/browser => }/assets/icon_4.png (100%) rename tests/{e2e/browser => }/assets/portrait_1.png (100%) rename tests/{e2e/browser => }/assets/portrait_2.png (100%) rename tests/{e2e/browser => }/assets/portrait_3.png (100%) rename tests/{e2e/browser => }/assets/portrait_4.png (100%) diff --git a/.storybook/main.ts b/.storybook/main.ts index b7d5c9a859..06737b96bc 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,4 +1,4 @@ -import { dicPath } from "@/storybook/engineMock"; +import { assetsPath, dicPath } from "@/storybook/engineMock"; import type { StorybookConfig } from "@storybook/vue3-vite"; const config: StorybookConfig = { @@ -9,6 +9,9 @@ const config: StorybookConfig = { "@chromatic-com/storybook", "@storybook/addon-interactions", ], + core: { + builder: '@storybook/builder-vite', + }, framework: { name: "@storybook/vue3-vite", options: { @@ -17,7 +20,8 @@ const config: StorybookConfig = { }, staticDirs: [ // モックエンジン用のファイル - { from: "../node_modules/kuromoji/dict", to: dicPath } + { from: "../node_modules/kuromoji/dict", to: dicPath }, + { from: "../tests/assets", to: assetsPath } ], }; diff --git a/package-lock.json b/package-lock.json index a7ef917732..d1619d4a5a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -45,6 +45,7 @@ "@storybook/addon-interactions": "8.1.10", "@storybook/addon-links": "8.1.10", "@storybook/blocks": "8.1.10", + "@storybook/builder-vite": "8.1.10", "@storybook/test": "8.1.10", "@storybook/test-runner": "0.19.0", "@storybook/vue3": "8.1.10", diff --git a/package.json b/package.json index b2f6a0e1db..f09165fc7b 100644 --- a/package.json +++ b/package.json @@ -76,6 +76,7 @@ "@storybook/addon-interactions": "8.1.10", "@storybook/addon-links": "8.1.10", "@storybook/blocks": "8.1.10", + "@storybook/builder-vite": "8.1.10", "@storybook/test": "8.1.10", "@storybook/test-runner": "0.19.0", "@storybook/vue3": "8.1.10", diff --git a/src/components/Talk/TalkEditor.stories.ts b/src/components/Talk/TalkEditor.stories.ts new file mode 100644 index 0000000000..791fb74c53 --- /dev/null +++ b/src/components/Talk/TalkEditor.stories.ts @@ -0,0 +1,122 @@ +import { userEvent, within, expect, fn } from "@storybook/test"; + +import { Meta, StoryObj } from "@storybook/vue3"; +import { provide, toRaw } from "vue"; +import TalkEditor from "./TalkEditor.vue"; +import { createStoreWrapper, storeKey } from "@/store"; +import { HotkeyManager, hotkeyManagerKey } from "@/plugins/hotkeyPlugin"; +import { StoreType } from "@/store/type"; +import { + assetsPath, + createOpenAPIEngineMock, + mockHost, +} from "@/storybook/engineMock"; +import { proxyStoreCreator } from "@/store/proxy"; +import { CharacterInfo, EngineId, SpeakerId, StyleId } from "@/type/preload"; +import { getEngineManifestMock } from "@/storybook/engineMock/manifestMock"; +import { + getSpeakerInfoMock, + getSpeakersMock, +} from "@/storybook/engineMock/speakerResourceMock"; + +const meta: Meta = { + component: TalkEditor, + args: { + isEnginesReady: true, + isProjectFileLoaded: false, + }, + decorators: [ + (story, context) => { + const hotkeyManager = new HotkeyManager(); + provide(hotkeyManagerKey, hotkeyManager); + + const store = createStoreWrapper({ + proxyStoreDI: proxyStoreCreator(createOpenAPIEngineMock()), + }); + + // context.parameters.store = store; + + const engineManifest = getEngineManifestMock(); + const engineId = EngineId(engineManifest.uuid); + + // setup store + const speakers = getSpeakersMock(); + const characterInfos: CharacterInfo[] = speakers.map((speaker) => { + const speakerInfo = getSpeakerInfoMock(speaker.speakerUuid, assetsPath); + return { + portraitPath: speakerInfo.portrait, + metas: { + speakerUuid: SpeakerId(speaker.speakerUuid), + speakerName: speaker.name, + styles: speakerInfo.styleInfos.map((styleInfo) => { + const style = speaker.styles.find((s) => s.id === styleInfo.id); + if (style == undefined) throw new Error("style not found"); + return { + styleName: style.name, + styleId: StyleId(style.id), + styleType: style.type, + iconPath: styleInfo.icon, + portraitPath: styleInfo.portrait ?? speakerInfo.portrait, + engineId, + voiceSamplePaths: styleInfo.voiceSamples, + }; + }), + policy: speakerInfo.policy, + }, + }; + }); + + store.replaceState({ + ...structuredClone(toRaw(store.state)), + engineIds: [engineId], + engineStates: { + [engineId]: "READY", + }, + engineInfos: { + [engineId]: { + uuid: engineId, + host: mockHost, + name: engineManifest.name, + path: undefined, + executionEnabled: false, + executionFilePath: "not_found", + executionArgs: [], + type: "default", + }, + }, + engineManifests: { + [engineId]: engineManifest, + }, + characterInfos: { [engineId]: characterInfos }, + defaultStyleIds: speakers.map((speaker) => ({ + engineId: engineId, + speakerUuid: SpeakerId(speaker.speakerUuid), + defaultStyleId: StyleId(speaker.styles[0].id), + })), + }); + + provide(storeKey, store); + + return story(); + }, + ], + beforeEach: async ({ parameters }) => { + // const store = parameters.store; // TODO: 型を付けたい + // await store.dispatch("LOAD_CHARACTER", { engineId: EngineId(mockHost) }); + }, +}; + +export default meta; +type Story = StoryObj; + +export const Default: Story = { + name: "デフォルト", + play: async ({ parameters }) => { }, +}; + +export const NowLoading: Story = { + name: "プロジェクトファイルを読み込み中", + args: { + isProjectFileLoaded: "waiting", + }, +}; diff --git a/src/plugins/hotkeyPlugin.ts b/src/plugins/hotkeyPlugin.ts index c187075ef7..ddee4b690d 100644 --- a/src/plugins/hotkeyPlugin.ts +++ b/src/plugins/hotkeyPlugin.ts @@ -16,7 +16,7 @@ import { } from "@/type/preload"; import { createLogger } from "@/domain/frontend/log"; -const hotkeyManagerKey = "hotkeyManager"; +export const hotkeyManagerKey = "hotkeyManager"; export const useHotkeyManager = () => { const hotkeyManager = inject(hotkeyManagerKey); if (!hotkeyManager) { diff --git a/src/store/audio.ts b/src/store/audio.ts index caa664fea2..f223970f8a 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -670,7 +670,7 @@ export const audioStore = createPartialStore({ getters.USER_ORDERED_CHARACTER_INFOS("talk"); if (userOrderedCharacterInfos == undefined) { - throw new Error("state.characterInfos == undefined"); + throw new Error("state.userOrderedCharacterInfos == undefined"); } const text = payload.text ?? ""; @@ -701,8 +701,8 @@ export const audioStore = createPartialStore({ const query = getters.IS_ENGINE_READY(voice.engineId) ? await dispatch("FETCH_AUDIO_QUERY", fetchQueryParams).catch( - () => undefined, - ) + () => undefined, + ) : undefined; const newAudioItem: AudioItem = { text, voice }; @@ -2005,16 +2005,16 @@ export const audioCommandStore = transformCommandStore( changes: Record< AudioKey, | { - update: "AccentPhrases"; - accentPhrases: AccentPhrase[]; - } + update: "AccentPhrases"; + accentPhrases: AccentPhrase[]; + } | { - update: "AudioQuery"; - query: AudioQuery; - } + update: "AudioQuery"; + query: AudioQuery; + } | { - update: "OnlyVoice"; - } + update: "OnlyVoice"; + } >; }, ) { @@ -2069,16 +2069,16 @@ export const audioCommandStore = transformCommandStore( const changes: Record< AudioKey, | { - update: "AccentPhrases"; - accentPhrases: AccentPhrase[]; - } + update: "AccentPhrases"; + accentPhrases: AccentPhrase[]; + } | { - update: "AudioQuery"; - query: AudioQuery; - } + update: "AudioQuery"; + query: AudioQuery; + } | { - update: "OnlyVoice"; - } + update: "OnlyVoice"; + } > = {}; for (const audioKey of audioKeys) { diff --git a/src/store/index.ts b/src/store/index.ts index ebf6bef826..b3b73990f4 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -340,77 +340,83 @@ export const indexStore = createPartialStore({ }, }); -export const store = createStore({ - state: { - ...uiStoreState, - ...audioStoreState, - ...audioPlayerStoreState, - ...singingStoreState, - ...commandStoreState, - ...engineStoreState, - ...projectStoreState, - ...settingStoreState, - ...audioCommandStoreState, - ...indexStoreState, - ...presetStoreState, - ...dictionaryStoreState, - ...proxyStoreState, - ...singingStoreState, - ...singingCommandStoreState, - }, +// TODO: 型をちゃんとする +export function createStoreWrapper({ proxyStoreDI }: { proxyStoreDI?: any }) { + const _proxyStore = proxyStoreDI ?? proxyStore; + + return createStore({ + state: { + ...uiStoreState, + ...audioStoreState, + ...audioPlayerStoreState, + ...singingStoreState, + ...commandStoreState, + ...engineStoreState, + ...projectStoreState, + ...settingStoreState, + ...audioCommandStoreState, + ...indexStoreState, + ...presetStoreState, + ...dictionaryStoreState, + ...proxyStoreState, + ...singingStoreState, + ...singingCommandStoreState, + }, - getters: { - ...uiStore.getters, - ...audioStore.getters, - ...audioPlayerStore.getters, - ...commandStore.getters, - ...engineStore.getters, - ...projectStore.getters, - ...settingStore.getters, - ...presetStore.getters, - ...dictionaryStore.getters, - ...audioCommandStore.getters, - ...indexStore.getters, - ...proxyStore.getters, - ...singingStore.getters, - ...singingCommandStore.getters, - }, + getters: { + ...uiStore.getters, + ...audioStore.getters, + ...audioPlayerStore.getters, + ...commandStore.getters, + ...engineStore.getters, + ...projectStore.getters, + ...settingStore.getters, + ...presetStore.getters, + ...dictionaryStore.getters, + ...audioCommandStore.getters, + ...indexStore.getters, + ..._proxyStore.getters, + ...singingStore.getters, + ...singingCommandStore.getters, + }, - mutations: { - ...uiStore.mutations, - ...audioStore.mutations, - ...audioPlayerStore.mutations, - ...commandStore.mutations, - ...engineStore.mutations, - ...projectStore.mutations, - ...settingStore.mutations, - ...audioCommandStore.mutations, - ...presetStore.mutations, - ...dictionaryStore.mutations, - ...indexStore.mutations, - ...proxyStore.mutations, - ...singingStore.mutations, - ...singingCommandStore.mutations, - }, + mutations: { + ...uiStore.mutations, + ...audioStore.mutations, + ...audioPlayerStore.mutations, + ...commandStore.mutations, + ...engineStore.mutations, + ...projectStore.mutations, + ...settingStore.mutations, + ...audioCommandStore.mutations, + ...presetStore.mutations, + ...dictionaryStore.mutations, + ...indexStore.mutations, + ..._proxyStore.mutations, + ...singingStore.mutations, + ...singingCommandStore.mutations, + }, - actions: { - ...uiStore.actions, - ...audioStore.actions, - ...audioPlayerStore.actions, - ...engineStore.actions, - ...commandStore.actions, - ...projectStore.actions, - ...settingStore.actions, - ...audioCommandStore.actions, - ...presetStore.actions, - ...dictionaryStore.actions, - ...indexStore.actions, - ...proxyStore.actions, - ...singingStore.actions, - ...singingCommandStore.actions, - }, - strict: !isProduction, -}); + actions: { + ...uiStore.actions, + ...audioStore.actions, + ...audioPlayerStore.actions, + ...engineStore.actions, + ...commandStore.actions, + ...projectStore.actions, + ...settingStore.actions, + ...audioCommandStore.actions, + ...presetStore.actions, + ...dictionaryStore.actions, + ...indexStore.actions, + ..._proxyStore.actions, + ...singingStore.actions, + ...singingCommandStore.actions, + }, + strict: !isProduction, + }); +} +export const store = createStoreWrapper({}); export const useStore = (): Store< State, diff --git a/src/storybook/engineMock/index.ts b/src/storybook/engineMock/index.ts index 5df6a40d6b..7c23b1de31 100644 --- a/src/storybook/engineMock/index.ts +++ b/src/storybook/engineMock/index.ts @@ -1,15 +1,28 @@ import kuromoji, { IpadicFeatures, Tokenizer } from "kuromoji"; -import { tokensToActtentPhrases } from "./talkModelMock"; +import { getEngineManifestMock } from "./manifestMock"; +import { + replaseLengthMock, + replasePitchMock, + tokensToActtentPhrasesMock, +} from "./talkModelMock"; +import { getSpeakerInfoMock, getSpeakersMock } from "./speakerResourceMock"; import { IEngineConnectorFactory } from "@/infrastructures/EngineConnector"; import { AccentPhrase, AccentPhrasesAccentPhrasesPostRequest, + AudioQuery, + AudioQueryAudioQueryPostRequest, DefaultApiInterface, - Mora, + EngineManifest, + MoraDataMoraDataPostRequest, + Speaker, + SpeakerInfo, + SpeakerInfoSpeakerInfoGetRequest, + SupportedDevicesInfo, } from "@/openapi"; -import { moraPattern } from "@/domain/japanese"; -export const dicPath = "/kuromoji/dict"; +export const dicPath = "engineMock/dict"; +export const assetsPath = "engineMock/assets"; export const mockHost = "mock"; @@ -40,6 +53,61 @@ export function createOpenAPIEngineMock(): IEngineConnectorFactory { ); mockApi = { + async versionVersionGet(): Promise { + return "mock"; + }, + + async engineManifestEngineManifestGet(): Promise { + return getEngineManifestMock(); + }, + + async supportedDevicesSupportedDevicesGet(): Promise { + return { cpu: true, cuda: false, dml: false }; + }, + + async isInitializedSpeakerIsInitializedSpeakerGet(): Promise { + return true; + }, + + async initializeSpeakerInitializeSpeakerPost(): Promise { + return; + }, + + async speakersSpeakersGet(): Promise { + return getSpeakersMock(); + }, + + async speakerInfoSpeakerInfoGet( + payload: SpeakerInfoSpeakerInfoGetRequest, + ): Promise { + if (payload.resourceFormat != "url") + throw new Error("resourceFormatはurl以外未対応です"); + return getSpeakerInfoMock(payload.speakerUuid, assetsPath); + }, + + async audioQueryAudioQueryPost( + payload: AudioQueryAudioQueryPostRequest, + ): Promise { + const tokenizer = await tokenizerPromise; + const tokens = tokenizer.tokenize(payload.text); + const accentPhrases = tokensToActtentPhrasesMock( + tokens, + payload.speaker, + ); + + return { + accentPhrases, + speedScale: 1.0, + pitchScale: 0, + intonationScale: 1.0, + volumeScale: 1.0, + prePhonemeLength: 0.1, + postPhonemeLength: 0.1, + outputSamplingRate: 24000, + outputStereo: false, + }; + }, + async accentPhrasesAccentPhrasesPost( payload: AccentPhrasesAccentPhrasesPostRequest, ): Promise { @@ -48,25 +116,20 @@ export function createOpenAPIEngineMock(): IEngineConnectorFactory { const tokenizer = await tokenizerPromise; const tokens = tokenizer.tokenize(payload.text); - const accentPhrases = tokensToActtentPhrases(tokens); - - // 話者ごとに同じにならないように適当にずらす - const speaker = payload.speaker; - const diff = speaker * 0.03; - for (const accentPhrase of accentPhrases) { - for (const mora of accentPhrase.moras) { - if (mora.consonantLength != undefined) - mora.consonantLength += diff; - mora.vowelLength += diff; - if (mora.pitch > 0) mora.pitch += diff; - } - if (accentPhrase.pauseMora != undefined) { - accentPhrase.pauseMora.vowelLength += diff; - } - } - + const accentPhrases = tokensToActtentPhrasesMock( + tokens, + payload.speaker, + ); return accentPhrases; }, + + async moraDataMoraDataPost( + payload: MoraDataMoraDataPostRequest, + ): Promise { + replaseLengthMock(payload.accentPhrase, payload.speaker); + replasePitchMock(payload.accentPhrase, payload.speaker); + return payload.accentPhrase; + }, }; } diff --git a/src/storybook/engineMock/manifestMock.ts b/src/storybook/engineMock/manifestMock.ts new file mode 100644 index 0000000000..b830f708ac --- /dev/null +++ b/src/storybook/engineMock/manifestMock.ts @@ -0,0 +1,34 @@ +/** + * エンジンマニフェストのモック。 + */ + +/** エンジンマニフェストを返すモック */ +export function getEngineManifestMock() { + return { + manifestVersion: "0.13.1", + name: "DUMMY Engine", + brandName: "DUMMY", + uuid: "c7b58856-bd56-4aa1-afb7-b8415f824b06", + url: "not_found", + icon: "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAAXNSR0IArs4c6QAAAA1JREFUGFdjWHpl7X8AB24DJsTeKbEAAAAASUVORK5CYII=", // 1pxの画像 + defaultSamplingRate: 24000, + frameRate: 93.75, + termsOfService: "not_found", + updateInfos: [], + dependencyLicenses: [], + supportedVvlibManifestVersion: undefined, + supportedFeatures: { + adjustMoraPitch: true, + adjustPhonemeLength: true, + adjustSpeedScale: true, + adjustPitchScale: true, + adjustIntonationScale: true, + adjustVolumeScale: true, + interrogativeUpspeak: false, + synthesisMorphing: false, + sing: false, + manageLibrary: false, + returnResourceUrl: true, + }, + }; +} diff --git a/src/storybook/engineMock/speakerResourceMock.ts b/src/storybook/engineMock/speakerResourceMock.ts new file mode 100644 index 0000000000..8f979825ce --- /dev/null +++ b/src/storybook/engineMock/speakerResourceMock.ts @@ -0,0 +1,69 @@ +/** + * 話者情報を作るモック。 + * なんとなくENGINEのモックと揃えている。 + */ + +import { Speaker, SpeakerInfo } from "@/openapi"; + +/** 話者を返すモック */ +export function getSpeakersMock(): Speaker[] { + return [ + // トーク2つ + { + name: "dummy1", + styles: [ + { name: "style0", id: 0 }, + { name: "style1", id: 2 }, + ], + speakerUuid: "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", + version: "mock", + }, + // トーク2つ + { + name: "dummy2", + styles: [ + { name: "style0", id: 1 }, + { name: "style1", id: 3 }, + ], + speakerUuid: "388f246b-8c41-4ac1-8e2d-5d79f3ff56d9", + version: "mock", + }, + // トーク1つ + { + name: "dummy3", + styles: [{ name: "style0", id: 8 }], + speakerUuid: "35b2c544-660e-401e-b503-0e14c635303a", + version: "mock", + }, + ]; +} + +/** 話者の追加情報を返すモック。 */ +export function getSpeakerInfoMock( + speakerUuid: string, + assetsDir: string, +): SpeakerInfo { + const speakers = getSpeakersMock(); + + // NOTE: 画像のURLを得るために必要 + const speakerIndex = speakers.findIndex( + (speaker) => speaker.speakerUuid === speakerUuid, + ); + if (speakerIndex === -1) { + throw new Error(`Speaker not found: ${speakerUuid}`); + } + + const styleIds = speakers[speakerIndex].styles.map((style) => style.id); + + return { + policy: `Dummy policy for ${speakerUuid}`, + portrait: `${assetsDir}/portrait_${speakerIndex + 1}.png`, + styleInfos: styleIds.map((id) => { + return { + id, + icon: `${assetsDir}/icon_${speakerIndex + 1}.png`, + voiceSamples: [], + }; + }), + }; +} diff --git a/src/storybook/engineMock/talkModelMock.ts b/src/storybook/engineMock/talkModelMock.ts index 5cdb0f652c..1a2aa83ba6 100644 --- a/src/storybook/engineMock/talkModelMock.ts +++ b/src/storybook/engineMock/talkModelMock.ts @@ -1,5 +1,6 @@ /** * トーク系の構造体を作るモック。 + * 値は適当だが、UIのバグに気づけるよう決定論的に決まるようにしたり、ある程度規則を持たせている。 */ import { IpadicFeatures } from "kuromoji"; @@ -14,17 +15,17 @@ function alphabetsToNumber(text: string): number { return (sum % 256) / 256; } -// 0.1~1になるように適当な長さを求める +// 0.1~1になるように適当な長さを決める function phonemeToLengthMock(phoneme: string): number { return alphabetsToNumber(phoneme) * 0.9 + 0.1; } -// 3~6になるように適当なピッチを求める +// 3~6になるように適当なピッチを決める function phonemeToPitchMock(phoneme: string): number { return (1 - alphabetsToNumber(phoneme)) * 3 + 3; } -/** カタカナテキストを適当なモーラに変換する */ +/** カタカナテキストをモーラに変換する */ function textToMoraMock(text: string): Mora { const phonemes = moraToPhonemes[text]; if (phonemes == undefined) throw new Error(`モーラに変換できません: ${text}`); @@ -32,16 +33,18 @@ function textToMoraMock(text: string): Mora { return { text, consonant: phonemes[0], - consonantLength: - phonemes[0] == undefined ? undefined : phonemeToLengthMock(phonemes[0]), + consonantLength: phonemes[0] == undefined ? undefined : 0, vowel: phonemes[1], - vowelLength: phonemeToLengthMock(phonemes[1]), - pitch: phonemeToPitchMock((phonemes[0] ?? "") + phonemes[1]), + vowelLength: 0, + pitch: 0, }; } -/** カタカナテキストを適当なアクセント句に変換する */ -function textToAccentPhrase(text: string): AccentPhrase { +/** + * カタカナテキストを適当なアクセント句に変換する。 + * アクセント位置は適当に決める。 + */ +function textToAccentPhraseMock(text: string): AccentPhrase { const moras: Mora[] = [...text.matchAll(moraPattern)].map((m) => textToMoraMock(m[0]), ); @@ -51,13 +54,86 @@ function textToAccentPhrase(text: string): AccentPhrase { return { moras, accent }; } +/** + * アクセント句内のモーラの長さを適当に代入する。 + * 最後のモーラだけ長くする。 + */ +export function replaseLengthMock( + accentPhrases: AccentPhrase[], + speaker: number, +) { + for (const accentPhrase of accentPhrases) { + for (let i = 0; i < accentPhrase.moras.length; i++) { + const mora = accentPhrase.moras[i]; + + // 最後のモーラだけ長く + const offset = i == accentPhrase.moras.length - 1 ? 0.1 : 0; + + if (mora.consonant != undefined) + mora.consonantLength = phonemeToLengthMock(mora.consonant) + offset; + mora.vowelLength = phonemeToLengthMock(mora.vowel) + offset; + } + } + + // 別のアクセント句や話者で同じにならないように適当に値をずらす + for (let i = 0; i < accentPhrases.length; i++) { + const diff = i * 0.01 + speaker * 0.03; + const accentPhrase = accentPhrases[i]; + for (const mora of accentPhrase.moras) { + if (mora.consonantLength != undefined) mora.consonantLength += diff; + mora.vowelLength += diff; + } + if (accentPhrase.pauseMora != undefined) { + accentPhrase.pauseMora.vowelLength += diff; + } + } +} + +/** + * アクセント句内のモーラのピッチを適当に代入する。 + * アクセント位置のモーラだけ高くする。 + */ +export function replasePitchMock( + accentPhrases: AccentPhrase[], + speaker: number, +) { + for (const accentPhrase of accentPhrases) { + for (let i = 0; i < accentPhrase.moras.length; i++) { + const mora = accentPhrase.moras[i]; + + // 無声化している場合はピッチを0にする + if (mora.vowel == "U") { + mora.pitch = 0; + continue; + } + + // アクセント位置のモーラだけ高く + const offset = i == accentPhrase.accent ? 0.3 : 0; + + const phoneme = (mora.consonant ?? "") + mora.vowel[1]; + mora.pitch = phonemeToPitchMock(phoneme) + offset; + } + } + + // 別のアクセント句や話者で同じにならないように適当に値をずらす + for (let i = 0; i < accentPhrases.length; i++) { + const diff = i * 0.01 + speaker * 0.03; + const accentPhrase = accentPhrases[i]; + for (const mora of accentPhrase.moras) { + if (mora.pitch > 0) mora.pitch += diff; + } + } +} + /** * テキストを適当なアクセント句に分割する。 * 助詞ごとに区切る。記号ごとに無音を入れる。 * 無音で終わるアクセント句の最後のモーラが「す」「つ」の場合は無声化する。 */ -export function tokensToActtentPhrases(tokens: IpadicFeatures[]) { - // TODO: 先にアクセントを求めてから長さなどを求める +export function tokensToActtentPhrasesMock( + tokens: IpadicFeatures[], + speaker: number, +) { const accentPhrases: AccentPhrase[] = []; let textPhrase = ""; for (const token of tokens) { @@ -65,7 +141,7 @@ export function tokensToActtentPhrases(tokens: IpadicFeatures[]) { if (token.pos == "記号") { if (textPhrase.length == 0) continue; - const accentPhrase = textToAccentPhrase(textPhrase); + const accentPhrase = textToAccentPhraseMock(textPhrase); accentPhrase.pauseMora = { text: "、", vowel: "", @@ -84,12 +160,12 @@ export function tokensToActtentPhrases(tokens: IpadicFeatures[]) { // 助詞の場合は区切る if (token.pos == "助詞") { - accentPhrases.push(textToAccentPhrase(textPhrase)); + accentPhrases.push(textToAccentPhraseMock(textPhrase)); textPhrase = ""; } } if (textPhrase != "") { - accentPhrases.push(textToAccentPhrase(textPhrase)); + accentPhrases.push(textToAccentPhraseMock(textPhrase)); } // 最後のアクセント句の無音をなくす @@ -108,19 +184,9 @@ export function tokensToActtentPhrases(tokens: IpadicFeatures[]) { } } - // 別のアクセント句で同じにならないように適当に値をずらす - for (let i = 0; i < accentPhrases.length; i++) { - const diff = i * 0.01; - const accentPhrase = accentPhrases[i]; - for (const mora of accentPhrase.moras) { - if (mora.consonantLength != undefined) mora.consonantLength += diff; - mora.vowelLength += diff; - if (mora.pitch > 0) mora.pitch += diff; - } - if (accentPhrase.pauseMora != undefined) { - accentPhrase.pauseMora.vowelLength += diff; - } - } + // 長さとピッチを代入 + replaseLengthMock(accentPhrases, speaker); + replasePitchMock(accentPhrases, speaker); return accentPhrases; } diff --git a/src/storybook/engineMock/test.stories.ts b/src/storybook/engineMock/test.stories.ts index 27040e1b8d..8c0bdd5b51 100644 --- a/src/storybook/engineMock/test.stories.ts +++ b/src/storybook/engineMock/test.stories.ts @@ -17,7 +17,7 @@ export const OpenOfficialSite: Story = { play: async ({ args }) => { const mockApi = createOpenAPIEngineMock(); const api = mockApi.instance(mockHost); - const result = await api.accentPhrasesAccentPhrasesPost({ + const result = await api.audioQueryAudioQueryPost({ text: "そうです、そのとおりだと思いますね", speaker: 1, }); diff --git a/tests/e2e/browser/assets/icon_1.png b/tests/assets/icon_1.png similarity index 100% rename from tests/e2e/browser/assets/icon_1.png rename to tests/assets/icon_1.png diff --git a/tests/e2e/browser/assets/icon_2.png b/tests/assets/icon_2.png similarity index 100% rename from tests/e2e/browser/assets/icon_2.png rename to tests/assets/icon_2.png diff --git a/tests/e2e/browser/assets/icon_3.png b/tests/assets/icon_3.png similarity index 100% rename from tests/e2e/browser/assets/icon_3.png rename to tests/assets/icon_3.png diff --git a/tests/e2e/browser/assets/icon_4.png b/tests/assets/icon_4.png similarity index 100% rename from tests/e2e/browser/assets/icon_4.png rename to tests/assets/icon_4.png diff --git a/tests/e2e/browser/assets/portrait_1.png b/tests/assets/portrait_1.png similarity index 100% rename from tests/e2e/browser/assets/portrait_1.png rename to tests/assets/portrait_1.png diff --git a/tests/e2e/browser/assets/portrait_2.png b/tests/assets/portrait_2.png similarity index 100% rename from tests/e2e/browser/assets/portrait_2.png rename to tests/assets/portrait_2.png diff --git a/tests/e2e/browser/assets/portrait_3.png b/tests/assets/portrait_3.png similarity index 100% rename from tests/e2e/browser/assets/portrait_3.png rename to tests/assets/portrait_3.png diff --git a/tests/e2e/browser/assets/portrait_4.png b/tests/assets/portrait_4.png similarity index 100% rename from tests/e2e/browser/assets/portrait_4.png rename to tests/assets/portrait_4.png diff --git "a/tests/e2e/browser/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210.spec.ts" "b/tests/e2e/browser/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210.spec.ts" index 200fb91234..32827cbb27 100644 --- "a/tests/e2e/browser/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210.spec.ts" +++ "b/tests/e2e/browser/\343\202\271\343\202\257\343\203\252\343\203\274\343\203\263\343\202\267\343\203\247\343\203\203\343\203\210.spec.ts" @@ -26,7 +26,7 @@ async function getSpeakerImages(): Promise< }[] > { if (!speakerImages) { - const assetsPath = path.resolve(__dirname, "assets"); + const assetsPath = path.resolve(__dirname, "../../assets"); const images = await fs.readdir(assetsPath); const icons = images.filter((image) => image.startsWith("icon")); icons.sort( From b482e48a10a94210cfa60f6e20f4f36ddd962599 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Wed, 3 Jul 2024 01:38:21 +0900 Subject: [PATCH 03/17] stash --- .storybook/preview-head.html | 3 +++ src/components/Talk/TalkEditor.stories.ts | 2 +- src/store/setting.ts | 2 +- src/storybook/engineMock/talkModelMock.ts | 12 ++++++------ 4 files changed, 11 insertions(+), 8 deletions(-) create mode 100644 .storybook/preview-head.html diff --git a/.storybook/preview-head.html b/.storybook/preview-head.html new file mode 100644 index 0000000000..96736f28c1 --- /dev/null +++ b/.storybook/preview-head.html @@ -0,0 +1,3 @@ + + + diff --git a/src/components/Talk/TalkEditor.stories.ts b/src/components/Talk/TalkEditor.stories.ts index 791fb74c53..17e43cbbd4 100644 --- a/src/components/Talk/TalkEditor.stories.ts +++ b/src/components/Talk/TalkEditor.stories.ts @@ -33,6 +33,7 @@ const meta: Meta = { const store = createStoreWrapper({ proxyStoreDI: proxyStoreCreator(createOpenAPIEngineMock()), }); + store.dispatch("HYDRATE_SETTING_STORE"); // FIXME: 色設定取得のため。設定も読み込んでしまうため不要にしたい。 // context.parameters.store = store; @@ -111,7 +112,6 @@ type Story = StoryObj; export const Default: Story = { name: "デフォルト", - play: async ({ parameters }) => { }, }; export const NowLoading: Story = { diff --git a/src/store/setting.ts b/src/store/setting.ts index 6200c8fe44..8ece17d966 100644 --- a/src/store/setting.ts +++ b/src/store/setting.ts @@ -232,7 +232,7 @@ export const settingStore = createPartialStore({ state.themeSetting.currentTheme = currentTheme; }, action({ state, commit }, { currentTheme }: { currentTheme: string }) { - window.backend.theme(currentTheme); + // window.backend.theme(currentTheme); const theme = state.themeSetting.availableThemes.find((value) => { return value.name == currentTheme; }); diff --git a/src/storybook/engineMock/talkModelMock.ts b/src/storybook/engineMock/talkModelMock.ts index 1a2aa83ba6..9726896060 100644 --- a/src/storybook/engineMock/talkModelMock.ts +++ b/src/storybook/engineMock/talkModelMock.ts @@ -5,7 +5,7 @@ import { IpadicFeatures } from "kuromoji"; import { moraToPhonemes } from "./phonemeMock"; -import { convertHiraToKana, moraPattern } from "@/domain/japanese"; +import { moraPattern } from "@/domain/japanese"; import { AccentPhrase, Mora } from "@/openapi"; /** アルファベット文字列を適当な0~1の適当な数値に変換する */ @@ -15,14 +15,14 @@ function alphabetsToNumber(text: string): number { return (sum % 256) / 256; } -// 0.1~1になるように適当な長さを決める +// 0.01~0.25になるように適当な長さを決める function phonemeToLengthMock(phoneme: string): number { - return alphabetsToNumber(phoneme) * 0.9 + 0.1; + return alphabetsToNumber(phoneme) * 0.24 + 0.01; } -// 3~6になるように適当なピッチを決める +// 3~5になるように適当なピッチを決める function phonemeToPitchMock(phoneme: string): number { - return (1 - alphabetsToNumber(phoneme)) * 3 + 3; + return (1 - alphabetsToNumber(phoneme)) * 2 + 3; } /** カタカナテキストをモーラに変換する */ @@ -67,7 +67,7 @@ export function replaseLengthMock( const mora = accentPhrase.moras[i]; // 最後のモーラだけ長く - const offset = i == accentPhrase.moras.length - 1 ? 0.1 : 0; + const offset = i == accentPhrase.moras.length - 1 ? 0.05 : 0; if (mora.consonant != undefined) mora.consonantLength = phonemeToLengthMock(mora.consonant) + offset; From 409ca080f29d3415663984ae4a12a7f3a1e8ac79 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sat, 6 Jul 2024 22:22:36 +0900 Subject: [PATCH 04/17] =?UTF-8?q?main=E3=81=AB=E8=BF=91=E3=81=A5=E3=81=91?= =?UTF-8?q?=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storybook/main.ts | 6 +++--- src/store/audio.ts | 36 ++++++++++++++++++------------------ src/store/setting.ts | 2 +- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/.storybook/main.ts b/.storybook/main.ts index 06737b96bc..fddbe54b27 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,5 +1,5 @@ -import { assetsPath, dicPath } from "@/storybook/engineMock"; import type { StorybookConfig } from "@storybook/vue3-vite"; +import { assetsPath, dicPath } from "@/storybook/engineMock"; const config: StorybookConfig = { stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], @@ -10,7 +10,7 @@ const config: StorybookConfig = { "@storybook/addon-interactions", ], core: { - builder: '@storybook/builder-vite', + builder: "@storybook/builder-vite", }, framework: { name: "@storybook/vue3-vite", @@ -21,7 +21,7 @@ const config: StorybookConfig = { staticDirs: [ // モックエンジン用のファイル { from: "../node_modules/kuromoji/dict", to: dicPath }, - { from: "../tests/assets", to: assetsPath } + { from: "../tests/assets", to: assetsPath }, ], }; diff --git a/src/store/audio.ts b/src/store/audio.ts index 0af92b05a2..2b39f8ee33 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -684,8 +684,8 @@ export const audioStore = createPartialStore({ const query = getters.IS_ENGINE_READY(voice.engineId) ? await dispatch("FETCH_AUDIO_QUERY", fetchQueryParams).catch( - () => undefined, - ) + () => undefined, + ) : undefined; const newAudioItem: AudioItem = { text, voice }; @@ -2003,16 +2003,16 @@ export const audioCommandStore = transformCommandStore( changes: Record< AudioKey, | { - update: "AccentPhrases"; - accentPhrases: AccentPhrase[]; - } + update: "AccentPhrases"; + accentPhrases: AccentPhrase[]; + } | { - update: "AudioQuery"; - query: AudioQuery; - } + update: "AudioQuery"; + query: AudioQuery; + } | { - update: "OnlyVoice"; - } + update: "OnlyVoice"; + } >; }, ) { @@ -2067,16 +2067,16 @@ export const audioCommandStore = transformCommandStore( const changes: Record< AudioKey, | { - update: "AccentPhrases"; - accentPhrases: AccentPhrase[]; - } + update: "AccentPhrases"; + accentPhrases: AccentPhrase[]; + } | { - update: "AudioQuery"; - query: AudioQuery; - } + update: "AudioQuery"; + query: AudioQuery; + } | { - update: "OnlyVoice"; - } + update: "OnlyVoice"; + } > = {}; for (const audioKey of audioKeys) { diff --git a/src/store/setting.ts b/src/store/setting.ts index 8ece17d966..6200c8fe44 100644 --- a/src/store/setting.ts +++ b/src/store/setting.ts @@ -232,7 +232,7 @@ export const settingStore = createPartialStore({ state.themeSetting.currentTheme = currentTheme; }, action({ state, commit }, { currentTheme }: { currentTheme: string }) { - // window.backend.theme(currentTheme); + window.backend.theme(currentTheme); const theme = state.themeSetting.availableThemes.find((value) => { return value.name == currentTheme; }); From 171269216166f25e7d7e812411b8117cfba9c34b Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sat, 6 Jul 2024 22:23:37 +0900 Subject: [PATCH 05/17] =?UTF-8?q?=E3=83=86=E3=83=BC=E3=83=9E=E5=91=A8?= =?UTF-8?q?=E3=82=8A=E3=82=92=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?UTF-8?q?=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/backend/browser/sandbox.ts | 23 ++--------- src/backend/electron/main.ts | 11 +---- src/backend/electron/preload.ts | 4 +- .../Dialog/SettingDialog/SettingDialog.vue | 6 +-- src/store/setting.ts | 41 +++++++------------ src/store/type.ts | 12 ++++-- src/store/ui.ts | 6 +++ src/type/ipc.ts | 6 +-- src/type/preload.ts | 7 +--- 9 files changed, 42 insertions(+), 74 deletions(-) diff --git a/src/backend/browser/sandbox.ts b/src/backend/browser/sandbox.ts index f2f5451085..b560131c4d 100644 --- a/src/backend/browser/sandbox.ts +++ b/src/backend/browser/sandbox.ts @@ -284,32 +284,15 @@ export const api: Sandbox = { // TODO: Impl return; }, - async theme(newData?: string) { - if (newData != undefined) { - await this.setSetting("currentTheme", newData); - return; - } + async getAvailableThemes() { // NOTE: Electron版では起動時にテーマ情報が必要なので、 // この実装とは違って起動時に読み込んだキャッシュを返すだけになっている。 return Promise.all( // FIXME: themeファイルのいい感じのパスの設定 ["/themes/default.json", "/themes/dark.json"].map((url) => - fetch(url).then((res) => res.json()), + fetch(url).then((res) => res.json() as Promise), ), - ) - .then((v) => ({ - currentTheme: "Default", - availableThemes: v, - })) - .then((v) => - this.getSetting("currentTheme").then( - (currentTheme) => - ({ - ...v, - currentTheme, - }) as { currentTheme: string; availableThemes: ThemeConf[] }, - ), - ); + ); }, vuexReady() { // NOTE: 何もしなくて良さそう diff --git a/src/backend/electron/main.ts b/src/backend/electron/main.ts index 96b6ff18b4..97e5e7c16f 100644 --- a/src/backend/electron/main.ts +++ b/src/backend/electron/main.ts @@ -922,15 +922,8 @@ ipcMainHandle("HOTKEY_SETTINGS", (_, { newData }) => { return configManager.get("hotkeySettings"); }); -ipcMainHandle("THEME", (_, { newData }) => { - if (newData != undefined) { - configManager.set("currentTheme", newData); - return; - } - return { - currentTheme: configManager.get("currentTheme"), - availableThemes: themes, - }; +ipcMainHandle("GET_AVAILABLE_THEMES", () => { + return themes; }); ipcMainHandle("ON_VUEX_READY", () => { diff --git a/src/backend/electron/preload.ts b/src/backend/electron/preload.ts index d529909e2c..1168da7ac9 100644 --- a/src/backend/electron/preload.ts +++ b/src/backend/electron/preload.ts @@ -226,8 +226,8 @@ const api: Sandbox = { ipcRenderer.invoke("SET_NATIVE_THEME", source); }, - theme: (newData) => { - return ipcRenderer.invoke("THEME", { newData }); + getAvailableThemes: () => { + return ipcRenderer.invoke("GET_AVAILABLE_THEMES"); }, vuexReady: () => { diff --git a/src/components/Dialog/SettingDialog/SettingDialog.vue b/src/components/Dialog/SettingDialog/SettingDialog.vue index 75574e3a90..cf36c8b319 100644 --- a/src/components/Dialog/SettingDialog/SettingDialog.vue +++ b/src/components/Dialog/SettingDialog/SettingDialog.vue @@ -609,14 +609,14 @@ const isDefaultConfirmedTips = computed(() => { // 外観 const currentThemeNameComputed = computed({ - get: () => store.state.themeSetting.currentTheme, + get: () => store.state.currentTheme, set: (currentTheme: string) => { - store.dispatch("SET_THEME_SETTING", { currentTheme: currentTheme }); + store.dispatch("SET_CURRENT_THEME_SETTING", { currentTheme }); }, }); const availableThemeNameComputed = computed(() => { - return [...store.state.themeSetting.availableThemes] + return [...store.state.availableThemes] .sort((a, b) => a.order - b.order) .map((theme) => { return { label: theme.displayName, value: theme.name }; diff --git a/src/store/setting.ts b/src/store/setting.ts index 6200c8fe44..de6d909095 100644 --- a/src/store/setting.ts +++ b/src/store/setting.ts @@ -7,7 +7,6 @@ import { SavingSetting, ExperimentalSettingType, ThemeColorType, - ThemeConf, ToolbarSettingType, EngineId, ConfirmedTips, @@ -32,10 +31,8 @@ export const settingStoreState: SettingStoreState = { engineIds: [], engineInfos: {}, engineManifests: {}, - themeSetting: { - currentTheme: "Default", - availableThemes: [], - }, + currentTheme: "Default", + availableThemes: [], editorFont: "default", showTextLineNumber: false, showAddAudioItemButton: true, @@ -78,16 +75,12 @@ export const settingStore = createPartialStore({ }); }); - const theme = await window.backend.theme(); - if (theme) { - commit("SET_THEME_SETTING", { - currentTheme: theme.currentTheme, - themes: theme.availableThemes, - }); - dispatch("SET_THEME_SETTING", { - currentTheme: theme.currentTheme, - }); - } + commit("SET_AVAILABLE_THEMES", { + themes: await window.backend.getAvailableThemes(), + }); + dispatch("SET_CURRENT_THEME_SETTING", { + currentTheme: await window.backend.getSetting("currentTheme"), + }); dispatch("SET_ACCEPT_RETRIEVE_TELEMETRY", { acceptRetrieveTelemetry: await window.backend.getSetting( @@ -221,19 +214,13 @@ export const settingStore = createPartialStore({ }, }, - SET_THEME_SETTING: { - mutation( - state, - { currentTheme, themes }: { currentTheme: string; themes?: ThemeConf[] }, - ) { - if (themes) { - state.themeSetting.availableThemes = themes; - } - state.themeSetting.currentTheme = currentTheme; + SET_CURRENT_THEME_SETTING: { + mutation(state, { currentTheme }: { currentTheme: string }) { + state.currentTheme = currentTheme; }, action({ state, commit }, { currentTheme }: { currentTheme: string }) { - window.backend.theme(currentTheme); - const theme = state.themeSetting.availableThemes.find((value) => { + window.backend.setSetting("currentTheme", currentTheme); + const theme = state.availableThemes.find((value) => { return value.name == currentTheme; }); @@ -275,7 +262,7 @@ export const settingStore = createPartialStore({ window.backend.setNativeTheme(theme.isDark ? "dark" : "light"); - commit("SET_THEME_SETTING", { + commit("SET_CURRENT_THEME_SETTING", { currentTheme: currentTheme, }); }, diff --git a/src/store/type.ts b/src/store/type.ts index b94864d7aa..40cc1506f3 100644 --- a/src/store/type.ts +++ b/src/store/type.ts @@ -29,7 +29,6 @@ import { MoraDataType, SavingSetting, ThemeConf, - ThemeSetting, ExperimentalSettingType, ToolbarSettingType, UpdateInfo, @@ -1527,7 +1526,8 @@ export type SettingStoreState = { engineIds: EngineId[]; engineInfos: Record; engineManifests: Record; - themeSetting: ThemeSetting; + currentTheme: string; + availableThemes: ThemeConf[]; acceptTerms: AcceptTermsStatus; acceptRetrieveTelemetry: AcceptRetrieveTelemetryStatus; experimentalSetting: ExperimentalSettingType; @@ -1568,8 +1568,8 @@ export type SettingStoreTypes = { action(payload: KeyValuePayload): void; }; - SET_THEME_SETTING: { - mutation: { currentTheme: string; themes?: ThemeConf[] }; + SET_CURRENT_THEME_SETTING: { + mutation: { currentTheme: string }; action(payload: { currentTheme: string }): void; }; @@ -1783,6 +1783,10 @@ export type UiStoreTypes = { action(payload: { activePointScrollMode: ActivePointScrollMode }): void; }; + SET_AVAILABLE_THEMES: { + mutation: { themes: ThemeConf[] }; + }; + DETECT_UNMAXIMIZED: { mutation: undefined; action(): void; diff --git a/src/store/ui.ts b/src/store/ui.ts index 59ac754d6d..e486f2cfa2 100644 --- a/src/store/ui.ts +++ b/src/store/ui.ts @@ -342,6 +342,12 @@ export const uiStore = createPartialStore({ }, }, + SET_AVAILABLE_THEMES: { + mutation(state, { themes }) { + state.availableThemes = themes; + }, + }, + DETECT_UNMAXIMIZED: { mutation(state) { state.isMaximized = false; diff --git a/src/type/ipc.ts b/src/type/ipc.ts index 599e4a717d..a001870444 100644 --- a/src/type/ipc.ts +++ b/src/type/ipc.ts @@ -244,9 +244,9 @@ export type IpcIHData = { return: ToolbarSettingType; }; - THEME: { - args: [obj: { newData?: string }]; - return: ThemeSetting | void; + GET_AVAILABLE_THEMES: { + args: []; + return: ThemeSetting; }; ON_VUEX_READY: { diff --git a/src/type/preload.ts b/src/type/preload.ts index 01a3bdecb7..72ec8decf3 100644 --- a/src/type/preload.ts +++ b/src/type/preload.ts @@ -276,7 +276,7 @@ export interface Sandbox { getDefaultHotkeySettings(): Promise; getDefaultToolbarSetting(): Promise; setNativeTheme(source: NativeThemeType): void; - theme(newData?: string): Promise; + getAvailableThemes(): Promise; vuexReady(): void; getSetting(key: Key): Promise; setSetting( @@ -552,11 +552,6 @@ export type ThemeConf = { }; }; -export type ThemeSetting = { - currentTheme: string; - availableThemes: ThemeConf[]; -}; - export const experimentalSettingSchema = z.object({ enablePreset: z.boolean().default(false), shouldApplyDefaultPresetOnVoiceChanged: z.boolean().default(false), From b1b10e469fbb78087819ae0dbb7dba71017d0576 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Mon, 8 Jul 2024 08:36:44 +0900 Subject: [PATCH 06/17] stash --- src/components/App.vue | 30 ++++- src/components/Talk/TalkEditor.stories.ts | 120 ++++++++++++------ src/components/Talk/TalkEditor.vue | 8 +- src/domain/dom.ts | 42 ++++++ src/{storybook => mock}/engineMock/index.ts | 0 .../engineMock/manifestMock.ts | 0 .../engineMock/phonemeMock.ts | 0 .../engineMock/speakerResourceMock.ts | 0 .../engineMock/talkModelMock.ts | 0 .../engineMock/test.stories.ts | 0 src/mock/geneareNormalizedRandomState.ts | 28 ++++ src/store/audio.ts | 36 +++--- src/store/setting.ts | 34 +---- 13 files changed, 204 insertions(+), 94 deletions(-) create mode 100644 src/domain/dom.ts rename src/{storybook => mock}/engineMock/index.ts (100%) rename src/{storybook => mock}/engineMock/manifestMock.ts (100%) rename src/{storybook => mock}/engineMock/phonemeMock.ts (100%) rename src/{storybook => mock}/engineMock/speakerResourceMock.ts (100%) rename src/{storybook => mock}/engineMock/talkModelMock.ts (100%) rename src/{storybook => mock}/engineMock/test.stories.ts (100%) create mode 100644 src/mock/geneareNormalizedRandomState.ts diff --git a/src/components/App.vue b/src/components/App.vue index a6418c2807..24ab41418f 100644 --- a/src/components/App.vue +++ b/src/components/App.vue @@ -32,6 +32,7 @@ import AllDialog from "@/components/Dialog/AllDialog.vue"; import MenuBar from "@/components/Menu/MenuBar/MenuBar.vue"; import { useMenuBarData as useTalkMenuBarData } from "@/components/Talk/menuBarData"; import { useMenuBarData as useSingMenuBarData } from "@/components/Sing/menuBarData"; +import { setFont, themeToCss } from "@/domain/dom"; const store = useStore(); @@ -64,7 +65,7 @@ watch( watch( () => store.state.editorFont, (editorFont) => { - document.body.setAttribute("data-editor-font", editorFont); + setFont(editorFont); }, { immediate: true }, ); @@ -79,6 +80,33 @@ watch( }, ); +// テーマの変更を監視してCSS変数を変更する +watch( + () => + [ + store.state.currentTheme, + store.state.availableThemes, + store.state.isVuexReady, + ] as const, + ([currentTheme, availableThemes, isVuexReady]) => { + const theme = availableThemes.find((value) => { + return value.name == currentTheme; + }); + + if (theme == undefined) { + // NOTE: Vuexが初期化されていない場合はまだテーマが読み込まれていないので無視 + if (isVuexReady) { + throw Error(`Theme not found: ${currentTheme}`); + } else { + return; + } + } + + themeToCss(theme); + }, + { immediate: true }, +); + // ソフトウェアを初期化 const { hotkeyManager } = useHotkeyManager(); const isEnginesReady = ref(false); diff --git a/src/components/Talk/TalkEditor.stories.ts b/src/components/Talk/TalkEditor.stories.ts index 17e43cbbd4..9c0c6fd9cf 100644 --- a/src/components/Talk/TalkEditor.stories.ts +++ b/src/components/Talk/TalkEditor.stories.ts @@ -1,23 +1,34 @@ -import { userEvent, within, expect, fn } from "@storybook/test"; +import { userEvent, within, expect, fn, waitFor } from "@storybook/test"; +import hotkeys from "hotkeys-js"; import { Meta, StoryObj } from "@storybook/vue3"; import { provide, toRaw } from "vue"; import TalkEditor from "./TalkEditor.vue"; import { createStoreWrapper, storeKey } from "@/store"; import { HotkeyManager, hotkeyManagerKey } from "@/plugins/hotkeyPlugin"; -import { StoreType } from "@/store/type"; import { assetsPath, createOpenAPIEngineMock, mockHost, -} from "@/storybook/engineMock"; +} from "@/mock/engineMock"; import { proxyStoreCreator } from "@/store/proxy"; -import { CharacterInfo, EngineId, SpeakerId, StyleId } from "@/type/preload"; -import { getEngineManifestMock } from "@/storybook/engineMock/manifestMock"; +import { + CharacterInfo, + defaultHotkeySettings, + DefaultStyleId, + EngineId, + EngineInfo, + SpeakerId, + StyleId, + ThemeConf, +} from "@/type/preload"; +import { getEngineManifestMock } from "@/mock/engineMock/manifestMock"; import { getSpeakerInfoMock, getSpeakersMock, -} from "@/storybook/engineMock/speakerResourceMock"; +} from "@/mock/engineMock/speakerResourceMock"; +import { setFont, themeToCss } from "@/domain/dom"; +import defaultTheme from "@/../public/themes/default.json"; const meta: Meta = { component: TalkEditor, @@ -27,20 +38,51 @@ const meta: Meta = { }, decorators: [ (story, context) => { + // CSS関連 + themeToCss(defaultTheme as ThemeConf); + setFont("default"); + + // ショートカットキーの管理 const hotkeyManager = new HotkeyManager(); provide(hotkeyManagerKey, hotkeyManager); + hotkeyManager.load(defaultHotkeySettings); + + hotkeyManager.onEditorChange("talk"); + // setup store const store = createStoreWrapper({ proxyStoreDI: proxyStoreCreator(createOpenAPIEngineMock()), }); - store.dispatch("HYDRATE_SETTING_STORE"); // FIXME: 色設定取得のため。設定も読み込んでしまうため不要にしたい。 + provide(storeKey, store); - // context.parameters.store = store; + // なぜか必要、これがないとdispatch内でcommitしたときにエラーになる + store.replaceState({ + ...structuredClone(toRaw(store.state)), + }); + // エンジンの情報 const engineManifest = getEngineManifestMock(); const engineId = EngineId(engineManifest.uuid); + const engineInfo: EngineInfo = { + uuid: engineId, + host: mockHost, + name: engineManifest.name, + path: undefined, + executionEnabled: false, + executionFilePath: "not_found", + executionArgs: [], + type: "default", + }; + store.commit("SET_ENGINE_INFOS", { + engineIds: [engineId], + engineInfos: [engineInfo], + }); + store.commit("SET_ENGINE_MANIFESTS", { + engineManifests: { [engineId]: engineManifest }, + }); + store.commit("SET_ENGINE_STATE", { engineId, engineState: "READY" }); - // setup store + // キャラクター情報 const speakers = getSpeakersMock(); const characterInfos: CharacterInfo[] = speakers.map((speaker) => { const speakerInfo = getSpeakerInfoMock(speaker.speakerUuid, assetsPath); @@ -66,45 +108,24 @@ const meta: Meta = { }, }; }); - - store.replaceState({ - ...structuredClone(toRaw(store.state)), - engineIds: [engineId], - engineStates: { - [engineId]: "READY", - }, - engineInfos: { - [engineId]: { - uuid: engineId, - host: mockHost, - name: engineManifest.name, - path: undefined, - executionEnabled: false, - executionFilePath: "not_found", - executionArgs: [], - type: "default", - }, - }, - engineManifests: { - [engineId]: engineManifest, - }, - characterInfos: { [engineId]: characterInfos }, - defaultStyleIds: speakers.map((speaker) => ({ - engineId: engineId, - speakerUuid: SpeakerId(speaker.speakerUuid), - defaultStyleId: StyleId(speaker.styles[0].id), - })), + store.commit("SET_CHARACTER_INFOS", { engineId, characterInfos }); + store.commit("SET_USER_CHARACTER_ORDER", { + userCharacterOrder: store.state.characterInfos[engineId].map( + (c) => c.metas.speakerUuid, + ), }); - provide(storeKey, store); + // デフォルトスタイルID + const defaultStyleIds: DefaultStyleId[] = speakers.map((speaker) => ({ + engineId: engineId, + speakerUuid: SpeakerId(speaker.speakerUuid), + defaultStyleId: StyleId(speaker.styles[0].id), + })); + store.commit("SET_DEFAULT_STYLE_IDS", { defaultStyleIds }); return story(); }, ], - beforeEach: async ({ parameters }) => { - // const store = parameters.store; // TODO: 型を付けたい - // await store.dispatch("LOAD_CHARACTER", { engineId: EngineId(mockHost) }); - }, }; export default meta; @@ -120,3 +141,18 @@ export const NowLoading: Story = { isProjectFileLoaded: "waiting", }, }; + +export const KeyboardShortcuts: Story = { + name: "キーボードショートカットのテスト ", + play: async ({ args, canvasElement }) => { + await waitFor(() => { + expect(args.onCompleteInitialStartup).toHaveBeenCalled(); + }); + + // Shift+Enter でテキスト欄を追加 + // await userEvent.keyboard("{Shift>}[Enter]{/Shift}"); + // await userEvent.keyboard("AAAAAA{Escape}"); + hotkeys.trigger("shift+enter", "talk"); + たぶんショートカットは使えない! + }, +}; diff --git a/src/components/Talk/TalkEditor.vue b/src/components/Talk/TalkEditor.vue index 5d6253f65e..7cf2f92c24 100644 --- a/src/components/Talk/TalkEditor.vue +++ b/src/components/Talk/TalkEditor.vue @@ -147,6 +147,11 @@ const props = defineProps<{ isProjectFileLoaded: boolean | "waiting"; }>(); +const emit = defineEmits<{ + /** トークエディタの準備が完了するときに呼ばれる */ + completeInitialStartup: []; +}>(); + const store = useStore(); const audioKeys = computed(() => store.state.audioKeys); @@ -508,7 +513,7 @@ watch(userOrderedCharacterInfos, (userOrderedCharacterInfos) => { } }); -// エンジン初期化後の処理 +/** トークエディタの準備が完了したフラグ */ const isCompletedInitialStartup = ref(false); // TODO: Vueっぽくないので解体する onetimeWatch( @@ -533,6 +538,7 @@ onetimeWatch( } isCompletedInitialStartup.value = true; + emit("completeInitialStartup"); return "unwatch"; }, diff --git a/src/domain/dom.ts b/src/domain/dom.ts new file mode 100644 index 0000000000..1160b215ae --- /dev/null +++ b/src/domain/dom.ts @@ -0,0 +1,42 @@ +import { colors, Dark, setCssVar } from "quasar"; +import { EditorFontType, ThemeColorType, ThemeConf } from "@/type/preload"; + +/** テーマの設定をCSSへ反映する */ +export function themeToCss(theme: ThemeConf) { + for (const key in theme.colors) { + const color = theme.colors[key as ThemeColorType]; + const { r, g, b } = colors.hexToRgb(color); + document.documentElement.style.setProperty(`--color-${key}`, color); + document.documentElement.style.setProperty( + `--color-${key}-rgb`, + `${r}, ${g}, ${b}`, + ); + } + const mixColors: ThemeColorType[][] = [ + ["primary", "background"], + ["warning", "background"], + ]; + for (const [color1, color2] of mixColors) { + const color1Rgb = colors.hexToRgb(theme.colors[color1]); + const color2Rgb = colors.hexToRgb(theme.colors[color2]); + const r = Math.trunc((color1Rgb.r + color2Rgb.r) / 2); + const g = Math.trunc((color1Rgb.g + color2Rgb.g) / 2); + const b = Math.trunc((color1Rgb.b + color2Rgb.b) / 2); + const propertyName = `--color-mix-${color1}-${color2}-rgb`; + const cssColor = `${r}, ${g}, ${b}`; + document.documentElement.style.setProperty(propertyName, cssColor); + } + Dark.set(theme.isDark); + setCssVar("primary", theme.colors["primary"]); + setCssVar("warning", theme.colors["warning"]); + + document.documentElement.setAttribute( + "is-dark-theme", + theme.isDark ? "true" : "false", + ); +} + +/** フォントを設定する */ +export function setFont(font: EditorFontType) { + document.body.setAttribute("data-editor-font", font); +} diff --git a/src/storybook/engineMock/index.ts b/src/mock/engineMock/index.ts similarity index 100% rename from src/storybook/engineMock/index.ts rename to src/mock/engineMock/index.ts diff --git a/src/storybook/engineMock/manifestMock.ts b/src/mock/engineMock/manifestMock.ts similarity index 100% rename from src/storybook/engineMock/manifestMock.ts rename to src/mock/engineMock/manifestMock.ts diff --git a/src/storybook/engineMock/phonemeMock.ts b/src/mock/engineMock/phonemeMock.ts similarity index 100% rename from src/storybook/engineMock/phonemeMock.ts rename to src/mock/engineMock/phonemeMock.ts diff --git a/src/storybook/engineMock/speakerResourceMock.ts b/src/mock/engineMock/speakerResourceMock.ts similarity index 100% rename from src/storybook/engineMock/speakerResourceMock.ts rename to src/mock/engineMock/speakerResourceMock.ts diff --git a/src/storybook/engineMock/talkModelMock.ts b/src/mock/engineMock/talkModelMock.ts similarity index 100% rename from src/storybook/engineMock/talkModelMock.ts rename to src/mock/engineMock/talkModelMock.ts diff --git a/src/storybook/engineMock/test.stories.ts b/src/mock/engineMock/test.stories.ts similarity index 100% rename from src/storybook/engineMock/test.stories.ts rename to src/mock/engineMock/test.stories.ts diff --git a/src/mock/geneareNormalizedRandomState.ts b/src/mock/geneareNormalizedRandomState.ts new file mode 100644 index 0000000000..e6145c08d1 --- /dev/null +++ b/src/mock/geneareNormalizedRandomState.ts @@ -0,0 +1,28 @@ +import { State } from "@/store/type"; +import { AudioKey } from "@/type/preload"; + +function generateIncrementalUuid(index: number) { + return `00000000-0000-0000-0000-${index.toString().padStart(12, "0")}`; +} + +/** Stateのランダムな部分を正規化する便利関数。テスト用。 */ +export function geneareNormalizedRandomState(state: State) { + // これだと入れ替えたときとかにテストできない + // ので、やっぱりrandomUuidを使う側をmockにしたい + // globalにステートを作って、reset関数を1個まとめてあげる形がまるそう + // どうやって1箇所に集めるかは課題 + // フォルダ名storybookに戻しても良さそう + + // AudioKey + const oldAudioKeys = state.audioKeys; + const newAudioKeys = oldAudioKeys.map((_, index) => + AudioKey(generateIncrementalUuid(index)), + ); + state.audioItems = Object.fromEntries( + oldAudioKeys.map((oldKey, index) => [ + newAudioKeys[index], + state.audioItems[oldKey], + ]), + ); + state.audioKeys = newAudioKeys; +} diff --git a/src/store/audio.ts b/src/store/audio.ts index 2b39f8ee33..0af92b05a2 100644 --- a/src/store/audio.ts +++ b/src/store/audio.ts @@ -684,8 +684,8 @@ export const audioStore = createPartialStore({ const query = getters.IS_ENGINE_READY(voice.engineId) ? await dispatch("FETCH_AUDIO_QUERY", fetchQueryParams).catch( - () => undefined, - ) + () => undefined, + ) : undefined; const newAudioItem: AudioItem = { text, voice }; @@ -2003,16 +2003,16 @@ export const audioCommandStore = transformCommandStore( changes: Record< AudioKey, | { - update: "AccentPhrases"; - accentPhrases: AccentPhrase[]; - } + update: "AccentPhrases"; + accentPhrases: AccentPhrase[]; + } | { - update: "AudioQuery"; - query: AudioQuery; - } + update: "AudioQuery"; + query: AudioQuery; + } | { - update: "OnlyVoice"; - } + update: "OnlyVoice"; + } >; }, ) { @@ -2067,16 +2067,16 @@ export const audioCommandStore = transformCommandStore( const changes: Record< AudioKey, | { - update: "AccentPhrases"; - accentPhrases: AccentPhrase[]; - } + update: "AccentPhrases"; + accentPhrases: AccentPhrase[]; + } | { - update: "AudioQuery"; - query: AudioQuery; - } + update: "AudioQuery"; + query: AudioQuery; + } | { - update: "OnlyVoice"; - } + update: "OnlyVoice"; + } > = {}; for (const audioKey of audioKeys) { diff --git a/src/store/setting.ts b/src/store/setting.ts index de6d909095..23056cd2ba 100644 --- a/src/store/setting.ts +++ b/src/store/setting.ts @@ -219,6 +219,8 @@ export const settingStore = createPartialStore({ state.currentTheme = currentTheme; }, action({ state, commit }, { currentTheme }: { currentTheme: string }) { + // メモ:テーマ周りリファクタリングしたのでモック挿せるはず。 + // うまくいけば、テーマ周りのリファクタリングだけでプルリク出す。 window.backend.setSetting("currentTheme", currentTheme); const theme = state.availableThemes.find((value) => { return value.name == currentTheme; @@ -228,38 +230,6 @@ export const settingStore = createPartialStore({ throw Error("Theme not found"); } - for (const key in theme.colors) { - const color = theme.colors[key as ThemeColorType]; - const { r, g, b } = colors.hexToRgb(color); - document.documentElement.style.setProperty(`--color-${key}`, color); - document.documentElement.style.setProperty( - `--color-${key}-rgb`, - `${r}, ${g}, ${b}`, - ); - } - const mixColors: ThemeColorType[][] = [ - ["primary", "background"], - ["warning", "background"], - ]; - for (const [color1, color2] of mixColors) { - const color1Rgb = colors.hexToRgb(theme.colors[color1]); - const color2Rgb = colors.hexToRgb(theme.colors[color2]); - const r = Math.trunc((color1Rgb.r + color2Rgb.r) / 2); - const g = Math.trunc((color1Rgb.g + color2Rgb.g) / 2); - const b = Math.trunc((color1Rgb.b + color2Rgb.b) / 2); - const propertyName = `--color-mix-${color1}-${color2}-rgb`; - const cssColor = `${r}, ${g}, ${b}`; - document.documentElement.style.setProperty(propertyName, cssColor); - } - Dark.set(theme.isDark); - setCssVar("primary", theme.colors["primary"]); - setCssVar("warning", theme.colors["warning"]); - - document.documentElement.setAttribute( - "is-dark-theme", - theme.isDark ? "true" : "false", - ); - window.backend.setNativeTheme(theme.isDark ? "dark" : "light"); commit("SET_CURRENT_THEME_SETTING", { From 0631c141fa7538811e215e08acf8dc4389f36adf Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sun, 28 Jul 2024 00:36:00 +0900 Subject: [PATCH 07/17] =?UTF-8?q?=E3=81=AA=E3=81=9C=E3=81=8Bspec.ts?= =?UTF-8?q?=E5=81=B4=E3=81=A7Story=E3=81=8C=E5=8B=95=E3=81=8B=E3=81=9B?= =?UTF-8?q?=E3=81=AA=E3=81=84=EF=BD=A5=EF=BD=A5=EF=BD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storybook/main.ts | 2 +- package-lock.json | 3510 +++++------------ package.json | 18 +- src/components/Talk/TalkEditor.stories.ts | 35 +- src/mock/engineMock/test.stories.ts | 2 +- tests/unit/components/Talk/TalkEditor.spec.ts | 10 + 6 files changed, 931 insertions(+), 2646 deletions(-) create mode 100644 tests/unit/components/Talk/TalkEditor.spec.ts diff --git a/.storybook/main.ts b/.storybook/main.ts index fddbe54b27..58bb70cf8f 100644 --- a/.storybook/main.ts +++ b/.storybook/main.ts @@ -1,5 +1,5 @@ import type { StorybookConfig } from "@storybook/vue3-vite"; -import { assetsPath, dicPath } from "@/storybook/engineMock"; +import { assetsPath, dicPath } from "@/mock/engineMock"; const config: StorybookConfig = { stories: ["../src/**/*.mdx", "../src/**/*.stories.@(js|jsx|mjs|ts|tsx)"], diff --git a/package-lock.json b/package-lock.json index 736ff65f0a..db8bdfa0e6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,15 +41,15 @@ "@openapitools/openapi-generator-cli": "2.13.4", "@playwright/test": "1.43.1", "@quasar/vite-plugin": "1.6.0", - "@storybook/addon-essentials": "8.1.10", - "@storybook/addon-interactions": "8.1.10", - "@storybook/addon-links": "8.1.10", - "@storybook/blocks": "8.1.10", - "@storybook/builder-vite": "8.1.10", - "@storybook/test": "8.1.10", + "@storybook/addon-essentials": "8.2.6", + "@storybook/addon-interactions": "8.2.6", + "@storybook/addon-links": "8.2.6", + "@storybook/blocks": "8.2.6", + "@storybook/builder-vite": "8.2.6", + "@storybook/test": "8.2.6", "@storybook/test-runner": "0.19.0", - "@storybook/vue3": "8.1.10", - "@storybook/vue3-vite": "8.1.10", + "@storybook/vue3": "8.2.6", + "@storybook/vue3-vite": "8.2.6", "@types/async-lock": "1.4.0", "@types/encoding-japanese": "1.0.18", "@types/glob": "8.0.0", @@ -86,7 +86,7 @@ "markdownlint-cli": "0.37.0", "prettier": "3.2.5", "sass": "1.32.13", - "storybook": "8.1.10", + "storybook": "8.2.6", "ts-node": "10.9.1", "typescript": "5.5.2", "vite": "5.3.2", @@ -140,18 +140,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@aw-web-design/x-default-browser": { - "version": "1.4.126", - "resolved": "https://registry.npmjs.org/@aw-web-design/x-default-browser/-/x-default-browser-1.4.126.tgz", - "integrity": "sha512-Xk1sIhyNC/esHGGVjL/niHLowM0csl/kFO5uawBy4IrWwy0o1G8LGt3jP6nmWGz+USxeeqbihAmp/oVZju6wug==", - "dev": true, - "dependencies": { - "default-browser-id": "3.0.0" - }, - "bin": { - "x-default-browser": "bin/x-default-browser.js" - } - }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", @@ -166,9 +154,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.0.tgz", + "integrity": "sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -214,12 +202,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.0.tgz", + "integrity": "sha512-3LEEcj3PVW8pW2R1SR1M89g/qrYk/m/mB/tLqn7dn4sbBUQyTqnlod+II2U4dqiGtUmkcnAmkMDralTFZttRiw==", "dev": true, "dependencies": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -264,14 +252,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", + "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -304,19 +292,17 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.0.tgz", + "integrity": "sha512-GYM6BxeQsETc9mnct+nIIpf63SAyzvyYN7UB/IlTyd+MBg06afFGp0mIeUqGyWgS2mxad6vqbMrHVlaL3m70sQ==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/traverse": "^7.25.0", "semver": "^6.3.1" }, "engines": { @@ -336,9 +322,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.0.tgz", + "integrity": "sha512-q0T+dknZS+L5LDazIP+02gEZITG5unzvb6yIjcmj5i0eFrs5ToBV2m2JGH4EsE/gtP8ygEGLGApBgRIZkTm7zg==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -377,51 +363,14 @@ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -441,16 +390,15 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.0.tgz", + "integrity": "sha512-bIkOa2ZJYn7FHnepzr5iX9Kmz8FjIz4UKzJ9zhX3dnYuVW0xul9RuR3skBfoLu+FPTQw90EHW9rJsSZhyLQ3fQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -472,23 +420,23 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -498,14 +446,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -540,22 +488,10 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.24.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -571,24 +507,23 @@ } }, "node_modules/@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -694,9 +629,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", + "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -705,13 +640,28 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", + "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -721,12 +671,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -753,13 +703,13 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1088,15 +1038,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.0.tgz", + "integrity": "sha512-uaIi2FdqzjpAMvVqvB51S42oC2JEVgh0LDsGfZVDysWE8LrJtQC2jvKmOqEYThKyB7bDEb7BP1GYWDm7tABA0Q==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1138,12 +1088,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1186,18 +1136,16 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.0.tgz", + "integrity": "sha512-xyi6qjr/fYU304fiRwFbekzkqVJZ6A7hOjWZd+89FVcBqPV3S9Wuozz82xdpLspckeaafntbzglaW4pqpzvtSw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.0", "globals": "^11.1.0" }, "engines": { @@ -1233,12 +1181,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1278,6 +1226,22 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", @@ -1359,14 +1323,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.0.tgz", + "integrity": "sha512-CQmfSnK14eYu82fu6GlCwRciHB7mp7oLN+DeyGDDwUr9cMwuSVviJKPXw/YcRYZdB1TdlLJWHHwXwnwD1WnCmQ==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1454,13 +1418,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-simple-access": "^7.24.7" }, "engines": { @@ -1471,15 +1435,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" }, "engines": { "node": ">=6.9.0" @@ -1618,12 +1582,12 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, @@ -1791,12 +1755,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1806,14 +1770,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz", - "integrity": "sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.0.tgz", + "integrity": "sha512-LZicxFzHIw+Sa3pzgMgSz6gdpsdkfiMObHUzhSIrwKF0+/rP/nuR49u79pSS+zIFJ1FeGeqQD2Dq4QGFbOVvSw==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-typescript": "^7.24.7" }, "engines": { @@ -1887,19 +1852,20 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.0.tgz", + "integrity": "sha512-vYAA8PrCOeZfG4D87hmw1KJ1BPubghXP1e2MacRFwECGNKL76dkA38JEwYllbvQCpf/kLxsTtir0b8MtxKoVCw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.0", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1920,29 +1886,30 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.0", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", "@babel/plugin-transform-class-properties": "^7.24.7", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.0", "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.0", "@babel/plugin-transform-json-strings": "^7.24.7", "@babel/plugin-transform-literals": "^7.24.7", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", @@ -1951,7 +1918,7 @@ "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-object-super": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", "@babel/plugin-transform-private-methods": "^7.24.7", "@babel/plugin-transform-private-property-in-object": "^7.24.7", @@ -1962,7 +1929,7 @@ "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", "@babel/plugin-transform-unicode-escapes": "^7.24.7", "@babel/plugin-transform-unicode-property-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7", @@ -1971,7 +1938,7 @@ "babel-plugin-polyfill-corejs2": "^0.4.10", "babel-plugin-polyfill-corejs3": "^0.10.4", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.37.1", "semver": "^6.3.1" }, "engines": { @@ -2187,33 +2154,30 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.0.tgz", + "integrity": "sha512-ubALThHQy4GCf6mbb+5ZRNmLLCI7bJ3f8Q6LHBSRlSKSWj5a7dSUzJBLv3VuIhFrFPgjF4IzPF567YG/HSCdZA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.0", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2231,12 +2195,12 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", + "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, @@ -2306,16 +2270,6 @@ "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -2345,15 +2299,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@electron/asar": { "version": "3.2.10", "resolved": "https://registry.npmjs.org/@electron/asar/-/asar-3.2.10.tgz", @@ -2616,15 +2561,6 @@ "node": "*" } }, - "node_modules/@emotion/use-insertion-effect-with-fallbacks": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", - "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", - "dev": true, - "peerDependencies": { - "react": ">=16.8.0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", @@ -3071,12 +3007,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", - "dev": true - }, "node_modules/@gtm-support/core": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@gtm-support/core/-/core-1.1.0.tgz", @@ -3928,17 +3858,6 @@ "react": ">=16" } }, - "node_modules/@ndelangen/get-tarball": { - "version": "3.0.9", - "resolved": "https://registry.npmjs.org/@ndelangen/get-tarball/-/get-tarball-3.0.9.tgz", - "integrity": "sha512-9JKTEik4vq+yGosHYhZ1tiH/3WpUS0Nh0kej4Agndhox8pAdWhEx5knFVRcb/ya9knCRCs1rPxNrSXTDdfVqpA==", - "dev": true, - "dependencies": { - "gunzip-maybe": "^1.4.2", - "pump": "^3.0.0", - "tar-fs": "^2.1.1" - } - }, "node_modules/@nestjs/axios": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@nestjs/axios/-/axios-3.0.2.tgz", @@ -4575,387 +4494,75 @@ "vue": "^3.0.0" } }, - "node_modules/@radix-ui/primitive": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz", - "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==", - "dev": true - }, - "node_modules/@radix-ui/react-compose-refs": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz", - "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==", - "dev": true, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-context": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.0.tgz", - "integrity": "sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==", + "node_modules/@rollup/plugin-inject": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", + "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", "dev": true, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.3" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-dialog": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.1.tgz", - "integrity": "sha512-zysS+iU4YP3STKNS6USvFVqI4qqx8EpiwmT5TuCApVEBca+eRCbONi4EgzfNSuVnOXvC5UPHHMjs8RXO6DH9Bg==", - "dev": true, - "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-context": "1.1.0", - "@radix-ui/react-dismissable-layer": "1.1.0", - "@radix-ui/react-focus-guards": "1.1.0", - "@radix-ui/react-focus-scope": "1.1.0", - "@radix-ui/react-id": "1.1.0", - "@radix-ui/react-portal": "1.1.1", - "@radix-ui/react-presence": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-slot": "1.1.0", - "@radix-ui/react-use-controllable-state": "1.1.0", - "aria-hidden": "^1.1.1", - "react-remove-scroll": "2.5.7" + "engines": { + "node": ">=14.0.0" }, "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { + "rollup": { "optional": true } } }, - "node_modules/@radix-ui/react-dismissable-layer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.0.tgz", - "integrity": "sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==", + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", "dev": true, "dependencies": { - "@radix-ui/primitive": "1.1.0", - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0", - "@radix-ui/react-use-escape-keydown": "1.1.0" + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "engines": { + "node": ">=14.0.0" }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-focus-guards": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.0.tgz", - "integrity": "sha512-w6XZNUPVv6xCpZUqb/yN9DL6auvpGX3C/ee6Hdi16v2UUy25HV2Q5bcflsiDyT/g5RwbPQ/GIT1vLkeRb+ITBw==", - "dev": true, "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { - "@types/react": { + "rollup": { "optional": true } } }, - "node_modules/@radix-ui/react-focus-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz", - "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==", + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "cpu": [ + "arm" + ], "dev": true, - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } + "optional": true, + "os": [ + "android" + ] }, - "node_modules/@radix-ui/react-id": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz", - "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==", + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "cpu": [ + "arm64" + ], "dev": true, - "dependencies": { - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-portal": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.1.tgz", - "integrity": "sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==", - "dev": true, - "dependencies": { - "@radix-ui/react-primitive": "2.0.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-presence": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.0.tgz", - "integrity": "sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==", - "dev": true, - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0", - "@radix-ui/react-use-layout-effect": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz", - "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==", - "dev": true, - "dependencies": { - "@radix-ui/react-slot": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "@types/react-dom": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", - "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "@types/react-dom": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-slot": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz", - "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==", - "dev": true, - "dependencies": { - "@radix-ui/react-compose-refs": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-callback-ref": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz", - "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==", - "dev": true, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-controllable-state": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz", - "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==", - "dev": true, - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-escape-keydown": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz", - "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==", - "dev": true, - "dependencies": { - "@radix-ui/react-use-callback-ref": "1.1.0" - }, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@radix-ui/react-use-layout-effect": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz", - "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==", - "dev": true, - "peerDependencies": { - "@types/react": "*", - "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/@rollup/plugin-inject": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/@rollup/plugin-inject/-/plugin-inject-5.0.5.tgz", - "integrity": "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg==", - "dev": true, - "dependencies": { - "@rollup/pluginutils": "^5.0.1", - "estree-walker": "^2.0.2", - "magic-string": "^0.30.3" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/pluginutils": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", - "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0", - "estree-walker": "^2.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" - }, - "peerDependenciesMeta": { - "rollup": { - "optional": true - } - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", - "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", - "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] + "optional": true, + "os": [ + "android" + ] }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.17.2", @@ -5219,12 +4826,11 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.1.10.tgz", - "integrity": "sha512-1MjncuynvkT3rJtrkWPHLo92Pfno+LUWtaHiNDt9nXYowclTN2cT4a4gNDh6eKkB9dITHxkD7/4mxjHpFUvyrA==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.2.6.tgz", + "integrity": "sha512-iCsf3V28/jJ95w2zd8aSvR4denoA2UYV3fpNCTGOURqICyKOG3cyVxvqKp8Hhcwn7trNOsK+HlL6q5gpv56ViA==", "dev": true, "dependencies": { - "@storybook/core-events": "8.1.10", "@storybook/global": "^5.0.0", "@types/uuid": "^9.0.1", "dequal": "^2.0.2", @@ -5234,12 +4840,15 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-backgrounds": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.1.10.tgz", - "integrity": "sha512-nX9Hmcq5U/13S2ETcjGaLqfDcaSKTNPD3RBzWUoNQuZB/bB1q4qLLncQnQfaa6uruP9k6GIFZvtXeJAs9r0POw==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.2.6.tgz", + "integrity": "sha512-61NFowA6EmCw+Eyzp0U4fat9MlPDdnT7aoDyzqSImLwWLITY9IvmWuTeo7XKJZN3fe22z1r7cZseKdYrtaHcKw==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5249,15 +4858,17 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-controls": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.1.10.tgz", - "integrity": "sha512-98uLezKv6W/1byJL+Zri5kA1Cfi+DUBsbdjz7fFJl8xMtAGwuv9cnOueQl0ouDhqqwnZ4LWHYQsSsPPMz1Lmkg==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.2.6.tgz", + "integrity": "sha512-EHUwHy+oZZv3pXzN7fuXWrS/meHFjqcELY3RBvOyEkGf21agl6co6R1tnf6d5N5QoYAGfIbDO7dkauSL2RfNAw==", "dev": true, "dependencies": { - "@storybook/blocks": "8.1.10", "dequal": "^2.0.2", "lodash": "^4.17.21", "ts-dedent": "^2.0.0" @@ -5265,27 +4876,23 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-docs": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.1.10.tgz", - "integrity": "sha512-jzmIeCoykiHg/KLPrYEDtXO/+dcQaEOqyJHS77eTzAO2iSXJlE+yva5Uwc8apG7UxDVa4Ycc1lPwMzB5GaHsGQ==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.2.6.tgz", + "integrity": "sha512-qe7hxntaezqjKdU9QS+Q9NFL6i/uNdBxdvOnCKgPhBAY/zY6yhk5t3sOvonynPK5nkaNAowfSNPIzNxAXlJ1sA==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/components": "8.1.10", - "@storybook/csf-plugin": "8.1.10", - "@storybook/csf-tools": "8.1.10", + "@storybook/blocks": "8.2.6", + "@storybook/csf-plugin": "8.2.6", "@storybook/global": "^5.0.0", - "@storybook/node-logger": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@storybook/react-dom-shim": "8.1.10", - "@storybook/theming": "8.1.10", - "@storybook/types": "8.1.10", + "@storybook/react-dom-shim": "8.2.6", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", "fs-extra": "^11.1.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", @@ -5297,6 +4904,9 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-docs/node_modules/fs-extra": { @@ -5326,35 +4936,34 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.1.10.tgz", - "integrity": "sha512-xgAXdl/MaKWmwqJJpw4z1YaD1V/r74VHHLqY3Z4YaU9DmlApkCa+FmZSS9QVAf7g6JNUcD1Dbtw5j62uNn+YyA==", - "dev": true, - "dependencies": { - "@storybook/addon-actions": "8.1.10", - "@storybook/addon-backgrounds": "8.1.10", - "@storybook/addon-controls": "8.1.10", - "@storybook/addon-docs": "8.1.10", - "@storybook/addon-highlight": "8.1.10", - "@storybook/addon-measure": "8.1.10", - "@storybook/addon-outline": "8.1.10", - "@storybook/addon-toolbars": "8.1.10", - "@storybook/addon-viewport": "8.1.10", - "@storybook/core-common": "8.1.10", - "@storybook/manager-api": "8.1.10", - "@storybook/node-logger": "8.1.10", - "@storybook/preview-api": "8.1.10", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.2.6.tgz", + "integrity": "sha512-diGjGZcZNov+RCAVQBTm8JKP2kUtMRuJIQFBeXdPWpu6hYBk6lw1FlAf2GywWGCvdny1pJT90hfoD33qUMNuDg==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "8.2.6", + "@storybook/addon-backgrounds": "8.2.6", + "@storybook/addon-controls": "8.2.6", + "@storybook/addon-docs": "8.2.6", + "@storybook/addon-highlight": "8.2.6", + "@storybook/addon-measure": "8.2.6", + "@storybook/addon-outline": "8.2.6", + "@storybook/addon-toolbars": "8.2.6", + "@storybook/addon-viewport": "8.2.6", "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-highlight": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.1.10.tgz", - "integrity": "sha512-s9QKGtU6WGB/+CggNWg940NIi+u0tcxpPxqg/ltg3EOHr8J0NAZur6mibs3Z4Q5CXkAuNdWrvopLu+/27i1rQQ==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.2.6.tgz", + "integrity": "sha512-03cV9USsfP3bS4wYV06DYcIaGPfoheQe53Q0Jr1B2yJUVyIPKvmO2nGjLBsqzeL3Wl7vSfLQn0/dUdxCcbqLsw==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5362,33 +4971,38 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-interactions": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.1.10.tgz", - "integrity": "sha512-GGU66TxYv6Bis10mmlgMhLOyai1am1amKVvX7ML8XYfsi6lA9zCnfQSVXulYLfjfzyIR6Ld8Kxe5awvjucPxSw==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.2.6.tgz", + "integrity": "sha512-YXpHf8jWPz9HJV+Fw4GaunaCWeE6uqF24aLXdAd8xuhN1UfWJeNV6AwAvFQ0hTLqvmz0yMhX/5JXDKeKESoYDA==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.1.10", - "@storybook/test": "8.1.10", - "@storybook/types": "8.1.10", + "@storybook/instrumenter": "8.2.6", + "@storybook/test": "8.2.6", "polished": "^4.2.2", "ts-dedent": "^2.2.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-links": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.1.10.tgz", - "integrity": "sha512-SxCuK7k7A0/qIPzV68u25qfye3Fb0PkC1izlRbt7u64wIUIxGzgfjM3dFRWK2VaJzCsEQWSmIdv7YHi7Wv5y3w==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.2.6.tgz", + "integrity": "sha512-CUuU3nk8wyZ3bljCmOG/OCKazan+bPuNbCph8N763zyzdEx5M/CbBxV9d3pi3zjYpix7txlqrl2/YdMCejfyFw==", "dev": true, "dependencies": { - "@storybook/csf": "^0.1.7", + "@storybook/csf": "0.1.11", "@storybook/global": "^5.0.0", "ts-dedent": "^2.0.0" }, @@ -5397,7 +5011,8 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.2.6" }, "peerDependenciesMeta": { "react": { @@ -5406,9 +5021,9 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.1.10.tgz", - "integrity": "sha512-akhdg3WBOBvDsolzSSvW4TIdZLMVlL9DS6rpZvhydXeX8pG0sjb+sON6VUL4h8Gs7qa8QumauXCr+Y4q1FhZhw==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.2.6.tgz", + "integrity": "sha512-neI8YeSOAtOmzasLxo6O8ZLr2ebMaD7XVF+kYatl5+SpyuwwvUGcP9NkKe5S+mB8V2zxFUIsXS74XrhmQhRoaQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5417,12 +5032,15 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-outline": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.1.10.tgz", - "integrity": "sha512-Edn5TWpV1DcumOjx0qG9bBKja6vz210ip7O47JbRDu7IDR8lguaM2X9xbmhXhBQq4fmqvobZmfRnrSeCtSYeyQ==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.2.6.tgz", + "integrity": "sha512-uAlPtqDWlq7MQQ4zJT80qdjbSdLF/zsvtPhidX6h9cjLKNPWAv79xJQ14AJHaMv+Hzy5xKnM4wdEhgPbzKabQg==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5431,22 +5049,28 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-toolbars": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.1.10.tgz", - "integrity": "sha512-5bRcCWrhaTX5Y91EWmHilPZ7kZaneaY414Gn5a6gsaNgaVPkSx9KD9j8M9DyXJ4yQNs265TiPWQqWrPB3Q2VgA==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.2.6.tgz", + "integrity": "sha512-0JmRirMpxHS6VZzBk0kY871xWTpkk3TN4S1sxoFf5fcnCfVTHDjEJ5Ws/QWru1RJlIZHuJKRdQIA6Vuq5X+KfQ==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/addon-viewport": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.1.10.tgz", - "integrity": "sha512-rJpyAwTVQa+6yqjdMDeqNKoW5aPoSzBAtMywtNMP5lHwF6NpJUvm67c/ox0//d5dPPPjlJDz2QC2COWqjviQyw==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.2.6.tgz", + "integrity": "sha512-IAxH9H8tVFzSmZhKf5E+EALiAdkp19RzGqP/rWluD8LH7oW5HumQE/4oN0ZhVMy1RxYsCKFYjWyAp7AuxeMRSw==", "dev": true, "dependencies": { "memoizerific": "^1.11.3" @@ -5454,36 +5078,29 @@ "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/blocks": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.1.10.tgz", - "integrity": "sha512-8ZGgLIUBdSafcyaKR5Zs0CFisFCPoxZBVt3GMUCZtN+G17YhEg4+OnZs5aMZknfnh28BUnZS2STjWTGStAE5Rw==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.2.6.tgz", + "integrity": "sha512-nMlZJjVTyfOJ6xwORptsNuS1AZZlDbJUVXc2R8uukGd5GIXxxCdrPk4NvUsjfQslMT9LhYuFld3z62FATsM2rw==", "dev": true, "dependencies": { - "@storybook/channels": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/components": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/csf": "^0.1.7", - "@storybook/docs-tools": "8.1.10", + "@storybook/csf": "0.1.11", "@storybook/global": "^5.0.0", "@storybook/icons": "^1.2.5", - "@storybook/manager-api": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@storybook/theming": "8.1.10", - "@storybook/types": "8.1.10", "@types/lodash": "^4.14.167", "color-convert": "^2.0.1", "dequal": "^2.0.2", "lodash": "^4.17.21", - "markdown-to-jsx": "7.3.2", + "markdown-to-jsx": "^7.4.5", "memoizerific": "^1.11.3", "polished": "^4.2.2", "react-colorful": "^5.1.2", "telejson": "^7.2.0", - "tocbot": "^4.20.1", "ts-dedent": "^2.0.0", "util-deprecate": "^1.0.2" }, @@ -5493,7 +5110,8 @@ }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.2.6" }, "peerDependenciesMeta": { "react": { @@ -5504,33 +5122,46 @@ } } }, - "node_modules/@storybook/builder-manager": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-8.1.10.tgz", - "integrity": "sha512-dhg54zpaglR9XKNAiwMqm5/IONMCEG/hO/iTfNHJI1rAGeWhvM71cmhF+VlKUcjpTlIfHe7J19+TL+sWQJNgtg==", + "node_modules/@storybook/builder-vite": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.2.6.tgz", + "integrity": "sha512-3PrsPZAedpQUbzRBEl23Fi1zG5bkQD76JsygVwmfiSm4Est4K8kW2AIB2ht9cIfKXh3mfQkyQlxXKHeQEHeQwQ==", "dev": true, "dependencies": { - "@fal-works/esbuild-plugin-global-externals": "^2.1.2", - "@storybook/core-common": "8.1.10", - "@storybook/manager": "8.1.10", - "@storybook/node-logger": "8.1.10", - "@types/ejs": "^3.1.1", - "@yarnpkg/esbuild-plugin-pnp": "^3.0.0-rc.10", + "@storybook/csf-plugin": "8.2.6", + "@types/find-cache-dir": "^3.2.1", "browser-assert": "^1.2.1", - "ejs": "^3.1.10", - "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0", - "esbuild-plugin-alias": "^0.2.1", - "express": "^4.17.3", + "es-module-lexer": "^1.5.0", + "express": "^4.19.2", + "find-cache-dir": "^3.0.0", "fs-extra": "^11.1.0", - "process": "^0.11.10", - "util": "^0.12.4" + "magic-string": "^0.30.0", + "ts-dedent": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "@preact/preset-vite": "*", + "storybook": "^8.2.6", + "typescript": ">= 4.3.x", + "vite": "^4.0.0 || ^5.0.0", + "vite-plugin-glimmerx": "*" + }, + "peerDependenciesMeta": { + "@preact/preset-vite": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vite-plugin-glimmerx": { + "optional": true + } } }, - "node_modules/@storybook/builder-manager/node_modules/fs-extra": { + "node_modules/@storybook/builder-vite/node_modules/fs-extra": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", @@ -5544,7 +5175,7 @@ "node": ">=14.14" } }, - "node_modules/@storybook/builder-manager/node_modules/jsonfile": { + "node_modules/@storybook/builder-vite/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", @@ -5556,79 +5187,7 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@storybook/builder-vite": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.1.10.tgz", - "integrity": "sha512-8A/i5OEyRVKkTROLgxXEEJRAS8gmdonr4xA15TqAvjOtdYjwP6JoQ4cjNOqH7fPPGPdx/t49Z/7E+v7Ovv6cAw==", - "dev": true, - "dependencies": { - "@storybook/channels": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/core-common": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/csf-plugin": "8.1.10", - "@storybook/node-logger": "8.1.10", - "@storybook/preview": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@storybook/types": "8.1.10", - "@types/find-cache-dir": "^3.2.1", - "browser-assert": "^1.2.1", - "es-module-lexer": "^1.5.0", - "express": "^4.17.3", - "find-cache-dir": "^3.0.0", - "fs-extra": "^11.1.0", - "magic-string": "^0.30.0", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "@preact/preset-vite": "*", - "typescript": ">= 4.3.x", - "vite": "^4.0.0 || ^5.0.0", - "vite-plugin-glimmerx": "*" - }, - "peerDependenciesMeta": { - "@preact/preset-vite": { - "optional": true - }, - "typescript": { - "optional": true - }, - "vite-plugin-glimmerx": { - "optional": true - } - } - }, - "node_modules/@storybook/builder-vite/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/builder-vite/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@storybook/channels": { + "node_modules/@storybook/channels": { "version": "8.1.10", "resolved": "https://registry.npmjs.org/@storybook/channels/-/channels-8.1.10.tgz", "integrity": "sha512-CxZE4XrQoe+F+S2mo8Z9HTvFZKfKHIIiwYfoXKCryVp2U/z7ZKrely2PbfxWsrQvF3H0+oegfYYhYRHRiM21Zw==", @@ -5645,202 +5204,6 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/cli": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/cli/-/cli-8.1.10.tgz", - "integrity": "sha512-7Fm2Qgk33sHayZ0QABqwe1Jto4yyVRVW6kTrSeP5IuLh+mn244RgxBvWtGCyL1EcWDFI7PYUFa0HxgTCq7C+OA==", - "dev": true, - "dependencies": { - "@babel/core": "^7.24.4", - "@babel/types": "^7.24.0", - "@ndelangen/get-tarball": "^3.0.7", - "@storybook/codemod": "8.1.10", - "@storybook/core-common": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/core-server": "8.1.10", - "@storybook/csf-tools": "8.1.10", - "@storybook/node-logger": "8.1.10", - "@storybook/telemetry": "8.1.10", - "@storybook/types": "8.1.10", - "@types/semver": "^7.3.4", - "@yarnpkg/fslib": "2.10.3", - "@yarnpkg/libzip": "2.3.0", - "chalk": "^4.1.0", - "commander": "^6.2.1", - "cross-spawn": "^7.0.3", - "detect-indent": "^6.1.0", - "envinfo": "^7.7.3", - "execa": "^5.0.0", - "find-up": "^5.0.0", - "fs-extra": "^11.1.0", - "get-npm-tarball-url": "^2.0.3", - "giget": "^1.0.0", - "globby": "^14.0.1", - "jscodeshift": "^0.15.1", - "leven": "^3.1.0", - "ora": "^5.4.1", - "prettier": "^3.1.1", - "prompts": "^2.4.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", - "strip-json-comments": "^3.0.1", - "tempy": "^3.1.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0" - }, - "bin": { - "getstorybook": "bin/index.js", - "sb": "bin/index.js" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/cli/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, - "node_modules/@storybook/cli/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/@storybook/cli/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/cli/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/cli/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/cli/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@storybook/cli/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/cli/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@storybook/cli/node_modules/path-type": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/cli/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", - "dev": true, - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/cli/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/@storybook/client-logger": { "version": "8.1.10", "resolved": "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-8.1.10.tgz", @@ -5855,18 +5218,16 @@ } }, "node_modules/@storybook/codemod": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.1.10.tgz", - "integrity": "sha512-HZ/vrseP/sHfbO2RZpImP5eeqOakJ0X31BIiD4uxDBIKGltMXhlPKHTI93O2YGR+vbB33otoTVRjE+ZpPmC6SA==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.2.6.tgz", + "integrity": "sha512-+mFJ6R+JhJLpU7VPDlXU5Yn6nqIBq745GaEosnIiFOdNo3jaxJ58wq/sGhbQvoCHPUxMA+sDQvR7pS62YFoLRQ==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", "@babel/preset-env": "^7.24.4", "@babel/types": "^7.24.0", - "@storybook/csf": "^0.1.7", - "@storybook/csf-tools": "8.1.10", - "@storybook/node-logger": "8.1.10", - "@storybook/types": "8.1.10", + "@storybook/core": "8.2.6", + "@storybook/csf": "0.1.11", "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", "globby": "^14.0.1", @@ -5882,9 +5243,9 @@ } }, "node_modules/@storybook/codemod/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, "dependencies": { "@sindresorhus/merge-streams": "^2.1.0", @@ -5926,29 +5287,39 @@ } }, "node_modules/@storybook/components": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.1.10.tgz", - "integrity": "sha512-fL2odC3Ct3NiFJEiGLmMNB3Tw3CdUDA/+va3Ka/JEhjaRhbsND2JgriHYmED8SnX9CCqwXoxl5QA8qwl+Oyolw==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.2.6.tgz", + "integrity": "sha512-H8ckH1AnLkHtMtvJ3J8LxnmDtHxkJ7NJacGctHMRrsBIvdKTVwlT4su5nAVVJlan/PrEou+jESfw+OjjBYE5PA==", "dev": true, - "dependencies": { - "@radix-ui/react-dialog": "^1.0.5", - "@radix-ui/react-slot": "^1.0.2", - "@storybook/client-logger": "8.1.10", - "@storybook/csf": "^0.1.7", - "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.2.5", - "@storybook/theming": "8.1.10", - "@storybook/types": "8.1.10", - "memoizerific": "^1.11.3", - "util-deprecate": "^1.0.2" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" + "storybook": "^8.2.6" + } + }, + "node_modules/@storybook/core": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.2.6.tgz", + "integrity": "sha512-XY71g3AcpD6IiER9k9Lt+vlUMYfPIYgWekd7e0Ggzz2gJkPuLunKEdQccLGDSHf5OFAobHhrTJc7ZsvWhmDMag==", + "dev": true, + "dependencies": { + "@storybook/csf": "0.1.11", + "@types/express": "^4.17.21", + "@types/node": "^18.0.0", + "browser-assert": "^1.2.1", + "esbuild": "^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0", + "esbuild-register": "^3.5.0", + "express": "^4.19.2", + "process": "^0.11.10", + "recast": "^0.23.5", + "util": "^0.12.4", + "ws": "^8.2.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" } }, "node_modules/@storybook/core-common": { @@ -6063,217 +5434,55 @@ "path-scurry": "^1.11.1" }, "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/@storybook/core-common/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/@storybook/core-common/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@storybook/core-common/node_modules/jackspeak": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", - "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", - "dev": true, - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/@storybook/core-common/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/@storybook/core-common/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/@storybook/core-common/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/@storybook/core-common/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@storybook/core-events": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.1.10.tgz", - "integrity": "sha512-aS4zsBVyJds74+rAW0IfTEjULDCQwXecVpQfv11B8/89/07s3bOPssGGoTtCTaN4pHbduywE6MxbmFvTmXOFCA==", - "dev": true, - "dependencies": { - "@storybook/csf": "^0.1.7", - "ts-dedent": "^2.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/core-server/-/core-server-8.1.10.tgz", - "integrity": "sha512-jNL5/daNyo7Rcu+y/bOmSB1P65pmcaLwvpr31EUEIISaAqvgruaneS3GKHg2TR0wcxEoHaM4abqhW6iwkI/XYQ==", - "dev": true, - "dependencies": { - "@aw-web-design/x-default-browser": "1.4.126", - "@babel/core": "^7.24.4", - "@babel/parser": "^7.24.4", - "@discoveryjs/json-ext": "^0.5.3", - "@storybook/builder-manager": "8.1.10", - "@storybook/channels": "8.1.10", - "@storybook/core-common": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/csf": "^0.1.7", - "@storybook/csf-tools": "8.1.10", - "@storybook/docs-mdx": "3.1.0-next.0", - "@storybook/global": "^5.0.0", - "@storybook/manager": "8.1.10", - "@storybook/manager-api": "8.1.10", - "@storybook/node-logger": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@storybook/telemetry": "8.1.10", - "@storybook/types": "8.1.10", - "@types/detect-port": "^1.3.0", - "@types/diff": "^5.0.9", - "@types/node": "^18.0.0", - "@types/pretty-hrtime": "^1.0.0", - "@types/semver": "^7.3.4", - "better-opn": "^3.0.2", - "chalk": "^4.1.0", - "cli-table3": "^0.6.1", - "compression": "^1.7.4", - "detect-port": "^1.3.0", - "diff": "^5.2.0", - "express": "^4.17.3", - "fs-extra": "^11.1.0", - "globby": "^14.0.1", - "lodash": "^4.17.21", - "open": "^8.4.0", - "pretty-hrtime": "^1.0.3", - "prompts": "^2.4.0", - "read-pkg-up": "^7.0.1", - "semver": "^7.3.7", - "telejson": "^7.2.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0", - "util": "^0.12.4", - "util-deprecate": "^1.0.2", - "watchpack": "^2.2.0", - "ws": "^8.2.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/core-server/node_modules/@types/node": { - "version": "18.19.39", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", - "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", - "dev": true, - "dependencies": { - "undici-types": "~5.26.4" + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/@storybook/core-server/node_modules/diff": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz", - "integrity": "sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==", + "node_modules/@storybook/core-common/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": ">=10.17.0" } }, - "node_modules/@storybook/core-server/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "node_modules/@storybook/core-common/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, "engines": { - "node": ">=14.14" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/core-server/node_modules/globby": { - "version": "14.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", - "integrity": "sha512-jOMLD2Z7MAhyG8aJpNOpmziMOP4rPLcc95oQPKXBazW82z+CEgPFBQvEpRUa1KeIMUJo4Wsm+q6uzO/Q/4BksQ==", + "node_modules/@storybook/core-common/node_modules/jackspeak": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dev": true, "dependencies": { - "@sindresorhus/merge-streams": "^2.1.0", - "fast-glob": "^3.3.2", - "ignore": "^5.2.4", - "path-type": "^5.0.0", - "slash": "^5.1.0", - "unicorn-magic": "^0.1.0" + "@isaacs/cliui": "^8.0.2" }, "engines": { - "node": ">=18" + "node": ">=14" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" } }, - "node_modules/@storybook/core-server/node_modules/jsonfile": { + "node_modules/@storybook/core-common/node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", @@ -6285,51 +5494,79 @@ "graceful-fs": "^4.1.6" } }, - "node_modules/@storybook/core-server/node_modules/path-type": { + "node_modules/@storybook/core-common/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@storybook/core-common/node_modules/resolve-from": { "version": "5.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", - "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=8" } }, - "node_modules/@storybook/core-server/node_modules/slash": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", - "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "node_modules/@storybook/core-common/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "engines": { - "node": ">=14.16" + "node": ">=6" + } + }, + "node_modules/@storybook/core-events": { + "version": "8.1.10", + "resolved": "https://registry.npmjs.org/@storybook/core-events/-/core-events-8.1.10.tgz", + "integrity": "sha512-aS4zsBVyJds74+rAW0IfTEjULDCQwXecVpQfv11B8/89/07s3bOPssGGoTtCTaN4pHbduywE6MxbmFvTmXOFCA==", + "dev": true, + "dependencies": { + "@storybook/csf": "^0.1.7", + "ts-dedent": "^2.0.0" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/@storybook/core/node_modules/@types/node": { + "version": "18.19.42", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", + "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" } }, "node_modules/@storybook/csf": { - "version": "0.1.9", - "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.9.tgz", - "integrity": "sha512-JlZ6v/iFn+iKohKGpYXnMeNeTiiAMeFoDhYnPLIC8GnyyIWqEI9wJYrOK9i9rxlJ8NZAH/ojGC/u/xVC41qSgQ==", + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/@storybook/csf/-/csf-0.1.11.tgz", + "integrity": "sha512-dHYFQH3mA+EtnCkHXzicbLgsvzYjcDJ1JWsogbItZogkPHgSJM/Wr71uMkcvw8v9mmCyP4NpXJuu6bPoVsOnzg==", "dev": true, "dependencies": { "type-fest": "^2.19.0" } }, "node_modules/@storybook/csf-plugin": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.1.10.tgz", - "integrity": "sha512-EwW9Olw85nKamUH/2YrkD+bxDvDP4TJ2MqS1qR3UU+lBP/HMQA2zFAgiW1TUmmdHmhAeiDOXbDhijxMa30sppQ==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.2.6.tgz", + "integrity": "sha512-USn7E/bMQYVqvFBuW6d9rKoSuCImjk0BAmc/0wIOuMQ/yQNp2Xze0m8eVkNHUIUDokyx0TXDjRjwq10Xxk16ag==", "dev": true, "dependencies": { - "@storybook/csf-tools": "8.1.10", "unplugin": "^1.3.1" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/csf-tools": { @@ -6391,32 +5628,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@storybook/docs-mdx": { - "version": "3.1.0-next.0", - "resolved": "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-3.1.0-next.0.tgz", - "integrity": "sha512-t4syFIeSyufieNovZbLruPt2DmRKpbwL4fERCZ1MifWDRIORCKLc4NCEHy+IqvIqd71/SJV2k4B51nF7vlJfmQ==", - "dev": true - }, - "node_modules/@storybook/docs-tools": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-8.1.10.tgz", - "integrity": "sha512-FsO/+L9CrUfAIbm9cdH9UpjTusT7L5RZxN4WCXkiF5SpAVyBoY8kar3RzTZVoh4aQxt1yGWYC+SZGjgf++xa4g==", - "dev": true, - "dependencies": { - "@storybook/core-common": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@storybook/types": "8.1.10", - "@types/doctrine": "^0.0.3", - "assert": "^2.1.0", - "doctrine": "^3.0.0", - "lodash": "^4.17.21" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, "node_modules/@storybook/global": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz", @@ -6437,59 +5648,34 @@ } }, "node_modules/@storybook/instrumenter": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.1.10.tgz", - "integrity": "sha512-/TZ3JpTCorbhThCfaR5k4Vs0Svp6xz6t+FVaim/v7N9VErEfmtn+d76CqYLfvmo68DzkEzvArOFBdh2MXtscsw==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.2.6.tgz", + "integrity": "sha512-RxtpcMTUSq8/wPM6cR6EXVrPEiNuRbC71cIFVFZagOFYvnnOKwSPV+GOLPK0wxMbGB4c5/+Xe8ADefmZTvxOsA==", "dev": true, "dependencies": { - "@storybook/channels": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/core-events": "8.1.10", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "8.1.10", "@vitest/utils": "^1.3.1", "util": "^0.12.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/manager": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/manager/-/manager-8.1.10.tgz", - "integrity": "sha512-dQmRBfT4CABIPhv0kL25qKcQk2SiU5mIZ1DuVzckIbZW+iYEOAusyJ/0HExM9leCrymaW3BgZGlHbIXL7EvZtw==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/manager-api": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.1.10.tgz", - "integrity": "sha512-9aZ+zoNrTo1BJskVmCKE/yqlBXmWaKVZh1W/+/xu3WL9wdm/tBlozRvQwegIZlRVvUOxtjOg28Vd2hySYL58zg==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.2.6.tgz", + "integrity": "sha512-uv36h/b5RhlajWtEg4cVPBYV8gZs6juux0nIE+6G9i7vt8Ild6gM9tW1KNabgZcaHFiyWJYCNWxJZoKjgUmXDg==", "dev": true, - "dependencies": { - "@storybook/channels": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/csf": "^0.1.7", - "@storybook/global": "^5.0.0", - "@storybook/icons": "^1.2.5", - "@storybook/router": "8.1.10", - "@storybook/theming": "8.1.10", - "@storybook/types": "8.1.10", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "store2": "^2.14.2", - "telejson": "^7.2.0", - "ts-dedent": "^2.0.0" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/node-logger": { @@ -6502,46 +5688,23 @@ "url": "https://opencollective.com/storybook" } }, - "node_modules/@storybook/preview": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/preview/-/preview-8.1.10.tgz", - "integrity": "sha512-Ch7SJQ8/vm4o7ZPwPeL3nGOCKx1Aul7VcvOVkDs+K2lZusJjUROHVTBYlbs71DTTmCo2gS7WhSq+HOpD59BPDg==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, "node_modules/@storybook/preview-api": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.1.10.tgz", - "integrity": "sha512-0Gl8WHDtp/srrA5uBYXl7YbC8kFQA7IxVmwWN7dIS7HAXu63JZ6JfxaFcfy+kCBfZSBD7spFG4J0f5JXRDYbpg==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.2.6.tgz", + "integrity": "sha512-5vTj2ndX5ng4nDntZYe+r8UwLjCIGFymhq5/r2adAvRKL+Bo4zQDWGO7bhvGJk16do2THb2JvPz49ComW9LLZw==", "dev": true, - "dependencies": { - "@storybook/channels": "8.1.10", - "@storybook/client-logger": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/csf": "^0.1.7", - "@storybook/global": "^5.0.0", - "@storybook/types": "8.1.10", - "@types/qs": "^6.9.5", - "dequal": "^2.0.2", - "lodash": "^4.17.21", - "memoizerific": "^1.11.3", - "qs": "^6.10.0", - "tiny-invariant": "^1.3.1", - "ts-dedent": "^2.0.0", - "util-deprecate": "^1.0.2" - }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.1.10.tgz", - "integrity": "sha512-+HS75Pq8jb3xkVq0hK33D84aGfbJCURRB+GN2vfTMmmjguQt7z2+MnGqRgrUCt6h2rxU3VdPg9OBnYi/UC0Zrg==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.2.6.tgz", + "integrity": "sha512-B+x8UAEQPDp1yhN3tMh09NvSL38QNfJB7PAyLgKrfE7xIAzvewq+RLW2DfGkoZCy+Zr7QSHm1p7NOgud8+sQCg==", "dev": true, "funding": { "type": "opencollective", @@ -6549,90 +5712,31 @@ }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" - } - }, - "node_modules/@storybook/router": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/router/-/router-8.1.10.tgz", - "integrity": "sha512-JDEgZ0vVDx0GLz+dKD+R1xqWwjqsCdA2F+s3/si7upHqkFRWU5ocextZ63oKsRnCoaeUh6OavAU4EdkrKiQtQw==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "8.1.10", - "memoizerific": "^1.11.3", - "qs": "^6.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/telemetry": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-8.1.10.tgz", - "integrity": "sha512-pwiMWrq85D0AnaAgYNfB2w2BDgqnetQ+tXwsUAw4fUEFwA4oPU6r0uqekRbNNE6wmSSYjiiFP3JgknBFqjd2hg==", - "dev": true, - "dependencies": { - "@storybook/client-logger": "8.1.10", - "@storybook/core-common": "8.1.10", - "@storybook/csf-tools": "8.1.10", - "chalk": "^4.1.0", - "detect-package-manager": "^2.0.1", - "fetch-retry": "^5.0.2", - "fs-extra": "^11.1.0", - "read-pkg-up": "^7.0.1" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - } - }, - "node_modules/@storybook/telemetry/node_modules/fs-extra": { - "version": "11.2.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", - "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, - "node_modules/@storybook/telemetry/node_modules/jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", - "dev": true, - "dependencies": { - "universalify": "^2.0.0" - }, - "optionalDependencies": { - "graceful-fs": "^4.1.6" + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", + "storybook": "^8.2.6" } }, "node_modules/@storybook/test": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.1.10.tgz", - "integrity": "sha512-uskw/xb/GkGLRTEKPao/5xUKxjP1X3DnDpE52xDF46ZmTvM+gPQbkex97qdG6Mfv37/0lhVhufAsV3g5+CrYKQ==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.2.6.tgz", + "integrity": "sha512-nTzNxReBcMRlX1+8PNU/MuA9ArFbeQhfZXMBIwJJoHOhnNe1knYpyn1++xINxAHKOh0BBhQ0NIMoKdcGmW3V6w==", "dev": true, "dependencies": { - "@storybook/client-logger": "8.1.10", - "@storybook/core-events": "8.1.10", - "@storybook/instrumenter": "8.1.10", - "@storybook/preview-api": "8.1.10", - "@testing-library/dom": "^9.3.4", - "@testing-library/jest-dom": "^6.4.2", - "@testing-library/user-event": "^14.5.2", - "@vitest/expect": "1.3.1", - "@vitest/spy": "^1.3.1", + "@storybook/csf": "0.1.11", + "@storybook/instrumenter": "8.2.6", + "@testing-library/dom": "10.1.0", + "@testing-library/jest-dom": "6.4.5", + "@testing-library/user-event": "14.5.2", + "@vitest/expect": "1.6.0", + "@vitest/spy": "1.6.0", "util": "^0.12.4" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/test-runner": { @@ -6672,13 +5776,13 @@ } }, "node_modules/@storybook/test/node_modules/@vitest/expect": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz", - "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.6.0.tgz", + "integrity": "sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==", "dev": true, "dependencies": { - "@vitest/spy": "1.3.1", - "@vitest/utils": "1.3.1", + "@vitest/spy": "1.6.0", + "@vitest/utils": "1.6.0", "chai": "^4.3.10" }, "funding": { @@ -6686,9 +5790,9 @@ } }, "node_modules/@storybook/test/node_modules/@vitest/spy": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz", - "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.6.0.tgz", + "integrity": "sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -6698,9 +5802,9 @@ } }, "node_modules/@storybook/test/node_modules/@vitest/utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz", - "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.6.0.tgz", + "integrity": "sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -6722,31 +5826,16 @@ } }, "node_modules/@storybook/theming": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.1.10.tgz", - "integrity": "sha512-W7mth4hwdTqWLneqYCyUnIEiDg4vSokoad8HEodPz6JC9XUPUX3Yi2W4W3xFvqrW4Z5RXfuJ53iG2HN+0AgaQw==", - "dev": true, - "dependencies": { - "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", - "@storybook/client-logger": "8.1.10", - "@storybook/global": "^5.0.0", - "memoizerific": "^1.11.3" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta" - }, - "peerDependenciesMeta": { - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.2.6.tgz", + "integrity": "sha512-ICnYuLIVsYifVCMQljdHgrp+5vAquNybHxDGWiPeOxBicotwHF8rLhTckD2CdVQbMp0jk6r6jetvjXbFJ2MbvQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + }, + "peerDependencies": { + "storybook": "^8.2.6" } }, "node_modules/@storybook/types": { @@ -6765,15 +5854,16 @@ } }, "node_modules/@storybook/vue3": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/vue3/-/vue3-8.1.10.tgz", - "integrity": "sha512-mNalklegjc+EA1nTPJtvk0dQrrB4crnuF4+bxuUTYfHBZeEFjfISu4kbWYnV+B5Q4S2svH16nfwbf4FPvDV7uw==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/vue3/-/vue3-8.2.6.tgz", + "integrity": "sha512-j4gMuWc1ZDzqWSdf79YswcZmcbhmbByq/6upqxwqXtjv1mHAiBnEs8bbnnylDrzg4GOvBC8w+FjArkzlFA7uXg==", "dev": true, "dependencies": { - "@storybook/docs-tools": "8.1.10", + "@storybook/components": "^8.2.6", "@storybook/global": "^5.0.0", - "@storybook/preview-api": "8.1.10", - "@storybook/types": "8.1.10", + "@storybook/manager-api": "^8.2.6", + "@storybook/preview-api": "^8.2.6", + "@storybook/theming": "^8.2.6", "@vue/compiler-core": "^3.0.0", "lodash": "^4.17.21", "ts-dedent": "^2.0.0", @@ -6788,19 +5878,18 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { + "storybook": "^8.2.6", "vue": "^3.0.0" } }, "node_modules/@storybook/vue3-vite": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/@storybook/vue3-vite/-/vue3-vite-8.1.10.tgz", - "integrity": "sha512-opvgAYCak9aLKX1FgnW5JyjMrwXEaoheSZa1KgQ5kGssYgVqgDFHOpJ6CLk358Ph4YexO7bl80W5B/WnM6ZS6g==", + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/@storybook/vue3-vite/-/vue3-vite-8.2.6.tgz", + "integrity": "sha512-dkRe8GrGlNAHVDGo57VV2Aewfc3kOt4W/PN7vMPaCbIPLplkSVHUK/iQAcsI3tAoWjPYGomfgOwPMQfMzgXQAg==", "dev": true, "dependencies": { - "@storybook/builder-vite": "8.1.10", - "@storybook/core-server": "8.1.10", - "@storybook/types": "8.1.10", - "@storybook/vue3": "8.1.10", + "@storybook/builder-vite": "8.2.6", + "@storybook/vue3": "8.2.6", "find-package-json": "^1.2.0", "magic-string": "^0.30.0", "typescript": "^5.0.0", @@ -6815,6 +5904,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { + "storybook": "^8.2.6", "vite": "^4.0.0 || ^5.0.0" } }, @@ -7073,22 +6163,22 @@ } }, "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.1.0.tgz", + "integrity": "sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==", "dev": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", + "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@testing-library/dom/node_modules/ansi-styles": { @@ -7124,12 +6214,12 @@ "dev": true }, "node_modules/@testing-library/jest-dom": { - "version": "6.4.6", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.6.tgz", - "integrity": "sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==", + "version": "6.4.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.5.tgz", + "integrity": "sha512-AguB9yvTXmCnySBP1lWjfNNUwpbElsaQ567lt2VdGqAdHtpieLgjmcVyv1q7PMIvLbgpDdkWV5Ydv3FEejyp2A==", "dev": true, "dependencies": { - "@adobe/css-tools": "^4.4.0", + "@adobe/css-tools": "^4.3.2", "@babel/runtime": "^7.9.2", "aria-query": "^5.0.0", "chalk": "^3.0.0", @@ -7340,24 +6430,6 @@ "@types/ms": "*" } }, - "node_modules/@types/detect-port": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/detect-port/-/detect-port-1.3.5.tgz", - "integrity": "sha512-Rf3/lB9WkDfIL9eEKaSYKc+1L/rNVYBjThk22JTqQw0YozXarX8YljFAz+HCoC6h4B4KwCMsBPZHaFezwT4BNA==", - "dev": true - }, - "node_modules/@types/diff": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/@types/diff/-/diff-5.2.1.tgz", - "integrity": "sha512-uxpcuwWJGhe2AR1g8hD9F5OYGCqjqWnBUQFD8gMZsDbv8oPHzxJF6iMO6n8Tk0AdzlxoaaoQhOYlIg/PukVU8g==", - "dev": true - }, - "node_modules/@types/doctrine": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/@types/doctrine/-/doctrine-0.0.3.tgz", - "integrity": "sha512-w5jZ0ee+HaPOaX25X2/2oGR/7rgAQSYII7X7pp0m9KgBfMP7uKfMfTvcpl5Dj+eDBbpxKGiqE+flqDr6XTd2RA==", - "dev": true - }, "node_modules/@types/doublearray": { "version": "0.0.32", "resolved": "https://registry.npmjs.org/@types/doublearray/-/doublearray-0.0.32.tgz", @@ -7369,12 +6441,6 @@ "resolved": "https://registry.npmjs.org/@types/earcut/-/earcut-2.1.4.tgz", "integrity": "sha512-qp3m9PPz4gULB9MhjGID7wpo3gJ4bTGXm7ltNDsmOvsPduTeHp8wSW9YckBj3mljeOh4F0m2z/0JKAALRKbmLQ==" }, - "node_modules/@types/ejs": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.5.tgz", - "integrity": "sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==", - "dev": true - }, "node_modules/@types/emscripten": { "version": "1.39.13", "resolved": "https://registry.npmjs.org/@types/emscripten/-/emscripten-1.39.13.tgz", @@ -7545,9 +6611,9 @@ "dev": true }, "node_modules/@types/lodash": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.5.tgz", - "integrity": "sha512-MBIOHVZqVqgfro1euRDWX7OO0fBVUUMrN6Pwm8LQsz8cWhEpihlvR70ENj3f40j58TNxZaWv2ndSkInykNBBJw==", + "version": "4.17.7", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.7.tgz", + "integrity": "sha512-8wTvZawATi/lsmNu10/j2hk1KEP0IvjubqPE3cu1Xz7xfXXt5oCq3SNUz4fMIP4XGF9Ky+Ue2tBA3hcS7LSBlA==", "dev": true }, "node_modules/@types/markdown-it": { @@ -7609,12 +6675,6 @@ "undici-types": "~5.26.4" } }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", - "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true - }, "node_modules/@types/plist": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/@types/plist/-/plist-3.0.5.tgz", @@ -7625,12 +6685,6 @@ "xmlbuilder": ">=11.0.1" } }, - "node_modules/@types/pretty-hrtime": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@types/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", - "integrity": "sha512-nj39q0wAIdhwn7DGUyT9irmsKK1tV0bd5WFEhgpqNTMFZ8cE+jieuTphCW0tfdm47S2zVT5mr09B28b1chmQMA==", - "dev": true - }, "node_modules/@types/prop-types": { "version": "15.7.12", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", @@ -8312,21 +7366,6 @@ "node": ">=10.0.0" } }, - "node_modules/@yarnpkg/esbuild-plugin-pnp": { - "version": "3.0.0-rc.15", - "resolved": "https://registry.npmjs.org/@yarnpkg/esbuild-plugin-pnp/-/esbuild-plugin-pnp-3.0.0-rc.15.tgz", - "integrity": "sha512-kYzDJO5CA9sy+on/s2aIW0411AklfCi8Ck/4QDivOqsMKpStZA2SsR+X27VTggGwpStWaLrjJcDcdDMowtG8MA==", - "dev": true, - "dependencies": { - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.15.0" - }, - "peerDependencies": { - "esbuild": ">=0.10.0" - } - }, "node_modules/@yarnpkg/fslib": { "version": "2.10.3", "resolved": "https://registry.npmjs.org/@yarnpkg/fslib/-/fslib-2.10.3.tgz", @@ -8394,9 +7433,9 @@ } }, "node_modules/acorn": { - "version": "8.11.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", - "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -8423,15 +7462,6 @@ "node": ">=0.4.0" } }, - "node_modules/address": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", - "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", - "dev": true, - "engines": { - "node": ">= 10.0.0" - } - }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -8767,25 +7797,13 @@ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/aria-hidden": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", - "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -9278,27 +8296,6 @@ } ] }, - "node_modules/better-opn": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/better-opn/-/better-opn-3.0.2.tgz", - "integrity": "sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==", - "dev": true, - "dependencies": { - "open": "^8.0.4" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/big-integer": { - "version": "1.6.52", - "resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", - "integrity": "sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==", - "dev": true, - "engines": { - "node": ">=0.6" - } - }, "node_modules/binary-extensions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", @@ -9455,18 +8452,6 @@ "dev": true, "optional": true }, - "node_modules/bplist-parser": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz", - "integrity": "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==", - "dev": true, - "dependencies": { - "big-integer": "^1.6.44" - }, - "engines": { - "node": ">= 5.10.0" - } - }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -9757,15 +8742,6 @@ "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==", "dev": true }, - "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -10111,21 +9087,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, "node_modules/cli-truncate": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", @@ -10306,57 +9267,6 @@ "node": ">= 10" } }, - "node_modules/compressible": { - "version": "2.0.18", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", - "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, - "dependencies": { - "mime-db": ">= 1.43.0 < 2" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, - "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", - "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", - "vary": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/compression/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "dependencies": { - "ms": "2.0.0" - } - }, - "node_modules/compression/node_modules/ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, "node_modules/computeds": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/computeds/-/computeds-0.0.1.tgz", @@ -11003,38 +9913,6 @@ "node": ">=6" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -11059,22 +9937,6 @@ "node": ">=0.10.0" } }, - "node_modules/default-browser-id": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz", - "integrity": "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==", - "dev": true, - "dependencies": { - "bplist-parser": "^0.2.0", - "untildify": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/default-require-extensions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", @@ -11136,15 +9998,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/define-lazy-prop": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", @@ -11174,172 +10027,72 @@ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/des.js": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", - "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", - "dev": true, - "dependencies": { - "inherits": "^2.0.1", - "minimalistic-assert": "^1.0.0" - } - }, - "node_modules/destroy": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, - "engines": { - "node": ">= 0.8", - "npm": "1.2.8000 || >= 1.4.16" - } - }, - "node_modules/detect-indent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", - "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/detect-node": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true, - "optional": true - }, - "node_modules/detect-node-es": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", - "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==", - "dev": true - }, - "node_modules/detect-package-manager": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/detect-package-manager/-/detect-package-manager-2.0.1.tgz", - "integrity": "sha512-j/lJHyoLlWi6G1LDdLgvUtz60Zo5GEj+sVYtTVXnYLDPuzgC3llMxonXym9zIwhhUII8vjdw0LXxavpLqTbl1A==", - "dev": true, - "dependencies": { - "execa": "^5.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/detect-package-manager/node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" + "node": ">=0.4.0" } }, - "node_modules/detect-package-manager/node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8" } }, - "node_modules/detect-package-manager/node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=6" } }, - "node_modules/detect-package-manager/node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "node_modules/des.js": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.1.0.tgz", + "integrity": "sha512-r17GxjhUCjSRy8aiJpr8/UadFIzMzJGexI3Nmz4ADi9LYSFx4gTBp80+NaX/YsXWWLhpZ7v/v/ubEc/bCNfKwg==", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/detect-package-manager/node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", "dev": true, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/detect-port": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/detect-port/-/detect-port-1.6.1.tgz", - "integrity": "sha512-CmnVc+Hek2egPx1PeTFVta2W78xy2K/9Rkf6cC4T59S50tVnzKj+tnx5mmx5lwvCkujZ4uRrpRSuV+IVs3f90Q==", + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, - "dependencies": { - "address": "^1.0.1", - "debug": "4" - }, - "bin": { - "detect": "bin/detect-port.js", - "detect-port": "bin/detect-port.js" - }, "engines": { - "node": ">= 4.0.0" + "node": ">=8" } }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true, + "optional": true + }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", @@ -11583,54 +10336,6 @@ "integrity": "sha512-aw55FtZzT6AmiamEj2kvmR6BuFqvYgKZUkfQ7teqVRNqD5UE0rw8IeW/3gieHNKQ5sPuDKlljWEn4bzv5+1bHw==", "dev": true }, - "node_modules/duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - } - }, - "node_modules/duplexify/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/duplexify/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/duplexify/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/duplexify/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/earcut": { "version": "2.2.4", "resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.4.tgz", @@ -12070,26 +10775,6 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/es-module-lexer": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", @@ -12192,12 +10877,6 @@ "@esbuild/win32-x64": "0.20.2" } }, - "node_modules/esbuild-plugin-alias": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/esbuild-plugin-alias/-/esbuild-plugin-alias-0.2.1.tgz", - "integrity": "sha512-jyfL/pwPqaFXyKnj8lP8iLk6Z0m099uXR45aSN8Av1XD4vhvQutxxPzgA2bTcAwQpa1zCXDcWOlhFgyP3GKqhQ==", - "dev": true - }, "node_modules/esbuild-register": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/esbuild-register/-/esbuild-register-3.5.0.tgz", @@ -13234,6 +11913,15 @@ "bser": "2.1.1" } }, + "node_modules/fd-package-json": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/fd-package-json/-/fd-package-json-1.2.0.tgz", + "integrity": "sha512-45LSPmWf+gC5tdCQMNH4s9Sr00bIkiD9aN7dc5hqkrEw1geRYyDQS1v1oMHAW3ysfxfndqGsrDREHHjNNbKUfA==", + "dev": true, + "dependencies": { + "walk-up-path": "^3.0.1" + } + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -13243,12 +11931,6 @@ "pend": "~1.2.0" } }, - "node_modules/fetch-retry": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.6.tgz", - "integrity": "sha512-3yurQZ2hD9VISAhJJP9bpYFNQrHHBXE2JxxjY5aLEcDi46RmAzJE2OC9FAde0yis5ElW0jTTzs0zfg/Cca4XqQ==", - "dev": true - }, "node_modules/figures": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", @@ -13568,9 +12250,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.238.2", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.238.2.tgz", - "integrity": "sha512-fs7FSnzzKF6oSzjk14JlBHt82DPchYHVsXtPi4Fkn+qrunVjWaBZY7nSO/mC9X4l9+wRah/R69DRd5NGDOrWqw==", + "version": "0.241.0", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.241.0.tgz", + "integrity": "sha512-82yKXpz7iWknWFsognZUf5a6mBQLnVrYoYSU9Nbu7FTOpKlu3v9ehpiI9mYXuaIO3J0ojX1b83M/InXvld9HUw==", "dev": true, "engines": { "node": ">=0.4.0" @@ -13689,7 +12371,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true + "dev": true, + "peer": true }, "node_modules/fs-exists-sync": { "version": "0.1.0", @@ -13849,24 +12532,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-nonce": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", - "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/get-npm-tarball-url": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/get-npm-tarball-url/-/get-npm-tarball-url-2.1.0.tgz", - "integrity": "sha512-ro+DiMu5DXgRBabqXupW38h7WPZ9+Ad8UjwhvsmmN8w1sU7ab0nzAXvVZ4kqYg57OrqomRtJvepX5/xvFKNtjA==", - "dev": true, - "engines": { - "node": ">=12.17" - } - }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -13984,12 +12649,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, "node_modules/glob/node_modules/minimatch": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", @@ -14164,38 +12823,6 @@ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, - "node_modules/gunzip-maybe": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/gunzip-maybe/-/gunzip-maybe-1.4.2.tgz", - "integrity": "sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==", - "dev": true, - "dependencies": { - "browserify-zlib": "^0.1.4", - "is-deflate": "^1.0.0", - "is-gzip": "^1.0.0", - "peek-stream": "^1.1.0", - "pumpify": "^1.3.3", - "through2": "^2.0.3" - }, - "bin": { - "gunzip-maybe": "bin.js" - } - }, - "node_modules/gunzip-maybe/node_modules/browserify-zlib": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.1.4.tgz", - "integrity": "sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==", - "dev": true, - "dependencies": { - "pako": "~0.2.0" - } - }, - "node_modules/gunzip-maybe/node_modules/pako": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz", - "integrity": "sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==", - "dev": true - }, "node_modules/handlebars": { "version": "4.7.8", "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", @@ -14837,15 +13464,6 @@ "node": ">= 0.4" } }, - "node_modules/invariant": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", - "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", - "dev": true, - "dependencies": { - "loose-envify": "^1.0.0" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -15011,27 +13629,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-deflate": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-deflate/-/is-deflate-1.0.0.tgz", - "integrity": "sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==", - "dev": true - }, - "node_modules/is-docker": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, - "bin": { - "is-docker": "cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-expression": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-4.0.0.tgz", @@ -15108,15 +13705,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-gzip": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-1.0.0.tgz", - "integrity": "sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -15126,18 +13714,6 @@ "node": ">=8" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-nan": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/is-nan/-/is-nan-1.3.2.tgz", @@ -15233,18 +13809,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", @@ -15335,18 +13899,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -15359,22 +13911,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-windows": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", @@ -15384,18 +13920,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-wsl": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", - "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", @@ -17317,9 +15841,9 @@ } }, "node_modules/markdown-to-jsx": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz", - "integrity": "sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q==", + "version": "7.4.7", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.7.tgz", + "integrity": "sha512-0+ls1IQZdU6cwM1yu0ZjjiVWYtkbExSyUIFU2ZeDIFuZM1W42Mh4OlJ4nb4apX4H8smxDHRdFaoIVJGwfv5hkg==", "dev": true, "engines": { "node": ">= 10" @@ -17687,21 +16211,15 @@ "mkdirp": "bin/cmd.js" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mlly": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.0.tgz", - "integrity": "sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", "dev": true, "dependencies": { "acorn": "^8.11.3", "pathe": "^1.1.2", - "pkg-types": "^1.1.0", + "pkg-types": "^1.1.1", "ufo": "^1.5.3" } }, @@ -18310,16 +16828,17 @@ } }, "node_modules/nypm": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.8.tgz", - "integrity": "sha512-IGWlC6So2xv6V4cIDmoV0SwwWx7zLG086gyqkyumteH2fIgCAM4nDVFB2iDRszDvmdSVW9xb1N+2KjQ6C7d4og==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/nypm/-/nypm-0.3.9.tgz", + "integrity": "sha512-BI2SdqqTHg2d4wJh8P9A1W+bslg33vOE9IZDY6eR2QC+Pu1iNBVZUqczrd43rJb+fMzHU7ltAYKsEFY/kHMFcw==", "dev": true, "dependencies": { "citty": "^0.1.6", "consola": "^3.2.3", "execa": "^8.0.1", "pathe": "^1.1.2", - "ufo": "^1.4.0" + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" }, "bin": { "nypm": "dist/cli.mjs" @@ -18464,15 +16983,6 @@ "node": ">= 0.8" } }, - "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", - "dev": true, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -18496,23 +17006,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/open": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", - "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", - "dev": true, - "dependencies": { - "define-lazy-prop": "^2.0.0", - "is-docker": "^2.1.1", - "is-wsl": "^2.2.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/optionator": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", @@ -18846,17 +17339,6 @@ "node": ">=0.12" } }, - "node_modules/peek-stream": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/peek-stream/-/peek-stream-1.1.3.tgz", - "integrity": "sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "duplexify": "^3.5.0", - "through2": "^2.0.3" - } - }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", @@ -18952,13 +17434,13 @@ } }, "node_modules/pkg-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", - "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.3.tgz", + "integrity": "sha512-+JrgthZG6m3ckicaOB74TwQ+tBWsFl3qVQg7mN8ulwSOElJ7gBhKzj2VkCPnZ4NlF6kEquYU+RIYNVAvzd54UA==", "dev": true, "dependencies": { "confbox": "^0.1.7", - "mlly": "^1.6.1", + "mlly": "^1.7.1", "pathe": "^1.1.2" } }, @@ -19403,27 +17885,6 @@ "once": "^1.3.1" } }, - "node_modules/pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "dev": true, - "dependencies": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - } - }, - "node_modules/pumpify/node_modules/pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -19648,76 +18109,6 @@ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true }, - "node_modules/react-remove-scroll": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.7.tgz", - "integrity": "sha512-FnrTWO4L7/Bhhf3CYBNArEG/yROV0tKmTv7/3h9QCFvH6sndeFf1wPqOcbFVu5VAulS5dV1wGT3GZZ/1GawqiA==", - "dev": true, - "dependencies": { - "react-remove-scroll-bar": "^2.3.4", - "react-style-singleton": "^2.2.1", - "tslib": "^2.1.0", - "use-callback-ref": "^1.3.0", - "use-sidecar": "^1.1.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-remove-scroll-bar": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", - "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", - "dev": true, - "dependencies": { - "react-style-singleton": "^2.2.1", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/react-style-singleton": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", - "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", - "dev": true, - "dependencies": { - "get-nonce": "^1.0.0", - "invariant": "^2.2.4", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/read-config-file": { "version": "6.3.2", "resolved": "https://registry.npmjs.org/read-config-file/-/read-config-file-6.3.2.tgz", @@ -19809,135 +18200,6 @@ "node": ">=16 || 14 >=14.17" } }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", - "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", - "dev": true, - "dependencies": { - "find-up": "^4.1.0", - "read-pkg": "^5.2.0", - "type-fest": "^0.8.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg-up/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg-up/node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, - "node_modules/read-pkg/node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -21053,97 +19315,251 @@ "spdx-ranges": "^2.0.0" } }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", - "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "optional": true + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/stat-mode": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", + "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "dev": true + }, + "node_modules/storybook": { + "version": "8.2.6", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.2.6.tgz", + "integrity": "sha512-8j30wDxQmkcqI0fWcSYFsUCjErsY1yTWbTW+yjbwM8DyW18Cud6CwbFRCxjFsH+2M0CjP6Pqs/m1PGI0vcQscQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.24.4", + "@babel/types": "^7.24.0", + "@storybook/codemod": "8.2.6", + "@storybook/core": "8.2.6", + "@types/semver": "^7.3.4", + "@yarnpkg/fslib": "2.10.3", + "@yarnpkg/libzip": "2.3.0", + "chalk": "^4.1.0", + "commander": "^6.2.1", + "cross-spawn": "^7.0.3", + "detect-indent": "^6.1.0", + "envinfo": "^7.7.3", + "execa": "^5.0.0", + "fd-package-json": "^1.2.0", + "find-up": "^5.0.0", + "fs-extra": "^11.1.0", + "giget": "^1.0.0", + "globby": "^14.0.1", + "jscodeshift": "^0.15.1", + "leven": "^3.1.0", + "ora": "^5.4.1", + "prettier": "^3.1.1", + "prompts": "^2.4.0", + "semver": "^7.3.7", + "strip-json-comments": "^3.0.1", + "tempy": "^3.1.0", + "tiny-invariant": "^1.3.1", + "ts-dedent": "^2.0.0" + }, + "bin": { + "getstorybook": "bin/index.cjs", + "sb": "bin/index.cjs", + "storybook": "bin/index.cjs" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/storybook" + } + }, + "node_modules/storybook/node_modules/commander": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, - "optional": true + "engines": { + "node": ">= 6" + } }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "node_modules/storybook/node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "dependencies": { - "escape-string-regexp": "^2.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/stack-utils/node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "node_modules/storybook/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, "engines": { - "node": ">=8" + "node": ">=14.14" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true + "node_modules/storybook/node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/stat-mode": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-1.0.0.tgz", - "integrity": "sha512-jH9EhtKIjuXZ2cWxmXS8ZP80XyC3iasQxMDV8jzhNJpfDb7VbQLVW4Wvsxz9QZvzV+G4YoSfBUVKDOyxLzi/sg==", + "node_modules/storybook/node_modules/globby": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.2.tgz", + "integrity": "sha512-s3Fq41ZVh7vbbe2PN3nrW7yC7U7MFVc5c98/iTl9c2GawNMKx/J648KQRW6WKkuU8GIbbh2IXfIRQjOZnXcTnw==", "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.2", + "ignore": "^5.2.4", + "path-type": "^5.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.1.0" + }, "engines": { - "node": ">= 6" + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "node_modules/storybook/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "engines": { - "node": ">= 0.8" + "node": ">=10.17.0" } }, - "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", - "dev": true + "node_modules/storybook/node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "node_modules/storybook/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", "dev": true, "dependencies": { - "internal-slot": "^1.0.4" + "universalify": "^2.0.0" }, - "engines": { - "node": ">= 0.4" + "optionalDependencies": { + "graceful-fs": "^4.1.6" } }, - "node_modules/store2": { - "version": "2.14.3", - "resolved": "https://registry.npmjs.org/store2/-/store2-2.14.3.tgz", - "integrity": "sha512-4QcZ+yx7nzEFiV4BMLnr/pRa5HYzNITX2ri0Zh6sT9EyQHbBHacC6YigllUPU9X3D0f/22QCgfokpKs52YRrUg==", - "dev": true - }, - "node_modules/storybook": { - "version": "8.1.10", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.1.10.tgz", - "integrity": "sha512-HHlZibyc/QkcQj8aEnYnYwEl+ItNZ/uRbCdkvJzu/vIWYon5jUg30mHFIGZprgLSt27CxOs30Et8yT9z4VhwjA==", + "node_modules/storybook/node_modules/path-type": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-5.0.0.tgz", + "integrity": "sha512-5HviZNaZcfqP95rwpv+1HDgUamezbqdSYTyzjTvwtJSnIH+3vnbmWsItli8OFEndS984VT55M3jduxZbX351gg==", "dev": true, - "dependencies": { - "@storybook/cli": "8.1.10" + "engines": { + "node": ">=12" }, - "bin": { - "sb": "index.js", - "storybook": "index.js" + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "engines": { + "node": ">=14.16" }, "funding": { - "type": "opencollective", - "url": "https://opencollective.com/storybook" + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/storybook/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" } }, "node_modules/stream-browserify": { @@ -21168,12 +19584,6 @@ "xtend": "^4.0.2" } }, - "node_modules/stream-shift": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz", - "integrity": "sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==", - "dev": true - }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -21455,29 +19865,12 @@ "node": ">=10" } }, - "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "dev": true, - "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^2.1.4" - } - }, - "node_modules/tar-fs/node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "node_modules/tar-stream": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", "dev": true, + "peer": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -21736,52 +20129,6 @@ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, - "node_modules/through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "dev": true, - "dependencies": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - } - }, - "node_modules/through2/node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true - }, - "node_modules/through2/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/through2/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "node_modules/through2/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -21872,12 +20219,6 @@ "node": ">=8.0" } }, - "node_modules/tocbot": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/tocbot/-/tocbot-4.28.2.tgz", - "integrity": "sha512-/MaSa9xI6mIo84IxqqliSCtPlH0oy7sLcY9s26qPMyH/2CxtZ2vNAXYlIdEQ7kjAkCQnc0rbLygf//F5c663oQ==", - "dev": true - }, "node_modules/toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", @@ -22380,29 +20721,20 @@ } }, "node_modules/unplugin": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", - "integrity": "sha512-d6Mhq8RJeGA8UfKCu54Um4lFA0eSaRa3XxdAJg8tIdxbu1ubW0hBCZUL7yI2uGyYCRndvbK8FLHzqy2XKfeMsg==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.12.0.tgz", + "integrity": "sha512-KeczzHl2sATPQUx1gzo+EnUkmN4VmGBYRRVOZSGvGITE9rGHRDGqft6ONceP3vgXcyJ2XjX5axG5jMWUwNCYLw==", "dev": true, "dependencies": { - "acorn": "^8.11.3", + "acorn": "^8.12.1", "chokidar": "^3.6.0", "webpack-sources": "^3.2.3", - "webpack-virtual-modules": "^0.6.1" + "webpack-virtual-modules": "^0.6.2" }, "engines": { "node": ">=14.0.0" } }, - "node_modules/untildify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", - "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/unzip-crx-3": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/unzip-crx-3/-/unzip-crx-3-0.2.0.tgz", @@ -22467,49 +20799,6 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==" }, - "node_modules/use-callback-ref": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", - "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", - "dev": true, - "dependencies": { - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, - "node_modules/use-sidecar": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", - "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", - "dev": true, - "dependencies": { - "detect-node-es": "^1.1.0", - "tslib": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - } - } - }, "node_modules/utaformatix-data": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/utaformatix-data/-/utaformatix-data-1.1.0.tgz", @@ -23765,6 +22054,12 @@ "node": ">=4" } }, + "node_modules/walk-up-path": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/walk-up-path/-/walk-up-path-3.0.1.tgz", + "integrity": "sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==", + "dev": true + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", @@ -23774,19 +22069,6 @@ "makeerror": "1.0.12" } }, - "node_modules/watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", @@ -23888,24 +22170,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dev": true, - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", @@ -24026,9 +22290,9 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/package.json b/package.json index 7fb4d5fced..5aff84f4e0 100644 --- a/package.json +++ b/package.json @@ -72,15 +72,15 @@ "@openapitools/openapi-generator-cli": "2.13.4", "@playwright/test": "1.43.1", "@quasar/vite-plugin": "1.6.0", - "@storybook/addon-essentials": "8.1.10", - "@storybook/addon-interactions": "8.1.10", - "@storybook/addon-links": "8.1.10", - "@storybook/blocks": "8.1.10", - "@storybook/builder-vite": "8.1.10", - "@storybook/test": "8.1.10", + "@storybook/addon-essentials": "8.2.6", + "@storybook/addon-interactions": "8.2.6", + "@storybook/addon-links": "8.2.6", + "@storybook/blocks": "8.2.6", + "@storybook/builder-vite": "8.2.6", + "@storybook/test": "8.2.6", "@storybook/test-runner": "0.19.0", - "@storybook/vue3": "8.1.10", - "@storybook/vue3-vite": "8.1.10", + "@storybook/vue3": "8.2.6", + "@storybook/vue3-vite": "8.2.6", "@types/async-lock": "1.4.0", "@types/encoding-japanese": "1.0.18", "@types/glob": "8.0.0", @@ -117,7 +117,7 @@ "markdownlint-cli": "0.37.0", "prettier": "3.2.5", "sass": "1.32.13", - "storybook": "8.1.10", + "storybook": "8.2.6", "ts-node": "10.9.1", "typescript": "5.5.2", "vite": "5.3.2", diff --git a/src/components/Talk/TalkEditor.stories.ts b/src/components/Talk/TalkEditor.stories.ts index 9c0c6fd9cf..d3b965be24 100644 --- a/src/components/Talk/TalkEditor.stories.ts +++ b/src/components/Talk/TalkEditor.stories.ts @@ -29,12 +29,14 @@ import { } from "@/mock/engineMock/speakerResourceMock"; import { setFont, themeToCss } from "@/domain/dom"; import defaultTheme from "@/../public/themes/default.json"; +import { State } from "@/store/type"; const meta: Meta = { component: TalkEditor, args: { isEnginesReady: true, isProjectFileLoaded: false, + onCompleteInitialStartup: fn(), }, decorators: [ (story, context) => { @@ -55,6 +57,8 @@ const meta: Meta = { }); provide(storeKey, store); + context.parameters.vuexState = store.state; + // なぜか必要、これがないとdispatch内でcommitしたときにエラーになる store.replaceState({ ...structuredClone(toRaw(store.state)), @@ -133,6 +137,15 @@ type Story = StoryObj; export const Default: Story = { name: "デフォルト", + play: async ({ args }) => { + // 準備が完了するまで待機する + await waitFor( + () => { + expect(args.onCompleteInitialStartup).toHaveBeenCalled(); + }, + { timeout: 5000 }, + ); + }, }; export const NowLoading: Story = { @@ -142,17 +155,15 @@ export const NowLoading: Story = { }, }; -export const KeyboardShortcuts: Story = { - name: "キーボードショートカットのテスト ", - play: async ({ args, canvasElement }) => { - await waitFor(() => { - expect(args.onCompleteInitialStartup).toHaveBeenCalled(); - }); - - // Shift+Enter でテキスト欄を追加 - // await userEvent.keyboard("{Shift>}[Enter]{/Shift}"); - // await userEvent.keyboard("AAAAAA{Escape}"); - hotkeys.trigger("shift+enter", "talk"); - たぶんショートカットは使えない! +export const TextInput: Story = { + name: "テキスト入力のテスト", + play: async ({ context, canvasElement, component }) => { + await Default.play(context); + + const canvas = within(canvasElement); + + // テキスト欄を取得 + const textInput = await canvas.findByLabelText("1行目"); + await userEvent.type(textInput, "こんにちは、これはテストです。{enter}"); }, }; diff --git a/src/mock/engineMock/test.stories.ts b/src/mock/engineMock/test.stories.ts index 8c0bdd5b51..ac89e438e9 100644 --- a/src/mock/engineMock/test.stories.ts +++ b/src/mock/engineMock/test.stories.ts @@ -1,7 +1,7 @@ import { userEvent, within, expect, fn } from "@storybook/test"; import { Meta, StoryObj } from "@storybook/vue3"; -import { createOpenAPIEngineMock, mockHost } from "@/storybook/engineMock"; +import { createOpenAPIEngineMock, mockHost } from "@/mock/engineMock"; const meta: Meta = { render: () => { diff --git a/tests/unit/components/Talk/TalkEditor.spec.ts b/tests/unit/components/Talk/TalkEditor.spec.ts new file mode 100644 index 0000000000..4e417e7d18 --- /dev/null +++ b/tests/unit/components/Talk/TalkEditor.spec.ts @@ -0,0 +1,10 @@ +import { composeStories } from "@storybook/vue3"; + +import * as Stories from "@/components/Talk/TalkEditor.stories"; + +const { TextInput } = composeStories(Stories); + +it("Tests invalid form state", { timeout: 60000 }, async () => { + await TextInput.play(); + console.log(TextInput.parameters); +}); From 602fdd43e011970bbb9a36e23be1da8a2511382e Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sun, 4 Aug 2024 00:42:13 +0900 Subject: [PATCH 08/17] =?UTF-8?q?=E3=82=B9=E3=83=8A=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=82=B7=E3=83=A7=E3=83=83=E3=83=88=E3=81=A7=E3=81=8D=E3=81=9F?= =?UTF-8?q?=EF=BC=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storybook/preview.ts | 5 + .storybook/test-runner.ts | 18 ++ package-lock.json | 6 - src/components/Talk/TalkEditor.stories.ts | 10 +- .../__snapshots__/TalkEditor.stories.ts.snap | 158 ++++++++++++++++++ src/type/globals.d.ts | 3 + 6 files changed, 190 insertions(+), 10 deletions(-) create mode 100644 .storybook/test-runner.ts create mode 100644 src/components/Talk/__snapshots__/TalkEditor.stories.ts.snap diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 5ec33581a9..94a02d104a 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -3,6 +3,7 @@ import { Quasar, Dialog, Loading, Notify } from "quasar"; import iconSet from "quasar/icon-set/material-icons"; import { addActionsWithEmits } from "./utils/argTypesEnhancers"; import { markdownItPlugin } from "@/plugins/markdownItPlugin"; +import { resetMockMode } from "@/helpers/random"; import "@quasar/extras/material-icons/material-icons.css"; import "quasar/dist/quasar.sass"; @@ -35,6 +36,10 @@ const preview: Preview = { }, }, argTypesEnhancers: [addActionsWithEmits], + + beforeEach() { + resetMockMode(); + }, }; export default preview; diff --git a/.storybook/test-runner.ts b/.storybook/test-runner.ts new file mode 100644 index 0000000000..82e374ac6c --- /dev/null +++ b/.storybook/test-runner.ts @@ -0,0 +1,18 @@ +import { type TestRunnerConfig } from "@storybook/test-runner"; + +const config: TestRunnerConfig = { + async preVisit(page) { + // テスト用のスナップショット関数を追加する。 + // *.stories.ts内で`window.storybookTestSnapshot`を使って呼び出せる。 + if (await page.evaluate(() => !("storybookTestSnapshot" in window))) { + await page.exposeBinding( + "storybookTestSnapshot", + async (_, obj: unknown) => { + expect(obj).toMatchSnapshot(); + }, + ); + } + }, +}; + +export default config; diff --git a/package-lock.json b/package-lock.json index a50e0c8ed0..573dfd88a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3009,12 +3009,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/@fal-works/esbuild-plugin-global-externals": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@fal-works/esbuild-plugin-global-externals/-/esbuild-plugin-global-externals-2.1.2.tgz", - "integrity": "sha512-cEee/Z+I12mZcFJshKcCqC8tuX5hG3s+d+9nZ3LabqKF1vKdF41B92pJVCBggjAGORAeOzyyDDKrZwIkLffeOQ==", - "dev": true - }, "node_modules/@floating-ui/core": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.3.tgz", diff --git a/src/components/Talk/TalkEditor.stories.ts b/src/components/Talk/TalkEditor.stories.ts index d3b965be24..2ebb3361e8 100644 --- a/src/components/Talk/TalkEditor.stories.ts +++ b/src/components/Talk/TalkEditor.stories.ts @@ -29,7 +29,6 @@ import { } from "@/mock/engineMock/speakerResourceMock"; import { setFont, themeToCss } from "@/domain/dom"; import defaultTheme from "@/../public/themes/default.json"; -import { State } from "@/store/type"; const meta: Meta = { component: TalkEditor, @@ -57,13 +56,13 @@ const meta: Meta = { }); provide(storeKey, store); - context.parameters.vuexState = store.state; - // なぜか必要、これがないとdispatch内でcommitしたときにエラーになる store.replaceState({ ...structuredClone(toRaw(store.state)), }); + context.parameters.vuexState = store.state; + // エンジンの情報 const engineManifest = getEngineManifestMock(); const engineId = EngineId(engineManifest.uuid); @@ -157,7 +156,7 @@ export const NowLoading: Story = { export const TextInput: Story = { name: "テキスト入力のテスト", - play: async ({ context, canvasElement, component }) => { + play: async ({ context, canvasElement, parameters }) => { await Default.play(context); const canvas = within(canvasElement); @@ -165,5 +164,8 @@ export const TextInput: Story = { // テキスト欄を取得 const textInput = await canvas.findByLabelText("1行目"); await userEvent.type(textInput, "こんにちは、これはテストです。{enter}"); + + const { audioItems, audioKeys } = parameters.vuexState; + await window.storybookTestSnapshot?.({ audioItems, audioKeys }); }, }; diff --git a/src/components/Talk/__snapshots__/TalkEditor.stories.ts.snap b/src/components/Talk/__snapshots__/TalkEditor.stories.ts.snap new file mode 100644 index 0000000000..582241a182 --- /dev/null +++ b/src/components/Talk/__snapshots__/TalkEditor.stories.ts.snap @@ -0,0 +1,158 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` +{ + "audioItems": { + "00000000-0000-4000-0000-000000000001": { + "presetKey": undefined, + "query": { + "accentPhrases": [ + { + "accent": 5, + "moras": [ + { + "consonant": "k", + "consonantLength": 0.1103125, + "pitch": 4.7734375, + "text": "コ", + "vowel": "o", + "vowelLength": 0.1140625, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.609375, + "text": "ン", + "vowel": "N", + "vowelLength": 0.08312499999999999, + }, + { + "consonant": "n", + "consonantLength": 0.11312499999999999, + "pitch": 4.75, + "text": "ニ", + "vowel": "i", + "vowelLength": 0.10843749999999999, + }, + { + "consonant": "ch", + "consonantLength": 0.2003125, + "pitch": 4.0234375, + "text": "チ", + "vowel": "i", + "vowelLength": 0.10843749999999999, + }, + { + "consonant": "h", + "consonantLength": 0.1575, + "pitch": 4.796875, + "text": "ハ", + "vowel": "a", + "vowelLength": 0.1509375, + }, + ], + "pauseMora": { + "pitch": 0, + "text": "、", + "vowel": "", + "vowelLength": 0, + }, + }, + { + "accent": 2, + "moras": [ + { + "consonant": "k", + "consonantLength": 0.12031249999999999, + "pitch": 4.7834375, + "text": "コ", + "vowel": "o", + "vowelLength": 0.12406249999999999, + }, + { + "consonant": "r", + "consonantLength": 0.126875, + "pitch": 4.72875, + "text": "レ", + "vowel": "e", + "vowelLength": 0.11468749999999998, + }, + { + "consonant": "h", + "consonantLength": 0.1675, + "pitch": 5.106875, + "text": "ハ", + "vowel": "a", + "vowelLength": 0.1609375, + }, + ], + }, + { + "accent": 2, + "moras": [ + { + "consonant": "t", + "consonantLength": 0.13874999999999998, + "pitch": 4.723125, + "text": "テ", + "vowel": "e", + "vowelLength": 0.12468749999999999, + }, + { + "consonant": "s", + "consonantLength": 0.13781249999999998, + "pitch": 4.7309375, + "text": "ス", + "vowel": "u", + "vowelLength": 0.1396875, + }, + { + "consonant": "t", + "consonantLength": 0.13874999999999998, + "pitch": 5.023124999999999, + "text": "ト", + "vowel": "o", + "vowelLength": 0.1340625, + }, + { + "consonant": "d", + "consonantLength": 0.12375, + "pitch": 4.848125, + "text": "デ", + "vowel": "e", + "vowelLength": 0.12468749999999999, + }, + { + "consonant": "s", + "consonantLength": 0.18781249999999997, + "pitch": 4.7309375, + "text": "ス", + "vowel": "u", + "vowelLength": 0.18968749999999998, + }, + ], + "pauseMora": undefined, + }, + ], + "intonationScale": 1, + "outputSamplingRate": 24000, + "outputStereo": false, + "pitchScale": 0, + "postPhonemeLength": 0.1, + "prePhonemeLength": 0.1, + "speedScale": 1, + "volumeScale": 1, + }, + "text": "こんにちは、これはテストです。", + "voice": { + "engineId": "c7b58856-bd56-4aa1-afb7-b8415f824b06", + "speakerId": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", + "styleId": 0, + }, + }, + }, + "audioKeys": [ + "00000000-0000-4000-0000-000000000001", + ], +} +`; diff --git a/src/type/globals.d.ts b/src/type/globals.d.ts index 6c761fa17f..4155ff9c84 100644 --- a/src/type/globals.d.ts +++ b/src/type/globals.d.ts @@ -11,6 +11,9 @@ declare global { interface Window { readonly [SandboxKey]: import("./preload").Sandbox; + + // Storybookのtest-runnerのみで使用できるスナップショット関数 + storybookTestSnapshot?: (obj: unknown) => Promise; } interface Navigator { From e29a8f431c8e0b109f713d4336ea93db02b23a71 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sun, 4 Aug 2024 00:44:13 +0900 Subject: [PATCH 09/17] 8.2.7 --- package-lock.json | 421 +++++++++++++++++++++++----------------------- package.json | 22 +-- 2 files changed, 221 insertions(+), 222 deletions(-) diff --git a/package-lock.json b/package-lock.json index 573dfd88a8..22559eaae4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,19 +39,19 @@ "zod": "3.22.4" }, "devDependencies": { - "@chromatic-com/storybook": "1.5.0", + "@chromatic-com/storybook": "^1.6.1", "@openapitools/openapi-generator-cli": "2.13.4", "@playwright/test": "1.43.1", "@quasar/vite-plugin": "1.6.0", - "@storybook/addon-essentials": "8.2.6", - "@storybook/addon-interactions": "8.2.6", - "@storybook/addon-links": "8.2.6", - "@storybook/blocks": "8.2.6", - "@storybook/builder-vite": "8.2.6", - "@storybook/test": "8.2.6", - "@storybook/test-runner": "0.19.0", - "@storybook/vue3": "8.2.6", - "@storybook/vue3-vite": "8.2.6", + "@storybook/addon-essentials": "^8.2.7", + "@storybook/addon-interactions": "^8.2.7", + "@storybook/addon-links": "^8.2.7", + "@storybook/blocks": "^8.2.7", + "@storybook/builder-vite": "^8.2.7", + "@storybook/test": "^8.2.7", + "@storybook/test-runner": "^0.19.1", + "@storybook/vue3": "^8.2.7", + "@storybook/vue3-vite": "^8.2.7", "@types/async-lock": "1.4.0", "@types/encoding-japanese": "1.0.18", "@types/glob": "8.0.0", @@ -88,7 +88,7 @@ "markdownlint-cli": "0.37.0", "prettier": "3.2.5", "sass": "1.32.13", - "storybook": "8.2.6", + "storybook": "^8.2.7", "ts-node": "10.9.1", "typescript": "5.5.2", "vite": "5.3.2", @@ -156,9 +156,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.0.tgz", - "integrity": "sha512-P4fwKI2mjEb3ZU5cnMJzvRsRKGBUcs8jvxIoRmr6ufAY9Xk2Bz7JubRTTivkw55c7WQJfTECeqYVa+HZ0FzREg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.2.tgz", + "integrity": "sha512-bYcppcpKBvX4znYaPEeFau03bp89ShqNMLs+rmdptMw+heSZh9+z84d2YG+K7cYLbWwzdjtDoW/uqZmPjulClQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -254,12 +254,12 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.8.tgz", - "integrity": "sha512-oU+UoqCHdp+nWVDkpldqIQL/i/bvAv53tRqLG/s+cOXxe66zOYLU7ar/Xs3LdmBihrUMEUhwu6dMZwbNOYDwvw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.24.8", + "@babel/compat-data": "^7.25.2", "@babel/helper-validator-option": "^7.24.8", "browserslist": "^4.23.1", "lru-cache": "^5.1.1", @@ -324,9 +324,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.0.tgz", - "integrity": "sha512-q0T+dknZS+L5LDazIP+02gEZITG5unzvb6yIjcmj5i0eFrs5ToBV2m2JGH4EsE/gtP8ygEGLGApBgRIZkTm7zg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -494,7 +494,6 @@ "version": "7.24.8", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -503,7 +502,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -631,9 +629,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.0.tgz", - "integrity": "sha512-CzdIU9jdP0dg7HdyB+bHvDJGagUv+qtzZt5rYCWwW6tITNqV9odjp6Qu41gkG0ca5UfdDUWrKkiAnHHdGRnOrA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.3.tgz", + "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==", + "dependencies": { + "@babel/types": "^7.25.2" + }, "bin": { "parser": "bin/babel-parser.js" }, @@ -642,13 +643,13 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.0.tgz", - "integrity": "sha512-dG0aApncVQwAUJa8tP1VHTnmU67BeIQvKafd3raEx315H54FfkZSz3B/TT+33ZQAjatGJA79gZqTtqL5QZUKXw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.3" }, "engines": { "node": ">=6.9.0" @@ -1293,12 +1294,12 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz", - "integrity": "sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.2.tgz", + "integrity": "sha512-InBZ0O8tew5V0K6cHcQ+wgxlrjOw1W4wDXLkOTjLRD8GYhTSkxTVBtdy3MMtvYBrbAWa1Qm3hNoTc1620Yj+Mg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/plugin-syntax-flow": "^7.24.7" }, "engines": { @@ -1325,14 +1326,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.0.tgz", - "integrity": "sha512-CQmfSnK14eYu82fu6GlCwRciHB7mp7oLN+DeyGDDwUr9cMwuSVviJKPXw/YcRYZdB1TdlLJWHHwXwnwD1WnCmQ==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.24.8", "@babel/helper-plugin-utils": "^7.24.8", - "@babel/traverse": "^7.25.0" + "@babel/traverse": "^7.25.1" }, "engines": { "node": ">=6.9.0" @@ -1358,12 +1359,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" }, "engines": { "node": ">=6.9.0" @@ -1772,9 +1773,9 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.0.tgz", - "integrity": "sha512-LZicxFzHIw+Sa3pzgMgSz6gdpsdkfiMObHUzhSIrwKF0+/rP/nuR49u79pSS+zIFJ1FeGeqQD2Dq4QGFbOVvSw==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.2.tgz", + "integrity": "sha512-lBwRvjSmqiMYe/pS0+1gggjJleUJi7NzjvQ1Fkqtt69hBa/0t1YuW/MLQMAPixfwaQOHUXsd6jeU3Z+vdGv3+A==", "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -1854,16 +1855,16 @@ } }, "node_modules/@babel/preset-env": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.0.tgz", - "integrity": "sha512-vYAA8PrCOeZfG4D87hmw1KJ1BPubghXP1e2MacRFwECGNKL76dkA38JEwYllbvQCpf/kLxsTtir0b8MtxKoVCw==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.3.tgz", + "integrity": "sha512-QsYW7UeAaXvLPX9tdVliMJE7MD7M6MLYVTovRTIwhoYQVFHR1rM4wO8wqAezYi3/BpSD+NzVCZ69R6smWiIi8g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.0", - "@babel/helper-compilation-targets": "^7.24.8", + "@babel/compat-data": "^7.25.2", + "@babel/helper-compilation-targets": "^7.25.2", "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-validator-option": "^7.24.8", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.0", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", @@ -1904,9 +1905,9 @@ "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.25.0", + "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", @@ -2170,16 +2171,16 @@ } }, "node_modules/@babel/traverse": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.0.tgz", - "integrity": "sha512-ubALThHQy4GCf6mbb+5ZRNmLLCI7bJ3f8Q6LHBSRlSKSWj5a7dSUzJBLv3VuIhFrFPgjF4IzPF567YG/HSCdZA==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.3.tgz", + "integrity": "sha512-HefgyP1x754oGCsKmV5reSmtV7IXj/kpaE1XYY+D9G5PvKKoFfSbiS4M77MdjuwlZKDIKFCffq9rPU+H/s3ZdQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.24.7", "@babel/generator": "^7.25.0", - "@babel/parser": "^7.25.0", + "@babel/parser": "^7.25.3", "@babel/template": "^7.25.0", - "@babel/types": "^7.25.0", + "@babel/types": "^7.25.2", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2197,10 +2198,9 @@ } }, "node_modules/@babel/types": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.0.tgz", - "integrity": "sha512-LcnxQSsd9aXOIgmmSpvZ/1yo46ra2ESYyqLcryaBZOghxy5qqOBjvCWP5JfkI8yl9rlxRgdLTTMCQQRcN2hdCg==", - "dev": true, + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.2.tgz", + "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==", "dependencies": { "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", @@ -2217,9 +2217,9 @@ "dev": true }, "node_modules/@chromatic-com/storybook": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-1.5.0.tgz", - "integrity": "sha512-LkLKv7SWu/6kGep1ft2HA1T/cm14wU0zoW71gE4cZRcgUoRQJtyhITFTLHrjqAxz6bVqNgqzQtd5oBZ2nK3L3g==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@chromatic-com/storybook/-/storybook-1.6.1.tgz", + "integrity": "sha512-x1x1NB3j4xpfeSWKr96emc+7ZvfsvH+/WVb3XCjkB24PPbT8VZXb3mJSAQMrSzuQ8+eQE9kDogYHH9Fj3tb/Cw==", "dev": true, "dependencies": { "chromatic": "^11.4.0", @@ -4885,9 +4885,9 @@ } }, "node_modules/@storybook/addon-actions": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.2.6.tgz", - "integrity": "sha512-iCsf3V28/jJ95w2zd8aSvR4denoA2UYV3fpNCTGOURqICyKOG3cyVxvqKp8Hhcwn7trNOsK+HlL6q5gpv56ViA==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-8.2.7.tgz", + "integrity": "sha512-wDnMGGmaogAForkNncfCx8BEDiwxeK8zC0lj8HkRPUuH6vTr81U5RIb12Wa2TnnNKLKMFAtyPSnofHf3OAfzZQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -4901,13 +4901,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-backgrounds": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.2.6.tgz", - "integrity": "sha512-61NFowA6EmCw+Eyzp0U4fat9MlPDdnT7aoDyzqSImLwWLITY9IvmWuTeo7XKJZN3fe22z1r7cZseKdYrtaHcKw==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-8.2.7.tgz", + "integrity": "sha512-kEL3kzYB0qNfpznchlGBnQm4iydyzdTYDPlCFsKUAxfUmJFnpz2H52Sl5lB+qJC/4OREp1Usltag7cUjeuyzMQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -4919,13 +4919,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-controls": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.2.6.tgz", - "integrity": "sha512-EHUwHy+oZZv3pXzN7fuXWrS/meHFjqcELY3RBvOyEkGf21agl6co6R1tnf6d5N5QoYAGfIbDO7dkauSL2RfNAw==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-8.2.7.tgz", + "integrity": "sha512-u3MruX0Zh6l1iNkoJdXwx+zPVqpDKypVrC0YdN3qQ3+mtTwqt35rgetYqtOkDnJ8mXKxo8A5giERKPIyzH9iBA==", "dev": true, "dependencies": { "dequal": "^2.0.2", @@ -4937,21 +4937,21 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-docs": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.2.6.tgz", - "integrity": "sha512-qe7hxntaezqjKdU9QS+Q9NFL6i/uNdBxdvOnCKgPhBAY/zY6yhk5t3sOvonynPK5nkaNAowfSNPIzNxAXlJ1sA==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-8.2.7.tgz", + "integrity": "sha512-icLbvUWp95WUxq2sY+0xgJ49MaQ2HqtWY9RUJUZswJ/ZPJTCCpIoa6HP/NOB9A90Oec9n8sW+1CdDL4CxfxfZg==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", "@mdx-js/react": "^3.0.0", - "@storybook/blocks": "8.2.6", - "@storybook/csf-plugin": "8.2.6", + "@storybook/blocks": "8.2.7", + "@storybook/csf-plugin": "8.2.7", "@storybook/global": "^5.0.0", - "@storybook/react-dom-shim": "8.2.6", + "@storybook/react-dom-shim": "8.2.7", "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", "fs-extra": "^11.1.0", "react": "^16.8.0 || ^17.0.0 || ^18.0.0", @@ -4965,7 +4965,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-docs/node_modules/fs-extra": { @@ -4995,20 +4995,20 @@ } }, "node_modules/@storybook/addon-essentials": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.2.6.tgz", - "integrity": "sha512-diGjGZcZNov+RCAVQBTm8JKP2kUtMRuJIQFBeXdPWpu6hYBk6lw1FlAf2GywWGCvdny1pJT90hfoD33qUMNuDg==", - "dev": true, - "dependencies": { - "@storybook/addon-actions": "8.2.6", - "@storybook/addon-backgrounds": "8.2.6", - "@storybook/addon-controls": "8.2.6", - "@storybook/addon-docs": "8.2.6", - "@storybook/addon-highlight": "8.2.6", - "@storybook/addon-measure": "8.2.6", - "@storybook/addon-outline": "8.2.6", - "@storybook/addon-toolbars": "8.2.6", - "@storybook/addon-viewport": "8.2.6", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-8.2.7.tgz", + "integrity": "sha512-5qe7La9B2Z4Y9Fet3C35y8zOZwKgrqduNk8yAUmPRAOwopdo8SGKYpnFTnAtTfTCVk6Y+AZlRfQq0yLUk0Wl3g==", + "dev": true, + "dependencies": { + "@storybook/addon-actions": "8.2.7", + "@storybook/addon-backgrounds": "8.2.7", + "@storybook/addon-controls": "8.2.7", + "@storybook/addon-docs": "8.2.7", + "@storybook/addon-highlight": "8.2.7", + "@storybook/addon-measure": "8.2.7", + "@storybook/addon-outline": "8.2.7", + "@storybook/addon-toolbars": "8.2.7", + "@storybook/addon-viewport": "8.2.7", "ts-dedent": "^2.0.0" }, "funding": { @@ -5016,13 +5016,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-highlight": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.2.6.tgz", - "integrity": "sha512-03cV9USsfP3bS4wYV06DYcIaGPfoheQe53Q0Jr1B2yJUVyIPKvmO2nGjLBsqzeL3Wl7vSfLQn0/dUdxCcbqLsw==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-8.2.7.tgz", + "integrity": "sha512-YhiLtyJ3NBNV3FQoQo8RFjj59QGSmmeSwRvCjoac6No2DY5vkMW5a8mW6ORr6QYd7ratRNtd3AsPqksZIehRwQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0" @@ -5032,18 +5032,18 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-interactions": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.2.6.tgz", - "integrity": "sha512-YXpHf8jWPz9HJV+Fw4GaunaCWeE6uqF24aLXdAd8xuhN1UfWJeNV6AwAvFQ0hTLqvmz0yMhX/5JXDKeKESoYDA==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-8.2.7.tgz", + "integrity": "sha512-WZXlwpBNLE483uKuR70A7nm+ZbcZNEmuVz/J1/u7dbi0BUWzmJUa9YIgVeQ/1KTwW8KTkxvB0TuUUH3aA4ZKlA==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", - "@storybook/instrumenter": "8.2.6", - "@storybook/test": "8.2.6", + "@storybook/instrumenter": "8.2.7", + "@storybook/test": "8.2.7", "polished": "^4.2.2", "ts-dedent": "^2.2.0" }, @@ -5052,13 +5052,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-links": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.2.6.tgz", - "integrity": "sha512-CUuU3nk8wyZ3bljCmOG/OCKazan+bPuNbCph8N763zyzdEx5M/CbBxV9d3pi3zjYpix7txlqrl2/YdMCejfyFw==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-8.2.7.tgz", + "integrity": "sha512-BJdR+vdj7S6Rtx8XqBNQzLsRGH/FYHJ6B6BPWGp0awVx0jNWJnxepINQov8i+GAddUVQGCNG+r4LI3QSD3tNAA==", "dev": true, "dependencies": { "@storybook/csf": "0.1.11", @@ -5071,7 +5071,7 @@ }, "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.6" + "storybook": "^8.2.7" }, "peerDependenciesMeta": { "react": { @@ -5080,9 +5080,9 @@ } }, "node_modules/@storybook/addon-measure": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.2.6.tgz", - "integrity": "sha512-neI8YeSOAtOmzasLxo6O8ZLr2ebMaD7XVF+kYatl5+SpyuwwvUGcP9NkKe5S+mB8V2zxFUIsXS74XrhmQhRoaQ==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-8.2.7.tgz", + "integrity": "sha512-cS5njwlzrgrUjigUKjhbgJMT8bhPmVDK3FwrQqGhw6xYP4cd9/YBJ4RLNPWhOgGJ+EUTz7eFZ/Rkli5mNrhYcQ==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5093,13 +5093,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-outline": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.2.6.tgz", - "integrity": "sha512-uAlPtqDWlq7MQQ4zJT80qdjbSdLF/zsvtPhidX6h9cjLKNPWAv79xJQ14AJHaMv+Hzy5xKnM4wdEhgPbzKabQg==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-8.2.7.tgz", + "integrity": "sha512-oFSo3o5eEUSsdGUSPV22pGoJ5lL0PGcqjcee2hyl0Rc60ovsnB1BEGOoaGk7/bmkywMxRZm8D6j85V8HftA/kg==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5110,26 +5110,26 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-toolbars": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.2.6.tgz", - "integrity": "sha512-0JmRirMpxHS6VZzBk0kY871xWTpkk3TN4S1sxoFf5fcnCfVTHDjEJ5Ws/QWru1RJlIZHuJKRdQIA6Vuq5X+KfQ==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-8.2.7.tgz", + "integrity": "sha512-lEq0/uiogQSxS8pM5AqIexPiG2mudHUxgBiVWSspbTQDUbGBUxB64VYeYERat50N/GyS2iCymlfSkC+OUXaYLQ==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/addon-viewport": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.2.6.tgz", - "integrity": "sha512-IAxH9H8tVFzSmZhKf5E+EALiAdkp19RzGqP/rWluD8LH7oW5HumQE/4oN0ZhVMy1RxYsCKFYjWyAp7AuxeMRSw==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-8.2.7.tgz", + "integrity": "sha512-d4+klwM/duTukNED1WCeBgIMqL5Jvm/iUs2rUc5HI1FGMEDYnoLVR2ztjivQs+6f1cJWuGwWZD/toB5pKHuR/A==", "dev": true, "dependencies": { "memoizerific": "^1.11.3" @@ -5139,13 +5139,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/blocks": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.2.6.tgz", - "integrity": "sha512-nMlZJjVTyfOJ6xwORptsNuS1AZZlDbJUVXc2R8uukGd5GIXxxCdrPk4NvUsjfQslMT9LhYuFld3z62FATsM2rw==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/blocks/-/blocks-8.2.7.tgz", + "integrity": "sha512-lZB4EzmY4ftgubkf7hmkALEhmfMhRkDRD5QjrgTZLRpdVXPzFUyljgLlTBhv34YTN+ZLYK618/4uSVJBpgoKeQ==", "dev": true, "dependencies": { "@storybook/csf": "0.1.11", @@ -5170,7 +5170,7 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.6" + "storybook": "^8.2.7" }, "peerDependenciesMeta": { "react": { @@ -5182,12 +5182,12 @@ } }, "node_modules/@storybook/builder-vite": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.2.6.tgz", - "integrity": "sha512-3PrsPZAedpQUbzRBEl23Fi1zG5bkQD76JsygVwmfiSm4Est4K8kW2AIB2ht9cIfKXh3mfQkyQlxXKHeQEHeQwQ==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/builder-vite/-/builder-vite-8.2.7.tgz", + "integrity": "sha512-CoEQjsfAQdZeAavfh1sBTMmC453kUFLKHr1zs6MZAlkejxky+U21t1Zb1qEU+IsEr/AlzvJr60pxUNL/dy6PVQ==", "dev": true, "dependencies": { - "@storybook/csf-plugin": "8.2.6", + "@storybook/csf-plugin": "8.2.7", "@types/find-cache-dir": "^3.2.1", "browser-assert": "^1.2.1", "es-module-lexer": "^1.5.0", @@ -5203,7 +5203,7 @@ }, "peerDependencies": { "@preact/preset-vite": "*", - "storybook": "^8.2.6", + "storybook": "^8.2.7", "typescript": ">= 4.3.x", "vite": "^4.0.0 || ^5.0.0", "vite-plugin-glimmerx": "*" @@ -5277,15 +5277,15 @@ } }, "node_modules/@storybook/codemod": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.2.6.tgz", - "integrity": "sha512-+mFJ6R+JhJLpU7VPDlXU5Yn6nqIBq745GaEosnIiFOdNo3jaxJ58wq/sGhbQvoCHPUxMA+sDQvR7pS62YFoLRQ==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/codemod/-/codemod-8.2.7.tgz", + "integrity": "sha512-D2sJcZMUO6Y7DNja4LvdT6uBee4bZbQKB904kEG9Kpr0XF20IHAP9BbkfG8HEFaS0GbJwvGvE03Sg+S1y+vO6Q==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", "@babel/preset-env": "^7.24.4", "@babel/types": "^7.24.0", - "@storybook/core": "8.2.6", + "@storybook/core": "8.2.7", "@storybook/csf": "0.1.11", "@types/cross-spawn": "^6.0.2", "cross-spawn": "^7.0.3", @@ -5346,22 +5346,22 @@ } }, "node_modules/@storybook/components": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.2.6.tgz", - "integrity": "sha512-H8ckH1AnLkHtMtvJ3J8LxnmDtHxkJ7NJacGctHMRrsBIvdKTVwlT4su5nAVVJlan/PrEou+jESfw+OjjBYE5PA==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/components/-/components-8.2.7.tgz", + "integrity": "sha512-FXhnoHl9S+tKSFc62iUG3EWplQP9ojGQaSMhqP4QTus6xmo53oSsPzuTPQilKVHkGxFQW8eGgKKsfHw3G2NT2g==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/core": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.2.6.tgz", - "integrity": "sha512-XY71g3AcpD6IiER9k9Lt+vlUMYfPIYgWekd7e0Ggzz2gJkPuLunKEdQccLGDSHf5OFAobHhrTJc7ZsvWhmDMag==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/core/-/core-8.2.7.tgz", + "integrity": "sha512-vgw5MYN9Bq2/ZsObCOEHbBHwi4RpbYCHPFtKkr4kTnWID++FCSiSVd7jY3xPvcNxWqCxOyH6dThpBi+SsB/ZAA==", "dev": true, "dependencies": { "@storybook/csf": "0.1.11", @@ -5595,9 +5595,9 @@ } }, "node_modules/@storybook/core/node_modules/@types/node": { - "version": "18.19.42", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.42.tgz", - "integrity": "sha512-d2ZFc/3lnK2YCYhos8iaNIYu9Vfhr92nHiyJHRltXWjXUBjEE+A4I58Tdbnw4VhggSW+2j5y5gTrLs4biNnubg==", + "version": "18.19.43", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.43.tgz", + "integrity": "sha512-Mw/YlgXnyJdEwLoFv2dpuJaDFriX+Pc+0qOBJ57jC1H6cDxIj2xc5yUrdtArDVG0m+KV6622a4p2tenEqB3C/g==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -5613,9 +5613,9 @@ } }, "node_modules/@storybook/csf-plugin": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.2.6.tgz", - "integrity": "sha512-USn7E/bMQYVqvFBuW6d9rKoSuCImjk0BAmc/0wIOuMQ/yQNp2Xze0m8eVkNHUIUDokyx0TXDjRjwq10Xxk16ag==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-8.2.7.tgz", + "integrity": "sha512-rBdplL6xcVJcuq+uM0eidomMQ5BtAlVAejYrOTNiqBk/zVh5JSvchYzYG9n6Fo2PdKLLKdlZ874zhsVuNriNBQ==", "dev": true, "dependencies": { "unplugin": "^1.3.1" @@ -5625,7 +5625,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/csf-tools": { @@ -5694,9 +5694,9 @@ "dev": true }, "node_modules/@storybook/icons": { - "version": "1.2.9", - "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.9.tgz", - "integrity": "sha512-cOmylsz25SYXaJL/gvTk/dl3pyk7yBFRfeXTsHvTA3dfhoU/LWSq0NKL9nM7WBasJyn6XPSGnLS4RtKXLw5EUg==", + "version": "1.2.10", + "resolved": "https://registry.npmjs.org/@storybook/icons/-/icons-1.2.10.tgz", + "integrity": "sha512-310apKdDcjbbX2VSLWPwhEwAgjxTzVagrwucVZIdGPErwiAppX8KvBuWZgPo+rQLVrtH8S+pw1dbUwjcE6d7og==", "dev": true, "engines": { "node": ">=14.0.0" @@ -5707,9 +5707,9 @@ } }, "node_modules/@storybook/instrumenter": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.2.6.tgz", - "integrity": "sha512-RxtpcMTUSq8/wPM6cR6EXVrPEiNuRbC71cIFVFZagOFYvnnOKwSPV+GOLPK0wxMbGB4c5/+Xe8ADefmZTvxOsA==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/instrumenter/-/instrumenter-8.2.7.tgz", + "integrity": "sha512-Zm6Ty4uWFTNchKUviuJ9vfcMb7+qU8eyrFXVY80XRpr62JEWkYj4eCwx4OG8GzlQahTh9aSv9+hzV6p/5Ld4mw==", "dev": true, "dependencies": { "@storybook/global": "^5.0.0", @@ -5721,20 +5721,20 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/manager-api": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.2.6.tgz", - "integrity": "sha512-uv36h/b5RhlajWtEg4cVPBYV8gZs6juux0nIE+6G9i7vt8Ild6gM9tW1KNabgZcaHFiyWJYCNWxJZoKjgUmXDg==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-8.2.7.tgz", + "integrity": "sha512-BXjz6eNl1GyFcMwzRQTIokslcIY71AYblJUscPcy03X93oqI0GjFVa1xuSMwYw/oXWn7SHhKmqtqEG19lvBGRQ==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/node-logger": { @@ -5748,22 +5748,22 @@ } }, "node_modules/@storybook/preview-api": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.2.6.tgz", - "integrity": "sha512-5vTj2ndX5ng4nDntZYe+r8UwLjCIGFymhq5/r2adAvRKL+Bo4zQDWGO7bhvGJk16do2THb2JvPz49ComW9LLZw==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-8.2.7.tgz", + "integrity": "sha512-lNZBTjZaYNSwBY8dEcDZdkOBvq1/JoVWpuvqDEKvGmp5usTe77xAOwGyncEb96Cx1BbXXkMiDrqbV5G23PFRYA==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/react-dom-shim": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.2.6.tgz", - "integrity": "sha512-B+x8UAEQPDp1yhN3tMh09NvSL38QNfJB7PAyLgKrfE7xIAzvewq+RLW2DfGkoZCy+Zr7QSHm1p7NOgud8+sQCg==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-8.2.7.tgz", + "integrity": "sha512-9VI+NrC09DAr0QQZsFmU5Fd9eqdJp/1AHK+sm9BOZretGGGJwn22xS7UXhHIiFpfXJQnr3TNcYWRzXFyuaE/Sw==", "dev": true, "funding": { "type": "opencollective", @@ -5772,17 +5772,17 @@ "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta", - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/test": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.2.6.tgz", - "integrity": "sha512-nTzNxReBcMRlX1+8PNU/MuA9ArFbeQhfZXMBIwJJoHOhnNe1knYpyn1++xINxAHKOh0BBhQ0NIMoKdcGmW3V6w==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/test/-/test-8.2.7.tgz", + "integrity": "sha512-7xypGR0zjJaM5MkxIz513SYiGs5vDJZL1bbkG1YKeBMff+ZRpa8y8VDYn/WDWuDw76KcFEXoPsPzKwktGhvnpw==", "dev": true, "dependencies": { "@storybook/csf": "0.1.11", - "@storybook/instrumenter": "8.2.6", + "@storybook/instrumenter": "8.2.7", "@testing-library/dom": "10.1.0", "@testing-library/jest-dom": "6.4.5", "@testing-library/user-event": "14.5.2", @@ -5795,13 +5795,13 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/test-runner": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/@storybook/test-runner/-/test-runner-0.19.0.tgz", - "integrity": "sha512-7bA+hUcIYM1j8IcWE43FaUoTRXeYsISQycQFSztZwbcx9mSAEWDbiVfuwl6G7R71nK2hfNgKO5VjEBeVDsnWcw==", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@storybook/test-runner/-/test-runner-0.19.1.tgz", + "integrity": "sha512-Nc4djXw3Lv3AAXg6TJ7yVTeuMryjMsTDd8GCbE/PStU602rpe8syEqElz78GPoJqB1VYWQ3T9pcu93MKyHT+xQ==", "dev": true, "dependencies": { "@babel/core": "^7.22.5", @@ -5810,7 +5810,7 @@ "@babel/types": "^7.22.5", "@jest/types": "^29.6.3", "@storybook/core-common": "^8.0.0", - "@storybook/csf": "^0.1.2", + "@storybook/csf": "^0.1.11", "@storybook/csf-tools": "^8.0.0", "@storybook/preview-api": "^8.0.0", "@swc/core": "^1.5.22", @@ -5885,16 +5885,16 @@ } }, "node_modules/@storybook/theming": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.2.6.tgz", - "integrity": "sha512-ICnYuLIVsYifVCMQljdHgrp+5vAquNybHxDGWiPeOxBicotwHF8rLhTckD2CdVQbMp0jk6r6jetvjXbFJ2MbvQ==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/theming/-/theming-8.2.7.tgz", + "integrity": "sha512-+iqm0GfRkshrjjNSOzwl7AD2m+LtJGXJCr93ke1huDK497WUKbX1hbbw51h5E1tEkx0c2wIqUlaqCM+7XMYcpw==", "dev": true, "funding": { "type": "opencollective", "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6" + "storybook": "^8.2.7" } }, "node_modules/@storybook/types": { @@ -5913,16 +5913,16 @@ } }, "node_modules/@storybook/vue3": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/vue3/-/vue3-8.2.6.tgz", - "integrity": "sha512-j4gMuWc1ZDzqWSdf79YswcZmcbhmbByq/6upqxwqXtjv1mHAiBnEs8bbnnylDrzg4GOvBC8w+FjArkzlFA7uXg==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/vue3/-/vue3-8.2.7.tgz", + "integrity": "sha512-97taiw9eVRiazE0tKM7pd3PTxpmx0e+dlgKBk67fNY7LRfoSxQKb0hFGMjzD1CWpKhTzFhwRwJsHFcyheI8KgQ==", "dev": true, "dependencies": { - "@storybook/components": "^8.2.6", + "@storybook/components": "^8.2.7", "@storybook/global": "^5.0.0", - "@storybook/manager-api": "^8.2.6", - "@storybook/preview-api": "^8.2.6", - "@storybook/theming": "^8.2.6", + "@storybook/manager-api": "^8.2.7", + "@storybook/preview-api": "^8.2.7", + "@storybook/theming": "^8.2.7", "@vue/compiler-core": "^3.0.0", "lodash": "^4.17.21", "ts-dedent": "^2.0.0", @@ -5937,18 +5937,18 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6", + "storybook": "^8.2.7", "vue": "^3.0.0" } }, "node_modules/@storybook/vue3-vite": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/@storybook/vue3-vite/-/vue3-vite-8.2.6.tgz", - "integrity": "sha512-dkRe8GrGlNAHVDGo57VV2Aewfc3kOt4W/PN7vMPaCbIPLplkSVHUK/iQAcsI3tAoWjPYGomfgOwPMQfMzgXQAg==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/@storybook/vue3-vite/-/vue3-vite-8.2.7.tgz", + "integrity": "sha512-UzZZ04q2IGSVg88mOduLb9DjerKePYOxSmmPgO42eLxm9pQAQLTumfT4aacDTHt9OGlIwizonHbH43yrY1ZisQ==", "dev": true, "dependencies": { - "@storybook/builder-vite": "8.2.6", - "@storybook/vue3": "8.2.6", + "@storybook/builder-vite": "8.2.7", + "@storybook/vue3": "8.2.7", "find-package-json": "^1.2.0", "magic-string": "^0.30.0", "typescript": "^5.0.0", @@ -5963,7 +5963,7 @@ "url": "https://opencollective.com/storybook" }, "peerDependencies": { - "storybook": "^8.2.6", + "storybook": "^8.2.7", "vite": "^4.0.0 || ^5.0.0" } }, @@ -12308,9 +12308,9 @@ "dev": true }, "node_modules/flow-parser": { - "version": "0.241.0", - "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.241.0.tgz", - "integrity": "sha512-82yKXpz7iWknWFsognZUf5a6mBQLnVrYoYSU9Nbu7FTOpKlu3v9ehpiI9mYXuaIO3J0ojX1b83M/InXvld9HUw==", + "version": "0.242.1", + "resolved": "https://registry.npmjs.org/flow-parser/-/flow-parser-0.242.1.tgz", + "integrity": "sha512-E3ml21Q1S5cMAyPbtYslkvI6yZO5oCS/S2EoteeFH8Kx9iKOv/YOJ+dGd/yMf+H3YKfhMKjnOpyNwrO7NdddWA==", "dev": true, "engines": { "node": ">=0.4.0" @@ -19447,15 +19447,15 @@ "dev": true }, "node_modules/storybook": { - "version": "8.2.6", - "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.2.6.tgz", - "integrity": "sha512-8j30wDxQmkcqI0fWcSYFsUCjErsY1yTWbTW+yjbwM8DyW18Cud6CwbFRCxjFsH+2M0CjP6Pqs/m1PGI0vcQscQ==", + "version": "8.2.7", + "resolved": "https://registry.npmjs.org/storybook/-/storybook-8.2.7.tgz", + "integrity": "sha512-Jb9DXue1sr3tKkpuq66VP5ItOKTpxL6t99ze1wXDbjCvPiInTdPA5AyFEjBuKjOBIh28bayYoOZa6/xbMJV+Wg==", "dev": true, "dependencies": { "@babel/core": "^7.24.4", "@babel/types": "^7.24.0", - "@storybook/codemod": "8.2.6", - "@storybook/core": "8.2.6", + "@storybook/codemod": "8.2.7", + "@storybook/core": "8.2.7", "@types/semver": "^7.3.4", "@yarnpkg/fslib": "2.10.3", "@yarnpkg/libzip": "2.3.0", @@ -20275,7 +20275,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } diff --git a/package.json b/package.json index 828ced95d3..276b3d9169 100644 --- a/package.json +++ b/package.json @@ -70,19 +70,19 @@ "dmg-license": "1.0.11" }, "devDependencies": { - "@chromatic-com/storybook": "1.5.0", + "@chromatic-com/storybook": "1.6.1", "@openapitools/openapi-generator-cli": "2.13.4", "@playwright/test": "1.43.1", "@quasar/vite-plugin": "1.6.0", - "@storybook/addon-essentials": "8.2.6", - "@storybook/addon-interactions": "8.2.6", - "@storybook/addon-links": "8.2.6", - "@storybook/blocks": "8.2.6", - "@storybook/builder-vite": "8.2.6", - "@storybook/test": "8.2.6", - "@storybook/test-runner": "0.19.0", - "@storybook/vue3": "8.2.6", - "@storybook/vue3-vite": "8.2.6", + "@storybook/addon-essentials": "8.2.7", + "@storybook/addon-interactions": "8.2.7", + "@storybook/addon-links": "8.2.7", + "@storybook/blocks": "8.2.7", + "@storybook/builder-vite": "8.2.7", + "@storybook/test": "8.2.7", + "@storybook/test-runner": "0.19.1", + "@storybook/vue3": "8.2.7", + "@storybook/vue3-vite": "8.2.7", "@types/async-lock": "1.4.0", "@types/encoding-japanese": "1.0.18", "@types/glob": "8.0.0", @@ -119,7 +119,7 @@ "markdownlint-cli": "0.37.0", "prettier": "3.2.5", "sass": "1.32.13", - "storybook": "8.2.6", + "storybook": "8.2.7", "ts-node": "10.9.1", "typescript": "5.5.2", "vite": "5.3.2", From 4d165169d8e2a6b40a78b58440cb855c25a72310 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sun, 4 Aug 2024 00:45:22 +0900 Subject: [PATCH 10/17] typo --- src/mock/engineMock/index.ts | 8 ++++---- src/mock/engineMock/talkModelMock.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/mock/engineMock/index.ts b/src/mock/engineMock/index.ts index 7c23b1de31..d7dabda300 100644 --- a/src/mock/engineMock/index.ts +++ b/src/mock/engineMock/index.ts @@ -1,8 +1,8 @@ import kuromoji, { IpadicFeatures, Tokenizer } from "kuromoji"; import { getEngineManifestMock } from "./manifestMock"; import { - replaseLengthMock, - replasePitchMock, + replaceLengthMock, + replacePitchMock, tokensToActtentPhrasesMock, } from "./talkModelMock"; import { getSpeakerInfoMock, getSpeakersMock } from "./speakerResourceMock"; @@ -126,8 +126,8 @@ export function createOpenAPIEngineMock(): IEngineConnectorFactory { async moraDataMoraDataPost( payload: MoraDataMoraDataPostRequest, ): Promise { - replaseLengthMock(payload.accentPhrase, payload.speaker); - replasePitchMock(payload.accentPhrase, payload.speaker); + replaceLengthMock(payload.accentPhrase, payload.speaker); + replacePitchMock(payload.accentPhrase, payload.speaker); return payload.accentPhrase; }, }; diff --git a/src/mock/engineMock/talkModelMock.ts b/src/mock/engineMock/talkModelMock.ts index 9726896060..3571959eb4 100644 --- a/src/mock/engineMock/talkModelMock.ts +++ b/src/mock/engineMock/talkModelMock.ts @@ -58,7 +58,7 @@ function textToAccentPhraseMock(text: string): AccentPhrase { * アクセント句内のモーラの長さを適当に代入する。 * 最後のモーラだけ長くする。 */ -export function replaseLengthMock( +export function replaceLengthMock( accentPhrases: AccentPhrase[], speaker: number, ) { @@ -93,7 +93,7 @@ export function replaseLengthMock( * アクセント句内のモーラのピッチを適当に代入する。 * アクセント位置のモーラだけ高くする。 */ -export function replasePitchMock( +export function replacePitchMock( accentPhrases: AccentPhrase[], speaker: number, ) { @@ -185,8 +185,8 @@ export function tokensToActtentPhrasesMock( } // 長さとピッチを代入 - replaseLengthMock(accentPhrases, speaker); - replasePitchMock(accentPhrases, speaker); + replaceLengthMock(accentPhrases, speaker); + replacePitchMock(accentPhrases, speaker); return accentPhrases; } From aa3820096fe1fc8921b0754ba51921934ac51224 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sun, 4 Aug 2024 01:00:33 +0900 Subject: [PATCH 11/17] =?UTF-8?q?=E3=81=84=E3=82=89=E3=81=AA=E3=81=8B?= =?UTF-8?q?=E3=81=A3=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Talk/TalkEditor.stories.ts | 3 +-- tests/unit/components/Talk/TalkEditor.spec.ts | 10 ---------- 2 files changed, 1 insertion(+), 12 deletions(-) delete mode 100644 tests/unit/components/Talk/TalkEditor.spec.ts diff --git a/src/components/Talk/TalkEditor.stories.ts b/src/components/Talk/TalkEditor.stories.ts index 2ebb3361e8..c51d461605 100644 --- a/src/components/Talk/TalkEditor.stories.ts +++ b/src/components/Talk/TalkEditor.stories.ts @@ -1,5 +1,4 @@ import { userEvent, within, expect, fn, waitFor } from "@storybook/test"; -import hotkeys from "hotkeys-js"; import { Meta, StoryObj } from "@storybook/vue3"; import { provide, toRaw } from "vue"; @@ -157,7 +156,7 @@ export const NowLoading: Story = { export const TextInput: Story = { name: "テキスト入力のテスト", play: async ({ context, canvasElement, parameters }) => { - await Default.play(context); + await Default.play?.(context); const canvas = within(canvasElement); diff --git a/tests/unit/components/Talk/TalkEditor.spec.ts b/tests/unit/components/Talk/TalkEditor.spec.ts deleted file mode 100644 index 4e417e7d18..0000000000 --- a/tests/unit/components/Talk/TalkEditor.spec.ts +++ /dev/null @@ -1,10 +0,0 @@ -import { composeStories } from "@storybook/vue3"; - -import * as Stories from "@/components/Talk/TalkEditor.stories"; - -const { TextInput } = composeStories(Stories); - -it("Tests invalid form state", { timeout: 60000 }, async () => { - await TextInput.play(); - console.log(TextInput.parameters); -}); From 36382bdd090c253bf31ac61b13c163be143dc92e Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sun, 4 Aug 2024 01:32:13 +0900 Subject: [PATCH 12/17] ThemeConf[] --- src/type/ipc.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/type/ipc.ts b/src/type/ipc.ts index a001870444..f9b02a5983 100644 --- a/src/type/ipc.ts +++ b/src/type/ipc.ts @@ -4,7 +4,7 @@ import { EngineInfo, EngineDirValidationResult, HotkeySettingType, - ThemeSetting, + ThemeConf, ToolbarSettingType, UpdateInfo, NativeThemeType, @@ -246,7 +246,7 @@ export type IpcIHData = { GET_AVAILABLE_THEMES: { args: []; - return: ThemeSetting; + return: ThemeConf[]; }; ON_VUEX_READY: { From 1240838db7b660db03647092a2938ee956884670 Mon Sep 17 00:00:00 2001 From: Hiroshiba Kazuyuki Date: Sat, 10 Aug 2024 22:11:41 +0900 Subject: [PATCH 13/17] =?UTF-8?q?=E3=83=88=E3=83=BC=E3=82=AF=E9=9F=B3?= =?UTF-8?q?=E5=A3=B0=E3=82=92=E5=86=8D=E7=94=9F=E3=81=A7=E3=81=8D=E3=82=8B?= =?UTF-8?q?=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 22 +- src/components/Talk/AudioDetail.vue | 2 + src/components/Talk/TalkEditor.stories.ts | 20 +- src/mock/engineMock/audioQueryMock.ts | 195 +++++++++++++++ src/mock/engineMock/index.ts | 37 ++- src/mock/engineMock/speakerResourceMock.ts | 2 +- src/mock/engineMock/synthesisMock.ts | 276 +++++++++++++++++++++ src/mock/engineMock/talkModelMock.ts | 9 +- src/mock/engineMock/test.stories.ts | 19 +- src/sing/convertToWavFileData.ts | 11 +- 10 files changed, 564 insertions(+), 29 deletions(-) create mode 100644 src/mock/engineMock/audioQueryMock.ts create mode 100644 src/mock/engineMock/synthesisMock.ts diff --git a/package-lock.json b/package-lock.json index 22559eaae4..7475b06cea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -39,19 +39,19 @@ "zod": "3.22.4" }, "devDependencies": { - "@chromatic-com/storybook": "^1.6.1", + "@chromatic-com/storybook": "1.6.1", "@openapitools/openapi-generator-cli": "2.13.4", "@playwright/test": "1.43.1", "@quasar/vite-plugin": "1.6.0", - "@storybook/addon-essentials": "^8.2.7", - "@storybook/addon-interactions": "^8.2.7", - "@storybook/addon-links": "^8.2.7", - "@storybook/blocks": "^8.2.7", - "@storybook/builder-vite": "^8.2.7", - "@storybook/test": "^8.2.7", - "@storybook/test-runner": "^0.19.1", - "@storybook/vue3": "^8.2.7", - "@storybook/vue3-vite": "^8.2.7", + "@storybook/addon-essentials": "8.2.7", + "@storybook/addon-interactions": "8.2.7", + "@storybook/addon-links": "8.2.7", + "@storybook/blocks": "8.2.7", + "@storybook/builder-vite": "8.2.7", + "@storybook/test": "8.2.7", + "@storybook/test-runner": "0.19.1", + "@storybook/vue3": "8.2.7", + "@storybook/vue3-vite": "8.2.7", "@types/async-lock": "1.4.0", "@types/encoding-japanese": "1.0.18", "@types/glob": "8.0.0", @@ -88,7 +88,7 @@ "markdownlint-cli": "0.37.0", "prettier": "3.2.5", "sass": "1.32.13", - "storybook": "^8.2.7", + "storybook": "8.2.7", "ts-node": "10.9.1", "typescript": "5.5.2", "vite": "5.3.2", diff --git a/src/components/Talk/AudioDetail.vue b/src/components/Talk/AudioDetail.vue index 4a3205dab9..c516303e2c 100644 --- a/src/components/Talk/AudioDetail.vue +++ b/src/components/Talk/AudioDetail.vue @@ -24,6 +24,7 @@
= { component: TalkEditor, @@ -57,7 +58,7 @@ const meta: Meta = { // なぜか必要、これがないとdispatch内でcommitしたときにエラーになる store.replaceState({ - ...structuredClone(toRaw(store.state)), + ...cloneWithUnwrapProxy(store.state), }); context.parameters.vuexState = store.state; @@ -82,6 +83,13 @@ const meta: Meta = { store.commit("SET_ENGINE_MANIFESTS", { engineManifests: { [engineId]: engineManifest }, }); + store.commit("SET_ENGINE_SETTING", { + engineId, + engineSetting: { + outputSamplingRate: engineManifest.defaultSamplingRate, + useGpu: false, + }, + }); store.commit("SET_ENGINE_STATE", { engineId, engineState: "READY" }); // キャラクター情報 @@ -153,17 +161,21 @@ export const NowLoading: Story = { }, }; -export const TextInput: Story = { - name: "テキスト入力のテスト", +export const TextInputAndPlay: Story = { + name: "テキスト入力と再生のテスト", play: async ({ context, canvasElement, parameters }) => { await Default.play?.(context); const canvas = within(canvasElement); - // テキスト欄を取得 + // テキスト欄に入力 const textInput = await canvas.findByLabelText("1行目"); await userEvent.type(textInput, "こんにちは、これはテストです。{enter}"); + // 再生 + const playButton = await canvas.findByLabelText("再生"); + await userEvent.click(playButton); + const { audioItems, audioKeys } = parameters.vuexState; await window.storybookTestSnapshot?.({ audioItems, audioKeys }); }, diff --git a/src/mock/engineMock/audioQueryMock.ts b/src/mock/engineMock/audioQueryMock.ts new file mode 100644 index 0000000000..3c35cc81a5 --- /dev/null +++ b/src/mock/engineMock/audioQueryMock.ts @@ -0,0 +1,195 @@ +/** + * AudioQueryとFrameAudioQueryのモック。 + * VOICEVOX ENGINEリポジトリの処理とほぼ同じ。 + */ + +import { AccentPhrase, AudioQuery, FrameAudioQuery, Mora } from "@/openapi"; + +function generateSilenceMora(length: number): Mora { + return { + text: " ", + vowel: "sil", + vowelLength: length, + pitch: 0.0, + }; +} + +function toFlattenMoras(accentPhrases: AccentPhrase[]): Mora[] { + let moras: Mora[] = []; + accentPhrases.forEach((accentPhrase) => { + moras = moras.concat(accentPhrase.moras); + if (accentPhrase.pauseMora) { + moras.push(accentPhrase.pauseMora); + } + }); + return moras; +} + +function toFlattenPhonemes(moras: Mora[]): string[] { + const phonemes: string[] = []; + for (const mora of moras) { + if (mora.consonant) { + phonemes.push(mora.consonant); + } + phonemes.push(mora.vowel); + } + return phonemes; +} + +/** 前後の無音モーラを追加する */ +function applyPrePostSilence(moras: Mora[], query: AudioQuery): Mora[] { + const preSilenceMoras = [generateSilenceMora(query.prePhonemeLength)]; + const postSilenceMoras = [generateSilenceMora(query.postPhonemeLength)]; + return preSilenceMoras.concat(moras).concat(postSilenceMoras); +} + +/** 無音時間を置き換える */ +function applyPauseLength(moras: Mora[], query: AudioQuery): Mora[] { + if (query.pauseLength != undefined) { + for (const mora of moras) { + if (mora.vowel == "pau") { + mora.vowelLength = query.pauseLength; + } + } + } + return moras; +} + +/** 無音時間スケールを適用する */ +function applyPauseLengthScale(moras: Mora[], query: AudioQuery): Mora[] { + if (query.pauseLengthScale != undefined) { + for (const mora of moras) { + if (mora.vowel == "pau") { + mora.vowelLength *= query.pauseLengthScale; + } + } + } + return moras; +} + +/** 話速スケールを適用する */ +function applySpeedScale(moras: Mora[], query: AudioQuery): Mora[] { + for (const mora of moras) { + mora.vowelLength /= query.speedScale; + if (mora.consonantLength) { + mora.consonantLength /= query.speedScale; + } + } + return moras; +} + +/** 音高スケールを適用する */ +function applyPitchScale(moras: Mora[], query: AudioQuery): Mora[] { + for (const mora of moras) { + mora.pitch *= 2 ** query.pitchScale; + } + return moras; +} + +/** 抑揚スケールを適用する */ +function applyIntonationScale(moras: Mora[], query: AudioQuery): Mora[] { + const voiced = moras.filter((mora) => mora.pitch > 0); + if (voiced.length == 0) { + return moras; + } + + const meanF0 = + voiced.reduce((sum, mora) => sum + mora.pitch, 0) / voiced.length; + for (const mora of voiced) { + mora.pitch = (mora.pitch - meanF0) * query.intonationScale + meanF0; + } + return moras; +} + +/** 疑問文の最後に音高の高いモーラを追加する */ +function applyInterrogativeUpspeak(accentPhrases: Array) { + accentPhrases.forEach((accentPhrase) => { + const moras = accentPhrase.moras; + if ( + moras.length > 0 && + accentPhrase.isInterrogative && + moras[moras.length - 1].pitch > 0 + ) { + const lastMora = moras[moras.length - 1]; + const upspeakMora: Mora = { + text: "ー", + vowel: lastMora.vowel, + vowelLength: 0.15, + pitch: lastMora.pitch + 0.3, + }; + accentPhrase.moras.push(upspeakMora); + } + }); +} + +function secondToFrame(second: number): number { + const FRAME_RATE = 24000 / 256; + return Math.round(second * FRAME_RATE); +} + +/** モーラや音素ごとのフレーム数を数える */ +function countFramePerUnit(moras: Mora[]): { + framePerPhoneme: number[]; + framePerMora: number[]; +} { + const framePerPhoneme: number[] = []; + const framePerMora: number[] = []; + + for (const mora of moras) { + const vowelFrames = secondToFrame(mora.vowelLength); + const consonantFrames = mora.consonantLength + ? secondToFrame(mora.consonantLength) + : 0; + const moraFrames = vowelFrames + consonantFrames; + + if (mora.consonant) { + framePerPhoneme.push(consonantFrames); + } + framePerPhoneme.push(vowelFrames); + framePerMora.push(moraFrames); + } + + return { framePerPhoneme, framePerMora }; +} + +/** AudioQueryを適当にFrameAudioQueryに変換する */ +export function audioQueryToFrameAudioQueryMock( + audioQuery: AudioQuery, + { enableInterrogativeUpspeak }: { enableInterrogativeUpspeak: boolean }, +): FrameAudioQuery { + const accentPhrases = audioQuery.accentPhrases; + + if (enableInterrogativeUpspeak) { + applyInterrogativeUpspeak(accentPhrases); + } + + let moras = toFlattenMoras(accentPhrases); + moras = applyPrePostSilence(moras, audioQuery); + moras = applyPauseLength(moras, audioQuery); + moras = applyPauseLengthScale(moras, audioQuery); + moras = applySpeedScale(moras, audioQuery); + moras = applyPitchScale(moras, audioQuery); + moras = applyIntonationScale(moras, audioQuery); + + const { framePerPhoneme, framePerMora } = countFramePerUnit(moras); + + const f0 = moras.flatMap((mora, i) => { + return Array(framePerMora[i]).fill( + mora.pitch == 0 ? 0 : Math.exp(mora.pitch), + ); + }); + const volume = Array(f0.length).fill(1.0); + const phonemes = toFlattenPhonemes(moras).map((phoneme, i) => ({ + phoneme, + frameLength: framePerPhoneme[i], + })); + + return { + f0, + volume, + phonemes, + volumeScale: audioQuery.volumeScale, + outputSamplingRate: audioQuery.outputSamplingRate, + outputStereo: audioQuery.outputStereo, + }; +} diff --git a/src/mock/engineMock/index.ts b/src/mock/engineMock/index.ts index d7dabda300..88ec3ba01f 100644 --- a/src/mock/engineMock/index.ts +++ b/src/mock/engineMock/index.ts @@ -1,11 +1,14 @@ import kuromoji, { IpadicFeatures, Tokenizer } from "kuromoji"; +import { audioQueryToFrameAudioQueryMock } from "./audioQueryMock"; import { getEngineManifestMock } from "./manifestMock"; +import { getSpeakerInfoMock, getSpeakersMock } from "./speakerResourceMock"; +import { synthesisFrameAudioQueryMock } from "./synthesisMock"; import { replaceLengthMock, replacePitchMock, tokensToActtentPhrasesMock, } from "./talkModelMock"; -import { getSpeakerInfoMock, getSpeakersMock } from "./speakerResourceMock"; + import { IEngineConnectorFactory } from "@/infrastructures/EngineConnector"; import { AccentPhrase, @@ -19,7 +22,9 @@ import { SpeakerInfo, SpeakerInfoSpeakerInfoGetRequest, SupportedDevicesInfo, + SynthesisSynthesisPostRequest, } from "@/openapi"; +import { cloneWithUnwrapProxy } from "@/helpers/cloneWithUnwrapProxy"; export const dicPath = "engineMock/dict"; export const assetsPath = "engineMock/assets"; @@ -42,7 +47,10 @@ export function createOpenAPIEngineMock(): IEngineConnectorFactory { .builder({ dicPath, }) - .build(function (err, tokenizer) { + .build(function ( + err: Error, + tokenizer: Tokenizer, + ) { if (err) { reject(err); } else { @@ -103,7 +111,7 @@ export function createOpenAPIEngineMock(): IEngineConnectorFactory { volumeScale: 1.0, prePhonemeLength: 0.1, postPhonemeLength: 0.1, - outputSamplingRate: 24000, + outputSamplingRate: 8000, outputStereo: false, }; }, @@ -126,9 +134,26 @@ export function createOpenAPIEngineMock(): IEngineConnectorFactory { async moraDataMoraDataPost( payload: MoraDataMoraDataPostRequest, ): Promise { - replaceLengthMock(payload.accentPhrase, payload.speaker); - replacePitchMock(payload.accentPhrase, payload.speaker); - return payload.accentPhrase; + const accentPhrase = cloneWithUnwrapProxy(payload.accentPhrase); + replaceLengthMock(accentPhrase, payload.speaker); + replacePitchMock(accentPhrase, payload.speaker); + return accentPhrase; + }, + + async synthesisSynthesisPost( + payload: SynthesisSynthesisPostRequest, + ): Promise { + const frameAudioQuery = audioQueryToFrameAudioQueryMock( + payload.audioQuery, + { + enableInterrogativeUpspeak: + payload.enableInterrogativeUpspeak ?? false, + }, + ); + return synthesisFrameAudioQueryMock( + frameAudioQuery, + payload.speaker, + ); }, }; } diff --git a/src/mock/engineMock/speakerResourceMock.ts b/src/mock/engineMock/speakerResourceMock.ts index 8f979825ce..2da72cb702 100644 --- a/src/mock/engineMock/speakerResourceMock.ts +++ b/src/mock/engineMock/speakerResourceMock.ts @@ -1,6 +1,6 @@ /** * 話者情報を作るモック。 - * なんとなくENGINEのモックと揃えている。 + * なんとなくVOICEVOX ENGINEリポジトリのモック実装と揃えている。 */ import { Speaker, SpeakerInfo } from "@/openapi"; diff --git a/src/mock/engineMock/synthesisMock.ts b/src/mock/engineMock/synthesisMock.ts new file mode 100644 index 0000000000..32eea26f76 --- /dev/null +++ b/src/mock/engineMock/synthesisMock.ts @@ -0,0 +1,276 @@ +/** + * 音声合成するモック。 + * 音高と音量はそれっぽいが、音素は適当。 + */ + +import { FrameAudioQuery } from "@/openapi"; +import { convertToWavFileData } from "@/sing/convertToWavFileData"; +import { applyGaussianFilter } from "@/sing/utility"; + +/** 0~1を返す疑似乱数 */ +function Random(seed: number = 0) { + // 線形合同法 + const a = 1664525; + const c = 1013904223; + const m = 2 ** 31; + + return () => { + seed = (a * seed + c) % m; + return seed / m; + }; +} + +/** 波形の種類 */ +const waveTypes = ["sine", "square", "noise", "silence"] as const; +type WaveType = (typeof waveTypes)[number]; + +/** サイン波などを生成する */ +function generateWave( + f0: Array, + frameRate: number, + sampleRate: number, + type: WaveType, +) { + const duration = f0.length / frameRate; + const samplesPerOriginal = sampleRate / frameRate; + const wave = new Float32Array(sampleRate * duration); + + const seed = Math.round(f0.reduce((acc, freq) => acc + freq, 0)) % 2 ** 31; // そこそこ被らないシード値 + const random = Random(seed); + let phase = 0; + for (let frameIndex = 0; frameIndex < f0.length; frameIndex++) { + const freq = f0[frameIndex]; + const omega = (2 * Math.PI * freq) / sampleRate; + + for (let i = 0; i < samplesPerOriginal; i++) { + const sampleIndex = frameIndex * samplesPerOriginal + i; + switch (type) { + case "sine": + wave[sampleIndex] = Math.sin(phase); + break; + case "square": + wave[sampleIndex] = (phase / Math.PI) % 2 < 1 ? 1 : -1; + break; + case "noise": + wave[sampleIndex] = random() * 2 - 1; + break; + case "silence": + wave[sampleIndex] = 0; + break; + } + + phase += omega; + if (phase > 2 * Math.PI) { + phase -= 2 * Math.PI; + } + } + } + + return wave; +} + +/*子音一覧 + "b", + "by", + "ch", + "d", + "dy", + "f", + "g", + "gw", + "gy", + "h", + "hy", + "j", + "k", + "kw", + "ky", + "m", + "my", + "n", + "ny", + "p", + "py", + "r", + "ry", + "s", + "sh", + "t", + "ts", + "ty", + "v", + "w", + "y", + "z", +*/ + +/** + * 音素ごとの特徴。 + * FIXME: できるならデバッグしやすいようそれっぽい音に近づけたい。 + */ +const phonemeFeatures = { + 有声母音: ["a", "i", "u", "e", "o", "N"], + 無声母音: ["A", "I", "U", "E", "O"], + 無音: ["sil", "pau", "cl"], + 有声子音: [ + "b", + "by", + "d", + "dy", + "g", + "gw", + "gy", + "j", + "m", + "my", + "n", + "ny", + "r", + "ry", + "v", + "w", + "y", + "z", + ], + 無声子音: [ + "ch", + "f", + "h", + "hy", + "k", + "kw", + "ky", + "p", + "py", + "s", + "sh", + "t", + "ts", + "ty", + ], +}; + +/** 音素ごとの波形の配合率を適当に決める */ +function getWaveRate(phoneme: string): { [key in WaveType]: number } { + const waveRate: { [key in WaveType]: number } = { + sine: 0, + square: 0, + noise: 0, + silence: 0, + }; + + // 無音ならほぼ無音 + if (phonemeFeatures.無音.includes(phoneme)) { + const index = phonemeFeatures.無音.indexOf(phoneme); + waveRate.noise = ((index + 1) % 30) / 30; + return waveRate; + } + + // 有声母音ならノイズなし + if (phonemeFeatures.有声母音.includes(phoneme)) { + const rate = + phonemeFeatures.有声母音.indexOf(phoneme) / + (phonemeFeatures.有声母音.length - 1); + waveRate.sine = 1 - rate; + waveRate.square = rate; + return waveRate; + } + + // 無声母音ならノイズ多め + if (phonemeFeatures.無声母音.includes(phoneme)) { + const rate = + phonemeFeatures.無声母音.indexOf(phoneme) / + (phonemeFeatures.無声母音.length - 1); + waveRate.sine = (1 - rate) * 0.1; + waveRate.square = rate * 0.1; + waveRate.noise = 0.3; + return waveRate; + } + + // 有声子音ならノイズ少なめ + if (phonemeFeatures.有声子音.includes(phoneme)) { + const rate = + phonemeFeatures.有声子音.indexOf(phoneme) / + (phonemeFeatures.有声子音.length - 1); + waveRate.sine = (1 - rate) * 0.7; + waveRate.square = rate * 0.7; + waveRate.noise = 0.2; + return waveRate; + } + + // 無声子音ならノイズ多めで音量小さい + if (phonemeFeatures.無声子音.includes(phoneme)) { + const rate = + phonemeFeatures.無声子音.indexOf(phoneme) / + (phonemeFeatures.無声子音.length - 1); + waveRate.sine = (1 - rate) * 0.1; + waveRate.square = rate * 0.1; + waveRate.noise = 0.1; + return waveRate; + } + + throw new Error(`未対応の音素: ${phoneme}`); +} + +/** + * FrameAudioQueryから適当に音声合成する。 + * いろんな波形を作り、音素ごとに波形の配合率を変える。 + */ +export function synthesisFrameAudioQueryMock( + frameAudioQuery: FrameAudioQuery, + speaker: number, +): Blob { + const sampleRate = frameAudioQuery.outputSamplingRate; + const samplePerFrame = 256; + const frameRate = sampleRate / samplePerFrame; + + const waves: { [key in WaveType]: Float32Array } = { + sine: generateWave(frameAudioQuery.f0, frameRate, sampleRate, "sine"), + square: generateWave(frameAudioQuery.f0, frameRate, sampleRate, "square"), + noise: generateWave(frameAudioQuery.f0, frameRate, sampleRate, "noise"), + silence: generateWave(frameAudioQuery.f0, frameRate, sampleRate, "silence"), + }; + + // フレームごとの配分率 + const waveRatesPerFrame = frameAudioQuery.phonemes.flatMap((phoneme) => { + const waveRate = getWaveRate(phoneme.phoneme); + return Array<{ [key in WaveType]: number }>(phoneme.frameLength).fill( + waveRate, + ); + }); + + // サンプルごとの配分率 + // 耳が痛くならないように10msほどの移動平均を取る + const calcWaveRate = (type: WaveType) => { + const waveRate = waveRatesPerFrame.flatMap((o) => + Array(samplePerFrame).fill(o[type]), + ); + applyGaussianFilter(waveRate, (sampleRate * 0.01) / 3); + return waveRate; + }; + const waveRates = Object.fromEntries( + waveTypes.map((type) => [type, calcWaveRate(type)]), + ) as { [key in WaveType]: number[] }; + + // 波形を合成。 + // 念の為に-1~1に丸め、音量を1/10にする。 + // 話者ごとに同じにならないように適当に値をずらす + const wave = new Float32Array(frameAudioQuery.f0.length * samplePerFrame); + for (let i = 0; i < wave.length; i++) { + let sample = waveTypes.reduce((acc, type) => { + return acc + waves[type][i] * waveRates[type][i]; + }, 0); + sample += (speaker % 977) / 977 / 20; // 977は適当な素数 + wave[i] = Math.min(Math.max(sample, -1), 1) / 10; + } + + // Blobに変換 + const numberOfChannels = frameAudioQuery.outputStereo ? 2 : 1; + const buffer = convertToWavFileData({ + sampleRate, + length: wave.length, + numberOfChannels, + getChannelData: () => wave, + }); + return new Blob([buffer], { type: "audio/wav" }); +} diff --git a/src/mock/engineMock/talkModelMock.ts b/src/mock/engineMock/talkModelMock.ts index 3571959eb4..77f8549534 100644 --- a/src/mock/engineMock/talkModelMock.ts +++ b/src/mock/engineMock/talkModelMock.ts @@ -15,12 +15,12 @@ function alphabetsToNumber(text: string): number { return (sum % 256) / 256; } -// 0.01~0.25になるように適当な長さを決める +/** 0.01~0.25になるように適当な長さを決める */ function phonemeToLengthMock(phoneme: string): number { return alphabetsToNumber(phoneme) * 0.24 + 0.01; } -// 3~5になるように適当なピッチを決める +/** 3~5になるように適当なピッチを決める */ function phonemeToPitchMock(phoneme: string): number { return (1 - alphabetsToNumber(phoneme)) * 2 + 3; } @@ -70,7 +70,8 @@ export function replaceLengthMock( const offset = i == accentPhrase.moras.length - 1 ? 0.05 : 0; if (mora.consonant != undefined) - mora.consonantLength = phonemeToLengthMock(mora.consonant) + offset; + mora.consonantLength = + (phonemeToLengthMock(mora.consonant) + offset) / 5; mora.vowelLength = phonemeToLengthMock(mora.vowel) + offset; } } @@ -144,7 +145,7 @@ export function tokensToActtentPhrasesMock( const accentPhrase = textToAccentPhraseMock(textPhrase); accentPhrase.pauseMora = { text: "、", - vowel: "", + vowel: "pau", vowelLength: 1 - 1 / (accentPhrases.length + 1), pitch: 0, }; diff --git a/src/mock/engineMock/test.stories.ts b/src/mock/engineMock/test.stories.ts index ac89e438e9..07bf077e17 100644 --- a/src/mock/engineMock/test.stories.ts +++ b/src/mock/engineMock/test.stories.ts @@ -12,8 +12,7 @@ const meta: Meta = { export default meta; type Story = StoryObj; -export const OpenOfficialSite: Story = { - name: "公式サイトを開くボタンを押す", +export const AudioQuery: Story = { play: async ({ args }) => { const mockApi = createOpenAPIEngineMock(); const api = mockApi.instance(mockHost); @@ -24,3 +23,19 @@ export const OpenOfficialSite: Story = { console.log(result); }, }; + +export const Synthesis: Story = { + play: async ({ args }) => { + const mockApi = createOpenAPIEngineMock(); + const api = mockApi.instance(mockHost); + const audioQuery = await api.audioQueryAudioQueryPost({ + text: "そうです、そのとおりだと思いますね", + speaker: 1, + }); + const blob = await api.synthesisSynthesisPost({ + audioQuery, + speaker: 1, + }); + console.log(blob); + }, +}; diff --git a/src/sing/convertToWavFileData.ts b/src/sing/convertToWavFileData.ts index 97fc4fa4c9..0a2ab75233 100644 --- a/src/sing/convertToWavFileData.ts +++ b/src/sing/convertToWavFileData.ts @@ -1,4 +1,13 @@ -export const convertToWavFileData = (audioBuffer: AudioBuffer) => { +export const convertToWavFileData = ( + audioBuffer: + | AudioBuffer + | { + sampleRate: number; + length: number; + numberOfChannels: number; + getChannelData(channel: number): Float32Array; + }, +) => { const bytesPerSample = 4; // Float32 const formatCode = 3; // WAVE_FORMAT_IEEE_FLOAT From 4d4524edf28bd47822afc583d4e3605c42e92309 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sun, 11 Aug 2024 01:46:34 +0900 Subject: [PATCH 14/17] =?UTF-8?q?addActionsWithEmits=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .storybook/preview.ts | 1 - .storybook/utils/argTypesEnhancers.ts | 34 ------------------- .../UpdateNotificationDialog/index.stories.ts | 2 ++ 3 files changed, 2 insertions(+), 35 deletions(-) delete mode 100644 .storybook/utils/argTypesEnhancers.ts diff --git a/.storybook/preview.ts b/.storybook/preview.ts index 94a02d104a..64fd72a78c 100644 --- a/.storybook/preview.ts +++ b/.storybook/preview.ts @@ -35,7 +35,6 @@ const preview: Preview = { toc: true, }, }, - argTypesEnhancers: [addActionsWithEmits], beforeEach() { resetMockMode(); diff --git a/.storybook/utils/argTypesEnhancers.ts b/.storybook/utils/argTypesEnhancers.ts deleted file mode 100644 index 8b919bc317..0000000000 --- a/.storybook/utils/argTypesEnhancers.ts +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Vue で emit されるイベントを Storybook の Controls に表示するための argTypesEnhancer - * https://zenn.dev/shota_kamezawa/articles/36cd647264656c#storybook-%E3%81%AE%E8%A8%AD%E5%AE%9A - */ - -import { toHandlerKey } from "vue"; -import { type ArgTypesEnhancer, type StrictInputType } from "@storybook/types"; - -export const addActionsWithEmits: ArgTypesEnhancer = ({ argTypes }) => { - const argTypesEntries = Object.entries(argTypes) - .filter(([, argType]) => argType.table?.category === "events") - .map(([name]) => { - /** - * 例:`click` という events に対して `onClick` という名称の argType + action を追加することで、 - * v-on によるイベントのバインディングが可能となる - * @see https://ja.vuejs.org/guide/extras/render-function.html#v-on - */ - const newName = toHandlerKey(name); - const newArgType: StrictInputType = { - name: newName, - action: name, - table: { - disable: true, // Controls には表示しない - }, - }; - - return [newName, newArgType] as const; - }); - - return { - ...argTypes, - ...Object.fromEntries(argTypesEntries), - }; -}; diff --git a/src/components/Dialog/UpdateNotificationDialog/index.stories.ts b/src/components/Dialog/UpdateNotificationDialog/index.stories.ts index 1432ee437b..bcb75143f4 100644 --- a/src/components/Dialog/UpdateNotificationDialog/index.stories.ts +++ b/src/components/Dialog/UpdateNotificationDialog/index.stories.ts @@ -20,6 +20,8 @@ const meta: Meta = { contributors: ["これは表示されないはず"], }, ], + "onUpdate:modelValue": fn(), + onSkipThisVersionClick: fn(), }, tags: ["!autodocs"], // ダイアログ系はautodocsのプレビューが正しく表示されないので無効化 }; From 518354c968cb76e4256e668f756ba9790e2743d5 Mon Sep 17 00:00:00 2001 From: Hiroshiba Date: Sun, 11 Aug 2024 01:46:42 +0900 Subject: [PATCH 15/17] =?UTF-8?q?snapshot=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/Talk/TalkEditor.stories.ts | 23 +- .../__snapshots__/TalkEditor.stories.ts.snap | 415 +++++++++++++++++- 2 files changed, 419 insertions(+), 19 deletions(-) diff --git a/src/components/Talk/TalkEditor.stories.ts b/src/components/Talk/TalkEditor.stories.ts index 059b19f2f4..cc4f977501 100644 --- a/src/components/Talk/TalkEditor.stories.ts +++ b/src/components/Talk/TalkEditor.stories.ts @@ -161,8 +161,8 @@ export const NowLoading: Story = { }, }; -export const TextInputAndPlay: Story = { - name: "テキスト入力と再生のテスト", +export const TextInput: Story = { + name: "テキスト入力のテスト", play: async ({ context, canvasElement, parameters }) => { await Default.play?.(context); @@ -172,9 +172,22 @@ export const TextInputAndPlay: Story = { const textInput = await canvas.findByLabelText("1行目"); await userEvent.type(textInput, "こんにちは、これはテストです。{enter}"); - // 再生 - const playButton = await canvas.findByLabelText("再生"); - await userEvent.click(playButton); + const { audioItems, audioKeys } = parameters.vuexState; + await window.storybookTestSnapshot?.({ audioItems, audioKeys }); + }, +}; + +export const TextPaste: Story = { + name: "テキストペーストのテスト", + play: async ({ context, canvasElement, parameters }) => { + await Default.play?.(context); + + const canvas = within(canvasElement); + + // テキスト欄に入力 + const textInput = await canvas.findByLabelText("1行目"); + await userEvent.click(textInput); + await userEvent.paste("改行で改行\n読点で改行。最後の読点は改行しない。"); const { audioItems, audioKeys } = parameters.vuexState; await window.storybookTestSnapshot?.({ audioItems, audioKeys }); diff --git a/src/components/Talk/__snapshots__/TalkEditor.stories.ts.snap b/src/components/Talk/__snapshots__/TalkEditor.stories.ts.snap index 582241a182..b57efff39c 100644 --- a/src/components/Talk/__snapshots__/TalkEditor.stories.ts.snap +++ b/src/components/Talk/__snapshots__/TalkEditor.stories.ts.snap @@ -12,7 +12,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` "moras": [ { "consonant": "k", - "consonantLength": 0.1103125, + "consonantLength": 0.0220625, "pitch": 4.7734375, "text": "コ", "vowel": "o", @@ -28,7 +28,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "n", - "consonantLength": 0.11312499999999999, + "consonantLength": 0.022625, "pitch": 4.75, "text": "ニ", "vowel": "i", @@ -36,7 +36,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "ch", - "consonantLength": 0.2003125, + "consonantLength": 0.0400625, "pitch": 4.0234375, "text": "チ", "vowel": "i", @@ -44,7 +44,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "h", - "consonantLength": 0.1575, + "consonantLength": 0.0315, "pitch": 4.796875, "text": "ハ", "vowel": "a", @@ -54,7 +54,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` "pauseMora": { "pitch": 0, "text": "、", - "vowel": "", + "vowel": "pau", "vowelLength": 0, }, }, @@ -63,7 +63,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` "moras": [ { "consonant": "k", - "consonantLength": 0.12031249999999999, + "consonantLength": 0.0320625, "pitch": 4.7834375, "text": "コ", "vowel": "o", @@ -71,7 +71,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "r", - "consonantLength": 0.126875, + "consonantLength": 0.033375, "pitch": 4.72875, "text": "レ", "vowel": "e", @@ -79,7 +79,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "h", - "consonantLength": 0.1675, + "consonantLength": 0.0415, "pitch": 5.106875, "text": "ハ", "vowel": "a", @@ -92,7 +92,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` "moras": [ { "consonant": "t", - "consonantLength": 0.13874999999999998, + "consonantLength": 0.04375, "pitch": 4.723125, "text": "テ", "vowel": "e", @@ -100,7 +100,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "s", - "consonantLength": 0.13781249999999998, + "consonantLength": 0.0435625, "pitch": 4.7309375, "text": "ス", "vowel": "u", @@ -108,7 +108,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "t", - "consonantLength": 0.13874999999999998, + "consonantLength": 0.04375, "pitch": 5.023124999999999, "text": "ト", "vowel": "o", @@ -116,7 +116,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "d", - "consonantLength": 0.12375, + "consonantLength": 0.040749999999999995, "pitch": 4.848125, "text": "デ", "vowel": "e", @@ -124,7 +124,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, { "consonant": "s", - "consonantLength": 0.18781249999999997, + "consonantLength": 0.0535625, "pitch": 4.7309375, "text": "ス", "vowel": "u", @@ -135,7 +135,7 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` }, ], "intonationScale": 1, - "outputSamplingRate": 24000, + "outputSamplingRate": 8000, "outputStereo": false, "pitchScale": 0, "postPhonemeLength": 0.1, @@ -156,3 +156,390 @@ exports[`components/Talk/TalkEditor TextInput play-test 1`] = ` ], } `; + +exports[`components/Talk/TalkEditor TextPaste play-test 1`] = ` +{ + "audioItems": { + "00000000-0000-4000-0000-000000000001": { + "presetKey": undefined, + "query": { + "accentPhrases": [ + { + "accent": 4, + "moras": [ + { + "consonant": "k", + "consonantLength": 0.0220625, + "pitch": 4.7734375, + "text": "カ", + "vowel": "a", + "vowelLength": 0.10093749999999999, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.609375, + "text": "イ", + "vowel": "i", + "vowelLength": 0.10843749999999999, + }, + { + "consonant": "gy", + "consonantLength": 0.044, + "pitch": 3.859375, + "text": "ギョ", + "vowel": "o", + "vowelLength": 0.1140625, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.609375, + "text": "ウ", + "vowel": "u", + "vowelLength": 0.11968749999999999, + }, + { + "consonant": "d", + "consonantLength": 0.03075, + "pitch": 5.128125, + "text": "デ", + "vowel": "e", + "vowelLength": 0.15468749999999998, + }, + ], + }, + { + "accent": 4, + "moras": [ + { + "consonant": "k", + "consonantLength": 0.0320625, + "pitch": 4.7834375, + "text": "カ", + "vowel": "a", + "vowelLength": 0.11093749999999998, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.619375, + "text": "イ", + "vowel": "i", + "vowelLength": 0.11843749999999999, + }, + { + "consonant": "gy", + "consonantLength": 0.054, + "pitch": 3.869375, + "text": "ギョ", + "vowel": "o", + "vowelLength": 0.12406249999999999, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.619375, + "text": "ウ", + "vowel": "u", + "vowelLength": 0.1796875, + }, + ], + "pauseMora": undefined, + }, + ], + "intonationScale": 1, + "outputSamplingRate": 8000, + "outputStereo": false, + "pitchScale": 0, + "postPhonemeLength": 0.1, + "prePhonemeLength": 0.1, + "speedScale": 1, + "volumeScale": 1, + }, + "text": "改行で改行", + "voice": { + "engineId": "c7b58856-bd56-4aa1-afb7-b8415f824b06", + "speakerId": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", + "styleId": 0, + }, + }, + "00000000-0000-4000-0000-000000000003": { + "morphingInfo": undefined, + "presetKey": undefined, + "query": { + "accentPhrases": [ + { + "accent": 2, + "moras": [ + { + "consonant": "t", + "consonantLength": 0.02375, + "pitch": 4.703125, + "text": "ト", + "vowel": "o", + "vowelLength": 0.1140625, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.609375, + "text": "ウ", + "vowel": "u", + "vowelLength": 0.11968749999999999, + }, + { + "consonant": "t", + "consonantLength": 0.02375, + "pitch": 5.003125, + "text": "テ", + "vowel": "e", + "vowelLength": 0.10468749999999999, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.609375, + "text": "ン", + "vowel": "N", + "vowelLength": 0.08312499999999999, + }, + { + "consonant": "d", + "consonantLength": 0.03075, + "pitch": 4.828125, + "text": "デ", + "vowel": "e", + "vowelLength": 0.15468749999999998, + }, + ], + }, + { + "accent": 4, + "moras": [ + { + "consonant": "k", + "consonantLength": 0.0320625, + "pitch": 4.7834375, + "text": "カ", + "vowel": "a", + "vowelLength": 0.11093749999999998, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.619375, + "text": "イ", + "vowel": "i", + "vowelLength": 0.11843749999999999, + }, + { + "consonant": "gy", + "consonantLength": 0.054, + "pitch": 3.869375, + "text": "ギョ", + "vowel": "o", + "vowelLength": 0.12406249999999999, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.619375, + "text": "ウ", + "vowel": "u", + "vowelLength": 0.1796875, + }, + ], + "pauseMora": undefined, + }, + ], + "intonationScale": 1, + "outputSamplingRate": 8000, + "outputStereo": false, + "pitchScale": 0, + "postPhonemeLength": 0.1, + "prePhonemeLength": 0.1, + "speedScale": 1, + "volumeScale": 1, + }, + "text": "読点で改行。", + "voice": { + "engineId": "c7b58856-bd56-4aa1-afb7-b8415f824b06", + "speakerId": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", + "styleId": 0, + }, + }, + "00000000-0000-4000-0000-000000000004": { + "morphingInfo": undefined, + "presetKey": undefined, + "query": { + "accentPhrases": [ + { + "accent": 4, + "moras": [ + { + "consonant": "s", + "consonantLength": 0.023562499999999997, + "pitch": 4.7109375, + "text": "サ", + "vowel": "a", + "vowelLength": 0.10093749999999999, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.609375, + "text": "イ", + "vowel": "i", + "vowelLength": 0.10843749999999999, + }, + { + "consonant": "g", + "consonantLength": 0.021312499999999998, + "pitch": 4.8046875, + "text": "ゴ", + "vowel": "o", + "vowelLength": 0.1140625, + }, + { + "consonant": "n", + "consonantLength": 0.032625, + "pitch": 4.75, + "text": "ノ", + "vowel": "o", + "vowelLength": 0.1640625, + }, + ], + }, + { + "accent": 2, + "moras": [ + { + "consonant": "t", + "consonantLength": 0.03375, + "pitch": 4.713125, + "text": "ト", + "vowel": "o", + "vowelLength": 0.12406249999999999, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.619375, + "text": "ウ", + "vowel": "u", + "vowelLength": 0.12968749999999998, + }, + { + "consonant": "t", + "consonantLength": 0.03375, + "pitch": 5.013125, + "text": "テ", + "vowel": "e", + "vowelLength": 0.11468749999999998, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.619375, + "text": "ン", + "vowel": "N", + "vowelLength": 0.09312499999999999, + }, + { + "consonant": "h", + "consonantLength": 0.0415, + "pitch": 4.806875, + "text": "ハ", + "vowel": "a", + "vowelLength": 0.1609375, + }, + ], + }, + { + "accent": 4, + "moras": [ + { + "consonant": "k", + "consonantLength": 0.0420625, + "pitch": 4.7934375, + "text": "カ", + "vowel": "a", + "vowelLength": 0.12093749999999999, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.629375, + "text": "イ", + "vowel": "i", + "vowelLength": 0.12843749999999998, + }, + { + "consonant": "gy", + "consonantLength": 0.064, + "pitch": 3.879375, + "text": "ギョ", + "vowel": "o", + "vowelLength": 0.1340625, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.629375, + "text": "ウ", + "vowel": "u", + "vowelLength": 0.1396875, + }, + { + "consonant": "sh", + "consonantLength": 0.0630625, + "pitch": 4.218437499999999, + "text": "シ", + "vowel": "i", + "vowelLength": 0.12843749999999998, + }, + { + "consonant": "n", + "consonantLength": 0.042624999999999996, + "pitch": 4.77, + "text": "ナ", + "vowel": "a", + "vowelLength": 0.12093749999999999, + }, + { + "consonant": undefined, + "consonantLength": undefined, + "pitch": 3.629375, + "text": "イ", + "vowel": "i", + "vowelLength": 0.1784375, + }, + ], + "pauseMora": undefined, + }, + ], + "intonationScale": 1, + "outputSamplingRate": 8000, + "outputStereo": false, + "pitchScale": 0, + "postPhonemeLength": 0.1, + "prePhonemeLength": 0.1, + "speedScale": 1, + "volumeScale": 1, + }, + "text": "最後の読点は改行しない。", + "voice": { + "engineId": "c7b58856-bd56-4aa1-afb7-b8415f824b06", + "speakerId": "7ffcb7ce-00ec-4bdc-82cd-45a8889e43ff", + "styleId": 0, + }, + }, + }, + "audioKeys": [ + "00000000-0000-4000-0000-000000000001", + "00000000-0000-4000-0000-000000000003", + "00000000-0000-4000-0000-000000000004", + ], +} +`; From c83f5cbd54ee5ce134a3b7622dc5372c4cd9d55d Mon Sep 17 00:00:00 2001 From: Hiroshiba Kazuyuki Date: Mon, 12 Aug 2024 06:10:46 +0900 Subject: [PATCH 16/17] =?UTF-8?q?=E3=81=A1=E3=82=87=E3=81=A3=E3=81=A8?= =?UTF-8?q?=E5=9E=8B=E8=AA=BF=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/mock/engineMock/audioQueryMock.ts | 10 +++++----- src/mock/engineMock/index.ts | 26 +++++++++++--------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/mock/engineMock/audioQueryMock.ts b/src/mock/engineMock/audioQueryMock.ts index 3c35cc81a5..466405fc0b 100644 --- a/src/mock/engineMock/audioQueryMock.ts +++ b/src/mock/engineMock/audioQueryMock.ts @@ -173,12 +173,12 @@ export function audioQueryToFrameAudioQueryMock( const { framePerPhoneme, framePerMora } = countFramePerUnit(moras); - const f0 = moras.flatMap((mora, i) => { - return Array(framePerMora[i]).fill( + const f0 = moras.flatMap((mora, i) => + Array(framePerMora[i]).fill( mora.pitch == 0 ? 0 : Math.exp(mora.pitch), - ); - }); - const volume = Array(f0.length).fill(1.0); + ), + ); + const volume = Array(f0.length).fill(1.0); const phonemes = toFlattenPhonemes(moras).map((phoneme, i) => ({ phoneme, frameLength: framePerPhoneme[i], diff --git a/src/mock/engineMock/index.ts b/src/mock/engineMock/index.ts index 88ec3ba01f..7ecdb56ccb 100644 --- a/src/mock/engineMock/index.ts +++ b/src/mock/engineMock/index.ts @@ -1,4 +1,4 @@ -import kuromoji, { IpadicFeatures, Tokenizer } from "kuromoji"; +import { builder, IpadicFeatures, Tokenizer } from "kuromoji"; import { audioQueryToFrameAudioQueryMock } from "./audioQueryMock"; import { getEngineManifestMock } from "./manifestMock"; import { getSpeakerInfoMock, getSpeakersMock } from "./speakerResourceMock"; @@ -43,20 +43,16 @@ export function createOpenAPIEngineMock(): IEngineConnectorFactory { // テキスト形態素解析器 const tokenizerPromise = new Promise>( (resolve, reject) => { - kuromoji - .builder({ - dicPath, - }) - .build(function ( - err: Error, - tokenizer: Tokenizer, - ) { - if (err) { - reject(err); - } else { - resolve(tokenizer); - } - }); + builder({ dicPath }).build(function ( + err: Error, + tokenizer: Tokenizer, + ) { + if (err) { + reject(err); + } else { + resolve(tokenizer); + } + }); }, ); From 2009e2dc4fa618d3dfa555e7729ebd68924d77ed Mon Sep 17 00:00:00 2001 From: Hiroshiba Kazuyuki Date: Tue, 13 Aug 2024 04:26:16 +0900 Subject: [PATCH 17/17] stash --- src/mock/engineMock/index.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/mock/engineMock/index.ts b/src/mock/engineMock/index.ts index 7ecdb56ccb..8a3af1a963 100644 --- a/src/mock/engineMock/index.ts +++ b/src/mock/engineMock/index.ts @@ -17,7 +17,9 @@ import { AudioQueryAudioQueryPostRequest, DefaultApiInterface, EngineManifest, + FrameAudioQuery, MoraDataMoraDataPostRequest, + SingFrameAudioQuerySingFrameAudioQueryPostRequest, Speaker, SpeakerInfo, SpeakerInfoSpeakerInfoGetRequest, @@ -151,6 +153,10 @@ export function createOpenAPIEngineMock(): IEngineConnectorFactory { payload.speaker, ); }, + + async singFrameAudioQuerySingFrameAudioQueryPost( + payload: SingFrameAudioQuerySingFrameAudioQueryPostRequest, + ): Promise {}, }; }