From 78e185a281b7550ada8f04c3290ee20f533db883 Mon Sep 17 00:00:00 2001 From: Corentin Thomasset Date: Thu, 14 Aug 2025 23:51:29 +0200 Subject: [PATCH] wip --- README.md | 1 - apps/it-tools/.gitignore | 24 + apps/it-tools/README.md | 47 + apps/it-tools/astro.config.mjs | 32 + .../app => apps/it-tools}/components.json | 9 +- apps/it-tools/package-lock.json | 814 ++ apps/it-tools/package.json | 31 + apps/it-tools/public/favicon.ico | Bin 0 -> 15406 bytes apps/it-tools/public/favicon.svg | 9 + apps/it-tools/src/assets/app.css | 75 + apps/it-tools/src/components/footer.astro | 103 + apps/it-tools/src/components/header.astro | 60 + .../src/components/language-picker.tsx | 30 + apps/it-tools/src/components/tool-card.astro | 24 + apps/it-tools/src/components/ui/button.tsx | 66 + .../src/components/ui/dropdown-menu.tsx | 320 + apps/it-tools/src/components/ui/label.tsx | 19 + .../src/components/ui/number-field.tsx | 214 + apps/it-tools/src/components/ui/slider.tsx | 92 + apps/it-tools/src/components/ui/switch.tsx | 84 + apps/it-tools/src/components/ui/textarea.tsx | 28 + apps/it-tools/src/components/ui/textfield.tsx | 126 + apps/it-tools/src/i18n/i18n.models.test.ts | 19 + apps/it-tools/src/i18n/i18n.models.ts | 9 + apps/it-tools/src/i18n/i18n.routing.ts | 8 + apps/it-tools/src/i18n/languages.ts | 9 + apps/it-tools/src/layouts/base.layout.astro | 39 + apps/it-tools/src/libs/cn.ts | 5 + apps/it-tools/src/pages/[...lang]/404.astro | 21 + .../src/pages/[...lang]/[toolSlug].astro | 22 + apps/it-tools/src/pages/[...lang]/index.astro | 72 + .../definitions/token-generator/i18n/en.md | 54 + .../definitions/token-generator/i18n/en.ts | 5 + .../definitions/token-generator/i18n/fr.ts | 5 + .../token-generator.definition.ts | 14 + .../token-generator.entry.astro | 49 + .../token-generator.locales.ts | 7 + .../token-generator/token-generator.models.ts | 33 + .../token-generator/token-generator.tsx | 111 + .../src/tools/definitions/tools.registry.ts | 6 + .../src/tools/definitions/tools.types.ts | 12 + apps/it-tools/tsconfig.json | 18 + apps/it-tools/uno.config.ts | 99 + packages/app/eslint.config.js | 21 - packages/app/index.html | 21 - packages/app/package-lock.json | 2381 ----- packages/app/package.json | 54 - packages/app/public/humans.txt | 4 - packages/app/public/robots.txt | 2 - packages/app/src/app.css | 75 - packages/app/src/client-routes.tsx | 69 - packages/app/src/client.tsx | 43 - packages/app/src/locales/en.json | 73 - packages/app/src/locales/fr.json | 59 - .../command-palette.provider.tsx | 144 - .../app/src/modules/i18n/i18n.constants.ts | 18 - .../app/src/modules/i18n/i18n.provider.tsx | 96 - packages/app/src/modules/i18n/i18n.types.ts | 3 - packages/app/src/modules/pages/home.page.tsx | 87 - .../src/modules/shared/copy/copy-button.tsx | 37 - packages/app/src/modules/shared/copy/copy.ts | 23 - .../app/src/modules/shared/signals.test.ts | 33 - packages/app/src/modules/shared/signals.ts | 13 - .../modules/tools/components/tool-header.tsx | 30 - .../random-port-generator/locales/en.json | 6 - .../random-port-generator.page.tsx | 49 - .../random-port-generator.services.ts | 5 - .../random-port-generator.tool.ts | 9 - .../token-generator/locales/en.json | 10 - .../token-generator/locales/fr.json | 10 - .../token-generator/token-generator.models.ts | 28 - .../token-generator/token-generator.page.tsx | 109 - .../token-generator/token-generator.tool.ts | 9 - .../app/src/modules/tools/pages/tool.page.tsx | 43 - .../app/src/modules/tools/tools.models.ts | 16 - .../app/src/modules/tools/tools.provider.tsx | 35 - .../app/src/modules/tools/tools.registry.ts | 17 - packages/app/src/modules/tools/tools.store.ts | 19 - packages/app/src/modules/tools/tools.types.ts | 6 - .../app/src/modules/ui/components/badge.tsx | 37 - .../app/src/modules/ui/components/button.tsx | 60 - .../app/src/modules/ui/components/card.tsx | 60 - .../app/src/modules/ui/components/command.tsx | 151 - .../app/src/modules/ui/components/dialog.tsx | 122 - .../modules/ui/components/dropdown-menu.tsx | 286 - .../app/src/modules/ui/components/sonner.tsx | 20 - .../app/src/modules/ui/components/switch.tsx | 54 - .../src/modules/ui/components/textarea.tsx | 26 - .../src/modules/ui/components/textfield.tsx | 116 - .../app/src/modules/ui/layouts/app.layout.tsx | 279 - .../ui/layouts/app.layouts.constants.ts | 17 - .../app/src/modules/ui/themes/theme.store.ts | 11 - packages/app/src/modules/ui/utils/cn.ts | 5 - .../templates/tools/new/tool.definition.ejs.t | 12 - .../templates/tools/new/tool.en.locale.ejs.t | 4 - .../new/tool.inject-definition-import.ejs.t | 6 - .../new/tool.inject-definition-register.ejs.t | 6 - .../app/templates/tools/new/tool.page.ejs.t | 14 - packages/app/tsconfig.json | 22 - packages/app/uno.config.ts | 120 - packages/app/vite.config.ts | 33 - pnpm-lock.yaml | 7904 +++++++---------- pnpm-workspace.yaml | 3 +- 103 files changed, 5862 insertions(+), 9988 deletions(-) create mode 100644 apps/it-tools/.gitignore create mode 100644 apps/it-tools/README.md create mode 100644 apps/it-tools/astro.config.mjs rename {packages/app => apps/it-tools}/components.json (57%) create mode 100644 apps/it-tools/package-lock.json create mode 100644 apps/it-tools/package.json create mode 100644 apps/it-tools/public/favicon.ico create mode 100644 apps/it-tools/public/favicon.svg create mode 100644 apps/it-tools/src/assets/app.css create mode 100644 apps/it-tools/src/components/footer.astro create mode 100644 apps/it-tools/src/components/header.astro create mode 100644 apps/it-tools/src/components/language-picker.tsx create mode 100644 apps/it-tools/src/components/tool-card.astro create mode 100644 apps/it-tools/src/components/ui/button.tsx create mode 100644 apps/it-tools/src/components/ui/dropdown-menu.tsx create mode 100644 apps/it-tools/src/components/ui/label.tsx create mode 100644 apps/it-tools/src/components/ui/number-field.tsx create mode 100644 apps/it-tools/src/components/ui/slider.tsx create mode 100644 apps/it-tools/src/components/ui/switch.tsx create mode 100644 apps/it-tools/src/components/ui/textarea.tsx create mode 100644 apps/it-tools/src/components/ui/textfield.tsx create mode 100644 apps/it-tools/src/i18n/i18n.models.test.ts create mode 100644 apps/it-tools/src/i18n/i18n.models.ts create mode 100644 apps/it-tools/src/i18n/i18n.routing.ts create mode 100644 apps/it-tools/src/i18n/languages.ts create mode 100644 apps/it-tools/src/layouts/base.layout.astro create mode 100644 apps/it-tools/src/libs/cn.ts create mode 100644 apps/it-tools/src/pages/[...lang]/404.astro create mode 100644 apps/it-tools/src/pages/[...lang]/[toolSlug].astro create mode 100644 apps/it-tools/src/pages/[...lang]/index.astro create mode 100644 apps/it-tools/src/tools/definitions/token-generator/i18n/en.md create mode 100644 apps/it-tools/src/tools/definitions/token-generator/i18n/en.ts create mode 100644 apps/it-tools/src/tools/definitions/token-generator/i18n/fr.ts create mode 100644 apps/it-tools/src/tools/definitions/token-generator/token-generator.definition.ts create mode 100644 apps/it-tools/src/tools/definitions/token-generator/token-generator.entry.astro create mode 100644 apps/it-tools/src/tools/definitions/token-generator/token-generator.locales.ts create mode 100644 apps/it-tools/src/tools/definitions/token-generator/token-generator.models.ts create mode 100644 apps/it-tools/src/tools/definitions/token-generator/token-generator.tsx create mode 100644 apps/it-tools/src/tools/definitions/tools.registry.ts create mode 100644 apps/it-tools/src/tools/definitions/tools.types.ts create mode 100644 apps/it-tools/tsconfig.json create mode 100644 apps/it-tools/uno.config.ts delete mode 100644 packages/app/eslint.config.js delete mode 100644 packages/app/index.html delete mode 100644 packages/app/package-lock.json delete mode 100644 packages/app/package.json delete mode 100644 packages/app/public/humans.txt delete mode 100644 packages/app/public/robots.txt delete mode 100644 packages/app/src/app.css delete mode 100644 packages/app/src/client-routes.tsx delete mode 100644 packages/app/src/client.tsx delete mode 100644 packages/app/src/locales/en.json delete mode 100644 packages/app/src/locales/fr.json delete mode 100644 packages/app/src/modules/command-palette/command-palette.provider.tsx delete mode 100644 packages/app/src/modules/i18n/i18n.constants.ts delete mode 100644 packages/app/src/modules/i18n/i18n.provider.tsx delete mode 100644 packages/app/src/modules/i18n/i18n.types.ts delete mode 100644 packages/app/src/modules/pages/home.page.tsx delete mode 100644 packages/app/src/modules/shared/copy/copy-button.tsx delete mode 100644 packages/app/src/modules/shared/copy/copy.ts delete mode 100644 packages/app/src/modules/shared/signals.test.ts delete mode 100644 packages/app/src/modules/shared/signals.ts delete mode 100644 packages/app/src/modules/tools/components/tool-header.tsx delete mode 100644 packages/app/src/modules/tools/definitions/random-port-generator/locales/en.json delete mode 100644 packages/app/src/modules/tools/definitions/random-port-generator/random-port-generator.page.tsx delete mode 100644 packages/app/src/modules/tools/definitions/random-port-generator/random-port-generator.services.ts delete mode 100644 packages/app/src/modules/tools/definitions/random-port-generator/random-port-generator.tool.ts delete mode 100644 packages/app/src/modules/tools/definitions/token-generator/locales/en.json delete mode 100644 packages/app/src/modules/tools/definitions/token-generator/locales/fr.json delete mode 100644 packages/app/src/modules/tools/definitions/token-generator/token-generator.models.ts delete mode 100644 packages/app/src/modules/tools/definitions/token-generator/token-generator.page.tsx delete mode 100644 packages/app/src/modules/tools/definitions/token-generator/token-generator.tool.ts delete mode 100644 packages/app/src/modules/tools/pages/tool.page.tsx delete mode 100644 packages/app/src/modules/tools/tools.models.ts delete mode 100644 packages/app/src/modules/tools/tools.provider.tsx delete mode 100644 packages/app/src/modules/tools/tools.registry.ts delete mode 100644 packages/app/src/modules/tools/tools.store.ts delete mode 100644 packages/app/src/modules/tools/tools.types.ts delete mode 100644 packages/app/src/modules/ui/components/badge.tsx delete mode 100644 packages/app/src/modules/ui/components/button.tsx delete mode 100644 packages/app/src/modules/ui/components/card.tsx delete mode 100644 packages/app/src/modules/ui/components/command.tsx delete mode 100644 packages/app/src/modules/ui/components/dialog.tsx delete mode 100644 packages/app/src/modules/ui/components/dropdown-menu.tsx delete mode 100644 packages/app/src/modules/ui/components/sonner.tsx delete mode 100644 packages/app/src/modules/ui/components/switch.tsx delete mode 100644 packages/app/src/modules/ui/components/textarea.tsx delete mode 100644 packages/app/src/modules/ui/components/textfield.tsx delete mode 100644 packages/app/src/modules/ui/layouts/app.layout.tsx delete mode 100644 packages/app/src/modules/ui/layouts/app.layouts.constants.ts delete mode 100644 packages/app/src/modules/ui/themes/theme.store.ts delete mode 100644 packages/app/src/modules/ui/utils/cn.ts delete mode 100644 packages/app/templates/tools/new/tool.definition.ejs.t delete mode 100644 packages/app/templates/tools/new/tool.en.locale.ejs.t delete mode 100644 packages/app/templates/tools/new/tool.inject-definition-import.ejs.t delete mode 100644 packages/app/templates/tools/new/tool.inject-definition-register.ejs.t delete mode 100644 packages/app/templates/tools/new/tool.page.ejs.t delete mode 100644 packages/app/tsconfig.json delete mode 100644 packages/app/uno.config.ts delete mode 100644 packages/app/vite.config.ts diff --git a/README.md b/README.md index 0d430986..e69de29b 100644 --- a/README.md +++ b/README.md @@ -1 +0,0 @@ -# IT-Tools diff --git a/apps/it-tools/.gitignore b/apps/it-tools/.gitignore new file mode 100644 index 00000000..16d54bb1 --- /dev/null +++ b/apps/it-tools/.gitignore @@ -0,0 +1,24 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store + +# jetbrains setting folder +.idea/ diff --git a/apps/it-tools/README.md b/apps/it-tools/README.md new file mode 100644 index 00000000..20b5a8dc --- /dev/null +++ b/apps/it-tools/README.md @@ -0,0 +1,47 @@ +# Astro Starter Kit: Minimal + +```sh +pnpm create astro@latest -- --template minimal +``` + +[![Open in StackBlitz](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/github/withastro/astro/tree/latest/examples/minimal) +[![Open with CodeSandbox](https://assets.codesandbox.io/github/button-edit-lime.svg)](https://codesandbox.io/p/sandbox/github/withastro/astro/tree/latest/examples/minimal) +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/withastro/astro?devcontainer_path=.devcontainer/minimal/devcontainer.json) + +> 🧑‍🚀 **Seasoned astronaut?** Delete this file. Have fun! + +## 🚀 Project Structure + +Inside of your Astro project, you'll see the following folders and files: + +```text +/ +├── public/ +├── src/ +│ └── pages/ +│ └── index.astro +└── package.json +``` + +Astro looks for `.astro` or `.md` files in the `src/pages/` directory. Each page is exposed as a route based on its file name. + +There's nothing special about `src/components/`, but that's where we like to put any Astro/React/Vue/Svelte/Preact components. + +Any static assets, like images, can be placed in the `public/` directory. + +## 🧞 Commands + +All commands are run from the root of the project, from a terminal: + +| Command | Action | +| :------------------------ | :----------------------------------------------- | +| `pnpm install` | Installs dependencies | +| `pnpm dev` | Starts local dev server at `localhost:4321` | +| `pnpm build` | Build your production site to `./dist/` | +| `pnpm preview` | Preview your build locally, before deploying | +| `pnpm astro ...` | Run CLI commands like `astro add`, `astro check` | +| `pnpm astro -- --help` | Get help using the Astro CLI | + +## 👀 Want to learn more? + +Feel free to check [our documentation](https://docs.astro.build) or jump into our [Discord server](https://astro.build/chat). diff --git a/apps/it-tools/astro.config.mjs b/apps/it-tools/astro.config.mjs new file mode 100644 index 00000000..82ac2358 --- /dev/null +++ b/apps/it-tools/astro.config.mjs @@ -0,0 +1,32 @@ +// @ts-check +import { defineConfig } from 'astro/config'; + +import solidJs from '@astrojs/solid-js'; +import UnoCSS from 'unocss/astro' +import { locales, defaultLocale } from './src/i18n/languages'; +import pagefind from "astro-pagefind"; + + +// https://astro.build/config +export default defineConfig({ + integrations: [ + solidJs(), + UnoCSS({ injectReset: true }), + pagefind(), + ], + i18n: { + locales, + defaultLocale, + }, + markdown: { + shikiConfig: { + themes: { + light: 'vitesse-light', + dark: 'vitesse-dark', + }, + }, + }, + build: { + + }, +}); \ No newline at end of file diff --git a/packages/app/components.json b/apps/it-tools/components.json similarity index 57% rename from packages/app/components.json rename to apps/it-tools/components.json index 50543705..0a2a3838 100644 --- a/packages/app/components.json +++ b/apps/it-tools/components.json @@ -3,15 +3,14 @@ "uno": { "config": "uno.config.ts", "css": { - "path": "src/client/app.css", + "path": "src/assets/app.css", "variable": true }, "color": "neutral", "prefix": "" }, "alias": { - "component": "@/modules/ui/components", - "ui": "@/modules/ui/components", - "cn": "@/modules/ui/utils/cn" + "component": "@/components", + "cn": "@/libs/cn" } -} +} \ No newline at end of file diff --git a/apps/it-tools/package-lock.json b/apps/it-tools/package-lock.json new file mode 100644 index 00000000..22318c00 --- /dev/null +++ b/apps/it-tools/package-lock.json @@ -0,0 +1,814 @@ +{ + "name": "@it-tools/app", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "@it-tools/app", + "version": "0.0.1", + "dependencies": { + "@astrojs/solid-js": "^5.1.0", + "@kobalte/core": "^0.13.10", + "astro": "^5.12.0", + "astro-pagefind": "^1.8.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "solid-js": "^1.9.6", + "tailwind-merge": "^3.2.0", + "unocss-preset-animations": "^1.2.1" + }, + "devDependencies": { + "@iconify-json/solar": "^1.2.2", + "@iconify-json/tabler": "^1.2.19", + "@unocss/reset": "^66.3.3", + "unocss": "66.1.0-beta.13", + "vitest": "^3.2.4" + } + }, + "../../node_modules/.pnpm/@astrojs+solid-js@5.1.0_@types+node@24.0.14_jiti@2.4.2_solid-js@1.9.6/node_modules/@astrojs/solid-js": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "vite": "^6.3.5", + "vite-plugin-solid": "^2.11.6" + }, + "devDependencies": { + "astro": "5.8.0", + "astro-scripts": "0.0.14", + "solid-js": "^1.9.7" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0" + }, + "peerDependencies": { + "solid-devtools": "^0.30.1", + "solid-js": "^1.8.5" + }, + "peerDependenciesMeta": { + "solid-devtools": { + "optional": true + } + } + }, + "../../node_modules/.pnpm/@iconify-json+solar@1.2.2/node_modules/@iconify-json/solar": { + "version": "1.2.2", + "dev": true, + "license": "CC-BY-4.0", + "dependencies": { + "@iconify/types": "*" + } + }, + "../../node_modules/.pnpm/@iconify-json+tabler@1.2.19/node_modules/@iconify-json/tabler": { + "version": "1.2.19", + "dev": true, + "license": "MIT", + "dependencies": { + "@iconify/types": "*" + } + }, + "../../node_modules/.pnpm/@unocss+reset@66.3.3/node_modules/@unocss/reset": { + "version": "66.3.3", + "dev": true, + "license": "MIT", + "devDependencies": { + "@csstools/normalize.css": "^12.1.1", + "sanitize.css": "^13.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "../../node_modules/.pnpm/astro-pagefind@1.8.3_astro@5.12.0_@types+node@24.0.14_jiti@2.4.2_rollup@4.40.1_typescript@5.8.3_/node_modules/astro-pagefind": { + "version": "1.8.3", + "license": "MIT", + "dependencies": { + "@pagefind/default-ui": "^1.2.0", + "pagefind": "^1.2.0", + "sirv": "^3.0.0" + }, + "devDependencies": { + "@astrojs/check": "0.9.4", + "@astrojs/markdown-remark": "6.3.0", + "@semantic-release/changelog": "6.0.3", + "@semantic-release/git": "10.0.1", + "@types/semantic-release": "20.0.6", + "astro": "5.5.2", + "semantic-release": "24.2.3", + "typescript": "5.8.2" + }, + "peerDependencies": { + "astro": "^2.0.4 || ^3 || ^4 || ^5" + } + }, + "../../node_modules/.pnpm/astro@5.12.0_@types+node@24.0.14_jiti@2.4.2_rollup@4.40.1_typescript@5.8.3/node_modules/astro": { + "version": "5.12.0", + "license": "MIT", + "dependencies": { + "@astrojs/compiler": "^2.12.2", + "@astrojs/internal-helpers": "0.6.1", + "@astrojs/markdown-remark": "6.3.3", + "@astrojs/telemetry": "3.3.0", + "@capsizecss/unpack": "^2.4.0", + "@oslojs/encoding": "^1.1.0", + "@rollup/pluginutils": "^5.1.4", + "acorn": "^8.14.1", + "aria-query": "^5.3.2", + "axobject-query": "^4.1.0", + "boxen": "8.0.1", + "ci-info": "^4.2.0", + "clsx": "^2.1.1", + "common-ancestor-path": "^1.0.1", + "cookie": "^1.0.2", + "cssesc": "^3.0.0", + "debug": "^4.4.0", + "deterministic-object-hash": "^2.0.2", + "devalue": "^5.1.1", + "diff": "^5.2.0", + "dlv": "^1.1.3", + "dset": "^3.1.4", + "es-module-lexer": "^1.6.0", + "esbuild": "^0.25.0", + "estree-walker": "^3.0.3", + "flattie": "^1.1.1", + "fontace": "~0.3.0", + "github-slugger": "^2.0.0", + "html-escaper": "3.0.3", + "http-cache-semantics": "^4.1.1", + "import-meta-resolve": "^4.1.0", + "js-yaml": "^4.1.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.17", + "magicast": "^0.3.5", + "mrmime": "^2.0.1", + "neotraverse": "^0.6.18", + "p-limit": "^6.2.0", + "p-queue": "^8.1.0", + "package-manager-detector": "^1.1.0", + "picomatch": "^4.0.2", + "prompts": "^2.4.2", + "rehype": "^13.0.2", + "semver": "^7.7.1", + "shiki": "^3.2.1", + "smol-toml": "^1.3.4", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.12", + "tsconfck": "^3.1.5", + "ultrahtml": "^1.6.0", + "unifont": "~0.5.0", + "unist-util-visit": "^5.0.0", + "unstorage": "^1.15.0", + "vfile": "^6.0.3", + "vite": "^6.3.4", + "vitefu": "^1.0.6", + "xxhash-wasm": "^1.1.0", + "yargs-parser": "^21.1.1", + "yocto-spinner": "^0.2.1", + "zod": "^3.24.2", + "zod-to-json-schema": "^3.24.5", + "zod-to-ts": "^1.2.0" + }, + "bin": { + "astro": "astro.js" + }, + "devDependencies": { + "@astrojs/check": "^0.9.4", + "@playwright/test": "^1.51.1", + "@types/aria-query": "^5.0.4", + "@types/common-ancestor-path": "^1.0.2", + "@types/cssesc": "^3.0.2", + "@types/debug": "^4.1.12", + "@types/diff": "^5.2.3", + "@types/dlv": "^1.1.5", + "@types/hast": "^3.0.4", + "@types/html-escaper": "3.0.4", + "@types/http-cache-semantics": "^4.0.4", + "@types/js-yaml": "^4.0.9", + "@types/picomatch": "^3.0.2", + "@types/prompts": "^2.4.9", + "@types/semver": "^7.7.0", + "@types/yargs-parser": "^21.0.3", + "astro-scripts": "0.0.14", + "cheerio": "1.0.0", + "eol": "^0.10.0", + "execa": "^8.0.1", + "expect-type": "^1.2.0", + "fs-fixture": "^2.7.1", + "mdast-util-mdx": "^3.0.0", + "mdast-util-mdx-jsx": "^3.2.0", + "node-mocks-http": "^1.16.2", + "parse-srcset": "^1.0.2", + "rehype-autolink-headings": "^7.1.0", + "rehype-slug": "^6.0.0", + "rehype-toc": "^3.0.2", + "remark-code-titles": "^0.1.2", + "rollup": "^4.37.0", + "sass": "^1.86.0", + "typescript": "^5.8.3", + "undici": "^7.5.0", + "unified": "^11.0.5", + "vitest": "^3.0.9" + }, + "engines": { + "node": "18.20.8 || ^20.3.0 || >=22.0.0", + "npm": ">=9.6.5", + "pnpm": ">=7.1.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/astrodotbuild" + }, + "optionalDependencies": { + "sharp": "^0.33.3" + } + }, + "../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority": { + "version": "0.7.1", + "license": "Apache-2.0", + "dependencies": { + "clsx": "^2.1.1" + }, + "devDependencies": { + "@swc/cli": "0.3.12", + "@swc/core": "1.4.16", + "@types/node": "20.12.7", + "@types/react": "18.2.79", + "@types/react-dom": "18.2.25", + "bundlesize": "0.18.2", + "npm-run-all": "4.1.5", + "react": "18.2.0", + "react-dom": "18.2.0", + "ts-node": "10.9.2", + "typescript": "5.4.5" + }, + "funding": { + "url": "https://polar.sh/cva" + } + }, + "../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "devDependencies": { + "esm": "3.2.25", + "terser": "4.8.0", + "uvu": "0.5.4" + }, + "engines": { + "node": ">=6" + } + }, + "../../node_modules/.pnpm/solid-js@1.9.6/node_modules/solid-js": { + "version": "1.9.6", + "license": "MIT", + "dependencies": { + "csstype": "^3.1.0", + "seroval": "^1.1.0", + "seroval-plugins": "^1.1.0" + } + }, + "../../node_modules/.pnpm/tailwind-merge@3.2.0/node_modules/tailwind-merge": { + "version": "3.2.0", + "license": "MIT", + "devDependencies": { + "@babel/core": "^7.26.10", + "@babel/preset-env": "^7.26.9", + "@codspeed/vitest-plugin": "^4.0.1", + "@rollup/plugin-babel": "^6.0.4", + "@rollup/plugin-node-resolve": "^16.0.1", + "@rollup/plugin-typescript": "^12.1.2", + "@vitest/coverage-v8": "^3.1.1", + "@vitest/eslint-plugin": "^1.1.38", + "babel-plugin-annotate-pure-calls": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.6.4", + "eslint": "^9.23.0", + "eslint-plugin-import": "^2.31.0", + "globby": "^11.1.0", + "prettier": "^3.5.3", + "rollup": "^4.38.0", + "rollup-plugin-delete": "^3.0.1", + "rollup-plugin-dts": "^6.2.1", + "tslib": "^2.8.1", + "typescript": "^5.8.2", + "typescript-eslint": "^8.29.0", + "vitest": "^3.1.1", + "zx": "^8.4.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "../../node_modules/.pnpm/unocss-preset-animations@1.2.1_unocss@66.1.0-beta.13_postcss@8.5.3_vite@6.3.4_@types+node@24._pi5ihopp7lbxzhd777cycsuybi/node_modules/unocss-preset-animations": { + "version": "1.2.1", + "license": "MIT", + "devDependencies": { + "@aelita-dev/eslint-config": "3.19.0", + "@iconify/json": "^2.2.330", + "@types/dom-view-transitions": "^1.0.6", + "@types/markdown-it": "^14.1.2", + "@types/node": "^20.17.30", + "@unocss/core": "^66.0.0", + "@unocss/eslint-plugin": "^66.0.0", + "@unocss/preset-mini": "^66.0.0", + "@vitest/coverage-v8": "^3.1.2", + "@vitest/eslint-plugin": "^1.1.43", + "@vue/language-server": "^2.2.10", + "bumpp": "^10.1.0", + "bundle-require": "^5.1.0", + "changelogithub": "^13.13.0", + "eslint": "^9.25.1", + "eslint-import-resolver-typescript": "^4.3.4", + "eslint-plugin-import-x": "^4.10.6", + "eslint-plugin-vue": "^10.0.0", + "eslint-plugin-vuejs-accessibility": "^2.4.1", + "eslint-processor-vue-blocks": "^2.0.0", + "lint-staged": "^15.5.1", + "markdown-it": "^14.1.0", + "sass-embedded": "^1.87.0", + "simple-git-hooks": "^2.12.1", + "typescript": "~5.8.3", + "unbuild": "3.5.0", + "unocss": "^66.0.0", + "vite-tsconfig-paths": "^5.1.4", + "vitepress": "1.6.3", + "vitest": "^3.1.2", + "vue": "^3.5.13", + "vue-eslint-parser": "^10.1.3", + "vue-tsc": "^2.2.10" + }, + "peerDependencies": { + "@unocss/preset-wind3": ">=0.56.0 < 101", + "unocss": ">=0.56.0 < 101" + }, + "peerDependenciesMeta": { + "@unocss/preset-wind3": { + "optional": true + } + } + }, + "../../node_modules/.pnpm/unocss@66.1.0-beta.13_postcss@8.5.3_vite@6.3.4_@types+node@24.0.14_jiti@2.4.2__vue@3.5.13_typescript@5.8.3_/node_modules/unocss": { + "version": "66.1.0-beta.13", + "dev": true, + "license": "MIT", + "dependencies": { + "@unocss/astro": "66.1.0-beta.13", + "@unocss/cli": "66.1.0-beta.13", + "@unocss/core": "66.1.0-beta.13", + "@unocss/postcss": "66.1.0-beta.13", + "@unocss/preset-attributify": "66.1.0-beta.13", + "@unocss/preset-icons": "66.1.0-beta.13", + "@unocss/preset-mini": "66.1.0-beta.13", + "@unocss/preset-tagify": "66.1.0-beta.13", + "@unocss/preset-typography": "66.1.0-beta.13", + "@unocss/preset-uno": "66.1.0-beta.13", + "@unocss/preset-web-fonts": "66.1.0-beta.13", + "@unocss/preset-wind": "66.1.0-beta.13", + "@unocss/preset-wind3": "66.1.0-beta.13", + "@unocss/preset-wind4": "66.1.0-beta.13", + "@unocss/transformer-attributify-jsx": "66.1.0-beta.13", + "@unocss/transformer-compile-class": "66.1.0-beta.13", + "@unocss/transformer-directives": "66.1.0-beta.13", + "@unocss/transformer-variant-group": "66.1.0-beta.13", + "@unocss/vite": "66.1.0-beta.13" + }, + "devDependencies": { + "@unocss/webpack": "66.1.0-beta.13", + "vite": "^6.2.6" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@unocss/webpack": "66.1.0-beta.13", + "vite": "^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" + }, + "peerDependenciesMeta": { + "@unocss/webpack": { + "optional": true + }, + "vite": { + "optional": true + } + } + }, + "../../node_modules/.pnpm/vitest@3.2.4_@types+debug@4.1.12_@types+node@24.0.14_jiti@2.4.2/node_modules/vitest": { + "version": "3.2.4", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/chai": "^5.2.2", + "@vitest/expect": "3.2.4", + "@vitest/mocker": "3.2.4", + "@vitest/pretty-format": "^3.2.4", + "@vitest/runner": "3.2.4", + "@vitest/snapshot": "3.2.4", + "@vitest/spy": "3.2.4", + "@vitest/utils": "3.2.4", + "chai": "^5.2.0", + "debug": "^4.4.1", + "expect-type": "^1.2.1", + "magic-string": "^0.30.17", + "pathe": "^2.0.3", + "picomatch": "^4.0.2", + "std-env": "^3.9.0", + "tinybench": "^2.9.0", + "tinyexec": "^0.3.2", + "tinyglobby": "^0.2.14", + "tinypool": "^1.1.1", + "tinyrainbow": "^2.0.0", + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", + "vite-node": "3.2.4", + "why-is-node-running": "^2.3.0" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "devDependencies": { + "@ampproject/remapping": "^2.3.0", + "@antfu/install-pkg": "^1.1.0", + "@edge-runtime/vm": "^5.0.0", + "@sinonjs/fake-timers": "14.0.0", + "@types/debug": "^4.1.12", + "@types/estree": "^1.0.8", + "@types/istanbul-lib-coverage": "^2.0.6", + "@types/istanbul-reports": "^3.0.4", + "@types/jsdom": "^21.1.7", + "@types/mime": "^4.0.0", + "@types/node": "^22.15.32", + "@types/picomatch": "^4.0.0", + "@types/prompts": "^2.4.9", + "@types/sinonjs__fake-timers": "^8.1.5", + "acorn-walk": "^8.3.4", + "birpc": "2.4.0", + "cac": "^6.7.14", + "chai-subset": "^1.6.0", + "find-up": "^6.3.0", + "flatted": "^3.3.3", + "happy-dom": "^17.6.3", + "jsdom": "^26.1.0", + "local-pkg": "^1.1.1", + "mime": "^4.0.7", + "pretty-format": "^29.7.0", + "prompts": "^2.4.2", + "strip-literal": "^3.0.0", + "ws": "^8.18.2" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@types/debug": "^4.1.12", + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "@vitest/browser": "3.2.4", + "@vitest/ui": "3.2.4", + "happy-dom": "*", + "jsdom": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@types/debug": { + "optional": true + }, + "@types/node": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + } + } + }, + "node_modules/@astrojs/solid-js": { + "resolved": "../../node_modules/.pnpm/@astrojs+solid-js@5.1.0_@types+node@24.0.14_jiti@2.4.2_solid-js@1.9.6/node_modules/@astrojs/solid-js", + "link": true + }, + "node_modules/@corvu/utils": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@corvu/utils/-/utils-0.4.2.tgz", + "integrity": "sha512-Ox2kYyxy7NoXdKWdHeDEjZxClwzO4SKM8plAaVwmAJPxHMqA0rLOoAsa+hBDwRLpctf+ZRnAd/ykguuJidnaTA==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.6.11" + }, + "peerDependencies": { + "solid-js": "^1.8" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.2.tgz", + "integrity": "sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.2.tgz", + "integrity": "sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.2", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, + "node_modules/@iconify-json/solar": { + "resolved": "../../node_modules/.pnpm/@iconify-json+solar@1.2.2/node_modules/@iconify-json/solar", + "link": true + }, + "node_modules/@iconify-json/tabler": { + "resolved": "../../node_modules/.pnpm/@iconify-json+tabler@1.2.19/node_modules/@iconify-json/tabler", + "link": true + }, + "node_modules/@internationalized/date": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.8.2.tgz", + "integrity": "sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.3", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.3.tgz", + "integrity": "sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@kobalte/core": { + "version": "0.13.10", + "resolved": "https://registry.npmjs.org/@kobalte/core/-/core-0.13.10.tgz", + "integrity": "sha512-lzP64ThxZqZB6O6MnMq6w7DxK38o2ClbW3Ob6afUI6p86cUMz5Hb4rdysvYI6m1TKYlOAlFODKkoRznqybQohw==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.5.1", + "@internationalized/date": "^3.4.0", + "@internationalized/number": "^3.2.1", + "@kobalte/utils": "^0.9.1", + "@solid-primitives/props": "^3.1.8", + "@solid-primitives/resize-observer": "^2.0.26", + "solid-presence": "^0.1.8", + "solid-prevent-scroll": "^0.1.4" + }, + "peerDependencies": { + "solid-js": "^1.8.15" + } + }, + "node_modules/@kobalte/utils": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@kobalte/utils/-/utils-0.9.1.tgz", + "integrity": "sha512-eeU60A3kprIiBDAfv9gUJX1tXGLuZiKMajUfSQURAF2pk4ZoMYiqIzmrMBvzcxP39xnYttgTyQEVLwiTZnrV4w==", + "license": "MIT", + "dependencies": { + "@solid-primitives/event-listener": "^2.2.14", + "@solid-primitives/keyed": "^1.2.0", + "@solid-primitives/map": "^0.4.7", + "@solid-primitives/media": "^2.2.4", + "@solid-primitives/props": "^3.1.8", + "@solid-primitives/refs": "^1.0.5", + "@solid-primitives/utils": "^6.2.1" + }, + "peerDependencies": { + "solid-js": "^1.8.8" + } + }, + "node_modules/@solid-primitives/event-listener": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@solid-primitives/event-listener/-/event-listener-2.4.3.tgz", + "integrity": "sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==", + "license": "MIT", + "dependencies": { + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/keyed": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/keyed/-/keyed-1.5.2.tgz", + "integrity": "sha512-BgoEdqPw48URnI+L5sZIHdF4ua4Las1eWEBBPaoSFs42kkhnHue+rwCBPL2Z9ebOyQ75sUhUfOETdJfmv0D6Kg==", + "license": "MIT", + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/map": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/@solid-primitives/map/-/map-0.4.13.tgz", + "integrity": "sha512-B1zyFbsiTQvqPr+cuPCXO72sRuczG9Swncqk5P74NCGw1VE8qa/Ry9GlfI1e/VdeQYHjan+XkbE3rO2GW/qKew==", + "license": "MIT", + "dependencies": { + "@solid-primitives/trigger": "^1.1.0" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/media": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@solid-primitives/media/-/media-2.3.3.tgz", + "integrity": "sha512-hQ4hLOGvfbugQi5Eu1BFWAIJGIAzztq9x0h02xgBGl2l0Jaa3h7tg6bz5tV1NSuNYVGio4rPoa7zVQQLkkx9dA==", + "license": "MIT", + "dependencies": { + "@solid-primitives/event-listener": "^2.4.3", + "@solid-primitives/rootless": "^1.5.2", + "@solid-primitives/static-store": "^0.1.2", + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/props": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/props/-/props-3.2.2.tgz", + "integrity": "sha512-lZOTwFJajBrshSyg14nBMEP0h8MXzPowGO0s3OeiR3z6nXHTfj0FhzDtJMv+VYoRJKQHG2QRnJTgCzK6erARAw==", + "license": "MIT", + "dependencies": { + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/refs": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/refs/-/refs-1.1.2.tgz", + "integrity": "sha512-K7tf2thy7L+YJjdqXspXOg5xvNEOH8tgEWsp0+1mQk3obHBRD6hEjYZk7p7FlJphSZImS35je3UfmWuD7MhDfg==", + "license": "MIT", + "dependencies": { + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/resize-observer": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@solid-primitives/resize-observer/-/resize-observer-2.1.3.tgz", + "integrity": "sha512-zBLje5E06TgOg93S7rGPldmhDnouNGhvfZVKOp+oG2XU8snA+GoCSSCz1M+jpNAg5Ek2EakU5UVQqL152WmdXQ==", + "license": "MIT", + "dependencies": { + "@solid-primitives/event-listener": "^2.4.3", + "@solid-primitives/rootless": "^1.5.2", + "@solid-primitives/static-store": "^0.1.2", + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/rootless": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/rootless/-/rootless-1.5.2.tgz", + "integrity": "sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==", + "license": "MIT", + "dependencies": { + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/static-store": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/static-store/-/static-store-0.1.2.tgz", + "integrity": "sha512-ReK+5O38lJ7fT+L6mUFvUr6igFwHBESZF+2Ug842s7fvlVeBdIVEdTCErygff6w7uR6+jrr7J8jQo+cYrEq4Iw==", + "license": "MIT", + "dependencies": { + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/trigger": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/trigger/-/trigger-1.2.2.tgz", + "integrity": "sha512-IWoptVc0SWYgmpBPpCMehS5b07+tpFcvw15tOQ3QbXedSYn6KP8zCjPkHNzMxcOvOicTneleeZDP7lqmz+PQ6g==", + "license": "MIT", + "dependencies": { + "@solid-primitives/utils": "^6.3.2" + }, + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@solid-primitives/utils": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/@solid-primitives/utils/-/utils-6.3.2.tgz", + "integrity": "sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==", + "license": "MIT", + "peerDependencies": { + "solid-js": "^1.6.12" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, + "node_modules/@unocss/reset": { + "resolved": "../../node_modules/.pnpm/@unocss+reset@66.3.3/node_modules/@unocss/reset", + "link": true + }, + "node_modules/astro": { + "resolved": "../../node_modules/.pnpm/astro@5.12.0_@types+node@24.0.14_jiti@2.4.2_rollup@4.40.1_typescript@5.8.3/node_modules/astro", + "link": true + }, + "node_modules/astro-pagefind": { + "resolved": "../../node_modules/.pnpm/astro-pagefind@1.8.3_astro@5.12.0_@types+node@24.0.14_jiti@2.4.2_rollup@4.40.1_typescript@5.8.3_/node_modules/astro-pagefind", + "link": true + }, + "node_modules/class-variance-authority": { + "resolved": "../../node_modules/.pnpm/class-variance-authority@0.7.1/node_modules/class-variance-authority", + "link": true + }, + "node_modules/clsx": { + "resolved": "../../node_modules/.pnpm/clsx@2.1.1/node_modules/clsx", + "link": true + }, + "node_modules/solid-js": { + "resolved": "../../node_modules/.pnpm/solid-js@1.9.6/node_modules/solid-js", + "link": true + }, + "node_modules/solid-presence": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/solid-presence/-/solid-presence-0.1.8.tgz", + "integrity": "sha512-pWGtXUFWYYUZNbg5YpG5vkQJyOtzn2KXhxYaMx/4I+lylTLYkITOLevaCwMRN+liCVk0pqB6EayLWojNqBFECA==", + "license": "MIT", + "dependencies": { + "@corvu/utils": "~0.4.0" + }, + "peerDependencies": { + "solid-js": "^1.8" + } + }, + "node_modules/solid-prevent-scroll": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/solid-prevent-scroll/-/solid-prevent-scroll-0.1.10.tgz", + "integrity": "sha512-KplGPX2GHiWJLZ6AXYRql4M127PdYzfwvLJJXMkO+CMb8Np4VxqDAg5S8jLdwlEuBis/ia9DKw2M8dFx5u8Mhw==", + "license": "MIT", + "dependencies": { + "@corvu/utils": "~0.4.1" + }, + "peerDependencies": { + "solid-js": "^1.8" + } + }, + "node_modules/tailwind-merge": { + "resolved": "../../node_modules/.pnpm/tailwind-merge@3.2.0/node_modules/tailwind-merge", + "link": true + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "license": "0BSD" + }, + "node_modules/unocss": { + "resolved": "../../node_modules/.pnpm/unocss@66.1.0-beta.13_postcss@8.5.3_vite@6.3.4_@types+node@24.0.14_jiti@2.4.2__vue@3.5.13_typescript@5.8.3_/node_modules/unocss", + "link": true + }, + "node_modules/unocss-preset-animations": { + "resolved": "../../node_modules/.pnpm/unocss-preset-animations@1.2.1_unocss@66.1.0-beta.13_postcss@8.5.3_vite@6.3.4_@types+node@24._pi5ihopp7lbxzhd777cycsuybi/node_modules/unocss-preset-animations", + "link": true + }, + "node_modules/vitest": { + "resolved": "../../node_modules/.pnpm/vitest@3.2.4_@types+debug@4.1.12_@types+node@24.0.14_jiti@2.4.2/node_modules/vitest", + "link": true + } + } +} diff --git a/apps/it-tools/package.json b/apps/it-tools/package.json new file mode 100644 index 00000000..84e79271 --- /dev/null +++ b/apps/it-tools/package.json @@ -0,0 +1,31 @@ +{ + "name": "@it-tools/app", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro", + "test": "vitest run", + "test:watch": "vitest watch" + }, + "dependencies": { + "@astrojs/solid-js": "^5.1.0", + "@kobalte/core": "^0.13.10", + "astro": "^5.12.0", + "astro-pagefind": "^1.8.3", + "class-variance-authority": "^0.7.1", + "clsx": "^2.1.1", + "solid-js": "^1.9.6", + "tailwind-merge": "^3.2.0", + "unocss-preset-animations": "^1.2.1" + }, + "devDependencies": { + "@iconify-json/solar": "^1.2.2", + "@iconify-json/tabler": "^1.2.19", + "@unocss/reset": "^66.3.3", + "unocss": "66.1.0-beta.13", + "vitest": "^3.2.4" + } +} \ No newline at end of file diff --git a/apps/it-tools/public/favicon.ico b/apps/it-tools/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..54a12b0b97d969372bb0e783c5311113954ecf88 GIT binary patch literal 15406 zcmeI2U5r&%8HV?nL98tzor(mUk^?ggGYsGW(n@WBi>B#?9qJEi2$Ct*2K%EnDWOo> zAt@K4Cf3Fa^}@7TO-w54g(m*hUe#EwUX-+Hqalq^6ETw3)JjzFc@Jxytn;0<_B#8V zGZ11=^3D2tzxR9B+H0@9_S#bvwPLVXw5TAh7yITF#Wh7y)a&QV<5w2N*QuMDa_wV9 z@$}-N7zcw39_Q;xN`GtCtQp0ov0W1r6CaD2+8kyyBwM|D^}DG*QpM!sIf(Tc`BL|x z$;rvhOUx~e4PKFk2^X#y3li`QeiwE%pm1A`*OWrzbxhF>xJ=n`G#fh zPy2lAo7l7Ht$Sak7H`YK(6{g6d(PP(SFKt#p?du+-j;>I?@2g*jXmZ#PWkb+cw3f# z@T=kf1;_CR)mywR2focL*Yp!`%&5ZR!|@*;9)3&HDUlHduEt!GFR&V8{GjS6FD4zr zeuVuUJMBz))eSk!5&6hhVW{7WiSu5@>^P~${vVk4SN@!9yO+GMd*!Pi^-Hn+swe%8 z!yX`igR=v!PHn>M$CjS=KL2;qrcG~JyLRmeW7WV4Z%u8&2pjs^Jbt%gUnR!ZWXh`! zT%*4h-%DBROdZ>f)fzc66@Kg1t-F%Bxf-1t(ReM_Weav)r-t8qRZ3!rFax0rU89R@oC&IDc?TTKd4w%1Kc|-Ke)rxeG1!$?%S)F zeDMFY<7l~-Oo<&fKDfrS#%rK_3z$KR>!PgZP)pww%kT_y`SxDZ z9DlAojPLsL9nurbquau^R6fU_Yxlgw(;D#{7CwVCmr8#*{#?7rx%cbD{k@6Z(1EUp zfh3<{IsRO`;uGV?vDm(j_D6xS<8J@u_;c-IB+j!w7U{pS-vwoVJ&rT4wfAZH<@j^$ zBBOsd5brP8pRsAhq3(MT4L_r9K`0={pKA}fOn#om-D;rj8zC;opKA}fBKaEe9yS_I zgt#1ku07;R<@`=h{QAvOMejF!N&AVsiW|SFU^;x?7&n%a9&ig4Me7 zGM0;J+h2CR;t*HZx7|LjPtm*HU>bOQzieW^LiuFE)YjDDe8aenykhydL0aQIZV&z~ zcsTT)7IGd7d|I+#j~T3dE#DrTqR&dO^LfrT&QSutuY{cBpHZBcsm);J+l=qH=eLNC z6qx(kFJ2G+1H}0_`PU6^b397wUze{q#KpSA=~s6@{EwEzNohISU9_l|-Vct_pMQ3s z<27&(!P1X+mliRs?^h6i1MAu5n5j*e7N<7~r6ZsNfhlYTt95Zsf?M;qef#!#daq)x zFPxg1(mTx%^Z%-TnmEO+7>cEsO#$6yYC4}mqt15U$K2h6eUi2C9@72P-ABxW*r8rc zT;g=xcWAwJF*mAD$d9gzW!*v(G?RD2tFwycT6ZDy#J(T9Q(DTjhHbiTJcr(k&+LWN znu#?lO&!ds8tc!y;L^OfC}Um{_n@?u%_V#naJ_CT;kc-Ma@v~v({SD>&+~Z{?Pc>u zXMEao>H6rN)0ubACN6P0?y|GWS!uMoeVP09W_a4h7~aF!M`+i5F@>$+TCzlp>rc-n zE+{9(?P7dbF)6ocp>EpiwJAQj*JD0=dDptk;^(TYSm@9#|~|^hm3X&%9ci!pF`|tbf1DikZ?Qtu`Ld=Vd88>)Sgmey+=k znbISzHhvktL;VBH*$HAk!ub4xbhel4R#i_`yzM{t)HXEhEcq;U4%3<8lh_7}?W9~) zPgQ)VfpNbPojQM(Zfhs#+m;aDNxrI{s(5MGxpU_rbLIVLJ{8g3><5_V;NOf(+jA$? zm#TWI;uROo*JCHkvlyS==lkAYpw0C z%DVUH_jUMv4*NOwEAGi>%1juC{XD)~QunW7f{W^r)`*?~d^$eAa@R|1`rokB9wApR z-!F;F>Y;91OusaOjo$b8+!gbo?pA!7-*dEQq3&_GQv0)SU@{~zm? zYaorbufB}WG}eMwnfajWvJ2aQXH~cnOU)rT z8(g$MME;jpzqE_zEcUeHZqrPgkNto&`ti0Yxa{`}Vtf|d^O)7I{n>BJ?p?JBgT?l8 z&pYli{ra|&{C+`yv~Sn>zP?XHd5Ccg)4QzI|AO|*c1 ?Wtd|{^AsODlYX0`F~w~ z5-vRh(EsnivlaZI7?)yTG5s%c4=$FzG7|>g7qOQ9i&NaOnA9DjZL9s?B0Dy|taA~~ zGyK}tBY0BtNAD=orLiqDVT5hbPdPPz?vfU1^7=YW^&JGg8{yX4a5wY!9_#@5r!d`f zRztVtv&4A{JD?bfg(>C+Y3NjM39hE+q^>>R4u;{K!TP;^&WKwv+%vg!o|kCNHi@6H z(m6x7 + + + diff --git a/apps/it-tools/src/assets/app.css b/apps/it-tools/src/assets/app.css new file mode 100644 index 00000000..337c5947 --- /dev/null +++ b/apps/it-tools/src/assets/app.css @@ -0,0 +1,75 @@ +:root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + + --radius: 0.5rem; +} + +[data-kb-theme="dark"] { + --background: 0 0% 6%; + --foreground: 0 0% 96%; + + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + + --primary: 0 0% 96%; + --primary-foreground: 0 0% 9%; + + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; +} + + +* { + @apply border-border; +} +body { + @apply bg-background text-foreground; +} + + +[data-kb-theme="dark"] .astro-code, +[data-kb-theme="dark"] .astro-code span { + background-color: var(--shiki-dark-bg) !important; +} \ No newline at end of file diff --git a/apps/it-tools/src/components/footer.astro b/apps/it-tools/src/components/footer.astro new file mode 100644 index 00000000..ab441f64 --- /dev/null +++ b/apps/it-tools/src/components/footer.astro @@ -0,0 +1,103 @@ +--- +import { cn } from '@/libs/cn'; + +const socials = [ + { + label: 'Bluesky', + url: 'https://bsky.app/profile/it-tools.tech', + icon: 'i-tabler-brand-bluesky', + }, + { + label: 'GitHub', + url: 'https://github.com/CorentinTh/it-tools', + icon: 'i-tabler-brand-github', + }, + { + label: 'X (Twitter)', + url: 'https://x.com/ittoolsdottech', + icon: 'i-tabler-brand-x', + }, + + +]; + +const sections: { + title: string; + links: { label: string; url: string; target?: string; rel?: string }[]; +}[] = [ + { + title: 'Community', + links: socials, + }, + { + title: 'Open Source', + links: [ + { + label: 'Repository', + url: 'https://github.com/CorentinTh/it-tools', + }, + { + label: 'Contributing', + url: 'https://github.com/CorentinTh/it-tools/blob/main/CONTRIBUTING.md', + }, + { + label: 'Code of Conduct', + url: 'https://github.com/CorentinTh/it-tools/blob/main/CODE_OF_CONDUCT.md', + }, + { + label: 'License', + url: 'https://github.com/CorentinTh/it-tools/blob/main/LICENSE', + }, + ], + }, +]; +--- + +
+
+
+
+ +
+ IT-Tools +
+ +
+ { + socials.map(social => ( + + + +

+ IT-Tools is made in Europe with + by Corentin Thomasset. +

+
+ +
+ { + sections.map(section => ( +
+
{section.title}
+
+ {section.links.map(link => ( + + {link.label} + + ))} +
+
+ )) + } +
+
+ +
+ © {new Date().getFullYear()} IT-Tools. All rights reserved. +
+
+
\ No newline at end of file diff --git a/apps/it-tools/src/components/header.astro b/apps/it-tools/src/components/header.astro new file mode 100644 index 00000000..fc5ceb7c --- /dev/null +++ b/apps/it-tools/src/components/header.astro @@ -0,0 +1,60 @@ +--- +import { LanguagePicker } from "./language-picker"; +import { Button } from "./ui/button"; + +const { lang } = Astro.params; + +--- + +
+
+
+ + + IT-Tools + + + +
+ +
+ + + + + + + + + +
+
+
+ + + \ No newline at end of file diff --git a/apps/it-tools/src/components/language-picker.tsx b/apps/it-tools/src/components/language-picker.tsx new file mode 100644 index 00000000..557979fc --- /dev/null +++ b/apps/it-tools/src/components/language-picker.tsx @@ -0,0 +1,30 @@ +import { Button } from "@/components/ui/button"; +import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "./ui/dropdown-menu"; +import type { DropdownMenuSubTriggerProps } from "@kobalte/core/dropdown-menu"; +import { languages } from "@/i18n/languages"; +import { navigate } from "astro:transitions/client"; + +export const LanguagePicker = () => { + + + + return ( + + ( + + )} + /> + + {Object.entries(languages).map(([locale, name]) => ( + + {name} + + ))} + + + + ) +} \ No newline at end of file diff --git a/apps/it-tools/src/components/tool-card.astro b/apps/it-tools/src/components/tool-card.astro new file mode 100644 index 00000000..c5d3fb72 --- /dev/null +++ b/apps/it-tools/src/components/tool-card.astro @@ -0,0 +1,24 @@ +--- +import { buildLocalizedUrl } from "@/i18n/i18n.models"; +import { cn } from "@/libs/cn"; + +export type Props = { + name: string; + description: string; + icon: string; + slug: string; +}; + +const { slug, name, description, icon }: Props = Astro.props; +const {lang} = Astro.params; +--- + + +
+ + + +

{name}

+
+

{description}

+
\ No newline at end of file diff --git a/apps/it-tools/src/components/ui/button.tsx b/apps/it-tools/src/components/ui/button.tsx new file mode 100644 index 00000000..6663232c --- /dev/null +++ b/apps/it-tools/src/components/ui/button.tsx @@ -0,0 +1,66 @@ +import { cn } from "@/libs/cn"; +import type { ButtonRootProps } from "@kobalte/core/button"; +import { Button as ButtonPrimitive } from "@kobalte/core/button"; +import type { PolymorphicProps } from "@kobalte/core/polymorphic"; +import type { VariantProps } from "class-variance-authority"; +import { cva } from "class-variance-authority"; +import type { ValidComponent } from "solid-js"; +import { splitProps } from "solid-js"; + +export const buttonVariants = cva( + "inline-flex items-center justify-center rounded-md text-sm font-medium transition-shadow focus-visible:(outline-none ring-1.5 ring-ring) disabled:(pointer-events-none opacity-50) bg-inherit", + { + variants: { + variant: { + default: + "bg-primary text-primary-foreground shadow hover:bg-primary/90", + destructive: + "bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90", + outline: + "border border-input bg-background shadow-sm hover:bg-accent hover:text-accent-foreground", + secondary: + "bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80", + ghost: "hover:(bg-accent text-accent-foreground)", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-9 px-4 py-2", + sm: "h-8 px-3 text-xs", + lg: "h-10 px-8", + icon: "h-9 w-9", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, + }, +); + +type buttonProps = ButtonRootProps & + VariantProps & { + class?: string; + }; + +export const Button = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as buttonProps, [ + "class", + "variant", + "size", + ]); + + return ( + + ); +}; diff --git a/apps/it-tools/src/components/ui/dropdown-menu.tsx b/apps/it-tools/src/components/ui/dropdown-menu.tsx new file mode 100644 index 00000000..92175456 --- /dev/null +++ b/apps/it-tools/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,320 @@ +import { cn } from "@/libs/cn"; +import type { + DropdownMenuCheckboxItemProps, + DropdownMenuContentProps, + DropdownMenuGroupLabelProps, + DropdownMenuItemLabelProps, + DropdownMenuItemProps, + DropdownMenuRadioItemProps, + DropdownMenuRootProps, + DropdownMenuSeparatorProps, + DropdownMenuSubTriggerProps, +} from "@kobalte/core/dropdown-menu"; +import { DropdownMenu as DropdownMenuPrimitive } from "@kobalte/core/dropdown-menu"; +import type { PolymorphicProps } from "@kobalte/core/polymorphic"; +import type { ComponentProps, ParentProps, ValidComponent } from "solid-js"; +import { mergeProps, splitProps } from "solid-js"; + +export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; +export const DropdownMenuGroup = DropdownMenuPrimitive.Group; +export const DropdownMenuSub = DropdownMenuPrimitive.Sub; +export const DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup; + +export const DropdownMenu = (props: DropdownMenuRootProps) => { + const merge = mergeProps( + { + gutter: 4, + flip: false, + }, + props, + ); + + return ; +}; + +type dropdownMenuContentProps = + DropdownMenuContentProps & { + class?: string; + }; + +export const DropdownMenuContent = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuContentProps, [ + "class", + ]); + + return ( + + + + ); +}; + +type dropdownMenuItemProps = + DropdownMenuItemProps & { + class?: string; + inset?: boolean; + }; + +export const DropdownMenuItem = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuItemProps, [ + "class", + "inset", + ]); + + return ( + + ); +}; + +type dropdownMenuGroupLabelProps = + DropdownMenuGroupLabelProps & { + class?: string; + }; + +export const DropdownMenuGroupLabel = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuGroupLabelProps, [ + "class", + ]); + + return ( + + ); +}; + +type dropdownMenuItemLabelProps = + DropdownMenuItemLabelProps & { + class?: string; + }; + +export const DropdownMenuItemLabel = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuItemLabelProps, [ + "class", + ]); + + return ( + + ); +}; + +type dropdownMenuSeparatorProps = + DropdownMenuSeparatorProps & { + class?: string; + }; + +export const DropdownMenuSeparator = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuSeparatorProps, [ + "class", + ]); + + return ( + + ); +}; + +export const DropdownMenuShortcut = (props: ComponentProps<"span">) => { + const [local, rest] = splitProps(props, ["class"]); + + return ( + + ); +}; + +type dropdownMenuSubTriggerProps = + ParentProps< + DropdownMenuSubTriggerProps & { + class?: string; + } + >; + +export const DropdownMenuSubTrigger = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuSubTriggerProps, [ + "class", + "children", + ]); + + return ( + + {local.children} + + + Arrow + + + ); +}; + +type dropdownMenuSubContentProps = + DropdownMenuSubTriggerProps & { + class?: string; + }; + +export const DropdownMenuSubContent = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuSubContentProps, [ + "class", + ]); + + return ( + + + + ); +}; + +type dropdownMenuCheckboxItemProps = + ParentProps< + DropdownMenuCheckboxItemProps & { + class?: string; + } + >; + +export const DropdownMenuCheckboxItem = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuCheckboxItemProps, [ + "class", + "children", + ]); + + return ( + + + + + Checkbox + + + {props.children} + + ); +}; + +type dropdownMenuRadioItemProps = ParentProps< + DropdownMenuRadioItemProps & { + class?: string; + } +>; + +export const DropdownMenuRadioItem = ( + props: PolymorphicProps>, +) => { + const [local, rest] = splitProps(props as dropdownMenuRadioItemProps, [ + "class", + "children", + ]); + + return ( + + + + + + + + Radio + + + {props.children} + + ); +}; diff --git a/apps/it-tools/src/components/ui/label.tsx b/apps/it-tools/src/components/ui/label.tsx new file mode 100644 index 00000000..484006f2 --- /dev/null +++ b/apps/it-tools/src/components/ui/label.tsx @@ -0,0 +1,19 @@ +import type { Component, ComponentProps } from "solid-js" +import { splitProps } from "solid-js" + +import { cn } from "@/libs/cn" + +const Label: Component> = (props) => { + const [local, others] = splitProps(props, ["class"]) + return ( +