diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index e20e449..7178d60 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -2,37 +2,37 @@
name: Automated Tests
on:
- pull_request:
- push:
+ pull_request:
+ push:
jobs:
- build:
- runs-on: ubuntu-latest
- permissions:
- contents: read
+ build:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
- strategy:
- matrix:
- node-version: [24.x]
+ strategy:
+ matrix:
+ node-version: [24.x]
- steps:
- - name: Checkout code
- uses: actions/checkout@v6
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v6
- - name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v6
- with:
- node-version: ${{ matrix.node-version }}
- cache: "npm"
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v6
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: "npm"
- - name: Install dependencies
- run: npm install
+ - name: Install dependencies
+ run: npm install
- - name: Install Playwright dependencies
- run: npx playwright install-deps
+ - name: Install Playwright dependencies
+ run: npx playwright install-deps
- - name: Install Playwright browsers
- run: npx playwright install
+ - name: Install Playwright browsers
+ run: npx playwright install
- - name: Run tests
- run: npm test
+ - name: Run tests
+ run: npm test
diff --git a/.gitignore b/.gitignore
index c9c2a65..fe3a27f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,4 +9,5 @@ node_modules
!.env.example
vite.config.js.timestamp-*
vite.config.ts.timestamp-*
-coverage
\ No newline at end of file
+coverage
+screenshots
\ No newline at end of file
diff --git a/.prettierrc b/.prettierrc
index 0a05892..22ebaaa 100644
--- a/.prettierrc
+++ b/.prettierrc
@@ -1,11 +1,13 @@
{
- "useTabs": true,
- "singleQuote": false,
- "trailingComma": "all",
- "printWidth": 80,
- "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
- "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }],
- "semi": true,
- "bracketSameLine": true,
- "singleAttributePerLine": false
+ "singleQuote": false,
+ "trailingComma": "all",
+ "printWidth": 100,
+ "plugins": ["prettier-plugin-svelte", "prettier-plugin-tailwindcss"],
+ "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }],
+ "semi": true,
+ "bracketSameLine": true,
+ "singleAttributePerLine": false,
+ "svelteIndentScriptAndStyle": true,
+ "svelteAllowShorthand": true,
+ "tabWidth": 4
}
diff --git a/README.md b/README.md
index 78ffa33..bb0bc8c 100644
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ Check it out at: https://text.datapackhub.net/
:eyes: To prove it works, the generated text from the image above is below:
```
-["",{italic:true,text:"so many"}," ",{color:"yellow",text:"cool features!"},"\n- ",{bold:true,text:"bold"},", ",{italic:true,text:"italic"},", ",{strikethrough:true,text:"strikethrough"},", ",{underlined:true,text:"underlined"},", ",{obfuscated:true,text:"obfuscated\n"},"- ",{color:"red",text:"any "},{color:"blue",text:"colours "},"(",{color:"#DD7171",text:"including custom colours"},") and ",{shadow_color:34047,text:"shadow colours"},"\n- ",{underlined:true,text:"",extra:[{color:"#f22f24",text:"c"},{color:"#f23922",text:"r"},{color:"#f24421",text:"e"},{color:"#f34e1f",text:"a"},{color:"#f3581e",text:"t"},{color:"#f3621c",text:"e"},{color:"#f36c1b",text:" "},{color:"#f37719",text:"g"},{color:"#f38118",text:"r"},{color:"#f48b16",text:"a"},{color:"#f49515",text:"d"},{color:"#f49f13",text:"i"},{color:"#f4aa12",text:"e"},{color:"#f4b410",text:"n"},{color:"#f4be0f",text:"t"},{color:"#f4c80d",text:"s"},{color:"#f5d20c",text:" "},{color:"#f5dd0a",text:"t"},{color:"#f5e709",text:"o"},{color:"#f5f107",text:"o!!!"}]},"\n- ",{bold:true,text:"custom sources"}," (",{color:"red",text:"nbt"},", ",{color:"gold",text:"scores"},", ",{color:"yellow",text:"translate keys"},", ",{color:"dark_green",text:"selectors"},", ",{color:"blue",text:"keybinds"},")\n- ",{text:"click events like this",click_event:{action:"open_url",url:"https://text.datapackhub.net/"}},"\n- ",{text:"hover events like this",hover_event:{action:"show_text",value:"i'm a hover event!"}},"\n- export to ",{color:"yellow",underlined:true,text:"json"}," and ",{color:"light_purple",underlined:true,text:"lore item components"}," (as well as normal nbt)\n- ",{color:"light_purple",underlined:true,text:"import from nbt into the editor"},"\n- save and load so you never lose your work\n\n",{color:"yellow",text:"check it out:"}," ",{color:"aqua",underlined:true,text:"https://text.datapackhub.net",click_event:{action:"open_url",url:"https://text.datapackhub.net"}}]
+["",{italic:true,text:"so many "},{color:"yellow",text:"cool features!\n"},"- ",{bold:true,text:"bold"},", ",{italic:true,text:"italic"},", ",{strikethrough:true,text:"strikethrough"},", ",{underlined:true,text:"underlined"},", ",{obfuscated:true,text:"obfuscated\n"},"- ",{color:"red",text:"any "},{color:"blue",text:"colours "},"(",{color:"#DD7171",text:"including custom colours"},") and ",{shadow_color:4283782655L,text:"shadow colours\n"},"- ",{underlined:true,text:"",extra:[{color:"#f22f24",text:"c"},{color:"#f23922",text:"r"},{color:"#f24421",text:"e"},{color:"#f34e1f",text:"a"},{color:"#f3581e",text:"t"},{color:"#f3621c",text:"e "},{color:"#f37719",text:"g"},{color:"#f38118",text:"r"},{color:"#f48b16",text:"a"},{color:"#f49515",text:"d"},{color:"#f49f13",text:"i"},{color:"#f4aa12",text:"e"},{color:"#f4b410",text:"n"},{color:"#f4be0f",text:"t"},{color:"#f4c80d",text:"s "},{color:"#f5dd0a",text:"t"},{color:"#f5e709",text:"o"},{color:"#f5f107",text:"o!!!"}]},"\n- ",{bold:true,text:"custom sources"}," (",{color:"red",text:"nbt"},", ",{color:"gold",text:"scores"},", ",{color:"yellow",text:"translate keys"},", ",{color:"dark_green",text:"selectors"},", ",{color:"blue",text:"keybinds"},")\n- ",{text:"click events like this\n",click_event:{action:"open_url",url:"https://text.datapackhub.net/"}},"- ",{text:"hover events like this\n",hover_event:{action:"show_text",value:"i'm a hover event!"}},"- export to ",{color:"yellow",underlined:true,text:"json"}," and ",{color:"light_purple",underlined:true,text:"lore item components"}," (as well as normal nbt)\n- ",{color:"light_purple",underlined:true,text:"import from nbt into the editor\n"},"- save and load so you never lose your work\n\n",{color:"yellow",text:"check it out: "},{color:"aqua",underlined:true,text:"https://text.datapackhub.net",click_event:{action:"open_url",url:"https://text.datapackhub.net"}}]
```
## Bugs and feature requests
diff --git a/bun.lock b/bun.lock
index 5f385ba..6d719ef 100644
--- a/bun.lock
+++ b/bun.lock
@@ -1,54 +1,49 @@
{
"lockfileVersion": 1,
- "configVersion": 0,
+ "configVersion": 1,
"workspaces": {
"": {
"name": "tools",
"dependencies": {
- "@tiptap/core": "^3.27.4",
- "@tiptap/extension-placeholder": "^3.27.4",
- "@tiptap/pm": "^3.27.4",
- "@tiptap/starter-kit": "^3.27.4",
- "bits-ui": "^2.18.1",
- "html2canvas-pro": "^2.2.4",
+ "@tiptap/core": "^3.29.2",
+ "@tiptap/extension-color": "^3.29.2",
+ "@tiptap/extension-font-family": "^3.29.2",
+ "@tiptap/extension-placeholder": "^3.29.2",
+ "@tiptap/extension-text-style": "^3.29.2",
+ "@tiptap/pm": "^3.29.2",
+ "@tiptap/starter-kit": "^3.29.2",
"idb": "^8.0.3",
+ "modern-screenshot": "^4.7.0",
"svelte-awesome-color-picker": "^4.1.3",
- "svelte-highlight": "^7.11.0",
+ "svelte-highlight": "^7.16.2",
"tippy.js": "^6.3.7",
"typescript-color-gradient": "^4.2.0",
},
"devDependencies": {
- "@iconify-json/tabler": "^1.2.35",
- "@playwright/test": "^1.61.1",
+ "@iconify-json/tabler": "^1.2.38",
+ "@playwright/test": "^1.62.1",
"@sveltejs/adapter-auto": "^7.0.1",
- "@sveltejs/kit": "^2.69.3",
+ "@sveltejs/kit": "^2.70.2",
"@sveltejs/vite-plugin-svelte": "^7.2.0",
- "@tailwindcss/vite": "^4.3.2",
- "@testing-library/jest-dom": "^6.9.1",
- "@testing-library/svelte": "^5.4.2",
- "@tiptap/extension-color": "^3.27.4",
- "@tiptap/extension-font-family": "^3.27.4",
- "@tiptap/extension-text-style": "^3.27.4",
- "@types/node": "^26.1.1",
+ "@tailwindcss/vite": "^4.3.3",
+ "@types/node": "^26.1.2",
+ "@vitest/coverage-v8": "4.1.10",
"file-type": "^22.0.1",
- "jsdom": "^29.1.1",
- "oxlint": "^1.74.0",
- "prettier": "^3.9.5",
+ "oxlint": "^1.77.0",
+ "prettier": "^3.9.6",
"prettier-plugin-svelte": "^4.1.1",
- "prettier-plugin-tailwindcss": "^0.8.0",
- "svelte": "^5.56.5",
- "svelte-check": "^4.7.2",
- "tailwindcss": "^4.3.2",
+ "prettier-plugin-tailwindcss": "^0.8.1",
+ "svelte": "^5.56.8",
+ "svelte-check": "^4.7.4",
+ "tailwindcss": "^4.3.3",
"typescript": "^6.0.3",
"unplugin-icons": "^23.0.1",
- "vite": "^8.1.4",
+ "vite": "^8.2.0",
"vitest": "^4.1.10",
},
},
},
"packages": {
- "@adobe/css-tools": ["@adobe/css-tools@4.5.0", "", {}, "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q=="],
-
"@antfu/install-pkg": ["@antfu/install-pkg@1.1.0", "", { "dependencies": { "package-manager-detector": "^1.3.0", "tinyexec": "^1.0.1" } }, "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ=="],
"@asamuzakjp/css-color": ["@asamuzakjp/css-color@5.1.11", "", { "dependencies": { "@asamuzakjp/generational-cache": "^1.0.1", "@csstools/css-calc": "^3.2.0", "@csstools/css-color-parser": "^4.1.0", "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg=="],
@@ -59,11 +54,15 @@
"@asamuzakjp/nwsapi": ["@asamuzakjp/nwsapi@2.3.9", "", {}, "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q=="],
- "@babel/code-frame": ["@babel/code-frame@7.29.7", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw=="],
+ "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="],
"@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="],
- "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
+ "@babel/parser": ["@babel/parser@7.29.7", "", { "dependencies": { "@babel/types": "^7.29.7" }, "bin": "./bin/babel-parser.js" }, "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg=="],
+
+ "@babel/types": ["@babel/types@7.29.7", "", { "dependencies": { "@babel/helper-string-parser": "^7.29.7", "@babel/helper-validator-identifier": "^7.29.7" } }, "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA=="],
+
+ "@bcoe/v8-coverage": ["@bcoe/v8-coverage@1.0.2", "", {}, "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA=="],
"@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="],
@@ -71,13 +70,13 @@
"@csstools/color-helpers": ["@csstools/color-helpers@6.1.0", "", {}, "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg=="],
- "@csstools/css-calc": ["@csstools/css-calc@3.2.1", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg=="],
+ "@csstools/css-calc": ["@csstools/css-calc@3.3.0", "", { "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-c5ihYsPkdG6JCkU2zTMm4+k6r7RXuGxtWYhu5DHMIiF1FHzrfmHL5so11AoFpUv/tu61xfcmT4AmKoFfMPoqdQ=="],
- "@csstools/css-color-parser": ["@csstools/css-color-parser@4.1.9", "", { "dependencies": { "@csstools/color-helpers": "^6.1.0", "@csstools/css-calc": "^3.2.1" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A=="],
+ "@csstools/css-color-parser": ["@csstools/css-color-parser@4.1.10", "", { "dependencies": { "@csstools/color-helpers": "^6.1.0", "@csstools/css-calc": "^3.3.0" }, "peerDependencies": { "@csstools/css-parser-algorithms": "^4.0.0", "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-UZhQLIUyJaaMepqehrCODwCg2KW25vFvLWBmqYFaPclYvvxzj/sG8LBOhBFCp11i9uE7t1EyS+RAoV9tztPFyw=="],
"@csstools/css-parser-algorithms": ["@csstools/css-parser-algorithms@4.0.0", "", { "peerDependencies": { "@csstools/css-tokenizer": "^4.0.0" } }, "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w=="],
- "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.6", "", { "peerDependencies": { "css-tree": "^3.2.1" } }, "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ=="],
+ "@csstools/css-syntax-patches-for-csstree": ["@csstools/css-syntax-patches-for-csstree@1.1.7", "", { "peerDependencies": { "css-tree": "^3.2.1" }, "optionalPeers": ["css-tree"] }, "sha512-fQ+05118eQS1cofO3aJpB5efgpBZMvIzwr/sbC8kDLVA5XLG8q1kJV5yzrUAI1f7lvhPnm8fgIjzFB8/O/5Dig=="],
"@csstools/css-tokenizer": ["@csstools/css-tokenizer@4.0.0", "", {}, "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA=="],
@@ -89,20 +88,12 @@
"@exodus/bytes": ["@exodus/bytes@1.15.1", "", { "peerDependencies": { "@noble/hashes": "^1.8.0 || ^2.0.0" }, "optionalPeers": ["@noble/hashes"] }, "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q=="],
- "@floating-ui/core": ["@floating-ui/core@1.8.0", "", { "dependencies": { "@floating-ui/utils": "^0.2.12" } }, "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ=="],
-
- "@floating-ui/dom": ["@floating-ui/dom@1.8.0", "", { "dependencies": { "@floating-ui/core": "^1.8.0", "@floating-ui/utils": "^0.2.12" } }, "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg=="],
-
- "@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="],
-
- "@iconify-json/tabler": ["@iconify-json/tabler@1.2.36", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-ACkCKFVdYK2mEt2gIZka1pgjqLPalWv/kdCkRA+aS9X7ehj3grA3fnK53mmSaE6KHX+bkBM0BKAEbKuMUhsPPQ=="],
+ "@iconify-json/tabler": ["@iconify-json/tabler@1.2.38", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-9v6ooRU/bKOK/Whv4w2aiK5gBnfCV9Ei+uD1iDDeLu2b+EnF3G3ZKkRKWEOOLG8bJyfKn6XEia6gUQ9oO7cF+Q=="],
"@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="],
"@iconify/utils": ["@iconify/utils@3.1.4", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/types": "^2.0.0", "import-meta-resolve": "^4.2.0" } }, "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw=="],
- "@internationalized/date": ["@internationalized/date@3.12.2", "", { "dependencies": { "@swc/helpers": "^0.5.0" } }, "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw=="],
-
"@jridgewell/gen-mapping": ["@jridgewell/gen-mapping@0.3.13", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA=="],
"@jridgewell/remapping": ["@jridgewell/remapping@2.3.5", "", { "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" } }, "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ=="],
@@ -115,81 +106,81 @@
"@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" } }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="],
- "@oxc-project/types": ["@oxc-project/types@0.139.0", "", {}, "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw=="],
+ "@oxc-project/types": ["@oxc-project/types@0.142.0", "", {}, "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ=="],
- "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.74.0", "", { "os": "android", "cpu": "arm" }, "sha512-+gHd12muVI9ZLBaWLPkHt3Fj7jihFjgQ1MGtBaRL8vWrWrI0P7dLUty/cHrHS0oqPYIRgQUJsPu2CExQuMcwNw=="],
+ "@oxlint/binding-android-arm-eabi": ["@oxlint/binding-android-arm-eabi@1.77.0", "", { "os": "android", "cpu": "arm" }, "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ=="],
- "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.74.0", "", { "os": "android", "cpu": "arm64" }, "sha512-xjKdoMB+H+RCOByv/7l7nfIGW9mlOisqYdcyC75UqYuQecLpReAeEYUf2CNeDEI3KtmUgxpRw/+c63y4AeF/Bw=="],
+ "@oxlint/binding-android-arm64": ["@oxlint/binding-android-arm64@1.77.0", "", { "os": "android", "cpu": "arm64" }, "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA=="],
- "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.74.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-iUK7wvc6sejMKsC+Pt67mntoF5weFcyEunhZfLJceU6gL419mexz5wBkSx/EnkFBExMLNtOi9fnDSc5xfK0IzQ=="],
+ "@oxlint/binding-darwin-arm64": ["@oxlint/binding-darwin-arm64@1.77.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA=="],
- "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.74.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-ggKc/tn5SJ1u2yG2izC6VKODfYKV8MQ2AicJlNzOjuyrC29udvOef6/JzK2r32xqCnBDLFouR1VCkjzEI0/N9Q=="],
+ "@oxlint/binding-darwin-x64": ["@oxlint/binding-darwin-x64@1.77.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA=="],
- "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.74.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-u++dH/43jy9hTLbneaWlS0gla/Bp1JdwJ2zgevCl8nDFUh6qRCGMxcL0f0lb7By3A9p/LfFr+7cG4HU1hG856g=="],
+ "@oxlint/binding-freebsd-x64": ["@oxlint/binding-freebsd-x64@1.77.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg=="],
- "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.74.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Sj1zmtFDVTPeIbIz4ZfcXAbFHqCmKCXdCUlAJzvTF7I20NTH1RDpoF2PhkqNODutJzVhJYmm3oz0GwgY+tvE2g=="],
+ "@oxlint/binding-linux-arm-gnueabihf": ["@oxlint/binding-linux-arm-gnueabihf@1.77.0", "", { "os": "linux", "cpu": "arm" }, "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA=="],
- "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.74.0", "", { "os": "linux", "cpu": "arm" }, "sha512-//PKyQb/tQXcHArx2f7z+oVI/eMS2Jpv+edNuAtOrgIhWdGcpHxogveAxzmF2rpH1AIHp4Hq04RF/rgJdiICnQ=="],
+ "@oxlint/binding-linux-arm-musleabihf": ["@oxlint/binding-linux-arm-musleabihf@1.77.0", "", { "os": "linux", "cpu": "arm" }, "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ=="],
- "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.74.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-/k1Me+aX2tjuH10K62mLS0y8cLkJBHX6Ce0xPK+eWeel4bSdEGZ8dv4+hYMzg0GrSmjwy4yAYsDPeEeKBft/2w=="],
+ "@oxlint/binding-linux-arm64-gnu": ["@oxlint/binding-linux-arm64-gnu@1.77.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw=="],
- "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.74.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-3tFSjBxc5D8/zvjEuLvOqcA8ZXKD0+6NuaVO/edeamNc49MoAsbfaC9s1UiwODwgF6slGaF8yJA2TPkukd77tg=="],
+ "@oxlint/binding-linux-arm64-musl": ["@oxlint/binding-linux-arm64-musl@1.77.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g=="],
- "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.74.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-9QggtPkSPXOCTu8Szis7auOK/sC7KdQaN+/TujP7YVVhzCAOhgdRfgv8uEz0r2tk5xdgus5rLYUrCDoZNtiRUw=="],
+ "@oxlint/binding-linux-ppc64-gnu": ["@oxlint/binding-linux-ppc64-gnu@1.77.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg=="],
- "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.74.0", "", { "os": "linux", "cpu": "none" }, "sha512-VM5VPUJ4DJIWiK+AZn8FScUqMr6OFrCAYybMYjEEi7W13ParI64MByiXTkKMqZpBmvQ9zxl9Ebq2VUOiZRJYUg=="],
+ "@oxlint/binding-linux-riscv64-gnu": ["@oxlint/binding-linux-riscv64-gnu@1.77.0", "", { "os": "linux", "cpu": "none" }, "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q=="],
- "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.74.0", "", { "os": "linux", "cpu": "none" }, "sha512-SaDY1gh9rOA592J54g+gu5hkOFFQBZsMmIYHs+NRHG+Uq0OxtuuCXMWQ3vu1830Eugv5uMXyjG+bv2Z9y4IXjw=="],
+ "@oxlint/binding-linux-riscv64-musl": ["@oxlint/binding-linux-riscv64-musl@1.77.0", "", { "os": "linux", "cpu": "none" }, "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA=="],
- "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.74.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-ZATQeHZCyr6MbDveg0obD5sxLHFOghtOdC5jwVwYlvFWqtFOxctgFEG6Ef/64hYvZrWyhyCckB10AelqLopeDA=="],
+ "@oxlint/binding-linux-s390x-gnu": ["@oxlint/binding-linux-s390x-gnu@1.77.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw=="],
- "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.74.0", "", { "os": "linux", "cpu": "x64" }, "sha512-+aIvJyrdeD7LwCQ2WYLMUWNmnbeDRSPb40aBYtPjD9+PTqUwgJnk+HK5yLfSMeqXrMrDhE9uTmtt2y50tvjhHw=="],
+ "@oxlint/binding-linux-x64-gnu": ["@oxlint/binding-linux-x64-gnu@1.77.0", "", { "os": "linux", "cpu": "x64" }, "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw=="],
- "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.74.0", "", { "os": "linux", "cpu": "x64" }, "sha512-XyktaR8lhK2qWiCK0Tk8oYD+/cgn+oHA6ddRnxSSXUKkkojkV78CmShZUxQF+yrBFs0SuW+JBOPG6hecyc/iZg=="],
+ "@oxlint/binding-linux-x64-musl": ["@oxlint/binding-linux-x64-musl@1.77.0", "", { "os": "linux", "cpu": "x64" }, "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ=="],
- "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.74.0", "", { "os": "none", "cpu": "arm64" }, "sha512-mzbjrPl4neaVUiJ1fUiEUxTGaSZBoiKtaoB6jmIpz9S+VOA2vDYmJpihQ82w6178V5jxziclTg8Cgj5yF6tTDg=="],
+ "@oxlint/binding-openharmony-arm64": ["@oxlint/binding-openharmony-arm64@1.77.0", "", { "os": "none", "cpu": "arm64" }, "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw=="],
- "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.74.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-vUAe9okpS2Oa5+lX67lqHMuNUvfkleRKwrUDJ/WJBsgmddvZ1mrsh2HVmuFDRzqFELhaJhFaCNOuR6a7L3rtIA=="],
+ "@oxlint/binding-win32-arm64-msvc": ["@oxlint/binding-win32-arm64-msvc@1.77.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA=="],
- "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.74.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-yyXXJyYYSXL4I8K8jAWjJs+J3fa9gH2JmEbo4f5adm+1tNC9itseicBNuwK7BDHvqQ5J534s+yDULu89vYL2ZQ=="],
+ "@oxlint/binding-win32-ia32-msvc": ["@oxlint/binding-win32-ia32-msvc@1.77.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA=="],
- "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.74.0", "", { "os": "win32", "cpu": "x64" }, "sha512-VTC9IYTIMrVUk/i6Ms1ohzzDKZFkWn0KU2OBbPBzgmVZ2V30165T/zK4LztTr0Xgp9fZ1qQZ1rsZAu/rEmySlA=="],
+ "@oxlint/binding-win32-x64-msvc": ["@oxlint/binding-win32-x64-msvc@1.77.0", "", { "os": "win32", "cpu": "x64" }, "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw=="],
- "@playwright/test": ["@playwright/test@1.61.1", "", { "dependencies": { "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" } }, "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig=="],
+ "@playwright/test": ["@playwright/test@1.62.1", "", { "dependencies": { "playwright": "1.62.1" }, "bin": { "playwright": "cli.js" } }, "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ=="],
"@polka/url": ["@polka/url@1.0.0-next.29", "", {}, "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww=="],
"@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="],
- "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.5", "", { "os": "android", "cpu": "arm64" }, "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ=="],
+ "@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.2.2", "", { "os": "android", "cpu": "arm64" }, "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA=="],
- "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.1.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw=="],
+ "@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.2.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA=="],
- "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.1.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g=="],
+ "@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.2.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ=="],
- "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.1.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA=="],
+ "@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.2.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ=="],
- "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.1.5", "", { "os": "linux", "cpu": "arm" }, "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw=="],
+ "@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.2.2", "", { "os": "linux", "cpu": "arm" }, "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w=="],
- "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.1.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q=="],
+ "@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg=="],
- "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.1.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA=="],
+ "@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.2.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ=="],
- "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.1.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg=="],
+ "@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.2.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA=="],
- "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.1.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA=="],
+ "@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.2.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA=="],
- "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.1.5", "", { "os": "linux", "cpu": "x64" }, "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ=="],
+ "@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA=="],
- "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.1.5", "", { "os": "linux", "cpu": "x64" }, "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg=="],
+ "@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.2.2", "", { "os": "linux", "cpu": "x64" }, "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw=="],
- "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.1.5", "", { "os": "none", "cpu": "arm64" }, "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw=="],
+ "@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.2.2", "", { "os": "none", "cpu": "arm64" }, "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA=="],
"@rolldown/binding-wasm32-wasi": ["@rolldown/binding-wasm32-wasi@1.1.5", "", { "dependencies": { "@emnapi/core": "1.11.1", "@emnapi/runtime": "1.11.1", "@napi-rs/wasm-runtime": "^1.1.6" }, "cpu": "none" }, "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA=="],
- "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.1.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw=="],
+ "@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.2.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A=="],
- "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA=="],
+ "@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.2.2", "", { "os": "win32", "cpu": "x64" }, "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg=="],
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.1", "", {}, "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw=="],
@@ -199,14 +190,12 @@
"@sveltejs/adapter-auto": ["@sveltejs/adapter-auto@7.0.1", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ=="],
- "@sveltejs/kit": ["@sveltejs/kit@2.70.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.9", "@types/cookie": "^0.6.0", "acorn": "^8.16.0", "cookie": "^0.6.0", "devalue": "^5.8.1", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-nY9SPHGOZro3doud9vZXDBwl9tCZIouuJztjgSHs6PAIrv9M/z5O7eOhPV5xU7CgVHA976Jwu3BA1hIFvXztkA=="],
+ "@sveltejs/kit": ["@sveltejs/kit@2.70.2", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.9", "@types/cookie": "^0.6.0", "acorn": "^8.16.0", "cookie": "^0.6.0", "devalue": "^5.8.1", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-RzRoRpuR2KXqc5yMO0akQHDZeT4AslOlznGITURsqHaVbtyYP4Wn3eE3gxj9JcDyNYO0crkxhdwFHc+2vkVm6w=="],
- "@sveltejs/load-config": ["@sveltejs/load-config@0.2.0", "", {}, "sha512-1LgZ/qUqSoq+QorD83lk2hka79Px0wXNW2q5V1nZlxGhQgw1jrsIbVz5YiCeucVLo4XvFLjXukUaQjIiqowkcg=="],
+ "@sveltejs/load-config": ["@sveltejs/load-config@0.2.1", "", {}, "sha512-5m3B2cbqQ4TbwW6Xkh66Ntw6dD7gNc77cCxABTTesWcq9jxIzMgTk97pZx5vEtvQx8iokgi7GIphqZe+PGwcZA=="],
"@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@7.2.0", "", { "dependencies": { "deepmerge": "^4.3.1", "magic-string": "^0.30.21", "obug": "^2.1.0", "vitefu": "^1.1.2" }, "peerDependencies": { "svelte": "^5.46.4", "vite": "^8.0.0-beta.7 || ^8.0.0" } }, "sha512-1SpkuMSRLfugrVX+IrKfE1RUegzo8AQzKQ6qQPfVzbcWi5IhuTPaKb5ZrLpucleFznkc4/RTeSPoRnGWFxX+EQ=="],
- "@swc/helpers": ["@swc/helpers@0.5.23", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw=="],
-
"@tailwindcss/node": ["@tailwindcss/node@4.3.3", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "^5.24.1", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.3" } }, "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg=="],
"@tailwindcss/oxide": ["@tailwindcss/oxide@4.3.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.3", "@tailwindcss/oxide-darwin-arm64": "4.3.3", "@tailwindcss/oxide-darwin-x64": "4.3.3", "@tailwindcss/oxide-freebsd-x64": "4.3.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3", "@tailwindcss/oxide-linux-arm64-musl": "4.3.3", "@tailwindcss/oxide-linux-x64-gnu": "4.3.3", "@tailwindcss/oxide-linux-x64-musl": "4.3.3", "@tailwindcss/oxide-wasm32-wasi": "4.3.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3", "@tailwindcss/oxide-win32-x64-msvc": "4.3.3" } }, "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA=="],
@@ -229,7 +218,7 @@
"@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img=="],
- "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="],
+ "@tailwindcss/oxide-wasm32-wasi": ["@tailwindcss/oxide-wasm32-wasi@4.3.3", "", { "dependencies": { "@emnapi/core": "^1.11.1", "@emnapi/runtime": "^1.11.1", "@emnapi/wasi-threads": "^1.2.2", "@napi-rs/wasm-runtime": "^1.1.4", "@tybys/wasm-util": "^0.10.2", "tslib": "^2.8.1" }, "cpu": "none" }, "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ=="],
"@tailwindcss/oxide-win32-arm64-msvc": ["@tailwindcss/oxide-win32-arm64-msvc@4.3.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ=="],
@@ -237,71 +226,63 @@
"@tailwindcss/vite": ["@tailwindcss/vite@4.3.3", "", { "dependencies": { "@tailwindcss/node": "4.3.3", "@tailwindcss/oxide": "4.3.3", "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw=="],
- "@testing-library/dom": ["@testing-library/dom@10.4.1", "", { "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", "aria-query": "5.3.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "picocolors": "1.1.1", "pretty-format": "^27.0.2" } }, "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg=="],
-
- "@testing-library/jest-dom": ["@testing-library/jest-dom@6.9.1", "", { "dependencies": { "@adobe/css-tools": "^4.4.0", "aria-query": "^5.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", "picocolors": "^1.1.1", "redent": "^3.0.0" } }, "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA=="],
-
- "@testing-library/svelte": ["@testing-library/svelte@5.4.2", "", { "dependencies": { "@testing-library/dom": "9.x.x || 10.x.x", "@testing-library/svelte-core": "1.1.3" }, "peerDependencies": { "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0", "vite": "*", "vitest": "*" } }, "sha512-4o31E4HGo5BU5KwPkulNRocEden+7Tt9JYm9uhln5ajF7DULeyFA46BBWVfKJ8Ms9B3JmOFPTIiVamH7n3KpuQ=="],
+ "@tiptap/core": ["@tiptap/core@3.29.2", "", { "peerDependencies": { "@tiptap/pm": "3.29.2" } }, "sha512-oKUkiPUB7noilVYxI9lNzUD4rX17sHub+PYjMfHMWHG9A3nvIy+FdePIVIIhThKWF7ijhr3eIqHY51Bn+GAFtw=="],
- "@testing-library/svelte-core": ["@testing-library/svelte-core@1.1.3", "", { "peerDependencies": { "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0" } }, "sha512-KkMAvXeWorxN2Yn0kdC1lfoAItxpoj4uOWzxK5leDrNxonLvS5nwBFvztrroyTszQ0Wf/EU6iLT8JhY5qcn22g=="],
+ "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2", "@tiptap/pm": "3.29.2" } }, "sha512-ca4OzKDh0yaxg2+Z56bC2QnWsNsFp2YMRfVig1PDXyMVFMNJpLcnhxgq/9btn+xYAlYrj8RymOeCTYREOR6Zjg=="],
- "@tiptap/core": ["@tiptap/core@3.28.0", "", { "peerDependencies": { "@tiptap/pm": "3.28.0" } }, "sha512-gUuD5WAYfbDxNSSJya/emh2KSzXZXLUYKW4fEnc1AQ5FE2twzh4LJ9UlKFIawigrUCAksWI5Fy1hRbv+5m4ZdQ=="],
+ "@tiptap/extension-bold": ["@tiptap/extension-bold@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-elYbGxJsYnBb4leqrcjdIJuiG380BcOgN+UUzvOv+qEjfGVzHodFOMBl3qnmD6urYHNu5/qQK2S0qSSRXKCLNQ=="],
- "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0", "@tiptap/pm": "3.28.0" } }, "sha512-y8Xi6Z3AQLXedz0J8Z3kDsu7SKBmL50gKVXx3RK1Oo1cuCGhNChm3syChkAz3PLAbrPUM5rvJDSZdF2jUrDnng=="],
+ "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@3.29.2", "", { "peerDependencies": { "@tiptap/extension-list": "3.29.2" } }, "sha512-3bWcCUPbCHv0XttlMdnAtXLNYWx2pblByMgxmGsaP9FU0QnslGXty6A6gHCqI33ygRg1vrA6U5Wtpwbi5aKu5g=="],
- "@tiptap/extension-bold": ["@tiptap/extension-bold@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-JhZQmr0AU741bOwjVMfuwJdK4g0TQwwPbeca9aqKHv5zvZw4i4G9G6fESVyMFc3Yag1ffpnq5EtNldHKTnMhlw=="],
+ "@tiptap/extension-code": ["@tiptap/extension-code@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-c6W5UGuB7WNLpYocsgRzpO2OOTI4QjaI9jjHRMuty9z+s9DtaYM/HrRLNwVh6MopkHb+i/89Wkv8gCS34fftig=="],
- "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@3.28.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.28.0" } }, "sha512-dSVuNiH7PFMmWGkNER9vfUb5bXUHDARvHbJ3l+APEb+ZiusVN1KFdM3nd/RsW/Rt5Gd3XwlIEU/c2Uf7cxYDcw=="],
+ "@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2", "@tiptap/pm": "3.29.2" } }, "sha512-w153ct8g6dLiPTdXQ6SOIMxX4SEo5Q50AmjdEEEcJ7ZcYUcde/ScSskLHfOYmyt5ZFAiyEwr121+pux+p3/oAQ=="],
- "@tiptap/extension-code": ["@tiptap/extension-code@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-AUw2Acof3CQE6Q6Y22saK4lyg0nkeJ4XXniU65TdAi/9TE66TGiO4NQJJNNPgu8+VMEwl5j8VsIFK8sfTcNYtg=="],
+ "@tiptap/extension-color": ["@tiptap/extension-color@3.29.2", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.29.2" } }, "sha512-DMeyDRGZXIe2m2/QlrBoN15R4Ufwz3ERiG//OM7bjcYpiTZiO+pLC6tyabI1+QcJrYUGTu5zVah583xXzt89Kw=="],
- "@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0", "@tiptap/pm": "3.28.0" } }, "sha512-bHITDzT0umTLh+SiEVQzIXkCMt/TzbPM1+HQy9ZxgQDHAJj/vdmfNAnP3RCOrz4lETXyhNQ2b6kxeu3lWckxyA=="],
+ "@tiptap/extension-document": ["@tiptap/extension-document@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-YUamvefLnsqu6124GavVTI7nqcFlQJ12ROB0oSwG69eSBZYNjg1tIs05LFrBxkwf4Xgqd6YzfJ9+FeG428RvzQ=="],
- "@tiptap/extension-color": ["@tiptap/extension-color@3.28.0", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.28.0" } }, "sha512-YbUMUdrgU04GDYoii1wuFVkiTSQoaEQh04kwgQayEQ46aUBEnnaJitWdp39aGMWYTIXD/c9K9cr5Vg8GSKcVxA=="],
+ "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@3.29.2", "", { "peerDependencies": { "@tiptap/extensions": "3.29.2" } }, "sha512-KKno7cU9r1HdR48CRrsDu69/1UjZdoslq/UcE+Kx+tdhAv/aljXMkRSNzGMrBNOBDmHRgS1+58zm21WQWdQzwA=="],
- "@tiptap/extension-document": ["@tiptap/extension-document@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-5SAKtlB1Tr/eZFhISL86HqmUup6rItvPtuPyRjmZo/VgbMwXEwiyAh1sMgFp5VNaeSMM14vJSyQpjhSaOmaBqg=="],
+ "@tiptap/extension-font-family": ["@tiptap/extension-font-family@3.29.2", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.29.2" } }, "sha512-HDq9+V8LbDFH1aQRH5Au0pmoDQ7bfa/C/k50a9mujzmA/PE7mLQkduUFfyDdiN4L60p7TVJAOJaN/loGC8PDxA=="],
- "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-JA+dXQjjfJBpD0nVsZeddGVXRsmanESM9+8CtM35hI9wJnYMXay/B+5GUhswO20zhT3zhB2ZOTGe9knu6A8nIQ=="],
+ "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@3.29.2", "", { "peerDependencies": { "@tiptap/extensions": "3.29.2" } }, "sha512-8Q39UR4/Tit759IeW9xZIe3NMwN11GsuA3FLheDyyGn7RrW02HD3HhUDlazE54Ki4HoosjFmChPlN4Ik2ubdRQ=="],
- "@tiptap/extension-font-family": ["@tiptap/extension-font-family@3.28.0", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.28.0" } }, "sha512-SkKnS8RG/ECeuupteMOBCXbj9PxcpumE/3h2I+dYvLVRM+KM6YmAQ6Toq8zRHXcDT28iu42OSn2MlDfpuYsmqg=="],
+ "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-eUW3LN3fq8rXnjEUeI3D2QONYdLsU3yYQm4jxlErs2h4cfwrFjgf19VSUFVmm6LrFbbQ0OnDVPeVLL6iOwDw2w=="],
- "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-Wo73kM4q8z4Va9i4+0n1cO0UEMVUVBHPqM6cAqEYXjB4T48LQkKjRsiQydCezm185rQAsmm1dyi72gtvVQfdMg=="],
+ "@tiptap/extension-heading": ["@tiptap/extension-heading@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-6W4aIy70Mh7BNlbG9zZ5FBLhJhU2UUEzgZJ/jwYSCcB30o8McLxJSEjhtoHiX8R78Ah2/JzBGvIe5olZlbeE4A=="],
- "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-JHIFjX1luJgQ4VFEkIeXZpbc54Qiw+69P8FmlazYTh7AIJ6iLCpMFgQFELnivEAZ+/vS0lMPQubg0rCeM3UrHw=="],
+ "@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2", "@tiptap/pm": "3.29.2" } }, "sha512-8/ZPzbB9X85Mc9/7xVLZupQKBr2UVcQTGr512xtqMW+XkCQRHCph46tRo828YE13IMWI5fWn/FaNCqXG9cULSw=="],
- "@tiptap/extension-heading": ["@tiptap/extension-heading@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-rKjGG/Ik2lNaXBNVmONEDm5DBfGDLM1NWgSf5RRfBISrH8Lm1xqFruOB9tIaB0YUoSV3SBOiwTF9svmzvKSoRA=="],
+ "@tiptap/extension-italic": ["@tiptap/extension-italic@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-iH63V/5wsaMnY4Jz0+meaAGhaec4AiOzOduzl6ZZr5IyGhZ1kthyW84ELt0dyLI3hNceAUhaNWc+I7+vX0aoXA=="],
- "@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0", "@tiptap/pm": "3.28.0" } }, "sha512-neBCMWprkppQUoLWyeJZDHqBw+xKX2oNhLD9MbFlhKIr092zgfP4mpCvQnSkn1OHl156KzZMp070+NyLBjgQ7A=="],
+ "@tiptap/extension-link": ["@tiptap/extension-link@3.29.2", "", { "dependencies": { "linkifyjs": "^4.3.3" }, "peerDependencies": { "@tiptap/core": "3.29.2", "@tiptap/pm": "3.29.2" } }, "sha512-DcVer5SqrexKCEP6Ip1UPxJUMvcRCCItSv0wxoGytanrimBh2smvcg6X0DWnjlsi5H0updhyl+atYCmmQXUIXA=="],
- "@tiptap/extension-italic": ["@tiptap/extension-italic@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-Yur/ELz6dNVKQC7m8wGjtoLFxamGjJmA0rUEEOacTH6J39aFmcSxYkEGNDkYHbZFyHFYqbej6eI3VE0h08O0mg=="],
+ "@tiptap/extension-list": ["@tiptap/extension-list@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2", "@tiptap/pm": "3.29.2" } }, "sha512-WPZ9BHAPT6QeIm1vdVkuoOWvy9a8/EZeJwV2VhU8LXyTAttvzyj4rsbbHyJWvYWlUSTt/QF2AZ2zhKo7u1w3/A=="],
- "@tiptap/extension-link": ["@tiptap/extension-link@3.28.0", "", { "dependencies": { "linkifyjs": "^4.3.3" }, "peerDependencies": { "@tiptap/core": "3.28.0", "@tiptap/pm": "3.28.0" } }, "sha512-hy/PqSeTyl317yseFcHGE+3XVfQKQYaL4uZuj27xlrcO7MZ15drt1h9sUZy1FTBF3mr8676pQu7aoEm/Ww4ZRA=="],
+ "@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.29.2", "", { "peerDependencies": { "@tiptap/extension-list": "3.29.2" } }, "sha512-s8vBVHHFT0Qpu7CzAZ7S1kYmSiVaDvUNvMNcZUWnxj6VPfiwmx0eXd9FsjePrRCMoM5tFmPnhFTHDxY3D/eZeQ=="],
- "@tiptap/extension-list": ["@tiptap/extension-list@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0", "@tiptap/pm": "3.28.0" } }, "sha512-zQ66i5DuhVOndmZ0d7H475Y5Yb+BMx+zfCjFkCzEc6WVef5MumtxBVTkGLQ0ibxUaD71s4QQZbjHWagpaTg0eQ=="],
+ "@tiptap/extension-list-keymap": ["@tiptap/extension-list-keymap@3.29.2", "", { "peerDependencies": { "@tiptap/extension-list": "3.29.2" } }, "sha512-R+3k8OLnxdCH7Xy9ieOwUt5m2Je74u8mikothGmsYVO2Zyq48fIbmZ+X6RBPCu7DBOI2FIUhHEFbKQeDWvDNmA=="],
- "@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.28.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.28.0" } }, "sha512-GbXrnMac6knSetZY33NHwOrgXFPqH28uCklQqmOZQlsrdGqezDKk31qoEMr4GsKW9n/lViAeuc07oIzwLwCMng=="],
+ "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@3.29.2", "", { "peerDependencies": { "@tiptap/extension-list": "3.29.2" } }, "sha512-ndCunC+UsYOpkOtL7vGnDz21UNa45WUlcO9wMT1fbuYow2QnRhsuMlCWENXI52YPPARWuQ0RDgN7q6TaxPERBg=="],
- "@tiptap/extension-list-keymap": ["@tiptap/extension-list-keymap@3.28.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.28.0" } }, "sha512-u9Wks8c/eQAv0RkULNggOyTKDD69WVbcV9H5cbasPDUbq5XbEFVa9ajxhEGfMmQ5et3EX0QL8qBi50K0GqbIjA=="],
+ "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-7qJj5YTr11vvjNgjDN1ypOfwTovc0QOCYcit/rskeuVgnmQZOZQzC/BbyKLLG7UGnpRLemU/mEGbW9pAqjAXkQ=="],
- "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@3.28.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.28.0" } }, "sha512-OZNYrKKL9D01ySOujlNbKlLS9/3wGgKNYeoHZUg0e+Ta8WPVvL3W1zH6TgiU5sF2ZSGUBoq3w7mdaO/iROlUkw=="],
+ "@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@3.29.2", "", { "peerDependencies": { "@tiptap/extensions": "3.29.2" } }, "sha512-/BlpPIq2JZk6zLaeYVOXazi6dmd0iRriTymNEnFn1doManN1y5HED9LsMeb/AhNhauL5AgmcHgpvAjbsN9k4SA=="],
- "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-8UMlQIjzqf6r2hSJ/VeJ00RqaOrOB1J5rTk02Vcw2pYeHkOqp+B0ff0HFu4abT9x1q4oXrBAgMsxRtgh/kR14Q=="],
+ "@tiptap/extension-strike": ["@tiptap/extension-strike@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-aEvLAbddUQZ+FukCreV3q4G2HfNI+odE7E9U+wbq6XsSWKyo8/pDu1muz+TFKNre4blSMOQ3JQmw5UeHDKy+fg=="],
- "@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-zueiqNeCHOshDa8dGGSa/0cOBZkMjPrxQhemjF4tj2yZ6EeWHBPtCE5h/uQCagEePxsoaJtvaCRh88199zrgBw=="],
+ "@tiptap/extension-text": ["@tiptap/extension-text@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-Ubko45JWWHe8glBt2PiGNF8hcbys/JNalFhiR7Y1X4iOOtAxAKJJxh3+eq+//NTlGuBPdWGp7zw8EEUp7anjKA=="],
- "@tiptap/extension-strike": ["@tiptap/extension-strike@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-VVj2ZZU9QYqiHLcjqMqRYvuHSsokj/AgUl+6TzLrKjlWwyZ18D4H2vkyI0g70iVTKnUpZ3sEy8WA/rqjgBjqBg=="],
+ "@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-aQad9V9ROaEi3hE4g5z9wQ6lv5FSnzlnWFMVJxRjNlwXgm7H0fymxb4rGfca+pAwYkiRwpKYh1LatpJw2ECQAA=="],
- "@tiptap/extension-text": ["@tiptap/extension-text@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-Jqp1LgfY1mnp4TQHoy+vnHyfn6qnnAM6nHgGwbY5zA8b/Xf1Etll6pziTx9p1J1qcfAgSrnjOyAmA++H7VQqww=="],
+ "@tiptap/extension-underline": ["@tiptap/extension-underline@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-K7XwH/xS/5AIREWQ00VTEf/W5U0olp7j6wwit7cdd/8nHv6h6AGr1+iEApHKoLXWQZLfGQKzJlT9W61LAl+fHA=="],
- "@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-UreMyqZSv770+CXJK/l1qeHUdaNMQAVkxSOPWpiY9FiT8B4OQyjA7WBOlWrzbvVTzfJvXWk2Y3SWgVRx+/Cd9A=="],
+ "@tiptap/extensions": ["@tiptap/extensions@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2", "@tiptap/pm": "3.29.2" } }, "sha512-BCz+FCAChSYtUe4BFj97HEO+nSK+J7GxbJgZG4Hg7DT/gI+hRyeNndU8efiQAx3WGdzsFi3UxRpcF1tTQM7iMQ=="],
- "@tiptap/extension-underline": ["@tiptap/extension-underline@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-rwxCS6vTh2DJkNIYQX7JSrrRSmm76e2y48aZeuZO5ShkvLWMuJ3/zqDHRxAQVDiJhuE2Cp8NrTmPYlUc9YrT0A=="],
+ "@tiptap/pm": ["@tiptap/pm@3.29.2", "", { "dependencies": { "prosemirror-changeset": "^2.4.1", "prosemirror-commands": "^1.7.1", "prosemirror-dropcursor": "^1.8.2", "prosemirror-gapcursor": "^1.4.1", "prosemirror-history": "^1.5.0", "prosemirror-inputrules": "^1.5.1", "prosemirror-keymap": "^1.2.3", "prosemirror-model": "^1.25.11", "prosemirror-schema-list": "^1.5.1", "prosemirror-state": "^1.4.4", "prosemirror-tables": "^1.8.5", "prosemirror-transform": "^1.12.0", "prosemirror-view": "^1.41.9" } }, "sha512-GCOme7xHaS+DSoaA4CDcAD3l6JyBlvZhvCyfsy2Vp6j8tEoBkZWio7soYVosmlyn7zq8/64VeFZP5s47yfG7fQ=="],
- "@tiptap/extensions": ["@tiptap/extensions@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0", "@tiptap/pm": "3.28.0" } }, "sha512-DJT1khCK+O/pT1gQlAnoKAx6zwDkgv7GtnhSfkqm1/4KHC3x+SSJnBIgBl9oGHymA+DxWbW1EULU4V3d/kT2uQ=="],
-
- "@tiptap/pm": ["@tiptap/pm@3.28.0", "", { "dependencies": { "prosemirror-changeset": "^2.4.1", "prosemirror-commands": "^1.7.1", "prosemirror-dropcursor": "^1.8.2", "prosemirror-gapcursor": "^1.4.1", "prosemirror-history": "^1.5.0", "prosemirror-inputrules": "^1.5.1", "prosemirror-keymap": "^1.2.3", "prosemirror-model": "^1.25.9", "prosemirror-schema-list": "^1.5.1", "prosemirror-state": "^1.4.4", "prosemirror-tables": "^1.8.5", "prosemirror-transform": "^1.12.0", "prosemirror-view": "^1.41.9" } }, "sha512-ALcpwZMUdat9gjJKlpscpoqXStoLhU246LPEVBDvJdIsoUKvUu3MrzfXik2Y8mtSGfhjtm9O2TRkWxQiFVMwsQ=="],
-
- "@tiptap/starter-kit": ["@tiptap/starter-kit@3.28.0", "", { "dependencies": { "@tiptap/core": "^3.28.0", "@tiptap/extension-blockquote": "^3.28.0", "@tiptap/extension-bold": "^3.28.0", "@tiptap/extension-bullet-list": "^3.28.0", "@tiptap/extension-code": "^3.28.0", "@tiptap/extension-code-block": "^3.28.0", "@tiptap/extension-document": "^3.28.0", "@tiptap/extension-dropcursor": "^3.28.0", "@tiptap/extension-gapcursor": "^3.28.0", "@tiptap/extension-hard-break": "^3.28.0", "@tiptap/extension-heading": "^3.28.0", "@tiptap/extension-horizontal-rule": "^3.28.0", "@tiptap/extension-italic": "^3.28.0", "@tiptap/extension-link": "^3.28.0", "@tiptap/extension-list": "^3.28.0", "@tiptap/extension-list-item": "^3.28.0", "@tiptap/extension-list-keymap": "^3.28.0", "@tiptap/extension-ordered-list": "^3.28.0", "@tiptap/extension-paragraph": "^3.28.0", "@tiptap/extension-strike": "^3.28.0", "@tiptap/extension-text": "^3.28.0", "@tiptap/extension-underline": "^3.28.0", "@tiptap/extensions": "^3.28.0", "@tiptap/pm": "^3.28.0" } }, "sha512-pqvFpValV+ONtlu3l4s73ROm/tEjoGMmt6uHmSJaLbqTcMHkdWuR3flJ/5brr4IDHe1foxmNicMbRxlje7yBYw=="],
+ "@tiptap/starter-kit": ["@tiptap/starter-kit@3.29.2", "", { "dependencies": { "@tiptap/core": "^3.29.2", "@tiptap/extension-blockquote": "^3.29.2", "@tiptap/extension-bold": "^3.29.2", "@tiptap/extension-bullet-list": "^3.29.2", "@tiptap/extension-code": "^3.29.2", "@tiptap/extension-code-block": "^3.29.2", "@tiptap/extension-document": "^3.29.2", "@tiptap/extension-dropcursor": "^3.29.2", "@tiptap/extension-gapcursor": "^3.29.2", "@tiptap/extension-hard-break": "^3.29.2", "@tiptap/extension-heading": "^3.29.2", "@tiptap/extension-horizontal-rule": "^3.29.2", "@tiptap/extension-italic": "^3.29.2", "@tiptap/extension-link": "^3.29.2", "@tiptap/extension-list": "^3.29.2", "@tiptap/extension-list-item": "^3.29.2", "@tiptap/extension-list-keymap": "^3.29.2", "@tiptap/extension-ordered-list": "^3.29.2", "@tiptap/extension-paragraph": "^3.29.2", "@tiptap/extension-strike": "^3.29.2", "@tiptap/extension-text": "^3.29.2", "@tiptap/extension-underline": "^3.29.2", "@tiptap/extensions": "^3.29.2", "@tiptap/pm": "^3.29.2" } }, "sha512-oTu0tysiqk4zgjEtxRHjAQgxUKaAevZwueOWwSWubHdokqp7SpcbE5n9USJv89HKuTUDm3GjnQH6q8HNn/2DsA=="],
"@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="],
@@ -309,8 +290,6 @@
"@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="],
- "@types/aria-query": ["@types/aria-query@5.0.4", "", {}, "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw=="],
-
"@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="],
"@types/cookie": ["@types/cookie@0.6.0", "", {}, "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA=="],
@@ -319,13 +298,15 @@
"@types/estree": ["@types/estree@1.0.9", "", {}, "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg=="],
- "@types/node": ["@types/node@26.1.1", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw=="],
+ "@types/node": ["@types/node@26.1.2", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg=="],
"@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="],
+ "@vitest/coverage-v8": ["@vitest/coverage-v8@4.1.10", "", { "dependencies": { "@bcoe/v8-coverage": "^1.0.2", "@vitest/utils": "4.1.10", "ast-v8-to-istanbul": "^1.0.0", "istanbul-lib-coverage": "^3.2.2", "istanbul-lib-report": "^3.0.1", "istanbul-reports": "^3.2.0", "magicast": "^0.5.2", "obug": "^2.1.1", "std-env": "^4.0.0-rc.1", "tinyrainbow": "^3.1.0" }, "peerDependencies": { "@vitest/browser": "4.1.10", "vitest": "4.1.10" }, "optionalPeers": ["@vitest/browser"] }, "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g=="],
+
"@vitest/expect": ["@vitest/expect@4.1.10", "", { "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" } }, "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA=="],
- "@vitest/mocker": ["@vitest/mocker@4.1.10", "", { "dependencies": { "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw"] }, "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow=="],
+ "@vitest/mocker": ["@vitest/mocker@4.1.10", "", { "dependencies": { "@vitest/spy": "4.1.10", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["msw", "vite"] }, "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow=="],
"@vitest/pretty-format": ["@vitest/pretty-format@4.1.10", "", { "dependencies": { "tinyrainbow": "^3.1.0" } }, "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q=="],
@@ -337,24 +318,18 @@
"@vitest/utils": ["@vitest/utils@4.1.10", "", { "dependencies": { "@vitest/pretty-format": "4.1.10", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" } }, "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA=="],
- "acorn": ["acorn@8.17.0", "", { "bin": "bin/acorn" }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="],
-
- "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="],
+ "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="],
- "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="],
-
- "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="],
+ "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
"assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="],
- "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
+ "ast-v8-to-istanbul": ["ast-v8-to-istanbul@1.0.5", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.31", "estree-walker": "^3.0.3", "js-tokens": "^10.0.0" } }, "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA=="],
- "base64-arraybuffer": ["base64-arraybuffer@1.0.2", "", {}, "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="],
+ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="],
"bidi-js": ["bidi-js@1.0.3", "", { "dependencies": { "require-from-string": "^2.0.2" } }, "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw=="],
- "bits-ui": ["bits-ui@2.18.1", "", { "dependencies": { "@floating-ui/core": "^1.7.1", "@floating-ui/dom": "^1.7.1", "esm-env": "^1.1.2", "runed": "^0.35.1", "svelte-toolbelt": "^0.10.6", "tabbable": "^6.2.0" }, "peerDependencies": { "@internationalized/date": "^3.8.1", "svelte": "^5.33.0" } }, "sha512-KkemzKFH4T3gt3H+P86JcnAWExjByv/6vlwjm/BoCwTPHu03yiCdxbghdJLvFReQTe0acCAiRcKfmixxD6XvlA=="],
-
"chai": ["chai@6.2.2", "", {}, "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg=="],
"chokidar": ["chokidar@4.0.3", "", { "dependencies": { "readdirp": "^4.0.1" } }, "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA=="],
@@ -369,12 +344,8 @@
"cookie": ["cookie@0.6.0", "", {}, "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw=="],
- "css-line-break": ["css-line-break@2.1.0", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w=="],
-
"css-tree": ["css-tree@3.2.1", "", { "dependencies": { "mdn-data": "2.27.1", "source-map-js": "^1.2.1" } }, "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA=="],
- "css.escape": ["css.escape@1.5.1", "", {}, "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg=="],
-
"data-urls": ["data-urls@7.0.0", "", { "dependencies": { "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.0" } }, "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA=="],
"debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
@@ -383,15 +354,11 @@
"deepmerge": ["deepmerge@4.3.1", "", {}, "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A=="],
- "dequal": ["dequal@2.0.3", "", {}, "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA=="],
-
"detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="],
- "devalue": ["devalue@5.8.1", "", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="],
-
- "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="],
+ "devalue": ["devalue@5.8.2", "", {}, "sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA=="],
- "enhanced-resolve": ["enhanced-resolve@5.24.2", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw=="],
+ "enhanced-resolve": ["enhanced-resolve@5.24.3", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ=="],
"entities": ["entities@8.0.0", "", {}, "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA=="],
@@ -407,7 +374,7 @@
"exsolve": ["exsolve@1.1.0", "", {}, "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw=="],
- "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" } }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
+ "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="],
"file-type": ["file-type@22.0.1", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.5", "token-types": "^6.1.2", "uint8array-extras": "^1.5.0" } }, "sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA=="],
@@ -415,9 +382,11 @@
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
+ "has-flag": ["has-flag@4.0.0", "", {}, "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="],
+
"html-encoding-sniffer": ["html-encoding-sniffer@6.0.0", "", { "dependencies": { "@exodus/bytes": "^1.6.0" } }, "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg=="],
- "html2canvas-pro": ["html2canvas-pro@2.2.4", "", { "dependencies": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" } }, "sha512-fo/VOiQZ3oWykAPvnMNHymUHzLWJE7c7C7VWPh+ydb+NquFTwqY5rHQRoxkgsaXo/iciVryPNffTvLzYg98xhg=="],
+ "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="],
"idb": ["idb@8.0.3", "", {}, "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg=="],
@@ -425,45 +394,47 @@
"import-meta-resolve": ["import-meta-resolve@4.2.0", "", {}, "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg=="],
- "indent-string": ["indent-string@4.0.0", "", {}, "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg=="],
-
- "inline-style-parser": ["inline-style-parser@0.2.7", "", {}, "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA=="],
-
"is-potential-custom-element-name": ["is-potential-custom-element-name@1.0.1", "", {}, "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ=="],
"is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="],
- "jiti": ["jiti@2.7.0", "", { "bin": "lib/jiti-cli.mjs" }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
+ "istanbul-lib-coverage": ["istanbul-lib-coverage@3.2.2", "", {}, "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg=="],
+
+ "istanbul-lib-report": ["istanbul-lib-report@3.0.1", "", { "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw=="],
+
+ "istanbul-reports": ["istanbul-reports@3.2.0", "", { "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA=="],
- "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="],
+ "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
+
+ "js-tokens": ["js-tokens@10.0.0", "", {}, "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q=="],
"jsdom": ["jsdom@29.1.1", "", { "dependencies": { "@asamuzakjp/css-color": "^5.1.11", "@asamuzakjp/dom-selector": "^7.1.1", "@bramus/specificity": "^2.4.2", "@csstools/css-syntax-patches-for-csstree": "^1.1.3", "@exodus/bytes": "^1.15.0", "css-tree": "^3.2.1", "data-urls": "^7.0.0", "decimal.js": "^10.6.0", "html-encoding-sniffer": "^6.0.0", "is-potential-custom-element-name": "^1.0.1", "lru-cache": "^11.3.5", "parse5": "^8.0.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^6.0.1", "undici": "^7.25.0", "w3c-xmlserializer": "^5.0.0", "webidl-conversions": "^8.0.1", "whatwg-mimetype": "^5.0.0", "whatwg-url": "^16.0.1", "xml-name-validator": "^5.0.0" }, "peerDependencies": { "canvas": "^3.0.0" }, "optionalPeers": ["canvas"] }, "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q=="],
"kleur": ["kleur@4.1.5", "", {}, "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ=="],
- "lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
+ "lightningcss": ["lightningcss@1.33.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.33.0", "lightningcss-darwin-arm64": "1.33.0", "lightningcss-darwin-x64": "1.33.0", "lightningcss-freebsd-x64": "1.33.0", "lightningcss-linux-arm-gnueabihf": "1.33.0", "lightningcss-linux-arm64-gnu": "1.33.0", "lightningcss-linux-arm64-musl": "1.33.0", "lightningcss-linux-x64-gnu": "1.33.0", "lightningcss-linux-x64-musl": "1.33.0", "lightningcss-win32-arm64-msvc": "1.33.0", "lightningcss-win32-x64-msvc": "1.33.0" } }, "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA=="],
- "lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
+ "lightningcss-android-arm64": ["lightningcss-android-arm64@1.33.0", "", { "os": "android", "cpu": "arm64" }, "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg=="],
- "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
+ "lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.33.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg=="],
- "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
+ "lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.33.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ=="],
- "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
+ "lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.33.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg=="],
- "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
+ "lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.33.0", "", { "os": "linux", "cpu": "arm" }, "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ=="],
- "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
+ "lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg=="],
- "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
+ "lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.33.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ=="],
- "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
+ "lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg=="],
- "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
+ "lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.33.0", "", { "os": "linux", "cpu": "x64" }, "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw=="],
- "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
+ "lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.33.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA=="],
- "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
+ "lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.33.0", "", { "os": "win32", "cpu": "x64" }, "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA=="],
"linkifyjs": ["linkifyjs@4.3.3", "", {}, "sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg=="],
@@ -473,31 +444,33 @@
"lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="],
- "lz-string": ["lz-string@1.5.0", "", { "bin": "bin/bin.js" }, "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ=="],
-
"magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="],
- "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="],
+ "magicast": ["magicast@0.5.3", "", { "dependencies": { "@babel/parser": "^7.29.3", "@babel/types": "^7.29.0", "source-map-js": "^1.2.1" } }, "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw=="],
+
+ "make-dir": ["make-dir@4.0.0", "", { "dependencies": { "semver": "^7.5.3" } }, "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw=="],
- "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="],
+ "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="],
"mlly": ["mlly@1.8.2", "", { "dependencies": { "acorn": "^8.16.0", "pathe": "^2.0.3", "pkg-types": "^1.3.1", "ufo": "^1.6.3" } }, "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA=="],
+ "modern-screenshot": ["modern-screenshot@4.7.0", "", {}, "sha512-9YxN+ddPSMMlhylOv25VHzXrl9u67QRxoh7+SEewGtgUw7t6hHTrjptSDJUSne9oG4Xk/h2cwG15nIt4Hc9ujg=="],
+
"mri": ["mri@1.2.0", "", {}, "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA=="],
"mrmime": ["mrmime@2.0.1", "", {}, "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ=="],
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
- "nanoid": ["nanoid@3.3.16", "", { "bin": "bin/nanoid.cjs" }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="],
+ "nanoid": ["nanoid@3.3.16", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q=="],
"obug": ["obug@2.1.4", "", {}, "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA=="],
"orderedmap": ["orderedmap@2.1.1", "", {}, "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g=="],
- "oxlint": ["oxlint@1.74.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.74.0", "@oxlint/binding-android-arm64": "1.74.0", "@oxlint/binding-darwin-arm64": "1.74.0", "@oxlint/binding-darwin-x64": "1.74.0", "@oxlint/binding-freebsd-x64": "1.74.0", "@oxlint/binding-linux-arm-gnueabihf": "1.74.0", "@oxlint/binding-linux-arm-musleabihf": "1.74.0", "@oxlint/binding-linux-arm64-gnu": "1.74.0", "@oxlint/binding-linux-arm64-musl": "1.74.0", "@oxlint/binding-linux-ppc64-gnu": "1.74.0", "@oxlint/binding-linux-riscv64-gnu": "1.74.0", "@oxlint/binding-linux-riscv64-musl": "1.74.0", "@oxlint/binding-linux-s390x-gnu": "1.74.0", "@oxlint/binding-linux-x64-gnu": "1.74.0", "@oxlint/binding-linux-x64-musl": "1.74.0", "@oxlint/binding-openharmony-arm64": "1.74.0", "@oxlint/binding-win32-arm64-msvc": "1.74.0", "@oxlint/binding-win32-ia32-msvc": "1.74.0", "@oxlint/binding-win32-x64-msvc": "1.74.0" }, "peerDependencies": { "oxlint-tsgolint": ">=0.24.0", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": "bin/oxlint" }, "sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA=="],
+ "oxlint": ["oxlint@1.77.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.77.0", "@oxlint/binding-android-arm64": "1.77.0", "@oxlint/binding-darwin-arm64": "1.77.0", "@oxlint/binding-darwin-x64": "1.77.0", "@oxlint/binding-freebsd-x64": "1.77.0", "@oxlint/binding-linux-arm-gnueabihf": "1.77.0", "@oxlint/binding-linux-arm-musleabihf": "1.77.0", "@oxlint/binding-linux-arm64-gnu": "1.77.0", "@oxlint/binding-linux-arm64-musl": "1.77.0", "@oxlint/binding-linux-ppc64-gnu": "1.77.0", "@oxlint/binding-linux-riscv64-gnu": "1.77.0", "@oxlint/binding-linux-riscv64-musl": "1.77.0", "@oxlint/binding-linux-s390x-gnu": "1.77.0", "@oxlint/binding-linux-x64-gnu": "1.77.0", "@oxlint/binding-linux-x64-musl": "1.77.0", "@oxlint/binding-openharmony-arm64": "1.77.0", "@oxlint/binding-win32-arm64-msvc": "1.77.0", "@oxlint/binding-win32-ia32-msvc": "1.77.0", "@oxlint/binding-win32-x64-msvc": "1.77.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg=="],
- "package-manager-detector": ["package-manager-detector@1.7.0", "", {}, "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ=="],
+ "package-manager-detector": ["package-manager-detector@1.8.0", "", {}, "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A=="],
"parse5": ["parse5@8.0.1", "", { "dependencies": { "entities": "^8.0.0" } }, "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw=="],
@@ -509,19 +482,17 @@
"pkg-types": ["pkg-types@2.3.1", "", { "dependencies": { "confbox": "^0.2.4", "exsolve": "^1.0.8", "pathe": "^2.0.3" } }, "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg=="],
- "playwright": ["playwright@1.61.1", "", { "dependencies": { "playwright-core": "1.61.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": "cli.js" }, "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ=="],
+ "playwright": ["playwright@1.62.1", "", { "dependencies": { "playwright-core": "1.62.1" }, "optionalDependencies": { "fsevents": "2.3.2" }, "bin": { "playwright": "cli.js" } }, "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg=="],
- "playwright-core": ["playwright-core@1.61.1", "", { "bin": "cli.js" }, "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg=="],
+ "playwright-core": ["playwright-core@1.62.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw=="],
- "postcss": ["postcss@8.5.20", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug=="],
+ "postcss": ["postcss@8.5.25", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw=="],
- "prettier": ["prettier@3.9.5", "", { "bin": "bin/prettier.cjs" }, "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg=="],
+ "prettier": ["prettier@3.9.6", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="],
"prettier-plugin-svelte": ["prettier-plugin-svelte@4.1.1", "", { "peerDependencies": { "prettier": "^3.0.0", "svelte": "^5.0.0" } }, "sha512-wXvbXMjSvb4C9ENWTHXyd+ihakKCsJ6rJhLP6/8HFNj4GkZr48jqL9PoKsl2sk7SyCZRTnJ7O2TTowUpOxP/KA=="],
- "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.8.1", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports"] }, "sha512-iaFMYqDsE4ffdDkn5qup0j5f2aCEBFZrdrZnvu9QKTlWx/iGPeQ4HHu7b7fCPMxeo9nwQBiOAh2nSypdFYWJkw=="],
-
- "pretty-format": ["pretty-format@27.5.1", "", { "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", "react-is": "^17.0.1" } }, "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ=="],
+ "prettier-plugin-tailwindcss": ["prettier-plugin-tailwindcss@0.8.1", "", { "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", "@prettier/plugin-hermes": "*", "@prettier/plugin-oxc": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@trivago/prettier-plugin-sort-imports": "*", "@zackad/prettier-plugin-twig": "*", "prettier": "^3.0", "prettier-plugin-astro": "*", "prettier-plugin-css-order": "*", "prettier-plugin-jsdoc": "*", "prettier-plugin-marko": "*", "prettier-plugin-multiline-arrays": "*", "prettier-plugin-organize-attributes": "*", "prettier-plugin-organize-imports": "*", "prettier-plugin-sort-imports": "*", "prettier-plugin-svelte": "*" }, "optionalPeers": ["@ianvs/prettier-plugin-sort-imports", "@prettier/plugin-hermes", "@prettier/plugin-oxc", "@prettier/plugin-pug", "@shopify/prettier-plugin-liquid", "@trivago/prettier-plugin-sort-imports", "@zackad/prettier-plugin-twig", "prettier-plugin-astro", "prettier-plugin-css-order", "prettier-plugin-jsdoc", "prettier-plugin-marko", "prettier-plugin-multiline-arrays", "prettier-plugin-organize-attributes", "prettier-plugin-organize-imports", "prettier-plugin-sort-imports", "prettier-plugin-svelte"] }, "sha512-iaFMYqDsE4ffdDkn5qup0j5f2aCEBFZrdrZnvu9QKTlWx/iGPeQ4HHu7b7fCPMxeo9nwQBiOAh2nSypdFYWJkw=="],
"prosemirror-changeset": ["prosemirror-changeset@2.4.1", "", { "dependencies": { "prosemirror-transform": "^1.0.0" } }, "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw=="],
@@ -553,24 +524,20 @@
"quansync": ["quansync@0.2.11", "", {}, "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA=="],
- "react-is": ["react-is@17.0.2", "", {}, "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="],
-
"readdirp": ["readdirp@4.1.2", "", {}, "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg=="],
- "redent": ["redent@3.0.0", "", { "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" } }, "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg=="],
-
"require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="],
- "rolldown": ["rolldown@1.1.5", "", { "dependencies": { "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.5", "@rolldown/binding-darwin-arm64": "1.1.5", "@rolldown/binding-darwin-x64": "1.1.5", "@rolldown/binding-freebsd-x64": "1.1.5", "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", "@rolldown/binding-linux-arm64-gnu": "1.1.5", "@rolldown/binding-linux-arm64-musl": "1.1.5", "@rolldown/binding-linux-ppc64-gnu": "1.1.5", "@rolldown/binding-linux-s390x-gnu": "1.1.5", "@rolldown/binding-linux-x64-gnu": "1.1.5", "@rolldown/binding-linux-x64-musl": "1.1.5", "@rolldown/binding-openharmony-arm64": "1.1.5", "@rolldown/binding-wasm32-wasi": "1.1.5", "@rolldown/binding-win32-arm64-msvc": "1.1.5", "@rolldown/binding-win32-x64-msvc": "1.1.5" }, "bin": "bin/cli.mjs" }, "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA=="],
+ "rolldown": ["rolldown@1.2.2", "", { "dependencies": { "@oxc-project/types": "=0.142.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.2.2", "@rolldown/binding-darwin-arm64": "1.2.2", "@rolldown/binding-darwin-x64": "1.2.2", "@rolldown/binding-freebsd-x64": "1.2.2", "@rolldown/binding-linux-arm-gnueabihf": "1.2.2", "@rolldown/binding-linux-arm64-gnu": "1.2.2", "@rolldown/binding-linux-arm64-musl": "1.2.2", "@rolldown/binding-linux-ppc64-gnu": "1.2.2", "@rolldown/binding-linux-s390x-gnu": "1.2.2", "@rolldown/binding-linux-x64-gnu": "1.2.2", "@rolldown/binding-linux-x64-musl": "1.2.2", "@rolldown/binding-openharmony-arm64": "1.2.2", "@rolldown/binding-win32-arm64-msvc": "1.2.2", "@rolldown/binding-win32-x64-msvc": "1.2.2" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A=="],
"rope-sequence": ["rope-sequence@1.3.4", "", {}, "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ=="],
- "runed": ["runed@0.35.1", "", { "dependencies": { "dequal": "^2.0.3", "esm-env": "^1.0.0", "lz-string": "^1.5.0" }, "peerDependencies": { "@sveltejs/kit": "^2.21.0", "svelte": "^5.7.0" } }, "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q=="],
-
"sade": ["sade@1.8.1", "", { "dependencies": { "mri": "^1.1.0" } }, "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A=="],
"saxes": ["saxes@6.0.0", "", { "dependencies": { "xmlchars": "^2.2.0" } }, "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA=="],
+ "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="],
+
"set-cookie-parser": ["set-cookie-parser@3.1.2", "", {}, "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw=="],
"siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="],
@@ -583,34 +550,26 @@
"std-env": ["std-env@4.2.0", "", {}, "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw=="],
- "strip-indent": ["strip-indent@3.0.0", "", { "dependencies": { "min-indent": "^1.0.0" } }, "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ=="],
-
"strtok3": ["strtok3@10.3.5", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA=="],
- "style-to-object": ["style-to-object@1.0.14", "", { "dependencies": { "inline-style-parser": "0.2.7" } }, "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw=="],
+ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="],
- "svelte": ["svelte@5.56.6", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.10", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.8.1", "esm-env": "^1.2.1", "esrap": "^2.2.12", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-p4HDLDogGHKRKCrgckQHNs5PEfXkju6JI5jTywueaKJI5hAdjPohEhRtQ0M1SWC/+TA73SPln+r7srr+7e4nZA=="],
+ "svelte": ["svelte@5.56.8", "", { "dependencies": { "@jridgewell/remapping": "^2.3.4", "@jridgewell/sourcemap-codec": "^1.5.0", "@sveltejs/acorn-typescript": "^1.0.10", "@types/estree": "^1.0.5", "@types/trusted-types": "^2.0.7", "acorn": "^8.12.1", "aria-query": "5.3.1", "axobject-query": "^4.1.0", "clsx": "^2.1.1", "devalue": "^5.8.1", "esm-env": "^1.2.1", "esrap": "^2.2.12", "is-reference": "^3.0.3", "locate-character": "^3.0.0", "magic-string": "^0.30.11", "zimmerframe": "^1.1.2" } }, "sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg=="],
"svelte-awesome-color-picker": ["svelte-awesome-color-picker@4.1.3", "", { "dependencies": { "colord": "^2.9.3", "svelte-awesome-slider": "2.0.0" }, "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-fYio6XR2vp9WO0ihT6Vlw1Kj278gEZtqfIRde4YBx5OgGjBdQJxFE8jl6OibPQPrmaz625HZPZaSbRflL88/Mg=="],
"svelte-awesome-slider": ["svelte-awesome-slider@2.0.0", "", { "peerDependencies": { "svelte": "^5.0.0" } }, "sha512-YBkOdYm1Feaqsn2JkJBRs+Kc/X3Qy/3GuVmI7GmoYDjBaHkjx9uH4khTuED22z57Hg3gGWeDhp/clIjWDdLNaw=="],
- "svelte-check": ["svelte-check@4.7.3", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "@sveltejs/load-config": "^0.2.0", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": ">=5.0.0" }, "bin": "bin/svelte-check" }, "sha512-DHdTCGX62R0fCxBEaT+USdASAnoaRBaaNczkRJl0K7o3WyoCeVUbVxo6fKqpOll/B+WMWCsiFK0eFrJSNBKZIg=="],
-
- "svelte-highlight": ["svelte-highlight@7.16.0", "", { "dependencies": { "magic-string": "^0.30.17" } }, "sha512-0H7RwC+mvV/aZ7gFsg5bEDtFHsWlirKFlpw7HImjMQTclq3/bWjgtYV2sgMma90DU9H72G3J8n7fTlTUFWk76w=="],
+ "svelte-check": ["svelte-check@4.7.4", "", { "dependencies": { "@jridgewell/trace-mapping": "^0.3.25", "@sveltejs/load-config": "^0.2.1", "chokidar": "^4.0.1", "fdir": "^6.2.0", "picocolors": "^1.0.0", "sade": "^1.7.4" }, "peerDependencies": { "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.0.0 || ^6.0.0" }, "bin": { "svelte-check": "bin/svelte-check" } }, "sha512-IW9ot9YqAoyv8FvyN+eb4ZTe8zgcKZrJLNYU6dzSKkGwEBsSPc4K7lmQ8bKn8W2YMXM6WDfZSSVOaGtekyUfOQ=="],
- "svelte-toolbelt": ["svelte-toolbelt@0.10.6", "", { "dependencies": { "clsx": "^2.1.1", "runed": "^0.35.1", "style-to-object": "^1.0.8" }, "peerDependencies": { "svelte": "^5.30.2" } }, "sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ=="],
+ "svelte-highlight": ["svelte-highlight@7.16.2", "", { "dependencies": { "magic-string": "^0.30.17" } }, "sha512-vJkp8F5mVEvJNPnunqjxn8xr4GcsYwkIet7ITyAk88/UEqD5L/HSOjlJTqtlC707csndA/Qy8N0Ie7UXyOe3fQ=="],
"symbol-tree": ["symbol-tree@3.2.4", "", {}, "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw=="],
- "tabbable": ["tabbable@6.5.0", "", {}, "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA=="],
-
"tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="],
"tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="],
- "text-segmentation": ["text-segmentation@1.0.3", "", { "dependencies": { "utrie": "^1.0.2" } }, "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw=="],
-
"tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="],
"tinyexec": ["tinyexec@1.2.4", "", {}, "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg=="],
@@ -621,7 +580,7 @@
"tippy.js": ["tippy.js@6.3.7", "", { "dependencies": { "@popperjs/core": "^2.9.0" } }, "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ=="],
- "tldts": ["tldts@7.4.9", "", { "dependencies": { "tldts-core": "^7.4.9" }, "bin": "bin/cli.js" }, "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA=="],
+ "tldts": ["tldts@7.4.9", "", { "dependencies": { "tldts-core": "^7.4.9" }, "bin": { "tldts": "bin/cli.js" } }, "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA=="],
"tldts-core": ["tldts-core@7.4.9", "", {}, "sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg=="],
@@ -649,15 +608,13 @@
"unplugin": ["unplugin@2.3.11", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "acorn": "^8.15.0", "picomatch": "^4.0.3", "webpack-virtual-modules": "^0.6.2" } }, "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww=="],
- "unplugin-icons": ["unplugin-icons@23.0.1", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/utils": "^3.1.0", "local-pkg": "^1.1.2", "obug": "^2.1.1", "unplugin": "^2.3.11" }, "peerDependencies": { "@svgr/core": ">=7.0.0", "@svgx/core": "^1.0.1", "@vue/compiler-sfc": "^3.0.2", "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["@svgr/core", "@svgx/core", "@vue/compiler-sfc"] }, "sha512-rv0XEJepajKzDLvRUWASM8K+8+/CCfZn2jtogXqg6RIp7kpatRc/aFrVJn8ANQA09e++lPEEv9yX8cC9enc+QQ=="],
-
- "utrie": ["utrie@1.0.2", "", { "dependencies": { "base64-arraybuffer": "^1.0.2" } }, "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw=="],
+ "unplugin-icons": ["unplugin-icons@23.0.1", "", { "dependencies": { "@antfu/install-pkg": "^1.1.0", "@iconify/utils": "^3.1.0", "local-pkg": "^1.1.2", "obug": "^2.1.1", "unplugin": "^2.3.11" }, "peerDependencies": { "@svgr/core": ">=7.0.0", "@svgx/core": "^1.0.1", "@vue/compiler-sfc": "^3.0.2", "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0" }, "optionalPeers": ["@svgr/core", "@svgx/core", "@vue/compiler-sfc", "svelte"] }, "sha512-rv0XEJepajKzDLvRUWASM8K+8+/CCfZn2jtogXqg6RIp7kpatRc/aFrVJn8ANQA09e++lPEEv9yX8cC9enc+QQ=="],
- "vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@vitejs/devtools", "esbuild", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": "bin/vite.js" }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="],
+ "vite": ["vite@8.2.0", "", { "dependencies": { "lightningcss": "^1.33.0", "picomatch": "^4.0.5", "postcss": "^8.5.23", "rolldown": "~1.2.0", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.4.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ=="],
- "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" } }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
+ "vitefu": ["vitefu@1.1.3", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="],
- "vitest": ["vitest@4.1.10", "", { "dependencies": { "@vitest/expect": "4.1.10", "@vitest/mocker": "4.1.10", "@vitest/pretty-format": "4.1.10", "@vitest/runner": "4.1.10", "@vitest/snapshot": "4.1.10", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.10", "@vitest/browser-preview": "4.1.10", "@vitest/browser-webdriverio": "4.1.10", "@vitest/coverage-istanbul": "4.1.10", "@vitest/coverage-v8": "4.1.10", "@vitest/ui": "4.1.10", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom"], "bin": "vitest.mjs" }, "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw=="],
+ "vitest": ["vitest@4.1.10", "", { "dependencies": { "@vitest/expect": "4.1.10", "@vitest/mocker": "4.1.10", "@vitest/pretty-format": "4.1.10", "@vitest/runner": "4.1.10", "@vitest/snapshot": "4.1.10", "@vitest/spy": "4.1.10", "@vitest/utils": "4.1.10", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", "obug": "^2.1.1", "pathe": "^2.0.3", "picomatch": "^4.0.3", "std-env": "^4.0.0-rc.1", "tinybench": "^2.9.0", "tinyexec": "^1.0.2", "tinyglobby": "^0.2.15", "tinyrainbow": "^3.1.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", "@vitest/browser-playwright": "4.1.10", "@vitest/browser-preview": "4.1.10", "@vitest/browser-webdriverio": "4.1.10", "@vitest/coverage-istanbul": "4.1.10", "@vitest/coverage-v8": "4.1.10", "@vitest/ui": "4.1.10", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@opentelemetry/api", "@types/node", "@vitest/browser-playwright", "@vitest/browser-preview", "@vitest/browser-webdriverio", "@vitest/coverage-istanbul", "@vitest/coverage-v8", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "./vitest.mjs" } }, "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw=="],
"w3c-keyname": ["w3c-keyname@2.2.8", "", {}, "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ=="],
@@ -671,7 +628,7 @@
"whatwg-url": ["whatwg-url@16.0.1", "", { "dependencies": { "@exodus/bytes": "^1.11.0", "tr46": "^6.0.0", "webidl-conversions": "^8.0.1" } }, "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw=="],
- "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": "cli.js" }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
+ "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="],
"xml-name-validator": ["xml-name-validator@5.0.0", "", {}, "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg=="],
@@ -679,16 +636,82 @@
"zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="],
- "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="],
+ "@tailwindcss/node/lightningcss": ["lightningcss@1.32.0", "", { "dependencies": { "detect-libc": "^2.0.3" }, "optionalDependencies": { "lightningcss-android-arm64": "1.32.0", "lightningcss-darwin-arm64": "1.32.0", "lightningcss-darwin-x64": "1.32.0", "lightningcss-freebsd-x64": "1.32.0", "lightningcss-linux-arm-gnueabihf": "1.32.0", "lightningcss-linux-arm64-gnu": "1.32.0", "lightningcss-linux-arm64-musl": "1.32.0", "lightningcss-linux-x64-gnu": "1.32.0", "lightningcss-linux-x64-musl": "1.32.0", "lightningcss-win32-arm64-msvc": "1.32.0", "lightningcss-win32-x64-msvc": "1.32.0" } }, "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.2", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-TC8MkTuZUtcTSiFeuC0ksCh9QIJ5+F21MvZ4Wn4ORfYaFJ/0dsiudv5tVkejgwZlwQ39jL9WWDe2lz8x0WglOA=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-kyOl3X0DuTiT1h2ft8r2fYO8JYtU9a9Xis/zBSiGArNaagCOWx90N1k2wxp18czFDH+OgcWGb5ZP/XMt3dcyPA=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@emnapi/wasi-threads": ["@emnapi/wasi-threads@1.2.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime": ["@napi-rs/wasm-runtime@1.1.6", "", { "dependencies": { "@tybys/wasm-util": "^0.10.3" }, "peerDependencies": { "@emnapi/core": "^1.7.1", "@emnapi/runtime": "^1.7.1" }, "bundled": true }, "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg=="],
+
+ "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="],
- "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="],
+ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
"mlly/pkg-types": ["pkg-types@1.3.1", "", { "dependencies": { "confbox": "^0.1.8", "mlly": "^1.7.4", "pathe": "^2.0.1" } }, "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ=="],
"playwright/fsevents": ["fsevents@2.3.2", "", { "os": "darwin" }, "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA=="],
- "svelte/aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="],
+ "vitest/vite": ["vite@8.1.5", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.17", "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "@vitejs/devtools": "^0.3.0", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "@vitejs/devtools", "esbuild", "jiti", "less", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-android-arm64": ["lightningcss-android-arm64@1.32.0", "", { "os": "android", "cpu": "arm64" }, "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-darwin-arm64": ["lightningcss-darwin-arm64@1.32.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-darwin-x64": ["lightningcss-darwin-x64@1.32.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-freebsd-x64": ["lightningcss-freebsd-x64@1.32.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-linux-arm-gnueabihf": ["lightningcss-linux-arm-gnueabihf@1.32.0", "", { "os": "linux", "cpu": "arm" }, "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-gnu": ["lightningcss-linux-arm64-gnu@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-linux-arm64-musl": ["lightningcss-linux-arm64-musl@1.32.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-linux-x64-gnu": ["lightningcss-linux-x64-gnu@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-linux-x64-musl": ["lightningcss-linux-x64-musl@1.32.0", "", { "os": "linux", "cpu": "x64" }, "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-win32-arm64-msvc": ["lightningcss-win32-arm64-msvc@1.32.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw=="],
+
+ "@tailwindcss/node/lightningcss/lightningcss-win32-x64-msvc": ["lightningcss-win32-x64-msvc@1.32.0", "", { "os": "win32", "cpu": "x64" }, "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q=="],
"mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="],
+
+ "vitest/vite/postcss": ["postcss@8.5.22", "", { "dependencies": { "nanoid": "^3.3.16", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-KBDEIpLrvpv16pp3K0Fw+UCoZfopFjjgeB+0tA/aaThfEE74kKDLrgg603YvOWJyg3+WYtyq3xYsQWsIyZlPqQ=="],
+
+ "vitest/vite/rolldown": ["rolldown@1.1.5", "", { "dependencies": { "@oxc-project/types": "=0.139.0", "@rolldown/pluginutils": "^1.0.0" }, "optionalDependencies": { "@rolldown/binding-android-arm64": "1.1.5", "@rolldown/binding-darwin-arm64": "1.1.5", "@rolldown/binding-darwin-x64": "1.1.5", "@rolldown/binding-freebsd-x64": "1.1.5", "@rolldown/binding-linux-arm-gnueabihf": "1.1.5", "@rolldown/binding-linux-arm64-gnu": "1.1.5", "@rolldown/binding-linux-arm64-musl": "1.1.5", "@rolldown/binding-linux-ppc64-gnu": "1.1.5", "@rolldown/binding-linux-s390x-gnu": "1.1.5", "@rolldown/binding-linux-x64-gnu": "1.1.5", "@rolldown/binding-linux-x64-musl": "1.1.5", "@rolldown/binding-openharmony-arm64": "1.1.5", "@rolldown/binding-wasm32-wasi": "1.1.5", "@rolldown/binding-win32-arm64-msvc": "1.1.5", "@rolldown/binding-win32-x64-msvc": "1.1.5" }, "bin": { "rolldown": "./bin/cli.mjs" } }, "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA=="],
+
+ "vitest/vite/rolldown/@oxc-project/types": ["@oxc-project/types@0.139.0", "", {}, "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-android-arm64": ["@rolldown/binding-android-arm64@1.1.5", "", { "os": "android", "cpu": "arm64" }, "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-darwin-arm64": ["@rolldown/binding-darwin-arm64@1.1.5", "", { "os": "darwin", "cpu": "arm64" }, "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-darwin-x64": ["@rolldown/binding-darwin-x64@1.1.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-freebsd-x64": ["@rolldown/binding-freebsd-x64@1.1.5", "", { "os": "freebsd", "cpu": "x64" }, "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-linux-arm-gnueabihf": ["@rolldown/binding-linux-arm-gnueabihf@1.1.5", "", { "os": "linux", "cpu": "arm" }, "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-linux-arm64-gnu": ["@rolldown/binding-linux-arm64-gnu@1.1.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-linux-arm64-musl": ["@rolldown/binding-linux-arm64-musl@1.1.5", "", { "os": "linux", "cpu": "arm64" }, "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-linux-ppc64-gnu": ["@rolldown/binding-linux-ppc64-gnu@1.1.5", "", { "os": "linux", "cpu": "ppc64" }, "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-linux-s390x-gnu": ["@rolldown/binding-linux-s390x-gnu@1.1.5", "", { "os": "linux", "cpu": "s390x" }, "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-linux-x64-gnu": ["@rolldown/binding-linux-x64-gnu@1.1.5", "", { "os": "linux", "cpu": "x64" }, "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-linux-x64-musl": ["@rolldown/binding-linux-x64-musl@1.1.5", "", { "os": "linux", "cpu": "x64" }, "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-openharmony-arm64": ["@rolldown/binding-openharmony-arm64@1.1.5", "", { "os": "none", "cpu": "arm64" }, "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-win32-arm64-msvc": ["@rolldown/binding-win32-arm64-msvc@1.1.5", "", { "os": "win32", "cpu": "arm64" }, "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw=="],
+
+ "vitest/vite/rolldown/@rolldown/binding-win32-x64-msvc": ["@rolldown/binding-win32-x64-msvc@1.1.5", "", { "os": "win32", "cpu": "x64" }, "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA=="],
}
}
diff --git a/package-lock.json b/package-lock.json
index 9bbc507..1834031 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -1,4762 +1,4129 @@
{
- "name": "tools",
- "version": "0.0.1",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "tools",
- "version": "0.0.1",
- "dependencies": {
- "@tiptap/core": "^3.27.4",
- "@tiptap/extension-placeholder": "^3.27.4",
- "@tiptap/pm": "^3.27.4",
- "@tiptap/starter-kit": "^3.27.4",
- "bits-ui": "^2.18.1",
- "html2canvas-pro": "^2.2.4",
- "idb": "^8.0.3",
- "svelte-awesome-color-picker": "^4.1.3",
- "svelte-highlight": "^7.11.0",
- "tippy.js": "^6.3.7",
- "typescript-color-gradient": "^4.2.0"
- },
- "devDependencies": {
- "@iconify-json/tabler": "^1.2.35",
- "@playwright/test": "^1.61.1",
- "@sveltejs/adapter-auto": "^7.0.1",
- "@sveltejs/kit": "^2.69.3",
- "@sveltejs/vite-plugin-svelte": "^7.2.0",
- "@tailwindcss/vite": "^4.3.2",
- "@testing-library/jest-dom": "^6.9.1",
- "@testing-library/svelte": "^5.4.2",
- "@tiptap/extension-color": "^3.27.4",
- "@tiptap/extension-font-family": "^3.27.4",
- "@tiptap/extension-text-style": "^3.27.4",
- "@types/node": "^26.1.1",
- "file-type": "^22.0.1",
- "jsdom": "^29.1.1",
- "oxlint": "^1.74.0",
- "prettier": "^3.9.5",
- "prettier-plugin-svelte": "^4.1.1",
- "prettier-plugin-tailwindcss": "^0.8.0",
- "svelte": "^5.56.5",
- "svelte-check": "^4.7.2",
- "tailwindcss": "^4.3.2",
- "typescript": "^6.0.3",
- "unplugin-icons": "^23.0.1",
- "vite": "^8.1.4",
- "vitest": "^4.1.10"
- }
- },
- "node_modules/@adobe/css-tools": {
- "version": "4.5.0",
- "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.5.0.tgz",
- "integrity": "sha512-6OzddxPio9UiWTCemp4N8cYLV2ZN1ncRnV1cVGtve7dhPOtRkleRyx32GQCYSwDYgaHU3USMm84tNsvKzRCa1Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@antfu/install-pkg": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz",
- "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "package-manager-detector": "^1.3.0",
- "tinyexec": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/@asamuzakjp/css-color": {
- "version": "5.1.11",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/css-color/-/css-color-5.1.11.tgz",
- "integrity": "sha512-KVw6qIiCTUQhByfTd78h2yD1/00waTmm9uy/R7Ck/ctUyAPj+AEDLkQIdJW0T8+qGgj3j5bpNKK7Q3G+LedJWg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@asamuzakjp/generational-cache": "^1.0.1",
- "@csstools/css-calc": "^3.2.0",
- "@csstools/css-color-parser": "^4.1.0",
- "@csstools/css-parser-algorithms": "^4.0.0",
- "@csstools/css-tokenizer": "^4.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- }
- },
- "node_modules/@asamuzakjp/dom-selector": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/dom-selector/-/dom-selector-7.1.1.tgz",
- "integrity": "sha512-67RZDnYRc8H/8MLDgQCDE//zoqVFwajkepHZgmXrbwybzXOEwOWGPYGmALYl9J2DOLfFPPs6kKCqmbzV895hTQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@asamuzakjp/generational-cache": "^1.0.1",
- "@asamuzakjp/nwsapi": "^2.3.9",
- "bidi-js": "^1.0.3",
- "css-tree": "^3.2.1",
- "is-potential-custom-element-name": "^1.0.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- }
- },
- "node_modules/@asamuzakjp/generational-cache": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/generational-cache/-/generational-cache-1.0.1.tgz",
- "integrity": "sha512-wajfB8KqzMCN2KGNFdLkReeHncd0AslUSrvHVvvYWuU8ghncRJoA50kT3zP9MVL0+9g4/67H+cdvBskj9THPzg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- }
- },
- "node_modules/@asamuzakjp/nwsapi": {
- "version": "2.3.9",
- "resolved": "https://registry.npmjs.org/@asamuzakjp/nwsapi/-/nwsapi-2.3.9.tgz",
- "integrity": "sha512-n8GuYSrI9bF7FFZ/SjhwevlHc8xaVlb/7HmHelnc/PZXBD2ZR49NnN9sMMuDdEGPeeRQ5d0hqlSlEpgCX3Wl0Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@babel/code-frame": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz",
- "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.29.7",
- "js-tokens": "^4.0.0",
- "picocolors": "^1.1.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
- "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.29.7",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz",
- "integrity": "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@borewit/text-codec": {
- "version": "0.2.2",
- "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz",
- "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/@bramus/specificity": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/@bramus/specificity/-/specificity-2.4.2.tgz",
- "integrity": "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "css-tree": "^3.0.0"
- },
- "bin": {
- "specificity": "bin/cli.js"
- }
- },
- "node_modules/@csstools/color-helpers": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/@csstools/color-helpers/-/color-helpers-6.1.0.tgz",
- "integrity": "sha512-064IFJdjTfUqnjpCVpMOdbr8FLQBhinbZj6yRv2An2E41O/pLEXqfFRWqGq/SxlE5PEUYTlvWsG2r8MswAVvkg==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT-0",
- "engines": {
- "node": ">=20.19.0"
- }
- },
- "node_modules/@csstools/css-calc": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-calc/-/css-calc-3.2.1.tgz",
- "integrity": "sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=20.19.0"
- },
- "peerDependencies": {
- "@csstools/css-parser-algorithms": "^4.0.0",
- "@csstools/css-tokenizer": "^4.0.0"
- }
- },
- "node_modules/@csstools/css-color-parser": {
- "version": "4.1.9",
- "resolved": "https://registry.npmjs.org/@csstools/css-color-parser/-/css-color-parser-4.1.9.tgz",
- "integrity": "sha512-paQcIaOO53Rk5+YrBaBjm/SgrV4INImjo2BT1DtQRYr+XeTRbeAYlS+jxXp9drqvKmtFnWRJKIalDLhZZDu42A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@csstools/color-helpers": "^6.1.0",
- "@csstools/css-calc": "^3.2.1"
- },
- "engines": {
- "node": ">=20.19.0"
- },
- "peerDependencies": {
- "@csstools/css-parser-algorithms": "^4.0.0",
- "@csstools/css-tokenizer": "^4.0.0"
- }
- },
- "node_modules/@csstools/css-parser-algorithms": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-4.0.0.tgz",
- "integrity": "sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=20.19.0"
- },
- "peerDependencies": {
- "@csstools/css-tokenizer": "^4.0.0"
- }
- },
- "node_modules/@csstools/css-syntax-patches-for-csstree": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.1.6.tgz",
- "integrity": "sha512-TcJCWFbXLPpJYq6z7bfOyjWYJDiDg2/I4gyUC9pqPNqHFRIey0EB0q0L5cSnQDfWJg8Jd6VadakxdIez/3zkqQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT-0",
- "peerDependencies": {
- "css-tree": "^3.2.1"
- },
- "peerDependenciesMeta": {
- "css-tree": {
- "optional": true
- }
- }
- },
- "node_modules/@csstools/css-tokenizer": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-4.0.0.tgz",
- "integrity": "sha512-QxULHAm7cNu72w97JUNCBFODFaXpbDg+dP8b/oWFAZ2MTRppA3U00Y2L1HqaS4J6yBqxwa/Y3nMBaxVKbB/NsA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=20.19.0"
- }
- },
- "node_modules/@emnapi/core": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.11.1.tgz",
- "integrity": "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.2.2",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/runtime": {
- "version": "1.11.1",
- "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.1.tgz",
- "integrity": "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@emnapi/wasi-threads": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.2.tgz",
- "integrity": "sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@exodus/bytes": {
- "version": "1.15.1",
- "resolved": "https://registry.npmjs.org/@exodus/bytes/-/bytes-1.15.1.tgz",
- "integrity": "sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- },
- "peerDependencies": {
- "@noble/hashes": "^1.8.0 || ^2.0.0"
- },
- "peerDependenciesMeta": {
- "@noble/hashes": {
- "optional": true
- }
- }
- },
- "node_modules/@floating-ui/core": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.8.0.tgz",
- "integrity": "sha512-0CIZ5itps/8x7BG8dEIhs53BvCUH2PCoogtakwRTut+Arm58sJooJ0AuZhLw2HJYIR5cMLNPBSS728sPho2khQ==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/utils": "^0.2.12"
- }
- },
- "node_modules/@floating-ui/dom": {
- "version": "1.8.0",
- "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.8.0.tgz",
- "integrity": "sha512-yXSrzeHZBTZadLOlfyhCkJHNeLJnHRnRInwdZ40L7ZiaAtrBwoYlsDrX3v5zB1Utk7CLfzcOVnVVWoXEky7Ceg==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/core": "^1.8.0",
- "@floating-ui/utils": "^0.2.12"
- }
- },
- "node_modules/@floating-ui/utils": {
- "version": "0.2.12",
- "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.12.tgz",
- "integrity": "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww==",
- "license": "MIT"
- },
- "node_modules/@iconify-json/tabler": {
- "version": "1.2.36",
- "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.36.tgz",
- "integrity": "sha512-ACkCKFVdYK2mEt2gIZka1pgjqLPalWv/kdCkRA+aS9X7ehj3grA3fnK53mmSaE6KHX+bkBM0BKAEbKuMUhsPPQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@iconify/types": "*"
- }
- },
- "node_modules/@iconify/types": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
- "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@iconify/utils": {
- "version": "3.1.4",
- "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz",
- "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@antfu/install-pkg": "^1.1.0",
- "@iconify/types": "^2.0.0",
- "import-meta-resolve": "^4.2.0"
- }
- },
- "node_modules/@internationalized/date": {
- "version": "3.12.2",
- "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.12.2.tgz",
- "integrity": "sha512-FY1Y+H64NDs+HAF6omlnWxm3mEpfgaCSWtL5l551ZZfImA+kGjPFgrnJrGjH6lfmLL0g8Z/mBu1R3kufeCp6Jw==",
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "@swc/helpers": "^0.5.0"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.13",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
- "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/remapping": {
- "version": "2.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
- "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.24"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
- "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.31",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
- "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.6",
- "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.6.tgz",
- "integrity": "sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@tybys/wasm-util": "^0.10.3"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Brooooooklyn"
- },
- "peerDependencies": {
- "@emnapi/core": "^1.7.1",
- "@emnapi/runtime": "^1.7.1"
- }
- },
- "node_modules/@oxc-project/types": {
- "version": "0.139.0",
- "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.139.0.tgz",
- "integrity": "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw==",
- "devOptional": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/Boshen"
- }
- },
- "node_modules/@oxlint/binding-android-arm-eabi": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.74.0.tgz",
- "integrity": "sha512-+gHd12muVI9ZLBaWLPkHt3Fj7jihFjgQ1MGtBaRL8vWrWrI0P7dLUty/cHrHS0oqPYIRgQUJsPu2CExQuMcwNw==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-android-arm64": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.74.0.tgz",
- "integrity": "sha512-xjKdoMB+H+RCOByv/7l7nfIGW9mlOisqYdcyC75UqYuQecLpReAeEYUf2CNeDEI3KtmUgxpRw/+c63y4AeF/Bw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-darwin-arm64": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.74.0.tgz",
- "integrity": "sha512-iUK7wvc6sejMKsC+Pt67mntoF5weFcyEunhZfLJceU6gL419mexz5wBkSx/EnkFBExMLNtOi9fnDSc5xfK0IzQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-darwin-x64": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.74.0.tgz",
- "integrity": "sha512-ggKc/tn5SJ1u2yG2izC6VKODfYKV8MQ2AicJlNzOjuyrC29udvOef6/JzK2r32xqCnBDLFouR1VCkjzEI0/N9Q==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-freebsd-x64": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.74.0.tgz",
- "integrity": "sha512-u++dH/43jy9hTLbneaWlS0gla/Bp1JdwJ2zgevCl8nDFUh6qRCGMxcL0f0lb7By3A9p/LfFr+7cG4HU1hG856g==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-arm-gnueabihf": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.74.0.tgz",
- "integrity": "sha512-Sj1zmtFDVTPeIbIz4ZfcXAbFHqCmKCXdCUlAJzvTF7I20NTH1RDpoF2PhkqNODutJzVhJYmm3oz0GwgY+tvE2g==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-arm-musleabihf": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.74.0.tgz",
- "integrity": "sha512-//PKyQb/tQXcHArx2f7z+oVI/eMS2Jpv+edNuAtOrgIhWdGcpHxogveAxzmF2rpH1AIHp4Hq04RF/rgJdiICnQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-arm64-gnu": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.74.0.tgz",
- "integrity": "sha512-/k1Me+aX2tjuH10K62mLS0y8cLkJBHX6Ce0xPK+eWeel4bSdEGZ8dv4+hYMzg0GrSmjwy4yAYsDPeEeKBft/2w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-arm64-musl": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.74.0.tgz",
- "integrity": "sha512-3tFSjBxc5D8/zvjEuLvOqcA8ZXKD0+6NuaVO/edeamNc49MoAsbfaC9s1UiwODwgF6slGaF8yJA2TPkukd77tg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-ppc64-gnu": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.74.0.tgz",
- "integrity": "sha512-9QggtPkSPXOCTu8Szis7auOK/sC7KdQaN+/TujP7YVVhzCAOhgdRfgv8uEz0r2tk5xdgus5rLYUrCDoZNtiRUw==",
- "cpu": [
- "ppc64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-riscv64-gnu": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.74.0.tgz",
- "integrity": "sha512-VM5VPUJ4DJIWiK+AZn8FScUqMr6OFrCAYybMYjEEi7W13ParI64MByiXTkKMqZpBmvQ9zxl9Ebq2VUOiZRJYUg==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-riscv64-musl": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.74.0.tgz",
- "integrity": "sha512-SaDY1gh9rOA592J54g+gu5hkOFFQBZsMmIYHs+NRHG+Uq0OxtuuCXMWQ3vu1830Eugv5uMXyjG+bv2Z9y4IXjw==",
- "cpu": [
- "riscv64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-s390x-gnu": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.74.0.tgz",
- "integrity": "sha512-ZATQeHZCyr6MbDveg0obD5sxLHFOghtOdC5jwVwYlvFWqtFOxctgFEG6Ef/64hYvZrWyhyCckB10AelqLopeDA==",
- "cpu": [
- "s390x"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-x64-gnu": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.74.0.tgz",
- "integrity": "sha512-+aIvJyrdeD7LwCQ2WYLMUWNmnbeDRSPb40aBYtPjD9+PTqUwgJnk+HK5yLfSMeqXrMrDhE9uTmtt2y50tvjhHw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-linux-x64-musl": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.74.0.tgz",
- "integrity": "sha512-XyktaR8lhK2qWiCK0Tk8oYD+/cgn+oHA6ddRnxSSXUKkkojkV78CmShZUxQF+yrBFs0SuW+JBOPG6hecyc/iZg==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-openharmony-arm64": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.74.0.tgz",
- "integrity": "sha512-mzbjrPl4neaVUiJ1fUiEUxTGaSZBoiKtaoB6jmIpz9S+VOA2vDYmJpihQ82w6178V5jxziclTg8Cgj5yF6tTDg==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-win32-arm64-msvc": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.74.0.tgz",
- "integrity": "sha512-vUAe9okpS2Oa5+lX67lqHMuNUvfkleRKwrUDJ/WJBsgmddvZ1mrsh2HVmuFDRzqFELhaJhFaCNOuR6a7L3rtIA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-win32-ia32-msvc": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.74.0.tgz",
- "integrity": "sha512-yyXXJyYYSXL4I8K8jAWjJs+J3fa9gH2JmEbo4f5adm+1tNC9itseicBNuwK7BDHvqQ5J534s+yDULu89vYL2ZQ==",
- "cpu": [
- "ia32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@oxlint/binding-win32-x64-msvc": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.74.0.tgz",
- "integrity": "sha512-VTC9IYTIMrVUk/i6Ms1ohzzDKZFkWn0KU2OBbPBzgmVZ2V30165T/zK4LztTr0Xgp9fZ1qQZ1rsZAu/rEmySlA==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@playwright/test": {
- "version": "1.61.1",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.61.1.tgz",
- "integrity": "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "playwright": "1.61.1"
- },
- "bin": {
- "playwright": "cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@polka/url": {
- "version": "1.0.0-next.29",
- "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
- "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/@popperjs/core": {
- "version": "2.11.8",
- "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
- "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
- "license": "MIT",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/popperjs"
- }
- },
- "node_modules/@rolldown/binding-android-arm64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.1.5.tgz",
- "integrity": "sha512-lZg8fqIv2v7FF237bwMgzGZEJvGL79/s5knJ/i6FmsGF4XXlzccZ4jb+TrFIxtSSxFtIpdsgrPZeMk1I9AFcyQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-arm64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.1.5.tgz",
- "integrity": "sha512-51Bnx9pNiMRKSUNtBfySkNJ9vMU9Hh3I1ozDd6gyPPYzaXCfnptUcEZxXGYFn+ul2dtcMUiqGR1Yai2K10uoTw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-darwin-x64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.1.5.tgz",
- "integrity": "sha512-Tm+gbfC0aHu1tBA/JvKQh32S0K6YgCHkiAF4/W6xX0K0RmNuc94VeK419dJoE65R5aRxmo+noZQSWrAMF6yb6g==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-freebsd-x64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.1.5.tgz",
- "integrity": "sha512-JMzDKCCXq93YccG5gz3hvOs1oXRKAf0XYpfOS88e+wZrC8Iugj6j68867vrYZkvpDDpKn/KoKORThmchMpF6TA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.1.5.tgz",
- "integrity": "sha512-uML21j2K5TfPGutKxub+M+nLjZIrWjXQ5Grx4lCe/nimTj9B4L63zHpjXLl4y0L3mcm2htEQIb06oCG/szerNw==",
- "cpu": [
- "arm"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-gnu": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.1.5.tgz",
- "integrity": "sha512-navSiuTMogvnQoZoM/v+l3ZWo50/NTwSHSzheABx/RCnmUPaKwq9qSo4Br2OYRs21+Fz8uFqITZM3H4opOB0/Q==",
- "cpu": [
- "arm64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-arm64-musl": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.1.5.tgz",
- "integrity": "sha512-lAryqH7IteztmCXQXk0etKj4wBQ7Gx5S6LjKhsgp9zb8I5bsuvU/2llH1hDQcjsFeqIsovMVN339/8pUDDBXxA==",
- "cpu": [
- "arm64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-ppc64-gnu": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.1.5.tgz",
- "integrity": "sha512-fsK/sNBnxzBlL4O1JNrZakVQxPspqpED5dLtNsZS9oOKmtSpdNIzxH2kkol5HYTWJN47sE20ztMJPxfZ89qGOg==",
- "cpu": [
- "ppc64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-s390x-gnu": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.1.5.tgz",
- "integrity": "sha512-gLYb4BIadlfTOYT5gO503n8zQjXflgzpD0FcyKh0Mzx3rqCZKnHoJWV9xe1KXUJ5lx2JfcSHr/mhzS0PC/McAA==",
- "cpu": [
- "s390x"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-gnu": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.1.5.tgz",
- "integrity": "sha512-FjcpEKUyJygHgs1o50VYNvkt5+7Le/VEdYt0AkRpkL33MnyQfwr8l5mXwMmfmTbyMPr5vJLC+8/Gd9gXnwU1QQ==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-linux-x64-musl": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.1.5.tgz",
- "integrity": "sha512-Me+PfPI2TMeOQk0gYWfLQZtTktrmzbr8cDboqX83XKc7UrgAi55gF+2dUkWdxd19n55Essp2yeca+O9N5rBxHg==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-openharmony-arm64": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.1.5.tgz",
- "integrity": "sha512-yc5WrLzXks6zCQfn9Oxr8pORKyl/pF+QjHmW/Qx3qu0oyrrNC+y2JLTU1E2rcWYAmzlnqngWXHQjy51VzW70Vw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "openharmony"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-wasm32-wasi": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.1.5.tgz",
- "integrity": "sha512-VbQGPX2b4r48TAMIM2cjgluIM1HYutm4pcTEJsle7iEP7sB1dFqtPLBVbdLAZCxy1txCcPxf4QFf4v8uvltPqA==",
- "cpu": [
- "wasm32"
- ],
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "1.11.1",
- "@emnapi/runtime": "1.11.1",
- "@napi-rs/wasm-runtime": "^1.1.6"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-arm64-msvc": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.1.5.tgz",
- "integrity": "sha512-gHv82k63z4qpV5+Q1y/12KrK0ltWBukVDI8nZcbT7Tt/ZlOIVwppazneq0F93oDxTo3IgAMEDIoQh3E2n6mVsw==",
- "cpu": [
- "arm64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/binding-win32-x64-msvc": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.1.5.tgz",
- "integrity": "sha512-tTZuDBPw85tEN5PQi1pnEBzDy0Z49HtScLAbD5t6hyeU92A95pRWaSMw1GZZi/RwgSgUIl0xrSlXIT/9QzvYSA==",
- "cpu": [
- "x64"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- }
- },
- "node_modules/@rolldown/pluginutils": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
- "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/@standard-schema/spec": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
- "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/@sveltejs/acorn-typescript": {
- "version": "1.0.11",
- "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.11.tgz",
- "integrity": "sha512-LFuZUkjJ9iF7JZye/aG5XM0SFcQ5VyL0oVX4WJ9dc0Va3R3s0OauX1BESVCb+YN/ol8TAfqGDDAQsTG627Y5kw==",
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^8.9.0"
- }
- },
- "node_modules/@sveltejs/adapter-auto": {
- "version": "7.0.1",
- "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.1.tgz",
- "integrity": "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "@sveltejs/kit": "^2.0.0"
- }
- },
- "node_modules/@sveltejs/kit": {
- "version": "2.70.1",
- "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.70.1.tgz",
- "integrity": "sha512-nY9SPHGOZro3doud9vZXDBwl9tCZIouuJztjgSHs6PAIrv9M/z5O7eOhPV5xU7CgVHA976Jwu3BA1hIFvXztkA==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "@standard-schema/spec": "^1.0.0",
- "@sveltejs/acorn-typescript": "^1.0.9",
- "@types/cookie": "^0.6.0",
- "acorn": "^8.16.0",
- "cookie": "^0.6.0",
- "devalue": "^5.8.1",
- "esm-env": "^1.2.2",
- "kleur": "^4.1.5",
- "magic-string": "^0.30.5",
- "mrmime": "^2.0.0",
- "set-cookie-parser": "^3.0.0",
- "sirv": "^3.0.0"
- },
- "bin": {
- "svelte-kit": "svelte-kit.js"
- },
- "engines": {
- "node": ">=18.13"
- },
- "peerDependencies": {
- "@opentelemetry/api": "^1.0.0",
- "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0",
- "svelte": "^4.0.0 || ^5.0.0-next.0",
- "typescript": "^5.3.3 || ^6.0.0",
- "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@opentelemetry/api": {
- "optional": true
- },
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@sveltejs/load-config": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@sveltejs/load-config/-/load-config-0.2.0.tgz",
- "integrity": "sha512-1LgZ/qUqSoq+QorD83lk2hka79Px0wXNW2q5V1nZlxGhQgw1jrsIbVz5YiCeucVLo4XvFLjXukUaQjIiqowkcg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 18.0.0"
- }
- },
- "node_modules/@sveltejs/vite-plugin-svelte": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.2.0.tgz",
- "integrity": "sha512-1SpkuMSRLfugrVX+IrKfE1RUegzo8AQzKQ6qQPfVzbcWi5IhuTPaKb5ZrLpucleFznkc4/RTeSPoRnGWFxX+EQ==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "deepmerge": "^4.3.1",
- "magic-string": "^0.30.21",
- "obug": "^2.1.0",
- "vitefu": "^1.1.2"
- },
- "engines": {
- "node": "^20.19 || ^22.12 || >=24"
- },
- "peerDependencies": {
- "svelte": "^5.46.4",
- "vite": "^8.0.0-beta.7 || ^8.0.0"
- }
- },
- "node_modules/@swc/helpers": {
- "version": "0.5.23",
- "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.23.tgz",
- "integrity": "sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==",
- "license": "Apache-2.0",
- "peer": true,
- "dependencies": {
- "tslib": "^2.8.0"
- }
- },
- "node_modules/@tailwindcss/node": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz",
- "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/remapping": "^2.3.5",
- "enhanced-resolve": "^5.24.1",
- "jiti": "^2.7.0",
- "lightningcss": "1.32.0",
- "magic-string": "^0.30.21",
- "source-map-js": "^1.2.1",
- "tailwindcss": "4.3.3"
- }
- },
- "node_modules/@tailwindcss/oxide": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz",
- "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 20"
- },
- "optionalDependencies": {
- "@tailwindcss/oxide-android-arm64": "4.3.3",
- "@tailwindcss/oxide-darwin-arm64": "4.3.3",
- "@tailwindcss/oxide-darwin-x64": "4.3.3",
- "@tailwindcss/oxide-freebsd-x64": "4.3.3",
- "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3",
- "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3",
- "@tailwindcss/oxide-linux-arm64-musl": "4.3.3",
- "@tailwindcss/oxide-linux-x64-gnu": "4.3.3",
- "@tailwindcss/oxide-linux-x64-musl": "4.3.3",
- "@tailwindcss/oxide-wasm32-wasi": "4.3.3",
- "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3",
- "@tailwindcss/oxide-win32-x64-msvc": "4.3.3"
- }
- },
- "node_modules/@tailwindcss/oxide-android-arm64": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz",
- "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-arm64": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz",
- "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-darwin-x64": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz",
- "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-freebsd-x64": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz",
- "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz",
- "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==",
- "cpu": [
- "arm"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz",
- "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz",
- "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz",
- "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "glibc"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-linux-x64-musl": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz",
- "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "libc": [
- "musl"
- ],
- "license": "MIT",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz",
- "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==",
- "bundleDependencies": [
- "@napi-rs/wasm-runtime",
- "@emnapi/core",
- "@emnapi/runtime",
- "@tybys/wasm-util",
- "@emnapi/wasi-threads",
- "tslib"
- ],
- "cpu": [
- "wasm32"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/core": "^1.11.1",
- "@emnapi/runtime": "^1.11.1",
- "@emnapi/wasi-threads": "^1.2.2",
- "@napi-rs/wasm-runtime": "^1.1.4",
- "@tybys/wasm-util": "^0.10.2",
- "tslib": "^2.8.1"
- },
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/core": {
- "version": "1.11.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@emnapi/wasi-threads": "1.2.2",
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/runtime": {
- "version": "1.11.1",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@emnapi/wasi-threads": {
- "version": "1.2.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@napi-rs/wasm-runtime": {
- "version": "1.1.4",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "@tybys/wasm-util": "^0.10.1"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Brooooooklyn"
- },
- "peerDependencies": {
- "@emnapi/core": "^1.7.1",
- "@emnapi/runtime": "^1.7.1"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/@tybys/wasm-util": {
- "version": "0.10.2",
- "dev": true,
- "inBundle": true,
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@tailwindcss/oxide-wasm32-wasi/node_modules/tslib": {
- "version": "2.8.1",
- "dev": true,
- "inBundle": true,
- "license": "0BSD",
- "optional": true
- },
- "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz",
- "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==",
- "cpu": [
- "arm64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz",
- "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==",
- "cpu": [
- "x64"
- ],
- "dev": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 20"
- }
- },
- "node_modules/@tailwindcss/vite": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz",
- "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@tailwindcss/node": "4.3.3",
- "@tailwindcss/oxide": "4.3.3",
- "tailwindcss": "4.3.3"
- },
- "peerDependencies": {
- "vite": "^5.2.0 || ^6 || ^7 || ^8"
- }
- },
- "node_modules/@testing-library/dom": {
- "version": "10.4.1",
- "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz",
- "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.10.4",
- "@babel/runtime": "^7.12.5",
- "@types/aria-query": "^5.0.1",
- "aria-query": "5.3.0",
- "dom-accessibility-api": "^0.5.9",
- "lz-string": "^1.5.0",
- "picocolors": "1.1.1",
- "pretty-format": "^27.0.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@testing-library/dom/node_modules/aria-query": {
- "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,
- "license": "Apache-2.0",
- "dependencies": {
- "dequal": "^2.0.3"
- }
- },
- "node_modules/@testing-library/dom/node_modules/dom-accessibility-api": {
- "version": "0.5.16",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz",
- "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@testing-library/jest-dom": {
- "version": "6.9.1",
- "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.9.1.tgz",
- "integrity": "sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@adobe/css-tools": "^4.4.0",
- "aria-query": "^5.0.0",
- "css.escape": "^1.5.1",
- "dom-accessibility-api": "^0.6.3",
- "picocolors": "^1.1.1",
- "redent": "^3.0.0"
- },
- "engines": {
- "node": ">=14",
- "npm": ">=6",
- "yarn": ">=1"
- }
- },
- "node_modules/@testing-library/svelte": {
- "version": "5.4.2",
- "resolved": "https://registry.npmjs.org/@testing-library/svelte/-/svelte-5.4.2.tgz",
- "integrity": "sha512-4o31E4HGo5BU5KwPkulNRocEden+7Tt9JYm9uhln5ajF7DULeyFA46BBWVfKJ8Ms9B3JmOFPTIiVamH7n3KpuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@testing-library/dom": "9.x.x || 10.x.x",
- "@testing-library/svelte-core": "1.1.3"
- },
- "engines": {
- "node": ">= 10"
- },
- "peerDependencies": {
- "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0",
- "vite": "*",
- "vitest": "*"
- },
- "peerDependenciesMeta": {
- "vite": {
- "optional": true
- },
- "vitest": {
- "optional": true
- }
- }
- },
- "node_modules/@testing-library/svelte-core": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/@testing-library/svelte-core/-/svelte-core-1.1.3.tgz",
- "integrity": "sha512-KkMAvXeWorxN2Yn0kdC1lfoAItxpoj4uOWzxK5leDrNxonLvS5nwBFvztrroyTszQ0Wf/EU6iLT8JhY5qcn22g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "svelte": "^3 || ^4 || ^5 || ^5.0.0-next.0"
- }
- },
- "node_modules/@tiptap/core": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.28.0.tgz",
- "integrity": "sha512-gUuD5WAYfbDxNSSJya/emh2KSzXZXLUYKW4fEnc1AQ5FE2twzh4LJ9UlKFIawigrUCAksWI5Fy1hRbv+5m4ZdQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/pm": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-blockquote": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.28.0.tgz",
- "integrity": "sha512-y8Xi6Z3AQLXedz0J8Z3kDsu7SKBmL50gKVXx3RK1Oo1cuCGhNChm3syChkAz3PLAbrPUM5rvJDSZdF2jUrDnng==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0",
- "@tiptap/pm": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-bold": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.28.0.tgz",
- "integrity": "sha512-JhZQmr0AU741bOwjVMfuwJdK4g0TQwwPbeca9aqKHv5zvZw4i4G9G6fESVyMFc3Yag1ffpnq5EtNldHKTnMhlw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-bullet-list": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.28.0.tgz",
- "integrity": "sha512-dSVuNiH7PFMmWGkNER9vfUb5bXUHDARvHbJ3l+APEb+ZiusVN1KFdM3nd/RsW/Rt5Gd3XwlIEU/c2Uf7cxYDcw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extension-list": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-code": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.28.0.tgz",
- "integrity": "sha512-AUw2Acof3CQE6Q6Y22saK4lyg0nkeJ4XXniU65TdAi/9TE66TGiO4NQJJNNPgu8+VMEwl5j8VsIFK8sfTcNYtg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-code-block": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.28.0.tgz",
- "integrity": "sha512-bHITDzT0umTLh+SiEVQzIXkCMt/TzbPM1+HQy9ZxgQDHAJj/vdmfNAnP3RCOrz4lETXyhNQ2b6kxeu3lWckxyA==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0",
- "@tiptap/pm": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-color": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-3.28.0.tgz",
- "integrity": "sha512-YbUMUdrgU04GDYoii1wuFVkiTSQoaEQh04kwgQayEQ46aUBEnnaJitWdp39aGMWYTIXD/c9K9cr5Vg8GSKcVxA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extension-text-style": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-document": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.28.0.tgz",
- "integrity": "sha512-5SAKtlB1Tr/eZFhISL86HqmUup6rItvPtuPyRjmZo/VgbMwXEwiyAh1sMgFp5VNaeSMM14vJSyQpjhSaOmaBqg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-dropcursor": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.28.0.tgz",
- "integrity": "sha512-JA+dXQjjfJBpD0nVsZeddGVXRsmanESM9+8CtM35hI9wJnYMXay/B+5GUhswO20zhT3zhB2ZOTGe9knu6A8nIQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extensions": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-font-family": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-font-family/-/extension-font-family-3.28.0.tgz",
- "integrity": "sha512-SkKnS8RG/ECeuupteMOBCXbj9PxcpumE/3h2I+dYvLVRM+KM6YmAQ6Toq8zRHXcDT28iu42OSn2MlDfpuYsmqg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extension-text-style": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-gapcursor": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.28.0.tgz",
- "integrity": "sha512-Wo73kM4q8z4Va9i4+0n1cO0UEMVUVBHPqM6cAqEYXjB4T48LQkKjRsiQydCezm185rQAsmm1dyi72gtvVQfdMg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extensions": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-hard-break": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.28.0.tgz",
- "integrity": "sha512-JHIFjX1luJgQ4VFEkIeXZpbc54Qiw+69P8FmlazYTh7AIJ6iLCpMFgQFELnivEAZ+/vS0lMPQubg0rCeM3UrHw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-heading": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.28.0.tgz",
- "integrity": "sha512-rKjGG/Ik2lNaXBNVmONEDm5DBfGDLM1NWgSf5RRfBISrH8Lm1xqFruOB9tIaB0YUoSV3SBOiwTF9svmzvKSoRA==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-horizontal-rule": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.28.0.tgz",
- "integrity": "sha512-neBCMWprkppQUoLWyeJZDHqBw+xKX2oNhLD9MbFlhKIr092zgfP4mpCvQnSkn1OHl156KzZMp070+NyLBjgQ7A==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0",
- "@tiptap/pm": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-italic": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.28.0.tgz",
- "integrity": "sha512-Yur/ELz6dNVKQC7m8wGjtoLFxamGjJmA0rUEEOacTH6J39aFmcSxYkEGNDkYHbZFyHFYqbej6eI3VE0h08O0mg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-link": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.28.0.tgz",
- "integrity": "sha512-hy/PqSeTyl317yseFcHGE+3XVfQKQYaL4uZuj27xlrcO7MZ15drt1h9sUZy1FTBF3mr8676pQu7aoEm/Ww4ZRA==",
- "license": "MIT",
- "dependencies": {
- "linkifyjs": "^4.3.3"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0",
- "@tiptap/pm": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-list": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.28.0.tgz",
- "integrity": "sha512-zQ66i5DuhVOndmZ0d7H475Y5Yb+BMx+zfCjFkCzEc6WVef5MumtxBVTkGLQ0ibxUaD71s4QQZbjHWagpaTg0eQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0",
- "@tiptap/pm": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-list-item": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.28.0.tgz",
- "integrity": "sha512-GbXrnMac6knSetZY33NHwOrgXFPqH28uCklQqmOZQlsrdGqezDKk31qoEMr4GsKW9n/lViAeuc07oIzwLwCMng==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extension-list": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-list-keymap": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.28.0.tgz",
- "integrity": "sha512-u9Wks8c/eQAv0RkULNggOyTKDD69WVbcV9H5cbasPDUbq5XbEFVa9ajxhEGfMmQ5et3EX0QL8qBi50K0GqbIjA==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extension-list": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-ordered-list": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.28.0.tgz",
- "integrity": "sha512-OZNYrKKL9D01ySOujlNbKlLS9/3wGgKNYeoHZUg0e+Ta8WPVvL3W1zH6TgiU5sF2ZSGUBoq3w7mdaO/iROlUkw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extension-list": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-paragraph": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.28.0.tgz",
- "integrity": "sha512-8UMlQIjzqf6r2hSJ/VeJ00RqaOrOB1J5rTk02Vcw2pYeHkOqp+B0ff0HFu4abT9x1q4oXrBAgMsxRtgh/kR14Q==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-placeholder": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.28.0.tgz",
- "integrity": "sha512-zueiqNeCHOshDa8dGGSa/0cOBZkMjPrxQhemjF4tj2yZ6EeWHBPtCE5h/uQCagEePxsoaJtvaCRh88199zrgBw==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/extensions": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-strike": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.28.0.tgz",
- "integrity": "sha512-VVj2ZZU9QYqiHLcjqMqRYvuHSsokj/AgUl+6TzLrKjlWwyZ18D4H2vkyI0g70iVTKnUpZ3sEy8WA/rqjgBjqBg==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-text": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.28.0.tgz",
- "integrity": "sha512-Jqp1LgfY1mnp4TQHoy+vnHyfn6qnnAM6nHgGwbY5zA8b/Xf1Etll6pziTx9p1J1qcfAgSrnjOyAmA++H7VQqww==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-text-style": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-3.28.0.tgz",
- "integrity": "sha512-UreMyqZSv770+CXJK/l1qeHUdaNMQAVkxSOPWpiY9FiT8B4OQyjA7WBOlWrzbvVTzfJvXWk2Y3SWgVRx+/Cd9A==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extension-underline": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.28.0.tgz",
- "integrity": "sha512-rwxCS6vTh2DJkNIYQX7JSrrRSmm76e2y48aZeuZO5ShkvLWMuJ3/zqDHRxAQVDiJhuE2Cp8NrTmPYlUc9YrT0A==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0"
- }
- },
- "node_modules/@tiptap/extensions": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.28.0.tgz",
- "integrity": "sha512-DJT1khCK+O/pT1gQlAnoKAx6zwDkgv7GtnhSfkqm1/4KHC3x+SSJnBIgBl9oGHymA+DxWbW1EULU4V3d/kT2uQ==",
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- },
- "peerDependencies": {
- "@tiptap/core": "3.28.0",
- "@tiptap/pm": "3.28.0"
- }
- },
- "node_modules/@tiptap/pm": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.28.0.tgz",
- "integrity": "sha512-ALcpwZMUdat9gjJKlpscpoqXStoLhU246LPEVBDvJdIsoUKvUu3MrzfXik2Y8mtSGfhjtm9O2TRkWxQiFVMwsQ==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-changeset": "^2.4.1",
- "prosemirror-commands": "^1.7.1",
- "prosemirror-dropcursor": "^1.8.2",
- "prosemirror-gapcursor": "^1.4.1",
- "prosemirror-history": "^1.5.0",
- "prosemirror-inputrules": "^1.5.1",
- "prosemirror-keymap": "^1.2.3",
- "prosemirror-model": "^1.25.9",
- "prosemirror-schema-list": "^1.5.1",
- "prosemirror-state": "^1.4.4",
- "prosemirror-tables": "^1.8.5",
- "prosemirror-transform": "^1.12.0",
- "prosemirror-view": "^1.41.9"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- }
- },
- "node_modules/@tiptap/starter-kit": {
- "version": "3.28.0",
- "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.28.0.tgz",
- "integrity": "sha512-pqvFpValV+ONtlu3l4s73ROm/tEjoGMmt6uHmSJaLbqTcMHkdWuR3flJ/5brr4IDHe1foxmNicMbRxlje7yBYw==",
- "license": "MIT",
- "dependencies": {
- "@tiptap/core": "^3.28.0",
- "@tiptap/extension-blockquote": "^3.28.0",
- "@tiptap/extension-bold": "^3.28.0",
- "@tiptap/extension-bullet-list": "^3.28.0",
- "@tiptap/extension-code": "^3.28.0",
- "@tiptap/extension-code-block": "^3.28.0",
- "@tiptap/extension-document": "^3.28.0",
- "@tiptap/extension-dropcursor": "^3.28.0",
- "@tiptap/extension-gapcursor": "^3.28.0",
- "@tiptap/extension-hard-break": "^3.28.0",
- "@tiptap/extension-heading": "^3.28.0",
- "@tiptap/extension-horizontal-rule": "^3.28.0",
- "@tiptap/extension-italic": "^3.28.0",
- "@tiptap/extension-link": "^3.28.0",
- "@tiptap/extension-list": "^3.28.0",
- "@tiptap/extension-list-item": "^3.28.0",
- "@tiptap/extension-list-keymap": "^3.28.0",
- "@tiptap/extension-ordered-list": "^3.28.0",
- "@tiptap/extension-paragraph": "^3.28.0",
- "@tiptap/extension-strike": "^3.28.0",
- "@tiptap/extension-text": "^3.28.0",
- "@tiptap/extension-underline": "^3.28.0",
- "@tiptap/extensions": "^3.28.0",
- "@tiptap/pm": "^3.28.0"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/ueberdosis"
- }
- },
- "node_modules/@tokenizer/inflate": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
- "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.3",
- "token-types": "^6.1.1"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/@tokenizer/token": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
- "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@tybys/wasm-util": {
- "version": "0.10.3",
- "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz",
- "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==",
- "license": "MIT",
- "optional": true,
- "dependencies": {
- "tslib": "^2.4.0"
- }
- },
- "node_modules/@types/aria-query": {
- "version": "5.0.4",
- "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz",
- "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/chai": {
- "version": "5.2.3",
- "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
- "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/deep-eql": "*",
- "assertion-error": "^2.0.1"
- }
- },
- "node_modules/@types/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/@types/deep-eql": {
- "version": "4.0.2",
- "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
- "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/estree": {
- "version": "1.0.9",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
- "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "26.1.1",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.1.tgz",
- "integrity": "sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "undici-types": "~8.3.0"
- }
- },
- "node_modules/@types/trusted-types": {
- "version": "2.0.7",
- "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
- "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
- "license": "MIT"
- },
- "node_modules/@vitest/expect": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz",
- "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@standard-schema/spec": "^1.1.0",
- "@types/chai": "^5.2.2",
- "@vitest/spy": "4.1.10",
- "@vitest/utils": "4.1.10",
- "chai": "^6.2.2",
- "tinyrainbow": "^3.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/mocker": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz",
- "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/spy": "4.1.10",
- "estree-walker": "^3.0.3",
- "magic-string": "^0.30.21"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- },
- "peerDependencies": {
- "msw": "^2.4.9",
- "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "msw": {
- "optional": true
- },
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/@vitest/pretty-format": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz",
- "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tinyrainbow": "^3.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/runner": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz",
- "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/utils": "4.1.10",
- "pathe": "^2.0.3"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/snapshot": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz",
- "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/pretty-format": "4.1.10",
- "@vitest/utils": "4.1.10",
- "magic-string": "^0.30.21",
- "pathe": "^2.0.3"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/spy": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz",
- "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/@vitest/utils": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
- "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/pretty-format": "4.1.10",
- "convert-source-map": "^2.0.0",
- "tinyrainbow": "^3.1.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- }
- },
- "node_modules/acorn": {
- "version": "8.17.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz",
- "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==",
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
- "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/aria-query": {
- "version": "5.3.2",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
- "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/assertion-error": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
- "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/axobject-query": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
- "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/base64-arraybuffer": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
- "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
- "license": "MIT",
- "engines": {
- "node": ">= 0.6.0"
- }
- },
- "node_modules/bidi-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/bidi-js/-/bidi-js-1.0.3.tgz",
- "integrity": "sha512-RKshQI1R3YQ+n9YJz2QQ147P66ELpa1FQEg20Dk8oW9t2KgLbpDLLp9aGZ7y8WHSshDknG0bknqGw5/tyCs5tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "require-from-string": "^2.0.2"
- }
- },
- "node_modules/bits-ui": {
- "version": "2.18.1",
- "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-2.18.1.tgz",
- "integrity": "sha512-KkemzKFH4T3gt3H+P86JcnAWExjByv/6vlwjm/BoCwTPHu03yiCdxbghdJLvFReQTe0acCAiRcKfmixxD6XvlA==",
- "license": "MIT",
- "dependencies": {
- "@floating-ui/core": "^1.7.1",
- "@floating-ui/dom": "^1.7.1",
- "esm-env": "^1.1.2",
- "runed": "^0.35.1",
- "svelte-toolbelt": "^0.10.6",
- "tabbable": "^6.2.0"
- },
- "engines": {
- "node": ">=20"
- },
- "funding": {
- "url": "https://github.com/sponsors/huntabyte"
- },
- "peerDependencies": {
- "@internationalized/date": "^3.8.1",
- "svelte": "^5.33.0"
- }
- },
- "node_modules/chai": {
- "version": "6.2.2",
- "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
- "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/chokidar": {
- "version": "4.0.3",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
- "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "readdirp": "^4.0.1"
- },
- "engines": {
- "node": ">= 14.16.0"
- },
- "funding": {
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/clsx": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
- "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
- "license": "MIT"
- },
- "node_modules/confbox": {
- "version": "0.2.4",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
- "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/convert-source-map": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
- "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cookie": {
- "version": "0.6.0",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
- "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/css-line-break": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/css-line-break/-/css-line-break-2.1.0.tgz",
- "integrity": "sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w==",
- "license": "MIT",
- "dependencies": {
- "utrie": "^1.0.2"
- }
- },
- "node_modules/css-tree": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.2.1.tgz",
- "integrity": "sha512-X7sjQzceUhu1u7Y/ylrRZFU2FS6LRiFVp6rKLPg23y3x3c3DOKAwuXGDp+PAGjh6CSnCjYeAul8pcT8bAl+lSA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mdn-data": "2.27.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
- }
- },
- "node_modules/css.escape": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz",
- "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/data-urls": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-7.0.0.tgz",
- "integrity": "sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "whatwg-mimetype": "^5.0.0",
- "whatwg-url": "^16.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- }
- },
- "node_modules/debug": {
- "version": "4.4.3",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
- "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/decimal.js": {
- "version": "10.6.0",
- "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.6.0.tgz",
- "integrity": "sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/deepmerge": {
- "version": "4.3.1",
- "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
- "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/dequal": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
- "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/detect-libc": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
- "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
- "devOptional": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/devalue": {
- "version": "5.8.1",
- "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.8.1.tgz",
- "integrity": "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw==",
- "license": "MIT"
- },
- "node_modules/dom-accessibility-api": {
- "version": "0.6.3",
- "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz",
- "integrity": "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/enhanced-resolve": {
- "version": "5.24.2",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.2.tgz",
- "integrity": "sha512-rpsZEGT1jFuve6QlpyRp9ckQ+kN61hvF9BzCPyMdaKTm8UJce96KBn3sorXOFXlzjPrs3Vc4T1NsSroZ3PxlFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.3.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/entities": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-8.0.0.tgz",
- "integrity": "sha512-zwfzJecQ/Uej6tusMqwAqU/6KL2XaB2VZ2Jg54Je6ahNBGNH6Ek6g3jjNCF0fG9EWQKGZNddNjU5F1ZQn/sBnA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=20.19.0"
- },
- "funding": {
- "url": "https://github.com/fb55/entities?sponsor=1"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz",
- "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/esm-env": {
- "version": "1.2.2",
- "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
- "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
- "license": "MIT"
- },
- "node_modules/esrap": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.3.0.tgz",
- "integrity": "sha512-GQ/7RN8uOtEfNpzZzBMTzW9JBcX42oaSVtPzdF+6cEL8pqIL094iUpr9jzYGn4O4P/1S60dJ6izyT8F4LYARng==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.4.15"
- },
- "peerDependencies": {
- "@typescript-eslint/types": "^8.2.0"
- },
- "peerDependenciesMeta": {
- "@typescript-eslint/types": {
- "optional": true
- }
- }
- },
- "node_modules/estree-walker": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
- "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.0"
- }
- },
- "node_modules/expect-type": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
- "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=12.0.0"
- }
- },
- "node_modules/exsolve": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.0.tgz",
- "integrity": "sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fdir": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
- "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "picomatch": "^3 || ^4"
- },
- "peerDependenciesMeta": {
- "picomatch": {
- "optional": true
- }
- }
- },
- "node_modules/file-type": {
- "version": "22.0.1",
- "resolved": "https://registry.npmjs.org/file-type/-/file-type-22.0.1.tgz",
- "integrity": "sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@tokenizer/inflate": "^0.4.1",
- "strtok3": "^10.3.5",
- "token-types": "^6.1.2",
- "uint8array-extras": "^1.5.0"
- },
- "engines": {
- "node": ">=22"
- },
- "funding": {
- "url": "https://github.com/sindresorhus/file-type?sponsor=1"
- }
- },
- "node_modules/fsevents": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
- "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/html-encoding-sniffer": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz",
- "integrity": "sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@exodus/bytes": "^1.6.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- }
- },
- "node_modules/html2canvas-pro": {
- "version": "2.2.4",
- "resolved": "https://registry.npmjs.org/html2canvas-pro/-/html2canvas-pro-2.2.4.tgz",
- "integrity": "sha512-fo/VOiQZ3oWykAPvnMNHymUHzLWJE7c7C7VWPh+ydb+NquFTwqY5rHQRoxkgsaXo/iciVryPNffTvLzYg98xhg==",
- "license": "MIT",
- "dependencies": {
- "css-line-break": "^2.1.0",
- "text-segmentation": "^1.0.3"
- },
- "engines": {
- "node": ">=16.0.0"
- }
- },
- "node_modules/idb": {
- "version": "8.0.3",
- "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.3.tgz",
- "integrity": "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==",
- "license": "ISC"
- },
- "node_modules/ieee754": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "BSD-3-Clause"
- },
- "node_modules/import-meta-resolve": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
- "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/inline-style-parser": {
- "version": "0.2.7",
- "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz",
- "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==",
- "license": "MIT"
- },
- "node_modules/is-potential-custom-element-name": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
- "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/is-reference": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
- "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
- "license": "MIT",
- "dependencies": {
- "@types/estree": "^1.0.6"
- }
- },
- "node_modules/jiti": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
- "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
- "devOptional": true,
- "license": "MIT",
- "bin": {
- "jiti": "lib/jiti-cli.mjs"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/jsdom": {
- "version": "29.1.1",
- "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-29.1.1.tgz",
- "integrity": "sha512-ECi4Fi2f7BdJtUKTflYRTiaMxIB0O6zfR1fX0GXpUrf6flp8QIYn1UT20YQqdSOfk2dfkCwS8LAFoJDEppNK5Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@asamuzakjp/css-color": "^5.1.11",
- "@asamuzakjp/dom-selector": "^7.1.1",
- "@bramus/specificity": "^2.4.2",
- "@csstools/css-syntax-patches-for-csstree": "^1.1.3",
- "@exodus/bytes": "^1.15.0",
- "css-tree": "^3.2.1",
- "data-urls": "^7.0.0",
- "decimal.js": "^10.6.0",
- "html-encoding-sniffer": "^6.0.0",
- "is-potential-custom-element-name": "^1.0.1",
- "lru-cache": "^11.3.5",
- "parse5": "^8.0.1",
- "saxes": "^6.0.0",
- "symbol-tree": "^3.2.4",
- "tough-cookie": "^6.0.1",
- "undici": "^7.25.0",
- "w3c-xmlserializer": "^5.0.0",
- "webidl-conversions": "^8.0.1",
- "whatwg-mimetype": "^5.0.0",
- "whatwg-url": "^16.0.1",
- "xml-name-validator": "^5.0.0"
- },
- "engines": {
- "node": "^20.19.0 || ^22.13.0 || >=24.0.0"
- },
- "peerDependencies": {
- "canvas": "^3.0.0"
- },
- "peerDependenciesMeta": {
- "canvas": {
- "optional": true
- }
- }
- },
- "node_modules/kleur": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
- "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/lightningcss": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
- "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
- "devOptional": true,
- "license": "MPL-2.0",
- "dependencies": {
- "detect-libc": "^2.0.3"
- },
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- },
- "optionalDependencies": {
- "lightningcss-android-arm64": "1.32.0",
- "lightningcss-darwin-arm64": "1.32.0",
- "lightningcss-darwin-x64": "1.32.0",
- "lightningcss-freebsd-x64": "1.32.0",
- "lightningcss-linux-arm-gnueabihf": "1.32.0",
- "lightningcss-linux-arm64-gnu": "1.32.0",
- "lightningcss-linux-arm64-musl": "1.32.0",
- "lightningcss-linux-x64-gnu": "1.32.0",
- "lightningcss-linux-x64-musl": "1.32.0",
- "lightningcss-win32-arm64-msvc": "1.32.0",
- "lightningcss-win32-x64-msvc": "1.32.0"
- }
- },
- "node_modules/lightningcss-android-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
- "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-arm64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
- "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-darwin-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
- "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-freebsd-x64": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
- "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm-gnueabihf": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
- "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
- "cpu": [
- "arm"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
- "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
- "cpu": [
- "arm64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-arm64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
- "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
- "cpu": [
- "arm64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-gnu": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
- "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "glibc"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-linux-x64-musl": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
- "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
- "cpu": [
- "x64"
- ],
- "libc": [
- "musl"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-arm64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
- "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
- "cpu": [
- "arm64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/lightningcss-win32-x64-msvc": {
- "version": "1.32.0",
- "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
- "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
- "cpu": [
- "x64"
- ],
- "license": "MPL-2.0",
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 12.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/parcel"
- }
- },
- "node_modules/linkifyjs": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.3.tgz",
- "integrity": "sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==",
- "license": "MIT"
- },
- "node_modules/local-pkg": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz",
- "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mlly": "^1.7.4",
- "pkg-types": "^2.3.0",
- "quansync": "^0.2.11"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- }
- },
- "node_modules/locate-character": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
- "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
- "license": "MIT"
- },
- "node_modules/lru-cache": {
- "version": "11.5.2",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.2.tgz",
- "integrity": "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==",
- "dev": true,
- "license": "BlueOak-1.0.0",
- "engines": {
- "node": "20 || >=22"
- }
- },
- "node_modules/lz-string": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz",
- "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==",
- "license": "MIT",
- "bin": {
- "lz-string": "bin/bin.js"
- }
- },
- "node_modules/magic-string": {
- "version": "0.30.21",
- "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
- "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/sourcemap-codec": "^1.5.5"
- }
- },
- "node_modules/mdn-data": {
- "version": "2.27.1",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz",
- "integrity": "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ==",
- "dev": true,
- "license": "CC0-1.0"
- },
- "node_modules/min-indent": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
- "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mlly": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
- "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "acorn": "^8.16.0",
- "pathe": "^2.0.3",
- "pkg-types": "^1.3.1",
- "ufo": "^1.6.3"
- }
- },
- "node_modules/mlly/node_modules/confbox": {
- "version": "0.1.8",
- "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
- "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/mlly/node_modules/pkg-types": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
- "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.1.8",
- "mlly": "^1.7.4",
- "pathe": "^2.0.1"
- }
- },
- "node_modules/mri": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
- "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/mrmime": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
- "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/ms": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
- "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.16",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz",
- "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==",
- "devOptional": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/obug": {
- "version": "2.1.4",
- "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
- "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==",
- "devOptional": true,
- "funding": [
- "https://github.com/sponsors/sxzz",
- "https://opencollective.com/debug"
- ],
- "license": "MIT",
- "engines": {
- "node": ">=12.20.0"
- }
- },
- "node_modules/orderedmap": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz",
- "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==",
- "license": "MIT"
- },
- "node_modules/oxlint": {
- "version": "1.74.0",
- "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.74.0.tgz",
- "integrity": "sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "oxlint": "bin/oxlint"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/Boshen"
- },
- "optionalDependencies": {
- "@oxlint/binding-android-arm-eabi": "1.74.0",
- "@oxlint/binding-android-arm64": "1.74.0",
- "@oxlint/binding-darwin-arm64": "1.74.0",
- "@oxlint/binding-darwin-x64": "1.74.0",
- "@oxlint/binding-freebsd-x64": "1.74.0",
- "@oxlint/binding-linux-arm-gnueabihf": "1.74.0",
- "@oxlint/binding-linux-arm-musleabihf": "1.74.0",
- "@oxlint/binding-linux-arm64-gnu": "1.74.0",
- "@oxlint/binding-linux-arm64-musl": "1.74.0",
- "@oxlint/binding-linux-ppc64-gnu": "1.74.0",
- "@oxlint/binding-linux-riscv64-gnu": "1.74.0",
- "@oxlint/binding-linux-riscv64-musl": "1.74.0",
- "@oxlint/binding-linux-s390x-gnu": "1.74.0",
- "@oxlint/binding-linux-x64-gnu": "1.74.0",
- "@oxlint/binding-linux-x64-musl": "1.74.0",
- "@oxlint/binding-openharmony-arm64": "1.74.0",
- "@oxlint/binding-win32-arm64-msvc": "1.74.0",
- "@oxlint/binding-win32-ia32-msvc": "1.74.0",
- "@oxlint/binding-win32-x64-msvc": "1.74.0"
- },
- "peerDependencies": {
- "oxlint-tsgolint": ">=0.24.0",
- "vite-plus": "*"
- },
- "peerDependenciesMeta": {
- "oxlint-tsgolint": {
- "optional": true
- },
- "vite-plus": {
- "optional": true
- }
- }
- },
- "node_modules/package-manager-detector": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.7.0.tgz",
- "integrity": "sha512-xg1eHpwYL/D/HEdWw2goFZP6vV0FH7W+PZ5rFkGjdIDLtxq7EkzBUeT3m+lndYCt8wKbmofUu1MUdMCXkCk9ZQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/parse5": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/parse5/-/parse5-8.0.1.tgz",
- "integrity": "sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "entities": "^8.0.0"
- },
- "funding": {
- "url": "https://github.com/inikulin/parse5?sponsor=1"
- }
- },
- "node_modules/pathe": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
- "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/picocolors": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
- "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
- "devOptional": true,
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
- "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pkg-types": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz",
- "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confbox": "^0.2.4",
- "exsolve": "^1.0.8",
- "pathe": "^2.0.3"
- }
- },
- "node_modules/playwright": {
- "version": "1.61.1",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.61.1.tgz",
- "integrity": "sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "playwright-core": "1.61.1"
- },
- "bin": {
- "playwright": "cli.js"
- },
- "engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "fsevents": "2.3.2"
- }
- },
- "node_modules/playwright-core": {
- "version": "1.61.1",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.61.1.tgz",
- "integrity": "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==",
- "dev": true,
- "license": "Apache-2.0",
- "bin": {
- "playwright-core": "cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/postcss": {
- "version": "8.5.20",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.20.tgz",
- "integrity": "sha512-lW616l85ucIQL+FocMmL7pQFPqBmwejrCMg+iPxyImlrANNJG9NHq/RkyCZopDhd8C3LA03PHRJDjkbGu8vvug==",
- "devOptional": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.16",
- "picocolors": "^1.1.1",
- "source-map-js": "^1.2.1"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/prettier": {
- "version": "3.9.5",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.5.tgz",
- "integrity": "sha512-/FVl766LpUfB5vXgCYOYa0MeV/441Ia99AeICQIQFTY/Nw0roZwULcXpku5i1/m5kt/baz+s4Zogspd839HSMg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "prettier": "bin/prettier.cjs"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/prettier/prettier?sponsor=1"
- }
- },
- "node_modules/prettier-plugin-svelte": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-4.1.1.tgz",
- "integrity": "sha512-wXvbXMjSvb4C9ENWTHXyd+ihakKCsJ6rJhLP6/8HFNj4GkZr48jqL9PoKsl2sk7SyCZRTnJ7O2TTowUpOxP/KA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20"
- },
- "peerDependencies": {
- "prettier": "^3.0.0",
- "svelte": "^5.0.0"
- }
- },
- "node_modules/prettier-plugin-tailwindcss": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.8.1.tgz",
- "integrity": "sha512-iaFMYqDsE4ffdDkn5qup0j5f2aCEBFZrdrZnvu9QKTlWx/iGPeQ4HHu7b7fCPMxeo9nwQBiOAh2nSypdFYWJkw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20.19"
- },
- "peerDependencies": {
- "@ianvs/prettier-plugin-sort-imports": "*",
- "@prettier/plugin-hermes": "*",
- "@prettier/plugin-oxc": "*",
- "@prettier/plugin-pug": "*",
- "@shopify/prettier-plugin-liquid": "*",
- "@trivago/prettier-plugin-sort-imports": "*",
- "@zackad/prettier-plugin-twig": "*",
- "prettier": "^3.0",
- "prettier-plugin-astro": "*",
- "prettier-plugin-css-order": "*",
- "prettier-plugin-jsdoc": "*",
- "prettier-plugin-marko": "*",
- "prettier-plugin-multiline-arrays": "*",
- "prettier-plugin-organize-attributes": "*",
- "prettier-plugin-organize-imports": "*",
- "prettier-plugin-sort-imports": "*",
- "prettier-plugin-svelte": "*"
- },
- "peerDependenciesMeta": {
- "@ianvs/prettier-plugin-sort-imports": {
- "optional": true
- },
- "@prettier/plugin-hermes": {
- "optional": true
- },
- "@prettier/plugin-oxc": {
- "optional": true
- },
- "@prettier/plugin-pug": {
- "optional": true
- },
- "@shopify/prettier-plugin-liquid": {
- "optional": true
- },
- "@trivago/prettier-plugin-sort-imports": {
- "optional": true
- },
- "@zackad/prettier-plugin-twig": {
- "optional": true
- },
- "prettier-plugin-astro": {
- "optional": true
- },
- "prettier-plugin-css-order": {
- "optional": true
- },
- "prettier-plugin-jsdoc": {
- "optional": true
- },
- "prettier-plugin-marko": {
- "optional": true
- },
- "prettier-plugin-multiline-arrays": {
- "optional": true
- },
- "prettier-plugin-organize-attributes": {
- "optional": true
- },
- "prettier-plugin-organize-imports": {
- "optional": true
- },
- "prettier-plugin-sort-imports": {
- "optional": true
- },
- "prettier-plugin-svelte": {
- "optional": true
- }
- }
- },
- "node_modules/pretty-format": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz",
- "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1",
- "ansi-styles": "^5.0.0",
- "react-is": "^17.0.1"
- },
- "engines": {
- "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0"
- }
- },
- "node_modules/prosemirror-changeset": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz",
- "integrity": "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-transform": "^1.0.0"
- }
- },
- "node_modules/prosemirror-commands": {
- "version": "1.7.1",
- "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz",
- "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.0.0",
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.10.2"
- }
- },
- "node_modules/prosemirror-dropcursor": {
- "version": "1.8.3",
- "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.3.tgz",
- "integrity": "sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.1.0",
- "prosemirror-view": "^1.1.0"
- }
- },
- "node_modules/prosemirror-gapcursor": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz",
- "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-keymap": "^1.0.0",
- "prosemirror-model": "^1.0.0",
- "prosemirror-state": "^1.0.0",
- "prosemirror-view": "^1.0.0"
- }
- },
- "node_modules/prosemirror-history": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz",
- "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-state": "^1.2.2",
- "prosemirror-transform": "^1.0.0",
- "prosemirror-view": "^1.31.0",
- "rope-sequence": "^1.3.0"
- }
- },
- "node_modules/prosemirror-inputrules": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz",
- "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.0.0"
- }
- },
- "node_modules/prosemirror-keymap": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz",
- "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-state": "^1.0.0",
- "w3c-keyname": "^2.2.0"
- }
- },
- "node_modules/prosemirror-model": {
- "version": "1.25.11",
- "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.11.tgz",
- "integrity": "sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==",
- "license": "MIT",
- "dependencies": {
- "orderedmap": "^2.0.0"
- }
- },
- "node_modules/prosemirror-schema-list": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz",
- "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.0.0",
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.7.3"
- }
- },
- "node_modules/prosemirror-state": {
- "version": "1.4.4",
- "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz",
- "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.0.0",
- "prosemirror-transform": "^1.0.0",
- "prosemirror-view": "^1.27.0"
- }
- },
- "node_modules/prosemirror-tables": {
- "version": "1.8.5",
- "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz",
- "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-keymap": "^1.2.3",
- "prosemirror-model": "^1.25.4",
- "prosemirror-state": "^1.4.4",
- "prosemirror-transform": "^1.10.5",
- "prosemirror-view": "^1.41.4"
- }
- },
- "node_modules/prosemirror-transform": {
- "version": "1.12.0",
- "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz",
- "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.21.0"
- }
- },
- "node_modules/prosemirror-view": {
- "version": "1.42.1",
- "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.1.tgz",
- "integrity": "sha512-rRqzZnRgkyh69XoOMrfFJHwauHscLBmHbq772kwbic1ymQAM8gXjzEbJse5j1ep2UO2HRIAQL0bY3kZ/RoqjVw==",
- "license": "MIT",
- "dependencies": {
- "prosemirror-model": "^1.25.8",
- "prosemirror-state": "^1.0.0",
- "prosemirror-transform": "^1.1.0"
- }
- },
- "node_modules/punycode": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
- "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/quansync": {
- "version": "0.2.11",
- "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
- "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
- "dev": true,
- "funding": [
- {
- "type": "individual",
- "url": "https://github.com/sponsors/antfu"
- },
- {
- "type": "individual",
- "url": "https://github.com/sponsors/sxzz"
- }
- ],
- "license": "MIT"
- },
- "node_modules/react-is": {
- "version": "17.0.2",
- "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
- "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/readdirp": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
- "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 14.18.0"
- },
- "funding": {
- "type": "individual",
- "url": "https://paulmillr.com/funding/"
- }
- },
- "node_modules/redent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
- "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "indent-string": "^4.0.0",
- "strip-indent": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/rolldown": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.1.5.tgz",
- "integrity": "sha512-t9z29cJjXf/vxQ8dyhCSpt6H6aSwHTk8cT5I3iy6SMXuFpk5mB6PL6XfC8PCwrPTx93udwKUm9HRteAlTGBLiA==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "@oxc-project/types": "=0.139.0",
- "@rolldown/pluginutils": "^1.0.0"
- },
- "bin": {
- "rolldown": "bin/cli.mjs"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "optionalDependencies": {
- "@rolldown/binding-android-arm64": "1.1.5",
- "@rolldown/binding-darwin-arm64": "1.1.5",
- "@rolldown/binding-darwin-x64": "1.1.5",
- "@rolldown/binding-freebsd-x64": "1.1.5",
- "@rolldown/binding-linux-arm-gnueabihf": "1.1.5",
- "@rolldown/binding-linux-arm64-gnu": "1.1.5",
- "@rolldown/binding-linux-arm64-musl": "1.1.5",
- "@rolldown/binding-linux-ppc64-gnu": "1.1.5",
- "@rolldown/binding-linux-s390x-gnu": "1.1.5",
- "@rolldown/binding-linux-x64-gnu": "1.1.5",
- "@rolldown/binding-linux-x64-musl": "1.1.5",
- "@rolldown/binding-openharmony-arm64": "1.1.5",
- "@rolldown/binding-wasm32-wasi": "1.1.5",
- "@rolldown/binding-win32-arm64-msvc": "1.1.5",
- "@rolldown/binding-win32-x64-msvc": "1.1.5"
- }
- },
- "node_modules/rope-sequence": {
- "version": "1.3.4",
- "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
- "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
- "license": "MIT"
- },
- "node_modules/runed": {
- "version": "0.35.1",
- "resolved": "https://registry.npmjs.org/runed/-/runed-0.35.1.tgz",
- "integrity": "sha512-2F4Q/FZzbeJTFdIS/PuOoPRSm92sA2LhzTnv6FXhCoENb3huf5+fDuNOg1LNvGOouy3u/225qxmuJvcV3IZK5Q==",
- "funding": [
- "https://github.com/sponsors/huntabyte",
- "https://github.com/sponsors/tglide"
- ],
- "license": "MIT",
- "dependencies": {
- "dequal": "^2.0.3",
- "esm-env": "^1.0.0",
- "lz-string": "^1.5.0"
- },
- "peerDependencies": {
- "@sveltejs/kit": "^2.21.0",
- "svelte": "^5.7.0"
- },
- "peerDependenciesMeta": {
- "@sveltejs/kit": {
- "optional": true
- }
- }
- },
- "node_modules/sade": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
- "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mri": "^1.1.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/saxes": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
- "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "xmlchars": "^2.2.0"
- },
- "engines": {
- "node": ">=v12.22.7"
- }
- },
- "node_modules/set-cookie-parser": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz",
- "integrity": "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/siginfo": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
- "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/sirv": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
- "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "@polka/url": "^1.0.0-next.24",
- "mrmime": "^2.0.0",
- "totalist": "^3.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
- "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
- "devOptional": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "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,
- "license": "MIT"
- },
- "node_modules/std-env": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
- "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/strip-indent": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
- "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "min-indent": "^1.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strtok3": {
- "version": "10.3.5",
- "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz",
- "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@tokenizer/token": "^0.3.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/style-to-object": {
- "version": "1.0.14",
- "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz",
- "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==",
- "license": "MIT",
- "dependencies": {
- "inline-style-parser": "0.2.7"
- }
- },
- "node_modules/svelte": {
- "version": "5.56.6",
- "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.56.6.tgz",
- "integrity": "sha512-p4HDLDogGHKRKCrgckQHNs5PEfXkju6JI5jTywueaKJI5hAdjPohEhRtQ0M1SWC/+TA73SPln+r7srr+7e4nZA==",
- "license": "MIT",
- "dependencies": {
- "@jridgewell/remapping": "^2.3.4",
- "@jridgewell/sourcemap-codec": "^1.5.0",
- "@sveltejs/acorn-typescript": "^1.0.10",
- "@types/estree": "^1.0.5",
- "@types/trusted-types": "^2.0.7",
- "acorn": "^8.12.1",
- "aria-query": "5.3.1",
- "axobject-query": "^4.1.0",
- "clsx": "^2.1.1",
- "devalue": "^5.8.1",
- "esm-env": "^1.2.1",
- "esrap": "^2.2.12",
- "is-reference": "^3.0.3",
- "locate-character": "^3.0.0",
- "magic-string": "^0.30.11",
- "zimmerframe": "^1.1.2"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/svelte-awesome-color-picker": {
- "version": "4.1.3",
- "resolved": "https://registry.npmjs.org/svelte-awesome-color-picker/-/svelte-awesome-color-picker-4.1.3.tgz",
- "integrity": "sha512-fYio6XR2vp9WO0ihT6Vlw1Kj278gEZtqfIRde4YBx5OgGjBdQJxFE8jl6OibPQPrmaz625HZPZaSbRflL88/Mg==",
- "license": "MIT",
- "dependencies": {
- "colord": "^2.9.3",
- "svelte-awesome-slider": "2.0.0"
- },
- "engines": {
- "node": ">=24"
- },
- "peerDependencies": {
- "svelte": "^5.0.0"
- }
- },
- "node_modules/svelte-awesome-slider": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/svelte-awesome-slider/-/svelte-awesome-slider-2.0.0.tgz",
- "integrity": "sha512-YBkOdYm1Feaqsn2JkJBRs+Kc/X3Qy/3GuVmI7GmoYDjBaHkjx9uH4khTuED22z57Hg3gGWeDhp/clIjWDdLNaw==",
- "license": "MIT",
- "peerDependencies": {
- "svelte": "^5.0.0"
- }
- },
- "node_modules/svelte-check": {
- "version": "4.7.3",
- "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.7.3.tgz",
- "integrity": "sha512-DHdTCGX62R0fCxBEaT+USdASAnoaRBaaNczkRJl0K7o3WyoCeVUbVxo6fKqpOll/B+WMWCsiFK0eFrJSNBKZIg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.25",
- "@sveltejs/load-config": "^0.2.0",
- "chokidar": "^4.0.1",
- "fdir": "^6.2.0",
- "picocolors": "^1.0.0",
- "sade": "^1.7.4"
- },
- "bin": {
- "svelte-check": "bin/svelte-check"
- },
- "engines": {
- "node": ">= 18.0.0"
- },
- "peerDependencies": {
- "svelte": "^4.0.0 || ^5.0.0-next.0",
- "typescript": ">=5.0.0"
- }
- },
- "node_modules/svelte-highlight": {
- "version": "7.16.0",
- "resolved": "https://registry.npmjs.org/svelte-highlight/-/svelte-highlight-7.16.0.tgz",
- "integrity": "sha512-0H7RwC+mvV/aZ7gFsg5bEDtFHsWlirKFlpw7HImjMQTclq3/bWjgtYV2sgMma90DU9H72G3J8n7fTlTUFWk76w==",
- "license": "MIT",
- "dependencies": {
- "magic-string": "^0.30.17"
- }
- },
- "node_modules/svelte-toolbelt": {
- "version": "0.10.6",
- "resolved": "https://registry.npmjs.org/svelte-toolbelt/-/svelte-toolbelt-0.10.6.tgz",
- "integrity": "sha512-YWuX+RE+CnWYx09yseAe4ZVMM7e7GRFZM6OYWpBKOb++s+SQ8RBIMMe+Bs/CznBMc0QPLjr+vDBxTAkozXsFXQ==",
- "funding": [
- "https://github.com/sponsors/huntabyte"
- ],
- "dependencies": {
- "clsx": "^2.1.1",
- "runed": "^0.35.1",
- "style-to-object": "^1.0.8"
- },
- "engines": {
- "node": ">=18",
- "pnpm": ">=8.7.0"
- },
- "peerDependencies": {
- "svelte": "^5.30.2"
- }
- },
- "node_modules/svelte/node_modules/aria-query": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz",
- "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==",
- "license": "Apache-2.0",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/symbol-tree": {
- "version": "3.2.4",
- "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
- "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tabbable": {
- "version": "6.5.0",
- "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.5.0.tgz",
- "integrity": "sha512-wieBHXygIm7OyQOu5hQlkk62/WyCFYGlWg7L6/ZCUZwx0o398Zkn4pVmMyfYhfMG8kGrj/Krt8eIk6UKC6VzwA==",
- "license": "MIT"
- },
- "node_modules/tailwindcss": {
- "version": "4.3.3",
- "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz",
- "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tapable": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
- "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/text-segmentation": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/text-segmentation/-/text-segmentation-1.0.3.tgz",
- "integrity": "sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==",
- "license": "MIT",
- "dependencies": {
- "utrie": "^1.0.2"
- }
- },
- "node_modules/tinybench": {
- "version": "2.9.0",
- "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
- "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tinyexec": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.2.4.tgz",
- "integrity": "sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/tinyglobby": {
- "version": "0.2.17",
- "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
- "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "fdir": "^6.5.0",
- "picomatch": "^4.0.4"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/SuperchupuDev"
- }
- },
- "node_modules/tinyrainbow": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz",
- "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.0.0"
- }
- },
- "node_modules/tippy.js": {
- "version": "6.3.7",
- "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz",
- "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==",
- "license": "MIT",
- "dependencies": {
- "@popperjs/core": "^2.9.0"
- }
- },
- "node_modules/tldts": {
- "version": "7.4.9",
- "resolved": "https://registry.npmjs.org/tldts/-/tldts-7.4.9.tgz",
- "integrity": "sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "tldts-core": "^7.4.9"
- },
- "bin": {
- "tldts": "bin/cli.js"
- }
- },
- "node_modules/tldts-core": {
- "version": "7.4.9",
- "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.4.9.tgz",
- "integrity": "sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/token-types": {
- "version": "6.1.2",
- "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
- "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@borewit/text-codec": "^0.2.1",
- "@tokenizer/token": "^0.3.0",
- "ieee754": "^1.2.1"
- },
- "engines": {
- "node": ">=14.16"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/Borewit"
- }
- },
- "node_modules/totalist": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
- "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
- "devOptional": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tough-cookie": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-6.0.2.tgz",
- "integrity": "sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "tldts": "^7.0.5"
- },
- "engines": {
- "node": ">=16"
- }
- },
- "node_modules/tr46": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-6.0.0.tgz",
- "integrity": "sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "punycode": "^2.3.1"
- },
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/tslib": {
- "version": "2.8.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
- "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
- "license": "0BSD"
- },
- "node_modules/typescript": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
- "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
- "devOptional": true,
- "license": "Apache-2.0",
- "bin": {
- "tsc": "bin/tsc",
- "tsserver": "bin/tsserver"
- },
- "engines": {
- "node": ">=14.17"
- }
- },
- "node_modules/typescript-color-gradient": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/typescript-color-gradient/-/typescript-color-gradient-4.2.0.tgz",
- "integrity": "sha512-If2yZZfj+9KbBjdPUqTuppmn3JgYAZoPwE9jlxSYf5u3zFKCMAInNSHnEaIekoeykkSuaS8CnnP4XI/X68KybQ==",
- "license": "MIT"
- },
- "node_modules/ufo": {
- "version": "1.6.4",
- "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
- "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/uint8array-extras": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
- "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/undici": {
- "version": "7.28.0",
- "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz",
- "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20.18.1"
- }
- },
- "node_modules/undici-types": {
- "version": "8.3.0",
- "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
- "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
- "devOptional": true,
- "license": "MIT"
- },
- "node_modules/unplugin": {
- "version": "2.3.11",
- "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz",
- "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/remapping": "^2.3.5",
- "acorn": "^8.15.0",
- "picomatch": "^4.0.3",
- "webpack-virtual-modules": "^0.6.2"
- },
- "engines": {
- "node": ">=18.12.0"
- }
- },
- "node_modules/unplugin-icons": {
- "version": "23.0.1",
- "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-23.0.1.tgz",
- "integrity": "sha512-rv0XEJepajKzDLvRUWASM8K+8+/CCfZn2jtogXqg6RIp7kpatRc/aFrVJn8ANQA09e++lPEEv9yX8cC9enc+QQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@antfu/install-pkg": "^1.1.0",
- "@iconify/utils": "^3.1.0",
- "local-pkg": "^1.1.2",
- "obug": "^2.1.1",
- "unplugin": "^2.3.11"
- },
- "funding": {
- "url": "https://github.com/sponsors/antfu"
- },
- "peerDependencies": {
- "@svgr/core": ">=7.0.0",
- "@svgx/core": "^1.0.1",
- "@vue/compiler-sfc": "^3.0.2",
- "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "@svgr/core": {
- "optional": true
- },
- "@svgx/core": {
- "optional": true
- },
- "@vue/compiler-sfc": {
- "optional": true
- },
- "svelte": {
- "optional": true
- }
- }
- },
- "node_modules/utrie": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/utrie/-/utrie-1.0.2.tgz",
- "integrity": "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw==",
- "license": "MIT",
- "dependencies": {
- "base64-arraybuffer": "^1.0.2"
- }
- },
- "node_modules/vite": {
- "version": "8.1.5",
- "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.5.tgz",
- "integrity": "sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "lightningcss": "^1.32.0",
- "picomatch": "^4.0.5",
- "postcss": "^8.5.17",
- "rolldown": "~1.1.5",
- "tinyglobby": "^0.2.17"
- },
- "bin": {
- "vite": "bin/vite.js"
- },
- "engines": {
- "node": "^20.19.0 || >=22.12.0"
- },
- "funding": {
- "url": "https://github.com/vitejs/vite?sponsor=1"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.3"
- },
- "peerDependencies": {
- "@types/node": "^20.19.0 || >=22.12.0",
- "@vitejs/devtools": "^0.3.0",
- "esbuild": "^0.27.0 || ^0.28.0",
- "jiti": ">=1.21.0",
- "less": "^4.0.0",
- "sass": "^1.70.0",
- "sass-embedded": "^1.70.0",
- "stylus": ">=0.54.8",
- "sugarss": "^5.0.0",
- "terser": "^5.16.0",
- "tsx": "^4.8.1",
- "yaml": "^2.4.2"
- },
- "peerDependenciesMeta": {
- "@types/node": {
- "optional": true
- },
- "@vitejs/devtools": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "jiti": {
- "optional": true
- },
- "less": {
- "optional": true
- },
- "sass": {
- "optional": true
- },
- "sass-embedded": {
- "optional": true
- },
- "stylus": {
- "optional": true
- },
- "sugarss": {
- "optional": true
- },
- "terser": {
- "optional": true
- },
- "tsx": {
- "optional": true
- },
- "yaml": {
- "optional": true
- }
- }
- },
- "node_modules/vite/node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/vitefu": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz",
- "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",
- "devOptional": true,
- "license": "MIT",
- "workspaces": [
- "tests/deps/*",
- "tests/projects/*",
- "tests/projects/workspace/packages/*"
- ],
- "peerDependencies": {
- "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "vite": {
- "optional": true
- }
- }
- },
- "node_modules/vitest": {
- "version": "4.1.10",
- "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz",
- "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@vitest/expect": "4.1.10",
- "@vitest/mocker": "4.1.10",
- "@vitest/pretty-format": "4.1.10",
- "@vitest/runner": "4.1.10",
- "@vitest/snapshot": "4.1.10",
- "@vitest/spy": "4.1.10",
- "@vitest/utils": "4.1.10",
- "es-module-lexer": "^2.0.0",
- "expect-type": "^1.3.0",
- "magic-string": "^0.30.21",
- "obug": "^2.1.1",
- "pathe": "^2.0.3",
- "picomatch": "^4.0.3",
- "std-env": "^4.0.0-rc.1",
- "tinybench": "^2.9.0",
- "tinyexec": "^1.0.2",
- "tinyglobby": "^0.2.15",
- "tinyrainbow": "^3.1.0",
- "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
- "why-is-node-running": "^2.3.0"
- },
- "bin": {
- "vitest": "vitest.mjs"
- },
- "engines": {
- "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/vitest"
- },
- "peerDependencies": {
- "@edge-runtime/vm": "*",
- "@opentelemetry/api": "^1.9.0",
- "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
- "@vitest/browser-playwright": "4.1.10",
- "@vitest/browser-preview": "4.1.10",
- "@vitest/browser-webdriverio": "4.1.10",
- "@vitest/coverage-istanbul": "4.1.10",
- "@vitest/coverage-v8": "4.1.10",
- "@vitest/ui": "4.1.10",
- "happy-dom": "*",
- "jsdom": "*",
- "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@edge-runtime/vm": {
- "optional": true
- },
- "@opentelemetry/api": {
- "optional": true
- },
- "@types/node": {
- "optional": true
- },
- "@vitest/browser-playwright": {
- "optional": true
- },
- "@vitest/browser-preview": {
- "optional": true
- },
- "@vitest/browser-webdriverio": {
- "optional": true
- },
- "@vitest/coverage-istanbul": {
- "optional": true
- },
- "@vitest/coverage-v8": {
- "optional": true
- },
- "@vitest/ui": {
- "optional": true
- },
- "happy-dom": {
- "optional": true
- },
- "jsdom": {
- "optional": true
- },
- "vite": {
- "optional": false
- }
- }
- },
- "node_modules/w3c-keyname": {
- "version": "2.2.8",
- "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
- "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
- "license": "MIT"
- },
- "node_modules/w3c-xmlserializer": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
- "integrity": "sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "xml-name-validator": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/webidl-conversions": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-8.0.1.tgz",
- "integrity": "sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/webpack-virtual-modules": {
- "version": "0.6.2",
- "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
- "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/whatwg-mimetype": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-5.0.0.tgz",
- "integrity": "sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=20"
- }
- },
- "node_modules/whatwg-url": {
- "version": "16.0.1",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-16.0.1.tgz",
- "integrity": "sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@exodus/bytes": "^1.11.0",
- "tr46": "^6.0.0",
- "webidl-conversions": "^8.0.1"
- },
- "engines": {
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0"
- }
- },
- "node_modules/why-is-node-running": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
- "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "siginfo": "^2.0.0",
- "stackback": "0.0.2"
- },
- "bin": {
- "why-is-node-running": "cli.js"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/xml-name-validator": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-5.0.0.tgz",
- "integrity": "sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/xmlchars": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
- "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/zimmerframe": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
- "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
- "license": "MIT"
- }
- }
+ "name": "tools",
+ "version": "0.0.1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "tools",
+ "version": "0.0.1",
+ "dependencies": {
+ "@tiptap/core": "^3.29.2",
+ "@tiptap/extension-color": "^3.29.2",
+ "@tiptap/extension-font-family": "^3.29.2",
+ "@tiptap/extension-placeholder": "^3.29.2",
+ "@tiptap/extension-text-style": "^3.29.2",
+ "@tiptap/pm": "^3.29.2",
+ "@tiptap/starter-kit": "^3.29.2",
+ "idb": "^8.0.3",
+ "modern-screenshot": "^4.7.0",
+ "svelte-awesome-color-picker": "^4.1.3",
+ "svelte-highlight": "^7.16.2",
+ "tippy.js": "^6.3.7",
+ "typescript-color-gradient": "^4.2.0"
+ },
+ "devDependencies": {
+ "@iconify-json/tabler": "^1.2.38",
+ "@playwright/test": "^1.62.1",
+ "@sveltejs/adapter-auto": "^7.0.1",
+ "@sveltejs/kit": "^2.70.2",
+ "@sveltejs/vite-plugin-svelte": "^7.2.0",
+ "@tailwindcss/vite": "^4.3.3",
+ "@types/node": "^26.1.2",
+ "@vitest/coverage-v8": "4.1.10",
+ "file-type": "^22.0.1",
+ "oxlint": "^1.77.0",
+ "prettier": "^3.9.6",
+ "prettier-plugin-svelte": "^4.1.1",
+ "prettier-plugin-tailwindcss": "^0.8.1",
+ "svelte": "^5.56.8",
+ "svelte-check": "^4.7.4",
+ "tailwindcss": "^4.3.3",
+ "typescript": "^6.0.3",
+ "unplugin-icons": "^23.0.1",
+ "vite": "^8.2.0",
+ "vitest": "^4.1.10"
+ }
+ },
+ "node_modules/@antfu/install-pkg": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@antfu/install-pkg/-/install-pkg-1.1.0.tgz",
+ "integrity": "sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "package-manager-detector": "^1.3.0",
+ "tinyexec": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.8.tgz",
+ "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@borewit/text-codec": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/@borewit/text-codec/-/text-codec-0.2.2.tgz",
+ "integrity": "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@iconify-json/tabler": {
+ "version": "1.2.38",
+ "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.38.tgz",
+ "integrity": "sha512-9v6ooRU/bKOK/Whv4w2aiK5gBnfCV9Ei+uD1iDDeLu2b+EnF3G3ZKkRKWEOOLG8bJyfKn6XEia6gUQ9oO7cF+Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@iconify/types": "*"
+ }
+ },
+ "node_modules/@iconify/types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@iconify/types/-/types-2.0.0.tgz",
+ "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@iconify/utils": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@iconify/utils/-/utils-3.1.4.tgz",
+ "integrity": "sha512-b1S7B1k9ohZ+iNTi2ATxbRYG9fTrJmUT0rc46bvVnNxqNRGW7dyo/vRREwyniI5IRN2RSJHDcm+s3BjWrSAjHw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/install-pkg": "^1.1.0",
+ "@iconify/types": "^2.0.0",
+ "import-meta-resolve": "^4.2.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.13",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+ "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/remapping": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+ "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+ "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.31",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+ "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@oxc-project/types": {
+ "version": "0.142.0",
+ "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.142.0.tgz",
+ "integrity": "sha512-7W+2q5AKQVU36fkaryontrHn3YDt1RyUYXatw9i5H8ocYe2sPKSFB6eS8WNPeRKiN1qAWWZUPm7gwFzJGrccqQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ }
+ },
+ "node_modules/@oxlint/binding-android-arm-eabi": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.77.0.tgz",
+ "integrity": "sha512-E06sKWS6PiI6HRxS1wyQg22HvApt01hI7fV+T3wUk3OSbaaP4a3hYGY/MIQDmASqCiRjBdpRQYkgMkqH82cWmQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-android-arm64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.77.0.tgz",
+ "integrity": "sha512-NvsKz0KZxTp9cYWPLf+FXaSZwB3oO3peAjtukpOMBgse2vhQSoIIVqeO1yR0lEo/UcdZIDL18uq+kL0LzQ0ytA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-darwin-arm64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.77.0.tgz",
+ "integrity": "sha512-bgjTn6nW4bQCFBvSvuHCpDD+sONvmpo4lGI4PxzMt1quBA+xYxhczk6RiCn3GZ9gY8uhaBbwhj9MdKGfu6T9DA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-darwin-x64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.77.0.tgz",
+ "integrity": "sha512-aotaIttH1R6j1Rwhx0M0htgeZyGtVQqYNTVEYMN/UcgHPquGA6kmk9OyuDc3a2GKUQBC+3C3GVQCcrRPMYqAFA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-freebsd-x64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.77.0.tgz",
+ "integrity": "sha512-nNx/wta7ksRAdYvq+l4AWjXkLxEXHALhENxjj2cYbQAIR4ybaA5L+hCbE63HOmft5czQ6ks+hb8vmEAnn7YGPg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-arm-gnueabihf": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.77.0.tgz",
+ "integrity": "sha512-tMLLjM7xXtzXisVCzkOTXNCy9bZVId2wteNwjohlFDR/jY6WagpEDA1c1wu4xRc20Hojaxj+V6DSR7gbKxijWA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-arm-musleabihf": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.77.0.tgz",
+ "integrity": "sha512-MiAFDFaqR0tmHTAyo0YDcZ5hyLREdYw/RQhc2R3cbT+8O3tB+zqPM2th9TTQ+Uo3jn/embS+DO+HyX9ztCPkOQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-arm64-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.77.0.tgz",
+ "integrity": "sha512-/xqQ3B16i1T4cyt/9Mn+4CpzhUXoBXp7kVpIwzOXNFLj5JmK1bIjsbSnX296Gg8A/o7oDtKWikFgBx0SLwztkw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-arm64-musl": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.77.0.tgz",
+ "integrity": "sha512-LSbwuRKiNCenPDcbARqAZ5RfBy7gmj7vOvfJRLeCDU3gFtSxWbhv/+VTlaUqzUhNj1gFLHB8h7ALnxa/Az6z6g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-ppc64-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.77.0.tgz",
+ "integrity": "sha512-QWdcH31mXEUe5Nq1s0CfCpceaKjIo9uZtwDjAuL681g1axf+5x8xrg/eXWaw//4NCxYZ4V4e5Hu5tvdR+pTBlg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-riscv64-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.77.0.tgz",
+ "integrity": "sha512-GnOfYgJxbcElOiPZaDFDl406ONddwvOWk2jvAAAEjwAl4GofNoHF+/HHUIBYa6bFCArlcGPi0XjC4cU1pkgF/Q==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-riscv64-musl": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.77.0.tgz",
+ "integrity": "sha512-AyEMTUCf0xY+hHF+IxqXFQIX0yQOIR8ykpY0lJNOw9xYqOzUX8dyZfRvlG0RfXwuQn2eonf/8NrMmDSZJjdqsA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-s390x-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.77.0.tgz",
+ "integrity": "sha512-sPLzEcNvxd/oyVQ5oZo92CiHkFkpBeRop13E/P3TPY+hZfXHKCOWKI70TE2RYwMKFJDc20EMjH16L7NZICtKTw==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-x64-gnu": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.77.0.tgz",
+ "integrity": "sha512-1Oh2ssH2L7lwyvkdSqaMUfsGfwU2Wfvew+obBUYjRVqhpBcUpwnsPSEr1IzVi9XqkuY10geiLsNKecqaZC34Dw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-linux-x64-musl": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.77.0.tgz",
+ "integrity": "sha512-0j/2wRgNGO+Qj/M1uu/p57h/hFTTWWcfie0ufkbabeus2s5+/QqkCflnMOwLLN5m2GsNeWp4xdl4cPa4n7QCOQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-openharmony-arm64": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.77.0.tgz",
+ "integrity": "sha512-BJ/j54qS0usEnyDkLYURMj2iiD9h5Cyy+ppzeMSXBGRXaGRNWnj1Mw14NqWMR5E/PzdgB30OOCCzLzbRoduafw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-win32-arm64-msvc": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.77.0.tgz",
+ "integrity": "sha512-Yh8w+g2Lpx7StrvtYkoz9JJvXjB9wxgFChFNb85nrXm/wj/XTwGWS1hve9+900HL7llrntYB3YP+y32E3tRqzA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-win32-ia32-msvc": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.77.0.tgz",
+ "integrity": "sha512-zja5b7+6a7UsRFgAQSrnax5vrzliEyNPLCjfXONu/vTWswaIVZGFajJZptaeRvPE4LghtFdAzVFlexTm7MVTGA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@oxlint/binding-win32-x64-msvc": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.77.0.tgz",
+ "integrity": "sha512-+teyvPDZ2RjUvo+SuCqS/UhaJl1QtdW5fWT5NJTV61V5MIuIS90Db9LixmtEGvXixyttiK62P96MSu3UlpviBw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@playwright/test": {
+ "version": "1.62.1",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.62.1.tgz",
+ "integrity": "sha512-DTcUc8qii+cpHvtOwggMtBRMjKZHXYWdw8syRYu2vtzuq4Wxphqq4NfCs5Zt44L6mA8rfDfj+PHnxFc/FeK6mQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright": "1.62.1"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.29",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.29.tgz",
+ "integrity": "sha512-wwQAWhWSuHaag8c4q/KN/vCoeOJYshAIvMQwD4GpSb3OiZklFfvAgmj0VCBBImRpuF/aFgIRzllXlVX93Jevww==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "license": "MIT",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@rolldown/binding-android-arm64": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.2.tgz",
+ "integrity": "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-arm64": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.2.tgz",
+ "integrity": "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-darwin-x64": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.2.tgz",
+ "integrity": "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-freebsd-x64": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.2.tgz",
+ "integrity": "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm-gnueabihf": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.2.tgz",
+ "integrity": "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-gnu": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.2.tgz",
+ "integrity": "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-arm64-musl": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.2.tgz",
+ "integrity": "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-ppc64-gnu": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.2.tgz",
+ "integrity": "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-s390x-gnu": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.2.tgz",
+ "integrity": "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-gnu": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.2.tgz",
+ "integrity": "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-linux-x64-musl": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.2.tgz",
+ "integrity": "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-openharmony-arm64": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.2.tgz",
+ "integrity": "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "openharmony"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-arm64-msvc": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.2.tgz",
+ "integrity": "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/binding-win32-x64-msvc": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.2.tgz",
+ "integrity": "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ }
+ },
+ "node_modules/@rolldown/pluginutils": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz",
+ "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@standard-schema/spec": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.1.0.tgz",
+ "integrity": "sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@sveltejs/acorn-typescript": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@sveltejs/acorn-typescript/-/acorn-typescript-1.0.11.tgz",
+ "integrity": "sha512-LFuZUkjJ9iF7JZye/aG5XM0SFcQ5VyL0oVX4WJ9dc0Va3R3s0OauX1BESVCb+YN/ol8TAfqGDDAQsTG627Y5kw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^8.9.0"
+ }
+ },
+ "node_modules/@sveltejs/adapter-auto": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-7.0.1.tgz",
+ "integrity": "sha512-dvuPm1E7M9NI/+canIQ6KKQDU2AkEefEZ2Dp7cY6uKoPq9Z/PhOXABe526UdW2mN986gjVkuSLkOYIBnS/M2LQ==",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "@sveltejs/kit": "^2.0.0"
+ }
+ },
+ "node_modules/@sveltejs/kit": {
+ "version": "2.70.2",
+ "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.70.2.tgz",
+ "integrity": "sha512-RzRoRpuR2KXqc5yMO0akQHDZeT4AslOlznGITURsqHaVbtyYP4Wn3eE3gxj9JcDyNYO0crkxhdwFHc+2vkVm6w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@standard-schema/spec": "^1.0.0",
+ "@sveltejs/acorn-typescript": "^1.0.9",
+ "@types/cookie": "^0.6.0",
+ "acorn": "^8.16.0",
+ "cookie": "^0.6.0",
+ "devalue": "^5.8.1",
+ "esm-env": "^1.2.2",
+ "kleur": "^4.1.5",
+ "magic-string": "^0.30.5",
+ "mrmime": "^2.0.0",
+ "set-cookie-parser": "^3.0.0",
+ "sirv": "^3.0.0"
+ },
+ "bin": {
+ "svelte-kit": "svelte-kit.js"
+ },
+ "engines": {
+ "node": ">=18.13"
+ },
+ "peerDependencies": {
+ "@opentelemetry/api": "^1.0.0",
+ "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0",
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "typescript": "^5.3.3 || ^6.0.0",
+ "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@sveltejs/load-config": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/@sveltejs/load-config/-/load-config-0.2.1.tgz",
+ "integrity": "sha512-5m3B2cbqQ4TbwW6Xkh66Ntw6dD7gNc77cCxABTTesWcq9jxIzMgTk97pZx5vEtvQx8iokgi7GIphqZe+PGwcZA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 18.0.0"
+ }
+ },
+ "node_modules/@sveltejs/vite-plugin-svelte": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-7.2.0.tgz",
+ "integrity": "sha512-1SpkuMSRLfugrVX+IrKfE1RUegzo8AQzKQ6qQPfVzbcWi5IhuTPaKb5ZrLpucleFznkc4/RTeSPoRnGWFxX+EQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "deepmerge": "^4.3.1",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.0",
+ "vitefu": "^1.1.2"
+ },
+ "engines": {
+ "node": "^20.19 || ^22.12 || >=24"
+ },
+ "peerDependencies": {
+ "svelte": "^5.46.4",
+ "vite": "^8.0.0-beta.7 || ^8.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/node": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.3.tgz",
+ "integrity": "sha512-/T8IKEsf9VTU6tLjgC7+sv2mOPtQxzE2jMw7u4Tt40Tx+QSZxpzh95/H6cMKoja9XuW7iMdLJYBB0o9G1CaAgg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "enhanced-resolve": "^5.24.1",
+ "jiti": "^2.7.0",
+ "lightningcss": "1.32.0",
+ "magic-string": "^0.30.21",
+ "source-map-js": "^1.2.1",
+ "tailwindcss": "4.3.3"
+ }
+ },
+ "node_modules/@tailwindcss/oxide": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.3.tgz",
+ "integrity": "sha512-krXjAikiaFSPaK/FkAQT5UTx3VormQaiZ5hBFlJZ9UFQGB/rwg1MZIhHAG9smMQRTdyJxP6Qt5MwMtdyU5FWrA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "optionalDependencies": {
+ "@tailwindcss/oxide-android-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-arm64": "4.3.3",
+ "@tailwindcss/oxide-darwin-x64": "4.3.3",
+ "@tailwindcss/oxide-freebsd-x64": "4.3.3",
+ "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-arm64-musl": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-gnu": "4.3.3",
+ "@tailwindcss/oxide-linux-x64-musl": "4.3.3",
+ "@tailwindcss/oxide-wasm32-wasi": "4.3.3",
+ "@tailwindcss/oxide-win32-arm64-msvc": "4.3.3",
+ "@tailwindcss/oxide-win32-x64-msvc": "4.3.3"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-android-arm64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.3.tgz",
+ "integrity": "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-arm64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.3.tgz",
+ "integrity": "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-darwin-x64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.3.tgz",
+ "integrity": "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-freebsd-x64": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.3.tgz",
+ "integrity": "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.3.tgz",
+ "integrity": "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-gnu": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.3.tgz",
+ "integrity": "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-arm64-musl": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.3.tgz",
+ "integrity": "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-gnu": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.3.tgz",
+ "integrity": "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-linux-x64-musl": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.3.tgz",
+ "integrity": "sha512-SJxX60smvHgasZoBy11dX6YRjXJFovwWBoedhbQPOBzgFWBHGB+TVPWB9BxzR7TTxU8FQZAI2AyiNCMzFm8Img==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-wasm32-wasi": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.3.tgz",
+ "integrity": "sha512-jx1+rPhY/5Ympkktd656HBWEBLxP7dH06losBLjjf5vgCODXvi9KhtftWcMIwTFIDqBr7cRnQkdLnAG+IOlGvQ==",
+ "bundleDependencies": [
+ "@napi-rs/wasm-runtime",
+ "@emnapi/core",
+ "@emnapi/runtime",
+ "@tybys/wasm-util",
+ "@emnapi/wasi-threads",
+ "tslib"
+ ],
+ "cpu": [
+ "wasm32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "@emnapi/core": "^1.11.1",
+ "@emnapi/runtime": "^1.11.1",
+ "@emnapi/wasi-threads": "^1.2.2",
+ "@napi-rs/wasm-runtime": "^1.1.4",
+ "@tybys/wasm-util": "^0.10.2",
+ "tslib": "^2.8.1"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-arm64-msvc": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.3.tgz",
+ "integrity": "sha512-3rc292Ca2ceK6Ulcc/bAVnTs/3nDtoPhyEKlgPv+yQJQi/JS/AMJlqzxvlDacL1nekbrcf6bTqp/jV4qgnPxNQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/oxide-win32-x64-msvc": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.3.tgz",
+ "integrity": "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@tailwindcss/vite": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.3.tgz",
+ "integrity": "sha512-yYU8cogLeSh/ms2jh8Fj7jaba/EWa7Ja6GoUqYZaraEuCI5YS6ms6ObZgjjedm+jm6XZjdNRWBpPP6Z86oOxcw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tailwindcss/node": "4.3.3",
+ "@tailwindcss/oxide": "4.3.3",
+ "tailwindcss": "4.3.3"
+ },
+ "peerDependencies": {
+ "vite": "^5.2.0 || ^6 || ^7 || ^8"
+ }
+ },
+ "node_modules/@tiptap/core": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.29.2.tgz",
+ "integrity": "sha512-oKUkiPUB7noilVYxI9lNzUD4rX17sHub+PYjMfHMWHG9A3nvIy+FdePIVIIhThKWF7ijhr3eIqHY51Bn+GAFtw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/pm": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-blockquote": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.29.2.tgz",
+ "integrity": "sha512-ca4OzKDh0yaxg2+Z56bC2QnWsNsFp2YMRfVig1PDXyMVFMNJpLcnhxgq/9btn+xYAlYrj8RymOeCTYREOR6Zjg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2",
+ "@tiptap/pm": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-bold": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.29.2.tgz",
+ "integrity": "sha512-elYbGxJsYnBb4leqrcjdIJuiG380BcOgN+UUzvOv+qEjfGVzHodFOMBl3qnmD6urYHNu5/qQK2S0qSSRXKCLNQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-bullet-list": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.29.2.tgz",
+ "integrity": "sha512-3bWcCUPbCHv0XttlMdnAtXLNYWx2pblByMgxmGsaP9FU0QnslGXty6A6gHCqI33ygRg1vrA6U5Wtpwbi5aKu5g==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extension-list": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-code": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.29.2.tgz",
+ "integrity": "sha512-c6W5UGuB7WNLpYocsgRzpO2OOTI4QjaI9jjHRMuty9z+s9DtaYM/HrRLNwVh6MopkHb+i/89Wkv8gCS34fftig==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-code-block": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.29.2.tgz",
+ "integrity": "sha512-w153ct8g6dLiPTdXQ6SOIMxX4SEo5Q50AmjdEEEcJ7ZcYUcde/ScSskLHfOYmyt5ZFAiyEwr121+pux+p3/oAQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2",
+ "@tiptap/pm": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-color": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-3.29.2.tgz",
+ "integrity": "sha512-DMeyDRGZXIe2m2/QlrBoN15R4Ufwz3ERiG//OM7bjcYpiTZiO+pLC6tyabI1+QcJrYUGTu5zVah583xXzt89Kw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extension-text-style": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-document": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.29.2.tgz",
+ "integrity": "sha512-YUamvefLnsqu6124GavVTI7nqcFlQJ12ROB0oSwG69eSBZYNjg1tIs05LFrBxkwf4Xgqd6YzfJ9+FeG428RvzQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-dropcursor": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.29.2.tgz",
+ "integrity": "sha512-KKno7cU9r1HdR48CRrsDu69/1UjZdoslq/UcE+Kx+tdhAv/aljXMkRSNzGMrBNOBDmHRgS1+58zm21WQWdQzwA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extensions": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-font-family": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-font-family/-/extension-font-family-3.29.2.tgz",
+ "integrity": "sha512-HDq9+V8LbDFH1aQRH5Au0pmoDQ7bfa/C/k50a9mujzmA/PE7mLQkduUFfyDdiN4L60p7TVJAOJaN/loGC8PDxA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extension-text-style": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-gapcursor": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.29.2.tgz",
+ "integrity": "sha512-8Q39UR4/Tit759IeW9xZIe3NMwN11GsuA3FLheDyyGn7RrW02HD3HhUDlazE54Ki4HoosjFmChPlN4Ik2ubdRQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extensions": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-hard-break": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.29.2.tgz",
+ "integrity": "sha512-eUW3LN3fq8rXnjEUeI3D2QONYdLsU3yYQm4jxlErs2h4cfwrFjgf19VSUFVmm6LrFbbQ0OnDVPeVLL6iOwDw2w==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-heading": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.29.2.tgz",
+ "integrity": "sha512-6W4aIy70Mh7BNlbG9zZ5FBLhJhU2UUEzgZJ/jwYSCcB30o8McLxJSEjhtoHiX8R78Ah2/JzBGvIe5olZlbeE4A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-horizontal-rule": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.29.2.tgz",
+ "integrity": "sha512-8/ZPzbB9X85Mc9/7xVLZupQKBr2UVcQTGr512xtqMW+XkCQRHCph46tRo828YE13IMWI5fWn/FaNCqXG9cULSw==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2",
+ "@tiptap/pm": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-italic": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.29.2.tgz",
+ "integrity": "sha512-iH63V/5wsaMnY4Jz0+meaAGhaec4AiOzOduzl6ZZr5IyGhZ1kthyW84ELt0dyLI3hNceAUhaNWc+I7+vX0aoXA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-link": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.29.2.tgz",
+ "integrity": "sha512-DcVer5SqrexKCEP6Ip1UPxJUMvcRCCItSv0wxoGytanrimBh2smvcg6X0DWnjlsi5H0updhyl+atYCmmQXUIXA==",
+ "license": "MIT",
+ "dependencies": {
+ "linkifyjs": "^4.3.3"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2",
+ "@tiptap/pm": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-list": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.29.2.tgz",
+ "integrity": "sha512-WPZ9BHAPT6QeIm1vdVkuoOWvy9a8/EZeJwV2VhU8LXyTAttvzyj4rsbbHyJWvYWlUSTt/QF2AZ2zhKo7u1w3/A==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2",
+ "@tiptap/pm": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-list-item": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.29.2.tgz",
+ "integrity": "sha512-s8vBVHHFT0Qpu7CzAZ7S1kYmSiVaDvUNvMNcZUWnxj6VPfiwmx0eXd9FsjePrRCMoM5tFmPnhFTHDxY3D/eZeQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extension-list": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-list-keymap": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.29.2.tgz",
+ "integrity": "sha512-R+3k8OLnxdCH7Xy9ieOwUt5m2Je74u8mikothGmsYVO2Zyq48fIbmZ+X6RBPCu7DBOI2FIUhHEFbKQeDWvDNmA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extension-list": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-ordered-list": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.29.2.tgz",
+ "integrity": "sha512-ndCunC+UsYOpkOtL7vGnDz21UNa45WUlcO9wMT1fbuYow2QnRhsuMlCWENXI52YPPARWuQ0RDgN7q6TaxPERBg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extension-list": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-paragraph": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.29.2.tgz",
+ "integrity": "sha512-7qJj5YTr11vvjNgjDN1ypOfwTovc0QOCYcit/rskeuVgnmQZOZQzC/BbyKLLG7UGnpRLemU/mEGbW9pAqjAXkQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-placeholder": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.29.2.tgz",
+ "integrity": "sha512-/BlpPIq2JZk6zLaeYVOXazi6dmd0iRriTymNEnFn1doManN1y5HED9LsMeb/AhNhauL5AgmcHgpvAjbsN9k4SA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/extensions": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-strike": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.29.2.tgz",
+ "integrity": "sha512-aEvLAbddUQZ+FukCreV3q4G2HfNI+odE7E9U+wbq6XsSWKyo8/pDu1muz+TFKNre4blSMOQ3JQmw5UeHDKy+fg==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-text": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.29.2.tgz",
+ "integrity": "sha512-Ubko45JWWHe8glBt2PiGNF8hcbys/JNalFhiR7Y1X4iOOtAxAKJJxh3+eq+//NTlGuBPdWGp7zw8EEUp7anjKA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-text-style": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-3.29.2.tgz",
+ "integrity": "sha512-aQad9V9ROaEi3hE4g5z9wQ6lv5FSnzlnWFMVJxRjNlwXgm7H0fymxb4rGfca+pAwYkiRwpKYh1LatpJw2ECQAA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extension-underline": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.29.2.tgz",
+ "integrity": "sha512-K7XwH/xS/5AIREWQ00VTEf/W5U0olp7j6wwit7cdd/8nHv6h6AGr1+iEApHKoLXWQZLfGQKzJlT9W61LAl+fHA==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/extensions": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.29.2.tgz",
+ "integrity": "sha512-BCz+FCAChSYtUe4BFj97HEO+nSK+J7GxbJgZG4Hg7DT/gI+hRyeNndU8efiQAx3WGdzsFi3UxRpcF1tTQM7iMQ==",
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ },
+ "peerDependencies": {
+ "@tiptap/core": "3.29.2",
+ "@tiptap/pm": "3.29.2"
+ }
+ },
+ "node_modules/@tiptap/pm": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.29.2.tgz",
+ "integrity": "sha512-GCOme7xHaS+DSoaA4CDcAD3l6JyBlvZhvCyfsy2Vp6j8tEoBkZWio7soYVosmlyn7zq8/64VeFZP5s47yfG7fQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-changeset": "^2.4.1",
+ "prosemirror-commands": "^1.7.1",
+ "prosemirror-dropcursor": "^1.8.2",
+ "prosemirror-gapcursor": "^1.4.1",
+ "prosemirror-history": "^1.5.0",
+ "prosemirror-inputrules": "^1.5.1",
+ "prosemirror-keymap": "^1.2.3",
+ "prosemirror-model": "^1.25.11",
+ "prosemirror-schema-list": "^1.5.1",
+ "prosemirror-state": "^1.4.4",
+ "prosemirror-tables": "^1.8.5",
+ "prosemirror-transform": "^1.12.0",
+ "prosemirror-view": "^1.41.9"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ }
+ },
+ "node_modules/@tiptap/starter-kit": {
+ "version": "3.29.2",
+ "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.29.2.tgz",
+ "integrity": "sha512-oTu0tysiqk4zgjEtxRHjAQgxUKaAevZwueOWwSWubHdokqp7SpcbE5n9USJv89HKuTUDm3GjnQH6q8HNn/2DsA==",
+ "license": "MIT",
+ "dependencies": {
+ "@tiptap/core": "^3.29.2",
+ "@tiptap/extension-blockquote": "^3.29.2",
+ "@tiptap/extension-bold": "^3.29.2",
+ "@tiptap/extension-bullet-list": "^3.29.2",
+ "@tiptap/extension-code": "^3.29.2",
+ "@tiptap/extension-code-block": "^3.29.2",
+ "@tiptap/extension-document": "^3.29.2",
+ "@tiptap/extension-dropcursor": "^3.29.2",
+ "@tiptap/extension-gapcursor": "^3.29.2",
+ "@tiptap/extension-hard-break": "^3.29.2",
+ "@tiptap/extension-heading": "^3.29.2",
+ "@tiptap/extension-horizontal-rule": "^3.29.2",
+ "@tiptap/extension-italic": "^3.29.2",
+ "@tiptap/extension-link": "^3.29.2",
+ "@tiptap/extension-list": "^3.29.2",
+ "@tiptap/extension-list-item": "^3.29.2",
+ "@tiptap/extension-list-keymap": "^3.29.2",
+ "@tiptap/extension-ordered-list": "^3.29.2",
+ "@tiptap/extension-paragraph": "^3.29.2",
+ "@tiptap/extension-strike": "^3.29.2",
+ "@tiptap/extension-text": "^3.29.2",
+ "@tiptap/extension-underline": "^3.29.2",
+ "@tiptap/extensions": "^3.29.2",
+ "@tiptap/pm": "^3.29.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/ueberdosis"
+ }
+ },
+ "node_modules/@tokenizer/inflate": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@tokenizer/inflate/-/inflate-0.4.1.tgz",
+ "integrity": "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.3",
+ "token-types": "^6.1.1"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/@tokenizer/token": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz",
+ "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/chai": {
+ "version": "5.2.3",
+ "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz",
+ "integrity": "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/deep-eql": "*",
+ "assertion-error": "^2.0.1"
+ }
+ },
+ "node_modules/@types/cookie": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/deep-eql": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz",
+ "integrity": "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz",
+ "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "26.1.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-26.1.2.tgz",
+ "integrity": "sha512-Vu4a5UFA9rIIFJ7rB/Vaafh9lrCQszopTCx6KjFboXTGQbPNasehVR5TEiithSDGyd1DEiUByggTZsg8jukeIg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~8.3.0"
+ }
+ },
+ "node_modules/@types/trusted-types": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz",
+ "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==",
+ "license": "MIT"
+ },
+ "node_modules/@vitest/coverage-v8": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/coverage-v8/-/coverage-v8-4.1.10.tgz",
+ "integrity": "sha512-IM49HmthevbgAO4anp1hwtoT9wYe59w0LR00gr+eagHE+ZJ5lK4sLPeO0ubgoJcwLk6dehU3R24N+FbEEKDc8g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@bcoe/v8-coverage": "^1.0.2",
+ "@vitest/utils": "4.1.10",
+ "ast-v8-to-istanbul": "^1.0.0",
+ "istanbul-lib-coverage": "^3.2.2",
+ "istanbul-lib-report": "^3.0.1",
+ "istanbul-reports": "^3.2.0",
+ "magicast": "^0.5.2",
+ "obug": "^2.1.1",
+ "std-env": "^4.0.0-rc.1",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@vitest/browser": "4.1.10",
+ "vitest": "4.1.10"
+ },
+ "peerDependenciesMeta": {
+ "@vitest/browser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/expect": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.10.tgz",
+ "integrity": "sha512-YsCn+qAk1GWjQOWFEsEcL2gNQ0zmVmQu3T03qP6UyjhtmdtwtbuI+DASn/7iQB3HGTXkdBwGddzxPlmiql5vlA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@standard-schema/spec": "^1.1.0",
+ "@types/chai": "^5.2.2",
+ "@vitest/spy": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "chai": "^6.2.2",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/mocker": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.10.tgz",
+ "integrity": "sha512-v0xaezt+DKEmKfaxg133ldzADrwLGd7Ze1MfQQTYfvs8OqZIwbxyxaYURivwV7sWy5fqn3rH5uOrSp07bp44Ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/spy": "4.1.10",
+ "estree-walker": "^3.0.3",
+ "magic-string": "^0.30.21"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "msw": "^2.4.9",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "msw": {
+ "optional": true
+ },
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@vitest/pretty-format": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.10.tgz",
+ "integrity": "sha512-W1HsjSH4MXQ9YfmmhLAoIYf1HRfekQCGngeIgcei6MP5QQGWUe0gkopdZQaVCFO+JDJMrAJGwa5pRpNpvy4P8Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/runner": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.10.tgz",
+ "integrity": "sha512-IKI6kpIH+LmpROplyLwBBaCfMgOZOMsygVa6BARD6ahA04VRuJSa6OaVG7kRvSEMD870Vd91rSSw0eegtWyLGg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/utils": "4.1.10",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/snapshot": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.10.tgz",
+ "integrity": "sha512-xRkfOT1qpTAi/Ti4Y1LtfRc3kEuqxGw59eN2jN9pRWMtS/XDevekhcFSqvQqjUNGksfjMJu3Y+oJ+4Ypn2OaJw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "magic-string": "^0.30.21",
+ "pathe": "^2.0.3"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/spy": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.10.tgz",
+ "integrity": "sha512-PLf/Ugvoq5wO/b4rwYCR1h2PSIdXz7wnkQFMiUpLdtM7l6pqVFcQIBEHyT1+l+cj7mNwAfZHzqXqDyjvOuwbDw==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/@vitest/utils": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.10.tgz",
+ "integrity": "sha512-fy9am/HWxbaGt/Sawrp90vt6Y6jQwf1RX77cz3uwoJwJVMli/e1IEwRPnMNJ7vKfPTwo0diXifkpPvwH9v7nGA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/pretty-format": "4.1.10",
+ "convert-source-map": "^2.0.0",
+ "tinyrainbow": "^3.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.18.0.tgz",
+ "integrity": "sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ==",
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.1.tgz",
+ "integrity": "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/assertion-error": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-2.0.1.tgz",
+ "integrity": "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/ast-v8-to-istanbul": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/ast-v8-to-istanbul/-/ast-v8-to-istanbul-1.0.5.tgz",
+ "integrity": "sha512-UPAgKJFSEGMWSDr3LX4tqnAb4f7KGT8O40Tyx8wbYmmZ/yn58lNCm8h3svs3eXgiGd5AXxz8NDOvXWvicq+rJA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.31",
+ "estree-walker": "^3.0.3",
+ "js-tokens": "^10.0.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/chai": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",
+ "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz",
+ "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "license": "MIT"
+ },
+ "node_modules/confbox": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz",
+ "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cookie": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
+ "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+ "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/devalue": {
+ "version": "5.9.0",
+ "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.9.0.tgz",
+ "integrity": "sha512-RWrqdArjvPbsATEhOPUo6Wndc/iWnkWKlhIrdlF3zMMYo/c3CVtoaVAyLtWxz5h8nSlkHzxnzV2uLydPXmtF+A==",
+ "license": "MIT"
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.24.5",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.5.tgz",
+ "integrity": "sha512-L1l8TNvomm6UVW5B253AGxQagSQr+vGwhMlrrfRS2qmhx46AMpMVJKQYLvWYbysTMY8VoicOvzHzoHMbyzB+4A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.3.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-2.3.1.tgz",
+ "integrity": "sha512-shc1dbU90Yl/xq1QrC7QRtfcwURZuVRfPhZbDoldJ1cn1gzDvBaBWlv0eFolj5+0znnPJz5TXLxsN77X/12KTA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/esm-env": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
+ "integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
+ "license": "MIT"
+ },
+ "node_modules/esrap": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/esrap/-/esrap-2.3.0.tgz",
+ "integrity": "sha512-GQ/7RN8uOtEfNpzZzBMTzW9JBcX42oaSVtPzdF+6cEL8pqIL094iUpr9jzYGn4O4P/1S60dJ6izyT8F4LYARng==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.4.15"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/types": "^8.2.0"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/types": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
+ "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.0"
+ }
+ },
+ "node_modules/expect-type": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.4.0.tgz",
+ "integrity": "sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/exsolve": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.1.1.tgz",
+ "integrity": "sha512-9U/jZUgjnSGyntRr6y5Muu1MJcwFl6kPu7k8qLF0IMNfLqvw0NZ4nnVDq0RVoZ0RvCyumib4Ez3KYrVfilrw+g==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/file-type": {
+ "version": "22.0.1",
+ "resolved": "https://registry.npmjs.org/file-type/-/file-type-22.0.1.tgz",
+ "integrity": "sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tokenizer/inflate": "^0.4.1",
+ "strtok3": "^10.3.5",
+ "token-types": "^6.1.2",
+ "uint8array-extras": "^1.5.0"
+ },
+ "engines": {
+ "node": ">=22"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/file-type?sponsor=1"
+ }
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/idb": {
+ "version": "8.0.3",
+ "resolved": "https://registry.npmjs.org/idb/-/idb-8.0.3.tgz",
+ "integrity": "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg==",
+ "license": "ISC"
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/import-meta-resolve": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.2.0.tgz",
+ "integrity": "sha512-Iqv2fzaTQN28s/FwZAoFq0ZSs/7hMAHJVX+w8PZl3cY19Pxk6jFFalxQoIfW2826i/fDLXv8IiEZRIT0lDuWcg==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-reference": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz",
+ "integrity": "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "^1.0.6"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz",
+ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/jiti": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.7.0.tgz",
+ "integrity": "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "jiti": "lib/jiti-cli.mjs"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz",
+ "integrity": "sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/kleur": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz",
+ "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/lightningcss": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz",
+ "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.32.0",
+ "lightningcss-darwin-arm64": "1.32.0",
+ "lightningcss-darwin-x64": "1.32.0",
+ "lightningcss-freebsd-x64": "1.32.0",
+ "lightningcss-linux-arm-gnueabihf": "1.32.0",
+ "lightningcss-linux-arm64-gnu": "1.32.0",
+ "lightningcss-linux-arm64-musl": "1.32.0",
+ "lightningcss-linux-x64-gnu": "1.32.0",
+ "lightningcss-linux-x64-musl": "1.32.0",
+ "lightningcss-win32-arm64-msvc": "1.32.0",
+ "lightningcss-win32-x64-msvc": "1.32.0"
+ }
+ },
+ "node_modules/lightningcss-android-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz",
+ "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-arm64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz",
+ "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-darwin-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz",
+ "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-freebsd-x64": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz",
+ "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz",
+ "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz",
+ "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz",
+ "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz",
+ "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz",
+ "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz",
+ "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.32.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz",
+ "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/linkifyjs": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/linkifyjs/-/linkifyjs-4.3.3.tgz",
+ "integrity": "sha512-P8aEP5U/D1/IlTY2OeYsErdwh9bGuLE30NcXtKEjgdHcahveQoQwM2yZNsioQHsWFz0P7KKudisbrzCgR0sDHg==",
+ "license": "MIT"
+ },
+ "node_modules/local-pkg": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.2.1.tgz",
+ "integrity": "sha512-++gUqRDEvcnN6Zhqrr+y/CkVEHhlrR96vZn3nZZPYzMcBUyBtTKzB9NadClFIsIVSsu+3i9tfk/erqy9kAmt7Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mlly": "^1.7.4",
+ "pkg-types": "^2.3.0",
+ "quansync": "^0.2.11"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ }
+ },
+ "node_modules/locate-character": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz",
+ "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==",
+ "license": "MIT"
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.21",
+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
+ "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.5"
+ }
+ },
+ "node_modules/magicast": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.4.tgz",
+ "integrity": "sha512-llBEhWm1SacoRwgHUoQJYtwp4PBLF4faQi5TCpIGyGs9n4y5+juI0tDgyKIfpqxckRHaHzouUEph3THklWh03w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.29.7",
+ "@babel/types": "^7.29.7",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/mlly": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz",
+ "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "acorn": "^8.16.0",
+ "pathe": "^2.0.3",
+ "pkg-types": "^1.3.1",
+ "ufo": "^1.6.3"
+ }
+ },
+ "node_modules/mlly/node_modules/confbox": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz",
+ "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/mlly/node_modules/pkg-types": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz",
+ "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.1.8",
+ "mlly": "^1.7.4",
+ "pathe": "^2.0.1"
+ }
+ },
+ "node_modules/modern-screenshot": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/modern-screenshot/-/modern-screenshot-4.7.0.tgz",
+ "integrity": "sha512-9YxN+ddPSMMlhylOv25VHzXrl9u67QRxoh7+SEewGtgUw7t6hHTrjptSDJUSne9oG4Xk/h2cwG15nIt4Hc9ujg==",
+ "license": "MIT"
+ },
+ "node_modules/mri": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz",
+ "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz",
+ "integrity": "sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.17",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz",
+ "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/obug": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/obug/-/obug-2.1.4.tgz",
+ "integrity": "sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/sxzz",
+ "https://opencollective.com/debug"
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.20.0"
+ }
+ },
+ "node_modules/orderedmap": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz",
+ "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==",
+ "license": "MIT"
+ },
+ "node_modules/oxlint": {
+ "version": "1.77.0",
+ "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.77.0.tgz",
+ "integrity": "sha512-qnGh8XJHaQ0dprrDXNQZgS0FgjI6v+V3+X8DwmaV++5Aamy6jGKfDdQ1TUvhUxtmKFAbEf4/WeO5QZX+5WSngg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "oxlint": "bin/oxlint"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/Boshen"
+ },
+ "optionalDependencies": {
+ "@oxlint/binding-android-arm-eabi": "1.77.0",
+ "@oxlint/binding-android-arm64": "1.77.0",
+ "@oxlint/binding-darwin-arm64": "1.77.0",
+ "@oxlint/binding-darwin-x64": "1.77.0",
+ "@oxlint/binding-freebsd-x64": "1.77.0",
+ "@oxlint/binding-linux-arm-gnueabihf": "1.77.0",
+ "@oxlint/binding-linux-arm-musleabihf": "1.77.0",
+ "@oxlint/binding-linux-arm64-gnu": "1.77.0",
+ "@oxlint/binding-linux-arm64-musl": "1.77.0",
+ "@oxlint/binding-linux-ppc64-gnu": "1.77.0",
+ "@oxlint/binding-linux-riscv64-gnu": "1.77.0",
+ "@oxlint/binding-linux-riscv64-musl": "1.77.0",
+ "@oxlint/binding-linux-s390x-gnu": "1.77.0",
+ "@oxlint/binding-linux-x64-gnu": "1.77.0",
+ "@oxlint/binding-linux-x64-musl": "1.77.0",
+ "@oxlint/binding-openharmony-arm64": "1.77.0",
+ "@oxlint/binding-win32-arm64-msvc": "1.77.0",
+ "@oxlint/binding-win32-ia32-msvc": "1.77.0",
+ "@oxlint/binding-win32-x64-msvc": "1.77.0"
+ },
+ "peerDependencies": {
+ "oxlint-tsgolint": ">=7.0.2001",
+ "vite-plus": "*"
+ },
+ "peerDependenciesMeta": {
+ "oxlint-tsgolint": {
+ "optional": true
+ },
+ "vite-plus": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/package-manager-detector": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.8.0.tgz",
+ "integrity": "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/pathe": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz",
+ "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
+ "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pkg-types": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.1.tgz",
+ "integrity": "sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "confbox": "^0.2.4",
+ "exsolve": "^1.0.8",
+ "pathe": "^2.0.3"
+ }
+ },
+ "node_modules/playwright": {
+ "version": "1.62.1",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.62.1.tgz",
+ "integrity": "sha512-0M+L3LAD8/nm554LOla9Ayx0j0tmFZ0FBcoQ7F1VuVHpM/XpiC8RcDzBQB8W5+hA8L22THxELzeF+2WcUzvcLg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "playwright-core": "1.62.1"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.62.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.62.1.tgz",
+ "integrity": "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.25",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.25.tgz",
+ "integrity": "sha512-DTPx3RWSSnWyzLxQnlH0rJP+EW5ekl16ZU4/psbIhA0e53kJfdgaN5vKM+xP7yJtXVu+nfdVFmlgFDEKAe4Pyw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.16",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.9.6",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz",
+ "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-plugin-svelte": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-4.1.1.tgz",
+ "integrity": "sha512-wXvbXMjSvb4C9ENWTHXyd+ihakKCsJ6rJhLP6/8HFNj4GkZr48jqL9PoKsl2sk7SyCZRTnJ7O2TTowUpOxP/KA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20"
+ },
+ "peerDependencies": {
+ "prettier": "^3.0.0",
+ "svelte": "^5.0.0"
+ }
+ },
+ "node_modules/prettier-plugin-tailwindcss": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.8.1.tgz",
+ "integrity": "sha512-iaFMYqDsE4ffdDkn5qup0j5f2aCEBFZrdrZnvu9QKTlWx/iGPeQ4HHu7b7fCPMxeo9nwQBiOAh2nSypdFYWJkw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=20.19"
+ },
+ "peerDependencies": {
+ "@ianvs/prettier-plugin-sort-imports": "*",
+ "@prettier/plugin-hermes": "*",
+ "@prettier/plugin-oxc": "*",
+ "@prettier/plugin-pug": "*",
+ "@shopify/prettier-plugin-liquid": "*",
+ "@trivago/prettier-plugin-sort-imports": "*",
+ "@zackad/prettier-plugin-twig": "*",
+ "prettier": "^3.0",
+ "prettier-plugin-astro": "*",
+ "prettier-plugin-css-order": "*",
+ "prettier-plugin-jsdoc": "*",
+ "prettier-plugin-marko": "*",
+ "prettier-plugin-multiline-arrays": "*",
+ "prettier-plugin-organize-attributes": "*",
+ "prettier-plugin-organize-imports": "*",
+ "prettier-plugin-sort-imports": "*",
+ "prettier-plugin-svelte": "*"
+ },
+ "peerDependenciesMeta": {
+ "@ianvs/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "@prettier/plugin-hermes": {
+ "optional": true
+ },
+ "@prettier/plugin-oxc": {
+ "optional": true
+ },
+ "@prettier/plugin-pug": {
+ "optional": true
+ },
+ "@shopify/prettier-plugin-liquid": {
+ "optional": true
+ },
+ "@trivago/prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "@zackad/prettier-plugin-twig": {
+ "optional": true
+ },
+ "prettier-plugin-astro": {
+ "optional": true
+ },
+ "prettier-plugin-css-order": {
+ "optional": true
+ },
+ "prettier-plugin-jsdoc": {
+ "optional": true
+ },
+ "prettier-plugin-marko": {
+ "optional": true
+ },
+ "prettier-plugin-multiline-arrays": {
+ "optional": true
+ },
+ "prettier-plugin-organize-attributes": {
+ "optional": true
+ },
+ "prettier-plugin-organize-imports": {
+ "optional": true
+ },
+ "prettier-plugin-sort-imports": {
+ "optional": true
+ },
+ "prettier-plugin-svelte": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/prosemirror-changeset": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/prosemirror-changeset/-/prosemirror-changeset-2.4.1.tgz",
+ "integrity": "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-transform": "^1.0.0"
+ }
+ },
+ "node_modules/prosemirror-commands": {
+ "version": "1.7.1",
+ "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz",
+ "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-model": "^1.0.0",
+ "prosemirror-state": "^1.0.0",
+ "prosemirror-transform": "^1.10.2"
+ }
+ },
+ "node_modules/prosemirror-dropcursor": {
+ "version": "1.8.3",
+ "resolved": "https://registry.npmjs.org/prosemirror-dropcursor/-/prosemirror-dropcursor-1.8.3.tgz",
+ "integrity": "sha512-FoYbsJR8gK+DGlqhNoE29Loa38eIZPzQRIb1VMaDNBoo4OLP6vVof/jR8qFY/6XvUd6Dhug8MDCHl2a/h8RTfQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-state": "^1.0.0",
+ "prosemirror-transform": "^1.1.0",
+ "prosemirror-view": "^1.1.0"
+ }
+ },
+ "node_modules/prosemirror-gapcursor": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/prosemirror-gapcursor/-/prosemirror-gapcursor-1.4.1.tgz",
+ "integrity": "sha512-pMdYaEnjNMSwl11yjEGtgTmLkR08m/Vl+Jj443167p9eB3HVQKhYCc4gmHVDsLPODfZfjr/MmirsdyZziXbQKw==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-keymap": "^1.0.0",
+ "prosemirror-model": "^1.0.0",
+ "prosemirror-state": "^1.0.0",
+ "prosemirror-view": "^1.0.0"
+ }
+ },
+ "node_modules/prosemirror-history": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz",
+ "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-state": "^1.2.2",
+ "prosemirror-transform": "^1.0.0",
+ "prosemirror-view": "^1.31.0",
+ "rope-sequence": "^1.3.0"
+ }
+ },
+ "node_modules/prosemirror-inputrules": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz",
+ "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-state": "^1.0.0",
+ "prosemirror-transform": "^1.0.0"
+ }
+ },
+ "node_modules/prosemirror-keymap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz",
+ "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-state": "^1.0.0",
+ "w3c-keyname": "^2.2.0"
+ }
+ },
+ "node_modules/prosemirror-model": {
+ "version": "1.25.11",
+ "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.11.tgz",
+ "integrity": "sha512-QWg9RhnpLlogAmp3p96uEFrE5txQpFynd4vhBAELkwgOCWQs/X0yCzB3/hrHqiPwf91RG5KyWq6553zs9JqIOQ==",
+ "license": "MIT",
+ "dependencies": {
+ "orderedmap": "^2.0.0"
+ }
+ },
+ "node_modules/prosemirror-schema-list": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz",
+ "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-model": "^1.0.0",
+ "prosemirror-state": "^1.0.0",
+ "prosemirror-transform": "^1.7.3"
+ }
+ },
+ "node_modules/prosemirror-state": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz",
+ "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-model": "^1.0.0",
+ "prosemirror-transform": "^1.0.0",
+ "prosemirror-view": "^1.27.0"
+ }
+ },
+ "node_modules/prosemirror-tables": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/prosemirror-tables/-/prosemirror-tables-1.8.5.tgz",
+ "integrity": "sha512-V/0cDCsHKHe/tfWkeCmthNUcEp1IVO3p6vwN8XtwE9PZQLAZJigbw3QoraAdfJPir4NKJtNvOB8oYGKRl+t0Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-keymap": "^1.2.3",
+ "prosemirror-model": "^1.25.4",
+ "prosemirror-state": "^1.4.4",
+ "prosemirror-transform": "^1.10.5",
+ "prosemirror-view": "^1.41.4"
+ }
+ },
+ "node_modules/prosemirror-transform": {
+ "version": "1.12.0",
+ "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.12.0.tgz",
+ "integrity": "sha512-GxboyN4AMIsoHNtz5uf2r2Ru551i5hWeCMD6E2Ib4Eogqoub0NflniaBPVQ4MrGE5yZ8JV9tUHg9qcZTTrcN4w==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-model": "^1.21.0"
+ }
+ },
+ "node_modules/prosemirror-view": {
+ "version": "1.42.2",
+ "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.42.2.tgz",
+ "integrity": "sha512-Pdg0l5kXm8aLDquFAnQFTCITg0q44sLqBlHlpsVLD9segdOao8TOfQdAhCrCXyVgPSRr6UDDROOIWA3bIrN9YQ==",
+ "license": "MIT",
+ "dependencies": {
+ "prosemirror-model": "^1.25.8",
+ "prosemirror-state": "^1.0.0",
+ "prosemirror-transform": "^1.1.0"
+ }
+ },
+ "node_modules/quansync": {
+ "version": "0.2.11",
+ "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz",
+ "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/antfu"
+ },
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/sxzz"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz",
+ "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.18.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/rolldown": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.2.tgz",
+ "integrity": "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@oxc-project/types": "=0.142.0",
+ "@rolldown/pluginutils": "^1.0.0"
+ },
+ "bin": {
+ "rolldown": "bin/cli.mjs"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "optionalDependencies": {
+ "@rolldown/binding-android-arm64": "1.2.2",
+ "@rolldown/binding-darwin-arm64": "1.2.2",
+ "@rolldown/binding-darwin-x64": "1.2.2",
+ "@rolldown/binding-freebsd-x64": "1.2.2",
+ "@rolldown/binding-linux-arm-gnueabihf": "1.2.2",
+ "@rolldown/binding-linux-arm64-gnu": "1.2.2",
+ "@rolldown/binding-linux-arm64-musl": "1.2.2",
+ "@rolldown/binding-linux-ppc64-gnu": "1.2.2",
+ "@rolldown/binding-linux-s390x-gnu": "1.2.2",
+ "@rolldown/binding-linux-x64-gnu": "1.2.2",
+ "@rolldown/binding-linux-x64-musl": "1.2.2",
+ "@rolldown/binding-openharmony-arm64": "1.2.2",
+ "@rolldown/binding-win32-arm64-msvc": "1.2.2",
+ "@rolldown/binding-win32-x64-msvc": "1.2.2"
+ }
+ },
+ "node_modules/rope-sequence": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz",
+ "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==",
+ "license": "MIT"
+ },
+ "node_modules/sade": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz",
+ "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mri": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/set-cookie-parser": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-3.1.2.tgz",
+ "integrity": "sha512-5/r/lTwbJ3zQ+qwdUFZYeRNqda7P5HD8zQKqlSjdGt1/S0cjLAphHusj4Y58ahDtWn/g32xrIS58/ikOvwl0Lw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/siginfo": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz",
+ "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/sirv": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.2.tgz",
+ "integrity": "sha512-2wcC/oGxHis/BoHkkPwldgiPSYcpZK3JU28WoMVv55yHJgcZ8rlXvuG9iZggz+sU1d4bRgIGASwyWqjxu3FM0g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "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,
+ "license": "MIT"
+ },
+ "node_modules/std-env": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz",
+ "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/strtok3": {
+ "version": "10.3.5",
+ "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-10.3.5.tgz",
+ "integrity": "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@tokenizer/token": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/svelte": {
+ "version": "5.56.8",
+ "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.56.8.tgz",
+ "integrity": "sha512-PY8LOw7xP6c8IOiVqdo0sbbZVYhXRSfklOQLAUyGBKqjTX0wx/z4l/9J+PmBpmlLnxzEb1NqltxQ5/wZme/Cmg==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.4",
+ "@jridgewell/sourcemap-codec": "^1.5.0",
+ "@sveltejs/acorn-typescript": "^1.0.10",
+ "@types/estree": "^1.0.5",
+ "@types/trusted-types": "^2.0.7",
+ "acorn": "^8.12.1",
+ "aria-query": "5.3.1",
+ "axobject-query": "^4.1.0",
+ "clsx": "^2.1.1",
+ "devalue": "^5.8.1",
+ "esm-env": "^1.2.1",
+ "esrap": "^2.2.12",
+ "is-reference": "^3.0.3",
+ "locate-character": "^3.0.0",
+ "magic-string": "^0.30.11",
+ "zimmerframe": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/svelte-awesome-color-picker": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/svelte-awesome-color-picker/-/svelte-awesome-color-picker-4.1.3.tgz",
+ "integrity": "sha512-fYio6XR2vp9WO0ihT6Vlw1Kj278gEZtqfIRde4YBx5OgGjBdQJxFE8jl6OibPQPrmaz625HZPZaSbRflL88/Mg==",
+ "license": "MIT",
+ "dependencies": {
+ "colord": "^2.9.3",
+ "svelte-awesome-slider": "2.0.0"
+ },
+ "engines": {
+ "node": ">=24"
+ },
+ "peerDependencies": {
+ "svelte": "^5.0.0"
+ }
+ },
+ "node_modules/svelte-awesome-slider": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/svelte-awesome-slider/-/svelte-awesome-slider-2.0.0.tgz",
+ "integrity": "sha512-YBkOdYm1Feaqsn2JkJBRs+Kc/X3Qy/3GuVmI7GmoYDjBaHkjx9uH4khTuED22z57Hg3gGWeDhp/clIjWDdLNaw==",
+ "license": "MIT",
+ "peerDependencies": {
+ "svelte": "^5.0.0"
+ }
+ },
+ "node_modules/svelte-check": {
+ "version": "4.7.4",
+ "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.7.4.tgz",
+ "integrity": "sha512-IW9ot9YqAoyv8FvyN+eb4ZTe8zgcKZrJLNYU6dzSKkGwEBsSPc4K7lmQ8bKn8W2YMXM6WDfZSSVOaGtekyUfOQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "@sveltejs/load-config": "^0.2.1",
+ "chokidar": "^4.0.1",
+ "fdir": "^6.2.0",
+ "picocolors": "^1.0.0",
+ "sade": "^1.7.4"
+ },
+ "bin": {
+ "svelte-check": "bin/svelte-check"
+ },
+ "engines": {
+ "node": ">= 18.0.0"
+ },
+ "peerDependencies": {
+ "svelte": "^4.0.0 || ^5.0.0-next.0",
+ "typescript": "^5.0.0 || ^6.0.0"
+ }
+ },
+ "node_modules/svelte-highlight": {
+ "version": "7.16.2",
+ "resolved": "https://registry.npmjs.org/svelte-highlight/-/svelte-highlight-7.16.2.tgz",
+ "integrity": "sha512-vJkp8F5mVEvJNPnunqjxn8xr4GcsYwkIet7ITyAk88/UEqD5L/HSOjlJTqtlC707csndA/Qy8N0Ie7UXyOe3fQ==",
+ "license": "MIT",
+ "dependencies": {
+ "magic-string": "^0.30.17"
+ }
+ },
+ "node_modules/tailwindcss": {
+ "version": "4.3.3",
+ "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.3.tgz",
+ "integrity": "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tapable": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.3.tgz",
+ "integrity": "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/tinybench": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.9.0.tgz",
+ "integrity": "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/tinyexec": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz",
+ "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyrainbow": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.1.tgz",
+ "integrity": "sha512-yau8yJdTt989Mm0Bd/236QnzEiPf2xLLTqUZRUJOo/3CB078LSwzei343DgtJVmfJKJE3TMINY1u42SQsP6mXw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=14.0.0"
+ }
+ },
+ "node_modules/tippy.js": {
+ "version": "6.3.7",
+ "resolved": "https://registry.npmjs.org/tippy.js/-/tippy.js-6.3.7.tgz",
+ "integrity": "sha512-E1d3oP2emgJ9dRQZdf3Kkn0qJgI6ZLpyS5z6ZkY1DF3kaQaBsGZsndEpHwx+eC+tYM41HaSNvNtLx8tU57FzTQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@popperjs/core": "^2.9.0"
+ }
+ },
+ "node_modules/token-types": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/token-types/-/token-types-6.1.2.tgz",
+ "integrity": "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@borewit/text-codec": "^0.2.1",
+ "@tokenizer/token": "^0.3.0",
+ "ieee754": "^1.2.1"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/Borewit"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-6.0.3.tgz",
+ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/typescript-color-gradient": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/typescript-color-gradient/-/typescript-color-gradient-4.2.0.tgz",
+ "integrity": "sha512-If2yZZfj+9KbBjdPUqTuppmn3JgYAZoPwE9jlxSYf5u3zFKCMAInNSHnEaIekoeykkSuaS8CnnP4XI/X68KybQ==",
+ "license": "MIT"
+ },
+ "node_modules/ufo": {
+ "version": "1.6.4",
+ "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz",
+ "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/uint8array-extras": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/uint8array-extras/-/uint8array-extras-1.5.0.tgz",
+ "integrity": "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "8.3.0",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz",
+ "integrity": "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/unplugin": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-2.3.11.tgz",
+ "integrity": "sha512-5uKD0nqiYVzlmCRs01Fhs2BdkEgBS3SAVP6ndrBsuK42iC2+JHyxM05Rm9G8+5mkmRtzMZGY8Ct5+mliZxU/Ww==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/remapping": "^2.3.5",
+ "acorn": "^8.15.0",
+ "picomatch": "^4.0.3",
+ "webpack-virtual-modules": "^0.6.2"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/unplugin-icons": {
+ "version": "23.0.1",
+ "resolved": "https://registry.npmjs.org/unplugin-icons/-/unplugin-icons-23.0.1.tgz",
+ "integrity": "sha512-rv0XEJepajKzDLvRUWASM8K+8+/CCfZn2jtogXqg6RIp7kpatRc/aFrVJn8ANQA09e++lPEEv9yX8cC9enc+QQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@antfu/install-pkg": "^1.1.0",
+ "@iconify/utils": "^3.1.0",
+ "local-pkg": "^1.1.2",
+ "obug": "^2.1.1",
+ "unplugin": "^2.3.11"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@svgr/core": ">=7.0.0",
+ "@svgx/core": "^1.0.1",
+ "@vue/compiler-sfc": "^3.0.2",
+ "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@svgr/core": {
+ "optional": true
+ },
+ "@svgx/core": {
+ "optional": true
+ },
+ "@vue/compiler-sfc": {
+ "optional": true
+ },
+ "svelte": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz",
+ "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "lightningcss": "^1.33.0",
+ "picomatch": "^4.0.5",
+ "postcss": "^8.5.23",
+ "rolldown": "~1.2.0",
+ "tinyglobby": "^0.2.17"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^20.19.0 || >=22.12.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^20.19.0 || >=22.12.0",
+ "@vitejs/devtools": "^0.4.0",
+ "esbuild": "^0.27.0 || ^0.28.0",
+ "jiti": ">=1.21.0",
+ "less": "^4.0.0",
+ "sass": "^1.70.0",
+ "sass-embedded": "^1.70.0",
+ "stylus": ">=0.54.8",
+ "sugarss": "^5.0.0",
+ "terser": "^5.16.0",
+ "tsx": "^4.8.1",
+ "yaml": "^2.4.2"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "@vitejs/devtools": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "jiti": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ },
+ "tsx": {
+ "optional": true
+ },
+ "yaml": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite/node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz",
+ "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==",
+ "dev": true,
+ "license": "MPL-2.0",
+ "dependencies": {
+ "detect-libc": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "lightningcss-android-arm64": "1.33.0",
+ "lightningcss-darwin-arm64": "1.33.0",
+ "lightningcss-darwin-x64": "1.33.0",
+ "lightningcss-freebsd-x64": "1.33.0",
+ "lightningcss-linux-arm-gnueabihf": "1.33.0",
+ "lightningcss-linux-arm64-gnu": "1.33.0",
+ "lightningcss-linux-arm64-musl": "1.33.0",
+ "lightningcss-linux-x64-gnu": "1.33.0",
+ "lightningcss-linux-x64-musl": "1.33.0",
+ "lightningcss-win32-arm64-msvc": "1.33.0",
+ "lightningcss-win32-x64-msvc": "1.33.0"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-android-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz",
+ "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-darwin-arm64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz",
+ "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-darwin-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz",
+ "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-freebsd-x64": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz",
+ "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-arm-gnueabihf": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz",
+ "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-arm64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz",
+ "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-arm64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz",
+ "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-x64-gnu": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz",
+ "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "glibc"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-linux-x64-musl": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz",
+ "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "libc": [
+ "musl"
+ ],
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-win32-arm64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz",
+ "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vite/node_modules/lightningcss-win32-x64-msvc": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz",
+ "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MPL-2.0",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/vitefu": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-1.1.3.tgz",
+ "integrity": "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg==",
+ "dev": true,
+ "license": "MIT",
+ "workspaces": [
+ "tests/deps/*",
+ "tests/projects/*",
+ "tests/projects/workspace/packages/*"
+ ],
+ "peerDependencies": {
+ "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "vite": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vitest": {
+ "version": "4.1.10",
+ "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.10.tgz",
+ "integrity": "sha512-R9jUTe5S4Qb0HCd4TNqpC7oGcrMssMRGXLW80ubjWsW9VH5GF8y1Y0SFLY9AbqSk6nt0PnOx4H4WNJYZ13GUPw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@vitest/expect": "4.1.10",
+ "@vitest/mocker": "4.1.10",
+ "@vitest/pretty-format": "4.1.10",
+ "@vitest/runner": "4.1.10",
+ "@vitest/snapshot": "4.1.10",
+ "@vitest/spy": "4.1.10",
+ "@vitest/utils": "4.1.10",
+ "es-module-lexer": "^2.0.0",
+ "expect-type": "^1.3.0",
+ "magic-string": "^0.30.21",
+ "obug": "^2.1.1",
+ "pathe": "^2.0.3",
+ "picomatch": "^4.0.3",
+ "std-env": "^4.0.0-rc.1",
+ "tinybench": "^2.9.0",
+ "tinyexec": "^1.0.2",
+ "tinyglobby": "^0.2.15",
+ "tinyrainbow": "^3.1.0",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0",
+ "why-is-node-running": "^2.3.0"
+ },
+ "bin": {
+ "vitest": "vitest.mjs"
+ },
+ "engines": {
+ "node": "^20.0.0 || ^22.0.0 || >=24.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/vitest"
+ },
+ "peerDependencies": {
+ "@edge-runtime/vm": "*",
+ "@opentelemetry/api": "^1.9.0",
+ "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0",
+ "@vitest/browser-playwright": "4.1.10",
+ "@vitest/browser-preview": "4.1.10",
+ "@vitest/browser-webdriverio": "4.1.10",
+ "@vitest/coverage-istanbul": "4.1.10",
+ "@vitest/coverage-v8": "4.1.10",
+ "@vitest/ui": "4.1.10",
+ "happy-dom": "*",
+ "jsdom": "*",
+ "vite": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@edge-runtime/vm": {
+ "optional": true
+ },
+ "@opentelemetry/api": {
+ "optional": true
+ },
+ "@types/node": {
+ "optional": true
+ },
+ "@vitest/browser-playwright": {
+ "optional": true
+ },
+ "@vitest/browser-preview": {
+ "optional": true
+ },
+ "@vitest/browser-webdriverio": {
+ "optional": true
+ },
+ "@vitest/coverage-istanbul": {
+ "optional": true
+ },
+ "@vitest/coverage-v8": {
+ "optional": true
+ },
+ "@vitest/ui": {
+ "optional": true
+ },
+ "happy-dom": {
+ "optional": true
+ },
+ "jsdom": {
+ "optional": true
+ },
+ "vite": {
+ "optional": false
+ }
+ }
+ },
+ "node_modules/w3c-keyname": {
+ "version": "2.2.8",
+ "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",
+ "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==",
+ "license": "MIT"
+ },
+ "node_modules/webpack-virtual-modules": {
+ "version": "0.6.2",
+ "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz",
+ "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/why-is-node-running": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz",
+ "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "siginfo": "^2.0.0",
+ "stackback": "0.0.2"
+ },
+ "bin": {
+ "why-is-node-running": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/zimmerframe": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/zimmerframe/-/zimmerframe-1.1.4.tgz",
+ "integrity": "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ==",
+ "license": "MIT"
+ }
+ }
}
diff --git a/package.json b/package.json
index cf2ae7f..24ed209 100644
--- a/package.json
+++ b/package.json
@@ -1,58 +1,57 @@
{
- "name": "tools",
- "version": "0.0.1",
- "private": true,
- "scripts": {
- "dev": "vite dev",
- "build": "vite build",
- "preview": "vite preview",
- "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
- "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch",
- "format": "prettier . --write . --cache",
- "lint": "oxlint . -W perf",
- "test:unit": "vitest",
- "test": "npm run test:unit -- --run && npm run test:e2e",
- "test:e2e": "playwright test"
- },
- "devDependencies": {
- "@iconify-json/tabler": "^1.2.35",
- "@playwright/test": "^1.61.1",
- "@sveltejs/adapter-auto": "^7.0.1",
- "@sveltejs/kit": "^2.69.3",
- "@sveltejs/vite-plugin-svelte": "^7.2.0",
- "@tailwindcss/vite": "^4.3.2",
- "@testing-library/jest-dom": "^6.9.1",
- "@testing-library/svelte": "^5.4.2",
- "@tiptap/extension-color": "^3.27.4",
- "@tiptap/extension-font-family": "^3.27.4",
- "@tiptap/extension-text-style": "^3.27.4",
- "@types/node": "^26.1.1",
- "file-type": "^22.0.1",
- "jsdom": "^29.1.1",
- "oxlint": "^1.74.0",
- "prettier": "^3.9.5",
- "prettier-plugin-svelte": "^4.1.1",
- "prettier-plugin-tailwindcss": "^0.8.0",
- "svelte": "^5.56.5",
- "svelte-check": "^4.7.2",
- "tailwindcss": "^4.3.2",
- "typescript": "^6.0.3",
- "unplugin-icons": "^23.0.1",
- "vite": "^8.1.4",
- "vitest": "^4.1.10"
- },
- "type": "module",
- "dependencies": {
- "@tiptap/core": "^3.27.4",
- "@tiptap/extension-placeholder": "^3.27.4",
- "@tiptap/pm": "^3.27.4",
- "@tiptap/starter-kit": "^3.27.4",
- "bits-ui": "^2.18.1",
- "html2canvas-pro": "^2.2.4",
- "idb": "^8.0.3",
- "svelte-awesome-color-picker": "^4.1.3",
- "svelte-highlight": "^7.11.0",
- "tippy.js": "^6.3.7",
- "typescript-color-gradient": "^4.2.0"
- }
+ "name": "tools",
+ "version": "0.0.1",
+ "private": true,
+ "scripts": {
+ "dev": "vite dev",
+ "build": "vite build",
+ "preview": "vite preview",
+ "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json",
+ "format": "prettier . --write . --cache",
+ "lint": "oxlint . -W perf -W suspicious --vitest-plugin",
+ "test:unit": "vitest --coverage",
+ "test": "npm run test:unit -- --run && npm run test:e2e",
+ "test:e2e": "playwright test"
+ },
+ "devDependencies": {
+ "@iconify-json/tabler": "^1.2.38",
+ "@playwright/test": "^1.62.1",
+ "@sveltejs/adapter-auto": "^7.0.1",
+ "@sveltejs/kit": "^2.70.2",
+ "@sveltejs/vite-plugin-svelte": "^7.2.0",
+ "@tailwindcss/vite": "^4.3.3",
+ "@types/node": "^26.1.2",
+ "@vitest/coverage-v8": "4.1.10",
+ "file-type": "^22.0.1",
+ "oxlint": "^1.77.0",
+ "prettier": "^3.9.6",
+ "prettier-plugin-svelte": "^4.1.1",
+ "prettier-plugin-tailwindcss": "^0.8.1",
+ "svelte": "^5.56.8",
+ "svelte-check": "^4.7.4",
+ "tailwindcss": "^4.3.3",
+ "typescript": "^6.0.3",
+ "unplugin-icons": "^23.0.1",
+ "vite": "^8.2.0",
+ "vitest": "^4.1.10"
+ },
+ "type": "module",
+ "dependencies": {
+ "@tiptap/core": "^3.29.2",
+ "@tiptap/extension-color": "^3.29.2",
+ "@tiptap/extension-font-family": "^3.29.2",
+ "@tiptap/extension-placeholder": "^3.29.2",
+ "@tiptap/extension-text-style": "^3.29.2",
+ "@tiptap/pm": "^3.29.2",
+ "@tiptap/starter-kit": "^3.29.2",
+ "idb": "^8.0.3",
+ "modern-screenshot": "^4.7.0",
+ "svelte-awesome-color-picker": "^4.1.3",
+ "svelte-highlight": "^7.16.2",
+ "tippy.js": "^6.3.7",
+ "typescript-color-gradient": "^4.2.0"
+ },
+ "overrides": {
+ "prosemirror-model": "1.25.11"
+ }
}
diff --git a/playwright.config.ts b/playwright.config.ts
index b3339ed..23d87f2 100644
--- a/playwright.config.ts
+++ b/playwright.config.ts
@@ -1,10 +1,9 @@
import { defineConfig } from "@playwright/test";
export default defineConfig({
- webServer: {
- command: "npm run build && npm run preview",
- port: 4173,
- },
- fullyParallel: true,
- testDir: "src/tests/e2e",
+ webServer: {
+ command: "npm run build && npm run preview",
+ port: 4173,
+ },
+ testDir: "src/tests/e2e",
});
diff --git a/screenshots/font-button-illageralt.png b/screenshots/font-button-illageralt.png
new file mode 100644
index 0000000..71592b5
Binary files /dev/null and b/screenshots/font-button-illageralt.png differ
diff --git a/src/app.css b/src/app.css
index 12b4d27..a08eb00 100644
--- a/src/app.css
+++ b/src/app.css
@@ -1,122 +1,145 @@
@import "tailwindcss";
+/* Meta stuff */
::-webkit-color-swatch,
::-moz-color-swatch {
- border-color: transparent;
+ border-color: transparent;
}
:root {
- accent-color: #ff631a;
- color-scheme: dark;
+ accent-color: #ff631a;
+ color-scheme: dark;
}
*::selection {
- background: #ff631a55;
- color: white;
+ background: #ff631a55;
+ color: white;
}
@theme {
- --font-lexend: Lexend, sans-serif;
- --font-minecraft: Minecraft, sans-serif;
+ --font-lexend: Lexend, sans-serif;
+ --font-minecraft: Minecraft, sans-serif;
}
+button {
+ cursor: pointer;
+}
+
+/* Fonts */
+
/* Use MinecraftEnchantingBold if parent uses MinecraftEnchanting font */
*[style*="font-family: MinecraftEnchanting"] strong {
- font-family: MinecraftEnchantingBold;
- font-weight: 100;
+ font-family: MinecraftEnchantingBold;
+ font-weight: 100;
}
/* Use MinecraftIllagerBold if parent uses MinecraftIllager font */
*[style*="font-family: MinecraftIllager"] strong {
- font-family: MinecraftIllagerBold;
- font-weight: 100;
+ font-family: MinecraftIllagerBold;
+ font-weight: 100;
}
/* Use MinecraftBold if not MinecraftEnchanting or MinecraftIllager */
strong {
- font-family: MinecraftBold;
- font-weight: 100;
+ font-family: MinecraftBold;
+ font-weight: 100;
}
-button {
- cursor: pointer;
-}
+/* Editor */
.tiptap {
- @apply h-full p-4;
- @apply focus:outline-none;
- font-family: Minecraft;
- @apply text-xl;
+ @apply h-full w-full p-4;
+ @apply focus:outline-none;
+ font-family: Minecraft;
+ @apply text-xl;
}
.tiptap p.is-editor-empty:first-child::before {
- color: #7f7f7f;
- content: attr(data-placeholder);
- float: left;
- height: 0;
- pointer-events: none;
+ color: #7f7f7f;
+ content: attr(data-placeholder);
+ float: left;
+ height: 0;
+ pointer-events: none;
}
.clickEvent {
- background-color: #3c3c40;
- border-bottom: solid #ff5555 2px;
- padding-top: 4px;
- padding-bottom: 2px;
- z-index: 10;
- --custom-source-align: top;
+ background-color: #3c3c40;
+ border-bottom: solid #ff5555 2px;
+ padding-top: 2px;
+ padding-bottom: 2px;
+ z-index: 10;
+ --custom-source-align: top;
}
.hoverEvent {
- background-color: #3c3c40;
- border-bottom: solid #ffff55 2px;
- padding-top: 4px;
- z-index: 10;
- --custom-source-align: top;
+ background-color: #3c3c40;
+ border-bottom: solid #ffff55 2px;
+ padding-top: 4px;
+ z-index: 10;
+ --custom-source-align: top;
}
.obfuscated {
- filter: blur(2px);
+ @apply transition-all;
}
-.color-picker {
- margin: none;
+.obfuscated:not(:hover) {
+ filter: blur(3px);
}
+/* Useful */
+
.nomob {
- @apply hidden md:inline;
+ @apply hidden md:inline;
+}
+
+/* Standardised */
+
+.btn {
+ @apply w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50;
}
.toolbar-btn {
- @apply rounded-md p-1 text-lg font-medium hover:bg-white/3;
+ @apply rounded-md p-1 text-lg font-medium hover:bg-white/3;
}
.tippy-box[data-theme~="dph"] {
- background-color: var(--color-zinc-700);
- font-family: "Lexend", sans-serif;
+ background-color: var(--color-zinc-700);
+ font-family: "Lexend", sans-serif;
+}
+
+/* Other */
+
+.color-picker {
+ margin: none;
}
+/* Output */
+
pre code.hljs {
- background: transparent !important;
- padding: 0 !important;
- @apply break-all whitespace-pre-wrap;
+ background: transparent !important;
+ padding: 0 !important;
+ @apply break-all whitespace-pre-wrap;
}
+/* Text highlight */
+
.hljs-attr {
- color: #55ffff !important;
+ color: #55ffff !important;
}
.hljs-string {
- color: #55ff55 !important;
+ color: #55ff55 !important;
}
.hljs-number {
- color: #ffaa00 !important;
+ color: #ffaa00 !important;
}
.hljs-literal {
- color: #ffaa00 !important;
+ color: #ffaa00 !important;
}
.hljs-params {
- color: #ffb86c !important;
+ color: #ffb86c !important;
}
.hljs-comment {
- color: #6272a4 !important;
- font-style: italic;
+ color: #6272a4 !important;
+ font-style: italic;
}
diff --git a/src/app.d.ts b/src/app.d.ts
index b26fa73..397f7b4 100644
--- a/src/app.d.ts
+++ b/src/app.d.ts
@@ -3,12 +3,12 @@ import "unplugin-icons/types/svelte";
// See https://kit.svelte.dev/docs/types#app
// for information about these interfaces
declare global {
- namespace App {
- // interface Error {}
- // interface Locals {}
- // interface PageData {}
- // interface Platform {}
- }
+ namespace App {
+ // interface Error {}
+ // interface Locals {}
+ // interface PageData {}
+ // interface Platform {}
+ }
}
///
diff --git a/src/app.html b/src/app.html
index 0ebfded..57e3638 100644
--- a/src/app.html
+++ b/src/app.html
@@ -1,43 +1,43 @@
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
- %sveltekit.head%
-
+
+ %sveltekit.head%
+
-
- %sveltekit.body%
-
+
+ %sveltekit.body%
+
diff --git a/src/fonts.css b/src/fonts.css
index 0c171cb..e065177 100644
--- a/src/fonts.css
+++ b/src/fonts.css
@@ -1,58 +1,58 @@
@font-face {
- font-display: swap;
- font-family: Minecraft;
- font-weight: 400;
- src: url("/fonts/Minecraft.woff2") format("woff2");
+ font-display: swap;
+ font-family: Minecraft;
+ font-weight: 400;
+ src: url("/fonts/Minecraft.woff2") format("woff2");
}
@font-face {
- font-display: swap;
- font-family: MinecraftBold;
- font-weight: 600;
- src: url("/fonts/MinecraftBold.woff2") format("woff2");
+ font-display: swap;
+ font-family: MinecraftBold;
+ font-weight: 600;
+ src: url("/fonts/MinecraftBold.woff2") format("woff2");
}
@font-face {
- font-display: swap;
- font-family: MinecraftEnchanting;
- font-weight: 400;
- src: url("/fonts/MinecraftEnchanting.woff2") format("woff2");
+ font-display: swap;
+ font-family: MinecraftEnchanting;
+ font-weight: 400;
+ src: url("/fonts/MinecraftEnchanting.woff2") format("woff2");
}
@font-face {
- font-display: swap;
- font-family: MinecraftEnchantingBold;
- font-weight: 600;
- src: url("/fonts/MinecraftEnchantingBold.woff2") format("woff2");
+ font-display: swap;
+ font-family: MinecraftEnchantingBold;
+ font-weight: 600;
+ src: url("/fonts/MinecraftEnchantingBold.woff2") format("woff2");
}
@font-face {
- font-display: swap;
- font-family: MinecraftIllager;
- font-weight: 400;
- src: url("/fonts/MinecraftIllager.woff2") format("woff2");
+ font-display: swap;
+ font-family: MinecraftIllager;
+ font-weight: 400;
+ src: url("/fonts/MinecraftIllager.woff2") format("woff2");
}
@font-face {
- font-display: swap;
- font-family: MinecraftIllagerBold;
- font-weight: 600;
- src: url("/fonts/MinecraftIllagerBold.woff2") format("woff2");
+ font-display: swap;
+ font-family: MinecraftIllagerBold;
+ font-weight: 600;
+ src: url("/fonts/MinecraftIllagerBold.woff2") format("woff2");
}
/* lexend-regular - latin */
@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: "Lexend";
- font-style: normal;
- font-weight: 400;
- src: url("/fonts/lexend-v24-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: "Lexend";
+ font-style: normal;
+ font-weight: 400;
+ src: url("/fonts/lexend-v24-latin-regular.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
/* lexend-600 - latin */
@font-face {
- font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
- font-family: "Lexend";
- font-style: normal;
- font-weight: 600;
- src: url("/fonts/lexend-v24-latin-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
+ font-display: swap; /* Check https://developer.mozilla.org/en-US/docs/Web/CSS/@font-face/font-display for other options. */
+ font-family: "Lexend";
+ font-style: normal;
+ font-weight: 600;
+ src: url("/fonts/lexend-v24-latin-600.woff2") format("woff2"); /* Chrome 36+, Opera 23+, Firefox 39+, Safari 12+, iOS 10+ */
}
diff --git a/src/lib/components/CheckBox.svelte b/src/lib/components/CheckBox.svelte
index d873416..7f585e8 100644
--- a/src/lib/components/CheckBox.svelte
+++ b/src/lib/components/CheckBox.svelte
@@ -1,17 +1,16 @@
- (value = !value)}>
- {#if value}
-
- {/if}
-
+ (value = !value)}>
+ {#if value}
+
+ {/if}
+
diff --git a/src/lib/components/Combobox.svelte b/src/lib/components/Combobox.svelte
deleted file mode 100644
index e593441..0000000
--- a/src/lib/components/Combobox.svelte
+++ /dev/null
@@ -1,84 +0,0 @@
-
-
-
-
-
-
-
-
-
-
- {#each filteredItems as item, i (i + item.value)}
-
- {#snippet children({ selected })}
-
- {item.label}
-
- {#if selected}
-
- {/if}
- {/snippet}
-
- {:else}
- No results found
- {/each}
-
-
-
diff --git a/src/lib/components/Key.svelte b/src/lib/components/Key.svelte
index b29418c..9c683a8 100644
--- a/src/lib/components/Key.svelte
+++ b/src/lib/components/Key.svelte
@@ -1,7 +1,7 @@
{@render children()}
+ class="w-fit rounded-sm border border-b-4 border-zinc-950 bg-zinc-900 px-2 py-0.5 font-bold text-white/60"
+ >{@render children()}
diff --git a/src/lib/components/Modal.svelte b/src/lib/components/Modal.svelte
index 6a0bba6..84a5e0c 100644
--- a/src/lib/components/Modal.svelte
+++ b/src/lib/components/Modal.svelte
@@ -1,85 +1,94 @@
{#if opened}
-
-
-
close()}
- class="fixed top-0 left-0 z-40 h-screen w-screen bg-transparent"
- tabindex="-1"
- hidden={!opened}>
-
-
-
- {title}
-
-
-
- {@render children()}
-
-
-
-
+
+
+
close()}
+ class="fixed top-0 left-0 z-40 h-screen w-screen bg-transparent"
+ tabindex="-1"
+ hidden={!opened}>
+
+
+
+ {title}
+
+
+
+ {@render children()}
+
+
+
+
{/if}
diff --git a/src/lib/components/TopUI.svelte b/src/lib/components/TopUI.svelte
new file mode 100644
index 0000000..bc4ee95
--- /dev/null
+++ b/src/lib/components/TopUI.svelte
@@ -0,0 +1,75 @@
+
+
+
+
+
+
Minecraft Text Editor
+
+
+
+ Import
+
+
+
+
+ Saved
+
+
+
+ Settings
+
+
+
Discord
+
Datapack Wiki
+
+
+{#await import("$lib/components/modals/topbar/SavedTextsModal.svelte") then modal}
+
+{/await}
+
+{#await import("$lib/components/modals/topbar/ImportModal.svelte") then modal}
+
+{/await}
+
+{#await import("$lib/components/modals/topbar/SettingsModal.svelte") then modal}
+
+{/await}
diff --git a/src/lib/components/modals/ClickEventModal.svelte b/src/lib/components/modals/ClickEventModal.svelte
index f418417..ca35c1a 100644
--- a/src/lib/components/modals/ClickEventModal.svelte
+++ b/src/lib/components/modals/ClickEventModal.svelte
@@ -1,90 +1,86 @@
- Event Type
-
- Open URL
- Run Command
- Suggest Command
- Copy to Clipboard
- Change Page (in books only)
- Open Dialog
-
+ Event Type
+
+ Open URL
+ Run Command
+ Suggest Command
+ Copy to Clipboard
+ Change Page (in books only)
+ Open Dialog
+
- {#if clickEventType == "open_url"}
- URL:
-
- {:else if clickEventType == "run_command"}
- Command:
-
-
- Note: the player must have permission to run the command!
-
- {:else if clickEventType == "suggest_command"}
- Command:
-
-
- Note: the player must have permission to run the command!
-
- {:else if clickEventType == "copy_to_clipboard"}
- Text to copy:
-
- {:else if clickEventType == "change_page"}
- Page to go to:
-
- {:else if clickEventType == "open_dialog"}
- Dialog ID:
-
- {/if}
+ {#if clickEventType == "open_url"}
+ URL:
+
+ {:else if clickEventType == "run_command"}
+ Command:
+
+ Note: the player must have permission to run the command!
+ {:else if clickEventType == "suggest_command"}
+ Command:
+
+ Note: the player must have permission to run the command!
+ {:else if clickEventType == "copy_to_clipboard"}
+ Text to copy:
+
+ {:else if clickEventType == "change_page"}
+ Page to go to:
+
+ {:else if clickEventType == "open_dialog"}
+ Dialog ID:
+
+ {/if}
-
- {#if clickEventType}
- {
- clickEventDialog.close();
- editor
- .chain()
- .focus()
- .setClickEvent({ action: clickEventType, value: clickEventValue })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add Click Event
-
- {/if}
-
+
+ {#if clickEventType}
+ {
+ clickEventDialog.close();
+ editor
+ .chain()
+ .focus()
+ .setClickEvent({ action: clickEventType, value: clickEventValue })
+ .run();
+ }}
+ class="btn">
+ Add Click Event
+
+ {/if}
+
diff --git a/src/lib/components/modals/ColorGradientModal.svelte b/src/lib/components/modals/ColorGradientModal.svelte
index 8b00ce3..37c682a 100644
--- a/src/lib/components/modals/ColorGradientModal.svelte
+++ b/src/lib/components/modals/ColorGradientModal.svelte
@@ -1,81 +1,124 @@
-
-
Add colours to the gradient below:
-
- {#each gradientSteps ?? [] as _, i}
-
-
-
-
- {#if gradientSteps.length > 1}
-
{
- gradientSteps.splice(i, 1);
- gradientSteps = gradientSteps;
- }}
- class="flex aspect-square h-9 w-fit items-center justify-center rounded-md bg-zinc-900 p-2 hover:bg-black/20">
-
-
- {/if}
-
- {/each}
-
{
- gradientSteps.push("#ffffff");
- gradientSteps = gradientSteps;
- }}
- class="aspect-square h-9 w-9 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
-
-
-
-
Preview
-
- {editor?.state.doc.textBetween(
- editor.state.selection.from,
- editor.state.selection.to,
- " ",
- ) || "error! no text selected"}
-
+
+
Add colours to the gradient below:
+
+ {#each gradientSteps ?? [] as _, i}
+
+
+
+
+ {#if gradientSteps.length > 1}
+
{
+ gradientSteps.splice(i, 1);
+ gradientSteps = gradientSteps;
+ }}
+ class="flex aspect-square h-9 w-fit items-center justify-center rounded-md bg-zinc-900 p-2 hover:bg-black/20">
+
+
+ {/if}
+
+ {/each}
+
{
+ gradientSteps.push("#ffffff");
+ gradientSteps = gradientSteps;
+ }}
+ class="aspect-square h-9 w-9 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+
+
+
Preview
+
+ {editor?.state.doc.textBetween(
+ editor.state.selection.from,
+ editor.state.selection.to,
+ " ",
+ ) || "error! no text selected"}
+
-
- Note: you need to select text in the editor before you try and apply
- a gradient.
-
+
+ Note: you need to select text in the editor before you try and apply a gradient.
+
-
{
- applyGradient(editor, gradientSteps);
- gradientDialog.close();
- }}
- class="w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Apply Gradient
-
-
+
{
+ applyGradient(editor, gradientSteps);
+ gradientDialog.close();
+ }}
+ class="btn">
+ Apply Gradient
+
+
diff --git a/src/lib/components/modals/CustomSourceModal.svelte b/src/lib/components/modals/CustomSourceModal.svelte
index cec3119..4697448 100644
--- a/src/lib/components/modals/CustomSourceModal.svelte
+++ b/src/lib/components/modals/CustomSourceModal.svelte
@@ -1,458 +1,443 @@
- Select a source type to add
- {#if !customType}
-
- {
- customType = "translate";
- }}>
-
- Translate Key
-
- {
- customType = "nbt";
- }}>
-
- NBT Value
-
- {
- customType = "score";
- }}>
-
- Score Value
-
- {
- customType = "selector";
- }}>
-
- Selector
-
- {
- customType = "keybind";
- }}>
-
- Keybind
-
- {#if $outputVersion.index >= 2}
- {
- customType = "object";
- }}>
-
- Object
-
- {/if}
-
- {:else}
-
- Translate Key
- Score Value
- NBT Value
- Selector
- Keybind
- Object
-
- {/if}
+ Select a source type to add
+ {#if !customType}
+
+ {
+ customType = "translate";
+ }}>
+
+ Translate Key
+
+ {
+ customType = "nbt";
+ }}>
+
+ NBT Value
+
+ {
+ customType = "score";
+ }}>
+
+ Score Value
+
+ {
+ customType = "selector";
+ }}>
+
+ Selector
+
+ {
+ customType = "keybind";
+ }}>
+
+ Keybind
+
+ {#if $outputVersion.index >= 2}
+ {
+ customType = "object";
+ }}>
+
+ Object
+
+ {/if}
+
+ {:else}
+
+ Translate Key
+ Score Value
+ NBT Value
+ Selector
+ Keybind
+ Object
+
+ {/if}
- {#if customType === "translate"}
- Translate Key
-
+ {#if customType === "translate"}
+ Translate Key
+
- Fallback
-
+ Fallback
+
- Parameters
-
- {#each customValues.translate.params ?? [] as p, i}
-
-
-
- {/each}
-
-
- {
- customValues.translate.params.push("");
- customValues.translate.params = customValues.translate.params;
- }}
- class="w-fit rounded-md bg-zinc-900 p-1 px-2 text-sm hover:bg-black/50">
- Add Parameter
-
- {#if customValues.translate.params.length != 0}
- {
- customValues.translate.params.pop();
- customValues.translate.params = customValues.translate.params;
- }}
- class="w-fit rounded-md bg-zinc-900 p-1 px-2 text-sm hover:bg-black/50">
- Remove Last Parameter
-
- {/if}
-
+ Parameters
+
+ {#each customValues.translate.params ?? [] as p, i}
+
+
+
+ {/each}
+
+
+ {
+ customValues.translate.params.push("");
+ customValues.translate.params = customValues.translate.params;
+ }}
+ class="w-fit rounded-md bg-zinc-900 p-1 px-2 text-sm hover:bg-black/50">
+ Add Parameter
+
+ {#if customValues.translate.params.length != 0}
+ {
+ customValues.translate.params.pop();
+ customValues.translate.params = customValues.translate.params;
+ }}
+ class="w-fit rounded-md bg-zinc-900 p-1 px-2 text-sm hover:bg-black/50">
+ Remove Last Parameter
+
+ {/if}
+
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertTranslate({
- key: customValues.translate.key,
- params: customValues.translate.params,
- fallback: customValues.translate.fallback,
- })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add Translate Key
-
- {:else if customType === "score"}
- Objective
-
- Player, Fake Player, or Entity
-
+ {
+ customDialog.close();
+ editor
+ .chain()
+ .focus()
+ .insertTranslate({
+ key: customValues.translate.key,
+ params: customValues.translate.params,
+ fallback: customValues.translate.fallback,
+ })
+ .run();
+ }}
+ class="btn mt-2">
+ Add Translate Key
+
+ {:else if customType === "score"}
+ Objective
+
+ Player, Fake Player, or Entity
+
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertScore({
- name: customValues.score.name,
- objective: customValues.score.objective,
- })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add Score Value
-
- {:else if customType === "nbt"}
- NBT Source type
-
- Storage
- Block
- Entity
-
- {#if customValues.nbt.sourceType === "storage"}
- Storage ID
-
+ {
+ customDialog.close();
+ editor
+ .chain()
+ .focus()
+ .insertScore({
+ name: customValues.score.name,
+ objective: customValues.score.objective,
+ })
+ .run();
+ }}
+ class="btn mt-2">
+ Add Score Value
+
+ {:else if customType === "nbt"}
+ NBT Source type
+
+ Storage
+ Block
+ Entity
+
+ {#if customValues.nbt.sourceType === "storage"}
+ Storage ID
+
- NBT path
-
+ NBT path
+
-
-
- Interpret (parse nbt value as a text component)
-
+
+
+ Interpret (parse nbt value as a text component)
+
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertStorageNBT({
- storage: customValues.nbt.storage,
- nbt: customValues.nbt.path,
- interpret: customValues.nbt.interpret,
- })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add NBT Value
-
- {:else if customValues.nbt.sourceType === "entity"}
- Entity
-
+ {
+ customDialog.close();
+ editor
+ .chain()
+ .focus()
+ .insertStorageNBT({
+ storage: customValues.nbt.storage,
+ nbt: customValues.nbt.path,
+ interpret: customValues.nbt.interpret,
+ })
+ .run();
+ }}
+ class="btn mt-2">
+ Add NBT Value
+
+ {:else if customValues.nbt.sourceType === "entity"}
+ Entity
+
- NBT path
-
+ NBT path
+
-
-
- Interpret (parse nbt value as a text component)
-
+
+
+ Interpret (parse nbt value as a text component)
+
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertEntityNBT({
- entity: customValues.nbt.entity,
- nbt: customValues.nbt.path,
- interpret: customValues.nbt.interpret,
- })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add NBT Value
-
- {:else if customValues.nbt.sourceType === "block"}
- Entity
-
+ {
+ customDialog.close();
+ editor
+ .chain()
+ .focus()
+ .insertEntityNBT({
+ entity: customValues.nbt.entity,
+ nbt: customValues.nbt.path,
+ interpret: customValues.nbt.interpret,
+ })
+ .run();
+ }}
+ class="btn mt-2">
+ Add NBT Value
+
+ {:else if customValues.nbt.sourceType === "block"}
+ Entity
+
- NBT path
-
+ NBT path
+
-
-
- Interpret (parse nbt value as a text component)
-
+
+
+ Interpret (parse nbt value as a text component)
+
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertBlockNBT({
- block: customValues.nbt.block,
- nbt: customValues.nbt.path,
- interpret: customValues.nbt.interpret,
- })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add NBT Value
-
- {/if}
- {:else if customType === "keybind"}
- Keybind
-
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertKeybind({ key: customValues.keybind.key })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add Keybind
-
- {:else if customType === "selector"}
- Selector
-
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertSelector({ selector: customValues.selector.selector })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add Selector
-
- {:else if customType === "object"}
- Object Type
-
- Atlas (sprite)
- Player Head
-
+ {
+ customDialog.close();
+ editor
+ .chain()
+ .focus()
+ .insertBlockNBT({
+ block: customValues.nbt.block,
+ nbt: customValues.nbt.path,
+ interpret: customValues.nbt.interpret,
+ })
+ .run();
+ }}
+ class="btn mt-2">
+ Add NBT Value
+
+ {/if}
+ {:else if customType === "keybind"}
+ Keybind
+
+ {
+ customDialog.close();
+ editor.chain().focus().insertKeybind({ key: customValues.keybind.key }).run();
+ }}
+ class="btn mt-2">
+ Add Keybind
+
+ {:else if customType === "selector"}
+ Selector
+
+ {
+ customDialog.close();
+ editor
+ .chain()
+ .focus()
+ .insertSelector({ selector: customValues.selector.selector })
+ .run();
+ }}
+ class="btn mt-2">
+ Add Selector
+
+ {:else if customType === "object"}
+ Object Type
+
+ Atlas (sprite)
+ Player Head
+
- {#if customValues.object.object == "atlas"}
- Atlas
-
- Sprite
-
+ {#if customValues.object.object == "atlas"}
+ Atlas
+
+ Defaults to minecraft:blocks
+ {#each defaultAtlases as atlas}
+ {atlas.label}
+ {/each}
+
+ Sprite
+
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertAtlasObject({
- atlas: customValues.object.atlas,
- sprite: customValues.object.sprite,
- })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add Object
-
- {:else if customValues.object.object == "player"}
- Username
-
+ {
+ customDialog.close();
+ editor
+ .chain()
+ .focus()
+ .insertAtlasObject({
+ atlas: customValues.object.atlas,
+ sprite: customValues.object.sprite,
+ })
+ .run();
+ }}
+ class="btn mt-2">
+ Add Object
+
+ {:else if customValues.object.object == "player"}
+ Username
+
-
-
- Render Hat (2nd skin layer)
-
+
+
+ Render Hat (2nd skin layer)
+
- {
- customDialog.close();
- editor
- .chain()
- .focus()
- .insertPlayerObject({
- player: {
- name: customValues.object.player.name,
- },
- hat: customValues.object.hat,
- })
- .run();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add Object
-
- {/if}
- {/if}
+ {
+ customDialog.close();
+ editor
+ .chain()
+ .focus()
+ .insertPlayerObject({
+ player: {
+ name: customValues.object.player.name,
+ },
+ hat: customValues.object.hat,
+ })
+ .run();
+ }}
+ class="btn mt-2">
+ Add Object
+
+ {/if}
+ {/if}
diff --git a/src/lib/components/modals/ExportModal.svelte b/src/lib/components/modals/ExportModal.svelte
deleted file mode 100644
index 5751514..0000000
--- a/src/lib/components/modals/ExportModal.svelte
+++ /dev/null
@@ -1,129 +0,0 @@
-
-
-
-
- {#if $outputVersion.index > 0}
-
-
- Toggle JSON mode (for use in json files)
-
- {/if}
-
-
- As {$outputVersion.index > 0 ? " " : "JSON "}text components:
-
-
-
{
- navigator.clipboard.writeText(
- convert(editor.getJSON(), "standard", shouldOptimise, exportAsJSON),
- );
- recentlyCopied = true;
- setTimeout(() => (recentlyCopied = false), 2000);
- }}>
-
-
-
- {editor
- ? convert(
- editor.getJSON(),
- "standard",
- shouldOptimise,
- exportAsJSON,
- )
- : "Loading..."}
-
-
-
-
As a lore component:
-
-
{
- navigator.clipboard.writeText(
- `[lore=${convert(editor.getJSON(), "item_lore", shouldOptimise, exportAsJSON)}]`,
- );
- recentlyCopied = true;
- setTimeout(() => (recentlyCopied = false), 2000);
- }}>
-
-
-
[lore=
- {editor
- ? convert(
- editor.getJSON(),
- "item_lore",
- shouldOptimise,
- exportAsJSON,
- )
- : "Loading..."}
- ]
-
-
-
-
As a MOTD:
-
-
{
- navigator.clipboard.writeText(
- editor ? translateMOTD(editor.getJSON()) : "Loading...",
- );
- recentlyCopied = true;
- setTimeout(() => (recentlyCopied = false), 2000);
- }}>
-
-
-
- {editor
- ? translateMOTD(editor.getJSON())
- : "Loading..."}
-
-
-
(BETA) As a image:
-
- Accuracy may not be great! You have been warned!
-
-
-
-
-
-
diff --git a/src/lib/components/modals/FontPickerModal.svelte b/src/lib/components/modals/FontPickerModal.svelte
index 5c1db7b..da8a131 100644
--- a/src/lib/components/modals/FontPickerModal.svelte
+++ b/src/lib/components/modals/FontPickerModal.svelte
@@ -1,123 +1,121 @@
-
-
Select one of the default Minecraft fonts below:
-
- {
- editor?.chain().focus().unsetFont().run();
- fontDialog?.close();
- }}
- class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
-
- Default
-
- {
- editor?.chain().focus().setFont("minecraft:illageralt").run();
- fontDialog?.close();
- }}
- class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
-
- Illager Alt
- (minecraft:illageralt)
-
- {
- editor?.chain().focus().setFont("minecraft:alt").run();
- fontDialog?.close();
- }}
- class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
-
- Standard Galactic Alphabet (enchant table)
- (minecraft:alt)
-
-
+
+
Select one of the default Minecraft fonts below:
+
+ {
+ editor?.chain().focus().unsetFont().run();
+ fontDialog?.close();
+ }}
+ class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Default
+
+ {
+ editor?.chain().focus().setFont("minecraft:illageralt").run();
+ fontDialog?.close();
+ }}
+ class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Illager Alt
+ (minecraft:illageralt)
+
+ {
+ editor?.chain().focus().setFont("minecraft:alt").run();
+ fontDialog?.close();
+ }}
+ class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Standard Galactic Alphabet (enchant table)
+ (minecraft:alt)
+
+
-
- To use a custom font in the editor, upload or select one below.
-
-
- {#each fontLUT as [identifier, _]}
-
- {
- editor?.chain().focus().setFont(identifier).run();
- fontDialog?.close();
- }}
- class="flex flex-1 items-center space-x-2">
-
- {identifier}
-
- deleteFont(identifier)}>
-
- {/each}
-
{
- fontDialog!.close();
- fontUploadModal!.open();
- }}
- class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
-
- Upload a custom font...
- (.ttf, .otf, .woff2)
-
-
+
To use a custom font in the editor, upload or select one below.
+
+ {#each fontLUT as [identifier, _]}
+
+ {
+ editor?.chain().focus().setFont(identifier).run();
+ fontDialog?.close();
+ }}
+ class="flex flex-1 items-center space-x-2">
+
+ {identifier}
+
+ deleteFont(identifier)}
+ >
+
+ {/each}
+
{
+ fontDialog!.close();
+ fontUploadModal!.open();
+ }}
+ class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Upload a custom font...
+ (.ttf, .otf, .woff2)
+
+
-
- Or, if you want to use a custom font without importing it, enter the ID:
-
-
+
Or, if you want to use a custom font without importing it, enter the ID:
+
-
- Note: in order for a custom font to show up ingame, you will need to
- add it with a resource pack. Also, if you don't import a font into the editor,
- it will show up here as your browser's default font.
-
+
+ Note: in order for a custom font to show up ingame, you will need to add it with a
+ resource pack. Also, if you don't import a font into the editor, it will show up here as your
+ browser's default font.
+
-
{
- editor?.chain().focus().setFont(fontName).run();
- fontDialog?.close();
- }}
- class="w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Set Font
-
-
+
{
+ editor?.chain().focus().setFont(fontName).run();
+ fontDialog?.close();
+ }}
+ class="btn">
+ Set Font
+
+
diff --git a/src/lib/components/modals/FontUploadModal.svelte b/src/lib/components/modals/FontUploadModal.svelte
index d682f48..3a9a6a9 100644
--- a/src/lib/components/modals/FontUploadModal.svelte
+++ b/src/lib/components/modals/FontUploadModal.svelte
@@ -1,119 +1,104 @@
-
- {#if step === 1}
- e.preventDefault()}>
-
-
- (.ttf, .otf, .woff2 recommended)
-
-
-
- {:else if step === 2}
-
- Enter font identifier (namespace:font_name)
-
-
-
- Add font
-
- {/if}
+
+ {#if step === 1}
+ e.preventDefault()}>
+
+ (.ttf, .otf, .woff2 recommended)
+
+
+ {:else if step === 2}
+
+ Enter font identifier (namespace:font_name)
+
+
+
+ Add font
+
+ {/if}
diff --git a/src/lib/components/modals/KeybindModal.svelte b/src/lib/components/modals/KeybindModal.svelte
index c08c932..0569e23 100644
--- a/src/lib/components/modals/KeybindModal.svelte
+++ b/src/lib/components/modals/KeybindModal.svelte
@@ -1,63 +1,62 @@
- Formatting Keybinds
-
- {#each keysAndActions as { keys, action }}
-
- {#each keys as key}
- {key}
- {/each}
- -
- {action}
-
- {/each}
-
- Modal Keybinds
-
- {#each modalKeybinds as { keys, action }}
-
- {#each keys as key}
- {key}
- {/each}
- -
- {action}
-
- {/each}
-
+ Formatting Keybinds
+
+ {#each keysAndActions as { keys, action }}
+
+ {#each keys as key}
+ {key}
+ {/each}
+ -
+ {action}
+
+ {/each}
+
+ Modal Keybinds
+
+ {#each modalKeybinds as { keys, action }}
+
+ {#each keys as key}
+ {key}
+ {/each}
+ -
+ {action}
+
+ {/each}
+
diff --git a/src/lib/components/modals/UnicodeSelectorModal.svelte b/src/lib/components/modals/UnicodeSelectorModal.svelte
index c90361b..4992b19 100644
--- a/src/lib/components/modals/UnicodeSelectorModal.svelte
+++ b/src/lib/components/modals/UnicodeSelectorModal.svelte
@@ -1,56 +1,49 @@
-
-
-
Click to insert a custom character:
-
-
- {#each chars as char}
- editor.chain().focus().insertContent(char).run()}
- >{char}
- {/each}
-
+
+
+
Click to insert a custom character:
+
+
+ {#each chars as char}
+ editor.chain().focus().insertContent(char).run()}>{char}
+ {/each}
+
-
-
- {#each chars as char}
- editor.chain().focus().insertContent(char).run()}
- >{char}
- {/each}
-
+
+
+ {#each chars as char}
+ editor.chain().focus().insertContent(char).run()}>{char}
+ {/each}
+
-
-
- {#each chars as char}
- editor.chain().focus().insertContent(char).run()}
- >{char}
- {/each}
-
-
+
+
+ {#each chars as char}
+ editor.chain().focus().insertContent(char).run()}>{char}
+ {/each}
+
+
diff --git a/src/lib/components/modals/topbar/ExportModal.svelte b/src/lib/components/modals/topbar/ExportModal.svelte
new file mode 100644
index 0000000..3671c0a
--- /dev/null
+++ b/src/lib/components/modals/topbar/ExportModal.svelte
@@ -0,0 +1,358 @@
+
+
+ showOutput = null}>
+
+ {#if showOutput == null}
+
You can also export the text in one of these formats too:
+
+
showOutput = "lore"}
+ class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Lore item component
+
+
+
showOutput = "motd"}
+ class="flex h-full w-full cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Server MOTD
+
+
+
+
+ Image
+ (.png)
+
+
+
+ More coming soon
+
+
+ {:else if showOutput == "lore"}
+
+
+
+ Lore item component
+
+
showOutput = null}
+ class="flex h-full w-fit cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Back
+
+
+
+ [lore=
+ {#if $appSettings.syntaxHighlight}
+
+
+
+ {:else}
+ {editor
+ ? convert(editor.getJSON(), shouldOptimise, "item_lore", exportAsJSON)
+ : "Loading..."}
+ {/if}
+ ]
+
+
+
{
+ navigator.clipboard.writeText(
+ `[lore=${convert(editor.getJSON(), shouldOptimise, "item_lore", exportAsJSON)}]`,
+ );
+ recentlyCopied = true;
+ setTimeout(() => (recentlyCopied = false), 2000);
+ }}>
+ {#if !recentlyCopied}
+
+ Copy
+ {:else}
+
+ Copied!
+ {/if}
+
+ {:else if showOutput == "motd"}
+
+
+
+ Server MOTD
+
+
showOutput = null}
+ class="flex h-full w-fit cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Back
+
+
+
+ {editor
+ ? translateMOTD(editor.getJSON())
+ : "Loading..."}
+
+
+
{
+ navigator.clipboard.writeText(translateMOTD(editor.getJSON()));
+ recentlyCopied = true;
+ setTimeout(() => (recentlyCopied = false), 2000);
+ }}>
+ {#if !recentlyCopied}
+
+ Copy
+ {:else}
+
+ Copied!
+ {/if}
+
+ {:else if showOutput == "image"}
+
+
+
+ Image
+
+
showOutput = null}
+ class="flex h-full w-fit cursor-pointer items-center space-x-2 rounded-md bg-zinc-900 p-2 hover:bg-black/50">
+
+ Back
+
+
+
+
+
+
+
+ Transparent background
+
+
+ {
+ exportImage().then(copyImage);
+ recentlyCopied = true;
+ setTimeout(() => (recentlyCopied = false), 2000);
+ }}>
+ {#if !recentlyCopied}
+
+ Copy
+ {:else}
+
+ Copied!
+ {/if}
+
+
+ {
+ exportImage().then(downloadImage);
+ }}>
+
+ Download
+ (.png)
+
+
+ {/if}
+
+
+
+
+
diff --git a/src/lib/components/modals/topbar/ImportModal.svelte b/src/lib/components/modals/topbar/ImportModal.svelte
new file mode 100644
index 0000000..0e7d88b
--- /dev/null
+++ b/src/lib/components/modals/topbar/ImportModal.svelte
@@ -0,0 +1,28 @@
+
+
+
+
+
+ Paste your text components below to import them into the editor. This will clear the
+ current contents of the editor!
+
+
+
+
+ Import
+
+
+
diff --git a/src/lib/components/modals/topbar/SavedTextsModal.svelte b/src/lib/components/modals/topbar/SavedTextsModal.svelte
new file mode 100644
index 0000000..4b2d000
--- /dev/null
+++ b/src/lib/components/modals/topbar/SavedTextsModal.svelte
@@ -0,0 +1,64 @@
+
+
+
+
+ {#if snapshots.length == 0}
+
You have not saved anything yet!
+ {/if}
+ {#each snapshots as snapshot (snapshot)}
+
+
+
+
+
+ {
+ editor?.commands.setContent(snapshot);
+ editor?.commands.focus();
+ }}>
+ {
+ snapshots = snapshots.filter(
+ (_, index) => index !== snapshots.indexOf(snapshot),
+ );
+ localStorage.setItem("snapshots", JSON.stringify(snapshots));
+ }}>
+
+
+ {/each}
+
Save current text
+
+
diff --git a/src/lib/components/modals/topbar/SettingsModal.svelte b/src/lib/components/modals/topbar/SettingsModal.svelte
new file mode 100644
index 0000000..58934f5
--- /dev/null
+++ b/src/lib/components/modals/topbar/SettingsModal.svelte
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+ Show character count
+ If enabled, the output character count will be visible at the bottom of the screen.
+
+
+
+
+
+
+ Syntax highlighted output
+ If enabled, the component output will be syntax highlighted at the bottom of the screen.
+
+
+
+
+
+
+ Use realistic line height
+ If enabled, the space between lines in the editor will be more similar to that of the Minecraft chat.
+
+
+
+
+
+ Small
+ Default
+ Large
+
+
+ Editor font size
+ This alters the font size in the editor, but not the output.
+
+
+
+
diff --git a/src/lib/components/text/MiniEditor.svelte b/src/lib/components/text/MiniEditor.svelte
index acf417e..e74f255 100644
--- a/src/lib/components/text/MiniEditor.svelte
+++ b/src/lib/components/text/MiniEditor.svelte
@@ -1,171 +1,159 @@
-
- {#if editor}
-
-
-
-
- {#each colorMap as color}
-
editor?.chain().focus().setColor(color.value).run()}
- title={color.name}
- class="rounded-md p-0.5 text-sm hover:bg-white/3 {editor.isActive(
- 'textStyle',
- { color: color.value },
- )
- ? 'bg-zinc-800'
- : ''}"
- style="color: {color.value};">
-
-
- {/each}
- {#if editor.isActive("textStyle")}
-
editor?.chain().focus().unsetColor().run()}
- class="rounded-md p-1 text-lg text-zinc-500 hover:bg-white/3">
-
-
- {/if}
-
-
-
- {/if}
-
-
-
-
+
+ {#if editor}
+
+
+
+
+ {#each colourMap as color}
+
editor?.chain().focus().setColor(color.value).run()}
+ title={color.name}
+ class="rounded-md p-0.5 text-sm hover:bg-white/3 {editor.isActive('textStyle', {
+ color: color.value,
+ })
+ ? 'bg-zinc-800'
+ : ''}"
+ style="color: {color.value};">
+
+
+ {/each}
+ {#if editor.isActive("textStyle")}
+
editor?.chain().focus().unsetColor().run()}
+ class="rounded-md p-1 text-lg text-zinc-500 hover:bg-white/3">
+
+
+ {/if}
+
+
+
+ {/if}
+
+
+
+
diff --git a/src/lib/components/text/MiniRenderer.svelte b/src/lib/components/text/MiniRenderer.svelte
index 8f4b942..f050c13 100644
--- a/src/lib/components/text/MiniRenderer.svelte
+++ b/src/lib/components/text/MiniRenderer.svelte
@@ -1,65 +1,65 @@
diff --git a/src/lib/components/text/ShadowColorButton.svelte b/src/lib/components/text/ShadowColorButton.svelte
deleted file mode 100644
index fede43f..0000000
--- a/src/lib/components/text/ShadowColorButton.svelte
+++ /dev/null
@@ -1,38 +0,0 @@
-
-
-
-
-
-
-
diff --git a/src/lib/components/text/TextStyleButtons.svelte b/src/lib/components/text/TextStyleButtons.svelte
deleted file mode 100644
index 7b12294..0000000
--- a/src/lib/components/text/TextStyleButtons.svelte
+++ /dev/null
@@ -1,117 +0,0 @@
-
-
- editor.chain().focus().toggleBold().run()}
- {@attach tooltip}
- class="p-1 {small
- ? 'text-sm'
- : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive(
- 'bold',
- )
- ? 'bg-zinc-800'
- : ''}">
-
-
- editor.chain().focus().toggleItalic().run()}
- {@attach tooltip}
- class="p-1 {small
- ? 'text-sm'
- : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive(
- 'italic',
- )
- ? 'bg-zinc-800'
- : ''}">
-
-
- editor.chain().focus().toggleStrike().run()}
- {@attach tooltip}
- class="p-1 {small
- ? 'text-sm'
- : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive(
- 'strike',
- )
- ? 'bg-zinc-800'
- : ''}">
-
-
- editor.chain().focus().toggleUnderline().run()}
- {@attach tooltip}
- class="p-1 {small
- ? 'text-sm'
- : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive(
- 'underline',
- )
- ? 'bg-zinc-800'
- : ''}">
-
-
- editor.chain().focus().toggleObfuscated().run()}
- {@attach tooltip}
- class="p-1 {small
- ? 'text-sm'
- : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive(
- 'obfuscated',
- )
- ? 'bg-zinc-800'
- : ''}">
-
-
-
-{#if !editor.isActive("shadowColor") || isColorPickerOpen}
- {
- if (isColorPickerOpen) {
- c.hex && editor.chain().focus().setShadowColor(c.hex).run();
- }
- }}
- swatches={Object.values(colorMap).map((c) => c.value)}
- components={{ input: ShadowColorButton }} />
-{:else}
- {
- shouldIgnoreInitInput = true;
- shadowColorValue = "#ffffff";
- editor.chain().focus().unsetShadowColor().run();
- }}
- class="p-1 {small
- ? 'text-sm'
- : 'text-lg'} rounded-md bg-zinc-800 font-medium hover:bg-white/3">
-
-
-{/if}
diff --git a/src/lib/components/text/ToolbarButton.svelte b/src/lib/components/text/ToolbarButton.svelte
deleted file mode 100644
index ecc8b19..0000000
--- a/src/lib/components/text/ToolbarButton.svelte
+++ /dev/null
@@ -1,24 +0,0 @@
-
-
-
-
-
diff --git a/src/lib/components/toolbar/ShadowColorButton.svelte b/src/lib/components/toolbar/ShadowColorButton.svelte
new file mode 100644
index 0000000..679f6e7
--- /dev/null
+++ b/src/lib/components/toolbar/ShadowColorButton.svelte
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
diff --git a/src/lib/components/toolbar/TextStyleButtons.svelte b/src/lib/components/toolbar/TextStyleButtons.svelte
new file mode 100644
index 0000000..56b422c
--- /dev/null
+++ b/src/lib/components/toolbar/TextStyleButtons.svelte
@@ -0,0 +1,111 @@
+
+
+ editor.chain().focus().toggleBold().run()}
+ {@attach tooltip}
+ class="p-1 {small
+ ? 'text-sm'
+ : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive('bold')
+ ? 'bg-zinc-800'
+ : ''}">
+
+
+ editor.chain().focus().toggleItalic().run()}
+ {@attach tooltip}
+ class="p-1 {small
+ ? 'text-sm'
+ : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive('italic')
+ ? 'bg-zinc-800'
+ : ''}">
+
+
+ editor.chain().focus().toggleStrike().run()}
+ {@attach tooltip}
+ class="p-1 {small
+ ? 'text-sm'
+ : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive('strike')
+ ? 'bg-zinc-800'
+ : ''}">
+
+
+ editor.chain().focus().toggleUnderline().run()}
+ {@attach tooltip}
+ class="p-1 {small
+ ? 'text-sm'
+ : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive('underline')
+ ? 'bg-zinc-800'
+ : ''}">
+
+
+ editor.chain().focus().toggleObfuscated().run()}
+ {@attach tooltip}
+ class="p-1 {small
+ ? 'text-sm'
+ : 'text-lg'} rounded-md font-medium hover:bg-white/3 {editor.isActive('obfuscated')
+ ? 'bg-zinc-800'
+ : ''}">
+
+
+
+{#if !editor.isActive("shadowColor") || isColorPickerOpen}
+ {
+ if (isColorPickerOpen) {
+ c.hex && editor.chain().focus().setShadowColor(c.hex).run();
+ }
+ }}
+ swatches={Object.values(colourMap).map((c) => c.value)}
+ components={{ input: ShadowColorButton }} />
+{:else}
+ {
+ shouldIgnoreInitInput = true;
+ shadowColorValue = "#ffffff";
+ editor.chain().focus().unsetShadowColor().run();
+ }}
+ class="p-1 {small
+ ? 'text-sm'
+ : 'text-lg'} rounded-md bg-zinc-800 font-medium hover:bg-white/3">
+
+
+{/if}
diff --git a/src/lib/components/toolbar/Toolbar.svelte b/src/lib/components/toolbar/Toolbar.svelte
new file mode 100644
index 0000000..288e9f6
--- /dev/null
+++ b/src/lib/components/toolbar/Toolbar.svelte
@@ -0,0 +1,337 @@
+
+
+
+ {#if editor}
+
+
+
+ editor!.getAttributes("textStyle").font
+ ? editor!.chain().focus().unsetFont().run()
+ : fontDialog.open()}
+ styleVar={editor.getAttributes("textStyle").font}
+ ariaLabel="Font" />
+
+
+
+
+
+
+
+ {#each colourMap as colour}
+ editor!.chain().focus().setColor(colour.value).run()}
+ styleVar={editor.isActive("textStyle", { color: colour.value })}
+ colour={colour.value}
+ ariaLabel={toTitleCase(colour.name.replace("_", " "))} />
+ {/each}
+
+ {#if editor.getAttributes("textStyle").color}
+ editor?.chain().focus().unsetColor().run()}
+ data-testid="unset-color-button"
+ aria-label="Unset color"
+ {@attach tooltip}
+ class="rounded-md p-1 text-lg text-zinc-500 hover:bg-white/3"
+ class:active={editor.isActive("underline")}>
+
+
+ {/if}
+
+
+
+ {
+ customDialog?.open();
+ customType = undefined;
+ }}
+ {@attach tooltip}
+ class="toolbar-btn"
+ aria-label="Add Custom Source">
+
+
+ {#if sourceKeys.some((key) => editor!.isActive(key))}
+ {
+ customType = getNodeAtSelection(editor!)?.type.name;
+ if (customType === "player_object" || customType === "selector") {
+ customType = "object";
+ }
+ await customDialog.open();
+ }}
+ ariaLabel="Edit Source"
+ Icon={IconEdit} />
+ {/if}
+
+
+
+
+
+ {
+ if (editor?.isActive("clickEvent")) {
+ editor?.chain().focus().unsetClickEvent().run();
+ } else {
+ clickEventDialog?.open();
+ }
+ }}
+ ariaLabel="Click Event"
+ styleVar={editor.isActive("clickEvent")}
+ Icon={IconClickEvent} />
+ {#if editor.isActive("clickEvent")}
+
+ {/if}
+
+ {
+ if (editor?.isActive("hoverEvent")) {
+ editor?.chain().focus().unsetHoverEvent().run();
+ } else {
+ hoverEventDialog?.open();
+ }
+ }}
+ {@attach tooltip}
+ class="{editor.isActive('clickEvent') || editor.isActive('hoverEvent')
+ ? 'ml-2'
+ : ''} toolbar-btn {editor.isActive('hoverEvent') ? 'bg-zinc-800' : ''}"
+ aria-label="Hover Event">
+
+
+ {#if editor.isActive("hoverEvent")}
+
+ {/if}
+
+
+
+ editor?.commands.undo()} ariaLabel="Undo" Icon={IconUndo} />
+ editor?.commands.redo()} ariaLabel="Redo" Icon={IconRedo} />
+
+
+
+
+
+ {/if}
+
+
+{#await import("$lib/components/modals/ClickEventModal.svelte") then modal}
+
+{/await}
+
+
+ Text to show
+
+ {
+ editor
+ ?.chain()
+ .focus()
+ .setHoverEvent({ action: "show_text", value: hoverEventValue })
+ .run();
+ hoverEventDialog?.close();
+ }}
+ class="btn">
+ Add Hover Event
+
+
+
+{#await import("$lib/components/modals/CustomSourceModal.svelte") then modal}
+
+{/await}
+
+
+
+
+
+
+ Done
+
+
+
+
+{#await import("$lib/components/modals/FontPickerModal.svelte") then modal}
+
+{/await}
+
+{#await import("$lib/components/modals/KeybindModal.svelte") then modal}
+
+{/await}
+{#await import("$lib/components/modals/FontUploadModal.svelte") then modal}
+
+{/await}
+
+{#await import("$lib/components/modals/ColorGradientModal.svelte") then modal}
+
+{/await}
+{#await import("$lib/components/modals/UnicodeSelectorModal.svelte") then modal}
+
+{/await}
diff --git a/src/lib/components/toolbar/ToolbarButton.svelte b/src/lib/components/toolbar/ToolbarButton.svelte
new file mode 100644
index 0000000..1b47a09
--- /dev/null
+++ b/src/lib/components/toolbar/ToolbarButton.svelte
@@ -0,0 +1,23 @@
+
+
+
+
+
diff --git a/src/lib/db.ts b/src/lib/db.ts
index a3102e7..95ae556 100644
--- a/src/lib/db.ts
+++ b/src/lib/db.ts
@@ -1,13 +1,13 @@
import { openDB } from "idb";
export async function openDataStore() {
- const db = await openDB("dph_data-store", 1, {
- upgrade(db, _old, _new, _) {
- db.createObjectStore("fonts", {
- keyPath: "identifier",
- });
- },
- });
+ const fontDatabase = await openDB("dph_data-store", 1, {
+ upgrade(db, _old, _new, _) {
+ db.createObjectStore("fonts", {
+ keyPath: "identifier",
+ });
+ },
+ });
- return db;
+ return fontDatabase;
}
diff --git a/src/lib/settings.ts b/src/lib/settings.ts
new file mode 100644
index 0000000..ef318c6
--- /dev/null
+++ b/src/lib/settings.ts
@@ -0,0 +1,37 @@
+// src/lib/stores/settings.js
+import { writable, type Writable } from 'svelte/store';
+import { browser } from '$app/environment';
+
+export type Settings = {
+ showCharacterCount: boolean; // whether the character count is shown
+ syntaxHighlight: boolean; // whether to show highlighted output text
+ realisticLineHeight: boolean; // whether to use smaller line height
+ fontSize: number; // 0 = small, 1 = default, 2 = large
+};
+
+function createPersistentStore(key: string, startValue: any) {
+ var value = browser ? localStorage.getItem(key) ?? startValue : startValue;
+ if (typeof value == "string"){
+ value = JSON.parse(value)
+ } else {
+ value = value
+ }
+
+ const store = writable(value);
+
+ store.subscribe((value) => {
+ if (browser) {
+ const stringValue = JSON.stringify(value);
+ localStorage.setItem(key, stringValue);
+ }
+ });
+
+ return store;
+}
+
+export const appSettings: Writable = createPersistentStore('settings', {
+ showCharacterCount: true,
+ syntaxHighlight: true,
+ realisticLineHeight: false,
+ fontSize: 1
+});
diff --git a/src/lib/stores.ts b/src/lib/stores.ts
index 9cc9915..62b6d06 100644
--- a/src/lib/stores.ts
+++ b/src/lib/stores.ts
@@ -1,4 +1,4 @@
import { writable } from "svelte/store";
import { versions } from "./types";
-export const outputVersion = writable(versions[versions.length - 1]);
+export const outputVersion = writable(versions[versions.length - 1]);
\ No newline at end of file
diff --git a/src/lib/text/motd.ts b/src/lib/text/motd.ts
index aea41ec..f0aa00a 100644
--- a/src/lib/text/motd.ts
+++ b/src/lib/text/motd.ts
@@ -1,106 +1,98 @@
import type { JSONContent } from "@tiptap/core";
-import { colorMap, trueMarkOrUndefined, unescapeUnicode } from "./utils";
+import { colourMap, trueMarkOrUndefined, unescapeUnicode } from "./utils";
function hexToRgb(hex: string): [number, number, number] {
- hex = hex.replace(/^#/, "");
- if (hex.length === 3) {
- hex = hex
- .split("")
- .map((x) => x + x)
- .join("");
- }
- const num = parseInt(hex, 16);
- return [(num >> 16) & 255, (num >> 8) & 255, num & 255];
+ hex = hex.replace(/^#/, "");
+ if (hex.length === 3) {
+ hex = hex
+ .split("")
+ .map((x) => x + x)
+ .join("");
+ }
+ const num = parseInt(hex, 16);
+ return [(num >> 16) & 255, (num >> 8) & 255, num & 255];
}
-function rgbToLab([r, g, b]: [number, number, number]): [
- number,
- number,
- number,
-] {
- // Convert RGB to XYZ
- let [rr, gg, bb] = [r, g, b].map((v) => {
- v /= 255;
- return v > 0.04045 ? Math.pow((v + 0.055) / 1.055, 2.4) : v / 12.92;
- });
-
- const x = (rr * 0.4124 + gg * 0.3576 + bb * 0.1805) / 0.95047;
- const y = (rr * 0.2126 + gg * 0.7152 + bb * 0.0722) / 1.0;
- const z = (rr * 0.0193 + gg * 0.1192 + bb * 0.9505) / 1.08883;
-
- // Convert XYZ to LAB
- const xyz = [x, y, z].map((v) =>
- v > 0.008856 ? Math.cbrt(v) : 7.787 * v + 16 / 116,
- );
-
- const l = 116 * xyz[1] - 16;
- const a = 500 * (xyz[0] - xyz[1]);
- const b_ = 200 * (xyz[1] - xyz[2]);
- return [l, a, b_];
+function rgbToLab([r, g, b]: [number, number, number]): [number, number, number] {
+ // Convert RGB to XYZ
+ let [rr, gg, bb] = [r, g, b].map((v) => {
+ v /= 255;
+ return v > 0.04045 ? Math.pow((v + 0.055) / 1.055, 2.4) : v / 12.92;
+ });
+
+ const x = (rr * 0.4124 + gg * 0.3576 + bb * 0.1805) / 0.95047;
+ const y = (rr * 0.2126 + gg * 0.7152 + bb * 0.0722) / 1.0;
+ const z = (rr * 0.0193 + gg * 0.1192 + bb * 0.9505) / 1.08883;
+
+ // Convert XYZ to LAB
+ const xyz = [x, y, z].map((v) => (v > 0.008856 ? Math.cbrt(v) : 7.787 * v + 16 / 116));
+
+ const l = 116 * xyz[1] - 16;
+ const a = 500 * (xyz[0] - xyz[1]);
+ const b_ = 200 * (xyz[1] - xyz[2]);
+ return [l, a, b_];
}
export function deltaE(hex1: string, hex2: string): number {
- const lab1 = rgbToLab(hexToRgb(hex1));
- const lab2 = rgbToLab(hexToRgb(hex2));
- const [l1, a1, b1] = lab1;
- const [l2, a2, b2] = lab2;
- return Math.sqrt(
- Math.pow(l1 - l2, 2) + Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2),
- );
+ const lab1 = rgbToLab(hexToRgb(hex1));
+ const lab2 = rgbToLab(hexToRgb(hex2));
+ const [l1, a1, b1] = lab1;
+ const [l2, a2, b2] = lab2;
+ return Math.sqrt(Math.pow(l1 - l2, 2) + Math.pow(a1 - a2, 2) + Math.pow(b1 - b2, 2));
}
const formattingCodes = [
- { key: "obfuscated", value: "k" },
- { key: "bold", value: "l" },
- { key: "strike", value: "m" },
- { key: "underline", value: "n" },
- { key: "italic", value: "o" },
+ { key: "obfuscated", value: "k" },
+ { key: "bold", value: "l" },
+ { key: "strike", value: "m" },
+ { key: "underline", value: "n" },
+ { key: "italic", value: "o" },
];
export function translateMOTD(c: JSONContent) {
- const char = "\\u00a7";
- const paragraphs = c.content!;
-
- let data = "";
-
- for (const [i, p] of paragraphs.entries()) {
- const content = p.content ?? [];
-
- for (const c of content) {
- if (!c.text) {
- continue;
- }
-
- let lowestDE = 999;
- let lowestDEVal = "";
- let formatting = "";
-
- const color = c.marks?.at(0)?.attrs?.color;
- for (const c of colorMap) {
- if (!color) {
- continue;
- }
-
- const dE = deltaE(color, c.value);
- if (dE === 0) {
- lowestDEVal = `${char}${c.code}`;
- break;
- }
- if (dE < lowestDE) {
- lowestDE = dE;
- lowestDEVal = `${char}${c.code}`;
- }
- }
-
- for (const code of formattingCodes) {
- if (trueMarkOrUndefined(c, code.key)) {
- formatting += `${char}${code.value}`;
- }
- }
-
- data += `${char}r${lowestDEVal}${formatting}${unescapeUnicode(c.text)}`;
- }
- if (i < paragraphs.length - 1) data += "\\n";
- }
- return data;
+ const char = "\\u00a7";
+ const paragraphs = c.content!;
+
+ let data = "";
+
+ for (const [i, p] of paragraphs.entries()) {
+ const content = p.content ?? [];
+
+ for (const c of content) {
+ if (!c.text) {
+ continue;
+ }
+
+ let lowestDE = 999;
+ let lowestDEVal = "";
+ let formatting = "";
+
+ const colorMark = c.marks?.at(0)?.attrs?.color;
+ for (const color of colourMap) {
+ if (!colorMark) {
+ continue;
+ }
+
+ const dE = deltaE(colorMark, color.value);
+ if (dE === 0) {
+ lowestDEVal = `${char}${color.code}`;
+ break;
+ }
+ if (dE < lowestDE) {
+ lowestDE = dE;
+ lowestDEVal = `${char}${color.code}`;
+ }
+ }
+
+ for (const code of formattingCodes) {
+ if (trueMarkOrUndefined(c, code.key)) {
+ formatting += `${char}${code.value}`;
+ }
+ }
+
+ data += `${char}r${lowestDEVal}${formatting}${unescapeUnicode(c.text)}`;
+ }
+ if (i < paragraphs.length - 1) data += "\\n";
+ }
+ return data;
}
diff --git a/src/lib/text/nbt/export.ts b/src/lib/text/nbt/export.ts
index ed31c9f..3c9eec2 100644
--- a/src/lib/text/nbt/export.ts
+++ b/src/lib/text/nbt/export.ts
@@ -1,15 +1,11 @@
-import type {
- MinecraftText,
- OldMinecraftText,
- StringyMCText,
- TranslateOptions,
-} from "$lib/types";
+import type { MinecraftText, OldMinecraftText, StringyMCText, TranslateOptions } from "$lib/types";
import { type JSONContent } from "@tiptap/core";
import {
- defaultColorLUT,
- isMarkType,
- trueMarkOrUndefined,
- unescapeUnicode,
+ defaultColorLUT,
+ findMarkType,
+ rgbaToArgbHex,
+ trueMarkOrUndefined,
+ unescapeUnicode,
} from "../utils";
import { outputVersion } from "$lib/stores";
import { get } from "svelte/store";
@@ -27,86 +23,86 @@ let exportVersion = get(outputVersion);
* @returns the current component with new properties
*/
export function addTypeSpecificValues(
- current: MinecraftText,
- c: JSONContent,
- includeInteractivity = true,
+ current: MinecraftText,
+ c: JSONContent,
+ includeInteractivity = true,
) {
- exportVersion = get(outputVersion);
-
- switch (c.type) {
- case "text":
- current.text = unescapeUnicode(c.text!);
- break;
- case "score":
- current.score = {
- name: c.attrs?.name,
- objective: c.attrs?.objective,
- };
- break;
- case "translate":
- current.translate = c.attrs?.key;
- if (c.attrs?.params && c.attrs?.params.length != 0) {
- current.with = c.attrs?.params;
- }
- if (c.attrs?.fallback) {
- current.fallback = c.attrs?.fallback;
- }
- break;
- case "storage_nbt":
- case "block_nbt":
- case "entity_nbt":
- current.nbt = c.attrs?.nbt;
- current.storage = c.attrs?.storage;
- current.block = c.attrs?.block;
- current.entity = c.attrs?.entity;
- current.interpret = c.attrs?.interpret || undefined;
- break;
- case "keybind":
- current.keybind = c.attrs?.key;
- break;
- case "atlas_object":
- if (exportVersion.index >= 2) {
- if (c.attrs?.atlas && c.attrs?.atlas !== "") {
- current.atlas = c.attrs?.atlas;
- }
- current.sprite = c.attrs?.sprite;
-
- current.bold = undefined;
- current.italic = undefined;
- current.obfuscated = undefined;
- } else {
- current.text = "";
- }
- break;
- case "player_object":
- if (exportVersion.index >= 2) {
- current.object = "player";
- current.player = {
- name: c.attrs?.player.name,
- };
- current.hat = c.attrs?.hat;
-
- current.bold = undefined;
- current.italic = undefined;
- current.obfuscated = undefined;
- } else {
- current.text = "";
- }
- break;
- case "selector":
- current.selector = c.attrs?.selector;
- break;
- }
-
- if (includeInteractivity) {
- if (exportVersion.index >= 1) {
- newApplyInteractiveValues(current, c);
- } else {
- oldApplyInteractiveValues(current, c);
- }
- }
-
- return current;
+ exportVersion = get(outputVersion);
+
+ switch (c.type) {
+ case "text":
+ current.text = unescapeUnicode(c.text!);
+ break;
+ case "score":
+ current.score = {
+ name: c.attrs?.name,
+ objective: c.attrs?.objective,
+ };
+ break;
+ case "translate":
+ current.translate = c.attrs?.key;
+ if (c.attrs?.params && c.attrs?.params.length !== 0) {
+ current.with = c.attrs?.params;
+ }
+ if (c.attrs?.fallback) {
+ current.fallback = c.attrs?.fallback;
+ }
+ break;
+ case "storage_nbt":
+ case "block_nbt":
+ case "entity_nbt":
+ current.nbt = c.attrs?.nbt;
+ current.storage = c.attrs?.storage;
+ current.block = c.attrs?.block;
+ current.entity = c.attrs?.entity;
+ current.interpret = c.attrs?.interpret || undefined;
+ break;
+ case "keybind":
+ current.keybind = c.attrs?.key;
+ break;
+ case "atlas_object":
+ if (exportVersion.index >= 2) {
+ if (c.attrs?.atlas && c.attrs?.atlas !== "") {
+ current.atlas = c.attrs?.atlas;
+ }
+ current.sprite = c.attrs?.sprite;
+
+ current.bold = undefined;
+ current.italic = undefined;
+ current.obfuscated = undefined;
+ } else {
+ current.text = "";
+ }
+ break;
+ case "player_object":
+ if (exportVersion.index >= 2) {
+ current.object = "player";
+ current.player = {
+ name: c.attrs?.player.name,
+ };
+ current.hat = c.attrs?.hat;
+
+ current.bold = undefined;
+ current.italic = undefined;
+ current.obfuscated = undefined;
+ } else {
+ current.text = "";
+ }
+ break;
+ case "selector":
+ current.selector = c.attrs?.selector;
+ break;
+ }
+
+ if (includeInteractivity) {
+ if (exportVersion.index >= 1) {
+ newApplyInteractiveValues(current, c);
+ } else {
+ oldApplyInteractiveValues(current, c);
+ }
+ }
+
+ return current;
}
/**
@@ -114,36 +110,35 @@ export function addTypeSpecificValues(
*
* @param current your current minecraft text
* @param c the content
- * @param includeInteractivity if it should have interactive events or not
*/
function newApplyInteractiveValues(current: MinecraftText, c: JSONContent) {
- if (isMarkType(c, "clickEvent")) {
- const ce = isMarkType(c, "clickEvent")?.attrs;
- current.click_event = { action: ce!.action };
- switch (ce!.action) {
- case "open_url":
- current.click_event.url = ce!.value;
- break;
- case "run_command":
- case "suggest_command":
- current.click_event.command = ce!.value;
- break;
- case "copy_to_clipboard":
- current.click_event.value = ce!.value;
- break;
- case "change_page":
- current.click_event.page = ce!.value;
- break;
- case "open_dialog":
- current.click_event.dialog = ce!.value;
- break;
- }
- }
-
- if (isMarkType(c, "hoverEvent")) {
- const ce = isMarkType(c, "hoverEvent")?.attrs;
- current.hover_event = { action: ce!.action, value: ce!.value };
- }
+ if (findMarkType(c, "clickEvent")) {
+ const ce = findMarkType(c, "clickEvent")?.attrs;
+ current.click_event = { action: ce!.action };
+ switch (ce!.action) {
+ case "open_url":
+ current.click_event.url = ce!.value;
+ break;
+ case "run_command":
+ case "suggest_command":
+ current.click_event.command = ce!.value;
+ break;
+ case "copy_to_clipboard":
+ current.click_event.value = ce!.value;
+ break;
+ case "change_page":
+ current.click_event.page = ce!.value;
+ break;
+ case "open_dialog":
+ current.click_event.dialog = ce!.value;
+ break;
+ }
+ }
+
+ if (findMarkType(c, "hoverEvent")) {
+ const ce = findMarkType(c, "hoverEvent")?.attrs;
+ current.hover_event = { action: ce!.action, value: ce!.value };
+ }
}
/**
@@ -151,154 +146,136 @@ function newApplyInteractiveValues(current: MinecraftText, c: JSONContent) {
*
* @param current your current (old) minecraft text
* @param c the content
- * @param includeInteractivity if it should have interactive events or not
*/
function oldApplyInteractiveValues(current: OldMinecraftText, c: JSONContent) {
- if (isMarkType(c, "clickEvent")) {
- const ce = isMarkType(c, "clickEvent")?.attrs;
- current.clickEvent = { action: ce!.action, value: ce!.value };
- }
-
- if (isMarkType(c, "hoverEvent")) {
- const ce = isMarkType(c, "hoverEvent")?.attrs;
- current.hoverEvent = { action: ce!.action, contents: ce!.value };
- }
+ if (findMarkType(c, "clickEvent")) {
+ const ce = findMarkType(c, "clickEvent")?.attrs;
+ current.clickEvent = { action: ce!.action, value: ce!.value };
+ }
+
+ if (findMarkType(c, "hoverEvent")) {
+ const ce = findMarkType(c, "hoverEvent")?.attrs;
+ current.hoverEvent = { action: ce!.action, contents: ce!.value };
+ }
}
/**
* Converts the JSON content of the editor to an NBT string.
*/
export function convert(
- jsonContent: JSONContent,
- exportType: "standard" | "item_lore" = "standard",
- optimise: boolean,
- force_json: boolean = false,
+ jsonContent: JSONContent,
+ optimise: boolean,
+ exportType: "standard" | "item_lore" = "standard",
+ forceJson: boolean = false,
): string {
- exportVersion = get(outputVersion);
- let out = translateJSON(jsonContent, { exportType, optimise });
- if (exportVersion.index >= 1 && !force_json) {
- // only remove strings
- out = out.replace(/(?<=[{,]\s*)"[^"]*"\s*:/g, (match) =>
- match.replace(/"/g, ""),
- );
- }
- return out;
+ exportVersion = get(outputVersion);
+ let out = translateJSON(jsonContent, { exportType, optimise });
+ if (exportVersion.index >= 1 && !forceJson) {
+ // only remove string keys
+ out = out.replaceAll(/(?<=[{,]\s*)"[^"]*"\s*:/gu, (match) => match.replaceAll(`"`, ""));
+ }
+ return out;
}
/**
* Converts the JSON content of the editor to a Minecraft JSON string.
*/
-export function translateJSON(
- json: JSONContent,
- options: TranslateOptions,
-): string {
- const paragraphs = json.content ?? [];
-
- if (options.exportType === "standard") {
- let data: StringyMCText[] = [];
-
- for (const [i, p] of paragraphs.entries()) {
- const content = p.content ?? [];
- for (const c of content) {
- let current: MinecraftText = {
- color: defaultColorLUT(c.marks?.at(0)?.attrs?.color),
- bold: trueMarkOrUndefined(c, "bold"),
- italic: trueMarkOrUndefined(c, "italic"),
- strikethrough: trueMarkOrUndefined(c, "strike"),
- underlined: trueMarkOrUndefined(c, "underline"),
- obfuscated: trueMarkOrUndefined(c, "obfuscated"),
- font: c.marks?.at(0)?.attrs?.font || undefined,
- };
-
- const shadowColorMark = c.marks?.find((m) => m.type === "shadowColor");
- if (shadowColorMark) {
- current.shadow_color = parseInt(
- rgbaToArgbHex(shadowColorMark.attrs?.shadowColor).replace(/^#/, ""),
- 16,
- );
- }
-
- current = addTypeSpecificValues(current, c, true);
- data.push(current);
- }
- if (i < paragraphs.length - 1) data.push("\n");
- }
-
- if (data.length === 0) {
- return Math.random() < 0.002
- ? "🤓 <- kevin is waiting for you to type something"
- : "waiting for input...";
- }
-
- if (options.optimise) {
- data = optimise(data);
- } else {
- data.unshift("");
- }
-
- if (data.length === 1) {
- return JSON.stringify(data[0]);
- }
-
- let finalResult = JSON.stringify(data);
-
- const shadowColorMatches = finalResult.matchAll(/"shadow_color":(-?\d+)/g);
- for (const match of shadowColorMatches) {
- if (match[1]) {
- const num = parseInt(match[1]);
- if (num > 2 ** 31 - 1 || num < (-2) ** 31) {
- finalResult = finalResult.replaceAll(
- match[0],
- `shadow_color:${num}L`,
- );
- }
- }
- }
-
- return finalResult;
- } else if (options.exportType === "item_lore") {
- let data: (StringyMCText[] | StringyMCText)[] = [];
-
- for (const p of paragraphs) {
- const content = p.content ?? [];
- let currentLine: StringyMCText[] = [];
-
- for (const [_, c] of content.entries()) {
- let currentComponent: MinecraftText = {
- color: defaultColorLUT(c.marks?.at(0)?.attrs?.color),
- bold: trueMarkOrUndefined(c, "bold"),
- italic: trueMarkOrUndefined(c, "italic"),
- strikethrough: trueMarkOrUndefined(c, "strike"),
- underlined: trueMarkOrUndefined(c, "underline"),
- obfuscated: trueMarkOrUndefined(c, "obfuscated"),
- font: c.marks?.at(0)?.attrs?.font || undefined,
- };
-
- currentComponent = addTypeSpecificValues(currentComponent, c, false);
- currentLine.push(currentComponent);
- }
-
- data.push(currentLine);
- }
-
- if (Array.isArray(data) && options.optimise) {
- data = data.map((d) => (Array.isArray(d) ? optimise(d, true) : d));
- }
-
- return JSON.stringify(data);
- }
-
- return "[]";
-}
-
-function rgbaToArgbHex(rgbaHex: string): string {
- // Remove the leading '#' if it exists
- const hex = rgbaHex.startsWith("#") ? rgbaHex.slice(1) : rgbaHex;
-
- // Extract RGB and Alpha components
- const rgb = hex.slice(0, 6);
- const alpha = hex.slice(6, 8);
-
- // Return with alpha placed at the beginning
- return `#${alpha}${rgb}`;
+export function translateJSON(json: JSONContent, options: TranslateOptions): string {
+ const paragraphs = json.content ?? [];
+
+ if (options.exportType === "standard") {
+ let data: StringyMCText[] = [];
+
+ for (const [i, p] of paragraphs.entries()) {
+ const content = p.content ?? [];
+ for (const c of content) {
+ let current: MinecraftText = {
+ color: defaultColorLUT(c.marks?.at(0)?.attrs?.color),
+ bold: trueMarkOrUndefined(c, "bold"),
+ italic: trueMarkOrUndefined(c, "italic"),
+ strikethrough: trueMarkOrUndefined(c, "strike"),
+ underlined: trueMarkOrUndefined(c, "underline"),
+ obfuscated: trueMarkOrUndefined(c, "obfuscated"),
+ font: c.marks?.at(0)?.attrs?.font || undefined,
+ };
+
+ const shadowColorMark = c.marks?.find((m) => m.type === "shadowColor");
+ if (shadowColorMark) {
+ let colorVal: string = shadowColorMark.attrs?.shadowColor.replace(/^#/u, "");
+ if (colorVal && colorVal.length <= 8) {
+ current.shadow_color = parseInt(
+ rgbaToArgbHex(colorVal.padEnd(8, "FF")).replace(/^#/u, ""),
+ 16,
+ );
+ }
+ }
+
+ current = addTypeSpecificValues(current, c, true);
+ data.push(current);
+ }
+ if (i < paragraphs.length - 1) data.push("\n");
+ }
+
+ if (data.length === 0) {
+ return Math.random() < 0.002
+ ? "🤓 <- kevin is waiting for you to type something"
+ : "waiting for input...";
+ }
+
+ if (options.optimise) {
+ data = optimise(data);
+ } else {
+ data.unshift("");
+ }
+
+ if (data.length === 1) {
+ return JSON.stringify(data[0]);
+ }
+
+ let finalResult = JSON.stringify(data);
+
+ const shadowColorMatches = finalResult.matchAll(/"shadow_color":(-?\d+)/gu);
+ for (const match of shadowColorMatches) {
+ if (match[1]) {
+ const num = parseInt(match[1]);
+ if (num > 2 ** 31 - 1 || num < (-2) ** 31) {
+ finalResult = finalResult.replaceAll(match[0], `"shadow_color":${num}L`);
+ }
+ }
+ }
+
+ return finalResult;
+ } else if (options.exportType === "item_lore") {
+ let data: (StringyMCText[] | StringyMCText)[] = [];
+
+ for (const p of paragraphs) {
+ const content = p.content ?? [];
+ let currentLine: StringyMCText[] = [];
+
+ for (const [_, c] of content.entries()) {
+ let currentComponent: MinecraftText = {
+ color: defaultColorLUT(c.marks?.at(0)?.attrs?.color),
+ bold: trueMarkOrUndefined(c, "bold"),
+ italic: trueMarkOrUndefined(c, "italic"),
+ strikethrough: trueMarkOrUndefined(c, "strike"),
+ underlined: trueMarkOrUndefined(c, "underline"),
+ obfuscated: trueMarkOrUndefined(c, "obfuscated"),
+ font: c.marks?.at(0)?.attrs?.font || undefined,
+ };
+
+ currentComponent = addTypeSpecificValues(currentComponent, c, false);
+ currentLine.push(currentComponent);
+ }
+
+ data.push(currentLine);
+ }
+
+ if (Array.isArray(data) && options.optimise) {
+ data = data.map((d) => (Array.isArray(d) ? optimise(d, true) : d));
+ }
+
+ return JSON.stringify(data);
+ }
+
+ return "[]";
}
diff --git a/src/lib/text/nbt/import.ts b/src/lib/text/nbt/import.ts
index ace6647..c959d4e 100644
--- a/src/lib/text/nbt/import.ts
+++ b/src/lib/text/nbt/import.ts
@@ -1,408 +1,423 @@
import type { JSONContent } from "@tiptap/core";
-import { defaultColorReverseLUT } from "../utils";
+import {
+ argbToRgbaHex,
+ defaultColorReverseLUT,
+ mapToHexByte,
+ rgbaToArgbHex,
+ stripTypeSuffixes,
+} from "../utils";
import { type MinecraftText, type OldMinecraftText } from "../../types";
import { type StringyMCText } from "../../types";
export function snbtToDocument(raw: StringyMCText[]): JSONContent {
- let baseDocument: JSONContent = {
- type: "doc",
- content: [
- {
- type: "paragraph",
- content: [],
- },
- ],
- };
-
- if (Array.isArray(raw)) {
- for (const text of raw) {
- processTextComponent(text, baseDocument);
- }
- } else {
- processTextComponent(raw, baseDocument);
- }
-
- baseDocument = fixBrokenNewLines(baseDocument);
-
- return baseDocument;
+ let baseDocument: JSONContent = {
+ type: "doc",
+ content: [
+ {
+ type: "paragraph",
+ content: [],
+ },
+ ],
+ };
+
+ if (Array.isArray(raw)) {
+ for (const text of raw) {
+ processTextComponent(text, baseDocument);
+ }
+ } else {
+ processTextComponent(raw, baseDocument);
+ }
+
+ baseDocument = fixBrokenNewLines(baseDocument);
+
+ return baseDocument;
}
export function convertToTextOrEmpty(raw: string): StringyMCText[] {
- if (raw === "") return [];
-
- raw = raw
- .replace(/([,{]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:/g, '$1"$2":') // quote unquoted keys
- .replace(/:\s*([a-zA-Z_][a-zA-Z0-9_.:-]*)(?=\s*[,}\]])/g, (_, p1) => {
- // quote unquoted strings, ignoring booleans
- const protectedValues = ["true", "false", "1b", "0b"];
- if (protectedValues.includes(p1.toLowerCase())) {
- return `: ${p1.toLowerCase()}`;
- }
- return `: "${p1}"`;
- });
- if (raw.match(/^"\w*"/)) {
- return [raw.replace(/"/g, "")];
- }
-
- // replace 1b and 0b
- raw = raw.replace(/(?<="\w+"\s*:\s*)\b1b\b/g, "true");
- raw = raw.replace(/(?<="\w+"\s*:\s*)\b0b\b/g, "false");
-
- let parsed: MinecraftText[] | MinecraftText | string;
-
- try {
- parsed = JSON.parse(raw);
- } catch (err) {
- return [
- "",
- { color: "red", text: "An error occurred while parsing the SNBT." },
- { color: "yellow", text: " Please send the " },
- { color: "gold", text: "following error message" },
- { color: "yellow", text: " to Datapack Hub staff:\n" },
- { color: "white", bold: true, text: "Error: " },
- { color: "gray", text: err!.toString() },
- ];
- }
-
- if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
- return [parsed as MinecraftText];
- }
-
- return parsed as StringyMCText[];
+ if (raw === "") return [];
+
+ raw = raw
+ // quote unquoted keys
+ .replaceAll(/([,{]\s*)([a-zA-Z_$][a-zA-Z0-9_$]*)\s*:/gu, '$1"$2":')
+ .replaceAll(/:\s*([a-zA-Z_][a-zA-Z0-9_.:-]*)(?=\s*[,}\]])/gu, (_, p1) => {
+ // quote unquoted strings, ignoring booleans
+ const protectedValues = ["true", "false", "1b", "0b"];
+ if (protectedValues.includes(p1.toLowerCase())) {
+ return `: ${p1.toLowerCase()}`;
+ }
+ return `: "${p1}"`;
+ });
+ if (/^"\w*"/u.test(raw)) {
+ return [raw.replaceAll(`"`, "")];
+ }
+
+ // replace 1b and 0b with true and false literals
+ raw = raw.replaceAll(/(?<="\w+"\s*:\s*)\b1b\b/gu, "true");
+ raw = raw.replaceAll(/(?<="\w+"\s*:\s*)\b0b\b/gu, "false");
+
+ // remove type suffixes from numbers (e.g., 1.0f, 2.0d, 3l)
+ raw = stripTypeSuffixes(raw);
+
+ let parsed: MinecraftText[] | MinecraftText | string;
+
+ try {
+ parsed = JSON.parse(raw);
+ } catch (err) {
+ return [
+ "",
+ { color: "red", text: "An error occurred while parsing the SNBT." },
+ { color: "yellow", text: " Please send the " },
+ { color: "gold", text: "following error message" },
+ { color: "yellow", text: " to Datapack Hub staff:\n" },
+ { color: "white", bold: true, text: "Error: " },
+ { color: "gray", text: err!.toString() },
+ ];
+ }
+
+ if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) {
+ return [parsed as MinecraftText];
+ }
+
+ return parsed as StringyMCText[];
}
function processTextComponent(text: StringyMCText, baseDocument: JSONContent) {
- if (typeof text === "string") {
- if (text === "") {
- return;
- }
-
- const temp = baseDocument.content!.at(-1)!.content!;
- baseDocument.content!.at(-1)!.content = [
- ...temp,
- {
- type: "text",
- text: text,
- },
- ];
- return;
- }
-
- let finalText = mapPropertiesToType(text);
- finalText = applyStyling(text, finalText);
-
- let paragraphContent = baseDocument.content?.at(-1)?.content;
- paragraphContent!.push(finalText);
-
- // Extra property
- if (text.extra) {
- text.extra!.forEach((txt) => {
- const newText = typeof txt === "object" ? { ...txt } : { text: txt };
-
- Object.assign(newText, {
- bold: text.bold ?? newText.bold,
- italic: text.italic ?? newText.italic,
- underlined: text.underlined ?? newText.underlined,
- obfuscated: text.obfuscated ?? newText.obfuscated,
- strikethrough: text.strikethrough ?? newText.strikethrough,
- color: text.color ?? newText.color,
- shadow_color: text.shadow_color ?? newText.shadow_color,
- click_event: text.click_event ?? newText.click_event,
- clickEvent: text.clickEvent ?? newText.clickEvent,
- hover_event: text.hover_event ?? newText.hover_event,
- hoverEvent: text.hoverEvent ?? newText.hoverEvent,
- font: text.font ?? newText.font,
- });
-
- processTextComponent(newText, baseDocument);
- });
- }
+ if (typeof text === "string") {
+ if (text === "") {
+ return;
+ }
+
+ const temp = baseDocument.content!.at(-1)!.content!;
+ baseDocument.content!.at(-1)!.content = [
+ ...temp,
+ {
+ type: "text",
+ text: text,
+ },
+ ];
+ return;
+ }
+
+ let finalText = mapPropertiesToType(text);
+ finalText = applyStyling(text, finalText);
+
+ let paragraphContent = baseDocument.content?.at(-1)?.content;
+ paragraphContent!.push(finalText);
+
+ // Extra property
+ if (text.extra) {
+ text.extra!.forEach((txt) => {
+ const newText = typeof txt === "object" ? { ...txt } : { text: txt };
+
+ Object.assign(newText, {
+ bold: text.bold ?? newText.bold,
+ italic: text.italic ?? newText.italic,
+ underlined: text.underlined ?? newText.underlined,
+ obfuscated: text.obfuscated ?? newText.obfuscated,
+ strikethrough: text.strikethrough ?? newText.strikethrough,
+ color: text.color ?? newText.color,
+ shadow_color: text.shadow_color ?? newText.shadow_color,
+ click_event: text.click_event ?? newText.click_event,
+ clickEvent: text.clickEvent ?? newText.clickEvent,
+ hover_event: text.hover_event ?? newText.hover_event,
+ hoverEvent: text.hoverEvent ?? newText.hoverEvent,
+ font: text.font ?? newText.font,
+ });
+
+ processTextComponent(newText, baseDocument);
+ });
+ }
}
function mapPropertiesToType(source: MinecraftText): JSONContent {
- let finalText: JSONContent;
-
- if (source.selector) {
- finalText = {
- type: "selector",
- attrs: {
- selector: source.selector,
- },
- };
- } else if (source.score) {
- finalText = {
- type: "score",
- attrs: {
- name: source.score.name,
- objective: source.score.objective,
- },
- };
- } else if (source.nbt) {
- if (source.block) {
- finalText = {
- type: "block_nbt",
- attrs: {
- nbt: source.nbt,
- block: source.block,
- interpret: source.interpret ?? false,
- },
- };
- } else if (source.entity) {
- finalText = {
- type: "entity_nbt",
- attrs: {
- nbt: source.nbt,
- entity: source.entity,
- interpret: source.interpret ?? false,
- },
- };
- } else {
- finalText = {
- type: "storage_nbt",
- attrs: {
- nbt: source.nbt,
- storage: source.storage,
- interpret: source.interpret ?? false,
- },
- };
- }
- } else if (source.translate) {
- finalText = {
- type: "translate",
- attrs: {
- key: source.translate,
- params: source.with || [],
- fallback: source.fallback,
- },
- };
- } else if (source.keybind) {
- finalText = {
- type: "keybind",
- attrs: {
- key: source.keybind,
- },
- };
- } else if (source.sprite || source.atlas) {
- finalText = {
- type: "atlas_object",
- attrs: {
- atlas: source.atlas,
- sprite: source.sprite,
- },
- };
- } else if (source.player) {
- finalText = {
- type: "player_object",
- attrs: {
- hat: source.hat || true,
- player: {
- name: source.player.name,
- },
- },
- };
- } else {
- finalText = {
- type: "text",
- text: source.text || "",
- };
- }
-
- return finalText;
+ let finalText: JSONContent;
+
+ if (source.selector) {
+ finalText = {
+ type: "selector",
+ attrs: {
+ selector: source.selector,
+ },
+ };
+ } else if (source.score) {
+ finalText = {
+ type: "score",
+ attrs: {
+ name: source.score.name,
+ objective: source.score.objective,
+ },
+ };
+ } else if (source.nbt) {
+ if (source.block) {
+ finalText = {
+ type: "block_nbt",
+ attrs: {
+ nbt: source.nbt,
+ block: source.block,
+ interpret: source.interpret ?? false,
+ },
+ };
+ } else if (source.entity) {
+ finalText = {
+ type: "entity_nbt",
+ attrs: {
+ nbt: source.nbt,
+ entity: source.entity,
+ interpret: source.interpret ?? false,
+ },
+ };
+ } else {
+ finalText = {
+ type: "storage_nbt",
+ attrs: {
+ nbt: source.nbt,
+ storage: source.storage,
+ interpret: source.interpret ?? false,
+ },
+ };
+ }
+ } else if (source.translate) {
+ finalText = {
+ type: "translate",
+ attrs: {
+ key: source.translate,
+ params: source.with || [],
+ fallback: source.fallback,
+ },
+ };
+ } else if (source.keybind) {
+ finalText = {
+ type: "keybind",
+ attrs: {
+ key: source.keybind,
+ },
+ };
+ } else if (source.sprite || source.atlas) {
+ finalText = {
+ type: "atlas_object",
+ attrs: {
+ atlas: source.atlas,
+ sprite: source.sprite,
+ },
+ };
+ } else if (source.player) {
+ finalText = {
+ type: "player_object",
+ attrs: {
+ hat: source.hat || true,
+ player: {
+ name: source.player.name,
+ },
+ },
+ };
+ } else {
+ finalText = {
+ type: "text",
+ text: source.text || "",
+ };
+ }
+
+ return finalText;
}
-function applyStyling(
- text: MinecraftText & OldMinecraftText,
- finalText: JSONContent,
-) {
- if (!finalText.marks) {
- finalText.marks = [];
- }
-
- if (text.color) {
- finalText.marks.push({
- type: "textStyle",
- attrs: {
- color: defaultColorReverseLUT(text.color),
- },
- });
- }
-
- if (text.font) {
- const textStyle = finalText.marks.find((mark) => mark.type === "textStyle");
- if (textStyle) {
- textStyle.attrs!.font = text.font;
- } else {
- finalText.marks?.push({
- type: "textStyle",
- attrs: {
- font: text.font,
- },
- });
- }
- }
-
- if (text.shadow_color) {
- const hex = "#" + text.shadow_color.toString(16).padStart(8, "0");
- finalText.marks?.push({
- type: "shadowColor",
- attrs: {
- shadowColor: hex,
- },
- });
- }
-
- if (text.bold) {
- finalText.marks?.push({
- type: "bold",
- });
- }
-
- if (text.italic) {
- finalText.marks?.push({
- type: "italic",
- });
- }
-
- if (text.underlined) {
- finalText.marks?.push({
- type: "underline",
- });
- }
-
- if (text.obfuscated) {
- finalText.marks?.push({
- type: "obfuscated",
- });
- }
-
- if (text.strikethrough) {
- finalText.marks?.push({
- type: "strike",
- });
- }
-
- if (text.click_event) {
- const cE = text.click_event;
-
- // Check if only one of the properties is set, throw an error if more than one is set
- if (
- (cE.url && (cE.command || cE.value || cE.page || cE.dialog)) ||
- (cE.command && (cE.url || cE.value || cE.page || cE.dialog)) ||
- (cE.value && (cE.url || cE.command || cE.page || cE.dialog)) ||
- (cE.page && (cE.url || cE.command || cE.value || cE.dialog)) ||
- (cE.dialog && (cE.url || cE.command || cE.value || cE.page))
- ) {
- throw new Error(
- "Click event can only have one of url, command, value, page, or dialog set.",
- );
- }
-
- const actionSource =
- cE.url || cE.command || cE.value || cE.page || cE.dialog;
-
- finalText.marks?.push({
- type: "clickEvent",
- attrs: {
- action: cE.action,
- value: actionSource,
- },
- });
- }
-
- if (text.clickEvent) {
- const cE = text.clickEvent;
-
- const actionSource = cE.value;
-
- finalText.marks?.push({
- type: "clickEvent",
- attrs: {
- action: cE.action,
- value: actionSource,
- },
- });
- }
-
- if (text.hover_event) {
- finalText.marks?.push({
- type: "hoverEvent",
- attrs: {
- action: text.hover_event.action,
- value: text.hover_event.value,
- },
- });
- }
-
- if (text.hoverEvent) {
- finalText.marks?.push({
- type: "hoverEvent",
- attrs: {
- action: text.hoverEvent.action,
- value: text.hoverEvent.contents,
- },
- });
- }
-
- return finalText;
+function applyStyling(text: MinecraftText & OldMinecraftText, finalText: JSONContent) {
+ if (!finalText.marks) {
+ finalText.marks = [];
+ }
+
+ if (text.color) {
+ finalText.marks.push({
+ type: "textStyle",
+ attrs: {
+ color: defaultColorReverseLUT(text.color),
+ },
+ });
+ }
+
+ if (text.font) {
+ const textStyle = finalText.marks.find((mark) => mark.type === "textStyle");
+ if (textStyle) {
+ textStyle.attrs!.font = text.font;
+ } else {
+ finalText.marks?.push({
+ type: "textStyle",
+ attrs: {
+ font: text.font,
+ },
+ });
+ }
+ }
+
+ if (text.shadow_color) {
+ const combinedShadowStr = (
+ Array.isArray(text.shadow_color)
+ ? rgbaToArgbHex(text.shadow_color.map(mapToHexByte).join(""))
+ : text.shadow_color.toString(16)
+ ).replaceAll(/[lL#]/gu, "");
+ const intValue = parseInt(combinedShadowStr, 16);
+
+ if (intValue > 0 && intValue < 0xffffffff) {
+ const hex = argbToRgbaHex(combinedShadowStr.padEnd(8, "FF"));
+ finalText.marks.push({
+ type: "shadowColor",
+ attrs: {
+ shadowColor: hex,
+ },
+ });
+ }
+ }
+
+ if (text.bold) {
+ finalText.marks.push({
+ type: "bold",
+ });
+ }
+
+ if (text.italic) {
+ finalText.marks.push({
+ type: "italic",
+ });
+ }
+
+ if (text.underlined) {
+ finalText.marks.push({
+ type: "underline",
+ });
+ }
+
+ if (text.obfuscated) {
+ finalText.marks.push({
+ type: "obfuscated",
+ });
+ }
+
+ if (text.strikethrough) {
+ finalText.marks.push({
+ type: "strike",
+ });
+ }
+
+ if (text.click_event) {
+ const e = text.click_event;
+
+ // Check if only one of the properties is set, throw an error if more than one is set
+ if (
+ (e.url && (e.command || e.value || e.page || e.dialog)) ||
+ (e.command && (e.url || e.value || e.page || e.dialog)) ||
+ (e.value && (e.url || e.command || e.page || e.dialog)) ||
+ (e.page && (e.url || e.command || e.value || e.dialog)) ||
+ (e.dialog && (e.url || e.command || e.value || e.page))
+ ) {
+ throw new Error(
+ "Click event can only have one of url, command, value, page, or dialog set.",
+ );
+ }
+
+ const actionSource = e.url || e.command || e.value || e.page || e.dialog;
+
+ finalText.marks?.push({
+ type: "clickEvent",
+ attrs: {
+ action: e.action,
+ value: actionSource,
+ },
+ });
+ }
+
+ if (text.clickEvent) {
+ const cE = text.clickEvent;
+
+ const actionSource = cE.value;
+
+ finalText.marks?.push({
+ type: "clickEvent",
+ attrs: {
+ action: cE.action,
+ value: actionSource,
+ },
+ });
+ }
+
+ if (text.hover_event) {
+ finalText.marks?.push({
+ type: "hoverEvent",
+ attrs: {
+ action: text.hover_event.action,
+ value: text.hover_event.value,
+ },
+ });
+ }
+
+ if (text.hoverEvent) {
+ finalText.marks?.push({
+ type: "hoverEvent",
+ attrs: {
+ action: text.hoverEvent.action,
+ value: text.hoverEvent.contents,
+ },
+ });
+ }
+
+ return finalText;
}
function fixBrokenNewLines(doc: JSONContent) {
- const fixedContent = [];
-
- for (const node of doc.content!) {
- if (node.type !== "paragraph" || !node.content) {
- // Non-paragraph nodes are copied as-is
- fixedContent.push(node);
- continue;
- }
-
- let currentParagraph = [];
-
- for (const child of node.content) {
- if (child.type === "text" && child.text === "") {
- // Remove empty text nodes
- continue;
- }
-
- if (child.type !== "text" || !child.text!.includes("\n")) {
- // No newline — add to current paragraph
- currentParagraph.push(child);
- continue;
- }
-
- // Text node contains newlines — split it
- const lines = child.text!.split("\n");
- for (let i = 0; i < lines.length; i++) {
- if (i > 0) {
- // Push previous paragraph and start a new one
- fixedContent.push({
- type: "paragraph",
- content: currentParagraph,
- });
- currentParagraph = [];
- }
- // Only add non-empty text nodes
- if (lines[i]) {
- currentParagraph.push({
- type: "text",
- text: lines[i],
- ...(child.marks ? { marks: child.marks } : {}),
- });
- }
- }
- }
-
- // Add the last paragraph
- if (currentParagraph.length > 0) {
- fixedContent.push({
- type: "paragraph",
- content: currentParagraph,
- });
- }
- }
-
- return {
- type: "doc",
- content: fixedContent,
- };
+ const fixedContent = [];
+
+ for (const node of doc.content!) {
+ if (node.type !== "paragraph" || !node.content) {
+ // Non-paragraph nodes are copied as-is
+ fixedContent.push(node);
+ continue;
+ }
+
+ let currentParagraph = [];
+
+ for (const child of node.content) {
+ if (child.type === "text" && child.text === "") {
+ // Remove empty text nodes
+ continue;
+ }
+
+ if (child.type !== "text" || !child.text!.includes("\n")) {
+ // No newline — add to current paragraph
+ currentParagraph.push(child);
+ continue;
+ }
+
+ // Text node contains newlines — split it
+ const lines = child.text!.split("\n");
+ for (let i = 0; i < lines.length; i++) {
+ if (i > 0) {
+ // Push previous paragraph and start a new one
+ fixedContent.push({
+ type: "paragraph",
+ content: currentParagraph,
+ });
+ currentParagraph = [];
+ }
+ // Only add non-empty text nodes
+ if (lines[i]) {
+ currentParagraph.push({
+ type: "text",
+ text: lines[i],
+ ...(child.marks ? { marks: child.marks } : {}),
+ });
+ }
+ }
+ }
+
+ // Add the last paragraph
+ if (currentParagraph.length > 0) {
+ fixedContent.push({
+ type: "paragraph",
+ content: currentParagraph,
+ });
+ }
+ }
+
+ return {
+ type: "doc",
+ content: fixedContent,
+ };
}
diff --git a/src/lib/text/nbt/optimiser.ts b/src/lib/text/nbt/optimiser.ts
index 417e4d4..3845b81 100644
--- a/src/lib/text/nbt/optimiser.ts
+++ b/src/lib/text/nbt/optimiser.ts
@@ -1,62 +1,51 @@
-import type { MCTextKey, MinecraftText, StringyMCText } from "$lib/types";
-import { isAnInteractiveProp, isDefinedTextObject } from "../utils";
+import type { MinecraftText, StringyMCText } from "$lib/types";
+import { isAnInteractiveProp, isDefinedTextObject as isATextComponent } from "../utils";
const styleProps = [
- "color",
- "font",
- "bold",
- "italic",
- "underlined",
- "strikethrough",
- "obfuscated",
- "shadow_color",
- "click_event",
- "hover_event",
- "clickEvent",
- "hoverEvent",
+ "color",
+ "font",
+ "bold",
+ "italic",
+ "underlined",
+ "strikethrough",
+ "obfuscated",
+ "shadow_color",
+ "click_event",
+ "hover_event",
+ "clickEvent",
+ "hoverEvent",
] as const;
+// Dear whoever reads this, I hope you like reading recursive and highly nested functions, because this is what you are in for.
+// Good luck. Have fun. Don't get hurt.
+
/**
* Optimises the final outputted component string to reduce characters
*
* @param stringyTextElements An array of strings or text components
* @returns the string or text components optimised
*/
-export function optimise(
- stringyTextElements: StringyMCText[],
- lore = false,
-): StringyMCText[] {
- let output: StringyMCText[] = [];
-
- if (!lore) {
- // add leading empty string for non-lore due to how Minecraft handles text components
- output.push("");
- }
-
- // Early return for single string
- if (
- stringyTextElements.length === 1 &&
- typeof stringyTextElements[0] === "string"
- ) {
- return stringyTextElements;
- }
-
- output.push(...flattenMCText(stringyTextElements));
- output = mergeTextComponents(output);
-
- // remove leading empty string if followed by a string
- if (output.length >= 2 && output[0] === "" && typeof output[1] === "string")
- output.shift();
-
- if (shouldHaveLeadingEmptyString(output)) {
- output.shift();
- }
-
- // if it is item lore then override
- if (lore) {
- output.unshift({ italic: false, color: "white", text: "" });
- }
- return output;
+export function optimise(stringyTextElements: StringyMCText[], lore = false): StringyMCText[] {
+ let output: StringyMCText[] = [];
+
+ if (!lore) {
+ // add leading empty string for non-lore due to how Minecraft handles text components
+ output.push("");
+ }
+
+ // Early return for single string
+ if (stringyTextElements.length === 1 && typeof stringyTextElements[0] === "string") {
+ return stringyTextElements;
+ }
+
+ output.push(...flattenMCText(stringyTextElements));
+ output = mergeTextComponents(output);
+
+ // if it is item lore then override
+ if (lore) {
+ output.unshift({ italic: false, color: "white", text: "" });
+ }
+ return output;
}
/**
@@ -67,55 +56,54 @@ export function optimise(
* @returns a record of shared style properties
*/
function getSharedStyleProps(
- a: MinecraftText,
- b: MinecraftText,
-): Record {
- const allSharedProps: Record = {} as Record<
- keyof MinecraftText,
- any
- >;
- for (const prop of styleProps) {
- const p = prop as MCTextKey;
- if (
- a[p] !== undefined &&
- b[p] !== undefined &&
- propsMatch(a[p], b[p], prop)
- ) {
- allSharedProps[p] = a[p];
- }
- }
- return allSharedProps;
+ a: MinecraftText,
+ b: MinecraftText,
+): [Record, (keyof MinecraftText)[]] {
+ const sharedStyleProps = {} as Record;
+ for (const prop of styleProps) {
+ const key = prop as keyof MinecraftText;
+ if (a[key] !== undefined && b[key] !== undefined && propertiesMatch(a[key], b[key], prop)) {
+ sharedStyleProps[key] = a[key];
+ }
+ }
+ return [sharedStyleProps, Object.keys(sharedStyleProps) as (keyof MinecraftText)[]];
}
/**
* Collects all MinecraftText components from the current index that share the same style properties
*
* @param i the current index into the array
- * @param group the current group of MinecraftText components being collected
+ * @param current the current MinecraftText component being considered
* @param output the current output array
- * @param allSharedProps a record of all shared properties between the group
+ * @param sharedStyleProps a record of all shared properties between the group
*/
-function collectAllFromIndex(
- i: number,
- group: MinecraftText[],
- output: StringyMCText[],
- allSharedProps: Record,
-) {
- let j = i;
- let sharedKeys = Object.keys(allSharedProps) as (keyof MinecraftText)[];
- while (output[j + 1] && typeof output[j + 1] === "object") {
- const next = output[j + 1] as MinecraftText;
- let allPropertiesMatch = sharedKeys.every(
- (prop) =>
- next[prop] !== undefined &&
- propsMatch(next[prop], allSharedProps[prop], prop),
- );
-
- if (!allPropertiesMatch) break;
-
- group.push(next);
- j++;
- }
+function collectStyledRun(
+ i: number,
+ current: MinecraftText,
+ output: StringyMCText[],
+ sharedStyleProps: Record,
+): MinecraftText[] {
+ let j = i;
+ let sharedStyleKeys = Object.keys(sharedStyleProps) as (keyof MinecraftText)[];
+ let finalList = [current];
+
+ while (output[j + 1] && typeof output[j + 1] === "object") {
+ const next = output[j + 1] as MinecraftText;
+
+ // Check if all shared properties match for the next component
+ let allPropertiesMatch = sharedStyleKeys.every(
+ (prop) =>
+ next[prop] !== undefined &&
+ propertiesMatch(next[prop], sharedStyleProps[prop], prop),
+ );
+
+ if (!allPropertiesMatch) break;
+
+ finalList.push(next);
+ j++;
+ }
+
+ return finalList;
}
/**
@@ -126,28 +114,8 @@ function collectAllFromIndex(
* @param property the property to check for
* @returns true if the properties match, false otherwise
*/
-function propsMatch(a: any, b: any, property: string) {
- return isAnInteractiveProp(property)
- ? JSON.stringify(a) === JSON.stringify(b)
- : a === b;
-}
-
-/**
- * Determines if the final output should have the leading empty string removed
- *
- * @param output the optimized output array
- * @returns true if the final output should have the leading empty string removed
- */
-function shouldHaveLeadingEmptyString(output: StringyMCText[]): boolean {
- return (
- output.length >= 2 &&
- output[0] == "" &&
- (typeof output[1] === "string" ||
- (typeof output[1] === "object" &&
- !styleProps.some(
- (prop) => output[1][prop as keyof StringyMCText] !== undefined,
- )))
- );
+function propertiesMatch(a: any, b: any, property: string) {
+ return isAnInteractiveProp(property) ? JSON.stringify(a) === JSON.stringify(b) : a === b;
}
/**
@@ -157,29 +125,30 @@ function shouldHaveLeadingEmptyString(output: StringyMCText[]): boolean {
* @returns the elements with strings becoming string literals and cleaned object properties
*/
function flattenMCText(stringyTextElements: StringyMCText[]): StringyMCText[] {
- const output: StringyMCText[] = [];
- for (const component of stringyTextElements) {
- if (typeof component === "string") {
- // string, just add
- output.push(component);
- continue;
- }
-
- if ("text" in component) {
- // MinecraftText with text property
- for (const [key, value] of Object.entries(component)) {
- if (value === undefined) {
- delete component[key as MCTextKey]; // remove undefined properties
- }
- }
- }
-
- // if only text property remains, convert to string
- output.push(
- Object.keys(component).length === 1 ? component.text! : component,
- );
- }
- return output;
+ const output: StringyMCText[] = [];
+ for (const component of stringyTextElements) {
+ // its a string, just add it
+ if (typeof component === "string") {
+ output.push(component);
+ continue;
+ }
+
+ // MinecraftText with text property
+ if ("text" in component) {
+ // remove any undefined properties
+ for (const [key, value] of Object.entries(component)) {
+ if (value === undefined) {
+ delete component[key as keyof MinecraftText];
+ }
+ }
+ }
+
+ output.push(
+ // if only text property remains, convert to string
+ Object.keys(component).length === 1 && component.text ? component.text : component,
+ );
+ }
+ return output;
}
/**
@@ -189,89 +158,94 @@ function flattenMCText(stringyTextElements: StringyMCText[]): StringyMCText[] {
* @returns the optimized output step with merged strings, whitespace and group properties with shared styling
*/
function mergeTextComponents(output: StringyMCText[]) {
- for (let i = 0; i < output.length - 1; i++) {
- const current = output[i],
- next = output[i + 1];
-
- // Merge whitespace to next component
- if (
- isDefinedTextObject(current) &&
- typeof next === "string" &&
- next.match(/^\s*$/)
- ) {
- current.text += next;
- output.splice(i + 1, 1);
- i--;
- continue;
- }
-
- // Merge whitespace objects to next component
- if (isDefinedTextObject(current) && isDefinedTextObject(next)) {
- // which direction to merge
- if (next.text.match(/^\s+$/)) {
- current.text += next.text;
- output.splice(i + 1, 1);
- i--;
- continue;
- } else if (current.text.match(/^\s+$/)) {
- next.text = current.text + next.text;
- output.splice(i, 1);
- i--;
- continue;
- }
- }
-
- // Merge consecutive strings
- if (typeof current === "string" && typeof next === "string") {
- output[i] = current + next;
- output.splice(i + 1, 1);
- i--;
- continue;
- }
-
- // Find shared style/interactivity properties between consecutive objects
- if (typeof current === "object" && typeof next === "object") {
- const sharedProperties = getSharedStyleProps(current, next);
-
- if (Object.keys(sharedProperties).length > 0) {
- let group = [current];
- collectAllFromIndex(i, group, output, sharedProperties);
-
- if (group.length < 1) {
- continue;
- }
-
- // Remove shared properties from each group member for "extra"
- let extras: StringyMCText[] = group.map((comp) => {
- const copy = { ...comp };
- for (const prop of Object.keys(sharedProperties)) {
- delete copy[prop as MCTextKey];
- }
- return copy;
- });
+ // X->Y: who merges into who, where X and Y are either S (string) or C (component)
+ for (let i = 0; i < output.length - 1; i++) {
+ const current = output[i],
+ next = output[i + 1];
+
+ // S->C: Merge whitespace strings to previous component
+ if (isATextComponent(current) && isWhitespaceOnly(next)) {
+ current.text += next;
+ output.splice(i + 1, 1);
+ i--;
+ continue;
+ }
+
+ // C->C: Merge text components who's text is only whitespace -> previous component
+ if (isATextComponent(current) && isATextComponent(next)) {
+ // which direction to merge
+ // TODO: figure out why we need both checks, doing either or seems to work fine?
+ if (isWhitespaceOnly(next.text)) {
+ // merge to current
+ current.text += next.text;
+ output.splice(i + 1, 1);
+ i--;
+ continue;
+ } else if (isWhitespaceOnly(current.text)) {
+ // merge to next
+ next.text = current.text + next.text;
+ output.splice(i, 1);
+ i--;
+ continue;
+ }
+ }
+
+ // S->S: Merge consecutive strings
+ if (typeof current === "string" && typeof next === "string") {
+ output[i] = current + next;
+ output.splice(i + 1, 1);
+ i--;
+ continue;
+ }
+
+ // C->C: Find shared style/interactivity properties between consecutive objects
+ if (typeof current === "object" && typeof next === "object") {
+ const [sharedProperties, sharedPropertyKeys] = getSharedStyleProps(current, next);
+
+ if (sharedPropertyKeys.length > 0) {
+ let group = collectStyledRun(i, current, output, sharedProperties);
+
+ // TODO: what the hell does this do? is it just for performance?
+ if (group.length === 1) {
+ continue;
+ }
+
+ // Remove shared properties from each group member to save for later ("extra" property)
+ let extras: StringyMCText[] = group.map((comp) => {
+ const copy = { ...comp };
+ for (const prop of sharedPropertyKeys) {
+ delete copy[prop as keyof MinecraftText];
+ }
+ return copy;
+ });
+
+ // Optimise "extra" properties
+ extras = optimise(extras);
+ const first = extras.shift();
+ let merged = { ...sharedProperties };
+
+ // Rebuild merged component
+ if (typeof first === "string") {
+ merged.text = first;
+ } else {
+ Object.assign(merged, { ...first });
+ }
+
+ if (extras.length > 0) {
+ if (merged.extra) {
+ merged.extra = merged.extra.concat(extras);
+ } else {
+ merged.extra = extras;
+ }
+ }
+
+ output.splice(i, group.length, merged);
+ }
+ }
+ }
+ return output;
+}
- // Optimise extra
- extras = optimise(extras);
- const first = extras.shift();
- let merged = { ...sharedProperties };
- // Rebuild merged component
- if (typeof first == "string") {
- merged.text = first;
- if (extras.length > 0) {
- if (!merged.extra) merged.extra = extras;
- else merged.extra = merged.extra.concat(extras);
- }
- } else {
- Object.assign(merged, { ...first });
- if (extras.length > 0) {
- if (!merged.extra) merged.extra = extras;
- else merged.extra = merged.extra.concat(extras);
- }
- }
- output.splice(i, group.length, merged);
- // i--; // TODO: actually fix the bug caused by checking again
- }
- }
- }
- return output;
+function isWhitespaceOnly(str: StringyMCText): boolean {
+ return typeof str === "string" && /^\s*$/u.test(str);
}
diff --git a/src/lib/text/utils.ts b/src/lib/text/utils.ts
index 1092bcd..3aa4f08 100644
--- a/src/lib/text/utils.ts
+++ b/src/lib/text/utils.ts
@@ -1,36 +1,35 @@
import type { MinecraftText } from "$lib/types";
import type { Editor, JSONContent } from "@tiptap/core";
-import { generateGradient } from "typescript-color-gradient";
-
-export const colorMap = [
- { name: "dark_red", value: "#AA0000", code: "4" },
- { name: "red", value: "#FF5555", code: "c" },
- { name: "gold", value: "#FFAA00", code: "6" },
- { name: "yellow", value: "#FFFF55", code: "e" },
- { name: "green", value: "#55FF55", code: "2" },
- { name: "dark_green", value: "#00AA00", code: "a" },
- { name: "aqua", value: "#55FFFF", code: "b" },
- { name: "dark_aqua", value: "#00AAAA", code: "3" },
- { name: "blue", value: "#5555FF", code: "1" },
- { name: "dark_blue", value: "#0000AA", code: "9" },
- { name: "dark_purple", value: "#AA00AA", code: "d" },
- { name: "light_purple", value: "#FF55FF", code: "5" },
- { name: "white", value: "#FFFFFF", code: "f" },
- { name: "gray", value: "#AAAAAA", code: "7" },
- { name: "dark_gray", value: "#555555", code: "8" },
- { name: "black", value: "#000000", code: "0" },
+
+export const colourMap = [
+ { name: "dark_red", value: "#AA0000", code: "4" },
+ { name: "red", value: "#FF5555", code: "c" },
+ { name: "gold", value: "#FFAA00", code: "6" },
+ { name: "yellow", value: "#FFFF55", code: "e" },
+ { name: "green", value: "#55FF55", code: "2" },
+ { name: "dark_green", value: "#00AA00", code: "a" },
+ { name: "aqua", value: "#55FFFF", code: "b" },
+ { name: "dark_aqua", value: "#00AAAA", code: "3" },
+ { name: "blue", value: "#5555FF", code: "1" },
+ { name: "dark_blue", value: "#0000AA", code: "9" },
+ { name: "dark_purple", value: "#AA00AA", code: "d" },
+ { name: "light_purple", value: "#FF55FF", code: "5" },
+ { name: "white", value: "#FFFFFF", code: "f" },
+ { name: "gray", value: "#AAAAAA", code: "7" },
+ { name: "dark_gray", value: "#555555", code: "8" },
+ { name: "black", value: "#000000", code: "0" },
];
export const sourceKeys = [
- "atlas_object",
- "player_object",
- "selector",
- "block_nbt",
- "entity_nbt",
- "storage_nbt",
- "keybind",
- "score",
- "translate",
+ "atlas_object",
+ "player_object",
+ "selector",
+ "block_nbt",
+ "entity_nbt",
+ "storage_nbt",
+ "keybind",
+ "score",
+ "translate",
] as const;
/**
@@ -40,12 +39,9 @@ export const sourceKeys = [
* @param mark the mark to check
* @returns the mark if true, undefined otherwise
*/
-export function trueMarkOrUndefined(
- content: JSONContent,
- mark: string,
-): true | undefined {
- const value = content.marks?.some((e) => e.type === mark) || false;
- return value ? value : undefined;
+export function trueMarkOrUndefined(content: JSONContent, mark: string): true | undefined {
+ const value = content.marks?.some((e) => e.type === mark) || false;
+ return value ? value : undefined;
}
/**
* A LUT to find the name of a color
@@ -54,10 +50,10 @@ export function trueMarkOrUndefined(
* @returns the color name
*/
export function defaultColorLUT(color: string): string | undefined {
- if (!color || color === "null") {
- return;
- }
- return colorMap.find((e) => e.value.toUpperCase() === color)?.name || color;
+ if (!color || color === "null") {
+ return;
+ }
+ return colourMap.find((e) => e.value.toUpperCase() === color)?.name || color;
}
/**
@@ -67,103 +63,44 @@ export function defaultColorLUT(color: string): string | undefined {
* @returns the hex code for the color
*/
export function defaultColorReverseLUT(color: string): string | undefined {
- if (!color || color === "null") {
- return;
- }
- return colorMap.find((e) => e.name.toLowerCase() === color)?.value || color;
-} /**
- * Checks the type of the mark against `type`
+ if (!color || color === "null") {
+ return;
+ }
+ return colourMap.find((e) => e.name.toLowerCase() === color)?.value || color;
+}
+
+/**
+ * Finds a mark of a specific type in a JSONContent node.
*
* @param c the node you want to examine
* @param type type to check
- * @returns true if it matches
+ * @returns the mark if found, otherwise undefined
*/
-
-export function isMarkType(c: JSONContent, type: string) {
- return c.marks?.find((e) => e.type === type);
+export function findMarkType(c: JSONContent, type: string) {
+ return c.marks?.find((e) => e.type === type);
}
export function unescapeUnicode(str: string) {
- const regex = /\\u(?:([0-9a-fA-F]{4})|\{([0-9a-fA-F]+)\})/g;
-
- return str.replace(regex, (match, p1, p2) => {
- // p1 will contain the 4-digit hex if it's \uXXXX
- // p2 will contain the variable hex if it's \u{XXXXX}
- const hex = p1 || p2; // Get the hex value from whichever group matched
-
- if (hex) {
- const codePoint = parseInt(hex, 16);
- return String.fromCodePoint(codePoint);
- }
- // If for some reason no hex was captured (shouldn't happen with this regex),
- // return the original match to avoid breaking the string.
- return match;
- });
-}
+ const regex = /\\u(?:([0-9a-fA-F]{4})|\{([0-9a-fA-F]+)\})/gu;
-/**
- * Applies a gradient to a selection in an editor
- *
- * @param editor the editor you want to apply it to
- * @param gradientColors the colors you want to use
- * @returns
- */
-export function applyGradient(editor: Editor, gradientColors: string[]) {
- const { from, to } = editor.state.selection;
- if (from === to) return;
-
- const doc = editor.state.doc;
- let text = "";
- let textPositions: { pos: number; len: number }[] = [];
-
- // Collect all text and their positions in the selection
- doc.nodesBetween(from, to, (node, pos) => {
- if (node.isText) {
- const nodeStart = Math.max(from, pos);
- const nodeEnd = Math.min(to, pos + node.text!.length);
- const sliceStart = nodeStart - pos;
- const sliceEnd = nodeEnd - pos;
- const part = node.text?.slice(sliceStart, sliceEnd) ?? "";
- if (part.length > 0) {
- text += part;
- textPositions.push({ pos: nodeStart, len: part.length });
- }
- }
- });
- if (!text.length) return;
-
- const total = text.length;
- if (total === 0 || gradientColors.length < 2) return;
-
- const gradientArray = generateGradient(gradientColors, total);
-
- let chain = editor.chain();
-
- // Remove color from selection first
- chain.focus().setTextSelection({ from, to }).unsetColor();
-
- let charIndex = 0;
- for (const { pos, len } of textPositions) {
- for (let i = 0; i < len; i++) {
- const color = gradientArray[charIndex];
- chain
- .setTextSelection({ from: pos + i, to: pos + i + 1 })
- .setColor(color);
- charIndex++;
- }
- }
- chain.focus().setTextSelection({ from, to });
-
- chain.run();
+ // p1 will contain the 4-digit hex if it's \uXXXX
+ // p2 will contain the variable hex if it's \u{XXXXX}
+ return str.replace(regex, (_, p1: string, p2: string) => {
+ // Get the hex value from whichever group matched
+ const hex = p1 || p2;
+
+ const codePoint = parseInt(hex, 16);
+ return String.fromCodePoint(codePoint);
+ });
}
export function isAnInteractiveProp(prop: string) {
- return (
- prop === "click_event" ||
- prop === "hover_event" ||
- prop === "clickEvent" ||
- prop === "hoverEvent"
- );
+ return (
+ prop === "click_event" ||
+ prop === "hover_event" ||
+ prop === "clickEvent" ||
+ prop === "hoverEvent"
+ );
}
/**
@@ -173,11 +110,55 @@ export function isAnInteractiveProp(prop: string) {
* @returns true if it is a defined MinecraftText object
*/
export function isDefinedTextObject(
- obj: any,
+ obj: any,
+ // return type is that so that it can require the text property, instead of being optional
): obj is Omit & { text: string } {
- return typeof obj === "object" && obj.text !== undefined;
+ return typeof obj === "object" && obj.text !== undefined;
}
export function getNodeAtSelection(editor: Editor) {
- return editor.state.selection.$head.nodeBefore;
+ return editor.state.selection.$head.nodeBefore;
+}
+
+export function mapToHexByte(value: number): string {
+ if (value < 0.0 || value > 1.0) {
+ // Return "00" for out-of-range values
+ return "00";
+ }
+
+ const byteValue = Math.round(value * 255);
+ const hexString = byteValue.toString(16);
+
+ return hexString.length === 1 ? "0" + hexString : hexString;
+}
+
+export function stripTypeSuffixes(input: string): string {
+ const regex = /\b(\d+(?:\.\d+)?)[fdlsib]\b/gi;
+
+ return input.replaceAll(regex, "$1");
+}
+
+export function argbToRgbaHex(rgbaHex: string): string {
+ // Remove the leading '#' if it exists
+ const hex = rgbaHex.startsWith("#") ? rgbaHex.slice(1) : rgbaHex;
+
+ // Extract RGB and Alpha components
+ const alpha = hex.slice(0, 2);
+ const rgb = hex.slice(2, 8);
+
+ // Return with alpha placed at the beginning
+
+ return `#${rgb}${alpha}`;
+}
+
+export function rgbaToArgbHex(rgbaHex: string): string {
+ // Remove the leading '#' if it exists
+ const hex = rgbaHex.startsWith("#") ? rgbaHex.slice(1) : rgbaHex;
+
+ // Extract RGB and Alpha components
+ const rgb = hex.slice(0, 6);
+ const alpha = hex.slice(6, 8);
+
+ // Return with alpha placed at the beginning
+ return `#${alpha}${rgb}`;
}
diff --git a/src/lib/tiptap/extensions/FixedTextStyle.ts b/src/lib/tiptap/extensions/FixedTextStyle.ts
index 4f78ee8..da0f179 100644
--- a/src/lib/tiptap/extensions/FixedTextStyle.ts
+++ b/src/lib/tiptap/extensions/FixedTextStyle.ts
@@ -1,27 +1,27 @@
import { TextStyle } from "@tiptap/extension-text-style";
export const FixedTextStyle = TextStyle.extend({
- parseHTML() {
- return [
- {
- style: "color",
- getAttrs: (value) => {
- const hex = rgbToHex(value as string);
- return { color: hex };
- },
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ style: "color",
+ getAttrs: (value) => {
+ const hex = rgbToHex(value as string);
+ return { color: hex };
+ },
+ },
+ ];
+ },
});
// Helper function to convert rgb() to hex
function rgbToHex(rgb: string): string {
- const result = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/.exec(rgb);
- return result
- ? "#" +
- [1, 2, 3]
- .map((n) => parseInt(result[n]).toString(16).padStart(2, "0"))
- .join("")
- .toUpperCase()
- : rgb;
+ const result = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/u.exec(rgb);
+ return result
+ ? "#" +
+ [1, 2, 3]
+ .map((n) => parseInt(result[n]).toString(16).padStart(2, "0"))
+ .join("")
+ .toUpperCase()
+ : rgb;
}
diff --git a/src/lib/tiptap/extensions/fonts.ts b/src/lib/tiptap/extensions/fonts.ts
index 9ad7269..d415cf3 100644
--- a/src/lib/tiptap/extensions/fonts.ts
+++ b/src/lib/tiptap/extensions/fonts.ts
@@ -4,70 +4,69 @@ import { SvelteMap } from "svelte/reactivity";
export let fontLUT: SvelteMap = new SvelteMap();
export const FontsExtension = Extension.create({
- name: "font",
+ name: "font",
- addOptions() {
- return {
- types: ["textStyle"],
- };
- },
+ addOptions() {
+ return {
+ types: ["textStyle"],
+ };
+ },
- addGlobalAttributes() {
- return [
- {
- types: this.options.types,
- attributes: {
- font: {
- default: null,
- parseHTML: (element) =>
- element.style.fontFamily?.replace(/['"]+/g, ""),
- renderHTML: (attributes) => {
- if (!attributes.font) {
- return {};
- }
+ addGlobalAttributes() {
+ return [
+ {
+ types: this.options.types,
+ attributes: {
+ font: {
+ default: null,
+ parseHTML: (element) => element.style.fontFamily?.replaceAll(/['"]+/gu, ""),
+ renderHTML: (attributes) => {
+ if (!attributes.font) {
+ return {};
+ }
- let font = "monospace";
+ let font = "monospace";
- switch (attributes.font.toLowerCase()) {
- case "minecraft:alt":
- font = "MinecraftEnchanting";
- break;
- case "minecraft:illageralt":
- font = "MinecraftIllager";
- break;
- }
+ switch (attributes.font.toLowerCase()) {
+ case "minecraft:alt":
+ font = "MinecraftEnchanting";
+ break;
+ case "minecraft:illageralt":
+ font = "MinecraftIllager";
+ break;
+ }
- for (const [identifier, alias] of fontLUT) {
- if (attributes.font.toLowerCase() === identifier) {
- font = alias;
- }
- }
+ for (const [identifier, alias] of fontLUT) {
+ if (attributes.font.toLowerCase() === identifier) {
+ font = alias;
+ }
+ }
- return {
- style: `font-family: "${font}", monospace;`,
- };
- },
- },
- },
- },
- ];
- },
+ return {
+ style: `font-family: "${font}", monospace;`,
+ };
+ },
+ },
+ },
+ },
+ ];
+ },
- addCommands() {
- return {
- setFont:
- (font) =>
- ({ chain }) => {
- return chain().setMark("textStyle", { font: font }).run();
- },
- unsetFont:
- () =>
- ({ chain }) => {
- return chain()
- .setMark("textStyle", { font: undefined })
- .removeEmptyTextStyle()
- .run();
- },
- };
- },
+ addCommands() {
+ return {
+ setFont:
+ (font) =>
+ ({ chain }) => {
+ return chain().setMark("textStyle", { font: font }).run();
+ },
+ unsetFont:
+ () =>
+ ({ chain }) => {
+ return chain()
+ .setMark("textStyle", { font: undefined })
+ .removeEmptyTextStyle()
+ .run();
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/index.ts b/src/lib/tiptap/extensions/index.ts
index bca5b6d..1497ef2 100644
--- a/src/lib/tiptap/extensions/index.ts
+++ b/src/lib/tiptap/extensions/index.ts
@@ -1,145 +1,145 @@
import {
- ClickEventMark,
- FixedTextStyle,
- FontsExtension,
- HoverEventMark,
- Obfuscation,
- ShadowColorMark,
+ ClickEventMark,
+ FixedTextStyle,
+ FontsExtension,
+ HoverEventMark,
+ Obfuscation,
+ ShadowColorMark,
} from "$lib/tiptap/extensions/index";
import { getSchema } from "@tiptap/core";
import Color from "@tiptap/extension-color";
import StarterKit from "@tiptap/starter-kit";
export interface ClickEventAttributes {
- action: string | null;
- value: string | null;
+ action: string | null;
+ value: string | null;
}
export interface HoverEventAttributes {
- action: string | null;
- value: string | null;
+ action: string | null;
+ value: string | null;
}
export interface ScoreAttributes {
- name: string;
- objective: string;
+ name: string;
+ objective: string;
}
export interface TranslateAttributes {
- key: string;
- params: string[];
- fallback?: string;
+ key: string;
+ params: string[];
+ fallback?: string;
}
export interface StorageNBTAttributes {
- nbt: string;
- storage: string;
- interpret: boolean;
+ nbt: string;
+ storage: string;
+ interpret: boolean;
}
export interface BlockNBTAttributes {
- nbt: string;
- block: string;
- interpret: boolean;
+ nbt: string;
+ block: string;
+ interpret: boolean;
}
export interface EntityNBTAttributes {
- nbt: string;
- entity: string;
- interpret: boolean;
+ nbt: string;
+ entity: string;
+ interpret: boolean;
}
export interface KeybindAttributes {
- key: string;
+ key: string;
}
export interface SelectorAttributes {
- selector: string;
+ selector: string;
}
export interface AtlasObjectAttributes {
- atlas?: string;
- sprite: string;
+ atlas?: string;
+ sprite: string;
}
export interface PlayerObjectAttributes {
- player: {
- name: string;
- };
- hat?: boolean;
+ player: {
+ name: string;
+ };
+ hat?: boolean;
}
declare module "@tiptap/core" {
- interface Commands {
- font: {
- /**
- * Set the font family
- * @param font The font family
- * @example editor.commands.setFontFamily('Arial')
- */
- setFont: (fontFamily: string) => ReturnType;
- /**
- * Unset the font family
- * @example editor.commands.unsetFontFamily()
- */
- unsetFont: () => ReturnType;
- };
- marks: {
- setObfuscated: () => ReturnType;
- toggleObfuscated: () => ReturnType;
- unsetObfuscated: () => ReturnType;
- setClickEvent: (attributes: ClickEventAttributes) => ReturnType;
- unsetClickEvent: () => ReturnType;
- setHoverEvent: (attributes: HoverEventAttributes) => ReturnType;
- unsetHoverEvent: () => ReturnType;
- setShadowColor: (shadowColor: string) => ReturnType;
- unsetShadowColor: () => ReturnType;
- };
- scoreNode: {
- insertScore: (attrs: ScoreAttributes) => ReturnType;
- };
- translateNode: {
- insertTranslate: (attrs: TranslateAttributes) => ReturnType;
- };
- NBTNode: {
- insertBlockNBT: (attrs: BlockNBTAttributes) => ReturnType;
- insertStorageNBT: (attrs: StorageNBTAttributes) => ReturnType;
- insertEntityNBT: (attrs: EntityNBTAttributes) => ReturnType;
- };
- keybindNode: {
- insertKeybind: (attrs: KeybindAttributes) => ReturnType;
- };
- selectorNode: {
- insertSelector: (attrs: SelectorAttributes) => ReturnType;
- };
- object: {
- insertAtlasObject: (attrs: AtlasObjectAttributes) => ReturnType;
- insertPlayerObject: (attrs: PlayerObjectAttributes) => ReturnType;
- };
- }
+ interface Commands {
+ font: {
+ /**
+ * Set the font family
+ * @param font The font family
+ * @example editor.commands.setFontFamily('Arial')
+ */
+ setFont: (fontFamily: string) => ReturnType;
+ /**
+ * Unset the font family
+ * @example editor.commands.unsetFontFamily()
+ */
+ unsetFont: () => ReturnType;
+ };
+ marks: {
+ setObfuscated: () => ReturnType;
+ toggleObfuscated: () => ReturnType;
+ unsetObfuscated: () => ReturnType;
+ setClickEvent: (attributes: ClickEventAttributes) => ReturnType;
+ unsetClickEvent: () => ReturnType;
+ setHoverEvent: (attributes: HoverEventAttributes) => ReturnType;
+ unsetHoverEvent: () => ReturnType;
+ setShadowColor: (shadowColor: string) => ReturnType;
+ unsetShadowColor: () => ReturnType;
+ };
+ scoreNode: {
+ insertScore: (attrs: ScoreAttributes) => ReturnType;
+ };
+ translateNode: {
+ insertTranslate: (attrs: TranslateAttributes) => ReturnType;
+ };
+ NBTNode: {
+ insertBlockNBT: (attrs: BlockNBTAttributes) => ReturnType;
+ insertStorageNBT: (attrs: StorageNBTAttributes) => ReturnType;
+ insertEntityNBT: (attrs: EntityNBTAttributes) => ReturnType;
+ };
+ keybindNode: {
+ insertKeybind: (attrs: KeybindAttributes) => ReturnType;
+ };
+ selectorNode: {
+ insertSelector: (attrs: SelectorAttributes) => ReturnType;
+ };
+ object: {
+ insertAtlasObject: (attrs: AtlasObjectAttributes) => ReturnType;
+ insertPlayerObject: (attrs: PlayerObjectAttributes) => ReturnType;
+ };
+ }
}
export interface NodeOptions {
- HTMLAttributes: Record;
+ HTMLAttributes: Record;
}
export const markSchema = getSchema([
- StarterKit.configure({
- blockquote: false,
- bulletList: false,
- codeBlock: false,
- hardBreak: false,
- heading: false,
- horizontalRule: false,
- listItem: false,
- orderedList: false,
- link: false,
- }),
- Color,
- FixedTextStyle,
- Obfuscation,
- ClickEventMark,
- HoverEventMark,
- ShadowColorMark,
- FontsExtension,
+ StarterKit.configure({
+ blockquote: false,
+ bulletList: false,
+ codeBlock: false,
+ hardBreak: false,
+ heading: false,
+ horizontalRule: false,
+ listItem: false,
+ orderedList: false,
+ link: false,
+ }),
+ Color,
+ FixedTextStyle,
+ Obfuscation,
+ ClickEventMark,
+ HoverEventMark,
+ ShadowColorMark,
+ FontsExtension,
]);
export { FixedTextStyle } from "./FixedTextStyle";
diff --git a/src/lib/tiptap/extensions/marks/ClickEventMark.ts b/src/lib/tiptap/extensions/marks/ClickEventMark.ts
index 29aef19..55ef636 100644
--- a/src/lib/tiptap/extensions/marks/ClickEventMark.ts
+++ b/src/lib/tiptap/extensions/marks/ClickEventMark.ts
@@ -3,65 +3,65 @@ import { Mark, mergeAttributes } from "@tiptap/core";
import { type ClickEventAttributes } from "../index";
export const ClickEventMark = Mark.create({
- name: "clickEvent",
+ name: "clickEvent",
- addAttributes(): ClickEventAttributes {
- return {
- action: null,
- value: null,
- };
- },
+ addAttributes(): ClickEventAttributes {
+ return {
+ action: null,
+ value: null,
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-click-event-action]",
- getAttrs: (element) => {
- if (typeof element === "string") {
- return false;
- }
- const el = element as HTMLElement;
- const action = el.getAttribute("data-click-event-action");
- const value = el.getAttribute("data-click-event-value");
- if (!action) {
- return false;
- }
- return {
- action,
- value,
- };
- },
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-click-event-action]",
+ getAttrs: (element) => {
+ if (typeof element === "string") {
+ return false;
+ }
+ const el = element as HTMLElement;
+ const action = el.dataset.clickEventAction;
+ const value = el.dataset.clickEventValue;
+ if (!action) {
+ return false;
+ }
+ return {
+ action,
+ value,
+ };
+ },
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes }) {
- return [
- "span",
- mergeAttributes(
- {
- "data-click-event-action": HTMLAttributes.action,
- "data-click-event-value": HTMLAttributes.value,
- class: "clickEvent", // Optional styling
- },
- HTMLAttributes,
- ),
- 0,
- ];
- },
+ renderHTML({ HTMLAttributes }) {
+ return [
+ "span",
+ mergeAttributes(
+ {
+ "data-click-event-action": HTMLAttributes.action,
+ "data-click-event-value": HTMLAttributes.value,
+ class: "clickEvent",
+ },
+ HTMLAttributes,
+ ),
+ 0,
+ ];
+ },
- addCommands() {
- return {
- setClickEvent:
- (attributes: ClickEventAttributes) =>
- ({ chain }) => {
- return chain().setMark(this.name, attributes).run();
- },
- unsetClickEvent:
- () =>
- ({ chain }) => {
- return chain().unsetMark(this.name).run();
- },
- };
- },
+ addCommands() {
+ return {
+ setClickEvent:
+ (attributes: ClickEventAttributes) =>
+ ({ chain }) => {
+ return chain().setMark(this.name, attributes).run();
+ },
+ unsetClickEvent:
+ () =>
+ ({ chain }) => {
+ return chain().unsetMark(this.name).run();
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/marks/HoverEventMark.ts b/src/lib/tiptap/extensions/marks/HoverEventMark.ts
index 7c28eba..6f4c4d9 100644
--- a/src/lib/tiptap/extensions/marks/HoverEventMark.ts
+++ b/src/lib/tiptap/extensions/marks/HoverEventMark.ts
@@ -2,62 +2,62 @@ import { Mark, mergeAttributes } from "@tiptap/core";
import type { HoverEventAttributes } from "../index";
export const HoverEventMark = Mark.create({
- name: "hoverEvent",
+ name: "hoverEvent",
- addAttributes(): HoverEventAttributes {
- return {
- action: null,
- value: null,
- };
- },
+ addAttributes(): HoverEventAttributes {
+ return {
+ action: null,
+ value: null,
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-hover-event-action]",
- getAttrs: (element) => {
- if (typeof element === "string") {
- return false;
- }
- const el = element as HTMLElement;
- const action = el.getAttribute("data-hover-event-action");
- const value = JSON.parse(el.getAttribute("data-hover-event-value")!);
- if (!action) {
- return false;
- }
- return {
- action,
- value,
- };
- },
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-hover-event-action]",
+ getAttrs: (element) => {
+ if (typeof element === "string") {
+ return false;
+ }
+ const el = element as HTMLElement;
+ const action = el.dataset.hoverEventAction;
+ const value = JSON.parse(el.dataset.hoverEventValue!);
+ if (!action) {
+ return false;
+ }
+ return {
+ action,
+ value,
+ };
+ },
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes }) {
- return [
- "span",
- mergeAttributes({
- "data-hover-event-action": HTMLAttributes.action,
- "data-hover-event-value": JSON.stringify(HTMLAttributes.value),
- class: "hoverEvent",
- }),
- 0,
- ];
- },
+ renderHTML({ HTMLAttributes }) {
+ return [
+ "span",
+ mergeAttributes({
+ "data-hover-event-action": HTMLAttributes.action,
+ "data-hover-event-value": JSON.stringify(HTMLAttributes.value),
+ class: "hoverEvent",
+ }),
+ 0,
+ ];
+ },
- addCommands() {
- return {
- setHoverEvent:
- (attributes: HoverEventAttributes) =>
- ({ chain }) => {
- return chain().setMark(this.name, attributes).run();
- },
- unsetHoverEvent:
- () =>
- ({ chain }) => {
- return chain().unsetMark(this.name).run();
- },
- };
- },
+ addCommands() {
+ return {
+ setHoverEvent:
+ (attributes: HoverEventAttributes) =>
+ ({ chain }) => {
+ return chain().setMark(this.name, attributes).run();
+ },
+ unsetHoverEvent:
+ () =>
+ ({ chain }) => {
+ return chain().unsetMark(this.name).run();
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/marks/ObfuscationMark.ts b/src/lib/tiptap/extensions/marks/ObfuscationMark.ts
index 7d5017d..43f8d77 100644
--- a/src/lib/tiptap/extensions/marks/ObfuscationMark.ts
+++ b/src/lib/tiptap/extensions/marks/ObfuscationMark.ts
@@ -1,50 +1,50 @@
import { Mark, mergeAttributes } from "@tiptap/core";
export const Obfuscation = Mark.create({
- name: "obfuscated",
- renderHTML({ HTMLAttributes }) {
- return [
- "span",
- mergeAttributes(
- {
- class: "obfuscated",
- },
- HTMLAttributes,
- ),
- 0,
- ];
- },
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ name: "obfuscated",
+ renderHTML({ HTMLAttributes }) {
+ return [
+ "span",
+ mergeAttributes(
+ {
+ class: "obfuscated",
+ },
+ HTMLAttributes,
+ ),
+ 0,
+ ];
+ },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addKeyboardShortcuts() {
- return {
- "Mod-o": () => {
- return this.editor.commands.toggleObfuscated();
- },
- };
- },
+ addKeyboardShortcuts() {
+ return {
+ "Mod-o": () => {
+ return this.editor.commands.toggleObfuscated();
+ },
+ };
+ },
- addCommands() {
- return {
- setObfuscated:
- () =>
- ({ chain }: any) => {
- return chain().setMark(this.name).run();
- },
- toggleObfuscated:
- () =>
- ({ chain }: any) => {
- return chain().toggleMark(this.name).run();
- },
- unsetObfuscated:
- () =>
- ({ chain }: any) => {
- return chain().unsetMark(this.name).run();
- },
- };
- },
+ addCommands() {
+ return {
+ setObfuscated:
+ () =>
+ ({ chain }: any) => {
+ return chain().setMark(this.name).run();
+ },
+ toggleObfuscated:
+ () =>
+ ({ chain }: any) => {
+ return chain().toggleMark(this.name).run();
+ },
+ unsetObfuscated:
+ () =>
+ ({ chain }: any) => {
+ return chain().unsetMark(this.name).run();
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/marks/ShadowColorMark.ts b/src/lib/tiptap/extensions/marks/ShadowColorMark.ts
index acd9a83..2e15525 100644
--- a/src/lib/tiptap/extensions/marks/ShadowColorMark.ts
+++ b/src/lib/tiptap/extensions/marks/ShadowColorMark.ts
@@ -1,69 +1,68 @@
import { Mark, mergeAttributes } from "@tiptap/core";
export const ShadowColorMark = Mark.create({
- name: "shadowColor",
+ name: "shadowColor",
- addAttributes() {
- return {
- shadowColor: {
- default: null,
- parseHTML: (element) =>
- element.getAttribute("data-shadow-color") || null,
- renderHTML: (attributes) => {
- if (!attributes.shadowColor) {
- return {};
- }
- return { "data-shadow-color": attributes.shadowColor };
- },
- },
- };
- },
+ addAttributes() {
+ return {
+ shadowColor: {
+ default: null,
+ parseHTML: (element) => element.dataset.shadowColor || null,
+ renderHTML: (attributes) => {
+ if (!attributes.shadowColor) {
+ return {};
+ }
+ return { "data-shadow-color": attributes.shadowColor };
+ },
+ },
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-shadow-color]",
- getAttrs: (element) => {
- if (typeof element === "string") {
- return false;
- }
- const el = element as HTMLElement;
- const shadowColor = el.getAttribute("data-shadow-color");
- if (!shadowColor) {
- return false;
- }
- return { shadowColor };
- },
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-shadow-color]",
+ getAttrs: (element) => {
+ if (typeof element === "string") {
+ return false;
+ }
+ const el = element as HTMLElement;
+ const shadowColor = el.dataset.shadowColor;
+ if (!shadowColor) {
+ return false;
+ }
+ return { shadowColor };
+ },
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes }) {
- const shadowColor = HTMLAttributes["data-shadow-color"] || "black";
- return [
- "span",
- mergeAttributes(
- {
- style: `text-shadow: 2px 2px 0 ${shadowColor};`,
- },
- HTMLAttributes,
- ),
- 0,
- ];
- },
+ renderHTML({ HTMLAttributes }) {
+ const shadowColor = HTMLAttributes["data-shadow-color"] || "black";
+ return [
+ "span",
+ mergeAttributes(
+ {
+ style: `text-shadow: 2px 2px 0 ${shadowColor};`,
+ },
+ HTMLAttributes,
+ ),
+ 0,
+ ];
+ },
- addCommands() {
- return {
- setShadowColor:
- (shadowColor: string) =>
- ({ chain }) => {
- return chain().setMark(this.name, { shadowColor }).run();
- },
- unsetShadowColor:
- () =>
- ({ chain }) => {
- return chain().unsetMark(this.name).run();
- },
- };
- },
+ addCommands() {
+ return {
+ setShadowColor:
+ (shadowColor: string) =>
+ ({ chain }) => {
+ return chain().setMark(this.name, { shadowColor }).run();
+ },
+ unsetShadowColor:
+ () =>
+ ({ chain }) => {
+ return chain().unsetMark(this.name).run();
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/AtlasObjectNode.ts b/src/lib/tiptap/extensions/nodes/AtlasObjectNode.ts
index bae4e30..bc65d64 100644
--- a/src/lib/tiptap/extensions/nodes/AtlasObjectNode.ts
+++ b/src/lib/tiptap/extensions/nodes/AtlasObjectNode.ts
@@ -1,56 +1,52 @@
import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
-import {
- markSchema,
- type AtlasObjectAttributes,
- type NodeOptions,
-} from "../index";
+import { markSchema, type AtlasObjectAttributes, type NodeOptions } from "../index";
export const AtlasObjectNode = Node.create({
- name: "atlas_object",
+ name: "atlas_object",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- marks() {
- const blocklist = new Set(["bold", "italic", "obfuscated"]);
- const allMarks = Object.keys(markSchema.marks || {});
- return allMarks.filter((mark) => !blocklist.has(mark)).join(" ");
- },
+ marks() {
+ const blocklist = new Set(["bold", "italic", "obfuscated"]);
+ const allMarks = Object.keys(markSchema.marks || {});
+ return allMarks.filter((mark) => !blocklist.has(mark)).join(" ");
+ },
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): AtlasObjectAttributes {
- return {
- atlas: "",
- sprite: "",
- };
- },
+ addAttributes(): AtlasObjectAttributes {
+ return {
+ atlas: "",
+ sprite: "",
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-atlas-object-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-atlas-object-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- let { atlas, sprite } = node.attrs;
- if (!atlas) {
- atlas = "minecraft:blocks";
- }
+ renderHTML({ HTMLAttributes, node }) {
+ let { atlas, sprite } = node.attrs;
+ if (!atlas) {
+ atlas = "minecraft:blocks";
+ }
- return [
- "span",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-atlas-object-node": "",
- contenteditable: "false",
- style: `
+ return [
+ "span",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-atlas-object-node": "",
+ contenteditable: "false",
+ style: `
background-color: #18181b;
padding: 0px 5px;
border-radius: 4px;
@@ -62,21 +58,21 @@ export const AtlasObjectNode = Node.create({
font-family: Minecraft !important;
text-decoration: inherit;
`,
- }),
- ["span", {}, `OBJECT: [${sprite}@${atlas}]`],
- ];
- },
+ }),
+ ["span", {}, `OBJECT: [${sprite}@${atlas}]`],
+ ];
+ },
- addCommands() {
- return {
- insertAtlasObject:
- (attrs) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertAtlasObject:
+ (attrs) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts b/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts
index cb8254e..af05b20 100644
--- a/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts
+++ b/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts
@@ -2,66 +2,66 @@ import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
import type { NodeOptions, BlockNBTAttributes } from "../index";
export const BlockNBTNode = Node.create({
- name: "block_nbt",
+ name: "block_nbt",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): BlockNBTAttributes {
- return {
- nbt: "",
- block: "",
- interpret: false,
- };
- },
+ addAttributes(): BlockNBTAttributes {
+ return {
+ nbt: "",
+ block: "",
+ interpret: false,
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-nbt-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-nbt-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- const { nbt, block } = node.attrs;
+ renderHTML({ HTMLAttributes, node }) {
+ const { nbt, block } = node.attrs;
- return [
- "span",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-nbt-node": "true",
- contenteditable: "false",
- style: `
- background-color: #18181b;
- padding: 1px 5px;
- border-radius: 4px;
- font-size: 1rem;
- display: inline-block;
- vertical-align: var(--custom-source-align, middle);
- text-decoration: inherit;
- `,
- }),
- ["span", {}, `NBT: ${nbt}, ${block}`],
- ];
- },
+ return [
+ "span",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-nbt-node": "true",
+ contenteditable: "false",
+ style: `
+ background-color: #18181b;
+ padding: 1px 5px;
+ border-radius: 4px;
+ font-size: 1rem;
+ display: inline-block;
+ vertical-align: var(--custom-source-align, middle);
+ text-decoration: inherit;
+ `,
+ }),
+ ["span", {}, `NBT: ${nbt}, ${block}`],
+ ];
+ },
- addCommands() {
- return {
- insertBlockNBT:
- (attrs: BlockNBTAttributes) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertBlockNBT:
+ (attrs: BlockNBTAttributes) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/EntityNBTNode.ts b/src/lib/tiptap/extensions/nodes/EntityNBTNode.ts
index 3f7cee4..519984b 100644
--- a/src/lib/tiptap/extensions/nodes/EntityNBTNode.ts
+++ b/src/lib/tiptap/extensions/nodes/EntityNBTNode.ts
@@ -2,43 +2,43 @@ import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
import type { NodeOptions, EntityNBTAttributes } from "../index";
export const EntityNBTNode = Node.create({
- name: "entity_nbt",
+ name: "entity_nbt",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): EntityNBTAttributes {
- return {
- nbt: "",
- entity: "",
- interpret: false,
- };
- },
+ addAttributes(): EntityNBTAttributes {
+ return {
+ nbt: "",
+ entity: "",
+ interpret: false,
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "p[data-nbt-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "p[data-nbt-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- const { nbt, entity } = node.attrs;
+ renderHTML({ HTMLAttributes, node }) {
+ const { nbt, entity } = node.attrs;
- return [
- "p",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-nbt-node": "true",
- contenteditable: "false",
- style: `
+ return [
+ "p",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-nbt-node": "true",
+ contenteditable: "false",
+ style: `
background-color: #18181b;
padding: 0px 5px;
border-radius: 4px;
@@ -47,21 +47,21 @@ export const EntityNBTNode = Node.create({
vertical-align: var(--custom-source-align, middle);
text-decoration: inherit;
`,
- }),
- ["p", {}, `NBT: ${nbt}, ${entity}`],
- ];
- },
+ }),
+ ["p", {}, `NBT: ${nbt}, ${entity}`],
+ ];
+ },
- addCommands() {
- return {
- insertEntityNBT:
- (attrs: EntityNBTAttributes) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertEntityNBT:
+ (attrs: EntityNBTAttributes) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/KeybindNode.ts b/src/lib/tiptap/extensions/nodes/KeybindNode.ts
index 338b985..1cd884a 100644
--- a/src/lib/tiptap/extensions/nodes/KeybindNode.ts
+++ b/src/lib/tiptap/extensions/nodes/KeybindNode.ts
@@ -2,41 +2,41 @@ import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
import type { NodeOptions, KeybindAttributes } from "../index";
export const KeybindNode = Node.create({
- name: "keybind",
+ name: "keybind",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): KeybindAttributes {
- return {
- key: "",
- };
- },
+ addAttributes(): KeybindAttributes {
+ return {
+ key: "",
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-keybind-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-keybind-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- const { key } = node.attrs;
+ renderHTML({ HTMLAttributes, node }) {
+ const { key } = node.attrs;
- return [
- "span",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-keybind-node": "true",
- contenteditable: "false",
- style: `
+ return [
+ "span",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-keybind-node": "true",
+ contenteditable: "false",
+ style: `
background-color: #18181b;
padding: 0px 5px;
border-radius: 4px;
@@ -45,21 +45,21 @@ export const KeybindNode = Node.create({
vertical-align: var(--custom-source-align, middle);
text-decoration: inherit;
`,
- }),
- ["span", {}, `KEYBIND: ${key}`],
- ];
- },
+ }),
+ ["span", {}, `KEYBIND: ${key}`],
+ ];
+ },
- addCommands() {
- return {
- insertKeybind:
- (attrs: KeybindAttributes) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertKeybind:
+ (attrs: KeybindAttributes) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/PlayerObjectNode.ts b/src/lib/tiptap/extensions/nodes/PlayerObjectNode.ts
index da8542c..8709f2d 100644
--- a/src/lib/tiptap/extensions/nodes/PlayerObjectNode.ts
+++ b/src/lib/tiptap/extensions/nodes/PlayerObjectNode.ts
@@ -1,55 +1,51 @@
import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
-import {
- markSchema,
- type NodeOptions,
- type PlayerObjectAttributes,
-} from "../index";
+import { markSchema, type NodeOptions, type PlayerObjectAttributes } from "../index";
export const PlayerObjectNode = Node.create({
- name: "player_object",
+ name: "player_object",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- marks() {
- const blocklist = new Set(["bold", "italic", "obfuscated"]);
- const allMarks = Object.keys(markSchema.marks || {});
- return allMarks.filter((mark) => !blocklist.has(mark)).join(" ");
- },
+ marks() {
+ const blocklist = new Set(["bold", "italic", "obfuscated"]);
+ const allMarks = Object.keys(markSchema.marks || {});
+ return allMarks.filter((mark) => !blocklist.has(mark)).join(" ");
+ },
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): PlayerObjectAttributes {
- return {
- player: {
- name: "",
- },
- hat: true,
- };
- },
+ addAttributes(): PlayerObjectAttributes {
+ return {
+ player: {
+ name: "",
+ },
+ hat: true,
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-player-object-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-player-object-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- const { player } = node.attrs;
+ renderHTML({ HTMLAttributes, node }) {
+ const { player } = node.attrs;
- return [
- "span",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-player-object-node": "",
- contenteditable: "false",
- style: `
+ return [
+ "span",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-player-object-node": "",
+ contenteditable: "false",
+ style: `
background-color: #18181b;
padding: 0px 5px;
border-radius: 4px;
@@ -60,21 +56,21 @@ export const PlayerObjectNode = Node.create({
font-weight: normal !important;
text-decoration: inherit;
`,
- }),
- ["span", {}, `OBJECT: [player ${player.name}]`],
- ];
- },
+ }),
+ ["span", {}, `OBJECT: [player ${player.name}]`],
+ ];
+ },
- addCommands() {
- return {
- insertPlayerObject:
- (attrs) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertPlayerObject:
+ (attrs) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/ScoreNode.ts b/src/lib/tiptap/extensions/nodes/ScoreNode.ts
index 1ae2b9a..b8c5c76 100644
--- a/src/lib/tiptap/extensions/nodes/ScoreNode.ts
+++ b/src/lib/tiptap/extensions/nodes/ScoreNode.ts
@@ -2,42 +2,42 @@ import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
import type { NodeOptions, ScoreAttributes } from "../index";
export const ScoreNode = Node.create({
- name: "score",
+ name: "score",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): ScoreAttributes {
- return {
- name: "",
- objective: "",
- };
- },
+ addAttributes(): ScoreAttributes {
+ return {
+ name: "",
+ objective: "",
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-score-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-score-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- const { name, objective } = node.attrs;
+ renderHTML({ HTMLAttributes, node }) {
+ const { name, objective } = node.attrs;
- return [
- "span",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-score-node": "true",
- contenteditable: "false",
- style: `
+ return [
+ "span",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-score-node": "true",
+ contenteditable: "false",
+ style: `
background-color: #18181b;
padding: 0px 5px;
border-radius: 4px;
@@ -46,21 +46,21 @@ export const ScoreNode = Node.create({
vertical-align: var(--custom-source-align, middle);
text-decoration: inherit;
`,
- }),
- ["span", {}, `SCORE: ${name} - ${objective}`],
- ];
- },
+ }),
+ ["span", {}, `SCORE: ${name} - ${objective}`],
+ ];
+ },
- addCommands() {
- return {
- insertScore:
- (attrs: { name: string; objective: string }) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertScore:
+ (attrs: { name: string; objective: string }) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/SelectorNode.ts b/src/lib/tiptap/extensions/nodes/SelectorNode.ts
index 8788519..7a6ef4e 100644
--- a/src/lib/tiptap/extensions/nodes/SelectorNode.ts
+++ b/src/lib/tiptap/extensions/nodes/SelectorNode.ts
@@ -2,41 +2,41 @@ import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
import type { NodeOptions, SelectorAttributes } from "../index";
export const SelectorNode = Node.create({
- name: "selector",
+ name: "selector",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): SelectorAttributes {
- return {
- selector: "",
- };
- },
+ addAttributes(): SelectorAttributes {
+ return {
+ selector: "",
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-selector-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-selector-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- const { selector } = node.attrs;
+ renderHTML({ HTMLAttributes, node }) {
+ const { selector } = node.attrs;
- return [
- "span",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-selector-node": "true",
- contenteditable: "false",
- style: `
+ return [
+ "span",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-selector-node": "true",
+ contenteditable: "false",
+ style: `
background-color: #18181b;
padding: 0px 5px;
border-radius: 4px;
@@ -45,21 +45,21 @@ export const SelectorNode = Node.create({
vertical-align: var(--custom-source-align, middle);
text-decoration: inherit;
`,
- }),
- ["span", {}, `SELECTOR: ${selector}`],
- ];
- },
+ }),
+ ["span", {}, `SELECTOR: ${selector}`],
+ ];
+ },
- addCommands() {
- return {
- insertSelector:
- (attrs: SelectorAttributes) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertSelector:
+ (attrs: SelectorAttributes) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/StorageNBTNode.ts b/src/lib/tiptap/extensions/nodes/StorageNBTNode.ts
index 3ff1e5d..9b95b21 100644
--- a/src/lib/tiptap/extensions/nodes/StorageNBTNode.ts
+++ b/src/lib/tiptap/extensions/nodes/StorageNBTNode.ts
@@ -2,43 +2,43 @@ import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
import type { NodeOptions, StorageNBTAttributes } from "../index";
export const StorageNBTNode = Node.create({
- name: "storage_nbt",
+ name: "storage_nbt",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): StorageNBTAttributes {
- return {
- nbt: "",
- storage: "",
- interpret: false,
- };
- },
+ addAttributes(): StorageNBTAttributes {
+ return {
+ nbt: "",
+ storage: "",
+ interpret: false,
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-nbt-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-nbt-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- const { nbt, storage } = node.attrs;
+ renderHTML({ HTMLAttributes, node }) {
+ const { nbt, storage } = node.attrs;
- return [
- "span",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-nbt-node": "true",
- contenteditable: "false",
- style: `
+ return [
+ "span",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-nbt-node": "true",
+ contenteditable: "false",
+ style: `
background-color: #18181b;
padding: 0px 5px;
border-radius: 4px;
@@ -47,21 +47,21 @@ export const StorageNBTNode = Node.create({
vertical-align: var(--custom-source-align, middle);
text-decoration: inherit;
`,
- }),
- ["span", {}, `NBT: ${nbt}, ${storage}`],
- ];
- },
+ }),
+ ["span", {}, `NBT: ${nbt}, ${storage}`],
+ ];
+ },
- addCommands() {
- return {
- insertStorageNBT:
- (attrs: StorageNBTAttributes) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertStorageNBT:
+ (attrs: StorageNBTAttributes) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tiptap/extensions/nodes/TranslateNode.ts b/src/lib/tiptap/extensions/nodes/TranslateNode.ts
index 3f8f58c..28118be 100644
--- a/src/lib/tiptap/extensions/nodes/TranslateNode.ts
+++ b/src/lib/tiptap/extensions/nodes/TranslateNode.ts
@@ -2,43 +2,43 @@ import { Node, mergeAttributes, type CommandProps } from "@tiptap/core";
import type { NodeOptions, TranslateAttributes } from "../index";
export const TranslateNode = Node.create({
- name: "translate",
+ name: "translate",
- inline: true,
- group: "inline",
- atom: true,
+ inline: true,
+ group: "inline",
+ atom: true,
- addOptions() {
- return {
- HTMLAttributes: {},
- };
- },
+ addOptions() {
+ return {
+ HTMLAttributes: {},
+ };
+ },
- addAttributes(): TranslateAttributes {
- return {
- key: "",
- fallback: undefined,
- params: [],
- };
- },
+ addAttributes(): TranslateAttributes {
+ return {
+ key: "",
+ fallback: undefined,
+ params: [],
+ };
+ },
- parseHTML() {
- return [
- {
- tag: "span[data-translate-node]",
- },
- ];
- },
+ parseHTML() {
+ return [
+ {
+ tag: "span[data-translate-node]",
+ },
+ ];
+ },
- renderHTML({ HTMLAttributes, node }) {
- const { key } = node.attrs;
+ renderHTML({ HTMLAttributes, node }) {
+ const { key } = node.attrs;
- return [
- "span",
- mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
- "data-translate-node": "true",
- contenteditable: "false",
- style: `
+ return [
+ "span",
+ mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, {
+ "data-translate-node": "true",
+ contenteditable: "false",
+ style: `
background-color: #18181b;
padding: 0px 5px;
border-radius: 4px;
@@ -47,21 +47,21 @@ export const TranslateNode = Node.create({
vertical-align: var(--custom-source-align, middle);
text-decoration: inherit;
`,
- }),
- ["span", {}, `TRANSLATE: ${key}`],
- ];
- },
+ }),
+ ["span", {}, `TRANSLATE: ${key}`],
+ ];
+ },
- addCommands() {
- return {
- insertTranslate:
- (attrs: TranslateAttributes) =>
- ({ commands }: CommandProps) => {
- return commands.insertContent({
- type: this.name,
- attrs,
- });
- },
- };
- },
+ addCommands() {
+ return {
+ insertTranslate:
+ (attrs: TranslateAttributes) =>
+ ({ commands }: CommandProps) => {
+ return commands.insertContent({
+ type: this.name,
+ attrs,
+ });
+ },
+ };
+ },
});
diff --git a/src/lib/tooltip.ts b/src/lib/tooltip.ts
index dbf4cf7..aabac88 100644
--- a/src/lib/tooltip.ts
+++ b/src/lib/tooltip.ts
@@ -1,15 +1,15 @@
import tippy from "tippy.js";
export function tooltip(e: HTMLElement) {
- const tip = tippy(e, {
- placement: "bottom",
- animation: "shift-away",
- arrow: true,
- theme: "dph",
- content: e.ariaLabel || e.title || e.textContent || "",
- });
+ const tip = tippy(e, {
+ placement: "bottom",
+ animation: "shift-away",
+ arrow: true,
+ theme: "dph",
+ content: e.ariaLabel || e.title || e.textContent || "",
+ });
- return () => {
- tip.destroy();
- };
+ return () => {
+ tip.destroy();
+ };
}
diff --git a/src/lib/types.ts b/src/lib/types.ts
index f1bad8a..a1e2a1c 100644
--- a/src/lib/types.ts
+++ b/src/lib/types.ts
@@ -1,152 +1,141 @@
export type Version = {
- friendly: string;
- description: string;
- index: number;
+ friendly: string;
+ description: string;
+ index: number;
};
export const versions = [
- {
- friendly: "pre-1.21.5",
- description: "uses json text components",
- index: 0,
- },
- {
- friendly: "1.21.5-8",
- description: "uses nbt as text components, changes to syntax and names",
- index: 1,
- },
- {
- friendly: "1.21.9+",
- description:
- "'object' type added, allowing you to use non-character sprites",
- index: 2,
- },
+ {
+ friendly: "pre-1.21.5",
+ description: "uses json text components",
+ index: 0,
+ },
+ {
+ friendly: "1.21.5-8",
+ description: "uses nbt as text components, changes to syntax and names",
+ index: 1,
+ },
+ {
+ friendly: "1.21.9+",
+ description: "'object' type added, allowing you to use non-character sprites",
+ index: 2,
+ },
];
export type BaseMinecraftText = Pick<
- MinecraftText,
- | "text"
- | "color"
- | "font"
- | "bold"
- | "italic"
- | "underlined"
- | "strikethrough"
- | "obfuscated"
+ MinecraftText,
+ "text" | "color" | "font" | "bold" | "italic" | "underlined" | "strikethrough" | "obfuscated"
>;
export type StringyMCText = string | VersionAgnosticText;
export type VersionAgnosticText = MinecraftText & OldMinecraftText;
export type MinecraftText = {
- translate?: string;
- with?: string[];
- fallback?: string;
+ translate?: string;
+ with?: string[];
+ fallback?: string;
- text?: string;
+ text?: string;
- score?: {
- name: string;
- objective: string;
- };
+ score?: {
+ name: string;
+ objective: string;
+ };
- nbt?: string;
- interpret?: string;
- storage?: string;
- block?: string;
- entity?: string;
+ nbt?: string;
+ interpret?: string;
+ storage?: string;
+ block?: string;
+ entity?: string;
- keybind?: string;
+ keybind?: string;
- selector?: string;
+ selector?: string;
- object?: string;
- atlas?: string;
- sprite?: string;
- player?: {
- name?: string;
- };
- hat?: string;
+ object?: string;
+ atlas?: string;
+ sprite?: string;
+ player?: {
+ name: string;
+ };
+ hat?: string;
- color?: string;
- shadow_color?: number | number[];
- font?: string;
- bold?: boolean;
- italic?: boolean;
- underlined?: boolean;
- strikethrough?: boolean;
- obfuscated?: boolean;
- click_event?: {
- action: string;
- url?: string;
- command?: string;
- value?: string;
- page?: string;
- dialog?: string;
- };
- hover_event?: {
- action: string;
+ color?: string;
+ shadow_color?: number | number[];
+ font?: string;
+ bold?: boolean;
+ italic?: boolean;
+ underlined?: boolean;
+ strikethrough?: boolean;
+ obfuscated?: boolean;
+ click_event?: {
+ action: string;
+ url?: string;
+ command?: string;
+ value?: string;
+ page?: string;
+ dialog?: string;
+ };
+ hover_event?: {
+ action: string;
- value?: BaseMinecraftText | BaseMinecraftText[];
+ value?: BaseMinecraftText | BaseMinecraftText[];
- id?: string;
- count?: number;
- components?: {}[];
+ id?: string;
+ count?: number;
+ components?: {}[];
- name?: BaseMinecraftText | BaseMinecraftText[];
- uuid?: string | number[];
- };
+ name?: BaseMinecraftText | BaseMinecraftText[];
+ uuid?: string | number[];
+ };
- extra?: StringyMCText[];
+ extra?: StringyMCText[];
};
-export type OldMinecraftText = Omit<
- MinecraftText,
- "hover_event" | "click_event"
-> & {
- clickEvent?: {
- action: string;
- value: string;
- };
+export type OldMinecraftText = Omit & {
+ clickEvent?: {
+ action: string;
+ value: string;
+ };
- hoverEvent?: {
- action: string;
- contents: any;
- };
+ hoverEvent?: {
+ action: string;
+ contents: any;
+ };
};
export type ExternalSources = {
- score: {
- objective: string;
- name: string;
- };
- translate: {
- key: string;
- params: string[];
- fallback?: string;
- };
- nbt: {
- sourceType: string;
- storage: string;
- entity: string;
- block: string;
- path: string;
- interpret: boolean;
- };
- keybind: {
- key: string;
- };
- selector: {
- selector: string;
- };
- object: {
- object?: string; // can be omitted for only atlas objects ONLY
- atlas: string;
- sprite: string;
- player: {
- name: string;
- id: string;
- };
- hat: boolean;
- };
+ score: {
+ objective: string;
+ name: string;
+ };
+ translate: {
+ key: string;
+ params: string[];
+ fallback?: string;
+ };
+ nbt: {
+ sourceType: string;
+ storage: string;
+ entity: string;
+ block: string;
+ path: string;
+ interpret: boolean;
+ };
+ keybind: {
+ key: string;
+ };
+ selector: {
+ selector: string;
+ };
+ object: {
+ // can be omitted for only atlas objects ONLY
+ object?: string;
+ atlas: string;
+ sprite: string;
+ player: {
+ name: string;
+ id: string;
+ };
+ hat: boolean;
+ };
};
-export type MCTextKey = keyof MinecraftText;
export type TranslateOptions = Partial<{
- optimise: boolean;
- exportType: "standard" | "item_lore";
+ optimise: boolean;
+ exportType: "standard" | "item_lore";
}>;
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 8fb9c83..b1bd321 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -1,40 +1,39 @@
- Minecraft Text Editor
-
-
-
-
-
-
-
+ Minecraft Text Editor
+
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
-
- {@render children()}
+
+ {@render children()}
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte
index eb2fb91..96abe4f 100644
--- a/src/routes/+page.svelte
+++ b/src/routes/+page.svelte
@@ -1,864 +1,391 @@
-
-
-
-
Minecraft Text Editor
-
-
Import
- {#if doesContentExist}
-
Export
-
Save{recentlySaved ? "d!" : ""}
- {/if}
-
Load
-
-
Discord
-
Datapack Wiki
-
-
-
- {#if editor}
-
-
-
- editor!.getAttributes("textStyle").font
- ? editor!.chain().focus().unsetFont().run()
- : fontDialog.open()}
- styleVar={editor.getAttributes("textStyle").font}
- ariaLabel="Font" />
-
-
-
-
-
-
-
- {#each colorMap as color}
- editor!.chain().focus().setColor(color.value).run()}
- styleVar={editor.isActive("textStyle", { color: color.value })}
- color={color.value}
- ariaLabel={toTitleCase(color.name.replace("_", " "))} />
- {/each}
-
- {#if editor.getAttributes("textStyle").color}
- editor?.chain().focus().unsetColor().run()}
- aria-label="Unset color"
- {@attach tooltip}
- class="rounded-md p-1 text-lg text-zinc-500 hover:bg-white/3"
- class:active={editor.isActive("underline")}>
-
-
- {/if}
-
-
-
- {
- customDialog?.open();
- customType = undefined;
- }}
- {@attach tooltip}
- class="toolbar-btn"
- aria-label="Add Custom Source">
-
-
- {#if sourceKeys.some((key) => editor!.isActive(key))}
- {
- customType = getNodeAtSelection(editor!)?.type.name;
- if (customType === "player_object" || customType === "selector") {
- customType = "object";
- }
- await customDialog.open();
- }}
- ariaLabel="Edit Source"
- Icon={IconEdit} />
- {/if}
-
-
-
-
-
- {
- if (editor?.isActive("clickEvent")) {
- editor?.chain().focus().unsetClickEvent().run();
- } else {
- clickEventDialog?.open();
- }
- }}
- ariaLabel="Click Event"
- styleVar={editor.isActive("clickEvent")}
- Icon={IconClickEvent} />
- {#if editor.isActive("clickEvent")}
-
- {/if}
-
- {
- if (editor?.isActive("hoverEvent")) {
- editor?.chain().focus().unsetHoverEvent().run();
- } else {
- hoverEventDialog?.open();
- }
- }}
- {@attach tooltip}
- class="{editor.isActive('clickEvent') || editor.isActive('hoverEvent')
- ? 'ml-2'
- : ''} toolbar-btn {editor.isActive('hoverEvent')
- ? 'bg-zinc-800'
- : ''}"
- aria-label="Hover Event">
-
-
- {#if editor.isActive("hoverEvent")}
-
- {/if}
-
-
-
- editor?.commands.undo()}
- ariaLabel="Undo"
- Icon={IconUndo} />
- editor?.commands.redo()}
- ariaLabel="Redo"
- Icon={IconRedo} />
-
-
-
-
-
- {/if}
-
-
-
-
-
-
- {#if page.url.searchParams.has("dev")}
-
- DEV ONLY: {editor ? JSON.stringify(editor.getJSON()) : "Loading..."}
-
-
- {/if}
-
-
- {
- navigator.clipboard.writeText(finalOutput);
- recentlyCopied = true;
- setTimeout(() => (recentlyCopied = false), 2000);
- }}
- aria-label="Copy">
- {#if recentlyCopied}
-
- {:else}
-
- {/if}
-
-
-
-
-
-
-
-
- click to change output settings:
-
-
-
- {#if versionPopup}
-
- {#if versionPopupConfirmationVisible}
-
-
-
Warning:
-
Changing to an earlier version could remove some elements
- of your text that are unsupported in this version.
-
-
- updateOutputVersion(
- temporaryVersionConfirmation,
- true,
- )}>Change version
- {
- versionPopupConfirmationVisible = false;
- temporaryVersionConfirmation = undefined;
- }}>Cancel
-
-
-
- {/if}
-
-
- version
- description
-
- {#each versions as v}
-
updateOutputVersion(v)}>
- {v.friendly}
- {v.description}
-
- {/each}
-
* unreleased minecraft version
-
-
- {/if}
-
-
{
- versionPopup = !versionPopup;
- }}>{$outputVersion.friendly}
-
-
-
(shouldOptimise = !shouldOptimise)}
- >{shouldOptimise ? "optimised" : "expanded"}
-
-
•
-
-
- other output formats
-
-
-
•
-
-
- {finalOutput.length} characters
-
-
-
-
+
+
+
+
+
+
+
+
+ {#if page.url.searchParams.has("dev")}
+
DEV ONLY: {tiptapJSON ? JSON.stringify(tiptapJSON) : "Loading..."}
+
+ {/if}
+
+
+
{
+ navigator.clipboard.writeText(finalOutput);
+ recentlyCopied = true;
+ setTimeout(() => (recentlyCopied = false), 2000);
+ }}
+ aria-label="Copy">
+ {#if recentlyCopied}
+
+ {:else}
+
+ {/if}
+
+
+ {#if $appSettings.syntaxHighlight}
+
+ {:else}
+ {editor
+ ? finalOutput
+ : "Loading..."}
+ {/if}
+
+
+
+
click to change output settings:
+
+
+ {#if versionPopup}
+
+ {#if versionPopupConfirmationVisible}
+
+
+
Warning:
+
Changing to an earlier version could remove some
+ elements of your text that are unsupported in this
+ version.
+
+
+ updateOutputVersion(
+ temporaryVersionConfirmation,
+ true,
+ )}>Change version
+ {
+ versionPopupConfirmationVisible = false;
+ temporaryVersionConfirmation = undefined;
+ }}>Cancel
+
+
+
+ {/if}
+
+
+ version
+ description
+
+ {#each versions as v}
+
updateOutputVersion(v)}>
+ {v.friendly}
+ {v.description}
+
+ {/each}
+
* unreleased minecraft version
+
+
+ {/if}
+
+
{
+ versionPopup = !versionPopup;
+ }}>{$outputVersion.friendly}
+
+
+
(shouldOptimise = !shouldOptimise)}
+ >{shouldOptimise ? "optimised" : "expanded"}
+
+
•
+
+
+ other output formats
+
+
+ {#if $appSettings.showCharacterCount}
+
•
+
+
+ {finalOutput.length} characters
+
+ {/if}
+
+
+
-
-
-
-
-
-
Datapack Hub Text Editor
-
-
-
- This is a /tellraw editor and editor for Minecraft text components,
- for all versions. Create /tellraw commands and text components (JSON
- text) for Minecraft Java Edition with our easy-to-use, modern online
- tool!
-
-
-
⚠️ This website requires JavaScript to work.
-
Please enable JavaScript in your site settings. If JavaScript is
- enabled, please refresh. If that doesn't work, then try a
- different browser. If that still doesn't work, then ask for help
- in our Discord
-
-
-
-
-
+
+
+
+
+
+
Datapack Hub Text Editor
+
+
+
+ This is a /tellraw editor and editor for Minecraft text components, for all
+ versions. Create /tellraw commands and text components (JSON text) for
+ Minecraft Java Edition with our easy-to-use, modern online tool!
+
+
+
⚠️ This website requires JavaScript to work.
+
Please enable JavaScript in your site settings. If JavaScript is
+ enabled, please refresh. If that doesn't work, then try a different
+ browser. If that still doesn't work, then ask for help in our Discord
+
+
+
+
+
-
-
- {#await import("$lib/components/modals/ClickEventModal.svelte") then modal}
-
- {/await}
-
-
- Text to show
-
- {
- editor
- ?.chain()
- .focus()
- .setHoverEvent({ action: "show_text", value: hoverEventValue })
- .run();
- hoverEventDialog?.close();
- }}
- class="mt-2 w-fit rounded-md bg-zinc-900 p-2 hover:bg-black/50">
- Add Hover Event
-
-
-
- {#await import("$lib/components/modals/CustomSourceModal.svelte") then modal}
-
- {/await}
-
-
-
-
-
-
- Done
-
-
-
-
-
-
- {#if snapshots.length == 0}
-
You have not saved anything yet!
- {/if}
- {#each snapshots as snapshot (snapshot)}
-
-
-
-
-
- {
- editor?.commands.setContent(snapshot);
- editor?.commands.focus();
- }}>
- {
- snapshots = snapshots.filter(
- (_, index) => index !== snapshots.indexOf(snapshot),
- );
- localStorage.setItem("snapshots", JSON.stringify(snapshots));
- }}>
-
-
- {/each}
-
-
-
- {#await import("$lib/components/modals/ExportModal.svelte") then modal}
-
- {/await}
-
-
-
-
- Paste your text components below to import them into the editor. This
- will clear the current contents of the editor!
-
-
-
-
- Import
-
-
-
-
- {#await import("$lib/components/modals/FontPickerModal.svelte") then modal}
-
- {/await}
-
- {#await import("$lib/components/modals/KeybindModal.svelte") then modal}
-
- {/await}
- {#await import("$lib/components/modals/FontUploadModal.svelte") then modal}
-
- {/await}
-
- {#await import("$lib/components/modals/ColorGradientModal.svelte") then modal}
-
- {/await}
- {#await import("$lib/components/modals/UnicodeSelectorModal.svelte") then modal}
-
- {/await}
-
+{#await import("$lib/components/modals/topbar/ExportModal.svelte") then modal}
+
+{/await}
diff --git a/src/tests/e2e/basic.test.ts b/src/tests/e2e/basic.test.ts
index 90b1718..fd4767e 100644
--- a/src/tests/e2e/basic.test.ts
+++ b/src/tests/e2e/basic.test.ts
@@ -1,97 +1,130 @@
import { expect, test } from "@playwright/test";
test.beforeEach(async ({ page }) => {
- await page.goto("/");
+ await page.goto("/");
});
test("home page loads", async ({ page }) => {
- const resp = await page.goto("/");
- expect(resp).toBeDefined();
- expect(resp?.ok()).toBe(true);
+ const resp = await page.goto("/");
+ expect(resp).toBeDefined();
+ expect(resp?.ok()).toBe(true);
});
test("blank text updates with formatted output", async ({ page }) => {
- await page.getByLabel("Keybinds").waitFor();
- const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
- await textbox.fill("lorem ipsum");
- const output = page.locator("#outputbox").first();
- await expect(output).toHaveText(`"lorem ipsum"`);
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ const output = page.locator("#outputbox").first();
+ await expect(output).toHaveText(`"lorem ipsum"`);
});
test("the bold button should work", async ({ page }) => {
- const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
- await textbox.fill("lorem ipsum");
- await textbox.selectText();
- let button = page.getByRole("button", { name: "Bold " });
- await button.click();
- expect(await textbox.locator("p>strong").count()).toBeGreaterThan(0);
- await expect(textbox.locator("p>strong").first()).toHaveCSS(
- "font-family",
- "MinecraftBold",
- );
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ await textbox.selectText();
+ const button = page.getByTestId("bold-button");
+ await button.click();
+ await expect(button).toHaveClass(/bg-zinc-800/);
+ await expect(textbox.locator("p>strong")).toHaveCount(1);
+ await expect(textbox.locator("p>strong").first()).toHaveCSS("font-family", "MinecraftBold");
});
test("the italic button should work", async ({ page }) => {
- const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
- await textbox.fill("lorem ipsum");
- await textbox.selectText();
- let button = page.getByRole("button", { name: "Italic " });
- await button.click();
- expect(await textbox.locator("p>em").count()).toBeGreaterThan(0);
- await expect(textbox.locator("p>em").first()).toHaveCSS(
- "font-style",
- "italic",
- );
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ await textbox.selectText();
+ const button = page.getByTestId("italic-button");
+ await button.click();
+ await expect(button).toHaveClass(/bg-zinc-800/);
+ await expect(textbox.locator("p>em")).toHaveCount(1);
+ await expect(textbox.locator("p>em").first()).toHaveCSS("font-style", "italic");
});
test("the strikethrough button should work", async ({ page }) => {
- const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
- await textbox.fill("lorem ipsum");
- await textbox.selectText();
- let button = page.getByRole("button", { name: "Strikethrough " });
- await button.click();
- expect(await textbox.locator("p>s").count()).toBeGreaterThan(0);
- await expect(textbox.locator("p>s").first()).toHaveCSS(
- "text-decoration-line",
- "line-through",
- );
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ await textbox.selectText();
+ const button = page.getByTestId("strikethrough-button");
+ await button.click();
+ await expect(button).toHaveClass(/bg-zinc-800/);
+ await expect(textbox.locator("p>s")).toHaveCount(1);
+ await expect(textbox.locator("p>s").first()).toHaveCSS("text-decoration-line", "line-through");
});
test("the underline button should work", async ({ page }) => {
- const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
- await textbox.fill("lorem ipsum");
- await textbox.selectText();
- let button = page.getByRole("button", { name: "Underline " });
- await button.click();
- expect(await textbox.locator("p>u").count()).toBeGreaterThan(0);
- await expect(textbox.locator("p>u").first()).toHaveCSS(
- "text-decoration-line",
- "underline",
- );
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ await textbox.selectText();
+ const button = page.getByTestId("underline-button");
+ await button.click();
+ await expect(button).toHaveClass(/bg-zinc-800/);
+ await expect(textbox.locator("p>u")).toHaveCount(1);
+ await expect(textbox.locator("p>u").first()).toHaveCSS("text-decoration-line", "underline");
});
test("the obfuscation button should work", async ({ page }) => {
- const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
- await textbox.fill("lorem ipsum");
- await textbox.selectText();
- let button = page.getByRole("button", { name: "Obfuscated " });
- await button.click();
- expect(await textbox.locator("p>span.obfuscated").count()).toBeGreaterThan(0);
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ await textbox.selectText();
+ const button = page.getByTestId("obfuscation-button");
+ await button.click();
+ await expect(button).toHaveClass(/bg-zinc-800/);
+ await expect(textbox.locator("p>span.obfuscated")).toHaveCount(1);
});
test("the shadow color button should work", async ({ page }) => {
- const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
- await textbox.fill("lorem ipsum");
- await textbox.selectText();
- let button = page.getByRole("button", { name: "Shadow Color" });
- await button.click();
- const colorInput = page.locator('input[aria-label="hex color"]');
- await colorInput.fill("#ff0000");
- await colorInput.press("Enter");
- expect(
- await textbox.locator('p>span[style*="text-shadow"]').count(),
- ).toBeGreaterThan(0);
- await expect(
- textbox.locator('p>span[style*="text-shadow"]').first(),
- ).toHaveAttribute("style", "text-shadow: rgb(255, 0, 0) 2px 2px 0px;");
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ await textbox.selectText();
+ const button = page.getByTestId("shadow-color-button");
+ await button.click();
+ await page.locator('input[aria-label="hex color"]').waitFor({ timeout: 1000 });
+ const colorInput = page.locator('input[aria-label="hex color"]');
+ await colorInput.fill("#ff0000");
+ await expect(textbox.locator("p>span[data-shadow-color]")).toHaveCount(1);
+ await expect(textbox.locator("p>span[data-shadow-color]")).toHaveAttribute(
+ "data-shadow-color",
+ "#ff0000",
+ );
+});
+
+test("the shortcut keys should work", async ({ page }) => {
+ await page.locator("#wysiwyg-box>[role=textbox]").first().press("ControlOrMeta+Shift+K");
+ await page.getByTestId("modal-title-keybinds").waitFor({ timeout: 1000 });
+ await expect(page.getByTestId("modal-title-keybinds")).toBeVisible();
+});
+
+test("the color buttons should work", async ({ page }) => {
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ await textbox.selectText();
+ const colorButtons = await page.locator("#colorBtns>button").all();
+ const output = page.locator("#outputbox").first();
+
+ // check colors
+ for (const button of colorButtons) {
+ await button.click();
+ const color = await button.getAttribute("style");
+ const colorName = (await button.getAttribute("aria-label"))
+ ?.toLowerCase()
+ .replace(" ", "_");
+ await Promise.all([
+ expect(button).toHaveClass(/bg-zinc-800/),
+ expect(textbox.locator("p>span[style*='color']")).toHaveCSS(
+ "color",
+ /rgb\(\d+, \d+, \d+\)/,
+ ),
+ expect(textbox.locator("p>span[style*='color']")).toHaveAttribute("style", color!),
+ expect(output).toContainText(colorName!),
+ ]);
+ }
+
+ // check unsetting color
+
+ await textbox.selectText();
+
+ // should be visible, being that it should still have color applied from the last button click
+ await page.getByTestId("unset-color-button").click();
+
+ await expect(textbox.locator("p>span[style*='color']")).toHaveCount(0);
+ await expect(output).not.toContainText("color");
});
diff --git a/src/tests/e2e/modals.test.ts b/src/tests/e2e/modals.test.ts
new file mode 100644
index 0000000..bfcb0a4
--- /dev/null
+++ b/src/tests/e2e/modals.test.ts
@@ -0,0 +1,20 @@
+import { test, expect } from "@playwright/test";
+
+test.beforeEach(async ({ page }) => {
+ await page.goto("/");
+});
+
+test("the font button should work", async ({ page }) => {
+ const textbox = page.locator("#wysiwyg-box>[role=textbox]").first();
+ await textbox.fill("lorem ipsum");
+ await textbox.selectText();
+ const button = page.getByLabel("Font", { exact: true });
+ await button.click();
+ await page.getByTestId("modal-title-set font").waitFor({ timeout: 1000 });
+ await expect(page.getByTestId("modal-title-set font")).toBeVisible();
+ const fontButton = page.getByTestId("font-button-illageralt");
+ await fontButton.click();
+ await expect(textbox.locator("p>span")).toHaveCSS("font-family", "MinecraftIllager, monospace");
+ await textbox.screenshot({ path: "screenshots/font-button-illageralt.png" });
+ await expect(page.getByTestId("modal-title-set font")).not.toBeVisible();
+});
diff --git a/src/tests/unit/data/bad/json/too_big_shadow_color.json b/src/tests/unit/data/bad/json/too_big_shadow_color.json
new file mode 100644
index 0000000..1f2624e
--- /dev/null
+++ b/src/tests/unit/data/bad/json/too_big_shadow_color.json
@@ -0,0 +1,18 @@
+{
+ "content": [
+ {
+ "content": [
+ {
+ "type": "text",
+ "text": "Shadow",
+ "marks": [
+ {
+ "type": "shadowColor",
+ "attrs": { "shadowColor": "#100000000" }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/tests/unit/data/bad/shadow_color_array_invalid.snbt b/src/tests/unit/data/bad/shadow_color_array_invalid.snbt
new file mode 100644
index 0000000..85f5dd9
--- /dev/null
+++ b/src/tests/unit/data/bad/shadow_color_array_invalid.snbt
@@ -0,0 +1 @@
+["",{shadow_color:[1.2f, 0.5f, 0.0f, 1.0f],text:"oooo spooky shadows"}]
\ No newline at end of file
diff --git a/src/tests/unit/data/clean/json/basic_color_tiptap.json b/src/tests/unit/data/clean/json/basic_color_tiptap.json
index 888e27b..997807a 100644
--- a/src/tests/unit/data/clean/json/basic_color_tiptap.json
+++ b/src/tests/unit/data/clean/json/basic_color_tiptap.json
@@ -1,15 +1,15 @@
{
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "test",
- "marks": [{ "type": "textStyle", "attrs": { "color": "#AA0000" } }]
- }
- ]
- }
- ]
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "test",
+ "marks": [{ "type": "textStyle", "attrs": { "color": "#AA0000" } }]
+ }
+ ]
+ }
+ ]
}
diff --git a/src/tests/unit/data/clean/json/illegal_marked_object.json b/src/tests/unit/data/clean/json/illegal_marked_object.json
new file mode 100644
index 0000000..3feaf38
--- /dev/null
+++ b/src/tests/unit/data/clean/json/illegal_marked_object.json
@@ -0,0 +1,19 @@
+{
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "atlas_object",
+ "attrs": { "atlas": "", "sprite": "item/cobblestone" },
+ "marks": [{ "type": "bold" }, { "type": "italic" }, { "type": "obfuscated" }]
+ },
+ {
+ "type": "player_object",
+ "attrs": { "player": { "name": "Cbble_" }, "hat": true },
+ "marks": [{ "type": "bold" }, { "type": "italic" }, { "type": "obfuscated" }]
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/tests/unit/data/clean/json/interactives_tiptap.json b/src/tests/unit/data/clean/json/interactives_tiptap.json
index b38fb81..c4416bd 100644
--- a/src/tests/unit/data/clean/json/interactives_tiptap.json
+++ b/src/tests/unit/data/clean/json/interactives_tiptap.json
@@ -1,26 +1,26 @@
{
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "marks": [
- {
- "type": "clickEvent",
- "attrs": { "action": "open_url", "value": "hi" }
- },
- {
- "type": "hoverEvent",
- "attrs": {
- "action": "show_text",
- "value": ["", { "text": "hola mundo" }]
- }
- }
- ],
- "text": "blah blah"
- }
- ]
- }
- ]
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "marks": [
+ {
+ "type": "clickEvent",
+ "attrs": { "action": "open_url", "value": "hi" }
+ },
+ {
+ "type": "hoverEvent",
+ "attrs": {
+ "action": "show_text",
+ "value": ["", { "text": "hola mundo" }]
+ }
+ }
+ ],
+ "text": "blah blah"
+ }
+ ]
+ }
+ ]
}
diff --git a/src/tests/unit/data/clean/json/shadow_color.json b/src/tests/unit/data/clean/json/shadow_color.json
new file mode 100644
index 0000000..832f253
--- /dev/null
+++ b/src/tests/unit/data/clean/json/shadow_color.json
@@ -0,0 +1,18 @@
+{
+ "content": [
+ {
+ "content": [
+ {
+ "type": "text",
+ "text": "Shadow",
+ "marks": [
+ {
+ "type": "shadowColor",
+ "attrs": { "shadowColor": "#ff00ff" }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/tests/unit/data/clean/json/shadow_color_transparent.json b/src/tests/unit/data/clean/json/shadow_color_transparent.json
new file mode 100644
index 0000000..7e5bc9b
--- /dev/null
+++ b/src/tests/unit/data/clean/json/shadow_color_transparent.json
@@ -0,0 +1,18 @@
+{
+ "content": [
+ {
+ "content": [
+ {
+ "type": "text",
+ "text": "Shadow",
+ "marks": [
+ {
+ "type": "shadowColor",
+ "attrs": { "shadowColor": "#ff5454ff" }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/tests/unit/data/clean/json/simple_text.json b/src/tests/unit/data/clean/json/simple_text.json
new file mode 100644
index 0000000..486357b
--- /dev/null
+++ b/src/tests/unit/data/clean/json/simple_text.json
@@ -0,0 +1,14 @@
+{
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "test"
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/tests/unit/data/clean/json/simple_text_tiptap.json b/src/tests/unit/data/clean/json/simple_text_tiptap.json
deleted file mode 100644
index 79bd066..0000000
--- a/src/tests/unit/data/clean/json/simple_text_tiptap.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "test"
- }
- ]
- }
- ]
-}
diff --git a/src/tests/unit/data/clean/json/simple_unicode.json b/src/tests/unit/data/clean/json/simple_unicode.json
new file mode 100644
index 0000000..996695c
--- /dev/null
+++ b/src/tests/unit/data/clean/json/simple_unicode.json
@@ -0,0 +1,14 @@
+{
+ "type": "doc",
+ "content": [
+ {
+ "type": "paragraph",
+ "content": [
+ {
+ "type": "text",
+ "text": "☝☝☝↘↘◩◪╰᜶⇨ᐃ☺⓻❄♍♏▋"
+ }
+ ]
+ }
+ ]
+}
diff --git a/src/tests/unit/data/clean/json/simple_unicode_tiptap.json b/src/tests/unit/data/clean/json/simple_unicode_tiptap.json
deleted file mode 100644
index faece09..0000000
--- a/src/tests/unit/data/clean/json/simple_unicode_tiptap.json
+++ /dev/null
@@ -1,14 +0,0 @@
-{
- "type": "doc",
- "content": [
- {
- "type": "paragraph",
- "content": [
- {
- "type": "text",
- "text": "☝☝☝↘↘◩◪╰᜶⇨ᐃ☺⓻❄♍♏▋"
- }
- ]
- }
- ]
-}
diff --git a/src/tests/unit/data/clean/snbt/base10_shadow_color.snbt b/src/tests/unit/data/clean/snbt/base10_shadow_color.snbt
index 7a9f598..f30b7dd 100644
--- a/src/tests/unit/data/clean/snbt/base10_shadow_color.snbt
+++ b/src/tests/unit/data/clean/snbt/base10_shadow_color.snbt
@@ -1 +1 @@
-["",{shadow_color:16711680,text:"oooo spooky shadows"}]
\ No newline at end of file
+["",{shadow_color:4294967172L,text:"oooo spooky shadows"}]
\ No newline at end of file
diff --git a/src/tests/unit/data/clean/snbt/base16_shadow_color.snbt b/src/tests/unit/data/clean/snbt/base16_shadow_color.snbt
index c475b5b..4c58457 100644
--- a/src/tests/unit/data/clean/snbt/base16_shadow_color.snbt
+++ b/src/tests/unit/data/clean/snbt/base16_shadow_color.snbt
@@ -1 +1 @@
-["",{shadow_color:"#ff0000",text:"oooo spooky shadows"}]
\ No newline at end of file
+["",{shadow_color:"#ffff0000",text:"oooo spooky shadows"}]
\ No newline at end of file
diff --git a/src/tests/unit/data/clean/snbt/interactives.snbt b/src/tests/unit/data/clean/snbt/interactives.snbt
new file mode 100644
index 0000000..cf5e8fa
--- /dev/null
+++ b/src/tests/unit/data/clean/snbt/interactives.snbt
@@ -0,0 +1 @@
+["",{text:"click events :3",click_event:{action:"suggest_command",command:"meow meow"}}]
\ No newline at end of file
diff --git a/src/tests/unit/data/clean/snbt/interactives_old.snbt b/src/tests/unit/data/clean/snbt/interactives_old.snbt
new file mode 100644
index 0000000..607a2b8
--- /dev/null
+++ b/src/tests/unit/data/clean/snbt/interactives_old.snbt
@@ -0,0 +1 @@
+["",{"text":"click events :3","clickEvent":{"action":"suggest_command","value":"meow meow"}}]
\ No newline at end of file
diff --git a/src/tests/unit/data/clean/snbt/shadow_color_array.snbt b/src/tests/unit/data/clean/snbt/shadow_color_array.snbt
new file mode 100644
index 0000000..94cd334
--- /dev/null
+++ b/src/tests/unit/data/clean/snbt/shadow_color_array.snbt
@@ -0,0 +1 @@
+["",{shadow_color:[1.0f, 0.5f, 0.0f, 1.0f],text:"oooo spooky shadows"}]
\ No newline at end of file
diff --git a/src/tests/unit/exporting/optimising_mc_json.spec.ts b/src/tests/unit/exporting/optimising_mc_json.spec.ts
new file mode 100644
index 0000000..3015598
--- /dev/null
+++ b/src/tests/unit/exporting/optimising_mc_json.spec.ts
@@ -0,0 +1,117 @@
+import { optimise } from "$lib/text/nbt/optimiser";
+import { describe, expect, it } from "vitest";
+
+// Minimal mock types for test compatibility
+type StringyMCText = string | { [key: string]: any };
+
+describe("optimise", () => {
+ it("returns empty string array if input is empty", () => {
+ expect(optimise([])).toEqual([""]);
+ });
+
+ it("returns empty string array if input is just an empty string", () => {
+ expect(optimise([""])).toEqual([""]);
+ });
+
+ it("should combine with leading empty strings", () => {
+ expect(optimise(["", { text: "hello " }, { color: "red", text: "world!" }])).toEqual([
+ "hello ",
+ { color: "red", text: "world!" },
+ ]);
+ });
+
+ it("should combine whitespace string to next component", () => {
+ expect(optimise(["", { text: "hello" }, " ", { color: "red", text: "world!" }])).toEqual([
+ "hello ",
+ { color: "red", text: "world!" },
+ ]);
+ });
+
+ it("removes undefined properties and flattens objects with only text", () => {
+ const input: StringyMCText[] = [
+ { text: "Hello", color: undefined, bold: undefined },
+ { text: "World" },
+ ];
+ expect(optimise(input)).toEqual(["HelloWorld"]);
+ });
+
+ it("merges consecutive strings", () => {
+ const input: StringyMCText[] = ["Hello ", "World", "!", { text: "Test" }];
+ expect(optimise(input)).toEqual(["Hello World!Test"]);
+ });
+
+ it("merges whitespace with previous component", () => {
+ const input: StringyMCText[] = [{ text: "Test" }, " ", { text: "World" }];
+ expect(optimise(input)).toEqual(["Test World"]);
+ });
+
+ it("merges whitespace forwards", () => {
+ const input: StringyMCText[] = [" ", { text: "World" }];
+ expect(optimise(input)).toEqual([" World"]);
+ });
+
+ it("merges whitespace backwards", () => {
+ const input: StringyMCText[] = [{ text: "Test" }, " "];
+ expect(optimise(input)).toEqual(["Test "]);
+ });
+
+ it("groups objects with shared style properties", () => {
+ const input: StringyMCText[] = [
+ { text: "A", color: "red", bold: true },
+ { text: "B", color: "red", bold: true },
+ { text: "C", color: "blue" },
+ ];
+ const result = optimise(input);
+ expect(result[1]).toMatchObject({
+ color: "red",
+ bold: true,
+ text: "AB",
+ });
+ expect(result[2]).toMatchObject({ color: "blue", text: "C" });
+ });
+
+ it("removes leading empty string if followed by a string", () => {
+ const input: StringyMCText[] = ["foo", "bar"];
+ expect(optimise(input)).toEqual(["foobar"]);
+ });
+
+ it("removes leading empty string if followed by object without style", () => {
+ const input: StringyMCText[] = [{ text: "foo" }];
+ expect(optimise(input)).toEqual(["foo"]);
+ });
+
+ it("handles item lore mode by prepending lore object", () => {
+ const input: StringyMCText[] = [{ text: "lore" }];
+ expect(optimise(input, true)).toEqual([
+ { italic: false, color: "white", text: "" },
+ "lore",
+ ]);
+ });
+
+ it("merges objects with identical interactivity properties", () => {
+ const input: StringyMCText[] = [
+ { text: "A", click_event: { action: "run_command", command: "/a" } },
+ { text: "B", click_event: { action: "run_command", command: "/a" } },
+ { text: "C", click_event: { action: "run_command", command: "/b" } },
+ ];
+ const result = optimise(input);
+ expect(result[1]).toMatchObject({
+ click_event: { action: "run_command", command: "/a" },
+ text: "AB",
+ });
+ expect(result[2]).toMatchObject({
+ click_event: { action: "run_command", command: "/b" },
+ text: "C",
+ });
+ });
+
+ it("does not merge objects with different style/interactivity", () => {
+ const input: StringyMCText[] = [
+ { text: "A", color: "red" },
+ { text: "B", color: "blue" },
+ ];
+ const result = optimise(input);
+ expect(result[1]).toMatchObject({ color: "red", text: "A" });
+ expect(result[2]).toMatchObject({ color: "blue", text: "B" });
+ });
+});
diff --git a/src/tests/unit/exporting/translating_mc_json.spec.ts b/src/tests/unit/exporting/translating_mc_json.spec.ts
new file mode 100644
index 0000000..ddfc7df
--- /dev/null
+++ b/src/tests/unit/exporting/translating_mc_json.spec.ts
@@ -0,0 +1,174 @@
+import { outputVersion } from "$lib/stores";
+import { translateJSON } from "$lib/text/nbt/export";
+import { versions, type TranslateOptions } from "$lib/types";
+import type { JSONContent } from "@tiptap/core";
+import { expect, it } from "vitest";
+import { readTestDataFile, readTestJSONFile } from "../test_utils";
+
+it("should return a basic string", () => {
+ const document = {
+ type: "doc",
+ content: [{ type: "paragraph", content: [{ type: "text", text: "test" }] }],
+ };
+ const snbt = translateJSON(document, {
+ exportType: "standard",
+ optimise: true,
+ });
+ expect(snbt).toEqual('"test"');
+});
+
+it("should return a basic color string", async () => {
+ const document = await readTestDataFile("clean/json/basic_color_tiptap.json");
+ const snbt = translateJSON(JSON.parse(document), {
+ exportType: "standard",
+ optimise: true,
+ });
+ expect(JSON.parse(snbt)).toEqual(["", { text: "test", color: "dark_red" }]);
+});
+
+const baseOptions: TranslateOptions = {
+ exportType: "standard",
+ optimise: false,
+};
+
+it("returns waiting message for empty content", () => {
+ const json: JSONContent = {};
+ const result = translateJSON(json, baseOptions);
+ expect(result).toBeOneOf([
+ "waiting for input...",
+ "🤓 <- kevin is waiting for you to type something",
+ ]);
+});
+
+it("translates simple text node", () => {
+ const json: JSONContent = {
+ content: [
+ {
+ content: [
+ {
+ type: "text",
+ text: "Hello",
+ marks: [],
+ },
+ ],
+ },
+ ],
+ };
+ const result = translateJSON(json, baseOptions);
+ expect(result).toContain("Hello");
+ expect(result).not.toContain("color");
+});
+
+it("applies bold and italic marks", () => {
+ const json: JSONContent = {
+ content: [
+ {
+ content: [
+ {
+ type: "text",
+ text: "BoldItalic",
+ marks: [{ type: "bold" }, { type: "italic" }],
+ },
+ ],
+ },
+ ],
+ };
+ const result = translateJSON(json, baseOptions);
+ expect(result).toContain("BoldItalic");
+ expect(result).toContain('"bold":true');
+ expect(result).toContain('"italic":true');
+});
+
+it("should not apply bold, italic, or obfuscated marks to objects", async () => {
+ const json: JSONContent = (await readTestJSONFile(
+ "clean/json/illegal_marked_object.json",
+ )) as JSONContent;
+ outputVersion.set(versions[versions.length - 1]); // Ensure exportVersion is set to a version that supports atlas_object and player_object
+ const result = translateJSON(json, baseOptions);
+ expect(result).toContain('"object":"player"');
+ expect(result).not.toContain('"bold":true');
+ expect(result).not.toContain('"italic":true');
+ expect(result).not.toContain('"obfuscated":true');
+});
+
+it("handles shadowColor mark", async () => {
+ const json: JSONContent = (await readTestJSONFile(
+ "clean/json/shadow_color.json",
+ )) as JSONContent;
+ const result = translateJSON(json, baseOptions);
+ expect(result).toContain('"shadow_color":4294902015L');
+});
+
+it("handles shadowColor transparency", async () => {
+ const json: JSONContent = (await readTestJSONFile(
+ "clean/json/shadow_color_transparent.json",
+ )) as JSONContent;
+ const result = translateJSON(json, baseOptions);
+ expect(result).toContain('"shadow_color":4294923348L');
+});
+
+it("should remove shadow_color if out of range", async () => {
+ const json: JSONContent = (await readTestJSONFile(
+ "bad/json/too_big_shadow_color.json",
+ )) as JSONContent;
+ const result = translateJSON(json, baseOptions);
+ expect(result).not.toContain('"shadow_color"');
+});
+
+it("handles multiple paragraphs with newlines", () => {
+ const json: JSONContent = {
+ content: [
+ {
+ content: [{ type: "text", text: "First", marks: [] }],
+ },
+ {
+ content: [{ type: "text", text: "Second", marks: [] }],
+ },
+ ],
+ };
+ const result = translateJSON(json, baseOptions);
+ expect(result).toContain("First");
+ expect(result).toContain("Second");
+ expect(result).toContain("\\n");
+});
+
+it("uses older format output when exportVersion=old", async () => {
+ const json: JSONContent = (await readTestJSONFile(
+ "clean/json/interactives_tiptap.json",
+ )) as JSONContent;
+ outputVersion.set(versions[0]);
+ const result = translateJSON(json, {
+ ...baseOptions,
+ });
+ expect(JSON.parse(result)).toHaveProperty("[1].clickEvent");
+ expect(JSON.parse(result)).not.toHaveProperty("[1].click_event");
+ expect(JSON.parse(result)).toHaveProperty("[1].hoverEvent");
+ expect(JSON.parse(result)).not.toHaveProperty("[1].hover_event");
+});
+
+it("handles exportType=item_lore", () => {
+ const json: JSONContent = {
+ content: [
+ {
+ content: [{ type: "text", text: "Lore", marks: [] }],
+ },
+ ],
+ };
+ const result = translateJSON(json, {
+ ...baseOptions,
+ exportType: "item_lore",
+ });
+ expect(result).toContain("Lore");
+ expect(result.startsWith("[")).toBe(true);
+});
+
+it("handles unknown exportType gracefully", () => {
+ const json: JSONContent = {
+ content: [],
+ };
+ const result = translateJSON(json, {
+ ...baseOptions,
+ exportType: "unknown" as any,
+ });
+ expect(result).toBe("[]");
+});
diff --git a/src/tests/unit/exporting/type_props.spec.ts b/src/tests/unit/exporting/type_props.spec.ts
new file mode 100644
index 0000000..353a2b9
--- /dev/null
+++ b/src/tests/unit/exporting/type_props.spec.ts
@@ -0,0 +1,297 @@
+import { outputVersion } from "$lib/stores";
+import { addTypeSpecificValues } from "$lib/text/nbt/export";
+import { versions, type MinecraftText, type VersionAgnosticText } from "$lib/types";
+import type { JSONContent } from "@tiptap/core";
+import { describe, expect, it } from "vitest";
+
+it("should add text property for type 'text'", () => {
+ const current: MinecraftText = {};
+ const c: JSONContent = { type: "text", text: "hello" };
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result.text).toBe("hello");
+});
+
+it("should add score property for type 'score'", () => {
+ const current: MinecraftText = {};
+ const c: JSONContent = {
+ type: "score",
+ attrs: { name: "player", objective: "obj" },
+ };
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result.score).toEqual({ name: "player", objective: "obj" });
+});
+
+it("should add translate, with, and fallback for type 'translate'", () => {
+ const current: MinecraftText = {};
+ const c: JSONContent = {
+ type: "translate",
+ attrs: {
+ key: "translation.key",
+ params: ["param1", "param2"],
+ fallback: "fallback text",
+ },
+ };
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result.translate).toBe("translation.key");
+ expect(result.with).toEqual(["param1", "param2"]);
+ expect(result.fallback).toBe("fallback text");
+});
+
+it("should add nbt, storage, block, entity, interpret for nbt types", () => {
+ const current: MinecraftText = {};
+ const c: JSONContent = {
+ type: "storage_nbt",
+ attrs: {
+ nbt: "someNbt",
+ storage: "someStorage",
+ block: "someBlock",
+ entity: "someEntity",
+ interpret: true,
+ },
+ };
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result.nbt).toBe("someNbt");
+ expect(result.storage).toBe("someStorage");
+ expect(result.block).toBe("someBlock");
+ expect(result.entity).toBe("someEntity");
+ expect(result.interpret).toBe(true);
+});
+
+it("should add keybind property for type 'keybind'", () => {
+ const current: MinecraftText = {};
+ const c: JSONContent = { type: "keybind", attrs: { key: "key.jump" } };
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result.keybind).toBe("key.jump");
+});
+
+it("should add selector property for type 'selector'", () => {
+ const current: MinecraftText = {};
+ const c: JSONContent = { type: "selector", attrs: { selector: "@a" } };
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result.selector).toBe("@a");
+});
+
+describe("events", () => {
+ it("should add proper URL properties for 'click_event'", () => {
+ outputVersion.set(versions[versions.length - 1]);
+ const current: VersionAgnosticText = { text: "Click me!" };
+ const c: JSONContent = {
+ type: "text",
+ text: "Click me!",
+ marks: [
+ {
+ type: "clickEvent",
+ attrs: { action: "open_url", value: "https://text.datapackhub.net/" },
+ },
+ ],
+ };
+ addTypeSpecificValues(current, c);
+ expect(current.click_event).toEqual({
+ action: "open_url",
+ url: "https://text.datapackhub.net/",
+ });
+ });
+
+ it("should add proper properties for 'click_event' (old format)", () => {
+ outputVersion.set(versions[0]);
+ const current: VersionAgnosticText = { text: "Click me!" };
+ const c: JSONContent = {
+ type: "text",
+ text: "Click me!",
+ marks: [
+ {
+ type: "clickEvent",
+ attrs: { action: "open_url", value: "https://text.datapackhub.net/" },
+ },
+ ],
+ };
+ addTypeSpecificValues(current, c);
+ expect(current.clickEvent).toEqual({
+ action: "open_url",
+ value: "https://text.datapackhub.net/",
+ });
+ });
+
+ it("should add proper command properties for 'click_event'", () => {
+ outputVersion.set(versions[versions.length - 1]);
+ const current: VersionAgnosticText = { text: "Click me!" };
+ const c: JSONContent = {
+ type: "text",
+ text: "Click me!",
+ marks: [
+ {
+ type: "clickEvent",
+ attrs: { action: "run_command", value: "/say Hello" },
+ },
+ ],
+ };
+ addTypeSpecificValues(current, c);
+ expect(current.click_event).toEqual({
+ action: "run_command",
+ command: "/say Hello",
+ });
+ });
+
+ it("should add proper value properties for 'click_event'", () => {
+ outputVersion.set(versions[versions.length - 1]);
+ const current: VersionAgnosticText = { text: "Click me!" };
+ const c: JSONContent = {
+ type: "text",
+ text: "Click me!",
+ marks: [
+ {
+ type: "clickEvent",
+ attrs: { action: "copy_to_clipboard", value: "Hello World!" },
+ },
+ ],
+ };
+ addTypeSpecificValues(current, c);
+ expect(current.click_event).toEqual({
+ action: "copy_to_clipboard",
+ value: "Hello World!",
+ });
+ });
+
+ it("should add proper page properties for 'click_event'", () => {
+ outputVersion.set(versions[versions.length - 1]);
+ const current: VersionAgnosticText = { text: "Click me!" };
+ const c: JSONContent = {
+ type: "text",
+ text: "Click me!",
+ marks: [
+ {
+ type: "clickEvent",
+ attrs: { action: "change_page", value: "2" },
+ },
+ ],
+ };
+ addTypeSpecificValues(current, c);
+ expect(current.click_event).toEqual({
+ action: "change_page",
+ page: "2",
+ });
+ });
+
+ it("should add proper dialog properties for 'click_event'", () => {
+ outputVersion.set(versions[versions.length - 1]);
+ const current: VersionAgnosticText = { text: "Click me!" };
+ const c: JSONContent = {
+ type: "text",
+ text: "Click me!",
+ marks: [
+ {
+ type: "clickEvent",
+ attrs: { action: "open_dialog", value: "dialog_id" },
+ },
+ ],
+ };
+ addTypeSpecificValues(current, c);
+ expect(current.click_event).toEqual({
+ action: "open_dialog",
+ dialog: "dialog_id",
+ });
+ });
+
+ it("should add proper properties for 'hover_event'", () => {
+ outputVersion.set(versions[versions.length - 1]);
+ const current: VersionAgnosticText = { text: "Hover me!" };
+ const c: JSONContent = {
+ type: "text",
+ text: "Hover me!",
+ marks: [
+ {
+ type: "hoverEvent",
+ attrs: {
+ action: "show_text",
+ value: { type: "text", text: "Hello!" },
+ },
+ },
+ ],
+ };
+ addTypeSpecificValues(current, c);
+ expect(current.hover_event).toEqual({
+ action: "show_text",
+ value: { type: "text", text: "Hello!" },
+ });
+ });
+
+ it("should add proper properties for 'hover_event' (old format)", () => {
+ outputVersion.set(versions[0]);
+ const current: VersionAgnosticText = { text: "Hover me!" };
+ const c: JSONContent = {
+ type: "text",
+ text: "Hover me!",
+ marks: [
+ {
+ type: "hoverEvent",
+ attrs: {
+ action: "show_text",
+ value: { type: "text", text: "Hello!" },
+ },
+ },
+ ],
+ };
+ addTypeSpecificValues(current, c);
+ expect(current.hoverEvent).toEqual({
+ action: "show_text",
+ contents: { type: "text", text: "Hello!" },
+ });
+ });
+});
+
+describe("object types", () => {
+ it("should add atlas and sprite for type 'atlas_object'", () => {
+ outputVersion.set(versions[versions.length - 1]); // Ensure exportVersion is set to a version that supports atlas_object
+ const current: MinecraftText = {};
+ const c: JSONContent = {
+ type: "atlas_object",
+ attrs: {
+ atlas: "someAtlas",
+ sprite: "someSprite",
+ },
+ };
+
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result.atlas).toBe("someAtlas");
+ expect(result.sprite).toBe("someSprite");
+ });
+
+ it("should add object, player, and hat for type 'player_object'", () => {
+ outputVersion.set(versions[versions.length - 1]); // Ensure exportVersion is set to a version that supports player_object
+ const current: MinecraftText = {};
+ const c: JSONContent = {
+ type: "player_object",
+ attrs: { player: { name: "Cbble_" }, hat: true },
+ };
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result.object).toBe("player");
+ expect(result.player).toEqual({ name: "Cbble_" });
+ expect(result.hat).toBe(true);
+ });
+
+ it("should be empty if version does not support 'atlas_object'", () => {
+ outputVersion.set(versions[0]);
+ const current: MinecraftText = {};
+ const c: JSONContent = {
+ type: "atlas_object",
+ attrs: {
+ atlas: "someAtlas",
+ sprite: "someSprite",
+ },
+ };
+
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result).toEqual({ text: "" });
+ });
+
+ it("should be empty if version does not support 'player_object'", () => {
+ outputVersion.set(versions[0]);
+ const current: MinecraftText = {};
+ const c: JSONContent = {
+ type: "player_object",
+ attrs: { player: { name: "Cbble_" }, hat: true },
+ };
+ const result = addTypeSpecificValues(current, c, false);
+ expect(result).toEqual({ text: "" });
+ });
+});
diff --git a/src/tests/unit/importing/snbt_importing.spec.ts b/src/tests/unit/importing/snbt_importing.spec.ts
new file mode 100644
index 0000000..cd1e09f
--- /dev/null
+++ b/src/tests/unit/importing/snbt_importing.spec.ts
@@ -0,0 +1,230 @@
+import { convertToTextOrEmpty, snbtToDocument } from "$lib/text/nbt/import";
+import { describe, expect, it } from "vitest";
+import { readTestDataFile, readTestJSONFile } from "../test_utils";
+
+it("should return a basic document", async () => {
+ const document = snbtToDocument(convertToTextOrEmpty('"test"'));
+ const expectedDocument = await readTestJSONFile("clean/json/simple_text.json");
+ expect(document).toEqual(expectedDocument);
+});
+
+it("should return a basic document (empty str)", () => {
+ const document = snbtToDocument(convertToTextOrEmpty(""));
+ const expectedDocument = { content: [], type: "doc" };
+ expect(document).toEqual(expectedDocument);
+});
+
+it("should apply a color to a text node", async () => {
+ const basicColorSNBT = await readTestDataFile("clean/snbt/basic_color.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks).toHaveLength(1);
+
+ const mark = textNode?.marks?.at(0);
+
+ expect(mark?.type).toMatch("textStyle");
+
+ expect(mark?.attrs?.color).toBeDefined();
+ expect(mark?.attrs?.color).toMatch("#AA0000");
+});
+
+it("should apply a hex color to a text node", async () => {
+ const basicColorSNBT = await readTestDataFile("clean/snbt/hex_color.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks).toHaveLength(1);
+
+ const mark = textNode?.marks?.at(0);
+
+ expect(mark?.type).toMatch("textStyle");
+
+ expect(mark?.attrs?.color).toBeDefined();
+ expect(mark?.attrs?.color).toMatch("#c0bb1e");
+});
+
+it("should apply a decimal shadow color to a text node", async () => {
+ const basicColorSNBT = await readTestDataFile("clean/snbt/base10_shadow_color.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks).toHaveLength(1);
+
+ const mark = textNode?.marks?.at(0);
+
+ expect(mark?.type).toMatch("shadowColor");
+
+ expect(mark?.attrs?.shadowColor).toBeDefined();
+ expect(mark?.attrs?.shadowColor).toMatch("#ffff84ff");
+});
+
+it("should apply a hexadecimal shadow color to a text node", async () => {
+ const basicColorSNBT = await readTestDataFile("clean/snbt/base16_shadow_color.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks).toHaveLength(1);
+
+ const mark = textNode?.marks?.at(0);
+
+ expect(mark?.type).toMatch("shadowColor");
+
+ expect(mark?.attrs?.shadowColor).toBeDefined();
+ expect(mark?.attrs?.shadowColor).toMatch("#ff0000ff");
+});
+
+it("should apply an array-based shadow color to a text node", async () => {
+ const basicColorSNBT = await readTestDataFile("clean/snbt/shadow_color_array.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks).toHaveLength(1);
+
+ const mark = textNode?.marks?.at(0);
+
+ expect(mark?.type).toMatch("shadowColor");
+
+ expect(mark?.attrs?.shadowColor).toBeDefined();
+ // Would be #FF8000FF, but ARGB to RGBA conversion is applied, so it becomes #8000FFFF
+ expect(mark?.attrs?.shadowColor).toMatch("#ff8000ff");
+});
+
+it("should successfully blank out an array-based shadow color if it is invalid", async () => {
+ const basicColorSNBT = await readTestDataFile("bad/shadow_color_array_invalid.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks).toHaveLength(1);
+
+ const mark = textNode?.marks?.at(0);
+
+ expect(mark?.type).toMatch("shadowColor");
+
+ expect(mark?.attrs?.shadowColor).toBeDefined();
+ expect(mark?.attrs?.shadowColor).toMatch("#008000ff");
+});
+
+it("should throw an error if the format is invalid", async () => {
+ const broken = await readTestDataFile("bad/broken.snbt");
+ const converted = convertToTextOrEmpty(broken);
+ expect(JSON.stringify(converted).includes("An error occurred while parsing the SNBT")).toBe(
+ true,
+ );
+});
+
+it("should return a one length array if passed with a single component", async () => {
+ const singleComponentSNBT = await readTestDataFile("clean/snbt/single_component.snbt");
+ const converted = convertToTextOrEmpty(singleComponentSNBT);
+ expect(converted.length).toEqual(1);
+ expect(converted[0]).toEqual({ text: "hi", color: "#c0bb1e" });
+});
+
+it("should return valid interactive components", async () => {
+ const interactiveSNBT = await readTestDataFile("clean/snbt/interactives.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(interactiveSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks?.[0]).toBeDefined();
+ expect(textNode?.marks?.[0].type).toBe("clickEvent");
+});
+
+it("should return valid interactive components with old formats", async () => {
+ const interactiveSNBT = await readTestDataFile("clean/snbt/interactives_old.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(interactiveSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks?.[0]).toBeDefined();
+ expect(textNode?.marks?.[0].type).toBe("clickEvent");
+});
+
+describe("handling text styling marks", () => {
+ it("should bold text styling to a text node", async () => {
+ const allTextStyleSNBT = await readTestDataFile("clean/snbt/all_text_style_marks.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
+
+ expect(textNode?.marks).toContainEqual({ type: "bold" });
+ });
+
+ it("should italic text styling to a text node", async () => {
+ const allTextStyleSNBT = await readTestDataFile("clean/snbt/all_text_style_marks.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
+
+ expect(textNode?.marks).toContainEqual({ type: "italic" });
+ });
+
+ it("should obfuscated text styling to a text node", async () => {
+ const allTextStyleSNBT = await readTestDataFile("clean/snbt/all_text_style_marks.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
+
+ expect(textNode?.marks).toContainEqual({ type: "obfuscated" });
+ });
+
+ it("should underline text styling to a text node", async () => {
+ const allTextStyleSNBT = await readTestDataFile("clean/snbt/all_text_style_marks.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
+
+ expect(textNode?.marks).toContainEqual({ type: "underline" });
+ });
+
+ it("should strike text styling to a text node", async () => {
+ const allTextStyleSNBT = await readTestDataFile("clean/snbt/all_text_style_marks.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
+
+ expect(textNode?.marks).toContainEqual({ type: "strike" });
+ });
+
+ it("should handle unicode characters", async () => {
+ const unicodeSNBT = await readTestDataFile("clean/snbt/unicode.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(unicodeSNBT));
+ const expectedDocument = await readTestJSONFile("clean/json/simple_unicode.json");
+ expect(document).toEqual(expectedDocument);
+ });
+});
+
+describe("handling invalid cases", () => {
+ it("should return nothing if its an empty string literal", () => {
+ const document = snbtToDocument(convertToTextOrEmpty('""'));
+ expect(document).toEqual({
+ type: "doc",
+ content: [],
+ });
+ });
+
+ it("should return nothing if its an empty string", () => {
+ const document = snbtToDocument(convertToTextOrEmpty(""));
+ expect(document).toEqual({
+ type: "doc",
+ content: [],
+ });
+ });
+});
+
+describe("handling extra", () => {
+ it("should apply text styling (bold)", async () => {
+ const boldSNBT = await readTestDataFile("clean/snbt/extra_test.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(boldSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks).toHaveLength(1);
+ expect(textNode?.marks?.[0].type).toMatch("bold");
+
+ const translateNode = document.content?.[0]?.content?.at(-1);
+ expect(translateNode?.marks).toBeDefined();
+ expect(translateNode?.marks).toHaveLength(1);
+ expect(translateNode?.marks?.[0].type).toMatch("bold");
+ });
+});
diff --git a/src/tests/unit/importing/source_props.spec.ts b/src/tests/unit/importing/source_props.spec.ts
new file mode 100644
index 0000000..4e8a30b
--- /dev/null
+++ b/src/tests/unit/importing/source_props.spec.ts
@@ -0,0 +1,194 @@
+import { convertToTextOrEmpty, snbtToDocument } from "$lib/text/nbt/import";
+import { expect, it } from "vitest";
+import { readTestDataFile } from "../test_utils";
+
+it("should properly apply the font properties", async () => {
+ const fontsSNBT = await readTestDataFile("clean/snbt/fonts.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(fontsSNBT));
+ const textNode = document.content?.[0]?.content?.[0];
+ expect(textNode?.marks).toBeDefined();
+ expect(textNode?.marks).toHaveLength(1);
+
+ const mark = textNode?.marks?.at(0);
+
+ expect(mark?.type).toMatch("textStyle");
+
+ expect(mark?.attrs?.font).toBeDefined();
+ expect(mark?.attrs?.font).toMatch("minecraft:illageralt");
+});
+
+it("should properly apply text properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+
+ expect(node[0].type).toMatch("text");
+ expect(node[0].text).toMatch("hi");
+});
+
+it("should properly apply translate properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[1].attrs!;
+
+ expect(node[1].type).toMatch("translate");
+ expect(node[1].attrs).toBeDefined();
+ expect(attrs.key).toBeDefined();
+ expect(attrs.key).toMatch("hi");
+ expect(attrs.fallback).toBeDefined();
+ expect(attrs.fallback).toMatch("hi");
+ expect(attrs.params).toBeDefined();
+});
+
+it("should properly apply storage NBT properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[2].attrs!;
+
+ expect(node[2].type).toMatch("storage_nbt");
+ expect(node[2].attrs).toBeDefined();
+ expect(attrs.storage).toBeDefined();
+ expect(attrs.storage).toMatch("hi");
+ expect(attrs.nbt).toBeDefined();
+ expect(attrs.nbt).toMatch("Items[0].id");
+ expect(attrs.interpret).toBeDefined();
+ expect(attrs.interpret).toEqual(true);
+});
+
+it("should properly apply block NBT properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[3].attrs!;
+
+ expect(node[3].type).toMatch("block_nbt");
+ expect(node[3].attrs).toBeDefined();
+ expect(attrs.block).toBeDefined();
+ expect(attrs.block).toMatch("blah");
+ expect(attrs.nbt).toBeDefined();
+ expect(attrs.nbt).toMatch("Items[0].id");
+ expect(attrs.interpret).toBeDefined();
+ expect(attrs.interpret).toEqual(false);
+});
+
+it("should properly apply entity NBT properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[4].attrs!;
+
+ expect(node[4].type).toMatch("entity_nbt");
+ expect(node[4].attrs).toBeDefined();
+ expect(attrs.entity).toBeDefined();
+ expect(attrs.entity).toMatch("blah");
+ expect(attrs.nbt).toBeDefined();
+ expect(attrs.nbt).toMatch("Items[0].id");
+ expect(attrs.interpret).toBeDefined();
+ expect(attrs.interpret).toEqual(false);
+});
+
+it("should properly apply score properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[5].attrs!;
+
+ expect(node[5].type).toMatch("score");
+ expect(node[5].attrs).toBeDefined();
+ expect(attrs.name).toBeDefined();
+ expect(attrs.name).toMatch("@s");
+ expect(attrs.objective).toBeDefined();
+ expect(attrs.objective).toMatch("money");
+});
+it("should properly apply selector properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[6].attrs!;
+
+ expect(node[6].type).toMatch("selector");
+ expect(node[6].attrs).toBeDefined();
+ expect(attrs.selector).toBeDefined();
+ expect(attrs.selector).toMatch("@p");
+});
+
+it("should properly apply keybind properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[7].attrs!;
+
+ expect(node[7].type).toMatch("keybind");
+ expect(node[7].attrs).toBeDefined();
+ expect(attrs.key).toBeDefined();
+ expect(attrs.key).toMatch("key.jump");
+});
+
+it("should properly apply atlas object properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[8].attrs!;
+
+ expect(node[8].type).toMatch("atlas_object");
+ expect(node[8].attrs).toBeDefined();
+ expect(attrs.atlas).toBeDefined();
+ expect(attrs.atlas).toMatch("Banana");
+ expect(attrs.sprite).toMatch("blah");
+});
+
+it("should properly apply player object properties", async () => {
+ const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
+ const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
+ const textNode = document.content![0];
+ expect(textNode).toBeDefined();
+ expect(textNode.type).toMatch("paragraph");
+
+ const node = textNode.content!;
+ const attrs = node[9].attrs!;
+
+ expect(node[9].type).toMatch("player_object");
+ expect(node[9].attrs).toBeDefined();
+ expect(attrs.player).toBeDefined();
+ expect(attrs.player.name).toBeDefined();
+ expect(attrs.player.name).toMatch("Cbble_");
+ expect(attrs.hat).toEqual(true);
+});
diff --git a/src/tests/unit/misc/utils.spec.ts b/src/tests/unit/misc/utils.spec.ts
new file mode 100644
index 0000000..0d58584
--- /dev/null
+++ b/src/tests/unit/misc/utils.spec.ts
@@ -0,0 +1,157 @@
+import {
+ defaultColorLUT,
+ defaultColorReverseLUT,
+ isDefinedTextObject,
+ findMarkType,
+ trueMarkOrUndefined,
+ unescapeUnicode,
+ mapToHexByte,
+ stripTypeSuffixes,
+ rgbaToArgbHex,
+ argbToRgbaHex,
+} from "$lib/text/utils";
+import type { JSONContent } from "@tiptap/core";
+import { describe, expect, it } from "vitest";
+
+describe("isDefinedTextObject", () => {
+ it("should report defined object with minimal object", () => {
+ const obj = { text: "Hello" };
+ const result = isDefinedTextObject(obj);
+ expect(result).toBe(true);
+ });
+
+ it("should report false with minimal object", () => {
+ const obj = "Hello";
+ const result = isDefinedTextObject(obj);
+ expect(result).toBe(false);
+ });
+
+ it("should report false with object missing text", () => {
+ const obj = { color: "red" };
+ const result = isDefinedTextObject(obj);
+ expect(result).toBe(false);
+ });
+
+ it("should report true with object having extra properties", () => {
+ const obj = { text: "Hello", color: "blue", bold: true };
+ const result = isDefinedTextObject(obj);
+ expect(result).toBe(true);
+ });
+});
+
+describe("unescapeUnicode", () => {
+ it("should unescape unicode sequences", () => {
+ const input = "Hello \\u0041\\u0042\\u0043";
+ const output = unescapeUnicode(input);
+ expect(output).toBe("Hello ABC");
+ });
+ it("should handle strings without unicode sequences", () => {
+ const input = "Hello World!";
+ const output = unescapeUnicode(input);
+ expect(output).toBe("Hello World!");
+ });
+ it("should handle mixed content", () => {
+ const input = "Smile: \\u263A and Heart: \\u2764";
+ const output = unescapeUnicode(input);
+ expect(output).toBe("Smile: ☺ and Heart: ❤");
+ });
+ it("should handle consecutive unicode sequences", () => {
+ const input = "\\u0048\\u0045\\u004C\\u004C\\u004F";
+ const output = unescapeUnicode(input);
+ expect(output).toBe("HELLO");
+ });
+ it("should correctly handle invalid unicode sequences", () => {
+ const input = "\\uXXXX";
+ const output = unescapeUnicode(input);
+ expect(output).toBe("\\uXXXX");
+ });
+});
+
+describe("trueMarkOrUndefined", () => {
+ it("should return true for true input", () => {
+ expect(
+ trueMarkOrUndefined({ type: "text", marks: [{ type: "bold" }], text: "hello" }, "bold"),
+ ).toBe(true);
+ });
+
+ it("should return undefined for false input", () => {
+ expect(
+ trueMarkOrUndefined(
+ { type: "text", marks: [{ type: "italic" }], text: "hello" },
+ "bold",
+ ),
+ ).toBeUndefined();
+ });
+});
+
+describe("defaultColorReverseLUT", () => {
+ it("should return hex code for known color name", () => {
+ expect(defaultColorReverseLUT("red")).toBe("#FF5555");
+ });
+
+ it("should return input for unknown color name", () => {
+ expect(defaultColorReverseLUT("unknown_color")).toBe("unknown_color");
+ });
+ it("should return undefined for null or empty input", () => {
+ expect(defaultColorReverseLUT("")).toBeUndefined();
+ expect(defaultColorReverseLUT("null")).toBeUndefined();
+ });
+});
+
+describe("defaultColorLUT", () => {
+ it("should return color name for known hex code", () => {
+ expect(defaultColorLUT("#FF5555")).toBe("red");
+ });
+ it("should return input for unknown hex code", () => {
+ expect(defaultColorLUT("#123456")).toBe("#123456");
+ });
+ it("should return undefined for null or empty input", () => {
+ expect(defaultColorLUT("")).toBeUndefined();
+ expect(defaultColorLUT("null")).toBeUndefined();
+ });
+});
+
+it("findMarkType finds the correct mark", () => {
+ const contentWithMarks: JSONContent = {
+ type: "text",
+ marks: [{ type: "bold" }, { type: "italic" }],
+ text: "Sample Text",
+ };
+ expect(findMarkType(contentWithMarks, "bold")).toBeDefined();
+ expect(findMarkType(contentWithMarks, "italic")).toBeDefined();
+ expect(findMarkType(contentWithMarks, "underline")).toBeUndefined();
+});
+
+it("should convert number to hex byte string", () => {
+ expect(mapToHexByte(0)).toBe("00");
+ expect(mapToHexByte(1 / 255)).toBe("01");
+ expect(mapToHexByte(1 / 16)).toBe("10");
+ expect(mapToHexByte(1)).toBe("ff");
+ expect(mapToHexByte(1.2)).toBe("00");
+});
+
+it("should strip type suffixes from input string", () => {
+ expect(stripTypeSuffixes("1L")).toBe("1");
+ expect(stripTypeSuffixes("1.0F")).toBe("1.0");
+ expect(stripTypeSuffixes("1.0D")).toBe("1.0");
+ expect(stripTypeSuffixes("1b")).toBe("1");
+ expect(stripTypeSuffixes("1s")).toBe("1");
+ expect(stripTypeSuffixes("1i")).toBe("1");
+ expect(stripTypeSuffixes("1.0")).toBe("1.0");
+});
+
+it("should convert rgba hex to argb hex", () => {
+ expect(rgbaToArgbHex("#FF0000FF")).toBe("#FFFF0000");
+ expect(rgbaToArgbHex("#00FF00FF")).toBe("#FF00FF00");
+ expect(rgbaToArgbHex("#0000FFFF")).toBe("#FF0000FF");
+ expect(rgbaToArgbHex("FFFFFFFF")).toBe("#FFFFFFFF");
+ expect(rgbaToArgbHex("00000000")).toBe("#00000000");
+});
+
+it("should convert argb hex to rgba hex", () => {
+ expect(argbToRgbaHex("#FFFF0000")).toBe("#FF0000FF");
+ expect(argbToRgbaHex("#FF00FF00")).toBe("#00FF00FF");
+ expect(argbToRgbaHex("FF0000FF")).toBe("#0000FFFF");
+ expect(argbToRgbaHex("FFFFFFFF")).toBe("#FFFFFFFF");
+ expect(argbToRgbaHex("00000000")).toBe("#00000000");
+});
diff --git a/src/tests/unit/optimising_mc_json.spec.ts b/src/tests/unit/optimising_mc_json.spec.ts
deleted file mode 100644
index 416ffee..0000000
--- a/src/tests/unit/optimising_mc_json.spec.ts
+++ /dev/null
@@ -1,103 +0,0 @@
-import { optimise } from "$lib/text/nbt/optimiser";
-import { describe, it, expect } from "vitest";
-
-// Minimal mock types for test compatibility
-type StringyMCText = string | { [key: string]: any };
-
-describe("optimise", () => {
- it("returns empty string array if input is empty", () => {
- expect(optimise([])).toEqual([""]);
- });
-
- it("returns empty string array if input is just an empty string", () => {
- expect(optimise([""])).toEqual([""]);
- });
-
- it("removes undefined properties and flattens objects with only text", () => {
- const input: StringyMCText[] = [
- { text: "Hello", color: undefined, bold: undefined },
- { text: "World" },
- ];
- expect(optimise(input)).toEqual(["HelloWorld"]);
- });
-
- it("merges consecutive strings", () => {
- const input: StringyMCText[] = ["Hello ", "World", "!", { text: "Test" }];
- expect(optimise(input)).toEqual(["Hello World!Test"]);
- });
-
- it("merges whitespace with previous component", () => {
- const input: StringyMCText[] = [{ text: "Test" }, " ", { text: "World" }];
- expect(optimise(input)).toEqual(["Test World"]);
- });
-
- it("merges whitespace forwards", () => {
- const input: StringyMCText[] = [" ", { text: "World" }];
- expect(optimise(input)).toEqual([" World"]);
- });
-
- it("merges whitespace backwards", () => {
- const input: StringyMCText[] = [{ text: "Test" }, " "];
- expect(optimise(input)).toEqual(["Test "]);
- });
-
- it("groups objects with shared style properties", () => {
- const input: StringyMCText[] = [
- { text: "A", color: "red", bold: true },
- { text: "B", color: "red", bold: true },
- { text: "C", color: "blue" },
- ];
- const result = optimise(input);
- expect(result[1]).toMatchObject({
- color: "red",
- bold: true,
- text: "AB",
- });
- expect(result[2]).toMatchObject({ color: "blue", text: "C" });
- });
-
- it("removes leading empty string if followed by a string", () => {
- const input: StringyMCText[] = ["foo", "bar"];
- expect(optimise(input)).toEqual(["foobar"]);
- });
-
- it("removes leading empty string if followed by object without style", () => {
- const input: StringyMCText[] = [{ text: "foo" }];
- expect(optimise(input)).toEqual(["foo"]);
- });
-
- it("handles item lore mode by prepending lore object", () => {
- const input: StringyMCText[] = [{ text: "lore" }];
- expect(optimise(input, true)).toEqual([
- { italic: false, color: "white", text: "" },
- "lore",
- ]);
- });
-
- it("merges objects with identical interactivity properties", () => {
- const input: StringyMCText[] = [
- { text: "A", click_event: { action: "run_command", command: "/a" } },
- { text: "B", click_event: { action: "run_command", command: "/a" } },
- { text: "C", click_event: { action: "run_command", command: "/b" } },
- ];
- const result = optimise(input);
- expect(result[1]).toMatchObject({
- click_event: { action: "run_command", command: "/a" },
- text: "AB",
- });
- expect(result[2]).toMatchObject({
- click_event: { action: "run_command", command: "/b" },
- text: "C",
- });
- });
-
- it("does not merge objects with different style/interactivity", () => {
- const input: StringyMCText[] = [
- { text: "A", color: "red" },
- { text: "B", color: "blue" },
- ];
- const result = optimise(input);
- expect(result[1]).toMatchObject({ color: "red", text: "A" });
- expect(result[2]).toMatchObject({ color: "blue", text: "B" });
- });
-});
diff --git a/src/tests/unit/snbt_importing.spec.ts b/src/tests/unit/snbt_importing.spec.ts
deleted file mode 100644
index 3a99101..0000000
--- a/src/tests/unit/snbt_importing.spec.ts
+++ /dev/null
@@ -1,412 +0,0 @@
-import {
- convertToTextOrEmpty,
- snbtToDocument,
-} from "../../lib/text/nbt/import";
-import { describe, expect, it } from "vitest";
-import { readTestDataFile, readTestJSONFile } from "./test_utils";
-
-it("should return a basic document", async () => {
- const document = snbtToDocument(convertToTextOrEmpty('"test"'));
- const expectedDocument = await readTestJSONFile(
- "clean/json/simple_text_tiptap.json",
- );
- expect(document).toEqual(expectedDocument);
-});
-
-it("should return a basic document (empty str)", async () => {
- const document = snbtToDocument(convertToTextOrEmpty(""));
- const expectedDocument = { content: [], type: "doc" };
- expect(document).toEqual(expectedDocument);
-});
-
-it("should apply a color to a text node", async () => {
- const basicColorSNBT = await readTestDataFile("clean/snbt/basic_color.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks).toHaveLength(1);
-
- const mark = textNode?.marks?.at(0);
-
- expect(mark?.type).toMatch("textStyle");
-
- expect(mark?.attrs?.color).toBeDefined();
- expect(mark?.attrs?.color).toMatch("#AA0000");
-});
-
-it("should apply a hex color to a text node", async () => {
- const basicColorSNBT = await readTestDataFile("clean/snbt/hex_color.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks).toHaveLength(1);
-
- const mark = textNode?.marks?.at(0);
-
- expect(mark?.type).toMatch("textStyle");
-
- expect(mark?.attrs?.color).toBeDefined();
- expect(mark?.attrs?.color).toMatch("#c0bb1e");
-});
-
-it.skip("should apply a decimal shadow color to a text node", async () => {
- const basicColorSNBT = await readTestDataFile(
- "clean/snbt/base10_shadow_color.snbt",
- );
- const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks).toHaveLength(1);
-
- const mark = textNode?.marks?.at(0);
-
- expect(mark?.type).toMatch("shadowColor");
-
- expect(mark?.attrs?.shadowColor).toBeDefined();
- expect(mark?.attrs?.shadowColor).toMatch("#ff0000");
-});
-
-it.skip("should apply a hexadecimal shadow color to a text node", async () => {
- const basicColorSNBT = await readTestDataFile(
- "clean/snbt/base16_shadow_color.snbt",
- );
- const document = snbtToDocument(convertToTextOrEmpty(basicColorSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks).toHaveLength(1);
-
- const mark = textNode?.marks?.at(0);
-
- expect(mark?.type).toMatch("shadowColor");
-
- expect(mark?.attrs?.shadowColor).toBeDefined();
- expect(mark?.attrs?.shadowColor).toMatch("#ff0000");
-});
-
-it("should throw an error if the format is invalid", async () => {
- const broken = await readTestDataFile("bad/broken.snbt");
- const converted = convertToTextOrEmpty(broken);
- expect(
- JSON.stringify(converted).includes(
- "An error occurred while parsing the SNBT",
- ),
- ).toBe(true);
-});
-
-it("should return a one length array if passed with a single component", async () => {
- const singleComponentSNBT = await readTestDataFile(
- "clean/snbt/single_component.snbt",
- );
- const converted = convertToTextOrEmpty(singleComponentSNBT);
- expect(converted.length).toEqual(1);
- expect(converted[0]).toEqual({ text: "hi", color: "#c0bb1e" });
-});
-
-describe("handling text styling marks", () => {
- it("should bold text styling to a text node", async () => {
- const allTextStyleSNBT = await readTestDataFile(
- "clean/snbt/all_text_style_marks.snbt",
- );
- const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
-
- expect(textNode?.marks).toContainEqual({ type: "bold" });
- });
-
- it("should italic text styling to a text node", async () => {
- const allTextStyleSNBT = await readTestDataFile(
- "clean/snbt/all_text_style_marks.snbt",
- );
- const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
-
- expect(textNode?.marks).toContainEqual({ type: "italic" });
- });
-
- it("should obfuscated text styling to a text node", async () => {
- const allTextStyleSNBT = await readTestDataFile(
- "clean/snbt/all_text_style_marks.snbt",
- );
- const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
-
- expect(textNode?.marks).toContainEqual({ type: "obfuscated" });
- });
-
- it("should underline text styling to a text node", async () => {
- const allTextStyleSNBT = await readTestDataFile(
- "clean/snbt/all_text_style_marks.snbt",
- );
- const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
-
- expect(textNode?.marks).toContainEqual({ type: "underline" });
- });
-
- it("should strike text styling to a text node", async () => {
- const allTextStyleSNBT = await readTestDataFile(
- "clean/snbt/all_text_style_marks.snbt",
- );
- const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
-
- expect(textNode?.marks).toContainEqual({ type: "strike" });
- });
-
- it("should strike text styling to a text node", async () => {
- const allTextStyleSNBT = await readTestDataFile(
- "clean/snbt/all_text_style_marks.snbt",
- );
- const document = snbtToDocument(convertToTextOrEmpty(allTextStyleSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks?.length).toBeGreaterThanOrEqual(1);
-
- expect(textNode?.marks).toContainEqual({ type: "strike" });
- });
-});
-
-it("should return nothing if its an empty string literal", () => {
- const document = snbtToDocument(convertToTextOrEmpty('""'));
- expect(document).toEqual({
- type: "doc",
- content: [],
- });
-});
-
-it("should return nothing if its an empty string", () => {
- const document = snbtToDocument(convertToTextOrEmpty(""));
- expect(document).toEqual({
- type: "doc",
- content: [],
- });
-});
-
-it("should handle unicode characters", async () => {
- const unicodeSNBT = await readTestDataFile("clean/snbt/unicode.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(unicodeSNBT));
- const expectedDocument = await readTestJSONFile(
- "clean/json/simple_unicode_tiptap.json",
- );
- expect(document).toEqual(expectedDocument);
-});
-
-it("should properly apply the font properties", async () => {
- const fontsSNBT = await readTestDataFile("clean/snbt/fonts.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(fontsSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks).toHaveLength(1);
-
- const mark = textNode?.marks?.at(0);
-
- expect(mark?.type).toMatch("textStyle");
-
- expect(mark?.attrs?.font).toBeDefined();
- expect(mark?.attrs?.font).toMatch("minecraft:illageralt");
-});
-
-describe("applying source props", () => {
- it("should properly apply text properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
-
- expect(node[0].type).toMatch("text");
- expect(node[0].text).toMatch("hi");
- });
-
- it("should properly apply translate properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[1].attrs!;
-
- expect(node[1].type).toMatch("translate");
- expect(node[1].attrs).toBeDefined();
- expect(attrs.key).toBeDefined();
- expect(attrs.key).toMatch("hi");
- expect(attrs.fallback).toBeDefined();
- expect(attrs.fallback).toMatch("hi");
- expect(attrs.params).toBeDefined();
- // TODO: add checks for the `with` array
- });
-
- it("should properly apply storage NBT properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[2].attrs!;
-
- expect(node[2].type).toMatch("storage_nbt");
- expect(node[2].attrs).toBeDefined();
- expect(attrs.storage).toBeDefined();
- expect(attrs.storage).toMatch("hi");
- expect(attrs.nbt).toBeDefined();
- expect(attrs.nbt).toMatch("Items[0].id");
- expect(attrs.interpret).toBeDefined();
- expect(attrs.interpret).toEqual(true);
- });
-
- it("should properly apply block NBT properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[3].attrs!;
-
- expect(node[3].type).toMatch("block_nbt");
- expect(node[3].attrs).toBeDefined();
- expect(attrs.block).toBeDefined();
- expect(attrs.block).toMatch("blah");
- expect(attrs.nbt).toBeDefined();
- expect(attrs.nbt).toMatch("Items[0].id");
- expect(attrs.interpret).toBeDefined();
- expect(attrs.interpret).toEqual(false);
- });
-
- it("should properly apply entity NBT properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[4].attrs!;
-
- expect(node[4].type).toMatch("entity_nbt");
- expect(node[4].attrs).toBeDefined();
- expect(attrs.entity).toBeDefined();
- expect(attrs.entity).toMatch("blah");
- expect(attrs.nbt).toBeDefined();
- expect(attrs.nbt).toMatch("Items[0].id");
- expect(attrs.interpret).toBeDefined();
- expect(attrs.interpret).toEqual(false);
- });
-
- it("should properly apply score properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[5].attrs!;
-
- expect(node[5].type).toMatch("score");
- expect(node[5].attrs).toBeDefined();
- expect(attrs.name).toBeDefined();
- expect(attrs.name).toMatch("@s");
- expect(attrs.objective).toBeDefined();
- expect(attrs.objective).toMatch("money");
- });
- it("should properly apply selector properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[6].attrs!;
-
- expect(node[6].type).toMatch("selector");
- expect(node[6].attrs).toBeDefined();
- expect(attrs.selector).toBeDefined();
- expect(attrs.selector).toMatch("@p");
- });
-
- it("should properly apply keybind properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[7].attrs!;
-
- expect(node[7].type).toMatch("keybind");
- expect(node[7].attrs).toBeDefined();
- expect(attrs.key).toBeDefined();
- expect(attrs.key).toMatch("key.jump");
- });
-
- it("should properly apply atlas object properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[8].attrs!;
-
- expect(node[8].type).toMatch("atlas_object");
- expect(node[8].attrs).toBeDefined();
- expect(attrs.atlas).toBeDefined();
- expect(attrs.atlas).toMatch("Banana");
- expect(attrs.sprite).toMatch("blah");
- });
-
- it("should properly apply player object properties", async () => {
- const sourceSNBT = await readTestDataFile("clean/snbt/source.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(sourceSNBT));
- const textNode = document.content![0];
- expect(textNode).toBeDefined();
- expect(textNode.type).toMatch("paragraph");
-
- const node = textNode.content!;
- const attrs = node[9].attrs!;
-
- expect(node[9].type).toMatch("player_object");
- expect(node[9].attrs).toBeDefined();
- expect(attrs.player).toBeDefined();
- expect(attrs.player.name).toBeDefined();
- expect(attrs.player.name).toMatch("Cbble_");
- expect(attrs.hat).toEqual(true);
- });
-});
-
-describe("handling extra", () => {
- it("should apply text styling (bold)", async () => {
- const boldSNBT = await readTestDataFile("clean/snbt/extra_test.snbt");
- const document = snbtToDocument(convertToTextOrEmpty(boldSNBT));
- const textNode = document.content?.[0]?.content?.[0];
- expect(textNode?.marks).toBeDefined();
- expect(textNode?.marks).toHaveLength(1);
- expect(textNode?.marks?.[0].type).toMatch("bold");
-
- const translateNode = document.content?.[0]?.content?.at(-1);
- expect(translateNode?.marks).toBeDefined();
- expect(translateNode?.marks).toHaveLength(1);
- expect(translateNode?.marks?.[0].type).toMatch("bold");
- });
-});
diff --git a/src/tests/unit/test_utils.ts b/src/tests/unit/test_utils.ts
index dfd4c20..968910d 100644
--- a/src/tests/unit/test_utils.ts
+++ b/src/tests/unit/test_utils.ts
@@ -2,10 +2,10 @@ import type { PathLike } from "fs";
import { readFile } from "fs/promises";
export async function readTestDataFile(filePath: PathLike): Promise
{
- return await readFile(`${import.meta.dirname}/data/${filePath}`, "utf8");
+ return await readFile(`${import.meta.dirname}/data/${filePath}`, "utf8");
}
export async function readTestJSONFile(filePath: PathLike): Promise {
- const fileContent = await readTestDataFile(filePath);
- return JSON.parse(fileContent);
+ const fileContent = await readTestDataFile(filePath);
+ return JSON.parse(fileContent);
}
diff --git a/src/tests/unit/translating_mc_json.spec.ts b/src/tests/unit/translating_mc_json.spec.ts
deleted file mode 100644
index cc57011..0000000
--- a/src/tests/unit/translating_mc_json.spec.ts
+++ /dev/null
@@ -1,256 +0,0 @@
-import { addTypeSpecificValues, translateJSON } from "$lib/text/nbt/export";
-import {
- versions,
- type MinecraftText,
- type TranslateOptions,
-} from "$lib/types";
-import type { JSONContent } from "@tiptap/core";
-import { describe, expect, it } from "vitest";
-import { readTestDataFile, readTestJSONFile } from "./test_utils";
-import { outputVersion } from "$lib/stores";
-
-describe("translate", () => {
- it("should return a basic string", () => {
- const document = {
- type: "doc",
- content: [
- { type: "paragraph", content: [{ type: "text", text: "test" }] },
- ],
- };
- const snbt = translateJSON(document, {
- exportType: "standard",
- optimise: true,
- });
- expect(snbt).toEqual('"test"');
- });
-
- it("should return a basic color string", async () => {
- const document = await readTestDataFile(
- "clean/json/basic_color_tiptap.json",
- );
- const snbt = translateJSON(JSON.parse(document), {
- exportType: "standard",
- optimise: true,
- });
- expect(JSON.parse(snbt)).toEqual(["", { text: "test", color: "dark_red" }]);
- });
-
- const baseOptions: TranslateOptions = {
- exportType: "standard",
- optimise: false,
- };
-
- it("returns waiting message for empty content", () => {
- const json: JSONContent = {};
- const result = translateJSON(json, baseOptions);
- expect(result).toBeOneOf([
- "waiting for input...",
- "🤓 <- kevin is waiting for you to type something",
- ]);
- });
-
- it("translates simple text node", () => {
- const json: JSONContent = {
- content: [
- {
- content: [
- {
- type: "text",
- text: "Hello",
- marks: [],
- },
- ],
- },
- ],
- };
- const result = translateJSON(json, baseOptions);
- expect(result).toContain("Hello");
- expect(result).not.toContain("color");
- });
-
- it("applies bold and italic marks", () => {
- const json: JSONContent = {
- content: [
- {
- content: [
- {
- type: "text",
- text: "BoldItalic",
- marks: [{ type: "bold" }, { type: "italic" }],
- },
- ],
- },
- ],
- };
- const result = translateJSON(json, baseOptions);
- expect(result).toContain("BoldItalic");
- expect(result).toContain('"bold":true');
- expect(result).toContain('"italic":true');
- });
-
- it.skip("handles shadowColor mark", () => {
- const json: JSONContent = {
- content: [
- {
- content: [
- {
- type: "text",
- text: "Shadow",
- marks: [
- {
- type: "shadowColor",
- attrs: { shadowColor: "#ff00ff" },
- },
- ],
- },
- ],
- },
- ],
- };
- const result = translateJSON(json, baseOptions);
- expect(result).toContain('"shadow_color":-65281');
- });
-
- it("handles multiple paragraphs with newlines", () => {
- const json: JSONContent = {
- content: [
- {
- content: [{ type: "text", text: "First", marks: [] }],
- },
- {
- content: [{ type: "text", text: "Second", marks: [] }],
- },
- ],
- };
- const result = translateJSON(json, baseOptions);
- expect(result).toContain("First");
- expect(result).toContain("Second");
- expect(result).toContain("\\n");
- });
-
- it("optimises output when optimise=true", () => {
- const json: JSONContent = {
- content: [
- {
- content: [
- { type: "text", text: "A", marks: [] },
- { type: "text", text: "B", marks: [] },
- ],
- },
- ],
- };
- const result = translateJSON(json, { ...baseOptions, optimise: true });
- expect(result).toContain("A");
- expect(result).toContain("B");
- });
-
- it("uses older format output when exportVersion=old", async () => {
- const json: JSONContent = (await readTestJSONFile(
- "clean/json/interactives_tiptap.json",
- )) as JSONContent;
- outputVersion.set(versions[0]);
- const result = translateJSON(json, {
- ...baseOptions,
- });
- expect(JSON.parse(result)).toHaveProperty("[1].clickEvent");
- expect(JSON.parse(result)).not.toHaveProperty("[1].click_event");
- expect(JSON.parse(result)).toHaveProperty("[1].hoverEvent");
- expect(JSON.parse(result)).not.toHaveProperty("[1].hover_event");
- });
-
- it("handles exportType=item_lore", () => {
- const json: JSONContent = {
- content: [
- {
- content: [{ type: "text", text: "Lore", marks: [] }],
- },
- ],
- };
- const result = translateJSON(json, {
- ...baseOptions,
- exportType: "item_lore",
- });
- expect(result).toContain("Lore");
- expect(result.startsWith("[")).toBe(true);
- });
-
- it("handles unknown exportType gracefully", () => {
- const json: JSONContent = {
- content: [],
- };
- const result = translateJSON(json, {
- ...baseOptions,
- exportType: "unknown" as any,
- });
- expect(result).toBe("[]");
- });
-});
-
-describe("adding type props", () => {
- it("should add text property for type 'text'", () => {
- const current: MinecraftText = {};
- const c: JSONContent = { type: "text", text: "hello" };
- const result = addTypeSpecificValues(current, c, false);
- expect(result.text).toBe("hello");
- });
-
- it("should add score property for type 'score'", () => {
- const current: MinecraftText = {};
- const c: JSONContent = {
- type: "score",
- attrs: { name: "player", objective: "obj" },
- };
- const result = addTypeSpecificValues(current, c, false);
- expect(result.score).toEqual({ name: "player", objective: "obj" });
- });
-
- it("should add translate, with, and fallback for type 'translate'", () => {
- const current: MinecraftText = {};
- const c: JSONContent = {
- type: "translate",
- attrs: {
- key: "translation.key",
- params: ["param1", "param2"],
- fallback: "fallback text",
- },
- };
- const result = addTypeSpecificValues(current, c, false);
- expect(result.translate).toBe("translation.key");
- expect(result.with).toEqual(["param1", "param2"]);
- expect(result.fallback).toBe("fallback text");
- });
-
- it("should add nbt, storage, block, entity, interpret for nbt types", () => {
- const current: MinecraftText = {};
- const c: JSONContent = {
- type: "storage_nbt",
- attrs: {
- nbt: "someNbt",
- storage: "someStorage",
- block: "someBlock",
- entity: "someEntity",
- interpret: true,
- },
- };
- const result = addTypeSpecificValues(current, c, false);
- expect(result.nbt).toBe("someNbt");
- expect(result.storage).toBe("someStorage");
- expect(result.block).toBe("someBlock");
- expect(result.entity).toBe("someEntity");
- expect(result.interpret).toBe(true);
- });
-
- it("should add keybind property for type 'keybind'", () => {
- const current: MinecraftText = {};
- const c: JSONContent = { type: "keybind", attrs: { key: "key.jump" } };
- const result = addTypeSpecificValues(current, c, false);
- expect(result.keybind).toBe("key.jump");
- });
-
- it("should add selector property for type 'selector'", () => {
- const current: MinecraftText = {};
- const c: JSONContent = { type: "selector", attrs: { selector: "@a" } };
- const result = addTypeSpecificValues(current, c, false);
- expect(result.selector).toBe("@a");
- });
-});
diff --git a/src/tests/unit/utils.spec.ts b/src/tests/unit/utils.spec.ts
deleted file mode 100644
index a60581c..0000000
--- a/src/tests/unit/utils.spec.ts
+++ /dev/null
@@ -1,118 +0,0 @@
-import {
- defaultColorLUT,
- defaultColorReverseLUT,
- isDefinedTextObject,
- isMarkType,
- trueMarkOrUndefined,
- unescapeUnicode,
-} from "$lib/text/utils";
-import type { JSONContent } from "@tiptap/core";
-import { it } from "vitest";
-import { describe, expect } from "vitest";
-
-describe("isDefinedTextObject", () => {
- it("should report defined object with minimal object", () => {
- const obj = { text: "Hello" };
- const result = isDefinedTextObject(obj);
- expect(result).toBe(true);
- });
-
- it("should report false with minimal object", () => {
- const obj = "Hello";
- const result = isDefinedTextObject(obj);
- expect(result).toBe(false);
- });
-
- it("should report false with object missing text", () => {
- const obj = { color: "red" };
- const result = isDefinedTextObject(obj);
- expect(result).toBe(false);
- });
-
- it("should report true with object having extra properties", () => {
- const obj = { text: "Hello", color: "blue", bold: true };
- const result = isDefinedTextObject(obj);
- expect(result).toBe(true);
- });
-});
-
-describe("unescapeUnicode", () => {
- it("should unescape unicode sequences", () => {
- const input = "Hello \\u0041\\u0042\\u0043";
- const output = unescapeUnicode(input);
- expect(output).toBe("Hello ABC");
- });
- it("should handle strings without unicode sequences", () => {
- const input = "Hello World!";
- const output = unescapeUnicode(input);
- expect(output).toBe("Hello World!");
- });
- it("should handle mixed content", () => {
- const input = "Smile: \\u263A and Heart: \\u2764";
- const output = unescapeUnicode(input);
- expect(output).toBe("Smile: ☺ and Heart: ❤");
- });
- it("should handle consecutive unicode sequences", () => {
- const input = "\\u0048\\u0045\\u004C\\u004C\\u004F";
- const output = unescapeUnicode(input);
- expect(output).toBe("HELLO");
- });
-});
-
-describe("trueMarkOrUndefined", () => {
- it("should return true for true input", () => {
- expect(
- trueMarkOrUndefined(
- { type: "text", marks: [{ type: "bold" }], text: "hello" },
- "bold",
- ),
- ).toBe(true);
- });
-
- it("should return undefined for false input", () => {
- expect(
- trueMarkOrUndefined(
- { type: "text", marks: [{ type: "italic" }], text: "hello" },
- "bold",
- ),
- ).toBeUndefined();
- });
-});
-
-describe("defaultColorReverseLUT", () => {
- it("should return hex code for known color name", () => {
- expect(defaultColorReverseLUT("red")).toBe("#FF5555");
- });
-
- it("should return input for unknown color name", () => {
- expect(defaultColorReverseLUT("unknown_color")).toBe("unknown_color");
- });
- it("should return undefined for null or empty input", () => {
- expect(defaultColorReverseLUT("")).toBeUndefined();
- expect(defaultColorReverseLUT("null")).toBeUndefined();
- });
-});
-
-describe("defaultColorLUT", () => {
- it("should return color name for known hex code", () => {
- expect(defaultColorLUT("#FF5555")).toBe("red");
- });
- it("should return input for unknown hex code", () => {
- expect(defaultColorLUT("#123456")).toBe("#123456");
- });
- it("should return undefined for null or empty input", () => {
- expect(defaultColorLUT("")).toBeUndefined();
- expect(defaultColorLUT("null")).toBeUndefined();
- });
-});
-
-it("isMarkType should correctly identify mark types", () => {
- const contentWithMarks: JSONContent = {
- type: "text",
- marks: [{ type: "bold" }, { type: "italic" }],
- text: "Sample Text",
- };
- expect(isMarkType(contentWithMarks, "bold")).toBeDefined();
- expect(isMarkType(contentWithMarks, "italic")).toBeDefined();
- expect(isMarkType(contentWithMarks, "underline")).toBeUndefined();
-});
diff --git a/static/apple-touch-icon.png b/static/apple-touch-icon.png
index 1d4f105..96d6660 100644
Binary files a/static/apple-touch-icon.png and b/static/apple-touch-icon.png differ
diff --git a/static/favicon-96x96.png b/static/favicon-96x96.png
index c9f60e6..54b765c 100644
Binary files a/static/favicon-96x96.png and b/static/favicon-96x96.png differ
diff --git a/static/site.webmanifest b/static/site.webmanifest
index 5ff237d..65a3110 100644
--- a/static/site.webmanifest
+++ b/static/site.webmanifest
@@ -1,24 +1,24 @@
{
- "$schema": "https://json.schemastore.org/web-manifest-combined.json",
- "name": "Datapack Hub Text Editor",
- "short_name": "Text Editor",
- "icons": [
- {
- "src": "/web-app-manifest-192x192.png",
- "sizes": "192x192",
- "type": "image/png",
- "purpose": "maskable"
- },
- {
- "src": "/web-app-manifest-512x512.png",
- "sizes": "512x512",
- "type": "image/png",
- "purpose": "maskable"
- }
- ],
- "start_url": ".",
- "description": "Minecraft Tellraw Editor for Java Edition. Create colored Minecraft /tellraw, /title, and items with our easy to use editor (especially for datapacks).",
- "theme_color": "#ff631a",
- "background_color": "#27272a",
- "display": "standalone"
+ "$schema": "https://json.schemastore.org/web-manifest-combined.json",
+ "name": "Datapack Hub Text Editor",
+ "short_name": "Text Editor",
+ "icons": [
+ {
+ "src": "/web-app-manifest-192x192.png",
+ "sizes": "192x192",
+ "type": "image/png",
+ "purpose": "maskable"
+ },
+ {
+ "src": "/web-app-manifest-512x512.png",
+ "sizes": "512x512",
+ "type": "image/png",
+ "purpose": "maskable"
+ }
+ ],
+ "start_url": ".",
+ "description": "Minecraft Tellraw Editor for Java Edition. Create colored Minecraft /tellraw, /title, and items with our easy to use editor (especially for datapacks).",
+ "theme_color": "#ff631a",
+ "background_color": "#27272a",
+ "display": "standalone"
}
diff --git a/static/web-app-manifest-192x192.png b/static/web-app-manifest-192x192.png
index ec88993..ebeba25 100644
Binary files a/static/web-app-manifest-192x192.png and b/static/web-app-manifest-192x192.png differ
diff --git a/static/web-app-manifest-512x512.png b/static/web-app-manifest-512x512.png
index 4348216..cd4cc01 100644
Binary files a/static/web-app-manifest-512x512.png and b/static/web-app-manifest-512x512.png differ
diff --git a/svelte.config.js b/svelte.config.js
index 3eba69c..90c0afc 100644
--- a/svelte.config.js
+++ b/svelte.config.js
@@ -3,16 +3,16 @@ import { vitePreprocess } from "@sveltejs/vite-plugin-svelte";
/** @type {import('@sveltejs/kit').Config} */
const config = {
- // Consult https://kit.svelte.dev/docs/integrations#preprocessors
- // for more information about preprocessors
- preprocess: vitePreprocess(),
+ // Consult https://kit.svelte.dev/docs/integrations#preprocessors
+ // for more information about preprocessors
+ preprocess: vitePreprocess(),
- kit: {
- // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
- // If your environment is not supported or you settled on a specific environment, switch out the adapter.
- // See https://kit.svelte.dev/docs/adapters for more information about adapters.
- adapter: adapter(),
- },
+ kit: {
+ // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
+ // If your environment is not supported or you settled on a specific environment, switch out the adapter.
+ // See https://kit.svelte.dev/docs/adapters for more information about adapters.
+ adapter: adapter(),
+ },
};
export default config;
diff --git a/tsconfig.json b/tsconfig.json
index 0adf17a..0c6600e 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,18 +1,18 @@
{
- "extends": "./.svelte-kit/tsconfig.json",
- "compilerOptions": {
- "allowJs": true,
- "checkJs": true,
- "esModuleInterop": true,
- "forceConsistentCasingInFileNames": true,
- "resolveJsonModule": true,
- "skipLibCheck": true,
- "sourceMap": true,
- "strict": true,
- "types": ["unplugin-icons/types/svelte"]
- }
- // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
- //
- // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
- // from the referenced tsconfig.json - TypeScript does not merge them in
+ "extends": "./.svelte-kit/tsconfig.json",
+ "compilerOptions": {
+ "allowJs": true,
+ "checkJs": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "sourceMap": true,
+ "strict": true,
+ "types": ["unplugin-icons/types/svelte"]
+ }
+ // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias
+ //
+ // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes
+ // from the referenced tsconfig.json - TypeScript does not merge them in
}
diff --git a/vite.config.ts b/vite.config.ts
index f43b6dd..3a1dc6c 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -1,34 +1,22 @@
import { svelteTesting } from "@testing-library/svelte/vite";
import { sveltekit } from "@sveltejs/kit/vite";
-import { defineConfig } from "vite";
+import { defineConfig } from "vitest/config";
import Icons from "unplugin-icons/vite";
import tailwindcss from "@tailwindcss/vite";
export default defineConfig({
- plugins: [sveltekit(), Icons({ compiler: "svelte" }), tailwindcss()],
- test: {
- projects: [
- {
- extends: "./vite.config.ts",
- plugins: [svelteTesting()],
- test: {
- name: "client",
- environment: "jsdom",
- clearMocks: true,
- include: ["src/tests/unit/*.svelte.{test,spec}.{js,ts}"],
- exclude: ["src/lib/server/**"],
- setupFiles: ["./vitest-setup-client.ts"],
- },
- },
- {
- extends: "./vite.config.ts",
- test: {
- name: "server",
- environment: "node",
- include: ["src/tests/unit/*.{test,spec}.{js,ts}"],
- exclude: ["src/**/*.svelte.{test,spec}.{js,ts}"],
- },
- },
- ],
- },
+ plugins: [sveltekit(), Icons({ compiler: "svelte" }), tailwindcss()],
+ test: {
+ projects: [
+ {
+ extends: "./vite.config.ts",
+ test: {
+ name: "server",
+ environment: "node",
+ include: ["src/tests/unit/**/*.{test,spec}.{js,ts}"],
+ exclude: ["src/**/*.svelte.{test,spec}.{js,ts}"],
+ },
+ },
+ ],
+ },
});
diff --git a/vitest-setup-client.ts b/vitest-setup-client.ts
deleted file mode 100644
index 4986bd8..0000000
--- a/vitest-setup-client.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import "@testing-library/jest-dom/vitest";
-import { vi } from "vitest";
-
-// required for svelte5 + jsdom as jsdom does not support matchMedia
-Object.defineProperty(window, "matchMedia", {
- writable: true,
- enumerable: true,
- value: vi.fn().mockImplementation((query) => ({
- matches: false,
- media: query,
- onchange: null,
- addEventListener: vi.fn(),
- removeEventListener: vi.fn(),
- dispatchEvent: vi.fn(),
- })),
-});
-
-// add more mocks here if you need them