From cab271e255b5f6040dfb25e8ecd33c6e27efa799 Mon Sep 17 00:00:00 2001 From: Angad Tendulkar Date: Tue, 15 Oct 2024 23:18:33 -0400 Subject: [PATCH 1/3] except for csv --- bun.lockb | Bin 0 -> 175576 bytes package.json | 5 +- pnpm-lock.yaml | 3920 ----------------- src-api/Cargo.toml | 2 +- src-api/migrations/20241015000058_noid.sql | 4 + .../migrations/20241016030955_string_ids.sql | 4 + src-api/src/main.rs | 65 +- src-api/src/model.rs | 39 +- src-api/src/routes/csv.rs | 55 +- src-api/src/routes/exists.rs | 15 - src-api/src/routes/hours.rs | 17 +- src-api/src/routes/mod.rs | 8 +- src-api/src/routes/register.rs | 23 - src-api/src/routes/{log.rs => roster.rs} | 12 +- src/app/admin/page.tsx | 34 + src/app/attendance/page.tsx | 74 + src/app/layout.tsx | 20 +- src/app/login/page.tsx | 58 + src/app/page.tsx | 175 +- src/app/student/page.tsx | 165 +- src/app/template.tsx | 53 + src/components/forms/index.tsx | 46 +- src/components/ui/backbutton.tsx | 20 + src/components/ui/button.tsx | 16 +- src/lib/api.ts | 121 + src/lib/transitions.ts | 15 + src/lib/utils.ts | 3 +- src/{app/globals.css => styles/globals.scss} | 0 tsconfig.json | 78 +- 29 files changed, 599 insertions(+), 4448 deletions(-) create mode 100755 bun.lockb delete mode 100644 pnpm-lock.yaml create mode 100644 src-api/migrations/20241015000058_noid.sql create mode 100644 src-api/migrations/20241016030955_string_ids.sql delete mode 100644 src-api/src/routes/exists.rs delete mode 100644 src-api/src/routes/register.rs rename src-api/src/routes/{log.rs => roster.rs} (86%) create mode 100644 src/app/admin/page.tsx create mode 100644 src/app/attendance/page.tsx create mode 100644 src/app/login/page.tsx create mode 100644 src/app/template.tsx create mode 100644 src/components/ui/backbutton.tsx create mode 100644 src/lib/api.ts create mode 100644 src/lib/transitions.ts rename src/{app/globals.css => styles/globals.scss} (100%) diff --git a/bun.lockb b/bun.lockb new file mode 100755 index 0000000000000000000000000000000000000000..73d41f961eb39beb60df3328c1ba88065741bac5 GIT binary patch literal 175576 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'} - - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - - '@eslint/eslintrc@2.1.4': - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@eslint/js@8.57.1': - resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - '@floating-ui/core@1.6.8': - resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==} - - '@floating-ui/dom@1.6.11': - resolution: {integrity: sha512-qkMCxSR24v2vGkhYDo/UzxfJN3D4syqSjyuTFz6C7XcpU1pASPRieNI0Kj5VP3/503mOfYiGY891ugBX1GlABQ==} - - '@floating-ui/react-dom@2.1.2': - resolution: {integrity: sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==} - peerDependencies: - react: '>=16.8.0' - react-dom: '>=16.8.0' - - '@floating-ui/utils@0.2.8': - resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==} - - '@hookform/resolvers@3.9.0': - resolution: {integrity: sha512-bU0Gr4EepJ/EQsH/IwEzYLsT/PEj5C0ynLQ4m+GSHS+xKH4TfSelhluTgOaoc4kA5s7eCsQbM4wvZLzELmWzUg==} - peerDependencies: - react-hook-form: ^7.0.0 - - '@humanwhocodes/config-array@0.13.0': - resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} - engines: {node: '>=10.10.0'} - deprecated: Use @eslint/config-array instead - - '@humanwhocodes/module-importer@1.0.1': - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - - '@humanwhocodes/object-schema@2.0.3': - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - deprecated: Use @eslint/object-schema instead - - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - - '@jridgewell/gen-mapping@0.3.5': - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - - '@jridgewell/resolve-uri@3.1.2': - resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} - engines: {node: '>=6.0.0'} - - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - - '@jridgewell/sourcemap-codec@1.5.0': - resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} - - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@next/env@14.2.11': - resolution: {integrity: sha512-HYsQRSIXwiNqvzzYThrBwq6RhXo3E0n8j8nQnAs8i4fCEo2Zf/3eS0IiRA8XnRg9Ha0YnpkyJZIZg1qEwemrHw==} - - '@next/eslint-plugin-next@14.2.11': - resolution: {integrity: sha512-7mw+xW7Y03Ph4NTCcAzYe+vu4BNjEHZUfZayyF3Y1D9RX6c5NIe25m1grHEAkyUuaqjRxOYhnCNeglOkIqLkBA==} - - '@next/swc-darwin-arm64@14.2.11': - resolution: {integrity: sha512-eiY9u7wEJZWp/Pga07Qy3ZmNEfALmmSS1HtsJF3y1QEyaExu7boENz11fWqDmZ3uvcyAxCMhTrA1jfVxITQW8g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - - '@next/swc-darwin-x64@14.2.11': - resolution: {integrity: sha512-lnB0zYCld4yE0IX3ANrVMmtAbziBb7MYekcmR6iE9bujmgERl6+FK+b0MBq0pl304lYe7zO4yxJus9H/Af8jbg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - - '@next/swc-linux-arm64-gnu@14.2.11': - resolution: {integrity: sha512-Ulo9TZVocYmUAtzvZ7FfldtwUoQY0+9z3BiXZCLSUwU2bp7GqHA7/bqrfsArDlUb2xeGwn3ZuBbKtNK8TR0A8w==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-arm64-musl@14.2.11': - resolution: {integrity: sha512-fH377DnKGyUnkWlmUpFF1T90m0dADBfK11dF8sOQkiELF9M+YwDRCGe8ZyDzvQcUd20Rr5U7vpZRrAxKwd3Rzg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - - '@next/swc-linux-x64-gnu@14.2.11': - resolution: {integrity: sha512-a0TH4ZZp4NS0LgXP/488kgvWelNpwfgGTUCDXVhPGH6pInb7yIYNgM4kmNWOxBFt+TIuOH6Pi9NnGG4XWFUyXQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-linux-x64-musl@14.2.11': - resolution: {integrity: sha512-DYYZcO4Uir2gZxA4D2JcOAKVs8ZxbOFYPpXSVIgeoQbREbeEHxysVsg3nY4FrQy51e5opxt5mOHl/LzIyZBoKA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - - '@next/swc-win32-arm64-msvc@14.2.11': - resolution: {integrity: sha512-PwqHeKG3/kKfPpM6of1B9UJ+Er6ySUy59PeFu0Un0LBzJTRKKAg2V6J60Yqzp99m55mLa+YTbU6xj61ImTv9mg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - - '@next/swc-win32-ia32-msvc@14.2.11': - resolution: {integrity: sha512-0U7PWMnOYIvM74GY6rbH6w7v+vNPDVH1gUhlwHpfInJnNe5LkmUZqhp7FNWeNa5wbVgRcRi1F1cyxp4dmeLLvA==} - engines: {node: '>= 10'} - cpu: [ia32] - os: [win32] - - '@next/swc-win32-x64-msvc@14.2.11': - resolution: {integrity: sha512-gQpS7mcgovWoaTG1FbS5/ojF7CGfql1Q0ZLsMrhcsi2Sr9HEqsUZ70MPJyaYBXbk6iEAP7UXMD9HC8KY1qNwvA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - - '@nodelib/fs.scandir@2.1.5': - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - - '@nodelib/fs.stat@2.0.5': - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - '@nodelib/fs.walk@1.2.8': - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - - '@nolyfill/is-core-module@1.0.39': - resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} - engines: {node: '>=12.4.0'} - - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - - '@radix-ui/primitive@1.1.0': - resolution: {integrity: sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA==} - - '@radix-ui/react-arrow@1.1.0': - resolution: {integrity: sha512-FmlW1rCg7hBpEBwFbjHwCW6AmWLQM6g/v0Sn8XbP9NvmSZ2San1FpQeyPtufzOMSIx7Y4dzjlHoifhp+7NkZhw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-compose-refs@1.1.0': - resolution: {integrity: sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-context@1.1.0': - resolution: {integrity: sha512-OKrckBy+sMEgYM/sMmqmErVn0kZqrHPJze+Ql3DzYsDDp0hl0L62nx/2122/Bvps1qz645jlcu2tD9lrRSdf8A==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-dismissable-layer@1.1.0': - resolution: {integrity: sha512-/UovfmmXGptwGcBQawLzvn2jOfM0t4z3/uKffoBlj724+n3FvBbZ7M0aaBOmkp6pqFYpO4yx8tSVJjx3Fl2jig==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-icons@1.3.0': - resolution: {integrity: sha512-jQxj/0LKgp+j9BiTXz3O3sgs26RNet2iLWmsPyRz2SIcR4q/4SbazXfnYwbAr+vLYKSfc7qxzyGQA1HLlYiuNw==} - peerDependencies: - react: ^16.x || ^17.x || ^18.x - - '@radix-ui/react-id@1.1.0': - resolution: {integrity: sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-label@2.1.0': - resolution: {integrity: sha512-peLblDlFw/ngk3UWq0VnYaOLy6agTZZ+MUO/WhVfm14vJGML+xH4FAl2XQGLqdefjNb7ApRg6Yn7U42ZhmYXdw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-popper@1.2.0': - resolution: {integrity: sha512-ZnRMshKF43aBxVWPWvbj21+7TQCvhuULWJ4gNIKYpRlQt5xGRhLx66tMp8pya2UkGHTSlhpXwmjqltDYHhw7Vg==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-portal@1.1.1': - resolution: {integrity: sha512-A3UtLk85UtqhzFqtoC8Q0KvR2GbXF3mtPgACSazajqq6A41mEQgo53iPzY4i6BwDxlIFqWIhiQ2G729n+2aw/g==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-presence@1.1.0': - resolution: {integrity: sha512-Gq6wuRN/asf9H/E/VzdKoUtT8GC9PQc9z40/vEr0VCJ4u5XvvhWIrSsCB6vD2/cH7ugTdSfYq9fLJCcM00acrQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-primitive@2.0.0': - resolution: {integrity: sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-slot@1.1.0': - resolution: {integrity: sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-tooltip@1.1.2': - resolution: {integrity: sha512-9XRsLwe6Yb9B/tlnYCPVUd/TFS4J7HuOZW345DCeC6vKIxQGMZdx21RK4VoZauPD5frgkXTYVS5y90L+3YBn4w==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/react-use-callback-ref@1.1.0': - resolution: {integrity: sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-controllable-state@1.1.0': - resolution: {integrity: sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-escape-keydown@1.1.0': - resolution: {integrity: sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-layout-effect@1.1.0': - resolution: {integrity: sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-rect@1.1.0': - resolution: {integrity: sha512-0Fmkebhr6PiseyZlYAOtLS+nb7jLmpqTrJyv61Pe68MKYW6OWdRE2kI70TaYY27u7H0lajqM3hSMMLFq18Z7nQ==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-use-size@1.1.0': - resolution: {integrity: sha512-XW3/vWuIXHa+2Uwcc2ABSfcCledmXhhQPlGbfcRXbiUQI5Icjcg19BGCZVKKInYbvUCut/ufbbLLPFC5cbb1hw==} - peerDependencies: - '@types/react': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - - '@radix-ui/react-visually-hidden@1.1.0': - resolution: {integrity: sha512-N8MDZqtgCgG5S3aV60INAB475osJousYpZ4cTJ2cFbMpdHS5Y6loLTH8LPtkj2QN0x93J30HT/M3qJXM0+lyeQ==} - peerDependencies: - '@types/react': '*' - '@types/react-dom': '*' - react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - - '@radix-ui/rect@1.1.0': - resolution: {integrity: sha512-A9+lCBZoaMJlVKcRBz2YByCG+Cp2t6nAnMnNba+XiWxnj6r4JUFqfsgwocMBZU9LPtdxC6wB56ySYpc7LQIoJg==} - - '@rtsao/scc@1.1.0': - resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - - '@rushstack/eslint-patch@1.10.4': - resolution: {integrity: sha512-WJgX9nzTqknM393q1QJDJmoW28kUfEnybeTfVNcNAPnIx210RXm2DiXiHzfNPJNIUUb1tJnz/l4QGtJ30PgWmA==} - - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - - '@swc/helpers@0.5.5': - resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} - - '@types/json-schema@7.0.15': - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - - '@types/json5@0.0.29': - resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} - - '@types/node@20.16.5': - resolution: {integrity: sha512-VwYCweNo3ERajwy0IUlqqcyZ8/A7Zwa9ZP3MnENWcB11AejO+tLy3pu850goUW2FC/IJMdZUfKpX/yxL1gymCA==} - - '@types/prop-types@15.7.13': - resolution: {integrity: sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==} - - '@types/react-dom@18.3.0': - resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} - - '@types/react@18.3.7': - resolution: {integrity: sha512-KUnDCJF5+AiZd8owLIeVHqmW9yM4sqmDVf2JRJiBMFkGvkoZ4/WyV2lL4zVsoinmRS/W3FeEdZLEWFRofnT2FQ==} - - '@types/semver@7.5.8': - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - - '@typescript-eslint/eslint-plugin@7.2.0': - resolution: {integrity: sha512-mdekAHOqS9UjlmyF/LSs6AIEvfceV749GFxoBAjwAv0nkevfKHWQFDMcBZWUiIC5ft6ePWivXoS36aKQ0Cy3sw==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^7.0.0 - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/parser@7.2.0': - resolution: {integrity: sha512-5FKsVcHTk6TafQKQbuIVkXq58Fnbkd2wDL4LB7AURN7RUOu1utVP+G8+6u3ZhEroW3DF6hyo3ZEXxgKgp4KeCg==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/scope-manager@7.2.0': - resolution: {integrity: sha512-Qh976RbQM/fYtjx9hs4XkayYujB/aPwglw2choHmf3zBjB4qOywWSdt9+KLRdHubGcoSwBnXUH2sR3hkyaERRg==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/type-utils@7.2.0': - resolution: {integrity: sha512-xHi51adBHo9O9330J8GQYQwrKBqbIPJGZZVQTHHmy200hvkLZFWJIFtAG/7IYTWUyun6DE6w5InDReePJYJlJA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^8.56.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/types@7.2.0': - resolution: {integrity: sha512-XFtUHPI/abFhm4cbCDc5Ykc8npOKBSJePY3a3s+lwumt7XWJuzP5cZcfZ610MIPHjQjNsOLlYK8ASPaNG8UiyA==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@typescript-eslint/typescript-estree@7.2.0': - resolution: {integrity: sha512-cyxS5WQQCoBwSakpMrvMXuMDEbhOo9bNHHrNcEWis6XHx6KF518tkF1wBvKIn/tpq5ZpUYK7Bdklu8qY0MsFIA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - - '@typescript-eslint/utils@7.2.0': - resolution: {integrity: sha512-YfHpnMAGb1Eekpm3XRK8hcMwGLGsnT6L+7b2XyRv6ouDuJU1tZir1GS2i0+VXRatMwSI1/UfcyPe53ADkU+IuA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^8.56.0 - - '@typescript-eslint/visitor-keys@7.2.0': - resolution: {integrity: sha512-c6EIQRHhcpl6+tO8EMR+kjkkV+ugUNXOmeASA1rlzkd8EPIriavpWoiEz1HR/VLhbVIdhqnV6E7JZm00cBDx2A==} - engines: {node: ^16.0.0 || >=18.0.0} - - '@ungap/structured-clone@1.2.0': - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - - acorn-jsx@5.3.2: - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} - engines: {node: '>=0.4.0'} - hasBin: true - - ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - - ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - ansi-regex@6.1.0: - resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} - engines: {node: '>=12'} - - ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - - arg@5.0.2: - resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} - - argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - aria-query@5.1.3: - resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} - - array-buffer-byte-length@1.0.1: - resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} - engines: {node: '>= 0.4'} - - array-includes@3.1.8: - resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} - engines: {node: '>= 0.4'} - - array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - array.prototype.findlast@1.2.5: - resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} - engines: {node: '>= 0.4'} - - array.prototype.findlastindex@1.2.5: - resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} - engines: {node: '>= 0.4'} - - array.prototype.flat@1.3.2: - resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} - engines: {node: '>= 0.4'} - - array.prototype.flatmap@1.3.2: - resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} - engines: {node: '>= 0.4'} - - array.prototype.tosorted@1.1.4: - resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==} - engines: {node: '>= 0.4'} - - arraybuffer.prototype.slice@1.0.3: - resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} - engines: {node: '>= 0.4'} - - ast-types-flow@0.0.8: - resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} - - available-typed-arrays@1.0.7: - resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} - engines: {node: '>= 0.4'} - - axe-core@4.10.0: - resolution: {integrity: sha512-Mr2ZakwQ7XUAjp7pAwQWRhhK8mQQ6JAaNWSjmjxil0R8BPioMtQsTLOolGYkji1rcL++3dCqZA3zWqpT+9Ew6g==} - engines: {node: '>=4'} - - axobject-query@4.1.0: - resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} - engines: {node: '>= 0.4'} - - balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - - brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - - brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - - braces@3.0.3: - resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} - engines: {node: '>=8'} - - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - - call-bind@1.0.7: - resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} - engines: {node: '>= 0.4'} - - callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - camelcase-css@2.0.1: - resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} - engines: {node: '>= 6'} - - caniuse-lite@1.0.30001660: - resolution: {integrity: sha512-GacvNTTuATm26qC74pt+ad1fW15mlQ/zuTzzY1ZoIzECTP8HURDfF43kNxPgf7H1jmelCBQTTbBNxdSXOA7Bqg==} - - chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - class-variance-authority@0.7.0: - resolution: {integrity: sha512-jFI8IQw4hczaL4ALINxqLEXQbWcNjoSkloa4IaufXCJr6QawJyw7tuRysRsrE8w2p/4gGaxKIt/hX3qz/IbD1A==} - - client-only@0.0.1: - resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} - - clsx@2.0.0: - resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} - engines: {node: '>=6'} - - clsx@2.1.1: - resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} - engines: {node: '>=6'} - - color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - - color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - - concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - - csstype@3.1.3: - resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} - - damerau-levenshtein@1.0.8: - resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} - - data-view-buffer@1.0.1: - resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} - engines: {node: '>= 0.4'} - - data-view-byte-length@1.0.1: - resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} - engines: {node: '>= 0.4'} - - data-view-byte-offset@1.0.0: - resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} - engines: {node: '>= 0.4'} - - debug@3.2.7: - resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - - deep-equal@2.2.3: - resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} - engines: {node: '>= 0.4'} - - deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - - define-data-property@1.1.4: - resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} - engines: {node: '>= 0.4'} - - define-properties@1.2.1: - resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} - engines: {node: '>= 0.4'} - - didyoumean@1.2.2: - resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} - - dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - - dlv@1.1.3: - resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} - - doctrine@2.1.0: - resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} - engines: {node: '>=0.10.0'} - - doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} - engines: {node: '>=10.13.0'} - - es-abstract@1.23.3: - resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} - engines: {node: '>= 0.4'} - - es-define-property@1.0.0: - resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} - engines: {node: '>= 0.4'} - - es-errors@1.3.0: - resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} - engines: {node: '>= 0.4'} - - es-get-iterator@1.1.3: - resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} - - es-iterator-helpers@1.0.19: - resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} - engines: {node: '>= 0.4'} - - es-object-atoms@1.0.0: - resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} - engines: {node: '>= 0.4'} - - es-set-tostringtag@2.0.3: - resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} - engines: {node: '>= 0.4'} - - es-shim-unscopables@1.0.2: - resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} - - es-to-primitive@1.2.1: - resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} - engines: {node: '>= 0.4'} - - escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - eslint-config-next@14.2.11: - resolution: {integrity: sha512-gGIoBoHCJuLn6vaV1Ke8UurVvgb7JjQv6oRlWmI6RAAxz7KwJOYxxm2blctavA0a3eofbE9TdgKvvTb2G55OHQ==} - peerDependencies: - eslint: ^7.23.0 || ^8.0.0 - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - - eslint-import-resolver-node@0.3.9: - resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} - - eslint-import-resolver-typescript@3.6.3: - resolution: {integrity: sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA==} - engines: {node: ^14.18.0 || >=16.0.0} - peerDependencies: - eslint: '*' - eslint-plugin-import: '*' - eslint-plugin-import-x: '*' - peerDependenciesMeta: - eslint-plugin-import: - optional: true - eslint-plugin-import-x: - optional: true - - eslint-module-utils@2.11.0: - resolution: {integrity: sha512-gbBE5Hitek/oG6MUVj6sFuzEjA/ClzNflVrLovHi/JgLdC7fiN5gLAY1WIPW1a0V5I999MnsrvVrCOGmmVqDBQ==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: '*' - eslint-import-resolver-node: '*' - eslint-import-resolver-typescript: '*' - eslint-import-resolver-webpack: '*' - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - eslint: - optional: true - eslint-import-resolver-node: - optional: true - eslint-import-resolver-typescript: - optional: true - eslint-import-resolver-webpack: - optional: true - - eslint-plugin-import@2.30.0: - resolution: {integrity: sha512-/mHNE9jINJfiD2EKkg1BKyPyUk4zdnT54YgbOgfjSakWT5oyX/qQLVNTkehyfpcMxZXMy1zyonZ2v7hZTX43Yw==} - engines: {node: '>=4'} - peerDependencies: - '@typescript-eslint/parser': '*' - eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 - peerDependenciesMeta: - '@typescript-eslint/parser': - optional: true - - eslint-plugin-jsx-a11y@6.10.0: - resolution: {integrity: sha512-ySOHvXX8eSN6zz8Bywacm7CvGNhUtdjvqfQDVe6020TUK34Cywkw7m0KsCCk1Qtm9G1FayfTN1/7mMYnYO2Bhg==} - engines: {node: '>=4.0'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9 - - eslint-plugin-react-hooks@4.6.2: - resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} - engines: {node: '>=10'} - peerDependencies: - eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - - eslint-plugin-react@7.36.1: - resolution: {integrity: sha512-/qwbqNXZoq+VP30s1d4Nc1C5GTxjJQjk4Jzs4Wq2qzxFM7dSmuG2UkIjg2USMLh3A/aVcUNrK7v0J5U1XEGGwA==} - engines: {node: '>=4'} - peerDependencies: - eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7 - - eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - eslint@8.57.1: - resolution: {integrity: sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - - esquery@1.6.0: - resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==} - engines: {node: '>=0.10'} - - esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - - estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} - engines: {node: '>=8.6.0'} - - fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - - fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - - fastq@1.17.1: - resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - - file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - - fill-range@7.1.1: - resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} - engines: {node: '>=8'} - - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - - flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - - flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - - for-each@0.3.3: - resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} - - foreground-child@3.3.0: - resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} - engines: {node: '>=14'} - - fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - - function-bind@1.1.2: - resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - - function.prototype.name@1.1.6: - resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} - engines: {node: '>= 0.4'} - - functions-have-names@1.2.3: - resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} - - get-intrinsic@1.2.4: - resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} - engines: {node: '>= 0.4'} - - get-symbol-description@1.0.2: - resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} - engines: {node: '>= 0.4'} - - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - - glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - - glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - - glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - glob@10.4.5: - resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} - hasBin: true - - glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported - - globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - - globalthis@1.0.4: - resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} - engines: {node: '>= 0.4'} - - globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - - gopd@1.0.1: - resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} - - graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - - has-bigints@1.0.2: - resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} - - has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - - has-property-descriptors@1.0.2: - resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} - - has-proto@1.0.3: - resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} - engines: {node: '>= 0.4'} - - has-symbols@1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} - engines: {node: '>= 0.4'} - - has-tostringtag@1.0.2: - resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} - engines: {node: '>= 0.4'} - - hasown@2.0.2: - resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} - engines: {node: '>= 0.4'} - - ignore@5.3.2: - resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} - engines: {node: '>= 4'} - - import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - - imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. - - inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - input-otp@1.2.4: - resolution: {integrity: sha512-md6rhmD+zmMnUh5crQNSQxq3keBRYvE3odbr4Qb9g2NWzQv9azi+t1a3X4TBTbh98fsGHgEEJlzbe1q860uGCA==} - peerDependencies: - react: ^16.8 || ^17.0 || ^18.0 - react-dom: ^16.8 || ^17.0 || ^18.0 - - internal-slot@1.0.7: - resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} - engines: {node: '>= 0.4'} - - is-arguments@1.1.1: - resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} - engines: {node: '>= 0.4'} - - is-array-buffer@3.0.4: - resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} - engines: {node: '>= 0.4'} - - is-async-function@2.0.0: - resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} - engines: {node: '>= 0.4'} - - is-bigint@1.0.4: - resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} - - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - - is-boolean-object@1.1.2: - resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} - engines: {node: '>= 0.4'} - - is-bun-module@1.2.1: - resolution: {integrity: sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q==} - - is-callable@1.2.7: - resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} - engines: {node: '>= 0.4'} - - is-core-module@2.15.1: - resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==} - engines: {node: '>= 0.4'} - - is-data-view@1.0.1: - resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} - engines: {node: '>= 0.4'} - - is-date-object@1.0.5: - resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} - engines: {node: '>= 0.4'} - - is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - is-finalizationregistry@1.0.2: - resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} - - is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - is-generator-function@1.0.10: - resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} - engines: {node: '>= 0.4'} - - is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - - is-map@2.0.3: - resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} - engines: {node: '>= 0.4'} - - is-negative-zero@2.0.3: - resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} - engines: {node: '>= 0.4'} - - is-number-object@1.0.7: - resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} - engines: {node: '>= 0.4'} - - is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - - is-regex@1.1.4: - resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} - engines: {node: '>= 0.4'} - - is-set@2.0.3: - resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} - engines: {node: '>= 0.4'} - - is-shared-array-buffer@1.0.3: - resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} - engines: {node: '>= 0.4'} - - is-string@1.0.7: - resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} - engines: {node: '>= 0.4'} - - is-symbol@1.0.4: - resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} - engines: {node: '>= 0.4'} - - is-typed-array@1.1.13: - resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} - engines: {node: '>= 0.4'} - - is-weakmap@2.0.2: - resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} - engines: {node: '>= 0.4'} - - is-weakref@1.0.2: - resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} - - is-weakset@2.0.3: - resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} - engines: {node: '>= 0.4'} - - isarray@2.0.5: - resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} - - isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - iterator.prototype@1.1.2: - resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} - - jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - - jackspeak@3.4.3: - resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - - jiti@1.21.6: - resolution: {integrity: sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==} - hasBin: true - - js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - - json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - - json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - - json5@1.0.2: - resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} - hasBin: true - - jsx-ast-utils@3.3.5: - resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} - engines: {node: '>=4.0'} - - keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - - language-subtag-registry@0.3.23: - resolution: {integrity: sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==} - - language-tags@1.0.9: - resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} - engines: {node: '>=0.10'} - - levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - - lilconfig@3.1.2: - resolution: {integrity: sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - - lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - - loose-envify@1.4.0: - resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} - hasBin: true - - lru-cache@10.4.3: - resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - - lucide-react@0.441.0: - resolution: {integrity: sha512-0vfExYtvSDhkC2lqg0zYVW1Uu9GsI4knuV9GP9by5z0Xhc4Zi5RejTxfz9LsjRmCyWVzHCJvxGKZWcRyvQCWVg==} - peerDependencies: - react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc - - merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - micromatch@4.0.8: - resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} - engines: {node: '>=8.6'} - - minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - - minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - - minimatch@9.0.5: - resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} - engines: {node: '>=16 || 14 >=14.17'} - - minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - - ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} - engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} - hasBin: true - - natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - - next-themes@0.3.0: - resolution: {integrity: sha512-/QHIrsYpd6Kfk7xakK4svpDI5mmXP0gfvCoJdGpZQ2TOrQZmsW0QxjaiLn8wbIKjtm4BTSqLoix4lxYYOnLJ/w==} - peerDependencies: - react: ^16.8 || ^17 || ^18 - react-dom: ^16.8 || ^17 || ^18 - - next@14.2.11: - resolution: {integrity: sha512-8MDFqHBhdmR2wdfaWc8+lW3A/hppFe1ggQ9vgIu/g2/2QEMYJrPoQP6b+VNk56gIug/bStysAmrpUKtj3XN8Bw==} - engines: {node: '>=18.17.0'} - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 - react: ^18.2.0 - react-dom: ^18.2.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - sass: - optional: true - - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - - object-hash@3.0.0: - resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} - engines: {node: '>= 6'} - - object-inspect@1.13.2: - resolution: {integrity: sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==} - engines: {node: '>= 0.4'} - - object-is@1.1.6: - resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} - engines: {node: '>= 0.4'} - - object-keys@1.1.1: - resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} - engines: {node: '>= 0.4'} - - object.assign@4.1.5: - resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} - engines: {node: '>= 0.4'} - - object.entries@1.1.8: - resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} - engines: {node: '>= 0.4'} - - object.fromentries@2.0.8: - resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} - engines: {node: '>= 0.4'} - - object.groupby@1.0.3: - resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} - engines: {node: '>= 0.4'} - - object.values@1.2.0: - resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} - engines: {node: '>= 0.4'} - - once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - - optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - - p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - - package-json-from-dist@1.0.0: - resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - - parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - - path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - - path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} - - picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - pify@2.3.0: - resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} - engines: {node: '>=0.10.0'} - - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - - possible-typed-array-names@1.0.0: - resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} - engines: {node: '>= 0.4'} - - postcss-import@15.1.0: - resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} - engines: {node: '>=14.0.0'} - peerDependencies: - postcss: ^8.0.0 - - postcss-js@4.0.1: - resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} - engines: {node: ^12 || ^14 || >= 16} - peerDependencies: - postcss: ^8.4.21 - - postcss-load-config@4.0.2: - resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} - engines: {node: '>= 14'} - peerDependencies: - postcss: '>=8.0.9' - ts-node: '>=9.0.0' - peerDependenciesMeta: - postcss: - optional: true - ts-node: - optional: true - - postcss-nested@6.2.0: - resolution: {integrity: sha512-HQbt28KulC5AJzG+cZtj9kvKB93CFCdLvog1WFLf1D+xmMvPGlBstkpTEZfK5+AN9hfJocyBFCNiqyS48bpgzQ==} - engines: {node: '>=12.0'} - peerDependencies: - postcss: ^8.2.14 - - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} - engines: {node: '>=4'} - - postcss-value-parser@4.2.0: - resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - - postcss@8.4.31: - resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} - engines: {node: ^10 || ^12 || >=14} - - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} - engines: {node: ^10 || ^12 || >=14} - - prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - - prop-types@15.8.1: - resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} - - punycode@2.3.1: - resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} - engines: {node: '>=6'} - - queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - react-dom@18.3.1: - resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} - peerDependencies: - react: ^18.3.1 - - react-hook-form@7.53.0: - resolution: {integrity: sha512-M1n3HhqCww6S2hxLxciEXy2oISPnAzxY7gvwVPrtlczTM/1dDadXgUxDpHMrMTblDOcm/AXtXxHwZ3jpg1mqKQ==} - engines: {node: '>=18.0.0'} - peerDependencies: - react: ^16.8.0 || ^17 || ^18 || ^19 - - react-is@16.13.1: - resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} - - react@18.3.1: - resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} - engines: {node: '>=0.10.0'} - - read-cache@1.0.0: - resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} - - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - - reflect.getprototypeof@1.0.6: - resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} - engines: {node: '>= 0.4'} - - regexp.prototype.flags@1.5.2: - resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} - engines: {node: '>= 0.4'} - - resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - resolve-pkg-maps@1.0.0: - resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - - resolve@1.22.8: - resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} - hasBin: true - - resolve@2.0.0-next.5: - resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} - hasBin: true - - reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported - hasBin: true - - run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - - safe-array-concat@1.1.2: - resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} - engines: {node: '>=0.4'} - - safe-regex-test@1.0.3: - resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} - engines: {node: '>= 0.4'} - - scheduler@0.23.2: - resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} - - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - semver@7.6.3: - resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} - engines: {node: '>=10'} - hasBin: true - - set-function-length@1.2.2: - resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} - engines: {node: '>= 0.4'} - - set-function-name@2.0.2: - resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} - engines: {node: '>= 0.4'} - - shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - - shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - side-channel@1.0.6: - resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} - engines: {node: '>= 0.4'} - - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - source-map-js@1.2.1: - resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} - engines: {node: '>=0.10.0'} - - stop-iteration-iterator@1.0.0: - resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} - engines: {node: '>= 0.4'} - - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - - string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - - string.prototype.includes@2.0.0: - resolution: {integrity: sha512-E34CkBgyeqNDcrbU76cDjL5JLcVrtSdYq0MEh/B10r17pRP4ciHLwTgnuLV8Ay6cgEMLkcBkFCKyFZ43YldYzg==} - - string.prototype.matchall@4.0.11: - resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} - engines: {node: '>= 0.4'} - - string.prototype.repeat@1.0.0: - resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==} - - string.prototype.trim@1.2.9: - resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} - engines: {node: '>= 0.4'} - - string.prototype.trimend@1.0.8: - resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} - - string.prototype.trimstart@1.0.8: - resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} - engines: {node: '>= 0.4'} - - strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - - strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - - strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - styled-jsx@5.1.1: - resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} - engines: {node: '>= 12.0.0'} - peerDependencies: - '@babel/core': '*' - babel-plugin-macros: '*' - react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' - peerDependenciesMeta: - '@babel/core': - optional: true - babel-plugin-macros: - optional: true - - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - - supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - - supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - tailwind-merge@2.5.2: - resolution: {integrity: sha512-kjEBm+pvD+6eAwzJL2Bi+02/9LFLal1Gs61+QB7HvTfQQ0aXwC5LGT8PEt1gS0CWKktKe6ysPTAy3cBC5MeiIg==} - - tailwindcss-animate@1.0.7: - resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==} - peerDependencies: - tailwindcss: '>=3.0.0 || insiders' - - tailwindcss@3.4.11: - resolution: {integrity: sha512-qhEuBcLemjSJk5ajccN9xJFtM/h0AVCPaA6C92jNP+M2J8kX+eMJHI7R2HFKUvvAsMpcfLILMCFYSeDwpMmlUg==} - engines: {node: '>=14.0.0'} - hasBin: true - - tapable@2.2.1: - resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} - engines: {node: '>=6'} - - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - - to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - - ts-api-utils@1.3.0: - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - - tsconfig-paths@3.15.0: - resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} - - tslib@2.7.0: - resolution: {integrity: sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==} - - type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - - type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - - typed-array-buffer@1.0.2: - resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} - engines: {node: '>= 0.4'} - - typed-array-byte-length@1.0.1: - resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} - engines: {node: '>= 0.4'} - - typed-array-byte-offset@1.0.2: - resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} - engines: {node: '>= 0.4'} - - typed-array-length@1.0.6: - resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} - engines: {node: '>= 0.4'} - - typescript@5.6.2: - resolution: {integrity: sha512-NW8ByodCSNCwZeghjN3o+JX5OFH0Ojg6sadjEKY4huZ52TqbJTJnDo5+Tw98lSy63NZvi4n+ez5m2u5d4PkZyw==} - engines: {node: '>=14.17'} - hasBin: true - - unbox-primitive@1.0.2: - resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} - - undici-types@6.19.8: - resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==} - - uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - - util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - - which-boxed-primitive@1.0.2: - resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} - - which-builtin-type@1.1.4: - resolution: {integrity: sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==} - engines: {node: '>= 0.4'} - - which-collection@1.0.2: - resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} - engines: {node: '>= 0.4'} - - which-typed-array@1.1.15: - resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} - engines: {node: '>= 0.4'} - - which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - - word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - - wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - yaml@2.5.1: - resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==} - engines: {node: '>= 14'} - hasBin: true - - yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - zod@3.23.8: - resolution: {integrity: sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==} - -snapshots: - - '@alloc/quick-lru@5.2.0': {} - - '@eslint-community/eslint-utils@4.4.0(eslint@8.57.1)': - dependencies: - eslint: 8.57.1 - eslint-visitor-keys: 3.4.3 - - '@eslint-community/regexpp@4.11.1': {} - - '@eslint/eslintrc@2.1.4': - dependencies: - ajv: 6.12.6 - debug: 4.3.7 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.2 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - - '@eslint/js@8.57.1': {} - - '@floating-ui/core@1.6.8': - dependencies: - '@floating-ui/utils': 0.2.8 - - '@floating-ui/dom@1.6.11': - dependencies: - '@floating-ui/core': 1.6.8 - '@floating-ui/utils': 0.2.8 - - '@floating-ui/react-dom@2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/dom': 1.6.11 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - '@floating-ui/utils@0.2.8': {} - - '@hookform/resolvers@3.9.0(react-hook-form@7.53.0(react@18.3.1))': - dependencies: - react-hook-form: 7.53.0(react@18.3.1) - - '@humanwhocodes/config-array@0.13.0': - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.7 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - - '@humanwhocodes/module-importer@1.0.1': {} - - '@humanwhocodes/object-schema@2.0.3': {} - - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - - '@jridgewell/gen-mapping@0.3.5': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - - '@jridgewell/resolve-uri@3.1.2': {} - - '@jridgewell/set-array@1.2.1': {} - - '@jridgewell/sourcemap-codec@1.5.0': {} - - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.0 - - '@next/env@14.2.11': {} - - '@next/eslint-plugin-next@14.2.11': - dependencies: - glob: 10.3.10 - - '@next/swc-darwin-arm64@14.2.11': - optional: true - - '@next/swc-darwin-x64@14.2.11': - optional: true - - '@next/swc-linux-arm64-gnu@14.2.11': - optional: true - - '@next/swc-linux-arm64-musl@14.2.11': - optional: true - - '@next/swc-linux-x64-gnu@14.2.11': - optional: true - - '@next/swc-linux-x64-musl@14.2.11': - optional: true - - '@next/swc-win32-arm64-msvc@14.2.11': - optional: true - - '@next/swc-win32-ia32-msvc@14.2.11': - optional: true - - '@next/swc-win32-x64-msvc@14.2.11': - optional: true - - '@nodelib/fs.scandir@2.1.5': - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - '@nodelib/fs.stat@2.0.5': {} - - '@nodelib/fs.walk@1.2.8': - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.17.1 - - '@nolyfill/is-core-module@1.0.39': {} - - '@pkgjs/parseargs@0.11.0': - optional: true - - '@radix-ui/primitive@1.1.0': {} - - '@radix-ui/react-arrow@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-compose-refs@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-context@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-dismissable-layer@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-escape-keydown': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-icons@1.3.0(react@18.3.1)': - dependencies: - react: 18.3.1 - - '@radix-ui/react-id@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-label@2.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-popper@1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@floating-ui/react-dom': 2.1.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-arrow': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-rect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-size': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/rect': 1.1.0 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-portal@1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-presence@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-primitive@2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-slot@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-tooltip@1.1.2(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/primitive': 1.1.0 - '@radix-ui/react-compose-refs': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-context': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-dismissable-layer': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-id': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-popper': 1.2.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-portal': 1.1.1(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-presence': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - '@radix-ui/react-slot': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.3.7)(react@18.3.1) - '@radix-ui/react-visually-hidden': 1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/react-use-callback-ref@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-use-controllable-state@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-use-escape-keydown@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-use-layout-effect@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-use-rect@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - '@radix-ui/rect': 1.1.0 - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-use-size@1.1.0(@types/react@18.3.7)(react@18.3.1)': - dependencies: - '@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.3.7)(react@18.3.1) - react: 18.3.1 - optionalDependencies: - '@types/react': 18.3.7 - - '@radix-ui/react-visually-hidden@1.1.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': - dependencies: - '@radix-ui/react-primitive': 2.0.0(@types/react-dom@18.3.0)(@types/react@18.3.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - optionalDependencies: - '@types/react': 18.3.7 - '@types/react-dom': 18.3.0 - - '@radix-ui/rect@1.1.0': {} - - '@rtsao/scc@1.1.0': {} - - '@rushstack/eslint-patch@1.10.4': {} - - '@swc/counter@0.1.3': {} - - '@swc/helpers@0.5.5': - dependencies: - '@swc/counter': 0.1.3 - tslib: 2.7.0 - - '@types/json-schema@7.0.15': {} - - '@types/json5@0.0.29': {} - - '@types/node@20.16.5': - dependencies: - undici-types: 6.19.8 - - '@types/prop-types@15.7.13': {} - - '@types/react-dom@18.3.0': - dependencies: - '@types/react': 18.3.7 - - '@types/react@18.3.7': - dependencies: - '@types/prop-types': 15.7.13 - csstype: 3.1.3 - - '@types/semver@7.5.8': {} - - '@typescript-eslint/eslint-plugin@7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2)': - dependencies: - '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/type-utils': 7.2.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.7 - eslint: 8.57.1 - graphemer: 1.4.0 - ignore: 5.3.2 - natural-compare: 1.4.0 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2)': - dependencies: - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.2) - '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.7 - eslint: 8.57.1 - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/scope-manager@7.2.0': - dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 - - '@typescript-eslint/type-utils@7.2.0(eslint@8.57.1)(typescript@5.6.2)': - dependencies: - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.2) - '@typescript-eslint/utils': 7.2.0(eslint@8.57.1)(typescript@5.6.2) - debug: 4.3.7 - eslint: 8.57.1 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/types@7.2.0': {} - - '@typescript-eslint/typescript-estree@7.2.0(typescript@5.6.2)': - dependencies: - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/visitor-keys': 7.2.0 - debug: 4.3.7 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.6.2) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/utils@7.2.0(eslint@8.57.1)(typescript@5.6.2)': - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 7.2.0 - '@typescript-eslint/types': 7.2.0 - '@typescript-eslint/typescript-estree': 7.2.0(typescript@5.6.2) - eslint: 8.57.1 - semver: 7.6.3 - transitivePeerDependencies: - - supports-color - - typescript - - '@typescript-eslint/visitor-keys@7.2.0': - dependencies: - '@typescript-eslint/types': 7.2.0 - eslint-visitor-keys: 3.4.3 - - '@ungap/structured-clone@1.2.0': {} - - acorn-jsx@5.3.2(acorn@8.12.1): - dependencies: - acorn: 8.12.1 - - acorn@8.12.1: {} - - ajv@6.12.6: - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - - ansi-regex@5.0.1: {} - - ansi-regex@6.1.0: {} - - ansi-styles@4.3.0: - dependencies: - color-convert: 2.0.1 - - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - - arg@5.0.2: {} - - argparse@2.0.1: {} - - aria-query@5.1.3: - dependencies: - deep-equal: 2.2.3 - - array-buffer-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - is-array-buffer: 3.0.4 - - array-includes@3.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - is-string: 1.0.7 - - array-union@2.1.0: {} - - array.prototype.findlast@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.findlastindex@1.2.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-shim-unscopables: 1.0.2 - - array.prototype.flat@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.flatmap@1.3.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-shim-unscopables: 1.0.2 - - array.prototype.tosorted@1.1.4: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-shim-unscopables: 1.0.2 - - arraybuffer.prototype.slice@1.0.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - is-array-buffer: 3.0.4 - is-shared-array-buffer: 1.0.3 - - ast-types-flow@0.0.8: {} - - available-typed-arrays@1.0.7: - dependencies: - possible-typed-array-names: 1.0.0 - - axe-core@4.10.0: {} - - axobject-query@4.1.0: {} - - balanced-match@1.0.2: {} - - binary-extensions@2.3.0: {} - - brace-expansion@1.1.11: - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - brace-expansion@2.0.1: - dependencies: - balanced-match: 1.0.2 - - braces@3.0.3: - dependencies: - fill-range: 7.1.1 - - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - - call-bind@1.0.7: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - set-function-length: 1.2.2 - - callsites@3.1.0: {} - - camelcase-css@2.0.1: {} - - caniuse-lite@1.0.30001660: {} - - chalk@4.1.2: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - class-variance-authority@0.7.0: - dependencies: - clsx: 2.0.0 - - client-only@0.0.1: {} - - clsx@2.0.0: {} - - clsx@2.1.1: {} - - color-convert@2.0.1: - dependencies: - color-name: 1.1.4 - - color-name@1.1.4: {} - - commander@4.1.1: {} - - concat-map@0.0.1: {} - - cross-spawn@7.0.3: - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - cssesc@3.0.0: {} - - csstype@3.1.3: {} - - damerau-levenshtein@1.0.8: {} - - data-view-buffer@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - data-view-byte-offset@1.0.0: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-data-view: 1.0.1 - - debug@3.2.7: - dependencies: - ms: 2.1.3 - - debug@4.3.7: - dependencies: - ms: 2.1.3 - - deep-equal@2.2.3: - dependencies: - array-buffer-byte-length: 1.0.1 - call-bind: 1.0.7 - es-get-iterator: 1.1.3 - get-intrinsic: 1.2.4 - is-arguments: 1.1.1 - is-array-buffer: 3.0.4 - is-date-object: 1.0.5 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - isarray: 2.0.5 - object-is: 1.1.6 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - side-channel: 1.0.6 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - - deep-is@0.1.4: {} - - define-data-property@1.1.4: - dependencies: - es-define-property: 1.0.0 - es-errors: 1.3.0 - gopd: 1.0.1 - - define-properties@1.2.1: - dependencies: - define-data-property: 1.1.4 - has-property-descriptors: 1.0.2 - object-keys: 1.1.1 - - didyoumean@1.2.2: {} - - dir-glob@3.0.1: - dependencies: - path-type: 4.0.0 - - dlv@1.1.3: {} - - doctrine@2.1.0: - dependencies: - esutils: 2.0.3 - - doctrine@3.0.0: - dependencies: - esutils: 2.0.3 - - eastasianwidth@0.2.0: {} - - emoji-regex@8.0.0: {} - - emoji-regex@9.2.2: {} - - enhanced-resolve@5.17.1: - dependencies: - graceful-fs: 4.2.11 - tapable: 2.2.1 - - es-abstract@1.23.3: - dependencies: - array-buffer-byte-length: 1.0.1 - arraybuffer.prototype.slice: 1.0.3 - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - data-view-buffer: 1.0.1 - data-view-byte-length: 1.0.1 - data-view-byte-offset: 1.0.0 - es-define-property: 1.0.0 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - es-set-tostringtag: 2.0.3 - es-to-primitive: 1.2.1 - function.prototype.name: 1.1.6 - get-intrinsic: 1.2.4 - get-symbol-description: 1.0.2 - globalthis: 1.0.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - internal-slot: 1.0.7 - is-array-buffer: 3.0.4 - is-callable: 1.2.7 - is-data-view: 1.0.1 - is-negative-zero: 2.0.3 - is-regex: 1.1.4 - is-shared-array-buffer: 1.0.3 - is-string: 1.0.7 - is-typed-array: 1.1.13 - is-weakref: 1.0.2 - object-inspect: 1.13.2 - object-keys: 1.1.1 - object.assign: 4.1.5 - regexp.prototype.flags: 1.5.2 - safe-array-concat: 1.1.2 - safe-regex-test: 1.0.3 - string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.8 - string.prototype.trimstart: 1.0.8 - typed-array-buffer: 1.0.2 - typed-array-byte-length: 1.0.1 - typed-array-byte-offset: 1.0.2 - typed-array-length: 1.0.6 - unbox-primitive: 1.0.2 - which-typed-array: 1.1.15 - - es-define-property@1.0.0: - dependencies: - get-intrinsic: 1.2.4 - - es-errors@1.3.0: {} - - es-get-iterator@1.1.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - is-arguments: 1.1.1 - is-map: 2.0.3 - is-set: 2.0.3 - is-string: 1.0.7 - isarray: 2.0.5 - stop-iteration-iterator: 1.0.0 - - es-iterator-helpers@1.0.19: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-set-tostringtag: 2.0.3 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - has-property-descriptors: 1.0.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - iterator.prototype: 1.1.2 - safe-array-concat: 1.1.2 - - es-object-atoms@1.0.0: - dependencies: - es-errors: 1.3.0 - - es-set-tostringtag@2.0.3: - dependencies: - get-intrinsic: 1.2.4 - has-tostringtag: 1.0.2 - hasown: 2.0.2 - - es-shim-unscopables@1.0.2: - dependencies: - hasown: 2.0.2 - - es-to-primitive@1.2.1: - dependencies: - is-callable: 1.2.7 - is-date-object: 1.0.5 - is-symbol: 1.0.4 - - escape-string-regexp@4.0.0: {} - - eslint-config-next@14.2.11(eslint@8.57.1)(typescript@5.6.2): - dependencies: - '@next/eslint-plugin-next': 14.2.11 - '@rushstack/eslint-patch': 1.10.4 - '@typescript-eslint/eslint-plugin': 7.2.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint@8.57.1)(typescript@5.6.2) - '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - eslint-plugin-jsx-a11y: 6.10.0(eslint@8.57.1) - eslint-plugin-react: 7.36.1(eslint@8.57.1) - eslint-plugin-react-hooks: 4.6.2(eslint@8.57.1) - optionalDependencies: - typescript: 5.6.2 - transitivePeerDependencies: - - eslint-import-resolver-webpack - - eslint-plugin-import-x - - supports-color - - eslint-import-resolver-node@0.3.9: - dependencies: - debug: 3.2.7 - is-core-module: 2.15.1 - resolve: 1.22.8 - transitivePeerDependencies: - - supports-color - - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1): - dependencies: - '@nolyfill/is-core-module': 1.0.39 - debug: 4.3.7 - enhanced-resolve: 5.17.1 - eslint: 8.57.1 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) - fast-glob: 3.3.2 - get-tsconfig: 4.8.1 - is-bun-module: 1.2.1 - is-glob: 4.0.3 - optionalDependencies: - eslint-plugin-import: 2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1) - transitivePeerDependencies: - - '@typescript-eslint/parser' - - eslint-import-resolver-node - - eslint-import-resolver-webpack - - supports-color - - eslint-module-utils@2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.30.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.8 - array.prototype.findlastindex: 1.2.5 - array.prototype.flat: 1.3.2 - array.prototype.flatmap: 1.3.2 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.11.0(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.2.0(eslint@8.57.1)(typescript@5.6.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.30.0)(eslint@8.57.1))(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.15.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.0 - semver: 6.3.1 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 7.2.0(eslint@8.57.1)(typescript@5.6.2) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - - eslint-plugin-jsx-a11y@6.10.0(eslint@8.57.1): - dependencies: - aria-query: 5.1.3 - array-includes: 3.1.8 - array.prototype.flatmap: 1.3.2 - ast-types-flow: 0.0.8 - axe-core: 4.10.0 - axobject-query: 4.1.0 - damerau-levenshtein: 1.0.8 - emoji-regex: 9.2.2 - es-iterator-helpers: 1.0.19 - eslint: 8.57.1 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - language-tags: 1.0.9 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - safe-regex-test: 1.0.3 - string.prototype.includes: 2.0.0 - - eslint-plugin-react-hooks@4.6.2(eslint@8.57.1): - dependencies: - eslint: 8.57.1 - - eslint-plugin-react@7.36.1(eslint@8.57.1): - dependencies: - array-includes: 3.1.8 - array.prototype.findlast: 1.2.5 - array.prototype.flatmap: 1.3.2 - array.prototype.tosorted: 1.1.4 - doctrine: 2.1.0 - es-iterator-helpers: 1.0.19 - eslint: 8.57.1 - estraverse: 5.3.0 - hasown: 2.0.2 - jsx-ast-utils: 3.3.5 - minimatch: 3.1.2 - object.entries: 1.1.8 - object.fromentries: 2.0.8 - object.values: 1.2.0 - prop-types: 15.8.1 - resolve: 2.0.0-next.5 - semver: 6.3.1 - string.prototype.matchall: 4.0.11 - string.prototype.repeat: 1.0.0 - - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-visitor-keys@3.4.3: {} - - eslint@8.57.1: - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.1) - '@eslint-community/regexpp': 4.11.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.1 - '@humanwhocodes/config-array': 0.13.0 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.7 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.6.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.2 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - - espree@9.6.1: - dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 3.4.3 - - esquery@1.6.0: - dependencies: - estraverse: 5.3.0 - - esrecurse@4.3.0: - dependencies: - estraverse: 5.3.0 - - estraverse@5.3.0: {} - - esutils@2.0.3: {} - - fast-deep-equal@3.1.3: {} - - fast-glob@3.3.2: - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.8 - - fast-json-stable-stringify@2.1.0: {} - - fast-levenshtein@2.0.6: {} - - fastq@1.17.1: - dependencies: - reusify: 1.0.4 - - file-entry-cache@6.0.1: - dependencies: - flat-cache: 3.2.0 - - fill-range@7.1.1: - dependencies: - to-regex-range: 5.0.1 - - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - - flat-cache@3.2.0: - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - - flatted@3.3.1: {} - - for-each@0.3.3: - dependencies: - is-callable: 1.2.7 - - foreground-child@3.3.0: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - fs.realpath@1.0.0: {} - - fsevents@2.3.3: - optional: true - - function-bind@1.1.2: {} - - function.prototype.name@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - functions-have-names: 1.2.3 - - functions-have-names@1.2.3: {} - - get-intrinsic@1.2.4: - dependencies: - es-errors: 1.3.0 - function-bind: 1.1.2 - has-proto: 1.0.3 - has-symbols: 1.0.3 - hasown: 2.0.2 - - get-symbol-description@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - - get-tsconfig@4.8.1: - dependencies: - resolve-pkg-maps: 1.0.0 - - glob-parent@5.1.2: - dependencies: - is-glob: 4.0.3 - - glob-parent@6.0.2: - dependencies: - is-glob: 4.0.3 - - glob@10.3.10: - dependencies: - foreground-child: 3.3.0 - jackspeak: 2.3.6 - minimatch: 9.0.5 - minipass: 7.1.2 - path-scurry: 1.11.1 - - glob@10.4.5: - dependencies: - foreground-child: 3.3.0 - jackspeak: 3.4.3 - minimatch: 9.0.5 - minipass: 7.1.2 - package-json-from-dist: 1.0.0 - path-scurry: 1.11.1 - - glob@7.2.3: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - globals@13.24.0: - dependencies: - type-fest: 0.20.2 - - globalthis@1.0.4: - dependencies: - define-properties: 1.2.1 - gopd: 1.0.1 - - globby@11.1.0: - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.2 - ignore: 5.3.2 - merge2: 1.4.1 - slash: 3.0.0 - - gopd@1.0.1: - dependencies: - get-intrinsic: 1.2.4 - - graceful-fs@4.2.11: {} - - graphemer@1.4.0: {} - - has-bigints@1.0.2: {} - - has-flag@4.0.0: {} - - has-property-descriptors@1.0.2: - dependencies: - es-define-property: 1.0.0 - - has-proto@1.0.3: {} - - has-symbols@1.0.3: {} - - has-tostringtag@1.0.2: - dependencies: - has-symbols: 1.0.3 - - hasown@2.0.2: - dependencies: - function-bind: 1.1.2 - - ignore@5.3.2: {} - - import-fresh@3.3.0: - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - imurmurhash@0.1.4: {} - - inflight@1.0.6: - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - inherits@2.0.4: {} - - input-otp@1.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - internal-slot@1.0.7: - dependencies: - es-errors: 1.3.0 - hasown: 2.0.2 - side-channel: 1.0.6 - - is-arguments@1.1.1: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-array-buffer@3.0.4: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - is-async-function@2.0.0: - dependencies: - has-tostringtag: 1.0.2 - - is-bigint@1.0.4: - dependencies: - has-bigints: 1.0.2 - - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - - is-boolean-object@1.1.2: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-bun-module@1.2.1: - dependencies: - semver: 7.6.3 - - is-callable@1.2.7: {} - - is-core-module@2.15.1: - dependencies: - hasown: 2.0.2 - - is-data-view@1.0.1: - dependencies: - is-typed-array: 1.1.13 - - is-date-object@1.0.5: - dependencies: - has-tostringtag: 1.0.2 - - is-extglob@2.1.1: {} - - is-finalizationregistry@1.0.2: - dependencies: - call-bind: 1.0.7 - - is-fullwidth-code-point@3.0.0: {} - - is-generator-function@1.0.10: - dependencies: - has-tostringtag: 1.0.2 - - is-glob@4.0.3: - dependencies: - is-extglob: 2.1.1 - - is-map@2.0.3: {} - - is-negative-zero@2.0.3: {} - - is-number-object@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-number@7.0.0: {} - - is-path-inside@3.0.3: {} - - is-regex@1.1.4: - dependencies: - call-bind: 1.0.7 - has-tostringtag: 1.0.2 - - is-set@2.0.3: {} - - is-shared-array-buffer@1.0.3: - dependencies: - call-bind: 1.0.7 - - is-string@1.0.7: - dependencies: - has-tostringtag: 1.0.2 - - is-symbol@1.0.4: - dependencies: - has-symbols: 1.0.3 - - is-typed-array@1.1.13: - dependencies: - which-typed-array: 1.1.15 - - is-weakmap@2.0.2: {} - - is-weakref@1.0.2: - dependencies: - call-bind: 1.0.7 - - is-weakset@2.0.3: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - - isarray@2.0.5: {} - - isexe@2.0.0: {} - - iterator.prototype@1.1.2: - dependencies: - define-properties: 1.2.1 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - reflect.getprototypeof: 1.0.6 - set-function-name: 2.0.2 - - jackspeak@2.3.6: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jackspeak@3.4.3: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - jiti@1.21.6: {} - - js-tokens@4.0.0: {} - - js-yaml@4.1.0: - dependencies: - argparse: 2.0.1 - - json-buffer@3.0.1: {} - - json-schema-traverse@0.4.1: {} - - json-stable-stringify-without-jsonify@1.0.1: {} - - json5@1.0.2: - dependencies: - minimist: 1.2.8 - - jsx-ast-utils@3.3.5: - dependencies: - array-includes: 3.1.8 - array.prototype.flat: 1.3.2 - object.assign: 4.1.5 - object.values: 1.2.0 - - keyv@4.5.4: - dependencies: - json-buffer: 3.0.1 - - language-subtag-registry@0.3.23: {} - - language-tags@1.0.9: - dependencies: - language-subtag-registry: 0.3.23 - - levn@0.4.1: - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - - lilconfig@2.1.0: {} - - lilconfig@3.1.2: {} - - lines-and-columns@1.2.4: {} - - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - - lodash.merge@4.6.2: {} - - loose-envify@1.4.0: - dependencies: - js-tokens: 4.0.0 - - lru-cache@10.4.3: {} - - lucide-react@0.441.0(react@18.3.1): - dependencies: - react: 18.3.1 - - merge2@1.4.1: {} - - micromatch@4.0.8: - dependencies: - braces: 3.0.3 - picomatch: 2.3.1 - - minimatch@3.1.2: - dependencies: - brace-expansion: 1.1.11 - - minimatch@9.0.3: - dependencies: - brace-expansion: 2.0.1 - - minimatch@9.0.5: - dependencies: - brace-expansion: 2.0.1 - - minimist@1.2.8: {} - - minipass@7.1.2: {} - - ms@2.1.3: {} - - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - - nanoid@3.3.7: {} - - natural-compare@1.4.0: {} - - next-themes@0.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - - next@14.2.11(react-dom@18.3.1(react@18.3.1))(react@18.3.1): - dependencies: - '@next/env': 14.2.11 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001660 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.11 - '@next/swc-darwin-x64': 14.2.11 - '@next/swc-linux-arm64-gnu': 14.2.11 - '@next/swc-linux-arm64-musl': 14.2.11 - '@next/swc-linux-x64-gnu': 14.2.11 - '@next/swc-linux-x64-musl': 14.2.11 - '@next/swc-win32-arm64-msvc': 14.2.11 - '@next/swc-win32-ia32-msvc': 14.2.11 - '@next/swc-win32-x64-msvc': 14.2.11 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - - normalize-path@3.0.0: {} - - object-assign@4.1.1: {} - - object-hash@3.0.0: {} - - object-inspect@1.13.2: {} - - object-is@1.1.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - - object-keys@1.1.1: {} - - object.assign@4.1.5: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - has-symbols: 1.0.3 - object-keys: 1.1.1 - - object.entries@1.1.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - object.fromentries@2.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - object.groupby@1.0.3: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - - object.values@1.2.0: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - once@1.4.0: - dependencies: - wrappy: 1.0.2 - - optionator@0.9.4: - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - - p-limit@3.1.0: - dependencies: - yocto-queue: 0.1.0 - - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - - package-json-from-dist@1.0.0: {} - - parent-module@1.0.1: - dependencies: - callsites: 3.1.0 - - path-exists@4.0.0: {} - - path-is-absolute@1.0.1: {} - - path-key@3.1.1: {} - - path-parse@1.0.7: {} - - path-scurry@1.11.1: - dependencies: - lru-cache: 10.4.3 - minipass: 7.1.2 - - path-type@4.0.0: {} - - picocolors@1.1.0: {} - - picomatch@2.3.1: {} - - pify@2.3.0: {} - - pirates@4.0.6: {} - - possible-typed-array-names@1.0.0: {} - - postcss-import@15.1.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - postcss-value-parser: 4.2.0 - read-cache: 1.0.0 - resolve: 1.22.8 - - postcss-js@4.0.1(postcss@8.4.47): - dependencies: - camelcase-css: 2.0.1 - postcss: 8.4.47 - - postcss-load-config@4.0.2(postcss@8.4.47): - dependencies: - lilconfig: 3.1.2 - yaml: 2.5.1 - optionalDependencies: - postcss: 8.4.47 - - postcss-nested@6.2.0(postcss@8.4.47): - dependencies: - postcss: 8.4.47 - postcss-selector-parser: 6.1.2 - - postcss-selector-parser@6.1.2: - dependencies: - cssesc: 3.0.0 - util-deprecate: 1.0.2 - - postcss-value-parser@4.2.0: {} - - postcss@8.4.31: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.0 - source-map-js: 1.2.1 - - postcss@8.4.47: - dependencies: - nanoid: 3.3.7 - picocolors: 1.1.0 - source-map-js: 1.2.1 - - prelude-ls@1.2.1: {} - - prop-types@15.8.1: - dependencies: - loose-envify: 1.4.0 - object-assign: 4.1.1 - react-is: 16.13.1 - - punycode@2.3.1: {} - - queue-microtask@1.2.3: {} - - react-dom@18.3.1(react@18.3.1): - dependencies: - loose-envify: 1.4.0 - react: 18.3.1 - scheduler: 0.23.2 - - react-hook-form@7.53.0(react@18.3.1): - dependencies: - react: 18.3.1 - - react-is@16.13.1: {} - - react@18.3.1: - dependencies: - loose-envify: 1.4.0 - - read-cache@1.0.0: - dependencies: - pify: 2.3.0 - - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - - reflect.getprototypeof@1.0.6: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - globalthis: 1.0.4 - which-builtin-type: 1.1.4 - - regexp.prototype.flags@1.5.2: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-errors: 1.3.0 - set-function-name: 2.0.2 - - resolve-from@4.0.0: {} - - resolve-pkg-maps@1.0.0: {} - - resolve@1.22.8: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - resolve@2.0.0-next.5: - dependencies: - is-core-module: 2.15.1 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - reusify@1.0.4: {} - - rimraf@3.0.2: - dependencies: - glob: 7.2.3 - - run-parallel@1.2.0: - dependencies: - queue-microtask: 1.2.3 - - safe-array-concat@1.1.2: - dependencies: - call-bind: 1.0.7 - get-intrinsic: 1.2.4 - has-symbols: 1.0.3 - isarray: 2.0.5 - - safe-regex-test@1.0.3: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-regex: 1.1.4 - - scheduler@0.23.2: - dependencies: - loose-envify: 1.4.0 - - semver@6.3.1: {} - - semver@7.6.3: {} - - set-function-length@1.2.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - function-bind: 1.1.2 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-property-descriptors: 1.0.2 - - set-function-name@2.0.2: - dependencies: - define-data-property: 1.1.4 - es-errors: 1.3.0 - functions-have-names: 1.2.3 - has-property-descriptors: 1.0.2 - - shebang-command@2.0.0: - dependencies: - shebang-regex: 3.0.0 - - shebang-regex@3.0.0: {} - - side-channel@1.0.6: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - get-intrinsic: 1.2.4 - object-inspect: 1.13.2 - - signal-exit@4.1.0: {} - - slash@3.0.0: {} - - source-map-js@1.2.1: {} - - stop-iteration-iterator@1.0.0: - dependencies: - internal-slot: 1.0.7 - - streamsearch@1.1.0: {} - - string-width@4.2.3: - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - string.prototype.includes@2.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - - string.prototype.matchall@4.0.11: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-errors: 1.3.0 - es-object-atoms: 1.0.0 - get-intrinsic: 1.2.4 - gopd: 1.0.1 - has-symbols: 1.0.3 - internal-slot: 1.0.7 - regexp.prototype.flags: 1.5.2 - set-function-name: 2.0.2 - side-channel: 1.0.6 - - string.prototype.repeat@1.0.0: - dependencies: - define-properties: 1.2.1 - es-abstract: 1.23.3 - - string.prototype.trim@1.2.9: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-abstract: 1.23.3 - es-object-atoms: 1.0.0 - - string.prototype.trimend@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - string.prototype.trimstart@1.0.8: - dependencies: - call-bind: 1.0.7 - define-properties: 1.2.1 - es-object-atoms: 1.0.0 - - strip-ansi@6.0.1: - dependencies: - ansi-regex: 5.0.1 - - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.1.0 - - strip-bom@3.0.0: {} - - strip-json-comments@3.1.1: {} - - styled-jsx@5.1.1(react@18.3.1): - dependencies: - client-only: 0.0.1 - react: 18.3.1 - - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - commander: 4.1.1 - glob: 10.4.5 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - - supports-color@7.2.0: - dependencies: - has-flag: 4.0.0 - - supports-preserve-symlinks-flag@1.0.0: {} - - tailwind-merge@2.5.2: {} - - tailwindcss-animate@1.0.7(tailwindcss@3.4.11): - dependencies: - tailwindcss: 3.4.11 - - tailwindcss@3.4.11: - dependencies: - '@alloc/quick-lru': 5.2.0 - arg: 5.0.2 - chokidar: 3.6.0 - didyoumean: 1.2.2 - dlv: 1.1.3 - fast-glob: 3.3.2 - glob-parent: 6.0.2 - is-glob: 4.0.3 - jiti: 1.21.6 - lilconfig: 2.1.0 - micromatch: 4.0.8 - normalize-path: 3.0.0 - object-hash: 3.0.0 - picocolors: 1.1.0 - postcss: 8.4.47 - postcss-import: 15.1.0(postcss@8.4.47) - postcss-js: 4.0.1(postcss@8.4.47) - postcss-load-config: 4.0.2(postcss@8.4.47) - postcss-nested: 6.2.0(postcss@8.4.47) - postcss-selector-parser: 6.1.2 - resolve: 1.22.8 - sucrase: 3.35.0 - transitivePeerDependencies: - - ts-node - - tapable@2.2.1: {} - - text-table@0.2.0: {} - - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - - to-regex-range@5.0.1: - dependencies: - is-number: 7.0.0 - - ts-api-utils@1.3.0(typescript@5.6.2): - dependencies: - typescript: 5.6.2 - - ts-interface-checker@0.1.13: {} - - tsconfig-paths@3.15.0: - dependencies: - '@types/json5': 0.0.29 - json5: 1.0.2 - minimist: 1.2.8 - strip-bom: 3.0.0 - - tslib@2.7.0: {} - - type-check@0.4.0: - dependencies: - prelude-ls: 1.2.1 - - type-fest@0.20.2: {} - - typed-array-buffer@1.0.2: - dependencies: - call-bind: 1.0.7 - es-errors: 1.3.0 - is-typed-array: 1.1.13 - - typed-array-byte-length@1.0.1: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-byte-offset@1.0.2: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - - typed-array-length@1.0.6: - dependencies: - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-proto: 1.0.3 - is-typed-array: 1.1.13 - possible-typed-array-names: 1.0.0 - - typescript@5.6.2: {} - - unbox-primitive@1.0.2: - dependencies: - call-bind: 1.0.7 - has-bigints: 1.0.2 - has-symbols: 1.0.3 - which-boxed-primitive: 1.0.2 - - undici-types@6.19.8: {} - - uri-js@4.4.1: - dependencies: - punycode: 2.3.1 - - util-deprecate@1.0.2: {} - - which-boxed-primitive@1.0.2: - dependencies: - is-bigint: 1.0.4 - is-boolean-object: 1.1.2 - is-number-object: 1.0.7 - is-string: 1.0.7 - is-symbol: 1.0.4 - - which-builtin-type@1.1.4: - dependencies: - function.prototype.name: 1.1.6 - has-tostringtag: 1.0.2 - is-async-function: 2.0.0 - is-date-object: 1.0.5 - is-finalizationregistry: 1.0.2 - is-generator-function: 1.0.10 - is-regex: 1.1.4 - is-weakref: 1.0.2 - isarray: 2.0.5 - which-boxed-primitive: 1.0.2 - which-collection: 1.0.2 - which-typed-array: 1.1.15 - - which-collection@1.0.2: - dependencies: - is-map: 2.0.3 - is-set: 2.0.3 - is-weakmap: 2.0.2 - is-weakset: 2.0.3 - - which-typed-array@1.1.15: - dependencies: - available-typed-arrays: 1.0.7 - call-bind: 1.0.7 - for-each: 0.3.3 - gopd: 1.0.1 - has-tostringtag: 1.0.2 - - which@2.0.2: - dependencies: - isexe: 2.0.0 - - word-wrap@1.2.5: {} - - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - wrappy@1.0.2: {} - - yaml@2.5.1: {} - - yocto-queue@0.1.0: {} - - zod@3.23.8: {} diff --git a/src-api/Cargo.toml b/src-api/Cargo.toml index 298c1c4..5df1e95 100644 --- a/src-api/Cargo.toml +++ b/src-api/Cargo.toml @@ -20,4 +20,4 @@ sqlx = { version = "0.8.2", features = [ "chrono", "postgres", ] } -thiserror = { git = "https://github.com/onlycs/thiserror", version = "1.0.63" } +thiserror = { git = "https://github.com/onlycs/thiserror" } diff --git a/src-api/migrations/20241015000058_noid.sql b/src-api/migrations/20241015000058_noid.sql new file mode 100644 index 0000000..dc94fcc --- /dev/null +++ b/src-api/migrations/20241015000058_noid.sql @@ -0,0 +1,4 @@ +ALTER TABLE + records DROP CONSTRAINT record_student_id_fkey; + +DROP TABLE students; \ No newline at end of file diff --git a/src-api/migrations/20241016030955_string_ids.sql b/src-api/migrations/20241016030955_string_ids.sql new file mode 100644 index 0000000..1dee2f6 --- /dev/null +++ b/src-api/migrations/20241016030955_string_ids.sql @@ -0,0 +1,4 @@ +ALTER TABLE + records +ALTER COLUMN + student_id TYPE text; \ No newline at end of file diff --git a/src-api/src/main.rs b/src-api/src/main.rs index eefa304..4fa1931 100644 --- a/src-api/src/main.rs +++ b/src-api/src/main.rs @@ -21,7 +21,6 @@ use crate::prelude::*; use actix_cors::Cors; use actix_web::get; -use actix_web_httpauth::extractors::basic::BasicAuth; use dotenvy::dotenv; use log::LevelFilter; use simple_logger::SimpleLogger; @@ -73,61 +72,18 @@ async fn login( Ok(HttpResponse::Ok().json(AuthResponse { token })) } -#[post("/exists")] -async fn exists( +#[post("/roster")] +async fn roster( req: HttpRequest, - body: web::Json, + body: web::Json, state: web::Data, ) -> Result { authorize(get_auth_header(&req)?, &state.pg).await?; - let id = body.into_inner().id; - let exists = routes::exists(id, &state.pg).await?; + let RosterRequest { id } = body.into_inner(); + let res = routes::roster(id, &state.pg).await?; - Ok(HttpResponse::Ok().json(ExistsResponse { exists })) -} - -#[post("/register")] -async fn register( - req: HttpRequest, - body: web::Json, - state: web::Data, -) -> Result { - authorize(get_auth_header(&req)?, &state.pg).await?; - - let RegisterRequest { id, name } = body.into_inner(); - routes::register(id, name, &state.pg).await?; - - Ok(HttpResponse::Ok().finish()) -} - -#[post("/log")] -async fn student_login( - req: HttpRequest, - body: web::Json, - state: web::Data, -) -> Result { - authorize(get_auth_header(&req)?, &state.pg).await?; - - let AttendRequest { id } = body.into_inner(); - routes::log(id, &state.pg).await?; - - Ok(HttpResponse::Ok().finish()) -} - -#[get("/csv")] -async fn csv(creds: BasicAuth, state: web::Data) -> Result { - let Some(password) = creds.password() else { - return Err(RouteError::NoAuth); - }; - - if sha256::digest(password.as_bytes()) != env::var("ADMIN_HASH")? { - return Err(RouteError::InvalidToken); - } - - let csv = routes::csv(&state.pg).await?; - - Ok(HttpResponse::Ok().body(csv)) + Ok(HttpResponse::Ok().json(RosterResponse { login: res })) } #[get("/hours")] @@ -135,8 +91,8 @@ async fn hours( query: web::Query, state: web::Data, ) -> Result { - let HoursRequest { name, id } = query.into_inner(); - let hours = routes::hours(name, id, &state.pg).await?; + let HoursRequest { id } = query.into_inner(); + let hours = routes::hours(id, &state.pg).await?; Ok(HttpResponse::Ok().json(HoursResponse { hours })) } @@ -162,11 +118,8 @@ async fn main() -> Result<(), InitError> { .wrap(cors) .app_data(Data::new(AppState { pg: pool.clone() })) .service(login) - .service(exists) - .service(register) - .service(student_login) - .service(csv) .service(hours) + .service(roster) }) .bind(("0.0.0.0", 8080))? .run() diff --git a/src-api/src/model.rs b/src-api/src/model.rs index 4d878cd..48eba61 100644 --- a/src-api/src/model.rs +++ b/src-api/src/model.rs @@ -1,51 +1,34 @@ use serde::{Deserialize, Serialize}; use sqlx::PgPool; -#[derive(Deserialize)] -pub struct AttendRequest { - pub id: i32, -} - #[derive(Deserialize)] pub struct AuthRequest { pub password: String, } -#[derive(Serialize)] -pub struct AuthResponse { - pub token: String, -} - #[derive(Deserialize)] -pub struct ExistsRequest { - pub id: i32, -} - -#[derive(Serialize)] -pub struct ExistsResponse { - pub exists: bool, +pub struct HoursRequest { + pub id: String, } #[derive(Deserialize)] -pub struct RegisterRequest { - pub id: i32, - pub name: String, +pub struct RosterRequest { + pub id: String, } #[derive(Serialize)] -pub struct RegisterResponse { - pub success: bool, +pub struct HoursResponse { + pub hours: f64, } -#[derive(Deserialize)] -pub struct HoursRequest { - pub id: i32, - pub name: String, +#[derive(Serialize)] +pub struct AuthResponse { + pub token: String, } #[derive(Serialize)] -pub struct HoursResponse { - pub hours: f64, +pub struct RosterResponse { + pub login: bool, } pub struct AppState { diff --git a/src-api/src/routes/csv.rs b/src-api/src/routes/csv.rs index 56397aa..a273595 100644 --- a/src-api/src/routes/csv.rs +++ b/src-api/src/routes/csv.rs @@ -1,58 +1,5 @@ -use std::collections::HashMap; - use crate::prelude::*; pub async fn csv(pg: &PgPool) -> Result { - let records = sqlx::query!( - r#" - SELECT * FROM records - WHERE in_progress = false - "#, - ) - .fetch_all(pg) - .await?; - - let names = sqlx::query!( - r#" - SELECT * FROM students - "#, - ) - .fetch_all(pg) - .await? - .into_iter() - .map(|s| (s.id, s.name)) - .collect::>(); - - let mut minutes = HashMap::new(); - - for record in records { - let timein = record.sign_in; - let timeout = record.sign_out.unwrap(); - let duration = timeout.signed_duration_since(timein); - let new_minutes = duration.num_minutes(); - - minutes - .entry(record.student_id) - .and_modify(|e| *e += new_minutes) - .or_insert(new_minutes); - } - - let mut csv = String::new(); - - // Write the header - csv.push_str("last, first, id, hours\n"); - - for (id, minutes) in minutes { - let name = names.get(&id).unwrap(); - let (first, last) = name.split_once(' ').unwrap(); - csv.push_str(&format!( - "{}, {}, {}, {}\n", - last, - first, - id, - minutes as f64 / 60.0 - )); - } - - Ok(csv) + todo!() } diff --git a/src-api/src/routes/exists.rs b/src-api/src/routes/exists.rs deleted file mode 100644 index 4ada27a..0000000 --- a/src-api/src/routes/exists.rs +++ /dev/null @@ -1,15 +0,0 @@ -use crate::prelude::*; - -pub async fn exists(uid: i32, pg: &PgPool) -> Result { - let record = sqlx::query!( - r#" - SELECT * FROM students - WHERE id = $1 - "#, - uid - ) - .fetch_optional(pg) - .await?; - - Ok(record.is_some()) -} diff --git a/src-api/src/routes/hours.rs b/src-api/src/routes/hours.rs index 09a3d6f..1902c91 100644 --- a/src-api/src/routes/hours.rs +++ b/src-api/src/routes/hours.rs @@ -1,21 +1,6 @@ use crate::prelude::*; -pub async fn hours(name: String, id: i32, pg: &PgPool) -> Result { - let student = sqlx::query!( - r#" - SELECT * FROM students - WHERE id = $1 and name = $2 - "#, - id, - name - ) - .fetch_optional(pg) - .await?; - - if student.is_none() { - return Err(RouteError::UserExists); - } - +pub async fn hours(id: String, pg: &PgPool) -> Result { let records = sqlx::query!( r#" SELECT * FROM records diff --git a/src-api/src/routes/mod.rs b/src-api/src/routes/mod.rs index 391c2b1..6134d2d 100644 --- a/src-api/src/routes/mod.rs +++ b/src-api/src/routes/mod.rs @@ -1,13 +1,9 @@ mod csv; -mod exists; mod hours; -mod log; mod login; -mod register; +mod roster; pub use csv::csv; -pub use exists::exists; pub use hours::hours; -pub use log::log; pub use login::login; -pub use register::register; +pub use roster::roster; diff --git a/src-api/src/routes/register.rs b/src-api/src/routes/register.rs deleted file mode 100644 index a94273b..0000000 --- a/src-api/src/routes/register.rs +++ /dev/null @@ -1,23 +0,0 @@ -use super::{exists, log}; -use crate::prelude::*; - -pub async fn register(uid: i32, name: String, pg: &PgPool) -> Result<(), RouteError> { - if exists(uid, pg).await? { - return Err(RouteError::UserExists); - } - - sqlx::query!( - r#" - INSERT INTO students (id, name) - VALUES ($1, $2) - "#, - uid, - name - ) - .execute(pg) - .await?; - - log(uid, pg).await?; - - Ok(()) -} diff --git a/src-api/src/routes/log.rs b/src-api/src/routes/roster.rs similarity index 86% rename from src-api/src/routes/log.rs rename to src-api/src/routes/roster.rs index 66e083a..5b12590 100644 --- a/src-api/src/routes/log.rs +++ b/src-api/src/routes/roster.rs @@ -2,13 +2,13 @@ use chrono::{Duration, Utc}; use crate::prelude::*; -pub async fn log(uid: i32, pg: &PgPool) -> Result<(), RouteError> { +pub async fn roster(id: String, pg: &PgPool) -> Result { let record = sqlx::query!( r#" SELECT * FROM records WHERE student_id = $1 and in_progress = true "#, - uid + id ) .fetch_optional(pg) .await?; @@ -31,6 +31,8 @@ pub async fn log(uid: i32, pg: &PgPool) -> Result<(), RouteError> { ) .execute(pg) .await?; + + Ok(false) } else { sqlx::query!( r#" @@ -38,11 +40,11 @@ pub async fn log(uid: i32, pg: &PgPool) -> Result<(), RouteError> { VALUES ($1, $2, NOW()) "#, cuid2(), - uid + id ) .execute(pg) .await?; - } - Ok(()) + Ok(true) + } } diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx new file mode 100644 index 0000000..fd64d16 --- /dev/null +++ b/src/app/admin/page.tsx @@ -0,0 +1,34 @@ +'use client'; + +import { useTransitionOut } from "@lib/transitions"; +import { Button } from "@ui/button"; + +import { useCookies } from "next-client-cookies"; +import { useRouter } from "next/navigation"; +import { useEffect } from "react"; + +export default function Admin() { + const router = useRouter(); + const cookies = useCookies(); + const { push } = useTransitionOut(router); + + useEffect(() => { + router.prefetch('/attendance'); + router.prefetch('/download'); + }, []); + + useEffect(() => { + if (!cookies.get('token')) router.push('/login'); + }); + + return ( +

