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 @@
- +
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} -
-
- -
-
- {title} - -
-
- {@render children()} -
-
-
-
+
+
+ +
+
+ {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 @@ + + +
+
+ logo + Minecraft Text Editor +
+ + + + +
+ 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

- +

Event Type

+ - {#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} - - {/if} -
+
+ {#if clickEventType} + + {/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} - - {/if} -
- {/each} - -
-

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} + + {/if} +
+ {/each} + +
+

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. +

- -
+ +
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} -
- - - - - - {#if $outputVersion.index >= 2} - - {/if} -
- {:else} - - {/if} +

Select a source type to add

+ {#if !customType} +
+ + + + + + {#if $outputVersion.index >= 2} + + {/if} +
+ {:else} + + {/if} - {#if customType === "translate"} -

Translate Key

- + {#if customType === "translate"} +

Translate Key

+ -

Fallback

- +

Fallback

+ -

Parameters

-
- {#each customValues.translate.params ?? [] as p, i} -
- -
- {/each} -
-
- - {#if customValues.translate.params.length != 0} - - {/if} -
+

Parameters

+
+ {#each customValues.translate.params ?? [] as p, i} +
+ +
+ {/each} +
+
+ + {#if customValues.translate.params.length != 0} + + {/if} +
- - {:else if customType === "score"} -

Objective

- -

Player, Fake Player, or Entity

- + + {:else if customType === "score"} +

Objective

+ +

Player, Fake Player, or Entity

+ - - {:else if customType === "nbt"} -

NBT Source type

- - {#if customValues.nbt.sourceType === "storage"} -

Storage ID

- + + {:else if customType === "nbt"} +

NBT Source type

+ + {#if customValues.nbt.sourceType === "storage"} +

Storage ID

+ -

NBT path

- +

NBT path

+ -
- - -
+
+ + +
- - {:else if customValues.nbt.sourceType === "entity"} -

Entity

- + + {:else if customValues.nbt.sourceType === "entity"} +

Entity

+ -

NBT path

- +

NBT path

+ -
- - -
+
+ + +
- - {:else if customValues.nbt.sourceType === "block"} -

Entity

- + + {:else if customValues.nbt.sourceType === "block"} +

Entity

+ -

NBT path

- +

NBT path

+ -
- - -
+
+ + +
- - {/if} - {:else if customType === "keybind"} -

Keybind

- - - {:else if customType === "selector"} -

Selector

- - - {:else if customType === "object"} -

Object Type

- + + {/if} + {:else if customType === "keybind"} +

Keybind

+ + + {:else if customType === "selector"} +

Selector

+ + + {:else if customType === "object"} +

Object Type

+ - {#if customValues.object.object == "atlas"} -

Atlas

- -

Sprite

- + {#if customValues.object.object == "atlas"} +

Atlas

+ +

Sprite

+ - - {:else if customValues.object.object == "player"} -

Username

- + + {:else if customValues.object.object == "player"} +

Username

+ -
- - -
+
+ + +
- - {/if} - {/if} + + {/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: -

-
- - -
{editor
-						? convert(
-								editor.getJSON(),
-								"standard",
-								shouldOptimise,
-								exportAsJSON,
-							)
-						: "Loading..."}
-
-
- -

As a lore component:

-
- - [lore= -
{editor
-						? convert(
-								editor.getJSON(),
-								"item_lore",
-								shouldOptimise,
-								exportAsJSON,
-							)
-						: "Loading..."}
- ] -
-
- -

As a MOTD:

-
- - -
{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:

-
- - - -
+
+

Select one of the default Minecraft fonts below:

+
+ + + +
-

- To use a custom font in the editor, upload or select one below. -

-
- {#each fontLUT as [identifier, _]} -
- - -
- {/each} - -
+

To use a custom font in the editor, upload or select one below.

+
+ {#each fontLUT as [identifier, _]} +
+ + +
+ {/each} + +
-

- 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. +

- -
+ +
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} - - {:else if step === 2} -

- Enter font identifier (namespace:font_name) -

- - - {/if} + + {#if step === 1} + + {:else if step === 2} +

+ Enter font identifier (namespace:font_name) +

+ + + {/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:

- - + +
+

Click to insert a custom character:

+ + - - + + - -
- {#each chars as char} - - {/each} -
-
+ +
+ {#each chars as 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:

+
+ + + + + + +
+ More coming soon +
+
+ {:else if showOutput == "lore"} +
+
+ + Lore item component +
+ +
+ + [lore= + {#if $appSettings.syntaxHighlight} +
+ +
+ {:else} +
{editor
+                    ? convert(editor.getJSON(), shouldOptimise, "item_lore", exportAsJSON)
+                    : "Loading..."}
+ {/if} + ] +
+ + + {:else if showOutput == "motd"} +
+
+ + Server MOTD +
+ +
+ +
{editor
+                ? translateMOTD(editor.getJSON())
+                : "Loading..."}
+
+ + + {:else if showOutput == "image"} +
+
+ + Image +
+ +
+
+ +
+
+ + +
+
+ + + +
+ {/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! +

+ + + +
+
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)} +
+
+ +
+
+ + +
+
+ {/each} + +
+
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 @@ + + + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
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} - - {/each} - {#if editor.isActive("textStyle")} - - {/if} - - - - {/if} -
- -
-
+
+ {#if editor} + + +
+ + {#each colourMap as color} + + {/each} + {#if editor.isActive("textStyle")} + + {/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 @@ - - - - - - - - -{#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} - -{/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 @@ + + + + + + + + +{#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} + +{/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} + + {/if} + +
+ + + {#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")} + + {/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

+ + +
+ +{#await import("$lib/components/modals/CustomSourceModal.svelte") then modal} + +{/await} + + +
+ + + +
+
+ +{#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 @@
-
-
- logo - Minecraft Text Editor -
- - {#if doesContentExist} - - - {/if} - -
- 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} - - {/if} - -
- - - {#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")} - - {/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} -
-
- - - - - - -
-
-

- 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. -
- - -
-
-
- {/if} -
-
- version - description -
- {#each versions as v} - - {/each} - * unreleased minecraft version -
-
- {/if} - - -
- - - -

- - - -

- -

- {finalOutput.length} characters -

-
-
-
+ + + + +
+
+ +
+ {#if page.url.searchParams.has("dev")} + DEV ONLY: {tiptapJSON ? JSON.stringify(tiptapJSON) : "Loading..."} +
+ {/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. +
+ + +
+
+
+ {/if} +
+
+ version + description +
+ {#each versions as v} + + {/each} + * unreleased minecraft version +
+
+ {/if} + + +
+ + + +

+ + + + {#if $appSettings.showCharacterCount} +

+ +

+ {finalOutput.length} characters +

+ {/if} +
+
+
-
- - {#await import("$lib/components/modals/ClickEventModal.svelte") then modal} - - {/await} - - -

Text to show

- - -
- - {#await import("$lib/components/modals/CustomSourceModal.svelte") then modal} - - {/await} - - -
- - - -
-
- - -
- {#if snapshots.length == 0} -

You have not saved anything yet!

- {/if} - {#each snapshots as snapshot (snapshot)} -
-
- -
-
- - -
-
- {/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! -

- - - -
-
- - {#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