diff --git a/aluxpay-payment-gateway/includes/class-aluxpay-payment-gateway.php b/aluxpay-payment-gateway/includes/class-aluxpay-payment-gateway.php index 6f9ee97..81fa70b 100644 --- a/aluxpay-payment-gateway/includes/class-aluxpay-payment-gateway.php +++ b/aluxpay-payment-gateway/includes/class-aluxpay-payment-gateway.php @@ -137,14 +137,22 @@ class WC_Aluxpay_Payment_Gateway extends WC_Payment_Gateway { */ private function get_payment_redirect_url($order) { + // Build description without special characters OR encode it + $description = sprintf( + __('Order %s from %s', 'aluxpay-payment-gateway'), + $order->get_id(), + get_bloginfo('name') + ); + $params = array( 'wc_order_id' => $order->get_id(), 'total' => $order->get_total(), 'currency' => $order->get_currency(), - 'description' => sprintf(__('Order #%s from %s', 'aluxpay-payment-gateway'), $order->get_id(), get_bloginfo('name')), + 'description' => $description, 'customer_email' => $order->get_billing_email(), 'return_url' => $this->get_return_url($order), 'cancel_url' => wc_get_checkout_url(), + '_wpnonce' => wp_create_nonce('cpg_payment_' . $order->get_id()), ); // Add nonce for security diff --git a/backend/routes/payment.js b/backend/routes/payment.js index 8b08bca..8e30b5a 100644 --- a/backend/routes/payment.js +++ b/backend/routes/payment.js @@ -254,7 +254,23 @@ router.get('/order-status/:wc_order_id', async (req, res) => { total: wcOrder.order.total, currency: wcOrder.order.currency, payment_method: wcOrder.order.payment_method, - payment_method_title: wcOrder.order.payment_method_title + payment_method_title: wcOrder.order.payment_method_title, + line_items: wcOrder.order.line_items.map(item => ({ + name: item.name, + quantity: item.quantity, + price: item.price, + total: item.total, + image: item.image?.src || null + })), + shipping: { + total: wcOrder.order.shipping_total, + method: wcOrder.order.shipping_lines[0]?.method_title + }, + billing: { + first_name: wcOrder.order.billing.first_name, + last_name: wcOrder.order.billing.last_name, + email: wcOrder.order.billing.email + } }); } catch (error) { diff --git a/backend/services/woocommerce.js b/backend/services/woocommerce.js index 826e966..a55b6be 100644 --- a/backend/services/woocommerce.js +++ b/backend/services/woocommerce.js @@ -35,7 +35,6 @@ class WooCommerceService { async getOrder(orderId) { try { const response = await this.client.get(`/orders/${orderId}`); - console.log('WooCommerce Order Retrieved:', { id: response.data.id, status: response.data.status, diff --git a/frontend/eslint.config.js b/frontend/eslint.config.js index cee1e2c..d3da143 100644 --- a/frontend/eslint.config.js +++ b/frontend/eslint.config.js @@ -1,29 +1,9 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' -import { defineConfig, globalIgnores } from 'eslint/config' +import js from "@eslint/js"; +import globals from "globals"; +import pluginReact from "eslint-plugin-react"; +import { defineConfig } from "eslint/config"; export default defineConfig([ - globalIgnores(['dist']), - { - files: ['**/*.{js,jsx}'], - extends: [ - js.configs.recommended, - reactHooks.configs['recommended-latest'], - reactRefresh.configs.vite, - ], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - parserOptions: { - ecmaVersion: 'latest', - ecmaFeatures: { jsx: true }, - sourceType: 'module', - }, - }, - rules: { - 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], - }, - }, -]) + { files: ["**/*.{js,mjs,cjs,jsx}"], plugins: { js }, extends: ["js/recommended"], languageOptions: { globals: globals.browser } }, + pluginReact.configs.flat.recommended, +]); diff --git a/frontend/index.html b/frontend/index.html index d625ef0..3b28a0a 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,7 +4,7 @@ - my-app + ALUXPAY - Payment Gateway
diff --git a/frontend/jsconfig.json b/frontend/jsconfig.json new file mode 100644 index 0000000..c205775 --- /dev/null +++ b/frontend/jsconfig.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "moduleResolution": "Bundler", + "skipLibCheck": true, + "paths": { + "@/*": ["./src/*"] + } + } +} \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json index f3c9045..b3840b1 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -8,10 +8,14 @@ "name": "my-app", "version": "0.0.0", "dependencies": { + "@chakra-ui/react": "^3.27.0", + "@emotion/react": "^11.14.0", "@paypal/react-paypal-js": "^8.9.1", "axios": "^1.12.2", + "next-themes": "^0.4.6", "react": "^19.1.1", "react-dom": "^19.1.1", + "react-icons": "^5.5.0", "react-router-dom": "^7.9.2", "react-scripts": "^5.0.1" }, @@ -21,10 +25,12 @@ "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.3", "eslint": "^9.36.0", + "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.4.0", - "vite": "^7.1.7" + "vite": "^7.1.7", + "vite-tsconfig-paths": "^5.1.4" } }, "node_modules/@alloc/quick-lru": { @@ -39,6 +45,78 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ark-ui/react": { + "version": "5.25.0", + "resolved": "https://registry.npmjs.org/@ark-ui/react/-/react-5.25.0.tgz", + "integrity": "sha512-+r91hfLQNmGbM37rvwu6Ppy7Xaa1Dww80spn49xHhiS8ZCYQbZyPNzgOEVoSjURiroLkLdQdh869OscfczkAyA==", + "license": "MIT", + "dependencies": { + "@internationalized/date": "3.9.0", + "@zag-js/accordion": "1.24.1", + "@zag-js/anatomy": "1.24.1", + "@zag-js/angle-slider": "1.24.1", + "@zag-js/async-list": "1.24.1", + "@zag-js/auto-resize": "1.24.1", + "@zag-js/avatar": "1.24.1", + "@zag-js/carousel": "1.24.1", + "@zag-js/checkbox": "1.24.1", + "@zag-js/clipboard": "1.24.1", + "@zag-js/collapsible": "1.24.1", + "@zag-js/collection": "1.24.1", + "@zag-js/color-picker": "1.24.1", + "@zag-js/color-utils": "1.24.1", + "@zag-js/combobox": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/date-picker": "1.24.1", + "@zag-js/date-utils": "1.24.1", + "@zag-js/dialog": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/editable": "1.24.1", + "@zag-js/file-upload": "1.24.1", + "@zag-js/file-utils": "1.24.1", + "@zag-js/floating-panel": "1.24.1", + "@zag-js/focus-trap": "1.24.1", + "@zag-js/highlight-word": "1.24.1", + "@zag-js/hover-card": "1.24.1", + "@zag-js/i18n-utils": "1.24.1", + "@zag-js/json-tree-utils": "1.24.1", + "@zag-js/listbox": "1.24.1", + "@zag-js/menu": "1.24.1", + "@zag-js/number-input": "1.24.1", + "@zag-js/pagination": "1.24.1", + "@zag-js/password-input": "1.24.1", + "@zag-js/pin-input": "1.24.1", + "@zag-js/popover": "1.24.1", + "@zag-js/presence": "1.24.1", + "@zag-js/progress": "1.24.1", + "@zag-js/qr-code": "1.24.1", + "@zag-js/radio-group": "1.24.1", + "@zag-js/rating-group": "1.24.1", + "@zag-js/react": "1.24.1", + "@zag-js/scroll-area": "1.24.1", + "@zag-js/select": "1.24.1", + "@zag-js/signature-pad": "1.24.1", + "@zag-js/slider": "1.24.1", + "@zag-js/splitter": "1.24.1", + "@zag-js/steps": "1.24.1", + "@zag-js/switch": "1.24.1", + "@zag-js/tabs": "1.24.1", + "@zag-js/tags-input": "1.24.1", + "@zag-js/timer": "1.24.1", + "@zag-js/toast": "1.24.1", + "@zag-js/toggle": "1.24.1", + "@zag-js/toggle-group": "1.24.1", + "@zag-js/tooltip": "1.24.1", + "@zag-js/tour": "1.24.1", + "@zag-js/tree-view": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, "node_modules/@babel/code-frame": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", @@ -92,6 +170,12 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "license": "MIT" + }, "node_modules/@babel/eslint-parser": { "version": "7.28.4", "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.4.tgz", @@ -2052,6 +2136,27 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "license": "MIT" }, + "node_modules/@chakra-ui/react": { + "version": "3.27.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-3.27.0.tgz", + "integrity": "sha512-M1WTAErI2cYM/PB4h5Kf5CCAg70g3HCzVvTEhcf5ty8QrG6QybPf3RdWSpBlIy7qpjuEnQYpHLxM0jnFLArBgA==", + "license": "MIT", + "dependencies": { + "@ark-ui/react": "^5.24.1", + "@emotion/is-prop-valid": "^1.3.1", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@pandacss/is-valid-prop": "^0.54.0", + "csstype": "^3.1.3", + "fast-safe-stringify": "^2.1.1" + }, + "peerDependencies": { + "@emotion/react": ">=11", + "react": ">=18", + "react-dom": ">=18" + } + }, "node_modules/@csstools/normalize.css": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.1.1.tgz", @@ -2338,6 +2443,129 @@ "postcss-selector-parser": "^6.0.10" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.25.10", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", @@ -2923,6 +3151,31 @@ "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, + "node_modules/@floating-ui/core": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.3.tgz", + "integrity": "sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.4.tgz", + "integrity": "sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.3", + "@floating-ui/utils": "^0.2.10" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.10.tgz", + "integrity": "sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==", + "license": "MIT" + }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -2993,6 +3246,24 @@ "url": "https://github.com/sponsors/nzakas" } }, + "node_modules/@internationalized/date": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.9.0.tgz", + "integrity": "sha512-yaN3brAnHRD+4KyyOsJyk49XUvj2wtbNACSqg0bz3u8t2VuzhC8Q5dfRnrSxjnnbDb+ienBnkn1TzQfE154vyg==", + "license": "Apache-2.0", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@internationalized/number": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/@internationalized/number/-/number-3.6.5.tgz", + "integrity": "sha512-6hY4Kl4HPBvtfS62asS/R22JzNNy8vi/Ssev7x6EobfCp+9QIB2hKvI2EtbdJ0VSQacxVNtqhE/NmF/NZ0gm6g==", + "license": "Apache-2.0", + "dependencies": { + "@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", @@ -3460,12 +3731,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/@jest/transform/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, "node_modules/@jest/transform/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3618,6 +3883,11 @@ "node": ">= 8" } }, + "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==" + }, "node_modules/@paypal/paypal-js": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/@paypal/paypal-js/-/paypal-js-8.4.2.tgz", @@ -3708,6 +3978,15 @@ } } }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } + }, "node_modules/@rolldown/pluginutils": { "version": "1.0.0-beta.35", "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.35.tgz", @@ -4292,6 +4571,15 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@swc/helpers": { + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", + "integrity": "sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.8.0" + } + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -4572,9 +4860,9 @@ "license": "MIT" }, "node_modules/@types/react": { - "version": "19.1.13", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", - "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", + "version": "19.1.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.14.tgz", + "integrity": "sha512-ukd93VGzaNPMAUPy0gRDSC57UuQbnH9Kussp7HBjM06YFi9uZTFhOvMSO2OKqXm1rSgzOE+pVx1k1PYHGwlc8Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5057,6 +5345,849 @@ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", "license": "Apache-2.0" }, + "node_modules/@zag-js/accordion": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/accordion/-/accordion-1.24.1.tgz", + "integrity": "sha512-JOlmXjO+1tTlyeZ93S+chIlV8uDr8fodj3/XCjLFHc/G116O8cN18KG0Ug9pImy1vT2Kkwb9Ag9QOTyUAXM3PA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/anatomy": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/anatomy/-/anatomy-1.24.1.tgz", + "integrity": "sha512-mRkpetNjnjgvdyEX880AOjhMhcgdRMLjOM+aEgoDRnhultC4im+nriNoCShJLeVpwsRrEQCU7YVXO4mZaqWUMg==", + "license": "MIT" + }, + "node_modules/@zag-js/angle-slider": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/angle-slider/-/angle-slider-1.24.1.tgz", + "integrity": "sha512-pcWIpVZDMbujMK0nFaKa0wd7uGkP4E5D7x8cmvoiKMT4E1vZpg2kZeN9qmdnhum9ye7nb80IPKhcDl9C0JuSLw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/rect-utils": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/aria-hidden": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/aria-hidden/-/aria-hidden-1.24.1.tgz", + "integrity": "sha512-R/a80ZjITZi4rotN7Q9+RTCYCdmJZf3rZi9bObczbR7h5j5GSsjikByUjksWAYzPvFxQxBWTs4GqlCI9dU2f9A==", + "license": "MIT" + }, + "node_modules/@zag-js/async-list": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/async-list/-/async-list-1.24.1.tgz", + "integrity": "sha512-EZE3wORLOhMtT1tiDA0kTHrtY7XNkOoNyn5jCs8Ec1GfqIHSRzQB+2jt+wPIBwUhDcgQksXgOy91s/i9XfQe1g==", + "license": "MIT", + "dependencies": { + "@zag-js/core": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/auto-resize": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/auto-resize/-/auto-resize-1.24.1.tgz", + "integrity": "sha512-OH1VTeObddMiN2PUK+7SpkPV8Znlkdq+10odmbbe9K2MZPh352RNcPYytIZTWT0X4/4czhn2MTU6IhZ2lZp2hw==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1" + } + }, + "node_modules/@zag-js/avatar": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/avatar/-/avatar-1.24.1.tgz", + "integrity": "sha512-zYGUdkxsMoN8OAFYYCZBrsQx++kjWEBdYZew4en9g8vw7yonNjzywtfF/Vd3Dv6mUZ2r5JtaltbK/qp4aBdZvg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/carousel": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/carousel/-/carousel-1.24.1.tgz", + "integrity": "sha512-7WGlFtF4JoIK4kduiFgucdTe9eD+884d9BF9Sh308MlpiL0KZnO3l3Pyq58yi4R0KUTy7zILLGSsUesifVAuEA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/scroll-snap": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/checkbox": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/checkbox/-/checkbox-1.24.1.tgz", + "integrity": "sha512-eU/RKaO44Tgt1iTGg26M2nUd12p+gTuq2rNjqVuPfN3dvRzYNi5rGKk6yTQI2T4DH4D+fDMz6gUneiBuGcVoJA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/focus-visible": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/clipboard": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/clipboard/-/clipboard-1.24.1.tgz", + "integrity": "sha512-GfmjjiEDS9NB6Wo/ThbbzO10BgOYzTSeG00a/pJ5QpvSgvOCz+oLV5NBQHOd8XjOw0e0GQEyfsif0i6wQExSIQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/collapsible": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/collapsible/-/collapsible-1.24.1.tgz", + "integrity": "sha512-U6AP4nE6jwMC3kirFQmOL9i3CSfp8mJqb+Gv3opbClpjqCa8hn9v4PNiimKmd0Qr3kynuVRpAshaUaLeg33YiA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/collection": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/collection/-/collection-1.24.1.tgz", + "integrity": "sha512-aWNDI0iZ5Wb8vCZLJWPjRQOK5/B2wvhhR1+pYaScxZfWy2das2DVKam8tnR0p1GrRfBi/kZNaCXtvM1ZNPjlOQ==", + "license": "MIT", + "dependencies": { + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/color-picker": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/color-picker/-/color-picker-1.24.1.tgz", + "integrity": "sha512-vLW11JrySJR5fGeXXdmlCJuNm7yE0Tsx/SjkX0WBnrPC4PYaGfiwF7LT59bs5XsQp65kEaIca6mw/J0Bouc8Sw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/color-utils": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/color-utils": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/color-utils/-/color-utils-1.24.1.tgz", + "integrity": "sha512-8KPTa3I9+WbDLrYPH5knEYMW3CjAC20ikosdrgYshGTFIPuqinAnsxD7H0fZO4I+jSjuhtIyNQuvgwJar9A2rg==", + "license": "MIT", + "dependencies": { + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/combobox": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/combobox/-/combobox-1.24.1.tgz", + "integrity": "sha512-BhjQOL/Ssr5lQLPCyEersCqOqllFlNuR8nvQOgl1u8Y0EaZR+ZPQbgXum6kE5AuH3SlcY9+1kDK1ZLswOagL1Q==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/aria-hidden": "1.24.1", + "@zag-js/collection": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/core": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/core/-/core-1.24.1.tgz", + "integrity": "sha512-0e7QdxBaY9PMHQfDY/Xu/7MKyRxNsriNscpkZI7L4MHMGPmxdfedGBpteI3gFfqWsdJ5NvvpqxdLUwkbYk5Q5A==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/date-picker": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/date-picker/-/date-picker-1.24.1.tgz", + "integrity": "sha512-8jLv074sGJQw4L+5YTDv7l2bwb1x9E7YhvklCffhf/7OzW7RB/ELkljFhmjueuJp7W/sD4xhJyigjp/mDEg1XA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/date-utils": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/live-region": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + }, + "peerDependencies": { + "@internationalized/date": ">=3.0.0" + } + }, + "node_modules/@zag-js/date-utils": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/date-utils/-/date-utils-1.24.1.tgz", + "integrity": "sha512-Rgll6P4Imq479WxH3uMvwQri4o4lF2cxWX2Hka/W7Nhv1DhPBnmfBw30INyWPXzx5agEVzKdGX/br8MU5DV33Q==", + "license": "MIT", + "peerDependencies": { + "@internationalized/date": ">=3.0.0" + } + }, + "node_modules/@zag-js/dialog": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/dialog/-/dialog-1.24.1.tgz", + "integrity": "sha512-ITzOoXBC92vIkhNvxM0GMMKwboLLk7hSU9dsplk/X9bpX+fQywgc6d5O4I7WHCMmgUWI5y3/aWjqsWATWwufWg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/aria-hidden": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/focus-trap": "1.24.1", + "@zag-js/remove-scroll": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/dismissable": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/dismissable/-/dismissable-1.24.1.tgz", + "integrity": "sha512-Oca+nbwaqHGt0rmkKfmpExwL+kVYLbVi6fxhzHP1WBrip//IUThoTrPH/gqB51o1DT1z/VNE+8BhWhsHSgkQfw==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1", + "@zag-js/interact-outside": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/dom-query": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-1.24.1.tgz", + "integrity": "sha512-ww3tS5hrB2s6ywGtjMjSOajP19CnQOH0IAGgzjE+lbvDD+ZroXWn9O3Z/v2kTfKNwZFQ4TOb8oSymuSRQsFOYg==", + "license": "MIT", + "dependencies": { + "@zag-js/types": "1.24.1" + } + }, + "node_modules/@zag-js/editable": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/editable/-/editable-1.24.1.tgz", + "integrity": "sha512-SV8X7jd95ZAx4VnlhoEcbAiW8jhoGkPf7L0JFB2KWX+NFacEVCKGQpDjZpdzD6j7C10750v3blbkjr6iyzeIqw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/interact-outside": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/file-upload": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/file-upload/-/file-upload-1.24.1.tgz", + "integrity": "sha512-Un0+qDlkoC93pf7/Nvq9DBVKR6PBKybbNE/En/PC4XLJybK448bY85UuEdBPgXEoR6hIGA3t8NdeHZ+PUoZXIw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/file-utils": "1.24.1", + "@zag-js/i18n-utils": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/file-utils": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/file-utils/-/file-utils-1.24.1.tgz", + "integrity": "sha512-ydMct0iyd4uPxf+NP4gfyPq1gJlvW29WWIm5ez9El9L+z5tDBhXYNc73s2kSdDBKXkO4fp6Mwoqbz/wZOw99/Q==", + "license": "MIT", + "dependencies": { + "@zag-js/i18n-utils": "1.24.1" + } + }, + "node_modules/@zag-js/floating-panel": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/floating-panel/-/floating-panel-1.24.1.tgz", + "integrity": "sha512-qVVtnKCQE2C//0q7utRvpfRKsZedL8gnSqwHDX4ie8nKmLLSLn6jDGuAzxrscsGPHEjCOru9NlTHlAAMtB3ybQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/rect-utils": "1.24.1", + "@zag-js/store": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/focus-trap": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/focus-trap/-/focus-trap-1.24.1.tgz", + "integrity": "sha512-cpgYWWaiKx9eycm4Mahv6Dng5+CbDiTtyz/gnbZUv6sqcM4b9N+UqdmBdWYPLHV4gZYrzuO+X4P1C/Ew/rA+xg==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1" + } + }, + "node_modules/@zag-js/focus-visible": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-1.24.1.tgz", + "integrity": "sha512-HzUf8cRl5tbIil6rVe24CxC3s1pdFGpfYSt5NyaFoFd0HuWhobp+De1kVUvlLU0DDUU6Kgw6DB1w8APEPzb8gg==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1" + } + }, + "node_modules/@zag-js/highlight-word": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/highlight-word/-/highlight-word-1.24.1.tgz", + "integrity": "sha512-paDF/sWKDMMclpCzrG60vD4/AFQ3EOu2lzQxl7S21uD/B8Rir4w1CkxK/9+cm1Bu7mj4mkR4t+VJxycEZ7YuIw==", + "license": "MIT" + }, + "node_modules/@zag-js/hover-card": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/hover-card/-/hover-card-1.24.1.tgz", + "integrity": "sha512-zXTcLEb8YOFoEjDMsMcxqidRDN2fY0C94j+XdZYj5eZtKBIgbyCyAjvZrEu9yyPqqrXCNwYU0fTFjac3t9IV4g==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/i18n-utils": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/i18n-utils/-/i18n-utils-1.24.1.tgz", + "integrity": "sha512-dI9M73FTJcE40s/TPBLLKsypmBoMNe5NoRSBW64PWdmn0fCq65qcAUMgwQ0MVenh4oofoDYyffl8pIStr8T1tA==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1" + } + }, + "node_modules/@zag-js/interact-outside": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/interact-outside/-/interact-outside-1.24.1.tgz", + "integrity": "sha512-xKyGT295WVrlJaOPCVBrundlXqL4YEvl36SHNSi7EZs/AYpzxR/aBtnFCRN1/7nWvdqvfGs7ya0kl/ly0H7VBg==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/json-tree-utils": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/json-tree-utils/-/json-tree-utils-1.24.1.tgz", + "integrity": "sha512-TWVg+Y4fLr9o0YaB3OnX4xmV91Te/vzRwnNKntsz3GIWJ5fLNngg4hm3E+eaYnJIlKMHrvJv4T/UB4IGYUF+EQ==", + "license": "MIT" + }, + "node_modules/@zag-js/listbox": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/listbox/-/listbox-1.24.1.tgz", + "integrity": "sha512-fTJ125SWVZ+NxgkT6s8LWpdJQMeADk9Lm+Ur1pi0mZnRCmuHI3nwPkg1dfqynjVyrKs6P8wBmUxt3hlr2cc6TQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/collection": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/focus-visible": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/live-region": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/live-region/-/live-region-1.24.1.tgz", + "integrity": "sha512-A/55dOyRhfdgVtCBP05Uf2UGz/58H0TMWP69GdVYM4uADtfCLNPy6yxHAt9p334qJsWicg/YWSzBdEAVTThNag==", + "license": "MIT" + }, + "node_modules/@zag-js/menu": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/menu/-/menu-1.24.1.tgz", + "integrity": "sha512-XPNQbkIxSbNuYNLLQZlgXbj6Ptn2XHT5BXkUSw2hSbIg35S7Lq8gckiZVtxmUiX8zbv7krTBSD7zThSnwx1TOA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/rect-utils": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/number-input": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/number-input/-/number-input-1.24.1.tgz", + "integrity": "sha512-F5nX0VvuRmSxddJ8byHYp4OSHLU1C5Fv1rT4L1AnSXud8q6C+zCy4Vy8772pUKNobZf0q8Ru4SgnOe5TQcvRpg==", + "license": "MIT", + "dependencies": { + "@internationalized/number": "3.6.5", + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/pagination": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/pagination/-/pagination-1.24.1.tgz", + "integrity": "sha512-IO9Q5SiYmk00pjJAD18qFjOkpN1qb9iSeuX6A9Bdo8sMBFSigI6c7tGo1MPYGENma3b+aX7LbUpt8hYFufqUow==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/password-input": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/password-input/-/password-input-1.24.1.tgz", + "integrity": "sha512-TWgTRNsaAZ6IE1QmCQKhPY6uSRPDGjgdxGSpG7wOuYsbxHw/hD3v5sUAhAo9teIL0wV8COZIh6hyG2UAAgT2kg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/pin-input": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/pin-input/-/pin-input-1.24.1.tgz", + "integrity": "sha512-ytJK/1ekU06VmOpe7KdSkIQ3If+fffrA/EpbktZBuRepsz80QHB64+X6QQ6H1lEMbLWPNZ0TuFPaYhFfqH7cTQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/popover": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/popover/-/popover-1.24.1.tgz", + "integrity": "sha512-auNy7/5/VMeNUYbKfcvSz7OHkbrUWdODtA6gB/d/weAxvEHyMSk0+Ms4c5lmN8KDChrBAPJs4CfKSPv1U4I4zw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/aria-hidden": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/focus-trap": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/remove-scroll": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/popper": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/popper/-/popper-1.24.1.tgz", + "integrity": "sha512-VWbOjBy/haIDmXhwfyMT1rRcQhSfYmPX67YzQwLA7863kXkoTH1r9fR+1f9uq3VuXQLhw2Cg/lkSzlkg9TIp+g==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "1.7.4", + "@zag-js/dom-query": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/presence": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/presence/-/presence-1.24.1.tgz", + "integrity": "sha512-MMcw4iOsGdSGM3hmvd0gcMuk1X9rE/xE3Ndm113vc+lkhk93COiuJPz1ZpyBb8l1CIJwlZ5nnRpx4Lx8Do6aNQ==", + "license": "MIT", + "dependencies": { + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1" + } + }, + "node_modules/@zag-js/progress": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/progress/-/progress-1.24.1.tgz", + "integrity": "sha512-ocp6zkl5Y3sVMzPVIRLZtqtDfMkc365JYIrOUsdUqwJMvZJhSP1IbsbtIJS1ycOaHfLdK27E//GVyjxA7SHGhw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/qr-code": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/qr-code/-/qr-code-1.24.1.tgz", + "integrity": "sha512-Hy722PNwLs1tnXFQkTqtrEILypZcUDiC8YdvGn57mmmvPGtZdAzhs4G8ghoP9ahJ02ztREjIt8Qnmct344fALA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1", + "proxy-memoize": "3.0.1", + "uqr": "0.1.2" + } + }, + "node_modules/@zag-js/radio-group": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/radio-group/-/radio-group-1.24.1.tgz", + "integrity": "sha512-49S+nmaZzjf98206VeevmfTNTf+WjLveKCOGz5SVWPX3R8maZJgka1ZlIDuWlnRK1JfL+4Ls10/ZxAk3HrI7sg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/focus-visible": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/rating-group": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/rating-group/-/rating-group-1.24.1.tgz", + "integrity": "sha512-EGGObQDmulon5N9s5ElGZv9yQmky10s7ps7wyVgW1+vJTsWr8gaoFMJwf6nbXOsUjqW8iDuzsF68Rel9CgjxIQ==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/react": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/react/-/react-1.24.1.tgz", + "integrity": "sha512-oiaiuR7FKVHOEJtzoYZ2QBQ5+J/j086eebhLCIWkh2ie6QBJM73LHsMUxfZp2D2G1is8EoyUhrH3v2MPMlYMXg==", + "license": "MIT", + "dependencies": { + "@zag-js/core": "1.24.1", + "@zag-js/store": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + }, + "peerDependencies": { + "react": ">=18.0.0", + "react-dom": ">=18.0.0" + } + }, + "node_modules/@zag-js/rect-utils": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/rect-utils/-/rect-utils-1.24.1.tgz", + "integrity": "sha512-6JkVq71feW9Yyt7Pynyf199ugDFVgRT+jPpg2ECRHgY2oHvn5atBP3PA1uM2cx7ZydiajnBgk4n1ePnGYD2xNw==", + "license": "MIT" + }, + "node_modules/@zag-js/remove-scroll": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/remove-scroll/-/remove-scroll-1.24.1.tgz", + "integrity": "sha512-SAK3ZsnDUcJve5q3OHsMjrl0JOW9sv1fGbBFXyyid9Uu8s79LMh7EZw2na5jXDNzdMWmk1Euu82OaZSlLl9Kew==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1" + } + }, + "node_modules/@zag-js/scroll-area": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/scroll-area/-/scroll-area-1.24.1.tgz", + "integrity": "sha512-eRZKs6Yyl8Zp+YkIxzr1QsgRDDsNMxXshwpIzt/L5xK+EV34mv760FOkX/unG/WxQ1Z0gBogPm9ZY53/m4bhJA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/scroll-snap": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/scroll-snap/-/scroll-snap-1.24.1.tgz", + "integrity": "sha512-Co/NlccX4XDg6OzQeRgv8bANbsCkMog1FZ0BveN8+2Mso/svOLVkB6UGswWZk/DyqY8DlxvfZAdPltmQpu5h8w==", + "license": "MIT", + "dependencies": { + "@zag-js/dom-query": "1.24.1" + } + }, + "node_modules/@zag-js/select": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/select/-/select-1.24.1.tgz", + "integrity": "sha512-boU5m3Qd//EGe1M2i4a2SbCXQpcPP9Ewe6DvjEpOhxP+dwdbZzDrtRBdZ4ByhMJ+1bT5B6TqsfvsQHhAI0LunA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/collection": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/signature-pad": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/signature-pad/-/signature-pad-1.24.1.tgz", + "integrity": "sha512-CRTcefUGMwdhxqmB8yGkHU3gweMfXw0CCoMc0LhMmla12hMJOBi+mpMVaBJnQHYGSG8uFUh2IKdPbe2Vtp4T3Q==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1", + "perfect-freehand": "^1.2.2" + } + }, + "node_modules/@zag-js/slider": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/slider/-/slider-1.24.1.tgz", + "integrity": "sha512-HClZBKcT+9tihZArRNRj35YOIUbztCcyYzggYYIrK4+OFD0RLYihA+yBO4hxs7xZVenzma9i0pc6q/Vo4z2tvA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/splitter": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/splitter/-/splitter-1.24.1.tgz", + "integrity": "sha512-UUqiCD0T8kfgm/vRTY1QrPlrpxbzxqZ+8QvysUchnibmStetkHnuzAXC4ZD9jlJbToqzE4p1eLOiWGaVXRdB/Q==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/steps": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/steps/-/steps-1.24.1.tgz", + "integrity": "sha512-njL1SMKef0JfYzw5KUhpeVuzOtgBjSxVUwDrPR9s095WUCUiOYlxzqummg3VBY8IDuT/pS/K6LDSY11YCRzeNw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/store": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/store/-/store-1.24.1.tgz", + "integrity": "sha512-iVl+NX2CcxEDLL3hrj31mqSqBZYBqHEBqa/Z7FwKVoTImMQ1AabMF5XPreTtB8KFbaVJlNlM6D5qngDPpVj/xw==", + "license": "MIT", + "dependencies": { + "proxy-compare": "3.0.1" + } + }, + "node_modules/@zag-js/switch": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/switch/-/switch-1.24.1.tgz", + "integrity": "sha512-RI2bG2AtsQ4ci8T7RA3XVSjd9urpNQXIwEatpa8cw9GCWFI421rt4Xcab5jy/IOu6VzXl6pwh11/cWAC/PBYCw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/focus-visible": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/tabs": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/tabs/-/tabs-1.24.1.tgz", + "integrity": "sha512-RjdW4opxhvCWTwHoCqq+lfNCthiyPu376hto6j4Ybl/UN3UFTV4zfTbwbMbAH7dyqj8m1nkKxidLaO0Yhx3zZA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/tags-input": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/tags-input/-/tags-input-1.24.1.tgz", + "integrity": "sha512-HY1ebBZE2j3/fuzfKw4z/44S9WWe50auMWLlFg47j6zVBcyNdXEeMO1OvvfyfQFJOcvOKXGxW8Hi4MXGxLWqmA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/auto-resize": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/interact-outside": "1.24.1", + "@zag-js/live-region": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/timer": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/timer/-/timer-1.24.1.tgz", + "integrity": "sha512-cjD8+I8CgSugsj5DI+kqzgvuQ2vYeArRdjO3iSjB4AjR+j08W8NKZvr7aawhYq636vrE9LeJGbxxZ3DBV12ELw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/toast": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/toast/-/toast-1.24.1.tgz", + "integrity": "sha512-gmHv65EYdypfMoF9WYIp7Y8z6XN5tebXEdjIWF8bJBaqW5zPn2VLdUYpfXv7wrHW2YtSTnF/xtgIhJ7MIX7HxA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/toggle": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/toggle/-/toggle-1.24.1.tgz", + "integrity": "sha512-dMN9Q4XFqr7jPlUZsLCFdUc1rtW88FzUaXcFVaeNCy8y8XGc+MG9AJJqjBiBL9EUeeR+LIp8yUIhJQEEDBm0kw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/toggle-group": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/toggle-group/-/toggle-group-1.24.1.tgz", + "integrity": "sha512-GVBay9XzmXjp1GgAmHUMpeYq3iMMevH+n0TyC0NcRe00prAEL9S4/q9pVy0P33PIOa20dxcvQ/Q3Tf+n5PFQcg==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/tooltip": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/tooltip/-/tooltip-1.24.1.tgz", + "integrity": "sha512-gdD5C9AF6JD8LC6mxXzUGWjnHqY3MS7ZvtNx/nuNGJAqKCD32dPT73fuv0up1UVh1yJhX4IrXg3H6q52Pm+jPw==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/focus-visible": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/tour": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/tour/-/tour-1.24.1.tgz", + "integrity": "sha512-e+UR8xauKyRhE6tA8gRsR1GuOn1QGjj2YAmtRC8lIb5tD+QrGCPy0jX2xBeR7M7eY1IPSSyi0gCUGE2CbaRK8Q==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dismissable": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/focus-trap": "1.24.1", + "@zag-js/interact-outside": "1.24.1", + "@zag-js/popper": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/tree-view": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/tree-view/-/tree-view-1.24.1.tgz", + "integrity": "sha512-HXCoqW6j2RunFxaIVRevgRTrRUEP05lpdOvc1Smzne7sC2mczwIqN68Vei6e83gRhXSF80v6Fc4TcHdPiW6wJA==", + "license": "MIT", + "dependencies": { + "@zag-js/anatomy": "1.24.1", + "@zag-js/collection": "1.24.1", + "@zag-js/core": "1.24.1", + "@zag-js/dom-query": "1.24.1", + "@zag-js/types": "1.24.1", + "@zag-js/utils": "1.24.1" + } + }, + "node_modules/@zag-js/types": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/types/-/types-1.24.1.tgz", + "integrity": "sha512-XyINtxe5JK7A+RtTmBdCQElNoElDiTw6NSWpjKZGRAXXGU9HIZ9JIFeaS77uq1aVs0JhAOFwqJiPs2NJzaYHLA==", + "license": "MIT", + "dependencies": { + "csstype": "3.1.3" + } + }, + "node_modules/@zag-js/utils": { + "version": "1.24.1", + "resolved": "https://registry.npmjs.org/@zag-js/utils/-/utils-1.24.1.tgz", + "integrity": "sha512-4nU9lfFlLLW/4T+/HaP+HdHYFeWvacxSVcccv0JSf+ZTC110IldV48kZELP+wFg9xDL/jCPPjlRtO1K64EIwgA==", + "license": "MIT" + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -5330,18 +6461,6 @@ "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==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/arg": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", @@ -6660,9 +7779,9 @@ } }, "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", "license": "MIT" }, "node_modules/cookie": { @@ -7163,7 +8282,6 @@ "version": "3.1.3", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -7457,15 +8575,15 @@ } }, "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { - "node": ">=6.0.0" + "node": ">=0.10.0" } }, "node_modules/dom-converter": { @@ -8137,18 +9255,6 @@ "ms": "^2.1.1" } }, - "node_modules/eslint-plugin-import/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint-plugin-jsx-a11y": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz", @@ -8239,18 +9345,6 @@ "eslint": ">=8.40" } }, - "node_modules/eslint-plugin-react/node_modules/doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -8560,6 +9654,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "license": "MIT" }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", + "license": "MIT" + }, "node_modules/fast-uri": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", @@ -8606,24 +9706,6 @@ "bser": "2.1.1" } }, - "node_modules/fdir": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", @@ -8775,6 +9857,12 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", @@ -9341,6 +10429,13 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true, + "license": "MIT" + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", @@ -9494,6 +10589,15 @@ "integrity": "sha512-EmBBpvdYh/4XxsnUybsPag6VikPYnN30td+vQk+GI3qpahVEG9+gTkG0aXVxTjBqQ5T6ijbWIu77O+C5WFWsnA==", "license": "MIT" }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/hoopy": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", @@ -11129,18 +12233,6 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/jest-validate": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", @@ -11369,18 +12461,6 @@ "node": ">=8" } }, - "node_modules/jest-watch-typeahead/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/jest-watch-typeahead/node_modules/pretty-format": { "version": "28.1.3", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", @@ -12035,18 +13115,6 @@ "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==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -12232,6 +13300,16 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, + "node_modules/next-themes": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/next-themes/-/next-themes-0.4.6.tgz", + "integrity": "sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc", + "react-dom": "^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc" + } + }, "node_modules/no-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", @@ -12763,6 +13841,12 @@ "node": ">=8" } }, + "node_modules/perfect-freehand": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/perfect-freehand/-/perfect-freehand-1.2.2.tgz", + "integrity": "sha512-eh31l019WICQ03pkF3FSzHxB8n07ItqIQ++G5UV8JX0zVOXzgTGCqnRR0jJ2h9U8/2uW4W4mtGJELt9kEV0CFQ==", + "license": "MIT" + }, "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", @@ -12776,13 +13860,12 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" @@ -14324,6 +15407,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "license": "MIT" + }, "node_modules/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -14369,12 +15458,6 @@ "react-is": "^16.13.1" } }, - "node_modules/prop-types/node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" - }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -14397,12 +15480,27 @@ "node": ">= 0.10" } }, + "node_modules/proxy-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-compare/-/proxy-compare-3.0.1.tgz", + "integrity": "sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==", + "license": "MIT" + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, + "node_modules/proxy-memoize": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/proxy-memoize/-/proxy-memoize-3.0.1.tgz", + "integrity": "sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==", + "license": "MIT", + "dependencies": { + "proxy-compare": "^3.0.0" + } + }, "node_modules/psl": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", @@ -14618,10 +15716,19 @@ "integrity": "sha512-SN/U6Ytxf1QGkw/9ve5Y+NxBbZM6Ht95tuXNMKs8EJyFa/Vy/+Co3stop3KBHARfn/giv+Lj1uUnTfOJ3moFEQ==", "license": "MIT" }, + "node_modules/react-icons": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", + "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", + "license": "MIT", + "peerDependencies": { + "react": "*" + } + }, "node_modules/react-is": { - "version": "17.0.2", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", - "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "license": "MIT" }, "node_modules/react-refresh": { @@ -14634,9 +15741,9 @@ } }, "node_modules/react-router": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.2.tgz", - "integrity": "sha512-i2TPp4dgaqrOqiRGLZmqh2WXmbdFknUyiCRmSKs0hf6fWXkTKg5h56b+9F22NbGRAMxjYfqQnpi63egzD2SuZA==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.3.tgz", + "integrity": "sha512-4o2iWCFIwhI/eYAIL43+cjORXYn/aRQPgtFRRZb3VzoyQ5Uej0Bmqj7437L97N9NJW4wnicSwLOLS+yCXfAPgg==", "license": "MIT", "dependencies": { "cookie": "^1.0.1", @@ -14656,12 +15763,12 @@ } }, "node_modules/react-router-dom": { - "version": "7.9.2", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.2.tgz", - "integrity": "sha512-pagqpVJnjZOfb+vIM23eTp7Sp/AAJjOgaowhP1f1TWOdk5/W8Uk8d/M/0wfleqx7SgjitjNPPsKeCZE1hTSp3w==", + "version": "7.9.3", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.3.tgz", + "integrity": "sha512-1QSbA0TGGFKTAc/aWjpfW/zoEukYfU4dc1dLkT/vvf54JoGMkW+fNA+3oyo2gWVW1GM7BxjJVHz5GnPJv40rvg==", "license": "MIT", "dependencies": { - "react-router": "7.9.2" + "react-router": "7.9.3" }, "engines": { "node": ">=20.0.0" @@ -14914,6 +16021,18 @@ "node": ">=4.0" } }, + "node_modules/react-scripts/node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "license": "Apache-2.0", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/react-scripts/node_modules/eslint": { "version": "8.57.1", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", @@ -15275,18 +16394,6 @@ "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==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/recursive-readdir": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", @@ -15530,12 +16637,6 @@ } } }, - "node_modules/resolve-url-loader/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" - }, "node_modules/resolve-url-loader/node_modules/picocolors": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", @@ -16256,12 +17357,12 @@ "license": "MIT" }, "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", "license": "BSD-3-Clause", "engines": { - "node": ">= 12" + "node": ">=0.10.0" } }, "node_modules/source-map-js": { @@ -16786,6 +17887,12 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, "node_modules/sucrase": { "version": "3.35.0", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", @@ -17335,6 +18442,37 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", @@ -17410,6 +18548,27 @@ "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", "license": "Apache-2.0" }, + "node_modules/tsconfck": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/tsconfck/-/tsconfck-3.1.6.tgz", + "integrity": "sha512-ks6Vjr/jEw0P1gmOVwutM3B7fWxoWBL2KRDb1JfqGVawBmO5UsvmWOQFGHBPl5yxYz4eERr19E6L7NMv+Fej4w==", + "dev": true, + "license": "MIT", + "bin": { + "tsconfck": "bin/tsconfck.js" + }, + "engines": { + "node": "^18 || >=20" + }, + "peerDependencies": { + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", @@ -17759,6 +18918,12 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", + "license": "MIT" + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -17837,11 +19002,14 @@ "node": ">=10.12.0" } }, - "node_modules/v8-to-istanbul/node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", - "license": "MIT" + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", + "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 12" + } }, "node_modules/vary": { "version": "1.1.2", @@ -17927,6 +19095,57 @@ } } }, + "node_modules/vite-tsconfig-paths": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/vite-tsconfig-paths/-/vite-tsconfig-paths-5.1.4.tgz", + "integrity": "sha512-cYj0LRuLV2c2sMqhqhGpaO3LretdtMn/BVX4cPLanIZuwwrkVl+lK84E/miEXkCHWXuq65rhNN4rXsBcOB3S4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "^4.1.1", + "globrex": "^0.1.2", + "tsconfck": "^3.0.3" + }, + "peerDependencies": { + "vite": "*" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -18602,18 +19821,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, - "node_modules/workbox-build/node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/workbox-build/node_modules/rollup": { "version": "2.79.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 53799aa..989adab 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -10,10 +10,14 @@ "preview": "vite preview" }, "dependencies": { + "@chakra-ui/react": "^3.27.0", + "@emotion/react": "^11.14.0", "@paypal/react-paypal-js": "^8.9.1", "axios": "^1.12.2", + "next-themes": "^0.4.6", "react": "^19.1.1", "react-dom": "^19.1.1", + "react-icons": "^5.5.0", "react-router-dom": "^7.9.2", "react-scripts": "^5.0.1" }, @@ -23,10 +27,12 @@ "@types/react-dom": "^19.1.9", "@vitejs/plugin-react": "^5.0.3", "eslint": "^9.36.0", + "eslint-plugin-react": "^7.37.5", "eslint-plugin-react-hooks": "^5.2.0", "eslint-plugin-react-refresh": "^0.4.20", "globals": "^16.4.0", - "vite": "^7.1.7" + "vite": "^7.1.7", + "vite-tsconfig-paths": "^5.1.4" }, "proxy": "http://localhost:5001" } diff --git a/frontend/public/affordableluxurywatches-logo.svg b/frontend/public/affordableluxurywatches-logo.svg new file mode 100644 index 0000000..ac4103a --- /dev/null +++ b/frontend/public/affordableluxurywatches-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.css b/frontend/src/App.css index 4be7695..e69de29 100644 --- a/frontend/src/App.css +++ b/frontend/src/App.css @@ -1,62 +0,0 @@ -.App { - text-align: center; -} - -.App-logo { - height: 40vmin; - pointer-events: none; -} - -@media (prefers-reduced-motion: no-preference) { - .App-logo { - animation: App-logo-spin infinite 20s linear; - } -} - -.App-header { - background-color: #282c34; - padding: 20px; - color: white; -} - -.App-link { - color: #61dafb; -} - -@keyframes App-logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -/* Custom PayPal button styling */ -.paypal-buttons { - margin-top: 20px; -} - -/* Loading states */ -.btn-loading { - position: relative; - color: transparent; -} - -.btn-loading::before { - content: ''; - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 20px; - height: 20px; - border: 2px solid #ffffff; - border-radius: 50%; - border-top-color: transparent; - animation: spin 1s ease-in-out infinite; -} - -@keyframes spin { - to { transform: translate(-50%, -50%) rotate(360deg); } -} \ No newline at end of file diff --git a/frontend/src/App.jsx b/frontend/src/App.jsx index e745cdb..e510f66 100644 --- a/frontend/src/App.jsx +++ b/frontend/src/App.jsx @@ -1,10 +1,15 @@ +"use client" import React from 'react'; +import {Grid, GridItem, Button, Box, Container, Image, Flex, Center, SimpleGrid, Text} from "@chakra-ui/react" +import { LuMoon, LuSun } from "react-icons/lu"; +import { useColorMode } from "@/components/ui/color-mode" import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; import { PayPalScriptProvider } from '@paypal/react-paypal-js'; import Payment from './pages/Payment.jsx'; import Success from './pages/Success.jsx'; import Cancel from './pages/Cancel.jsx'; import './App.css'; +import logo from '/affordableluxurywatches-logo.svg'; // PayPal configuration const paypalOptions = { @@ -14,23 +19,55 @@ const paypalOptions = { }; function App() { + const { toggleColorMode, colorMode } = useColorMode() return (
- - } /> - } /> - } /> - } /> - -

