From a521bbfdf766910eb7e318c3ee1a99189c1d3465 Mon Sep 17 00:00:00 2001 From: ABILASH <114130954+Abilash-19@users.noreply.github.com> Date: Sun, 8 Mar 2026 19:59:21 +0530 Subject: [PATCH 01/15] feat(docs): add MDX documentation site --- package-lock.json | 1913 +++++++++++++++++++++- package.json | 3 + src/App.tsx | 15 +- src/Playground.tsx | 12 +- src/components/Checkbox/Checkbox.tsx | 4 +- src/components/Checkbox/index.ts | 2 +- src/components/Modal/Modal.tsx | 4 +- src/components/RadioGroup/RadioGroup.tsx | 4 +- src/components/RadioGroup/index.ts | 2 +- src/components/ScrollArea/ScrollArea.tsx | 5 +- src/components/Skeleton/Skeleton.tsx | 4 +- src/components/Skeleton/index.ts | 4 +- src/docs/DocsApp.tsx | 233 +++ src/docs/DocsLayout.tsx | 283 ++++ src/docs/components/ComponentPreview.tsx | 110 ++ src/docs/components/ModalDemo.tsx | 46 + src/docs/components/PropsTable.tsx | 106 ++ src/docs/pages/Accordion.mdx | 71 + src/docs/pages/Avatar.mdx | 16 + src/docs/pages/Badge.mdx | 61 + src/docs/pages/Button.mdx | 76 + src/docs/pages/Checkbox.mdx | 51 + src/docs/pages/Input.mdx | 71 + src/docs/pages/Modal.mdx | 53 + src/docs/pages/RadioGroup.mdx | 76 + src/docs/pages/ScrollArea.mdx | 65 + src/docs/pages/Skeleton.mdx | 68 + src/docs/pages/Theming.mdx | 51 + src/docs/pages/Typography.mdx | 61 + vite.config.ts | 2 + 30 files changed, 3428 insertions(+), 44 deletions(-) create mode 100644 src/docs/DocsApp.tsx create mode 100644 src/docs/DocsLayout.tsx create mode 100644 src/docs/components/ComponentPreview.tsx create mode 100644 src/docs/components/ModalDemo.tsx create mode 100644 src/docs/components/PropsTable.tsx create mode 100644 src/docs/pages/Accordion.mdx create mode 100644 src/docs/pages/Avatar.mdx create mode 100644 src/docs/pages/Badge.mdx create mode 100644 src/docs/pages/Button.mdx create mode 100644 src/docs/pages/Checkbox.mdx create mode 100644 src/docs/pages/Input.mdx create mode 100644 src/docs/pages/Modal.mdx create mode 100644 src/docs/pages/RadioGroup.mdx create mode 100644 src/docs/pages/ScrollArea.mdx create mode 100644 src/docs/pages/Skeleton.mdx create mode 100644 src/docs/pages/Theming.mdx create mode 100644 src/docs/pages/Typography.mdx diff --git a/package-lock.json b/package-lock.json index f6da95a..a332efb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,8 @@ "@commitlint/cli": "^20.4.1", "@commitlint/config-conventional": "^20.4.1", "@eslint/js": "^9.39.1", + "@mdx-js/react": "^3.1.1", + "@mdx-js/rollup": "^3.1.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", @@ -38,6 +40,7 @@ "playwright": "^1.58.2", "postcss": "^8.4.49", "prettier": "^3.8.1", + "react-router-dom": "^7.13.1", "tailwind-merge": "^3.4.0", "tailwindcss": "^3.4.17", "typescript": "~5.7.0", @@ -1176,6 +1179,112 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mdx-js/mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.1.tgz", + "integrity": "sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "acorn": "^8.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-scope": "^1.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "recma-build-jsx": "^1.0.0", + "recma-jsx": "^1.0.0", + "recma-stringify": "^1.0.0", + "rehype-recma": "^1.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/mdx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/@mdx-js/mdx/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.1.tgz", + "integrity": "sha512-f++rKLQgUVYDAtECQ6fn/is15GkEH9+nZPM3MS0RcxVqoTfawHvDlSCH7JbMhAM6uJ32v3eXLvLmLvjGu7PTQw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@mdx-js/rollup": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@mdx-js/rollup/-/rollup-3.1.1.tgz", + "integrity": "sha512-v8satFmBB+DqDzYohnm1u2JOvxx6Hl3pUvqzJvfs2Zk/ngZ1aRUhsWpXvwPkNeGN9c2NCm/38H29ZqXQUjf8dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@rollup/pluginutils": "^5.0.0", + "source-map": "^0.7.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "rollup": ">=2" + } + }, + "node_modules/@mdx-js/rollup/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/@microsoft/api-extractor": { "version": "7.56.3", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.56.3.tgz", @@ -2073,6 +2182,16 @@ "assertion-error": "^2.0.1" } }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/deep-eql": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz", @@ -2087,6 +2206,26 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -2094,6 +2233,30 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", + "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.10.13", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.13.tgz", @@ -2124,6 +2287,13 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.55.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.55.0.tgz", @@ -2380,6 +2550,13 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "dev": true, + "license": "ISC" + }, "node_modules/@vitejs/plugin-react": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.1.4.tgz", @@ -3083,6 +3260,16 @@ "dev": true, "license": "MIT" }, + "node_modules/astring": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", + "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", + "dev": true, + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", @@ -3166,6 +3353,17 @@ "node": ">= 0.4" } }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -3355,6 +3553,17 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -3372,6 +3581,50 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -3531,6 +3784,17 @@ "node": ">=6" } }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", + "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -3558,6 +3822,17 @@ "dev": true, "license": "MIT" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/commander": { "version": "14.0.3", "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", @@ -3649,6 +3924,20 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.1.1.tgz", + "integrity": "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, "node_modules/cosmiconfig": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", @@ -3896,6 +4185,20 @@ "dev": true, "license": "MIT" }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -3949,6 +4252,20 @@ "node": ">=6" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "dev": true, + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", @@ -4225,6 +4542,40 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/esast-util-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", + "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/esast-util-from-js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", + "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "acorn": "^8.0.0", + "esast-util-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4486,44 +4837,159 @@ "node": ">=4.0" } }, - "node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", + "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", + "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/eventemitter3": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", - "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "node_modules/estree-util-build-jsx/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, - "license": "MIT" + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } }, - "node_modules/expect-type": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", - "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.0.0" + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" } }, - "node_modules/exsolve": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", - "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "node_modules/estree-util-scope": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", + "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", + "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", + "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true, + "license": "MIT" + }, + "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/eventemitter3": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.4.tgz", + "integrity": "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/expect-type": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", + "integrity": "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, "license": "MIT" }, @@ -5099,6 +5565,77 @@ "node": ">= 0.4" } }, + "node_modules/hast-util-to-estree": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", + "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -5278,6 +5815,13 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "dev": true, + "license": "MIT" + }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", @@ -5293,6 +5837,32 @@ "node": ">= 0.4" } }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -5448,6 +6018,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -5523,6 +6104,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", @@ -6189,6 +6781,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6248,6 +6851,19 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", + "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -6258,6 +6874,185 @@ "node": ">= 0.4" } }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", + "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/mdn-data": { "version": "2.12.2", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", @@ -6288,6 +7083,630 @@ "node": ">= 8" } }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", + "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", + "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", + "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", + "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", + "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", + "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", + "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "dev": true, + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", @@ -6695,6 +8114,33 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "dev": true, + "license": "MIT" + }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -7117,6 +8563,17 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", @@ -7204,6 +8661,46 @@ "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.13.1.tgz", + "integrity": "sha512-td+xP4X2/6BJvZoX6xw++A2DdEi++YypA69bJUV5oVvqf6/9/9nNlD70YO1e9d3MyamJEBQFEzk6mbfDYbqrSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.13.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.13.1.tgz", + "integrity": "sha512-UJnV3Rxc5TgUPJt2KJpo1Jpy0OKQr0AjgbZzBFjaPJcFOb2Y8jA5H3LT8HUJAiRLlWrEXWHbF1Z4SCZaQjWDHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "react-router": "7.13.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/read-cache": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", @@ -7240,6 +8737,77 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/recma-build-jsx": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", + "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-jsx": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.1.tgz", + "integrity": "sha512-huSIy7VU2Z5OLv6oFLosQGGDqPqdO1iq6bWNAdhzMxSJP7RAso4fCZ1cKu8j9YHCZf3TPrq4dw3okhrylgcd7w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn-jsx": "^5.0.0", + "estree-util-to-js": "^2.0.0", + "recma-parse": "^1.0.0", + "recma-stringify": "^1.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/recma-parse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", + "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "esast-util-from-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/recma-stringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", + "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-util-to-js": "^2.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -7311,6 +8879,72 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/rehype-recma": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", + "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "hast-util-to-estree": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.1.tgz", + "integrity": "sha512-Pjj2IYlUY3+D8x00UJsIOg5BEvfMyeI+2uLPn9VO9Wg4MEtN/VTIq2NEJQfde9PnX15KgtHyl9S0BcTnWrIuWg==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -7553,6 +9187,13 @@ "node": ">=10" } }, + "node_modules/set-cookie-parser": { + "version": "2.7.2", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz", + "integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==", + "dev": true, + "license": "MIT" + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -7786,6 +9427,17 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/split2": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", @@ -7932,6 +9584,21 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "dev": true, + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-ansi": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.2.tgz", @@ -7974,6 +9641,26 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "dev": true, + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/sucrase": { "version": "3.35.1", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", @@ -8235,6 +9922,28 @@ "node": ">=20" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.4.0.tgz", @@ -8427,6 +10136,113 @@ "dev": true, "license": "MIT" }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", + "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/universalify": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", @@ -8485,6 +10301,36 @@ "dev": true, "license": "MIT" }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { "version": "6.4.1", "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", @@ -9616,6 +11462,17 @@ "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 61c8274..7d7dafc 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,8 @@ "@commitlint/cli": "^20.4.1", "@commitlint/config-conventional": "^20.4.1", "@eslint/js": "^9.39.1", + "@mdx-js/react": "^3.1.1", + "@mdx-js/rollup": "^3.1.1", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", @@ -44,6 +46,7 @@ "playwright": "^1.58.2", "postcss": "^8.4.49", "prettier": "^3.8.1", + "react-router-dom": "^7.13.1", "tailwind-merge": "^3.4.0", "tailwindcss": "^3.4.17", "typescript": "~5.7.0", diff --git a/src/App.tsx b/src/App.tsx index 8d2452f..a8a5180 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,11 +1,24 @@ +import { BrowserRouter, Routes, Route, Navigate } from "react-router-dom"; import { ThemeProvider } from "@/theme"; import Playground from "./Playground"; +import DocsApp from "./docs/DocsApp"; import "@/theme/index.css"; function App() { return ( - + + + {/* Playground Route */} + } /> + + {/* Documentation Route */} + } /> + + {/* Fallback */} + } /> + + ); } diff --git a/src/Playground.tsx b/src/Playground.tsx index a83c306..ba40704 100644 --- a/src/Playground.tsx +++ b/src/Playground.tsx @@ -1,4 +1,5 @@ import { useState } from "react"; +import { Link } from "react-router-dom"; import { Button } from "@/components/Button"; import { Input } from "@/components/Input"; import { Modal } from "@/components/Modal"; @@ -8,9 +9,9 @@ import { useTheme } from "@/theme"; import { Badge } from "./components/Badge"; import { Avatar } from "@/components/Avatar"; import { Skeleton } from "@/components/Skeleton"; -import Checkbox from "@/components/Checkbox"; +import { Checkbox } from "@/components/Checkbox"; import { ScrollArea, ScrollElement } from "@/components/ScrollArea"; -import RadioGroup from "@/components/RadioGroup"; +import { RadioGroup } from "@/components/RadioGroup"; import reactLogo from "@/assets/react.svg"; import type { ThemeOverride } from "@/theme"; @@ -219,6 +220,13 @@ export default function Playground() { Interactive playground for testing components +
+ + + +
diff --git a/src/components/Checkbox/Checkbox.tsx b/src/components/Checkbox/Checkbox.tsx index 2233595..006242c 100644 --- a/src/components/Checkbox/Checkbox.tsx +++ b/src/components/Checkbox/Checkbox.tsx @@ -1,7 +1,7 @@ import { forwardRef, useEffect, useRef, useImperativeHandle } from "react"; import type { CheckboxProps } from "./Checkbox.types"; import { useTheme } from "@/theme"; -import Skeleton from "../Skeleton"; +import { Skeleton } from "../Skeleton"; import { cn } from "@/utils/cn"; import { descriptionSizeClasses, @@ -163,4 +163,4 @@ const Checkbox = forwardRef( Checkbox.displayName = "Checkbox"; -export default Checkbox; +export { Checkbox }; diff --git a/src/components/Checkbox/index.ts b/src/components/Checkbox/index.ts index dc638ad..e5bcad8 100644 --- a/src/components/Checkbox/index.ts +++ b/src/components/Checkbox/index.ts @@ -1,3 +1,3 @@ -export { default } from "./Checkbox"; +export { Checkbox } from "./Checkbox"; export * from "./Checkbox.types"; export * from "./Checkbox.constants"; diff --git a/src/components/Modal/Modal.tsx b/src/components/Modal/Modal.tsx index 316fe47..1015da6 100644 --- a/src/components/Modal/Modal.tsx +++ b/src/components/Modal/Modal.tsx @@ -6,7 +6,7 @@ import type { ModalProps } from "./Modal.types"; import { MODAL_SIZES } from "./Modal.types"; import { CloseIcon } from "@/assets/Icons/CloseIcon"; -export const Modal: FC = ({ +const Modal: FC = ({ id, isOpen, onClose, @@ -108,4 +108,4 @@ export const Modal: FC = ({ Modal.displayName = "Modal"; -export default Modal; +export { Modal }; diff --git a/src/components/RadioGroup/RadioGroup.tsx b/src/components/RadioGroup/RadioGroup.tsx index 97849e9..9ea72d0 100644 --- a/src/components/RadioGroup/RadioGroup.tsx +++ b/src/components/RadioGroup/RadioGroup.tsx @@ -1,7 +1,7 @@ import { forwardRef, useState } from "react"; import type { RadioGroupProps } from "./RadioGroup.types"; import { useTheme } from "@/theme"; -import Skeleton from "../Skeleton"; +import { Skeleton } from "../Skeleton"; import { Typography } from "../Typography"; import { cn } from "@/utils"; import { @@ -250,4 +250,4 @@ const RadioGroup = forwardRef( RadioGroup.displayName = "RadioGroup"; -export default RadioGroup; +export { RadioGroup }; diff --git a/src/components/RadioGroup/index.ts b/src/components/RadioGroup/index.ts index ff6b007..61d8273 100644 --- a/src/components/RadioGroup/index.ts +++ b/src/components/RadioGroup/index.ts @@ -1,2 +1,2 @@ -export { default } from "./RadioGroup"; +export { RadioGroup } from "./RadioGroup"; export * from "./RadioGroup.types"; diff --git a/src/components/ScrollArea/ScrollArea.tsx b/src/components/ScrollArea/ScrollArea.tsx index e233900..0505f1b 100644 --- a/src/components/ScrollArea/ScrollArea.tsx +++ b/src/components/ScrollArea/ScrollArea.tsx @@ -65,5 +65,8 @@ export const ScrollAreaItem = ({ ); }; -export { ScrollAreaComponent as ScrollArea }; +const ScrollArea = ScrollAreaComponent as any; +ScrollArea.Item = ScrollAreaItem; + +export { ScrollArea }; export { ScrollAreaItem as ScrollElement }; diff --git a/src/components/Skeleton/Skeleton.tsx b/src/components/Skeleton/Skeleton.tsx index cd6802d..26a064d 100644 --- a/src/components/Skeleton/Skeleton.tsx +++ b/src/components/Skeleton/Skeleton.tsx @@ -55,7 +55,7 @@ function variantStyles(variant: SkeletonVariant): CSSProperties { } } -export function Skeleton({ +function Skeleton({ variant = "rectangular", animation = "wave", width, @@ -97,4 +97,4 @@ export function Skeleton({ ); } -export default Skeleton; +export { Skeleton }; diff --git a/src/components/Skeleton/index.ts b/src/components/Skeleton/index.ts index de1f29c..4b9cd27 100644 --- a/src/components/Skeleton/index.ts +++ b/src/components/Skeleton/index.ts @@ -1,2 +1,2 @@ -export * from "./Skeleton"; -export { default } from "./Skeleton"; +export { Skeleton } from "./Skeleton"; +export type { SkeletonProps } from "./Skeleton"; diff --git a/src/docs/DocsApp.tsx b/src/docs/DocsApp.tsx new file mode 100644 index 0000000..46dc34f --- /dev/null +++ b/src/docs/DocsApp.tsx @@ -0,0 +1,233 @@ +import React, { Suspense, lazy } from "react"; +import { Routes, Route, Navigate, Link } from "react-router-dom"; +import { DocsLayout } from "./DocsLayout"; +import { useTheme } from "@/theme"; +import { Typography } from "@/components/Typography"; +import { Button } from "@/components/Button"; + +// Lazy load MDX components +const ButtonDocs = lazy(() => import("./pages/Button.mdx")); +const InputDocs = lazy(() => import("./pages/Input.mdx")); +const RadioGroupDocs = lazy(() => import("./pages/RadioGroup.mdx")); +const AccordionDocs = lazy(() => import("./pages/Accordion.mdx")); +const AvatarDocs = lazy(() => import("./pages/Avatar.mdx")); +const BadgeDocs = lazy(() => import("./pages/Badge.mdx")); +const CheckboxDocs = lazy(() => import("./pages/Checkbox.mdx")); +const ModalDocs = lazy(() => import("./pages/Modal.mdx")); +const ScrollAreaDocs = lazy(() => import("./pages/ScrollArea.mdx")); +const SkeletonDocs = lazy(() => import("./pages/Skeleton.mdx")); +const TypographyDocs = lazy(() => import("./pages/Typography.mdx")); +const ThemingDocs = lazy(() => import("./pages/Theming.mdx")); + +const navigation = [ + { name: "Accordion", path: "/docs/accordion", icon: "🪗" }, + { name: "Avatar", path: "/docs/avatar", icon: "👤" }, + { name: "Badge", path: "/docs/badge", icon: "🏷️" }, + { name: "Button", path: "/docs/button", icon: "🔘" }, + { name: "Checkbox", path: "/docs/checkbox", icon: "✅" }, + { name: "Input", path: "/docs/input", icon: "⌨️" }, + { name: "Modal", path: "/docs/modal", icon: "🪟" }, + { name: "Radio Group", path: "/docs/radio-group", icon: "🔘" }, + { name: "Scroll Area", path: "/docs/scroll-area", icon: "🖱️" }, + { name: "Skeleton", path: "/docs/skeleton", icon: "🦴" }, + { name: "Typography", path: "/docs/typography", icon: "✍️" }, +]; + +const homeThemes = [ + { + name: "Ocean Drift", + color: "#0ea5e9", + desc: "Deep atmospheric blues for professional data interfaces.", + config: { palette: { primary: { 500: "#0ea5e9" } } }, + }, + { + name: "Electric Violet", + color: "#8b5cf6", + desc: "Bold purple tones for creative and modern startups.", + config: { palette: { primary: { 500: "#8b5cf6" } } }, + }, + { + name: "Rose Gold", + color: "#f43f5e", + desc: "Warm and elegant rose tones for premium experiences.", + config: { palette: { primary: { 500: "#f43f5e" } } }, + }, +]; + +const LandingPage = () => { + const { overrideTheme, resetTheme, theme } = useTheme(); + + return ( +
+ {/* Background Glow */} +
+ + {/* Announcement */} +
+
+ New Release + | + Version 2.0.0 is now live + + → + +
+
+ + {/* Hero Text */} +
+

+ Craft Exceptional{" "} + Interfaces. +

+

+ A premium component library designed to give your projects a distinct + visual edge. Built with performance, accessibility, and high-end + aesthetics at its core. +

+
+ + {/* CTA's */} +
+ + + + + + +
+ + {/* Premium Theme Showcase */} +
+
+
+ + Instant Theming + +

+ One click to completely redefine your experience. +

+
+ +
+ +
+ {homeThemes.map((t, idx) => ( + + ))} +
+
+ + {/* Visual Component Discovery */} +
+
+ + Explore Ecosystem + +

+ {navigation.length} components ready for integration. +

+
+
+ {navigation.map((comp, idx) => ( + +
+ {comp.icon} +
+ + {comp.name} + + + ))} +
+
+
+ ); +}; + +export const DocsApp: React.FC = () => { + return ( + + + } + > + + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + } /> + + + + ); +}; + +const RadioGroup_Docs = RadioGroupDocs; +export default DocsApp; diff --git a/src/docs/DocsLayout.tsx b/src/docs/DocsLayout.tsx new file mode 100644 index 0000000..832dbed --- /dev/null +++ b/src/docs/DocsLayout.tsx @@ -0,0 +1,283 @@ +import React, { useState, useMemo } from "react"; +import { Link, useLocation } from "react-router-dom"; +import { cn } from "@/utils"; +import { useTheme } from "@/theme"; +import { Button } from "@/components/Button"; + +const navigation = [ + { + title: "Getting Started", + links: [ + { name: "Introduction", path: "/docs" }, + { name: "Theming", path: "/docs/theming" }, + ], + }, + { + title: "Components", + links: [ + { name: "Accordion", path: "/docs/accordion" }, + { name: "Avatar", path: "/docs/avatar" }, + { name: "Badge", path: "/docs/badge" }, + { name: "Button", path: "/docs/button" }, + { name: "Checkbox", path: "/docs/checkbox" }, + { name: "Input", path: "/docs/input" }, + { name: "Modal", path: "/docs/modal" }, + { name: "Radio Group", path: "/docs/radio-group" }, + { name: "Scroll Area", path: "/docs/scroll-area" }, + { name: "Skeleton", path: "/docs/skeleton" }, + { name: "Typography", path: "/docs/typography" }, + ], + }, +]; + +export const DocsLayout: React.FC<{ children: React.ReactNode }> = ({ + children, +}) => { + const location = useLocation(); + const { theme, toggleColorMode } = useTheme(); + const [isSidebarOpen, setIsSidebarOpen] = useState(false); + const [searchQuery, setSearchQuery] = useState(""); + + const activeLink = navigation + .flatMap((n) => n.links) + .find((l) => l.path === location.pathname); + + const isHomePage = + location.pathname === "/docs" || location.pathname === "/docs/"; + + const filteredNavigation = useMemo(() => { + if (!searchQuery) return navigation; + return navigation + .map((section) => ({ + ...section, + links: section.links.filter((link) => + link.name.toLowerCase().includes(searchQuery.toLowerCase()), + ), + })) + .filter((section) => section.links.length > 0); + }, [searchQuery]); + + return ( +
+ {/* Top Navigation Header */} +
+
+ +
+ UI +
+ Awesome UI + + + +
+ +
+ {/* Integrated Search */} +
+ setSearchQuery(e.target.value)} + className="h-9 px-4 pl-10 rounded-full border bg-background/50 text-xs w-48 focus:w-72 transition-all outline-none focus:ring-2 focus:ring-pink-500/20" + style={{ borderColor: theme.tokens.border }} + /> + + 🔍 + + {searchQuery && ( + + )} +
+ +
+ + + + + + + +
+
+
+ +
+ {/* Sidebar */} + + + {/* Main Content */} +
+ {!isHomePage && ( + + )} +
+ {children} +
+
+
+ + +
+ ); +}; diff --git a/src/docs/components/ComponentPreview.tsx b/src/docs/components/ComponentPreview.tsx new file mode 100644 index 0000000..cb58fcf --- /dev/null +++ b/src/docs/components/ComponentPreview.tsx @@ -0,0 +1,110 @@ +import React, { useState } from "react"; +import { cn } from "@/utils"; +import { useTheme } from "@/theme"; + +interface ComponentPreviewProps { + children: React.ReactNode; + code: string; + className?: string; +} + +export const ComponentPreview: React.FC = ({ + children, + code, + className, +}) => { + const [showCode, setShowCode] = useState(false); + const [copied, setCopied] = useState(false); + const { theme } = useTheme(); + + const copyToClipboard = () => { + navigator.clipboard.writeText(code); + setCopied(true); + setTimeout(() => setCopied(false), 2000); + }; + + return ( +
+ {/* Interactive Preview Area */} +
+
+ {children} +
+
+ + {/* Action Bar */} +
+ + +
+ + {/* Code Area */} + {showCode && ( +
+
+            {code}
+          
+
+ )} +
+ ); +}; diff --git a/src/docs/components/ModalDemo.tsx b/src/docs/components/ModalDemo.tsx new file mode 100644 index 0000000..560d8dd --- /dev/null +++ b/src/docs/components/ModalDemo.tsx @@ -0,0 +1,46 @@ +import React, { useState } from "react"; +import { Modal } from "@/components/Modal"; +import { Button } from "@/components/Button"; + +interface ModalDemoProps { + title?: string; + size?: "sm" | "md" | "lg" | "xl"; + showCloseButton?: boolean; +} + +export const ModalDemo: React.FC = ({ + title = "Sample Modal", + size = "md", + showCloseButton = true, +}) => { + const [isOpen, setIsOpen] = useState(false); + + return ( +
+ + + setIsOpen(false)} + title={title} + size={size} + showCloseButton={showCloseButton} + > +
+

+ This is an interactive demonstration of the Modal component. It + supports smooth transitions, backdrop blur, and theme-aware styling. +

+
+ + +
+
+
+
+ ); +}; diff --git a/src/docs/components/PropsTable.tsx b/src/docs/components/PropsTable.tsx new file mode 100644 index 0000000..a4c4933 --- /dev/null +++ b/src/docs/components/PropsTable.tsx @@ -0,0 +1,106 @@ +import React from "react"; +import { useTheme } from "@/theme"; + +interface PropItem { + name: string; + type: string; + defaultValue?: string; + description: string; + required?: boolean; +} + +interface PropsTableProps { + props: PropItem[]; +} + +export const PropsTable: React.FC = ({ props }) => { + const { theme } = useTheme(); + + return ( +
+ + + + + + + + + + + {props.map((prop) => ( + + + + + + + ))} + +
+ Prop + + Type + + Default + + Description +
+ {prop.name} + {prop.required && ( + * + )} + + + {prop.type} + + + {prop.defaultValue || "-"} + + {prop.description} +
+
+ ); +}; diff --git a/src/docs/pages/Accordion.mdx b/src/docs/pages/Accordion.mdx new file mode 100644 index 0000000..9fbe312 --- /dev/null +++ b/src/docs/pages/Accordion.mdx @@ -0,0 +1,71 @@ +import { Accordion } from '@/components/Accordion'; +import { Typography } from '@/components/Typography'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Accordions are vertically collapsing containers that manage large amounts of content in a compact footprint. They are perfect for FAQ sections, settings panels, and detail-rich lists. + +## Basic Usage +A standard accordion includes a title, an optional subtitle, and the body content. + + + This library is a collection of high-performance, theme-aware React components + styled with Tailwind CSS and advanced CSS animations. +`}> +
+ What is this UI Library?} + subtitle="Frequently Asked Questions" + > +
+ Our library is built on top of modern standards using React and Tailwind. + Every component is designed to be accessible, performant, and deeply customizable + via our integrated theming engine. +
+
+
+
+ +## Customization +### Borderless Style +For a more integrated look, use the `borderless` variant. + + + Content here... +`}> +
+ +
Modify your theme and layout preferences here.
+
+ +
Manage your data and notification settings.
+
+
+
+ +### Default Open & Disabled +Control the initial state or prevent user interaction. + +... +...`}> +
+ + This accordion starts in the open state. + + + You cannot open this section until criteria are met. + +
+
+ +## Reference + diff --git a/src/docs/pages/Avatar.mdx b/src/docs/pages/Avatar.mdx new file mode 100644 index 0000000..59c19a2 --- /dev/null +++ b/src/docs/pages/Avatar.mdx @@ -0,0 +1,16 @@ +import { Avatar } from '@/components/Avatar'; +import { ComponentPreview } from '../components/ComponentPreview'; + +Avatars are used to represent users or entities. + +## Basic Usage +`}> +
+ + + +
+
diff --git a/src/docs/pages/Badge.mdx b/src/docs/pages/Badge.mdx new file mode 100644 index 0000000..e66ed85 --- /dev/null +++ b/src/docs/pages/Badge.mdx @@ -0,0 +1,61 @@ +import { Badge } from '@/components/Badge'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Badges are compact status indicators that highlight metadata, status, or counts. They are designed to stand out without disrupting the layout flow. + +## Basic Usage +Use badges to represent states like progress, success, or urgency. + +Updated +Online +High Priority`}> +
+ New Feature + System Online + Maintenance + Security Risk +
+
+ +## Customization +### Sizes +Badges come in three sizes to fit different contexts. + +Small +Medium +Large`}> +
+ Small Label + Standard Badge + Hero Badge +
+
+ +### Outline Style +For a more subtle look, use the `outline` variant. + +Secondary`}> +
+ Draft + Archived +
+
+ +### Loading State +Badges support a built-in skeleton state for when data is still fetching. + +Placeholder`}> +
+ Loading... + Large Loading +
+
+ +## Reference + diff --git a/src/docs/pages/Button.mdx b/src/docs/pages/Button.mdx new file mode 100644 index 0000000..878bb3e --- /dev/null +++ b/src/docs/pages/Button.mdx @@ -0,0 +1,76 @@ +import { Button } from '@/components/Button'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Buttons are fundamental interactive elements that trigger actions, submit forms, or navigate the user. Our design system provides a rich set of variants, sizes, and states to fit every functional requirement. + +## Variants +Use different variants to signal the importance of an action and maintain visual hierarchy. + +Primary + + +`}> +
+ + + + +
+
+ +## States +### Loading & Disabled +Handle asynchronous operations and form validation gracefully. + +Processing... +`}> +
+ + + +
+
+ +## Customization +### Sizes +Buttons support three sizes: `sm`, `md` (default), and `lg`. + +Small + +`}> +
+ + + +
+
+ +### Semantic Colors +Communicate success, warning, or danger states instantly. + +Save Changes + +`}> +
+ + + +
+
+ +## Best Practices +- **Labeling**: Use clear, actionable verbs (e.g., "Save", "Create", "Post"). +- **Hierarchy**: Use only one Primary button per view to draw focus. +- **Accessibility**: All buttons are keyboard navigable and support `aria-label` for icons. + +## Reference + diff --git a/src/docs/pages/Checkbox.mdx b/src/docs/pages/Checkbox.mdx new file mode 100644 index 0000000..927d6ee --- /dev/null +++ b/src/docs/pages/Checkbox.mdx @@ -0,0 +1,51 @@ +import { Checkbox } from '@/components/Checkbox'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Checkboxes allow users to select one or more items from a set. + +## Basic Usage +`}> + + + +## States +Checkboxes can have descriptions, show errors, or be indeterminate. + +`}> + + + +### Indeterminate +`}> + + + +## Sizes + + +`}> +
+ + + +
+
+ +## Props + diff --git a/src/docs/pages/Input.mdx b/src/docs/pages/Input.mdx new file mode 100644 index 0000000..84cb3e5 --- /dev/null +++ b/src/docs/pages/Input.mdx @@ -0,0 +1,71 @@ +import { Input } from '@/components/Input'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Inputs are fundamental form components for collecting user text, numbers, or passwords. They provide built-in validation feedback, icon support, and theme-aware styling. + +## Basic Usage +A standard input includes a label, a placeholder, and optional helper text. + +`}> +
+ +
+
+ +## Customization +### Icons & Loading +Enhance meaning with leading or trailing icons, or show a loading indicator. + +🔍} placeholder="Search..." /> +👁️} type="password" /> +`}> +
+ 🔍} placeholder="Search components..." /> + 👁️} type="password" placeholder="••••••••" /> + +
+
+ +### Validation States +Clear visual cues help users correct errors or confirm success. + +`}> +
+ +
+
+ +### Sizes +Inputs support three sizes: `sm`, `md` (default), and `lg`. + + + +`}> +
+ + + +
+
+ +## Reference + diff --git a/src/docs/pages/Modal.mdx b/src/docs/pages/Modal.mdx new file mode 100644 index 0000000..3785f9c --- /dev/null +++ b/src/docs/pages/Modal.mdx @@ -0,0 +1,53 @@ +import { ModalDemo } from '../components/ModalDemo'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Modals are overlay windows used to focus the user's attention on a specific task or information. They block interaction with the rest of the application until closed. + +## Basic Usage +Use the `isOpen` and `onClose` props to control the modal's state. + + setIsOpen(true)}>Open Modal + + setIsOpen(false)} + title="Confirmation" +> + Are you sure you want to proceed with this action? +`}> + + + +## Customization +### Modal Sizes +Modals support multiple widths: `sm`, `md` (default), `lg`, and `xl`. + + +`}> +
+ + + +
+
+ +### Header Configuration +You can toggle the close button or change the title. + +`}> + + + +## Props + void', required: true, description: 'Function called when the modal is closed via backdrop, escape, or close button.' }, + { name: 'title', type: 'string', description: 'Header text for the modal.' }, + { name: 'size', type: '"sm" | "md" | "lg" | "xl"', defaultValue: '"md"', description: 'Width of the modal container.' }, + { name: 'showCloseButton', type: 'boolean', defaultValue: 'true', description: 'Shows the "X" button in the top right.' }, + { name: 'preventBackdropClose', type: 'boolean', defaultValue: 'false', description: 'Disables closing the modal when clicking outside.' }, + { name: 'preventEscapeClose', type: 'boolean', defaultValue: 'false', description: 'Disables closing the modal when pressing the Escape key.' }, +]} /> diff --git a/src/docs/pages/RadioGroup.mdx b/src/docs/pages/RadioGroup.mdx new file mode 100644 index 0000000..60ca291 --- /dev/null +++ b/src/docs/pages/RadioGroup.mdx @@ -0,0 +1,76 @@ +import { RadioGroup } from '@/components/RadioGroup'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Radio groups allow users to select a single option from a set of choices. + +## Basic Usage +Standard vertical radio group with labels and descriptions. + +`}> + + + +## Card Variant +The `card` variant provides a more tactile, button-like interface for radio options. + +`}> + + + +## Orientation +Display options horizontally using the `orientation` prop. + +`}> + + + +## Props + diff --git a/src/docs/pages/ScrollArea.mdx b/src/docs/pages/ScrollArea.mdx new file mode 100644 index 0000000..8a24f71 --- /dev/null +++ b/src/docs/pages/ScrollArea.mdx @@ -0,0 +1,65 @@ +import { ScrollArea, ScrollElement as ScrollAreaItem } from '@/components/ScrollArea'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +ScrollArea targets large content blocks by providing a smooth scroll container with reveal-on-scroll animations. It helps keep long lists or documents contained while maintaining a premium feel. + +## Basic Usage +Wrap your content in a `ScrollArea` and use `ScrollAreaItem` (or `ScrollArea.Item`) for individual items you want to animate. + + +
+ +
Item 1
+
+ +
Item 2
+
+
+`}> + +
+ +
Scroll slowly to see the reveal animation
+
+ +
Item 2 (Reveal Up)
+
+ +
Item 3 (Fade In)
+
+ +
Item 4 (Blur Entrance)
+
+
+
+
+ +## Customization +### Animation Presets +You can specify the entrance effect per item. + +| Type | Description | +| :--- | :--- | +| `up` / `down` | Horizontal slide with fade | +| `left` / `right` | Vertical slide with fade | +| `fade` | Simple opacity transition | +| `scale` | Zoom-in effect | +| `blur` | Soft blur-to-clear transition | + +## Reference +### ScrollArea Props + + +### ScrollAreaItem Props + diff --git a/src/docs/pages/Skeleton.mdx b/src/docs/pages/Skeleton.mdx new file mode 100644 index 0000000..028d0c8 --- /dev/null +++ b/src/docs/pages/Skeleton.mdx @@ -0,0 +1,68 @@ +import { Skeleton } from '@/components/Skeleton'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Skeletons are used to indicate that a piece of content is loading. They provide a better user experience than blank spaces or spinners by maintaining the layout's structural integrity. + +## Basic Usage +Skeletons can mimic any shape from text lines to profile pictures. + + + +`}> +
+
+ +
+ + +
+
+ +
+ + + +
+
+
+ +## Customization +### Animation Presets +Choose between a smooth pulse or a dynamic wave effect. + + + +`}> +
+
+ Wave (Default) + +
+
+ Pulse + +
+
+ Static + +
+
+
+ +### Shape Variants +| Variant | Description | +| :--- | :--- | +| `text` | Simulates a line of text with specific scale and radius. | +| `circular` | Perfect for avatars or round icon placeholders. | +| `rectangular` | Standard box shape for images or large blocks. | +| `rounded` | Rectangular with a larger 12px border radius. | + +## Reference + diff --git a/src/docs/pages/Theming.mdx b/src/docs/pages/Theming.mdx new file mode 100644 index 0000000..3245d89 --- /dev/null +++ b/src/docs/pages/Theming.mdx @@ -0,0 +1,51 @@ +import { Button } from '@/components/Button'; +import { ComponentPreview } from '../components/ComponentPreview'; + +The library is built on a robust, token-based theming system that supports light mode, dark mode, and custom brand overrides. + +## Theme Provider +To use the theme system, wrap your application in the `ThemeProvider`. + +```tsx +import { ThemeProvider } from 'ui-library'; + +function App() { + return ( + + + + ); +} +``` + +## How it Works +The theme system uses **CSS Variables** defined in `:root` and `.dark` classes (or custom theme classes). This means: +- **No extra JS weight** for runtime style calculations. +- **Zero Flash of Unstyled Content** (FOUC). +- **Infinite customization** — just override the CSS variables. + +## Dynamic Overrides +You can live-update the theme programmatically using the `useTheme` hook. This is what powers the theme picker in the Playground. + +```tsx +const { overrideTheme, resetTheme } = useTheme(); + +const oceanTheme = { + palette: { + primary: { 500: '#0077ff' } + } +}; + + +``` + +## Color Modes +Toggle between light and dark modes with a single call. + + + {theme.colorMode === 'light' ? 'Switch to Dark' : 'Switch to Light'} +`}> +

Try toggling the mode using the button in the top-right of the docs!

+
diff --git a/src/docs/pages/Typography.mdx b/src/docs/pages/Typography.mdx new file mode 100644 index 0000000..fd2f21d --- /dev/null +++ b/src/docs/pages/Typography.mdx @@ -0,0 +1,61 @@ +import { Typography } from '@/components/Typography'; +import { ComponentPreview } from '../components/ComponentPreview'; +import { PropsTable } from '../components/PropsTable'; + +Typography is used to maintain visual hierarchy and readability throughout the application. + +## Display Variants +Use display variants for large, impactful text like hero headlines. + +Display 1 +Display 2`}> +
+ Display 1 + Display 2 +
+
+ +## Heading Variants +Standard headings from H1 to H6. + +Heading 1 +Heading 2 +Heading 3`}> +
+ Heading 1 + Heading 2 + Heading 3 +
+
+ +## Body & Support +Text styles for paragraphs, captions, and overlines. + +Body 1: The standard paragraph style. +Body 2: A slightly smaller paragraph style. +Caption: Smallest text for meta info.`}> +
+ Body 1: The standard paragraph style. + Body 2: A slightly smaller paragraph style. + Caption: Smallest text for meta info. +
+
+ +## Custom Weights +You can override the default weight of any variant. + +Bold H4 +Thin H4`}> +
+ Bold H4 + Thin H4 +
+
+ +## Props + diff --git a/vite.config.ts b/vite.config.ts index e1dda2c..913be53 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -3,6 +3,7 @@ import react from "@vitejs/plugin-react"; import { resolve, dirname } from "path"; import { fileURLToPath } from "url"; import dts from "vite-plugin-dts"; +import mdx from "@mdx-js/rollup"; const __filename = fileURLToPath(import.meta.url); const __dirname = dirname(__filename); @@ -16,6 +17,7 @@ export default defineConfig({ exclude: ["**/*.test.tsx", "**/*.test.ts"], rollupTypes: false, }), + mdx(), ], resolve: { alias: { From 5d9a6bc0d5727cbabe541ad247b6a6ef6645ff30 Mon Sep 17 00:00:00 2001 From: ABILASH <114130954+Abilash-19@users.noreply.github.com> Date: Sun, 8 Mar 2026 20:03:06 +0530 Subject: [PATCH 02/15] fix: commitlint config chnages --- commitlint.config.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/commitlint.config.js b/commitlint.config.js index 3fd1fba..fbdae80 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -18,5 +18,13 @@ export default { 'revert', ], ], + + 'type-case': [2, 'always', 'lower-case'], + 'subject-empty': [2, 'never'], + 'subject-case': [ + 2, + 'never', + ['sentence-case', 'start-case', 'pascal-case', 'upper-case'], + ], }, -}; +}; \ No newline at end of file From 43dace53cedbb4e13d26b5d0d87d7a8cf1a77cbd Mon Sep 17 00:00:00 2001 From: ABILASH <114130954+Abilash-19@users.noreply.github.com> Date: Sat, 14 Mar 2026 10:21:20 +0530 Subject: [PATCH 03/15] feat: introduced switch component --- src/Playground.tsx | 94 +++++++++ src/components/Switch/Switch.constants.ts | 43 ++++ src/components/Switch/Switch.tsx | 241 ++++++++++++++++++++++ src/components/Switch/Switch.types.ts | 42 ++++ src/components/Switch/index.ts | 2 + src/components/index.ts | 1 + 6 files changed, 423 insertions(+) create mode 100644 src/components/Switch/Switch.constants.ts create mode 100644 src/components/Switch/Switch.tsx create mode 100644 src/components/Switch/Switch.types.ts create mode 100644 src/components/Switch/index.ts diff --git a/src/Playground.tsx b/src/Playground.tsx index a83c306..e202742 100644 --- a/src/Playground.tsx +++ b/src/Playground.tsx @@ -11,6 +11,7 @@ import { Skeleton } from "@/components/Skeleton"; import Checkbox from "@/components/Checkbox"; import { ScrollArea, ScrollElement } from "@/components/ScrollArea"; import RadioGroup from "@/components/RadioGroup"; +import Switch from "@/components/Switch/Switch"; import reactLogo from "@/assets/react.svg"; import type { ThemeOverride } from "@/theme"; @@ -167,6 +168,7 @@ export default function Playground() { const [isSimulatingData, setIsSimulatingData] = useState(true); const [radioValue, setRadioValue] = useState("option-1"); + const [switchState, setSwitchState] = useState(false); const [checkedItems, setCheckedItems] = useState({ item1: false, @@ -1454,6 +1456,98 @@ export default function Playground() {
+ {/* Switch Section */} +
+
+ + Switches + + + Binary toggle controls with support for labels, loading states, and + different sizes. + +
+ +
+ {/* Basic Usage */} +
+
+ + Interactive State + +
+ + + + +
+
+
+ + {/* Sizes & States */} +
+
+ + Sizes & States + +
+ + + +
+
+ + +
+
+
+
+ + {/* Labels & Descriptions */} +
+ + Labels & Descriptions + +
+ + + +
+
+
+ {/* ScrollArea Section */}
, + string +> = { + small: "text-[13px] font-medium leading-[1.45] tracking-[-0.01em]", + medium: "text-[14px] font-medium leading-[1.45] tracking-[-0.01em]", + large: "text-[15px] font-medium leading-[1.45] tracking-[-0.01em]", +}; + +export const helperSizeClasses: Record< + NonNullable, + string +> = { + small: "text-[11px] leading-[1.5] tracking-[-0.005em]", + medium: "text-[12px] leading-[1.5] tracking-[-0.005em]", + large: "text-[13px] leading-[1.5] tracking-[-0.005em]", +}; + +export const trackSizeClasses: Record< + NonNullable, + { width: string; height: string; thumbSize: string; thumbOffset: string } +> = { + small: { + width: "28px", + height: "16px", + thumbSize: "12px", + thumbOffset: "2px", + }, + medium: { + width: "36px", + height: "20px", + thumbSize: "16px", + thumbOffset: "2px", + }, + large: { + width: "44px", + height: "24px", + thumbSize: "20px", + thumbOffset: "2px", + }, +}; diff --git a/src/components/Switch/Switch.tsx b/src/components/Switch/Switch.tsx new file mode 100644 index 0000000..fee4281 --- /dev/null +++ b/src/components/Switch/Switch.tsx @@ -0,0 +1,241 @@ +import { forwardRef, useState, useId } from "react"; +import type { SwitchProps } from "./Switch.types"; +import { useTheme } from "@/theme"; +import { cn } from "@/utils/cn"; +import { + labelSizeClasses, + helperSizeClasses, + trackSizeClasses, +} from "./Switch.constants"; +import Skeleton from "../Skeleton"; + +const Switch = forwardRef((props, ref) => { + const { + id: idProp, + checked, + onChange, + disabled, + required, + isLoading, + size = "medium", + label, + helperText, + description, + error, + name, + className, + style, + ...rest + } = props; + + const { theme } = useTheme(); + const autoId = useId(); + const id = idProp ?? autoId; + + const labelId = label ? `${id}-label` : undefined; + const descriptionId = + description || helperText ? `${id}-description` : undefined; + const errorId = error ? `${id}-error` : undefined; + + const [checkedState, setCheckedState] = useState(checked ?? false); + + const isControlled = checked !== undefined; + + const handleCheckedChange = (newChecked: boolean) => { + if (!isControlled) { + setCheckedState(newChecked); + } + onChange?.(newChecked); + }; + + const isCurrentlyChecked = isControlled ? checked : checkedState; + const currentTrackSize = trackSizeClasses[size]; + + const themeStyles = { + "--switch-primary": theme.palette.primary[500], + "--switch-primary-hover": theme.palette.primary[600], + "--switch-track-bg": theme.tokens.border, + "--switch-track-hover-bg": theme.tokens.borderStrong ?? theme.tokens.border, + "--switch-thumb-bg": "white", + "--switch-focus-ring": theme.palette.primary[300], + "--text-color": theme.tokens.foreground, + "--text-secondary": theme.tokens.foregroundMuted, + "--error-color": theme.palette.error[500], + "--error-focus-ring": theme.palette.error[300], + } as React.CSSProperties; + + if (isLoading) { + return ( +
+
+ + {label && ( + + )} +
+
+ ); + } + + const ariaDescribedBy = + [errorId, descriptionId].filter(Boolean).join(" ") || undefined; + + return ( +
+ {/* Label + Track row */} +
+ {/* Track / Button */} + + + {/* Label */} + {label && ( + + )} +
+ + {(description || helperText || error) && ( +
+ {error ? ( + + {error} + + ) : description || helperText ? ( + + {description || helperText} + + ) : null} +
+ )} +
+ ); +}); + +Switch.displayName = "Switch"; + +export default Switch; diff --git a/src/components/Switch/Switch.types.ts b/src/components/Switch/Switch.types.ts new file mode 100644 index 0000000..983e3d9 --- /dev/null +++ b/src/components/Switch/Switch.types.ts @@ -0,0 +1,42 @@ +export interface SwitchProps { + id?: string; + + /** Controlled state */ + checked?: boolean; + + /** Fired when switch changes */ + onChange?: (checked: boolean) => void; + + /** Disable interaction */ + disabled?: boolean; + + /** Required field */ + required?: boolean; + + /** Loading state */ + isLoading?: boolean; + + /** Switch size */ + size?: "small" | "medium" | "large"; + + /** Label next to switch */ + label?: React.ReactNode; + + /** description */ + description?: React.ReactNode; + + /** Helper text below */ + helperText?: React.ReactNode; + + /** Error message */ + error?: React.ReactNode; + + /** Name for form submission */ + name?: string; + + /** Custom class */ + className?: string; + + /** Inline style */ + style?: React.CSSProperties; +} diff --git a/src/components/Switch/index.ts b/src/components/Switch/index.ts new file mode 100644 index 0000000..76fefc6 --- /dev/null +++ b/src/components/Switch/index.ts @@ -0,0 +1,2 @@ +export { default } from "./Switch"; +export * from "./Switch.types"; diff --git a/src/components/index.ts b/src/components/index.ts index e95ab28..b3e5f72 100644 --- a/src/components/index.ts +++ b/src/components/index.ts @@ -9,6 +9,7 @@ export * from "./Skeleton"; export * from "./Checkbox"; export * from "./ScrollArea"; export * from "./RadioGroup"; +export * from "./Switch"; // ── Theme ── export { ThemeProvider, useTheme, defaultTheme, darkTheme } from "../theme"; From ff7794c1e313da8d7a4fb52d9575f37ea397bc73 Mon Sep 17 00:00:00 2001 From: ABILASH <114130954+Abilash-19@users.noreply.github.com> Date: Sat, 14 Mar 2026 10:22:07 +0530 Subject: [PATCH 04/15] fix: theme storgae --- src/theme/ThemeProvider.tsx | 41 ++++++++++++++++++++++++++++++------- 1 file changed, 34 insertions(+), 7 deletions(-) diff --git a/src/theme/ThemeProvider.tsx b/src/theme/ThemeProvider.tsx index ae8640e..057af43 100644 --- a/src/theme/ThemeProvider.tsx +++ b/src/theme/ThemeProvider.tsx @@ -70,7 +70,18 @@ export function ThemeProvider({ return defaultThemeName; }); - const [override, setOverride] = useState(null); + const [override, setOverride] = useState(() => { + if (storageKey) { + const stored = localStorage.getItem(`${storageKey}-override`); + try { + return stored ? JSON.parse(stored) : null; + } catch (e) { + console.error("Failed to parse theme override from storage", e); + return null; + } + } + return null; + }); const baseTheme = THEME_REGISTRY[activeThemeName] ?? defaultTheme; const theme = useMemo( @@ -78,7 +89,6 @@ export function ThemeProvider({ [baseTheme, override], ); - // Apply CSS variables whenever the theme changes useEffect(() => { applyTheme(theme); }, [theme]); @@ -91,7 +101,10 @@ export function ThemeProvider({ } setActiveThemeName(name); setOverride(null); - if (storageKey) localStorage.setItem(storageKey, name); + if (storageKey) { + localStorage.setItem(storageKey, name); + localStorage.removeItem(`${storageKey}-override`); + } }, [storageKey], ); @@ -107,11 +120,25 @@ export function ThemeProvider({ } }, [theme.colorMode, storageKey]); - const overrideTheme = useCallback((o: ThemeOverride) => { - setOverride((prev) => (prev ? { ...prev, ...o } : o)); - }, []); + const overrideTheme = useCallback( + (o: ThemeOverride) => { + setOverride((prev) => { + const next = prev ? { ...prev, ...o } : o; + if (storageKey) { + localStorage.setItem(`${storageKey}-override`, JSON.stringify(next)); + } + return next; + }); + }, + [storageKey], + ); - const resetTheme = useCallback(() => setOverride(null), []); + const resetTheme = useCallback(() => { + setOverride(null); + if (storageKey) { + localStorage.removeItem(`${storageKey}-override`); + } + }, [storageKey]); const value = useMemo( () => ({ theme, setTheme, toggleColorMode, overrideTheme, resetTheme }), From 13d98532acf8d220744591ed9a9db95cea576099 Mon Sep 17 00:00:00 2001 From: ABILASH <114130954+Abilash-19@users.noreply.github.com> Date: Fri, 20 Mar 2026 23:11:01 +0530 Subject: [PATCH 05/15] fix: focus style chnages --- src/components/Checkbox/Checkbox.tsx | 2 +- src/components/Input/Input.tsx | 2 +- src/components/RadioGroup/RadioGroup.tsx | 2 +- src/components/Switch/Switch.tsx | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/components/Checkbox/Checkbox.tsx b/src/components/Checkbox/Checkbox.tsx index 2233595..a2be33d 100644 --- a/src/components/Checkbox/Checkbox.tsx +++ b/src/components/Checkbox/Checkbox.tsx @@ -119,7 +119,7 @@ const Checkbox = forwardRef( "peer-checked:[&_.check-icon]:opacity-100 peer-checked:[&_.check-icon]:scale-100", "peer-indeterminate:border-[var(--primary)] peer-indeterminate:bg-[var(--primary)]", "peer-indeterminate:[&_.indeterminate-icon]:opacity-100 peer-indeterminate:[&_.indeterminate-icon]:scale-100", - "peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--ring)] peer-focus-visible:ring-offset-2", + "peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--ring)]", )} > {/* Check Icon */} diff --git a/src/components/Input/Input.tsx b/src/components/Input/Input.tsx index f92357e..43bc8cd 100644 --- a/src/components/Input/Input.tsx +++ b/src/components/Input/Input.tsx @@ -80,7 +80,7 @@ const Input = forwardRef( className={cn( "group relative flex w-full items-center gap-2 px-3 rounded-[var(--radius)] border bg-[var(--bg)] transition-all duration-200", "border-[var(--border)]", - "focus-within:ring-2 focus-within:ring-[var(--ring)] focus-within:ring-offset-2", + "focus-within:ring-2 focus-within:ring-[var(--ring)]", disabled && "opacity-60 cursor-not-allowed", )} > diff --git a/src/components/RadioGroup/RadioGroup.tsx b/src/components/RadioGroup/RadioGroup.tsx index 97849e9..296a191 100644 --- a/src/components/RadioGroup/RadioGroup.tsx +++ b/src/components/RadioGroup/RadioGroup.tsx @@ -182,7 +182,7 @@ const RadioGroup = forwardRef( "border-[var(--primary)] bg-[var(--primary-muted)]", checkedBorderWidths[size], ), - "peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--ring)] peer-focus-visible:ring-offset-2 peer-focus-visible:ring-offset-[var(--bg-color)]", + "peer-focus-visible:ring-2 peer-focus-visible:ring-[var(--ring)]", )} /> diff --git a/src/components/Switch/Switch.tsx b/src/components/Switch/Switch.tsx index fee4281..0ba564b 100644 --- a/src/components/Switch/Switch.tsx +++ b/src/components/Switch/Switch.tsx @@ -123,8 +123,8 @@ const Switch = forwardRef((props, ref) => { "outline-none rounded-full", "transition-all duration-200 ease-in-out", error - ? "focus-visible:ring-2 focus-visible:ring-[var(--error-focus-ring)] focus-visible:ring-offset-2" - : "focus-visible:ring-2 focus-visible:ring-[var(--switch-focus-ring)] focus-visible:ring-offset-2", + ? "focus-visible:ring-2 focus-visible:ring-[var(--error-focus-ring)]" + : "focus-visible:ring-2 focus-visible:ring-[var(--switch-focus-ring)]", isCurrentlyChecked ? "bg-[var(--switch-primary)] hover:bg-[var(--switch-primary-hover)]" : "bg-[var(--switch-track-bg)] hover:bg-[var(--switch-track-hover-bg)]", From a5325b38797ccb0e294d9529efd8bca8d5f35995 Mon Sep 17 00:00:00 2001 From: Abilash-Workhall Date: Sat, 21 Mar 2026 20:10:40 +0530 Subject: [PATCH 06/15] feat: documentation ui implementation --- index.html | 3 +- package-lock.json | 65 +- package.json | 1 + src/components/Checkbox/Checkbox.tsx | 2 +- src/docs/DocsApp.tsx | 666 ++++++++++++++++----- src/docs/DocsLayout.tsx | 311 ++++++---- src/docs/components/ComponentPreview.tsx | 50 +- src/docs/components/InfiniteScrollDemo.tsx | 101 ++++ src/docs/components/PageHeader.tsx | 43 ++ src/docs/components/PropsTable.tsx | 2 +- src/docs/pages/Accordion.mdx | 67 +-- src/docs/pages/Avatar.mdx | 15 +- src/docs/pages/Badge.mdx | 62 +- src/docs/pages/Button.mdx | 84 ++- src/docs/pages/Checkbox.mdx | 43 +- src/docs/pages/Input.mdx | 82 ++- src/docs/pages/Modal.mdx | 56 +- src/docs/pages/RadioGroup.mdx | 68 +-- src/docs/pages/ScrollArea.mdx | 170 ++++-- src/docs/pages/Skeleton.mdx | 68 +-- src/docs/pages/Theming.mdx | 216 ++++++- src/docs/pages/ThemingPage.tsx | 444 ++++++++++++++ src/docs/pages/Typography.mdx | 51 +- src/mdx.d.ts | 5 + tailwind.config.js | 7 +- vite.config.ts | 4 +- 26 files changed, 2018 insertions(+), 668 deletions(-) create mode 100644 src/docs/components/InfiniteScrollDemo.tsx create mode 100644 src/docs/components/PageHeader.tsx create mode 100644 src/docs/pages/ThemingPage.tsx create mode 100644 src/mdx.d.ts diff --git a/index.html b/index.html index 6821334..f30e919 100644 --- a/index.html +++ b/index.html @@ -4,7 +4,8 @@ - ui-library + + Awesome UI Library
diff --git a/package-lock.json b/package-lock.json index a332efb..a660ca4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@eslint/js": "^9.39.1", "@mdx-js/react": "^3.1.1", "@mdx-js/rollup": "^3.1.1", + "@tailwindcss/typography": "^0.5.19", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", @@ -163,6 +164,7 @@ "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.29.0", "@babel/generator": "^7.29.0", @@ -811,6 +813,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" }, @@ -851,6 +854,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" } @@ -2021,6 +2025,33 @@ "dev": true, "license": "MIT" }, + "node_modules/@tailwindcss/typography": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/@tailwindcss/typography/-/typography-0.5.19.tgz", + "integrity": "sha512-w31dd8HOx3k9vPtcQh5QHP9GwKcgbMp87j58qi6xgiBnFFtKEAgCWnDw4qUT8aHwkCp8bKvb/KGKWWHedP0AAg==", + "dev": true, + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "6.0.10" + }, + "peerDependencies": { + "tailwindcss": ">=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1" + } + }, + "node_modules/@tailwindcss/typography/node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/@testing-library/dom": { "version": "10.4.1", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.4.1.tgz", @@ -2123,8 +2154,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -2263,6 +2293,7 @@ "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -2273,6 +2304,7 @@ "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "csstype": "^3.2.2" } @@ -2283,6 +2315,7 @@ "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", "dev": true, "license": "MIT", + "peer": true, "peerDependencies": { "@types/react": "^19.2.0" } @@ -2339,6 +2372,7 @@ "integrity": "sha512-4z2nCSBfVIMnbuu8uinj+f0o4qOeggYJLbjpPHka3KH1om7e+H9yLKTYgksTaHcGco+NClhhY2vyO3HsMH1RGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.55.0", "@typescript-eslint/types": "8.55.0", @@ -2584,6 +2618,7 @@ "integrity": "sha512-gVQqh7paBz3gC+ZdcCmNSWJMk70IUjDeVqi+5m5vYpEHsIwRgw3Y545jljtajhkekIpIp5Gg8oK7bctgY0E2Ng==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/mocker": "4.0.18", "@vitest/utils": "4.0.18", @@ -2607,6 +2642,7 @@ "integrity": "sha512-gfajTHVCiwpxRj1qh0Sh/5bbGLG4F/ZH/V9xvFVoFddpITfMta9YGow0W6ZpTTORv2vdJuz9TnrNSmjKvpOf4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/browser": "4.0.18", "@vitest/mocker": "4.0.18", @@ -2751,6 +2787,7 @@ "integrity": "sha512-CGJ25bc8fRi8Lod/3GHSvXRKi7nBo3kxh0ApW4yCjmrWmRmlT53B5E08XRSZRliygG0aVNxLrBEqPYdz/KcCtQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/utils": "4.0.18", "fflate": "^0.8.2", @@ -2923,6 +2960,7 @@ "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -3448,6 +3486,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -3944,6 +3983,7 @@ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "env-paths": "^2.2.1", "import-fresh": "^3.3.0", @@ -4295,8 +4335,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dot-prop": { "version": "5.3.0", @@ -4605,6 +4644,7 @@ "integrity": "sha512-LEyamqS7W5HB3ujJyvi0HQK/dtVINZvd5mAAp9eT5S/ujByGjiZLCzPcHVzuXbpJDJF/cxwHlfceVUDZ2lnSTw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -6439,6 +6479,7 @@ "integrity": "sha512-0+MoQNYyr2rBHqO1xilltfDjV9G7ymYGlAUazgcDLQaUf8JDHbuGwsxN6U9qWaElZ4w1B2r7yEGIL3GdeW3Rug==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@acemir/cssom": "^0.9.31", "@asamuzakjp/dom-selector": "^6.8.1", @@ -6808,7 +6849,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -8298,6 +8338,7 @@ "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", "dev": true, "license": "Apache-2.0", + "peer": true, "dependencies": { "playwright-core": "1.58.2" }, @@ -8364,6 +8405,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -8539,7 +8581,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -8555,7 +8596,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -8627,6 +8667,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-19.2.4.tgz", "integrity": "sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -8636,6 +8677,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz", "integrity": "sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==", "license": "MIT", + "peer": true, "dependencies": { "scheduler": "^0.27.0" }, @@ -8648,8 +8690,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/react-refresh": { "version": "0.18.0", @@ -9037,6 +9078,7 @@ "integrity": "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "1.0.8" }, @@ -9744,6 +9786,7 @@ "integrity": "sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", @@ -10061,6 +10104,7 @@ "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -10337,6 +10381,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -10938,6 +10983,7 @@ "integrity": "sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@vitest/expect": "4.0.18", "@vitest/mocker": "4.0.18", @@ -11446,6 +11492,7 @@ "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", "dev": true, "license": "MIT", + "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 7d7dafc..2af85c5 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "@eslint/js": "^9.39.1", "@mdx-js/react": "^3.1.1", "@mdx-js/rollup": "^3.1.1", + "@tailwindcss/typography": "^0.5.19", "@testing-library/jest-dom": "^6.9.1", "@testing-library/react": "^16.3.2", "@testing-library/user-event": "^14.6.1", diff --git a/src/components/Checkbox/Checkbox.tsx b/src/components/Checkbox/Checkbox.tsx index 006242c..9241861 100644 --- a/src/components/Checkbox/Checkbox.tsx +++ b/src/components/Checkbox/Checkbox.tsx @@ -111,7 +111,7 @@ const Checkbox = forwardRef(
import("./pages/Button.mdx")); const InputDocs = lazy(() => import("./pages/Input.mdx")); const RadioGroupDocs = lazy(() => import("./pages/RadioGroup.mdx")); @@ -17,185 +19,566 @@ const ModalDocs = lazy(() => import("./pages/Modal.mdx")); const ScrollAreaDocs = lazy(() => import("./pages/ScrollArea.mdx")); const SkeletonDocs = lazy(() => import("./pages/Skeleton.mdx")); const TypographyDocs = lazy(() => import("./pages/Typography.mdx")); -const ThemingDocs = lazy(() => import("./pages/Theming.mdx")); - -const navigation = [ - { name: "Accordion", path: "/docs/accordion", icon: "🪗" }, - { name: "Avatar", path: "/docs/avatar", icon: "👤" }, - { name: "Badge", path: "/docs/badge", icon: "🏷️" }, - { name: "Button", path: "/docs/button", icon: "🔘" }, - { name: "Checkbox", path: "/docs/checkbox", icon: "✅" }, - { name: "Input", path: "/docs/input", icon: "⌨️" }, - { name: "Modal", path: "/docs/modal", icon: "🪟" }, - { name: "Radio Group", path: "/docs/radio-group", icon: "🔘" }, - { name: "Scroll Area", path: "/docs/scroll-area", icon: "🖱️" }, - { name: "Skeleton", path: "/docs/skeleton", icon: "🦴" }, - { name: "Typography", path: "/docs/typography", icon: "✍️" }, -]; +const ThemingPage = lazy(() => + import("./pages/ThemingPage").then((m) => ({ default: m.ThemingPage })), +); -const homeThemes = [ +const components = [ + { + name: "Accordion", + path: "/docs/accordion", + description: "Collapsible content sections", + }, + { + name: "Avatar", + path: "/docs/avatar", + description: "User profile images with fallbacks", + }, { - name: "Ocean Drift", - color: "#0ea5e9", - desc: "Deep atmospheric blues for professional data interfaces.", - config: { palette: { primary: { 500: "#0ea5e9" } } }, + name: "Badge", + path: "/docs/badge", + description: "Status indicators and labels", }, { - name: "Electric Violet", - color: "#8b5cf6", - desc: "Bold purple tones for creative and modern startups.", - config: { palette: { primary: { 500: "#8b5cf6" } } }, + name: "Button", + path: "/docs/button", + description: "Interactive action triggers", }, { - name: "Rose Gold", - color: "#f43f5e", - desc: "Warm and elegant rose tones for premium experiences.", - config: { palette: { primary: { 500: "#f43f5e" } } }, + name: "Checkbox", + path: "/docs/checkbox", + description: "Multi-select form controls", }, + { + name: "Input", + path: "/docs/input", + description: "Text fields with validation", + }, + { + name: "Modal", + path: "/docs/modal", + description: "Accessible dialog overlays", + }, + { + name: "Radio Group", + path: "/docs/radio-group", + description: "Single-select option groups", + }, + { + name: "Scroll Area", + path: "/docs/scroll-area", + description: "Scrollable content containers", + }, + { + name: "Skeleton", + path: "/docs/skeleton", + description: "Loading placeholders", + }, + { + name: "Typography", + path: "/docs/typography", + description: "Text styles and hierarchy", + }, +]; + +const COLOR_PRESETS = [ + { name: "Pink", value: "#ec4899" }, + { name: "Blue", value: "#3b82f6" }, + { name: "Violet", value: "#8b5cf6" }, + { name: "Emerald", value: "#10b981" }, + { name: "Orange", value: "#f97316" }, + { name: "Red", value: "#ef4444" }, + { name: "Cyan", value: "#06b6d4" }, + { name: "Rose", value: "#f43f5e" }, ]; -const LandingPage = () => { - const { overrideTheme, resetTheme, theme } = useTheme(); +function hexToHSL(hex: string): [number, number, number] { + const r = parseInt(hex.slice(1, 3), 16) / 255; + const g = parseInt(hex.slice(3, 5), 16) / 255; + const b = parseInt(hex.slice(5, 7), 16) / 255; + const max = Math.max(r, g, b), + min = Math.min(r, g, b); + const l = (max + min) / 2; + if (max === min) return [0, 0, l]; + const d = max - min; + const s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + let h = 0; + if (max === r) h = ((g - b) / d + (g < b ? 6 : 0)) / 6; + else if (max === g) h = ((b - r) / d + 2) / 6; + else h = ((r - g) / d + 4) / 6; + return [h * 360, s * 100, l * 100]; +} +function hslToHex(h: number, s: number, l: number): string { + s /= 100; + l /= 100; + const a = s * Math.min(l, 1 - l); + const f = (n: number) => { + const k = (n + h / 30) % 12; + const color = l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1); + return Math.round(255 * Math.max(0, Math.min(1, color))) + .toString(16) + .padStart(2, "0"); + }; + return `#${f(0)}${f(8)}${f(4)}`; +} + +function generatePaletteFromColor(hex: string) { + const [h, s] = hexToHSL(hex); + return { + 50: hslToHex(h, Math.min(100, s * 1.1), 97), + 100: hslToHex(h, Math.min(100, s * 1.1), 93), + 200: hslToHex(h, Math.min(100, s), 85), + 300: hslToHex(h, Math.min(100, s * 0.95), 73), + 400: hslToHex(h, Math.min(100, s * 0.9), 60), + 500: hex, + 600: hslToHex(h, Math.min(100, s * 0.95), 42), + 700: hslToHex(h, Math.min(100, s * 0.9), 34), + 800: hslToHex(h, Math.min(100, s * 0.85), 26), + 900: hslToHex(h, Math.min(100, s * 0.8), 18), + }; +} + +const CopyInstallButton: React.FC = () => { + const { theme } = useTheme(); + const [copied, setCopied] = useState(false); return ( -
- {/* Background Glow */} -
- - {/* Announcement */} -
-
- New Release - | - Version 2.0.0 is now live - - → - -
+ + ); +}; + +const ColorPicker: React.FC = () => { + const { theme, overrideTheme, resetTheme } = useTheme(); + const [customColor, setCustomColor] = useState(theme.palette.primary[500]); + const [copied, setCopied] = useState(null); + + const applyColor = (color: string) => { + setCustomColor(color); + const palette = generatePaletteFromColor(color); + overrideTheme({ + palette: { primary: palette }, + tokens: { + accent: palette[600], + accentForeground: "#ffffff", + accentHover: palette[700], + ring: palette[500], + }, + }); + }; + + const copyColor = (value: string, label: string) => { + navigator.clipboard.writeText(value); + setCopied(label); + setTimeout(() => setCopied(null), 1500); + }; + + return ( +
+
+

Primary Color

+
- {/* Hero Text */} -
-

- Craft Exceptional{" "} - Interfaces. -

-

- A premium component library designed to give your projects a distinct - visual edge. Built with performance, accessibility, and high-end - aesthetics at its core. -

+ {/* Preset swatches */} +
+ {COLOR_PRESETS.map((preset) => ( +
+ + {/* Custom color input + copy */} +
+ applyColor(e.target.value)} + className="w-8 h-8 rounded cursor-pointer border-0 p-0" + /> + { + const v = e.target.value; + if (/^#[0-9a-fA-F]{6}$/.test(v)) applyColor(v); + setCustomColor(v); + }} + className="h-8 px-3 rounded-md border text-sm font-mono w-28" + style={{ + borderColor: theme.tokens.border, + backgroundColor: theme.tokens.background, + color: theme.tokens.foreground, + }} + maxLength={7} + /> +
- {/* CTA's */} -
- - - - - - + {copied && copied !== "hex" + ? `Copied ${copied}!` + : "Click a shade to copy"} + +
+
+ {([50, 100, 200, 300, 400, 500, 600, 700, 800, 900] as const).map( + (shade) => { + const shadeColor = + theme.palette.primary[ + shade as keyof typeof theme.palette.primary + ]; + return ( + + ); + }, + )} +
+
+ ); +}; - {/* Premium Theme Showcase */} -
-
-
- - Instant Theming - -

- One click to completely redefine your experience. -

-
- +const LivePreview: React.FC = () => { + const { theme } = useTheme(); + + return ( +
+

Live Preview

+
+ + + + +
+ +
+ Active + Online + Pending + Offline +
+ +
+ ); +}; + +const LandingPage: React.FC = () => { + const { theme } = useTheme(); + + return ( +
+ {/* Hero + Theme Customizer */} +
+
+ v2.0.0 +
+

+ Build better interfaces,{" "} + faster. +

+

+ A production-ready React component library with built-in theming, + accessibility, and TypeScript support. +

+
+ + + +
+
+ + {/* Theme Customizer - visible without scrolling */} +
+

+ Pick a primary color to preview +

+
+
+ + +
-
- {homeThemes.map((t, idx) => ( - +

{feature.title}

+

+ {feature.desc} +

+
))}
-
+
- {/* Visual Component Discovery */} -
-
- - Explore Ecosystem - -

- {navigation.length} components ready for integration. -

+ {/* Components Grid */} +
+
+

Components

+ + {components.length} available +
-
- {navigation.map((comp, idx) => ( +
+ {components.map((comp) => ( { + e.currentTarget.style.borderColor = theme.palette.primary[500]; + }} + onMouseLeave={(e) => { + e.currentTarget.style.borderColor = theme.tokens.border; }} > -
- {comp.icon} +
{comp.name}
+
+ {comp.description}
- - {comp.name} - ))}
-
+
); }; @@ -205,15 +588,17 @@ export const DocsApp: React.FC = () => { +
+ Loading... +
} > } /> - } /> + } /> } /> } /> - } /> + } /> } /> } /> } /> @@ -229,5 +614,4 @@ export const DocsApp: React.FC = () => { ); }; -const RadioGroup_Docs = RadioGroupDocs; export default DocsApp; diff --git a/src/docs/DocsLayout.tsx b/src/docs/DocsLayout.tsx index 832dbed..4ac3859 100644 --- a/src/docs/DocsLayout.tsx +++ b/src/docs/DocsLayout.tsx @@ -2,7 +2,6 @@ import React, { useState, useMemo } from "react"; import { Link, useLocation } from "react-router-dom"; import { cn } from "@/utils"; import { useTheme } from "@/theme"; -import { Button } from "@/components/Button"; const navigation = [ { @@ -59,117 +58,194 @@ export const DocsLayout: React.FC<{ children: React.ReactNode }> = ({ return (
- {/* Top Navigation Header */} + {/* Header */}
-
+
-
+
UI
- Awesome UI + Awesome UI -
-
- {/* Integrated Search */} -
+
+ {/* Search */} +
setSearchQuery(e.target.value)} - className="h-9 px-4 pl-10 rounded-full border bg-background/50 text-xs w-48 focus:w-72 transition-all outline-none focus:ring-2 focus:ring-pink-500/20" - style={{ borderColor: theme.tokens.border }} + className="h-8 px-3 pl-8 rounded-md border text-sm w-52 focus:w-64 transition-all outline-none focus:ring-1" + style={{ + borderColor: theme.tokens.border, + backgroundColor: theme.tokens.surface, + color: theme.tokens.foreground, + }} + onFocus={(e) => { + e.target.style.borderColor = theme.palette.primary[500]; + }} + onBlur={(e) => { + e.target.style.borderColor = theme.tokens.border; + }} /> - - 🔍 - + + + {searchQuery && ( )}
-
+ {/* Dark mode toggle */} + + + + - - - - - -
+ {isSidebarOpen ? ( + + ) : ( + + )} + +
-
+
{/* Sidebar */}