From de0a28208636b93902639be976b8195087b59d49 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 19 Jan 2026 19:13:21 +0000 Subject: [PATCH] Replace Tailwind with modular Sass system using mixins and utilities Co-authored-by: johndoe6345789 <224850594+johndoe6345789@users.noreply.github.com> --- package-lock.json | 1085 +++++++++----------------- package.json | 7 +- postcss.config.js | 5 - src/app/globals.css | 67 -- src/app/globals.scss | 49 ++ src/app/layout.tsx | 2 +- src/app/theme.css | 262 ------- src/app/theme.scss | 75 ++ src/lib/utils.ts | 3 +- src/styles/abstracts/_functions.scss | 24 + src/styles/abstracts/_index.scss | 3 + src/styles/abstracts/_mixins.scss | 212 +++++ src/styles/abstracts/_variables.scss | 119 +++ src/styles/utilities/_utilities.scss | 146 ++++ tailwind.config.js | 62 -- 15 files changed, 995 insertions(+), 1126 deletions(-) delete mode 100644 postcss.config.js delete mode 100644 src/app/globals.css create mode 100644 src/app/globals.scss delete mode 100644 src/app/theme.css create mode 100644 src/app/theme.scss create mode 100644 src/styles/abstracts/_functions.scss create mode 100644 src/styles/abstracts/_index.scss create mode 100644 src/styles/abstracts/_mixins.scss create mode 100644 src/styles/abstracts/_variables.scss create mode 100644 src/styles/utilities/_utilities.scss delete mode 100644 tailwind.config.js diff --git a/package-lock.json b/package-lock.json index cbe3242..d125421 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,6 @@ "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", "@reduxjs/toolkit": "^2.11.2", - "@tailwindcss/container-queries": "^0.1.1", "@tanstack/react-query": "^5.83.1", "@types/sql.js": "^1.4.9", "class-variance-authority": "^0.7.1", @@ -68,25 +67,21 @@ "react-resizable-panels": "^2.1.7", "react-router-dom": "^7.12.0", "recharts": "^2.15.1", + "sass": "^1.97.2", "sonner": "^2.0.1", - "tailwind-merge": "^3.0.2", "three": "^0.175.0", - "tw-animate-css": "^1.2.4", "uuid": "^11.1.0", "vaul": "^1.1.2", "zod": "^3.25.76" }, "devDependencies": { "@eslint/js": "^9.21.0", - "@tailwindcss/postcss": "^4.1.18", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", - "autoprefixer": "^10.4.23", "eslint": "^9.28.0", "eslint-config-next": "^16.1.3", "eslint-plugin-react-hooks": "^5.2.0", "globals": "^16.0.0", - "tailwindcss": "^4.1.11", "typescript": "~5.7.2", "typescript-eslint": "^8.38.0" }, @@ -96,19 +91,6 @@ ] } }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", - "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/@babel/code-frame": { "version": "7.28.6", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.28.6.tgz", @@ -1892,6 +1874,302 @@ "node": ">= 18" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.4.tgz", + "integrity": "sha512-WYa2tUVV5HiArWPB3ydlOc4R2ivq0IDrlqhMi3l7mVsFEXNcTfxYFPIHXHXIh/ca/y/V5N4E1zecyxdIBjYnkQ==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.4", + "@parcel/watcher-darwin-arm64": "2.5.4", + "@parcel/watcher-darwin-x64": "2.5.4", + "@parcel/watcher-freebsd-x64": "2.5.4", + "@parcel/watcher-linux-arm-glibc": "2.5.4", + "@parcel/watcher-linux-arm-musl": "2.5.4", + "@parcel/watcher-linux-arm64-glibc": "2.5.4", + "@parcel/watcher-linux-arm64-musl": "2.5.4", + "@parcel/watcher-linux-x64-glibc": "2.5.4", + "@parcel/watcher-linux-x64-musl": "2.5.4", + "@parcel/watcher-win32-arm64": "2.5.4", + "@parcel/watcher-win32-ia32": "2.5.4", + "@parcel/watcher-win32-x64": "2.5.4" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.4.tgz", + "integrity": "sha512-hoh0vx4v+b3BNI7Cjoy2/B0ARqcwVNrzN/n7DLq9ZB4I3lrsvhrkCViJyfTj/Qi5xM9YFiH4AmHGK6pgH1ss7g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.4.tgz", + "integrity": "sha512-kphKy377pZiWpAOyTgQYPE5/XEKVMaj6VUjKT5VkNyUJlr2qZAn8gIc7CPzx+kbhvqHDT9d7EqdOqRXT6vk0zw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.4.tgz", + "integrity": "sha512-UKaQFhCtNJW1A9YyVz3Ju7ydf6QgrpNQfRZ35wNKUhTQ3dxJ/3MULXN5JN/0Z80V/KUBDGa3RZaKq1EQT2a2gg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.4.tgz", + "integrity": "sha512-Dib0Wv3Ow/m2/ttvLdeI2DBXloO7t3Z0oCp4bAb2aqyqOjKPPGrg10pMJJAQ7tt8P4V2rwYwywkDhUia/FgS+Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.4.tgz", + "integrity": "sha512-I5Vb769pdf7Q7Sf4KNy8Pogl/URRCKu9ImMmnVKYayhynuyGYMzuI4UOWnegQNa2sGpsPSbzDsqbHNMyeyPCgw==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.4.tgz", + "integrity": "sha512-kGO8RPvVrcAotV4QcWh8kZuHr9bXi9a3bSZw7kFarYR0+fGliU7hd/zevhjw8fnvIKG3J9EO5G6sXNGCSNMYPQ==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.4.tgz", + "integrity": "sha512-KU75aooXhqGFY2W5/p8DYYHt4hrjHZod8AhcGAmhzPn/etTa+lYCDB2b1sJy3sWJ8ahFVTdy+EbqSBvMx3iFlw==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.4.tgz", + "integrity": "sha512-Qx8uNiIekVutnzbVdrgSanM+cbpDD3boB1f8vMtnuG5Zau4/bdDbXyKwIn0ToqFhIuob73bcxV9NwRm04/hzHQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.4.tgz", + "integrity": "sha512-UYBQvhYmgAv61LNUn24qGQdjtycFBKSK3EXr72DbJqX9aaLbtCOO8+1SkKhD/GNiJ97ExgcHBrukcYhVjrnogA==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.4.tgz", + "integrity": "sha512-YoRWCVgxv8akZrMhdyVi6/TyoeeMkQ0PGGOf2E4omODrvd1wxniXP+DBynKoHryStks7l+fDAMUBRzqNHrVOpg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.4.tgz", + "integrity": "sha512-iby+D/YNXWkiQNYcIhg8P5hSjzXEHaQrk2SLrWOUD7VeC4Ohu0WQvmV+HDJokZVJ2UjJ4AGXW3bx7Lls9Ln4TQ==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.4.tgz", + "integrity": "sha512-vQN+KIReG0a2ZDpVv8cgddlf67J8hk1WfZMMP7sMeZmJRSmEax5xNDNWKdgqSe2brOKTQQAs3aCCUal2qBHAyg==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.4.tgz", + "integrity": "sha512-3A6efb6BOKwyw7yk9ro2vus2YTt2nvcd56AuzxdMiVOxL9umDyN5PKkKfZ/gZ9row41SjVmTVQNWQhaRRGpOKw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@phosphor-icons/react": { "version": "2.1.10", "resolved": "https://registry.npmjs.org/@phosphor-icons/react/-/react-2.1.10.tgz", @@ -3565,286 +3843,6 @@ "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", "license": "MIT" }, - "node_modules/@tailwindcss/container-queries": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@tailwindcss/container-queries/-/container-queries-0.1.1.tgz", - "integrity": "sha512-p18dswChx6WnTSaJCSGx6lTmrGzNNvm2FtXmiO6AuA1V4U5REyoqwmT6kgAsIMdjo07QdAfYXHJ4hnMtfHzWgA==", - "license": "MIT", - "peerDependencies": { - "tailwindcss": ">=3.2.0" - } - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.18.tgz", - "integrity": "sha512-DoR7U1P7iYhw16qJ49fgXUlry1t4CpXeErJHnQ44JgTSKMaZUdf17cfn5mHchfJ4KRBZRFA/Coo+MUF5+gOaCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/remapping": "^2.3.4", - "enhanced-resolve": "^5.18.3", - "jiti": "^2.6.1", - "lightningcss": "1.30.2", - "magic-string": "^0.30.21", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.18" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.18.tgz", - "integrity": "sha512-EgCR5tTS5bUSKQgzeMClT6iCY3ToqE1y+ZB0AKldj809QXk1Y+3jB0upOYZrn9aGIzPtUsP7sX4QQ4XtjBB95A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-arm64": "4.1.18", - "@tailwindcss/oxide-darwin-x64": "4.1.18", - "@tailwindcss/oxide-freebsd-x64": "4.1.18", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.18", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.18", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.18", - "@tailwindcss/oxide-linux-x64-musl": "4.1.18", - "@tailwindcss/oxide-wasm32-wasi": "4.1.18", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.18", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.18" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.18.tgz", - "integrity": "sha512-dJHz7+Ugr9U/diKJA0W6N/6/cjI+ZTAoxPf9Iz9BFRF2GzEX8IvXxFIi/dZBloVJX/MZGvRuFA9rqwdiIEZQ0Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.18.tgz", - "integrity": "sha512-Gc2q4Qhs660bhjyBSKgq6BYvwDz4G+BuyJ5H1xfhmDR3D8HnHCmT/BSkvSL0vQLy/nkMLY20PQ2OoYMO15Jd0A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.18.tgz", - "integrity": "sha512-FL5oxr2xQsFrc3X9o1fjHKBYBMD1QZNyc1Xzw/h5Qu4XnEBi3dZn96HcHm41c/euGV+GRiXFfh2hUCyKi/e+yw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.18.tgz", - "integrity": "sha512-Fj+RHgu5bDodmV1dM9yAxlfJwkkWvLiRjbhuO2LEtwtlYlBgiAT4x/j5wQr1tC3SANAgD+0YcmWVrj8R9trVMA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.18.tgz", - "integrity": "sha512-Fp+Wzk/Ws4dZn+LV2Nqx3IilnhH51YZoRaYHQsVq3RQvEl+71VGKFpkfHrLM/Li+kt5c0DJe/bHXK1eHgDmdiA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.18.tgz", - "integrity": "sha512-S0n3jboLysNbh55Vrt7pk9wgpyTTPD0fdQeh7wQfMqLPM/Hrxi+dVsLsPrycQjGKEQk85Kgbx+6+QnYNiHalnw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.18.tgz", - "integrity": "sha512-1px92582HkPQlaaCkdRcio71p8bc8i/ap5807tPRDK/uw953cauQBT8c5tVGkOwrHMfc2Yh6UuxaH4vtTjGvHg==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.18.tgz", - "integrity": "sha512-v3gyT0ivkfBLoZGF9LyHmts0Isc8jHZyVcbzio6Wpzifg/+5ZJpDiRiUhDLkcr7f/r38SWNe7ucxmGW3j3Kb/g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.18.tgz", - "integrity": "sha512-bhJ2y2OQNlcRwwgOAGMY0xTFStt4/wyU6pvI6LSuZpRgKQwxTec0/3Scu91O8ir7qCR3AuepQKLU/kX99FouqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.18.tgz", - "integrity": "sha512-LffYTvPjODiP6PT16oNeUQJzNVyJl1cjIebq/rWWBF+3eDst5JGEFSc5cWxyRCJ0Mxl+KyIkqRxk1XPEs9x8TA==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1", - "@emnapi/wasi-threads": "^1.1.0", - "@napi-rs/wasm-runtime": "^1.1.0", - "@tybys/wasm-util": "^0.10.1", - "tslib": "^2.4.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.18.tgz", - "integrity": "sha512-HjSA7mr9HmC8fu6bdsZvZ+dhjyGCLdotjVOgLA2vEqxEBZaQo9YTX4kwgEvPCpRh8o4uWc4J/wEoFzhEmjvPbA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.18.tgz", - "integrity": "sha512-bJWbyYpUlqamC8dpR7pfjA0I7vdF6t5VpUGMWRkXVE3AXgIZjYUYAK7II1GNaxR8J1SSrSrppRar8G++JekE3Q==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/postcss": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.18.tgz", - "integrity": "sha512-Ce0GFnzAOuPyfV5SxjXGn0CubwGcuDB0zcdaPuCSzAa/2vII24JTkH+I6jcbXLb1ctjZMZZI6OjDaLPJQL1S0g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.18", - "@tailwindcss/oxide": "4.1.18", - "postcss": "^8.4.41", - "tailwindcss": "4.1.18" - } - }, "node_modules/@tanstack/query-core": { "version": "5.90.11", "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.11.tgz", @@ -4919,43 +4917,6 @@ "node": ">= 0.4" } }, - "node_modules/autoprefixer": { - "version": "10.4.23", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.23.tgz", - "integrity": "sha512-YYTXSFulfwytnjAPlw8QHncHJmlvFKtczb8InXaAx9Q0LbfDnfEYDE55omerIJKihhmU61Ft+cAOSzQVaBUmeA==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/autoprefixer" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "browserslist": "^4.28.1", - "caniuse-lite": "^1.0.30001760", - "fraction.js": "^5.3.4", - "picocolors": "^1.1.1", - "postcss-value-parser": "^4.2.0" - }, - "bin": { - "autoprefixer": "bin/autoprefixer" - }, - "engines": { - "node": "^10 || ^12 || >=14" - }, - "peerDependencies": { - "postcss": "^8.1.0" - } - }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -5175,6 +5136,21 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -5834,8 +5810,8 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", - "devOptional": true, "license": "Apache-2.0", + "optional": true, "engines": { "node": ">=8" } @@ -5936,20 +5912,6 @@ "dev": true, "license": "MIT" }, - "node_modules/enhanced-resolve": { - "version": "5.18.4", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.4.tgz", - "integrity": "sha512-LgQMM4WXU3QI+SYgEc2liRgznaD5ojbmY3sb8LxyguVkIg5FxdpTkvk72te2R38/TGKxH634oLxXRGY6d7AP+Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/es-abstract": { "version": "1.24.1", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.24.1.tgz", @@ -6868,20 +6830,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/fraction.js": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-5.3.4.tgz", - "integrity": "sha512-1X1NTtiJphryn/uLQz3whtY6jK3fTqoE3ohKs0tT+Ujr1W59oopxmoEh7Lu5p6vBaPbgoM0bzveAW4Qi5RyWDQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "*" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/rawify" - } - }, "node_modules/framer-motion": { "version": "12.23.25", "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.23.25.tgz", @@ -7105,13 +7053,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", @@ -7250,6 +7191,12 @@ "url": "https://opencollective.com/immer" } }, + "node_modules/immutable": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", + "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -7460,7 +7407,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -7506,7 +7453,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, + "devOptional": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -7751,6 +7698,8 @@ "integrity": "sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==", "dev": true, "license": "MIT", + "optional": true, + "peer": true, "bin": { "jiti": "lib/jiti-cli.mjs" } @@ -7881,267 +7830,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lightningcss": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz", - "integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==", - "dev": true, - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-android-arm64": "1.30.2", - "lightningcss-darwin-arm64": "1.30.2", - "lightningcss-darwin-x64": "1.30.2", - "lightningcss-freebsd-x64": "1.30.2", - "lightningcss-linux-arm-gnueabihf": "1.30.2", - "lightningcss-linux-arm64-gnu": "1.30.2", - "lightningcss-linux-arm64-musl": "1.30.2", - "lightningcss-linux-x64-gnu": "1.30.2", - "lightningcss-linux-x64-musl": "1.30.2", - "lightningcss-win32-arm64-msvc": "1.30.2", - "lightningcss-win32-x64-msvc": "1.30.2" - } - }, - "node_modules/lightningcss-android-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.30.2.tgz", - "integrity": "sha512-BH9sEdOCahSgmkVhBLeU7Hc9DWeZ1Eb6wNS6Da8igvUwAe0sqROHddIlvU06q3WyXVEOYDZ6ykBZQnjTbmo4+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz", - "integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.2.tgz", - "integrity": "sha512-oBZgKchomuDYxr7ilwLcyms6BCyLn0z8J0+ZZmfpjwg9fRVZIR5/GMXd7r9RH94iDhld3UmSjBM6nXWM2TfZTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.2.tgz", - "integrity": "sha512-c2bH6xTrf4BDpK8MoGG4Bd6zAMZDAXS569UxCAGcA7IKbHNMlhGQ89eRmvpIUGfKWNVdbhSbkQaWhEoMGmGslA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.2.tgz", - "integrity": "sha512-eVdpxh4wYcm0PofJIZVuYuLiqBIakQ9uFZmipf6LF/HRj5Bgm0eb3qL/mr1smyXIS1twwOxNWndd8z0E374hiA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.2.tgz", - "integrity": "sha512-UK65WJAbwIJbiBFXpxrbTNArtfuznvxAJw4Q2ZGlU8kPeDIWEX1dg3rn2veBVUylA2Ezg89ktszWbaQnxD/e3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.2.tgz", - "integrity": "sha512-5Vh9dGeblpTxWHpOx8iauV02popZDsCYMPIgiuw97OJ5uaDsL86cnqSFs5LZkG3ghHoX5isLgWzMs+eD1YzrnA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.2.tgz", - "integrity": "sha512-Cfd46gdmj1vQ+lR6VRTTadNHu6ALuw2pKR9lYq4FnhvgBc4zWY1EtZcAc6EffShbb1MFrIPfLDXD6Xprbnni4w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.2.tgz", - "integrity": "sha512-XJaLUUFXb6/QG2lGIW6aIk6jKdtjtcffUT0NKvIqhSBY3hh9Ch+1LCeH80dR9q9LBjG3ewbDjnumefsLsP6aiA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.2.tgz", - "integrity": "sha512-FZn+vaj7zLv//D/192WFFVA0RgHawIcHqLX9xuWiQt7P0PtdFEVaxgF9rjM/IRYHQXNnk61/H/gb2Ei+kUQ4xQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.2", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.2.tgz", - "integrity": "sha512-5g1yc73p+iAkid5phb4oVFMB45417DkRevRbt/El/gKXJk4jid+vPFF/AXbxn05Aky8PapwzZrdJShv5C0avjw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -8202,16 +7890,6 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, - "node_modules/magic-string": { - "version": "0.30.21", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.5" - } - }, "node_modules/marked": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", @@ -8474,6 +8152,13 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "license": "MIT", + "optional": true + }, "node_modules/node-releases": { "version": "2.0.27", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.27.tgz", @@ -8743,7 +8428,7 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "devOptional": true, "license": "MIT", "engines": { "node": ">=12" @@ -8762,42 +8447,6 @@ "node": ">= 0.4" } }, - "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", - "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", - "dev": true, - "license": "MIT" - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -9139,6 +8788,19 @@ "react-dom": ">=16.6.0" } }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, "node_modules/recharts": { "version": "2.15.4", "resolved": "https://registry.npmjs.org/recharts/-/recharts-2.15.4.tgz", @@ -9385,6 +9047,26 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, + "node_modules/sass": { + "version": "1.97.2", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.2.tgz", + "integrity": "sha512-y5LWb0IlbO4e97Zr7c3mlpabcbBtS+ieiZ9iwDooShpFKWXf62zz5pEPdwrLYm+Bxn1fnbwFGzHuCLSA9tBmrw==", + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, "node_modules/scheduler": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", @@ -9834,36 +9516,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/tailwind-merge": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-3.4.0.tgz", - "integrity": "sha512-uSaO4gnW+b3Y2aWoWfFpX62vn2sR3skfhbjsEnaBI81WD1wBLlHZe5sWf0AqjksNdYTbGBEd0UasQMT3SNV15g==", - "license": "MIT", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/dcastil" - } - }, - "node_modules/tailwindcss": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.18.tgz", - "integrity": "sha512-4+Z+0yiYyEtUVCScyfHCxOYP06L5Ne+JiHhY2IjR2KWMIWhJOYZKLSGZaP5HkZ8+bY0cxfzwDE5uOmzFXyIwxw==", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.3.0.tgz", - "integrity": "sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/three": { "version": "0.175.0", "resolved": "https://registry.npmjs.org/three/-/three-0.175.0.tgz", @@ -9947,15 +9599,6 @@ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "license": "0BSD" }, - "node_modules/tw-animate-css": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/tw-animate-css/-/tw-animate-css-1.4.0.tgz", - "integrity": "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/Wombosvideo" - } - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index e83bed0..973ab01 100644 --- a/package.json +++ b/package.json @@ -45,7 +45,6 @@ "@radix-ui/react-toggle-group": "^1.1.2", "@radix-ui/react-tooltip": "^1.1.8", "@reduxjs/toolkit": "^2.11.2", - "@tailwindcss/container-queries": "^0.1.1", "@tanstack/react-query": "^5.83.1", "@types/sql.js": "^1.4.9", "class-variance-authority": "^0.7.1", @@ -71,25 +70,21 @@ "react-resizable-panels": "^2.1.7", "react-router-dom": "^7.12.0", "recharts": "^2.15.1", + "sass": "^1.97.2", "sonner": "^2.0.1", - "tailwind-merge": "^3.0.2", "three": "^0.175.0", - "tw-animate-css": "^1.2.4", "uuid": "^11.1.0", "vaul": "^1.1.2", "zod": "^3.25.76" }, "devDependencies": { "@eslint/js": "^9.21.0", - "@tailwindcss/postcss": "^4.1.18", "@types/react": "^19.0.10", "@types/react-dom": "^19.0.4", - "autoprefixer": "^10.4.23", "eslint": "^9.28.0", "eslint-config-next": "^16.1.3", "eslint-plugin-react-hooks": "^5.2.0", "globals": "^16.0.0", - "tailwindcss": "^4.1.11", "typescript": "~5.7.2", "typescript-eslint": "^8.38.0" }, diff --git a/postcss.config.js b/postcss.config.js deleted file mode 100644 index a7f73a2..0000000 --- a/postcss.config.js +++ /dev/null @@ -1,5 +0,0 @@ -export default { - plugins: { - '@tailwindcss/postcss': {}, - }, -} diff --git a/src/app/globals.css b/src/app/globals.css deleted file mode 100644 index ecd5422..0000000 --- a/src/app/globals.css +++ /dev/null @@ -1,67 +0,0 @@ -@import 'tailwindcss'; - -:root { - --background: 222.2 84% 4.9%; - --foreground: 210 40% 98%; - --card: 222.2 84% 4.9%; - --card-foreground: 210 40% 98%; - --popover: 222.2 84% 4.9%; - --popover-foreground: 210 40% 98%; - --primary: 263 70% 50%; - --primary-foreground: 210 40% 98%; - --secondary: 217.2 32.6% 17.5%; - --secondary-foreground: 210 40% 98%; - --muted: 217.2 32.6% 17.5%; - --muted-foreground: 215 20.2% 65.1%; - --accent: 195 100% 70%; - --accent-foreground: 222.2 84% 4.9%; - --destructive: 0 62.8% 30.6%; - --destructive-foreground: 210 40% 98%; - --border: 217.2 32.6% 17.5%; - --input: 217.2 32.6% 17.5%; - --ring: 195 100% 70%; - --radius: 0.5rem; -} - -@theme { - --color-background: hsl(var(--background)); - --color-foreground: hsl(var(--foreground)); - --color-card: hsl(var(--card)); - --color-card-foreground: hsl(var(--card-foreground)); - --color-popover: hsl(var(--popover)); - --color-popover-foreground: hsl(var(--popover-foreground)); - --color-primary: hsl(var(--primary)); - --color-primary-foreground: hsl(var(--primary-foreground)); - --color-secondary: hsl(var(--secondary)); - --color-secondary-foreground: hsl(var(--secondary-foreground)); - --color-muted: hsl(var(--muted)); - --color-muted-foreground: hsl(var(--muted-foreground)); - --color-accent: hsl(var(--accent)); - --color-accent-foreground: hsl(var(--accent-foreground)); - --color-destructive: hsl(var(--destructive)); - --color-destructive-foreground: hsl(var(--destructive-foreground)); - --color-border: hsl(var(--border)); - --color-input: hsl(var(--input)); - --color-ring: hsl(var(--ring)); -} - -* { - border-color: hsl(var(--border)); -} - -body { - background: hsl(var(--background)); - color: hsl(var(--foreground)); -} - -h1, h2, h3, h4, h5, h6 { - font-family: var(--font-inter), 'Inter', sans-serif; -} - -body { - font-family: var(--font-inter), 'Inter', sans-serif; -} - -code, pre { - font-family: var(--font-jetbrains-mono), 'JetBrains Mono', monospace; -} diff --git a/src/app/globals.scss b/src/app/globals.scss new file mode 100644 index 0000000..12de7d6 --- /dev/null +++ b/src/app/globals.scss @@ -0,0 +1,49 @@ +@import '../styles/abstracts'; +@import '../styles/utilities/utilities'; +@import './theme.scss'; + +* { + margin: 0; + padding: 0; + box-sizing: border-box; + border-color: $border; +} + +body { + background: $background; + color: $foreground; + font-family: var(--font-inter), 'Inter', sans-serif; + line-height: 1.5; +} + +h1, h2, h3, h4, h5, h6 { + font-family: var(--font-inter), 'Inter', sans-serif; + font-weight: 600; +} + +code, pre { + font-family: var(--font-jetbrains-mono), 'JetBrains Mono', monospace; +} + +:root { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + --primary: 263 70% 50%; + --primary-foreground: 210 40% 98%; + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + --accent: 195 100% 70%; + --accent-foreground: 222.2 84% 4.9%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + --ring: 195 100% 70%; + --radius: 0.5rem; +} diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 932bca6..5c663ea 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,5 +1,5 @@ import type { Metadata } from 'next'; -import './globals.css'; +import './globals.scss'; import { Providers } from './providers'; export const metadata: Metadata = { diff --git a/src/app/theme.css b/src/app/theme.css deleted file mode 100644 index 8da23f2..0000000 --- a/src/app/theme.css +++ /dev/null @@ -1,262 +0,0 @@ -@import "tailwindcss"; - -@import '@radix-ui/colors/sage-dark.css' layer(base); -@import '@radix-ui/colors/olive.css' layer(base); -@import '@radix-ui/colors/olive-dark.css' layer(base); -@import '@radix-ui/colors/sand.css' layer(base); -@import '@radix-ui/colors/sand-dark.css' layer(base); -@import '@radix-ui/colors/red.css' layer(base); -@import '@radix-ui/colors/red-dark.css' layer(base); -@import '@radix-ui/colors/ruby.css' layer(base); -@import '@radix-ui/colors/ruby-dark.css' layer(base); -@import '@radix-ui/colors/crimson.css' layer(base); -@import '@radix-ui/colors/crimson-dark.css' layer(base); -@import '@radix-ui/colors/pink.css' layer(base); -@import '@radix-ui/colors/pink-dark.css' layer(base); -@import '@radix-ui/colors/plum.css' layer(base); -@import '@radix-ui/colors/plum-dark.css' layer(base); -@import '@radix-ui/colors/purple.css' layer(base); -@import '@radix-ui/colors/purple-dark.css' layer(base); -@import '@radix-ui/colors/violet.css' layer(base); -@import '@radix-ui/colors/violet-dark.css' layer(base); -@import '@radix-ui/colors/iris.css' layer(base); -@import '@radix-ui/colors/iris-dark.css' layer(base); -@import '@radix-ui/colors/indigo.css' layer(base); -@import '@radix-ui/colors/indigo-dark.css' layer(base); -@import '@radix-ui/colors/blue.css' layer(base); -@import '@radix-ui/colors/blue-dark.css' layer(base); -@import '@radix-ui/colors/cyan.css' layer(base); -@import '@radix-ui/colors/cyan-dark.css' layer(base); -@import '@radix-ui/colors/teal.css' layer(base); -@import '@radix-ui/colors/teal-dark.css' layer(base); -@import '@radix-ui/colors/jade.css' layer(base); -@import '@radix-ui/colors/jade-dark.css' layer(base); -@import '@radix-ui/colors/green.css' layer(base); -@import '@radix-ui/colors/green-dark.css' layer(base); -@import '@radix-ui/colors/grass.css' layer(base); -@import '@radix-ui/colors/grass-dark.css' layer(base); -@import '@radix-ui/colors/bronze.css' layer(base); -@import '@radix-ui/colors/bronze-dark.css' layer(base); -@import '@radix-ui/colors/gold.css' layer(base); -@import '@radix-ui/colors/gold-dark.css' layer(base); -@import '@radix-ui/colors/brown.css' layer(base); -@import '@radix-ui/colors/brown-dark.css' layer(base); -@import '@radix-ui/colors/orange.css' layer(base); -@import '@radix-ui/colors/orange-dark.css' layer(base); -@import '@radix-ui/colors/amber.css' layer(base); -@import '@radix-ui/colors/amber-dark.css' layer(base); -@import '@radix-ui/colors/yellow.css' layer(base); -@import '@radix-ui/colors/yellow-dark.css' layer(base); -@import '@radix-ui/colors/lime.css' layer(base); -@import '@radix-ui/colors/lime-dark.css' layer(base); -@import '@radix-ui/colors/mint.css' layer(base); -@import '@radix-ui/colors/mint-dark.css' layer(base); -@import '@radix-ui/colors/sky.css' layer(base); -@import '@radix-ui/colors/sky-dark.css' layer(base); -@import '@radix-ui/colors/tomato.css' layer(base); -@import '@radix-ui/colors/tomato-dark.css' layer(base); -@import '@radix-ui/colors/gray.css' layer(base); -@import '@radix-ui/colors/gray-dark.css' layer(base); -@import '@radix-ui/colors/mauve.css' layer(base); -@import '@radix-ui/colors/mauve-dark.css' layer(base); -@import '@radix-ui/colors/slate.css' layer(base); -@import '@radix-ui/colors/slate-dark.css' layer(base); -@import '@radix-ui/colors/slate-alpha.css' layer(base); -@import '@radix-ui/colors/slate-dark-alpha.css' layer(base); - -@import 'tailwindcss/theme' layer(theme); - -@import 'tailwindcss/preflight' layer(base); - -/* - The default border color has changed to `currentColor` in Tailwind CSS v4, - so we've added these compatibility styles to make sure everything still - looks the same as it did with Tailwind CSS v3. - - If we ever want to remove these styles, we need to add an explicit border - color utility to any element that depends on these defaults. -*/ -@layer base { - *, - ::after, - ::before, - ::backdrop, - ::file-selector-button { - border-color: var(--color-gray-200, currentColor); - } -} - -@layer base { - #spark-app { - --tomato-contrast: #fff; - --red-contrast: #fff; - --ruby-contrast: #fff; - --crimson-contrast: #fff; - --pink-contrast: #fff; - --plum-contrast: #fff; - --purple-contrast: #fff; - --violet-contrast: #fff; - --iris-contrast: #fff; - --indigo-contrast: #fff; - --blue-contrast: #fff; - --cyan-contrast: #fff; - --teal-contrast: #fff; - --jade-contrast: #fff; - --green-contrast: #fff; - --grass-contrast: #fff; - --bronze-contrast: #fff; - --gold-contrast: #fff; - --brown-contrast: #fff; - --orange-contrast: #fff; - --amber-contrast: #000; - --yellow-contrast: #000; - --lime-contrast: #000; - --mint-contrast: #000; - --sky-contrast: #000; - --gray-contrast: #fff; - --mauve-contrast: #fff; - --slate-contrast: #fff; - --sage-contrast: #fff; - --olive-contrast: #fff; - --sand-contrast: #fff; - - /** - * Spacing scale - * - * These variables define a spacing scale based on Tailwind's default. - * We've introduced a --size-scale variable as a multiplier. - * By adjusting this single value, we can proportionally - * scale all spacing throughout the entire application. - * - * https://tailwindcss.com/docs/customizing-spacing#default-spacing-scale - */ - --size-scale: 1; - --size-0: 0px; - --size-px: 1px; - --size-0-5: calc(0.125rem * var(--size-scale)); - --size-1: calc(0.25rem * var(--size-scale)); - --size-1-5: calc(0.375rem * var(--size-scale)); - --size-2: calc(0.5rem * var(--size-scale)); - --size-2-5: calc(0.625rem * var(--size-scale)); - --size-3: calc(0.75rem * var(--size-scale)); - --size-3-5: calc(0.875rem * var(--size-scale)); - --size-4: calc(1rem * var(--size-scale)); - --size-5: calc(1.25rem * var(--size-scale)); - --size-6: calc(1.5rem * var(--size-scale)); - --size-7: calc(1.75rem * var(--size-scale)); - --size-8: calc(2rem * var(--size-scale)); - --size-9: calc(2.25rem * var(--size-scale)); - --size-10: calc(2.5rem * var(--size-scale)); - --size-11: calc(2.75rem * var(--size-scale)); - --size-12: calc(3rem * var(--size-scale)); - --size-14: calc(3.5rem * var(--size-scale)); - --size-16: calc(4rem * var(--size-scale)); - --size-20: calc(5rem * var(--size-scale)); - --size-24: calc(6rem * var(--size-scale)); - --size-28: calc(7rem * var(--size-scale)); - --size-32: calc(8rem * var(--size-scale)); - --size-36: calc(9rem * var(--size-scale)); - --size-40: calc(10rem * var(--size-scale)); - --size-44: calc(11rem * var(--size-scale)); - --size-48: calc(12rem * var(--size-scale)); - --size-52: calc(13rem * var(--size-scale)); - --size-56: calc(14rem * var(--size-scale)); - --size-60: calc(15rem * var(--size-scale)); - --size-64: calc(16rem * var(--size-scale)); - --size-72: calc(18rem * var(--size-scale)); - --size-80: calc(20rem * var(--size-scale)); - --size-96: calc(24rem * var(--size-scale)); - - /* Border radii */ - --radius-factor: 1; - --radius-sm: calc(2px * var(--radius-factor) * var(--size-scale)); - --radius-md: calc(6px * var(--radius-factor) * var(--size-scale)); - --radius-lg: calc(8px * var(--radius-factor) * var(--size-scale)); - --radius-xl: calc(12px * var(--radius-factor) * var(--size-scale)); - --radius-2xl: calc(16px * var(--radius-factor) * var(--size-scale)); - --radius-full: 9999px; - - /* Neutral colors */ - --color-neutral-1: var(--slate-1); - --color-neutral-2: var(--slate-2); - --color-neutral-3: var(--slate-3); - --color-neutral-4: var(--slate-4); - --color-neutral-5: var(--slate-5); - --color-neutral-6: var(--slate-6); - --color-neutral-7: var(--slate-7); - --color-neutral-8: var(--slate-8); - --color-neutral-9: var(--slate-9); - --color-neutral-10: var(--slate-10); - --color-neutral-11: var(--slate-11); - --color-neutral-12: var(--slate-12); - --color-neutral-a1: var(--slate-a1); - --color-neutral-a2: var(--slate-a2); - --color-neutral-a3: var(--slate-a3); - --color-neutral-a4: var(--slate-a4); - --color-neutral-a5: var(--slate-a5); - --color-neutral-a6: var(--slate-a6); - --color-neutral-a7: var(--slate-a7); - --color-neutral-a8: var(--slate-a8); - --color-neutral-a9: var(--slate-a9); - --color-neutral-a10: var(--slate-a10); - --color-neutral-a11: var(--slate-a11); - --color-neutral-a12: var(--slate-a12); - --color-neutral-contrast: var(--slate-contrast); - - /* Accent colors */ - --color-accent-1: var(--blue-1); - --color-accent-2: var(--blue-2); - --color-accent-3: var(--blue-3); - --color-accent-4: var(--blue-4); - --color-accent-5: var(--blue-5); - --color-accent-6: var(--blue-6); - --color-accent-7: var(--blue-7); - --color-accent-8: var(--blue-8); - --color-accent-9: var(--blue-9); - --color-accent-10: var(--blue-10); - --color-accent-11: var(--blue-11); - --color-accent-12: var(--blue-12); - --color-accent-contrast: var(--blue-contrast); - - /* Secondary accent colors */ - --color-accent-secondary-1: var(--violet-1); - --color-accent-secondary-2: var(--violet-2); - --color-accent-secondary-3: var(--violet-3); - --color-accent-secondary-4: var(--violet-4); - --color-accent-secondary-5: var(--violet-5); - --color-accent-secondary-6: var(--violet-6); - --color-accent-secondary-7: var(--violet-7); - --color-accent-secondary-8: var(--violet-8); - --color-accent-secondary-9: var(--violet-9); - --color-accent-secondary-10: var(--violet-10); - --color-accent-secondary-11: var(--violet-11); - --color-accent-secondary-12: var(--violet-12); - --color-accent-secondary-contrast: var(--violet-contrast); - - /* Foreground colors */ - --color-fg: var(--color-neutral-12); - --color-fg-secondary: var(--color-neutral-a11); - - /* Background colors */ - --color-bg: #ffffff; - --color-bg-inset: var(--color-neutral-2); - --color-bg-overlay: #ffffff; - - /* Focus ring */ - --color-focus-ring: var(--color-accent-9); - - /* Fonts */ - --font-sans-serif: ui-sans-serif, system-ui, sans-serif, "Apple Color Emoji", - "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; - --font-serif: ui-serif, Georgia, Cambria, "Times New Roman", Times, serif; - --font-monospace: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, - "Liberation Mono", "Courier New", monospace; - --font-family: var(--font-sans-serif); - } - - #spark-app.dark-theme { - --color-bg: var(--color-neutral-1); - --color-bg-inset: #000000; - --color-bg-overlay: var(--color-neutral-3); - } -} \ No newline at end of file diff --git a/src/app/theme.scss b/src/app/theme.scss new file mode 100644 index 0000000..df66aeb --- /dev/null +++ b/src/app/theme.scss @@ -0,0 +1,75 @@ +// Radix UI Colors imports (keeping the color system) +@import '@radix-ui/colors/sage-dark.css'; +@import '@radix-ui/colors/slate.css'; +@import '@radix-ui/colors/slate-dark.css'; +@import '@radix-ui/colors/blue.css'; +@import '@radix-ui/colors/blue-dark.css'; +@import '@radix-ui/colors/violet.css'; +@import '@radix-ui/colors/violet-dark.css'; + +// Spacing scale variables +$size-scale: 1; +$size-0: 0px; +$size-px: 1px; +$size-0-5: calc(0.125rem * $size-scale); +$size-1: calc(0.25rem * $size-scale); +$size-2: calc(0.5rem * $size-scale); +$size-3: calc(0.75rem * $size-scale); +$size-4: calc(1rem * $size-scale); +$size-5: calc(1.25rem * $size-scale); +$size-6: calc(1.5rem * $size-scale); +$size-8: calc(2rem * $size-scale); +$size-10: calc(2.5rem * $size-scale); +$size-12: calc(3rem * $size-scale); +$size-16: calc(4rem * $size-scale); +$size-20: calc(5rem * $size-scale); +$size-24: calc(6rem * $size-scale); + +// Border radii +$radius-factor: 1; +$radius-sm: calc(2px * $radius-factor * $size-scale); +$radius-md: calc(6px * $radius-factor * $size-scale); +$radius-lg: calc(8px * $radius-factor * $size-scale); +$radius-xl: calc(12px * $radius-factor * $size-scale); +$radius-full: 9999px; + +// App-level CSS variables +#spark-app { + --size-scale: #{$size-scale}; + --radius-factor: #{$radius-factor}; + + // Neutral colors (using slate from Radix) + --color-neutral-1: var(--slate-1); + --color-neutral-2: var(--slate-2); + --color-neutral-3: var(--slate-3); + --color-neutral-11: var(--slate-11); + --color-neutral-12: var(--slate-12); + + // Accent colors (using blue from Radix) + --color-accent-9: var(--blue-9); + --color-accent-11: var(--blue-11); + + // Foreground colors + --color-fg: var(--color-neutral-12); + --color-fg-secondary: var(--color-neutral-11); + + // Background colors + --color-bg: #ffffff; + --color-bg-inset: var(--color-neutral-2); + --color-bg-overlay: #ffffff; + + // Focus ring + --color-focus-ring: var(--color-accent-9); + + // Fonts + --font-sans-serif: ui-sans-serif, system-ui, sans-serif; + --font-serif: ui-serif, Georgia, serif; + --font-monospace: ui-monospace, 'SF Mono', Monaco, Consolas, monospace; + --font-family: var(--font-sans-serif); +} + +#spark-app.dark-theme { + --color-bg: var(--color-neutral-1); + --color-bg-inset: #000000; + --color-bg-overlay: var(--color-neutral-3); +} \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts index bd0c391..eda264a 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,6 +1,5 @@ import { clsx, type ClassValue } from "clsx" -import { twMerge } from "tailwind-merge" export function cn(...inputs: ClassValue[]) { - return twMerge(clsx(inputs)) + return clsx(inputs) } diff --git a/src/styles/abstracts/_functions.scss b/src/styles/abstracts/_functions.scss new file mode 100644 index 0000000..9408614 --- /dev/null +++ b/src/styles/abstracts/_functions.scss @@ -0,0 +1,24 @@ +// Spacing function +@function spacing($key) { + @return map-get($spacing, $key); +} + +// Border radius function +@function radius($key) { + @return map-get($radius, $key); +} + +// Font size function +@function font-size($key) { + @return map-get($font-sizes, $key); +} + +// Font weight function +@function font-weight($key) { + @return map-get($font-weights, $key); +} + +// Breakpoint function +@function breakpoint($key) { + @return map-get($breakpoints, $key); +} diff --git a/src/styles/abstracts/_index.scss b/src/styles/abstracts/_index.scss new file mode 100644 index 0000000..115e2ad --- /dev/null +++ b/src/styles/abstracts/_index.scss @@ -0,0 +1,3 @@ +@import './variables'; +@import './functions'; +@import './mixins'; diff --git a/src/styles/abstracts/_mixins.scss b/src/styles/abstracts/_mixins.scss new file mode 100644 index 0000000..99d06c7 --- /dev/null +++ b/src/styles/abstracts/_mixins.scss @@ -0,0 +1,212 @@ +// Flexbox mixins +@mixin flex($direction: row, $justify: flex-start, $align: stretch, $wrap: nowrap) { + display: flex; + flex-direction: $direction; + justify-content: $justify; + align-items: $align; + flex-wrap: $wrap; +} + +@mixin flex-center { + @include flex(row, center, center); +} + +@mixin flex-between { + @include flex(row, space-between, center); +} + +@mixin flex-col { + @include flex(column, flex-start, stretch); +} + +// Grid mixin +@mixin grid($columns: 1, $gap: spacing(4)) { + display: grid; + grid-template-columns: repeat($columns, 1fr); + gap: $gap; +} + +// Spacing mixins +@mixin p($value) { + padding: spacing($value); +} + +@mixin px($value) { + padding-left: spacing($value); + padding-right: spacing($value); +} + +@mixin py($value) { + padding-top: spacing($value); + padding-bottom: spacing($value); +} + +@mixin pt($value) { + padding-top: spacing($value); +} + +@mixin pr($value) { + padding-right: spacing($value); +} + +@mixin pb($value) { + padding-bottom: spacing($value); +} + +@mixin pl($value) { + padding-left: spacing($value); +} + +@mixin m($value) { + margin: spacing($value); +} + +@mixin mx($value) { + margin-left: spacing($value); + margin-right: spacing($value); +} + +@mixin my($value) { + margin-top: spacing($value); + margin-bottom: spacing($value); +} + +@mixin mt($value) { + margin-top: spacing($value); +} + +@mixin mr($value) { + margin-right: spacing($value); +} + +@mixin mb($value) { + margin-bottom: spacing($value); +} + +@mixin ml($value) { + margin-left: spacing($value); +} + +// Gap mixin +@mixin gap($value) { + gap: spacing($value); +} + +// Border radius mixin +@mixin rounded($value: base) { + border-radius: radius($value); +} + +// Typography mixins +@mixin text($size) { + font-size: font-size($size); +} + +@mixin font($weight) { + font-weight: font-weight($weight); +} + +// Responsive breakpoint mixin +@mixin respond-to($breakpoint) { + $size: breakpoint($breakpoint); + @media (min-width: $size) { + @content; + } +} + +// Button base styles mixin +@mixin button-base { + @include px(4); + @include py(2); + @include rounded(md); + @include font(medium); + @include text(sm); + display: inline-flex; + align-items: center; + justify-content: center; + gap: spacing(2); + cursor: pointer; + transition: all 0.2s ease; + border: none; + outline: none; + + &:disabled { + opacity: 0.5; + cursor: not-allowed; + } +} + +// Card mixin +@mixin card { + background: $card; + color: $card-foreground; + border: 1px solid $border; + @include rounded(lg); + @include p(6); +} + +// Shadow mixins +@mixin shadow-sm { + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); +} + +@mixin shadow { + box-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); +} + +@mixin shadow-md { + box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); +} + +@mixin shadow-lg { + box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); +} + +// Transition mixin +@mixin transition($properties: all, $duration: 0.2s, $timing: ease) { + transition: $properties $duration $timing; +} + +// Truncate text +@mixin truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +// Visually hidden (for accessibility) +@mixin sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +// Absolute positioning shortcuts +@mixin absolute-center { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); +} + +@mixin absolute-fill { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; +} + +// Focus ring +@mixin focus-ring { + &:focus-visible { + outline: 2px solid $ring; + outline-offset: 2px; + } +} diff --git a/src/styles/abstracts/_variables.scss b/src/styles/abstracts/_variables.scss new file mode 100644 index 0000000..f80ea5e --- /dev/null +++ b/src/styles/abstracts/_variables.scss @@ -0,0 +1,119 @@ +// Color Variables +$background: hsl(222.2, 84%, 4.9%); +$foreground: hsl(210, 40%, 98%); +$card: hsl(222.2, 84%, 4.9%); +$card-foreground: hsl(210, 40%, 98%); +$popover: hsl(222.2, 84%, 4.9%); +$popover-foreground: hsl(210, 40%, 98%); +$primary: hsl(263, 70%, 50%); +$primary-foreground: hsl(210, 40%, 98%); +$secondary: hsl(217.2, 32.6%, 17.5%); +$secondary-foreground: hsl(210, 40%, 98%); +$muted: hsl(217.2, 32.6%, 17.5%); +$muted-foreground: hsl(215, 20.2%, 65.1%); +$accent: hsl(195, 100%, 70%); +$accent-foreground: hsl(222.2, 84%, 4.9%); +$destructive: hsl(0, 62.8%, 30.6%); +$destructive-foreground: hsl(210, 40%, 98%); +$border: hsl(217.2, 32.6%, 17.5%); +$input: hsl(217.2, 32.6%, 17.5%); +$ring: hsl(195, 100%, 70%); + +// Spacing Scale +$spacing: ( + 0: 0, + px: 1px, + 0-5: 0.125rem, + 1: 0.25rem, + 1-5: 0.375rem, + 2: 0.5rem, + 2-5: 0.625rem, + 3: 0.75rem, + 3-5: 0.875rem, + 4: 1rem, + 5: 1.25rem, + 6: 1.5rem, + 7: 1.75rem, + 8: 2rem, + 9: 2.25rem, + 10: 2.5rem, + 11: 2.75rem, + 12: 3rem, + 14: 3.5rem, + 16: 4rem, + 20: 5rem, + 24: 6rem, + 28: 7rem, + 32: 8rem, + 36: 9rem, + 40: 10rem, + 48: 12rem, + 56: 14rem, + 64: 16rem, + 72: 18rem, + 80: 20rem, + 96: 24rem, +); + +// Border Radius +$radius: ( + none: 0, + sm: 0.125rem, + base: 0.25rem, + md: 0.375rem, + lg: 0.5rem, + xl: 0.75rem, + 2xl: 1rem, + 3xl: 1.5rem, + full: 9999px, +); + +// Font Sizes +$font-sizes: ( + xs: 0.75rem, + sm: 0.875rem, + base: 1rem, + lg: 1.125rem, + xl: 1.25rem, + 2xl: 1.5rem, + 3xl: 1.875rem, + 4xl: 2.25rem, + 5xl: 3rem, + 6xl: 3.75rem, + 7xl: 4.5rem, + 8xl: 6rem, + 9xl: 8rem, +); + +// Font Weights +$font-weights: ( + thin: 100, + extralight: 200, + light: 300, + normal: 400, + medium: 500, + semibold: 600, + bold: 700, + extrabold: 800, + black: 900, +); + +// Breakpoints +$breakpoints: ( + sm: 640px, + md: 768px, + lg: 1024px, + xl: 1280px, + 2xl: 1536px, +); + +// Z-index scale +$z-index: ( + 0: 0, + 10: 10, + 20: 20, + 30: 30, + 40: 40, + 50: 50, + auto: auto, +); diff --git a/src/styles/utilities/_utilities.scss b/src/styles/utilities/_utilities.scss new file mode 100644 index 0000000..13303c2 --- /dev/null +++ b/src/styles/utilities/_utilities.scss @@ -0,0 +1,146 @@ +@import '../abstracts'; + +// Utility classes generator +@each $name, $value in $spacing { + .p-#{$name} { padding: $value !important; } + .px-#{$name} { padding-left: $value !important; padding-right: $value !important; } + .py-#{$name} { padding-top: $value !important; padding-bottom: $value !important; } + .pt-#{$name} { padding-top: $value !important; } + .pr-#{$name} { padding-right: $value !important; } + .pb-#{$name} { padding-bottom: $value !important; } + .pl-#{$name} { padding-left: $value !important; } + + .m-#{$name} { margin: $value !important; } + .mx-#{$name} { margin-left: $value !important; margin-right: $value !important; } + .my-#{$name} { margin-top: $value !important; margin-bottom: $value !important; } + .mt-#{$name} { margin-top: $value !important; } + .mr-#{$name} { margin-right: $value !important; } + .mb-#{$name} { margin-bottom: $value !important; } + .ml-#{$name} { margin-left: $value !important; } + + .gap-#{$name} { gap: $value !important; } +} + +// Flexbox utilities +.flex { display: flex !important; } +.inline-flex { display: inline-flex !important; } +.flex-row { flex-direction: row !important; } +.flex-col { flex-direction: column !important; } +.flex-wrap { flex-wrap: wrap !important; } +.flex-nowrap { flex-wrap: nowrap !important; } +.flex-1 { flex: 1 1 0% !important; } + +// Justify content +.justify-start { justify-content: flex-start !important; } +.justify-end { justify-content: flex-end !important; } +.justify-center { justify-content: center !important; } +.justify-between { justify-content: space-between !important; } +.justify-around { justify-content: space-around !important; } + +// Align items +.items-start { align-items: flex-start !important; } +.items-end { align-items: flex-end !important; } +.items-center { align-items: center !important; } +.items-stretch { align-items: stretch !important; } + +// Grid +.grid { display: grid !important; } +.grid-cols-1 { grid-template-columns: repeat(1, minmax(0, 1fr)) !important; } +.grid-cols-2 { grid-template-columns: repeat(2, minmax(0, 1fr)) !important; } +.grid-cols-3 { grid-template-columns: repeat(3, minmax(0, 1fr)) !important; } +.grid-cols-4 { grid-template-columns: repeat(4, minmax(0, 1fr)) !important; } + +// Border radius +@each $name, $value in $radius { + .rounded-#{$name} { border-radius: $value !important; } +} + +// Text sizes +@each $name, $value in $font-sizes { + .text-#{$name} { font-size: $value !important; } +} + +// Font weights +@each $name, $value in $font-weights { + .font-#{$name} { font-weight: $value !important; } +} + +// Text align +.text-left { text-align: left !important; } +.text-center { text-align: center !important; } +.text-right { text-align: right !important; } + +// Colors +.text-foreground { color: $foreground !important; } +.text-muted-foreground { color: $muted-foreground !important; } +.text-primary { color: $primary !important; } +.text-destructive { color: $destructive !important; } +.text-accent { color: $accent !important; } + +.bg-background { background-color: $background !important; } +.bg-card { background-color: $card !important; } +.bg-primary { background-color: $primary !important; } +.bg-secondary { background-color: $secondary !important; } +.bg-muted { background-color: $muted !important; } +.bg-accent { background-color: $accent !important; } +.bg-destructive { background-color: $destructive !important; } + +// Border +.border { border: 1px solid $border !important; } +.border-b { border-bottom: 1px solid $border !important; } +.border-t { border-top: 1px solid $border !important; } +.border-l { border-left: 1px solid $border !important; } +.border-r { border-right: 1px solid $border !important; } + +// Width & Height +.w-full { width: 100% !important; } +.h-full { height: 100% !important; } +.min-h-screen { min-height: 100vh !important; } +.max-w-3xl { max-width: 48rem !important; } +.max-w-7xl { max-width: 80rem !important; } + +// Position +.relative { position: relative !important; } +.absolute { position: absolute !important; } +.fixed { position: fixed !important; } +.sticky { position: sticky !important; } + +// Display +.hidden { display: none !important; } +.block { display: block !important; } +.inline-block { display: inline-block !important; } + +// Overflow +.overflow-hidden { overflow: hidden !important; } +.overflow-auto { overflow: auto !important; } +.overflow-scroll { overflow: scroll !important; } + +// Cursor +.cursor-pointer { cursor: pointer !important; } +.cursor-not-allowed { cursor: not-allowed !important; } + +// Opacity +.opacity-50 { opacity: 0.5 !important; } +.opacity-75 { opacity: 0.75 !important; } +.opacity-100 { opacity: 1 !important; } + +// Transitions +.transition { transition: all 0.2s ease !important; } +.transition-colors { transition: color 0.2s ease, background-color 0.2s ease, border-color 0.2s ease !important; } + +// Shadow +.shadow-sm { @include shadow-sm; } +.shadow { @include shadow; } +.shadow-md { @include shadow-md; } +.shadow-lg { @include shadow-lg; } + +// Space between children +.space-y-2 > * + * { margin-top: spacing(2) !important; } +.space-y-3 > * + * { margin-top: spacing(3) !important; } +.space-y-4 > * + * { margin-top: spacing(4) !important; } +.space-y-6 > * + * { margin-top: spacing(6) !important; } +.space-y-8 > * + * { margin-top: spacing(8) !important; } + +.space-x-2 > * + * { margin-left: spacing(2) !important; } +.space-x-3 > * + * { margin-left: spacing(3) !important; } +.space-x-4 > * + * { margin-left: spacing(4) !important; } diff --git a/tailwind.config.js b/tailwind.config.js deleted file mode 100644 index 7b67caf..0000000 --- a/tailwind.config.js +++ /dev/null @@ -1,62 +0,0 @@ -/** @type {import('tailwindcss').Config} */ -export default { - darkMode: ["class"], - content: [ - './src/pages/**/*.{ts,tsx}', - './src/components/**/*.{ts,tsx}', - './src/app/**/*.{ts,tsx}', - './src/**/*.{ts,tsx}', - ], - theme: { - container: { - center: true, - padding: "2rem", - screens: { - "2xl": "1400px", - }, - }, - extend: { - colors: { - border: "hsl(var(--border))", - input: "hsl(var(--input))", - ring: "hsl(var(--ring))", - background: "hsl(var(--background))", - foreground: "hsl(var(--foreground))", - primary: { - DEFAULT: "hsl(var(--primary))", - foreground: "hsl(var(--primary-foreground))", - }, - secondary: { - DEFAULT: "hsl(var(--secondary))", - foreground: "hsl(var(--secondary-foreground))", - }, - destructive: { - DEFAULT: "hsl(var(--destructive))", - foreground: "hsl(var(--destructive-foreground))", - }, - muted: { - DEFAULT: "hsl(var(--muted))", - foreground: "hsl(var(--muted-foreground))", - }, - accent: { - DEFAULT: "hsl(var(--accent))", - foreground: "hsl(var(--accent-foreground))", - }, - popover: { - DEFAULT: "hsl(var(--popover))", - foreground: "hsl(var(--popover-foreground))", - }, - card: { - DEFAULT: "hsl(var(--card))", - foreground: "hsl(var(--card-foreground))", - }, - }, - borderRadius: { - lg: "var(--radius)", - md: "calc(var(--radius) - 2px)", - sm: "calc(var(--radius) - 4px)", - }, - }, - }, - plugins: [], -}