Page Not Found

-

The requested page could not be found.

- Go to Payment -
- } /> - + + + + + + React logo +
+ +
+
+ + + + + } /> + } /> + } /> + } /> + +

Page Not Found

+

The requested page could not be found.

+ Go to Payment + + } /> +
+
+ {import.meta.env.VITE_REACT_APP_STORE_NAME} +
+
+
+
diff --git a/frontend/src/components/OrderSummary.jsx b/frontend/src/components/OrderSummary.jsx index 8e477af..111055f 100644 --- a/frontend/src/components/OrderSummary.jsx +++ b/frontend/src/components/OrderSummary.jsx @@ -1,6 +1,7 @@ import React from 'react'; +import {Heading, Separator, DataList, Stack, Center, Box, Image, Badge, Text} from "@chakra-ui/react" -const OrderSummary = ({ orderData, loading }) => { +const OrderSummary = ({ orderData, loading, order }) => { const formatCurrency = (amount, currency = 'USD') => { return new Intl.NumberFormat('en-US', { style: 'currency', @@ -21,48 +22,83 @@ const OrderSummary = ({ orderData, loading }) => { } return ( +
-
- - Order Summary -
+ + + Order Summary + + + + Order # + {orderData.wc_order_id} + + { order.billing !== undefined && <> + + First Name + {order.billing.first_name} + + + Last Name + {order.billing.last_name} + + + E-mail + {order.billing.email} + -
- Order # - {orderData.wc_order_id} -
+ {/*{orderData.customer_email && ( + + E-mail + {orderData.customer_email} + + )}*/} + + + + {order.shipping.method} + + + {formatCurrency(order.shipping.total, orderData.currency)} + + } + + Total Amount: + {formatCurrency(orderData.total, orderData.currency)} + +
+
+
+
+ + + Ordered Items + + {order.line_items !== undefined && order.line_items.map((item, index) => ( + + + {item.image && {item.name}} +
+ {item.name} +
+
+ + Qty: {item.quantity} + ${item.total} + + +
+ ))} -
- Description - {orderData.description} -
- - {orderData.customer_email && ( -
- Customer Email - {orderData.customer_email} -
- )} - -
- Currency - {orderData.currency} -
- -
- Total Amount - - {formatCurrency(orderData.total, orderData.currency)} - -
- -
- - - You will be redirected to PayPal to complete this payment securely - -
+
+
+
+
); }; diff --git a/frontend/src/components/PayPalButton.jsx b/frontend/src/components/PayPalButton.jsx index a78f275..c475752 100644 --- a/frontend/src/components/PayPalButton.jsx +++ b/frontend/src/components/PayPalButton.jsx @@ -1,5 +1,7 @@ import React, { useState } from 'react'; import { PayPalButtons, usePayPalScriptReducer } from '@paypal/react-paypal-js'; +import {Button, HStack, Spinner, Text, VStack, Center, Alert} from "@chakra-ui/react"; +import {LuRepeat} from "react-icons/lu"; const PayPalButton = ({ orderData, onCreateOrder, onCaptureOrder, loading }) => { const [{ isPending }] = usePayPalScriptReducer(); @@ -42,22 +44,20 @@ const PayPalButton = ({ orderData, onCreateOrder, onCaptureOrder, loading }) => if (isPending) { return ( -
-
- Loading PayPal... -
-

Loading PayPal...

-
+ + + Loading PayPal... + ); } return (
{paypalError && ( -
- - {paypalError} -
+ + + {paypalError} + )} forceReRender={[orderData.total, orderData.currency]} /> -
- +
+ Don't have a PayPal account? You can still pay with your credit or debit card. - -
+ + {/* Fallback button for when PayPal doesn't load */} {!isPending && ( -
- -
+
+ + + +
)}
); diff --git a/frontend/src/components/ui/color-mode.jsx b/frontend/src/components/ui/color-mode.jsx new file mode 100644 index 0000000..a3029df --- /dev/null +++ b/frontend/src/components/ui/color-mode.jsx @@ -0,0 +1,90 @@ +'use client' + +import { ClientOnly, IconButton, Skeleton, Span } from '@chakra-ui/react' +import { ThemeProvider, useTheme } from 'next-themes' + +import * as React from 'react' +import { LuMoon, LuSun } from 'react-icons/lu' + +export function ColorModeProvider(props) { + return ( + + ) +} + +export function useColorMode() { + const { resolvedTheme, setTheme, forcedTheme } = useTheme() + const colorMode = forcedTheme || resolvedTheme + const toggleColorMode = () => { + setTheme(resolvedTheme === 'dark' ? 'light' : 'dark') + } + return { + colorMode: colorMode, + setColorMode: setTheme, + toggleColorMode, + } +} + +export function useColorModeValue(light, dark) { + const { colorMode } = useColorMode() + return colorMode === 'dark' ? dark : light +} + +export function ColorModeIcon() { + const { colorMode } = useColorMode() + return colorMode === 'dark' ? : +} + +export const ColorModeButton = React.forwardRef( + function ColorModeButton(props, ref) { + const { toggleColorMode } = useColorMode() + return ( + }> + + + + + ) + }, +) + +export const LightMode = React.forwardRef(function LightMode(props, ref) { + return ( + + ) +}) + +export const DarkMode = React.forwardRef(function DarkMode(props, ref) { + return ( + + ) +}) diff --git a/frontend/src/components/ui/provider.jsx b/frontend/src/components/ui/provider.jsx new file mode 100644 index 0000000..80e3e01 --- /dev/null +++ b/frontend/src/components/ui/provider.jsx @@ -0,0 +1,12 @@ +'use client' + +import { ChakraProvider, defaultSystem } from '@chakra-ui/react' +import { ColorModeProvider } from './color-mode' + +export function Provider(props) { + return ( + + + + ) +} diff --git a/frontend/src/components/ui/toaster.jsx b/frontend/src/components/ui/toaster.jsx new file mode 100644 index 0000000..6af2b70 --- /dev/null +++ b/frontend/src/components/ui/toaster.jsx @@ -0,0 +1,43 @@ +'use client' + +import { + Toaster as ChakraToaster, + Portal, + Spinner, + Stack, + Toast, + createToaster, +} from '@chakra-ui/react' + +export const toaster = createToaster({ + placement: 'bottom-end', + pauseOnPageIdle: true, +}) + +export const Toaster = () => { + return ( + + + {(toast) => ( + + {toast.type === 'loading' ? ( + + ) : ( + + )} + + {toast.title && {toast.title}} + {toast.description && ( + {toast.description} + )} + + {toast.action && ( + {toast.action.label} + )} + {toast.closable && } + + )} + + + ) +} diff --git a/frontend/src/components/ui/tooltip.jsx b/frontend/src/components/ui/tooltip.jsx new file mode 100644 index 0000000..ab225cc --- /dev/null +++ b/frontend/src/components/ui/tooltip.jsx @@ -0,0 +1,35 @@ +import { Tooltip as ChakraTooltip, Portal } from '@chakra-ui/react' +import * as React from 'react' + +export const Tooltip = React.forwardRef(function Tooltip(props, ref) { + const { + showArrow, + children, + disabled, + portalled = true, + content, + contentProps, + portalRef, + ...rest + } = props + + if (disabled) return children + + return ( + + {children} + + + + {showArrow && ( + + + + )} + {content} + + + + + ) +}) diff --git a/frontend/src/main.jsx b/frontend/src/main.jsx index b9a1a6d..ab13ea0 100644 --- a/frontend/src/main.jsx +++ b/frontend/src/main.jsx @@ -1,3 +1,4 @@ +import { Provider } from "@/components/ui/provider" import { StrictMode } from 'react' import { createRoot } from 'react-dom/client' import './index.css' @@ -5,6 +6,8 @@ import App from './App.jsx' createRoot(document.getElementById('root')).render( - + + + , ) diff --git a/frontend/src/pages/Cancel.jsx b/frontend/src/pages/Cancel.jsx index 26a28b9..006e323 100644 --- a/frontend/src/pages/Cancel.jsx +++ b/frontend/src/pages/Cancel.jsx @@ -1,5 +1,18 @@ import React from 'react'; import { useSearchParams } from 'react-router-dom'; +import { + Alert, + Text, + Spinner, + Center, + VStack, + HStack, + Button, + Accordion, + Box, + Span +} from "@chakra-ui/react" +import { LuRepeat, LuMoveLeft } from "react-icons/lu"; const Cancel = () => { const [searchParams] = useSearchParams(); @@ -8,6 +21,8 @@ const Cancel = () => { const orderId = searchParams.get('order_id'); const paypalToken = searchParams.get('token'); + const cancelUrl = searchParams.get('cancel_url'); + const handleRetryPayment = () => { // Build the payment URL with original parameters const paymentUrl = new URL('/payment', window.location.origin); @@ -21,44 +36,27 @@ const Cancel = () => { window.location.href = paymentUrl.toString(); }; - const getErrorMessage = () => { - if (error) { - return decodeURIComponent(error); - } - return 'Your payment was cancelled. You can try again or choose a different payment method.'; - }; - - const getIconClass = () => { - return error ? 'status-error' : 'status-warning'; - }; - - const getIconName = () => { - return error ? 'fas fa-times-circle' : 'fas fa-exclamation-triangle'; - }; - - const getTitle = () => { - return error ? 'Payment Failed' : 'Payment Cancelled'; - }; - - const getTitleClass = () => { - return error ? 'text-danger' : 'text-warning'; - }; - return (
-
-
-
- -
+ + + Payment Cancelled + + Your payment was cancelled. You can try again or choose a different payment method. + + -

- {getTitle()} -

+ {/*
*/} + {/* */} + {/*
*/} -

- {getErrorMessage()} -

+ {/*

*/} + {/* {getTitle()}*/} + {/*

*/} + + {/*

*/} + {/* {getErrorMessage()}*/} + {/*

*/} {orderId && (
@@ -79,45 +77,58 @@ const Cancel = () => {
)} -
- - +
+ + + - - Back to Store + + + -
+ + + + + If you're experiencing issues with payment: + + + + + +
  • Check your internet connection
  • +
  • Ensure your PayPal account has sufficient funds
  • +
  • Try using a different payment method
  • +
  • Contact our support team if the problem persists
  • +
    +
    +
    +
    + + + Need Help? + + + + Text + + +
    -
    -
    -
    Need Help?
    -

    If you're experiencing issues with payment:

    -
      -
    • Check your internet connection
    • -
    • Ensure your PayPal account has sufficient funds
    • -
    • Try using a different payment method
    • -
    • Contact our support team if the problem persists
    • -
    -
    -
    - -
    - - - Contact support: support@yourstore.com | 1-800-XXX-XXXX - -
    -
    -
    +
    + Contact Support: {import.meta.env.VITE_REACT_APP_SUPPORT_EMAIL} +
    ); }; diff --git a/frontend/src/pages/Payment.jsx b/frontend/src/pages/Payment.jsx index a70f391..4161304 100644 --- a/frontend/src/pages/Payment.jsx +++ b/frontend/src/pages/Payment.jsx @@ -1,4 +1,18 @@ import React, { useState, useEffect } from 'react'; +import { + Alert, + Heading, + DataList, + Timeline, + Text, + Spinner, + Grid, + GridItem, + Center, + EmptyState, + VStack, HStack +} from "@chakra-ui/react" +import { LuShoppingBasket, LuPackageCheck, LuLoaderCircle, LuMail } from "react-icons/lu"; import { useSearchParams, useNavigate } from 'react-router-dom'; import OrderSummary from '../components/OrderSummary.jsx'; import PayPalButton from '../components/PayPalButton.jsx'; @@ -13,9 +27,14 @@ const Payment = () => { total: searchParams.get('total') || '25.99', currency: searchParams.get('currency') || 'USD', description: searchParams.get('description') || 'Test Order', - customer_email: searchParams.get('customer_email') || 'customer@example.com' + customer_email: searchParams.get('customer_email') || 'customer@example.com', + return_url: searchParams.get('return_url'), + cancel_url: searchParams.get('cancel_url') }); + const [orderItems, setOrderItems] = useState([]); + const [order, setOrder] = useState([]); + const [loading, setLoading] = useState(false); const [error, setError] = useState(''); const [paypalOrderId, setPaypalOrderId] = useState(''); @@ -49,6 +68,25 @@ const Payment = () => { } }, [orderData]); + // Fetch Order + useEffect(() => { + const fetchOrderDetails = async () => { + if (orderData.wc_order_id) { + try { + const data = await paymentAPI.getOrderStatus(orderData.wc_order_id); + if (data.success && data.line_items) { + setOrderItems(data.line_items); + setOrder(data); + } + } catch (error) { + console.error('Failed to fetch order items:', error); + } + } + }; + + fetchOrderDetails(); + }, [orderData.wc_order_id]); + // Create PayPal order const createPayPalOrder = async () => { try { @@ -96,27 +134,141 @@ const Payment = () => { console.log('Payment captured:', data.transaction_id); // Redirect to success page with transaction details - navigate(`/success?transaction_id=${data.transaction_id}&order_id=${orderData.wc_order_id}`); + navigate(`/success?transaction_id=${data.transaction_id}&order_id=${orderData.wc_order_id}&return_url=${encodeURIComponent(orderData.return_url)}`); } catch (error) { console.error('Capture payment error:', error); setError(error.message); - navigate(`/cancel?error=${encodeURIComponent(error.message)}&order_id=${orderData.wc_order_id}`); + navigate(`/cancel?error=${encodeURIComponent(error.message)}&order_id=${orderData.wc_order_id}&cancel_url=${encodeURIComponent(orderData.cancel_url)}`); } finally { setLoading(false); } }; + function getOrdinalSuffix(day) { + if (day > 3 && day < 21) return "th"; // 11th–19th + switch (day % 10) { + case 1: return "st"; + case 2: return "nd"; + case 3: return "rd"; + default: return "th"; + } + } + + function formatDate(date) { + const day = date.getDate(); + const month = date.toLocaleString('default', { month: 'long' }); + const year = date.getFullYear(); + + return `${day}${getOrdinalSuffix(day)} ${month} ${year}`; + } + + function getDateAfterDays(days) { + const date = new Date(); + date.setDate(date.getDate() + days); + return formatDate(date); + } + return (
    + Secure Payment with PayPal + {order.length === 0 ? +
    + + + + + + + Your cart is empty + + Explore our products and add items to your cart + + + + +
    : + + +
    + + +
    + {!error && backendStatus && ( +
    + +
    + )} +
    + + + + + + + + + + + + Order Confirmed + {formatDate(new Date())} + + + + + + + + + + + + Payment in progress + + + + + + + + + + + + + Estimated Delivery Date + {getDateAfterDays(10)} + + We will shipp your product via FedEx and it should + arrive within 7-10 business days. + + + + +
    +
    + + + +
    + } + +
    -
    -

    - - Secure Payment -

    -

    Complete your order securely with PayPal

    -
    {error && ( @@ -127,47 +279,38 @@ const Payment = () => { )} {backendStatus && ( -
    - - Payment system connected - -
    + + + + Payment system connected + + We're available via email and usually respond within a few hours. So don't hesitate to reach out if you need assistance - we're here to help. + + + {import.meta.env.VITE_REACT_APP_SUPPORT_EMAIL} + + + + + )} - - - {!error && backendStatus && ( -
    - -
    - )} - -
    - - - Your payment is secured by PayPal's advanced encryption - -
    - {/* Debug info for development */} - {process.env.NODE_ENV === 'development' && ( -
    -
    Debug Info:
    - - Order ID: {orderData.wc_order_id}
    - Total: ${orderData.total}
    - PayPal Order: {paypalOrderId || 'Not created yet'}
    - Backend: {backendStatus ? '✅ Connected' : '❌ Disconnected'} -
    -
    + {import.meta.env.VITE_NODE_ENV === 'development' && ( + + + + Debug Info + + + Order ID: {orderData.wc_order_id}
    + Total: ${orderData.total}
    + PayPal Order: {paypalOrderId || 'Not created yet'}
    + Backend: {backendStatus ? '✅ Connected' : '❌ Disconnected'} +
    +
    +
    +
    )}
    diff --git a/frontend/src/pages/Success.jsx b/frontend/src/pages/Success.jsx index 0cbb368..4a1eb02 100644 --- a/frontend/src/pages/Success.jsx +++ b/frontend/src/pages/Success.jsx @@ -1,14 +1,44 @@ import React, { useEffect, useState } from 'react'; import { useSearchParams } from 'react-router-dom'; +import { + Alert, + Text, + Spinner, + Center, + VStack, + HStack, + Button, + DataList +} from "@chakra-ui/react" +import { LuMoveLeft } from "react-icons/lu"; const Success = () => { const [searchParams] = useSearchParams(); const [orderStatus, setOrderStatus] = useState(null); const [loading, setLoading] = useState(true); + const [countdown, setCountdown] = useState(10); const transactionId = searchParams.get('transaction_id'); const orderId = searchParams.get('order_id'); const paypalOrderId = searchParams.get('token'); // PayPal adds this + const returnUrl = searchParams.get('return_url'); + + useEffect(() => { + if (!returnUrl) return; + + // Auto-redirect after X seconds + const timer = setInterval(() => { + setCountdown(prev => { + if (prev <= 1) { + window.location.href = decodeURIComponent(returnUrl); + return 0; + } + return prev - 1; + }); + }, 1000); + + return () => clearInterval(timer); + }, [returnUrl]); useEffect(() => { // Simulate checking order status @@ -38,112 +68,84 @@ const Success = () => { if (loading) { return ( -
    -
    -
    -
    -
    - Processing... -
    -

    Confirming your payment...

    -
    -
    -
    -
    + + + Processing and confirming your payment... + ); } return (
    + + + Payment Successful! + + Thank you for your payment. Your transaction has been completed successfully. + A confirmation email has been sent to your email address with all the transaction details. + Redirecting you back to checkout in {countdown} seconds... + + + + + {transactionId && ( + + Transaction ID: + {transactionId} + + )} + {orderId && ( + + Order ID: + {orderId} + + )} + {paypalOrderId && ( + + PayPal Order ID: + {paypalOrderId} + + )} + {orderStatus && orderStatus.success && ( + <> + + PayPal Order ID: + {paypalOrderId} + + + Total: + {formatCurrency(orderStatus.total, orderStatus.currency)} + + {/**/} + {/* Order Status:*/} + {/* */} + {/* {orderStatus.status}*/} + {/* */} + {/**/} + + )} + + + +
    -
    - -
    - -

    Payment Successful!

    -

    Thank you for your payment. Your transaction has been completed successfully.

    - -
    -
    - {transactionId && ( -
    - Transaction ID: -
    - {transactionId} -
    - )} - {orderId && ( -
    - Order ID: -
    - {orderId} -
    - )} - {paypalOrderId && ( -
    - - PayPal Order ID: {paypalOrderId} - -
    - )} -
    -
    - - {orderStatus && orderStatus.success && ( -
    -
    Order Details
    -
    -
    - - Status: - - {orderStatus.status} - - -
    -
    - - Total: {formatCurrency(orderStatus.total, orderStatus.currency)} - -
    -
    -
    - )} - -
    -
    - - A confirmation email has been sent to your email address with all the transaction details. -
    -
    - -
    +
    - - Back to Store + + + - -
    - -
    - - - This transaction was processed securely by PayPal - -
    +
    diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 9531aba..3bc4c70 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -1,9 +1,10 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' +import tsconfigPaths from "vite-tsconfig-paths" // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react()], + plugins: [react(), tsconfigPaths()], server: { port: 5173, proxy: {