From 4b5ddda1b4950904d23bb06f4104eafa81c4dec1 Mon Sep 17 00:00:00 2001 From: Prakhar Trivedi Date: Mon, 16 Jun 2025 09:57:34 +0800 Subject: [PATCH 1/8] created my branch --- src/themes/MainTheme.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/themes/MainTheme.js b/src/themes/MainTheme.js index 60e33f1..a912f61 100644 --- a/src/themes/MainTheme.js +++ b/src/themes/MainTheme.js @@ -17,7 +17,7 @@ const buttonRecipe = defineRecipe({ } } }) - + const textRecipe = defineRecipe({ base: { fontFamily: 'Lexend', From 95a86539222fed920d0b57e111b772749ee355b2 Mon Sep 17 00:00:00 2001 From: Prakhar Trivedi Date: Mon, 16 Jun 2025 16:19:55 +0800 Subject: [PATCH 2/8] changed README --- README.md | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/README.md b/README.md index 86f5adf..5234659 100644 --- a/README.md +++ b/README.md @@ -1,13 +1 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. -# Frontend +# ArchAIve Frontend From 3ae4fdf3c5b28af466b9d084a5a95f153454c91e Mon Sep 17 00:00:00 2001 From: Prakhar Trivedi Date: Thu, 3 Jul 2025 17:31:34 +0800 Subject: [PATCH 3/8] added navbar and sidebar components, working on fixing bugs --- src/components/Navbar.jsx | 30 ++++++++++++++++++++++ src/components/Sidebar.jsx | 41 ++++++++++++++++++++++++++++++ src/main.jsx | 6 +++-- src/pages/{Home.jsx => Health.jsx} | 4 +-- src/pages/Homepage.jsx | 10 ++++++++ 5 files changed, 87 insertions(+), 4 deletions(-) create mode 100644 src/components/Navbar.jsx create mode 100644 src/components/Sidebar.jsx rename src/pages/{Home.jsx => Health.jsx} (96%) create mode 100644 src/pages/Homepage.jsx diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx new file mode 100644 index 0000000..74b29c8 --- /dev/null +++ b/src/components/Navbar.jsx @@ -0,0 +1,30 @@ +import React, { useState } from 'react' +import Sidebar from './Sidebar' +import { Avatar, Box, Button, Flex, Spacer, Text } from '@chakra-ui/react' +import { FaHamburger } from 'react-icons/fa' + +function Navbar() { + + return <> + + {/* */} + + + ArchAIve + + + + + {/* */} + + {/* {user ? ( + + ) : ( + <> + )} */} + + {/* */} + +} + +export default Navbar \ No newline at end of file diff --git a/src/components/Sidebar.jsx b/src/components/Sidebar.jsx new file mode 100644 index 0000000..45e469f --- /dev/null +++ b/src/components/Sidebar.jsx @@ -0,0 +1,41 @@ +import { Button, CloseButton, Drawer, Portal, Text } from '@chakra-ui/react' +import React, { useState } from 'react' + +function Sidebar() { + const [open, setOpen] = useState(false) + + return ( + setOpen(e.open)} placement={'start'} size={'lg'}> + + + + + + + + + Drawer Title + + +

+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. +

+
+ + + + + + + +
+
+
+
+ ) +} + +export default Sidebar \ No newline at end of file diff --git a/src/main.jsx b/src/main.jsx index c61b0bb..9cf41df 100644 --- a/src/main.jsx +++ b/src/main.jsx @@ -5,9 +5,10 @@ import { Provider } from 'react-redux' import { configureStore } from '@reduxjs/toolkit' import universalReducer from './slices/UniversalState.js' import { BrowserRouter, Route, Routes } from 'react-router' -import Home from './pages/Home.jsx' import Layout from './Layout.jsx' import MainTheme from './themes/MainTheme.js' +import Health from './pages/Health.jsx' +import Homepage from './pages/Homepage.jsx' const store = configureStore({ reducer: { @@ -21,7 +22,8 @@ createRoot(document.getElementById('root')).render( }> - } /> + } /> + } /> diff --git a/src/pages/Home.jsx b/src/pages/Health.jsx similarity index 96% rename from src/pages/Home.jsx rename to src/pages/Health.jsx index 1b75d2e..0364fb0 100644 --- a/src/pages/Home.jsx +++ b/src/pages/Health.jsx @@ -3,7 +3,7 @@ import React, { useEffect, useState } from 'react' import { useSelector } from 'react-redux' import server, { JSONResponse } from "../networking"; -function Home() { +function Health() { const { systemVersion, systemName } = useSelector((state) => state.universal) const [healthCheckMessage, setHealthCheckMessage] = useState("Checking..."); @@ -34,4 +34,4 @@ function Home() { } -export default Home \ No newline at end of file +export default Health \ No newline at end of file diff --git a/src/pages/Homepage.jsx b/src/pages/Homepage.jsx new file mode 100644 index 0000000..ddc9744 --- /dev/null +++ b/src/pages/Homepage.jsx @@ -0,0 +1,10 @@ +import React from 'react' +import Navbar from '../components/Navbar' + +function Homepage() { + return ( + + ) +} + +export default Homepage \ No newline at end of file From 050717a51446fe2855e202d31404185fdd21ac8d Mon Sep 17 00:00:00 2001 From: Prakhar Trivedi Date: Fri, 4 Jul 2025 09:36:35 +0800 Subject: [PATCH 4/8] added more snippets, trying to fix navbar not appearing --- package-lock.json | 1295 ++++++++++++++++++++++- package.json | 1 + src/Layout.jsx | 1 - src/components/Navbar.jsx | 31 +- src/components/ui/accordion.jsx | 39 + src/components/ui/action-bar.jsx | 33 + src/components/ui/alert.jsx | 20 + src/components/ui/avatar.jsx | 21 + src/components/ui/blockquote.jsx | 22 + src/components/ui/breadcrumb.jsx | 34 + src/components/ui/checkbox-card.jsx | 45 + src/components/ui/checkbox.jsx | 17 + src/components/ui/clipboard.jsx | 101 ++ src/components/ui/close-button.jsx | 20 + src/components/ui/color-picker.jsx | 201 ++++ src/components/ui/data-list.jsx | 21 + src/components/ui/dialog.jsx | 54 + src/components/ui/drawer.jsx | 44 + src/components/ui/empty-state.jsx | 26 + src/components/ui/field.jsx | 22 + src/components/ui/file-upload.jsx | 141 +++ src/components/ui/hover-card.jsx | 29 + src/components/ui/input-group.jsx | 39 + src/components/ui/link-button.jsx | 8 + src/components/ui/menu.jsx | 94 ++ src/components/ui/native-select.jsx | 80 ++ src/components/ui/number-input.jsx | 21 + src/components/ui/pagination.jsx | 176 +++ src/components/ui/password-input.jsx | 121 +++ src/components/ui/pin-input.jsx | 18 + src/components/ui/popover.jsx | 49 + src/components/ui/progress-circle.jsx | 29 + src/components/ui/progress.jsx | 26 + src/components/ui/prose.jsx | 264 +++++ src/components/ui/qr-code.jsx | 15 + src/components/ui/radio-card.jsx | 47 + src/components/ui/radio.jsx | 17 + src/components/ui/rating.jsx | 19 + src/components/ui/segmented-control.jsx | 36 + src/components/ui/select.jsx | 113 ++ src/components/ui/skeleton.jsx | 32 + src/components/ui/slider.jsx | 107 ++ src/components/ui/stat.jsx | 49 + src/components/ui/status.jsx | 30 + src/components/ui/stepper-input.jsx | 41 + src/components/ui/steps.jsx | 62 ++ src/components/ui/switch.jsx | 55 + src/components/ui/tag.jsx | 28 + src/components/ui/timeline.jsx | 20 + src/components/ui/toggle-tip.jsx | 58 + src/components/ui/toggle.jsx | 44 + src/main.jsx | 1 + 52 files changed, 3890 insertions(+), 27 deletions(-) create mode 100644 src/components/ui/accordion.jsx create mode 100644 src/components/ui/action-bar.jsx create mode 100644 src/components/ui/alert.jsx create mode 100644 src/components/ui/avatar.jsx create mode 100644 src/components/ui/blockquote.jsx create mode 100644 src/components/ui/breadcrumb.jsx create mode 100644 src/components/ui/checkbox-card.jsx create mode 100644 src/components/ui/checkbox.jsx create mode 100644 src/components/ui/clipboard.jsx create mode 100644 src/components/ui/close-button.jsx create mode 100644 src/components/ui/color-picker.jsx create mode 100644 src/components/ui/data-list.jsx create mode 100644 src/components/ui/dialog.jsx create mode 100644 src/components/ui/drawer.jsx create mode 100644 src/components/ui/empty-state.jsx create mode 100644 src/components/ui/field.jsx create mode 100644 src/components/ui/file-upload.jsx create mode 100644 src/components/ui/hover-card.jsx create mode 100644 src/components/ui/input-group.jsx create mode 100644 src/components/ui/link-button.jsx create mode 100644 src/components/ui/menu.jsx create mode 100644 src/components/ui/native-select.jsx create mode 100644 src/components/ui/number-input.jsx create mode 100644 src/components/ui/pagination.jsx create mode 100644 src/components/ui/password-input.jsx create mode 100644 src/components/ui/pin-input.jsx create mode 100644 src/components/ui/popover.jsx create mode 100644 src/components/ui/progress-circle.jsx create mode 100644 src/components/ui/progress.jsx create mode 100644 src/components/ui/prose.jsx create mode 100644 src/components/ui/qr-code.jsx create mode 100644 src/components/ui/radio-card.jsx create mode 100644 src/components/ui/radio.jsx create mode 100644 src/components/ui/rating.jsx create mode 100644 src/components/ui/segmented-control.jsx create mode 100644 src/components/ui/select.jsx create mode 100644 src/components/ui/skeleton.jsx create mode 100644 src/components/ui/slider.jsx create mode 100644 src/components/ui/stat.jsx create mode 100644 src/components/ui/status.jsx create mode 100644 src/components/ui/stepper-input.jsx create mode 100644 src/components/ui/steps.jsx create mode 100644 src/components/ui/switch.jsx create mode 100644 src/components/ui/tag.jsx create mode 100644 src/components/ui/timeline.jsx create mode 100644 src/components/ui/toggle-tip.jsx create mode 100644 src/components/ui/toggle.jsx diff --git a/package-lock.json b/package-lock.json index 76258e4..fbe8107 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,6 +21,7 @@ "redux": "^5.0.1" }, "devDependencies": { + "@chakra-ui/cli": "^3.21.1", "@eslint/js": "^9.25.0", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", @@ -241,6 +242,46 @@ "node": ">=6.9.0" } }, + "node_modules/@chakra-ui/cli": { + "version": "3.21.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/cli/-/cli-3.21.1.tgz", + "integrity": "sha512-EvtBollsMY5y6LkhRSe+/z8XISb4Pr5uBjVEr8YzMLFqPhVU8ZETVV80HPTwLIHEVNnDzt+I+5UI/bDclndl+w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@clack/prompts": "0.11.0", + "@pandacss/is-valid-prop": "0.54.0", + "@types/cli-table": "^0.3.4", + "@types/debug": "^4.1.12", + "@visulima/boxen": "^2.0.2", + "bundle-n-require": "1.1.2", + "chokidar": "3.6.0", + "cli-table": "^0.3.11", + "commander": "12.1.0", + "debug": "^4.4.1", + "globby": "14.1.0", + "https-proxy-agent": "^7.0.6", + "look-it-up": "2.1.0", + "node-fetch": "3.3.2", + "package-manager-detector": "1.3.0", + "prettier": "3.6.2", + "scule": "1.3.0", + "sucrase": "^3.35.0", + "zod": "^3.25.67" + }, + "bin": { + "chakra": "bin/index.js" + }, + "peerDependencies": { + "@chakra-ui/react": ">=3.0.0-next.0" + } + }, + "node_modules/@chakra-ui/cli/node_modules/@pandacss/is-valid-prop": { + "version": "0.54.0", + "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-0.54.0.tgz", + "integrity": "sha512-UhRgg1k9VKRCBAHl+XUK3lvN0k9bYifzYGZOqajDid4L1DyU813A1L0ZwN4iV9WX5TX3PfUugqtgG9LnIeFGBQ==", + "dev": true + }, "node_modules/@chakra-ui/react": { "version": "3.20.0", "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-3.20.0.tgz", @@ -262,6 +303,29 @@ "react-dom": ">=18" } }, + "node_modules/@clack/core": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@clack/core/-/core-0.5.0.tgz", + "integrity": "sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==", + "dev": true, + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, + "node_modules/@clack/prompts": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@clack/prompts/-/prompts-0.11.0.tgz", + "integrity": "sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@clack/core": "0.5.0", + "picocolors": "^1.0.0", + "sisteransi": "^1.0.5" + } + }, "node_modules/@emotion/babel-plugin": { "version": "11.13.5", "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", @@ -1073,6 +1137,24 @@ "@swc/helpers": "^0.5.0" } }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dev": true, + "license": "ISC", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", @@ -1121,11 +1203,60 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@pandacss/is-valid-prop": { "version": "0.53.6", "resolved": "https://registry.npmjs.org/@pandacss/is-valid-prop/-/is-valid-prop-0.53.6.tgz", "integrity": "sha512-TgWBQmz/5j/oAMjavqJAjQh1o+yxhYspKvepXPn4lFhAN3yBhilrw9HliAkvpUr0sB2CkJ2BYMpFXbAJYEocsA==" }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=14" + } + }, "node_modules/@reduxjs/toolkit": { "version": "2.8.2", "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-2.8.2.tgz", @@ -1439,6 +1570,19 @@ "win32" ] }, + "node_modules/@sindresorhus/merge-streams": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-2.3.0.tgz", + "integrity": "sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@standard-schema/spec": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz", @@ -1686,6 +1830,23 @@ "@swc/counter": "^0.1.3" } }, + "node_modules/@types/cli-table": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/@types/cli-table/-/cli-table-0.3.4.tgz", + "integrity": "sha512-GsALrTL69mlwbAw/MHF1IPTadSLZQnsxe7a80G8l4inN/iEXCOcVeT/S7aRc6hbhqzL9qZ314kHPDQnQ3ev+HA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", + "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", @@ -1700,6 +1861,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/parse-json": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", @@ -1732,6 +1900,31 @@ "integrity": "sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==", "license": "MIT" }, + "node_modules/@visulima/boxen": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@visulima/boxen/-/boxen-2.0.2.tgz", + "integrity": "sha512-eqm/OzwETl1Zd5ehW5CUXhYf8tqb+seBCkHBKXh1rEMS94n+OhyCY0KAlZv/17qPoN73WT2nGDN9SdYlvoWbTQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/prisis" + }, + { + "type": "consulting", + "url": "https://anolilab.com/support" + } + ], + "license": "MIT", + "os": [ + "darwin", + "linux", + "win32" + ], + "engines": { + "node": ">=20.18 <=24.x" + } + }, "node_modules/@vitejs/plugin-react-swc": { "version": "3.10.2", "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.10.2.tgz", @@ -2603,6 +2796,16 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", @@ -2620,6 +2823,19 @@ "url": "https://github.com/sponsors/epoberezkin" } }, + "node_modules/ansi-regex": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", + "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -2636,6 +2852,40 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true, + "license": "MIT" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2682,6 +2932,19 @@ "dev": true, "license": "MIT" }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -2693,6 +2956,30 @@ "concat-map": "0.0.1" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/bundle-n-require": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/bundle-n-require/-/bundle-n-require-1.1.2.tgz", + "integrity": "sha512-bEk2jakVK1ytnZ9R2AAiZEeK/GxPUM8jvcRxHZXifZDMcjkI4EG/GlsJ2YGSVYT9y/p/gA9/0yDY8rCGsSU6Tg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.1", + "node-eval": "^2.0.0" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -2732,6 +3019,56 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cli-table": { + "version": "0.3.11", + "resolved": "https://registry.npmjs.org/cli-table/-/cli-table-0.3.11.tgz", + "integrity": "sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==", + "dev": true, + "dependencies": { + "colors": "1.0.3" + }, + "engines": { + "node": ">= 0.2.0" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -2752,6 +3089,16 @@ "dev": true, "license": "MIT" }, + "node_modules/colors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz", + "integrity": "sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2764,6 +3111,16 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -2832,6 +3189,16 @@ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", "license": "MIT" }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/debug": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", @@ -2879,6 +3246,20 @@ "node": ">= 0.4" } }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", + "dev": true, + "license": "MIT" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true, + "license": "MIT" + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -3171,6 +3552,36 @@ "dev": true, "license": "MIT" }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -3191,6 +3602,16 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "license": "MIT" }, + "node_modules/fastq": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz", + "integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fdir": { "version": "6.4.6", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", @@ -3206,6 +3627,30 @@ } } }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -3219,6 +3664,19 @@ "node": ">=16.0.0" } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", @@ -3283,6 +3741,23 @@ } } }, + "node_modules/foreground-child": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", + "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", + "dev": true, + "license": "ISC", + "dependencies": { + "cross-spawn": "^7.0.6", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/form-data": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.3.tgz", @@ -3299,12 +3774,25 @@ "node": ">= 6" } }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", "dev": true, - "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ @@ -3360,6 +3848,27 @@ "node": ">= 0.4" } }, + "node_modules/glob": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", + "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", + "dev": true, + "license": "ISC", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", @@ -3373,6 +3882,32 @@ "node": ">=10.13.0" } }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/globals": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.2.0.tgz", @@ -3386,6 +3921,50 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globby": { + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-14.1.0.tgz", + "integrity": "sha512-0Ia46fDOaT7k4og1PDW4YbodWWr3scS2vAr2lTbsplOt2WkKp0vQbkI9wKis/T5LV/dqPjO3bpS/z6GTJB82LA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@sindresorhus/merge-streams": "^2.1.0", + "fast-glob": "^3.3.3", + "ignore": "^7.0.3", + "path-type": "^6.0.0", + "slash": "^5.1.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globby/node_modules/ignore": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", + "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/globby/node_modules/path-type": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-6.0.0.tgz", + "integrity": "sha512-Vj7sf++t5pBD637NSfkxpHSMfWaeig5+DKWLhcqIYx6mWQz5hdJTGDVMQiJcw1ZYkhs7AazKDGpRVji1LJCZUQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -3456,6 +4035,20 @@ "react-is": "^16.7.0" } }, + "node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -3508,6 +4101,19 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "license": "MIT" }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", @@ -3533,6 +4139,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -3546,6 +4162,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -3553,6 +4179,22 @@ "dev": true, "license": "ISC" }, + "node_modules/jackspeak": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", + "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", @@ -3664,6 +4306,20 @@ "dev": true, "license": "MIT" }, + "node_modules/look-it-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/look-it-up/-/look-it-up-2.1.0.tgz", + "integrity": "sha512-nMoGWW2HurtuJf6XAL56FWTDCWLOTSsanrgwOyaR5Y4e3zfG5N/0cU5xWZSEU3tBxhQugRbV1xL9jb+ug7yZww==", + "dev": true, + "license": "MIT" + }, + "node_modules/lru-cache": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", + "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", + "dev": true, + "license": "ISC" + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -3673,6 +4329,43 @@ "node": ">= 0.4" } }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -3707,12 +4400,34 @@ "node": "*" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "license": "MIT" }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -3749,6 +4464,79 @@ "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" } }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-eval": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/node-eval/-/node-eval-2.0.0.tgz", + "integrity": "sha512-Ap+L9HznXAVeJj3TJ1op6M6bg5xtTq8L5CU/PJxtkhea/DrIxdTknGKIECKd/v/Lgql95iuMAYvIzBNd0pmcMg==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-is-absolute": "1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "dev": true, + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3799,6 +4587,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", + "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", + "dev": true, + "license": "BlueOak-1.0.0" + }, + "node_modules/package-manager-detector": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/package-manager-detector/-/package-manager-detector-1.3.0.tgz", + "integrity": "sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3839,6 +4641,16 @@ "node": ">=8" } }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", @@ -3855,6 +4667,23 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "license": "MIT" }, + "node_modules/path-scurry": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", + "dev": true, + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", @@ -3889,6 +4718,16 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pirates": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", + "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/postcss": { "version": "8.5.4", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.4.tgz", @@ -3928,6 +4767,22 @@ "node": ">= 0.8.0" } }, + "node_modules/prettier": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.6.2.tgz", + "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", + "dev": true, + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/proxy-compare": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", @@ -3959,6 +4814,27 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", @@ -4056,6 +4932,32 @@ "react-dom": ">=18" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/readdirp/node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/redux": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz", @@ -4106,6 +5008,17 @@ "node": ">=4" } }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.42.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.42.0.tgz", @@ -4153,12 +5066,43 @@ "dev": true, "license": "MIT" }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "license": "MIT" }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, "node_modules/set-cookie-parser": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", @@ -4188,6 +5132,39 @@ "node": ">=8" } }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", + "dev": true, + "license": "MIT" + }, + "node_modules/slash": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-5.1.0.tgz", + "integrity": "sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -4207,6 +5184,110 @@ "node": ">=0.10.0" } }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/string-width-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -4226,6 +5307,39 @@ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", "license": "MIT" }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -4251,6 +5365,29 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "license": "MIT", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "license": "MIT", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/tinyglobby": { "version": "0.2.14", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", @@ -4268,6 +5405,26 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", @@ -4287,6 +5444,19 @@ "node": ">= 0.8.0" } }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/uqr": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", @@ -4387,6 +5557,16 @@ } } }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4413,6 +5593,101 @@ "node": ">=0.10.0" } }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true, + "license": "MIT" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/yaml": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.8.0.tgz", @@ -4440,6 +5715,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.25.71", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.71.tgz", + "integrity": "sha512-BsBc/NPk7h8WsUWYWYL+BajcJPY8YhjelaWu2NMLuzgraKAz4Lb4/6K11g9jpuDetjMiqhZ6YaexFLOC0Ogi3Q==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } } } diff --git a/package.json b/package.json index 4056e2e..67d7a79 100644 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "redux": "^5.0.1" }, "devDependencies": { + "@chakra-ui/cli": "^3.21.1", "@eslint/js": "^9.25.0", "@types/react": "^19.1.2", "@types/react-dom": "^19.1.2", diff --git a/src/Layout.jsx b/src/Layout.jsx index 6385412..6719e4b 100644 --- a/src/Layout.jsx +++ b/src/Layout.jsx @@ -1,7 +1,6 @@ import React, { useEffect } from 'react' import { useDispatch } from 'react-redux' import { Outlet, useNavigate } from 'react-router'; -import "./core.css"; function Layout() { const dispatch = useDispatch(); diff --git a/src/components/Navbar.jsx b/src/components/Navbar.jsx index 74b29c8..81f1a02 100644 --- a/src/components/Navbar.jsx +++ b/src/components/Navbar.jsx @@ -1,30 +1,19 @@ import React, { useState } from 'react' import Sidebar from './Sidebar' -import { Avatar, Box, Button, Flex, Spacer, Text } from '@chakra-ui/react' +import { Avatar, Box, Button, Flex, Icon, Spacer, Text } from '@chakra-ui/react' import { FaHamburger } from 'react-icons/fa' function Navbar() { - return <> - - {/* */} - - - ArchAIve - - - - - {/* */} - - {/* {user ? ( - - ) : ( - <> - )} */} - - {/* */} - + return + + + ArchAIve + + + + + } export default Navbar \ No newline at end of file diff --git a/src/components/ui/accordion.jsx b/src/components/ui/accordion.jsx new file mode 100644 index 0000000..a0e86f8 --- /dev/null +++ b/src/components/ui/accordion.jsx @@ -0,0 +1,39 @@ +import { Accordion, HStack } from '@chakra-ui/react' +import * as React from 'react' +import { LuChevronDown } from 'react-icons/lu' + +export const AccordionItemTrigger = React.forwardRef( + function AccordionItemTrigger(props, ref) { + const { children, indicatorPlacement = 'end', ...rest } = props + return ( + + {indicatorPlacement === 'start' && ( + + + + )} + + {children} + + {indicatorPlacement === 'end' && ( + + + + )} + + ) + }, +) + +export const AccordionItemContent = React.forwardRef( + function AccordionItemContent(props, ref) { + return ( + + + + ) + }, +) + +export const AccordionRoot = Accordion.Root +export const AccordionItem = Accordion.Item diff --git a/src/components/ui/action-bar.jsx b/src/components/ui/action-bar.jsx new file mode 100644 index 0000000..450f11b --- /dev/null +++ b/src/components/ui/action-bar.jsx @@ -0,0 +1,33 @@ +import { ActionBar, Portal } from '@chakra-ui/react' +import { CloseButton } from './close-button' +import * as React from 'react' + +export const ActionBarContent = React.forwardRef( + function ActionBarContent(props, ref) { + const { children, portalled = true, portalRef, ...rest } = props + + return ( + + + + {children} + + + + ) + }, +) + +export const ActionBarCloseTrigger = React.forwardRef( + function ActionBarCloseTrigger(props, ref) { + return ( + + + + ) + }, +) + +export const ActionBarRoot = ActionBar.Root +export const ActionBarSelectionTrigger = ActionBar.SelectionTrigger +export const ActionBarSeparator = ActionBar.Separator diff --git a/src/components/ui/alert.jsx b/src/components/ui/alert.jsx new file mode 100644 index 0000000..ba74303 --- /dev/null +++ b/src/components/ui/alert.jsx @@ -0,0 +1,20 @@ +import { Alert as ChakraAlert } from '@chakra-ui/react' +import * as React from 'react' + +export const Alert = React.forwardRef(function Alert(props, ref) { + const { title, children, icon, startElement, endElement, ...rest } = props + return ( + + {startElement || {icon}} + {children ? ( + + {title} + {children} + + ) : ( + {title} + )} + {endElement} + + ) +}) diff --git a/src/components/ui/avatar.jsx b/src/components/ui/avatar.jsx new file mode 100644 index 0000000..9321b39 --- /dev/null +++ b/src/components/ui/avatar.jsx @@ -0,0 +1,21 @@ +import { + Avatar as ChakraAvatar, + AvatarGroup as ChakraAvatarGroup, +} from '@chakra-ui/react' +import * as React from 'react' + +export const Avatar = React.forwardRef(function Avatar(props, ref) { + const { name, src, srcSet, loading, icon, fallback, children, ...rest } = + props + return ( + + + {icon || fallback} + + + {children} + + ) +}) + +export const AvatarGroup = ChakraAvatarGroup diff --git a/src/components/ui/blockquote.jsx b/src/components/ui/blockquote.jsx new file mode 100644 index 0000000..31bbf46 --- /dev/null +++ b/src/components/ui/blockquote.jsx @@ -0,0 +1,22 @@ +import { Blockquote as ChakraBlockquote } from '@chakra-ui/react' +import * as React from 'react' + +export const Blockquote = React.forwardRef(function Blockquote(props, ref) { + const { children, cite, citeUrl, showDash, icon, ...rest } = props + + return ( + + {icon} + + {children} + + {cite && ( + + {showDash ? <>— : null} {cite} + + )} + + ) +}) + +export const BlockquoteIcon = ChakraBlockquote.Icon diff --git a/src/components/ui/breadcrumb.jsx b/src/components/ui/breadcrumb.jsx new file mode 100644 index 0000000..af9c4d0 --- /dev/null +++ b/src/components/ui/breadcrumb.jsx @@ -0,0 +1,34 @@ +import { Breadcrumb } from '@chakra-ui/react' +import * as React from 'react' + +export const BreadcrumbRoot = React.forwardRef( + function BreadcrumbRoot(props, ref) { + const { separator, separatorGap, children, ...rest } = props + + const validChildren = React.Children.toArray(children).filter( + React.isValidElement, + ) + + return ( + + + {validChildren.map((child, index) => { + const last = index === validChildren.length - 1 + return ( + + {child} + {!last && ( + {separator} + )} + + ) + })} + + + ) + }, +) + +export const BreadcrumbLink = Breadcrumb.Link +export const BreadcrumbCurrentLink = Breadcrumb.CurrentLink +export const BreadcrumbEllipsis = Breadcrumb.Ellipsis diff --git a/src/components/ui/checkbox-card.jsx b/src/components/ui/checkbox-card.jsx new file mode 100644 index 0000000..e00ed62 --- /dev/null +++ b/src/components/ui/checkbox-card.jsx @@ -0,0 +1,45 @@ +import { CheckboxCard as ChakraCheckboxCard } from '@chakra-ui/react' +import * as React from 'react' + +export const CheckboxCard = React.forwardRef(function CheckboxCard(props, ref) { + const { + inputProps, + label, + description, + icon, + addon, + indicator = , + indicatorPlacement = 'end', + ...rest + } = props + + const hasContent = label || description || icon + const ContentWrapper = indicator ? ChakraCheckboxCard.Content : React.Fragment + + return ( + + + + {indicatorPlacement === 'start' && indicator} + {hasContent && ( + + {icon} + {label && ( + {label} + )} + {description && ( + + {description} + + )} + {indicatorPlacement === 'inside' && indicator} + + )} + {indicatorPlacement === 'end' && indicator} + + {addon && {addon}} + + ) +}) + +export const CheckboxCardIndicator = ChakraCheckboxCard.Indicator diff --git a/src/components/ui/checkbox.jsx b/src/components/ui/checkbox.jsx new file mode 100644 index 0000000..78ff43a --- /dev/null +++ b/src/components/ui/checkbox.jsx @@ -0,0 +1,17 @@ +import { Checkbox as ChakraCheckbox } from '@chakra-ui/react' +import * as React from 'react' + +export const Checkbox = React.forwardRef(function Checkbox(props, ref) { + const { icon, children, inputProps, rootRef, ...rest } = props + return ( + + + + {icon || } + + {children != null && ( + {children} + )} + + ) +}) diff --git a/src/components/ui/clipboard.jsx b/src/components/ui/clipboard.jsx new file mode 100644 index 0000000..2b98420 --- /dev/null +++ b/src/components/ui/clipboard.jsx @@ -0,0 +1,101 @@ +import { + Button, + Clipboard as ChakraClipboard, + IconButton, + Input, +} from '@chakra-ui/react' +import * as React from 'react' +import { LuCheck, LuClipboard, LuLink } from 'react-icons/lu' + +const ClipboardIcon = React.forwardRef(function ClipboardIcon(props, ref) { + return ( + } {...props} ref={ref}> + + + ) +}) + +const ClipboardCopyText = React.forwardRef( + function ClipboardCopyText(props, ref) { + return ( + + Copy + + ) + }, +) + +export const ClipboardLabel = React.forwardRef( + function ClipboardLabel(props, ref) { + return ( + + ) + }, +) + +export const ClipboardButton = React.forwardRef( + function ClipboardButton(props, ref) { + return ( + + + + ) + }, +) + +export const ClipboardLink = React.forwardRef( + function ClipboardLink(props, ref) { + return ( + + + + ) + }, +) + +export const ClipboardIconButton = React.forwardRef( + function ClipboardIconButton(props, ref) { + return ( + + + + + + + ) + }, +) + +export const ClipboardInput = React.forwardRef( + function ClipboardInputElement(props, ref) { + return ( + + + + ) + }, +) + +export const ClipboardRoot = ChakraClipboard.Root diff --git a/src/components/ui/close-button.jsx b/src/components/ui/close-button.jsx new file mode 100644 index 0000000..07d3631 --- /dev/null +++ b/src/components/ui/close-button.jsx @@ -0,0 +1,20 @@ +function _nullishCoalesce(lhs, rhsFn) { + if (lhs != null) { + return lhs + } else { + return rhsFn() + } +} +import { IconButton as ChakraIconButton } from '@chakra-ui/react' +import * as React from 'react' +import { LuX } from 'react-icons/lu' + +export const CloseButton = React.forwardRef(function CloseButton(props, ref) { + return ( + + {_nullishCoalesce(props.children, () => ( + + ))} + + ) +}) diff --git a/src/components/ui/color-picker.jsx b/src/components/ui/color-picker.jsx new file mode 100644 index 0000000..c997bb5 --- /dev/null +++ b/src/components/ui/color-picker.jsx @@ -0,0 +1,201 @@ +import { + ColorPicker as ChakraColorPicker, + For, + IconButton, + Portal, + Span, + Stack, + Text, + VStack, +} from '@chakra-ui/react' +import * as React from 'react' +import { LuCheck, LuPipette } from 'react-icons/lu' + +export const ColorPickerTrigger = React.forwardRef( + function ColorPickerTrigger(props, ref) { + const { fitContent, ...rest } = props + return ( + + {props.children || } + + ) + }, +) + +export const ColorPickerInput = React.forwardRef( + function ColorHexInput(props, ref) { + return + }, +) + +export const ColorPickerContent = React.forwardRef( + function ColorPickerContent(props, ref) { + const { portalled = true, portalRef, ...rest } = props + return ( + + + + + + ) + }, +) + +export const ColorPickerInlineContent = React.forwardRef( + function ColorPickerInlineContent(props, ref) { + return ( + + ) + }, +) + +export const ColorPickerSliders = React.forwardRef( + function ColorPickerSliders(props, ref) { + return ( + + + + + ) + }, +) + +export const ColorPickerArea = React.forwardRef( + function ColorPickerArea(props, ref) { + return ( + + + + + ) + }, +) + +export const ColorPickerEyeDropper = React.forwardRef( + function ColorPickerEyeDropper(props, ref) { + return ( + + + + + + ) + }, +) + +export const ColorPickerChannelSlider = React.forwardRef( + function ColorPickerSlider(props, ref) { + return ( + + + + + + ) + }, +) + +export const ColorPickerSwatchTrigger = React.forwardRef( + function ColorPickerSwatchTrigger(props, ref) { + const { swatchSize, children, ...rest } = props + return ( + + {children || ( + + + + + + )} + + ) + }, +) + +export const ColorPickerRoot = React.forwardRef( + function ColorPickerRoot(props, ref) { + return ( + + {props.children} + + + ) + }, +) + +const formatMap = { + rgba: ['red', 'green', 'blue', 'alpha'], + hsla: ['hue', 'saturation', 'lightness', 'alpha'], + hsba: ['hue', 'saturation', 'brightness', 'alpha'], + hexa: ['hex', 'alpha'], +} + +export const ColorPickerChannelInputs = React.forwardRef( + function ColorPickerChannelInputs(props, ref) { + const channels = formatMap[props.format] + return ( + + {channels.map((channel) => ( + + + + {channel.charAt(0).toUpperCase()} + + + ))} + + ) + }, +) + +export const ColorPickerChannelSliders = React.forwardRef( + function ColorPickerChannelSliders(props, ref) { + const channels = formatMap[props.format] + return ( + + + {(channel) => ( + + + {channel} + + + + )} + + + ) + }, +) + +export const ColorPickerLabel = ChakraColorPicker.Label +export const ColorPickerControl = ChakraColorPicker.Control +export const ColorPickerValueText = ChakraColorPicker.ValueText +export const ColorPickerValueSwatch = ChakraColorPicker.ValueSwatch +export const ColorPickerChannelInput = ChakraColorPicker.ChannelInput +export const ColorPickerSwatchGroup = ChakraColorPicker.SwatchGroup diff --git a/src/components/ui/data-list.jsx b/src/components/ui/data-list.jsx new file mode 100644 index 0000000..8ad0000 --- /dev/null +++ b/src/components/ui/data-list.jsx @@ -0,0 +1,21 @@ +import { DataList as ChakraDataList } from '@chakra-ui/react' +import { InfoTip } from './toggle-tip' +import * as React from 'react' + +export const DataListRoot = ChakraDataList.Root + +export const DataListItem = React.forwardRef(function DataListItem(props, ref) { + const { label, info, value, children, grow, ...rest } = props + return ( + + + {label} + {info && {info}} + + + {value} + + {children} + + ) +}) diff --git a/src/components/ui/dialog.jsx b/src/components/ui/dialog.jsx new file mode 100644 index 0000000..4558ec1 --- /dev/null +++ b/src/components/ui/dialog.jsx @@ -0,0 +1,54 @@ +import { Dialog as ChakraDialog, Portal } from '@chakra-ui/react' +import { CloseButton } from './close-button' +import * as React from 'react' + +export const DialogContent = React.forwardRef( + function DialogContent(props, ref) { + const { + children, + portalled = true, + portalRef, + backdrop = true, + ...rest + } = props + + return ( + + {backdrop && } + + + {children} + + + + ) + }, +) + +export const DialogCloseTrigger = React.forwardRef( + function DialogCloseTrigger(props, ref) { + return ( + + + {props.children} + + + ) + }, +) + +export const DialogRoot = ChakraDialog.Root +export const DialogFooter = ChakraDialog.Footer +export const DialogHeader = ChakraDialog.Header +export const DialogBody = ChakraDialog.Body +export const DialogBackdrop = ChakraDialog.Backdrop +export const DialogTitle = ChakraDialog.Title +export const DialogDescription = ChakraDialog.Description +export const DialogTrigger = ChakraDialog.Trigger +export const DialogActionTrigger = ChakraDialog.ActionTrigger diff --git a/src/components/ui/drawer.jsx b/src/components/ui/drawer.jsx new file mode 100644 index 0000000..6c51d29 --- /dev/null +++ b/src/components/ui/drawer.jsx @@ -0,0 +1,44 @@ +import { Drawer as ChakraDrawer, Portal } from '@chakra-ui/react' +import { CloseButton } from './close-button' +import * as React from 'react' + +export const DrawerContent = React.forwardRef( + function DrawerContent(props, ref) { + const { children, portalled = true, portalRef, offset, ...rest } = props + return ( + + + + {children} + + + + ) + }, +) + +export const DrawerCloseTrigger = React.forwardRef( + function DrawerCloseTrigger(props, ref) { + return ( + + + + ) + }, +) + +export const DrawerTrigger = ChakraDrawer.Trigger +export const DrawerRoot = ChakraDrawer.Root +export const DrawerFooter = ChakraDrawer.Footer +export const DrawerHeader = ChakraDrawer.Header +export const DrawerBody = ChakraDrawer.Body +export const DrawerBackdrop = ChakraDrawer.Backdrop +export const DrawerDescription = ChakraDrawer.Description +export const DrawerTitle = ChakraDrawer.Title +export const DrawerActionTrigger = ChakraDrawer.ActionTrigger diff --git a/src/components/ui/empty-state.jsx b/src/components/ui/empty-state.jsx new file mode 100644 index 0000000..8e87fac --- /dev/null +++ b/src/components/ui/empty-state.jsx @@ -0,0 +1,26 @@ +import { EmptyState as ChakraEmptyState, VStack } from '@chakra-ui/react' +import * as React from 'react' + +export const EmptyState = React.forwardRef(function EmptyState(props, ref) { + const { title, description, icon, children, ...rest } = props + return ( + + + {icon && ( + {icon} + )} + {description ? ( + + {title} + + {description} + + + ) : ( + {title} + )} + {children} + + + ) +}) diff --git a/src/components/ui/field.jsx b/src/components/ui/field.jsx new file mode 100644 index 0000000..d890c88 --- /dev/null +++ b/src/components/ui/field.jsx @@ -0,0 +1,22 @@ +import { Field as ChakraField } from '@chakra-ui/react' +import * as React from 'react' + +export const Field = React.forwardRef(function Field(props, ref) { + const { label, children, helperText, errorText, optionalText, ...rest } = + props + return ( + + {label && ( + + {label} + + + )} + {children} + {helperText && ( + {helperText} + )} + {errorText && {errorText}} + + ) +}) diff --git a/src/components/ui/file-upload.jsx b/src/components/ui/file-upload.jsx new file mode 100644 index 0000000..6b8c8da --- /dev/null +++ b/src/components/ui/file-upload.jsx @@ -0,0 +1,141 @@ +function _nullishCoalesce(lhs, rhsFn) { + if (lhs != null) { + return lhs + } else { + return rhsFn() + } +} +;('use client') + +import { + Button, + FileUpload as ChakraFileUpload, + Icon, + IconButton, + Span, + Text, + useFileUploadContext, + useRecipe, +} from '@chakra-ui/react' +import * as React from 'react' +import { LuFile, LuUpload, LuX } from 'react-icons/lu' + +export const FileUploadRoot = React.forwardRef( + function FileUploadRoot(props, ref) { + const { children, inputProps, ...rest } = props + return ( + + + {children} + + ) + }, +) + +export const FileUploadDropzone = React.forwardRef( + function FileUploadDropzone(props, ref) { + const { children, label, description, ...rest } = props + return ( + + + + + +
{label}
+ {description && {description}} +
+ {children} +
+ ) + }, +) + +const FileUploadItem = React.forwardRef(function FileUploadItem(props, ref) { + const { file, showSize, clearable } = props + return ( + + + + + + + + {showSize ? ( + + + + + ) : ( + + )} + + {clearable && ( + + + + + + )} + + ) +}) + +export const FileUploadList = React.forwardRef( + function FileUploadList(props, ref) { + const { showSize, clearable, files, ...rest } = props + + const fileUpload = useFileUploadContext() + const acceptedFiles = _nullishCoalesce( + files, + () => fileUpload.acceptedFiles, + ) + + if (acceptedFiles.length === 0) return null + + return ( + + {acceptedFiles.map((file) => ( + + ))} + + ) + }, +) + +export const FileInput = React.forwardRef(function FileInput(props, ref) { + const inputRecipe = useRecipe({ key: 'input' }) + const [recipeProps, restProps] = inputRecipe.splitVariantProps(props) + const { placeholder = 'Select file(s)', ...rest } = restProps + return ( + + + + ) +}) + +export const FileUploadLabel = ChakraFileUpload.Label +export const FileUploadClearTrigger = ChakraFileUpload.ClearTrigger +export const FileUploadTrigger = ChakraFileUpload.Trigger diff --git a/src/components/ui/hover-card.jsx b/src/components/ui/hover-card.jsx new file mode 100644 index 0000000..1dd4b18 --- /dev/null +++ b/src/components/ui/hover-card.jsx @@ -0,0 +1,29 @@ +import { HoverCard, Portal } from '@chakra-ui/react' +import * as React from 'react' + +export const HoverCardContent = React.forwardRef( + function HoverCardContent(props, ref) { + const { portalled = true, portalRef, ...rest } = props + + return ( + + + + + + ) + }, +) + +export const HoverCardArrow = React.forwardRef( + function HoverCardArrow(props, ref) { + return ( + + + + ) + }, +) + +export const HoverCardRoot = HoverCard.Root +export const HoverCardTrigger = HoverCard.Trigger diff --git a/src/components/ui/input-group.jsx b/src/components/ui/input-group.jsx new file mode 100644 index 0000000..46d83b2 --- /dev/null +++ b/src/components/ui/input-group.jsx @@ -0,0 +1,39 @@ +import { Group, InputElement } from '@chakra-ui/react' +import * as React from 'react' + +export const InputGroup = React.forwardRef(function InputGroup(props, ref) { + const { + startElement, + startElementProps, + endElement, + endElementProps, + children, + startOffset = '6px', + endOffset = '6px', + ...rest + } = props + + const child = React.Children.only(children) + + return ( + + {startElement && ( + + {startElement} + + )} + {React.cloneElement(child, { + ...(startElement && { + ps: `calc(var(--input-height) - ${startOffset})`, + }), + ...(endElement && { pe: `calc(var(--input-height) - ${endOffset})` }), + ...children.props, + })} + {endElement && ( + + {endElement} + + )} + + ) +}) diff --git a/src/components/ui/link-button.jsx b/src/components/ui/link-button.jsx new file mode 100644 index 0000000..23ca046 --- /dev/null +++ b/src/components/ui/link-button.jsx @@ -0,0 +1,8 @@ +'use client' + +import { createRecipeContext } from '@chakra-ui/react' + +const { withContext } = createRecipeContext({ key: 'button' }) + +// Replace "a" with your framework's link component +export const LinkButton = withContext('a') diff --git a/src/components/ui/menu.jsx b/src/components/ui/menu.jsx new file mode 100644 index 0000000..68c1a8b --- /dev/null +++ b/src/components/ui/menu.jsx @@ -0,0 +1,94 @@ +'use client' + +import { AbsoluteCenter, Menu as ChakraMenu, Portal } from '@chakra-ui/react' +import * as React from 'react' +import { LuCheck, LuChevronRight } from 'react-icons/lu' + +export const MenuContent = React.forwardRef(function MenuContent(props, ref) { + const { portalled = true, portalRef, ...rest } = props + return ( + + + + + + ) +}) + +export const MenuArrow = React.forwardRef(function MenuArrow(props, ref) { + return ( + + + + ) +}) + +export const MenuCheckboxItem = React.forwardRef( + function MenuCheckboxItem(props, ref) { + return ( + + + + + + + {props.children} + + ) + }, +) + +export const MenuRadioItem = React.forwardRef( + function MenuRadioItem(props, ref) { + const { children, ...rest } = props + return ( + + + + + + + {children} + + ) + }, +) + +export const MenuItemGroup = React.forwardRef( + function MenuItemGroup(props, ref) { + const { title, children, ...rest } = props + return ( + + {title && ( + + {title} + + )} + {children} + + ) + }, +) + +export const MenuTriggerItem = React.forwardRef( + function MenuTriggerItem(props, ref) { + const { startIcon, children, ...rest } = props + return ( + + {startIcon} + {children} + + + ) + }, +) + +export const MenuRadioItemGroup = ChakraMenu.RadioItemGroup +export const MenuContextTrigger = ChakraMenu.ContextTrigger +export const MenuRoot = ChakraMenu.Root +export const MenuSeparator = ChakraMenu.Separator + +export const MenuItem = ChakraMenu.Item +export const MenuItemText = ChakraMenu.ItemText +export const MenuItemCommand = ChakraMenu.ItemCommand +export const MenuTrigger = ChakraMenu.Trigger diff --git a/src/components/ui/native-select.jsx b/src/components/ui/native-select.jsx new file mode 100644 index 0000000..40e099e --- /dev/null +++ b/src/components/ui/native-select.jsx @@ -0,0 +1,80 @@ +function _optionalChain(ops) { + let lastAccessLHS = undefined + let value = ops[0] + let i = 1 + while (i < ops.length) { + const op = ops[i] + const fn = ops[i + 1] + i += 2 + if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { + return undefined + } + if (op === 'access' || op === 'optionalAccess') { + lastAccessLHS = value + value = fn(value) + } else if (op === 'call' || op === 'optionalCall') { + value = fn((...args) => value.call(lastAccessLHS, ...args)) + lastAccessLHS = undefined + } + } + return value +} +;('use client') + +import { NativeSelect as Select } from '@chakra-ui/react' +import * as React from 'react' + +export const NativeSelectRoot = React.forwardRef( + function NativeSelect(props, ref) { + const { icon, children, ...rest } = props + return ( + + {children} + {icon} + + ) + }, +) + +export const NativeSelectField = React.forwardRef( + function NativeSelectField(props, ref) { + const { items: itemsProp, children, ...rest } = props + + const items = React.useMemo( + () => + _optionalChain([ + itemsProp, + 'optionalAccess', + (_) => _.map, + 'call', + (_2) => + _2((item) => + typeof item === 'string' ? { label: item, value: item } : item, + ), + ]), + [itemsProp], + ) + + return ( + + {children} + {_optionalChain([ + items, + 'optionalAccess', + (_3) => _3.map, + 'call', + (_4) => + _4((item) => ( + + )), + ])} + + ) + }, +) diff --git a/src/components/ui/number-input.jsx b/src/components/ui/number-input.jsx new file mode 100644 index 0000000..e35fe51 --- /dev/null +++ b/src/components/ui/number-input.jsx @@ -0,0 +1,21 @@ +import { NumberInput as ChakraNumberInput } from '@chakra-ui/react' +import * as React from 'react' + +export const NumberInputRoot = React.forwardRef( + function NumberInput(props, ref) { + const { children, ...rest } = props + return ( + + {children} + + + + + + ) + }, +) + +export const NumberInputField = ChakraNumberInput.Input +export const NumberInputScrubber = ChakraNumberInput.Scrubber +export const NumberInputLabel = ChakraNumberInput.Label diff --git a/src/components/ui/pagination.jsx b/src/components/ui/pagination.jsx new file mode 100644 index 0000000..e84b1f2 --- /dev/null +++ b/src/components/ui/pagination.jsx @@ -0,0 +1,176 @@ +'use client' + +import { + Button, + Pagination as ChakraPagination, + IconButton, + Text, + createContext, + usePaginationContext, +} from '@chakra-ui/react' +import * as React from 'react' +import { + HiChevronLeft, + HiChevronRight, + HiMiniEllipsisHorizontal, +} from 'react-icons/hi2' +import { LinkButton } from './link-button' + +const [RootPropsProvider, useRootProps] = createContext({ + name: 'RootPropsProvider', +}) + +const variantMap = { + outline: { default: 'ghost', ellipsis: 'plain', current: 'outline' }, + solid: { default: 'outline', ellipsis: 'outline', current: 'solid' }, + subtle: { default: 'ghost', ellipsis: 'plain', current: 'subtle' }, +} + +export const PaginationRoot = React.forwardRef( + function PaginationRoot(props, ref) { + const { size = 'sm', variant = 'outline', getHref, ...rest } = props + return ( + + + + ) + }, +) + +export const PaginationEllipsis = React.forwardRef( + function PaginationEllipsis(props, ref) { + const { size, variantMap } = useRootProps() + return ( + + + + ) + }, +) + +export const PaginationItem = React.forwardRef( + function PaginationItem(props, ref) { + const { page } = usePaginationContext() + const { size, variantMap, getHref } = useRootProps() + + const current = page === props.value + const variant = current ? variantMap.current : variantMap.default + + if (getHref) { + return ( + + {props.value} + + ) + } + + return ( + + + + ) + }, +) + +export const PaginationPrevTrigger = React.forwardRef( + function PaginationPrevTrigger(props, ref) { + const { size, variantMap, getHref } = useRootProps() + const { previousPage } = usePaginationContext() + + if (getHref) { + return ( + + + + ) + } + + return ( + + + + + + ) + }, +) + +export const PaginationNextTrigger = React.forwardRef( + function PaginationNextTrigger(props, ref) { + const { size, variantMap, getHref } = useRootProps() + const { nextPage } = usePaginationContext() + + if (getHref) { + return ( + + + + ) + } + + return ( + + + + + + ) + }, +) + +export const PaginationItems = (props) => { + return ( + + {({ pages }) => + pages.map((page, index) => { + return page.type === 'ellipsis' ? ( + + ) : ( + + ) + }) + } + + ) +} + +export const PaginationPageText = React.forwardRef( + function PaginationPageText(props, ref) { + const { format = 'compact', ...rest } = props + const { page, totalPages, pageRange, count } = usePaginationContext() + const content = React.useMemo(() => { + if (format === 'short') return `${page} / ${totalPages}` + if (format === 'compact') return `${page} of ${totalPages}` + return `${pageRange.start + 1} - ${Math.min(pageRange.end, count)} of ${count}` + }, [format, page, totalPages, pageRange, count]) + + return ( + + {content} + + ) + }, +) diff --git a/src/components/ui/password-input.jsx b/src/components/ui/password-input.jsx new file mode 100644 index 0000000..95c082b --- /dev/null +++ b/src/components/ui/password-input.jsx @@ -0,0 +1,121 @@ +'use client' + +import { + Box, + HStack, + IconButton, + Input, + InputGroup, + Stack, + mergeRefs, + useControllableState, +} from '@chakra-ui/react' +import * as React from 'react' +import { LuEye, LuEyeOff } from 'react-icons/lu' + +export const PasswordInput = React.forwardRef( + function PasswordInput(props, ref) { + const { + rootProps, + defaultVisible, + visible: visibleProp, + onVisibleChange, + visibilityIcon = { on: , off: }, + ...rest + } = props + + const [visible, setVisible] = useControllableState({ + value: visibleProp, + defaultValue: defaultVisible || false, + onChange: onVisibleChange, + }) + + const inputRef = React.useRef(null) + + return ( + { + if (rest.disabled) return + if (e.button !== 0) return + e.preventDefault() + setVisible(!visible) + }} + > + {visible ? visibilityIcon.off : visibilityIcon.on} + + } + {...rootProps} + > + + + ) + }, +) + +const VisibilityTrigger = React.forwardRef( + function VisibilityTrigger(props, ref) { + return ( + + ) + }, +) + +export const PasswordStrengthMeter = React.forwardRef( + function PasswordStrengthMeter(props, ref) { + const { max = 4, value, ...rest } = props + + const percent = (value / max) * 100 + const { label, colorPalette } = getColorPalette(percent) + + return ( + + + {Array.from({ length: max }).map((_, index) => ( + + ))} + + {label && {label}} + + ) + }, +) + +function getColorPalette(percent) { + switch (true) { + case percent < 33: + return { label: 'Low', colorPalette: 'red' } + case percent < 66: + return { label: 'Medium', colorPalette: 'orange' } + default: + return { label: 'High', colorPalette: 'green' } + } +} diff --git a/src/components/ui/pin-input.jsx b/src/components/ui/pin-input.jsx new file mode 100644 index 0000000..7f2afcd --- /dev/null +++ b/src/components/ui/pin-input.jsx @@ -0,0 +1,18 @@ +import { PinInput as ChakraPinInput, Group } from '@chakra-ui/react' +import * as React from 'react' + +export const PinInput = React.forwardRef(function PinInput(props, ref) { + const { count = 4, inputProps, rootRef, attached, ...rest } = props + return ( + + + + + {Array.from({ length: count }).map((_, index) => ( + + ))} + + + + ) +}) diff --git a/src/components/ui/popover.jsx b/src/components/ui/popover.jsx new file mode 100644 index 0000000..6449eef --- /dev/null +++ b/src/components/ui/popover.jsx @@ -0,0 +1,49 @@ +import { Popover as ChakraPopover, Portal } from '@chakra-ui/react' +import { CloseButton } from './close-button' +import * as React from 'react' + +export const PopoverContent = React.forwardRef( + function PopoverContent(props, ref) { + const { portalled = true, portalRef, ...rest } = props + return ( + + + + + + ) + }, +) + +export const PopoverArrow = React.forwardRef(function PopoverArrow(props, ref) { + return ( + + + + ) +}) + +export const PopoverCloseTrigger = React.forwardRef( + function PopoverCloseTrigger(props, ref) { + return ( + + + + ) + }, +) + +export const PopoverTitle = ChakraPopover.Title +export const PopoverDescription = ChakraPopover.Description +export const PopoverFooter = ChakraPopover.Footer +export const PopoverHeader = ChakraPopover.Header +export const PopoverRoot = ChakraPopover.Root +export const PopoverBody = ChakraPopover.Body +export const PopoverTrigger = ChakraPopover.Trigger diff --git a/src/components/ui/progress-circle.jsx b/src/components/ui/progress-circle.jsx new file mode 100644 index 0000000..d709606 --- /dev/null +++ b/src/components/ui/progress-circle.jsx @@ -0,0 +1,29 @@ +import { + AbsoluteCenter, + ProgressCircle as ChakraProgressCircle, +} from '@chakra-ui/react' +import * as React from 'react' + +export const ProgressCircleRing = React.forwardRef( + function ProgressCircleRing(props, ref) { + const { trackColor, cap, color, ...rest } = props + return ( + + + + + ) + }, +) + +export const ProgressCircleValueText = React.forwardRef( + function ProgressCircleValueText(props, ref) { + return ( + + + + ) + }, +) + +export const ProgressCircleRoot = ChakraProgressCircle.Root diff --git a/src/components/ui/progress.jsx b/src/components/ui/progress.jsx new file mode 100644 index 0000000..300c0fb --- /dev/null +++ b/src/components/ui/progress.jsx @@ -0,0 +1,26 @@ +import { Progress as ChakraProgress } from '@chakra-ui/react' +import { InfoTip } from './toggle-tip' +import * as React from 'react' + +export const ProgressBar = React.forwardRef(function ProgressBar(props, ref) { + return ( + + + + ) +}) + +export const ProgressLabel = React.forwardRef( + function ProgressLabel(props, ref) { + const { children, info, ...rest } = props + return ( + + {children} + {info && {info}} + + ) + }, +) + +export const ProgressRoot = ChakraProgress.Root +export const ProgressValueText = ChakraProgress.ValueText diff --git a/src/components/ui/prose.jsx b/src/components/ui/prose.jsx new file mode 100644 index 0000000..c927a3f --- /dev/null +++ b/src/components/ui/prose.jsx @@ -0,0 +1,264 @@ +'use client' + +import { chakra } from '@chakra-ui/react' + +export const Prose = chakra('div', { + base: { + color: 'fg.muted', + maxWidth: '65ch', + fontSize: 'sm', + lineHeight: '1.7em', + '& p': { + marginTop: '1em', + marginBottom: '1em', + }, + '& blockquote': { + marginTop: '1.285em', + marginBottom: '1.285em', + paddingInline: '1.285em', + borderInlineStartWidth: '0.25em', + }, + '& a': { + color: 'fg', + textDecoration: 'underline', + textUnderlineOffset: '3px', + textDecorationThickness: '2px', + textDecorationColor: 'border.muted', + fontWeight: '500', + }, + '& strong': { + fontWeight: '600', + }, + '& a strong': { + color: 'inherit', + }, + '& h1': { + fontSize: '2.15em', + letterSpacing: '-0.02em', + marginTop: '0', + marginBottom: '0.8em', + lineHeight: '1.2em', + }, + '& h2': { + fontSize: '1.4em', + letterSpacing: '-0.02em', + marginTop: '1.6em', + marginBottom: '0.8em', + lineHeight: '1.4em', + }, + '& h3': { + fontSize: '1.285em', + letterSpacing: '-0.01em', + marginTop: '1.5em', + marginBottom: '0.4em', + lineHeight: '1.5em', + }, + '& h4': { + marginTop: '1.4em', + marginBottom: '0.5em', + letterSpacing: '-0.01em', + lineHeight: '1.5em', + }, + '& img': { + marginTop: '1.7em', + marginBottom: '1.7em', + borderRadius: 'lg', + boxShadow: 'inset', + }, + '& picture': { + marginTop: '1.7em', + marginBottom: '1.7em', + }, + '& picture > img': { + marginTop: '0', + marginBottom: '0', + }, + '& video': { + marginTop: '1.7em', + marginBottom: '1.7em', + }, + '& kbd': { + fontSize: '0.85em', + borderRadius: 'xs', + paddingTop: '0.15em', + paddingBottom: '0.15em', + paddingInlineEnd: '0.35em', + paddingInlineStart: '0.35em', + fontFamily: 'inherit', + color: 'fg.muted', + '--shadow': 'colors.border', + boxShadow: '0 0 0 1px var(--shadow),0 1px 0 1px var(--shadow)', + }, + '& code': { + fontSize: '0.925em', + letterSpacing: '-0.01em', + borderRadius: 'md', + borderWidth: '1px', + padding: '0.25em', + }, + '& pre code': { + fontSize: 'inherit', + letterSpacing: 'inherit', + borderWidth: 'inherit', + padding: '0', + }, + '& h2 code': { + fontSize: '0.9em', + }, + '& h3 code': { + fontSize: '0.8em', + }, + '& pre': { + backgroundColor: 'bg.subtle', + marginTop: '1.6em', + marginBottom: '1.6em', + borderRadius: 'md', + fontSize: '0.9em', + paddingTop: '0.65em', + paddingBottom: '0.65em', + paddingInlineEnd: '1em', + paddingInlineStart: '1em', + overflowX: 'auto', + fontWeight: '400', + }, + '& ol': { + marginTop: '1em', + marginBottom: '1em', + paddingInlineStart: '1.5em', + }, + '& ul': { + marginTop: '1em', + marginBottom: '1em', + paddingInlineStart: '1.5em', + }, + '& li': { + marginTop: '0.285em', + marginBottom: '0.285em', + }, + '& ol > li': { + paddingInlineStart: '0.4em', + listStyleType: 'decimal', + '&::marker': { + color: 'fg.muted', + }, + }, + '& ul > li': { + paddingInlineStart: '0.4em', + listStyleType: 'disc', + '&::marker': { + color: 'fg.muted', + }, + }, + '& > ul > li p': { + marginTop: '0.5em', + marginBottom: '0.5em', + }, + '& > ul > li > p:first-of-type': { + marginTop: '1em', + }, + '& > ul > li > p:last-of-type': { + marginBottom: '1em', + }, + '& > ol > li > p:first-of-type': { + marginTop: '1em', + }, + '& > ol > li > p:last-of-type': { + marginBottom: '1em', + }, + '& ul ul, ul ol, ol ul, ol ol': { + marginTop: '0.5em', + marginBottom: '0.5em', + }, + '& dl': { + marginTop: '1em', + marginBottom: '1em', + }, + '& dt': { + fontWeight: '600', + marginTop: '1em', + }, + '& dd': { + marginTop: '0.285em', + paddingInlineStart: '1.5em', + }, + '& hr': { + marginTop: '2.25em', + marginBottom: '2.25em', + }, + '& :is(h1,h2,h3,h4,h5,hr) + *': { + marginTop: '0', + }, + '& table': { + width: '100%', + tableLayout: 'auto', + textAlign: 'start', + lineHeight: '1.5em', + marginTop: '2em', + marginBottom: '2em', + }, + '& thead': { + borderBottomWidth: '1px', + color: 'fg', + }, + '& tbody tr': { + borderBottomWidth: '1px', + borderBottomColor: 'border', + }, + '& thead th': { + paddingInlineEnd: '1em', + paddingBottom: '0.65em', + paddingInlineStart: '1em', + fontWeight: 'medium', + textAlign: 'start', + }, + '& thead th:first-of-type': { + paddingInlineStart: '0', + }, + '& thead th:last-of-type': { + paddingInlineEnd: '0', + }, + '& tbody td, tfoot td': { + paddingTop: '0.65em', + paddingInlineEnd: '1em', + paddingBottom: '0.65em', + paddingInlineStart: '1em', + }, + '& tbody td:first-of-type, tfoot td:first-of-type': { + paddingInlineStart: '0', + }, + '& tbody td:last-of-type, tfoot td:last-of-type': { + paddingInlineEnd: '0', + }, + '& figure': { + marginTop: '1.625em', + marginBottom: '1.625em', + }, + '& figure > *': { + marginTop: '0', + marginBottom: '0', + }, + '& figcaption': { + fontSize: '0.85em', + lineHeight: '1.25em', + marginTop: '0.85em', + color: 'fg.muted', + }, + '& h1, h2, h3, h4': { + color: 'fg', + fontWeight: '600', + }, + }, + variants: { + size: { + md: { + fontSize: 'sm', + }, + lg: { + fontSize: 'md', + }, + }, + }, + defaultVariants: { + size: 'md', + }, +}) diff --git a/src/components/ui/qr-code.jsx b/src/components/ui/qr-code.jsx new file mode 100644 index 0000000..91a20b1 --- /dev/null +++ b/src/components/ui/qr-code.jsx @@ -0,0 +1,15 @@ +import { QrCode as ChakraQrCode } from '@chakra-ui/react' +import * as React from 'react' + +export const QrCode = React.forwardRef(function QrCode(props, ref) { + const { children, fill, overlay, ...rest } = props + return ( + + + + + {overlay} + {children && {children}} + + ) +}) diff --git a/src/components/ui/radio-card.jsx b/src/components/ui/radio-card.jsx new file mode 100644 index 0000000..a0786b3 --- /dev/null +++ b/src/components/ui/radio-card.jsx @@ -0,0 +1,47 @@ +import { RadioCard } from '@chakra-ui/react' +import * as React from 'react' + +export const RadioCardItem = React.forwardRef( + function RadioCardItem(props, ref) { + const { + inputProps, + label, + description, + addon, + icon, + indicator = , + indicatorPlacement = 'end', + ...rest + } = props + + const hasContent = label || description || icon + const ContentWrapper = indicator ? RadioCard.ItemContent : React.Fragment + + return ( + + + + {indicatorPlacement === 'start' && indicator} + {hasContent && ( + + {icon} + {label && {label}} + {description && ( + + {description} + + )} + {indicatorPlacement === 'inside' && indicator} + + )} + {indicatorPlacement === 'end' && indicator} + + {addon && {addon}} + + ) + }, +) + +export const RadioCardRoot = RadioCard.Root +export const RadioCardLabel = RadioCard.Label +export const RadioCardItemIndicator = RadioCard.ItemIndicator diff --git a/src/components/ui/radio.jsx b/src/components/ui/radio.jsx new file mode 100644 index 0000000..8058902 --- /dev/null +++ b/src/components/ui/radio.jsx @@ -0,0 +1,17 @@ +import { RadioGroup as ChakraRadioGroup } from '@chakra-ui/react' +import * as React from 'react' + +export const Radio = React.forwardRef(function Radio(props, ref) { + const { children, inputProps, rootRef, ...rest } = props + return ( + + + + {children && ( + {children} + )} + + ) +}) + +export const RadioGroup = ChakraRadioGroup.Root diff --git a/src/components/ui/rating.jsx b/src/components/ui/rating.jsx new file mode 100644 index 0000000..399c7d0 --- /dev/null +++ b/src/components/ui/rating.jsx @@ -0,0 +1,19 @@ +import { RatingGroup } from '@chakra-ui/react' +import * as React from 'react' + +export const Rating = React.forwardRef(function Rating(props, ref) { + const { icon, count = 5, label, ...rest } = props + return ( + + {label && {label}} + + + {Array.from({ length: count }).map((_, index) => ( + + + + ))} + + + ) +}) diff --git a/src/components/ui/segmented-control.jsx b/src/components/ui/segmented-control.jsx new file mode 100644 index 0000000..00ce604 --- /dev/null +++ b/src/components/ui/segmented-control.jsx @@ -0,0 +1,36 @@ +'use client' + +import { For, SegmentGroup } from '@chakra-ui/react' +import * as React from 'react' + +function normalize(items) { + return items.map((item) => { + if (typeof item === 'string') return { value: item, label: item } + return item + }) +} + +export const SegmentedControl = React.forwardRef( + function SegmentedControl(props, ref) { + const { items, ...rest } = props + const data = React.useMemo(() => normalize(items), [items]) + + return ( + + + + {(item) => ( + + {item.label} + + + )} + + + ) + }, +) diff --git a/src/components/ui/select.jsx b/src/components/ui/select.jsx new file mode 100644 index 0000000..ed02fe2 --- /dev/null +++ b/src/components/ui/select.jsx @@ -0,0 +1,113 @@ +'use client' + +import { Select as ChakraSelect, Portal } from '@chakra-ui/react' +import { CloseButton } from './close-button' +import * as React from 'react' + +export const SelectTrigger = React.forwardRef( + function SelectTrigger(props, ref) { + const { children, clearable, ...rest } = props + return ( + + {children} + + {clearable && } + + + + ) + }, +) + +const SelectClearTrigger = React.forwardRef( + function SelectClearTrigger(props, ref) { + return ( + + + + ) + }, +) + +export const SelectContent = React.forwardRef( + function SelectContent(props, ref) { + const { portalled = true, portalRef, ...rest } = props + return ( + + + + + + ) + }, +) + +export const SelectItem = React.forwardRef(function SelectItem(props, ref) { + const { item, children, ...rest } = props + return ( + + {children} + + + ) +}) + +export const SelectValueText = React.forwardRef( + function SelectValueText(props, ref) { + const { children, ...rest } = props + return ( + + + {(select) => { + const items = select.selectedItems + if (items.length === 0) return props.placeholder + if (children) return children(items) + if (items.length === 1) + return select.collection.stringifyItem(items[0]) + return `${items.length} selected` + }} + + + ) + }, +) + +export const SelectRoot = React.forwardRef(function SelectRoot(props, ref) { + return ( + + {props.asChild ? ( + props.children + ) : ( + <> + + {props.children} + + )} + + ) +}) + +export const SelectItemGroup = React.forwardRef( + function SelectItemGroup(props, ref) { + const { children, label, ...rest } = props + return ( + + {label} + {children} + + ) + }, +) + +export const SelectLabel = ChakraSelect.Label +export const SelectItemText = ChakraSelect.ItemText diff --git a/src/components/ui/skeleton.jsx b/src/components/ui/skeleton.jsx new file mode 100644 index 0000000..8195fa1 --- /dev/null +++ b/src/components/ui/skeleton.jsx @@ -0,0 +1,32 @@ +import { Skeleton as ChakraSkeleton, Circle, Stack } from '@chakra-ui/react' +import * as React from 'react' + +export const SkeletonCircle = React.forwardRef( + function SkeletonCircle(props, ref) { + const { size, ...rest } = props + return ( + + + + ) + }, +) + +export const SkeletonText = React.forwardRef(function SkeletonText(props, ref) { + const { noOfLines = 3, gap, ...rest } = props + return ( + + {Array.from({ length: noOfLines }).map((_, index) => ( + + ))} + + ) +}) + +export const Skeleton = ChakraSkeleton diff --git a/src/components/ui/slider.jsx b/src/components/ui/slider.jsx new file mode 100644 index 0000000..35e3659 --- /dev/null +++ b/src/components/ui/slider.jsx @@ -0,0 +1,107 @@ +function _nullishCoalesce(lhs, rhsFn) { + if (lhs != null) { + return lhs + } else { + return rhsFn() + } +} +function _optionalChain(ops) { + let lastAccessLHS = undefined + let value = ops[0] + let i = 1 + while (i < ops.length) { + const op = ops[i] + const fn = ops[i + 1] + i += 2 + if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { + return undefined + } + if (op === 'access' || op === 'optionalAccess') { + lastAccessLHS = value + value = fn(value) + } else if (op === 'call' || op === 'optionalCall') { + value = fn((...args) => value.call(lastAccessLHS, ...args)) + lastAccessLHS = undefined + } + } + return value +} +import { Slider as ChakraSlider, For, HStack } from '@chakra-ui/react' +import * as React from 'react' + +export const Slider = React.forwardRef(function Slider(props, ref) { + const { marks: marksProp, label, showValue, ...rest } = props + const value = _nullishCoalesce(props.defaultValue, () => props.value) + + const marks = _optionalChain([ + marksProp, + 'optionalAccess', + (_2) => _2.map, + 'call', + (_3) => + _3((mark) => { + if (typeof mark === 'number') return { value: mark, label: undefined } + return mark + }), + ]) + + const hasMarkLabel = !!_optionalChain([ + marks, + 'optionalAccess', + (_4) => _4.some, + 'call', + (_5) => _5((mark) => mark.label), + ]) + + return ( + + {label && !showValue && {label}} + {label && showValue && ( + + {label} + + + )} + + + + + + + + + ) +}) + +function SliderThumbs(props) { + const { value } = props + return ( + + {(_, index) => ( + + + + )} + + ) +} + +const SliderMarks = React.forwardRef(function SliderMarks(props, ref) { + const { marks } = props + if (!_optionalChain([marks, 'optionalAccess', (_6) => _6.length])) return null + + return ( + + {marks.map((mark, index) => { + const value = typeof mark === 'number' ? mark : mark.value + const label = typeof mark === 'number' ? undefined : mark.label + return ( + + + {label} + + ) + })} + + ) +}) diff --git a/src/components/ui/stat.jsx b/src/components/ui/stat.jsx new file mode 100644 index 0000000..076a4f5 --- /dev/null +++ b/src/components/ui/stat.jsx @@ -0,0 +1,49 @@ +import { Badge, Stat as ChakraStat, FormatNumber } from '@chakra-ui/react' +import { InfoTip } from './toggle-tip' +import * as React from 'react' + +export const StatLabel = React.forwardRef(function StatLabel(props, ref) { + const { info, children, ...rest } = props + return ( + + {children} + {info && {info}} + + ) +}) + +export const StatValueText = React.forwardRef( + function StatValueText(props, ref) { + const { value, formatOptions, children, ...rest } = props + return ( + + {children || + (value != null && )} + + ) + }, +) + +export const StatUpTrend = React.forwardRef(function StatUpTrend(props, ref) { + return ( + + + {props.children} + + ) +}) + +export const StatDownTrend = React.forwardRef( + function StatDownTrend(props, ref) { + return ( + + + {props.children} + + ) + }, +) + +export const StatRoot = ChakraStat.Root +export const StatHelpText = ChakraStat.HelpText +export const StatValueUnit = ChakraStat.ValueUnit diff --git a/src/components/ui/status.jsx b/src/components/ui/status.jsx new file mode 100644 index 0000000..32e2c5e --- /dev/null +++ b/src/components/ui/status.jsx @@ -0,0 +1,30 @@ +function _nullishCoalesce(lhs, rhsFn) { + if (lhs != null) { + return lhs + } else { + return rhsFn() + } +} +import { Status as ChakraStatus } from '@chakra-ui/react' +import * as React from 'react' + +const statusMap = { + success: 'green', + error: 'red', + warning: 'orange', + info: 'blue', +} + +export const Status = React.forwardRef(function Status(props, ref) { + const { children, value = 'info', ...rest } = props + const colorPalette = _nullishCoalesce( + rest.colorPalette, + () => statusMap[value], + ) + return ( + + + {children} + + ) +}) diff --git a/src/components/ui/stepper-input.jsx b/src/components/ui/stepper-input.jsx new file mode 100644 index 0000000..2f9fb8a --- /dev/null +++ b/src/components/ui/stepper-input.jsx @@ -0,0 +1,41 @@ +import { HStack, IconButton, NumberInput } from '@chakra-ui/react' +import * as React from 'react' +import { LuMinus, LuPlus } from 'react-icons/lu' + +export const StepperInput = React.forwardRef(function StepperInput(props, ref) { + const { label, ...rest } = props + return ( + + {label && {label}} + + + + + + + ) +}) + +const DecrementTrigger = React.forwardRef( + function DecrementTrigger(props, ref) { + return ( + + + + + + ) + }, +) + +const IncrementTrigger = React.forwardRef( + function IncrementTrigger(props, ref) { + return ( + + + + + + ) + }, +) diff --git a/src/components/ui/steps.jsx b/src/components/ui/steps.jsx new file mode 100644 index 0000000..5394f1f --- /dev/null +++ b/src/components/ui/steps.jsx @@ -0,0 +1,62 @@ +import { Box, Steps as ChakraSteps } from '@chakra-ui/react' +import * as React from 'react' +import { LuCheck } from 'react-icons/lu' + +export const StepsItem = React.forwardRef(function StepsItem(props, ref) { + const { title, description, completedIcon, icon, ...rest } = props + return ( + + + + } + incomplete={icon || } + /> + + + + + + ) +}) + +const StepInfo = (props) => { + const { title, description } = props + + if (title && description) { + return ( + + {title} + {description} + + ) + } + + return ( + <> + {title && {title}} + {description && ( + {description} + )} + + ) +} + +export const StepsIndicator = React.forwardRef( + function StepsIndicator(props, ref) { + const { icon = , completedIcon } = props + return ( + + + + ) + }, +) + +export const StepsList = ChakraSteps.List +export const StepsRoot = ChakraSteps.Root +export const StepsContent = ChakraSteps.Content +export const StepsCompletedContent = ChakraSteps.CompletedContent + +export const StepsNextTrigger = ChakraSteps.NextTrigger +export const StepsPrevTrigger = ChakraSteps.PrevTrigger diff --git a/src/components/ui/switch.jsx b/src/components/ui/switch.jsx new file mode 100644 index 0000000..252b141 --- /dev/null +++ b/src/components/ui/switch.jsx @@ -0,0 +1,55 @@ +function _optionalChain(ops) { + let lastAccessLHS = undefined + let value = ops[0] + let i = 1 + while (i < ops.length) { + const op = ops[i] + const fn = ops[i + 1] + i += 2 + if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { + return undefined + } + if (op === 'access' || op === 'optionalAccess') { + lastAccessLHS = value + value = fn(value) + } else if (op === 'call' || op === 'optionalCall') { + value = fn((...args) => value.call(lastAccessLHS, ...args)) + lastAccessLHS = undefined + } + } + return value +} +import { Switch as ChakraSwitch } from '@chakra-ui/react' +import * as React from 'react' + +export const Switch = React.forwardRef(function Switch(props, ref) { + const { inputProps, children, rootRef, trackLabel, thumbLabel, ...rest } = + props + + return ( + + + + + {thumbLabel && ( + _.off, + ])} + > + {_optionalChain([thumbLabel, 'optionalAccess', (_2) => _2.on])} + + )} + + {trackLabel && ( + + {trackLabel.on} + + )} + + {children != null && {children}} + + ) +}) diff --git a/src/components/ui/tag.jsx b/src/components/ui/tag.jsx new file mode 100644 index 0000000..95de898 --- /dev/null +++ b/src/components/ui/tag.jsx @@ -0,0 +1,28 @@ +import { Tag as ChakraTag } from '@chakra-ui/react' +import * as React from 'react' + +export const Tag = React.forwardRef(function Tag(props, ref) { + const { + startElement, + endElement, + onClose, + closable = !!onClose, + children, + ...rest + } = props + + return ( + + {startElement && ( + {startElement} + )} + {children} + {endElement && {endElement}} + {closable && ( + + + + )} + + ) +}) diff --git a/src/components/ui/timeline.jsx b/src/components/ui/timeline.jsx new file mode 100644 index 0000000..33e57eb --- /dev/null +++ b/src/components/ui/timeline.jsx @@ -0,0 +1,20 @@ +import { Timeline as ChakraTimeline } from '@chakra-ui/react' +import * as React from 'react' + +export const TimelineConnector = React.forwardRef( + function TimelineConnector(props, ref) { + return ( + + + + + ) + }, +) + +export const TimelineRoot = ChakraTimeline.Root +export const TimelineContent = ChakraTimeline.Content +export const TimelineItem = ChakraTimeline.Item +export const TimelineIndicator = ChakraTimeline.Indicator +export const TimelineTitle = ChakraTimeline.Title +export const TimelineDescription = ChakraTimeline.Description diff --git a/src/components/ui/toggle-tip.jsx b/src/components/ui/toggle-tip.jsx new file mode 100644 index 0000000..b3ca45a --- /dev/null +++ b/src/components/ui/toggle-tip.jsx @@ -0,0 +1,58 @@ +import { Popover as ChakraPopover, IconButton, Portal } from '@chakra-ui/react' +import * as React from 'react' +import { HiOutlineInformationCircle } from 'react-icons/hi' + +export const ToggleTip = React.forwardRef(function ToggleTip(props, ref) { + const { + showArrow, + children, + portalled = true, + content, + portalRef, + ...rest + } = props + + return ( + + {children} + + + + {showArrow && ( + + + + )} + {content} + + + + + ) +}) + +export const InfoTip = React.forwardRef(function InfoTip(props, ref) { + const { children, ...rest } = props + return ( + + + + + + ) +}) diff --git a/src/components/ui/toggle.jsx b/src/components/ui/toggle.jsx new file mode 100644 index 0000000..d3926ac --- /dev/null +++ b/src/components/ui/toggle.jsx @@ -0,0 +1,44 @@ +'use client' + +import { + Button, + Toggle as ChakraToggle, + useToggleContext, +} from '@chakra-ui/react' +import * as React from 'react' + +const variantMap = { + solid: { on: 'solid', off: 'outline' }, + surface: { on: 'surface', off: 'outline' }, + subtle: { on: 'subtle', off: 'ghost' }, + ghost: { on: 'subtle', off: 'ghost' }, +} + +export const Toggle = React.forwardRef(function Toggle(props, ref) { + const { variant = 'subtle', size, children, ...rest } = props + const variantConfig = variantMap[variant] + + return ( + + + {children} + + + ) +}) + +const ToggleBaseButton = React.forwardRef( + function ToggleBaseButton(props, ref) { + const toggle = useToggleContext() + const { variant, ...rest } = props + return ( + - + - + Drawer Title From 260a0807123efe05a9d1e0564f97a114562640e3 Mon Sep 17 00:00:00 2001 From: Prakhar Trivedi Date: Fri, 4 Jul 2025 11:32:00 +0800 Subject: [PATCH 8/8] added a header to homepage --- .gitignore | 2 ++ src/Layout.jsx | 2 ++ src/pages/Homepage.jsx | 9 ++++----- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index b02a1ff..9564343 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,5 @@ package-lock.json *.njsproj *.sln *.sw? + +.env \ No newline at end of file diff --git a/src/Layout.jsx b/src/Layout.jsx index 6719e4b..fdb152a 100644 --- a/src/Layout.jsx +++ b/src/Layout.jsx @@ -1,6 +1,7 @@ import React, { useEffect } from 'react' import { useDispatch } from 'react-redux' import { Outlet, useNavigate } from 'react-router'; +import Navbar from './components/Navbar'; function Layout() { const dispatch = useDispatch(); @@ -12,6 +13,7 @@ function Layout() { return (
+
) diff --git a/src/pages/Homepage.jsx b/src/pages/Homepage.jsx index ddc9744..3113ea0 100644 --- a/src/pages/Homepage.jsx +++ b/src/pages/Homepage.jsx @@ -1,10 +1,9 @@ -import React from 'react' -import Navbar from '../components/Navbar' +import { Flex, Text } from '@chakra-ui/react' function Homepage() { - return ( - - ) + return + Connect
with your
roots
+
} export default Homepage \ No newline at end of file