+ + +
+ ); +} \ No newline at end of file diff --git a/src/app/attendance/page.tsx b/src/app/attendance/page.tsx new file mode 100644 index 0000000..883d0af --- /dev/null +++ b/src/app/attendance/page.tsx @@ -0,0 +1,74 @@ +'use client'; + +import { InputId } from "@components/forms"; +import { FetchError, InternalServerError, tfetch } from "@lib/api"; +import { useTransitionOut } from "@lib/transitions"; +import { Button } from "@ui/button"; +import { useCookies } from "next-client-cookies"; +import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; + +export default function Attendance() { + const cookies = useCookies(); + const router = useRouter(); + + const { push } = useTransitionOut(router); + const [error, setError] = useState(''); + const [success, setSuccess] = useState(''); + const [id, setId] = useState(''); + + useEffect(() => { + if (!cookies.get('token')) router.push('/login'); + }); + + const resetSuccess = (msg: string) => { + setError(''); + setSuccess(msg); + } + + const resetError = (msg: string) => { + setError(msg); + setSuccess(''); + } + + const submit = () => { + tfetch(`/roster`, { + token: cookies.get('token')!, + id: id, + }) + .then(res => { + if (res.ok) { + if (res.result!.login) resetSuccess('Logged in'); + else resetSuccess('Logged out'); + } else { + if (res.error!.ecode == 401) { + cookies.remove('token'); + push('/login'); + } else if (res.error!.ecode == 500) resetError(InternalServerError); + else resetError('Failed to log user'); + } + }) + .catch(() => resetError(FetchError)); + }; + + return ( +
+
+ Please enter your ID +
+
{ + ev.preventDefault(); + submit(); + }}> + + + +
+ {error} +
+
+ {success} +
+
+ ); +} \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 670f598..989818e 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -1,21 +1,23 @@ import { ThemeProvider } from 'next-themes'; +import { CookiesProvider } from 'next-client-cookies/server'; -export const metadata = { - title: 'Attendance App', - description: 'Team 2791\'s Attendance App', -}; +import '@styles/globals.scss'; export default function RootLayout({ children, }: { - children: React.ReactNode + children: React.ReactNode, }) { + + return ( - - - {children} - + + + + {children} + + ); diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx new file mode 100644 index 0000000..b1bfa8c --- /dev/null +++ b/src/app/login/page.tsx @@ -0,0 +1,58 @@ +'use client'; + +import { Button } from "@ui/button"; +import { Input } from "@ui/input"; +import { API_URL } from "@lib/utils"; +import { useTransitionOut } from "@lib/transitions"; + +import { useEffect, useState } from "react"; +import { useCookies } from "next-client-cookies"; +import { useRouter } from "next/navigation"; +import { FetchError, tfetch } from "@lib/api"; + +export default function Teacher() { + const cookies = useCookies(); + const router = useRouter(); + const { push } = useTransitionOut(router); + const [error, setError] = useState(''); + + useEffect(() => { + if (cookies.get('token')) router.push('/admin'); + }, []); + + const onSubmit = (ev: React.FormEvent) => { + ev.preventDefault(); + const password = ev.currentTarget.password.value; + + tfetch('/login', { password }) + .then(res => { + if (res.ok) { + cookies.set('token', res.result!.token); + push('/admin'); + } else { + setError( + { + [500]: 'Problem with the server. Get Angad to fix this', + [401]: 'Incorrect Password', + }[res.error!.ecode] || 'Invalid input' + ); + } + }) + .catch(() => setError(FetchError)); + }; + + return ( +
+
+ Please enter the admin password +
+
+ + +
+
+ {error} +
+
+ ); +} \ No newline at end of file diff --git a/src/app/page.tsx b/src/app/page.tsx index 859314c..7545106 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -1,169 +1,28 @@ 'use client'; -import './globals.css'; -import React, { useState } from 'react'; -import Link from 'next/link'; -import { InputId, InputName, InputPassword } from '@/components/forms'; import { Button } from '@/components/ui/button'; -import { Tooltip, TooltipProvider, TooltipContent, TooltipTrigger } from '@/components/ui/tooltip'; -import { API_URL } from '@/lib/utils'; +import { useRouter } from 'next/navigation'; +import { useTransitionOut } from '@lib/transitions'; -export default function Home() { - // Data - const [id, setId] = useState(undefined as number | undefined); - const [token, setToken] = useState(''); - - // Page State - const [form, setForm] = useState<'password' | 'id' | 'name'>('password'); - const [error, setError] = useState(''); - - // Updates - const resetForm = (form: 'password' | 'id' | 'name') => { - setError(''); - setForm(form); - }; - - const parseFetch = async (f: void | Response): Promise => { - if (!f) return; - - const text = await f.text(); - - if (!f.ok) { - setError(text); - return; - } - - return JSON.parse(text || '{}'); - }; - - const onPassword = async (password: string) => { - const res = await fetch(`${API_URL}/login`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json' - }, - body: JSON.stringify({ password }) - }).catch(() => setError('Failed to connect to server')); - - const data = await parseFetch(res); - if (!data) return; - - setToken(data.token); - resetForm('id'); - }; - - const onId = async (id: number) => { - setId(id); - - const exists_res = await fetch(`${API_URL}/exists`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ id }), - }).catch(() => setError('Failed to connect to server')); +import React, { useEffect } from 'react'; - const exists_data = await parseFetch(exists_res); - - if (!exists_data) return; - if (!exists_data.exists) { - resetForm('name'); - return; - } - - const res = await fetch(`${API_URL}/log`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ id }) - }).catch(() => setError('Failed to connect to server')); - - await parseFetch(res); - }; - - const onName = async (name: string) => { - const res = await fetch(`${API_URL}/register`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'Authorization': `Bearer ${token}` - }, - body: JSON.stringify({ id, name }) - }).catch(() => setError('Failed to connect to server')); - - const data = await parseFetch(res); - if (!data) return; - - resetForm('id'); - }; - - const formComponent = { - ['id']: , - ['password']: , - ['name']: - }[form]; - - const aboveMessage = { - ['id']: 'Enter your student ID, or scan your barcode', - ['password']: 'Enter admin password to start attendance', - ['name']: 'Unrecognized student ID. Enter your name' - }[form]; - - const background = { - ['id']: 'bg-background', - ['password']: 'bg-background', - ['name']: 'bg-red-700' - }[form]; +export default function Home() { + const router = useRouter(); + const { push } = useTransitionOut(router); - const errorcol = { - ['id']: 'text-red-400', - ['password']: 'text-red-400', - ['name']: 'text-white' - }[form]; + useEffect(() => { + router.prefetch('/login'); + router.prefetch('/student'); + }, []); return ( -
-
- {aboveMessage} -
- {formComponent} -
- {error} -
- {form === 'password' && ( - <> -
-
-

or

-
-
-
- - - - {/* magic to extend the hover hitbox */} -
- -
-
- {/* offset required due to magic used above */} - -

The username is "admin"

-
-
-
- - -
- - )} +
+ +
); } diff --git a/src/app/student/page.tsx b/src/app/student/page.tsx index c2796c1..bb09536 100644 --- a/src/app/student/page.tsx +++ b/src/app/student/page.tsx @@ -1,108 +1,105 @@ 'use client'; -import '@/app/globals.css'; - -import { InputId } from '@/components/forms'; -import { Button } from '@/components/ui/button'; -import { Input } from '@/components/ui/input'; -import { Label } from '@/components/ui/label'; -import { API_URL } from '@/lib/utils'; -import { useState } from 'react'; - -function Form({ submit, setError }: { submit: (name: string, id: number) => void, setError: (_: string) => void }) { - const [name, setName] = useState(''); - const [id, setId] = useState(undefined as number | undefined); - - const onSubmit = (ev: React.FormEvent) => { - ev.preventDefault(); - - if (id === undefined) { - setError('Please enter your ID'); - return; - } +import { InputId } from "@components/forms"; +import { Button } from "@ui/button"; +import { useTransitionOut } from "@lib/transitions"; + +import { useEffect, useState } from "react"; +import { useRouter, useSearchParams } from "next/navigation"; +import { cn } from "@lib/utils"; +import { FetchError, InternalServerError, tfetch } from "@lib/api"; +import { Label } from "@ui/label"; + +interface IdInputProps { + error: string, + setError: (_: string) => void, +} - if (name.length === 0) { - setError('Please enter your name'); - return; - } +function IdInput({ error, setError }: IdInputProps) { + const router = useRouter(); - submit(name, id); - }; + const { push } = useTransitionOut(router); + const [id, setId] = useState(''); return ( -
- - setName(ev.target.value)} /> - - +
+
+ Please enter your ID +
+
{ + ev.preventDefault(); + if (id.length == 5) push(`/student?id=${id}`); + else setError('Please enter a full student ID'); + }}> + + + +
+ {error} +
+
); } -function Success({ name, uid, hours }: { name: string, uid: number, hours: number }) { +function Loading() { return ( - <> - - - - - ); +
+ + + +
+ ) } export default function Student() { - // Data - const [id, setId] = useState(undefined as number | undefined); - const [name, setName] = useState(''); - const [hours, setHours] = useState(0); + const params = useSearchParams(); - // Page State - const [page, setPage] = useState<'form' | 'success'>('form'); - const [error, setError] = useState(''); + const [error, setError] = useState(''); + const [loading, setLoading] = useState(true); + const [hours, setHours] = useState(); - // Updates - const resetPage = (page: 'form' | 'success') => { - setError(''); - setPage(page); - }; + useEffect(() => { + const id = params.get('id'); + if (!id) return; - const onForm = (name: string, id: number) => { - setId(id); - setName(name); - - fetch(`${API_URL}/hours?id=${id}&name=${name}`, { - method: 'GET', - headers: { - 'Content-Type': 'application/json' - } - }) - .then((res) => res.json()) - .then((res) => { - setHours(res.hours); - resetPage('success'); + setLoading(true); + tfetch('/hours', { id }) + .then(res => { + if (res.ok) setHours(res.result!.hours); + else setError(res.error!.ecode == 500 ? InternalServerError : 'Invalid student ID'); }) - .catch(() => { - setError('Invalid name, ID, or user not found'); - }); - }; - - const pageComponent = { - ['form']:
, - ['success']: - }[page]; + .catch(() => setError(FetchError)) + .finally(() => setLoading(false)); + }, []); - const aboveMessage = { - ['form']: 'Please enter your ID and name', - ['success']: '' - }[page]; + if (!params.get('id') || error) return ; return ( -
-
- {aboveMessage} + <> +
+
- {pageComponent} -
- {error} +
+
-
+ ); } \ No newline at end of file diff --git a/src/app/template.tsx b/src/app/template.tsx new file mode 100644 index 0000000..0efda4b --- /dev/null +++ b/src/app/template.tsx @@ -0,0 +1,53 @@ +'use client'; + +import { BackButton } from '@ui/backbutton'; +import { TransitionOutContext } from '@lib/transitions'; + +import React from 'react'; +import { useEffect } from 'react'; +import { usePathname, useSearchParams } from 'next/navigation'; +import { motion, useAnimationControls } from 'framer-motion'; + +export default function Template({ children }: { children: React.ReactNode }) { + const controls = useAnimationControls(); + const pathname = usePathname(); + const query = useSearchParams(); + + useEffect(() => { + controls.start({ + opacity: 1, + x: 0 + }); + }); + + const transitionOut = (callback: () => void) => { + controls.start({ + opacity: 0, + x: -100, + }).then(callback) + }; + + return ( + + {pathname == '/' || pathname == undefined ? null : } + + + {children} + + + ); +} \ No newline at end of file diff --git a/src/components/forms/index.tsx b/src/components/forms/index.tsx index aeb7fa9..b8b1db5 100644 --- a/src/components/forms/index.tsx +++ b/src/components/forms/index.tsx @@ -3,23 +3,19 @@ import { Input } from '@/components/ui/input'; import { REGEXP_ONLY_DIGITS } from 'input-otp'; import React, { useEffect, useState } from 'react'; -export function InputId({ complete, noClear }: { complete: (_: number) => void, noClear?: boolean }) { - const [id, setId] = useState(''); +export interface InputIdProps { + value: string, + onChange: (_: string) => void, +} +export function InputId({ value, onChange }: InputIdProps) { useEffect(() => { - if (id.length == 0) (document.querySelector('input[autocomplete="one-time-code"]') as (HTMLElement)).focus(); + if (value?.toString().length == 0 || value == undefined) + (document.querySelector('input[autocomplete="one-time-code"]') as (HTMLElement)).focus(); }); - if (id.length === 5) { - complete(parseInt(id)); - - if (!noClear) { - setId(''); - } - } - return ( - + @@ -45,30 +41,4 @@ export function InputPassword({ submit }: { submit: (_: string) => void }) { setPassword(ev.target.value)} /> ); -} - -export function InputName({ submit, setError }: { submit: (_: string) => void, setError: (_: string) => void }) { - const [name, setName] = useState(''); - - const onSubmit = (ev: React.FormEvent) => { - ev.preventDefault(); - - const subnames = name.split(' ').map((subname) => subname.trim()).filter((subname) => subname.length > 0); - - if (subnames.length != 2) { - setError('Please enter your first and last name, only'); - return; - } - - const fixedname = subnames.map((subname) => subname[0].toUpperCase() + subname.slice(1)).join(' '); - - submit(fixedname); - setName(''); - }; - - return ( -
- setName(ev.target.value)} /> -
- ); } \ No newline at end of file diff --git a/src/components/ui/backbutton.tsx b/src/components/ui/backbutton.tsx new file mode 100644 index 0000000..a8a8971 --- /dev/null +++ b/src/components/ui/backbutton.tsx @@ -0,0 +1,20 @@ +'use client'; + +import { useRouter } from "next/navigation"; +import { Button } from "./button"; +import { useTransitionOut } from "@lib/transitions"; + +export function BackButton() { + const router = useRouter(); + const { push } = useTransitionOut(router); + + return ( + + ); +} \ No newline at end of file diff --git a/src/components/ui/button.tsx b/src/components/ui/button.tsx index 80933d7..492090e 100644 --- a/src/components/ui/button.tsx +++ b/src/components/ui/button.tsx @@ -11,11 +11,11 @@ const buttonVariants = cva( variant: { default: 'bg-primary text-primary-foreground hover:bg-primary/90', destructive: - 'bg-destructive text-destructive-foreground hover:bg-destructive/90', + 'bg-destructive text-destructive-foreground hover:bg-destructive/90', outline: - 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', + 'border border-input bg-background hover:bg-accent hover:text-accent-foreground', secondary: - 'bg-secondary text-secondary-foreground hover:bg-secondary/80', + 'bg-secondary text-secondary-foreground hover:bg-secondary/80', ghost: 'hover:bg-accent hover:text-accent-foreground', link: 'text-primary underline-offset-4 hover:underline', }, @@ -27,21 +27,21 @@ const buttonVariants = cva( }, }, defaultVariants: { - variant: 'default', + variant: 'secondary', size: 'default', }, } ); export interface ButtonProps - extends React.ButtonHTMLAttributes, - VariantProps { - asChild?: boolean + extends React.ButtonHTMLAttributes, + VariantProps { + asChild?: boolean } const Button = React.forwardRef( ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : 'button'; + const Comp: any = asChild ? Slot : 'button'; return ( { + ok: boolean; + result?: T; + error?: Error; +} + + +type OptionalBearer = { token: string } | {}; +type OptionalBody = { body: string } | {}; +type Route = keyof Requests & keyof Responses; + +const RequestMethod: Record = { + '/hours': 'GET', + '/login': 'POST', + '/roster': 'POST', +} + +export const InternalServerError = 'Problem with the server. Get Angad to fix this'; +export const FetchError = 'Could not connect to the server. Are you online?'; + +export function makeurl(route: T, data: Requests[T]): string { + const url = new URL(`${API_URL}${route}`); + + if (RequestMethod[route] === 'GET') { + Object.entries(data).forEach(([key, value]) => { + url.searchParams.append(key, value.toString()); + }); + } + + return url.toString(); +} + +export function makebody(route: T, data: Requests[T]): OptionalBody { + if (RequestMethod[route] === 'GET') { + return {}; + } + + return { body: JSON.stringify(data) }; +} + +export function tfetch(route: T, data: Requests[T]): Promise> { + const bearer: OptionalBearer = + 'token' in data + ? { 'Authorization': `Bearer ${data.token}` } + : {}; + + return new Promise((resolve, reject) => { + fetch(makeurl(route, data), { + method: RequestMethod[route], + headers: { + 'Content-Type': 'application/json', + ...bearer + }, + ...makebody(route, data) + }) + .then(async res => { + if (res.ok) { + resolve({ + ok: true, + result: await res.json() + }); + } else { + resolve({ + ok: false, + error: { + ecode: res.status, + message: await res.text() + } + }); + } + }) + .catch(reject); + }); +} \ No newline at end of file diff --git a/src/lib/transitions.ts b/src/lib/transitions.ts new file mode 100644 index 0000000..65a3510 --- /dev/null +++ b/src/lib/transitions.ts @@ -0,0 +1,15 @@ +import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; +import { usePathname } from "next/navigation"; +import React from "react"; + +export const TransitionOutContext = React.createContext<(callback: () => void) => void>((_) => { }); + +export function useTransitionOut(router: AppRouterInstance) { + const transition = React.useContext(TransitionOutContext); + const path = usePathname(); + + return { + push: (path: string) => transition(() => router.push(path)), + replace: (path: string) => transition(() => router.replace(path)), + }; +} \ No newline at end of file diff --git a/src/lib/utils.ts b/src/lib/utils.ts index c218be5..0c7118a 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -1,7 +1,8 @@ import { clsx, type ClassValue } from 'clsx'; import { twMerge } from 'tailwind-merge'; -export const API_URL = process.env.API_URL || 'https://api.attendance.angad.page'; +export const API_URL = process.env.API_URL || 'http://localhost:8080'; + export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)); } diff --git a/src/app/globals.css b/src/styles/globals.scss similarity index 100% rename from src/app/globals.css rename to src/styles/globals.scss diff --git a/tsconfig.json b/tsconfig.json index 7b28589..6739777 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,26 +1,54 @@ { - "compilerOptions": { - "lib": ["dom", "dom.iterable", "esnext"], - "allowJs": true, - "skipLibCheck": true, - "strict": true, - "noEmit": true, - "esModuleInterop": true, - "module": "esnext", - "moduleResolution": "bundler", - "resolveJsonModule": true, - "isolatedModules": true, - "jsx": "preserve", - "incremental": true, - "plugins": [ - { - "name": "next" - } - ], - "paths": { - "@/*": ["./src/*"] - } - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} + "compilerOptions": { + "lib": [ + "dom", + "dom.iterable", + "esnext" + ], + "allowJs": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "esModuleInterop": true, + "module": "esnext", + "moduleResolution": "bundler", + "resolveJsonModule": true, + "isolatedModules": true, + "jsx": "preserve", + "incremental": true, + "plugins": [ + { + "name": "next" + } + ], + "paths": { + "@app/*": [ + "./src/app/*" + ], + "@lib/*": [ + "./src/lib/*" + ], + "@ui/*": [ + "./src/components/ui/*" + ], + "@components/*": [ + "./src/components/*" + ], + "@styles/*": [ + "./src/styles/*" + ], + "@/*": [ + "./src/*" + ], + } + }, + "include": [ + "next-env.d.ts", + "**/*.ts", + "**/*.tsx", + ".next/types/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} \ No newline at end of file From 6dc5e2318a0aa40eb0c868ff6413f3d6aa7793b8 Mon Sep 17 00:00:00 2001 From: Angad Tendulkar Date: Wed, 16 Oct 2024 09:20:48 -0400 Subject: [PATCH 2/3] lint + csv api [skip ci][skip deploy] --- src-api/src/main.rs | 17 ++++++++++++++ src-api/src/model.rs | 11 +++++++++ src-api/src/routes/csv.rs | 39 +++++++++++++++++++++++++++++++- src-api/src/routes/hours.rs | 2 +- src-api/src/routes/roster.rs | 11 +-------- src/app/admin/page.tsx | 14 ++++++------ src/app/attendance/page.tsx | 22 +++++++++--------- src/app/login/page.tsx | 17 +++++++------- src/app/page.tsx | 2 +- src/app/student/page.tsx | 22 +++++++++--------- src/app/template.tsx | 2 +- src/components/ui/backbutton.tsx | 6 ++--- src/lib/api.ts | 8 +++---- src/lib/transitions.ts | 6 ++--- 14 files changed, 116 insertions(+), 63 deletions(-) diff --git a/src-api/src/main.rs b/src-api/src/main.rs index 4fa1931..9ac081c 100644 --- a/src-api/src/main.rs +++ b/src-api/src/main.rs @@ -97,6 +97,23 @@ async fn hours( Ok(HttpResponse::Ok().json(HoursResponse { hours })) } +#[get("/csv")] +async fn csv( + req: HttpRequest, + query: web::Query, + state: web::Data, +) -> Result { + authorize(get_auth_header(&req)?, &state.pg).await?; + + let csv = routes::csv(&state.pg).await?; + + if query.into_inner().json { + Ok(HttpResponse::Ok().json(CSVResponse { csv })) + } else { + Ok(HttpResponse::Ok().body(csv)) + } +} + #[actix_web::main] async fn main() -> Result<(), InitError> { SimpleLogger::new().with_level(LevelFilter::Debug).init()?; diff --git a/src-api/src/model.rs b/src-api/src/model.rs index 48eba61..dfdfdf8 100644 --- a/src-api/src/model.rs +++ b/src-api/src/model.rs @@ -16,6 +16,12 @@ pub struct RosterRequest { pub id: String, } +#[derive(Deserialize)] +pub struct CSVRequest { + #[serde(default)] + pub json: bool, +} + #[derive(Serialize)] pub struct HoursResponse { pub hours: f64, @@ -31,6 +37,11 @@ pub struct RosterResponse { pub login: bool, } +#[derive(Serialize)] +pub struct CSVResponse { + pub csv: String, +} + pub struct AppState { pub pg: PgPool, } diff --git a/src-api/src/routes/csv.rs b/src-api/src/routes/csv.rs index a273595..1191dbc 100644 --- a/src-api/src/routes/csv.rs +++ b/src-api/src/routes/csv.rs @@ -1,5 +1,42 @@ +use std::collections::HashMap; + use crate::prelude::*; pub async fn csv(pg: &PgPool) -> Result { - todo!() + let records = sqlx::query!( + r#" + SELECT + student_id, + sign_in, + sign_out + FROM records + WHERE in_progress = false + AND sign_out IS NOT NULL + AND sign_out < sign_in + INTERVAL '4 hours' + "# + ) + .fetch_all(pg) + .await?; + + let mut hours = HashMap::new(); + let mut csv = String::from("id,hours\n"); + + for record in records { + let timein = record.sign_in; + let timeout = record.sign_out.unwrap(); + let duration = timeout.signed_duration_since(timein); + let mins = duration.num_minutes(); + + hours + .entry(record.student_id) + .and_modify(|time| *time += mins) + .or_insert(mins); + } + + for (student_id, mins) in hours { + let hours = mins as f64 / 60.0; + csv.push_str(&format!("{},{}\n", student_id, hours)); + } + + Ok(csv) } diff --git a/src-api/src/routes/hours.rs b/src-api/src/routes/hours.rs index 1902c91..44408e0 100644 --- a/src-api/src/routes/hours.rs +++ b/src-api/src/routes/hours.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub async fn hours(id: String, pg: &PgPool) -> Result { let records = sqlx::query!( r#" - SELECT * FROM records + SELECT sign_in, sign_out FROM records WHERE student_id = $1 AND sign_out IS NOT NULL AND in_progress = false diff --git a/src-api/src/routes/roster.rs b/src-api/src/routes/roster.rs index 5b12590..0fc1805 100644 --- a/src-api/src/routes/roster.rs +++ b/src-api/src/routes/roster.rs @@ -1,11 +1,9 @@ -use chrono::{Duration, Utc}; - use crate::prelude::*; pub async fn roster(id: String, pg: &PgPool) -> Result { let record = sqlx::query!( r#" - SELECT * FROM records + SELECT id, sign_in FROM records WHERE student_id = $1 and in_progress = true "#, id @@ -13,13 +11,6 @@ pub async fn roster(id: String, pg: &PgPool) -> Result { .fetch_optional(pg) .await?; - if record - .as_ref() - .is_some_and(|r| r.sign_in < Utc::now().naive_utc() - Duration::hours(5)) - { - return Err(RouteError::InvalidToken); - } - if let Some(record) = record { sqlx::query!( r#" diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index fd64d16..5a5d200 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -1,11 +1,11 @@ 'use client'; -import { useTransitionOut } from "@lib/transitions"; -import { Button } from "@ui/button"; +import { useTransitionOut } from '@lib/transitions'; +import { Button } from '@ui/button'; -import { useCookies } from "next-client-cookies"; -import { useRouter } from "next/navigation"; -import { useEffect } from "react"; +import { useCookies } from 'next-client-cookies'; +import { useRouter } from 'next/navigation'; +import { useEffect } from 'react'; export default function Admin() { const router = useRouter(); @@ -15,11 +15,11 @@ export default function Admin() { useEffect(() => { router.prefetch('/attendance'); router.prefetch('/download'); - }, []); + }, [router]); useEffect(() => { if (!cookies.get('token')) router.push('/login'); - }); + }, [router, cookies]); return (
diff --git a/src/app/attendance/page.tsx b/src/app/attendance/page.tsx index 883d0af..4b06810 100644 --- a/src/app/attendance/page.tsx +++ b/src/app/attendance/page.tsx @@ -1,12 +1,12 @@ 'use client'; -import { InputId } from "@components/forms"; -import { FetchError, InternalServerError, tfetch } from "@lib/api"; -import { useTransitionOut } from "@lib/transitions"; -import { Button } from "@ui/button"; -import { useCookies } from "next-client-cookies"; -import { useRouter } from "next/navigation"; -import { useEffect, useState } from "react"; +import { InputId } from '@components/forms'; +import { FetchError, InternalServerError, tfetch } from '@lib/api'; +import { useTransitionOut } from '@lib/transitions'; +import { Button } from '@ui/button'; +import { useCookies } from 'next-client-cookies'; +import { useRouter } from 'next/navigation'; +import { useEffect, useState } from 'react'; export default function Attendance() { const cookies = useCookies(); @@ -24,15 +24,15 @@ export default function Attendance() { const resetSuccess = (msg: string) => { setError(''); setSuccess(msg); - } + }; const resetError = (msg: string) => { setError(msg); setSuccess(''); - } + }; const submit = () => { - tfetch(`/roster`, { + tfetch('/roster', { token: cookies.get('token')!, id: id, }) @@ -54,7 +54,7 @@ export default function Attendance() { return (
- Please enter your ID + Please enter or scan your ID
{ ev.preventDefault(); diff --git a/src/app/login/page.tsx b/src/app/login/page.tsx index b1bfa8c..e7958dd 100644 --- a/src/app/login/page.tsx +++ b/src/app/login/page.tsx @@ -1,14 +1,13 @@ 'use client'; -import { Button } from "@ui/button"; -import { Input } from "@ui/input"; -import { API_URL } from "@lib/utils"; -import { useTransitionOut } from "@lib/transitions"; +import { Button } from '@ui/button'; +import { Input } from '@ui/input'; +import { useTransitionOut } from '@lib/transitions'; -import { useEffect, useState } from "react"; -import { useCookies } from "next-client-cookies"; -import { useRouter } from "next/navigation"; -import { FetchError, tfetch } from "@lib/api"; +import { useEffect, useState } from 'react'; +import { useCookies } from 'next-client-cookies'; +import { useRouter } from 'next/navigation'; +import { FetchError, tfetch } from '@lib/api'; export default function Teacher() { const cookies = useCookies(); @@ -18,7 +17,7 @@ export default function Teacher() { useEffect(() => { if (cookies.get('token')) router.push('/admin'); - }, []); + }, [router, cookies]); const onSubmit = (ev: React.FormEvent) => { ev.preventDefault(); diff --git a/src/app/page.tsx b/src/app/page.tsx index 7545106..7704752 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -13,7 +13,7 @@ export default function Home() { useEffect(() => { router.prefetch('/login'); router.prefetch('/student'); - }, []); + }, [router]); return (
diff --git a/src/app/student/page.tsx b/src/app/student/page.tsx index bb09536..a083e0e 100644 --- a/src/app/student/page.tsx +++ b/src/app/student/page.tsx @@ -1,14 +1,14 @@ 'use client'; -import { InputId } from "@components/forms"; -import { Button } from "@ui/button"; -import { useTransitionOut } from "@lib/transitions"; +import { InputId } from '@components/forms'; +import { Button } from '@ui/button'; +import { useTransitionOut } from '@lib/transitions'; -import { useEffect, useState } from "react"; -import { useRouter, useSearchParams } from "next/navigation"; -import { cn } from "@lib/utils"; -import { FetchError, InternalServerError, tfetch } from "@lib/api"; -import { Label } from "@ui/label"; +import { useEffect, useState } from 'react'; +import { useRouter, useSearchParams } from 'next/navigation'; +import { cn } from '@lib/utils'; +import { FetchError, InternalServerError, tfetch } from '@lib/api'; +import { Label } from '@ui/label'; interface IdInputProps { error: string, @@ -54,12 +54,12 @@ function Loading() { strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" - className={cn("animate-spin")} + className={cn('animate-spin')} >
- ) + ); } export default function Student() { @@ -81,7 +81,7 @@ export default function Student() { }) .catch(() => setError(FetchError)) .finally(() => setLoading(false)); - }, []); + }, [params]); if (!params.get('id') || error) return ; diff --git a/src/app/template.tsx b/src/app/template.tsx index 0efda4b..d6c13e7 100644 --- a/src/app/template.tsx +++ b/src/app/template.tsx @@ -24,7 +24,7 @@ export default function Template({ children }: { children: React.ReactNode }) { controls.start({ opacity: 0, x: -100, - }).then(callback) + }).then(callback); }; return ( diff --git a/src/components/ui/backbutton.tsx b/src/components/ui/backbutton.tsx index a8a8971..fdb2fd0 100644 --- a/src/components/ui/backbutton.tsx +++ b/src/components/ui/backbutton.tsx @@ -1,8 +1,8 @@ 'use client'; -import { useRouter } from "next/navigation"; -import { Button } from "./button"; -import { useTransitionOut } from "@lib/transitions"; +import { useRouter } from 'next/navigation'; +import { Button } from './button'; +import { useTransitionOut } from '@lib/transitions'; export function BackButton() { const router = useRouter(); diff --git a/src/lib/api.ts b/src/lib/api.ts index 9a1bac5..a9decc0 100644 --- a/src/lib/api.ts +++ b/src/lib/api.ts @@ -1,4 +1,4 @@ -import { API_URL } from "./utils"; +import { API_URL } from './utils'; interface AuthenticatedRequest { token: string; @@ -52,15 +52,15 @@ export interface HttpResult { } -type OptionalBearer = { token: string } | {}; -type OptionalBody = { body: string } | {}; +type OptionalBearer = { 'Authorization': string } | Record; +type OptionalBody = { body: string } | Record; type Route = keyof Requests & keyof Responses; const RequestMethod: Record = { '/hours': 'GET', '/login': 'POST', '/roster': 'POST', -} +}; export const InternalServerError = 'Problem with the server. Get Angad to fix this'; export const FetchError = 'Could not connect to the server. Are you online?'; diff --git a/src/lib/transitions.ts b/src/lib/transitions.ts index 65a3510..ba233d4 100644 --- a/src/lib/transitions.ts +++ b/src/lib/transitions.ts @@ -1,12 +1,10 @@ -import { AppRouterInstance } from "next/dist/shared/lib/app-router-context.shared-runtime"; -import { usePathname } from "next/navigation"; -import React from "react"; +import { AppRouterInstance } from 'next/dist/shared/lib/app-router-context.shared-runtime'; +import React from 'react'; export const TransitionOutContext = React.createContext<(callback: () => void) => void>((_) => { }); export function useTransitionOut(router: AppRouterInstance) { const transition = React.useContext(TransitionOutContext); - const path = usePathname(); return { push: (path: string) => transition(() => router.push(path)), From b0ee1845502264ae8f2248b6d925aac6498a3fbf Mon Sep 17 00:00:00 2001 From: Angad Tendulkar Date: Wed, 16 Oct 2024 19:33:52 -0400 Subject: [PATCH 3/3] done --- src-api/src/main.rs | 9 +- src-api/src/model.rs | 1 + src/app/admin/page.tsx | 4 +- src/app/attendance/page.tsx | 2 + src/app/csv/page.tsx | 280 ++++++++++++++++++ src/app/layout.tsx | 5 + src/app/student/page.tsx | 24 +- src/app/template.tsx | 4 +- .../ui/{backbutton.tsx => homebutton.tsx} | 2 +- src/components/ui/pagination.tsx | 117 ++++++++ src/components/ui/spinner.tsx | 22 ++ src/lib/api.ts | 11 +- tsconfig.json | 1 + 13 files changed, 450 insertions(+), 32 deletions(-) create mode 100644 src/app/csv/page.tsx rename src/components/ui/{backbutton.tsx => homebutton.tsx} (92%) create mode 100644 src/components/ui/pagination.tsx create mode 100644 src/components/ui/spinner.tsx diff --git a/src-api/src/main.rs b/src-api/src/main.rs index 9ac081c..ed3f7c0 100644 --- a/src-api/src/main.rs +++ b/src-api/src/main.rs @@ -97,17 +97,17 @@ async fn hours( Ok(HttpResponse::Ok().json(HoursResponse { hours })) } -#[get("/csv")] +#[get("/hours.csv")] async fn csv( - req: HttpRequest, query: web::Query, state: web::Data, ) -> Result { - authorize(get_auth_header(&req)?, &state.pg).await?; + let CSVRequest { json, token } = query.into_inner(); + authorize(token, &state.pg).await?; let csv = routes::csv(&state.pg).await?; - if query.into_inner().json { + if json { Ok(HttpResponse::Ok().json(CSVResponse { csv })) } else { Ok(HttpResponse::Ok().body(csv)) @@ -137,6 +137,7 @@ async fn main() -> Result<(), InitError> { .service(login) .service(hours) .service(roster) + .service(csv) }) .bind(("0.0.0.0", 8080))? .run() diff --git a/src-api/src/model.rs b/src-api/src/model.rs index dfdfdf8..232daef 100644 --- a/src-api/src/model.rs +++ b/src-api/src/model.rs @@ -20,6 +20,7 @@ pub struct RosterRequest { pub struct CSVRequest { #[serde(default)] pub json: bool, + pub token: String, } #[derive(Serialize)] diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 5a5d200..414a961 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -14,7 +14,7 @@ export default function Admin() { useEffect(() => { router.prefetch('/attendance'); - router.prefetch('/download'); + router.prefetch('/csv'); }, [router]); useEffect(() => { @@ -26,7 +26,7 @@ export default function Admin() { -
diff --git a/src/app/attendance/page.tsx b/src/app/attendance/page.tsx index 4b06810..c752af1 100644 --- a/src/app/attendance/page.tsx +++ b/src/app/attendance/page.tsx @@ -49,6 +49,8 @@ export default function Attendance() { } }) .catch(() => resetError(FetchError)); + + setId(''); }; return ( diff --git a/src/app/csv/page.tsx b/src/app/csv/page.tsx new file mode 100644 index 0000000..4b33d1d --- /dev/null +++ b/src/app/csv/page.tsx @@ -0,0 +1,280 @@ +'use client'; + +import { FetchError, InternalServerError, tfetch } from "@lib/api"; +import { API_URL, cn } from "@lib/utils"; +import { TooltipTrigger } from "@radix-ui/react-tooltip"; +import { Button } from "@ui/button"; +import { Label } from "@ui/label"; +import { Pagination, PaginationContent, PaginationItem, PaginationLink } from "@ui/pagination"; +import { Spinner } from "@ui/spinner"; +import { Tooltip, TooltipContent, TooltipProvider } from "@ui/tooltip"; +import { Download, File, HelpCircle } from "lucide-react"; +import { useCookies } from "next-client-cookies"; +import { useRouter } from "next/navigation"; +import { useEffect, useState } from "react"; + +interface AuthProp { + token: string; +} + +function IdOnly({ token }: AuthProp) { + return ( + + ); +} + +function mapize(idhours: string[]): Record { + const map: Record = {}; + + for (const line of idhours) { + if (!line) continue; + const [id, hours] = line.split(','); + map[id.trim()] = parseInt(hours.trim()); + } + + return map; +} + +function merge(idname: string[], hrs: Record, idcol: number, namecol: number): string { + const map: Record = {}; + + for (const line of idname) { + if (!line) continue; + const vals = line.split(","); + const id = vals[idcol].trim(); + const name = vals[namecol].trim(); + const hours = hrs[id]; + map[id] = { name, hours }; + } + + let csv = "id,name,hours\n"; + for (const entry of Object.keys(map)) { + console.log(entry); + + csv += `${entry},${map[entry].name},${map[entry].hours}`; + } + + return csv; +} + +function Both({ token }: AuthProp) { + const router = useRouter(); + const cookies = useCookies(); + + const [error, setError] = useState(); + const [status, setStatus] = useState<'upload' | 'loading' | 'download'>('upload'); + const [csv, setCsv] = useState(''); + + const resetError = (error: string) => { + setStatus('upload'); + setError(error); + } + + const drop = (ev: React.DragEvent) => { + setStatus('loading'); + ev.preventDefault(); + + const file = ev.dataTransfer.files[0]; + + if (!file) { + resetError("No file uploaded."); + return; + } + + if (file.type !== "text/csv") { + resetError("Invalid file type. Please upload a CSV file."); + return; + } + + file.text().then(process); + }; + + const upload = (ev: React.ChangeEvent) => { + setStatus('loading'); + ev.preventDefault(); + const file = ev.target.files?.[0]; + + if (!file) { + resetError("No file uploaded."); + return; + } + + if (file.type !== "text/csv") { + resetError("Invalid file type. Please upload a CSV file."); + return; + } + + file.text() + .then(process); + }; + + const process = (file: string) => { + const lines = file.split("\n"); + const header = lines[0].split(","); + const body = lines.splice(1); + + let idcol = header.indexOf("id"); + let namecol = header.indexOf("name"); + + console.log(idcol, namecol); + + if (idcol == undefined) { + resetError('No ID header detected. Make sure the first line contains the correct header'); + return + } + + if (namecol == undefined) { + resetError('No name header detected. Make sure the first line contains the correct header'); + return + } + + tfetch('/hours.csv', { token }) + .then(res => { + if (!res.ok) { + if (res.error!.ecode == 500) { + resetError(InternalServerError); + } else if (res.error!.ecode == 401) { + router.push('/'); + } else { + resetError("Failed to get csv"); + } + } + + try { + const csv = res.result!.csv; + const hours = mapize(csv.split("\n").slice(1)); + const merged = merge(body, hours, idcol, namecol); + + setCsv(merged); + setStatus('download'); + } catch (err) { + console.log(err); + resetError("Failed to parse CSV"); + } + }) + .catch((err) => { + console.log(err); + resetError(FetchError); + }); + }; + + const UploadInner = () => { + return ( + <> + + + + + + + + + + + + +
+ + +
+ + + + ); + }; + + const DownloadInner = () => { + return ( + <> + + + ); + }; + + const inner = { + ['upload']: , + ['loading']: , + ['download']: , + }[status]; + + return ( +
+
document.getElementById("file-input")?.click()} + > + {inner} +
+
+ ); +} + +export default function Csv() { + const router = useRouter(); + const cookies = useCookies(); + const [selected, setSelected] = useState<0 | 1>(0); + + useEffect(() => { + if (!cookies.get('token')) router.push('/login'); + }); + + const element = { + [0]: , + [1]: + }[selected]; + + return ( +
+
+ + + + setSelected(0)} isActive={!selected} className="w-60 select-none"> + Without Names + + + + setSelected(1)} isActive={!!selected} className="w-60 select-none"> + With Names + + + + +
+ {element} +
+ ) +} \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 989818e..59a5ad3 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -3,6 +3,11 @@ import { CookiesProvider } from 'next-client-cookies/server'; import '@styles/globals.scss'; +export const metadata = { + title: 'Attendance', + description: 'Attendance tracking system', +}; + export default function RootLayout({ children, }: { diff --git a/src/app/student/page.tsx b/src/app/student/page.tsx index a083e0e..d3a344e 100644 --- a/src/app/student/page.tsx +++ b/src/app/student/page.tsx @@ -9,6 +9,7 @@ import { useRouter, useSearchParams } from 'next/navigation'; import { cn } from '@lib/utils'; import { FetchError, InternalServerError, tfetch } from '@lib/api'; import { Label } from '@ui/label'; +import { Spinner } from '@ui/spinner'; interface IdInputProps { error: string, @@ -41,27 +42,6 @@ function IdInput({ error, setError }: IdInputProps) { ); } -function Loading() { - return ( -
- - - -
- ); -} - export default function Student() { const params = useSearchParams(); @@ -92,7 +72,7 @@ export default function Student() { opacity: +loading, transition: 'all 0.2s ease' }}> - +
- {pathname == '/' || pathname == undefined ? null : } + {pathname == '/' || pathname == undefined ? null : } ) => ( +