From b1516edfd97bcc80bfe517a1474d02a03772e6de Mon Sep 17 00:00:00 2001 From: Cobblestone Date: Mon, 20 Jul 2026 13:28:21 -0400 Subject: [PATCH 01/20] testing refactor part 1 --- bun.lock | 147 +++---- package.json | 1 + src/app.css | 8 +- src/lib/text/nbt/export.ts | 13 +- src/lib/text/nbt/import.ts | 41 +- src/lib/types.ts | 2 +- src/routes/+page.svelte | 6 +- .../data/bad/json/too_big_shadow_color.json | 18 + .../clean/json/illegal_marked_object.json | 27 ++ .../unit/data/clean/json/shadow_color.json | 18 + .../clean/json/shadow_color_transparent.json | 18 + ...mple_text_tiptap.json => simple_text.json} | 0 ...nicode_tiptap.json => simple_unicode.json} | 0 .../data/clean/snbt/base16_shadow_color.snbt | 2 +- .../optimising_mc_json.spec.ts | 2 +- .../exporting/translating_mc_json.spec.ts | 174 ++++++++ src/tests/unit/exporting/type_props.spec.ts | 101 +++++ .../unit/importing/snbt_importing.spec.ts | 205 +++++++++ src/tests/unit/importing/source_props.spec.ts | 194 +++++++++ src/tests/unit/{ => misc}/utils.spec.ts | 3 +- src/tests/unit/snbt_importing.spec.ts | 412 ------------------ src/tests/unit/translating_mc_json.spec.ts | 256 ----------- vite.config.ts | 4 +- 23 files changed, 883 insertions(+), 769 deletions(-) create mode 100644 src/tests/unit/data/bad/json/too_big_shadow_color.json create mode 100644 src/tests/unit/data/clean/json/illegal_marked_object.json create mode 100644 src/tests/unit/data/clean/json/shadow_color.json create mode 100644 src/tests/unit/data/clean/json/shadow_color_transparent.json rename src/tests/unit/data/clean/json/{simple_text_tiptap.json => simple_text.json} (100%) rename src/tests/unit/data/clean/json/{simple_unicode_tiptap.json => simple_unicode.json} (100%) rename src/tests/unit/{ => exporting}/optimising_mc_json.spec.ts (98%) create mode 100644 src/tests/unit/exporting/translating_mc_json.spec.ts create mode 100644 src/tests/unit/exporting/type_props.spec.ts create mode 100644 src/tests/unit/importing/snbt_importing.spec.ts create mode 100644 src/tests/unit/importing/source_props.spec.ts rename src/tests/unit/{ => misc}/utils.spec.ts (97%) delete mode 100644 src/tests/unit/snbt_importing.spec.ts delete mode 100644 src/tests/unit/translating_mc_json.spec.ts diff --git a/bun.lock b/bun.lock index f8da0ab..9ec8e90 100644 --- a/bun.lock +++ b/bun.lock @@ -5,43 +5,44 @@ "": { "name": "tools", "dependencies": { - "@tiptap/core": "latest", - "@tiptap/extension-placeholder": "latest", - "@tiptap/pm": "latest", - "@tiptap/starter-kit": "latest", - "bits-ui": "latest", - "html2canvas-pro": "latest", - "idb": "latest", - "svelte-awesome-color-picker": "latest", - "tippy.js": "latest", - "typescript-color-gradient": "latest", + "@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", + "tippy.js": "^6.3.7", + "typescript-color-gradient": "^4.2.0", }, "devDependencies": { - "@iconify-json/tabler": "latest", - "@playwright/test": "latest", - "@sveltejs/adapter-auto": "latest", - "@sveltejs/kit": "latest", - "@sveltejs/vite-plugin-svelte": "latest", - "@tailwindcss/vite": "latest", - "@testing-library/jest-dom": "latest", - "@testing-library/svelte": "latest", - "@tiptap/extension-color": "latest", - "@tiptap/extension-font-family": "latest", - "@tiptap/extension-text-style": "latest", - "@types/node": "latest", - "file-type": "latest", - "jsdom": "latest", - "oxlint": "latest", - "prettier": "latest", - "prettier-plugin-svelte": "latest", - "prettier-plugin-tailwindcss": "latest", - "svelte": "latest", - "svelte-check": "latest", - "tailwindcss": "latest", - "typescript": "latest", - "unplugin-icons": "latest", - "vite": "latest", - "vitest": "latest", + "@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", + "@vitest/coverage-v8": "4.1.10", + "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", }, }, }, @@ -60,10 +61,18 @@ "@babel/code-frame": ["@babel/code-frame@7.29.0", "", { "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" } }, "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw=="], + "@babel/helper-string-parser": ["@babel/helper-string-parser@7.29.7", "", {}, "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="], + "@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.28.5", "", {}, "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q=="], + "@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/runtime": ["@babel/runtime@7.29.2", "", {}, "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g=="], + "@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=="], "@bramus/specificity": ["@bramus/specificity@2.4.2", "", { "dependencies": { "css-tree": "^3.0.0" }, "bin": { "specificity": "bin/cli.js" } }, "sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw=="], @@ -322,45 +331,7 @@ "@types/trusted-types": ["@types/trusted-types@2.0.7", "", {}, "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw=="], - "@typescript/typescript-aix-ppc64": ["@typescript/typescript-aix-ppc64@7.0.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-MTKKkWB7p/0E9xi1d1tHtZ5PiLkGEMIq88pK2CubZjOsLtYTLqhgIgi6zepFa+9GHZ6h05NMCkQxGKiPXMxXtQ=="], - - "@typescript/typescript-darwin-arm64": ["@typescript/typescript-darwin-arm64@7.0.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-gowzar9MwS/aRWp6f3a4KUqzRjAZjOsmGNCM6LcTgXum+dBfgsBVMN+AgvOCCbguXyick6LJhpBszxMebJ8syA=="], - - "@typescript/typescript-darwin-x64": ["@typescript/typescript-darwin-x64@7.0.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-SZ9xZInqApNlNGc9s0W1VSsktYSOe9cFqNOIqmN1Gs8SmkjKZYFt017G4VwPxASInODuAdbTW7sXiFUf893RgA=="], - - "@typescript/typescript-freebsd-arm64": ["@typescript/typescript-freebsd-arm64@7.0.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-W5NH4y/J0plIIS5b2xvTEkU7JFxyqdMAOgf+Ilhl0vHQXKO5dZoxd+C/jEtq56c4F3wk71RB4BMRQ2XdI+bwYQ=="], - - "@typescript/typescript-freebsd-x64": ["@typescript/typescript-freebsd-x64@7.0.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-UMGDx5sTpzNw3WiPebH7l90IWfJggEd+egHt/q6p7/Cm3zqoV7VxkGXt+3DxPIw8CcmvAB0j3sVVfbhX+M4Tpw=="], - - "@typescript/typescript-linux-arm": ["@typescript/typescript-linux-arm@7.0.2", "", { "os": "linux", "cpu": "arm" }, "sha512-gffT3xPz9sR7j/YJExkyPntrI0P2EP9XbOyWzth2/Gs0RstK+90RBcO0ncXoXy/beYll1SXw846Nf2zdnEz0QQ=="], - - "@typescript/typescript-linux-arm64": ["@typescript/typescript-linux-arm64@7.0.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-Qh4eU4/y3yDjnfjjyPYihMj5/ODIlmt+Bzu17OI+fiSRDW57QmU5SiN63exPRNJPKUzcc1INa1NXdrJ+MqHjUQ=="], - - "@typescript/typescript-linux-loong64": ["@typescript/typescript-linux-loong64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-uEHck9i8hoAzXPiYRib1O7miOnz23SxIeVl6F4LXox+qov1K35jHcEW6VHKvZI+pyvl7fZEP4MCU5LYvIq1GuQ=="], - - "@typescript/typescript-linux-mips64el": ["@typescript/typescript-linux-mips64el@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-R4KvAMnE43W5Qeqb0Ly56O3mWMWIAgsMyz36DCaycd5nbg/9kzm0liw3JocfRqyJY0KPmzFjbswozXyW0DnIYA=="], - - "@typescript/typescript-linux-ppc64": ["@typescript/typescript-linux-ppc64@7.0.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-DORx5b3sd/4S7eayxm4FQv+A7CrkUIGRaHiwI8oiHTAI1fAPWhF4J0vAlkC8biAlHSVVwxMQ3tjZ2/DVbnQiiA=="], - - "@typescript/typescript-linux-riscv64": ["@typescript/typescript-linux-riscv64@7.0.2", "", { "os": "linux", "cpu": "none" }, "sha512-wf0jqEDOjrPRnKwYRyyJDRo11KMbvMFrU+q4zqKyChODBzvlkbhNQfKvLxQCcwTpdDaXSHZTVuh0JoCrKCUMHQ=="], - - "@typescript/typescript-linux-s390x": ["@typescript/typescript-linux-s390x@7.0.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-IkwJc3L7yhytWd/ewjyxNDfOmswCm9GWMJT/ue/dU4aZNbwZeYAetq42VyLmsmSjvoX7z74X6ZaYCtzAr0EuGw=="], - - "@typescript/typescript-linux-x64": ["@typescript/typescript-linux-x64@7.0.2", "", { "os": "linux", "cpu": "x64" }, "sha512-EYdf2cNg7rgCWJnxCdJ+F3V39O8ihb37eHAu1LK8oAFizgTQbPOK7zHHXbPt8rX24COqODXeI3sIf0fCXG7H/A=="], - - "@typescript/typescript-netbsd-arm64": ["@typescript/typescript-netbsd-arm64@7.0.2", "", { "os": "none", "cpu": "arm64" }, "sha512-+polYF4MF04aPpO5FTkHran9yUQDSXqy5GiSDKpsll5jy3l3+g9QLhpf39T+ePtefhXLOGrLl0QIjkQP6VnelA=="], - - "@typescript/typescript-netbsd-x64": ["@typescript/typescript-netbsd-x64@7.0.2", "", { "os": "none", "cpu": "x64" }, "sha512-8YIT0EHM/3dq10ZOVF/A7pc/YSMtbcecct4rWtexrnSCHOPcpC2KTLXfTCR6vDpnSiY12heNb1GiN/wu+T/FyA=="], - - "@typescript/typescript-openbsd-arm64": ["@typescript/typescript-openbsd-arm64@7.0.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-APT8+ClYnuYm1u9+kgGXoMj2VzWzcymwh2gNSQVySHfkRDGOTVkoWLjCmOQSaO+PoqQ57B0flRp9SA+7GnnkzQ=="], - - "@typescript/typescript-openbsd-x64": ["@typescript/typescript-openbsd-x64@7.0.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-yX7s+Q0Dln0Dt9tEzZsAjXXR/+ytBM7AlglaqyeMPxQszJ1JhlJdZ6jLA+IzldHtflX81em7lDao1xXu+aRRkg=="], - - "@typescript/typescript-sunos-x64": ["@typescript/typescript-sunos-x64@7.0.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-dLJDGaLZ1D4HPQn62u1n8mBDkJREwMsAkCdkwd4Ieqw+x3TUyTsqY0YiBCtE6H6OzzgGk3iuZ3vFWRS+E8/d1g=="], - - "@typescript/typescript-win32-arm64": ["@typescript/typescript-win32-arm64@7.0.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Gyl1Vy6OsWesLzmq+EP0Fb7b4Nid5232AvcA2SFcdYreldpNtYFFofPjnt62y9hQy7VTaZp65ICJjuAQRaVcIQ=="], - - "@typescript/typescript-win32-x64": ["@typescript/typescript-win32-x64@7.0.2", "", { "os": "win32", "cpu": "x64" }, "sha512-0BQ3HkAHHlKLSp1qRvf3SUhGpGsDuhB/jgFw75guyqbxJqEaS0Cw/VFO8i2nHglJUzQCRtMMR/IBAKE3ETMC4g=="], + "@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=="], @@ -386,6 +357,8 @@ "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], + "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=="], + "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], "base64-arraybuffer": ["base64-arraybuffer@1.0.2", "", {}, "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="], @@ -454,8 +427,12 @@ "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=="], + "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], + "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=="], "idb": ["idb@8.0.3", "", {}, "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg=="], @@ -470,9 +447,15 @@ "is-reference": ["is-reference@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.6" } }, "sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw=="], + "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=="], + "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="], - "js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + "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=="], @@ -514,6 +497,10 @@ "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "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=="], + "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], @@ -608,6 +595,8 @@ "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.0", "", {}, "sha512-kjnC1DXBHcxaOaOXBHBeRtltsDG2nUiUni+jP92M9gYdW12rsmx92UsfpH7o5tDRs7I1ZZPSQJQGv3UaRfCiuw=="], "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], @@ -626,6 +615,8 @@ "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.5", "", { "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-P03YJmUy2JoOxYHb4Ka3oFat1hq2ko2it1MOItSjsJ4B6WgZPLc3+RyyU+57OGWhs3Ieq74EJpZtSnNXdAGgDw=="], "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=="], @@ -670,7 +661,7 @@ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "typescript": ["typescript@7.0.2", "", { "optionalDependencies": { "@typescript/typescript-aix-ppc64": "7.0.2", "@typescript/typescript-darwin-arm64": "7.0.2", "@typescript/typescript-darwin-x64": "7.0.2", "@typescript/typescript-freebsd-arm64": "7.0.2", "@typescript/typescript-freebsd-x64": "7.0.2", "@typescript/typescript-linux-arm": "7.0.2", "@typescript/typescript-linux-arm64": "7.0.2", "@typescript/typescript-linux-loong64": "7.0.2", "@typescript/typescript-linux-mips64el": "7.0.2", "@typescript/typescript-linux-ppc64": "7.0.2", "@typescript/typescript-linux-riscv64": "7.0.2", "@typescript/typescript-linux-s390x": "7.0.2", "@typescript/typescript-linux-x64": "7.0.2", "@typescript/typescript-netbsd-arm64": "7.0.2", "@typescript/typescript-netbsd-x64": "7.0.2", "@typescript/typescript-openbsd-arm64": "7.0.2", "@typescript/typescript-openbsd-x64": "7.0.2", "@typescript/typescript-sunos-x64": "7.0.2", "@typescript/typescript-win32-arm64": "7.0.2", "@typescript/typescript-win32-x64": "7.0.2" }, "bin": { "tsc": "bin/tsc" } }, "sha512-8FYau96o3NKOhbjKi/qNvG/W5jhzxkbdm5sj9AbZ/5T5sWqn3hJgLfGx27sRKZWTvyzCP8dLRBTf5tBTSRVUNA=="], + "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="], "typescript-color-gradient": ["typescript-color-gradient@4.2.0", "", {}, "sha512-If2yZZfj+9KbBjdPUqTuppmn3JgYAZoPwE9jlxSYf5u3zFKCMAInNSHnEaIekoeykkSuaS8CnnP4XI/X68KybQ=="], @@ -714,6 +705,10 @@ "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], + "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], + + "@babel/types/@babel/helper-validator-identifier": ["@babel/helper-validator-identifier@7.29.7", "", {}, "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="], + "@tailwindcss/oxide-wasm32-wasi/@emnapi/core": ["@emnapi/core@1.11.1", "", { "dependencies": { "@emnapi/wasi-threads": "1.2.2", "tslib": "^2.4.0" }, "bundled": true }, "sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ=="], "@tailwindcss/oxide-wasm32-wasi/@emnapi/runtime": ["@emnapi/runtime@1.11.1", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw=="], diff --git a/package.json b/package.json index 60d0976..a059f5a 100644 --- a/package.json +++ b/package.json @@ -27,6 +27,7 @@ "@tiptap/extension-font-family": "^3.27.4", "@tiptap/extension-text-style": "^3.27.4", "@types/node": "^26.1.1", + "@vitest/coverage-v8": "4.1.10", "file-type": "^22.0.1", "jsdom": "^29.1.1", "oxlint": "^1.74.0", diff --git a/src/app.css b/src/app.css index 2b2c3a4..2b4cd05 100644 --- a/src/app.css +++ b/src/app.css @@ -84,8 +84,12 @@ button { --custom-source-align: top; } -.obfuscated:not(:has([data-atlas-object-node], [data-player-object-node])) { - filter: blur(2px); +.obfuscated { + @apply transition-all; +} + +.obfuscated:not(:hover) { + filter: blur(3px); } .color-picker { diff --git a/src/lib/text/nbt/export.ts b/src/lib/text/nbt/export.ts index ed31c9f..bcafd90 100644 --- a/src/lib/text/nbt/export.ts +++ b/src/lib/text/nbt/export.ts @@ -212,10 +212,13 @@ export function translateJSON( const shadowColorMark = c.marks?.find((m) => m.type === "shadowColor"); if (shadowColorMark) { - current.shadow_color = parseInt( - rgbaToArgbHex(shadowColorMark.attrs?.shadowColor).replace(/^#/, ""), - 16, - ); + let colorVal = shadowColorMark.attrs?.shadowColor.replace(/^#/, ""); + if (colorVal && colorVal.length <= 8) { + current.shadow_color = parseInt( + rgbaToArgbHex(colorVal).replace(/^#/, ""), + 16, + ); + } } current = addTypeSpecificValues(current, c, true); @@ -249,7 +252,7 @@ export function translateJSON( if (num > 2 ** 31 - 1 || num < (-2) ** 31) { finalResult = finalResult.replaceAll( match[0], - `shadow_color:${num}L`, + `"shadow_color":${num}L`, ); } } diff --git a/src/lib/text/nbt/import.ts b/src/lib/text/nbt/import.ts index ace6647..8654aaf 100644 --- a/src/lib/text/nbt/import.ts +++ b/src/lib/text/nbt/import.ts @@ -44,10 +44,15 @@ export function convertToTextOrEmpty(raw: string): StringyMCText[] { return [raw.replace(/"/g, "")]; } - // replace 1b and 0b + // replace 1b and 0b with true and false literals raw = raw.replace(/(?<="\w+"\s*:\s*)\b1b\b/g, "true"); raw = raw.replace(/(?<="\w+"\s*:\s*)\b0b\b/g, "false"); + // remove type suffixes from numbers (e.g., 1.0f, 2.0d, 3l) + raw = raw.replace(/(?<="\w+"\s*:\s*)-?\d+(\.\d+)?[fdl]/gi, (match) => { + return match.slice(0, -1); + }); + let parsed: MinecraftText[] | MinecraftText | string; try { @@ -242,13 +247,22 @@ function applyStyling( } if (text.shadow_color) { - const hex = "#" + text.shadow_color.toString(16).padStart(8, "0"); - finalText.marks?.push({ - type: "shadowColor", - attrs: { - shadowColor: hex, - }, - }); + const combinedShadowStr = ( + Array.isArray(text.shadow_color) + ? text.shadow_color.map(mapToHexByte).join("") + : text.shadow_color.toString(16) + ).replace(/[lL#]/g, ""); + const intValue = parseInt(combinedShadowStr, 16); + + if (intValue > 0 && intValue < 0xffffffff) { + const hex = "#" + combinedShadowStr.padStart(8, "ff"); + finalText.marks?.push({ + type: "shadowColor", + attrs: { + shadowColor: hex, + }, + }); + } } if (text.bold) { @@ -406,3 +420,14 @@ function fixBrokenNewLines(doc: JSONContent) { content: fixedContent, }; } + +function mapToHexByte(value: number): string { + if (value < 0.0 || value > 1.0) { + return "00"; // Return "00" for out-of-range values + } + + const byteValue = Math.round(value * 255); + const hexString = byteValue.toString(16); + + return hexString.length === 1 ? "0" + hexString : hexString; +} diff --git a/src/lib/types.ts b/src/lib/types.ts index f1bad8a..5b993e1 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -60,7 +60,7 @@ export type MinecraftText = { atlas?: string; sprite?: string; player?: { - name?: string; + name: string; }; hat?: string; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 2b2e352..783adde 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -574,9 +574,9 @@
{#if page.url.searchParams.has("dev")}
-					DEV ONLY: {editor ? JSON.stringify(editor.getJSON()) : "Loading..."}
-				
+ >DEV ONLY: {editor + ? JSON.stringify(editor.getJSON()) + : "Loading..."}
{/if}
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..a1b66bc --- /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/clean/json/illegal_marked_object.json b/src/tests/unit/data/clean/json/illegal_marked_object.json new file mode 100644 index 0000000..d535ea1 --- /dev/null +++ b/src/tests/unit/data/clean/json/illegal_marked_object.json @@ -0,0 +1,27 @@ +{ + "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/shadow_color.json b/src/tests/unit/data/clean/json/shadow_color.json new file mode 100644 index 0000000..d9aef53 --- /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..d2e22c9 --- /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": "#ff000080" } + } + ] + } + ] + } + ] +} diff --git a/src/tests/unit/data/clean/json/simple_text_tiptap.json b/src/tests/unit/data/clean/json/simple_text.json similarity index 100% rename from src/tests/unit/data/clean/json/simple_text_tiptap.json rename to src/tests/unit/data/clean/json/simple_text.json diff --git a/src/tests/unit/data/clean/json/simple_unicode_tiptap.json b/src/tests/unit/data/clean/json/simple_unicode.json similarity index 100% rename from src/tests/unit/data/clean/json/simple_unicode_tiptap.json rename to src/tests/unit/data/clean/json/simple_unicode.json 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/optimising_mc_json.spec.ts b/src/tests/unit/exporting/optimising_mc_json.spec.ts similarity index 98% rename from src/tests/unit/optimising_mc_json.spec.ts rename to src/tests/unit/exporting/optimising_mc_json.spec.ts index 416ffee..63c68e0 100644 --- a/src/tests/unit/optimising_mc_json.spec.ts +++ b/src/tests/unit/exporting/optimising_mc_json.spec.ts @@ -1,5 +1,5 @@ import { optimise } from "$lib/text/nbt/optimiser"; -import { describe, it, expect } from "vitest"; +import { describe, expect, it } from "vitest"; // Minimal mock types for test compatibility type StringyMCText = string | { [key: string]: any }; 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..73ad299 --- /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":16711935'); +}); + +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":2164195328L'); +}); + +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..ed1d8d5 --- /dev/null +++ b/src/tests/unit/exporting/type_props.spec.ts @@ -0,0 +1,101 @@ +import { outputVersion } from "$lib/stores"; +import { addTypeSpecificValues } from "$lib/text/nbt/export"; +import { versions, type MinecraftText } from "$lib/types"; +import type { JSONContent } from "@tiptap/core"; +import { 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"); +}); + +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); +}); 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..293e8a5 --- /dev/null +++ b/src/tests/unit/importing/snbt_importing.spec.ts @@ -0,0 +1,205 @@ +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)", 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("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("#ffff0000"); +}); + +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("#ffff0000"); +}); + +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 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..2ac74aa --- /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/utils.spec.ts b/src/tests/unit/misc/utils.spec.ts similarity index 97% rename from src/tests/unit/utils.spec.ts rename to src/tests/unit/misc/utils.spec.ts index a60581c..96b99c6 100644 --- a/src/tests/unit/utils.spec.ts +++ b/src/tests/unit/misc/utils.spec.ts @@ -7,8 +7,7 @@ import { unescapeUnicode, } from "$lib/text/utils"; import type { JSONContent } from "@tiptap/core"; -import { it } from "vitest"; -import { describe, expect } from "vitest"; +import { describe, expect, it } from "vitest"; describe("isDefinedTextObject", () => { it("should report defined object with minimal object", () => { 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/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/vite.config.ts b/vite.config.ts index f43b6dd..5e3b77f 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ name: "client", environment: "jsdom", clearMocks: true, - include: ["src/tests/unit/*.svelte.{test,spec}.{js,ts}"], + include: ["src/tests/unit/**/*.svelte.{test,spec}.{js,ts}"], exclude: ["src/lib/server/**"], setupFiles: ["./vitest-setup-client.ts"], }, @@ -25,7 +25,7 @@ export default defineConfig({ test: { name: "server", environment: "node", - include: ["src/tests/unit/*.{test,spec}.{js,ts}"], + include: ["src/tests/unit/**/*.{test,spec}.{js,ts}"], exclude: ["src/**/*.svelte.{test,spec}.{js,ts}"], }, }, From 4517b496f603cb394333171bbd69fc1096c88a13 Mon Sep 17 00:00:00 2001 From: Cobblestone Date: Wed, 22 Jul 2026 08:38:23 -0400 Subject: [PATCH 02/20] test updates part 2 --- bun.lock | 156 +-- package-lock.json | 963 +++++++++++------- package.json | 40 +- src/lib/text/nbt/export.ts | 20 +- src/lib/text/nbt/import.ts | 17 +- src/lib/text/nbt/optimiser.ts | 35 +- src/lib/text/utils.ts | 26 +- .../unit/data/clean/snbt/interactives.snbt | 1 + .../data/clean/snbt/interactives_old.snbt | 1 + .../unit/exporting/optimising_mc_json.spec.ts | 12 + src/tests/unit/exporting/type_props.spec.ts | 80 +- .../unit/importing/snbt_importing.spec.ts | 20 + src/tests/unit/misc/utils.spec.ts | 15 +- vite.config.ts | 2 +- 14 files changed, 854 insertions(+), 534 deletions(-) create mode 100644 src/tests/unit/data/clean/snbt/interactives.snbt create mode 100644 src/tests/unit/data/clean/snbt/interactives_old.snbt diff --git a/bun.lock b/bun.lock index 9ec8e90..7430543 100644 --- a/bun.lock +++ b/bun.lock @@ -103,7 +103,7 @@ "@floating-ui/utils": ["@floating-ui/utils@0.2.11", "", {}, "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg=="], - "@iconify-json/tabler": ["@iconify-json/tabler@1.2.35", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-/sJMqHvh5ZWrEERVfDCT5NjVDeKJdhosFtKjJofAVl+P/3AzLiryOQw7WvrfDF25Xa5N/eoOQ15Y1jnhYXxBoQ=="], + "@iconify-json/tabler": ["@iconify-json/tabler@1.2.37", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-tXc0jGhrxec6eTKxMI9We/r3cEItyU5dG8ngDOEKsL36a6+/xwk4sR7PIZROVajzxmvyUBsn659adDIfcswiUw=="], "@iconify/types": ["@iconify/types@2.0.0", "", {}, "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg=="], @@ -125,43 +125,43 @@ "@oxc-project/types": ["@oxc-project/types@0.139.0", "", {}, "sha512-r9gHphtCs+1M7J0pw6Sn/hh/Wpa/iQrOOkrNAlVLF/gHq+/CJmHIWKKUUhdWjcD6CIa8idarspCsASiXCXvFUw=="], - "@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.75.0", "", { "os": "android", "cpu": "arm" }, "sha512-lutovtFzJqlRaqpZrCqSSGaHZzl9nIxxpjLzhSRLunN6dCLylj0uzlCyQGaQDIys7rrv8kVXiFO+R4Zpn0bX7g=="], - "@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.75.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hXI0hDgHkw4w5nfru72aG7y+2iQJmC4waH/KV6H/hbgA6yAP5jYNx0P9yug15Hs0tWl/+mda3Jjn/2gmDT48tw=="], - "@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.75.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-D91BWbK/dMYfCcrghspPIuKs2D9LF4Z/OabVSQjw1AO6PWxArD7teDA48bm0ySFqWDaPVqmQRl5GMWNglTXyrQ=="], - "@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.75.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-02mpwzf12BonZ6PT0TuQoomvEh2kVl2WGBIKWezCyToIS+rYkQZ6GXnARBAl9A4Ovm2V+Xe7M4KretyqmmcnJQ=="], - "@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.75.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qZJgLnDaBsiL5YESx2t/TZ8eXkL9fEkKoXEdzegROhlz9A0lgyGnZ0dAzJrh7LJAHQl2K9RdRueN2s/9N7+odg=="], - "@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.75.0", "", { "os": "linux", "cpu": "arm" }, "sha512-7XlaWA5BJD3XpCfrEqjEe6Zseeb14S7QGa304XfwKignRaKQ+eIj775BQ7nIslggWickl4IsPUFqJ+/gAyNHVg=="], - "@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.75.0", "", { "os": "linux", "cpu": "arm" }, "sha512-av6Tpv8yrcMMMOadOqENBhlsLRcGFXXwoQ0hzHhsmS9FJ4Wioy8we427GbcMe2XTxmL2e60T67H1Dyr3up+tAA=="], - "@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.75.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WcUhd8fHT5plrA14lANevl+hOl815mVI5t2hU21oFWrZKFXIVV/Sr4rWQV0NzSvzBupbMLNc5ErEA6Ehxh5jMg=="], - "@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.75.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UWzp5wRHFe/ESO3+eEaxXsTkYTGLYjnTsi/I5neEacXSItQ6WNleapfOAeA4x2b8nyhJ4uQxqvtv9pHv8kWJtQ=="], - "@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.75.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-XEVRwGMLKCUKrvhLAz4F6AIh8MJrQVdSZtAmPpRZt9tGPsUnamPOcl3dS/ZQzJnar/Ymgc//+xho0L60Emzuxg=="], - "@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.75.0", "", { "os": "linux", "cpu": "none" }, "sha512-mAG4DUXqfLC8cTjMD2kt3jDmVzFREYtDyeLNdLdsCcBc4Zbl2EMuiFektGBilQwkNjYnMvCqJs55U+Hyb+b+jw=="], - "@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.75.0", "", { "os": "linux", "cpu": "none" }, "sha512-95hrAvriAlI+pekSomTFIn0+bawMDlDwTNVmdjsFusTHyL2JWh7TWvRNG/Lkim72uN8OiCcO9wcaC6omLP5E3w=="], - "@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.75.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-4b6f2+FrtruAESrCqIKcrarzfrSx+wk2QNcp+RT91/Prc+pMQMAfyZ1rG1c3tFQNl8Bc616tx40uNXyxNBRPbQ=="], - "@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.75.0", "", { "os": "linux", "cpu": "x64" }, "sha512-nshAhrUvXFUWOvqQ2soIw7HFNWvpvEV4o0cYSqPtzLiPF5gKyYTDOOTJ6Rn8g8K/iGvPIrbDA4v8+5MvnjJrrg=="], - "@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.75.0", "", { "os": "linux", "cpu": "x64" }, "sha512-e4jNxLKnxLC6sYBQRxrI2pgIIxnmMtF8U/VwNYcjTT/CLS+spH624cYVnj07bTKwaEWT37/e025isOs6j/0xqA=="], - "@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.75.0", "", { "os": "none", "cpu": "arm64" }, "sha512-hZ2lH+1qLf/DiEP9UWuQTK2JWj/BgvMB4jhIV4SmNU1wfEiYYX4TynQyAZXx0j9X4qRYizAL042SKaV+8ynh4w=="], - "@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.75.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Ilj6PNzGDS3bCU0MSJH7Msh0NhH+T/mRp2shwg+q+GHeVlPwP5LEboW96aW+3kVKFk6zYZy1Xi5pZkqZh6X8KQ=="], - "@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.75.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-QVit2nOEOiPhkmsrksPSkoGCdnZRNkspt8fwoYyP09te1VEbnSj4LAxua4rc8FKTmWkySVe05j8iz9GXYfF1AQ=="], - "@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.75.0", "", { "os": "win32", "cpu": "x64" }, "sha512-DSxnNkBUAYARPwJtR12Ig3deWr8w0H997xP6jy33i+e0SyYJw8FKuz4+cZtpmPEhQmvlPJE3X/2vNxDmLkd/rA=="], "@playwright/test": ["@playwright/test@1.61.1", "", { "dependencies": { "playwright": "1.61.1" }, "bin": { "playwright": "cli.js" } }, "sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig=="], @@ -207,7 +207,7 @@ "@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.69.3", "", { "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-cphwqMRcE19/9VkrIPr5qZhQ0SptSSDfDzRUpYHu9OJDFGuYBFyJzK+KQA27wB4YG32O/yF2QjBkDmTyo0vtCw=="], + "@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", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-nY9SPHGOZro3doud9vZXDBwl9tCZIouuJztjgSHs6PAIrv9M/z5O7eOhPV5xU7CgVHA976Jwu3BA1hIFvXztkA=="], "@sveltejs/load-config": ["@sveltejs/load-config@0.2.0", "", {}, "sha512-1LgZ/qUqSoq+QorD83lk2hka79Px0wXNW2q5V1nZlxGhQgw1jrsIbVz5YiCeucVLo4XvFLjXukUaQjIiqowkcg=="], @@ -215,101 +215,101 @@ "@swc/helpers": ["@swc/helpers@0.5.21", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-jI/VAmtdjB/RnI8GTnokyX7Ug8c+g+ffD6QRLa6XQewtnGyukKkKSk3wLTM3b5cjt1jNh9x0jfVlagdN2gDKQg=="], - "@tailwindcss/node": ["@tailwindcss/node@4.3.2", "", { "dependencies": { "@jridgewell/remapping": "^2.3.5", "enhanced-resolve": "5.21.6", "jiti": "^2.7.0", "lightningcss": "1.32.0", "magic-string": "^0.30.21", "source-map-js": "^1.2.1", "tailwindcss": "4.3.2" } }, "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg=="], + "@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.2", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.3.2", "@tailwindcss/oxide-darwin-arm64": "4.3.2", "@tailwindcss/oxide-darwin-x64": "4.3.2", "@tailwindcss/oxide-freebsd-x64": "4.3.2", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", "@tailwindcss/oxide-linux-x64-musl": "4.3.2", "@tailwindcss/oxide-wasm32-wasi": "4.3.2", "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" } }, "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag=="], + "@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=="], - "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.2", "", { "os": "android", "cpu": "arm64" }, "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA=="], + "@tailwindcss/oxide-android-arm64": ["@tailwindcss/oxide-android-arm64@4.3.3", "", { "os": "android", "cpu": "arm64" }, "sha512-Y85A2gmPSkl5Ve5qR86GL4HT509cFqQh1aes9p3sSkyTPwt0Pppf3GkwGe4JPACcRYjgJIEhQgM6dBClnr0NYw=="], - "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w=="], + "@tailwindcss/oxide-darwin-arm64": ["@tailwindcss/oxide-darwin-arm64@4.3.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-BiaWatpBcERQFDlOjRDpIVXuFK5PJez5SA4JMg6VYZdBYU+qKfV/vqjcIs+IYmtitf1xYQZTwXvU/8y4lfZUGw=="], - "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ=="], + "@tailwindcss/oxide-darwin-x64": ["@tailwindcss/oxide-darwin-x64@4.3.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-fAeUqfV5ndhxRwai8cXGzdLvul9utWOmeTkv69unv4ZXixjn61Z+p9lCWdwOwA3TYboG3BwdVuN/RDjhBRl0mw=="], - "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA=="], + "@tailwindcss/oxide-freebsd-x64": ["@tailwindcss/oxide-freebsd-x64@4.3.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-iyf5bV6+wnAlflVeEy7R25dupxTNECZN5QMI0qNT6eT+EgaGdZcKhGkr5SdoaWiLJ3spLqIY9VCeSGrwmtg4kw=="], - "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.2", "", { "os": "linux", "cpu": "arm" }, "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w=="], + "@tailwindcss/oxide-linux-arm-gnueabihf": ["@tailwindcss/oxide-linux-arm-gnueabihf@4.3.3", "", { "os": "linux", "cpu": "arm" }, "sha512-aAYUprJAJQWWbRrPvtjdroZ56Md+JM8pMiopS6xGEwDfLhqj+2ver2p4nU4Mb3CRqcMmNBjo8KkUgcxhkzVQGQ=="], - "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw=="], + "@tailwindcss/oxide-linux-arm64-gnu": ["@tailwindcss/oxide-linux-arm64-gnu@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-nDxldcEENOxZRzC2uu9jrutZdAAQtb+8WWDCSnWL1zvBk1+FN+x6MtDViPB5AJMfttVCUhehGWus3XBPgatM/w=="], - "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA=="], + "@tailwindcss/oxide-linux-arm64-musl": ["@tailwindcss/oxide-linux-arm64-musl@4.3.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-Md44bD6veX/PC5iyF8cDVnw4HBIANZepRZZ7a8DQOvkfo5WUBwcp6iAuCUz23u+4SUkhJlD3eL7hNdW8ezd/kA=="], - "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w=="], + "@tailwindcss/oxide-linux-x64-gnu": ["@tailwindcss/oxide-linux-x64-gnu@4.3.3", "", { "os": "linux", "cpu": "x64" }, "sha512-tx7us1muwOKAKWao2v/GaafFeQboE6aj88vC6ziN2NCGcRm8gWUhwjzg+YdVB1e4boAtdtma4L43onunI6NS4w=="], - "@tailwindcss/oxide-linux-x64-musl": ["@tailwindcss/oxide-linux-x64-musl@4.3.2", "", { "os": "linux", "cpu": "x64" }, "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw=="], + "@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.2", "", { "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-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw=="], + "@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.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ=="], + "@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=="], - "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.2", "", { "os": "win32", "cpu": "x64" }, "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ=="], + "@tailwindcss/oxide-win32-x64-msvc": ["@tailwindcss/oxide-win32-x64-msvc@4.3.3", "", { "os": "win32", "cpu": "x64" }, "sha512-yJ0pwIVc/nYeGoV02WtsN8KYyLQv7kyI2wDnkezyJlGGjkd4QLwDGAwl47YpPJeuI0M0ObaXGSPjvWDPeTPggw=="], - "@tailwindcss/vite": ["@tailwindcss/vite@4.3.2", "", { "dependencies": { "@tailwindcss/node": "4.3.2", "@tailwindcss/oxide": "4.3.2", "tailwindcss": "4.3.2" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" } }, "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA=="], + "@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/jest-dom": ["@testing-library/jest-dom@6.10.0", "", { "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" }, "peerDependencies": { "@testing-library/dom": ">=10 <11" } }, "sha512-HQwu0KaB2zyT0iLzBL+8CLyZDL3KlZlZJ+2iyc9uCUnlJVskJU/UlPuVCyIPhtukjPQdT2QNoR5nCP5FqTmmDQ=="], "@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": "*" }, "optionalPeers": ["vite", "vitest"] }, "sha512-4o31E4HGo5BU5KwPkulNRocEden+7Tt9JYm9uhln5ajF7DULeyFA46BBWVfKJ8Ms9B3JmOFPTIiVamH7n3KpuQ=="], "@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/core": ["@tiptap/core@3.27.4", "", { "peerDependencies": { "@tiptap/pm": "3.27.4" } }, "sha512-8W/GwlEn0JwNdpyVfTWcXwHYUpj9BWwO++YxtizmgjJzlwigSh7/xLVJMwVykuQHQ2fCq5rkUvmBRtpHOMLUQA=="], + "@tiptap/core": ["@tiptap/core@3.28.0", "", { "peerDependencies": { "@tiptap/pm": "3.28.0" } }, "sha512-gUuD5WAYfbDxNSSJya/emh2KSzXZXLUYKW4fEnc1AQ5FE2twzh4LJ9UlKFIawigrUCAksWI5Fy1hRbv+5m4ZdQ=="], - "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4", "@tiptap/pm": "3.27.4" } }, "sha512-d1tOHgP3R5cOE+Ot8qL/dkLXRByajgn+j6cCXHqDtmJO2wsK9knmbKQ0SEjbKrU6OgHrTnY/EotNxBEBW9HGoA=="], + "@tiptap/extension-blockquote": ["@tiptap/extension-blockquote@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0", "@tiptap/pm": "3.28.0" } }, "sha512-y8Xi6Z3AQLXedz0J8Z3kDsu7SKBmL50gKVXx3RK1Oo1cuCGhNChm3syChkAz3PLAbrPUM5rvJDSZdF2jUrDnng=="], - "@tiptap/extension-bold": ["@tiptap/extension-bold@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-wTtJUUAxCAZ01ICH2DNlOBzzHKRQ1ZST8aRYtIhBPzqEUhnJaKGcjnDB4X49fqPi48iXaPxzhsInDl+rVUujWg=="], + "@tiptap/extension-bold": ["@tiptap/extension-bold@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-JhZQmr0AU741bOwjVMfuwJdK4g0TQwwPbeca9aqKHv5zvZw4i4G9G6fESVyMFc3Yag1ffpnq5EtNldHKTnMhlw=="], - "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@3.27.4", "", { "peerDependencies": { "@tiptap/extension-list": "3.27.4" } }, "sha512-rvja0N1RnwGJAVwDdbUfDIJ4NoT+KjPFaZudKiPuEMfMHfbqe4xcbbC2hsfs61JNcl2xmx+ohV6lzD9YxxJl1w=="], + "@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": ["@tiptap/extension-code@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-aPc7opCR1ylK4m4c2lsjLsGpEBD1fLQQKWd5PbZiJvrTF8gkdGZlYLt9A6VukpxeJyHhb22Jaj4fxgKmGMeTtw=="], + "@tiptap/extension-code": ["@tiptap/extension-code@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-AUw2Acof3CQE6Q6Y22saK4lyg0nkeJ4XXniU65TdAi/9TE66TGiO4NQJJNNPgu8+VMEwl5j8VsIFK8sfTcNYtg=="], - "@tiptap/extension-code-block": ["@tiptap/extension-code-block@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4", "@tiptap/pm": "3.27.4" } }, "sha512-a5caWfWN6Z6usy48vzJDDOhWoA6+rFFCHGpQM7jXn/7rRzYPcvBzTZUGptjEbltj4YqtrQ2tVwTJcCtbb+mknA=="], + "@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-color": ["@tiptap/extension-color@3.27.4", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.27.4" } }, "sha512-uGbgErKGKO4OTBGqnXOA1CGXa3IqoBaiPBGcHu/px01fS8EVFu0A7q5HS6vxFiMK6qW5x71sEpCA+FUINMAb3g=="], + "@tiptap/extension-color": ["@tiptap/extension-color@3.28.0", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.28.0" } }, "sha512-YbUMUdrgU04GDYoii1wuFVkiTSQoaEQh04kwgQayEQ46aUBEnnaJitWdp39aGMWYTIXD/c9K9cr5Vg8GSKcVxA=="], - "@tiptap/extension-document": ["@tiptap/extension-document@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-7nAqgfkgb9HADBeCTnOHuTiyZuxfxvMPT3nH4OZeY+cmtkI1On3QffqlmtcUPvNbkhT3o9ehA1hVfCnQ1Ye4LQ=="], + "@tiptap/extension-document": ["@tiptap/extension-document@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-5SAKtlB1Tr/eZFhISL86HqmUup6rItvPtuPyRjmZo/VgbMwXEwiyAh1sMgFp5VNaeSMM14vJSyQpjhSaOmaBqg=="], - "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@3.27.4", "", { "peerDependencies": { "@tiptap/extensions": "3.27.4" } }, "sha512-RiZasQJuUTUO3aME16Bn8eJH7cYnvhT5JCFDFq0ya/1iFI9wUQA2NJC5tb5TrZ74+sQwkYU9VzexnchM481Y9w=="], + "@tiptap/extension-dropcursor": ["@tiptap/extension-dropcursor@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-JA+dXQjjfJBpD0nVsZeddGVXRsmanESM9+8CtM35hI9wJnYMXay/B+5GUhswO20zhT3zhB2ZOTGe9knu6A8nIQ=="], - "@tiptap/extension-font-family": ["@tiptap/extension-font-family@3.27.4", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.27.4" } }, "sha512-Xf935Udqbk22fe5xWo3AM8FsVrdtW9afHhGLXvKQvzUpxk36y87VDmj8V0AKwlLpKJDq4b9O7Mg2xPdsuj2k8w=="], + "@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-gapcursor": ["@tiptap/extension-gapcursor@3.27.4", "", { "peerDependencies": { "@tiptap/extensions": "3.27.4" } }, "sha512-svLwSKcFhzpcJeXvxxKkRFuQpykmXrQefVhEsaXq0L95yJIIAGKMRmQC3mxKdzL2j0P9cY7V41bNVSyOAyvclw=="], + "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-Wo73kM4q8z4Va9i4+0n1cO0UEMVUVBHPqM6cAqEYXjB4T48LQkKjRsiQydCezm185rQAsmm1dyi72gtvVQfdMg=="], - "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-W+Z9pmDgqjbdu3NeZOQrzA15iM4w60Yd8l2CYzxcdApPVIfYzb2S3a7+u1RqW9wnTYb6xyZjASmFNfxXS4P4cg=="], + "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-JHIFjX1luJgQ4VFEkIeXZpbc54Qiw+69P8FmlazYTh7AIJ6iLCpMFgQFELnivEAZ+/vS0lMPQubg0rCeM3UrHw=="], - "@tiptap/extension-heading": ["@tiptap/extension-heading@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-RgvpxzuYk6QEK+az+eiXpWvGlUso42zNcGnjyUrvskoZjS47MbhSg8ylRYQSRtXE0ETlXhAx4J7iGlGr72kyIw=="], + "@tiptap/extension-heading": ["@tiptap/extension-heading@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-rKjGG/Ik2lNaXBNVmONEDm5DBfGDLM1NWgSf5RRfBISrH8Lm1xqFruOB9tIaB0YUoSV3SBOiwTF9svmzvKSoRA=="], - "@tiptap/extension-horizontal-rule": ["@tiptap/extension-horizontal-rule@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4", "@tiptap/pm": "3.27.4" } }, "sha512-2eQU/55nE5mhMJHALtLMuBL3dcVJUDVVT7n+uZYMaYE63BtCvC4VS08YLFSR7JZSVJIlgVAmdt5nAw0B+rEPNA=="], + "@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-italic": ["@tiptap/extension-italic@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-PeZT4XbyxAp7Lqo/hfA1k5LI27g1RlgS+YgXp2CeHXIrUfSpO5HlZXh02Bvb0pOdl3RFw2tEKtlHzjt8Y1+Nwg=="], + "@tiptap/extension-italic": ["@tiptap/extension-italic@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-Yur/ELz6dNVKQC7m8wGjtoLFxamGjJmA0rUEEOacTH6J39aFmcSxYkEGNDkYHbZFyHFYqbej6eI3VE0h08O0mg=="], - "@tiptap/extension-link": ["@tiptap/extension-link@3.27.4", "", { "dependencies": { "linkifyjs": "^4.3.3" }, "peerDependencies": { "@tiptap/core": "3.27.4", "@tiptap/pm": "3.27.4" } }, "sha512-6K/FkNwMLWWQbNWKlycrUPTN7YcyVFdFwZncoBXe5WyarRjLTGw7ywafnCI9PDIWSq7ttzVL4NgjN2IN8kBXww=="], + "@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": ["@tiptap/extension-list@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4", "@tiptap/pm": "3.27.4" } }, "sha512-A0BgmRO1RE0yLCx9w7GQITtKfS9wLE5cdngSYDiSpwulcXJhJjKm5mZ4OUZmks2VN4HO5jMl2BWCGt2NSDhA+w=="], + "@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-item": ["@tiptap/extension-list-item@3.27.4", "", { "peerDependencies": { "@tiptap/extension-list": "3.27.4" } }, "sha512-z5TVuPw2mkK0B/x+gFg3uUV7tBdaElDFg0zVgnXZCqlSVTLfIyInOOnG5LTWoAd9BdzBjGrzE3PohDcLVDDGBQ=="], + "@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.28.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.28.0" } }, "sha512-GbXrnMac6knSetZY33NHwOrgXFPqH28uCklQqmOZQlsrdGqezDKk31qoEMr4GsKW9n/lViAeuc07oIzwLwCMng=="], - "@tiptap/extension-list-keymap": ["@tiptap/extension-list-keymap@3.27.4", "", { "peerDependencies": { "@tiptap/extension-list": "3.27.4" } }, "sha512-on7JNDi7Eqz7UdZeZdiO83bQHo0flVDHzjmtR+v/nrCGW9H15D3CHs5+4ozLDiCvTK8tbkBuut/l9AWNxcCE/Q=="], + "@tiptap/extension-list-keymap": ["@tiptap/extension-list-keymap@3.28.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.28.0" } }, "sha512-u9Wks8c/eQAv0RkULNggOyTKDD69WVbcV9H5cbasPDUbq5XbEFVa9ajxhEGfMmQ5et3EX0QL8qBi50K0GqbIjA=="], - "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@3.27.4", "", { "peerDependencies": { "@tiptap/extension-list": "3.27.4" } }, "sha512-bHwLiof0FqJfWzB0act7oEKMTZatEKQ4IYCvmyF5EktjMs4kxEatkPp4Yx/1LSYSjLy1MMT7oLELyaz2FFYyXA=="], + "@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-paragraph": ["@tiptap/extension-paragraph@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-8Dnr1J5s/s4XYYuEF3b784NnCxLjXOlQpmGyXRxTAzW7JaOP08tIUJWVNvSMekfXc2vXa33HUbqjxyyWZEQ6LQ=="], + "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-8UMlQIjzqf6r2hSJ/VeJ00RqaOrOB1J5rTk02Vcw2pYeHkOqp+B0ff0HFu4abT9x1q4oXrBAgMsxRtgh/kR14Q=="], - "@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@3.27.4", "", { "peerDependencies": { "@tiptap/extensions": "3.27.4" } }, "sha512-7hBoFLeddCv1WzkqB0x3coZ1Hp9WZ9wLoRXIUtUhRKMpzFq2IlTtW1iw88g9pTJnL98bCCElN4DZ4mYtaQvmgA=="], + "@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-zueiqNeCHOshDa8dGGSa/0cOBZkMjPrxQhemjF4tj2yZ6EeWHBPtCE5h/uQCagEePxsoaJtvaCRh88199zrgBw=="], - "@tiptap/extension-strike": ["@tiptap/extension-strike@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-8OXwcPKuV3ToBBgyvDxH1jQdObK5FIKCGiyIim6qNWiOpi9BhM3XYD+aO1khjv8qIjtoI/DYbizF4ewj09fX2g=="], + "@tiptap/extension-strike": ["@tiptap/extension-strike@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-VVj2ZZU9QYqiHLcjqMqRYvuHSsokj/AgUl+6TzLrKjlWwyZ18D4H2vkyI0g70iVTKnUpZ3sEy8WA/rqjgBjqBg=="], - "@tiptap/extension-text": ["@tiptap/extension-text@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-lKQH/hP4FBXsziHypd6Ywj8JFvMLM5GVkK1xsH6yApNuXbHq95rd42ZOYWpYILIBib7tlaz93z61d74UrJiuiw=="], + "@tiptap/extension-text": ["@tiptap/extension-text@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-Jqp1LgfY1mnp4TQHoy+vnHyfn6qnnAM6nHgGwbY5zA8b/Xf1Etll6pziTx9p1J1qcfAgSrnjOyAmA++H7VQqww=="], - "@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-Wmj64TQXY85gc7lUNbubW32sDCnVOJlpGraMeARRC9Z0EKBX1JpAxddo/64F17bn3kzLxXVszBFyLRcNgTdU2g=="], + "@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-UreMyqZSv770+CXJK/l1qeHUdaNMQAVkxSOPWpiY9FiT8B4OQyjA7WBOlWrzbvVTzfJvXWk2Y3SWgVRx+/Cd9A=="], - "@tiptap/extension-underline": ["@tiptap/extension-underline@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4" } }, "sha512-nRJGvRyEXDtINlHTW+C2oWcL3vmX1URVxAPpkD3Zwn5Rb/vEeOU/pk/w97I0iid816MR4iVbvl1XhbUVegK9gQ=="], + "@tiptap/extension-underline": ["@tiptap/extension-underline@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-rwxCS6vTh2DJkNIYQX7JSrrRSmm76e2y48aZeuZO5ShkvLWMuJ3/zqDHRxAQVDiJhuE2Cp8NrTmPYlUc9YrT0A=="], - "@tiptap/extensions": ["@tiptap/extensions@3.27.4", "", { "peerDependencies": { "@tiptap/core": "3.27.4", "@tiptap/pm": "3.27.4" } }, "sha512-d8opkg2iGtVwJmNGIqv0blfRxnvWOJp1brz+Z8CsP4ojSS2ZtaE46d6JSQ5OeJ7nMpjhT+9wh4UQcA7OSEO59w=="], + "@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.27.4", "", { "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-UB8lcyomfWk7YGI2PZKNqcYXfyRA+PFj+QntlsUXyrsiA5JJIaE8SHKYjxKlGG/xtW3EtPm1b0p38T9Mk4xiFw=="], + "@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.27.4", "", { "dependencies": { "@tiptap/core": "^3.27.4", "@tiptap/extension-blockquote": "^3.27.4", "@tiptap/extension-bold": "^3.27.4", "@tiptap/extension-bullet-list": "^3.27.4", "@tiptap/extension-code": "^3.27.4", "@tiptap/extension-code-block": "^3.27.4", "@tiptap/extension-document": "^3.27.4", "@tiptap/extension-dropcursor": "^3.27.4", "@tiptap/extension-gapcursor": "^3.27.4", "@tiptap/extension-hard-break": "^3.27.4", "@tiptap/extension-heading": "^3.27.4", "@tiptap/extension-horizontal-rule": "^3.27.4", "@tiptap/extension-italic": "^3.27.4", "@tiptap/extension-link": "^3.27.4", "@tiptap/extension-list": "^3.27.4", "@tiptap/extension-list-item": "^3.27.4", "@tiptap/extension-list-keymap": "^3.27.4", "@tiptap/extension-ordered-list": "^3.27.4", "@tiptap/extension-paragraph": "^3.27.4", "@tiptap/extension-strike": "^3.27.4", "@tiptap/extension-text": "^3.27.4", "@tiptap/extension-underline": "^3.27.4", "@tiptap/extensions": "^3.27.4", "@tiptap/pm": "^3.27.4" } }, "sha512-/sb6rFxNt5BO4hWpUwvHh+Yh1kNyCQuuz3oDpGef5HUUjSdu9p9rfNiHWIUKBadK8VXuw5es7N+UlZ4hma+gvA=="], + "@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=="], "@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="], @@ -403,7 +403,7 @@ "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], - "enhanced-resolve": ["enhanced-resolve@5.21.6", "", { "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.3.3" } }, "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ=="], + "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=="], @@ -433,7 +433,7 @@ "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - "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=="], + "html2canvas-pro": ["html2canvas-pro@2.3.0", "", { "dependencies": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" } }, "sha512-MuI3Gdf6E8tzZRsjdFrqM7FZT4+TgMmaUCbFmTwKe2vTk3QeivkXPRAr2Oy41SumExpaksqNGFykfbMGTn+Zdw=="], "idb": ["idb@8.0.3", "", {}, "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg=="], @@ -519,7 +519,7 @@ "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": { "oxlint": "bin/oxlint" } }, "sha512-odGl2s2x5IOJoj3A0v1k0PGBXVFBZeZ2+AK/+K2MJur7Ghi3bkyX5NuLUWHKqa4js1wjep3hJeuTQJOlr+4+dA=="], + "oxlint": ["oxlint@1.75.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.75.0", "@oxlint/binding-android-arm64": "1.75.0", "@oxlint/binding-darwin-arm64": "1.75.0", "@oxlint/binding-darwin-x64": "1.75.0", "@oxlint/binding-freebsd-x64": "1.75.0", "@oxlint/binding-linux-arm-gnueabihf": "1.75.0", "@oxlint/binding-linux-arm-musleabihf": "1.75.0", "@oxlint/binding-linux-arm64-gnu": "1.75.0", "@oxlint/binding-linux-arm64-musl": "1.75.0", "@oxlint/binding-linux-ppc64-gnu": "1.75.0", "@oxlint/binding-linux-riscv64-gnu": "1.75.0", "@oxlint/binding-linux-riscv64-musl": "1.75.0", "@oxlint/binding-linux-s390x-gnu": "1.75.0", "@oxlint/binding-linux-x64-gnu": "1.75.0", "@oxlint/binding-linux-x64-musl": "1.75.0", "@oxlint/binding-openharmony-arm64": "1.75.0", "@oxlint/binding-win32-arm64-msvc": "1.75.0", "@oxlint/binding-win32-ia32-msvc": "1.75.0", "@oxlint/binding-win32-x64-msvc": "1.75.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-m9WzjRcRYA/uqIZDa9tclrieoPJ/ln1QYTKdFx6NUOs8uY5DiHlIwRQoCrHT6OM6O3ww3l2skY5gO7G7ZphE7g=="], "package-manager-detector": ["package-manager-detector@1.6.0", "", {}, "sha512-61A5ThoTiDG/C8s8UMZwSorAGwMJ0ERVGj2OjoW5pAalsNOg15+iQiPzrLJ4jhZ1HJzmC2PIHT2oEiH3R5fzNA=="], @@ -539,11 +539,11 @@ "postcss": ["postcss@8.5.19", "", { "dependencies": { "nanoid": "^3.3.12", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-Mz8SaolMd8nB+G13WkORcxQKHZ/NE4xXevtkJHVuG+guo9/wYKlIMTKAqGdEmYOXR2ijPjTYNHssizdaVSUNdQ=="], - "prettier": ["prettier@3.9.5", "", { "bin": { "prettier": "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.0", "", { "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-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g=="], + "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=="], "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=="], @@ -617,13 +617,13 @@ "supports-color": ["supports-color@7.2.0", "", { "dependencies": { "has-flag": "^4.0.0" } }, "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw=="], - "svelte": ["svelte@5.56.5", "", { "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-P03YJmUy2JoOxYHb4Ka3oFat1hq2ko2it1MOItSjsJ4B6WgZPLc3+RyyU+57OGWhs3Ieq74EJpZtSnNXdAGgDw=="], + "svelte": ["svelte@5.56.7", "", { "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-5qERUZX80oQj6XrDMUmD2Uhd/cIpCPDWWKBK3ZHmyRUC9apPyamWM8xMo31mbWsIQxwG2hVoSnOJ/EcnhVkkzQ=="], "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.2", "", { "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": { "svelte-check": "bin/svelte-check" } }, "sha512-GoS4XJdGswlq0rIT1vtFLzJY1bvHtY37McY9H9Gkm1Ggw/ICdZYn8J/Z8Yi0BEL0i3R4+jtaWVePjyppMlij/A=="], + "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": { "svelte-check": "bin/svelte-check" } }, "sha512-DHdTCGX62R0fCxBEaT+USdASAnoaRBaaNczkRJl0K7o3WyoCeVUbVxo6fKqpOll/B+WMWCsiFK0eFrJSNBKZIg=="], "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=="], @@ -631,7 +631,7 @@ "tabbable": ["tabbable@6.4.0", "", {}, "sha512-05PUHKSNE8ou2dwIxTngl4EzcnsCDZGJ/iCLtDflR/SHB/ny14rXc+qU5P4mG9JkusiV7EivzY9Mhm55AzAvCg=="], - "tailwindcss": ["tailwindcss@4.3.2", "", {}, "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA=="], + "tailwindcss": ["tailwindcss@4.3.3", "", {}, "sha512-gOhV3P7ufE62QDGg1zVaTgCR+EtPv92k2nIhVcVKcLmxT1sUBsQGhnZj175j+MqRt4zLF7ic+sCYjfhxMxj7YQ=="], "tapable": ["tapable@2.3.3", "", {}, "sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A=="], @@ -679,7 +679,7 @@ "utrie": ["utrie@1.0.2", "", { "dependencies": { "base64-arraybuffer": "^1.0.2" } }, "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw=="], - "vite": ["vite@8.1.4", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.16", "rolldown": "~1.1.4", "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-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ=="], + "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=="], "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=="], @@ -717,7 +717,7 @@ "@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.2", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg=="], + "@tailwindcss/oxide-wasm32-wasi/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" }, "bundled": true }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], @@ -759,12 +759,14 @@ "vitest/picomatch": ["picomatch@4.0.4", "", {}, "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A=="], - "@tailwindcss/oxide-wasm32-wasi/@napi-rs/wasm-runtime/@tybys/wasm-util": ["@tybys/wasm-util@0.10.3", "", { "dependencies": { "tslib": "^2.4.0" } }, "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg=="], + "vitest/vite": ["vite@8.1.4", "", { "dependencies": { "lightningcss": "^1.32.0", "picomatch": "^4.0.5", "postcss": "^8.5.16", "rolldown": "~1.1.4", "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-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ=="], "mlly/pkg-types/confbox": ["confbox@0.1.8", "", {}, "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w=="], "prosemirror-dropcursor/prosemirror-view/prosemirror-model": ["prosemirror-model@1.25.4", "", { "dependencies": { "orderedmap": "^2.0.0" } }, "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA=="], "prosemirror-history/prosemirror-view/prosemirror-model": ["prosemirror-model@1.25.4", "", { "dependencies": { "orderedmap": "^2.0.0" } }, "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA=="], + + "vitest/vite/picomatch": ["picomatch@4.0.5", "", {}, "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A=="], } } diff --git a/package-lock.json b/package-lock.json index 9b97dc4..e30e442 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,42 +8,43 @@ "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", + "@tiptap/core": "^3.28.0", + "@tiptap/extension-placeholder": "^3.28.0", + "@tiptap/pm": "^3.28.0", + "@tiptap/starter-kit": "^3.28.0", "bits-ui": "^2.18.1", - "html2canvas-pro": "^2.2.4", + "html2canvas-pro": "^2.3.0", "idb": "^8.0.3", "svelte-awesome-color-picker": "^4.1.3", "tippy.js": "^6.3.7", "typescript-color-gradient": "^4.2.0" }, "devDependencies": { - "@iconify-json/tabler": "^1.2.35", + "@iconify-json/tabler": "^1.2.37", "@playwright/test": "^1.61.1", "@sveltejs/adapter-auto": "^7.0.1", - "@sveltejs/kit": "^2.69.3", + "@sveltejs/kit": "^2.70.1", "@sveltejs/vite-plugin-svelte": "^7.2.0", - "@tailwindcss/vite": "^4.3.2", - "@testing-library/jest-dom": "^6.9.1", + "@tailwindcss/vite": "^4.3.3", + "@testing-library/jest-dom": "^6.10.0", "@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", + "@tiptap/extension-color": "^3.28.0", + "@tiptap/extension-font-family": "^3.28.0", + "@tiptap/extension-text-style": "^3.28.0", "@types/node": "^26.1.1", + "@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.75.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.7", + "svelte-check": "^4.7.3", + "tailwindcss": "^4.3.3", "typescript": "^6.0.3", "unplugin-icons": "^23.0.1", - "vite": "^8.1.4", + "vite": "^8.1.5", "vitest": "^4.1.10" } }, @@ -134,6 +135,16 @@ "node": ">=6.9.0" } }, + "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", @@ -144,6 +155,22 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.29.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.7.tgz", @@ -154,6 +181,30 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/types": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", + "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", @@ -393,9 +444,9 @@ "license": "MIT" }, "node_modules/@iconify-json/tabler": { - "version": "1.2.35", - "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.35.tgz", - "integrity": "sha512-/sJMqHvh5ZWrEERVfDCT5NjVDeKJdhosFtKjJofAVl+P/3AzLiryOQw7WvrfDF25Xa5N/eoOQ15Y1jnhYXxBoQ==", + "version": "1.2.37", + "resolved": "https://registry.npmjs.org/@iconify-json/tabler/-/tabler-1.2.37.tgz", + "integrity": "sha512-tXc0jGhrxec6eTKxMI9We/r3cEItyU5dG8ngDOEKsL36a6+/xwk4sR7PIZROVajzxmvyUBsn659adDIfcswiUw==", "dev": true, "license": "MIT", "dependencies": { @@ -505,9 +556,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.75.0.tgz", + "integrity": "sha512-lutovtFzJqlRaqpZrCqSSGaHZzl9nIxxpjLzhSRLunN6dCLylj0uzlCyQGaQDIys7rrv8kVXiFO+R4Zpn0bX7g==", "cpu": [ "arm" ], @@ -522,9 +573,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.75.0.tgz", + "integrity": "sha512-hXI0hDgHkw4w5nfru72aG7y+2iQJmC4waH/KV6H/hbgA6yAP5jYNx0P9yug15Hs0tWl/+mda3Jjn/2gmDT48tw==", "cpu": [ "arm64" ], @@ -539,9 +590,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.75.0.tgz", + "integrity": "sha512-D91BWbK/dMYfCcrghspPIuKs2D9LF4Z/OabVSQjw1AO6PWxArD7teDA48bm0ySFqWDaPVqmQRl5GMWNglTXyrQ==", "cpu": [ "arm64" ], @@ -556,9 +607,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.75.0.tgz", + "integrity": "sha512-02mpwzf12BonZ6PT0TuQoomvEh2kVl2WGBIKWezCyToIS+rYkQZ6GXnARBAl9A4Ovm2V+Xe7M4KretyqmmcnJQ==", "cpu": [ "x64" ], @@ -573,9 +624,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.75.0.tgz", + "integrity": "sha512-qZJgLnDaBsiL5YESx2t/TZ8eXkL9fEkKoXEdzegROhlz9A0lgyGnZ0dAzJrh7LJAHQl2K9RdRueN2s/9N7+odg==", "cpu": [ "x64" ], @@ -590,9 +641,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.75.0.tgz", + "integrity": "sha512-7XlaWA5BJD3XpCfrEqjEe6Zseeb14S7QGa304XfwKignRaKQ+eIj775BQ7nIslggWickl4IsPUFqJ+/gAyNHVg==", "cpu": [ "arm" ], @@ -607,9 +658,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.75.0.tgz", + "integrity": "sha512-av6Tpv8yrcMMMOadOqENBhlsLRcGFXXwoQ0hzHhsmS9FJ4Wioy8we427GbcMe2XTxmL2e60T67H1Dyr3up+tAA==", "cpu": [ "arm" ], @@ -624,9 +675,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.75.0.tgz", + "integrity": "sha512-WcUhd8fHT5plrA14lANevl+hOl815mVI5t2hU21oFWrZKFXIVV/Sr4rWQV0NzSvzBupbMLNc5ErEA6Ehxh5jMg==", "cpu": [ "arm64" ], @@ -644,9 +695,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.75.0.tgz", + "integrity": "sha512-UWzp5wRHFe/ESO3+eEaxXsTkYTGLYjnTsi/I5neEacXSItQ6WNleapfOAeA4x2b8nyhJ4uQxqvtv9pHv8kWJtQ==", "cpu": [ "arm64" ], @@ -664,9 +715,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.75.0.tgz", + "integrity": "sha512-XEVRwGMLKCUKrvhLAz4F6AIh8MJrQVdSZtAmPpRZt9tGPsUnamPOcl3dS/ZQzJnar/Ymgc//+xho0L60Emzuxg==", "cpu": [ "ppc64" ], @@ -684,9 +735,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.75.0.tgz", + "integrity": "sha512-mAG4DUXqfLC8cTjMD2kt3jDmVzFREYtDyeLNdLdsCcBc4Zbl2EMuiFektGBilQwkNjYnMvCqJs55U+Hyb+b+jw==", "cpu": [ "riscv64" ], @@ -704,9 +755,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.75.0.tgz", + "integrity": "sha512-95hrAvriAlI+pekSomTFIn0+bawMDlDwTNVmdjsFusTHyL2JWh7TWvRNG/Lkim72uN8OiCcO9wcaC6omLP5E3w==", "cpu": [ "riscv64" ], @@ -724,9 +775,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.75.0.tgz", + "integrity": "sha512-4b6f2+FrtruAESrCqIKcrarzfrSx+wk2QNcp+RT91/Prc+pMQMAfyZ1rG1c3tFQNl8Bc616tx40uNXyxNBRPbQ==", "cpu": [ "s390x" ], @@ -744,9 +795,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.75.0.tgz", + "integrity": "sha512-nshAhrUvXFUWOvqQ2soIw7HFNWvpvEV4o0cYSqPtzLiPF5gKyYTDOOTJ6Rn8g8K/iGvPIrbDA4v8+5MvnjJrrg==", "cpu": [ "x64" ], @@ -764,9 +815,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.75.0.tgz", + "integrity": "sha512-e4jNxLKnxLC6sYBQRxrI2pgIIxnmMtF8U/VwNYcjTT/CLS+spH624cYVnj07bTKwaEWT37/e025isOs6j/0xqA==", "cpu": [ "x64" ], @@ -784,9 +835,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.75.0.tgz", + "integrity": "sha512-hZ2lH+1qLf/DiEP9UWuQTK2JWj/BgvMB4jhIV4SmNU1wfEiYYX4TynQyAZXx0j9X4qRYizAL042SKaV+8ynh4w==", "cpu": [ "arm64" ], @@ -801,9 +852,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.75.0.tgz", + "integrity": "sha512-Ilj6PNzGDS3bCU0MSJH7Msh0NhH+T/mRp2shwg+q+GHeVlPwP5LEboW96aW+3kVKFk6zYZy1Xi5pZkqZh6X8KQ==", "cpu": [ "arm64" ], @@ -818,9 +869,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.75.0.tgz", + "integrity": "sha512-QVit2nOEOiPhkmsrksPSkoGCdnZRNkspt8fwoYyP09te1VEbnSj4LAxua4rc8FKTmWkySVe05j8iz9GXYfF1AQ==", "cpu": [ "ia32" ], @@ -835,9 +886,9 @@ } }, "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.75.0.tgz", + "integrity": "sha512-DSxnNkBUAYARPwJtR12Ig3deWr8w0H997xP6jy33i+e0SyYJw8FKuz4+cZtpmPEhQmvlPJE3X/2vNxDmLkd/rA==", "cpu": [ "x64" ], @@ -1178,9 +1229,9 @@ } }, "node_modules/@sveltejs/kit": { - "version": "2.69.3", - "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.69.3.tgz", - "integrity": "sha512-cphwqMRcE19/9VkrIPr5qZhQ0SptSSDfDzRUpYHu9OJDFGuYBFyJzK+KQA27wB4YG32O/yF2QjBkDmTyo0vtCw==", + "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": { @@ -1260,49 +1311,49 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.3.2.tgz", - "integrity": "sha512-yWP/sqEcBLaD8JuA6zNwxoYKr75qxTioYwlRwekj5Jr/I5GXnoJfjetH/psLUIv74cYTH2lBUEzBkinthoYcBg==", + "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.21.6", + "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.2" + "tailwindcss": "4.3.3" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.3.2.tgz", - "integrity": "sha512-z8ZgnzX8gdNoWLBLqBPoh/sjnxkwvf9ZuWjnO0l0yIzbLa5/9S+eC5QxGZKRobVHIC3/1BoMWjHblqWjcgFgag==", + "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.2", - "@tailwindcss/oxide-darwin-arm64": "4.3.2", - "@tailwindcss/oxide-darwin-x64": "4.3.2", - "@tailwindcss/oxide-freebsd-x64": "4.3.2", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.3.2", - "@tailwindcss/oxide-linux-arm64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-arm64-musl": "4.3.2", - "@tailwindcss/oxide-linux-x64-gnu": "4.3.2", - "@tailwindcss/oxide-linux-x64-musl": "4.3.2", - "@tailwindcss/oxide-wasm32-wasi": "4.3.2", - "@tailwindcss/oxide-win32-arm64-msvc": "4.3.2", - "@tailwindcss/oxide-win32-x64-msvc": "4.3.2" + "@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.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.3.2.tgz", - "integrity": "sha512-WHxqIuHpvZ5VtdX6GTl1Ik/Vp2YuN42Et+0CdeaVd/frQ9jAvGmvR8vLT+jk3e8/Q3x8kECB9+R17pgpp2BulA==", + "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" ], @@ -1317,9 +1368,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.3.2.tgz", - "integrity": "sha512-GZypeUY/IDJW3877KeM+O67vbXr3MBnbtEL4aYhNErv/JWZhye2vGSWWG9tB6iiqR2MqRNkY8IOUy4NdSZV26w==", + "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" ], @@ -1334,9 +1385,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.3.2.tgz", - "integrity": "sha512-UIIzmefR6KO1sDU7MzRqAxC8iBpft/VhkGjTjnhoS6k7Z3rQ9wEgA1ODSiyH/tcSYssulNm4Ci3hOeK1jH7ccQ==", + "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" ], @@ -1351,9 +1402,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.3.2.tgz", - "integrity": "sha512-GN+uAmcI6DNspnCDwtOAZrTz6oukJnp337qZvxqCGLd3BHBzJpO0ZbTLRvJNdztOeAmTzewewGIMPb0tk2R4WA==", + "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" ], @@ -1368,9 +1419,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.3.2.tgz", - "integrity": "sha512-4ABn7qSbdHRwTiDiuWNegCyb5+2FJ4vKIKc3DmKrvAFw7MU1Lm11dIkTPwUaFdTzc7IsOpDbqBrlh0x6y36U/w==", + "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" ], @@ -1385,9 +1436,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.3.2.tgz", - "integrity": "sha512-wDgEIGwoM8w8pufh9LVt1PahDgNdKXrLC2qfAnV3vAmococ9RWbxeAw4pxPttd/TsJfwjyLf90Dg1y9y8I6Emw==", + "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" ], @@ -1405,9 +1456,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.3.2.tgz", - "integrity": "sha512-J5Nuk0uZQIiMTJj3LEx4sAA9tMFUoXQZFv1J6An+QGYe53HKRJuFDi0rpq/tuouCZeAbOBY3kQ6g8qeD4TUjtA==", + "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" ], @@ -1425,9 +1476,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.3.2.tgz", - "integrity": "sha512-kqCZpSKOBEJO4mz7OqWoofBZeXTAwaVGPj0ErAj7CojmhKpWVWVOnrt9dE8odoIraZq4oj3ausM37kXi+Tow8w==", + "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" ], @@ -1445,9 +1496,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.3.2.tgz", - "integrity": "sha512-cixpqbh2toJDmkuCRI68nXA8ZxNmdK9Y+9v5h3MC3ZQKy/0BO8AWzlkWyRM7JAFSGBlfig4YVTPsK6MVgqz1uw==", + "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" ], @@ -1465,9 +1516,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.3.2.tgz", - "integrity": "sha512-4ec2Z/LOmRsAgU23CS4xeJfcJlmRg94A/XrbGRCF1gyU/zdDfRLYDVsS+ynSZCmGNxQ1jQriQOKMQeQxBA3Isw==", + "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", @@ -1494,10 +1545,76 @@ "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.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.3.2.tgz", - "integrity": "sha512-Zyr/M0+XcYZu3bZrUytc7TXvrk0ftWfl8gN2MwekNDzhqhKRUucMPSeOzM0o0wH5AWOU49BsKRrfKxI2atCPMQ==", + "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" ], @@ -1512,9 +1629,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.3.2.tgz", - "integrity": "sha512-QI9BO7KlNZsp2GuO0jwAAj5jCDABOKXRkCk2XuKTSaNEFSdfzqswYVTtCHBNKHLsqyjFyFkqlDiwkNbTYSssMQ==", + "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" ], @@ -1529,15 +1646,15 @@ } }, "node_modules/@tailwindcss/vite": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.3.2.tgz", - "integrity": "sha512-eHpMeX4JXfVNJDEcsouTeCBubJBTcTLigeaw/NTUW6PB5ATKKXdyonnXgTBX2VuRbjz1hjfz6C5XAhr52ImQXA==", + "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.2", - "@tailwindcss/oxide": "4.3.2", - "tailwindcss": "4.3.2" + "@tailwindcss/node": "4.3.3", + "@tailwindcss/oxide": "4.3.3", + "tailwindcss": "4.3.3" }, "peerDependencies": { "vite": "^5.2.0 || ^6 || ^7 || ^8" @@ -1581,9 +1698,10 @@ "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==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.10.0.tgz", + "integrity": "sha512-HQwu0KaB2zyT0iLzBL+8CLyZDL3KlZlZJ+2iyc9uCUnlJVskJU/UlPuVCyIPhtukjPQdT2QNoR5nCP5FqTmmDQ==", + "deprecated": "Incorrect minor release with breaking changes (Node >=22 and required @testing-library/dom peer). Use 6.9.1 for the 6.x line, or upgrade to 7.0.0.", "dev": true, "license": "MIT", "dependencies": { @@ -1595,9 +1713,12 @@ "redent": "^3.0.0" }, "engines": { - "node": ">=14", + "node": ">=22", "npm": ">=6", "yarn": ">=1" + }, + "peerDependencies": { + "@testing-library/dom": ">=10 <11" } }, "node_modules/@testing-library/svelte": { @@ -1641,89 +1762,89 @@ } }, "node_modules/@tiptap/core": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/core/-/core-3.27.4.tgz", - "integrity": "sha512-8W/GwlEn0JwNdpyVfTWcXwHYUpj9BWwO++YxtizmgjJzlwigSh7/xLVJMwVykuQHQ2fCq5rkUvmBRtpHOMLUQA==", + "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.27.4" + "@tiptap/pm": "3.28.0" } }, "node_modules/@tiptap/extension-blockquote": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-blockquote/-/extension-blockquote-3.27.4.tgz", - "integrity": "sha512-d1tOHgP3R5cOE+Ot8qL/dkLXRByajgn+j6cCXHqDtmJO2wsK9knmbKQ0SEjbKrU6OgHrTnY/EotNxBEBW9HGoA==", + "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.27.4", - "@tiptap/pm": "3.27.4" + "@tiptap/core": "3.28.0", + "@tiptap/pm": "3.28.0" } }, "node_modules/@tiptap/extension-bold": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bold/-/extension-bold-3.27.4.tgz", - "integrity": "sha512-wTtJUUAxCAZ01ICH2DNlOBzzHKRQ1ZST8aRYtIhBPzqEUhnJaKGcjnDB4X49fqPi48iXaPxzhsInDl+rVUujWg==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-bullet-list": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-bullet-list/-/extension-bullet-list-3.27.4.tgz", - "integrity": "sha512-rvja0N1RnwGJAVwDdbUfDIJ4NoT+KjPFaZudKiPuEMfMHfbqe4xcbbC2hsfs61JNcl2xmx+ohV6lzD9YxxJl1w==", + "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.27.4" + "@tiptap/extension-list": "3.28.0" } }, "node_modules/@tiptap/extension-code": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code/-/extension-code-3.27.4.tgz", - "integrity": "sha512-aPc7opCR1ylK4m4c2lsjLsGpEBD1fLQQKWd5PbZiJvrTF8gkdGZlYLt9A6VukpxeJyHhb22Jaj4fxgKmGMeTtw==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-code-block": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-code-block/-/extension-code-block-3.27.4.tgz", - "integrity": "sha512-a5caWfWN6Z6usy48vzJDDOhWoA6+rFFCHGpQM7jXn/7rRzYPcvBzTZUGptjEbltj4YqtrQ2tVwTJcCtbb+mknA==", + "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.27.4", - "@tiptap/pm": "3.27.4" + "@tiptap/core": "3.28.0", + "@tiptap/pm": "3.28.0" } }, "node_modules/@tiptap/extension-color": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-color/-/extension-color-3.27.4.tgz", - "integrity": "sha512-uGbgErKGKO4OTBGqnXOA1CGXa3IqoBaiPBGcHu/px01fS8EVFu0A7q5HS6vxFiMK6qW5x71sEpCA+FUINMAb3g==", + "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": { @@ -1731,39 +1852,39 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-text-style": "3.27.4" + "@tiptap/extension-text-style": "3.28.0" } }, "node_modules/@tiptap/extension-document": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-document/-/extension-document-3.27.4.tgz", - "integrity": "sha512-7nAqgfkgb9HADBeCTnOHuTiyZuxfxvMPT3nH4OZeY+cmtkI1On3QffqlmtcUPvNbkhT3o9ehA1hVfCnQ1Ye4LQ==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-dropcursor": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-dropcursor/-/extension-dropcursor-3.27.4.tgz", - "integrity": "sha512-RiZasQJuUTUO3aME16Bn8eJH7cYnvhT5JCFDFq0ya/1iFI9wUQA2NJC5tb5TrZ74+sQwkYU9VzexnchM481Y9w==", + "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.27.4" + "@tiptap/extensions": "3.28.0" } }, "node_modules/@tiptap/extension-font-family": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-font-family/-/extension-font-family-3.27.4.tgz", - "integrity": "sha512-Xf935Udqbk22fe5xWo3AM8FsVrdtW9afHhGLXvKQvzUpxk36y87VDmj8V0AKwlLpKJDq4b9O7Mg2xPdsuj2k8w==", + "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": { @@ -1771,79 +1892,79 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/extension-text-style": "3.27.4" + "@tiptap/extension-text-style": "3.28.0" } }, "node_modules/@tiptap/extension-gapcursor": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-gapcursor/-/extension-gapcursor-3.27.4.tgz", - "integrity": "sha512-svLwSKcFhzpcJeXvxxKkRFuQpykmXrQefVhEsaXq0L95yJIIAGKMRmQC3mxKdzL2j0P9cY7V41bNVSyOAyvclw==", + "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.27.4" + "@tiptap/extensions": "3.28.0" } }, "node_modules/@tiptap/extension-hard-break": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-hard-break/-/extension-hard-break-3.27.4.tgz", - "integrity": "sha512-W+Z9pmDgqjbdu3NeZOQrzA15iM4w60Yd8l2CYzxcdApPVIfYzb2S3a7+u1RqW9wnTYb6xyZjASmFNfxXS4P4cg==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-heading": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-heading/-/extension-heading-3.27.4.tgz", - "integrity": "sha512-RgvpxzuYk6QEK+az+eiXpWvGlUso42zNcGnjyUrvskoZjS47MbhSg8ylRYQSRtXE0ETlXhAx4J7iGlGr72kyIw==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-horizontal-rule": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-horizontal-rule/-/extension-horizontal-rule-3.27.4.tgz", - "integrity": "sha512-2eQU/55nE5mhMJHALtLMuBL3dcVJUDVVT7n+uZYMaYE63BtCvC4VS08YLFSR7JZSVJIlgVAmdt5nAw0B+rEPNA==", + "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.27.4", - "@tiptap/pm": "3.27.4" + "@tiptap/core": "3.28.0", + "@tiptap/pm": "3.28.0" } }, "node_modules/@tiptap/extension-italic": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-italic/-/extension-italic-3.27.4.tgz", - "integrity": "sha512-PeZT4XbyxAp7Lqo/hfA1k5LI27g1RlgS+YgXp2CeHXIrUfSpO5HlZXh02Bvb0pOdl3RFw2tEKtlHzjt8Y1+Nwg==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-link": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-link/-/extension-link-3.27.4.tgz", - "integrity": "sha512-6K/FkNwMLWWQbNWKlycrUPTN7YcyVFdFwZncoBXe5WyarRjLTGw7ywafnCI9PDIWSq7ttzVL4NgjN2IN8kBXww==", + "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" @@ -1853,119 +1974,119 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.27.4", - "@tiptap/pm": "3.27.4" + "@tiptap/core": "3.28.0", + "@tiptap/pm": "3.28.0" } }, "node_modules/@tiptap/extension-list": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list/-/extension-list-3.27.4.tgz", - "integrity": "sha512-A0BgmRO1RE0yLCx9w7GQITtKfS9wLE5cdngSYDiSpwulcXJhJjKm5mZ4OUZmks2VN4HO5jMl2BWCGt2NSDhA+w==", + "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.27.4", - "@tiptap/pm": "3.27.4" + "@tiptap/core": "3.28.0", + "@tiptap/pm": "3.28.0" } }, "node_modules/@tiptap/extension-list-item": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-item/-/extension-list-item-3.27.4.tgz", - "integrity": "sha512-z5TVuPw2mkK0B/x+gFg3uUV7tBdaElDFg0zVgnXZCqlSVTLfIyInOOnG5LTWoAd9BdzBjGrzE3PohDcLVDDGBQ==", + "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.27.4" + "@tiptap/extension-list": "3.28.0" } }, "node_modules/@tiptap/extension-list-keymap": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-list-keymap/-/extension-list-keymap-3.27.4.tgz", - "integrity": "sha512-on7JNDi7Eqz7UdZeZdiO83bQHo0flVDHzjmtR+v/nrCGW9H15D3CHs5+4ozLDiCvTK8tbkBuut/l9AWNxcCE/Q==", + "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.27.4" + "@tiptap/extension-list": "3.28.0" } }, "node_modules/@tiptap/extension-ordered-list": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-ordered-list/-/extension-ordered-list-3.27.4.tgz", - "integrity": "sha512-bHwLiof0FqJfWzB0act7oEKMTZatEKQ4IYCvmyF5EktjMs4kxEatkPp4Yx/1LSYSjLy1MMT7oLELyaz2FFYyXA==", + "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.27.4" + "@tiptap/extension-list": "3.28.0" } }, "node_modules/@tiptap/extension-paragraph": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-paragraph/-/extension-paragraph-3.27.4.tgz", - "integrity": "sha512-8Dnr1J5s/s4XYYuEF3b784NnCxLjXOlQpmGyXRxTAzW7JaOP08tIUJWVNvSMekfXc2vXa33HUbqjxyyWZEQ6LQ==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-placeholder": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-placeholder/-/extension-placeholder-3.27.4.tgz", - "integrity": "sha512-7hBoFLeddCv1WzkqB0x3coZ1Hp9WZ9wLoRXIUtUhRKMpzFq2IlTtW1iw88g9pTJnL98bCCElN4DZ4mYtaQvmgA==", + "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.27.4" + "@tiptap/extensions": "3.28.0" } }, "node_modules/@tiptap/extension-strike": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-strike/-/extension-strike-3.27.4.tgz", - "integrity": "sha512-8OXwcPKuV3ToBBgyvDxH1jQdObK5FIKCGiyIim6qNWiOpi9BhM3XYD+aO1khjv8qIjtoI/DYbizF4ewj09fX2g==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-text": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text/-/extension-text-3.27.4.tgz", - "integrity": "sha512-lKQH/hP4FBXsziHypd6Ywj8JFvMLM5GVkK1xsH6yApNuXbHq95rd42ZOYWpYILIBib7tlaz93z61d74UrJiuiw==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-text-style": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-text-style/-/extension-text-style-3.27.4.tgz", - "integrity": "sha512-Wmj64TQXY85gc7lUNbubW32sDCnVOJlpGraMeARRC9Z0EKBX1JpAxddo/64F17bn3kzLxXVszBFyLRcNgTdU2g==", + "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": { @@ -1973,40 +2094,40 @@ "url": "https://github.com/sponsors/ueberdosis" }, "peerDependencies": { - "@tiptap/core": "3.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extension-underline": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extension-underline/-/extension-underline-3.27.4.tgz", - "integrity": "sha512-nRJGvRyEXDtINlHTW+C2oWcL3vmX1URVxAPpkD3Zwn5Rb/vEeOU/pk/w97I0iid816MR4iVbvl1XhbUVegK9gQ==", + "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.27.4" + "@tiptap/core": "3.28.0" } }, "node_modules/@tiptap/extensions": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/extensions/-/extensions-3.27.4.tgz", - "integrity": "sha512-d8opkg2iGtVwJmNGIqv0blfRxnvWOJp1brz+Z8CsP4ojSS2ZtaE46d6JSQ5OeJ7nMpjhT+9wh4UQcA7OSEO59w==", + "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.27.4", - "@tiptap/pm": "3.27.4" + "@tiptap/core": "3.28.0", + "@tiptap/pm": "3.28.0" } }, "node_modules/@tiptap/pm": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/pm/-/pm-3.27.4.tgz", - "integrity": "sha512-UB8lcyomfWk7YGI2PZKNqcYXfyRA+PFj+QntlsUXyrsiA5JJIaE8SHKYjxKlGG/xtW3EtPm1b0p38T9Mk4xiFw==", + "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", @@ -2029,35 +2150,35 @@ } }, "node_modules/@tiptap/starter-kit": { - "version": "3.27.4", - "resolved": "https://registry.npmjs.org/@tiptap/starter-kit/-/starter-kit-3.27.4.tgz", - "integrity": "sha512-/sb6rFxNt5BO4hWpUwvHh+Yh1kNyCQuuz3oDpGef5HUUjSdu9p9rfNiHWIUKBadK8VXuw5es7N+UlZ4hma+gvA==", + "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.27.4", - "@tiptap/extension-blockquote": "^3.27.4", - "@tiptap/extension-bold": "^3.27.4", - "@tiptap/extension-bullet-list": "^3.27.4", - "@tiptap/extension-code": "^3.27.4", - "@tiptap/extension-code-block": "^3.27.4", - "@tiptap/extension-document": "^3.27.4", - "@tiptap/extension-dropcursor": "^3.27.4", - "@tiptap/extension-gapcursor": "^3.27.4", - "@tiptap/extension-hard-break": "^3.27.4", - "@tiptap/extension-heading": "^3.27.4", - "@tiptap/extension-horizontal-rule": "^3.27.4", - "@tiptap/extension-italic": "^3.27.4", - "@tiptap/extension-link": "^3.27.4", - "@tiptap/extension-list": "^3.27.4", - "@tiptap/extension-list-item": "^3.27.4", - "@tiptap/extension-list-keymap": "^3.27.4", - "@tiptap/extension-ordered-list": "^3.27.4", - "@tiptap/extension-paragraph": "^3.27.4", - "@tiptap/extension-strike": "^3.27.4", - "@tiptap/extension-text": "^3.27.4", - "@tiptap/extension-underline": "^3.27.4", - "@tiptap/extensions": "^3.27.4", - "@tiptap/pm": "^3.27.4" + "@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", @@ -2153,6 +2274,37 @@ "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", @@ -2321,6 +2473,25 @@ "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/ast-v8-to-istanbul/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/axobject-query": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz", @@ -2550,9 +2721,9 @@ "license": "MIT" }, "node_modules/enhanced-resolve": { - "version": "5.21.6", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.21.6.tgz", - "integrity": "sha512-aNnGCvbJ/RIyWo1IuhNdVjnNF+EjH9wpzpNHt+ci/m9He9LJvUN8wrCcXjp9cWsGNAuvSpVFTx/vraAFQ8qGjQ==", + "version": "5.24.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.24.3.tgz", + "integrity": "sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2692,6 +2863,16 @@ "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-encoding-sniffer": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-6.0.0.tgz", @@ -2705,10 +2886,17 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "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/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==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/html2canvas-pro/-/html2canvas-pro-2.3.1.tgz", + "integrity": "sha512-w7CCWi0B0kCy/joy5cPN2GIDGW0iwbqBppxxc2Vc5UyqYDQ1K13ZVr+MyGR/34Mq03emCTxVbBTpG299/prACw==", "license": "MIT", "dependencies": { "css-line-break": "^2.1.0", @@ -2788,6 +2976,45 @@ "@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", @@ -3176,6 +3403,34 @@ "@jridgewell/sourcemap-codec": "^1.5.5" } }, + "node_modules/magicast": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.5.3.tgz", + "integrity": "sha512-pVKE4UdSQ7DvHzivsCIFx2BJn1mHG6KsyrFcaxFx6tONdneEuThrDx0Cj3AMg58KyN4pzYT+LHOotxDQDjNvkw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "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/mdn-data": { "version": "2.27.1", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.27.1.tgz", @@ -3292,9 +3547,9 @@ "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==", + "version": "1.75.0", + "resolved": "https://registry.npmjs.org/oxlint/-/oxlint-1.75.0.tgz", + "integrity": "sha512-m9WzjRcRYA/uqIZDa9tclrieoPJ/ln1QYTKdFx6NUOs8uY5DiHlIwRQoCrHT6OM6O3ww3l2skY5gO7G7ZphE7g==", "dev": true, "license": "MIT", "bin": { @@ -3307,28 +3562,28 @@ "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" + "@oxlint/binding-android-arm-eabi": "1.75.0", + "@oxlint/binding-android-arm64": "1.75.0", + "@oxlint/binding-darwin-arm64": "1.75.0", + "@oxlint/binding-darwin-x64": "1.75.0", + "@oxlint/binding-freebsd-x64": "1.75.0", + "@oxlint/binding-linux-arm-gnueabihf": "1.75.0", + "@oxlint/binding-linux-arm-musleabihf": "1.75.0", + "@oxlint/binding-linux-arm64-gnu": "1.75.0", + "@oxlint/binding-linux-arm64-musl": "1.75.0", + "@oxlint/binding-linux-ppc64-gnu": "1.75.0", + "@oxlint/binding-linux-riscv64-gnu": "1.75.0", + "@oxlint/binding-linux-riscv64-musl": "1.75.0", + "@oxlint/binding-linux-s390x-gnu": "1.75.0", + "@oxlint/binding-linux-x64-gnu": "1.75.0", + "@oxlint/binding-linux-x64-musl": "1.75.0", + "@oxlint/binding-openharmony-arm64": "1.75.0", + "@oxlint/binding-win32-arm64-msvc": "1.75.0", + "@oxlint/binding-win32-ia32-msvc": "1.75.0", + "@oxlint/binding-win32-x64-msvc": "1.75.0" }, "peerDependencies": { - "oxlint-tsgolint": ">=0.24.0", + "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "peerDependenciesMeta": { @@ -3461,9 +3716,9 @@ } }, "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==", + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", "dev": true, "license": "MIT", "bin": { @@ -3491,9 +3746,9 @@ } }, "node_modules/prettier-plugin-tailwindcss": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.8.0.tgz", - "integrity": "sha512-V8ITGH87yuBDF6JpEZTOVlUz/saAwqb8f3HRgUj8Lh+tGCcrmorhsLpYqzygwFwK0PE2Ib6Mv3M7T/uE2tZV1g==", + "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": { @@ -3885,6 +4140,19 @@ "node": ">=v12.22.7" } }, + "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", @@ -3977,10 +4245,23 @@ "inline-style-parser": "0.2.7" } }, + "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.5", - "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.56.5.tgz", - "integrity": "sha512-P03YJmUy2JoOxYHb4Ka3oFat1hq2ko2it1MOItSjsJ4B6WgZPLc3+RyyU+57OGWhs3Ieq74EJpZtSnNXdAGgDw==", + "version": "5.56.7", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-5.56.7.tgz", + "integrity": "sha512-5qERUZX80oQj6XrDMUmD2Uhd/cIpCPDWWKBK3ZHmyRUC9apPyamWM8xMo31mbWsIQxwG2hVoSnOJ/EcnhVkkzQ==", "license": "MIT", "dependencies": { "@jridgewell/remapping": "^2.3.4", @@ -4030,9 +4311,9 @@ } }, "node_modules/svelte-check": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.7.2.tgz", - "integrity": "sha512-GoS4XJdGswlq0rIT1vtFLzJY1bvHtY37McY9H9Gkm1Ggw/ICdZYn8J/Z8Yi0BEL0i3R4+jtaWVePjyppMlij/A==", + "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": { @@ -4097,9 +4378,9 @@ "license": "MIT" }, "node_modules/tailwindcss": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.3.2.tgz", - "integrity": "sha512-WtctNNSH8A9jlMIqxzuYumOHU5uGZyRv0Q5svQl+oEPy5w84YpBxdb7MdqyiSPQge5jTJ6zFQLq0PFygdccSBA==", + "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" }, @@ -4380,16 +4661,16 @@ } }, "node_modules/vite": { - "version": "8.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.1.4.tgz", - "integrity": "sha512-bTT9PsdWO+MQMNG9ZXIP/qM9wGh37DFxTV/sPq9cFpHr3w4jkgef032PkAL9jAqhk3Nz8NQw3O8n6/xFkqO4QQ==", + "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.16", - "rolldown": "~1.1.4", + "postcss": "^8.5.17", + "rolldown": "~1.1.5", "tinyglobby": "^0.2.17" }, "bin": { diff --git a/package.json b/package.json index a059f5a..500a4ac 100644 --- a/package.json +++ b/package.json @@ -10,46 +10,46 @@ "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", "format": "prettier . --write . --cache", "lint": "oxlint . -W perf", - "test:unit": "vitest", + "test:unit": "vitest --coverage", "test": "npm run test:unit -- --run && npm run test:e2e", "test:e2e": "playwright test" }, "devDependencies": { - "@iconify-json/tabler": "^1.2.35", + "@iconify-json/tabler": "^1.2.37", "@playwright/test": "^1.61.1", "@sveltejs/adapter-auto": "^7.0.1", - "@sveltejs/kit": "^2.69.3", + "@sveltejs/kit": "^2.70.1", "@sveltejs/vite-plugin-svelte": "^7.2.0", - "@tailwindcss/vite": "^4.3.2", - "@testing-library/jest-dom": "^6.9.1", + "@tailwindcss/vite": "^4.3.3", + "@testing-library/jest-dom": "^6.10.0", "@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", + "@tiptap/extension-color": "^3.28.0", + "@tiptap/extension-font-family": "^3.28.0", + "@tiptap/extension-text-style": "^3.28.0", "@types/node": "^26.1.1", "@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.75.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.7", + "svelte-check": "^4.7.3", + "tailwindcss": "^4.3.3", "typescript": "^6.0.3", "unplugin-icons": "^23.0.1", - "vite": "^8.1.4", + "vite": "^8.1.5", "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", + "@tiptap/core": "^3.28.0", + "@tiptap/extension-placeholder": "^3.28.0", + "@tiptap/pm": "^3.28.0", + "@tiptap/starter-kit": "^3.28.0", "bits-ui": "^2.18.1", - "html2canvas-pro": "^2.2.4", + "html2canvas-pro": "^2.3.0", "idb": "^8.0.3", "svelte-awesome-color-picker": "^4.1.3", "tippy.js": "^6.3.7", diff --git a/src/lib/text/nbt/export.ts b/src/lib/text/nbt/export.ts index bcafd90..60f9bdf 100644 --- a/src/lib/text/nbt/export.ts +++ b/src/lib/text/nbt/export.ts @@ -7,7 +7,7 @@ import type { import { type JSONContent } from "@tiptap/core"; import { defaultColorLUT, - isMarkType, + findMarkType, trueMarkOrUndefined, unescapeUnicode, } from "../utils"; @@ -117,8 +117,8 @@ export function addTypeSpecificValues( * @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; + if (findMarkType(c, "clickEvent")) { + const ce = findMarkType(c, "clickEvent")?.attrs; current.click_event = { action: ce!.action }; switch (ce!.action) { case "open_url": @@ -140,8 +140,8 @@ function newApplyInteractiveValues(current: MinecraftText, c: JSONContent) { } } - if (isMarkType(c, "hoverEvent")) { - const ce = isMarkType(c, "hoverEvent")?.attrs; + if (findMarkType(c, "hoverEvent")) { + const ce = findMarkType(c, "hoverEvent")?.attrs; current.hover_event = { action: ce!.action, value: ce!.value }; } } @@ -154,13 +154,13 @@ function newApplyInteractiveValues(current: MinecraftText, c: JSONContent) { * @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; + if (findMarkType(c, "clickEvent")) { + const ce = findMarkType(c, "clickEvent")?.attrs; current.clickEvent = { action: ce!.action, value: ce!.value }; } - if (isMarkType(c, "hoverEvent")) { - const ce = isMarkType(c, "hoverEvent")?.attrs; + if (findMarkType(c, "hoverEvent")) { + const ce = findMarkType(c, "hoverEvent")?.attrs; current.hoverEvent = { action: ce!.action, contents: ce!.value }; } } @@ -177,7 +177,7 @@ export function convert( exportVersion = get(outputVersion); let out = translateJSON(jsonContent, { exportType, optimise }); if (exportVersion.index >= 1 && !force_json) { - // only remove strings + // only remove string keys out = out.replace(/(?<=[{,]\s*)"[^"]*"\s*:/g, (match) => match.replace(/"/g, ""), ); diff --git a/src/lib/text/nbt/import.ts b/src/lib/text/nbt/import.ts index 8654aaf..701a950 100644 --- a/src/lib/text/nbt/import.ts +++ b/src/lib/text/nbt/import.ts @@ -296,28 +296,27 @@ function applyStyling( } if (text.click_event) { - const cE = 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 ( - (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)) + (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 = - cE.url || cE.command || cE.value || cE.page || cE.dialog; + const actionSource = e.url || e.command || e.value || e.page || e.dialog; finalText.marks?.push({ type: "clickEvent", attrs: { - action: cE.action, + action: e.action, value: actionSource, }, }); diff --git a/src/lib/text/nbt/optimiser.ts b/src/lib/text/nbt/optimiser.ts index 417e4d4..86477ef 100644 --- a/src/lib/text/nbt/optimiser.ts +++ b/src/lib/text/nbt/optimiser.ts @@ -44,14 +44,6 @@ export function optimise( 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: "" }); @@ -132,24 +124,6 @@ function propsMatch(a: any, b: any, property: string) { : 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, - ))) - ); -} - /** * Flattens the text elements by converting objects with only text property to strings and removing undefined properties * @@ -174,9 +148,11 @@ function flattenMCText(stringyTextElements: StringyMCText[]): StringyMCText[] { } } - // if only text property remains, convert to string output.push( - Object.keys(component).length === 1 ? component.text! : component, + // if only text property remains, convert to string + Object.keys(component).length === 1 && component.text + ? component.text + : component, ); } return output; @@ -193,7 +169,7 @@ function mergeTextComponents(output: StringyMCText[]) { const current = output[i], next = output[i + 1]; - // Merge whitespace to next component + // Merge whitespace and empty strings to next component if ( isDefinedTextObject(current) && typeof next === "string" && @@ -269,7 +245,6 @@ function mergeTextComponents(output: StringyMCText[]) { } } output.splice(i, group.length, merged); - // i--; // TODO: actually fix the bug caused by checking again } } } diff --git a/src/lib/text/utils.ts b/src/lib/text/utils.ts index 1092bcd..17c82a8 100644 --- a/src/lib/text/utils.ts +++ b/src/lib/text/utils.ts @@ -71,33 +71,29 @@ export function defaultColorReverseLUT(color: string): string | undefined { return; } return colorMap.find((e) => e.name.toLowerCase() === color)?.value || color; -} /** - * Checks the type of the mark against `type` +} + +/** + * 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) { +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} + // 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) => { 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 codePoint = parseInt(hex, 16); + return String.fromCodePoint(codePoint); }); } 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/exporting/optimising_mc_json.spec.ts b/src/tests/unit/exporting/optimising_mc_json.spec.ts index 63c68e0..091e2c7 100644 --- a/src/tests/unit/exporting/optimising_mc_json.spec.ts +++ b/src/tests/unit/exporting/optimising_mc_json.spec.ts @@ -13,6 +13,18 @@ describe("optimise", () => { 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 }, diff --git a/src/tests/unit/exporting/type_props.spec.ts b/src/tests/unit/exporting/type_props.spec.ts index ed1d8d5..0453f12 100644 --- a/src/tests/unit/exporting/type_props.spec.ts +++ b/src/tests/unit/exporting/type_props.spec.ts @@ -2,7 +2,7 @@ import { outputVersion } from "$lib/stores"; import { addTypeSpecificValues } from "$lib/text/nbt/export"; import { versions, type MinecraftText } from "$lib/types"; import type { JSONContent } from "@tiptap/core"; -import { expect, it } from "vitest"; +import { describe, expect, it } from "vitest"; it("should add text property for type 'text'", () => { const current: MinecraftText = {}; @@ -71,31 +71,59 @@ it("should add selector property for type 'selector'", () => { expect(result.selector).toBe("@a"); }); -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", - }, - }; +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"); -}); + 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 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 index 293e8a5..271fbfd 100644 --- a/src/tests/unit/importing/snbt_importing.spec.ts +++ b/src/tests/unit/importing/snbt_importing.spec.ts @@ -99,6 +99,26 @@ it("should return a one length array if passed with a single component", async ( 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( diff --git a/src/tests/unit/misc/utils.spec.ts b/src/tests/unit/misc/utils.spec.ts index 96b99c6..d9d7361 100644 --- a/src/tests/unit/misc/utils.spec.ts +++ b/src/tests/unit/misc/utils.spec.ts @@ -2,7 +2,7 @@ import { defaultColorLUT, defaultColorReverseLUT, isDefinedTextObject, - isMarkType, + findMarkType, trueMarkOrUndefined, unescapeUnicode, } from "$lib/text/utils"; @@ -56,6 +56,11 @@ describe("unescapeUnicode", () => { 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", () => { @@ -105,13 +110,13 @@ describe("defaultColorLUT", () => { }); }); -it("isMarkType should correctly identify mark types", () => { +it("findMarkType finds the correct mark", () => { 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(); + expect(findMarkType(contentWithMarks, "bold")).toBeDefined(); + expect(findMarkType(contentWithMarks, "italic")).toBeDefined(); + expect(findMarkType(contentWithMarks, "underline")).toBeUndefined(); }); diff --git a/vite.config.ts b/vite.config.ts index 5e3b77f..c6597c6 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,6 +1,6 @@ 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"; From 54f81d692eaa541e16f80686e51b5aea19ff4795 Mon Sep 17 00:00:00 2001 From: Cobblestone Date: Wed, 22 Jul 2026 09:59:51 -0400 Subject: [PATCH 03/20] linting expansion --- package.json | 2 +- src/lib/components/text/MiniEditor.svelte | 7 +++-- .../components/text/ShadowColorButton.svelte | 3 --- src/lib/db.ts | 4 +-- src/lib/text/motd.ts | 12 ++++----- src/lib/text/nbt/export.ts | 18 ++++++------- src/lib/text/nbt/import.ts | 20 +++++++------- src/lib/text/nbt/optimiser.ts | 25 ++++++++---------- src/lib/text/utils.ts | 7 ++--- src/lib/tiptap/extensions/FixedTextStyle.ts | 2 +- src/lib/tiptap/extensions/fonts.ts | 2 +- .../tiptap/extensions/marks/ClickEventMark.ts | 6 ++--- .../tiptap/extensions/marks/HoverEventMark.ts | 4 +-- .../extensions/marks/ShadowColorMark.ts | 4 +-- src/lib/types.ts | 3 ++- src/routes/+page.svelte | 26 +++++++++---------- .../unit/exporting/optimising_mc_json.spec.ts | 2 +- .../unit/importing/snbt_importing.spec.ts | 2 +- 18 files changed, 73 insertions(+), 76 deletions(-) diff --git a/package.json b/package.json index 500a4ac..17b6519 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "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", + "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" diff --git a/src/lib/components/text/MiniEditor.svelte b/src/lib/components/text/MiniEditor.svelte index acf417e..3b247e2 100644 --- a/src/lib/components/text/MiniEditor.svelte +++ b/src/lib/components/text/MiniEditor.svelte @@ -55,7 +55,6 @@ editor = newEditor; }, onUpdate: ({ editor }) => { - // TODO: fix the JSON parsing errors that can happen here value = JSON.stringify(editor.getJSON()); output = JSON.parse(translate(editor.getJSON())); }, @@ -109,9 +108,9 @@ } export function getValue() { - return translate(editor!.getJSON()).replace( - /"(?:[^"\\]*(?:\\.[^"\\]*)*)"\s*:/g, - (match) => match.replace(/"/g, ""), + return translate(editor!.getJSON()).replaceAll( + /"(?:[^"\\]*(?:\\.[^"\\]*)*)"\s*:/gu, + (match) => match.replaceAll(`"`, ""), ); } diff --git a/src/lib/components/text/ShadowColorButton.svelte b/src/lib/components/text/ShadowColorButton.svelte index fede43f..ac1731c 100644 --- a/src/lib/components/text/ShadowColorButton.svelte +++ b/src/lib/components/text/ShadowColorButton.svelte @@ -18,9 +18,6 @@ let { labelElement = $bindable(), - hex, - label, - name = undefined, dir, small, }: Props = $props(); diff --git a/src/lib/db.ts b/src/lib/db.ts index a3102e7..2fe70a3 100644 --- a/src/lib/db.ts +++ b/src/lib/db.ts @@ -1,7 +1,7 @@ import { openDB } from "idb"; export async function openDataStore() { - const db = await openDB("dph_data-store", 1, { + const fontDatabase = await openDB("dph_data-store", 1, { upgrade(db, _old, _new, _) { db.createObjectStore("fonts", { keyPath: "identifier", @@ -9,5 +9,5 @@ export async function openDataStore() { }, }); - return db; + return fontDatabase; } diff --git a/src/lib/text/motd.ts b/src/lib/text/motd.ts index aea41ec..34c8f5c 100644 --- a/src/lib/text/motd.ts +++ b/src/lib/text/motd.ts @@ -75,20 +75,20 @@ export function translateMOTD(c: JSONContent) { let lowestDEVal = ""; let formatting = ""; - const color = c.marks?.at(0)?.attrs?.color; - for (const c of colorMap) { - if (!color) { + const colorMark = c.marks?.at(0)?.attrs?.color; + for (const color of colorMap) { + if (!colorMark) { continue; } - const dE = deltaE(color, c.value); + const dE = deltaE(colorMark, color.value); if (dE === 0) { - lowestDEVal = `${char}${c.code}`; + lowestDEVal = `${char}${color.code}`; break; } if (dE < lowestDE) { lowestDE = dE; - lowestDEVal = `${char}${c.code}`; + lowestDEVal = `${char}${color.code}`; } } diff --git a/src/lib/text/nbt/export.ts b/src/lib/text/nbt/export.ts index 60f9bdf..75eb5d5 100644 --- a/src/lib/text/nbt/export.ts +++ b/src/lib/text/nbt/export.ts @@ -45,7 +45,7 @@ export function addTypeSpecificValues( break; case "translate": current.translate = c.attrs?.key; - if (c.attrs?.params && c.attrs?.params.length != 0) { + if (c.attrs?.params && c.attrs?.params.length !== 0) { current.with = c.attrs?.params; } if (c.attrs?.fallback) { @@ -170,16 +170,16 @@ function oldApplyInteractiveValues(current: OldMinecraftText, c: JSONContent) { */ export function convert( jsonContent: JSONContent, - exportType: "standard" | "item_lore" = "standard", optimise: boolean, - force_json: boolean = false, + exportType: "standard" | "item_lore" = "standard", + forceJson: boolean = false, ): string { exportVersion = get(outputVersion); let out = translateJSON(jsonContent, { exportType, optimise }); - if (exportVersion.index >= 1 && !force_json) { + if (exportVersion.index >= 1 && !forceJson) { // only remove string keys - out = out.replace(/(?<=[{,]\s*)"[^"]*"\s*:/g, (match) => - match.replace(/"/g, ""), + out = out.replaceAll(/(?<=[{,]\s*)"[^"]*"\s*:/gu, (match) => + match.replaceAll(`"`, ""), ); } return out; @@ -212,10 +212,10 @@ export function translateJSON( const shadowColorMark = c.marks?.find((m) => m.type === "shadowColor"); if (shadowColorMark) { - let colorVal = shadowColorMark.attrs?.shadowColor.replace(/^#/, ""); + let colorVal = shadowColorMark.attrs?.shadowColor.replace(/^#/u, ""); if (colorVal && colorVal.length <= 8) { current.shadow_color = parseInt( - rgbaToArgbHex(colorVal).replace(/^#/, ""), + rgbaToArgbHex(colorVal).replace(/^#/u, ""), 16, ); } @@ -245,7 +245,7 @@ export function translateJSON( let finalResult = JSON.stringify(data); - const shadowColorMatches = finalResult.matchAll(/"shadow_color":(-?\d+)/g); + const shadowColorMatches = finalResult.matchAll(/"shadow_color":(-?\d+)/gu); for (const match of shadowColorMatches) { if (match[1]) { const num = parseInt(match[1]); diff --git a/src/lib/text/nbt/import.ts b/src/lib/text/nbt/import.ts index 701a950..5b4478d 100644 --- a/src/lib/text/nbt/import.ts +++ b/src/lib/text/nbt/import.ts @@ -31,8 +31,9 @@ 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 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())) { @@ -40,16 +41,16 @@ export function convertToTextOrEmpty(raw: string): StringyMCText[] { } return `: "${p1}"`; }); - if (raw.match(/^"\w*"/)) { - return [raw.replace(/"/g, "")]; + if (/^"\w*"/u.test(raw)) { + return [raw.replaceAll(`"`, "")]; } // replace 1b and 0b with true and false literals - raw = raw.replace(/(?<="\w+"\s*:\s*)\b1b\b/g, "true"); - raw = raw.replace(/(?<="\w+"\s*:\s*)\b0b\b/g, "false"); + 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 = raw.replace(/(?<="\w+"\s*:\s*)-?\d+(\.\d+)?[fdl]/gi, (match) => { + raw = raw.replaceAll(/(?<="\w+"\s*:\s*)-?\d+(\.\d+)?[fdl]/giu, (match) => { return match.slice(0, -1); }); @@ -251,7 +252,7 @@ function applyStyling( Array.isArray(text.shadow_color) ? text.shadow_color.map(mapToHexByte).join("") : text.shadow_color.toString(16) - ).replace(/[lL#]/g, ""); + ).replaceAll(/[lL#]/gu, ""); const intValue = parseInt(combinedShadowStr, 16); if (intValue > 0 && intValue < 0xffffffff) { @@ -422,7 +423,8 @@ function fixBrokenNewLines(doc: JSONContent) { function mapToHexByte(value: number): string { if (value < 0.0 || value > 1.0) { - return "00"; // Return "00" for out-of-range values + // Return "00" for out-of-range values + return "00"; } const byteValue = Math.round(value * 255); diff --git a/src/lib/text/nbt/optimiser.ts b/src/lib/text/nbt/optimiser.ts index 86477ef..8872738 100644 --- a/src/lib/text/nbt/optimiser.ts +++ b/src/lib/text/nbt/optimiser.ts @@ -143,7 +143,8 @@ function flattenMCText(stringyTextElements: StringyMCText[]): StringyMCText[] { // MinecraftText with text property for (const [key, value] of Object.entries(component)) { if (value === undefined) { - delete component[key as MCTextKey]; // remove undefined properties + // remove undefined properties + delete component[key as MCTextKey]; } } } @@ -173,7 +174,7 @@ function mergeTextComponents(output: StringyMCText[]) { if ( isDefinedTextObject(current) && typeof next === "string" && - next.match(/^\s*$/) + /^\s*$/u.test(next) ) { current.text += next; output.splice(i + 1, 1); @@ -184,12 +185,12 @@ function mergeTextComponents(output: StringyMCText[]) { // Merge whitespace objects to next component if (isDefinedTextObject(current) && isDefinedTextObject(next)) { // which direction to merge - if (next.text.match(/^\s+$/)) { + if (/^\s+$/u.test(next.text)) { current.text += next.text; output.splice(i + 1, 1); i--; continue; - } else if (current.text.match(/^\s+$/)) { + } else if (/^\s+$/u.test(current.text)) { next.text = current.text + next.text; output.splice(i, 1); i--; @@ -213,7 +214,7 @@ function mergeTextComponents(output: StringyMCText[]) { let group = [current]; collectAllFromIndex(i, group, output, sharedProperties); - if (group.length < 1) { + if (group.length === 0) { continue; } @@ -231,18 +232,14 @@ function mergeTextComponents(output: StringyMCText[]) { const first = extras.shift(); let merged = { ...sharedProperties }; // Rebuild merged component - if (typeof first == "string") { + 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); - } + } + if (extras.length > 0) { + if (merged.extra) {merged.extra = merged.extra.concat(extras);} + else {merged.extra = extras;} } output.splice(i, group.length, merged); } diff --git a/src/lib/text/utils.ts b/src/lib/text/utils.ts index 17c82a8..8c253e6 100644 --- a/src/lib/text/utils.ts +++ b/src/lib/text/utils.ts @@ -85,12 +85,13 @@ export function findMarkType(c: JSONContent, type: string) { } export function unescapeUnicode(str: string) { - const regex = /\\u(?:([0-9a-fA-F]{4})|\{([0-9a-fA-F]+)\})/g; + const regex = /\\u(?:([0-9a-fA-F]{4})|\{([0-9a-fA-F]+)\})/gu; // 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) => { - const hex = p1 || p2; // Get the hex value from whichever group matched + // Get the hex value from whichever group matched + const hex = p1 || p2; const codePoint = parseInt(hex, 16); return String.fromCodePoint(codePoint); @@ -126,7 +127,7 @@ export function applyGradient(editor: Editor, gradientColors: string[]) { } } }); - if (!text.length) return; + if (text.length === 0) return; const total = text.length; if (total === 0 || gradientColors.length < 2) return; diff --git a/src/lib/tiptap/extensions/FixedTextStyle.ts b/src/lib/tiptap/extensions/FixedTextStyle.ts index 4f78ee8..44e5b7f 100644 --- a/src/lib/tiptap/extensions/FixedTextStyle.ts +++ b/src/lib/tiptap/extensions/FixedTextStyle.ts @@ -16,7 +16,7 @@ export const FixedTextStyle = TextStyle.extend({ // Helper function to convert rgb() to hex function rgbToHex(rgb: string): string { - const result = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/.exec(rgb); + const result = /^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/u.exec(rgb); return result ? "#" + [1, 2, 3] diff --git a/src/lib/tiptap/extensions/fonts.ts b/src/lib/tiptap/extensions/fonts.ts index 9ad7269..0d381ec 100644 --- a/src/lib/tiptap/extensions/fonts.ts +++ b/src/lib/tiptap/extensions/fonts.ts @@ -20,7 +20,7 @@ export const FontsExtension = Extension.create({ font: { default: null, parseHTML: (element) => - element.style.fontFamily?.replace(/['"]+/g, ""), + element.style.fontFamily?.replaceAll(/['"]+/gu, ""), renderHTML: (attributes) => { if (!attributes.font) { return {}; diff --git a/src/lib/tiptap/extensions/marks/ClickEventMark.ts b/src/lib/tiptap/extensions/marks/ClickEventMark.ts index 29aef19..15ece51 100644 --- a/src/lib/tiptap/extensions/marks/ClickEventMark.ts +++ b/src/lib/tiptap/extensions/marks/ClickEventMark.ts @@ -21,8 +21,8 @@ export const ClickEventMark = Mark.create({ return false; } const el = element as HTMLElement; - const action = el.getAttribute("data-click-event-action"); - const value = el.getAttribute("data-click-event-value"); + const action = el.dataset.clickEventAction; + const value = el.dataset.clickEventValue; if (!action) { return false; } @@ -42,7 +42,7 @@ export const ClickEventMark = Mark.create({ { "data-click-event-action": HTMLAttributes.action, "data-click-event-value": HTMLAttributes.value, - class: "clickEvent", // Optional styling + class: "clickEvent", }, HTMLAttributes, ), diff --git a/src/lib/tiptap/extensions/marks/HoverEventMark.ts b/src/lib/tiptap/extensions/marks/HoverEventMark.ts index 7c28eba..400a51b 100644 --- a/src/lib/tiptap/extensions/marks/HoverEventMark.ts +++ b/src/lib/tiptap/extensions/marks/HoverEventMark.ts @@ -20,8 +20,8 @@ export const HoverEventMark = Mark.create({ 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")!); + const action = el.dataset.hoverEventAction; + const value = JSON.parse(el.dataset.hoverEventValue!); if (!action) { return false; } diff --git a/src/lib/tiptap/extensions/marks/ShadowColorMark.ts b/src/lib/tiptap/extensions/marks/ShadowColorMark.ts index acd9a83..18a22d0 100644 --- a/src/lib/tiptap/extensions/marks/ShadowColorMark.ts +++ b/src/lib/tiptap/extensions/marks/ShadowColorMark.ts @@ -8,7 +8,7 @@ export const ShadowColorMark = Mark.create({ shadowColor: { default: null, parseHTML: (element) => - element.getAttribute("data-shadow-color") || null, + element.dataset.shadowColor || null, renderHTML: (attributes) => { if (!attributes.shadowColor) { return {}; @@ -28,7 +28,7 @@ export const ShadowColorMark = Mark.create({ return false; } const el = element as HTMLElement; - const shadowColor = el.getAttribute("data-shadow-color"); + const shadowColor = el.dataset.shadowColor; if (!shadowColor) { return false; } diff --git a/src/lib/types.ts b/src/lib/types.ts index 5b993e1..8a812c6 100644 --- a/src/lib/types.ts +++ b/src/lib/types.ts @@ -134,7 +134,8 @@ export type ExternalSources = { selector: string; }; object: { - object?: string; // can be omitted for only atlas objects ONLY + // can be omitted for only atlas objects ONLY + object?: string; atlas: string; sprite: string; player: { diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 783adde..51a0175 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -110,7 +110,7 @@ let unicodeSelectorDialog: Modal = $state()!; let finalOutput = $derived( - editor ? convert(tiptapJSON, "standard", shouldOptimise) : "Loading...", + editor ? convert(tiptapJSON, shouldOptimise) : "Loading...", ); function importToEditor() { @@ -209,9 +209,9 @@ }); function toTitleCase(str: string) { - return str.replace( - /\w\S*/g, - (text) => text.charAt(0).toUpperCase() + text.substring(1).toLowerCase(), + return str.replaceAll( + /\w\S*/gu, + (text) => text.charAt(0).toUpperCase() + text.slice(1).toLowerCase(), ); } @@ -220,7 +220,7 @@ colorDialog?.close(); } - const debounce = (callback: Function, wait: number) => { + const debounce = (callback: (...args: any[]) => void, wait: number) => { let timeoutId: number; return (...args: any[]) => { window.clearTimeout(timeoutId); @@ -338,12 +338,12 @@ } } - function removeAllNodes(editor: Editor | undefined, type: string) { + function removeAllNodes(type: string) { if (!editor) { return; } - let editor_json = editor.getJSON(); - editor_json.content.forEach((paragraph) => { + let editorJson = editor.getJSON(); + editorJson.content.forEach((paragraph) => { if (paragraph.content) { paragraph.content = paragraph.content.filter( (node) => node.type !== type, @@ -351,8 +351,8 @@ } }); - editor?.commands.setContent(editor_json); - tiptapJSON = editor_json; + editor?.commands.setContent(editorJson); + tiptapJSON = editorJson; } let versionPopupConfirmationVisible = $state(false); @@ -363,7 +363,7 @@ return; } - if ($outputVersion.index > version.index && confirm == false) { + if ($outputVersion.index > version.index && confirm === false) { versionPopupConfirmationVisible = true; temporaryVersionConfirmation = version; return; @@ -376,8 +376,8 @@ if (version.index < 2) { // remove object keys - removeAllNodes(editor, "atlas_object"); - removeAllNodes(editor, "player_object"); + removeAllNodes("atlas_object"); + removeAllNodes("player_object"); } tiptapJSON = editor!.getJSON(); diff --git a/src/tests/unit/exporting/optimising_mc_json.spec.ts b/src/tests/unit/exporting/optimising_mc_json.spec.ts index 091e2c7..6c6aae9 100644 --- a/src/tests/unit/exporting/optimising_mc_json.spec.ts +++ b/src/tests/unit/exporting/optimising_mc_json.spec.ts @@ -19,7 +19,7 @@ describe("optimise", () => { ).toEqual(["hello ", { color: "red", text: "world!" }]); }); - it("should combine whitespace string to next component ", () => { + it("should combine whitespace string to next component", () => { expect( optimise(["", { text: "hello" }, " ", { color: "red", text: "world!" }]), ).toEqual(["hello ", { color: "red", text: "world!" }]); diff --git a/src/tests/unit/importing/snbt_importing.spec.ts b/src/tests/unit/importing/snbt_importing.spec.ts index 271fbfd..6ec4fbc 100644 --- a/src/tests/unit/importing/snbt_importing.spec.ts +++ b/src/tests/unit/importing/snbt_importing.spec.ts @@ -10,7 +10,7 @@ it("should return a basic document", async () => { expect(document).toEqual(expectedDocument); }); -it("should return a basic document (empty str)", async () => { +it("should return a basic document (empty str)", () => { const document = snbtToDocument(convertToTextOrEmpty("")); const expectedDocument = { content: [], type: "doc" }; expect(document).toEqual(expectedDocument); From dda7b5c565d6fe3f15d7c688b0d25e6a163b3c39 Mon Sep 17 00:00:00 2001 From: Cobblestone Date: Wed, 22 Jul 2026 10:03:49 -0400 Subject: [PATCH 04/20] formatting --- src/lib/components/text/ShadowColorButton.svelte | 6 +----- src/lib/text/nbt/optimiser.ts | 7 +++++-- src/lib/tiptap/extensions/marks/ShadowColorMark.ts | 3 +-- 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/src/lib/components/text/ShadowColorButton.svelte b/src/lib/components/text/ShadowColorButton.svelte index ac1731c..5429b3a 100644 --- a/src/lib/components/text/ShadowColorButton.svelte +++ b/src/lib/components/text/ShadowColorButton.svelte @@ -16,11 +16,7 @@ small?: boolean; } - let { - labelElement = $bindable(), - dir, - small, - }: Props = $props(); + let { labelElement = $bindable(), dir, small }: Props = $props(); +
+ +
+ + +
+
diff --git a/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts b/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts index cb8254e..2f9bde6 100644 --- a/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts +++ b/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts @@ -39,14 +39,14 @@ export const BlockNBTNode = Node.create({ "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; - `, + 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}`], ]; diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 4323837..c958c97 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,30 +1,23 @@
- +
diff --git a/src/lib/components/Combobox.svelte b/src/lib/components/Combobox.svelte index e593441..6bb6869 100644 --- a/src/lib/components/Combobox.svelte +++ b/src/lib/components/Combobox.svelte @@ -1,47 +1,41 @@ - -
- - -
- - - {#each filteredItems as item, i (i + item.value)} - - {#snippet children({ selected })} - - {item.label} - - {#if selected} - - {/if} - {/snippet} - - {:else} - No results found - {/each} - - + +
+ + +
+ + + {#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 39f03cd..60e35fe 100644 --- a/src/lib/components/Modal.svelte +++ b/src/lib/components/Modal.svelte @@ -1,91 +1,89 @@ {#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..5fedb8e --- /dev/null +++ b/src/lib/components/TopUI.svelte @@ -0,0 +1,79 @@ + + +
+
+ logo + Minecraft Text Editor +
+ + {#if doesContentExist} + + + {/if} + +
+ Discord + Datapack Wiki +
+ +{#await import("$lib/components/modals/topbar/LoadModal.svelte") then modal} + +{/await} + +{#await import("$lib/components/modals/topbar/ImportModal.svelte") then modal} + +{/await} diff --git a/src/lib/components/modals/ClickEventModal.svelte b/src/lib/components/modals/ClickEventModal.svelte index f418417..cb1bd49 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 7915998..87b203f 100644 --- a/src/lib/components/modals/ColorGradientModal.svelte +++ b/src/lib/components/modals/ColorGradientModal.svelte @@ -1,131 +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..0be08fc 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 1da05fb..0000000 --- a/src/lib/components/modals/ExportModal.svelte +++ /dev/null @@ -1,166 +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(),
-								shouldOptimise,
-								"standard",
-								exportAsJSON,
-							)
-						: "Loading..."}
-
-
- -

As a lore component:

-
- - [lore= -
{editor
-						? convert(
-								editor.getJSON(),
-								shouldOptimise,
-								"item_lore",
-								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 06086de..416987f 100644 --- a/src/lib/components/modals/FontPickerModal.svelte +++ b/src/lib/components/modals/FontPickerModal.svelte @@ -1,126 +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..08247ae 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..0dee90c --- /dev/null +++ b/src/lib/components/modals/topbar/ExportModal.svelte @@ -0,0 +1,145 @@ + + + +
+ {#if $outputVersion.index > 0} +
+ + Toggle JSON mode (for use in json files) +
+ {/if} + +

+ As {$outputVersion.index > 0 ? " " : "JSON "}text components: +

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

As a lore component:

+
+ + [lore= +
{editor
+                        ? convert(editor.getJSON(), shouldOptimise, "item_lore", 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/topbar/ImportModal.svelte b/src/lib/components/modals/topbar/ImportModal.svelte new file mode 100644 index 0000000..1b69cfd --- /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/LoadModal.svelte b/src/lib/components/modals/topbar/LoadModal.svelte new file mode 100644 index 0000000..29dfaac --- /dev/null +++ b/src/lib/components/modals/topbar/LoadModal.svelte @@ -0,0 +1,51 @@ + + + +
+ {#if snapshots.length == 0} +

You have not saved anything yet!

+ {/if} + {#each snapshots as snapshot (snapshot)} +
+
+ +
+
+ + +
+
+ {/each} +
+
diff --git a/src/lib/components/text/MiniEditor.svelte b/src/lib/components/text/MiniEditor.svelte index 9d4bf42..e74f255 100644 --- a/src/lib/components/text/MiniEditor.svelte +++ b/src/lib/components/text/MiniEditor.svelte @@ -1,170 +1,159 @@
-
- {#if editor} - - -
- - {#each colourMap 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 32e9002..0000000 --- a/src/lib/components/text/ShadowColorButton.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - - diff --git a/src/lib/components/text/TextStyleButtons.svelte b/src/lib/components/text/TextStyleButtons.svelte deleted file mode 100644 index e4bef13..0000000 --- a/src/lib/components/text/TextStyleButtons.svelte +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - -{#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/text/ToolbarButton.svelte b/src/lib/components/text/ToolbarButton.svelte deleted file mode 100644 index afee0cc..0000000 --- a/src/lib/components/text/ToolbarButton.svelte +++ /dev/null @@ -1,23 +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..dd12168 --- /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 2fe70a3..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 fontDatabase = 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 fontDatabase; + return fontDatabase; } diff --git a/src/lib/text/motd.ts b/src/lib/text/motd.ts index 9e2eac3..f0aa00a 100644 --- a/src/lib/text/motd.ts +++ b/src/lib/text/motd.ts @@ -2,105 +2,97 @@ import type { JSONContent } from "@tiptap/core"; 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 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; + 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 27e717f..3c9eec2 100644 --- a/src/lib/text/nbt/export.ts +++ b/src/lib/text/nbt/export.ts @@ -1,16 +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, - findMarkType, - rgbaToArgbHex, - trueMarkOrUndefined, - unescapeUnicode, + defaultColorLUT, + findMarkType, + rgbaToArgbHex, + trueMarkOrUndefined, + unescapeUnicode, } from "../utils"; import { outputVersion } from "$lib/stores"; import { get } from "svelte/store"; @@ -28,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); + 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; + 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 "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; - } + 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); - } - } + if (includeInteractivity) { + if (exportVersion.index >= 1) { + newApplyInteractiveValues(current, c); + } else { + oldApplyInteractiveValues(current, c); + } + } - return current; + return current; } /** @@ -117,33 +112,33 @@ export function addTypeSpecificValues( * @param c the content */ function newApplyInteractiveValues(current: MinecraftText, c: JSONContent) { - 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, "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 }; - } + if (findMarkType(c, "hoverEvent")) { + const ce = findMarkType(c, "hoverEvent")?.attrs; + current.hover_event = { action: ce!.action, value: ce!.value }; + } } /** @@ -153,145 +148,134 @@ function newApplyInteractiveValues(current: MinecraftText, c: JSONContent) { * @param c the content */ function oldApplyInteractiveValues(current: OldMinecraftText, c: JSONContent) { - if (findMarkType(c, "clickEvent")) { - const ce = findMarkType(c, "clickEvent")?.attrs; - current.clickEvent = { action: ce!.action, value: 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 }; - } + 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, - optimise: boolean, - exportType: "standard" | "item_lore" = "standard", - forceJson: 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 && !forceJson) { - // only remove string keys - out = out.replaceAll(/(?<=[{,]\s*)"[^"]*"\s*:/gu, (match) => - match.replaceAll(`"`, ""), - ); - } - 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 ?? []; +export function translateJSON(json: JSONContent, options: TranslateOptions): string { + const paragraphs = json.content ?? []; - if (options.exportType === "standard") { - let data: StringyMCText[] = []; + 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, - }; + 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, - ); - } - } + 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"); - } + 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 (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 (options.optimise) { + data = optimise(data); + } else { + data.unshift(""); + } - if (data.length === 1) { - return JSON.stringify(data[0]); - } + if (data.length === 1) { + return JSON.stringify(data[0]); + } - let finalResult = JSON.stringify(data); + 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`, - ); - } - } - } + 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)[] = []; + 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 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, - }; + 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); - } + currentComponent = addTypeSpecificValues(currentComponent, c, false); + currentLine.push(currentComponent); + } - data.push(currentLine); - } + data.push(currentLine); + } - if (Array.isArray(data) && options.optimise) { - data = data.map((d) => (Array.isArray(d) ? optimise(d, true) : d)); - } + if (Array.isArray(data) && options.optimise) { + data = data.map((d) => (Array.isArray(d) ? optimise(d, true) : d)); + } - return JSON.stringify(data); - } + return JSON.stringify(data); + } - return "[]"; + return "[]"; } diff --git a/src/lib/text/nbt/import.ts b/src/lib/text/nbt/import.ts index 34f0736..c959d4e 100644 --- a/src/lib/text/nbt/import.ts +++ b/src/lib/text/nbt/import.ts @@ -1,426 +1,423 @@ import type { JSONContent } from "@tiptap/core"; import { - argbToRgbaHex, - defaultColorReverseLUT, - mapToHexByte, - rgbaToArgbHex, - stripTypeSuffixes, + 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 - // 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[]; + 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 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 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 75548fb..3845b81 100644 --- a/src/lib/text/nbt/optimiser.ts +++ b/src/lib/text/nbt/optimiser.ts @@ -1,22 +1,19 @@ import type { MinecraftText, StringyMCText } from "$lib/types"; -import { - isAnInteractiveProp, - isDefinedTextObject as isATextComponent, -} from "../utils"; +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. @@ -28,33 +25,27 @@ const styleProps = [ * @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); - - // 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; } /** @@ -65,24 +56,17 @@ export function optimise( * @returns a record of shared style properties */ function getSharedStyleProps( - a: MinecraftText, - b: MinecraftText, + 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)[], - ]; + 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)[]]; } /** @@ -94,34 +78,32 @@ function getSharedStyleProps( * @param sharedStyleProps a record of all shared properties between the group */ function collectStyledRun( - i: number, - current: MinecraftText, - output: StringyMCText[], - sharedStyleProps: Record, + i: number, + current: MinecraftText, + output: StringyMCText[], + sharedStyleProps: Record, ): MinecraftText[] { - let j = i; - let sharedStyleKeys = Object.keys( - sharedStyleProps, - ) as (keyof MinecraftText)[]; - let finalList = [current]; + 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; + 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), - ); + // 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; + if (!allPropertiesMatch) break; - finalList.push(next); - j++; - } + finalList.push(next); + j++; + } - return finalList; + return finalList; } /** @@ -133,9 +115,7 @@ function collectStyledRun( * @returns true if the properties match, false otherwise */ function propertiesMatch(a: any, b: any, property: string) { - return isAnInteractiveProp(property) - ? JSON.stringify(a) === JSON.stringify(b) - : a === b; + return isAnInteractiveProp(property) ? JSON.stringify(a) === JSON.stringify(b) : a === b; } /** @@ -145,32 +125,30 @@ function propertiesMatch(a: any, b: any, property: string) { * @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) { - // 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; + 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; } /** @@ -180,97 +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[]) { - // 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; + // 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; } function isWhitespaceOnly(str: StringyMCText): boolean { - return typeof str === "string" && /^\s*$/u.test(str); + return typeof str === "string" && /^\s*$/u.test(str); } diff --git a/src/lib/text/utils.ts b/src/lib/text/utils.ts index 332936d..3aa4f08 100644 --- a/src/lib/text/utils.ts +++ b/src/lib/text/utils.ts @@ -2,34 +2,34 @@ import type { MinecraftText } from "$lib/types"; import type { Editor, JSONContent } from "@tiptap/core"; 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" }, + { 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; /** @@ -39,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 @@ -53,10 +50,10 @@ export function trueMarkOrUndefined( * @returns the color name */ export function defaultColorLUT(color: string): string | undefined { - if (!color || color === "null") { - return; - } - return colourMap.find((e) => e.value.toUpperCase() === color)?.name || color; + if (!color || color === "null") { + return; + } + return colourMap.find((e) => e.value.toUpperCase() === color)?.name || color; } /** @@ -66,10 +63,10 @@ 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 colourMap.find((e) => e.name.toLowerCase() === color)?.value || color; + if (!color || color === "null") { + return; + } + return colourMap.find((e) => e.name.toLowerCase() === color)?.value || color; } /** @@ -80,30 +77,30 @@ export function defaultColorReverseLUT(color: string): string | undefined { * @returns the mark if found, otherwise undefined */ export function findMarkType(c: JSONContent, type: string) { - return c.marks?.find((e) => e.type === type); + 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]+)\})/gu; + const regex = /\\u(?:([0-9a-fA-F]{4})|\{([0-9a-fA-F]+)\})/gu; - // 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; + // 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); - }); + 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" + ); } /** @@ -113,55 +110,55 @@ export function isAnInteractiveProp(prop: string) { * @returns true if it is a defined MinecraftText object */ export function isDefinedTextObject( - obj: any, - // return type is that so that it can require the text property, instead of being optional + 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"; - } + 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); + const byteValue = Math.round(value * 255); + const hexString = byteValue.toString(16); - return hexString.length === 1 ? "0" + hexString : hexString; + return hexString.length === 1 ? "0" + hexString : hexString; } export function stripTypeSuffixes(input: string): string { - const regex = /\b(\d+(?:\.\d+)?)[fdlsib]\b/gi; + const regex = /\b(\d+(?:\.\d+)?)[fdlsib]\b/gi; - return input.replaceAll(regex, "$1"); + 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; + // 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); + // 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 with alpha placed at the beginning - return `#${rgb}${alpha}`; + return `#${rgb}${alpha}`; } export function rgbaToArgbHex(rgbaHex: string): string { - // Remove the leading '#' if it exists - const hex = rgbaHex.startsWith("#") ? rgbaHex.slice(1) : rgbaHex; + // 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); + // 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}`; + // 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 44e5b7f..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+)\)$/u.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 0d381ec..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?.replaceAll(/['"]+/gu, ""), - 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 15ece51..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.dataset.clickEventAction; - const value = el.dataset.clickEventValue; - 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", - }, - 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 400a51b..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.dataset.hoverEventAction; - const value = JSON.parse(el.dataset.hoverEventValue!); - 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 1226d7d..2e15525 100644 --- a/src/lib/tiptap/extensions/marks/ShadowColorMark.ts +++ b/src/lib/tiptap/extensions/marks/ShadowColorMark.ts @@ -1,68 +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.dataset.shadowColor || 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.dataset.shadowColor; - 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 2f9bde6..af05b20 100644 --- a/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts +++ b/src/lib/tiptap/extensions/nodes/BlockNBTNode.ts @@ -2,43 +2,43 @@ 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: ` + return [ + "span", + mergeAttributes(this.options.HTMLAttributes, HTMLAttributes, { + "data-nbt-node": "true", + contenteditable: "false", + style: ` background-color: #18181b; padding: 1px 5px; border-radius: 4px; @@ -47,21 +47,21 @@ export const BlockNBTNode = Node.create({ vertical-align: var(--custom-source-align, middle); text-decoration: inherit; `, - }), - ["span", {}, `NBT: ${nbt}, ${block}`], - ]; - }, + }), + ["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 5504f6c..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: { - // can be omitted for only atlas objects ONLY - object?: string; - 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 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 06f3036..48af382 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,860 +1,368 @@
-
-
- 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 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.isActive("textStyle")} - - {/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: {tiptapJSON - ? JSON.stringify(tiptapJSON) - : "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 -

-
-
-
+ + +
+
+

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 +

+
+
+ -
- - {#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 1de039e..ff9c217 100644 --- a/src/tests/e2e/basic.test.ts +++ b/src/tests/e2e/basic.test.ts @@ -1,148 +1,128 @@ 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 }) => { - 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(); - 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", - ); + 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(); - 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", - ); + 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(); - 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", - ); + 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(); - 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", - ); + 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(); - 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); + 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(); - 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", - ); + 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(); + 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 expect(button).toHaveClass(/bg-zinc-800/); - await expect(textbox.locator("p>span[style*='color']")).toHaveCSS( - "color", - /rgb\(\d+, \d+, \d+\)/, - ); - await expect(textbox.locator("p>span[style*='color']")).toHaveAttribute( - "style", - color!, - ); - await 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"); + 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 expect(button).toHaveClass(/bg-zinc-800/); + await expect(textbox.locator("p>span[style*='color']")).toHaveCSS( + "color", + /rgb\(\d+, \d+, \d+\)/, + ); + await expect(textbox.locator("p>span[style*='color']")).toHaveAttribute("style", color!); + await 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 index 5071b55..bfcb0a4 100644 --- a/src/tests/e2e/modals.test.ts +++ b/src/tests/e2e/modals.test.ts @@ -1,23 +1,20 @@ import { test, expect } from "@playwright/test"; test.beforeEach(async ({ page }) => { - await page.goto("/"); + 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" }); + 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 index a1b66bc..1f2624e 100644 --- a/src/tests/unit/data/bad/json/too_big_shadow_color.json +++ b/src/tests/unit/data/bad/json/too_big_shadow_color.json @@ -1,18 +1,18 @@ { - "content": [ - { - "content": [ - { - "type": "text", - "text": "Shadow", - "marks": [ - { - "type": "shadowColor", - "attrs": { "shadowColor": "#100000000" } - } - ] - } - ] - } - ] + "content": [ + { + "content": [ + { + "type": "text", + "text": "Shadow", + "marks": [ + { + "type": "shadowColor", + "attrs": { "shadowColor": "#100000000" } + } + ] + } + ] + } + ] } 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 index d535ea1..3feaf38 100644 --- a/src/tests/unit/data/clean/json/illegal_marked_object.json +++ b/src/tests/unit/data/clean/json/illegal_marked_object.json @@ -1,27 +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" } - ] - } - ] - } - ] + "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 index d9aef53..832f253 100644 --- a/src/tests/unit/data/clean/json/shadow_color.json +++ b/src/tests/unit/data/clean/json/shadow_color.json @@ -1,18 +1,18 @@ { - "content": [ - { - "content": [ - { - "type": "text", - "text": "Shadow", - "marks": [ - { - "type": "shadowColor", - "attrs": { "shadowColor": "#ff00ff" } - } - ] - } - ] - } - ] + "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 index 893f073..7e5bc9b 100644 --- a/src/tests/unit/data/clean/json/shadow_color_transparent.json +++ b/src/tests/unit/data/clean/json/shadow_color_transparent.json @@ -1,18 +1,18 @@ { - "content": [ - { - "content": [ - { - "type": "text", - "text": "Shadow", - "marks": [ - { - "type": "shadowColor", - "attrs": { "shadowColor": "#ff5454ff" } - } - ] - } - ] - } - ] + "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 index 79bd066..486357b 100644 --- a/src/tests/unit/data/clean/json/simple_text.json +++ b/src/tests/unit/data/clean/json/simple_text.json @@ -1,14 +1,14 @@ { - "type": "doc", - "content": [ - { - "type": "paragraph", - "content": [ - { - "type": "text", - "text": "test" - } - ] - } - ] + "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 index faece09..996695c 100644 --- a/src/tests/unit/data/clean/json/simple_unicode.json +++ b/src/tests/unit/data/clean/json/simple_unicode.json @@ -1,14 +1,14 @@ { - "type": "doc", - "content": [ - { - "type": "paragraph", - "content": [ - { - "type": "text", - "text": "☝☝☝↘↘◩◪╰᜶⇨ᐃ☺⓻❄♍♏▋" - } - ] - } - ] + "type": "doc", + "content": [ + { + "type": "paragraph", + "content": [ + { + "type": "text", + "text": "☝☝☝↘↘◩◪╰᜶⇨ᐃ☺⓻❄♍♏▋" + } + ] + } + ] } diff --git a/src/tests/unit/exporting/optimising_mc_json.spec.ts b/src/tests/unit/exporting/optimising_mc_json.spec.ts index 6c6aae9..3015598 100644 --- a/src/tests/unit/exporting/optimising_mc_json.spec.ts +++ b/src/tests/unit/exporting/optimising_mc_json.spec.ts @@ -5,111 +5,113 @@ import { describe, expect, it } from "vitest"; 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" }); - }); + 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 index 609d018..ddfc7df 100644 --- a/src/tests/unit/exporting/translating_mc_json.spec.ts +++ b/src/tests/unit/exporting/translating_mc_json.spec.ts @@ -6,169 +6,169 @@ 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"'); + 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 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, + 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", - ]); + 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"); + 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'); + 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'); + 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'); + 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'); + 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"'); + 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"); + 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"); + 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); + 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("[]"); + 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 index 31c8e8e..353a2b9 100644 --- a/src/tests/unit/exporting/type_props.spec.ts +++ b/src/tests/unit/exporting/type_props.spec.ts @@ -1,301 +1,297 @@ import { outputVersion } from "$lib/stores"; import { addTypeSpecificValues } from "$lib/text/nbt/export"; -import { - versions, - type MinecraftText, - type VersionAgnosticText, -} from "$lib/types"; +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"); + 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" }); + 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"); + 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); + 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"); + 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"); + 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 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 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 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 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 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 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'", () => { + 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!" }, - }); - }); + 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", - }, - }; + 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"); - }); + 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 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", - }, - }; + 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: "" }); - }); + 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: "" }); - }); + 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 index 6ed88cd..cd1e09f 100644 --- a/src/tests/unit/importing/snbt_importing.spec.ts +++ b/src/tests/unit/importing/snbt_importing.spec.ts @@ -3,258 +3,228 @@ 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); + 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); + 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 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); + const mark = textNode?.marks?.at(0); - expect(mark?.type).toMatch("textStyle"); + expect(mark?.type).toMatch("textStyle"); - expect(mark?.attrs?.color).toBeDefined(); - expect(mark?.attrs?.color).toMatch("#AA0000"); + 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 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); + const mark = textNode?.marks?.at(0); - expect(mark?.type).toMatch("textStyle"); + expect(mark?.type).toMatch("textStyle"); - expect(mark?.attrs?.color).toBeDefined(); - expect(mark?.attrs?.color).toMatch("#c0bb1e"); + 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 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); + const mark = textNode?.marks?.at(0); - expect(mark?.type).toMatch("shadowColor"); + expect(mark?.type).toMatch("shadowColor"); - expect(mark?.attrs?.shadowColor).toBeDefined(); - expect(mark?.attrs?.shadowColor).toMatch("#ffff84ff"); + 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 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); + const mark = textNode?.marks?.at(0); - expect(mark?.type).toMatch("shadowColor"); + expect(mark?.type).toMatch("shadowColor"); - expect(mark?.attrs?.shadowColor).toBeDefined(); - expect(mark?.attrs?.shadowColor).toMatch("#ff0000ff"); + 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 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); + const mark = textNode?.marks?.at(0); - expect(mark?.type).toMatch("shadowColor"); + 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"); + 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 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); + const mark = textNode?.marks?.at(0); - expect(mark?.type).toMatch("shadowColor"); + expect(mark?.type).toMatch("shadowColor"); - expect(mark?.attrs?.shadowColor).toBeDefined(); - expect(mark?.attrs?.shadowColor).toMatch("#008000ff"); + 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); + 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" }); + 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"); + 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"); + 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); - }); + 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: [], - }); - }); + 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"); - }); + 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 index 2ac74aa..4e8a30b 100644 --- a/src/tests/unit/importing/source_props.spec.ts +++ b/src/tests/unit/importing/source_props.spec.ts @@ -3,192 +3,192 @@ 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 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); + const mark = textNode?.marks?.at(0); - expect(mark?.type).toMatch("textStyle"); + expect(mark?.type).toMatch("textStyle"); - expect(mark?.attrs?.font).toBeDefined(); - expect(mark?.attrs?.font).toMatch("minecraft:illageralt"); + 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 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 node = textNode.content!; - expect(node[0].type).toMatch("text"); - expect(node[0].text).toMatch("hi"); + 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(); + 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); + 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); + 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); + 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"); + 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"); + 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"); + 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"); + 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); + 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 index a57f95f..0d58584 100644 --- a/src/tests/unit/misc/utils.spec.ts +++ b/src/tests/unit/misc/utils.spec.ts @@ -1,160 +1,157 @@ import { - defaultColorLUT, - defaultColorReverseLUT, - isDefinedTextObject, - findMarkType, - trueMarkOrUndefined, - unescapeUnicode, - mapToHexByte, - stripTypeSuffixes, - rgbaToArgbHex, - argbToRgbaHex, + 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 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 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 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); - }); + 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"); - }); + 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 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(); - }); + 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 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(); - }); + 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("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(); + 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"); + 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"); + 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"); + 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"); + 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/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/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/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 c6597c6..d830c0e 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -5,30 +5,30 @@ 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", + 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}"], + }, + }, + ], + }, }); diff --git a/vitest-setup-client.ts b/vitest-setup-client.ts index 4986bd8..4b17245 100644 --- a/vitest-setup-client.ts +++ b/vitest-setup-client.ts @@ -3,16 +3,16 @@ 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(), - })), + 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 From bf7d36c47e1e35c0ea182e83f2c81360957663a3 Mon Sep 17 00:00:00 2001 From: Cobblestone Date: Tue, 4 Aug 2026 11:33:17 -0400 Subject: [PATCH 10/20] dependency clean up as well --- bun.lock | 280 +- package-lock.json | 9067 ++++++++--------- package.json | 40 +- .../components/modals/FontUploadModal.svelte | 2 +- src/tests/e2e/basic.test.ts | 16 +- vitest-setup-client.ts | 18 - 6 files changed, 4284 insertions(+), 5139 deletions(-) delete mode 100644 vitest-setup-client.ts diff --git a/bun.lock b/bun.lock index 29a0cbd..84968ce 100644 --- a/bun.lock +++ b/bun.lock @@ -5,45 +5,41 @@ "": { "name": "tools", "dependencies": { - "@tiptap/core": "^3.28.0", - "@tiptap/extension-placeholder": "^3.28.0", - "@tiptap/pm": "^3.28.0", - "@tiptap/starter-kit": "^3.28.0", + "@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", "bits-ui": "^2.18.1", - "html2canvas-pro": "^2.3.0", "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.37", - "@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.70.1", + "@sveltejs/kit": "^2.70.2", "@sveltejs/vite-plugin-svelte": "^7.2.0", "@tailwindcss/vite": "^4.3.3", - "@testing-library/jest-dom": "^6.10.0", - "@testing-library/svelte": "^5.4.2", - "@tiptap/extension-color": "^3.28.0", - "@tiptap/extension-font-family": "^3.28.0", - "@tiptap/extension-text-style": "^3.28.0", - "@types/node": "^26.1.1", + "@types/node": "^26.1.2", "@vitest/coverage-v8": "4.1.10", "file-type": "^22.0.1", - "jsdom": "^29.1.1", - "oxlint": "^1.75.0", + "oxlint": "^1.77.0", "prettier": "^3.9.6", "prettier-plugin-svelte": "^4.1.1", "prettier-plugin-tailwindcss": "^0.8.1", - "svelte": "^5.56.7", - "svelte-check": "^4.7.3", + "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.5", + "vite": "^8.2.0", "vitest": "^4.1.10", }, }, @@ -52,8 +48,6 @@ "prosemirror-model": "1.25.11", }, "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=="], @@ -64,16 +58,12 @@ "@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/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/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="], - "@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=="], @@ -108,7 +98,7 @@ "@floating-ui/utils": ["@floating-ui/utils@0.2.12", "", {}, "sha512-HpCo8tmWzLVad5s2d19EhAz5zqrrQ6s69qd6moPMQvkOuSwDT1YgRfWSVuc4ennqrgv3OHppiOGMQ7oC13yIww=="], - "@iconify-json/tabler": ["@iconify-json/tabler@1.2.37", "", { "dependencies": { "@iconify/types": "*" } }, "sha512-tXc0jGhrxec6eTKxMI9We/r3cEItyU5dG8ngDOEKsL36a6+/xwk4sR7PIZROVajzxmvyUBsn659adDIfcswiUw=="], + "@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=="], @@ -128,81 +118,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.75.0", "", { "os": "android", "cpu": "arm" }, "sha512-lutovtFzJqlRaqpZrCqSSGaHZzl9nIxxpjLzhSRLunN6dCLylj0uzlCyQGaQDIys7rrv8kVXiFO+R4Zpn0bX7g=="], + "@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.75.0", "", { "os": "android", "cpu": "arm64" }, "sha512-hXI0hDgHkw4w5nfru72aG7y+2iQJmC4waH/KV6H/hbgA6yAP5jYNx0P9yug15Hs0tWl/+mda3Jjn/2gmDT48tw=="], + "@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.75.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-D91BWbK/dMYfCcrghspPIuKs2D9LF4Z/OabVSQjw1AO6PWxArD7teDA48bm0ySFqWDaPVqmQRl5GMWNglTXyrQ=="], + "@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.75.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-02mpwzf12BonZ6PT0TuQoomvEh2kVl2WGBIKWezCyToIS+rYkQZ6GXnARBAl9A4Ovm2V+Xe7M4KretyqmmcnJQ=="], + "@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.75.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-qZJgLnDaBsiL5YESx2t/TZ8eXkL9fEkKoXEdzegROhlz9A0lgyGnZ0dAzJrh7LJAHQl2K9RdRueN2s/9N7+odg=="], + "@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.75.0", "", { "os": "linux", "cpu": "arm" }, "sha512-7XlaWA5BJD3XpCfrEqjEe6Zseeb14S7QGa304XfwKignRaKQ+eIj775BQ7nIslggWickl4IsPUFqJ+/gAyNHVg=="], + "@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.75.0", "", { "os": "linux", "cpu": "arm" }, "sha512-av6Tpv8yrcMMMOadOqENBhlsLRcGFXXwoQ0hzHhsmS9FJ4Wioy8we427GbcMe2XTxmL2e60T67H1Dyr3up+tAA=="], + "@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.75.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WcUhd8fHT5plrA14lANevl+hOl815mVI5t2hU21oFWrZKFXIVV/Sr4rWQV0NzSvzBupbMLNc5ErEA6Ehxh5jMg=="], + "@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.75.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-UWzp5wRHFe/ESO3+eEaxXsTkYTGLYjnTsi/I5neEacXSItQ6WNleapfOAeA4x2b8nyhJ4uQxqvtv9pHv8kWJtQ=="], + "@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.75.0", "", { "os": "linux", "cpu": "ppc64" }, "sha512-XEVRwGMLKCUKrvhLAz4F6AIh8MJrQVdSZtAmPpRZt9tGPsUnamPOcl3dS/ZQzJnar/Ymgc//+xho0L60Emzuxg=="], + "@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.75.0", "", { "os": "linux", "cpu": "none" }, "sha512-mAG4DUXqfLC8cTjMD2kt3jDmVzFREYtDyeLNdLdsCcBc4Zbl2EMuiFektGBilQwkNjYnMvCqJs55U+Hyb+b+jw=="], + "@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.75.0", "", { "os": "linux", "cpu": "none" }, "sha512-95hrAvriAlI+pekSomTFIn0+bawMDlDwTNVmdjsFusTHyL2JWh7TWvRNG/Lkim72uN8OiCcO9wcaC6omLP5E3w=="], + "@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.75.0", "", { "os": "linux", "cpu": "s390x" }, "sha512-4b6f2+FrtruAESrCqIKcrarzfrSx+wk2QNcp+RT91/Prc+pMQMAfyZ1rG1c3tFQNl8Bc616tx40uNXyxNBRPbQ=="], + "@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.75.0", "", { "os": "linux", "cpu": "x64" }, "sha512-nshAhrUvXFUWOvqQ2soIw7HFNWvpvEV4o0cYSqPtzLiPF5gKyYTDOOTJ6Rn8g8K/iGvPIrbDA4v8+5MvnjJrrg=="], + "@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.75.0", "", { "os": "linux", "cpu": "x64" }, "sha512-e4jNxLKnxLC6sYBQRxrI2pgIIxnmMtF8U/VwNYcjTT/CLS+spH624cYVnj07bTKwaEWT37/e025isOs6j/0xqA=="], + "@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.75.0", "", { "os": "none", "cpu": "arm64" }, "sha512-hZ2lH+1qLf/DiEP9UWuQTK2JWj/BgvMB4jhIV4SmNU1wfEiYYX4TynQyAZXx0j9X4qRYizAL042SKaV+8ynh4w=="], + "@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.75.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-Ilj6PNzGDS3bCU0MSJH7Msh0NhH+T/mRp2shwg+q+GHeVlPwP5LEboW96aW+3kVKFk6zYZy1Xi5pZkqZh6X8KQ=="], + "@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.75.0", "", { "os": "win32", "cpu": "ia32" }, "sha512-QVit2nOEOiPhkmsrksPSkoGCdnZRNkspt8fwoYyP09te1VEbnSj4LAxua4rc8FKTmWkySVe05j8iz9GXYfF1AQ=="], + "@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.75.0", "", { "os": "win32", "cpu": "x64" }, "sha512-DSxnNkBUAYARPwJtR12Ig3deWr8w0H997xP6jy33i+e0SyYJw8FKuz4+cZtpmPEhQmvlPJE3X/2vNxDmLkd/rA=="], + "@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=="], @@ -212,9 +202,9 @@ "@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", "typescript"], "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=="], @@ -250,71 +240,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.10.0", "", { "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" }, "peerDependencies": { "@testing-library/dom": ">=10 <11" } }, "sha512-HQwu0KaB2zyT0iLzBL+8CLyZDL3KlZlZJ+2iyc9uCUnlJVskJU/UlPuVCyIPhtukjPQdT2QNoR5nCP5FqTmmDQ=="], - - "@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": "*" }, "optionalPeers": ["vite", "vitest"] }, "sha512-4o31E4HGo5BU5KwPkulNRocEden+7Tt9JYm9uhln5ajF7DULeyFA46BBWVfKJ8Ms9B3JmOFPTIiVamH7n3KpuQ=="], - - "@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/core": ["@tiptap/core@3.29.2", "", { "peerDependencies": { "@tiptap/pm": "3.29.2" } }, "sha512-oKUkiPUB7noilVYxI9lNzUD4rX17sHub+PYjMfHMWHG9A3nvIy+FdePIVIIhThKWF7ijhr3eIqHY51Bn+GAFtw=="], - "@tiptap/core": ["@tiptap/core@3.28.0", "", { "peerDependencies": { "@tiptap/pm": "3.28.0" } }, "sha512-gUuD5WAYfbDxNSSJya/emh2KSzXZXLUYKW4fEnc1AQ5FE2twzh4LJ9UlKFIawigrUCAksWI5Fy1hRbv+5m4ZdQ=="], + "@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/extension-blockquote": ["@tiptap/extension-blockquote@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0", "@tiptap/pm": "3.28.0" } }, "sha512-y8Xi6Z3AQLXedz0J8Z3kDsu7SKBmL50gKVXx3RK1Oo1cuCGhNChm3syChkAz3PLAbrPUM5rvJDSZdF2jUrDnng=="], + "@tiptap/extension-bold": ["@tiptap/extension-bold@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-elYbGxJsYnBb4leqrcjdIJuiG380BcOgN+UUzvOv+qEjfGVzHodFOMBl3qnmD6urYHNu5/qQK2S0qSSRXKCLNQ=="], - "@tiptap/extension-bold": ["@tiptap/extension-bold@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-JhZQmr0AU741bOwjVMfuwJdK4g0TQwwPbeca9aqKHv5zvZw4i4G9G6fESVyMFc3Yag1ffpnq5EtNldHKTnMhlw=="], + "@tiptap/extension-bullet-list": ["@tiptap/extension-bullet-list@3.29.2", "", { "peerDependencies": { "@tiptap/extension-list": "3.29.2" } }, "sha512-3bWcCUPbCHv0XttlMdnAtXLNYWx2pblByMgxmGsaP9FU0QnslGXty6A6gHCqI33ygRg1vrA6U5Wtpwbi5aKu5g=="], - "@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": ["@tiptap/extension-code@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-c6W5UGuB7WNLpYocsgRzpO2OOTI4QjaI9jjHRMuty9z+s9DtaYM/HrRLNwVh6MopkHb+i/89Wkv8gCS34fftig=="], - "@tiptap/extension-code": ["@tiptap/extension-code@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-AUw2Acof3CQE6Q6Y22saK4lyg0nkeJ4XXniU65TdAi/9TE66TGiO4NQJJNNPgu8+VMEwl5j8VsIFK8sfTcNYtg=="], + "@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-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-color": ["@tiptap/extension-color@3.29.2", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.29.2" } }, "sha512-DMeyDRGZXIe2m2/QlrBoN15R4Ufwz3ERiG//OM7bjcYpiTZiO+pLC6tyabI1+QcJrYUGTu5zVah583xXzt89Kw=="], - "@tiptap/extension-color": ["@tiptap/extension-color@3.28.0", "", { "peerDependencies": { "@tiptap/extension-text-style": "3.28.0" } }, "sha512-YbUMUdrgU04GDYoii1wuFVkiTSQoaEQh04kwgQayEQ46aUBEnnaJitWdp39aGMWYTIXD/c9K9cr5Vg8GSKcVxA=="], + "@tiptap/extension-document": ["@tiptap/extension-document@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-YUamvefLnsqu6124GavVTI7nqcFlQJ12ROB0oSwG69eSBZYNjg1tIs05LFrBxkwf4Xgqd6YzfJ9+FeG428RvzQ=="], - "@tiptap/extension-document": ["@tiptap/extension-document@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-5SAKtlB1Tr/eZFhISL86HqmUup6rItvPtuPyRjmZo/VgbMwXEwiyAh1sMgFp5VNaeSMM14vJSyQpjhSaOmaBqg=="], + "@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-dropcursor": ["@tiptap/extension-dropcursor@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-JA+dXQjjfJBpD0nVsZeddGVXRsmanESM9+8CtM35hI9wJnYMXay/B+5GUhswO20zhT3zhB2ZOTGe9knu6A8nIQ=="], + "@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-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-gapcursor": ["@tiptap/extension-gapcursor@3.29.2", "", { "peerDependencies": { "@tiptap/extensions": "3.29.2" } }, "sha512-8Q39UR4/Tit759IeW9xZIe3NMwN11GsuA3FLheDyyGn7RrW02HD3HhUDlazE54Ki4HoosjFmChPlN4Ik2ubdRQ=="], - "@tiptap/extension-gapcursor": ["@tiptap/extension-gapcursor@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-Wo73kM4q8z4Va9i4+0n1cO0UEMVUVBHPqM6cAqEYXjB4T48LQkKjRsiQydCezm185rQAsmm1dyi72gtvVQfdMg=="], + "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-eUW3LN3fq8rXnjEUeI3D2QONYdLsU3yYQm4jxlErs2h4cfwrFjgf19VSUFVmm6LrFbbQ0OnDVPeVLL6iOwDw2w=="], - "@tiptap/extension-hard-break": ["@tiptap/extension-hard-break@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-JHIFjX1luJgQ4VFEkIeXZpbc54Qiw+69P8FmlazYTh7AIJ6iLCpMFgQFELnivEAZ+/vS0lMPQubg0rCeM3UrHw=="], + "@tiptap/extension-heading": ["@tiptap/extension-heading@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-6W4aIy70Mh7BNlbG9zZ5FBLhJhU2UUEzgZJ/jwYSCcB30o8McLxJSEjhtoHiX8R78Ah2/JzBGvIe5olZlbeE4A=="], - "@tiptap/extension-heading": ["@tiptap/extension-heading@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-rKjGG/Ik2lNaXBNVmONEDm5DBfGDLM1NWgSf5RRfBISrH8Lm1xqFruOB9tIaB0YUoSV3SBOiwTF9svmzvKSoRA=="], + "@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-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-italic": ["@tiptap/extension-italic@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-iH63V/5wsaMnY4Jz0+meaAGhaec4AiOzOduzl6ZZr5IyGhZ1kthyW84ELt0dyLI3hNceAUhaNWc+I7+vX0aoXA=="], - "@tiptap/extension-italic": ["@tiptap/extension-italic@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-Yur/ELz6dNVKQC7m8wGjtoLFxamGjJmA0rUEEOacTH6J39aFmcSxYkEGNDkYHbZFyHFYqbej6eI3VE0h08O0mg=="], + "@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-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": ["@tiptap/extension-list@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2", "@tiptap/pm": "3.29.2" } }, "sha512-WPZ9BHAPT6QeIm1vdVkuoOWvy9a8/EZeJwV2VhU8LXyTAttvzyj4rsbbHyJWvYWlUSTt/QF2AZ2zhKo7u1w3/A=="], - "@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-item": ["@tiptap/extension-list-item@3.29.2", "", { "peerDependencies": { "@tiptap/extension-list": "3.29.2" } }, "sha512-s8vBVHHFT0Qpu7CzAZ7S1kYmSiVaDvUNvMNcZUWnxj6VPfiwmx0eXd9FsjePrRCMoM5tFmPnhFTHDxY3D/eZeQ=="], - "@tiptap/extension-list-item": ["@tiptap/extension-list-item@3.28.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.28.0" } }, "sha512-GbXrnMac6knSetZY33NHwOrgXFPqH28uCklQqmOZQlsrdGqezDKk31qoEMr4GsKW9n/lViAeuc07oIzwLwCMng=="], + "@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-keymap": ["@tiptap/extension-list-keymap@3.28.0", "", { "peerDependencies": { "@tiptap/extension-list": "3.28.0" } }, "sha512-u9Wks8c/eQAv0RkULNggOyTKDD69WVbcV9H5cbasPDUbq5XbEFVa9ajxhEGfMmQ5et3EX0QL8qBi50K0GqbIjA=="], + "@tiptap/extension-ordered-list": ["@tiptap/extension-ordered-list@3.29.2", "", { "peerDependencies": { "@tiptap/extension-list": "3.29.2" } }, "sha512-ndCunC+UsYOpkOtL7vGnDz21UNa45WUlcO9wMT1fbuYow2QnRhsuMlCWENXI52YPPARWuQ0RDgN7q6TaxPERBg=="], - "@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-paragraph": ["@tiptap/extension-paragraph@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-7qJj5YTr11vvjNgjDN1ypOfwTovc0QOCYcit/rskeuVgnmQZOZQzC/BbyKLLG7UGnpRLemU/mEGbW9pAqjAXkQ=="], - "@tiptap/extension-paragraph": ["@tiptap/extension-paragraph@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-8UMlQIjzqf6r2hSJ/VeJ00RqaOrOB1J5rTk02Vcw2pYeHkOqp+B0ff0HFu4abT9x1q4oXrBAgMsxRtgh/kR14Q=="], + "@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@3.29.2", "", { "peerDependencies": { "@tiptap/extensions": "3.29.2" } }, "sha512-/BlpPIq2JZk6zLaeYVOXazi6dmd0iRriTymNEnFn1doManN1y5HED9LsMeb/AhNhauL5AgmcHgpvAjbsN9k4SA=="], - "@tiptap/extension-placeholder": ["@tiptap/extension-placeholder@3.28.0", "", { "peerDependencies": { "@tiptap/extensions": "3.28.0" } }, "sha512-zueiqNeCHOshDa8dGGSa/0cOBZkMjPrxQhemjF4tj2yZ6EeWHBPtCE5h/uQCagEePxsoaJtvaCRh88199zrgBw=="], + "@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-strike": ["@tiptap/extension-strike@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-VVj2ZZU9QYqiHLcjqMqRYvuHSsokj/AgUl+6TzLrKjlWwyZ18D4H2vkyI0g70iVTKnUpZ3sEy8WA/rqjgBjqBg=="], + "@tiptap/extension-text": ["@tiptap/extension-text@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-Ubko45JWWHe8glBt2PiGNF8hcbys/JNalFhiR7Y1X4iOOtAxAKJJxh3+eq+//NTlGuBPdWGp7zw8EEUp7anjKA=="], - "@tiptap/extension-text": ["@tiptap/extension-text@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-Jqp1LgfY1mnp4TQHoy+vnHyfn6qnnAM6nHgGwbY5zA8b/Xf1Etll6pziTx9p1J1qcfAgSrnjOyAmA++H7VQqww=="], + "@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.29.2", "", { "peerDependencies": { "@tiptap/core": "3.29.2" } }, "sha512-aQad9V9ROaEi3hE4g5z9wQ6lv5FSnzlnWFMVJxRjNlwXgm7H0fymxb4rGfca+pAwYkiRwpKYh1LatpJw2ECQAA=="], - "@tiptap/extension-text-style": ["@tiptap/extension-text-style@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-UreMyqZSv770+CXJK/l1qeHUdaNMQAVkxSOPWpiY9FiT8B4OQyjA7WBOlWrzbvVTzfJvXWk2Y3SWgVRx+/Cd9A=="], + "@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-underline": ["@tiptap/extension-underline@3.28.0", "", { "peerDependencies": { "@tiptap/core": "3.28.0" } }, "sha512-rwxCS6vTh2DJkNIYQX7JSrrRSmm76e2y48aZeuZO5ShkvLWMuJ3/zqDHRxAQVDiJhuE2Cp8NrTmPYlUc9YrT0A=="], + "@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/extensions": ["@tiptap/extensions@3.29.0", "", { "peerDependencies": { "@tiptap/core": "3.29.0", "@tiptap/pm": "3.29.0" } }, "sha512-ltlrm8dDHIgeNj3cOLEdLFMPPVy3TYvWA8ftrrJ44C/L01MBmgFB1f/vkPFYYnAasb2BYyVG6HxAGcTQHo5jHw=="], + "@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/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=="], @@ -322,8 +304,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=="], @@ -332,7 +312,7 @@ "@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=="], @@ -354,10 +334,6 @@ "acorn": ["acorn@8.17.0", "", { "bin": { "acorn": "bin/acorn" } }, "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg=="], - "ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - - "ansi-styles": ["ansi-styles@5.2.0", "", {}, "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA=="], - "aria-query": ["aria-query@5.3.1", "", {}, "sha512-Z/ZeOgVl7bcSYZ/u/rh0fOpvEpq//LZmdbkXyc7syVzjPAhfOa9ebsdTSjEBDU4vs5nC98Kfduj1uFo0qyET3g=="], "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], @@ -366,8 +342,6 @@ "axobject-query": ["axobject-query@4.1.0", "", {}, "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ=="], - "base64-arraybuffer": ["base64-arraybuffer@1.0.2", "", {}, "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ=="], - "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=="], @@ -386,12 +360,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=="], @@ -406,8 +376,6 @@ "devalue": ["devalue@5.8.2", "", {}, "sha512-DObPPAfdtFbXjxLqK8s2Xk9ZuWz5+ZoFEhC7J76es4GU/rEiXwHTmbImoCdyoCOcBH1UF3+Cz6Z2sYD4hyl5TA=="], - "dom-accessibility-api": ["dom-accessibility-api@0.6.3", "", {}, "sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w=="], - "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=="], @@ -438,16 +406,12 @@ "html-escaper": ["html-escaper@2.0.2", "", {}, "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg=="], - "html2canvas-pro": ["html2canvas-pro@2.3.1", "", { "dependencies": { "css-line-break": "^2.1.0", "text-segmentation": "^1.0.3" } }, "sha512-w7CCWi0B0kCy/joy5cPN2GIDGW0iwbqBppxxc2Vc5UyqYDQ1K13ZVr+MyGR/34Mq03emCTxVbBTpG299/prACw=="], - "idb": ["idb@8.0.3", "", {}, "sha512-LtwtVyVYO5BqRvcsKuB2iUMnHwPVByPCXFXOpuU96IZPPoPN6xjOGxZQ74pgSVVLQWtUOYgyeL4GE98BY5D3wg=="], "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], "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=="], @@ -510,8 +474,6 @@ "mdn-data": ["mdn-data@2.27.1", "", {}, "sha512-9Yubnt3e8A0OKwxYSXyhLymGW4sCufcLG6VdiDdUGVkPhpqLxlvP5vl1983gQjJl3tqbrM731mjaZaP68AgosQ=="], - "min-indent": ["min-indent@1.0.1", "", {}, "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg=="], - "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=="], @@ -528,7 +490,7 @@ "orderedmap": ["orderedmap@2.1.1", "", {}, "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g=="], - "oxlint": ["oxlint@1.75.0", "", { "optionalDependencies": { "@oxlint/binding-android-arm-eabi": "1.75.0", "@oxlint/binding-android-arm64": "1.75.0", "@oxlint/binding-darwin-arm64": "1.75.0", "@oxlint/binding-darwin-x64": "1.75.0", "@oxlint/binding-freebsd-x64": "1.75.0", "@oxlint/binding-linux-arm-gnueabihf": "1.75.0", "@oxlint/binding-linux-arm-musleabihf": "1.75.0", "@oxlint/binding-linux-arm64-gnu": "1.75.0", "@oxlint/binding-linux-arm64-musl": "1.75.0", "@oxlint/binding-linux-ppc64-gnu": "1.75.0", "@oxlint/binding-linux-riscv64-gnu": "1.75.0", "@oxlint/binding-linux-riscv64-musl": "1.75.0", "@oxlint/binding-linux-s390x-gnu": "1.75.0", "@oxlint/binding-linux-x64-gnu": "1.75.0", "@oxlint/binding-linux-x64-musl": "1.75.0", "@oxlint/binding-openharmony-arm64": "1.75.0", "@oxlint/binding-win32-arm64-msvc": "1.75.0", "@oxlint/binding-win32-ia32-msvc": "1.75.0", "@oxlint/binding-win32-x64-msvc": "1.75.0" }, "peerDependencies": { "oxlint-tsgolint": ">=7.0.2001", "vite-plus": "*" }, "optionalPeers": ["oxlint-tsgolint", "vite-plus"], "bin": { "oxlint": "bin/oxlint" } }, "sha512-m9WzjRcRYA/uqIZDa9tclrieoPJ/ln1QYTKdFx6NUOs8uY5DiHlIwRQoCrHT6OM6O3ww3l2skY5gO7G7ZphE7g=="], + "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.8.0", "", {}, "sha512-yQA4H19AmPEoMUeavPMDIe1higySl/gH/yaQrkT/s07Qp+7pp2hYz30N3z2l5BkjVkF9Ow6o0wjJamm2y7Sn0A=="], @@ -542,11 +504,11 @@ "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": { "playwright": "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": { "playwright-core": "cli.js" } }, "sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg=="], + "playwright-core": ["playwright-core@1.62.1", "", { "bin": { "playwright-core": "cli.js" } }, "sha512-wPYSwEBJY9GHraISXqyqtx0na0LpO3XEX7jNDhntbex7tzUS7kLnZsOlFruFJB4Hi/rhDMjXGqHewDZ68nYZVw=="], - "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=="], + "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.6", "", { "bin": { "prettier": "bin/prettier.cjs" } }, "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g=="], @@ -554,8 +516,6 @@ "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=="], - "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=="], - "prosemirror-changeset": ["prosemirror-changeset@2.4.1", "", { "dependencies": { "prosemirror-transform": "^1.0.0" } }, "sha512-96WBLhOaYhJ+kPhLg3uW359Tz6I/MfcrQfL4EGv4SrcqKEMC1gmoGrXHecPE8eOwTVCJ4IwgfzM8fFad25wNfw=="], "prosemirror-commands": ["prosemirror-commands@1.7.1", "", { "dependencies": { "prosemirror-model": "^1.0.0", "prosemirror-state": "^1.0.0", "prosemirror-transform": "^1.10.2" } }, "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w=="], @@ -586,15 +546,11 @@ "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": { "rolldown": "./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=="], @@ -618,23 +574,21 @@ "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.7", "", { "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-5qERUZX80oQj6XrDMUmD2Uhd/cIpCPDWWKBK3ZHmyRUC9apPyamWM8xMo31mbWsIQxwG2hVoSnOJ/EcnhVkkzQ=="], + "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": { "svelte-check": "bin/svelte-check" } }, "sha512-DHdTCGX62R0fCxBEaT+USdASAnoaRBaaNczkRJl0K7o3WyoCeVUbVxo6fKqpOll/B+WMWCsiFK0eFrJSNBKZIg=="], + "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-highlight": ["svelte-highlight@7.16.0", "", { "dependencies": { "magic-string": "^0.30.17" } }, "sha512-0H7RwC+mvV/aZ7gFsg5bEDtFHsWlirKFlpw7HImjMQTclq3/bWjgtYV2sgMma90DU9H72G3J8n7fTlTUFWk76w=="], + "svelte-highlight": ["svelte-highlight@7.16.2", "", { "dependencies": { "magic-string": "^0.30.17" } }, "sha512-vJkp8F5mVEvJNPnunqjxn8xr4GcsYwkIet7ITyAk88/UEqD5L/HSOjlJTqtlC707csndA/Qy8N0Ie7UXyOe3fQ=="], "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=="], @@ -646,8 +600,6 @@ "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=="], @@ -688,9 +640,7 @@ "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=="], - "utrie": ["utrie@1.0.2", "", { "dependencies": { "base64-arraybuffer": "^1.0.2" } }, "sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw=="], - - "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=="], + "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" }, "optionalPeers": ["vite"] }, "sha512-ub4okH7Z5KLjb6hDyjqrGXqWtWvoYdU3IGm/NorpgHncKoLTCfRIbvlhBm7r0YstIaQRYlp4yEbFqDcKSzXSSg=="], @@ -716,8 +666,6 @@ "zimmerframe": ["zimmerframe@1.1.4", "", {}, "sha512-B58NGBEoc8Y9MWWCQGl/gq9xBCe4IiKM0a2x7GZdQKOW5Exr8S1W24J6OgM1njK8xCRGvAJIL/MxXHf6SkmQKQ=="], - "@babel/code-frame/js-tokens": ["js-tokens@4.0.0", "", {}, "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="], - "@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=="], @@ -732,16 +680,12 @@ "@tailwindcss/oxide-wasm32-wasi/tslib": ["tslib@2.8.1", "", { "bundled": true }, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], - "@testing-library/dom/aria-query": ["aria-query@5.3.0", "", { "dependencies": { "dequal": "^2.0.3" } }, "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A=="], - - "@testing-library/dom/dom-accessibility-api": ["dom-accessibility-api@0.5.16", "", {}, "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg=="], - - "@tiptap/starter-kit/@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=="], - "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=="], + "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=="], @@ -765,5 +709,39 @@ "@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 1137fed..2d3ed31 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,4940 +1,4131 @@ { - "name": "tools", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "tools", - "version": "0.0.1", - "dependencies": { - "@tiptap/core": "^3.28.0", - "@tiptap/extension-placeholder": "^3.28.0", - "@tiptap/pm": "^3.28.0", - "@tiptap/starter-kit": "^3.28.0", - "bits-ui": "^2.18.1", - "html2canvas-pro": "^2.3.0", - "idb": "^8.0.3", - "modern-screenshot": "^4.7.0", - "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.37", - "@playwright/test": "^1.61.1", - "@sveltejs/adapter-auto": "^7.0.1", - "@sveltejs/kit": "^2.70.1", - "@sveltejs/vite-plugin-svelte": "^7.2.0", - "@tailwindcss/vite": "^4.3.3", - "@testing-library/jest-dom": "^6.10.0", - "@testing-library/svelte": "^5.4.2", - "@tiptap/extension-color": "^3.28.0", - "@tiptap/extension-font-family": "^3.28.0", - "@tiptap/extension-text-style": "^3.28.0", - "@types/node": "^26.1.1", - "@vitest/coverage-v8": "4.1.10", - "file-type": "^22.0.1", - "jsdom": "^29.1.1", - "oxlint": "^1.75.0", - "prettier": "^3.9.6", - "prettier-plugin-svelte": "^4.1.1", - "prettier-plugin-tailwindcss": "^0.8.1", - "svelte": "^5.56.7", - "svelte-check": "^4.7.3", - "tailwindcss": "^4.3.3", - "typescript": "^6.0.3", - "unplugin-icons": "^23.0.1", - "vite": "^8.1.5", - "vitest": "^4.1.10" - } - }, - "node_modules/@adobe/css-tools": { - "version": "4.5.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@antfu/install-pkg": { - "version": "1.1.0", - "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", - "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", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/@asamuzakjp/nwsapi": { - "version": "2.3.9", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/code-frame": { - "version": "7.29.7", - "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/code-frame/node_modules/js-tokens": { - "version": "4.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.29.7" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/runtime": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.29.7", - "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/@babel/types/node_modules/@babel/helper-validator-identifier": { - "version": "7.29.7", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/@borewit/text-codec": { - "version": "0.2.2", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Borewit" - } - }, - "node_modules/@bramus/specificity": { - "version": "2.4.2", - "dev": true, - "license": "MIT", - "dependencies": { - "css-tree": "^3.0.0" - }, - "bin": { - "specificity": "bin/cli.js" - } - }, - "node_modules/@csstools/color-helpers": { - "version": "6.1.0", - "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.3.0", - "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.10", - "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.3.0" - }, - "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", - "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.7", - "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", - "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", - "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", - "license": "MIT", - "dependencies": { - "@floating-ui/utils": "^0.2.12" - } - }, - "node_modules/@floating-ui/dom": { - "version": "1.8.0", - "license": "MIT", - "dependencies": { - "@floating-ui/core": "^1.8.0", - "@floating-ui/utils": "^0.2.12" - } - }, - "node_modules/@floating-ui/utils": { - "version": "0.2.12", - "license": "MIT" - }, - "node_modules/@iconify-json/tabler": { - "version": "1.2.37", - "dev": true, - "license": "MIT", - "dependencies": { - "@iconify/types": "*" - } - }, - "node_modules/@iconify/types": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@iconify/utils": { - "version": "3.1.4", - "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", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@swc/helpers": "^0.5.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/remapping": { - "version": "2.3.5", - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "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", - "devOptional": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Boshen" - } - }, - "node_modules/@oxlint/binding-android-arm-eabi": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm-eabi/-/binding-android-arm-eabi-1.75.0.tgz", - "integrity": "sha512-lutovtFzJqlRaqpZrCqSSGaHZzl9nIxxpjLzhSRLunN6dCLylj0uzlCyQGaQDIys7rrv8kVXiFO+R4Zpn0bX7g==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-android-arm64/-/binding-android-arm64-1.75.0.tgz", - "integrity": "sha512-hXI0hDgHkw4w5nfru72aG7y+2iQJmC4waH/KV6H/hbgA6yAP5jYNx0P9yug15Hs0tWl/+mda3Jjn/2gmDT48tw==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-arm64/-/binding-darwin-arm64-1.75.0.tgz", - "integrity": "sha512-D91BWbK/dMYfCcrghspPIuKs2D9LF4Z/OabVSQjw1AO6PWxArD7teDA48bm0ySFqWDaPVqmQRl5GMWNglTXyrQ==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-darwin-x64/-/binding-darwin-x64-1.75.0.tgz", - "integrity": "sha512-02mpwzf12BonZ6PT0TuQoomvEh2kVl2WGBIKWezCyToIS+rYkQZ6GXnARBAl9A4Ovm2V+Xe7M4KretyqmmcnJQ==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-freebsd-x64/-/binding-freebsd-x64-1.75.0.tgz", - "integrity": "sha512-qZJgLnDaBsiL5YESx2t/TZ8eXkL9fEkKoXEdzegROhlz9A0lgyGnZ0dAzJrh7LJAHQl2K9RdRueN2s/9N7+odg==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.75.0.tgz", - "integrity": "sha512-7XlaWA5BJD3XpCfrEqjEe6Zseeb14S7QGa304XfwKignRaKQ+eIj775BQ7nIslggWickl4IsPUFqJ+/gAyNHVg==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-1.75.0.tgz", - "integrity": "sha512-av6Tpv8yrcMMMOadOqENBhlsLRcGFXXwoQ0hzHhsmS9FJ4Wioy8we427GbcMe2XTxmL2e60T67H1Dyr3up+tAA==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.75.0.tgz", - "integrity": "sha512-WcUhd8fHT5plrA14lANevl+hOl815mVI5t2hU21oFWrZKFXIVV/Sr4rWQV0NzSvzBupbMLNc5ErEA6Ehxh5jMg==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.75.0.tgz", - "integrity": "sha512-UWzp5wRHFe/ESO3+eEaxXsTkYTGLYjnTsi/I5neEacXSItQ6WNleapfOAeA4x2b8nyhJ4uQxqvtv9pHv8kWJtQ==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.75.0.tgz", - "integrity": "sha512-XEVRwGMLKCUKrvhLAz4F6AIh8MJrQVdSZtAmPpRZt9tGPsUnamPOcl3dS/ZQzJnar/Ymgc//+xho0L60Emzuxg==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-1.75.0.tgz", - "integrity": "sha512-mAG4DUXqfLC8cTjMD2kt3jDmVzFREYtDyeLNdLdsCcBc4Zbl2EMuiFektGBilQwkNjYnMvCqJs55U+Hyb+b+jw==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-1.75.0.tgz", - "integrity": "sha512-95hrAvriAlI+pekSomTFIn0+bawMDlDwTNVmdjsFusTHyL2JWh7TWvRNG/Lkim72uN8OiCcO9wcaC6omLP5E3w==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.75.0.tgz", - "integrity": "sha512-4b6f2+FrtruAESrCqIKcrarzfrSx+wk2QNcp+RT91/Prc+pMQMAfyZ1rG1c3tFQNl8Bc616tx40uNXyxNBRPbQ==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.75.0.tgz", - "integrity": "sha512-nshAhrUvXFUWOvqQ2soIw7HFNWvpvEV4o0cYSqPtzLiPF5gKyYTDOOTJ6Rn8g8K/iGvPIrbDA4v8+5MvnjJrrg==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-linux-x64-musl/-/binding-linux-x64-musl-1.75.0.tgz", - "integrity": "sha512-e4jNxLKnxLC6sYBQRxrI2pgIIxnmMtF8U/VwNYcjTT/CLS+spH624cYVnj07bTKwaEWT37/e025isOs6j/0xqA==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-openharmony-arm64/-/binding-openharmony-arm64-1.75.0.tgz", - "integrity": "sha512-hZ2lH+1qLf/DiEP9UWuQTK2JWj/BgvMB4jhIV4SmNU1wfEiYYX4TynQyAZXx0j9X4qRYizAL042SKaV+8ynh4w==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.75.0.tgz", - "integrity": "sha512-Ilj6PNzGDS3bCU0MSJH7Msh0NhH+T/mRp2shwg+q+GHeVlPwP5LEboW96aW+3kVKFk6zYZy1Xi5pZkqZh6X8KQ==", - "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.75.0", - "resolved": "https://registry.npmjs.org/@oxlint/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-1.75.0.tgz", - "integrity": "sha512-QVit2nOEOiPhkmsrksPSkoGCdnZRNkspt8fwoYyP09te1VEbnSj4LAxua4rc8FKTmWkySVe05j8iz9GXYfF1AQ==", - "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.75.0", - "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", - "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", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@popperjs/core": { - "version": "2.11.8", - "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", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@standard-schema/spec": { - "version": "1.1.0", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@sveltejs/acorn-typescript": { - "version": "1.0.11", - "license": "MIT", - "peerDependencies": { - "acorn": "^8.9.0" - } - }, - "node_modules/@sveltejs/adapter-auto": { - "version": "7.0.1", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@sveltejs/kit": "^2.0.0" - } - }, - "node_modules/@sveltejs/kit": { - "version": "2.70.1", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 18.0.0" - } - }, - "node_modules/@sveltejs/vite-plugin-svelte": { - "version": "7.2.0", - "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", - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "tslib": "^2.8.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.3.3", - "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/node/node_modules/lightningcss": { - "version": "1.32.0", - "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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "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/@tailwindcss/oxide": { - "version": "4.3.3", - "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", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 20" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.3.3", - "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", - "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", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/@testing-library/jest-dom": { - "version": "6.10.0", - "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": ">=22", - "npm": ">=6", - "yarn": ">=1" - }, - "peerDependencies": { - "@testing-library/dom": ">=10 <11" - } - }, - "node_modules/@testing-library/svelte": { - "version": "5.4.2", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/chai": { - "version": "5.2.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/deep-eql": "*", - "assertion-error": "^2.0.1" - } - }, - "node_modules/@types/cookie": { - "version": "0.6.0", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/deep-eql": { - "version": "4.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/estree": { - "version": "1.0.9", - "license": "MIT" - }, - "node_modules/@types/node": { - "version": "26.1.1", - "devOptional": true, - "license": "MIT", - "dependencies": { - "undici-types": "~8.3.0" - } - }, - "node_modules/@types/trusted-types": { - "version": "2.0.7", - "license": "MIT" - }, - "node_modules/@vitest/coverage-v8": { - "version": "4.1.10", - "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", - "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", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "tinyrainbow": "^3.1.0" - }, - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/runner": { - "version": "4.1.10", - "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", - "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", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://opencollective.com/vitest" - } - }, - "node_modules/@vitest/utils": { - "version": "4.1.10", - "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", - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/aria-query": { - "version": "5.3.1", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/assertion-error": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - } - }, - "node_modules/ast-v8-to-istanbul": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.31", - "estree-walker": "^3.0.3", - "js-tokens": "^10.0.0" - } - }, - "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { - "version": "10.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/axobject-query": { - "version": "4.1.0", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/base64-arraybuffer": { - "version": "1.0.2", - "license": "MIT", - "engines": { - "node": ">= 0.6.0" - } - }, - "node_modules/bidi-js": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "require-from-string": "^2.0.2" - } - }, - "node_modules/bits-ui": { - "version": "2.18.1", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/chokidar": { - "version": "4.0.3", - "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", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/colord": { - "version": "2.9.3", - "license": "MIT" - }, - "node_modules/confbox": { - "version": "0.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.6.0", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/css-line-break": { - "version": "2.1.0", - "license": "MIT", - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/css-tree": { - "version": "3.2.1", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/data-urls": { - "version": "7.0.0", - "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", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/detect-libc": { - "version": "2.1.2", - "devOptional": true, - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/devalue": { - "version": "5.8.2", - "license": "MIT" - }, - "node_modules/dom-accessibility-api": { - "version": "0.6.3", - "dev": true, - "license": "MIT" - }, - "node_modules/enhanced-resolve": { - "version": "5.24.3", - "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", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/esm-env": { - "version": "1.2.2", - "license": "MIT" - }, - "node_modules/esrap": { - "version": "2.3.0", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.0" - } - }, - "node_modules/expect-type": { - "version": "1.4.0", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/exsolve": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.5.0", - "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", - "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", - "dev": true, - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/html-encoding-sniffer": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@exodus/bytes": "^1.6.0" - }, - "engines": { - "node": "^20.19.0 || ^22.12.0 || >=24.0.0" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/html2canvas-pro": { - "version": "2.3.1", - "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", - "license": "ISC" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "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", - "dev": true, - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/indent-string": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/inline-style-parser": { - "version": "0.2.7", - "license": "MIT" - }, - "node_modules/is-potential-custom-element-name": { - "version": "1.0.1", - "dev": true, - "license": "MIT" - }, - "node_modules/is-reference": { - "version": "3.0.3", - "license": "MIT", - "dependencies": { - "@types/estree": "^1.0.6" - } - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "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", - "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", - "devOptional": true, - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/jsdom": { - "version": "29.1.1", - "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", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lightningcss": { - "version": "1.33.0", - "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.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/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" - ], - "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.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" - ], - "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.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", - "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", - "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.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" - ], - "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.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" - ], - "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.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" - ], - "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.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" - ], - "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.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" - ], - "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.33.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", - "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", - "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.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" - ], - "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.33.0", - "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", - "license": "MIT" - }, - "node_modules/local-pkg": { - "version": "1.2.1", - "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", - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "11.5.2", - "dev": true, - "license": "BlueOak-1.0.0", - "engines": { - "node": "20 || >=22" - } - }, - "node_modules/lz-string": { - "version": "1.5.0", - "license": "MIT", - "bin": { - "lz-string": "bin/bin.js" - } - }, - "node_modules/magic-string": { - "version": "0.30.21", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, - "node_modules/magicast": { - "version": "0.5.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.29.3", - "@babel/types": "^7.29.0", - "source-map-js": "^1.2.1" - } - }, - "node_modules/make-dir": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/mdn-data": { - "version": "2.27.1", - "dev": true, - "license": "CC0-1.0" - }, - "node_modules/min-indent": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mlly": { - "version": "1.8.2", - "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/pkg-types": { - "version": "1.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, - "node_modules/mlly/node_modules/pkg-types/node_modules/confbox": { - "version": "0.1.8", - "dev": true, - "license": "MIT" - }, - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/mrmime": { - "version": "2.0.1", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.16", - "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", - "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", - "license": "MIT" - }, - "node_modules/oxlint": { - "version": "1.75.0", - "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.75.0", - "@oxlint/binding-android-arm64": "1.75.0", - "@oxlint/binding-darwin-arm64": "1.75.0", - "@oxlint/binding-darwin-x64": "1.75.0", - "@oxlint/binding-freebsd-x64": "1.75.0", - "@oxlint/binding-linux-arm-gnueabihf": "1.75.0", - "@oxlint/binding-linux-arm-musleabihf": "1.75.0", - "@oxlint/binding-linux-arm64-gnu": "1.75.0", - "@oxlint/binding-linux-arm64-musl": "1.75.0", - "@oxlint/binding-linux-ppc64-gnu": "1.75.0", - "@oxlint/binding-linux-riscv64-gnu": "1.75.0", - "@oxlint/binding-linux-riscv64-musl": "1.75.0", - "@oxlint/binding-linux-s390x-gnu": "1.75.0", - "@oxlint/binding-linux-x64-gnu": "1.75.0", - "@oxlint/binding-linux-x64-musl": "1.75.0", - "@oxlint/binding-openharmony-arm64": "1.75.0", - "@oxlint/binding-win32-arm64-msvc": "1.75.0", - "@oxlint/binding-win32-ia32-msvc": "1.75.0", - "@oxlint/binding-win32-x64-msvc": "1.75.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", - "dev": true, - "license": "MIT" - }, - "node_modules/parse5": { - "version": "8.0.1", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/picocolors": { - "version": "1.1.1", - "devOptional": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.5", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pkg-types": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.2.4", - "exsolve": "^1.0.8", - "pathe": "^2.0.3" - } - }, - "node_modules/playwright": { - "version": "1.61.1", - "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", - "dev": true, - "license": "Apache-2.0", - "bin": { - "playwright-core": "cli.js" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/postcss": { - "version": "8.5.22", - "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.6", - "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", - "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", - "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", - "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", - "license": "MIT", - "dependencies": { - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-commands": { - "version": "1.7.1", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.10.2" - } - }, - "node_modules/prosemirror-commands/node_modules/prosemirror-model": { - "version": "1.25.4", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-dropcursor": { - "version": "1.8.3", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0", - "prosemirror-view": "^1.1.0" - } - }, - "node_modules/prosemirror-dropcursor/node_modules/prosemirror-view": { - "version": "1.41.8", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/prosemirror-dropcursor/node_modules/prosemirror-view/node_modules/prosemirror-model": { - "version": "1.25.4", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-gapcursor": { - "version": "1.4.1", - "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-gapcursor/node_modules/prosemirror-model": { - "version": "1.25.4", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-gapcursor/node_modules/prosemirror-view": { - "version": "1.41.8", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/prosemirror-history": { - "version": "1.5.0", - "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-history/node_modules/prosemirror-view": { - "version": "1.41.8", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/prosemirror-history/node_modules/prosemirror-view/node_modules/prosemirror-model": { - "version": "1.25.4", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-inputrules": { - "version": "1.5.1", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.0.0" - } - }, - "node_modules/prosemirror-keymap": { - "version": "1.2.3", - "license": "MIT", - "dependencies": { - "prosemirror-state": "^1.0.0", - "w3c-keyname": "^2.2.0" - } - }, - "node_modules/prosemirror-model": { - "version": "1.25.11", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-schema-list": { - "version": "1.5.1", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.7.3" - } - }, - "node_modules/prosemirror-schema-list/node_modules/prosemirror-model": { - "version": "1.25.4", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-state": { - "version": "1.4.4", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.0.0", - "prosemirror-transform": "^1.0.0", - "prosemirror-view": "^1.27.0" - } - }, - "node_modules/prosemirror-state/node_modules/prosemirror-model": { - "version": "1.25.4", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-state/node_modules/prosemirror-view": { - "version": "1.41.8", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/prosemirror-tables": { - "version": "1.8.5", - "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-tables/node_modules/prosemirror-model": { - "version": "1.25.4", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-tables/node_modules/prosemirror-view": { - "version": "1.41.8", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.20.0", - "prosemirror-state": "^1.0.0", - "prosemirror-transform": "^1.1.0" - } - }, - "node_modules/prosemirror-transform": { - "version": "1.12.0", - "license": "MIT", - "dependencies": { - "prosemirror-model": "^1.21.0" - } - }, - "node_modules/prosemirror-transform/node_modules/prosemirror-model": { - "version": "1.25.4", - "license": "MIT", - "dependencies": { - "orderedmap": "^2.0.0" - } - }, - "node_modules/prosemirror-view": { - "version": "1.42.1", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/quansync": { - "version": "0.2.11", - "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", - "dev": true, - "license": "MIT" - }, - "node_modules/readdirp": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/redent": { - "version": "3.0.0", - "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", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/rolldown": { - "version": "1.1.5", - "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", - "license": "MIT" - }, - "node_modules/runed": { - "version": "0.35.1", - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "mri": "^1.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/saxes": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "xmlchars": "^2.2.0" - }, - "engines": { - "node": ">=v12.22.7" - } - }, - "node_modules/semver": { - "version": "7.8.5", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/set-cookie-parser": { - "version": "3.1.2", - "devOptional": true, - "license": "MIT" - }, - "node_modules/siginfo": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/sirv": { - "version": "3.0.2", - "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", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/stackback": { - "version": "0.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/std-env": { - "version": "4.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/strip-indent": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "min-indent": "^1.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strtok3": { - "version": "10.3.5", - "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", - "license": "MIT", - "dependencies": { - "inline-style-parser": "0.2.7" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/svelte": { - "version": "5.56.7", - "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", - "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", - "license": "MIT", - "peerDependencies": { - "svelte": "^5.0.0" - } - }, - "node_modules/svelte-check": { - "version": "4.7.3", - "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", - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.17" - } - }, - "node_modules/svelte-toolbelt": { - "version": "0.10.6", - "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", - "license": "Apache-2.0", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/symbol-tree": { - "version": "3.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/tabbable": { - "version": "6.5.0", - "license": "MIT" - }, - "node_modules/tailwindcss": { - "version": "4.3.3", - "dev": true, - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/text-segmentation": { - "version": "1.0.3", - "license": "MIT", - "dependencies": { - "utrie": "^1.0.2" - } - }, - "node_modules/tinybench": { - "version": "2.9.0", - "dev": true, - "license": "MIT" - }, - "node_modules/tinyexec": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.17", - "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/tinyglobby/node_modules/picomatch": { - "version": "4.0.4", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/tinyrainbow": { - "version": "3.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tippy.js": { - "version": "6.3.7", - "license": "MIT", - "dependencies": { - "@popperjs/core": "^2.9.0" - } - }, - "node_modules/tldts": { - "version": "7.4.9", - "dev": true, - "license": "MIT", - "dependencies": { - "tldts-core": "^7.4.9" - }, - "bin": { - "tldts": "bin/cli.js" - } - }, - "node_modules/tldts-core": { - "version": "7.4.9", - "dev": true, - "license": "MIT" - }, - "node_modules/token-types": { - "version": "6.1.2", - "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", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tough-cookie": { - "version": "6.0.2", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tldts": "^7.0.5" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/tr46": { - "version": "6.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "punycode": "^2.3.1" - }, - "engines": { - "node": ">=20" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "license": "0BSD" - }, - "node_modules/typescript": { - "version": "6.0.3", - "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", - "license": "MIT" - }, - "node_modules/ufo": { - "version": "1.6.4", - "dev": true, - "license": "MIT" - }, - "node_modules/uint8array-extras": { - "version": "1.5.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/undici": { - "version": "7.28.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20.18.1" - } - }, - "node_modules/undici-types": { - "version": "8.3.0", - "devOptional": true, - "license": "MIT" - }, - "node_modules/unplugin": { - "version": "2.3.11", - "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", - "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/unplugin/node_modules/picomatch": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/utrie": { - "version": "1.0.2", - "license": "MIT", - "dependencies": { - "base64-arraybuffer": "^1.0.2" - } - }, - "node_modules/vite": { - "version": "8.1.5", - "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", - "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", - "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/vitest/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/vitest/node_modules/picomatch": { - "version": "4.0.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/vitest/node_modules/vite": { - "version": "8.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.5", - "postcss": "^8.5.16", - "rolldown": "~1.1.4", - "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/vitest/node_modules/vite/node_modules/picomatch": { - "version": "4.0.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "license": "MIT" - }, - "node_modules/w3c-xmlserializer": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "xml-name-validator": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/webidl-conversions": { - "version": "8.0.1", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=20" - } - }, - "node_modules/webpack-virtual-modules": { - "version": "0.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/whatwg-mimetype": { - "version": "5.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=20" - } - }, - "node_modules/whatwg-url": { - "version": "16.0.1", - "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", - "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", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/xmlchars": { - "version": "2.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/zimmerframe": { - "version": "1.1.4", - "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", + "bits-ui": "^2.18.1", + "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", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.7", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.7" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.7", + "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/@babel/types/node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@bcoe/v8-coverage": { + "version": "1.0.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@borewit/text-codec": { + "version": "0.2.2", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.8.0", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.8.0", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.8.0", + "@floating-ui/utils": "^0.2.12" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.12", + "license": "MIT" + }, + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/@iconify/utils": { + "version": "3.1.4", + "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", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "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==", + "devOptional": 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", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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" + ], + "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", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@sveltejs/acorn-typescript": { + "version": "1.0.11", + "license": "MIT", + "peerDependencies": { + "acorn": "^8.9.0" + } + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "7.0.1", + "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==", + "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.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", + "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", + "license": "Apache-2.0", + "peer": true, + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@tailwindcss/node": { + "version": "4.3.3", + "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/node/node_modules/lightningcss": { + "version": "1.32.0", + "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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/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/@tailwindcss/node/node_modules/lightningcss/node_modules/lightningcss-win32-x64-msvc": { + "version": "1.32.0", + "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/@tailwindcss/oxide": { + "version": "4.3.3", + "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", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 20" + } + }, + "node_modules/@tailwindcss/vite": { + "version": "4.3.3", + "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", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/chai": { + "version": "5.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/deep-eql": "*", + "assertion-error": "^2.0.1" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/@types/deep-eql": { + "version": "4.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "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==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~8.3.0" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "license": "MIT" + }, + "node_modules/@vitest/coverage-v8": { + "version": "4.1.10", + "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", + "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", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "tinyrainbow": "^3.1.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "4.1.10", + "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", + "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", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "4.1.10", + "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", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/aria-query": { + "version": "5.3.1", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/assertion-error": { + "version": "2.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/ast-v8-to-istanbul": { + "version": "1.0.5", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.31", + "estree-walker": "^3.0.3", + "js-tokens": "^10.0.0" + } + }, + "node_modules/ast-v8-to-istanbul/node_modules/js-tokens": { + "version": "10.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/axobject-query": { + "version": "4.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/bits-ui": { + "version": "2.18.1", + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "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", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/colord": { + "version": "2.9.3", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.2.4", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "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", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "devOptional": true, + "license": "Apache-2.0", + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.8.2", + "license": "MIT" + }, + "node_modules/enhanced-resolve": { + "version": "5.24.3", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/esm-env": { + "version": "1.2.2", + "license": "MIT" + }, + "node_modules/esrap": { + "version": "2.3.0", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/expect-type": { + "version": "1.4.0", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.1.0", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "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", + "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", + "dev": true, + "license": "ISC" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/idb": { + "version": "8.0.3", + "license": "ISC" + }, + "node_modules/ieee754": { + "version": "1.2.1", + "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", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "license": "MIT" + }, + "node_modules/is-reference": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.6" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.2", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.1", + "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", + "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", + "devOptional": true, + "license": "MIT", + "bin": { + "jiti": "lib/jiti-cli.mjs" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lightningcss": { + "version": "1.33.0", + "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.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/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" + ], + "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.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" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", + "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.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" + ], + "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.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" + ], + "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.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" + ], + "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.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" + ], + "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.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" + ], + "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.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", + "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.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" + ], + "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.33.0", + "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", + "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", + "license": "MIT" + }, + "node_modules/lz-string": { + "version": "1.5.0", + "license": "MIT", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/magicast": { + "version": "0.5.3", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.3", + "@babel/types": "^7.29.0", + "source-map-js": "^1.2.1" + } + }, + "node_modules/make-dir": { + "version": "4.0.0", + "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", + "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/pkg-types": { + "version": "1.3.1", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/mlly/node_modules/pkg-types/node_modules/confbox": { + "version": "0.1.8", + "dev": true, + "license": "MIT" + }, + "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", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.1", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "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==", + "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", + "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", + "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", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "devOptional": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.5", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "2.3.1", + "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==", + "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.6", + "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", + "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", + "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", + "license": "MIT", + "dependencies": { + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.1", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-commands/node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-dropcursor": { + "version": "1.8.3", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0", + "prosemirror-view": "^1.1.0" + } + }, + "node_modules/prosemirror-dropcursor/node_modules/prosemirror-view": { + "version": "1.41.8", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/prosemirror-dropcursor/node_modules/prosemirror-view/node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-gapcursor": { + "version": "1.4.1", + "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-gapcursor/node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-gapcursor/node_modules/prosemirror-view": { + "version": "1.41.8", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/prosemirror-history": { + "version": "1.5.0", + "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-history/node_modules/prosemirror-view": { + "version": "1.41.8", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/prosemirror-history/node_modules/prosemirror-view/node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.11", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.5.1", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-schema-list/node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.4", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-state/node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-state/node_modules/prosemirror-view": { + "version": "1.41.8", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/prosemirror-tables": { + "version": "1.8.5", + "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-tables/node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-tables/node_modules/prosemirror-view": { + "version": "1.41.8", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.12.0", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-transform/node_modules/prosemirror-model": { + "version": "1.25.4", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.42.1", + "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", + "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", + "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==", + "devOptional": 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", + "license": "MIT" + }, + "node_modules/runed": { + "version": "0.35.1", + "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", + "dev": true, + "license": "MIT", + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/semver": { + "version": "7.8.5", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "3.1.2", + "devOptional": true, + "license": "MIT" + }, + "node_modules/siginfo": { + "version": "2.0.0", + "dev": true, + "license": "ISC" + }, + "node_modules/sirv": { + "version": "3.0.2", + "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", + "devOptional": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stackback": { + "version": "0.0.2", + "dev": true, + "license": "MIT" + }, + "node_modules/std-env": { + "version": "4.2.0", + "dev": true, + "license": "MIT" + }, + "node_modules/strtok3": { + "version": "10.3.5", + "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", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "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", + "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", + "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/svelte-toolbelt": { + "version": "0.10.6", + "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/tabbable": { + "version": "6.5.0", + "license": "MIT" + }, + "node_modules/tailwindcss": { + "version": "4.3.3", + "dev": true, + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.3.3", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/tinybench": { + "version": "2.9.0", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyexec": { + "version": "1.2.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.17", + "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/tinyglobby/node_modules/picomatch": { + "version": "4.0.4", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/tinyrainbow": { + "version": "3.1.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tippy.js": { + "version": "6.3.7", + "license": "MIT", + "dependencies": { + "@popperjs/core": "^2.9.0" + } + }, + "node_modules/token-types": { + "version": "6.1.2", + "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", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "license": "0BSD", + "peer": true + }, + "node_modules/typescript": { + "version": "6.0.3", + "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", + "license": "MIT" + }, + "node_modules/ufo": { + "version": "1.6.4", + "dev": true, + "license": "MIT" + }, + "node_modules/uint8array-extras": { + "version": "1.5.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "8.3.0", + "devOptional": true, + "license": "MIT" + }, + "node_modules/unplugin": { + "version": "2.3.11", + "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", + "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/unplugin/node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.2.0.tgz", + "integrity": "sha512-pn+CFpM0lwDeKwmOq1ZaBK/9sjorZcgqxki6MbY/jPEVd9vichIlmlD4HmQ5wdP5EgqQCFRaACBxMC7uEGc6lQ==", + "devOptional": 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==", + "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", + "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", + "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/vitest/node_modules/picomatch": { + "version": "4.0.4", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "license": "MIT" + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "dev": true, + "license": "MIT" + }, + "node_modules/why-is-node-running": { + "version": "2.3.0", + "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", + "license": "MIT" + } + } } diff --git a/package.json b/package.json index b674882..f022235 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,6 @@ "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 -W suspicious --vitest-plugin", "test:unit": "vitest --coverage", @@ -15,49 +14,42 @@ "test:e2e": "playwright test" }, "devDependencies": { - "@iconify-json/tabler": "^1.2.37", - "@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.70.1", + "@sveltejs/kit": "^2.70.2", "@sveltejs/vite-plugin-svelte": "^7.2.0", "@tailwindcss/vite": "^4.3.3", - "@testing-library/jest-dom": "^6.10.0", - "@testing-library/svelte": "^5.4.2", - "@tiptap/extension-color": "^3.28.0", - "@tiptap/extension-font-family": "^3.28.0", - "@tiptap/extension-text-style": "^3.28.0", - "@types/node": "^26.1.1", + "@types/node": "^26.1.2", "@vitest/coverage-v8": "4.1.10", "file-type": "^22.0.1", - "jsdom": "^29.1.1", - "oxlint": "^1.75.0", + "oxlint": "^1.77.0", "prettier": "^3.9.6", "prettier-plugin-svelte": "^4.1.1", "prettier-plugin-tailwindcss": "^0.8.1", - "svelte": "^5.56.7", - "svelte-check": "^4.7.3", + "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.5", + "vite": "^8.2.0", "vitest": "^4.1.10" }, "type": "module", "dependencies": { - "@tiptap/core": "^3.28.0", - "@tiptap/extension-placeholder": "^3.28.0", - "@tiptap/pm": "^3.28.0", - "@tiptap/starter-kit": "^3.28.0", + "@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", "bits-ui": "^2.18.1", - "html2canvas-pro": "^2.3.0", "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" - }, - "resolutions": { - "prosemirror-model": "1.25.11" } } diff --git a/src/lib/components/modals/FontUploadModal.svelte b/src/lib/components/modals/FontUploadModal.svelte index 08247ae..1b33c77 100644 --- a/src/lib/components/modals/FontUploadModal.svelte +++ b/src/lib/components/modals/FontUploadModal.svelte @@ -78,7 +78,7 @@ } - + {#if step === 1}