From dcfe25d11cf7a763df2091d4f545eb6d8228462c Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:30:37 +0100 Subject: [PATCH 01/23] Create package-lock.json --- panel/package-lock.json | 4306 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 4306 insertions(+) create mode 100644 panel/package-lock.json diff --git a/panel/package-lock.json b/panel/package-lock.json new file mode 100644 index 000000000..18a0eaf2e --- /dev/null +++ b/panel/package-lock.json @@ -0,0 +1,4306 @@ +{ + "name": "panel", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "license": "MIT", + "dependencies": { + "@codemirror/commands": "^6.10.0", + "@codemirror/lang-markdown": "^6.5.0", + "@codemirror/language": "^6.11.3", + "@codemirror/state": "^6.5.2", + "@codemirror/view": "^6.38.7", + "@lezer/highlight": "^1.2.3", + "chartist": "^1.5.0", + "prosemirror-commands": "^1.7.1", + "prosemirror-history": "^1.5.0", + "prosemirror-inputrules": "^1.5.1", + "prosemirror-keymap": "^1.2.3", + "prosemirror-markdown": "^1.13.2", + "prosemirror-model": "^1.25.4", + "prosemirror-schema-list": "^1.5.1", + "prosemirror-state": "^1.4.4", + "prosemirror-view": "^1.41.4", + "sortablejs": "^1.15.6" + }, + "devDependencies": { + "@eslint/js": "^9.39.1", + "@types/sortablejs": "^1.15.9", + "esbuild": "^0.27.0", + "eslint": "^9.39.1", + "eslint-config-prettier": "^10.1.8", + "globals": "^16.5.0", + "postcss": "^8.5.6", + "prettier": "^3.6.2", + "sass": "^1.94.2", + "stylelint": "^16.26.1", + "stylelint-config-standard-scss": "^16.0.0", + "stylelint-order": "^7.0.0", + "stylelint-scss": "^6.12.1", + "typescript": "^5.9.3", + "typescript-eslint": "^8.48.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@cacheable/memory": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@cacheable/memory/-/memory-2.0.6.tgz", + "integrity": "sha512-7e8SScMocHxcAb8YhtkbMhGG+EKLRIficb1F5sjvhSYsWTZGxvg4KIDp8kgxnV2PUJ3ddPe6J9QESjKvBWRDkg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/utils": "^2.3.2", + "@keyv/bigmap": "^1.3.0", + "hookified": "^1.13.0", + "keyv": "^5.5.4" + } + }, + "node_modules/@cacheable/memory/node_modules/@keyv/bigmap": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.0.tgz", + "integrity": "sha512-KT01GjzV6AQD5+IYrcpoYLkCu1Jod3nau1Z7EsEuViO3TZGRacSbO9MfHmbJ1WaOXFtWLxPVj169cn2WNKPkIg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.2.0", + "hookified": "^1.13.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.5.4" + } + }, + "node_modules/@cacheable/memory/node_modules/keyv": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.5.tgz", + "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@cacheable/utils": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@cacheable/utils/-/utils-2.3.2.tgz", + "integrity": "sha512-8kGE2P+HjfY8FglaOiW+y8qxcaQAfAhVML+i66XJR3YX5FtyDqn6Txctr3K2FrbxLKixRRYYBWMbuGciOhYNDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "hashery": "^1.2.0", + "keyv": "^5.5.4" + } + }, + "node_modules/@cacheable/utils/node_modules/keyv": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.5.tgz", + "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/@codemirror/autocomplete": { + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.20.0.tgz", + "integrity": "sha512-bOwvTOIJcG5FVo5gUUupiwYh8MioPLQ4UcqbcRf7UQ98X90tCa9E1kZ3Z7tqwpZxYyOvh1YTYbmZE9RTfTp5hg==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@codemirror/commands": { + "version": "6.10.1", + "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.1.tgz", + "integrity": "sha512-uWDWFypNdQmz2y1LaNJzK7fL7TYKLeUAU0npEC685OKTF3KcQ2Vu3klIM78D7I6wGhktme0lh3CuQLv0ZCrD9Q==", + "license": "MIT", + "dependencies": { + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.4.0", + "@codemirror/view": "^6.27.0", + "@lezer/common": "^1.1.0" + } + }, + "node_modules/@codemirror/lang-css": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.3.1.tgz", + "integrity": "sha512-kr5fwBGiGtmz6l0LSJIbno9QrifNMUusivHbnA1H6Dmqy4HZFte3UAICix1VuKo0lMPKQr2rqB+0BkKi/S3Ejg==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@lezer/common": "^1.0.2", + "@lezer/css": "^1.1.7" + } + }, + "node_modules/@codemirror/lang-html": { + "version": "6.4.11", + "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.11.tgz", + "integrity": "sha512-9NsXp7Nwp891pQchI7gPdTwBuSuT3K65NGTHWHNJ55HjYcHLllr0rbIZNdOzas9ztc1EUVBlHou85FFZS4BNnw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/lang-css": "^6.0.0", + "@codemirror/lang-javascript": "^6.0.0", + "@codemirror/language": "^6.4.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/css": "^1.1.0", + "@lezer/html": "^1.3.12" + } + }, + "node_modules/@codemirror/lang-javascript": { + "version": "6.2.4", + "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.4.tgz", + "integrity": "sha512-0WVmhp1QOqZ4Rt6GlVGwKJN3KW7Xh4H2q8ZZNGZaP6lRdxXJzmjm4FqvmOojVj6khWJHIb9sp7U/72W7xQgqAA==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.0.0", + "@codemirror/language": "^6.6.0", + "@codemirror/lint": "^6.0.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.17.0", + "@lezer/common": "^1.0.0", + "@lezer/javascript": "^1.0.0" + } + }, + "node_modules/@codemirror/lang-markdown": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@codemirror/lang-markdown/-/lang-markdown-6.5.0.tgz", + "integrity": "sha512-0K40bZ35jpHya6FriukbgaleaqzBLZfOh7HuzqbMxBXkbYMJDxfF39c23xOgxFezR+3G+tR2/Mup+Xk865OMvw==", + "license": "MIT", + "dependencies": { + "@codemirror/autocomplete": "^6.7.1", + "@codemirror/lang-html": "^6.0.0", + "@codemirror/language": "^6.3.0", + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.0.0", + "@lezer/common": "^1.2.1", + "@lezer/markdown": "^1.0.0" + } + }, + "node_modules/@codemirror/language": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.3.tgz", + "integrity": "sha512-9HBM2XnwDj7fnu0551HkGdrUrrqmYq/WC5iv6nbY2WdicXdGbhR/gfbZOH73Aqj4351alY1+aoG9rCNfiwS1RA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.23.0", + "@lezer/common": "^1.1.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0", + "style-mod": "^4.0.0" + } + }, + "node_modules/@codemirror/lint": { + "version": "6.9.2", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.9.2.tgz", + "integrity": "sha512-sv3DylBiIyi+xKwRCJAAsBZZZWo82shJ/RTMymLabAdtbkV5cSKwWDeCgtUq3v8flTaXS2y1kKkICuRYtUswyQ==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.0.0", + "@codemirror/view": "^6.35.0", + "crelt": "^1.0.5" + } + }, + "node_modules/@codemirror/state": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", + "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", + "license": "MIT", + "dependencies": { + "@marijn/find-cluster-break": "^1.0.0" + } + }, + "node_modules/@codemirror/view": { + "version": "6.39.4", + "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.39.4.tgz", + "integrity": "sha512-xMF6OfEAUVY5Waega4juo1QGACfNkNF+aJLqpd8oUJz96ms2zbfQ9Gh35/tI3y8akEV31FruKfj7hBnIU/nkqA==", + "license": "MIT", + "dependencies": { + "@codemirror/state": "^6.5.0", + "crelt": "^1.0.6", + "style-mod": "^4.1.0", + "w3c-keyname": "^2.2.4" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.5.tgz", + "integrity": "sha512-DaDeUkXZKjdGhgYaHNJTV9pV7Y9B3b644jCLs9Upc3VeNGg6LWARAT6O+Q+/COo+2gg/bM5rhpMAtf70WqfBdQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/css-syntax-patches-for-csstree": { + "version": "1.0.21", + "resolved": "https://registry.npmjs.org/@csstools/css-syntax-patches-for-csstree/-/css-syntax-patches-for-csstree-1.0.21.tgz", + "integrity": "sha512-plP8N8zKfEZ26figX4Nvajx8DuzfuRpLTqglQ5d0chfnt35Qt3X+m6ASZ+rG0D0kxe/upDVNwSIVJP5n4FuNfw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.4.tgz", + "integrity": "sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.3.tgz", + "integrity": "sha512-HAYH7d3TLRHDOUQK4mZKf9k9Ph/m8Akstg66ywKR4SFAigjs3yBiUeZtFxywiTm5moZMAp/5W/ZuFnNXXYLuuQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-tokenizer": "^3.0.4" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^7.0.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.2.1.tgz", + "integrity": "sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/JounQin" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.1.tgz", + "integrity": "sha512-aw1gNayWpdI/jSYVgzN5pL0cfzU02GT3NBpeT/DXbx1/1x7ZKxFPd9bwrzygx/qiwIQiJ1sw/zD8qY/kRvlGHA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.7", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.2.tgz", + "integrity": "sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.17.0.tgz", + "integrity": "sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.3.tgz", + "integrity": "sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.1", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", + "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.7.tgz", + "integrity": "sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz", + "integrity": "sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.17.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@lezer/common": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.4.0.tgz", + "integrity": "sha512-DVeMRoGrgn/k45oQNu189BoW4SZwgZFzJ1+1TV5j2NJ/KFC83oa/enRqZSGshyeMk5cPWMhsKs9nx+8o0unwGg==", + "license": "MIT" + }, + "node_modules/@lezer/css": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.3.0.tgz", + "integrity": "sha512-pBL7hup88KbI7hXnZV3PQsn43DHy6TWyzuyk2AO9UyoXcDltvIdqWKE1dLL/45JVZ+YZkHe1WVHqO6wugZZWcw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/highlight": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.3.tgz", + "integrity": "sha512-qXdH7UqTvGfdVBINrgKhDsVTJTxactNNxLk7+UMwZhU13lMHaOBlJe9Vqp907ya56Y3+ed2tlqzys7jDkTmW0g==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.3.0" + } + }, + "node_modules/@lezer/html": { + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.12.tgz", + "integrity": "sha512-RJ7eRWdaJe3bsiiLLHjCFT1JMk8m1YP9kaUbvu2rMLEoOnke9mcTVDyfOslsln0LtujdWespjJ39w6zo+RsQYw==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.0.0", + "@lezer/lr": "^1.0.0" + } + }, + "node_modules/@lezer/javascript": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.5.4.tgz", + "integrity": "sha512-vvYx3MhWqeZtGPwDStM2dwgljd5smolYD2lR2UyFcHfxbBQebqx8yjmFmxtJ/E6nN6u1D9srOiVWm3Rb4tmcUA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.2.0", + "@lezer/highlight": "^1.1.3", + "@lezer/lr": "^1.3.0" + } + }, + "node_modules/@lezer/lr": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.5.tgz", + "integrity": "sha512-/YTRKP5yPPSo1xImYQk7AZZMAgap0kegzqCSYHjAL9x1AZ0ZQW+IpcEzMKagCsbTsLnVeWkxYrCNeXG8xEPrjg==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0" + } + }, + "node_modules/@lezer/markdown": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@lezer/markdown/-/markdown-1.6.1.tgz", + "integrity": "sha512-72ah+Sml7lD8Wn7lnz9vwYmZBo9aQT+I2gjK/0epI+gjdwUbWw3MJ/ZBGEqG1UfrIauRqH37/c5mVHXeCTGXtA==", + "license": "MIT", + "dependencies": { + "@lezer/common": "^1.0.0", + "@lezer/highlight": "^1.0.0" + } + }, + "node_modules/@marijn/find-cluster-break": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", + "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz", + "integrity": "sha512-dfUnCxiN9H4ap84DvD2ubjw+3vUNpstxa0TneY/Paat8a3R4uQZDLSvWjmznAY/DoahqTHl9V46HF/Zs3F29pg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.1", + "@parcel/watcher-darwin-arm64": "2.5.1", + "@parcel/watcher-darwin-x64": "2.5.1", + "@parcel/watcher-freebsd-x64": "2.5.1", + "@parcel/watcher-linux-arm-glibc": "2.5.1", + "@parcel/watcher-linux-arm-musl": "2.5.1", + "@parcel/watcher-linux-arm64-glibc": "2.5.1", + "@parcel/watcher-linux-arm64-musl": "2.5.1", + "@parcel/watcher-linux-x64-glibc": "2.5.1", + "@parcel/watcher-linux-x64-musl": "2.5.1", + "@parcel/watcher-win32-arm64": "2.5.1", + "@parcel/watcher-win32-ia32": "2.5.1", + "@parcel/watcher-win32-x64": "2.5.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz", + "integrity": "sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz", + "integrity": "sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz", + "integrity": "sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz", + "integrity": "sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz", + "integrity": "sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz", + "integrity": "sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz", + "integrity": "sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz", + "integrity": "sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz", + "integrity": "sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz", + "integrity": "sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz", + "integrity": "sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz", + "integrity": "sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz", + "integrity": "sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==", + "license": "MIT" + }, + "node_modules/@types/markdown-it": { + "version": "14.1.2", + "resolved": "https://registry.npmjs.org/@types/markdown-it/-/markdown-it-14.1.2.tgz", + "integrity": "sha512-promo4eFwuiW+TfGxhi+0x3czqTYJkG8qB17ZUJiVF10Xm7NLVRSLUsfRTU/6h1e24VvRnXCx+hG7li58lkzog==", + "license": "MIT", + "dependencies": { + "@types/linkify-it": "^5", + "@types/mdurl": "^2" + } + }, + "node_modules/@types/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-RGdgjQUZba5p6QEFAVx2OGb8rQDL/cPRG7GiedRzMcJ1tYnUANBncjbSB1NRGwbvjcPeikRABz2nshyPk1bhWg==", + "license": "MIT" + }, + "node_modules/@types/sortablejs": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz", + "integrity": "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.50.0.tgz", + "integrity": "sha512-O7QnmOXYKVtPrfYzMolrCTfkezCJS9+ljLdKW/+DCvRsc3UAz+sbH6Xcsv7p30+0OwUbeWfUDAQE0vpabZ3QLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/type-utils": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "ignore": "^7.0.0", + "natural-compare": "^1.4.0", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^8.50.0", + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.50.0.tgz", + "integrity": "sha512-6/cmF2piao+f6wSxUsJLZjck7OQsYyRtcOZS02k7XINSNlz93v6emM8WutDQSXnroG2xwYlEVHJI+cPA7CPM3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/project-service": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.50.0.tgz", + "integrity": "sha512-Cg/nQcL1BcoTijEWyx4mkVC56r8dj44bFDvBdygifuS20f3OZCHmFbjF34DPSi07kwlFvqfv/xOLnJ5DquxSGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/tsconfig-utils": "^8.50.0", + "@typescript-eslint/types": "^8.50.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.50.0.tgz", + "integrity": "sha512-xCwfuCZjhIqy7+HKxBLrDVT5q/iq7XBVBXLn57RTIIpelLtEIZHXAF/Upa3+gaCpeV1NNS5Z9A+ID6jn50VD4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/tsconfig-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.50.0.tgz", + "integrity": "sha512-vxd3G/ybKTSlm31MOA96gqvrRGv9RJ7LGtZCn2Vrc5htA0zCDvcMqUkifcjrWNNKXHUU3WCkYOzzVSFBd0wa2w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.50.0.tgz", + "integrity": "sha512-7OciHT2lKCewR0mFoBrvZJ4AXTMe/sYOe87289WAViOocEmDjjv8MvIOT2XESuKj9jp8u3SZYUSh89QA4S1kQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0", + "debug": "^4.3.4", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.50.0.tgz", + "integrity": "sha512-iX1mgmGrXdANhhITbpp2QQM2fGehBse9LbTf0sidWK6yg/NE+uhV5dfU1g6EYPlcReYmkE9QLPq/2irKAmtS9w==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.50.0.tgz", + "integrity": "sha512-W7SVAGBR/IX7zm1t70Yujpbk+zdPq/u4soeFSknWFdXIFuWsBGBOUu/Tn/I6KHSKvSh91OiMuaSnYp3mtPt5IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/project-service": "8.50.0", + "@typescript-eslint/tsconfig-utils": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/visitor-keys": "8.50.0", + "debug": "^4.3.4", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "tinyglobby": "^0.2.15", + "ts-api-utils": "^2.1.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.50.0.tgz", + "integrity": "sha512-87KgUXET09CRjGCi2Ejxy3PULXna63/bMYv72tCAlDJC3Yqwln0HiFJ3VJMst2+mEtNtZu5oFvX4qJGjKsnAgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.7.0", + "@typescript-eslint/scope-manager": "8.50.0", + "@typescript-eslint/types": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.50.0.tgz", + "integrity": "sha512-Xzmnb58+Db78gT/CCj/PVCvK+zxbnsw6F+O1oheYszJbBSdEjVhQi3C/Xttzxgi/GLmpvOggRs1RFpiJ8+c34Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "8.50.0", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.3.1.tgz", + "integrity": "sha512-yr+FSHWn1ZUou5LkULX/S+jhfgfnLbuKQjE40tyEd4fxGZVMbBL5ifno0J0OauykS8UiCSgHi+DV/YD+rjFxFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@cacheable/memory": "^2.0.6", + "@cacheable/utils": "^2.3.2", + "hookified": "^1.14.0", + "keyv": "^5.5.5", + "qified": "^0.5.3" + } + }, + "node_modules/cacheable/node_modules/keyv": { + "version": "5.5.5", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-5.5.5.tgz", + "integrity": "sha512-FA5LmZVF1VziNc0bIdCSA1IoSVnDCqE8HJIZZv2/W8YmoAM50+tnUgJR/gQZwEeIMleuIOnRnHA/UaZRNeV4iQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@keyv/serialize": "^1.1.1" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chartist": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/chartist/-/chartist-1.5.0.tgz", + "integrity": "sha512-mcCJuWHpNqkJucuWEeHxymQCQEeAOkamGypqCV5+C+uI2NF4I3BOn/tjIuZaowJVNAcrY9BG3janLaCWSNVPDw==", + "license": "MIT OR WTFPL", + "engines": { + "node": ">=14" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true, + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/crelt": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", + "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", + "license": "MIT" + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.39.2", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.39.2.tgz", + "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.1", + "@eslint/config-helpers": "^0.4.2", + "@eslint/core": "^0.17.0", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.39.2", + "@eslint/plugin-kit": "^0.4.1", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.1.8", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz", + "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", + "dev": true, + "license": "MIT", + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "funding": { + "url": "https://opencollective.com/eslint-config-prettier" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", + "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", + "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "16.5.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", + "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", + "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", + "dev": true, + "license": "MIT" + }, + "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/hashery": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/hashery/-/hashery-1.3.0.tgz", + "integrity": "sha512-fWltioiy5zsSAs9ouEnvhsVJeAXRybGCNNv0lvzpzNOSDbULXRy7ivFWwCCv4I5Am6kSo75hmbsCduOoc2/K4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/hookified": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.14.0.tgz", + "integrity": "sha512-pi1ynXIMFx/uIIwpWJ/5CEtOHLGtnUB0WhGeeYT+fKcQ+WCQbm3/rrkAXnpfph++PgepNqPdTC2WTj8A6k6zoQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "dev": true, + "license": "MIT" + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", + "dev": true, + "license": "ISC" + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/known-css-properties": { + "version": "0.37.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.37.0.tgz", + "integrity": "sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, + "license": "MIT" + }, + "node_modules/linkify-it": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", + "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/markdown-it": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", + "integrity": "sha512-a54IwgWPaeBCAAsv13YgmALOF1elABB08FxO9i+r4VFk5Vl4pKokRPeX8u5TCgSsPi6ec1otfLjdOpVcgbpshg==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.0", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" + }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "license": "MIT" + }, + "node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/orderedmap": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/orderedmap/-/orderedmap-2.1.1.tgz", + "integrity": "sha512-TvAWxi0nDe1j/rtMcWcIj94+Ffe6n7zhow33h40SKxmsmozs6dz/e+EajymfoFcHd7sxNn8yHM8839uixMOV6g==", + "license": "MIT" + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-media-query-parser": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", + "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.1.tgz", + "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sorting": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/postcss-sorting/-/postcss-sorting-9.1.0.tgz", + "integrity": "sha512-Mn8KJ45HNNG6JBpBizXcyf6LqY/qyqetGcou/nprDnFwBFBLGj0j/sNKV2lj2KMOVOwdXu14aEzqJv8CIV6e8g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "postcss": "^8.4.20" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.7.4.tgz", + "integrity": "sha512-v6UNi1+3hSlVvv8fSaoUbggEM5VErKmmpGA7Pl3HF8V6uKY7rvClBOJlH6yNwQtfTueNkGVpOv/mtWL9L4bgRA==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prosemirror-commands": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/prosemirror-commands/-/prosemirror-commands-1.7.1.tgz", + "integrity": "sha512-rT7qZnQtx5c0/y/KlYaGvtG411S97UaL6gdp6RIZ23DLHanMYLyfGBV5DtSnZdthQql7W+lEVbpSfwtO8T+L2w==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.10.2" + } + }, + "node_modules/prosemirror-history": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/prosemirror-history/-/prosemirror-history-1.5.0.tgz", + "integrity": "sha512-zlzTiH01eKA55UAf1MEjtssJeHnGxO0j4K4Dpx+gnmX9n+SHNlDqI2oO1Kv1iPN5B1dm5fsljCfqKF9nFL6HRg==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.2.2", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.31.0", + "rope-sequence": "^1.3.0" + } + }, + "node_modules/prosemirror-inputrules": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-inputrules/-/prosemirror-inputrules-1.5.1.tgz", + "integrity": "sha512-7wj4uMjKaXWAQ1CDgxNzNtR9AlsuwzHfdFH1ygEHA2KHF2DOEaXl1CJfNPAKCg9qNEh4rum975QLaCiQPyY6Fw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.0.0" + } + }, + "node_modules/prosemirror-keymap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/prosemirror-keymap/-/prosemirror-keymap-1.2.3.tgz", + "integrity": "sha512-4HucRlpiLd1IPQQXNqeo81BGtkY8Ai5smHhKW9jjPKRc2wQIxksg7Hl1tTI2IfT2B/LgX6bfYvXxEpJl7aKYKw==", + "license": "MIT", + "dependencies": { + "prosemirror-state": "^1.0.0", + "w3c-keyname": "^2.2.0" + } + }, + "node_modules/prosemirror-markdown": { + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/prosemirror-markdown/-/prosemirror-markdown-1.13.2.tgz", + "integrity": "sha512-FPD9rHPdA9fqzNmIIDhhnYQ6WgNoSWX9StUZ8LEKapaXU9i6XgykaHKhp6XMyXlOWetmaFgGDS/nu/w9/vUc5g==", + "license": "MIT", + "dependencies": { + "@types/markdown-it": "^14.0.0", + "markdown-it": "^14.0.0", + "prosemirror-model": "^1.25.0" + } + }, + "node_modules/prosemirror-model": { + "version": "1.25.4", + "resolved": "https://registry.npmjs.org/prosemirror-model/-/prosemirror-model-1.25.4.tgz", + "integrity": "sha512-PIM7E43PBxKce8OQeezAs9j4TP+5yDpZVbuurd1h5phUxEKIu+G2a+EUZzIC5nS1mJktDJWzbqS23n1tsAf5QA==", + "license": "MIT", + "dependencies": { + "orderedmap": "^2.0.0" + } + }, + "node_modules/prosemirror-schema-list": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/prosemirror-schema-list/-/prosemirror-schema-list-1.5.1.tgz", + "integrity": "sha512-927lFx/uwyQaGwJxLWCZRkjXG0p48KpMj6ueoYiu4JX05GGuGcgzAy62dfiV8eFZftgyBUvLx76RsMe20fJl+Q==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.7.3" + } + }, + "node_modules/prosemirror-state": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/prosemirror-state/-/prosemirror-state-1.4.4.tgz", + "integrity": "sha512-6jiYHH2CIGbCfnxdHbXZ12gySFY/fz/ulZE333G6bPqIZ4F+TXo9ifiR86nAHpWnfoNjOb3o5ESi7J8Uz1jXHw==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.0.0", + "prosemirror-transform": "^1.0.0", + "prosemirror-view": "^1.27.0" + } + }, + "node_modules/prosemirror-transform": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/prosemirror-transform/-/prosemirror-transform-1.10.5.tgz", + "integrity": "sha512-RPDQCxIDhIBb1o36xxwsaeAvivO8VLJcgBtzmOwQ64bMtsVFh5SSuJ6dWSxO1UsHTiTXPCgQm3PDJt7p6IOLbw==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.21.0" + } + }, + "node_modules/prosemirror-view": { + "version": "1.41.4", + "resolved": "https://registry.npmjs.org/prosemirror-view/-/prosemirror-view-1.41.4.tgz", + "integrity": "sha512-WkKgnyjNncri03Gjaz3IFWvCAE94XoiEgvtr0/r2Xw7R8/IjK3sKLSiDoCHWcsXSAinVaKlGRZDvMCsF1kbzjA==", + "license": "MIT", + "dependencies": { + "prosemirror-model": "^1.20.0", + "prosemirror-state": "^1.0.0", + "prosemirror-transform": "^1.1.0" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode.js/-/punycode.js-2.3.1.tgz", + "integrity": "sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/qified": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/qified/-/qified-0.5.3.tgz", + "integrity": "sha512-kXuQdQTB6oN3KhI6V4acnBSZx8D2I4xzZvn9+wFLLFCoBNQY/sFnCW6c43OL7pOQ2HvGV4lnWIXNmgfp7cTWhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "hookified": "^1.13.0" + }, + "engines": { + "node": ">=20" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "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": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rope-sequence": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/rope-sequence/-/rope-sequence-1.3.4.tgz", + "integrity": "sha512-UT5EDe2cu2E/6O4igUr5PSFs23nvvukicWHx6GnOPlHAiiYbzNuCRQCuiUdHJQcqKalLKlrYJnjY0ySGsXNQXQ==", + "license": "MIT" + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "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": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.97.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.0.tgz", + "integrity": "sha512-KR0igP1z4avUJetEuIeOdDlwaUDvkH8wSx7FdSjyYBS3dpyX3TzHfAMO0G1Q4/3cdjcmi3r7idh+KCmKqS+KeQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/semver": { + "version": "7.7.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", + "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/sortablejs": { + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.15.6.tgz", + "integrity": "sha512-aNfiuwMEpfBM/CN6LY0ibyhxPfPbyFeBTYJKCvzkJ2GkUpazIt3H+QIPAMHwqQ7tMKaHz1Qj+rJJCqljnf4p3A==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-mod": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.3.tgz", + "integrity": "sha512-i/n8VsZydrugj3Iuzll8+x/00GH2vnYsk1eomD8QiRrSAeW6ItbCQDtfXCeJHd0iwiNagqjQkvpvREEPtW3IoQ==", + "license": "MIT" + }, + "node_modules/stylelint": { + "version": "16.26.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.26.1.tgz", + "integrity": "sha512-v20V59/crfc8sVTAtge0mdafI3AdnzQ2KsWe6v523L4OA1bJO02S7MO2oyXDCS6iWb9ckIPnqAFVItqSBQr7jw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^3.0.5", + "@csstools/css-syntax-patches-for-csstree": "^1.0.19", + "@csstools/css-tokenizer": "^3.0.4", + "@csstools/media-query-list-parser": "^4.0.3", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.2.1", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.1.0", + "debug": "^4.4.3", + "fast-glob": "^3.3.3", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^11.1.1", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^7.0.5", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.37.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.8", + "normalize-path": "^3.0.0", + "picocolors": "^1.1.1", + "postcss": "^8.5.6", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.1.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "supports-hyperlinks": "^3.2.0", + "svg-tags": "^1.0.0", + "table": "^6.9.0", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-17.0.0.tgz", + "integrity": "sha512-WaMSdEiPfZTSFVoYmJbxorJfA610O0tlYuU2aEwY33UQhSPgFbClrVJYWvy3jGJx+XW37O+LyNLiZOEXhKhJmA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.23.0" + } + }, + "node_modules/stylelint-config-recommended-scss": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-16.0.2.tgz", + "integrity": "sha512-aUTHhPPWCvFyWaxtckJlCPaXTDFsp4pKO8evXNCsW9OwsaUWyMd6jvcUhSmfGWPrTddvzNqK4rS/UuSLcbVGdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-scss": "^4.0.9", + "stylelint-config-recommended": "^17.0.0", + "stylelint-scss": "^6.12.1" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.24.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-config-standard": { + "version": "39.0.1", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-39.0.1.tgz", + "integrity": "sha512-b7Fja59EYHRNOTa3aXiuWnhUWXFU2Nfg6h61bLfAb5GS5fX3LMUD0U5t4S8N/4tpHQg3Acs2UVPR9jy2l1g/3A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^17.0.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.23.0" + } + }, + "node_modules/stylelint-config-standard-scss": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard-scss/-/stylelint-config-standard-scss-16.0.0.tgz", + "integrity": "sha512-/FHECLUu+med/e6OaPFpprG86ShC4SYT7Tzb2PTVdDjJsehhFBOioSlWqYFqJxmGPIwO3AMBxNo+kY3dxrbczA==", + "dev": true, + "license": "MIT", + "dependencies": { + "stylelint-config-recommended-scss": "^16.0.1", + "stylelint-config-standard": "^39.0.0" + }, + "engines": { + "node": ">=20" + }, + "peerDependencies": { + "postcss": "^8.3.3", + "stylelint": "^16.23.1" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + } + } + }, + "node_modules/stylelint-order": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/stylelint-order/-/stylelint-order-7.0.0.tgz", + "integrity": "sha512-rSWxx0KscYfxU02wEskKXES9lkRzuuONMMNkZ7SUc6uiF3tDKm7e+sE0Ax/SBlG4TUf1sp1R6f3/SlsPGmzthg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss": "^8.5.3", + "postcss-sorting": "^9.1.0" + }, + "engines": { + "node": ">=20.19.0" + }, + "peerDependencies": { + "stylelint": "^16.18.0" + } + }, + "node_modules/stylelint-scss": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.13.0.tgz", + "integrity": "sha512-kZPwFUJkfup2gP1enlrS2h9U5+T5wFoqzJ1n/56AlpwSj28kmFe7ww/QFydvPsg5gLjWchAwWWBLtterynZrOw==", + "dev": true, + "license": "MIT", + "dependencies": { + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.37.0", + "mdn-data": "^2.25.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.1.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.8.2" + } + }, + "node_modules/stylelint-scss/node_modules/mdn-data": { + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.25.0.tgz", + "integrity": "sha512-T2LPsjgUE/tgMmRXREVmwsux89DwWfNjiynOeXuLd2mX6jphGQ2YE3Ukz7LQ2VOFKiVZU/Ee1GqzHiipZCjymw==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", + "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-11.1.1.tgz", + "integrity": "sha512-TPVFSDE7q91Dlk1xpFLvFllf8r0HyOMOlnWy7Z2HBku5H3KhIeOGInexrIeg2D64DosVB/JXkrrk6N/7Wriq4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^6.1.19" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "6.1.19", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.19.tgz", + "integrity": "sha512-l/K33newPTZMTGAnnzaiqSl6NnH7Namh8jBNjrgjprWxGmZUuxx/sJNIRaijOh3n7q7ESbhNZC+pvVZMFdeU4A==", + "dev": true, + "license": "MIT", + "dependencies": { + "cacheable": "^2.2.0", + "flatted": "^3.3.3", + "hookified": "^1.13.0" + } + }, + "node_modules/stylelint/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/supports-hyperlinks": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.2.0.tgz", + "integrity": "sha512-zFObLMyZeEwzAoKCyu1B91U79K2t7ApXuQfo8OuxwXLDgcKxuwM+YvcbIhm6QWqz7mHUH1TVytR1PwVVjEuMig==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/chalk/supports-hyperlinks?sponsor=1" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/table": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/table/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-api-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz", + "integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12" + }, + "peerDependencies": { + "typescript": ">=4.8.4" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/typescript-eslint": { + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.50.0.tgz", + "integrity": "sha512-Q1/6yNUmCpH94fbgMUMg2/BSAr/6U7GBk61kZTv1/asghQOWOjTlp9K8mixS5NcJmm2creY+UFfGeW/+OcA64A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/eslint-plugin": "8.50.0", + "@typescript-eslint/parser": "8.50.0", + "@typescript-eslint/typescript-estree": "8.50.0", + "@typescript-eslint/utils": "8.50.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "typescript": ">=4.8.4 <6.0.0" + } + }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "license": "MIT" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/w3c-keyname": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", + "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} From 63efc9adafed4193940fb7dac4e2a3a274325321 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:31:16 +0100 Subject: [PATCH 02/23] Update routes.php --- panel/config/routes/routes.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panel/config/routes/routes.php b/panel/config/routes/routes.php index 7b390ec2d..44dcd3654 100644 --- a/panel/config/routes/routes.php +++ b/panel/config/routes/routes.php @@ -333,7 +333,7 @@ foreach ($assets as $asset) { $assetPath = FileSystem::joinPaths($path, $asset); if (!FileSystem::isFile($assetPath, assertExists: false)) { - $view = $viewFactory->make('errors.panel.assets'); + $view = $viewFactory->make('@system.errors.panel.assets'); return new Response($view->render(), ResponseStatus::InternalServerError); } } From 1f223411fb158c83e98491c332c7abd75ed586b1 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:36:07 +0100 Subject: [PATCH 03/23] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 929ae2e47..6d96f7915 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ /panel/assets/js/* /panel/logs/* /panel/node_modules/* +/panel/package-lock.json /site/config/plugins.yaml /site/plugins/* From 85cd480f34e318caa13427371e695fe6318bd934 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 14:52:01 +0100 Subject: [PATCH 04/23] Add card view option for pages in panel Introduces a new card/grid view for pages alongside the existing tree view in the panel. Adds a view mode toggle in the UI, updates the controller to handle the view mode, implements the card layout in a new SCSS and PHP view, and updates translations. Also enhances the TypeScript to handle view mode switching and persistence. --- .../src/Panel/Controllers/PagesController.php | 25 +- panel/src/scss/components/_pages-cards.scss | 468 ++++++++++++++++++ panel/src/scss/panel.scss | 1 + panel/src/ts/components/views/pages.ts | 32 ++ panel/translations/en.yaml | 3 + panel/views/pages/cards.php | 115 +++++ panel/views/pages/index.php | 10 +- 7 files changed, 647 insertions(+), 7 deletions(-) create mode 100644 panel/src/scss/components/_pages-cards.scss create mode 100644 panel/views/pages/cards.php diff --git a/formwork/src/Panel/Controllers/PagesController.php b/formwork/src/Panel/Controllers/PagesController.php index 3a6f30259..87f9d3f75 100644 --- a/formwork/src/Panel/Controllers/PagesController.php +++ b/formwork/src/Panel/Controllers/PagesController.php @@ -70,10 +70,19 @@ public function tree(RouteParams $routeParams): Response $this->modal('newPage')->setFieldsModel($parent); - return new Response($this->view('@panel.pages.index', [ - 'title' => $this->translate('panel.pages.pages'), - 'parent' => $parent, - 'pagesTree' => $this->view('@panel.pages.tree', [ + // Get view mode from query parameter or localStorage default + $viewMode = $this->request->query()->get('view', 'tree'); + + // Validate view mode + if (!in_array($viewMode, ['tree', 'card'])) { + $viewMode = 'tree'; + } + + $pagesContent = $viewMode === 'card' + ? $this->view('@panel.pages.cards', [ + 'pages' => $pageCollection, + ]) + : $this->view('@panel.pages.tree', [ 'pages' => $pageCollection, 'parent' => $parent, 'root' => $parent, @@ -81,7 +90,13 @@ public function tree(RouteParams $routeParams): Response 'orderable' => $this->panel->user()->permissions()->has('panel.pages.reorder'), 'headers' => true, 'class' => 'pages-tree-root', - ]), + ]); + + return new Response($this->view('@panel.pages.index', [ + 'title' => $this->translate('panel.pages.pages'), + 'parent' => $parent, + 'pagesTree' => $pagesContent, + 'viewMode' => $viewMode, ])); } diff --git a/panel/src/scss/components/_pages-cards.scss b/panel/src/scss/components/_pages-cards.scss new file mode 100644 index 000000000..c32ec9898 --- /dev/null +++ b/panel/src/scss/components/_pages-cards.scss @@ -0,0 +1,468 @@ +// Kirby-inspired card grid layout for pages +@use "mixins" as *; +@use "variables" as *; + +@use "sass:map"; + +// === +// Pages Card Grid +// === + +.pages-grid { + display: grid; + gap: 1rem; + grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); + + @media (min-width: map.get($breakpoints, "lg")) { + grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); + } +} + +.pages-grid-compact { + gap: 1rem; + grid-template-columns: repeat(auto-fill, minmax(180px, 1fr)); +} + +// === +// Page Card +// === + +.page-card { + position: relative; + display: flex; + flex-direction: column; + border-radius: 6px; + background-color: var(--color-base-700); + transition: transform var(--transition-time-sm), box-shadow var(--transition-time-sm); + + &:hover { + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25); + transform: translateY(-2px); + z-index: 10; + } + + &.has-children { + border: 1px solid var(--color-base-600); + } +} + +.page-card-thumbnail-wrapper { + position: relative; + overflow: hidden; + border-radius: 6px 6px 0 0; +} + +.page-card-thumbnail { + display: block; + aspect-ratio: 16 / 10; + background-color: var(--color-base-600); + + img { + width: 100%; + height: 100%; + object-fit: cover; + transition: transform var(--transition-time-md); + } + + .page-card:hover & img { + transform: scale(1.05); + } +} + +.page-card-badge { + position: absolute; + top: 0.5rem; + right: 0.5rem; + z-index: 2; + display: flex; + align-items: center; + gap: 0.25rem; + padding: 0.25rem 0.5rem; + border-radius: 12px; + background-color: rgba(0, 0, 0, 0.75); + backdrop-filter: blur(4px); + color: var(--color-base-100); + font-size: var(--font-size-xs); + font-weight: 500; + transition: background-color var(--transition-time-sm); + + &:not(.page-card-badge-static) { + cursor: pointer; + + &:hover { + background-color: rgba(0, 0, 0, 0.9); + color: var(--color-base-100); + } + } + + &.page-card-badge-static { + cursor: default; + } + + .icon { + width: 0.75rem; + height: 0.75rem; + } +} + +.page-card-thumbnail-placeholder { + display: flex; + align-items: center; + justify-content: center; + width: 100%; + height: 100%; + background: linear-gradient(135deg, var(--color-base-600) 0%, var(--color-base-700) 100%); + + .icon { + width: 2.5rem; + height: 2.5rem; + color: var(--color-base-400); + } +} + +.page-card-content { + display: flex; + flex: 1; + flex-direction: column; + padding: 0.75rem; +} + +.page-card-title { + overflow: hidden; + margin-bottom: 0.25rem; + color: var(--color-base-100); + font-size: var(--font-size-sm); + font-weight: 500; + line-height: 1.3; + text-overflow: ellipsis; + white-space: nowrap; + + a { + color: inherit; + + &:hover { + color: var(--color-accent-500); + } + } +} + +.page-card-meta { + display: flex; + align-items: center; + gap: 0.5rem; + color: var(--color-base-300); + font-size: var(--font-size-xs); +} + +.page-card-date { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.page-card-footer { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.5rem 0.75rem; + border-top: 1px solid var(--color-base-600); +} + +.page-card-status { + display: flex; + align-items: center; + gap: 0.25rem; + + .status-dot { + width: 8px; + height: 8px; + border-radius: 50%; + } + + .status-dot-published { + background-color: var(--color-success-500); + } + + .status-dot-draft { + background-color: var(--color-warning-500); + } + + .status-dot-not-routable { + background-color: var(--color-base-400); + } +} + +.page-card-actions { + position: relative; + display: flex; + gap: 0.25rem; + + .button { + padding: 0.25rem; + border: 0; + background-color: transparent; + color: var(--color-base-400); + + &:hover { + background-color: var(--color-base-600); + color: var(--color-base-100); + } + } + + .dropdown { + position: relative; + } +} + +// === +// View Toggle +// === + +.pages-view-toggle { + display: flex; + gap: 0.125rem; + padding: 0.25rem; + border-radius: var(--border-radius); + background-color: var(--color-base-700); +} + +.pages-view-toggle .button { + display: flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + border: 0; + border-radius: var(--border-radius); + background-color: transparent; + color: var(--color-base-400); + transition: all var(--transition-time-sm); + + .icon { + width: 1rem; + height: 1rem; + margin: 0; + } + + &:hover { + background-color: var(--color-base-600); + color: var(--color-base-200); + } + + &.active { + background-color: var(--color-base-600); + color: var(--color-base-100); + } +} + +// === +// Section Headers (Kirby-style) +// === + +.pages-section { + margin-bottom: 2rem; +} + +.pages-section-header { + display: flex; + align-items: center; + justify-content: space-between; + margin-bottom: 1rem; +} + +.pages-section-title { + color: var(--color-base-100); + font-size: var(--font-size-md); + font-weight: 600; +} + +.pages-section-count { + padding: 0.125rem 0.5rem; + border-radius: 10px; + margin-left: 0.5rem; + background-color: var(--color-base-600); + color: var(--color-base-300); + font-size: var(--font-size-xs); + font-weight: 500; +} + +// === +// Empty State +// === + +.pages-empty { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 3rem; + border: 2px dashed var(--color-base-600); + border-radius: 6px; + color: var(--color-base-300); + text-align: center; + + .icon { + width: 3rem; + height: 3rem; + margin-bottom: 1rem; + color: var(--color-base-400); + } +} + +// === +// List View (Compact Kirby-style) +// === + +.pages-list { + display: flex; + flex-direction: column; + gap: 0.25rem; +} + +.pages-list-item { + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.5rem 0.75rem; + border-radius: var(--border-radius); + background-color: var(--color-base-700); + transition: background-color var(--transition-time-sm); + + &:hover { + background-color: var(--color-base-600); + } + + &:hover .pages-list-actions { + opacity: 1; + } +} + +.pages-list-checkbox { + flex-shrink: 0; +} + +.pages-list-icon { + display: flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; + flex-shrink: 0; + border-radius: var(--border-radius); + background-color: var(--color-base-600); + + .icon { + width: 1rem; + height: 1rem; + color: var(--color-base-300); + } +} + +.pages-list-content { + flex: 1; + min-width: 0; +} + +.pages-list-title { + overflow: hidden; + color: var(--color-base-100); + font-size: var(--font-size-sm); + text-overflow: ellipsis; + white-space: nowrap; + + a { + color: inherit; + + &:hover { + color: var(--color-accent-500); + } + } +} + +.pages-list-status { + display: flex; + align-items: center; + flex-shrink: 0; + gap: 0.5rem; + + .status-indicator { + width: 6px; + height: 6px; + border-radius: 50%; + } +} + +.pages-list-actions { + display: flex; + gap: 0.25rem; + opacity: 0; + transition: opacity var(--transition-time-sm); +} + +// === +// Drafts/Published Split View (Kirby Blog style) +// === + +.pages-split-view { + display: grid; + gap: 2rem; + + @media (min-width: map.get($breakpoints, "lg")) { + grid-template-columns: 1fr 2fr; + } +} + +.pages-split-column { + min-width: 0; +} + +.pages-split-column-header { + display: flex; + align-items: center; + justify-content: space-between; + padding-bottom: 0.75rem; + border-bottom: 1px solid var(--color-base-600); + margin-bottom: 1rem; +} + +.pages-split-column-title { + color: var(--color-base-200); + font-size: var(--font-size-sm); + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.05em; +} + +// === +// Tabs (Kirby-style) +// === + +.pages-tabs { + display: flex; + gap: 1.5rem; + padding-bottom: 0.75rem; + border-bottom: 1px solid var(--color-base-600); + margin-bottom: 1.5rem; +} + +.pages-tab { + padding: 0.25rem 0; + border: 0; + border-bottom: 2px solid transparent; + margin-bottom: -0.8125rem; + background: none; + color: var(--color-base-300); + cursor: pointer; + font-size: var(--font-size-sm); + font-weight: 500; + transition: color var(--transition-time-sm), border-color var(--transition-time-sm); + + &:hover { + color: var(--color-base-100); + } + + &.active { + border-bottom-color: var(--color-base-100); + color: var(--color-base-100); + } +} diff --git a/panel/src/scss/panel.scss b/panel/src/scss/panel.scss index 1ea12a3a0..b7d063c1e 100644 --- a/panel/src/scss/panel.scss +++ b/panel/src/scss/panel.scss @@ -22,6 +22,7 @@ @use "components/modals"; @use "components/notifications"; @use "components/pages-tree"; +@use "components/pages-cards"; @use "components/panel"; @use "components/section"; @use "components/sidebar"; diff --git a/panel/src/ts/components/views/pages.ts b/panel/src/ts/components/views/pages.ts index 3dc227dd1..fba5fb6bb 100644 --- a/panel/src/ts/components/views/pages.ts +++ b/panel/src/ts/components/views/pages.ts @@ -14,6 +14,8 @@ export class Pages { const commandCollapseAllPages = $("[data-command=collapse-all-pages]") as HTMLButtonElement; const commandReorderPages = $("[data-command=reorder-pages]") as HTMLButtonElement; const commandPreview = $("[data-command=preview]") as HTMLButtonElement; + const commandViewModeTree = $("[data-command=view-mode-tree]") as HTMLButtonElement; + const commandViewModeCard = $("[data-command=view-mode-card]") as HTMLButtonElement; const searchInput = $(".page-search") as HTMLInputElement; @@ -62,6 +64,20 @@ export class Pages { }); } + if (commandViewModeTree) { + commandViewModeTree.addEventListener("click", () => { + setViewMode("tree"); + commandViewModeTree.blur(); + }); + } + + if (commandViewModeCard) { + commandViewModeCard.addEventListener("click", () => { + setViewMode("card"); + commandViewModeCard.blur(); + }); + } + if (commandExpandAllPages || commandCollapseAllPages || commandReorderPages) { setCommandsState(); } @@ -297,6 +313,22 @@ export class Pages { } } + function setViewMode(mode: "tree" | "card") { + // Store preference in localStorage + localStorage.setItem("pages-view-mode", mode); + + // Update button states + if (commandViewModeTree && commandViewModeCard) { + commandViewModeTree.classList.toggle("active", mode === "tree"); + commandViewModeCard.classList.toggle("active", mode === "card"); + } + + // Reload page with view mode parameter + const url = new URL(window.location.href); + url.searchParams.set("view", mode); + window.location.href = url.toString(); + } + async function initSortable(element: HTMLElement) { const { default: Sortable } = await import("sortablejs"); diff --git a/panel/translations/en.yaml b/panel/translations/en.yaml index 8b1e7140e..dbc9eca41 100644 --- a/panel/translations/en.yaml +++ b/panel/translations/en.yaml @@ -246,9 +246,12 @@ panel.pages.page.moved: Page moved! panel.pages.page.notFound: Page not found panel.pages.pages: Pages panel.pages.pages.collapseAll: Collapse all +panel.pages.pages.empty: No pages found panel.pages.pages.expandAll: Expand all panel.pages.pages.reorder: Reorder panel.pages.pages.search: Search pages... +panel.pages.pages.viewCard: Card view +panel.pages.pages.viewTree: Tree view panel.pages.preview: Preview panel.pages.previewFile: Preview panel.pages.previous: Previous page diff --git a/panel/views/pages/cards.php b/panel/views/pages/cards.php new file mode 100644 index 000000000..f3221ba4f --- /dev/null +++ b/panel/views/pages/cards.php @@ -0,0 +1,115 @@ +toArray())) : ?> +
+ icon('pages') ?> +

translate('panel.pages.pages.empty') ?>

+
+ +
+ + datetime($page->contentFile()->lastModifiedTime()) ?> + scheme()->options()->get('imagePreviewField') ?> + fields()->get($imagePreviewField)?->type() === 'image' && $page->get($imagePreviewField) != '' ?> + hasChildren() ?> + scheme()->options()->get('children.subtree', false) ?> + +
+
+ + + + +
+ icon($page->icon()) ?> +
+ +
+ + + + + icon('pages') ?> + children()) ?> + + + + icon('pages') ?> + children()) ?> + + + +
+ + + + +
+ +
+ diff --git a/panel/views/pages/index.php b/panel/views/pages/index.php index 6d8f6ff2c..0f7207850 100644 --- a/panel/views/pages/index.php +++ b/panel/views/pages/index.php @@ -17,7 +17,13 @@ -
+
+ + user()->permissions()->has('panel.pages.create')) : ?> @@ -39,4 +45,4 @@
- \ No newline at end of file + From 38917a98af10163c56c40d8ca7d6b9b3c60edbb9 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 15:02:52 +0100 Subject: [PATCH 05/23] Add tree/card view toggle to pages list in panel Introduced a toggle for tree and card views in the pages list, visible when 'subtreeGridDisplay' is enabled in the parent page's scheme. Updated controller logic to validate and pass view mode, adjusted SCSS for improved styling, and modified the blog page scheme as an example configuration. --- FEATURE_CHANGELOG.md | 126 ++++++++++++++++++ .../src/Panel/Controllers/PagesController.php | 20 +-- panel/src/scss/components/_pages-tree.scss | 71 +++++++--- panel/views/pages/index.php | 14 +- site/schemes/pages/blog.yaml | 3 + 5 files changed, 204 insertions(+), 30 deletions(-) create mode 100644 FEATURE_CHANGELOG.md diff --git a/FEATURE_CHANGELOG.md b/FEATURE_CHANGELOG.md new file mode 100644 index 000000000..099af38f2 --- /dev/null +++ b/FEATURE_CHANGELOG.md @@ -0,0 +1,126 @@ +# Feature Changelog - Pages View Toggle + +## Overview +Added tree/card view toggle functionality for pages list in the admin panel. The toggle buttons only appear when `subtreeGridDisplay` is enabled in the parent page's scheme. + +## Date +December 19, 2025 + +## Changes Made + +### 1. Frontend - View Toggle Buttons +**File:** `panel/views/pages/index.php` +- Added two view mode toggle buttons (tree and card) in the header +- Buttons only display when `$gridDisplayEnabled` is true +- Active state styling based on current `$viewMode` +- Positioned before the "New Page" button + +### 2. Backend - Controller Logic +**File:** `formwork/src/Panel/Controllers/PagesController.php` +- Modified `tree()` action to check for `children.subtreeGridDisplay` option in parent page scheme +- Added view mode validation from query parameter `?view=` +- Card view only allowed when `subtreeGridDisplay: true` is set +- Passes `gridDisplayEnabled` and `viewMode` variables to the view + +### 3. JavaScript - View Mode Handlers +**File:** `panel/src/ts/components/views/pages.ts` +- Added constants for view mode buttons: `commandViewModeTree` and `commandViewModeCard` +- Implemented `setViewMode()` function that: + - Saves preference to localStorage + - Updates button active states + - Reloads page with view parameter +- Added click event listeners for both buttons + +### 4. Styling - CSS Import +**File:** `panel/src/scss/panel.scss` +- Added import for `@use "components/pages-cards"` +- Ensures card view styles are included in compiled CSS + +### 5. Translations - English +**File:** `panel/translations/en.yaml` +- Added `panel.pages.pages.viewTree: Tree view` +- Added `panel.pages.pages.viewCard: Card view` +- Added `panel.pages.pages.empty: No pages found` + +### 6. Example Configuration +**File:** `site/schemes/pages/blog.yaml` +- Added `subtree: true` to children options +- Added `subtreeGridDisplay: true` to enable card view toggle +- Includes documentation comment + +## How to Use + +### Enable Card View for a Page Type + +Add to your page scheme YAML file: + +```yaml +options: + children: + subtree: true + subtreeGridDisplay: true # Enables the card view toggle +``` + +### User Experience + +1. Navigate to a page that has `subtreeGridDisplay: true` in its scheme +2. Two toggle buttons appear in the header (list icon for tree, grid icon for card) +3. Click a button to switch between views +4. View preference is stored in localStorage +5. Page reloads with the selected view + +## Technical Details + +### View Mode Parameter +- Query parameter: `?view=tree` or `?view=card` +- Default: `tree` +- Validated on server-side + +### Scheme Option +- Path: `options.children.subtreeGridDisplay` +- Type: boolean +- Default: `false` + +### Button States +- Active button has `.active` class +- Uses existing button styling from `_buttons.scss` + +## Files Modified + +1. `panel/views/pages/index.php` - View template +2. `formwork/src/Panel/Controllers/PagesController.php` - Controller logic +3. `panel/src/ts/components/views/pages.ts` - JavaScript handlers +4. `panel/src/scss/panel.scss` - CSS imports +5. `panel/translations/en.yaml` - Translation keys +6. `site/schemes/pages/blog.yaml` - Example configuration + +## Files Built + +1. `panel/assets/js/chunks/*.js` - Compiled TypeScript +2. `panel/assets/css/panel.min.css` - Compiled CSS + +## Dependencies + +- Existing `pages-cards.scss` component (already in project) +- Existing `cards.php` view template (already in project) +- No new npm packages required + +## Testing Checklist + +- [ ] View toggle buttons appear when `subtreeGridDisplay: true` +- [ ] View toggle buttons hidden when `subtreeGridDisplay: false` or not set +- [ ] Tree view displays correctly +- [ ] Card view displays correctly +- [ ] Active button state updates on click +- [ ] View preference persists on page reload +- [ ] Query parameter `?view=` works correctly +- [ ] Fallback to tree view when card view not allowed +- [ ] Translations display correctly +- [ ] No console errors + +## Future Enhancements + +- Add view mode preference per page type (not just localStorage) +- Add animation/transition when switching views +- Add keyboard shortcuts for view toggle +- Support for additional view modes (compact, detailed, etc.) diff --git a/formwork/src/Panel/Controllers/PagesController.php b/formwork/src/Panel/Controllers/PagesController.php index 87f9d3f75..a0143ab52 100644 --- a/formwork/src/Panel/Controllers/PagesController.php +++ b/formwork/src/Panel/Controllers/PagesController.php @@ -70,15 +70,18 @@ public function tree(RouteParams $routeParams): Response $this->modal('newPage')->setFieldsModel($parent); - // Get view mode from query parameter or localStorage default + // Check if grid display is enabled in parent scheme + $gridDisplayEnabled = $parent->scheme()->options()->get('children.subtreeGridDisplay', false); + + // Get view mode from query parameter or default to tree $viewMode = $this->request->query()->get('view', 'tree'); - // Validate view mode - if (!in_array($viewMode, ['tree', 'card'])) { + // Validate view mode - only allow card view if grid display is enabled + if (!in_array($viewMode, ['tree', 'card']) || ($viewMode === 'card' && !$gridDisplayEnabled)) { $viewMode = 'tree'; } - $pagesContent = $viewMode === 'card' + $pagesContent = $viewMode === 'card' && $gridDisplayEnabled ? $this->view('@panel.pages.cards', [ 'pages' => $pageCollection, ]) @@ -93,10 +96,11 @@ public function tree(RouteParams $routeParams): Response ]); return new Response($this->view('@panel.pages.index', [ - 'title' => $this->translate('panel.pages.pages'), - 'parent' => $parent, - 'pagesTree' => $pagesContent, - 'viewMode' => $viewMode, + 'title' => $this->translate('panel.pages.pages'), + 'parent' => $parent, + 'pagesTree' => $pagesContent, + 'viewMode' => $viewMode, + 'gridDisplayEnabled' => $gridDisplayEnabled, ])); } diff --git a/panel/src/scss/components/_pages-tree.scss b/panel/src/scss/components/_pages-tree.scss index a475eec6c..c282821a6 100644 --- a/panel/src/scss/components/_pages-tree.scss +++ b/panel/src/scss/components/_pages-tree.scss @@ -9,9 +9,9 @@ $indent: 0.5rem; @if $i == 2 { - $indent: 0.875rem; + $indent: 0.75rem; } @else { - $indent: $indent + 2rem * ($i - 2); + $indent: $indent + 1.75rem * ($i - 2); } .pages-tree-level-#{$i} { @@ -22,7 +22,7 @@ } .page-details { - padding-left: 2rem * ($i - 1); + padding-left: 1.75rem * ($i - 1); } } } @@ -40,7 +40,8 @@ } .pages-tree-root { - border-top: 1px solid var(--color-base-600); + border-radius: var(--border-radius); + background-color: var(--color-base-800); } .pages-tree-root:not(:has(> .has-children)) .pages-tree-children-toggle { @@ -50,31 +51,45 @@ .pages-tree-headers { display: flex; align-items: center; - padding: 0.25rem 0; + padding: 0.375rem 0.75rem; + border-bottom: 1px solid var(--color-base-700); + color: var(--color-base-400); + font-size: var(--font-size-xs); font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.03em; @include user-select-none; } .pages-tree-row { display: flex; align-items: center; - padding: 0.5rem 0; - border-bottom: 1px solid var(--color-base-600); + padding: 0.5rem 0.75rem; + border-bottom: 1px solid var(--color-base-700); + transition: background-color var(--transition-time-sm); &:hover { - background-color: var(--color-base-800); + background-color: var(--color-base-700); + } + + &:hover .page-actions .button { + opacity: 1; } } .pages-tree-item { position: relative; + &:last-child > .pages-tree-row { + border-bottom: 0; + } + &::before { position: absolute; z-index: 1; - top: -2.125rem; - width: 1.625rem; - height: 3.625rem; + top: -1.75rem; + width: 1.25rem; + height: 3rem; border-bottom: 2px solid var(--color-base-600); border-left: 2px solid var(--color-base-600); } @@ -82,8 +97,8 @@ &::after { position: absolute; z-index: 1; - top: -2.125rem; - width: 1.625rem; + top: -1.75rem; + width: 1.25rem; height: 100%; border-left: 2px solid var(--color-base-600); } @@ -102,12 +117,12 @@ &.has-children::after, .is-reordering &.is-orderable::before, .is-reordering &.is-orderable::after { - width: 0.875rem; + width: 0.75rem; } .is-reordering &:not(.is-orderable, .has-children)::before, .is-reordering &:not(.is-orderable, .has-children)::after { - width: 2.5rem; + width: 2rem; } } @@ -130,20 +145,32 @@ .pages-tree-children-toggle .button { padding: 0; border: 0; - color: var(--color-base-300); + color: var(--color-base-400); cursor: pointer; & .icon { + width: 0.875rem; + height: 0.875rem; margin-right: 0; transition: transform var(--transition-time-sm), color var(--transition-time-sm); } + + &:hover { + color: var(--color-base-200); + } } .pages-tree-row .sortable-handle { display: none; padding-top: 0.125rem; + color: var(--color-base-400); + cursor: grab; + + &:hover { + color: var(--color-base-200); + } } .pages-tree-item:not(.has-children) .pages-tree-children-toggle { @@ -164,6 +191,7 @@ .pages-tree-children { display: none; + background-color: var(--color-base-800); } .pages-tree-item.sortable-chosen .pages-tree-item-cell { @@ -204,3 +232,14 @@ .pages-tree.is-dragging > .is-not-orderable .pages-tree-row:hover { background-color: var(--color-danger-900); } + +// Tree controls +.pages-tree-controls { + display: flex; + gap: 0.5rem; +} + +.pages-tree-controls .button { + padding: 0.375rem 0.75rem; + font-size: var(--font-size-sm); +} diff --git a/panel/views/pages/index.php b/panel/views/pages/index.php index 0f7207850..d18ecdca9 100644 --- a/panel/views/pages/index.php +++ b/panel/views/pages/index.php @@ -18,12 +18,14 @@
- - + + + + user()->permissions()->has('panel.pages.create')) : ?> diff --git a/site/schemes/pages/blog.yaml b/site/schemes/pages/blog.yaml index 824d10f87..07e885f99 100644 --- a/site/schemes/pages/blog.yaml +++ b/site/schemes/pages/blog.yaml @@ -17,6 +17,9 @@ options: templates: [post] reverse: true orderable: false + subtree: true + # Enable grid/card view display for children pages + subtreeGridDisplay: true icon: page-listing From 8c0f1da8ab23adf9641de49d904291f4d93463f0 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 15:05:57 +0100 Subject: [PATCH 06/23] Update .gitignore and remove FEATURE_CHANGELOG.md Added /docs/ to .gitignore to exclude documentation files from version control. Deleted FEATURE_CHANGELOG.md as it is no longer needed. --- .gitignore | 2 +- FEATURE_CHANGELOG.md | 126 ------------------------------------------- 2 files changed, 1 insertion(+), 127 deletions(-) delete mode 100644 FEATURE_CHANGELOG.md diff --git a/.gitignore b/.gitignore index 6d96f7915..d2fdb1a42 100644 --- a/.gitignore +++ b/.gitignore @@ -5,7 +5,7 @@ /cache/* /logs/* /vendor/* - +/docs/ /panel/assets/css/* /panel/assets/js/* /panel/logs/* diff --git a/FEATURE_CHANGELOG.md b/FEATURE_CHANGELOG.md deleted file mode 100644 index 099af38f2..000000000 --- a/FEATURE_CHANGELOG.md +++ /dev/null @@ -1,126 +0,0 @@ -# Feature Changelog - Pages View Toggle - -## Overview -Added tree/card view toggle functionality for pages list in the admin panel. The toggle buttons only appear when `subtreeGridDisplay` is enabled in the parent page's scheme. - -## Date -December 19, 2025 - -## Changes Made - -### 1. Frontend - View Toggle Buttons -**File:** `panel/views/pages/index.php` -- Added two view mode toggle buttons (tree and card) in the header -- Buttons only display when `$gridDisplayEnabled` is true -- Active state styling based on current `$viewMode` -- Positioned before the "New Page" button - -### 2. Backend - Controller Logic -**File:** `formwork/src/Panel/Controllers/PagesController.php` -- Modified `tree()` action to check for `children.subtreeGridDisplay` option in parent page scheme -- Added view mode validation from query parameter `?view=` -- Card view only allowed when `subtreeGridDisplay: true` is set -- Passes `gridDisplayEnabled` and `viewMode` variables to the view - -### 3. JavaScript - View Mode Handlers -**File:** `panel/src/ts/components/views/pages.ts` -- Added constants for view mode buttons: `commandViewModeTree` and `commandViewModeCard` -- Implemented `setViewMode()` function that: - - Saves preference to localStorage - - Updates button active states - - Reloads page with view parameter -- Added click event listeners for both buttons - -### 4. Styling - CSS Import -**File:** `panel/src/scss/panel.scss` -- Added import for `@use "components/pages-cards"` -- Ensures card view styles are included in compiled CSS - -### 5. Translations - English -**File:** `panel/translations/en.yaml` -- Added `panel.pages.pages.viewTree: Tree view` -- Added `panel.pages.pages.viewCard: Card view` -- Added `panel.pages.pages.empty: No pages found` - -### 6. Example Configuration -**File:** `site/schemes/pages/blog.yaml` -- Added `subtree: true` to children options -- Added `subtreeGridDisplay: true` to enable card view toggle -- Includes documentation comment - -## How to Use - -### Enable Card View for a Page Type - -Add to your page scheme YAML file: - -```yaml -options: - children: - subtree: true - subtreeGridDisplay: true # Enables the card view toggle -``` - -### User Experience - -1. Navigate to a page that has `subtreeGridDisplay: true` in its scheme -2. Two toggle buttons appear in the header (list icon for tree, grid icon for card) -3. Click a button to switch between views -4. View preference is stored in localStorage -5. Page reloads with the selected view - -## Technical Details - -### View Mode Parameter -- Query parameter: `?view=tree` or `?view=card` -- Default: `tree` -- Validated on server-side - -### Scheme Option -- Path: `options.children.subtreeGridDisplay` -- Type: boolean -- Default: `false` - -### Button States -- Active button has `.active` class -- Uses existing button styling from `_buttons.scss` - -## Files Modified - -1. `panel/views/pages/index.php` - View template -2. `formwork/src/Panel/Controllers/PagesController.php` - Controller logic -3. `panel/src/ts/components/views/pages.ts` - JavaScript handlers -4. `panel/src/scss/panel.scss` - CSS imports -5. `panel/translations/en.yaml` - Translation keys -6. `site/schemes/pages/blog.yaml` - Example configuration - -## Files Built - -1. `panel/assets/js/chunks/*.js` - Compiled TypeScript -2. `panel/assets/css/panel.min.css` - Compiled CSS - -## Dependencies - -- Existing `pages-cards.scss` component (already in project) -- Existing `cards.php` view template (already in project) -- No new npm packages required - -## Testing Checklist - -- [ ] View toggle buttons appear when `subtreeGridDisplay: true` -- [ ] View toggle buttons hidden when `subtreeGridDisplay: false` or not set -- [ ] Tree view displays correctly -- [ ] Card view displays correctly -- [ ] Active button state updates on click -- [ ] View preference persists on page reload -- [ ] Query parameter `?view=` works correctly -- [ ] Fallback to tree view when card view not allowed -- [ ] Translations display correctly -- [ ] No console errors - -## Future Enhancements - -- Add view mode preference per page type (not just localStorage) -- Add animation/transition when switching views -- Add keyboard shortcuts for view toggle -- Support for additional view modes (compact, detailed, etc.) From 2506b50ffe65af6d40929918ace2152f4608b367 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 15:18:30 +0100 Subject: [PATCH 07/23] Add and style pages view toggle component Introduced a new .pages-view-toggle wrapper for the view mode buttons in the pages panel, updated the SCSS to style this component, and refactored the index.php view to use the new structure. Also removed Kirby-specific comments from SCSS for clarity. --- panel/src/scss/components/_pages-cards.scss | 69 ++++++++++----------- panel/src/scss/components/_pages.scss | 32 ++++++++++ panel/views/pages/index.php | 15 +++-- 3 files changed, 75 insertions(+), 41 deletions(-) diff --git a/panel/src/scss/components/_pages-cards.scss b/panel/src/scss/components/_pages-cards.scss index c32ec9898..102ef766d 100644 --- a/panel/src/scss/components/_pages-cards.scss +++ b/panel/src/scss/components/_pages-cards.scss @@ -1,4 +1,3 @@ -// Kirby-inspired card grid layout for pages @use "mixins" as *; @use "variables" as *; @@ -12,7 +11,7 @@ display: grid; gap: 1rem; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr)); - + @media (min-width: map.get($breakpoints, "lg")) { grid-template-columns: repeat(auto-fill, minmax(220px, 1fr)); } @@ -34,13 +33,13 @@ border-radius: 6px; background-color: var(--color-base-700); transition: transform var(--transition-time-sm), box-shadow var(--transition-time-sm); - + &:hover { box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25); transform: translateY(-2px); z-index: 10; } - + &.has-children { border: 1px solid var(--color-base-600); } @@ -56,14 +55,14 @@ display: block; aspect-ratio: 16 / 10; background-color: var(--color-base-600); - + img { width: 100%; height: 100%; object-fit: cover; transition: transform var(--transition-time-md); } - + .page-card:hover & img { transform: scale(1.05); } @@ -85,20 +84,20 @@ font-size: var(--font-size-xs); font-weight: 500; transition: background-color var(--transition-time-sm); - + &:not(.page-card-badge-static) { cursor: pointer; - + &:hover { background-color: rgba(0, 0, 0, 0.9); color: var(--color-base-100); } } - + &.page-card-badge-static { cursor: default; } - + .icon { width: 0.75rem; height: 0.75rem; @@ -112,7 +111,7 @@ width: 100%; height: 100%; background: linear-gradient(135deg, var(--color-base-600) 0%, var(--color-base-700) 100%); - + .icon { width: 2.5rem; height: 2.5rem; @@ -136,10 +135,10 @@ line-height: 1.3; text-overflow: ellipsis; white-space: nowrap; - + a { color: inherit; - + &:hover { color: var(--color-accent-500); } @@ -173,21 +172,21 @@ display: flex; align-items: center; gap: 0.25rem; - + .status-dot { width: 8px; height: 8px; border-radius: 50%; } - + .status-dot-published { background-color: var(--color-success-500); } - + .status-dot-draft { background-color: var(--color-warning-500); } - + .status-dot-not-routable { background-color: var(--color-base-400); } @@ -197,19 +196,19 @@ position: relative; display: flex; gap: 0.25rem; - + .button { padding: 0.25rem; border: 0; background-color: transparent; color: var(--color-base-400); - + &:hover { background-color: var(--color-base-600); color: var(--color-base-100); } } - + .dropdown { position: relative; } @@ -237,18 +236,18 @@ background-color: transparent; color: var(--color-base-400); transition: all var(--transition-time-sm); - + .icon { width: 1rem; height: 1rem; margin: 0; } - + &:hover { background-color: var(--color-base-600); color: var(--color-base-200); } - + &.active { background-color: var(--color-base-600); color: var(--color-base-100); @@ -256,7 +255,7 @@ } // === -// Section Headers (Kirby-style) +// Section Headers // === .pages-section { @@ -300,7 +299,7 @@ border-radius: 6px; color: var(--color-base-300); text-align: center; - + .icon { width: 3rem; height: 3rem; @@ -327,11 +326,11 @@ border-radius: var(--border-radius); background-color: var(--color-base-700); transition: background-color var(--transition-time-sm); - + &:hover { background-color: var(--color-base-600); } - + &:hover .pages-list-actions { opacity: 1; } @@ -350,7 +349,7 @@ flex-shrink: 0; border-radius: var(--border-radius); background-color: var(--color-base-600); - + .icon { width: 1rem; height: 1rem; @@ -369,10 +368,10 @@ font-size: var(--font-size-sm); text-overflow: ellipsis; white-space: nowrap; - + a { color: inherit; - + &:hover { color: var(--color-accent-500); } @@ -384,7 +383,7 @@ align-items: center; flex-shrink: 0; gap: 0.5rem; - + .status-indicator { width: 6px; height: 6px; @@ -406,7 +405,7 @@ .pages-split-view { display: grid; gap: 2rem; - + @media (min-width: map.get($breakpoints, "lg")) { grid-template-columns: 1fr 2fr; } @@ -434,7 +433,7 @@ } // === -// Tabs (Kirby-style) +// Tabs // === .pages-tabs { @@ -456,11 +455,11 @@ font-size: var(--font-size-sm); font-weight: 500; transition: color var(--transition-time-sm), border-color var(--transition-time-sm); - + &:hover { color: var(--color-base-100); } - + &.active { border-bottom-color: var(--color-base-100); color: var(--color-base-100); diff --git a/panel/src/scss/components/_pages.scss b/panel/src/scss/components/_pages.scss index e3e8b0c50..f119ff34c 100644 --- a/panel/src/scss/components/_pages.scss +++ b/panel/src/scss/components/_pages.scss @@ -100,3 +100,35 @@ .pages-tree.is-filtered .pages-tree-item .page-details { padding-left: 0; } + +.pages-view-toggle { + display: flex; + gap: .25rem; + padding: .25rem; + background-color: var(--color-base-700); + border-radius: var(--border-radius) +} + +.pages-view-toggle .button { + padding: .375rem .5rem; + background-color: rgba(0,0,0,0); + border: none; + color: var(--color-base-400); + transition: all var(--transition-time-sm) +} + +.pages-view-toggle .button:hover { + background-color: var(--color-base-650); + color: var(--color-base-200) +} + +.pages-view-toggle .button.active { + background-color: var(--color-base-600); + color: var(--color-base-100) +} + +.pages-view-toggle .button .icon { + width: 1rem; + height: 1rem; + margin: 0 +} diff --git a/panel/views/pages/index.php b/panel/views/pages/index.php index d18ecdca9..712d24425 100644 --- a/panel/views/pages/index.php +++ b/panel/views/pages/index.php @@ -19,12 +19,15 @@
- - +
+ + +
+ user()->permissions()->has('panel.pages.create')) : ?> From fd860680378441764f357c03cbfc5cf664a4a0b9 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 15:21:54 +0100 Subject: [PATCH 08/23] Add imagePreviewField option to post page scheme Introduces the imagePreviewField option set to 'coverImage' in the post page scheme to enable image previews in the admin interface. --- site/schemes/pages/post.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/site/schemes/pages/post.yaml b/site/schemes/pages/post.yaml index 93785ccf7..d89924e37 100644 --- a/site/schemes/pages/post.yaml +++ b/site/schemes/pages/post.yaml @@ -6,6 +6,7 @@ options: default: false children: false num: date + imagePreviewField: coverImage layout: sections: From 248373257496faa183fd9ce0623110d0431f4a10 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 16:54:26 +0100 Subject: [PATCH 09/23] Improve page list styles and image preview handling Refines the SCSS for page list components, adjusting font sizes, colors, spacing, and button visibility for better UI consistency. Updates the page tree view to display image previews as thumbnails within the page icon area, removing the previous larger image preview from the details section. --- panel/src/scss/components/_pages.scss | 106 +++++++++++++++++++++----- panel/views/pages/tree.php | 15 ++-- 2 files changed, 95 insertions(+), 26 deletions(-) diff --git a/panel/src/scss/components/_pages.scss b/panel/src/scss/components/_pages.scss index f119ff34c..a5efda9a8 100644 --- a/panel/src/scss/components/_pages.scss +++ b/panel/src/scss/components/_pages.scss @@ -5,12 +5,21 @@ .page-title { padding: var(--focusring-width); margin: calc(-1 * var(--focusring-width)); - font-size: var(--font-size-md); + font-size: var(--font-size-sm); + font-weight: 500; + + a { + color: var(--color-base-100); + + &:hover { + color: var(--color-accent-500); + } + } } .page-route { - color: var(--color-base-300); - font-size: var(--font-size-sm); + color: var(--color-base-400); + font-size: var(--font-size-xs); } .button .page-language { @@ -18,19 +27,28 @@ } .page-date { - max-width: 20%; - flex: 0 0 20%; + max-width: 18%; + flex: 0 0 18%; + color: var(--color-base-400); + font-size: var(--font-size-xs); text-align: center; } .page-status { - flex: 0 0 22.5%; + flex: 0 0 18%; text-align: center; } .page-status .icon { display: inline-block; - margin-right: 0.375rem; + width: 0.5rem; + height: 0.5rem; + margin-right: 0.25rem; +} + +.page-status-label { + color: var(--color-base-300); + font-size: var(--font-size-xs); } .page-status-published .icon { @@ -46,9 +64,19 @@ } .page-actions { - flex: 0 0 12.5%; + flex: 0 0 10%; text-align: right; white-space: nowrap; + + .button { + padding: 0.25rem; + opacity: 0; + transition: opacity var(--transition-time-sm); + + &:last-child { + opacity: 1; + } + } } .page-info { @@ -56,15 +84,48 @@ z-index: 8; display: none; padding: 0.5rem; - border: 1px solid var(--color-base-500); + border: 1px solid var(--color-base-600); border-radius: var(--border-radius); - margin: 0.25rem 0 1rem; - background-color: var(--color-base-900); + margin-top: 0.25rem; + top: 100%; + left: 0; + min-width: 200px; + background-color: var(--color-base-800); box-shadow: var(--box-shadow-md); } +.page-icon { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 1.75rem; + height: 1.75rem; + flex-shrink: 0; + border-radius: var(--border-radius); + background-color: var(--color-base-700); +} + .page-icon > .icon { - vertical-align: -0.25rem; + width: 1rem; + height: 1rem; + color: var(--color-base-400); + vertical-align: middle; +} + +.page-thumbnail { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + border-radius: var(--border-radius); + object-fit: cover; + overflow: hidden; +} + +.page-thumbnail + .icon { + display: none; } .page-icon:hover .page-info, @@ -77,19 +138,19 @@ } .page-info-row { - padding: 0.5rem 0.25rem; + padding: 0.375rem 0.25rem; border-bottom: 1px solid var(--color-base-600); - font-size: var(--font-size-sm); + font-size: var(--font-size-xs); } .page-info-badges { - padding: 0.5rem 0.25rem; - font-size: var(--font-size-md); + padding: 0.375rem 0.25rem; + font-size: var(--font-size-sm); white-space: nowrap; } .page-languages { - font-size: var(--font-size-md); + font-size: var(--font-size-sm); white-space: nowrap; } @@ -101,6 +162,17 @@ padding-left: 0; } +// Page search +.page-search { + background-color: var(--color-base-700); + border-color: var(--color-base-600); + + &:focus { + background-color: var(--color-base-800); + border-color: var(--color-accent-500); + } +} + .pages-view-toggle { display: flex; gap: .25rem; diff --git a/panel/views/pages/tree.php b/panel/views/pages/tree.php index d94b9b5f2..22a7e30bd 100644 --- a/panel/views/pages/tree.php +++ b/panel/views/pages/tree.php @@ -38,6 +38,10 @@
+ scheme()->options()->get('imagePreviewField') ?> + fields()->get($imagePreviewField)?->type() === 'image' && $page->get($imagePreviewField) != '') : ?> + + icon($page->icon()) ?> insert('@panel._pages.info', ['page' => $page]) ?>
@@ -55,14 +59,7 @@ - scheme()->options()->get('imagePreviewField') ?> - fields()->get($imagePreviewField)?->type() === 'image' && $page->get($imagePreviewField) != '') : ?> -
-
- -
-
- +
@@ -104,4 +101,4 @@ - \ No newline at end of file + From d44491aae1cee7d206734f5c5e4f1bd0c0478181 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 16:57:53 +0100 Subject: [PATCH 10/23] Set default page view mode based on grid display option The default view mode now depends on the parent's grid display setting: 'card' if grid display is enabled, otherwise 'tree'. This improves the user experience by aligning the default view with the configured display option. --- formwork/src/Panel/Controllers/PagesController.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/formwork/src/Panel/Controllers/PagesController.php b/formwork/src/Panel/Controllers/PagesController.php index a0143ab52..30ee7aa70 100644 --- a/formwork/src/Panel/Controllers/PagesController.php +++ b/formwork/src/Panel/Controllers/PagesController.php @@ -73,8 +73,9 @@ public function tree(RouteParams $routeParams): Response // Check if grid display is enabled in parent scheme $gridDisplayEnabled = $parent->scheme()->options()->get('children.subtreeGridDisplay', false); - // Get view mode from query parameter or default to tree - $viewMode = $this->request->query()->get('view', 'tree'); + // Get view mode from query parameter or default based on grid display setting + $defaultView = $gridDisplayEnabled ? 'card' : 'tree'; + $viewMode = $this->request->query()->get('view', $defaultView); // Validate view mode - only allow card view if grid display is enabled if (!in_array($viewMode, ['tree', 'card']) || ($viewMode === 'card' && !$gridDisplayEnabled)) { From c192a5c6c7a11e951821c04d80a59ba5fb883770 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:12:15 +0100 Subject: [PATCH 11/23] Add search filter support for card view in Pages Enhanced the Pages component to apply search filtering and highlighting to the card view, in addition to the tree view. Card elements are now shown or hidden based on the search input, and matching text is highlighted. --- panel/src/ts/components/views/pages.ts | 28 ++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/panel/src/ts/components/views/pages.ts b/panel/src/ts/components/views/pages.ts index fba5fb6bb..d4e74ad72 100644 --- a/panel/src/ts/components/views/pages.ts +++ b/panel/src/ts/components/views/pages.ts @@ -92,7 +92,7 @@ export class Pages { const handleSearch = () => { const value = escapeHtml(searchInput.value); if (value.length === 0) { - ($(".pages-tree-root") as HTMLElement).classList.remove("is-filtered"); + const treeRoot = $(".pages-tree-root") as HTMLElement; if (treeRoot) { treeRoot.classList.remove("is-filtered"); } $$(".pages-tree-item").forEach((element) => { const title = $(".page-title a", element) as HTMLElement; @@ -100,8 +100,17 @@ export class Pages { ($(".pages-tree-row", element) as HTMLElement).style.display = ""; element.classList.toggle("is-expanded", element.dataset.expanded === "true"); }); + + // Reset card view + $$(".page-card").forEach((element) => { + element.style.display = ""; + const title = $(".page-card-title a", element) as HTMLElement; + if (title) { + title.innerText = title.textContent; + } + }); } else { - ($(".pages-tree-root") as HTMLElement).classList.add("is-filtered"); + const treeRoot = $(".pages-tree-root") as HTMLElement; if (treeRoot) { treeRoot.classList.add("is-filtered"); } const regexp = new RegExp(`(^|\\b)${makeDiacriticsRegExp(escapeRegExp(value))}`, "gi"); @@ -118,6 +127,21 @@ export class Pages { } element.classList.add("is-expanded"); + + }); + // Handle card view search + $$(".page-card").forEach((element) => { + const title = $(".page-card-title a", element) as HTMLElement; + if (title) { + const text = escapeHtml(title.textContent); + + if (text.match(regexp) !== null) { + title.innerHTML = text.replace(regexp, "$&"); + element.style.display = ""; + } else { + element.style.display = "none"; + } + } }); } }; From d5b0d721690d84d73ba98908a13b61f5bf533adf Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 17:56:53 +0100 Subject: [PATCH 12/23] Add page icon to page card titles and improve styles Introduces a page icon next to the title in page cards by updating the cards.php view and adding new SCSS classes for layout and styling. Also refines related SCSS for better alignment, overflow handling, and hover effects for page card icons. --- panel/src/scss/components/_pages-cards.scss | 58 +++++++++++++++++++-- panel/src/scss/components/_pages.scss | 3 +- panel/views/pages/cards.php | 8 ++- 3 files changed, 64 insertions(+), 5 deletions(-) diff --git a/panel/src/scss/components/_pages-cards.scss b/panel/src/scss/components/_pages-cards.scss index 102ef766d..a9d38223d 100644 --- a/panel/src/scss/components/_pages-cards.scss +++ b/panel/src/scss/components/_pages-cards.scss @@ -104,6 +104,27 @@ } } +.page-card-icon { + position: absolute; + bottom: 0.5rem; + left: 0.5rem; + z-index: 2; + display: flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; + border-radius: var(--border-radius); + background-color: rgba(0, 0, 0, 0.75); + backdrop-filter: blur(4px); + color: var(--color-base-100); + + .icon { + width: 1rem; + height: 1rem; + } +} + .page-card-thumbnail-placeholder { display: flex; align-items: center; @@ -112,6 +133,12 @@ height: 100%; background: linear-gradient(135deg, var(--color-base-600) 0%, var(--color-base-700) 100%); + .page-icon { + width: auto; + height: auto; + background: transparent; + } + .icon { width: 2.5rem; height: 2.5rem; @@ -120,24 +147,26 @@ } .page-card-content { + position: relative; display: flex; flex: 1; flex-direction: column; padding: 0.75rem; + overflow: visible; } .page-card-title { - overflow: hidden; margin-bottom: 0.25rem; color: var(--color-base-100); font-size: var(--font-size-sm); font-weight: 500; line-height: 1.3; - text-overflow: ellipsis; - white-space: nowrap; a { color: inherit; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; &:hover { color: var(--color-accent-500); @@ -145,6 +174,29 @@ } } +.page-card-title-wrapper { + display: flex; + align-items: center; + gap: 0.1rem; + + .page-icon { + position: relative; + justify-content: start; + flex-shrink: 0; + width: 1.2rem; + height: 1.2rem; + background-color: var(--color-base-700); + } + + a { + flex: 1; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } +} + .page-card-meta { display: flex; align-items: center; diff --git a/panel/src/scss/components/_pages.scss b/panel/src/scss/components/_pages.scss index a5efda9a8..7f3223748 100644 --- a/panel/src/scss/components/_pages.scss +++ b/panel/src/scss/components/_pages.scss @@ -129,7 +129,8 @@ } .page-icon:hover .page-info, -.header-icon:hover .page-info { +.header-icon:hover .page-info, +.page-card-icon:hover .page-info { display: block; } diff --git a/panel/views/pages/cards.php b/panel/views/pages/cards.php index f3221ba4f..74d1d5bf9 100644 --- a/panel/views/pages/cards.php +++ b/panel/views/pages/cards.php @@ -44,7 +44,13 @@ class="page-card-badge"
- escape($page->title()) ?> +
+
+ icon($page->icon()) ?> + insert('@panel._pages.info', ['page' => $page]) ?> +
+ escape($page->title()) ?> +
From 109275ce911c06446584b1b341d9ca2b33ea0da9 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 19:11:56 +0100 Subject: [PATCH 13/23] Revamp panel UI styles and layout structure Updated SCSS variables and component styles for buttons, dropdowns, header, sidebar, section, and pages tree to improve visual consistency, spacing, and color scheme. Refactored layout markup in panel.php and pages/index.php to unify header structure and remove duplicate header code. These changes enhance the overall look and feel of the panel interface. --- panel/src/scss/components/_buttons.scss | 24 +++++++--- panel/src/scss/components/_dropdowns.scss | 23 +++++---- panel/src/scss/components/_header.scss | 19 ++++---- panel/src/scss/components/_pages-tree.scss | 10 ++-- panel/src/scss/components/_panel.scss | 18 ++++---- panel/src/scss/components/_section.scss | 10 ++-- panel/src/scss/components/_sidebar.scss | 54 ++++++++++++++-------- panel/src/scss/components/_variables.scss | 22 +++++---- panel/views/layouts/panel.php | 10 ---- panel/views/pages/index.php | 4 +- 10 files changed, 109 insertions(+), 85 deletions(-) diff --git a/panel/src/scss/components/_buttons.scss b/panel/src/scss/components/_buttons.scss index f0dde88a5..76555c46d 100644 --- a/panel/src/scss/components/_buttons.scss +++ b/panel/src/scss/components/_buttons.scss @@ -1,13 +1,16 @@ @use "mixins" as *; .button { - display: inline-block; - padding: 0.375rem 0.5rem; + display: inline-flex; + align-items: center; + justify-content: center; + gap: 0.375rem; + padding: 0.5rem 0.875rem; border: 1px solid transparent; border-radius: var(--border-radius); background-color: transparent; color: inherit; - cursor: default; + cursor: pointer; font-family: var(--font-family-sans); font-size: var(--font-size-sm); font-weight: 500; @@ -18,12 +21,18 @@ border-color var(--transition-time-sm), background-color var(--transition-time-sm), box-shadow var(--transition-time-sm), - color var(--transition-time-sm); + color var(--transition-time-sm), + transform var(--transition-time-sm); white-space: nowrap; @include user-select-none; &:hover { - color: var(--color-accent-500); + color: var(--color-accent-400); + transform: translateY(-1px); + } + + &:active { + transform: translateY(0); } &:focus { @@ -34,12 +43,13 @@ &.disabled { color: var(--color-base-500); pointer-events: none; + transform: none; } & .icon { display: inline-block; - margin-right: 0.25rem; - vertical-align: text-top; + margin-right: 0; + vertical-align: middle; } } diff --git a/panel/src/scss/components/_dropdowns.scss b/panel/src/scss/components/_dropdowns.scss index 46d36f263..ccad33a9f 100644 --- a/panel/src/scss/components/_dropdowns.scss +++ b/panel/src/scss/components/_dropdowns.scss @@ -26,13 +26,13 @@ top: 100%; left: 0; display: none; - min-width: 8rem; - padding: 0.25rem 0; - border: 1px solid var(--color-base-500); - border-radius: var(--border-radius); - margin-top: 3px; - background-color: var(--color-base-900); - box-shadow: var(--box-shadow-md); + min-width: 10rem; + padding: 0.5rem; + border: 1px solid var(--color-base-700); + border-radius: 8px; + margin-top: 0.5rem; + background-color: var(--color-base-850); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3); overflow-y: auto; } @@ -42,12 +42,15 @@ } .dropdown-item { - display: block; + display: flex; + align-items: center; + gap: 0.5rem; width: 100%; - padding: 0.5rem 1rem; + padding: 0.5rem 0.75rem; border: 0; + border-radius: 6px; background-color: transparent; - color: var(--color-base-100); + color: var(--color-base-200); cursor: pointer !important; font-family: inherit; font-size: var(--font-size-sm); diff --git a/panel/src/scss/components/_header.scss b/panel/src/scss/components/_header.scss index 206fb0754..e2c5df68f 100644 --- a/panel/src/scss/components/_header.scss +++ b/panel/src/scss/components/_header.scss @@ -4,26 +4,25 @@ .header { position: sticky; z-index: 9; - top: 3.5rem; + top: 3rem; display: flex; - min-height: 4.5rem; + min-height: 3.5rem; align-items: center; - padding: 0.5rem 1rem; - border-bottom: 1px solid var(--color-base-600); + padding: 0.75rem 1rem; + border-bottom: 1px solid var(--color-base-700); margin-bottom: 1rem; - background-color: var(--color-base-800); + background-color: var(--color-base-850); white-space: nowrap; @media (min-width: map.get($breakpoints, "sm")) { - padding: 0.5rem 1.5rem; + padding: 0.75rem 1.5rem; margin-right: -1rem; margin-left: -1rem; } @media (min-width: map.get($breakpoints, "md")) { - min-height: 5.5rem; margin-right: -1.5rem; - margin-bottom: 1.75rem; + margin-bottom: 1.5rem; margin-left: -1.5rem; } } @@ -35,8 +34,8 @@ .header-title { flex-grow: 1; - font-size: var(--font-size-h5); - font-weight: 600; + font-size: var(--font-size-lg); + font-weight: 500; } .header-title a { diff --git a/panel/src/scss/components/_pages-tree.scss b/panel/src/scss/components/_pages-tree.scss index c282821a6..486de6873 100644 --- a/panel/src/scss/components/_pages-tree.scss +++ b/panel/src/scss/components/_pages-tree.scss @@ -64,12 +64,14 @@ .pages-tree-row { display: flex; align-items: center; - padding: 0.5rem 0.75rem; - border-bottom: 1px solid var(--color-base-700); - transition: background-color var(--transition-time-sm); + padding: 0.375rem 0.75rem; + border-bottom: 1px solid var(--color-base-750); + transition: all var(--transition-time-sm); &:hover { - background-color: var(--color-base-700); + background-color: var(--color-base-800); + border-left: 2px solid var(--color-accent-500); + padding-left: calc(0.75rem - 2px); } &:hover .page-actions .button { diff --git a/panel/src/scss/components/_panel.scss b/panel/src/scss/components/_panel.scss index b805120df..29df18995 100644 --- a/panel/src/scss/components/_panel.scss +++ b/panel/src/scss/components/_panel.scss @@ -11,15 +11,16 @@ left: 0; display: flex; align-items: center; - padding: 0.75rem; + padding: 0.625rem 0.75rem; padding-left: 3rem; - background-color: var(--color-base-600); - box-shadow: var(--box-shadow-sm); + background-color: var(--color-base-850); + border-bottom: 1px solid var(--color-base-800); color: var(--color-base-100); font-weight: 500; + font-size: var(--font-size-sm); @include user-select-none; @media (min-width: map.get($breakpoints, "md")) { - left: 16rem; + left: 14rem; padding-left: 1.5rem; } } @@ -29,6 +30,7 @@ align-items: center; margin-bottom: 2rem; cursor: pointer; + justify-content: center; } .panel-user-image { @@ -66,10 +68,10 @@ } .panel-main { - padding-top: 4rem; + padding-top: 3.5rem; @media (min-width: map.get($breakpoints, "md")) { - padding: 1.875rem; - padding-top: 4rem; - padding-left: 1.875rem + 16rem; + padding: 1.5rem; + padding-top: 3.5rem; + padding-left: 1.5rem + 14rem; } } diff --git a/panel/src/scss/components/_section.scss b/panel/src/scss/components/_section.scss index 5ebf8f0fb..f932af9e1 100644 --- a/panel/src/scss/components/_section.scss +++ b/panel/src/scss/components/_section.scss @@ -4,14 +4,14 @@ @use "sass:map"; .section { - padding: 1.5rem 1.25rem; + padding: 1rem 1rem; margin-bottom: 1rem; - background-color: var(--color-base-900); - box-shadow: var(--box-shadow-sm); + background-color: var(--color-base-850); + border: 1px solid var(--color-base-700); + border-radius: var(--border-radius); @media (min-width: map.get($breakpoints, "sm")) { - padding: 1.5rem 1.75rem; - border-radius: var(--border-radius); + padding: 1.25rem 1.5rem; } } diff --git a/panel/src/scss/components/_sidebar.scss b/panel/src/scss/components/_sidebar.scss index 6e285c07d..62e451311 100644 --- a/panel/src/scss/components/_sidebar.scss +++ b/panel/src/scss/components/_sidebar.scss @@ -6,11 +6,10 @@ top: 0; bottom: 0; left: 0; - width: 16rem; - padding: 1rem 1.5rem; - background: linear-gradient(to bottom, #{var(--color-base-900)} 0%, #{var(--color-base-800)} 100%); - background-color: var(--color-base-900); - box-shadow: var(--box-shadow-sm); + width: 14rem; + padding: 0.75rem 1rem; + background: var(--color-base-900); + border-right: 1px solid var(--color-base-700); @include user-select-none; } @@ -51,30 +50,45 @@ .sidebar-navigation > li { position: relative; - padding: 0.25rem 0; - padding-left: 0.75rem; + display: flex; + align-items: center; + gap: 0.75rem; + padding: 0.625rem 0.75rem; margin: 0; - margin-bottom: 0.5rem; + margin-bottom: 0.125rem; + border-radius: 6px; + color: var(--color-base-400); + font-size: var(--font-size-sm); + transition: all var(--transition-time-sm); + + &:hover { + background-color: var(--color-base-800); + color: var(--color-base-100); + } } .sidebar-navigation > li a { - color: var(--color-base-100); + flex: 1; + color: inherit; + text-decoration: none; } .sidebar-navigation > li .icon { - margin-right: 0.375rem; + width: 1.125rem; + height: 1.125rem; + flex-shrink: 0; + color: inherit; } -.sidebar-navigation > .active { - font-weight: 600; +.sidebar-navigation > li .badge { + margin-left: auto; + flex-shrink: 0; } -.sidebar-navigation > .active::before { - position: absolute; - top: 0; - bottom: 0; - left: 0; - width: 3px; - background-color: var(--color-accent-500); - content: " "; +.sidebar-navigation > .active { + background-color: var(--color-base-800); + color: var(--color-base-100); + font-weight: 500; + border-left: 3px solid var(--color-accent-500); + padding-left: calc(0.75rem - 3px); } diff --git a/panel/src/scss/components/_variables.scss b/panel/src/scss/components/_variables.scss index d125d4fc6..4114b1597 100644 --- a/panel/src/scss/components/_variables.scss +++ b/panel/src/scss/components/_variables.scss @@ -14,15 +14,17 @@ $color-base-light-700: $color-gray-700; $color-base-light-800: $color-gray-800; $color-base-light-900: $color-gray-900; -$color-base-dark-100: #f2f2f3; -$color-base-dark-200: #c4c7ca; -$color-base-dark-300: #979ca1; -$color-base-dark-400: #7c8288; -$color-base-dark-500: #4b4f53; -$color-base-dark-600: #333638; -$color-base-dark-700: #292b2e; -$color-base-dark-800: #1f2123; -$color-base-dark-900: #181a1b; +$color-base-dark-100: #f5f5f5; +$color-base-dark-200: #b8bcc0; +$color-base-dark-300: #8a9199; +$color-base-dark-400: #6b7280; +$color-base-dark-500: #3d4148; +$color-base-dark-600: #2a2d31; +$color-base-dark-700: #222528; +$color-base-dark-750: #1e2023; +$color-base-dark-800: #1a1c1e; +$color-base-dark-850: #16181a; +$color-base-dark-900: #111214; $color-backdrop: rgba($color-blue-100, 0.5); $color-selection: rgba($color-blue-500, 0.25); @@ -142,7 +144,9 @@ $color-shadow-lg: rgba($color-blue-100, 15%); --color-base-500: #{$color-base-dark-500}; --color-base-600: #{$color-base-dark-600}; --color-base-700: #{$color-base-dark-700}; + --color-base-750: #{$color-base-dark-750}; --color-base-800: #{$color-base-dark-800}; + --color-base-850: #{$color-base-dark-850}; --color-base-900: #{$color-base-dark-900}; --color-tooltip-inverted: #{rgba($color-base-dark-100, 0.875)}; diff --git a/panel/views/layouts/panel.php b/panel/views/layouts/panel.php index 0f6a944a2..5579cf5d3 100644 --- a/panel/views/layouts/panel.php +++ b/panel/views/layouts/panel.php @@ -16,16 +16,6 @@ insert('@panel._sidebar') ?> -
- translate('panel.panel') ?> - / - user()->permissions()->has('panel.options.site')) : ?> - icon('globe') ?> escape($site->title()) ?> - - icon('globe') ?> escape($site->title()) ?> - - translate('panel.viewSite') ?> icon('arrow-right-up-box') ?> -
content() ?> diff --git a/panel/views/pages/index.php b/panel/views/pages/index.php index 712d24425..dce9450d5 100644 --- a/panel/views/pages/index.php +++ b/panel/views/pages/index.php @@ -1,6 +1,6 @@ layout('@panel.panel') ?> -
+
icon('pages') ?>
@@ -33,7 +33,7 @@
-
+
From da763735cef36a7bb166812b6e48278de84049a0 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 19:24:48 +0100 Subject: [PATCH 14/23] Refactor header markup to use
element Replaces
with
across multiple panel view files for improved semantic HTML structure and consistency. --- panel/views/dashboard/index.php | 6 +++--- panel/views/files/index.php | 4 ++-- panel/views/options/site.php | 4 ++-- panel/views/options/system.php | 4 ++-- panel/views/pages/editor.php | 6 +++--- panel/views/statistics/index.php | 6 +++--- panel/views/tools/backups.php | 6 +++--- panel/views/tools/info.php | 6 +++--- panel/views/tools/updates.php | 6 +++--- panel/views/users/index.php | 6 +++--- 10 files changed, 27 insertions(+), 27 deletions(-) diff --git a/panel/views/dashboard/index.php b/panel/views/dashboard/index.php index 3cf7da442..ba3a583f7 100644 --- a/panel/views/dashboard/index.php +++ b/panel/views/dashboard/index.php @@ -1,10 +1,10 @@ layout('@panel.panel') ?>
-
+
icon('home') ?>
translate('panel.dashboard.dashboard') ?>
-
+
@@ -63,4 +63,4 @@
-
\ No newline at end of file +
diff --git a/panel/views/files/index.php b/panel/views/files/index.php index 22a922d39..8d2d51e21 100644 --- a/panel/views/files/index.php +++ b/panel/views/files/index.php @@ -2,7 +2,7 @@ modals()->add('uploadFile') ?>
-
+
icon('files') ?>
translate('panel.files.files') ?>
@@ -10,7 +10,7 @@
-
+
diff --git a/panel/views/options/site.php b/panel/views/options/site.php index 3369d3df0..43f19f6ae 100644 --- a/panel/views/options/site.php +++ b/panel/views/options/site.php @@ -3,14 +3,14 @@ modals()->add('changes') ?>
-
+
icon('gear') ?>
translate('panel.options.options') ?>
-
+
insert('@panel.fields', ['fields' => $fields]) ?> diff --git a/panel/views/options/system.php b/panel/views/options/system.php index 8d26c238a..1bc517164 100644 --- a/panel/views/options/system.php +++ b/panel/views/options/system.php @@ -3,14 +3,14 @@ modals()->add('changes') ?> -
+
icon('gear') ?>
translate('panel.options.options') ?>
-
+
insert('@panel.fields', ['fields' => $fields]) ?> diff --git a/panel/views/pages/editor.php b/panel/views/pages/editor.php index 2f9b41d09..ccf3b3d9f 100644 --- a/panel/views/pages/editor.php +++ b/panel/views/pages/editor.php @@ -4,7 +4,7 @@ attr(['hidden' => true, 'aria-hidden' => 'true', 'tabindex' => -1, 'data-command' => 'save', 'formaction' => $history?->isJustCreated() ? '?publish=false' : null]) ?>> -
+
@@ -66,7 +66,7 @@
-
+ insert('@panel.fields', ['fields' => $fields]) ?> items()->isEmpty()): ?> @@ -78,4 +78,4 @@ ) ?>
- \ No newline at end of file + diff --git a/panel/views/statistics/index.php b/panel/views/statistics/index.php index b858aaa83..b5a4b340e 100644 --- a/panel/views/statistics/index.php +++ b/panel/views/statistics/index.php @@ -1,9 +1,9 @@ layout('@panel.panel') ?> -
+
icon('chart-line') ?>
translate('panel.statistics.statistics') ?>
-
+
@@ -117,4 +117,4 @@
-
\ No newline at end of file +
diff --git a/panel/views/tools/backups.php b/panel/views/tools/backups.php index 4367b1252..cec8917e1 100644 --- a/panel/views/tools/backups.php +++ b/panel/views/tools/backups.php @@ -2,10 +2,10 @@ modals()->add('deleteFile') ?> -
+
icon('toolbox') ?>
translate('panel.tools.tools') ?>
-
+
@@ -51,4 +51,4 @@ - \ No newline at end of file + diff --git a/panel/views/tools/info.php b/panel/views/tools/info.php index 00bbdd0dd..8ce794b75 100644 --- a/panel/views/tools/info.php +++ b/panel/views/tools/info.php @@ -1,9 +1,9 @@ layout('@panel.panel') ?> -
+
icon('toolbox') ?>
translate('panel.tools.tools') ?>
-
+ @@ -44,4 +44,4 @@
-
\ No newline at end of file +
diff --git a/panel/views/tools/updates.php b/panel/views/tools/updates.php index 7c10e7418..8ba2093fb 100644 --- a/panel/views/tools/updates.php +++ b/panel/views/tools/updates.php @@ -1,9 +1,9 @@ layout('@panel.panel') ?> -
+
icon('toolbox') ?>
translate('panel.tools.tools') ?>
-
+ @@ -25,4 +25,4 @@

Formwork translate('panel.updates.latestVersionAvailable') ?>

- \ No newline at end of file + diff --git a/panel/views/users/index.php b/panel/views/users/index.php index 1bc57656c..83e8c77b3 100644 --- a/panel/views/users/index.php +++ b/panel/views/users/index.php @@ -2,13 +2,13 @@ modals()->addMultiple(['newUser', 'deleteUser']) ?> -
+
icon('users') ?>
translate('panel.users.users') ?> count() ?>
-
+
-
\ No newline at end of file + From 3eed7e01571dcf6a9790edc91ae5577823b953f3 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 19:29:18 +0100 Subject: [PATCH 15/23] Update _pages-tree.scss --- panel/src/scss/components/_pages-tree.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panel/src/scss/components/_pages-tree.scss b/panel/src/scss/components/_pages-tree.scss index 486de6873..5ce5e2c97 100644 --- a/panel/src/scss/components/_pages-tree.scss +++ b/panel/src/scss/components/_pages-tree.scss @@ -41,7 +41,7 @@ .pages-tree-root { border-radius: var(--border-radius); - background-color: var(--color-base-800); + background-color: var(--color-base-700); } .pages-tree-root:not(:has(> .has-children)) .pages-tree-children-toggle { From 7406e7216694b77c2c2d301a72c3eb3b46c7fe8b Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 20:37:53 +0100 Subject: [PATCH 16/23] Redesign pages header with new breadcrumb and controls Refactors the pages index header to use a new breadcrumb navigation, improved search bar, and updated action controls. Updates SCSS to add styles for the new header layout, breadcrumb, search, and action elements, providing a more modern and organized UI. --- panel/src/scss/components/_panel.scss | 303 ++++++++++++++++++++++++++ panel/views/pages/index.php | 73 ++++--- 2 files changed, 340 insertions(+), 36 deletions(-) diff --git a/panel/src/scss/components/_panel.scss b/panel/src/scss/components/_panel.scss index 29df18995..c9f29f54a 100644 --- a/panel/src/scss/components/_panel.scss +++ b/panel/src/scss/components/_panel.scss @@ -25,6 +25,309 @@ } } +.panel-header-breadcrumb { + display: flex; + align-items: center; + gap: 0.5rem; + flex: 1; + min-width: 0; + font-size: var(--font-size-sm); + + > .icon { + width: 1rem; + height: 1rem; + color: var(--color-base-400); + flex-shrink: 0; + } + + > span { + font-weight: 600; + white-space: nowrap; + } + + .breadcrumb-separator { + color: var(--color-base-500); + flex-shrink: 0; + } + + .breadcrumb-link { + display: flex; + align-items: center; + gap: 0.375rem; + padding: 0.25rem 0.5rem; + border-radius: var(--border-radius); + color: var(--color-base-300); + transition: background-color var(--transition-time-sm), color var(--transition-time-sm); + white-space: nowrap; + overflow: hidden; + + &:hover { + background-color: var(--color-base-700); + color: var(--color-base-100); + } + + .icon { + width: 0.875rem; + height: 0.875rem; + flex-shrink: 0; + } + + span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + } +} + +.panel-header-search { + display: flex; + align-items: center; + gap: 0.75rem; + flex: 1; + max-width: 600px; + margin: 0 1rem; + + @media (max-width: map.get($breakpoints, "lg")) { + max-width: 400px; + margin: 0 0.5rem; + gap: 0.5rem; + } + + @media (max-width: map.get($breakpoints, "md")) { + display: none; // Hide on mobile to save space + } + + .form-input-wrap { + flex: 1; + min-width: 200px; + margin: 0; + + @media (max-width: map.get($breakpoints, "lg")) { + min-width: 150px; + } + } + + .form-input { + background-color: var(--color-base-700); + border-color: var(--color-base-600); + color: var(--color-base-100); + font-size: var(--font-size-sm); + padding: 0.375rem 0.625rem 0.375rem 2rem; + + &::placeholder { + color: var(--color-base-400); + } + + &:focus { + background-color: var(--color-base-650); + border-color: var(--color-accent-500); + } + } + + .form-input-icon { + color: var(--color-base-400); + } + + .pages-tree-controls { + display: flex; + gap: 0.375rem; + flex-shrink: 0; + + .button { + padding: 0.375rem 0.5rem; + min-width: auto; + + .icon { + width: 1rem; + height: 1rem; + margin: 0; + } + } + } +} + +.panel-header-actions { + display: flex; + align-items: center; + gap: 0.5rem; + flex-shrink: 0; +} + +.pages-view-toggle { + display: flex; + gap: 0.25rem; + padding: 0.25rem; + background-color: var(--color-base-700); + border-radius: var(--border-radius); + + .button { + padding: 0.375rem 0.5rem; + background-color: transparent; + border: none; + color: var(--color-base-400); + transition: all var(--transition-time-sm); + + &:hover { + background-color: var(--color-base-650); + color: var(--color-base-200); + } + + &.active { + background-color: var(--color-base-600); + color: var(--color-base-100); + } + + .icon { + width: 1rem; + height: 1rem; + margin: 0; + } + } +} + +// Page editor header styles +.panel-header-page-info { + display: flex; + align-items: center; + gap: 0.75rem; + flex: 1; + min-width: 0; +} + +.panel-header-page-icon { + position: relative; + display: flex; + align-items: center; + justify-content: center; + width: 2rem; + height: 2rem; + flex-shrink: 0; + + > .icon { + width: 1.25rem; + height: 1.25rem; + color: var(--color-base-300); + } +} + +.panel-header-page-title { + display: flex; + flex-direction: column; + gap: 0.25rem; + min-width: 0; + flex: 1; +} + +.panel-header-page-title-text { + font-size: var(--font-size-md); + font-weight: 600; + color: var(--color-base-100); + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.panel-header-page-meta { + display: flex; + align-items: center; + gap: 0.5rem; + font-size: var(--font-size-xs); + color: var(--color-base-400); +} + +.panel-header-page-route { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +// Page editor form spacing +#page-editor-form { + margin-top: 1.5rem; +} + +.panel-main { + padding-top: 3rem; + + @media (min-width: map.get($breakpoints, "md")) { + padding: 0.75rem; + padding-top: 3rem; + padding-left: 13.75rem; + } +} + +// Breadcrumb styling +.panel-breadcrumb { + display: flex; + align-items: center; + gap: 0.5rem; + color: var(--color-base-300); + font-size: var(--font-size-sm); + + a { + color: var(--color-base-300); + transition: color var(--transition-time-sm); + + &:hover { + color: var(--color-base-100); + } + } + + .icon { + width: 1rem; + height: 1rem; + } +} + +.panel-breadcrumb-separator { + color: var(--color-base-500); +} + +.panel-breadcrumb-current { + color: var(--color-base-100); + font-weight: 500; +} + +// Page title in header +.panel-page-title { + display: flex; + align-items: center; + gap: 0.5rem; + color: var(--color-base-100); + font-size: var(--font-size-md); + font-weight: 600; +} + +// Header actions +.panel-header-actions { + display: flex; + align-items: center; + gap: 0.5rem; + margin-left: auto; +} + +// Status badge in header +.panel-status-badge { + display: inline-flex; + align-items: center; + gap: 0.375rem; + padding: 0.25rem 0.625rem; + border-radius: 12px; + font-size: var(--font-size-xs); + font-weight: 500; + + &.status-published { + background-color: rgba(46, 204, 112, 0.15); + color: var(--color-success-500); + } + + &.status-draft { + background-color: rgba(243, 156, 17, 0.15); + color: var(--color-warning-500); + } +} + .panel-user-card { display: flex; align-items: center; diff --git a/panel/views/pages/index.php b/panel/views/pages/index.php index dce9450d5..cf1562f12 100644 --- a/panel/views/pages/index.php +++ b/panel/views/pages/index.php @@ -1,33 +1,47 @@ layout('@panel.panel') ?>
-
-
-
icon('pages') ?>
-
translate('panel.pages.pages') ?>
- ancestors()->reverse()->with($parent) as $page) : ?> -
/
- isSite()) : ?> -
icon('globe') ?>
- - -
icon($page->icon()) ?>
- - - +
+ icon('pages') ?> + translate('panel.pages.pages') ?> + ancestors()->reverse()->with($parent) as $page) : ?> + / + isSite()) : ?> + + icon('globe') ?> + translate('panel.options.site') ?> + + + + icon($page->icon()) ?> + escape($page->title()) ?> + + + +
+ + -
+ +
-
- - -
- + + +
user()->permissions()->has('panel.pages.create')) : ?> @@ -36,18 +50,5 @@
-
-
-
- icon('search') ?> - -
-
-
- - - -
-
From c04f5a7afdaea97e9c987b736fa551db55c5cd6d Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 20:40:33 +0100 Subject: [PATCH 17/23] Update index.php --- panel/views/pages/index.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/panel/views/pages/index.php b/panel/views/pages/index.php index cf1562f12..14206e4ba 100644 --- a/panel/views/pages/index.php +++ b/panel/views/pages/index.php @@ -49,6 +49,6 @@ -
+
From dbc3ea0d679a87286b7fc61b64d446ca5459a110 Mon Sep 17 00:00:00 2001 From: Darky <106143794+DarkLite25@users.noreply.github.com> Date: Fri, 19 Dec 2025 20:53:27 +0100 Subject: [PATCH 18/23] Update panel styles and rename blog/about page directories Adjusted background and border colors in panel SCSS for improved UI consistency, and added spacing to the page editor form. Updated the page editor form to use an ID for styling. Renamed blog and about page directories from '2-blog' to '1-blog' and '1-about' to '2-about' for better organization. --- panel/src/scss/components/_pages-tree.scss | 2 +- panel/src/scss/components/_panel.scss | 9 +++++++-- panel/views/pages/editor.php | 2 +- .../nasa-vhsz50aafas-unsplash.jpg | Bin .../{2-blog => 1-blog}/20180615-hello-world/post.md | 0 .../20220624-coffee-mornings-and-ideas/post.md | 0 .../vruyr-martirosyan-0n632k-mow4-unsplash.jpg | Bin .../20250505-a-walk-in-the-park/post.md | 0 .../spencer-demera-opsimocytr0-unsplash.jpg | Bin site/pages/{2-blog => 1-blog}/blog.md | 0 site/pages/{1-about => 2-about}/page.md | 0 11 files changed, 9 insertions(+), 4 deletions(-) rename site/pages/{2-blog => 1-blog}/20180615-hello-world/nasa-vhsz50aafas-unsplash.jpg (100%) rename site/pages/{2-blog => 1-blog}/20180615-hello-world/post.md (100%) rename site/pages/{2-blog => 1-blog}/20220624-coffee-mornings-and-ideas/post.md (100%) rename site/pages/{2-blog => 1-blog}/20220624-coffee-mornings-and-ideas/vruyr-martirosyan-0n632k-mow4-unsplash.jpg (100%) rename site/pages/{2-blog => 1-blog}/20250505-a-walk-in-the-park/post.md (100%) rename site/pages/{2-blog => 1-blog}/20250505-a-walk-in-the-park/spencer-demera-opsimocytr0-unsplash.jpg (100%) rename site/pages/{2-blog => 1-blog}/blog.md (100%) rename site/pages/{1-about => 2-about}/page.md (100%) diff --git a/panel/src/scss/components/_pages-tree.scss b/panel/src/scss/components/_pages-tree.scss index 5ce5e2c97..7855b292e 100644 --- a/panel/src/scss/components/_pages-tree.scss +++ b/panel/src/scss/components/_pages-tree.scss @@ -41,7 +41,7 @@ .pages-tree-root { border-radius: var(--border-radius); - background-color: var(--color-base-700); + background-color: var(--color-base-600); } .pages-tree-root:not(:has(> .has-children)) .pages-tree-children-toggle { diff --git a/panel/src/scss/components/_panel.scss b/panel/src/scss/components/_panel.scss index c9f29f54a..5b3569cba 100644 --- a/panel/src/scss/components/_panel.scss +++ b/panel/src/scss/components/_panel.scss @@ -13,8 +13,8 @@ align-items: center; padding: 0.625rem 0.75rem; padding-left: 3rem; - background-color: var(--color-base-850); - border-bottom: 1px solid var(--color-base-800); + background-color: var(--color-base-900); + border-bottom: 1px solid var(--color-base-700); color: var(--color-base-100); font-weight: 500; font-size: var(--font-size-sm); @@ -370,6 +370,11 @@ font-size: var(--font-size-sm); } +// Page editor form spacing +#page-editor-form { + margin-top: 0.5rem; +} + .panel-main { padding-top: 3.5rem; @media (min-width: map.get($breakpoints, "md")) { diff --git a/panel/views/pages/editor.php b/panel/views/pages/editor.php index ccf3b3d9f..575a78a8b 100644 --- a/panel/views/pages/editor.php +++ b/panel/views/pages/editor.php @@ -2,7 +2,7 @@ modals()->addMultiple(['changes', 'deletePage', 'duplicatePage']) ?> -
+ attr(['hidden' => true, 'aria-hidden' => 'true', 'tabindex' => -1, 'data-command' => 'save', 'formaction' => $history?->isJustCreated() ? '?publish=false' : null]) ?>>
diff --git a/site/pages/2-blog/20180615-hello-world/nasa-vhsz50aafas-unsplash.jpg b/site/pages/1-blog/20180615-hello-world/nasa-vhsz50aafas-unsplash.jpg similarity index 100% rename from site/pages/2-blog/20180615-hello-world/nasa-vhsz50aafas-unsplash.jpg rename to site/pages/1-blog/20180615-hello-world/nasa-vhsz50aafas-unsplash.jpg diff --git a/site/pages/2-blog/20180615-hello-world/post.md b/site/pages/1-blog/20180615-hello-world/post.md similarity index 100% rename from site/pages/2-blog/20180615-hello-world/post.md rename to site/pages/1-blog/20180615-hello-world/post.md diff --git a/site/pages/2-blog/20220624-coffee-mornings-and-ideas/post.md b/site/pages/1-blog/20220624-coffee-mornings-and-ideas/post.md similarity index 100% rename from site/pages/2-blog/20220624-coffee-mornings-and-ideas/post.md rename to site/pages/1-blog/20220624-coffee-mornings-and-ideas/post.md diff --git a/site/pages/2-blog/20220624-coffee-mornings-and-ideas/vruyr-martirosyan-0n632k-mow4-unsplash.jpg b/site/pages/1-blog/20220624-coffee-mornings-and-ideas/vruyr-martirosyan-0n632k-mow4-unsplash.jpg similarity index 100% rename from site/pages/2-blog/20220624-coffee-mornings-and-ideas/vruyr-martirosyan-0n632k-mow4-unsplash.jpg rename to site/pages/1-blog/20220624-coffee-mornings-and-ideas/vruyr-martirosyan-0n632k-mow4-unsplash.jpg diff --git a/site/pages/2-blog/20250505-a-walk-in-the-park/post.md b/site/pages/1-blog/20250505-a-walk-in-the-park/post.md similarity index 100% rename from site/pages/2-blog/20250505-a-walk-in-the-park/post.md rename to site/pages/1-blog/20250505-a-walk-in-the-park/post.md diff --git a/site/pages/2-blog/20250505-a-walk-in-the-park/spencer-demera-opsimocytr0-unsplash.jpg b/site/pages/1-blog/20250505-a-walk-in-the-park/spencer-demera-opsimocytr0-unsplash.jpg similarity index 100% rename from site/pages/2-blog/20250505-a-walk-in-the-park/spencer-demera-opsimocytr0-unsplash.jpg rename to site/pages/1-blog/20250505-a-walk-in-the-park/spencer-demera-opsimocytr0-unsplash.jpg diff --git a/site/pages/2-blog/blog.md b/site/pages/1-blog/blog.md similarity index 100% rename from site/pages/2-blog/blog.md rename to site/pages/1-blog/blog.md diff --git a/site/pages/1-about/page.md b/site/pages/2-about/page.md similarity index 100% rename from site/pages/1-about/page.md rename to site/pages/2-about/page.md From 5903550c3981b88c27c5b9a3e595861bc478cee8 Mon Sep 17 00:00:00 2001 From: Darky Date: Fri, 19 Dec 2025 23:11:09 +0100 Subject: [PATCH 19/23] Refine files list UI styles and header markup Updated SCSS for the files list to improve spacing, borders, font sizes, and hover effects for better visual clarity. Changed the header markup in files/edit.php from a div to a semantic header element for improved accessibility and structure. --- panel/src/scss/components/_files-list.scss | 31 ++++++++++++++++++---- panel/views/files/edit.php | 4 +-- 2 files changed, 28 insertions(+), 7 deletions(-) diff --git a/panel/src/scss/components/_files-list.scss b/panel/src/scss/components/_files-list.scss index dd1fc1d39..b56f4663e 100644 --- a/panel/src/scss/components/_files-list.scss +++ b/panel/src/scss/components/_files-list.scss @@ -14,16 +14,21 @@ .files-list-headers { display: flex; align-items: center; - padding: 0.25rem 0; - border-bottom: 1px solid var(--color-base-600); - font-size: var(--font-size-sm); + padding: 0.5rem 0.75rem; + border-top: 1px solid var(--color-base-600); + border-bottom: 1px solid var(--color-base-700); + color: var(--color-base-400); + font-size: var(--font-size-xs); font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.03em; @include user-select-none; } .files-headers-cell, .files-item-cell { padding: 0.25rem 0.5rem; + font-size: var(--font-size-sm); } .is-thumbnails .files-items { @@ -36,12 +41,19 @@ position: relative; display: flex; align-items: center; - padding: 0.25rem 0; - border-bottom: 1px solid var(--color-base-600); + padding: 0.375rem 0.75rem; + border-bottom: 1px solid var(--color-base-750); font-size: var(--font-size-sm); + transition: all var(--transition-time-sm); &:hover { background-color: var(--color-base-800); + border-left: 2px solid var(--color-accent-500); + padding-left: calc(0.75rem - 2px); + } + + &:last-child { + border-bottom: 0; } } @@ -55,6 +67,11 @@ .file-name { flex: 1; + padding-left: 2rem; +} + +.file-thumbnail:not([src]) ~ .file-name { + padding-left: 0; } .file-parent { @@ -126,6 +143,10 @@ display: none; } +.file-thumbnail[src] ~ .file-icon { + display: none; +} + .is-thumbnails .files-list-headers { display: none; } diff --git a/panel/views/files/edit.php b/panel/views/files/edit.php index 6b94e688c..71a9e6541 100644 --- a/panel/views/files/edit.php +++ b/panel/views/files/edit.php @@ -3,7 +3,7 @@ modals()->addMultiple(['changes', 'renameFile', 'deleteFile']) ?> -
+
icon(is_null($file->type()) ? 'file' : 'file-' . $file->type()) ?>
@@ -34,7 +34,7 @@
-
+
type() === 'image') : ?>
From a451522568402c7b636cb2f7d687169521f4ce4c Mon Sep 17 00:00:00 2001 From: Darky Date: Fri, 19 Dec 2025 23:26:44 +0100 Subject: [PATCH 20/23] Update files list styles and layout spacing Added border radius and background color to .files-item in SCSS for improved appearance. Changed the container class in files index.php from 'section' to 'mt-4' to adjust vertical spacing. --- panel/src/scss/components/_files-list.scss | 5 +++++ panel/views/files/index.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/panel/src/scss/components/_files-list.scss b/panel/src/scss/components/_files-list.scss index b56f4663e..60376ef24 100644 --- a/panel/src/scss/components/_files-list.scss +++ b/panel/src/scss/components/_files-list.scss @@ -11,6 +11,11 @@ @include user-select-none; } +.files-item { + border-radius: 0; + background-color: var(--color-base-600); +} + .files-list-headers { display: flex; align-items: center; diff --git a/panel/views/files/index.php b/panel/views/files/index.php index 8d2d51e21..7be062bb2 100644 --- a/panel/views/files/index.php +++ b/panel/views/files/index.php @@ -12,7 +12,7 @@
-
+
insert('@panel._files.file.list', ['name' => 'view-files', 'files' => $files, 'columns' => ['parent', 'date', 'size']]) ?>
From 63043479ff9898e24ea6ae2ed8307ca2ae363c81 Mon Sep 17 00:00:00 2001 From: Darky Date: Fri, 19 Dec 2025 23:32:02 +0100 Subject: [PATCH 21/23] Update _files-list.scss --- panel/src/scss/components/_files-list.scss | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/panel/src/scss/components/_files-list.scss b/panel/src/scss/components/_files-list.scss index 60376ef24..a4808ab40 100644 --- a/panel/src/scss/components/_files-list.scss +++ b/panel/src/scss/components/_files-list.scss @@ -72,7 +72,7 @@ .file-name { flex: 1; - padding-left: 2rem; + padding-left: 1.5rem; } .file-thumbnail:not([src]) ~ .file-name { @@ -135,7 +135,7 @@ .file-thumbnail { position: absolute; - left: 0.25rem; + left: 0.5rem; width: 1.5rem; height: 1.5rem; border-radius: var(--border-radius); From 2a213dd35aefd4123e90d8b57f585e01c16c4546 Mon Sep 17 00:00:00 2001 From: Darky Date: Sun, 21 Dec 2025 18:58:44 +0100 Subject: [PATCH 22/23] small fix --- panel/src/scss/components/_files-list.scss | 4 ++-- site/config/system.yaml | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/panel/src/scss/components/_files-list.scss b/panel/src/scss/components/_files-list.scss index a4808ab40..5d8a83dad 100644 --- a/panel/src/scss/components/_files-list.scss +++ b/panel/src/scss/components/_files-list.scss @@ -72,7 +72,7 @@ .file-name { flex: 1; - padding-left: 1.5rem; + padding-left: 2rem; } .file-thumbnail:not([src]) ~ .file-name { @@ -135,7 +135,7 @@ .file-thumbnail { position: absolute; - left: 0.5rem; + left: 0.75rem; width: 1.5rem; height: 1.5rem; border-radius: var(--border-radius); diff --git a/site/config/system.yaml b/site/config/system.yaml index 28a9d2a64..3962d4046 100644 --- a/site/config/system.yaml +++ b/site/config/system.yaml @@ -9,3 +9,5 @@ files: - .avif - .mp4 - .webm +debug: + enabled: true From c34e9127ff4e50e4fcdc2db8f8ef648288b9f2c5 Mon Sep 17 00:00:00 2001 From: Darky Date: Thu, 25 Dec 2025 16:41:43 +0100 Subject: [PATCH 23/23] update to fix scss lints --- panel/src/scss/components/_buttons.scss | 2 +- panel/src/scss/components/_dropdowns.scss | 6 +- panel/src/scss/components/_files-list.scss | 79 ++++++------ panel/src/scss/components/_pages-cards.scss | 135 +++++++++++--------- panel/src/scss/components/_pages-tree.scss | 51 ++++---- panel/src/scss/components/_pages.scss | 102 ++++++++------- panel/src/scss/components/_panel.scss | 108 +++++++--------- panel/src/scss/components/_section.scss | 6 +- panel/src/scss/components/_sidebar.scss | 12 +- panel/src/scss/components/_variables.scss | 8 +- 10 files changed, 257 insertions(+), 252 deletions(-) diff --git a/panel/src/scss/components/_buttons.scss b/panel/src/scss/components/_buttons.scss index 76555c46d..5043d1f3b 100644 --- a/panel/src/scss/components/_buttons.scss +++ b/panel/src/scss/components/_buttons.scss @@ -4,7 +4,6 @@ display: inline-flex; align-items: center; justify-content: center; - gap: 0.375rem; padding: 0.5rem 0.875rem; border: 1px solid transparent; border-radius: var(--border-radius); @@ -14,6 +13,7 @@ font-family: var(--font-family-sans); font-size: var(--font-size-sm); font-weight: 500; + gap: 0.375rem; line-height: 1.15; outline: none; text-align: center; diff --git a/panel/src/scss/components/_dropdowns.scss b/panel/src/scss/components/_dropdowns.scss index ccad33a9f..10e8494a6 100644 --- a/panel/src/scss/components/_dropdowns.scss +++ b/panel/src/scss/components/_dropdowns.scss @@ -32,7 +32,7 @@ border-radius: 8px; margin-top: 0.5rem; background-color: var(--color-base-850); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3); + box-shadow: 0 8px 24px rgb(0 0 0 / 30%); overflow-y: auto; } @@ -43,9 +43,8 @@ .dropdown-item { display: flex; - align-items: center; - gap: 0.5rem; width: 100%; + align-items: center; padding: 0.5rem 0.75rem; border: 0; border-radius: 6px; @@ -54,6 +53,7 @@ cursor: pointer !important; font-family: inherit; font-size: var(--font-size-sm); + gap: 0.5rem; text-align: inherit; white-space: nowrap; diff --git a/panel/src/scss/components/_files-list.scss b/panel/src/scss/components/_files-list.scss index 5d8a83dad..fa931a22a 100644 --- a/panel/src/scss/components/_files-list.scss +++ b/panel/src/scss/components/_files-list.scss @@ -11,11 +11,6 @@ @include user-select-none; } -.files-item { - border-radius: 0; - background-color: var(--color-base-600); -} - .files-list-headers { display: flex; align-items: center; @@ -25,8 +20,8 @@ color: var(--color-base-400); font-size: var(--font-size-xs); font-weight: 600; - text-transform: uppercase; letter-spacing: 0.03em; + text-transform: uppercase; @include user-select-none; } @@ -47,14 +42,16 @@ display: flex; align-items: center; padding: 0.375rem 0.75rem; + border-radius: 0; border-bottom: 1px solid var(--color-base-750); + background-color: var(--color-base-600); font-size: var(--font-size-sm); transition: all var(--transition-time-sm); &:hover { - background-color: var(--color-base-800); - border-left: 2px solid var(--color-accent-500); padding-left: calc(0.75rem - 2px); + border-left: 2px solid var(--color-accent-500); + background-color: var(--color-base-800); } &:last-child { @@ -68,15 +65,45 @@ .file-icon { padding-right: 0.25rem; + + .is-thumbnails & { + position: absolute; + top: 50%; + left: 50%; + padding: 0; + color: var(--color-base-500); + font-size: 4rem; + line-height: 0; + transform: translate(-50%, -50%); + } + + .is-thumbnails .file-thumbnail + & { + display: none; + } } .file-name { flex: 1; padding-left: 2rem; -} -.file-thumbnail:not([src]) ~ .file-name { - padding-left: 0; + .is-thumbnails & { + position: absolute; + bottom: 0.5rem; + left: 50%; + display: block; + max-width: calc(100% - 0.5rem); + padding: 0 0.375rem; + border-radius: var(--border-radius); + background-color: var(--color-tooltip); + font-size: var(--font-size-xs); + text-align: center; + transform: translateX(-50%); + @include user-select-none; + } + + .file-thumbnail:not([src]) ~ & { + padding-left: 0; + } } .file-parent { @@ -167,21 +194,6 @@ background-color: transparent; } -.is-thumbnails .file-name { - position: absolute; - bottom: 0.5rem; - left: 50%; - display: block; - max-width: calc(100% - 0.5rem); - padding: 0 0.375rem; - border-radius: var(--border-radius); - background-color: var(--color-tooltip); - font-size: var(--font-size-xs); - text-align: center; - transform: translateX(-50%); - @include user-select-none; -} - .is-thumbnails .dropdown { position: absolute; top: 0.5rem; @@ -205,18 +217,3 @@ color: inherit; } } - -.is-thumbnails .file-icon { - position: absolute; - top: 50%; - left: 50%; - padding: 0; - color: var(--color-base-500); - font-size: 4rem; - line-height: 0; - transform: translate(-50%, -50%); -} - -.is-thumbnails .file-thumbnail + .file-icon { - display: none; -} diff --git a/panel/src/scss/components/_pages-cards.scss b/panel/src/scss/components/_pages-cards.scss index a9d38223d..ef5a2a6d1 100644 --- a/panel/src/scss/components/_pages-cards.scss +++ b/panel/src/scss/components/_pages-cards.scss @@ -35,9 +35,9 @@ transition: transform var(--transition-time-sm), box-shadow var(--transition-time-sm); &:hover { - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.25); - transform: translateY(-2px); z-index: 10; + box-shadow: 0 8px 24px rgb(0 0 0 / 25%); + transform: translateY(-2px); } &.has-children { @@ -70,26 +70,26 @@ .page-card-badge { position: absolute; + z-index: 2; top: 0.5rem; right: 0.5rem; - z-index: 2; display: flex; align-items: center; - gap: 0.25rem; padding: 0.25rem 0.5rem; border-radius: 12px; - background-color: rgba(0, 0, 0, 0.75); backdrop-filter: blur(4px); + background-color: rgb(0 0 0 / 75%); color: var(--color-base-100); font-size: var(--font-size-xs); font-weight: 500; + gap: 0.25rem; transition: background-color var(--transition-time-sm); &:not(.page-card-badge-static) { cursor: pointer; &:hover { - background-color: rgba(0, 0, 0, 0.9); + background-color: rgb(0 0 0 / 90%); color: var(--color-base-100); } } @@ -106,17 +106,17 @@ .page-card-icon { position: absolute; + z-index: 2; bottom: 0.5rem; left: 0.5rem; - z-index: 2; display: flex; - align-items: center; - justify-content: center; width: 2rem; height: 2rem; + align-items: center; + justify-content: center; border-radius: var(--border-radius); - background-color: rgba(0, 0, 0, 0.75); backdrop-filter: blur(4px); + background-color: rgb(0 0 0 / 75%); color: var(--color-base-100); .icon { @@ -127,10 +127,10 @@ .page-card-thumbnail-placeholder { display: flex; - align-items: center; - justify-content: center; width: 100%; height: 100%; + align-items: center; + justify-content: center; background: linear-gradient(135deg, var(--color-base-600) 0%, var(--color-base-700) 100%); .page-icon { @@ -149,10 +149,10 @@ .page-card-content { position: relative; display: flex; + overflow: visible; flex: 1; flex-direction: column; padding: 0.75rem; - overflow: visible; } .page-card-title { @@ -163,8 +163,8 @@ line-height: 1.3; a { - color: inherit; overflow: hidden; + color: inherit; text-overflow: ellipsis; white-space: nowrap; @@ -181,28 +181,35 @@ .page-icon { position: relative; - justify-content: start; - flex-shrink: 0; width: 1.2rem; height: 1.2rem; + flex-shrink: 0; + justify-content: start; background-color: var(--color-base-700); } + // stylelint-disable-next-line no-descending-specificity a { - flex: 1; - min-width: 0; overflow: hidden; + min-width: 0; + flex: 1; text-overflow: ellipsis; white-space: nowrap; } + + // stylelint-disable-next-line no-descending-specificity + .icon { + width: 0.75rem; + height: 0.75rem; + } } .page-card-meta { display: flex; align-items: center; - gap: 0.5rem; color: var(--color-base-300); font-size: var(--font-size-xs); + gap: 0.5rem; } .page-card-date { @@ -249,6 +256,18 @@ display: flex; gap: 0.25rem; + .dropdown { + position: relative; + } +} + +.pages-list-actions { + display: flex; + gap: 0.25rem; + opacity: 0; + transition: opacity var(--transition-time-sm); + + // stylelint-disable-next-line no-descending-specificity .button { padding: 0.25rem; border: 0; @@ -260,10 +279,6 @@ color: var(--color-base-100); } } - - .dropdown { - position: relative; - } } // === @@ -272,37 +287,39 @@ .pages-view-toggle { display: flex; - gap: 0.125rem; padding: 0.25rem; border-radius: var(--border-radius); background-color: var(--color-base-700); -} + gap: 0.125rem; -.pages-view-toggle .button { - display: flex; - align-items: center; - justify-content: center; - padding: 0.5rem; - border: 0; - border-radius: var(--border-radius); - background-color: transparent; - color: var(--color-base-400); - transition: all var(--transition-time-sm); + // stylelint-disable-next-line no-descending-specificity + .button { + display: flex; + align-items: center; + justify-content: center; + padding: 0.5rem; + border: 0; + border-radius: var(--border-radius); + background-color: transparent; + color: var(--color-base-400); + transition: all var(--transition-time-sm); - .icon { - width: 1rem; - height: 1rem; - margin: 0; - } + // stylelint-disable-next-line no-descending-specificity + .icon { + width: 1rem; + height: 1rem; + margin: 0; + } - &:hover { - background-color: var(--color-base-600); - color: var(--color-base-200); - } + &:hover { + background-color: var(--color-base-600); + color: var(--color-base-200); + } - &.active { - background-color: var(--color-base-600); - color: var(--color-base-100); + &.active { + background-color: var(--color-base-600); + color: var(--color-base-100); + } } } @@ -352,6 +369,7 @@ color: var(--color-base-300); text-align: center; + // stylelint-disable-next-line no-descending-specificity .icon { width: 3rem; height: 3rem; @@ -373,10 +391,10 @@ .pages-list-item { display: flex; align-items: center; - gap: 0.75rem; padding: 0.5rem 0.75rem; border-radius: var(--border-radius); background-color: var(--color-base-700); + gap: 0.75rem; transition: background-color var(--transition-time-sm); &:hover { @@ -394,14 +412,15 @@ .pages-list-icon { display: flex; - align-items: center; - justify-content: center; width: 2rem; height: 2rem; flex-shrink: 0; + align-items: center; + justify-content: center; border-radius: var(--border-radius); background-color: var(--color-base-600); + // stylelint-disable-next-line no-descending-specificity .icon { width: 1rem; height: 1rem; @@ -410,8 +429,8 @@ } .pages-list-content { - flex: 1; min-width: 0; + flex: 1; } .pages-list-title { @@ -421,6 +440,7 @@ text-overflow: ellipsis; white-space: nowrap; + // stylelint-disable-next-line no-descending-specificity a { color: inherit; @@ -432,8 +452,8 @@ .pages-list-status { display: flex; - align-items: center; flex-shrink: 0; + align-items: center; gap: 0.5rem; .status-indicator { @@ -443,13 +463,6 @@ } } -.pages-list-actions { - display: flex; - gap: 0.25rem; - opacity: 0; - transition: opacity var(--transition-time-sm); -} - // === // Drafts/Published Split View (Kirby Blog style) // === @@ -480,8 +493,8 @@ color: var(--color-base-200); font-size: var(--font-size-sm); font-weight: 600; - text-transform: uppercase; letter-spacing: 0.05em; + text-transform: uppercase; } // === @@ -490,10 +503,10 @@ .pages-tabs { display: flex; - gap: 1.5rem; padding-bottom: 0.75rem; border-bottom: 1px solid var(--color-base-600); margin-bottom: 1.5rem; + gap: 1.5rem; } .pages-tab { diff --git a/panel/src/scss/components/_pages-tree.scss b/panel/src/scss/components/_pages-tree.scss index 7855b292e..d0e15fbcc 100644 --- a/panel/src/scss/components/_pages-tree.scss +++ b/panel/src/scss/components/_pages-tree.scss @@ -56,8 +56,8 @@ color: var(--color-base-400); font-size: var(--font-size-xs); font-weight: 600; - text-transform: uppercase; letter-spacing: 0.03em; + text-transform: uppercase; @include user-select-none; } @@ -69,9 +69,9 @@ transition: all var(--transition-time-sm); &:hover { - background-color: var(--color-base-800); - border-left: 2px solid var(--color-accent-500); padding-left: calc(0.75rem - 2px); + border-left: 2px solid var(--color-accent-500); + background-color: var(--color-base-800); } &:hover .page-actions .button { @@ -144,23 +144,27 @@ min-width: 1rem; } -.pages-tree-children-toggle .button { - padding: 0; - border: 0; - color: var(--color-base-400); - cursor: pointer; - - & .icon { - width: 0.875rem; - height: 0.875rem; - margin-right: 0; - transition: - transform var(--transition-time-sm), - color var(--transition-time-sm); - } +.pages-tree-children-toggle { + // stylelint-disable-next-line no-descending-specificity + .button { + padding: 0; + border: 0; + color: var(--color-base-400); + cursor: pointer; + + & .icon { + width: 0.875rem; + height: 0.875rem; + margin-right: 0; + transition: + transform var(--transition-time-sm), + color var(--transition-time-sm); + } - &:hover { - color: var(--color-base-200); + // stylelint-disable-next-line no-descending-specificity + &:hover { + color: var(--color-base-200); + } } } @@ -239,9 +243,10 @@ .pages-tree-controls { display: flex; gap: 0.5rem; -} -.pages-tree-controls .button { - padding: 0.375rem 0.75rem; - font-size: var(--font-size-sm); + // stylelint-disable-next-line no-descending-specificity + .button { + padding: 0.375rem 0.75rem; + font-size: var(--font-size-sm); + } } diff --git a/panel/src/scss/components/_pages.scss b/panel/src/scss/components/_pages.scss index 7f3223748..a4b5f6779 100644 --- a/panel/src/scss/components/_pages.scss +++ b/panel/src/scss/components/_pages.scss @@ -79,17 +79,51 @@ } } +.pages-view-toggle { + display: flex; + padding: .25rem; + border-radius: var(--border-radius); + background-color: var(--color-base-700); + gap: .25rem; + + // stylelint-disable-next-line no-descending-specificity + .button { + padding: .375rem .5rem; + border: none; + background-color: rgb(0 0 0 / 0%); + color: var(--color-base-400); + transition: all var(--transition-time-sm); + + &:hover { + background-color: var(--color-base-650); + color: var(--color-base-200); + } + + &.active { + background-color: var(--color-base-600); + color: var(--color-base-100); + } + + // stylelint-disable-next-line no-descending-specificity + .icon { + width: 1rem; + height: 1rem; + margin: 0; + } + } +} + .page-info { position: absolute; z-index: 8; + top: 100%; + left: 0; display: none; + min-width: 200px; padding: 0.5rem; border: 1px solid var(--color-base-600); border-radius: var(--border-radius); margin-top: 0.25rem; - top: 100%; - left: 0; - min-width: 200px; background-color: var(--color-base-800); box-shadow: var(--box-shadow-md); } @@ -97,35 +131,37 @@ .page-icon { position: relative; display: flex; - align-items: center; - justify-content: center; width: 1.75rem; height: 1.75rem; flex-shrink: 0; + align-items: center; + justify-content: center; border-radius: var(--border-radius); background-color: var(--color-base-700); -} -.page-icon > .icon { - width: 1rem; - height: 1rem; - color: var(--color-base-400); - vertical-align: middle; + // stylelint-disable-next-line no-descending-specificity + > .icon { + width: 1rem; + height: 1rem; + color: var(--color-base-400); + vertical-align: middle; + } } .page-thumbnail { position: absolute; top: 0; left: 0; + overflow: hidden; width: 100%; height: 100%; border-radius: var(--border-radius); object-fit: cover; - overflow: hidden; -} -.page-thumbnail + .icon { - display: none; + // stylelint-disable-next-line no-descending-specificity + + .icon { + display: none; + } } .page-icon:hover .page-info, @@ -165,43 +201,11 @@ // Page search .page-search { - background-color: var(--color-base-700); border-color: var(--color-base-600); + background-color: var(--color-base-700); &:focus { - background-color: var(--color-base-800); border-color: var(--color-accent-500); + background-color: var(--color-base-800); } } - -.pages-view-toggle { - display: flex; - gap: .25rem; - padding: .25rem; - background-color: var(--color-base-700); - border-radius: var(--border-radius) -} - -.pages-view-toggle .button { - padding: .375rem .5rem; - background-color: rgba(0,0,0,0); - border: none; - color: var(--color-base-400); - transition: all var(--transition-time-sm) -} - -.pages-view-toggle .button:hover { - background-color: var(--color-base-650); - color: var(--color-base-200) -} - -.pages-view-toggle .button.active { - background-color: var(--color-base-600); - color: var(--color-base-100) -} - -.pages-view-toggle .button .icon { - width: 1rem; - height: 1rem; - margin: 0 -} diff --git a/panel/src/scss/components/_panel.scss b/panel/src/scss/components/_panel.scss index 5b3569cba..2a29fffed 100644 --- a/panel/src/scss/components/_panel.scss +++ b/panel/src/scss/components/_panel.scss @@ -13,11 +13,11 @@ align-items: center; padding: 0.625rem 0.75rem; padding-left: 3rem; - background-color: var(--color-base-900); border-bottom: 1px solid var(--color-base-700); + background-color: var(--color-base-900); color: var(--color-base-100); - font-weight: 500; font-size: var(--font-size-sm); + font-weight: 500; @include user-select-none; @media (min-width: map.get($breakpoints, "md")) { left: 14rem; @@ -27,17 +27,18 @@ .panel-header-breadcrumb { display: flex; - align-items: center; - gap: 0.5rem; - flex: 1; min-width: 0; + flex: 1; + align-items: center; font-size: var(--font-size-sm); + gap: 0.5rem; + // stylelint-disable-next-line no-descending-specificity > .icon { width: 1rem; height: 1rem; - color: var(--color-base-400); flex-shrink: 0; + color: var(--color-base-400); } > span { @@ -46,20 +47,20 @@ } .breadcrumb-separator { - color: var(--color-base-500); flex-shrink: 0; + color: var(--color-base-500); } .breadcrumb-link { display: flex; + overflow: hidden; align-items: center; - gap: 0.375rem; padding: 0.25rem 0.5rem; border-radius: var(--border-radius); color: var(--color-base-300); + gap: 0.375rem; transition: background-color var(--transition-time-sm), color var(--transition-time-sm); white-space: nowrap; - overflow: hidden; &:hover { background-color: var(--color-base-700); @@ -82,11 +83,11 @@ .panel-header-search { display: flex; - align-items: center; - gap: 0.75rem; - flex: 1; max-width: 600px; + flex: 1; + align-items: center; margin: 0 1rem; + gap: 0.75rem; @media (max-width: map.get($breakpoints, "lg")) { max-width: 400px; @@ -99,8 +100,8 @@ } .form-input-wrap { - flex: 1; min-width: 200px; + flex: 1; margin: 0; @media (max-width: map.get($breakpoints, "lg")) { @@ -109,19 +110,19 @@ } .form-input { - background-color: var(--color-base-700); + padding: 0.375rem 0.625rem 0.375rem 2rem; border-color: var(--color-base-600); + background-color: var(--color-base-700); color: var(--color-base-100); font-size: var(--font-size-sm); - padding: 0.375rem 0.625rem 0.375rem 2rem; &::placeholder { color: var(--color-base-400); } &:focus { - background-color: var(--color-base-650); border-color: var(--color-accent-500); + background-color: var(--color-base-650); } } @@ -131,13 +132,15 @@ .pages-tree-controls { display: flex; - gap: 0.375rem; flex-shrink: 0; + gap: 0.375rem; + // stylelint-disable-next-line no-descending-specificity .button { - padding: 0.375rem 0.5rem; min-width: auto; + padding: 0.375rem 0.5rem; + // stylelint-disable-next-line no-descending-specificity .icon { width: 1rem; height: 1rem; @@ -149,22 +152,24 @@ .panel-header-actions { display: flex; + flex-shrink: 0; align-items: center; + margin-left: auto; gap: 0.5rem; - flex-shrink: 0; } .pages-view-toggle { display: flex; - gap: 0.25rem; padding: 0.25rem; - background-color: var(--color-base-700); border-radius: var(--border-radius); + background-color: var(--color-base-700); + gap: 0.25rem; + // stylelint-disable-next-line no-descending-specificity .button { padding: 0.375rem 0.5rem; - background-color: transparent; border: none; + background-color: transparent; color: var(--color-base-400); transition: all var(--transition-time-sm); @@ -178,6 +183,7 @@ color: var(--color-base-100); } + // stylelint-disable-next-line no-descending-specificity .icon { width: 1rem; height: 1rem; @@ -189,21 +195,22 @@ // Page editor header styles .panel-header-page-info { display: flex; + min-width: 0; + flex: 1; align-items: center; gap: 0.75rem; - flex: 1; - min-width: 0; } .panel-header-page-icon { position: relative; display: flex; - align-items: center; - justify-content: center; width: 2rem; height: 2rem; flex-shrink: 0; + align-items: center; + justify-content: center; + // stylelint-disable-next-line no-descending-specificity > .icon { width: 1.25rem; height: 1.25rem; @@ -213,17 +220,17 @@ .panel-header-page-title { display: flex; - flex-direction: column; - gap: 0.25rem; min-width: 0; flex: 1; + flex-direction: column; + gap: 0.25rem; } .panel-header-page-title-text { + overflow: hidden; + color: var(--color-base-100); font-size: var(--font-size-md); font-weight: 600; - color: var(--color-base-100); - overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } @@ -231,9 +238,9 @@ .panel-header-page-meta { display: flex; align-items: center; - gap: 0.5rem; - font-size: var(--font-size-xs); color: var(--color-base-400); + font-size: var(--font-size-xs); + gap: 0.5rem; } .panel-header-page-route { @@ -242,28 +249,13 @@ white-space: nowrap; } -// Page editor form spacing -#page-editor-form { - margin-top: 1.5rem; -} - -.panel-main { - padding-top: 3rem; - - @media (min-width: map.get($breakpoints, "md")) { - padding: 0.75rem; - padding-top: 3rem; - padding-left: 13.75rem; - } -} - // Breadcrumb styling .panel-breadcrumb { display: flex; align-items: center; - gap: 0.5rem; color: var(--color-base-300); font-size: var(--font-size-sm); + gap: 0.5rem; a { color: var(--color-base-300); @@ -274,6 +266,7 @@ } } + // stylelint-disable-next-line no-descending-specificity .icon { width: 1rem; height: 1rem; @@ -293,37 +286,29 @@ .panel-page-title { display: flex; align-items: center; - gap: 0.5rem; color: var(--color-base-100); font-size: var(--font-size-md); font-weight: 600; -} - -// Header actions -.panel-header-actions { - display: flex; - align-items: center; gap: 0.5rem; - margin-left: auto; } // Status badge in header .panel-status-badge { display: inline-flex; align-items: center; - gap: 0.375rem; padding: 0.25rem 0.625rem; border-radius: 12px; font-size: var(--font-size-xs); font-weight: 500; + gap: 0.375rem; &.status-published { - background-color: rgba(46, 204, 112, 0.15); + background-color: rgb(46 204 112 / 15%); color: var(--color-success-500); } &.status-draft { - background-color: rgba(243, 156, 17, 0.15); + background-color: rgb(243 156 17 / 15%); color: var(--color-warning-500); } } @@ -331,9 +316,9 @@ .panel-user-card { display: flex; align-items: center; + justify-content: center; margin-bottom: 2rem; cursor: pointer; - justify-content: center; } .panel-user-image { @@ -370,11 +355,12 @@ font-size: var(--font-size-sm); } -// Page editor form spacing +// Page editor form spacing (consolidated) #page-editor-form { margin-top: 0.5rem; } +// Panel main (consolidated) .panel-main { padding-top: 3.5rem; @media (min-width: map.get($breakpoints, "md")) { diff --git a/panel/src/scss/components/_section.scss b/panel/src/scss/components/_section.scss index f932af9e1..1b1b50f4a 100644 --- a/panel/src/scss/components/_section.scss +++ b/panel/src/scss/components/_section.scss @@ -4,11 +4,11 @@ @use "sass:map"; .section { - padding: 1rem 1rem; - margin-bottom: 1rem; - background-color: var(--color-base-850); + padding: 1rem; border: 1px solid var(--color-base-700); border-radius: var(--border-radius); + margin-bottom: 1rem; + background-color: var(--color-base-850); @media (min-width: map.get($breakpoints, "sm")) { padding: 1.25rem 1.5rem; diff --git a/panel/src/scss/components/_sidebar.scss b/panel/src/scss/components/_sidebar.scss index 62e451311..f251ce7c9 100644 --- a/panel/src/scss/components/_sidebar.scss +++ b/panel/src/scss/components/_sidebar.scss @@ -8,8 +8,8 @@ left: 0; width: 14rem; padding: 0.75rem 1rem; - background: var(--color-base-900); border-right: 1px solid var(--color-base-700); + background: var(--color-base-900); @include user-select-none; } @@ -52,13 +52,13 @@ position: relative; display: flex; align-items: center; - gap: 0.75rem; padding: 0.625rem 0.75rem; + border-radius: 6px; margin: 0; margin-bottom: 0.125rem; - border-radius: 6px; color: var(--color-base-400); font-size: var(--font-size-sm); + gap: 0.75rem; transition: all var(--transition-time-sm); &:hover { @@ -81,14 +81,14 @@ } .sidebar-navigation > li .badge { - margin-left: auto; flex-shrink: 0; + margin-left: auto; } .sidebar-navigation > .active { + padding-left: calc(0.75rem - 3px); + border-left: 3px solid var(--color-accent-500); background-color: var(--color-base-800); color: var(--color-base-100); font-weight: 500; - border-left: 3px solid var(--color-accent-500); - padding-left: calc(0.75rem - 3px); } diff --git a/panel/src/scss/components/_variables.scss b/panel/src/scss/components/_variables.scss index 4114b1597..9a5507787 100644 --- a/panel/src/scss/components/_variables.scss +++ b/panel/src/scss/components/_variables.scss @@ -47,8 +47,8 @@ $color-shadow-lg: rgba($color-blue-100, 15%); --color-shadow-md: #{$color-shadow-md}; --color-shadow-lg: #{$color-shadow-lg}; - --color-tooltip-inverted: #{rgba($color-base-light-100, 0.875)}; - --color-tooltip: #{rgba($color-base-light-600, 0.875)}; + --color-tooltip-inverted: #{rgba(#{$color-base-light-100}, 0.875)}; + --color-tooltip: #{rgba(#{$color-base-light-600}, 0.875)}; --color-base-100: #{$color-base-light-100}; --color-base-200: #{$color-base-light-200}; @@ -149,8 +149,8 @@ $color-shadow-lg: rgba($color-blue-100, 15%); --color-base-850: #{$color-base-dark-850}; --color-base-900: #{$color-base-dark-900}; - --color-tooltip-inverted: #{rgba($color-base-dark-100, 0.875)}; - --color-tooltip: #{rgba($color-base-dark-600, 0.875)}; + --color-tooltip-inverted: #{rgba(#{$color-base-dark-100}, 0.875)}; + --color-tooltip: #{rgba(#{$color-base-dark-600}, 0.875)}; } /* stylelint-enable */