diff --git a/.github/workflows/playwright.yml b/.github/workflows/playwright.yml index a6e9332..ed7f7de 100644 --- a/.github/workflows/playwright.yml +++ b/.github/workflows/playwright.yml @@ -8,9 +8,9 @@ on: workflow_dispatch: env: - codex_version: v0.1.7 - circuit_version: v0.1.7 - marketplace_address: "0xfE822Df439d987849a90B64a4C0e26a297DBD47F" + codex_version: v0.1.9 + circuit_version: v0.1.9 + marketplace_address: "0xAB03b6a58C5262f530D54146DA2a552B1C0F7648" eth_provider: "https://rpc.testnet.codex.storage" VITE_CODEX_API_URL: ${{ secrets.VITE_CODEX_API_URL }} VITE_GEO_IP_URL: ${{ secrets.VITE_GEO_IP_URL }} @@ -119,7 +119,7 @@ jobs: run: npm run test - uses: actions/upload-artifact@v4 - # if: ${{ !cancelled() }} + if: ${{ !cancelled() }} with: name: playwright-report path: playwright-report/ diff --git a/e2e/availabilities.spec.ts b/e2e/availabilities.spec.ts index 6306b8a..ff43c45 100644 --- a/e2e/availabilities.spec.ts +++ b/e2e/availabilities.spec.ts @@ -1,11 +1,16 @@ import test, { expect } from "@playwright/test"; +import { Bytes } from "../src/utils/bytes" +import { GB } from "../src/utils/constants" test('create an availability', async ({ page }) => { await page.goto('/dashboard/availabilities'); await page.waitForTimeout(500); - await page.locator('.availabilities-create').first().click(); + await page.locator('.availability-edit button').first().click(); await page.getByLabel('Total size').click(); - await page.getByLabel('Total size').fill('0.50'); + + const value = (Math.random() * 0.5) + 0.1; + + await page.getByLabel('Total size').fill(value.toFixed(1)); await page.getByLabel('Duration').click(); await page.getByLabel('Duration').fill('30'); await page.getByLabel('Min price').click(); @@ -17,17 +22,16 @@ test('create an availability', async ({ page }) => { await page.getByLabel('Nickname').fill('test'); await page.getByRole('button', { name: 'Next' }).click(); await expect(page.getByText('Confirm your new sale')).toBeVisible(); - await expect(page.getByText('512.0 MB').first()).toBeVisible(); await page.getByRole('button', { name: 'Next' }).click(); await expect(page.getByText('Success', { exact: true })).toBeVisible(); await page.getByRole('button', { name: 'Finish' }).click(); - await expect(page.getByText('512.0 MB allocated for the').first()).toBeVisible(); + await expect(page.getByText(Bytes.pretty(parseFloat(value.toFixed(1)) * GB)).first()).toBeVisible(); }) test('availability navigation buttons', async ({ page }) => { await page.goto('/dashboard/availabilities'); await page.waitForTimeout(500); - await page.locator('.availabilities-create').first().click(); + await page.locator('.availability-edit button').first().click(); await expect(page.locator('.stepper-number-done')).not.toBeVisible() await expect(page.locator('.step--active')).toBeVisible() await expect(page.locator('footer .button--primary')).not.toHaveAttribute("disabled"); @@ -55,3 +59,63 @@ test('availability navigation buttons', async ({ page }) => { await page.getByRole('button', { name: 'Finish' }).click(); await expect(page.locator('.modal--open')).not.toBeVisible(); }) + +test('create an availability with changing the duration to months', async ({ page }) => { + await page.goto('/dashboard/availabilities'); + await page.waitForTimeout(500); + await page.locator('.availability-edit button').first().click(); + await page.getByLabel('Total size').click(); + + await page.getByLabel('Total size').fill("0.1"); + await page.getByLabel('Duration').click(); + await page.getByLabel('Duration').fill("3"); + await page.getByRole('combobox').nth(1).selectOption('months'); + + await page.getByLabel('Min price').click(); + await page.getByLabel('Min price').fill('5'); + await page.getByLabel('Max collateral').click(); + await page.getByLabel('Max collateral').fill('30'); + await page.getByLabel('Min price').fill('5'); + await page.getByLabel('Nickname').click(); + await page.getByLabel('Nickname').fill('test'); + await page.getByRole('button', { name: 'Next' }).click(); + await expect(page.getByText('Confirm your new sale')).toBeVisible(); + await page.getByRole('button', { name: 'Next' }).click(); + await expect(page.getByText('Success', { exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'Finish' }).click(); + await expect(page.getByText("3 months").first()).toBeVisible(); +}) + + +test('create an availability after checking max size and invalid input', async ({ page }) => { + await page.goto('/dashboard/availabilities'); + await page.waitForTimeout(500); + await page.locator('.availability-edit button').first().click(); + await page.getByLabel('Total size').click(); + + + await page.getByLabel('Total size').fill("9999"); + await expect(page.getByLabel('Total size')).toHaveAttribute("aria-invalid"); + + await page.getByText("Use max size").click() + await expect(page.getByLabel('Total size')).not.toHaveAttribute("aria-invalid"); + + const value = (Math.random() * 0.5); + await page.getByLabel('Total size').fill(value.toFixed(1)); + + await page.getByLabel('Duration').click(); + await page.getByLabel('Duration').fill('30'); + await page.getByLabel('Min price').click(); + await page.getByLabel('Min price').fill('5'); + await page.getByLabel('Max collateral').click(); + await page.getByLabel('Max collateral').fill('30'); + await page.getByLabel('Min price').fill('5'); + await page.getByLabel('Nickname').click(); + await page.getByLabel('Nickname').fill('test'); + await page.getByRole('button', { name: 'Next' }).click(); + await expect(page.getByText('Confirm your new sale')).toBeVisible(); + await page.getByRole('button', { name: 'Next' }).click(); + await expect(page.getByText('Success', { exact: true })).toBeVisible(); + await page.getByRole('button', { name: 'Finish' }).click(); + await expect(page.getByText(Bytes.pretty(parseFloat(value.toFixed(1)) * GB)).first()).toBeVisible(); +}) \ No newline at end of file diff --git a/e2e/download.spec.ts b/e2e/download.spec.ts index 4a625b0..c3cddd3 100644 --- a/e2e/download.spec.ts +++ b/e2e/download.spec.ts @@ -1,31 +1,29 @@ -// import { test, expect } from '@playwright/test'; -// import path, { dirname } from 'path'; -// import { fileURLToPath } from 'url'; +import { test, expect } from '@playwright/test'; +import path, { dirname } from 'path'; +import { fileURLToPath } from 'url'; -// const __filename = fileURLToPath(import.meta.url); -// const __dirname = dirname(__filename); +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); -// test('download a file', async ({ page, browserName }) => { -// // https://github.com/microsoft/playwright/issues/13037 -// test.skip(browserName.toLowerCase() !== 'chromium', -// `Test only for chromium!`); +test('download a file', async ({ page, browserName }) => { + // https://github.com/microsoft/playwright/issues/13037 + test.skip(browserName.toLowerCase() !== 'chromium', + `Test only for chromium!`); -// await page.goto('/dashboard'); -// await page.locator('div').getByTestId("upload").setInputFiles([ -// path.join(__dirname, "assets", 'chatgpt.jpg'), -// ]); -// await page.context().grantPermissions(["clipboard-read", "clipboard-write"]); -// await page.locator('.files-fileActions > button:nth-child(3)').first().click(); -// await page.getByRole('button', { name: 'Copy CID' }).click(); -// const handle = await page.evaluateHandle(() => navigator.clipboard.readText()); -// const cid = await handle.jsonValue() -// await page.locator('.sheets > .backdrop').click(); -// await page.locator('.download-input input').click(); -// await page.locator('.download-input input').fill(cid); -// // const page1Promise = page.waitForEvent('popup'); -// const downloadPromise = page.waitForEvent('download'); -// await page.locator('div').filter({ hasText: /^Download a fileDownload$/ }).getByRole('button').click(); -// // const page1 = await page1Promise; -// const download = await downloadPromise; -// expect(await download.failure()).toBeNull() -// }); \ No newline at end of file + await page.goto('/dashboard'); + await page.locator('div').getByTestId("upload").setInputFiles([ + path.join(__dirname, "assets", 'chatgpt.jpg'), + ]); + await page.context().grantPermissions(["clipboard-read", "clipboard-write"]); + await page.locator('.file-cell button').first().click(); + const handle = await page.evaluateHandle(() => navigator.clipboard.readText()); + const cid = await handle.jsonValue() + + await page.locator('.download-input input').fill(cid); + // const page1Promise = page.waitForEvent('popup'); + const downloadPromise = page.waitForEvent('download'); + await page.locator('.download-input + button').click(); + // const page1 = await page1Promise; + const download = await downloadPromise; + expect(await download.failure()).toBeNull() +}); \ No newline at end of file diff --git a/e2e/folders.spec.ts b/e2e/folders.spec.ts index dbb5e73..dbca687 100644 --- a/e2e/folders.spec.ts +++ b/e2e/folders.spec.ts @@ -4,17 +4,17 @@ test('create a folder', async ({ page }) => { await page.goto('/dashboard'); await page.locator('#folder').click(); await page.locator('#folder').fill('abc'); - await expect(page.getByText('Enter the folder name')).toBeVisible(); + await expect(page.getByPlaceholder('Folder name')).toBeVisible(); await page.locator('#folder').fill('abc '); - await expect(page.getByText('9 alpha characters maximum')).toBeVisible(); + await expect(page.getByPlaceholder('Folder name')).toHaveAttribute("aria-invalid", "true"); await page.locator('#folder').fill('abc !'); - await expect(page.getByText('9 alpha characters maximum')).toBeVisible(); + await expect(page.getByPlaceholder('Folder name')).toHaveAttribute("aria-invalid", "true"); await page.locator('#folder').fill('abc )'); - await expect(page.getByText('9 alpha characters maximum')).toBeVisible(); + await expect(page.getByPlaceholder('Folder name')).toHaveAttribute("aria-invalid", "true"); await page.locator('#folder').fill('Favorites )'); - await expect(page.getByText('This folder already exists')).toBeVisible(); + await expect(page.getByPlaceholder('Folder name')).toHaveAttribute("aria-invalid", "true"); await page.locator('#folder').fill('abc-_'); - await expect(page.getByText('Enter the folder name')).toBeVisible(); + await expect(page.getByPlaceholder('Folder name')).toBeVisible(); await page.getByRole('button', { name: 'Folder' }).click(); - await expect(page.locator('span').filter({ hasText: 'abc-_' })).toBeVisible(); + await expect(page.locator('span').filter({ hasText: 'abc-_' }).first()).toBeVisible(); }) \ No newline at end of file diff --git a/e2e/onboarding.spec.ts b/e2e/onboarding.spec.ts index a8d9e71..6dd240f 100644 --- a/e2e/onboarding.spec.ts +++ b/e2e/onboarding.spec.ts @@ -1,41 +1,58 @@ -import { test, expect } from '@playwright/test'; +import { test, expect, } from '@playwright/test'; -test('onboarding steps', async ({ page }) => { - await page.context().setOffline(false) - await page.goto('/'); - await expect(page.getByText("Codex is a durable, decentralised data storage protocol, created so the world community can preserve its most important knowledge without risk of censorship.")).toBeVisible() - await page.locator('.navigation').click(); - await expect(page.locator('.navigation')).toHaveAttribute("aria-disabled"); - await page.getByLabel('Preferred name').fill('Arnaud'); - await expect(page.locator('.navigation')).not.toHaveAttribute("aria-disabled"); - await page.locator('.navigation').click(); +test.describe('onboarding', () => { + test('onboarding steps', async ({ page, browserName }) => { + await page.context().setOffline(false) + await page.goto('/'); + await expect(page.getByText("Codex is a durable, decentralised data storage protocol, created so the world community can preserve its most important knowledge without risk of censorship.")).toBeVisible() + await page.locator('.navigation').click(); + await expect(page.locator('.navigation')).toHaveAttribute("aria-disabled"); + await page.getByLabel('Preferred name').fill('Arnaud'); + await expect(page.locator('.navigation')).not.toHaveAttribute("aria-disabled"); + await page.locator('.navigation').click(); - // Network - await expect(page.locator(".health-checks ul li").nth(1).getByTestId("icon-error")).not.toBeVisible() - await expect(page.locator(".health-checks ul li").nth(1).getByTestId("icon-success")).toBeVisible() + // Network + await expect(page.locator(".health-checks ul li").nth(1).getByTestId("icon-error")).not.toBeVisible() + await expect(page.locator(".health-checks ul li").nth(1).getByTestId("icon-success")).toBeVisible() - // Port forwarding - await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-error")).not.toBeVisible() - await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-success")).toBeVisible() + // Port forwarding + await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-error")).not.toBeVisible() + await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-success")).toBeVisible() - // Codex node - await expect(page.locator(".health-checks ul li").nth(3).getByTestId("icon-error")).not.toBeVisible() - await expect(page.locator(".health-checks ul li").nth(3).getByTestId("icon-success")).toBeVisible() + // Codex node + await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-error")).not.toBeVisible() + await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-success")).toBeVisible() - // Marketplace - await expect(page.locator(".health-checks ul li").nth(4).getByTestId("icon-error")).not.toBeVisible() - await expect(page.locator(".health-checks ul li").nth(4).getByTestId("icon-success")).toBeVisible() + // Marketplace + await expect(page.locator(".health-checks ul li").nth(3).getByTestId("icon-warning")).toBeVisible({ timeout: 10_000 }) + await expect(page.locator(".health-checks ul li").nth(3).getByTestId("icon-success")).not.toBeVisible() - await page.context().setOffline(true) + // Can be simulated with File -> Work offline + if (browserName.toLowerCase() !== 'firefox') { + await page.context().setOffline(true) - // Network - await expect(page.locator(".health-checks ul li").nth(1).getByTestId("icon-error")).toBeVisible() - await expect(page.locator(".health-checks ul li").nth(1).getByTestId("icon-success")).not.toBeVisible() + // Network + await expect(page.locator(".health-checks ul li").nth(1).getByTestId("icon-error")).toBeVisible() + await expect(page.locator(".health-checks ul li").nth(1).getByTestId("icon-success")).not.toBeVisible() - await page.context().setOffline(false) -}); + await page.context().setOffline(false) + } + }); -// await expect(page.locator('#root')).toContainText('Network connected'); -// await page.locator('a').nth(2).click(); -// await page.context().setOffline(true) -// await expect(page.locator('#root')).toContainText('Network disconnected'); \ No newline at end of file + test.beforeEach(async ({ page }) => { + await page.context().setOffline(false) + }); +}) + +test('does not display undefined when delete the url value', async ({ page }) => { + await page.goto('/onboarding-checks'); + await page.locator('#url').focus() + + for (let i = 0; i < "http://localhost:8080".length; i++) { + await page.keyboard.press('Backspace'); + } + + await expect(page.locator('#url')).toHaveValue(""); + await expect(page.locator('#url')).toHaveAttribute("aria-invalid") + await expect(page.locator('.refresh svg')).toHaveAttribute("color", "#494949") +}); \ No newline at end of file diff --git a/e2e/settings.spec.ts b/e2e/settings.spec.ts index 6d35e47..94d8192 100644 --- a/e2e/settings.spec.ts +++ b/e2e/settings.spec.ts @@ -14,17 +14,17 @@ test('update the URL with wrong URL applies', async ({ page }) => { await page.getByLabel('Address').click(); await page.getByLabel('Address').fill('hello'); await expect(page.getByLabel('Address')).toHaveAttribute("aria-invalid") - await expect(page.locator(".refresh svg")).toHaveAttribute("aria-disabled") + await expect(page.locator(".refresh svg")).toHaveAttribute("color", "#494949") await page.getByLabel('Address').fill('http://127.0.0.1:8079'); await expect(page.getByLabel('Address')).not.toHaveAttribute("aria-invalid") await expect(page.locator(".refresh svg")).not.toHaveAttribute("aria-disabled") await expect(page.getByLabel('Address')).toHaveValue("http://127.0.0.1") await expect(page.getByLabel('Port')).toHaveValue("8079") await page.locator(".refresh").click() - await expect(page.locator(".health-checks ul li").nth(3).getByTestId("icon-error")).toBeVisible() - await expect(page.locator(".health-checks ul li").nth(3).getByTestId("icon-success")).not.toBeVisible() + await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-error")).toBeVisible() + await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-success")).not.toBeVisible() await page.getByLabel('Address').fill('http://127.0.0.1:8080'); await page.locator(".refresh").click() - await expect(page.locator(".health-checks ul li").nth(3).getByTestId("icon-error")).not.toBeVisible() - await expect(page.locator(".health-checks ul li").nth(3).getByTestId("icon-success")).toBeVisible() + await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-error")).not.toBeVisible() + await expect(page.locator(".health-checks ul li").nth(2).getByTestId("icon-success")).toBeVisible() }) \ No newline at end of file diff --git a/e2e/storage-requests.spec.ts b/e2e/storage-requests.spec.ts index 3dd6edf..a04263d 100644 --- a/e2e/storage-requests.spec.ts +++ b/e2e/storage-requests.spec.ts @@ -20,7 +20,7 @@ test('create a storage request', async ({ page }) => { await expect(page.getByText('Your request is being processed.')).toBeVisible(); await page.getByRole('button', { name: 'Finish' }).click(); await expect(page.getByText('No data.')).not.toBeVisible(); - await page.getByRole('cell', { name: 'pending' }).getByRole('paragraph').click(); + await expect(page.getByTestId('cell-pending').first()).toBeVisible(); }) test('select a uploaded cid when creating a storage request', async ({ page }) => { @@ -30,7 +30,7 @@ test('select a uploaded cid when creating a storage request', async ({ page }) = ]); await page.locator('a').filter({ hasText: 'Purchases' }).click(); await page.getByRole('button', { name: 'Storage Request' }).click(); - await page.getByPlaceholder('Select or type your CID').click(); + await page.getByPlaceholder('CID').click(); await page.locator('.dropdown ul li').nth(1).click(); await expect(page.getByText('button[disabled]')).not.toBeVisible(); }) @@ -73,6 +73,61 @@ test('remove the CID when the file is deleted', async ({ page }) => { path.join(__dirname, "assets", 'chatgpt.jpg'), ]); await expect(page.locator('#cid')).not.toBeEmpty() - await page.locator('.button-icon--small').click(); + await page.locator('.button-icon--small').nth(1).click(); await expect(page.locator('#cid')).toBeEmpty() }) + +test('create a storage request by using decimal values', async ({ page }) => { + await page.goto('/dashboard'); + await page.locator('a').filter({ hasText: 'Purchases' }).click(); + await page.getByRole('button', { name: 'Storage Request' }).click(); + + await page.locator('div').getByTestId("upload").setInputFiles([ + path.join(__dirname, "assets", 'chatgpt.jpg'), + ]); + await expect(page.locator('#cid')).not.toBeEmpty() + await expect(page.getByText('Success, the CID has been')).toBeVisible(); + await page.getByRole('button', { name: 'Next' }).click(); + + await page.getByLabel("Full period of the contract").fill("10") + await expect(page.locator('footer .button--primary')).toHaveAttribute("disabled"); + + await page.getByLabel("Full period of the contract").fill("1") + await expect(page.locator('footer .button--primary')).not.toHaveAttribute("disabled"); + + await page.getByLabel("Full period of the contract").fill("0") + await expect(page.locator('footer .button--primary')).toHaveAttribute("disabled"); + + const value = (Math.random() * 7); + await page.getByLabel("Full period of the contract").fill(value.toFixed(1)) + await expect(page.locator('footer .button--primary')).not.toHaveAttribute("disabled"); + + await page.getByRole('button', { name: 'Next' }).click(); + await expect(page.getByText('Your request is being processed.')).toBeVisible(); + await page.getByRole('button', { name: 'Finish' }).click(); + await expect(page.getByText('No data.')).not.toBeVisible(); + await expect(page.getByText(value.toFixed(1) + " days").first()).toBeVisible(); +}) + +// test('create a storage request by using months', async ({ page }) => { +// await page.goto('/dashboard'); +// await page.locator('a').filter({ hasText: 'Purchases' }).click(); +// await page.getByRole('button', { name: 'Storage Request' }).click(); + +// await page.locator('div').getByTestId("upload").setInputFiles([ +// path.join(__dirname, "assets", 'chatgpt.jpg'), +// ]); +// await expect(page.locator('#cid')).not.toBeEmpty() +// await expect(page.getByText('Success, the CID has been')).toBeVisible(); +// await page.getByRole('button', { name: 'Next' }).click(); + +// await page.getByLabel("Full period of the contract").fill("3") +// await page.getByRole('combobox').selectOption('months'); +// await expect(page.getByLabel("Full period of the contract")).toHaveValue("3") + +// await page.getByRole('button', { name: 'Next' }).click(); +// await expect(page.getByText('Your request is being processed.')).toBeVisible(); +// await page.getByRole('button', { name: 'Finish' }).click(); +// await expect(page.getByText('No data.')).not.toBeVisible(); +// await expect(page.getByText("3 months").first()).toBeVisible(); +// }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index c6a4f28..fa9b331 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,33 +1,33 @@ { "name": "@codex-storage/marketplace-ui", - "version": "0.0.7", + "version": "0.0.13", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@codex-storage/marketplace-ui", - "version": "0.0.7", + "version": "0.0.13", "license": "MIT", "dependencies": { - "@codex-storage/marketplace-ui-components": "^0.0.43", - "@codex-storage/sdk-js": "^0.0.15", + "@codex-storage/marketplace-ui-components": "^0.0.51", + "@codex-storage/sdk-js": "^0.0.16", "@sentry/browser": "^8.32.0", "@sentry/react": "^8.31.0", "@tanstack/react-query": "^5.51.15", - "@tanstack/react-router": "^1.58.7", "dotted-map": "^2.2.3", "echarts": "^5.5.1", "emoji-picker-react": "^4.12.0", "idb-keyval": "^6.2.1", - "lucide-react": "^0.445.0", - "react": "^18.3.1", - "react-dom": "^18.3.1" + "preact": "^10.24.3", + "react-router": "^6.28.0", + "react-router-dom": "^6.28.0" }, "devDependencies": { "@playwright/test": "^1.48.0", + "@preact/preset-vite": "^2.9.1", "@svgr/plugin-svgo": "^8.1.0", "@tanstack/router-plugin": "^1.58.4", - "@types/node": "^22.7.5", + "@types/node": "^22.9.1", "@types/react": "^18.3.8", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^8.7.0", @@ -40,7 +40,9 @@ "postcss": "^8.4.47", "postcss-nesting": "^13.0.1", "prettier": "^3.3.3", - "typescript": "5.5.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "typescript": "^5.5.4", "vite": "^5.4.7", "vite-plugin-svgr": "^4.3.0", "vitest": "^2.1.4" @@ -49,54 +51,11 @@ "node": ">=18" } }, - "../storybook": { - "name": "@codex-storage/marketplace-ui-components", - "version": "0.0.36", - "extraneous": true, - "license": "MIT", - "dependencies": { - "lucide-react": "^0.453.0" - }, - "devDependencies": { - "@chromatic-com/storybook": "^2.0.2", - "@codex-storage/sdk-js": "^0.0.15", - "@storybook/addon-essentials": "^8.2.9", - "@storybook/addon-interactions": "^8.2.9", - "@storybook/addon-links": "^8.2.9", - "@storybook/addon-onboarding": "^8.2.9", - "@storybook/blocks": "^8.2.9", - "@storybook/react": "^8.2.9", - "@storybook/react-vite": "^8.2.9", - "@storybook/test": "^8.2.9", - "@typescript-eslint/eslint-plugin": "^8.6.0", - "@typescript-eslint/parser": "^8.0.0", - "@vitejs/plugin-react": "^4.3.1", - "eslint": "^8.57.0", - "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-react-refresh": "^0.4.7", - "glob": "^9.3.5", - "prettier": "^3.3.3", - "react": "^18.3.1", - "react-dom": "^18.3.1", - "storybook": "^8.2.9", - "typescript": "5.5.2", - "vite-plugin-dts": "^4.0.3", - "vite-plugin-lib-inject-css": "^2.1.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@codex-storage/sdk-js": ">=0.0.14", - "postcss-nesting": "^13.0.1", - "react": "^18.3.1", - "react-dom": "^18.3.1" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", "dev": true, - "license": "Apache-2.0", "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -106,12 +65,13 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.25.7.tgz", - "integrity": "sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.25.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -119,30 +79,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.8.tgz", - "integrity": "sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz", + "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.8.tgz", - "integrity": "sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/helper-compilation-targets": "^7.25.7", - "@babel/helper-module-transforms": "^7.25.7", - "@babel/helpers": "^7.25.7", - "@babel/parser": "^7.25.8", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -158,12 +118,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.7.tgz", - "integrity": "sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz", + "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==", "dev": true, "dependencies": { - "@babel/types": "^7.25.7", + "@babel/parser": "^7.26.2", + "@babel/types": "^7.26.0", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -172,14 +133,26 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz", - "integrity": "sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==", + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.25.7", - "@babel/helper-validator-option": "^7.25.7", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -189,28 +162,27 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz", - "integrity": "sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz", - "integrity": "sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.25.7", - "@babel/helper-simple-access": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "@babel/traverse": "^7.25.7" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -220,89 +192,61 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz", - "integrity": "sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", + "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", "dev": true, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz", - "integrity": "sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==", - "dev": true, - "dependencies": { - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-string-parser": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz", - "integrity": "sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz", - "integrity": "sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz", - "integrity": "sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.7.tgz", - "integrity": "sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "dependencies": { - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.25.7.tgz", - "integrity": "sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.25.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.8.tgz", - "integrity": "sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, "dependencies": { - "@babel/types": "^7.25.8" + "@babel/types": "^7.26.0" }, "bin": { "parser": "bin/babel-parser.js" @@ -312,12 +256,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz", - "integrity": "sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -327,12 +271,46 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz", - "integrity": "sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.25.7" + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz", + "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz", + "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==", + "dev": true, + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -342,11 +320,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.24.7", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.9.tgz", + "integrity": "sha512-y8quW6p0WHkEhmErnfe58r7x0A70uKphQm8Sp8cV7tjNQwK56sNVK0M73LK3WuYmsuyrftut4xAkjjgU0twaMg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -356,11 +335,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.24.7", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.9.tgz", + "integrity": "sha512-+iqjT8xmXhhYv4/uiYd8FNQsraMFZIfxVSqxxVSZP0WbbSAWvBXAul0m/zu+7Vv4O/3WtApy9pmaTMiumEZgfg==", "dev": true, - "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -370,30 +350,30 @@ } }, "node_modules/@babel/template": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.7.tgz", - "integrity": "sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/types": "^7.25.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.25.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.7.tgz", - "integrity": "sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz", + "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.25.7", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/types": "^7.25.7", + "@babel/code-frame": "^7.25.9", + "@babel/generator": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/types": "^7.25.9", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -402,56 +382,35 @@ } }, "node_modules/@babel/types": { - "version": "7.25.8", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.8.tgz", - "integrity": "sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.25.7", - "@babel/helper-validator-identifier": "^7.25.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@bufbuild/protobuf": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.1.0.tgz", - "integrity": "sha512-+2Mx67Y3skJ4NCD/qNSdBJNWtu6x6Qr53jeNg+QcwiL6mt0wK+3jwHH2x1p7xaYH6Ve2JKOVn0OxU35WsmqI9A==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/@codex-storage/marketplace-ui-components": { - "version": "0.0.43", - "resolved": "https://registry.npmjs.org/@codex-storage/marketplace-ui-components/-/marketplace-ui-components-0.0.43.tgz", - "integrity": "sha512-rNhLfbJXu/1ZKh8hTnD2PkUcj/6M0/jHEfHJ86vIgFX4AFPq4+XGMstylx33VZAUYiDCEAc8iyJV/hMXjTNOsA==", - "dependencies": { - "lucide-react": "^0.453.0" - }, + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@codex-storage/marketplace-ui-components/-/marketplace-ui-components-0.0.51.tgz", + "integrity": "sha512-KPPFlcpx3a83WCBSLbRONrF/yr4J/ctyTfFPxMaRSMTRD1LtfIE0uPy3QxtHs6tigOts2h4DEz6Kn2ynHdfKPg==", "engines": { "node": ">=18" }, "peerDependencies": { "@codex-storage/sdk-js": ">=0.0.14", - "postcss-nesting": "^13.0.1", "react": "^18.3.1", "react-dom": "^18.3.1" } }, - "node_modules/@codex-storage/marketplace-ui-components/node_modules/lucide-react": { - "version": "0.453.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.453.0.tgz", - "integrity": "sha512-kL+RGZCcJi9BvJtzg2kshO192Ddy9hv3ij+cPrVPWSRzgCWCVazoQJxOjAwgK53NomL07HB7GPHW120FimjNhQ==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, "node_modules/@codex-storage/sdk-js": { - "version": "0.0.15", - "resolved": "https://registry.npmjs.org/@codex-storage/sdk-js/-/sdk-js-0.0.15.tgz", - "integrity": "sha512-asL59uhHNI2zPLEcygh6HnZEdQJebSjU2JXut6xZxAI87VVkWfN9Y1BxlyxgsF+wJF10DB0tnv3cPEI3wb2huQ==", + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/@codex-storage/sdk-js/-/sdk-js-0.0.16.tgz", + "integrity": "sha512-aeb2likTXXL8oE1P5c2c54NluJ5NcGqhfihE3/3AXHo1U+Y3ZXDRuKpPpNesGjGqs6EDuLAm8b+g0FJjJBhnbQ==", "dependencies": { "valibot": "^0.32.0" }, @@ -463,6 +422,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/@csstools/selector-resolve-nested/-/selector-resolve-nested-3.0.0.tgz", "integrity": "sha512-ZoK24Yku6VJU1gS79a5PFmC8yn3wIapiKmPgun0hZgEI5AOqgH2kiPRsPz1qkGv4HL+wuDLH83yQyk6inMYrJQ==", + "dev": true, "funding": [ { "type": "github", @@ -484,6 +444,7 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, "funding": [ { "type": "github", @@ -501,32 +462,422 @@ "postcss-selector-parser": "^7.0.0" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", + "node_modules/@esbuild/aix-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", + "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", + "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", + "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", + "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", + "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", + "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", + "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", + "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", + "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", + "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", + "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", + "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", + "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", + "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", + "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", + "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", + "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", + "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", + "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", + "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", + "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", + "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", + "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", + "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", "dev": true, - "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, + "funding": { + "url": "https://opencollective.com/eslint" + }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/regexpp": { - "version": "4.11.0", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", "dev": true, - "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", "dev": true, - "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -547,8 +898,9 @@ }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -556,8 +908,9 @@ }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -570,8 +923,9 @@ }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -580,19 +934,22 @@ } }, "node_modules/@eslint/js": { - "version": "8.57.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz", + "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==", "dev": true, - "license": "MIT", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz", + "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==", + "deprecated": "Use @eslint/config-array instead", "dev": true, - "license": "Apache-2.0", "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", + "@humanwhocodes/object-schema": "^2.0.3", "debug": "^4.3.1", "minimatch": "^3.0.5" }, @@ -602,8 +959,9 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -611,8 +969,9 @@ }, "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -622,8 +981,9 @@ }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "Apache-2.0", "engines": { "node": ">=12.22" }, @@ -634,13 +994,16 @@ }, "node_modules/@humanwhocodes/object-schema": { "version": "2.0.3", - "dev": true, - "license": "BSD-3-Clause" + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "deprecated": "Use @eslint/object-schema instead", + "dev": true }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -652,29 +1015,33 @@ }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, - "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -682,8 +1049,9 @@ }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -694,16 +1062,18 @@ }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, - "license": "MIT", "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, - "license": "MIT", "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -713,12 +1083,12 @@ } }, "node_modules/@playwright/test": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.1.tgz", - "integrity": "sha512-s9RtWoxkOLmRJdw3oFvhFbs9OJS0BzrLUc8Hf6l2UdCNd1rqeEyD4BhCJkvzeEoD1FsK4mirsWwGerhVmYKtZg==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.0.tgz", + "integrity": "sha512-DMulbwQURa8rNIQrf94+jPJQ4FmOVdpE5ZppRNvWVjvhC+6sOeo28r8MgIpQRYouXRtt/FCCXU7zn20jnHR4Qw==", "dev": true, "dependencies": { - "playwright": "1.48.1" + "playwright": "1.49.0" }, "bin": { "playwright": "cli.js" @@ -727,6 +1097,114 @@ "node": ">=18" } }, + "node_modules/@preact/preset-vite": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/@preact/preset-vite/-/preset-vite-2.9.1.tgz", + "integrity": "sha512-JecWzrOx7ogFhklSMhY+aH/24pajL0Vx+beEgau3WDMUUAo32cpUo/UqerPhLOyhCKXlxK9a3cRoa8g68ZAp5g==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/plugin-transform-react-jsx": "^7.22.15", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@prefresh/vite": "^2.4.1", + "@rollup/pluginutils": "^4.1.1", + "babel-plugin-transform-hook-names": "^1.0.2", + "debug": "^4.3.4", + "kolorist": "^1.8.0", + "magic-string": "0.30.5", + "node-html-parser": "^6.1.10", + "source-map": "^0.7.4", + "stack-trace": "^1.0.0-pre2" + }, + "peerDependencies": { + "@babel/core": "7.x", + "vite": "2.x || 3.x || 4.x || 5.x" + } + }, + "node_modules/@preact/preset-vite/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@preact/preset-vite/node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@prefresh/babel-plugin": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/@prefresh/babel-plugin/-/babel-plugin-0.5.1.tgz", + "integrity": "sha512-uG3jGEAysxWoyG3XkYfjYHgaySFrSsaEb4GagLzYaxlydbuREtaX+FTxuIidp241RaLl85XoHg9Ej6E4+V1pcg==", + "dev": true + }, + "node_modules/@prefresh/core": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@prefresh/core/-/core-1.5.3.tgz", + "integrity": "sha512-nDzxj0tA1/M6APNAWqaxkZ+3sTdPHESa+gol4+Bw7rMc2btWdkLoNH7j9rGhUb8SThC0Vz0VoXtq+U+9azGLHg==", + "dev": true, + "peerDependencies": { + "preact": "^10.0.0" + } + }, + "node_modules/@prefresh/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@prefresh/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==", + "dev": true + }, + "node_modules/@prefresh/vite": { + "version": "2.4.6", + "resolved": "https://registry.npmjs.org/@prefresh/vite/-/vite-2.4.6.tgz", + "integrity": "sha512-miYbTl2J1YNaQJWyWHJzyIpNh7vKUuXC1qCDRzPeWjhQ+9bxeXkUBGDGd9I1f37R5GQYi1S65AN5oR0BR2WzvQ==", + "dev": true, + "dependencies": { + "@babel/core": "^7.22.1", + "@prefresh/babel-plugin": "0.5.1", + "@prefresh/core": "^1.5.1", + "@prefresh/utils": "^1.2.0", + "@rollup/pluginutils": "^4.2.1" + }, + "peerDependencies": { + "preact": "^10.4.0", + "vite": ">=2.0.0" + } + }, + "node_modules/@prefresh/vite/node_modules/@rollup/pluginutils": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-4.2.1.tgz", + "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==", + "dev": true, + "dependencies": { + "estree-walker": "^2.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/@remix-run/router": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.21.0.tgz", + "integrity": "sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==", + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/@rollup/pluginutils": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.3.tgz", @@ -749,12 +1227,6 @@ } } }, - "node_modules/@rollup/pluginutils/node_modules/estree-walker": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", - "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", - "dev": true - }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", @@ -768,9 +1240,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.22.4.tgz", - "integrity": "sha512-Fxamp4aEZnfPOcGA8KSNEohV8hX7zVHOemC8jVBoBUHu5zpJK/Eu3uJwt6BMgy9fkvzxDaurgj96F/NiLukF2w==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.3.tgz", + "integrity": "sha512-EzxVSkIvCFxUd4Mgm4xR9YXrcp976qVaHnqom/Tgm+vU79k4vV4eYTjmRvGfeoW8m9LVcsAy/lGjcgVegKEhLQ==", "cpu": [ "arm" ], @@ -781,9 +1253,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.22.4.tgz", - "integrity": "sha512-VXoK5UMrgECLYaMuGuVTOx5kcuap1Jm8g/M83RnCHBKOqvPPmROFJGQaZhGccnsFtfXQ3XYa4/jMCJvZnbJBdA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.3.tgz", + "integrity": "sha512-LJc5pDf1wjlt9o/Giaw9Ofl+k/vLUaYsE2zeQGH85giX2F+wn/Cg8b3c5CDP3qmVmeO5NzwVUzQQxwZvC2eQKw==", "cpu": [ "arm64" ], @@ -794,9 +1266,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.22.4.tgz", - "integrity": "sha512-xMM9ORBqu81jyMKCDP+SZDhnX2QEVQzTcC6G18KlTQEzWK8r/oNZtKuZaCcHhnsa6fEeOBionoyl5JsAbE/36Q==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.3.tgz", + "integrity": "sha512-OuRysZ1Mt7wpWJ+aYKblVbJWtVn3Cy52h8nLuNSzTqSesYw1EuN6wKp5NW/4eSre3mp12gqFRXOKTcN3AI3LqA==", "cpu": [ "arm64" ], @@ -807,9 +1279,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.22.4.tgz", - "integrity": "sha512-aJJyYKQwbHuhTUrjWjxEvGnNNBCnmpHDvrb8JFDbeSH3m2XdHcxDd3jthAzvmoI8w/kSjd2y0udT+4okADsZIw==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.3.tgz", + "integrity": "sha512-xW//zjJMlJs2sOrCmXdB4d0uiilZsOdlGQIC/jjmMWT47lkLLoB1nsNhPUcnoqyi5YR6I4h+FjBpILxbEy8JRg==", "cpu": [ "x64" ], @@ -819,10 +1291,36 @@ "darwin" ] }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.3.tgz", + "integrity": "sha512-58E0tIcwZ+12nK1WiLzHOD8I0d0kdrY/+o7yFVPRHuVGY3twBwzwDdTIBGRxLmyjciMYl1B/U515GJy+yn46qw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.3.tgz", + "integrity": "sha512-78fohrpcVwTLxg1ZzBMlwEimoAJmY6B+5TsyAZ3Vok7YabRBUvjYTsRXPTjGEvv/mfgVBepbW28OlMEz4w8wGA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.22.4.tgz", - "integrity": "sha512-j63YtCIRAzbO+gC2L9dWXRh5BFetsv0j0va0Wi9epXDgU/XUi5dJKo4USTttVyK7fGw2nPWK0PbAvyliz50SCQ==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.3.tgz", + "integrity": "sha512-h2Ay79YFXyQi+QZKo3ISZDyKaVD7uUvukEHTOft7kh00WF9mxAaxZsNs3o/eukbeKuH35jBvQqrT61fzKfAB/Q==", "cpu": [ "arm" ], @@ -833,9 +1331,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.22.4.tgz", - "integrity": "sha512-dJnWUgwWBX1YBRsuKKMOlXCzh2Wu1mlHzv20TpqEsfdZLb3WoJW2kIEsGwLkroYf24IrPAvOT/ZQ2OYMV6vlrg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.3.tgz", + "integrity": "sha512-Sv2GWmrJfRY57urktVLQ0VKZjNZGogVtASAgosDZ1aUB+ykPxSi3X1nWORL5Jk0sTIIwQiPH7iE3BMi9zGWfkg==", "cpu": [ "arm" ], @@ -846,9 +1344,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.22.4.tgz", - "integrity": "sha512-AdPRoNi3NKVLolCN/Sp4F4N1d98c4SBnHMKoLuiG6RXgoZ4sllseuGioszumnPGmPM2O7qaAX/IJdeDU8f26Aw==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.3.tgz", + "integrity": "sha512-FPoJBLsPW2bDNWjSrwNuTPUt30VnfM8GPGRoLCYKZpPx0xiIEdFip3dH6CqgoT0RnoGXptaNziM0WlKgBc+OWQ==", "cpu": [ "arm64" ], @@ -859,9 +1357,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.22.4.tgz", - "integrity": "sha512-Gl0AxBtDg8uoAn5CCqQDMqAx22Wx22pjDOjBdmG0VIWX3qUBHzYmOKh8KXHL4UpogfJ14G4wk16EQogF+v8hmA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.3.tgz", + "integrity": "sha512-TKxiOvBorYq4sUpA0JT+Fkh+l+G9DScnG5Dqx7wiiqVMiRSkzTclP35pE6eQQYjP4Gc8yEkJGea6rz4qyWhp3g==", "cpu": [ "arm64" ], @@ -872,9 +1370,9 @@ ] }, "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.22.4.tgz", - "integrity": "sha512-3aVCK9xfWW1oGQpTsYJJPF6bfpWfhbRnhdlyhak2ZiyFLDaayz0EP5j9V1RVLAAxlmWKTDfS9wyRyY3hvhPoOg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.3.tgz", + "integrity": "sha512-v2M/mPvVUKVOKITa0oCFksnQQ/TqGrT+yD0184/cWHIu0LoIuYHwox0Pm3ccXEz8cEQDLk6FPKd1CCm+PlsISw==", "cpu": [ "ppc64" ], @@ -885,9 +1383,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.22.4.tgz", - "integrity": "sha512-ePYIir6VYnhgv2C5Xe9u+ico4t8sZWXschR6fMgoPUK31yQu7hTEJb7bCqivHECwIClJfKgE7zYsh1qTP3WHUA==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.3.tgz", + "integrity": "sha512-LdrI4Yocb1a/tFVkzmOE5WyYRgEBOyEhWYJe4gsDWDiwnjYKjNs7PS6SGlTDB7maOHF4kxevsuNBl2iOcj3b4A==", "cpu": [ "riscv64" ], @@ -898,9 +1396,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.22.4.tgz", - "integrity": "sha512-GqFJ9wLlbB9daxhVlrTe61vJtEY99/xB3C8e4ULVsVfflcpmR6c8UZXjtkMA6FhNONhj2eA5Tk9uAVw5orEs4Q==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.3.tgz", + "integrity": "sha512-d4wVu6SXij/jyiwPvI6C4KxdGzuZOvJ6y9VfrcleHTwo68fl8vZC5ZYHsCVPUi4tndCfMlFniWgwonQ5CUpQcA==", "cpu": [ "s390x" ], @@ -911,9 +1409,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.22.4.tgz", - "integrity": "sha512-87v0ol2sH9GE3cLQLNEy0K/R0pz1nvg76o8M5nhMR0+Q+BBGLnb35P0fVz4CQxHYXaAOhE8HhlkaZfsdUOlHwg==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.3.tgz", + "integrity": "sha512-/6bn6pp1fsCGEY5n3yajmzZQAh+mW4QPItbiWxs69zskBzJuheb3tNynEjL+mKOsUSFK11X4LYF2BwwXnzWleA==", "cpu": [ "x64" ], @@ -924,9 +1422,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.22.4.tgz", - "integrity": "sha512-UV6FZMUgePDZrFjrNGIWzDo/vABebuXBhJEqrHxrGiU6HikPy0Z3LfdtciIttEUQfuDdCn8fqh7wiFJjCNwO+g==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.3.tgz", + "integrity": "sha512-nBXOfJds8OzUT1qUreT/en3eyOXd2EH5b0wr2bVB5999qHdGKkzGzIyKYaKj02lXk6wpN71ltLIaQpu58YFBoQ==", "cpu": [ "x64" ], @@ -937,9 +1435,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.22.4.tgz", - "integrity": "sha512-BjI+NVVEGAXjGWYHz/vv0pBqfGoUH0IGZ0cICTn7kB9PyjrATSkX+8WkguNjWoj2qSr1im/+tTGRaY+4/PdcQw==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.3.tgz", + "integrity": "sha512-ogfbEVQgIZOz5WPWXF2HVb6En+kWzScuxJo/WdQTqEgeyGkaa2ui5sQav9Zkr7bnNCLK48uxmmK0TySm22eiuw==", "cpu": [ "arm64" ], @@ -950,9 +1448,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.22.4.tgz", - "integrity": "sha512-SiWG/1TuUdPvYmzmYnmd3IEifzR61Tragkbx9D3+R8mzQqDBz8v+BvZNDlkiTtI9T15KYZhP0ehn3Dld4n9J5g==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.3.tgz", + "integrity": "sha512-ecE36ZBMLINqiTtSNQ1vzWc5pXLQHlf/oqGp/bSbi7iedcjcNb6QbCBNG73Euyy2C+l/fn8qKWEwxr+0SSfs3w==", "cpu": [ "ia32" ], @@ -963,9 +1461,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.22.4.tgz", - "integrity": "sha512-j8pPKp53/lq9lMXN57S8cFz0MynJk8OWNuUnXct/9KCpKU7DgU3bYMJhwWmcqC0UU29p8Lr0/7KEVcaM6bf47Q==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.3.tgz", + "integrity": "sha512-vliZLrDmYKyaUoMzEbMTg2JkerfBjn03KmAw9CykO0Zzkzoyd7o3iZNam/TpyWNjNT+Cz2iO3P9Smv2wgrR+Eg==", "cpu": [ "x64" ], @@ -976,97 +1474,97 @@ ] }, "node_modules/@sentry-internal/browser-utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.35.0.tgz", - "integrity": "sha512-uj9nwERm7HIS13f/Q52hF/NUS5Al8Ma6jkgpfYGeppYvU0uSjPkwMogtqoJQNbOoZg973tV8qUScbcWY616wNA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-8.39.0.tgz", + "integrity": "sha512-5jcO3os1aQIMNZptniMUCCkZ3KOvyUPSyrQeGB7NxhJoieIwmopo5qIXyeRLHu0htL7H7A1gPYln6Ji3d/KUUA==", "dependencies": { - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry/core": "8.39.0", + "@sentry/types": "8.39.0", + "@sentry/utils": "8.39.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/feedback": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.35.0.tgz", - "integrity": "sha512-7bjSaUhL0bDArozre6EiIhhdWdT/1AWNWBC1Wc5w1IxEi5xF7nvF/FfvjQYrONQzZAI3HRxc45J2qhLUzHBmoQ==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-8.39.0.tgz", + "integrity": "sha512-V5J/tnzAK8bXdXQzY7lnlYMqfTKgI+9BD7L7oHxQnDUzlShsV14xFGZVhEbPsjYficdIN9wpoYIyWDxwrFX1Qg==", "dependencies": { - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry/core": "8.39.0", + "@sentry/types": "8.39.0", + "@sentry/utils": "8.39.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.35.0.tgz", - "integrity": "sha512-3wkW03vXYMyWtTLxl9yrtkV+qxbnKFgfASdoGWhXzfLjycgT6o4/04eb3Gn71q9aXqRwH17ISVQbVswnRqMcmA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-8.39.0.tgz", + "integrity": "sha512-1IEXhg2XuKC1hx/Pf5p2L7McKjQPfVOWyQhjNUH2mHWbpOyvc1BhZoZKCgbbspwOAVuvj4n40PvOVyjfzU5Yew==", "dependencies": { - "@sentry-internal/browser-utils": "8.35.0", - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry-internal/browser-utils": "8.39.0", + "@sentry/core": "8.39.0", + "@sentry/types": "8.39.0", + "@sentry/utils": "8.39.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry-internal/replay-canvas": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.35.0.tgz", - "integrity": "sha512-TUrH6Piv19kvHIiRyIuapLdnuwxk/Un/l1WDCQfq7mK9p1Pac0FkQ7Uufjp6zY3lyhDDZQ8qvCS4ioCMibCwQg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-8.39.0.tgz", + "integrity": "sha512-NCp4E60SFfg9pXdMgcdpctYENFOvJ58UPGllGjO3xpYoMkd4DGZQp947Tgw9hATTCDnyYNIy5v/zYbDV4Wbw3w==", "dependencies": { - "@sentry-internal/replay": "8.35.0", - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry-internal/replay": "8.39.0", + "@sentry/core": "8.39.0", + "@sentry/types": "8.39.0", + "@sentry/utils": "8.39.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/browser": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.35.0.tgz", - "integrity": "sha512-WHfI+NoZzpCsmIvtr6ChOe7yWPLQyMchPnVhY3Z4UeC70bkYNdKcoj/4XZbX3m0D8+71JAsm0mJ9s9OC3Ue6MQ==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-8.39.0.tgz", + "integrity": "sha512-Xpqh84MnqoFID0owbugTeq/3QXgNwc3EdHAN/HFUdxEAyJS4j7Wi1DIBXN+ZRzMYX3m2QHOAymCWjnFtv+H8WQ==", "dependencies": { - "@sentry-internal/browser-utils": "8.35.0", - "@sentry-internal/feedback": "8.35.0", - "@sentry-internal/replay": "8.35.0", - "@sentry-internal/replay-canvas": "8.35.0", - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry-internal/browser-utils": "8.39.0", + "@sentry-internal/feedback": "8.39.0", + "@sentry-internal/replay": "8.39.0", + "@sentry-internal/replay-canvas": "8.39.0", + "@sentry/core": "8.39.0", + "@sentry/types": "8.39.0", + "@sentry/utils": "8.39.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/core": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.35.0.tgz", - "integrity": "sha512-Ci0Nmtw5ETWLqQJGY4dyF+iWh7PWKy6k303fCEoEmqj2czDrKJCp7yHBNV0XYbo00prj2ZTbCr6I7albYiyONA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-8.39.0.tgz", + "integrity": "sha512-rg2mHtwdCaedqub7bd+ht08vZgtwPO7el5m5sPNeb7V75GcQwSziu6G02vGxCBCsAHpoFn1A+0JLEajaYzZI7w==", "dependencies": { - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0" + "@sentry/types": "8.39.0", + "@sentry/utils": "8.39.0" }, "engines": { "node": ">=14.18" } }, "node_modules/@sentry/react": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.35.0.tgz", - "integrity": "sha512-8Y+s4pE9hvT2TwSo5JS/Enw2cNFlwiLcJDNGCj/Hho+FePFYA59hbN06ouTHWARnO+swANHKZQj24Wp57p1/tg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-8.39.0.tgz", + "integrity": "sha512-IBtAE/lIiDyp+5GY7k2saZ0bRM3Lz7oFGYKCT14anpUCDyaUFAUZd/q3iuoOpHb7hMpAV4ABB69JhuimAboqGg==", "dependencies": { - "@sentry/browser": "8.35.0", - "@sentry/core": "8.35.0", - "@sentry/types": "8.35.0", - "@sentry/utils": "8.35.0", + "@sentry/browser": "8.39.0", + "@sentry/core": "8.39.0", + "@sentry/types": "8.39.0", + "@sentry/utils": "8.39.0", "hoist-non-react-statics": "^3.3.2" }, "engines": { @@ -1077,19 +1575,19 @@ } }, "node_modules/@sentry/types": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.35.0.tgz", - "integrity": "sha512-AVEZjb16MlYPifiDDvJ19dPQyDn0jlrtC1PHs6ZKO+Rzyz+2EX2BRdszvanqArldexPoU1p5Bn2w81XZNXThBA==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-8.39.0.tgz", + "integrity": "sha512-/n1bGkbJcSLZQpzd1Oksi8LFAMbcO8j/d+N8mcXS74GuhGgkxQiEwHF2CKTz6SHt8J4hrlyzqIwVzCevUOxZ2Q==", "engines": { "node": ">=14.18" } }, "node_modules/@sentry/utils": { - "version": "8.35.0", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.35.0.tgz", - "integrity": "sha512-MdMb6+uXjqND7qIPWhulubpSeHzia6HtxeJa8jYI09OCvIcmNGPydv/Gx/LZBwosfMHrLdTWcFH7Y7aCxrq7cg==", + "version": "8.39.0", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-8.39.0.tgz", + "integrity": "sha512-pIBnr/cROds92CcYWBW3z1zFH4uJkMPL2AxEv/ZcLg/NTb1Okz/ZaDP+NMzUfzriYvFBOFk0wPk0h5sYx6Umqw==", "dependencies": { - "@sentry/types": "8.35.0" + "@sentry/types": "8.39.0" }, "engines": { "node": ">=14.18" @@ -1329,33 +1827,21 @@ "@svgr/core": "*" } }, - "node_modules/@tanstack/history": { - "version": "1.61.1", - "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.61.1.tgz", - "integrity": "sha512-2CqERleeqO3hkhJmyJm37tiL3LYgeOpmo8szqdjgtnnG0z7ZpvzkZz6HkfOr9Ca/ha7mhAiouSvLYuLkM37AMg==", - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, "node_modules/@tanstack/query-core": { - "version": "5.59.13", - "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.13.tgz", - "integrity": "sha512-Oou0bBu/P8+oYjXsJQ11j+gcpLAMpqW42UlokQYEz4dE7+hOtVO9rVuolJKgEccqzvyFzqX4/zZWY+R/v1wVsQ==", + "version": "5.60.6", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.60.6.tgz", + "integrity": "sha512-tI+k0KyCo1EBJ54vxK1kY24LWj673ujTydCZmzEZKAew4NqZzTaVQJEuaG1qKj2M03kUHN46rchLRd+TxVq/zQ==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@tanstack/react-query": { - "version": "5.59.15", - "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.15.tgz", - "integrity": "sha512-QbVlAkTI78wB4Mqgf2RDmgC0AOiJqer2c5k9STOOSXGv1S6ZkY37r/6UpE8DbQ2Du0ohsdoXgFNEyv+4eDoPEw==", + "version": "5.60.6", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.60.6.tgz", + "integrity": "sha512-FUzSDaiPkuZCmuGqrixfRRXJV9u+nrUh9lAlA5Q3ZFrOw1Js1VeBfxi1NIcJO3ZWJdKceBqKeBJdNcWStCYZnw==", "dependencies": { - "@tanstack/query-core": "5.59.13" + "@tanstack/query-core": "5.60.6" }, "funding": { "type": "github", @@ -1365,60 +1851,15 @@ "react": "^18 || ^19" } }, - "node_modules/@tanstack/react-router": { - "version": "1.75.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.75.0.tgz", - "integrity": "sha512-iELqrMjlE/Y2JeOkvTfrPPKovrvtj1M+PTESfNfNv26Ja1efotcx0hEXiClmT7KYIlVBf0TowI5GUBNWGArm6A==", - "dependencies": { - "@tanstack/history": "1.61.1", - "@tanstack/react-store": "^0.5.6", - "tiny-invariant": "^1.3.3", - "tiny-warning": "^1.0.3" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "@tanstack/router-generator": "1.74.2", - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "@tanstack/router-generator": { - "optional": true - } - } - }, - "node_modules/@tanstack/react-store": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.5.6.tgz", - "integrity": "sha512-SitIpS5jTj28DajjLpWbIX+YetmJL+6PRY0DKKiCGBKfYIqj3ryODQYF3jB3SNoR9ifUA/jFkqbJdBKFtWd+AQ==", - "dependencies": { - "@tanstack/store": "0.5.5", - "use-sync-external-store": "^1.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - }, - "peerDependencies": { - "react": "^17.0.0 || ^18.0.0", - "react-dom": "^17.0.0 || ^18.0.0" - } - }, "node_modules/@tanstack/router-generator": { - "version": "1.74.2", - "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.74.2.tgz", - "integrity": "sha512-S69fXvYcL+tQsO5Fe9ju/XVa/hZvk4pCaWbtoR2MNjIgR2RmjiFKOgXYeLRMNom/IpP/HAQmQ3m1DwU9jjSUKA==", - "devOptional": true, + "version": "1.81.9", + "resolved": "https://registry.npmjs.org/@tanstack/router-generator/-/router-generator-1.81.9.tgz", + "integrity": "sha512-HiInbc11+E65tg5xlgg0z/hqQJkQBUpr4RCEQeEoortlgQ38Yi+PSuoc2IO+n03XPGSqPMhCS6Q1MiMgfRfwZw==", + "dev": true, "dependencies": { - "@tanstack/virtual-file-routes": "^1.64.0", + "@tanstack/virtual-file-routes": "^1.81.9", "prettier": "^3.3.3", - "tsx": "^4.19.1", + "tsx": "^4.19.2", "zod": "^3.23.8" }, "engines": { @@ -1429,490 +1870,22 @@ "url": "https://github.com/sponsors/tannerlinsley" } }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/aix-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.1.tgz", - "integrity": "sha512-6VhYk1diRqrhBAqpJEdjASR/+WVRtfjpqKuNw11cLiaWpAT/Uu+nokB+UJnevzy/P9C/ty6AOe0dwueMrGh/iQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/android-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.1.tgz", - "integrity": "sha512-uz6/tEy2IFm9RYOyvKl88zdzZfwEfKZmnX9Cj1BHjeSGNuGLuMD1kR8y5bteYmwqKm1tj8m4cb/aKEorr6fHWQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/android-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.1.tgz", - "integrity": "sha512-xw50ipykXcLstLeWH7WRdQuysJqejuAGPd30vd1i5zSyKK3WE+ijzHmLKxdiCMtH1pHz78rOg0BKSYOSB/2Khw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/android-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.1.tgz", - "integrity": "sha512-nlN9B69St9BwUoB+jkyU090bru8L0NA3yFvAd7k8dNsVH8bi9a8cUAUSEcEEgTp2z3dbEDGJGfP6VUnkQnlReg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/darwin-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.1.tgz", - "integrity": "sha512-YsS2e3Wtgnw7Wq53XXBLcV6JhRsEq8hkfg91ESVadIrzr9wO6jJDMZnCQbHm1Guc5t/CdDiFSSfWP58FNuvT3Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/darwin-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.1.tgz", - "integrity": "sha512-aClqdgTDVPSEGgoCS8QDG37Gu8yc9lTHNAQlsztQ6ENetKEO//b8y31MMu2ZaPbn4kVsIABzVLXYLhCGekGDqw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.1.tgz", - "integrity": "sha512-h1k6yS8/pN/NHlMl5+v4XPfikhJulk4G+tKGFIOwURBSFzE8bixw1ebjluLOjfwtLqY0kewfjLSrO6tN2MgIhA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/freebsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.1.tgz", - "integrity": "sha512-lK1eJeyk1ZX8UklqFd/3A60UuZ/6UVfGT2LuGo3Wp4/z7eRTRYY+0xOu2kpClP+vMTi9wKOfXi2vjUpO1Ro76g==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-arm": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.1.tgz", - "integrity": "sha512-CXXkzgn+dXAPs3WBwE+Kvnrf4WECwBdfjfeYHpMeVxWE0EceB6vhWGShs6wi0IYEqMSIzdOF1XjQ/Mkm5d7ZdQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.1.tgz", - "integrity": "sha512-/93bf2yxencYDnItMYV/v116zff6UyTjo4EtEQjUBeGiVpMmffDNUyD9UN2zV+V3LRV3/on4xdZ26NKzn6754g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.1.tgz", - "integrity": "sha512-VTN4EuOHwXEkXzX5nTvVY4s7E/Krz7COC8xkftbbKRYAl96vPiUssGkeMELQMOnLOJ8k3BY1+ZY52tttZnHcXQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-loong64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.1.tgz", - "integrity": "sha512-Vx09LzEoBa5zDnieH8LSMRToj7ir/Jeq0Gu6qJ/1GcBq9GkfoEAoXvLiW1U9J1qE/Y/Oyaq33w5p2ZWrNNHNEw==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-mips64el": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.1.tgz", - "integrity": "sha512-nrFzzMQ7W4WRLNUOU5dlWAqa6yVeI0P78WKGUo7lg2HShq/yx+UYkeNSE0SSfSure0SqgnsxPvmAUu/vu0E+3Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-ppc64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.1.tgz", - "integrity": "sha512-dKN8fgVqd0vUIjxuJI6P/9SSSe/mB9rvA98CSH2sJnlZ/OCZWO1DJvxj8jvKTfYUdGfcq2dDxoKaC6bHuTlgcw==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-riscv64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.1.tgz", - "integrity": "sha512-5AV4Pzp80fhHL83JM6LoA6pTQVWgB1HovMBsLQ9OZWLDqVY8MVobBXNSmAJi//Csh6tcY7e7Lny2Hg1tElMjIA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-s390x": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.1.tgz", - "integrity": "sha512-9ygs73tuFCe6f6m/Tb+9LtYxWR4c9yg7zjt2cYkjDbDpV/xVn+68cQxMXCjUpYwEkze2RcU/rMnfIXNRFmSoDw==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/linux-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.1.tgz", - "integrity": "sha512-EV6+ovTsEXCPAp58g2dD68LxoP/wK5pRvgy0J/HxPGB009omFPv3Yet0HiaqvrIrgPTBuC6wCH1LTOY91EO5hQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/netbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.1.tgz", - "integrity": "sha512-aevEkCNu7KlPRpYLjwmdcuNz6bDFiE7Z8XC4CPqExjTvrHugh28QzUXVOZtiYghciKUacNktqxdpymplil1beA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.1.tgz", - "integrity": "sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/openbsd-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.1.tgz", - "integrity": "sha512-aY2gMmKmPhxfU+0EdnN+XNtGbjfQgwZj43k8G3fyrDM/UdZww6xrWxmDkuz2eCZchqVeABjV5BpildOrUbBTqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/sunos-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.1.tgz", - "integrity": "sha512-RBRT2gqEl0IKQABT4XTj78tpk9v7ehp+mazn2HbUeZl1YMdaGAQqhapjGTCe7uw7y0frDi4gS0uHzhvpFuI1sA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/win32-arm64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.1.tgz", - "integrity": "sha512-4O+gPR5rEBe2FpKOVyiJ7wNDPA8nGzDuJ6gN4okSA1gEOYZ67N8JPk58tkWtdtPeLz7lBnY6I5L3jdsr3S+A6A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/win32-ia32": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.1.tgz", - "integrity": "sha512-BcaL0Vn6QwCwre3Y717nVHZbAa4UBEigzFm6VdsVdT/MbZ38xoj1X9HPkZhbmaBGUD1W8vxAfffbDe8bA6AKnQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/@esbuild/win32-x64": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.1.tgz", - "integrity": "sha512-BHpFFeslkWrXWyUPnbKm+xYYVYruCinGcftSBaa8zoF9hZO4BcSCFUvHVTtzpIY6YzUnYtuEhZ+C9iEXjxnasg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@tanstack/router-generator/node_modules/esbuild": { - "version": "0.23.1", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", - "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", - "devOptional": true, - "hasInstallScript": true, - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.1", - "@esbuild/android-arm": "0.23.1", - "@esbuild/android-arm64": "0.23.1", - "@esbuild/android-x64": "0.23.1", - "@esbuild/darwin-arm64": "0.23.1", - "@esbuild/darwin-x64": "0.23.1", - "@esbuild/freebsd-arm64": "0.23.1", - "@esbuild/freebsd-x64": "0.23.1", - "@esbuild/linux-arm": "0.23.1", - "@esbuild/linux-arm64": "0.23.1", - "@esbuild/linux-ia32": "0.23.1", - "@esbuild/linux-loong64": "0.23.1", - "@esbuild/linux-mips64el": "0.23.1", - "@esbuild/linux-ppc64": "0.23.1", - "@esbuild/linux-riscv64": "0.23.1", - "@esbuild/linux-s390x": "0.23.1", - "@esbuild/linux-x64": "0.23.1", - "@esbuild/netbsd-x64": "0.23.1", - "@esbuild/openbsd-arm64": "0.23.1", - "@esbuild/openbsd-x64": "0.23.1", - "@esbuild/sunos-x64": "0.23.1", - "@esbuild/win32-arm64": "0.23.1", - "@esbuild/win32-ia32": "0.23.1", - "@esbuild/win32-x64": "0.23.1" - } - }, - "node_modules/@tanstack/router-generator/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/@tanstack/router-generator/node_modules/get-tsconfig": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", - "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", - "devOptional": true, - "dependencies": { - "resolve-pkg-maps": "^1.0.0" - }, - "funding": { - "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" - } - }, - "node_modules/@tanstack/router-generator/node_modules/tsx": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.1.tgz", - "integrity": "sha512-0flMz1lh74BR4wOvBjuh9olbnwqCPc35OOlfyzHba0Dc+QNUeWX/Gq2YTbnwcWPO3BMd8fkzRVrHcsR+a7z7rA==", - "devOptional": true, - "dependencies": { - "esbuild": "~0.23.0", - "get-tsconfig": "^4.7.5" - }, - "bin": { - "tsx": "dist/cli.mjs" - }, - "engines": { - "node": ">=18.0.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - } - }, "node_modules/@tanstack/router-plugin": { - "version": "1.76.0", - "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.76.0.tgz", - "integrity": "sha512-5JY1NeNbxi7jamTKTAWLyyC9t4Y9Ol+vFZB84h6F1K1BkxqeWQTCJuXMYCY3KawSd7xy2mVT/BgDyZ0AS5hKAA==", + "version": "1.81.9", + "resolved": "https://registry.npmjs.org/@tanstack/router-plugin/-/router-plugin-1.81.9.tgz", + "integrity": "sha512-u12ibRFI/RpWzUmuFEy8HeyjRObkH8NqzOqEGt8xNa/mSQK3sFQLvfXf+lEFwIqg+C5lnrZtl2RvdmoQpRLwHw==", "dev": true, "dependencies": { - "@babel/core": "^7.25.8", - "@babel/generator": "^7.25.7", - "@babel/parser": "^7.25.8", - "@babel/plugin-syntax-jsx": "^7.25.7", - "@babel/plugin-syntax-typescript": "^7.25.7", - "@babel/template": "^7.25.7", - "@babel/traverse": "^7.25.7", - "@babel/types": "^7.25.8", - "@tanstack/router-generator": "^1.74.2", - "@tanstack/virtual-file-routes": "^1.64.0", + "@babel/core": "^7.26.0", + "@babel/generator": "^7.26.2", + "@babel/parser": "^7.26.2", + "@babel/plugin-syntax-jsx": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "@tanstack/router-generator": "^1.81.9", + "@tanstack/virtual-file-routes": "^1.81.9", "@types/babel__core": "^7.20.5", "@types/babel__generator": "^7.6.8", "@types/babel__template": "^7.4.4", @@ -1946,20 +1919,11 @@ } } }, - "node_modules/@tanstack/store": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.5.5.tgz", - "integrity": "sha512-EOSrgdDAJExbvRZEQ/Xhh9iZchXpMN+ga1Bnk8Nmygzs8TfiE6hbzThF+Pr2G19uHL6+DTDTHhJ8VQiOd7l4tA==", - "funding": { - "type": "github", - "url": "https://github.com/sponsors/tannerlinsley" - } - }, "node_modules/@tanstack/virtual-file-routes": { - "version": "1.64.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.64.0.tgz", - "integrity": "sha512-soW+gE9QTmMaqXM17r7y1p8NiQVIIECjdTaYla8BKL5Flj030m3KuxEQoiG1XgjtA0O7ayznFz2YvPcXIy3qDg==", - "devOptional": true, + "version": "1.81.9", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-file-routes/-/virtual-file-routes-1.81.9.tgz", + "integrity": "sha512-jV5mWJrsh3QXHpb/by6udSqwva0qK50uYHpIXvKsLaxnlbjbLfflfPjFyRWXbMtZsnzCjSUqp5pm5/p+Wpaerg==", + "dev": true, "engines": { "node": ">=12" }, @@ -2010,8 +1974,9 @@ }, "node_modules/@types/babel__core": { "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", @@ -2022,16 +1987,18 @@ }, "node_modules/@types/babel__generator": { "version": "7.6.8", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz", + "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, - "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" @@ -2039,35 +2006,38 @@ }, "node_modules/@types/babel__traverse": { "version": "7.20.6", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz", + "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==", "dev": true, - "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true }, "node_modules/@types/node": { - "version": "22.7.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.8.tgz", - "integrity": "sha512-a922jJy31vqR5sk+kAdIENJjHblqcZ4RmERviFsER4WJcEONqxKcjNOlk0q7OUfrF5sddT+vng070cdfMlrPLg==", + "version": "22.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.1.tgz", + "integrity": "sha512-p8Yy/8sw1caA8CdRIQBG5tiLHmxtQKObCijiAa9Ez+d4+PRffM4054xbju0msf+cvhJpnFEeNjxmVT/0ipktrg==", "dev": true, "dependencies": { - "undici-types": "~6.19.2" + "undici-types": "~6.19.8" } }, "node_modules/@types/prop-types": { - "version": "15.7.12", - "dev": true, - "license": "MIT" + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", + "dev": true }, "node_modules/@types/react": { - "version": "18.3.11", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.11.tgz", - "integrity": "sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==", + "version": "18.3.12", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz", + "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -2084,16 +2054,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.11.0.tgz", - "integrity": "sha512-KhGn2LjW1PJT2A/GfDpiyOfS4a8xHQv2myUagTM5+zsormOmBlYsnQ6pobJ8XxJmh6hnHwa2Mbe3fPrDJoDhbA==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.15.0.tgz", + "integrity": "sha512-+zkm9AR1Ds9uLWN3fkoeXgFppaQ+uEVtfOV62dDmsy9QCNqlRHWNEck4yarvRNrvRcHQLGfqBNui3cimoz8XAg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/type-utils": "8.11.0", - "@typescript-eslint/utils": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/type-utils": "8.15.0", + "@typescript-eslint/utils": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", @@ -2117,15 +2087,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.11.0.tgz", - "integrity": "sha512-lmt73NeHdy1Q/2ul295Qy3uninSqi6wQI18XwSpm8w0ZbQXUpjCAWP1Vlv/obudoBiIjJVjlztjQ+d/Md98Yxg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.15.0.tgz", + "integrity": "sha512-7n59qFpghG4uazrF9qtGKBZXn7Oz4sOMm8dwNWDQY96Xlm2oX67eipqcblDj+oY1lLCbf1oltMZFpUso66Kl1A==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/typescript-estree": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4" }, "engines": { @@ -2145,13 +2115,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.11.0.tgz", - "integrity": "sha512-Uholz7tWhXmA4r6epo+vaeV7yjdKy5QFCERMjs1kMVsLRKIrSdM6o21W2He9ftp5PP6aWOVpD5zvrvuHZC0bMQ==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.15.0.tgz", + "integrity": "sha512-QRGy8ADi4J7ii95xz4UoiymmmMd/zuy9azCaamnZ3FM8T5fZcex8UfJcjkiEZjJSztKfEBe3dZ5T/5RHAmw2mA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0" + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2162,13 +2132,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.11.0.tgz", - "integrity": "sha512-ItiMfJS6pQU0NIKAaybBKkuVzo6IdnAhPFZA/2Mba/uBjuPQPet/8+zh5GtLHwmuFRShZx+8lhIs7/QeDHflOg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.15.0.tgz", + "integrity": "sha512-UU6uwXDoI3JGSXmcdnP5d8Fffa2KayOhUUqr/AiBnG1Gl7+7ut/oyagVeSkh7bxQ0zSXV9ptRh/4N15nkCqnpw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "8.11.0", - "@typescript-eslint/utils": "8.11.0", + "@typescript-eslint/typescript-estree": "8.15.0", + "@typescript-eslint/utils": "8.15.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -2179,6 +2149,9 @@ "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0" + }, "peerDependenciesMeta": { "typescript": { "optional": true @@ -2186,9 +2159,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.11.0.tgz", - "integrity": "sha512-tn6sNMHf6EBAYMvmPUaKaVeYvhUsrE6x+bXQTxjQRp360h1giATU0WvgeEys1spbvb5R+VpNOZ+XJmjD8wOUHw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.15.0.tgz", + "integrity": "sha512-n3Gt8Y/KyJNe0S3yDCD2RVKrHBC4gTUcLTebVBXacPy091E6tNspFLKRXlk3hwT4G55nfr1n2AdFqi/XMxzmPQ==", "dev": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2199,13 +2172,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.11.0.tgz", - "integrity": "sha512-yHC3s1z1RCHoCz5t06gf7jH24rr3vns08XXhfEqzYpd6Hll3z/3g23JRi0jM8A47UFKNc3u/y5KIMx8Ynbjohg==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.15.0.tgz", + "integrity": "sha512-1eMp2JgNec/niZsR7ioFBlsh/Fk0oJbhaqO0jRyQBMgkz7RrFfkqF9lYYmBoGBaSiLnu8TAPQTwoTUiSTUW9dg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/visitor-keys": "8.11.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/visitor-keys": "8.15.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", @@ -2239,15 +2212,15 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.11.0.tgz", - "integrity": "sha512-CYiX6WZcbXNJV7UNB4PLDIBtSdRmRI/nb0FMyqHPTQD1rMjA0foPLaPUV39C/MxkTd/QKSeX+Gb34PPsDVC35g==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.15.0.tgz", + "integrity": "sha512-k82RI9yGhr0QM3Dnq+egEpz9qB6Un+WLYhmoNcvl8ltMEededhh7otBVVIDDsEEttauwdY/hQoSsOv13lxrFzQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@typescript-eslint/scope-manager": "8.11.0", - "@typescript-eslint/types": "8.11.0", - "@typescript-eslint/typescript-estree": "8.11.0" + "@typescript-eslint/scope-manager": "8.15.0", + "@typescript-eslint/types": "8.15.0", + "@typescript-eslint/typescript-estree": "8.15.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2258,16 +2231,21 @@ }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.11.0.tgz", - "integrity": "sha512-EaewX6lxSjRJnc+99+dqzTeoDZUfyrA52d2/HRrkI830kgovWsmIiTfmr0NZorzqic7ga+1bS60lRBUgR3n/Bw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.15.0.tgz", + "integrity": "sha512-h8vYOulWec9LhpwfAdZf2bjr8xIp0KNKnpgqSz0qqYYKAW/QZKw3ktRndbiAtUz4acH4QLQavwZBYCc0wulA/Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "8.11.0", - "eslint-visitor-keys": "^3.4.3" + "@typescript-eslint/types": "8.15.0", + "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -2277,10 +2255,23 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true }, "node_modules/@vitejs/plugin-react": { "version": "4.3.3", @@ -2302,13 +2293,13 @@ } }, "node_modules/@vitest/expect": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.4.tgz", - "integrity": "sha512-DOETT0Oh1avie/D/o2sgMHGrzYUFFo3zqESB2Hn70z6QB1HrS2IQ9z5DfyTqU8sg4Bpu13zZe9V4+UTNQlUeQA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-2.1.5.tgz", + "integrity": "sha512-nZSBTW1XIdpZvEJyoP/Sy8fUg0b8od7ZpGDkTUcfJ7wz/VoZAFzFfLyxVxGFhUjJzhYqSbIpfMtl/+k/dpWa3Q==", "dev": true, "dependencies": { - "@vitest/spy": "2.1.4", - "@vitest/utils": "2.1.4", + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", "chai": "^5.1.2", "tinyrainbow": "^1.2.0" }, @@ -2317,12 +2308,12 @@ } }, "node_modules/@vitest/mocker": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.4.tgz", - "integrity": "sha512-Ky/O1Lc0QBbutJdW0rqLeFNbuLEyS+mIPiNdlVlp2/yhJ0SbyYqObS5IHdhferJud8MbbwMnexg4jordE5cCoQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-2.1.5.tgz", + "integrity": "sha512-XYW6l3UuBmitWqSUXTNXcVBUCRytDogBsWuNXQijc00dtnU/9OqpXWp4OJroVrad/gLIomAq9aW8yWDBtMthhQ==", "dev": true, "dependencies": { - "@vitest/spy": "2.1.4", + "@vitest/spy": "2.1.5", "estree-walker": "^3.0.3", "magic-string": "^0.30.12" }, @@ -2342,10 +2333,19 @@ } } }, + "node_modules/@vitest/mocker/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0" + } + }, "node_modules/@vitest/pretty-format": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.4.tgz", - "integrity": "sha512-L95zIAkEuTDbUX1IsjRl+vyBSLh3PwLLgKpghl37aCK9Jvw0iP+wKwIFhfjdUtA2myLgjrG6VU6JCFLv8q/3Ww==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-2.1.5.tgz", + "integrity": "sha512-4ZOwtk2bqG5Y6xRGHcveZVr+6txkH7M2e+nPFd6guSoN638v/1XQ0K06eOpi0ptVU/2tW/pIU4IoPotY/GZ9fw==", "dev": true, "dependencies": { "tinyrainbow": "^1.2.0" @@ -2355,12 +2355,12 @@ } }, "node_modules/@vitest/runner": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.4.tgz", - "integrity": "sha512-sKRautINI9XICAMl2bjxQM8VfCMTB0EbsBc/EDFA57V6UQevEKY/TOPOF5nzcvCALltiLfXWbq4MaAwWx/YxIA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-2.1.5.tgz", + "integrity": "sha512-pKHKy3uaUdh7X6p1pxOkgkVAFW7r2I818vHDthYLvUyjRfkKOU6P45PztOch4DZarWQne+VOaIMwA/erSSpB9g==", "dev": true, "dependencies": { - "@vitest/utils": "2.1.4", + "@vitest/utils": "2.1.5", "pathe": "^1.1.2" }, "funding": { @@ -2368,12 +2368,12 @@ } }, "node_modules/@vitest/snapshot": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.4.tgz", - "integrity": "sha512-3Kab14fn/5QZRog5BPj6Rs8dc4B+mim27XaKWFWHWA87R56AKjHTGcBFKpvZKDzC4u5Wd0w/qKsUIio3KzWW4Q==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-2.1.5.tgz", + "integrity": "sha512-zmYw47mhfdfnYbuhkQvkkzYroXUumrwWDGlMjpdUr4jBd3HZiV2w7CQHj+z7AAS4VOtWxI4Zt4bWt4/sKcoIjg==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.1.4", + "@vitest/pretty-format": "2.1.5", "magic-string": "^0.30.12", "pathe": "^1.1.2" }, @@ -2382,9 +2382,9 @@ } }, "node_modules/@vitest/spy": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.4.tgz", - "integrity": "sha512-4JOxa+UAizJgpZfaCPKK2smq9d8mmjZVPMt2kOsg/R8QkoRzydHH1qHxIYNvr1zlEaFj4SXiaaJWxq/LPLKaLg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-2.1.5.tgz", + "integrity": "sha512-aWZF3P0r3w6DiYTVskOYuhBc7EMc3jvn1TkBg8ttylFFRqNN2XGD7V5a4aQdk6QiUzZQ4klNBSpCLJgWNdIiNw==", "dev": true, "dependencies": { "tinyspy": "^3.0.2" @@ -2394,12 +2394,12 @@ } }, "node_modules/@vitest/utils": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.4.tgz", - "integrity": "sha512-MXDnZn0Awl2S86PSNIim5PWXgIAx8CIkzu35mBdSApUip6RFOGXBCf3YFyeEu8n1IHk4bWD46DeYFu9mQlFIRg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-2.1.5.tgz", + "integrity": "sha512-yfj6Yrp0Vesw2cwJbP+cl04OC+IHFsuQsrsJBL9pyGeQXE56v1UAOQco+SR55Vf1nQzfV0QJg1Qum7AaWUwwYg==", "dev": true, "dependencies": { - "@vitest/pretty-format": "2.1.4", + "@vitest/pretty-format": "2.1.5", "loupe": "^3.1.2", "tinyrainbow": "^1.2.0" }, @@ -2408,9 +2408,10 @@ } }, "node_modules/acorn": { - "version": "8.12.1", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -2420,16 +2421,18 @@ }, "node_modules/acorn-jsx": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "license": "MIT", "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/ajv": { "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2443,28 +2446,33 @@ }, "node_modules/ansi-regex": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=4" + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, - "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -2475,8 +2483,9 @@ }, "node_modules/argparse": { "version": "2.0.1", - "dev": true, - "license": "Python-2.0" + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true }, "node_modules/assertion-error": { "version": "2.0.1", @@ -2489,8 +2498,9 @@ }, "node_modules/babel-dead-code-elimination": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/babel-dead-code-elimination/-/babel-dead-code-elimination-1.0.6.tgz", + "integrity": "sha512-JxFi9qyRJpN0LjEbbjbN8g0ux71Qppn9R8Qe3k6QzHg2CaKsbUQtbn307LQGiDLGjV6JCtEFqfxzVig9MyDCHQ==", "dev": true, - "license": "MIT", "dependencies": { "@babel/core": "^7.23.7", "@babel/parser": "^7.23.6", @@ -2498,15 +2508,26 @@ "@babel/types": "^7.23.6" } }, + "node_modules/babel-plugin-transform-hook-names": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-hook-names/-/babel-plugin-transform-hook-names-1.0.2.tgz", + "integrity": "sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==", + "dev": true, + "peerDependencies": { + "@babel/core": "^7.12.10" + } + }, "node_modules/balanced-match": { "version": "1.0.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true }, "node_modules/binary-extensions": { "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -2531,8 +2552,9 @@ }, "node_modules/braces": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, @@ -2541,9 +2563,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.0.tgz", - "integrity": "sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==", + "version": "4.24.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz", + "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==", "dev": true, "funding": [ { @@ -2560,10 +2582,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001663", - "electron-to-chromium": "^1.5.28", + "caniuse-lite": "^1.0.30001669", + "electron-to-chromium": "^1.5.41", "node-releases": "^2.0.18", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -2572,14 +2594,6 @@ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, - "node_modules/buffer-builder": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", - "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", @@ -2591,8 +2605,9 @@ }, "node_modules/callsites": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -2610,9 +2625,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001668", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz", - "integrity": "sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==", + "version": "1.0.30001680", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz", + "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==", "dev": true, "funding": [ { @@ -2646,17 +2661,19 @@ } }, "node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=4" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/check-error": { @@ -2670,8 +2687,9 @@ }, "node_modules/chokidar": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, - "license": "MIT", "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -2691,43 +2709,24 @@ "fsevents": "~2.3.2" } }, - "node_modules/chokidar/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, - "node_modules/colorjs.io": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", - "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", @@ -2739,13 +2738,15 @@ }, "node_modules/concat-map": { "version": "0.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true }, "node_modules/convert-source-map": { "version": "2.0.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/cosmiconfig": { "version": "8.3.6", @@ -2774,9 +2775,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, - "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2831,6 +2833,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -2873,13 +2876,15 @@ }, "node_modules/csstype": { "version": "3.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true }, "node_modules/debug": { "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, - "license": "MIT", "dependencies": { "ms": "^2.1.3" }, @@ -2903,8 +2908,9 @@ }, "node_modules/deep-is": { "version": "0.1.4", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true }, "node_modules/deepmerge": { "version": "4.3.1", @@ -2917,8 +2923,9 @@ }, "node_modules/doctrine": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, - "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, @@ -3021,15 +3028,10 @@ "zrender": "5.6.0" } }, - "node_modules/echarts/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" - }, "node_modules/electron-to-chromium": { - "version": "1.5.38", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.38.tgz", - "integrity": "sha512-VbeVexmZ1IFh+5EfrYz1I0HTzHVIlJa112UEWhciPyeOcKJGeTv6N8WnG4wsQB81DGCaVEGhpSb6o6a8WYFXXg==", + "version": "1.5.63", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.63.tgz", + "integrity": "sha512-ddeXKuY9BHo/mw145axlyWjlJ1UBt4WK3AlvkT7W2AbqfRQoacVoRUCF6wL3uIx/8wT9oLKXzI+rFqHHscByaA==", "dev": true }, "node_modules/emoji-picker-react": { @@ -3067,6 +3069,51 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.1.tgz", + "integrity": "sha512-VVNz/9Sa0bs5SELtn3f7qhJCDPCF5oMEl5cO9/SSinpE9hbPVvxbd572HH5AKiP7WD8INO53GgfDDhRjkylHEg==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.23.1", + "@esbuild/android-arm": "0.23.1", + "@esbuild/android-arm64": "0.23.1", + "@esbuild/android-x64": "0.23.1", + "@esbuild/darwin-arm64": "0.23.1", + "@esbuild/darwin-x64": "0.23.1", + "@esbuild/freebsd-arm64": "0.23.1", + "@esbuild/freebsd-x64": "0.23.1", + "@esbuild/linux-arm": "0.23.1", + "@esbuild/linux-arm64": "0.23.1", + "@esbuild/linux-ia32": "0.23.1", + "@esbuild/linux-loong64": "0.23.1", + "@esbuild/linux-mips64el": "0.23.1", + "@esbuild/linux-ppc64": "0.23.1", + "@esbuild/linux-riscv64": "0.23.1", + "@esbuild/linux-s390x": "0.23.1", + "@esbuild/linux-x64": "0.23.1", + "@esbuild/netbsd-x64": "0.23.1", + "@esbuild/openbsd-arm64": "0.23.1", + "@esbuild/openbsd-x64": "0.23.1", + "@esbuild/sunos-x64": "0.23.1", + "@esbuild/win32-arm64": "0.23.1", + "@esbuild/win32-ia32": "0.23.1", + "@esbuild/win32-x64": "0.23.1" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -3077,24 +3124,29 @@ } }, "node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/eslint": { - "version": "8.57.0", + "version": "8.57.1", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz", + "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, - "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", + "@eslint/js": "8.57.1", + "@humanwhocodes/config-array": "^0.13.0", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", "@ungap/structured-clone": "^1.2.0", @@ -3141,8 +3193,9 @@ }, "node_modules/eslint-plugin-react-hooks": { "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -3151,9 +3204,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.13", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.13.tgz", - "integrity": "sha512-f1EppwrpJRWmqDTyvAyomFVDYRtrS7iTEqv3nokETnMiMzs2SSTmKRTACce4O2p4jYyowiSMvpdwC/RLcMFhuQ==", + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.14.tgz", + "integrity": "sha512-aXvzCTK7ZBv1e7fahFuR3Z/fyQQSIQ711yPgYRj+Oj64tyTgO4iQIDmYXDBqvSWQ/FA4OSCsXOStlF+noU0/NA==", "dev": true, "peerDependencies": { "eslint": ">=7" @@ -3161,8 +3214,9 @@ }, "node_modules/eslint-scope": { "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" @@ -3176,8 +3230,9 @@ }, "node_modules/eslint-visitor-keys": { "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3185,75 +3240,21 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/eslint/node_modules/ansi-styles": { - "version": "4.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "node_modules/eslint/node_modules/chalk": { - "version": "4.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/eslint/node_modules/color-convert": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/eslint/node_modules/color-name": { - "version": "1.1.4", - "dev": true, - "license": "MIT" - }, - "node_modules/eslint/node_modules/escape-string-regexp": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, @@ -3263,8 +3264,9 @@ }, "node_modules/eslint/node_modules/globals": { "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, - "license": "MIT", "dependencies": { "type-fest": "^0.20.2" }, @@ -3275,18 +3277,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/eslint/node_modules/has-flag": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3294,21 +3289,11 @@ "node": "*" } }, - "node_modules/eslint/node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/espree": { "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -3323,8 +3308,9 @@ }, "node_modules/esquery": { "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, - "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, @@ -3334,8 +3320,9 @@ }, "node_modules/esrecurse": { "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, @@ -3345,25 +3332,24 @@ }, "node_modules/estraverse": { "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=4.0" } }, "node_modules/estree-walker": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", - "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", - "dev": true, - "dependencies": { - "@types/estree": "^1.0.0" - } + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "dev": true }, "node_modules/esutils": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, - "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" } @@ -3379,8 +3365,9 @@ }, "node_modules/fast-deep-equal": { "version": "3.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.2", @@ -3400,26 +3387,30 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true }, "node_modules/fastq": { "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, - "license": "ISC", "dependencies": { "reusify": "^1.0.4" } }, "node_modules/file-entry-cache": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", "dev": true, - "license": "MIT", "dependencies": { "flat-cache": "^3.0.4" }, @@ -3429,8 +3420,9 @@ }, "node_modules/fill-range": { "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -3440,8 +3432,9 @@ }, "node_modules/find-up": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, - "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -3460,8 +3453,9 @@ }, "node_modules/flat-cache": { "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, - "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -3472,19 +3466,21 @@ } }, "node_modules/flatted": { - "version": "3.3.1", - "dev": true, - "license": "ISC" + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true }, "node_modules/fs.realpath": { "version": "1.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3497,16 +3493,31 @@ }, "node_modules/gensync": { "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6.9.0" } }, + "node_modules/get-tsconfig": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz", + "integrity": "sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==", + "dev": true, + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -3524,8 +3535,9 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, - "license": "ISC", "dependencies": { "is-glob": "^4.0.1" }, @@ -3535,8 +3547,9 @@ }, "node_modules/glob/node_modules/brace-expansion": { "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, - "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3544,8 +3557,9 @@ }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", "dev": true, - "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3555,57 +3569,64 @@ }, "node_modules/globals": { "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/graphemer": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true }, "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" } }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", "dependencies": { "react-is": "^16.7.0" } }, "node_modules/idb-keyval": { "version": "6.2.1", - "license": "Apache-2.0" + "resolved": "https://registry.npmjs.org/idb-keyval/-/idb-keyval-6.2.1.tgz", + "integrity": "sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==" }, "node_modules/ignore": { "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 4" } }, - "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/import-fresh": { "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", "dev": true, - "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -3619,16 +3640,19 @@ }, "node_modules/imurmurhash": { "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.8.19" } }, "node_modules/inflight": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", "dev": true, - "license": "ISC", "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -3636,8 +3660,9 @@ }, "node_modules/inherits": { "version": "2.0.4", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true }, "node_modules/is-arrayish": { "version": "0.2.1", @@ -3647,8 +3672,9 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dev": true, - "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" }, @@ -3658,16 +3684,18 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/is-glob": { "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, - "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" }, @@ -3677,33 +3705,38 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-path-inside": { "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/isexe": { "version": "2.0.0", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true }, "node_modules/js-tokens": { "version": "4.0.0", - "license": "MIT" + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "dev": true, - "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3725,8 +3758,9 @@ }, "node_modules/json-buffer": { "version": "3.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -3736,18 +3770,21 @@ }, "node_modules/json-schema-traverse": { "version": "0.4.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true }, "node_modules/json5": { "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, - "license": "MIT", "bin": { "json5": "lib/cli.js" }, @@ -3757,16 +3794,24 @@ }, "node_modules/keyv": { "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, - "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, "node_modules/levn": { "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -3783,8 +3828,9 @@ }, "node_modules/locate-path": { "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, - "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, @@ -3797,12 +3843,14 @@ }, "node_modules/lodash.merge": { "version": "4.6.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true }, "node_modules/loose-envify": { "version": "1.4.0", - "license": "MIT", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, @@ -3834,18 +3882,10 @@ "yallist": "^3.0.2" } }, - "node_modules/lucide-react": { - "version": "0.445.0", - "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-0.445.0.tgz", - "integrity": "sha512-YrLf3aAHvmd4dZ8ot+mMdNFrFpJD7YRwQ2pUcBhgqbmxtrMP4xDzIorcj+8y+6kpuXBF4JB0NOCTUWIYetJjgA==", - "peerDependencies": { - "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0-rc" - } - }, "node_modules/magic-string": { - "version": "0.30.12", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.12.tgz", - "integrity": "sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==", + "version": "0.30.13", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.13.tgz", + "integrity": "sha512-8rYBO+MsWkgjDSOvLomYnzhdwEG51olQ4zL5KXnNJWV5MNmrb4rTZdrtkhxjnD/QyZUqR/Z/XDsUs/4ej2nx0g==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" @@ -3901,18 +3941,21 @@ }, "node_modules/ms": { "version": "2.1.3", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true }, "node_modules/nanoid": { "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -3922,8 +3965,9 @@ }, "node_modules/natural-compare": { "version": "1.4.0", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true }, "node_modules/no-case": { "version": "3.0.4", @@ -3935,6 +3979,16 @@ "tslib": "^2.0.3" } }, + "node_modules/node-html-parser": { + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", + "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", + "dev": true, + "dependencies": { + "css-select": "^5.1.0", + "he": "1.2.0" + } + }, "node_modules/node-releases": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", @@ -3943,8 +3997,9 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3963,16 +4018,18 @@ }, "node_modules/once": { "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, - "license": "ISC", "dependencies": { "wrappy": "1" } }, "node_modules/optionator": { "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, - "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", @@ -3987,8 +4044,9 @@ }, "node_modules/p-limit": { "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, - "license": "MIT", "dependencies": { "yocto-queue": "^0.1.0" }, @@ -4001,8 +4059,9 @@ }, "node_modules/p-locate": { "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, - "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, @@ -4015,8 +4074,9 @@ }, "node_modules/parent-module": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, - "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, @@ -4044,24 +4104,27 @@ }, "node_modules/path-exists": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4091,13 +4154,16 @@ } }, "node_modules/picocolors": { - "version": "1.1.0", - "license": "ISC" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, - "license": "MIT", "engines": { "node": ">=8.6" }, @@ -4106,12 +4172,12 @@ } }, "node_modules/playwright": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.1.tgz", - "integrity": "sha512-j8CiHW/V6HxmbntOfyB4+T/uk08tBy6ph0MpBXwuoofkSnLmlfdYNNkFTYD6ofzzlSqLA1fwH4vwvVFvJgLN0w==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.0.tgz", + "integrity": "sha512-eKpmys0UFDnfNb3vfsf8Vx2LEOtflgRebl0Im2eQQnYMA4Aqd+Zw8bEOB+7ZKvN76901mRnqdsiOGKxzVTbi7A==", "dev": true, "dependencies": { - "playwright-core": "1.48.1" + "playwright-core": "1.49.0" }, "bin": { "playwright": "cli.js" @@ -4124,9 +4190,9 @@ } }, "node_modules/playwright-core": { - "version": "1.48.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.1.tgz", - "integrity": "sha512-Yw/t4VAFX/bBr1OzwCuOMZkY1Cnb4z/doAFSwf4huqAGWmf9eMNjmK7NiOljCdLmxeRYcGPPmcDgU0zOlzP0YA==", + "version": "1.49.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.0.tgz", + "integrity": "sha512-R+3KKTQF3npy5GTiKH/T+kdhoJfJojjHESR1YEWhYuEKRVfVaxH3+4+GvXE5xyCngCxhxnykk0Vlah9v8fs3jA==", "dev": true, "bin": { "playwright-core": "cli.js" @@ -4135,10 +4201,25 @@ "node": ">=18" } }, + "node_modules/playwright/node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", + "dev": true, "funding": [ { "type": "opencollective", @@ -4155,7 +4236,7 @@ ], "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -4166,6 +4247,7 @@ "version": "13.0.1", "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-13.0.1.tgz", "integrity": "sha512-VbqqHkOBOt4Uu3G8Dm8n6lU5+9cJFxiuty9+4rcoyRPO9zZS1JIs6td49VIoix3qYqELHlJIn46Oih9SAKo+yQ==", + "dev": true, "funding": [ { "type": "github", @@ -4192,6 +4274,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -4200,18 +4283,29 @@ "node": ">=4" } }, + "node_modules/preact": { + "version": "10.24.3", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.24.3.tgz", + "integrity": "sha512-Z2dPnBnMUfyQfSQ+GBdsGa16hz35YmLmtTLhM169uW944hYL6xzTYkJjC07j+Wosz733pMWx0fgON3JNw1jJQA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, "node_modules/prelude-ls": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, - "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "3.3.3", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz", + "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==", + "dev": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -4223,9 +4317,9 @@ } }, "node_modules/proj4": { - "version": "2.12.1", - "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.12.1.tgz", - "integrity": "sha512-vmhP3hmstjXjzFwg8QXJwpoj4n7GVrXk3ZW3DzNK/Ur4cuwXq7ZiMXaWYvLYLQbX8n4MXgbwTr4lthOUZltBpA==", + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/proj4/-/proj4-2.14.0.tgz", + "integrity": "sha512-fumDL50ThQ3issOLxaLYwv1j4LePEzYleY6vqsX+2uWOcvKzqpzHhtTTH18CvIDg+nf8MYl0/XF6yYyESKDi4w==", "dependencies": { "mgrs": "1.0.0", "wkt-parser": "^1.3.3" @@ -4233,14 +4327,17 @@ }, "node_modules/punycode": { "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/queue-microtask": { "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -4255,12 +4352,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "license": "MIT" + ] }, "node_modules/react": { "version": "18.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -4270,7 +4367,8 @@ }, "node_modules/react-dom": { "version": "18.3.1", - "license": "MIT", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -4281,20 +4379,53 @@ }, "node_modules/react-is": { "version": "16.13.1", - "license": "MIT" + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/react-refresh": { "version": "0.14.2", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz", + "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/react-router": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.28.0.tgz", + "integrity": "sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==", + "dependencies": { + "@remix-run/router": "1.21.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.28.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.28.0.tgz", + "integrity": "sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==", + "dependencies": { + "@remix-run/router": "1.21.0", + "react-router": "6.28.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, "node_modules/readdirp": { "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, - "license": "MIT", "dependencies": { "picomatch": "^2.2.1" }, @@ -4304,24 +4435,27 @@ }, "node_modules/resolve-from": { "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, - "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/reusify": { "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, - "license": "MIT", "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -4329,8 +4463,10 @@ }, "node_modules/rimraf": { "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", "dev": true, - "license": "ISC", "dependencies": { "glob": "^7.1.3" }, @@ -4342,12 +4478,12 @@ } }, "node_modules/rollup": { - "version": "4.22.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.22.4.tgz", - "integrity": "sha512-vD8HJ5raRcWOyymsR6Z3o6+RzfEPCnVLMFJ6vRslO1jt4LO6dUo5Qnpg7y4RkZFM2DMe3WUirkI5c16onjrc6A==", + "version": "4.27.3", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.27.3.tgz", + "integrity": "sha512-SLsCOnlmGt9VoZ9Ek8yBK8tAdmPHeppkw+Xa7yDlCEhDTvwYei03JlWo1fdc7YTfLZ4tD8riJCUyAgTbszk1fQ==", "dev": true, "dependencies": { - "@types/estree": "1.0.5" + "@types/estree": "1.0.6" }, "bin": { "rollup": "dist/bin/rollup" @@ -4357,41 +4493,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.22.4", - "@rollup/rollup-android-arm64": "4.22.4", - "@rollup/rollup-darwin-arm64": "4.22.4", - "@rollup/rollup-darwin-x64": "4.22.4", - "@rollup/rollup-linux-arm-gnueabihf": "4.22.4", - "@rollup/rollup-linux-arm-musleabihf": "4.22.4", - "@rollup/rollup-linux-arm64-gnu": "4.22.4", - "@rollup/rollup-linux-arm64-musl": "4.22.4", - "@rollup/rollup-linux-powerpc64le-gnu": "4.22.4", - "@rollup/rollup-linux-riscv64-gnu": "4.22.4", - "@rollup/rollup-linux-s390x-gnu": "4.22.4", - "@rollup/rollup-linux-x64-gnu": "4.22.4", - "@rollup/rollup-linux-x64-musl": "4.22.4", - "@rollup/rollup-win32-arm64-msvc": "4.22.4", - "@rollup/rollup-win32-ia32-msvc": "4.22.4", - "@rollup/rollup-win32-x64-msvc": "4.22.4", + "@rollup/rollup-android-arm-eabi": "4.27.3", + "@rollup/rollup-android-arm64": "4.27.3", + "@rollup/rollup-darwin-arm64": "4.27.3", + "@rollup/rollup-darwin-x64": "4.27.3", + "@rollup/rollup-freebsd-arm64": "4.27.3", + "@rollup/rollup-freebsd-x64": "4.27.3", + "@rollup/rollup-linux-arm-gnueabihf": "4.27.3", + "@rollup/rollup-linux-arm-musleabihf": "4.27.3", + "@rollup/rollup-linux-arm64-gnu": "4.27.3", + "@rollup/rollup-linux-arm64-musl": "4.27.3", + "@rollup/rollup-linux-powerpc64le-gnu": "4.27.3", + "@rollup/rollup-linux-riscv64-gnu": "4.27.3", + "@rollup/rollup-linux-s390x-gnu": "4.27.3", + "@rollup/rollup-linux-x64-gnu": "4.27.3", + "@rollup/rollup-linux-x64-musl": "4.27.3", + "@rollup/rollup-win32-arm64-msvc": "4.27.3", + "@rollup/rollup-win32-ia32-msvc": "4.27.3", + "@rollup/rollup-win32-x64-msvc": "4.27.3", "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { @@ -4407,438 +4533,14 @@ "url": "https://feross.org/support" } ], - "license": "MIT", "dependencies": { "queue-microtask": "^1.2.2" } }, - "node_modules/rxjs": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", - "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "tslib": "^2.1.0" - } - }, - "node_modules/sass-embedded": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.80.3.tgz", - "integrity": "sha512-aTxTl4ToSAWg7ILFgAe+kMenj+zNlwHmHK/ZNPrOM8+HTef1Q6zuxolptYLijmHdZHKSMOkWYHgo5MMN6+GIyg==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "@bufbuild/protobuf": "^2.0.0", - "buffer-builder": "^0.2.0", - "colorjs.io": "^0.5.0", - "immutable": "^4.0.0", - "rxjs": "^7.4.0", - "supports-color": "^8.1.1", - "varint": "^6.0.0" - }, - "bin": { - "sass": "dist/bin/sass.js" - }, - "engines": { - "node": ">=16.0.0" - }, - "optionalDependencies": { - "sass-embedded-android-arm": "1.80.3", - "sass-embedded-android-arm64": "1.80.3", - "sass-embedded-android-ia32": "1.80.3", - "sass-embedded-android-riscv64": "1.80.3", - "sass-embedded-android-x64": "1.80.3", - "sass-embedded-darwin-arm64": "1.80.3", - "sass-embedded-darwin-x64": "1.80.3", - "sass-embedded-linux-arm": "1.80.3", - "sass-embedded-linux-arm64": "1.80.3", - "sass-embedded-linux-ia32": "1.80.3", - "sass-embedded-linux-musl-arm": "1.80.3", - "sass-embedded-linux-musl-arm64": "1.80.3", - "sass-embedded-linux-musl-ia32": "1.80.3", - "sass-embedded-linux-musl-riscv64": "1.80.3", - "sass-embedded-linux-musl-x64": "1.80.3", - "sass-embedded-linux-riscv64": "1.80.3", - "sass-embedded-linux-x64": "1.80.3", - "sass-embedded-win32-arm64": "1.80.3", - "sass-embedded-win32-ia32": "1.80.3", - "sass-embedded-win32-x64": "1.80.3" - } - }, - "node_modules/sass-embedded-android-arm": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.80.3.tgz", - "integrity": "sha512-i87crav7sfShzY7AyUneXvs4SWdJ93QlYIpo/2OQPTJV5MjJF8wUp0o9NT8Oo6sUJ26kfgsb64FwqQh1wO5uBg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-arm64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.80.3.tgz", - "integrity": "sha512-uaEKdi+PaFc1V87vj2eCUB8B2ThNvEYYu9Qs5sCtx1atEQDtvp/smHYlXOVrg2M4+g2YASkDBQewyk+auZtG0g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-ia32": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.80.3.tgz", - "integrity": "sha512-XCa4Se7vqWuV5tFLZuYWidPLUCeK7n1AgugircJl/9QPThCGZ2mSRF0Ipj3lv+Qw4GG9kkhCqJIrksTGbSFypw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-riscv64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.80.3.tgz", - "integrity": "sha512-Dn3hYh5rchfivnPrHoff2pWutuFYJRddzEXcjfb0JhgF7JmTA/6Dxaym0pqVpS1RmYDiAYnmoX5OeFtEkdVytA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-android-x64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.80.3.tgz", - "integrity": "sha512-QWOTHKPznYJnrP3HrlFYnAQOZ/c2am4ctK1cFIMtjQNGaFra8z94LZSQzAd6eeu6mITKwQbJuff36RpICZpgHA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-arm64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.80.3.tgz", - "integrity": "sha512-NqJXHzZGqVOarr36X5MIv0UCQHYVhOFXGe7kDhNqMQCiNApkVydseB5TM1C2lVaiWy2JaseRD/dUNS/o2ICKXw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-darwin-x64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.80.3.tgz", - "integrity": "sha512-6dmNn+oNxXE5uGThfAsHgz7Jg1oDhXHHQyPAnIIaMOM5dXv0D/nLmrlFbFajK0HtbzGaTVBTE6wkJwjASuP0Uw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.80.3.tgz", - "integrity": "sha512-nZ7Y8gZgr+/fYrbsX3L8BfIafWXGVBcc0gKLoujad+axlFGv1MetO17S3vzrOQ1wuhjvDLVxceA/jtcta1qxoA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-arm64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.80.3.tgz", - "integrity": "sha512-a9IILen4I6oFFb5qMHOiFqIAoztPuvJ6VHNaFbktP8SUvH4FX63ZutR/qKisN9DoudzSXMZijv/aG/bTh0Kccw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-ia32": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.80.3.tgz", - "integrity": "sha512-yKy4N0L9WfGokpBMHOhxzaS3jyzrHUg1+5Idi6J88onwxfpEhqOgdMcoqgOqvryMPrmKN7kW5d3iNpUYOniPnw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.80.3.tgz", - "integrity": "sha512-yB7iSoS/phNHKFsZRW0rTRwoCTtOBELG/UYpIa2qATWZsDASSjdBitGsKS3nEliweveuGIVlUqG2kUKaq9M39g==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-arm64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.80.3.tgz", - "integrity": "sha512-mw4BPe42wlAwg6vgmGkg+MDDyXZBexvAWC+QigtfMjTVHuSAB527UVWhIyv4jAkKLp71mPowsXXsfa4UHzyBaA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-ia32": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.80.3.tgz", - "integrity": "sha512-eyg5L9IFisCYYMXEZ/56X8k8wdhpfK06/j9MFAINE9U4C5NxQXrVWmMTEqgyfpmca8hziBlvbRrjdquteyXWfw==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-riscv64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.80.3.tgz", - "integrity": "sha512-0VThiW7Gwo5UNgKyETYID6F2prHvOCH8fQQKM0sS/JSbTu1poTwD35yEptVxBpiTvyWwxI7K5Cbn0gtxobaqzA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-musl-x64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.3.tgz", - "integrity": "sha512-ALSKlhTQdNS0cayyaXD8huNd+DRjWgCjDqyjvwSgemfLL+wtmVCO8h9rGu1MCwR8GHP6ceZCT2fBmjfcGHk0DQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-riscv64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.80.3.tgz", - "integrity": "sha512-/1JvuQi137BNO7iTvNNraGYEt9mh3ch44cabJBTxLn3IZV5vNblENI+Hrj9J8/VWIsJumwPQGZSUrMbZcgB0tg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-linux-x64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.3.tgz", - "integrity": "sha512-ISQUnl9oFA0PFPtgOpgotfKQ8guUBIYcTpkHEF9lQ4PyFIxkXppk5CwQ8l0VQcQaKhOD2HQAucoqM51U7FABqA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-arm64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.80.3.tgz", - "integrity": "sha512-RFT/OsWHVagPYa/9v+KfVM99QgzwzwnT2maapRfulEH39v0uPGOIFNXmnhaN3E5gNLIjIn3CTnR9KjTC145E8Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-ia32": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.80.3.tgz", - "integrity": "sha512-Is0eeX+UlWW7yPfDqc2Z2n9ql2rkA1uDaAkbHWWx5APc8CKYtds1w4B3Tyoy6lHnopEifgzgsnp6QSyOHHzPBg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded-win32-x64": { - "version": "1.80.3", - "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.80.3.tgz", - "integrity": "sha512-wehVA0atPloc6NKof/ctpW0agM+k7kiBLIpQs3/mi9FAlmTjxNnvntBPZIbl8n7AAExiLEir+x/LHC0yGhTfkg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "peer": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/sass-embedded/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/sass-embedded/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "optional": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, "node_modules/scheduler": { "version": "0.23.2", - "license": "MIT", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -4854,8 +4556,9 @@ }, "node_modules/shebang-command": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, - "license": "MIT", "dependencies": { "shebang-regex": "^3.0.0" }, @@ -4865,8 +4568,9 @@ }, "node_modules/shebang-regex": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" } @@ -4887,13 +4591,33 @@ "tslib": "^2.0.3" } }, + "node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/source-map-js": { "version": "1.2.1", - "license": "BSD-3-Clause", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, "engines": { "node": ">=0.10.0" } }, + "node_modules/stack-trace": { + "version": "1.0.0-pre2", + "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-1.0.0-pre2.tgz", + "integrity": "sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==", + "dev": true, + "engines": { + "node": ">=16" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -4901,15 +4625,16 @@ "dev": true }, "node_modules/std-env": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", - "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.8.0.tgz", + "integrity": "sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==", "dev": true }, "node_modules/strip-ansi": { "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, - "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -4919,8 +4644,9 @@ }, "node_modules/strip-json-comments": { "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, - "license": "MIT", "engines": { "node": ">=8" }, @@ -4929,15 +4655,15 @@ } }, "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { - "has-flag": "^3.0.0" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, "node_modules/svg-parser": { @@ -4973,16 +4699,9 @@ }, "node_modules/text-table": { "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "license": "MIT" - }, - "node_modules/tiny-warning": { - "version": "1.0.3", - "license": "MIT" + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true }, "node_modules/tinybench": { "version": "2.9.0", @@ -4997,9 +4716,9 @@ "dev": true }, "node_modules/tinypool": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.1.tgz", - "integrity": "sha512-URZYihUbRPcGv95En+sz6MfghfIc2OJ1sv/RmhWZLouPY0/8Vo80viwPvg3dlaS9fuq7fQMEfgRRK7BBZThBEA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-1.0.2.tgz", + "integrity": "sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==", "dev": true, "engines": { "node": "^18.0.0 || >=20.0.0" @@ -5023,18 +4742,11 @@ "node": ">=14.0.0" } }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -5043,9 +4755,9 @@ } }, "node_modules/ts-api-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", - "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz", + "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==", "dev": true, "engines": { "node": ">=16" @@ -5055,15 +4767,34 @@ } }, "node_modules/tslib": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.7.0.tgz", - "integrity": "sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==", - "dev": true + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/tsx": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.19.2.tgz", + "integrity": "sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==", + "dev": true, + "dependencies": { + "esbuild": "~0.23.0", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } }, "node_modules/type-check": { "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, - "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, @@ -5073,8 +4804,9 @@ }, "node_modules/type-fest": { "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true, - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, @@ -5102,23 +4834,16 @@ "dev": true }, "node_modules/unplugin": { - "version": "1.14.1", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.0.tgz", + "integrity": "sha512-5liCNPuJW8dqh3+DM6uNM2EI3MLLpCKp/KY+9pB5M2S2SR2qvvDHhKgBOaTWEbZTAws3CXfB0rKTIolWKL05VQ==", "dev": true, - "license": "MIT", "dependencies": { - "acorn": "^8.12.1", + "acorn": "^8.14.0", "webpack-virtual-modules": "^0.6.2" }, "engines": { "node": ">=14.0.0" - }, - "peerDependencies": { - "webpack-sources": "^3" - }, - "peerDependenciesMeta": { - "webpack-sources": { - "optional": true - } } }, "node_modules/update-browserslist-db": { @@ -5153,42 +4878,28 @@ }, "node_modules/uri-js": { "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, - "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz", - "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/valibot": { "version": "0.32.0", "resolved": "https://registry.npmjs.org/valibot/-/valibot-0.32.0.tgz", "integrity": "sha512-FXBnJl4bNOmeg7lQv+jfvo/wADsRBN8e9C3r+O77Re3dEnDma8opp7p4hcIbF7XJJ30h/5SVohdjer17/sHOsQ==" }, - "node_modules/varint": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", - "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", - "dev": true, - "optional": true, - "peer": true - }, "node_modules/vite": { - "version": "5.4.9", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.9.tgz", - "integrity": "sha512-20OVpJHh0PAM0oSOELa5GaZNWeDjcAvQjGXy2Uyr+Tp+/D2/Hdz6NLgpJLsarPTA2QJ6v8mX2P1ZfbsSKvdMkg==", + "version": "5.4.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.4.11.tgz", + "integrity": "sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==", "dev": true, "dependencies": { "esbuild": "^0.21.3", @@ -5245,13 +4956,14 @@ } }, "node_modules/vite-node": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.4.tgz", - "integrity": "sha512-kqa9v+oi4HwkG6g8ufRnb5AeplcRw8jUF6/7/Qz1qRQOXHImG8YnLbB+LLszENwFnoBl9xIf9nVdCFzNd7GQEg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-2.1.5.tgz", + "integrity": "sha512-rd0QIgx74q4S1Rd56XIiL2cYEdyWn13cunYBIuqh9mpmQr7gGS0IxXoP8R6OaZtNQQLyXSWbd4rXKYUbhFpK5w==", "dev": true, "dependencies": { "cac": "^6.7.14", "debug": "^4.3.7", + "es-module-lexer": "^1.5.4", "pathe": "^1.1.2", "vite": "^5.0.0" }, @@ -5279,13 +4991,142 @@ "vite": ">=2.6.0" } }, - "node_modules/vite/node_modules/@esbuild/linux-x64": { + "node_modules/vite/node_modules/@esbuild/aix-ppc64": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", "cpu": [ "x64" ], "dev": true, - "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, "optional": true, "os": [ "linux" @@ -5294,11 +5135,236 @@ "node": ">=12" } }, + "node_modules/vite/node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/vite/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/vite/node_modules/esbuild": { "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", "dev": true, "hasInstallScript": true, - "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, @@ -5331,397 +5397,31 @@ "@esbuild/win32-x64": "0.21.5" } }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/aix-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", - "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", - "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", - "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/android-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", - "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/darwin-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", - "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/darwin-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", - "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", - "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/freebsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", - "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-arm": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", - "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", - "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", - "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-loong64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", - "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-mips64el": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", - "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-ppc64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", - "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-riscv64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", - "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/linux-s390x": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", - "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/netbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", - "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/openbsd-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", - "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/sunos-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", - "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-arm64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", - "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-ia32": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", - "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/esbuild/node_modules/@esbuild/win32-x64": { - "version": "0.21.5", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", - "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vitest": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.4.tgz", - "integrity": "sha512-eDjxbVAJw1UJJCHr5xr/xM86Zx+YxIEXGAR+bmnEID7z9qWfoxpHw0zdobz+TQAFOLT+nEXz3+gx6nUJ7RgmlQ==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-2.1.5.tgz", + "integrity": "sha512-P4ljsdpuzRTPI/kbND2sDZ4VmieerR2c9szEZpjc+98Z9ebvnXmM5+0tHEKqYZumXqlvnmfWsjeFOjXVriDG7A==", "dev": true, "dependencies": { - "@vitest/expect": "2.1.4", - "@vitest/mocker": "2.1.4", - "@vitest/pretty-format": "^2.1.4", - "@vitest/runner": "2.1.4", - "@vitest/snapshot": "2.1.4", - "@vitest/spy": "2.1.4", - "@vitest/utils": "2.1.4", + "@vitest/expect": "2.1.5", + "@vitest/mocker": "2.1.5", + "@vitest/pretty-format": "^2.1.5", + "@vitest/runner": "2.1.5", + "@vitest/snapshot": "2.1.5", + "@vitest/spy": "2.1.5", + "@vitest/utils": "2.1.5", "chai": "^5.1.2", "debug": "^4.3.7", "expect-type": "^1.1.0", "magic-string": "^0.30.12", "pathe": "^1.1.2", - "std-env": "^3.7.0", + "std-env": "^3.8.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.1", "tinypool": "^1.0.1", "tinyrainbow": "^1.2.0", "vite": "^5.0.0", - "vite-node": "2.1.4", + "vite-node": "2.1.5", "why-is-node-running": "^2.3.0" }, "bin": { @@ -5736,8 +5436,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "2.1.4", - "@vitest/ui": "2.1.4", + "@vitest/browser": "2.1.5", + "@vitest/ui": "2.1.5", "happy-dom": "*", "jsdom": "*" }, @@ -5764,13 +5464,15 @@ }, "node_modules/webpack-virtual-modules": { "version": "0.6.2", - "dev": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true }, "node_modules/which": { "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, - "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, @@ -5798,22 +5500,24 @@ } }, "node_modules/wkt-parser": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.3.3.tgz", - "integrity": "sha512-ZnV3yH8/k58ZPACOXeiHaMuXIiaTk1t0hSUVisbO0t4RjA5wPpUytcxeyiN2h+LZRrmuHIh/1UlrR9e7DHDvTw==" + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/wkt-parser/-/wkt-parser-1.4.0.tgz", + "integrity": "sha512-qpwO7Ihds/YYDTi1aADFTI1Sm9YC/tTe3SHD24EeIlZxy7Ik6a1b4HOz7jAi0xdUAw487duqpo8OGu+Tf4nwlQ==" }, "node_modules/word-wrap": { "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrappy": { "version": "1.0.2", - "dev": true, - "license": "ISC" + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true }, "node_modules/yallist": { "version": "3.1.1", @@ -5823,8 +5527,9 @@ }, "node_modules/yocto-queue": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, - "license": "MIT", "engines": { "node": ">=10" }, @@ -5834,8 +5539,9 @@ }, "node_modules/zod": { "version": "3.23.8", - "devOptional": true, - "license": "MIT", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } @@ -5847,11 +5553,6 @@ "dependencies": { "tslib": "2.3.0" } - }, - "node_modules/zrender/node_modules/tslib": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", - "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" } } } diff --git a/package.json b/package.json index 8c90b35..4da9373 100644 --- a/package.json +++ b/package.json @@ -5,7 +5,7 @@ "type": "git", "url": "https://github.com/codex-storage/codex-marketplace-ui" }, - "version": "0.0.7", + "version": "0.0.13", "type": "module", "scripts": { "dev": "vite --host 127.0.0.1 --port 5173", @@ -15,7 +15,8 @@ "preview": "vite preview --host 127.0.0.1 --port 5173", "format": "prettier --write ./src", "test": "npx playwright test", - "test:unit": "vitest run" + "test:unit": "vitest run", + "knip": "knip" }, "keywords": [ "Codex", @@ -25,25 +26,25 @@ "React" ], "dependencies": { - "@codex-storage/marketplace-ui-components": "^0.0.43", - "@codex-storage/sdk-js": "^0.0.15", + "@codex-storage/marketplace-ui-components": "^0.0.51", + "@codex-storage/sdk-js": "^0.0.16", "@sentry/browser": "^8.32.0", "@sentry/react": "^8.31.0", "@tanstack/react-query": "^5.51.15", - "@tanstack/react-router": "^1.58.7", "dotted-map": "^2.2.3", "echarts": "^5.5.1", "emoji-picker-react": "^4.12.0", "idb-keyval": "^6.2.1", - "lucide-react": "^0.445.0", - "react": "^18.3.1", - "react-dom": "^18.3.1" + "preact": "^10.24.3", + "react-router": "^6.28.0", + "react-router-dom": "^6.28.0" }, "devDependencies": { "@playwright/test": "^1.48.0", + "@preact/preset-vite": "^2.9.1", "@svgr/plugin-svgo": "^8.1.0", "@tanstack/router-plugin": "^1.58.4", - "@types/node": "^22.7.5", + "@types/node": "^22.9.1", "@types/react": "^18.3.8", "@types/react-dom": "^18.3.0", "@typescript-eslint/eslint-plugin": "^8.7.0", @@ -56,7 +57,9 @@ "postcss": "^8.4.47", "postcss-nesting": "^13.0.1", "prettier": "^3.3.3", - "typescript": "5.5.4", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "typescript": "^5.5.4", "vite": "^5.4.7", "vite-plugin-svgr": "^4.3.0", "vitest": "^2.1.4" diff --git a/playwright.config.ts b/playwright.config.ts index c941687..7a44e0f 100644 --- a/playwright.config.ts +++ b/playwright.config.ts @@ -34,6 +34,8 @@ export default defineConfig({ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */ trace: 'on-first-retry', + + screenshot: "only-on-failure", }, /* Configure projects for major browsers */ diff --git a/public/icons/aud-flag.svg b/public/icons/aud-flag.svg new file mode 100644 index 0000000..e7917dc --- /dev/null +++ b/public/icons/aud-flag.svg @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/icons/btc-flag.svg b/public/icons/btc-flag.svg new file mode 100644 index 0000000..30f600e --- /dev/null +++ b/public/icons/btc-flag.svg @@ -0,0 +1,28 @@ + + + + + + + + + diff --git a/public/icons/cad-flag.svg b/public/icons/cad-flag.svg new file mode 100644 index 0000000..6b1ea17 --- /dev/null +++ b/public/icons/cad-flag.svg @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/public/icons/cny-flag.svg b/public/icons/cny-flag.svg new file mode 100644 index 0000000..053f46c --- /dev/null +++ b/public/icons/cny-flag.svg @@ -0,0 +1,45 @@ + + + + + + + + diff --git a/public/icons/eth-flag.svg b/public/icons/eth-flag.svg new file mode 100644 index 0000000..3ad1c3e --- /dev/null +++ b/public/icons/eth-flag.svg @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + diff --git a/public/icons/euro-flag.svg b/public/icons/euro-flag.svg new file mode 100644 index 0000000..26aadac --- /dev/null +++ b/public/icons/euro-flag.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + diff --git a/src/App.css b/src/App.css deleted file mode 100644 index e69de29..0000000 diff --git a/src/App.tsx b/src/App.tsx index 69f51f6..6507042 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,4 @@ import { ReactNode } from "react"; -import "./App.css"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; const queryClient = new QueryClient(); diff --git a/src/assets/css/container.css b/src/assets/css/container.css deleted file mode 100644 index 0140e28..0000000 --- a/src/assets/css/container.css +++ /dev/null @@ -1,8 +0,0 @@ -.container { - padding: 1.5rem; - flex: 1; -} - -.container-fluid { - padding-inline: 1.5rem; -} diff --git a/src/assets/css/indicator.css b/src/assets/css/indicator.css deleted file mode 100644 index 4b42e68..0000000 --- a/src/assets/css/indicator.css +++ /dev/null @@ -1,35 +0,0 @@ -.indicator { - display: flex; - align-items: center; - gap: 0.75rem; -} - -.indicator-point { - width: 12px; - height: 12px; - border-radius: 50%; - animation-duration: 3s; - animation-name: flash; - animation-iteration-count: infinite; - transition: none; -} - -.indicator-point-online { - background-color: var(--codex-color-primary); -} - -.indicator-point-offline { - background-color: rgb(217, 53, 38); -} - -@keyframes flash { - 0% { - opacity: 1; - } - 40% { - opacity: 0; - } - 100% { - opacity: 1; - } -} diff --git a/src/assets/css/text.css b/src/assets/css/text.css deleted file mode 100644 index ee13f03..0000000 --- a/src/assets/css/text.css +++ /dev/null @@ -1,27 +0,0 @@ -.text-contrast { - color: white; -} - -.text-secondary { - mix-blend-mode: difference; -} - -.text-center { - text-align: center; -} - -.text--primary { - color: var(--codex-color-primary); -} - -.text--error { - color: var(--codex-color-error); -} - -.text--spacing { - margin-bottom: 0.75rem; -} - -.text--warning { - color: var(--codex-color-warning); -} diff --git a/src/assets/error-placeholder.svg b/src/assets/error-placeholder.svg deleted file mode 100644 index d55762d..0000000 --- a/src/assets/error-placeholder.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/assets/icons/arrow-onboarding.svg b/src/assets/icons/arrow-onboarding.svg new file mode 100644 index 0000000..f9f067f --- /dev/null +++ b/src/assets/icons/arrow-onboarding.svg @@ -0,0 +1,5 @@ + + + diff --git a/src/assets/icons/dots.svg b/src/assets/icons/dots.svg new file mode 100644 index 0000000..d04ff91 --- /dev/null +++ b/src/assets/icons/dots.svg @@ -0,0 +1,14 @@ + + + + + diff --git a/src/assets/icons/durability-custom.svg b/src/assets/icons/durability-custom.svg new file mode 100644 index 0000000..21361f7 --- /dev/null +++ b/src/assets/icons/durability-custom.svg @@ -0,0 +1,11 @@ + + + diff --git a/src/assets/icons/durability-high.svg b/src/assets/icons/durability-high.svg new file mode 100644 index 0000000..85f8086 --- /dev/null +++ b/src/assets/icons/durability-high.svg @@ -0,0 +1,11 @@ + + + diff --git a/src/assets/icons/durability-low.svg b/src/assets/icons/durability-low.svg new file mode 100644 index 0000000..7978cf9 --- /dev/null +++ b/src/assets/icons/durability-low.svg @@ -0,0 +1,11 @@ + + + diff --git a/src/assets/icons/durability-medium.svg b/src/assets/icons/durability-medium.svg new file mode 100644 index 0000000..bb37958 --- /dev/null +++ b/src/assets/icons/durability-medium.svg @@ -0,0 +1,11 @@ + + + diff --git a/src/assets/icons/success-circle.svg b/src/assets/icons/success-circle.svg index 6aea5db..b4e5e4a 100644 --- a/src/assets/icons/success-circle.svg +++ b/src/assets/icons/success-circle.svg @@ -1,6 +1,5 @@ diff --git a/src/assets/icons/warning-circle.svg b/src/assets/icons/warning-circle.svg index 839a501..03a9c5c 100644 --- a/src/assets/icons/warning-circle.svg +++ b/src/assets/icons/warning-circle.svg @@ -1,6 +1,5 @@ diff --git a/src/assets/logo-inverse.svg b/src/assets/logo-inverse.svg deleted file mode 100644 index 3b77344..0000000 --- a/src/assets/logo-inverse.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/src/assets/network-error.svg b/src/assets/network-error.svg deleted file mode 100644 index 45cb79b..0000000 --- a/src/assets/network-error.svg +++ /dev/null @@ -1,89 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/src/assets/react.svg b/src/assets/react.svg deleted file mode 100644 index 6c87de9..0000000 --- a/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/AppBar/AppBar.tsx b/src/components/AppBar/AppBar.tsx index e38fac5..6d60f0a 100644 --- a/src/components/AppBar/AppBar.tsx +++ b/src/components/AppBar/AppBar.tsx @@ -5,7 +5,6 @@ import { useQueryClient } from "@tanstack/react-query"; import { ReactElement, useEffect } from "react"; import { useCodexConnection } from "../../hooks/useCodexConnection"; import { usePersistence } from "../../hooks/usePersistence"; -import { useLocation, useNavigate } from "@tanstack/react-router"; import DashboardIcon from "../../assets/icons/dashboard.svg?react"; import PeersIcon from "../../assets/icons/peers.svg?react"; import NodesIcon from "../../assets/icons/nodes.svg?react"; @@ -19,13 +18,17 @@ import PurchasesIcon from "../../assets/icons/purchase.svg?react"; import HelpIcon from "../../assets/icons/help.svg?react"; import DisclaimerIcon from "../../assets/icons/disclaimer.svg?react"; import { WalletConnect } from "../WalletLogin/WalletLogin"; +import { useNavigate } from "react-router-dom"; +import Logo from "../../assets/icons/logo.svg?react"; +import { useIsMobile } from "../../hooks/useMobile"; type Props = { onIconClick: () => void; + onExpanded: (val: boolean) => void; }; const icons: Record = { - dashboard: , + dashboard: , peers: , settings: , files: , @@ -50,13 +53,13 @@ const descriptions: Record = { disclaimer: "Important information.", }; -export function AppBar({ onIconClick }: Props) { +export function AppBar({ onIconClick, onExpanded }: Props) { const online = useNetwork(); const queryClient = useQueryClient(); const codex = useCodexConnection(); const persistence = usePersistence(codex.enabled); - const location = useLocation(); - const navigate = useNavigate({ from: location.pathname }); + const navigate = useNavigate(); + const isMobile = useIsMobile(); useEffect(() => { queryClient.invalidateQueries({ @@ -67,20 +70,24 @@ export function AppBar({ onIconClick }: Props) { const offline = !online || !codex.enabled; - const onNodeClick = () => navigate({ to: "/dashboard/settings" }); + const onNodeClick = () => navigate("/dashboard/settings"); const title = location.pathname.split("/")[2] || location.pathname.split("/")[1]; - const networkIconColor = online - ? "#3EE089" - : "var(--codex-input-color-error)"; + const networkIconColor = online ? "#3EE089" : "var(--codex-color-error)"; const nodesIconColor = codex.enabled === false - ? "var(--codex-input-color-error)" + ? "var(--codex-color-error)" : persistence.enabled ? "#3EE089" : "var(--codex-input-color-warning)"; + const icon = isMobile ? ( + onExpanded(true)} width={30}> + ) : ( + icons[title] + ); + return ( <>
- {icons[title]} + {icon}

{title}

diff --git a/src/components/AppBar/appBar.css b/src/components/AppBar/appBar.css index 9a6d877..6e8aa59 100644 --- a/src/components/AppBar/appBar.css +++ b/src/components/AppBar/appBar.css @@ -1,12 +1,12 @@ .app-bar { height: 80px; justify-content: space-between; - border-bottom: 1px solid var(--codex-border-color); + border-bottom: 1px solid rgba(150, 150, 150, 0.2); display: flex; padding: 16px; - border-bottom: 1px solid #96969633; + border-bottom: 1px solid rgba(150, 150, 150, 0.2); box-sizing: border-box; - background-color: #1c1c1c; + background-color: rgb(28, 28, 28); border-right: 12px solid transparent; position: sticky; top: 0; @@ -19,15 +19,15 @@ } &:not(.app-bar--offline):not(.app-bar--no-persistence) { - border-right-color: #6ccc93; + border-right-color: rgb(108, 204, 147); } &.app-bar--offline { - border-right-color: var(--codex-input-color-error); + border-right-color: rgb(251, 55, 72); } &.app-bar--no-persistence:not(.app-bar--offline) { - border-right-color: rgb(var(--codex-color-warning)); + border-right-color: rgb(251, 198, 75); } h1 { @@ -44,28 +44,34 @@ 400 14px/20px "Inter", sans-serif; letter-spacing: -0.006em; - color: #969696cc; + color: rgba(150, 150, 150, 0.8); + + @media (max-width: 800px) { + & { + display: none; + } + } } > div { span { - background: #141414; + background: rgb(20, 20, 20); height: 48px; width: 48px; display: flex; align-items: center; justify-content: center; - border: 1px solid #353639; + border: 1px solid rgb(53, 54, 57); border-radius: 50%; - color: #969696; + color: rgba(150, 150, 150, 1); } } aside { svg { padding: 10px; - background-color: #141414; - border-radius: var(--codex-border-radius); + background-color: rgb(20, 20, 20); + border-radius: 5px; } span { @@ -73,7 +79,7 @@ 500 14px/20px "Inter", sans-serif; letter-spacing: -0.006em; - color: #8d8d8d; + color: rgb(141, 141, 141); @media (max-width: 999px) { & { @@ -86,10 +92,10 @@ cursor: pointer; } } -} -/* @media (min-width: 1000px) { - .appBar-burger { - display: none; + @media (max-width: 800px) { + .wallet-login { + display: none; + } } -} */ +} diff --git a/src/components/Availability/AvailabilitiesTable.tsx b/src/components/Availability/AvailabilitiesTable.tsx index b2c71d8..531e050 100644 --- a/src/components/Availability/AvailabilitiesTable.tsx +++ b/src/components/Availability/AvailabilitiesTable.tsx @@ -4,14 +4,13 @@ import { Table, TabSortState, } from "@codex-storage/marketplace-ui-components"; -import { PrettyBytes } from "../../utils/bytes"; +import { Bytes } from "../../utils/bytes"; import { AvailabilityActionsCell } from "./AvailabilityActionsCell"; import { CodexAvailability, CodexNodeSpace } from "@codex-storage/sdk-js/async"; import { Times } from "../../utils/times"; import { Fragment, useState } from "react"; import { AvailabilityReservations } from "./AvailabilityReservations"; import { AvailabilityIdCell } from "./AvailabilityIdCell"; -import { Arrays } from "../../utils/arrays"; import { SlotRow } from "./SlotRow"; import { AvailabilityWithSlots } from "./types"; import { AvailabilityDiskRow } from "./AvailabilityDiskRow"; @@ -68,7 +67,8 @@ export function AvailabilitiesTable({ availabilities, space }: Props) { const rows = sorted.map((a) => { const showDetails = details.includes(a.id); - const onShowDetails = () => setDetails(Arrays.toggle(details, a.id)); + const onShowDetails = () => + setDetails(AvailabilityUtils.toggle(details, a.id)); const hasSlots = a.slots.length > 0; return ( @@ -86,7 +86,7 @@ export function AvailabilitiesTable({ availabilities, space }: Props) { )} , , - {PrettyBytes(a.totalSize)}, + {Bytes.pretty(a.totalSize)}, {Times.pretty(a.duration)}, {a.minPrice.toString()}, {a.maxCollateral.toString()}, diff --git a/src/components/Availability/AvailabilityActionsCell.css b/src/components/Availability/AvailabilityActionsCell.css index 37c5352..c17b2e6 100644 --- a/src/components/Availability/AvailabilityActionsCell.css +++ b/src/components/Availability/AvailabilityActionsCell.css @@ -1,17 +1,10 @@ .availability-actions { display: inline-flex; align-items: center; - border: 1px solid var(--codex-border-color); - border-radius: var(--codex-border-radius); - padding: 0.5rem; - background-color: #14141499; + border: 1px solid rgba(150, 150, 150, 0.2); + border-radius: 10px; + padding: 10px; + background-color: rgba(20, 20, 20, 0.6); gap: 8px; padding: 10px; - - .button-icon { - width: 40px; - height: 40px; - background-color: #2f2f2f; - border: 1px solid #96969633; - } } diff --git a/src/components/Availability/AvailabilityConfirm.css b/src/components/Availability/AvailabilityConfirm.css index 923fefa..224f2db 100644 --- a/src/components/Availability/AvailabilityConfirm.css +++ b/src/components/Availability/AvailabilityConfirm.css @@ -3,29 +3,29 @@ margin-top: 16px; margin-bottom: 16px; } -} -.availabilitConfirm-bottom { - margin-top: 1.5rem; - display: flex; - gap: 0.75rem; - align-items: flex-start; -} + > div { + margin-top: 1.5rem; + display: flex; + gap: 0.75rem; + align-items: flex-start; -.availabilitConfirm-subtitle { - margin-bottom: 0.5rem; - display: inline-block; -} + > div:first-child { + background-color: rgb(193, 240, 164, 0.2); + border-radius: 50%; + padding: 0.5rem; + display: flex; + align-items: center; + justify-content: center; -.availabilitConfirm-iconContainer { - background-color: rgb(var(--codex-color-primary-rgb), 0.2); - border-radius: 50%; - padding: 0.5rem; - display: flex; - align-items: center; - justify-content: center; -} + svg { + color: rgb(193, 240, 164); + } + } -.availabilitConfirm-icon { - color: rgb(var(--codex-color-primary-rgb)); + b { + margin-bottom: 0.5rem; + display: inline-block; + } + } } diff --git a/src/components/Availability/AvailabilityConfirmation.tsx b/src/components/Availability/AvailabilityConfirmation.tsx index 3e8ed62..5281389 100644 --- a/src/components/Availability/AvailabilityConfirmation.tsx +++ b/src/components/Availability/AvailabilityConfirmation.tsx @@ -1,10 +1,10 @@ import "./AvailabilityConfirm.css"; import { AvailabilityComponentProps } from "./types"; import "./AvailabilityConfirm.css"; -import { Info } from "lucide-react"; import { useEffect } from "react"; import { SpaceAllocation } from "@codex-storage/marketplace-ui-components"; import NodesIcon from "../../assets/icons/nodes.svg?react"; +import InfoIcon from "../../assets/icons/info.svg?react"; export function AvailabilityConfirm({ dispatch, @@ -54,15 +54,15 @@ export function AvailabilityConfirm({ }, ]}> -
-
- +
+
+
- Confirm your new sale + Confirm your new sale -

+

By clicking 'Next', you will establish a new sale based on the space allocation specified above. Do you want to confirm ?

diff --git a/src/components/Availability/AvailabilityContext.ts b/src/components/Availability/AvailabilityContext.ts deleted file mode 100644 index 7255bab..0000000 --- a/src/components/Availability/AvailabilityContext.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { createContext } from "react"; -import { AvailabilityWithSlots } from "./types"; - -export const AvailabilityContext = createContext(null); \ No newline at end of file diff --git a/src/components/Availability/AvailabilityDiskRow.tsx b/src/components/Availability/AvailabilityDiskRow.tsx index 9ee444d..e5f4aca 100644 --- a/src/components/Availability/AvailabilityDiskRow.tsx +++ b/src/components/Availability/AvailabilityDiskRow.tsx @@ -1,5 +1,5 @@ import { Cell, Row } from "@codex-storage/marketplace-ui-components"; -import { PrettyBytes } from "../../utils/bytes"; +import { Bytes } from "../../utils/bytes"; import { classnames } from "../../utils/classnames"; import HardriveIcon from "../../assets/icons/hardrive.svg?react"; @@ -19,7 +19,7 @@ export function AvailabilityDiskRow({ bytes }: Props) {
Node - {PrettyBytes(bytes)} allocated for the node + {Bytes.pretty(bytes)} allocated for the node
, diff --git a/src/components/Availability/AvailabilityEdit.css b/src/components/Availability/AvailabilityEdit.css index 085867d..1f3d397 100644 --- a/src/components/Availability/AvailabilityEdit.css +++ b/src/components/Availability/AvailabilityEdit.css @@ -30,7 +30,7 @@ } svg { - color: #969696; + color: rgba(150, 150, 150, 1); } header { @@ -38,10 +38,6 @@ gap: 8px; } - input { - background-color: transparent; - } - .space-allocation { margin-bottom: 16px; } diff --git a/src/components/Availability/AvailabilityEdit.tsx b/src/components/Availability/AvailabilityEdit.tsx index 7ef63a0..46acddd 100644 --- a/src/components/Availability/AvailabilityEdit.tsx +++ b/src/components/Availability/AvailabilityEdit.tsx @@ -10,7 +10,7 @@ import { CodexNodeSpace } from "@codex-storage/sdk-js"; import { AvailabilityConfirm } from "./AvailabilityConfirmation"; import { WebStorage } from "../../utils/web-storage"; import { AvailabilityState } from "./types"; -import { GB, STEPPER_DURATION } from "../../utils/constants"; +import { STEPPER_DURATION } from "../../utils/constants"; import { useAvailabilityMutation } from "./useAvailabilityMutation"; import { AvailabilitySuccess } from "./AvailabilitySuccess"; import { AvailabilityError } from "./AvailabilityError"; @@ -28,8 +28,8 @@ type Props = { const CONFIRM_STATE = 2; const defaultAvailabilityData: AvailabilityState = { - totalSize: 0.5 * GB, - duration: Times.unitValue("days"), + totalSize: 0.5, + duration: 1, minPrice: 0, maxCollateral: 0, totalSizeUnit: "gb", @@ -42,9 +42,9 @@ export function AvailabilityEdit({ hasLabel = true, }: Props) { const steps = useRef(["Sale", "Confirmation", "Success"]); - const [availability, setAvailability] = useState( - defaultAvailabilityData - ); + const [availability, setAvailability] = useState< + AvailabilityState & { slots?: unknown } + >(defaultAvailabilityData); const { state, dispatch } = useStepperReducer(); const { mutateAsync, error } = useAvailabilityMutation(dispatch, state); const editAvailabilityValue = useRef(0); @@ -52,7 +52,7 @@ export function AvailabilityEdit({ useEffect(() => { Promise.all([ WebStorage.get("availability-step"), - WebStorage.get("availability"), + WebStorage.get("availability-1"), ]).then(([s, a]) => { if (s) { dispatch({ @@ -62,31 +62,11 @@ export function AvailabilityEdit({ } if (a) { - setAvailability(a); + setAvailability({ ...defaultAvailabilityData, ...a }); } }); }, [dispatch]); - // We use a custom event to not re render the sunburst component - // useEffect(() => { - // const onAvailabilityIdChange = (e: Event) => { - // const custom = e as CustomEvent; - // setAvailabilityId(custom.detail); - // }; - - // document.addEventListener( - // "codexavailabilityid", - // onAvailabilityIdChange, - // false - // ); - - // return () => - // document.removeEventListener( - // "codexavailabilityid", - // onAvailabilityIdChange - // ); - // }, []); - const components = [ AvailabilityForm, AvailabilityConfirm, @@ -112,7 +92,8 @@ export function AvailabilityEdit({ WebStorage.set("availability-step", step); if (step == CONFIRM_STATE) { - const { slots, name, ...rest } = availability as any; + /* eslint-disable @typescript-eslint/no-unused-vars */ + const { slots, name, ...rest } = availability; mutateAsync(rest); } else { dispatch({ @@ -156,7 +137,7 @@ export function AvailabilityEdit({ editAvailabilityValue.current = a.totalSize; WebStorage.set("availability-step", 0); - WebStorage.set("availability", a); + WebStorage.set("availability-1", a); const unit = Times.unit(a.duration); diff --git a/src/components/Availability/AvailabilityForm.css b/src/components/Availability/AvailabilityForm.css index 262e8c1..0b2055a 100644 --- a/src/components/Availability/AvailabilityForm.css +++ b/src/components/Availability/AvailabilityForm.css @@ -10,7 +10,7 @@ } option { - background-color: #232323; + background-color: rgb(35, 35, 35); } header { @@ -20,6 +20,12 @@ .row { margin-bottom: 16px; + + @media screen and (max-width: 800px) { + & { + flex-direction: column; + } + } } .group { @@ -29,13 +35,13 @@ &[aria-invalid] { .input-group > div > div > div:nth-child(2) { - border-color: var(--codex-input-color-error); + border-color: var(-codex-color-error); } label, svg, select { - color: var(--codex-input-color-error); + color: var(-codex-color-error); } } } diff --git a/src/components/Availability/AvailabilityForm.tsx b/src/components/Availability/AvailabilityForm.tsx index 6f4c847..fcf42a3 100644 --- a/src/components/Availability/AvailabilityForm.tsx +++ b/src/components/Availability/AvailabilityForm.tsx @@ -11,7 +11,6 @@ import NodesIcon from "../../assets/icons/nodes.svg?react"; import InfoIcon from "../../assets/icons/info.svg?react"; import { attributes } from "../../utils/attributes"; import { AvailabilityUtils } from "./availability.utils"; -import { Times } from "../../utils/times"; export function AvailabilityForm({ dispatch, @@ -39,27 +38,24 @@ export function AvailabilityForm({ const element = e.currentTarget; onAvailabilityChange({ - totalSize: 0, totalSizeUnit: element.value as "tb" | "gb", }); }; const onDurationChange = async (e: ChangeEvent) => { const element = e.currentTarget; - const unitValue = Times.unitValue(availability.durationUnit); onAvailabilityChange({ - duration: parseInt(element.value) * unitValue, + duration: parseInt(element.value), }); }; const onDurationUnitChange = async (e: ChangeEvent) => { const element = e.currentTarget; const unit = element.value as "hours" | "days" | "months"; - const unitValue = Times.unitValue(unit); onAvailabilityChange({ - duration: unitValue, + duration: availability.duration, durationUnit: unit, }); }; @@ -67,10 +63,9 @@ export function AvailabilityForm({ const onAvailablityChange = async (e: ChangeEvent) => { const element = e.currentTarget; const v = element.value; - const unit = AvailabilityUtils.unitValue(availability.totalSizeUnit); onAvailabilityChange({ - totalSize: parseFloat(v) * unit, + totalSize: parseFloat(v), }); }; @@ -87,7 +82,12 @@ export function AvailabilityForm({ const available = AvailabilityUtils.maxValue(space); onAvailabilityChange({ - totalSize: available, + totalSize: + Math.floor( + ((available - 1) / + AvailabilityUtils.unitValue(availability.totalSizeUnit)) * + 10 + ) / 10, }); }; @@ -96,20 +96,17 @@ export function AvailabilityForm({ available += editAvailabilityValue; } - const isValid = - availability.totalSize > 0 && available >= availability.totalSize; + const totalSizeInBytes = + availability.totalSize * + AvailabilityUtils.unitValue(availability.totalSizeUnit); + + const isValid = totalSizeInBytes > 0 && available >= totalSizeInBytes; const helper = isValid ? "Total size of sale's storage in bytes" : "The total size cannot exceed the space available."; - const value = AvailabilityUtils.toUnit( - availability.totalSize, - availability.totalSizeUnit - ).toFixed(2); - - const unitValue = Times.unitValue(availability.durationUnit); - const duration = availability.duration / unitValue; + const duration = availability.duration; return (
@@ -143,13 +140,12 @@ export function AvailabilityForm({ name="totalSize" type="number" label="Total size" - min={0.01} isInvalid={!isValid} max={available.toFixed(2)} onChange={onAvailablityChange} onGroupChange={onTotalSizeUnitChange} - step={"0.01"} - value={value} + value={availability.totalSize.toString()} + min={"0"} group={[ ["gb", "GB"], // ["tb", "TB"], @@ -185,40 +181,38 @@ export function AvailabilityForm({
-
-
-
- - - - -
+
+
+ + + + +
-
- - - - -
+
+ + + +
diff --git a/src/components/Availability/AvailabilityIdCell.tsx b/src/components/Availability/AvailabilityIdCell.tsx index aec2721..f2c1478 100644 --- a/src/components/Availability/AvailabilityIdCell.tsx +++ b/src/components/Availability/AvailabilityIdCell.tsx @@ -1,6 +1,6 @@ import { Strings } from "../../utils/strings"; import { Cell } from "@codex-storage/marketplace-ui-components"; -import { PrettyBytes } from "../../utils/bytes"; +import { Bytes } from "../../utils/bytes"; import { AvailabilityWithSlots } from "./types"; import AvailbilityIcon from "../../assets/icons/availability.svg?react"; @@ -18,7 +18,7 @@ export function AvailabilityIdCell({ value }: Props) { {value.name || Strings.shortId(value.id)}
- {PrettyBytes(value.totalSize)} allocated for the availability + {Bytes.pretty(value.totalSize)} allocated for the availability
diff --git a/src/components/Availability/AvailabilityReservations.tsx b/src/components/Availability/AvailabilityReservations.tsx index ffd1510..559f968 100644 --- a/src/components/Availability/AvailabilityReservations.tsx +++ b/src/components/Availability/AvailabilityReservations.tsx @@ -11,14 +11,14 @@ import { Promises } from "../../utils/promises"; import { CodexAvailability } from "@codex-storage/sdk-js"; import { useEffect } from "react"; import { ErrorPlaceholder } from "../ErrorPlaceholder/ErrorPlaceholder"; -import { availabilityColors } from "./availability.colors"; +import { AvailabilityUtils } from "./availability.utils"; type Props = { availability: CodexAvailability | null; open: boolean; onClose: () => unknown; }; -// TODO remove this + export function AvailabilityReservations({ availability, onClose, @@ -95,12 +95,15 @@ export function AvailabilityReservations({ ...data.map((val, index) => ({ title: val.id, size: parseInt(val.size, 10), - color: availabilityColors[index], + color: AvailabilityUtils.availabilityColors[index], })), { title: "Availability remaining", size: totalSize - totalUsed, - color: availabilityColors[availabilityColors.length - 1], + color: + AvailabilityUtils.availabilityColors[ + AvailabilityUtils.availabilityColors.length - 1 + ], }, ]; const isEmpty = !data.length; diff --git a/src/components/Availability/AvailabilitySheetCreate.tsx b/src/components/Availability/AvailabilitySheetCreate.tsx deleted file mode 100644 index fb7ca19..0000000 --- a/src/components/Availability/AvailabilitySheetCreate.tsx +++ /dev/null @@ -1,164 +0,0 @@ -import { - Stepper, - useStepperReducer, - Button, - Modal, -} from "@codex-storage/marketplace-ui-components"; -import { useEffect, useRef, useState } from "react"; -import { AvailabilityForm } from "./AvailabilityForm"; -import { Plus } from "lucide-react"; -import { CodexNodeSpace } from "@codex-storage/sdk-js"; -import { AvailabilityConfirm } from "./AvailabilityConfirmation"; -import { WebStorage } from "../../utils/web-storage"; -import { AvailabilityState } from "./types"; -import { STEPPER_DURATION } from "../../utils/constants"; -import { useAvailabilityMutation } from "./useAvailabilityMutation"; -import { AvailabilitySuccess } from "./AvailabilitySuccess"; -import { AvailabilityError } from "./AvailabilityError"; -import "./AvailabilityCreate.css"; - -type Props = { - space: CodexNodeSpace; - hasLabel?: boolean; - className?: string; -}; - -const CONFIRM_STATE = 2; - -const defaultAvailabilityData: AvailabilityState = { - totalSize: 1, - duration: 1, - minPrice: 0, - maxCollateral: 0, - totalSizeUnit: "gb", - durationUnit: "days", -}; - -export function AvailabilitySheetCreate({ - space, - className = "", - hasLabel = true, -}: Props) { - const steps = useRef(["Sale", "Confirmation", "Success"]); - const [availability, setAvailability] = useState( - defaultAvailabilityData - ); - const { state, dispatch } = useStepperReducer(); - const { mutateAsync, error } = useAvailabilityMutation(dispatch, state); - - useEffect(() => { - Promise.all([ - WebStorage.get("availability-step"), - WebStorage.get("availability"), - ]).then(([s, a]) => { - if (s) { - dispatch({ - type: "next", - step: s, - }); - } - - if (a) { - setAvailability(a); - } - }); - }, [dispatch]); - - const components = [ - AvailabilityForm, - AvailabilityConfirm, - error ? AvailabilityError : AvailabilitySuccess, - ]; - - const onNextStep = async (step: number) => { - if (step === components.length) { - setAvailability(defaultAvailabilityData); - - dispatch({ - step: 0, - type: "next", - }); - - dispatch({ - type: "close", - }); - - return; - } - - WebStorage.set("availability-step", step); - - if (step == CONFIRM_STATE) { - mutateAsync(availability); - } else { - dispatch({ - step, - type: "next", - }); - } - }; - - const onAvailabilityChange = (data: Partial) => { - const val = { ...availability, ...data }; - - WebStorage.set("availability", val); - - setAvailability(val); - }; - - const onOpen = () => { - if (availability.id) { - WebStorage.set("availability-step", 0); - WebStorage.set("availability", defaultAvailabilityData); - - setAvailability(defaultAvailabilityData); - } - - dispatch({ - type: "open", - }); - - dispatch({ - step: 0, - type: "next", - }); - }; - - const onClose = () => dispatch({ type: "close" }); - - const Body = components[state.step] || (() => ); - const backLabel = state.step ? "Back" : "Close"; - const nextLabel = state.step === steps.current.length - 1 ? "Finish" : "Next"; - - return ( - <> -
, diff --git a/src/components/Availability/Sunburst.css b/src/components/Availability/Sunburst.css index 80d6ecd..84ce893 100644 --- a/src/components/Availability/Sunburst.css +++ b/src/components/Availability/Sunburst.css @@ -1,5 +1,3 @@ .sunburst { - height: 350px; - width: 350px; margin: auto; } diff --git a/src/components/Availability/Sunburst.tsx b/src/components/Availability/Sunburst.tsx index 31608fd..847162c 100644 --- a/src/components/Availability/Sunburst.tsx +++ b/src/components/Availability/Sunburst.tsx @@ -1,19 +1,27 @@ import { CodexNodeSpace } from "@codex-storage/sdk-js"; import { Times } from "../../utils/times"; import { Strings } from "../../utils/strings"; -import { PrettyBytes } from "../../utils/bytes"; +import { Bytes } from "../../utils/bytes"; import { useEffect, useRef, useState } from "react"; import { CallbackDataParams, ECBasicOption } from "echarts/types/dist/shared"; -import * as echarts from "echarts"; -import { availabilityColors, slotColors } from "./availability.colors"; +import * as echarts from "echarts/core"; + +// Import bar charts, all suffixed with Chart +import { SunburstChart } from "echarts/charts"; import { AvailabilityWithSlots } from "./types"; import "./Sunburst.css"; +import { AvailabilityUtils } from "./availability.utils"; type Props = { availabilities: AvailabilityWithSlots[]; space: CodexNodeSpace; }; +import { TooltipComponent } from "echarts/components"; +import { SVGRenderer } from "echarts/renderers"; + +echarts.use([SunburstChart, TooltipComponent, SVGRenderer]); + export function Sunburst({ availabilities, space }: Props) { const div = useRef(null); const chart = useRef(null); @@ -28,12 +36,22 @@ export function Sunburst({ availabilities, space }: Props) { } }, [chart, div]); + useEffect(() => { + const refresh = () => chart.current?.resize(); + + window.addEventListener("resize", refresh); + + return () => { + window.removeEventListener("resize", refresh); + }; + }, []); + const data = availabilities.map((a, index) => { return { name: Strings.shortId(a.id), value: a.totalSize, itemStyle: { - color: availabilityColors[index], + color: AvailabilityUtils.availabilityColors[index], borderColor: "transparent", }, tooltip: { @@ -57,7 +75,7 @@ export function Sunburst({ availabilities, space }: Props) { a.minPrice + "
" + "Size " + - PrettyBytes(a.totalSize) + Bytes.pretty(a.totalSize) ); }, }, @@ -66,7 +84,7 @@ export function Sunburst({ availabilities, space }: Props) { value: parseFloat(slot.size), children: [], itemStyle: { - color: slotColors[index], + color: AvailabilityUtils.slotColors[index], borderColor: "transparent", }, tooltip: { @@ -79,7 +97,7 @@ export function Sunburst({ availabilities, space }: Props) { params.marker + "Slot " + slot.id + - PrettyBytes(parseFloat(slot.size)) + Bytes.pretty(parseFloat(slot.size)) ); }, }, @@ -87,81 +105,83 @@ export function Sunburst({ availabilities, space }: Props) { }; }); - const option: ECBasicOption = { - series: { - type: "sunburst", - data: [ - ...data, - { - name: "Space remaining", - value: - space.quotaMaxBytes - - space.quotaReservedBytes - - space.quotaUsedBytes, - children: [], - itemStyle: { - color: "#2F2F2F", - borderColor: "transparent", - }, - tooltip: { - backgroundColor: "#333", - textStyle: { - color: "#fff", - }, - formatter: (params: CallbackDataParams) => { - return ( - params.marker + - " Space remaining " + - PrettyBytes( - space.quotaMaxBytes - - space.quotaReservedBytes - - space.quotaUsedBytes - ) - ); - }, - }, - }, - ], - radius: [60, "90%"], - itemStyle: { - borderWidth: 1, - }, - label: { - show: false, - }, - levels: [ - {}, - { - r0: "35%", - r: "70%", - label: { - align: "right", - }, - }, - { - r0: "75%", - r: "85%", - itemStyle: {}, - label: { - position: "outside", - textShadowBlur: 5, - textShadowColor: "#333", - }, - downplay: { - label: { - opacity: 1, - }, - }, - }, - ], - }, - tooltip: { - // type: "item", - }, - }; - if (chart.current) { + const option: ECBasicOption = { + series: { + type: "sunburst", + data: [ + ...data, + { + name: "Space remaining", + value: + space.quotaMaxBytes - + space.quotaReservedBytes - + space.quotaUsedBytes, + children: [], + itemStyle: { + color: "#2F2F2F", + borderColor: "transparent", + }, + tooltip: { + backgroundColor: "#333", + textStyle: { + color: "#fff", + }, + formatter: (params: CallbackDataParams) => { + return ( + params.marker + + " Space remaining " + + Bytes.pretty( + space.quotaMaxBytes - + space.quotaReservedBytes - + space.quotaUsedBytes + ) + ); + }, + }, + }, + ], + radius: [60, "90%"], + itemStyle: { + borderWidth: 1, + }, + label: { + show: false, + }, + levels: [ + {}, + { + r0: "35%", + r: "70%", + label: { + align: "right", + }, + }, + { + r0: "75%", + r: "85%", + itemStyle: {}, + label: { + position: "outside", + textShadowBlur: 5, + textShadowColor: "#333", + }, + downplay: { + label: { + opacity: 1, + }, + }, + }, + ], + }, + tooltip: { + // type: "item", + }, + }; + chart.current.setOption(option); + chart.current?.resize(); + // chart.current.off("click"); // chart.current.on("click", function (params) { // // console.info(params.componentIndex); @@ -180,5 +200,15 @@ export function Sunburst({ availabilities, space }: Props) { // }); } - return
; + const size = window.innerWidth > 500 ? 350 : 300; + + return ( +
+ ); } diff --git a/src/components/Availability/availability.colors.ts b/src/components/Availability/availability.colors.ts deleted file mode 100644 index be484b2..0000000 --- a/src/components/Availability/availability.colors.ts +++ /dev/null @@ -1,19 +0,0 @@ -export const availabilityColors = [ - "#34A0FFFF", - "#34A0FFEE", - "#34A0FFDD", - "#34A0FFCC", - "#34A0FFBB", - "#34A0FFAA", - "#34A0FF99", -]; - -export const slotColors = [ - "#D2493CFF", - "#D2493CEE", - "#D2493CDD", - "#D2493CCC", - "#D2493CBB", - "#D2493CAA", - "#D2493C99", -]; \ No newline at end of file diff --git a/src/components/Availability/availability.domain.ts b/src/components/Availability/availability.domain.ts deleted file mode 100644 index 199d867..0000000 --- a/src/components/Availability/availability.domain.ts +++ /dev/null @@ -1,46 +0,0 @@ -import { CodexNodeSpace } from "@codex-storage/sdk-js"; -import { GB, TB } from "../../utils/constants"; -import { AvailabilityState } from "./types"; - -export class AvailabilityDomain { - space: CodexNodeSpace - state: AvailabilityState - - constructor(space: CodexNodeSpace, availability: AvailabilityState) { - this.space = space - this.state = availability - } - - get unitInBytes() { - return this.state.totalSizeUnit === "gb" ? GB : TB; - } - - get unit() { - return this.state.totalSizeUnit; - } - - get sizeInUnit() { - return this.state.totalSize - } - - get maxInBytes() { - return this.space.quotaMaxBytes - this.space.quotaReservedBytes - this.space.quotaUsedBytes - } - - get maxInUnit() { - return this.maxInBytes / this.unitInBytes / this.unitInBytes - } - - isValid() { - const size = this.state.totalSize * this.unitInBytes; - - return size > 0 && size <= this.maxInBytes; - } -} - -export const isAvailabilityValid = ( - availability: AvailabilityState, - max: number -) => availability.totalSize > 0 && availability.totalSize <= max; - - diff --git a/src/components/Availability/availability.utils.test.ts b/src/components/Availability/availability.utils.test.ts index e883fbe..2e654ff 100644 --- a/src/components/Availability/availability.utils.test.ts +++ b/src/components/Availability/availability.utils.test.ts @@ -1,5 +1,8 @@ import { assert, describe, it } from "vitest"; import { AvailabilityUtils } from "./availability.utils"; +import { GB, TB } from "../../utils/constants"; +import { CodexNodeSpace } from "@codex-storage/sdk-js"; +import { AvailabilityState } from "./types"; describe("files", () => { it("sorts by id", async () => { @@ -156,4 +159,37 @@ describe("files", () => { assert.deepEqual(ascSorted, [a, b]); }); + + it("returns the number of bytes per unit", async () => { + assert.deepEqual(AvailabilityUtils.toUnit(GB, "gb"), 1); + assert.deepEqual(AvailabilityUtils.toUnit(TB, "tb"), 1); + }) + + + it("returns the max value possible for an availability", async () => { + const space: CodexNodeSpace = { + quotaMaxBytes: 8 * GB, + quotaReservedBytes: 2 * GB, + quotaUsedBytes: GB, + totalBlocks: 0 + } + assert.deepEqual(AvailabilityUtils.maxValue(space), 5 * GB - 1); + }) + + it("checks the availability max value", async () => { + const availability = { + totalSizeUnit: "gb", + totalSize: 1 + } as AvailabilityState + + assert.deepEqual(AvailabilityUtils.isValid(availability, GB * 2), true); + assert.deepEqual(AvailabilityUtils.isValid({ ...availability, totalSize: -1 }, GB), false); + assert.deepEqual(AvailabilityUtils.isValid({ ...availability, totalSize: GB }, 2 * GB), false); + }) + + it("toggles item in array", async () => { + const array: string[] = [] + assert.deepEqual(AvailabilityUtils.toggle(array, "1"), ["1"]); + assert.deepEqual(AvailabilityUtils.toggle(AvailabilityUtils.toggle(array, "1"), "1"), []); + }) }) \ No newline at end of file diff --git a/src/components/Availability/availability.utils.ts b/src/components/Availability/availability.utils.ts index 28c5ae7..50bf72f 100644 --- a/src/components/Availability/availability.utils.ts +++ b/src/components/Availability/availability.utils.ts @@ -39,7 +39,8 @@ export const AvailabilityUtils = { return bytes / this.unitValue(unit || "gb") }, maxValue(space: CodexNodeSpace) { - return space.quotaMaxBytes - space.quotaReservedBytes - space.quotaUsedBytes + // Remove 1 byte to allow to create an availability with the max space possible + return space.quotaMaxBytes - space.quotaReservedBytes - space.quotaUsedBytes - 1 }, unitValue(unit: "gb" | "tb") { return unit === "tb" ? TB : GB @@ -47,6 +48,46 @@ export const AvailabilityUtils = { isValid: ( availability: AvailabilityState, max: number - ) => availability.totalSize > 0 && availability.totalSize <= max + ) => availability.totalSize > 0 && availability.totalSize * AvailabilityUtils.unitValue(availability.totalSizeUnit) <= max + , + toggle: (arr: Array, value: T) => + arr.includes(value) ? arr.filter(i => i !== value) : [...arr, value], + availabilityColors: [ + "#34A0FFFF", + "#34A0FFEE", + "#34A0FFDD", + "#34A0FFCC", + "#34A0FFBB", + "#34A0FFAA", + "#34A0FF99", + "#34A0FF88", + "#34A0FF77", + "#34A0FF66", + "#34A0FF55", + "#34A0FF44", + "#34A0FF33", + "#34A0FF22", + "#34A0FF11", + "#34A0FF00", + ], + + slotColors: [ + "#D2493CFF", + "#D2493CEE", + "#D2493CDD", + "#D2493CCC", + "#D2493CBB", + "#D2493CAA", + "#D2493C99", + "#D2493C88", + "#D2493C77", + "#D2493C66", + "#D2493C55", + "#D2493C44", + "#D2493C33", + "#D2493C22", + "#D2493C11", + "#D2493C00", + ], } \ No newline at end of file diff --git a/src/components/Availability/useAvailabilityMutation.ts b/src/components/Availability/useAvailabilityMutation.ts index 64a8838..b79b2aa 100644 --- a/src/components/Availability/useAvailabilityMutation.ts +++ b/src/components/Availability/useAvailabilityMutation.ts @@ -9,6 +9,8 @@ import { } from "@codex-storage/marketplace-ui-components"; import { CodexSdk } from "../../sdk/codex"; import { CodexAvailabilityCreateResponse } from "@codex-storage/sdk-js"; +import { Times } from "../../utils/times"; +import { AvailabilityUtils } from "./availability.utils"; export function useAvailabilityMutation( @@ -42,15 +44,15 @@ export function useAvailabilityMutation( return fn({ ...input, - duration, - totalSize: Math.trunc(totalSize), + duration: Times.value(durationUnit) * duration, + totalSize: Math.trunc(totalSize * AvailabilityUtils.unitValue(totalSizeUnit)), }); }, onSuccess: (res, body) => { queryClient.invalidateQueries({ queryKey: ["availabilities"] }); queryClient.invalidateQueries({ queryKey: ["space"] }); - WebStorage.delete("availability"); + WebStorage.delete("availability-1"); WebStorage.delete("availability-step"); if (typeof res === "object" && body.name) { diff --git a/src/components/Card/Card.css b/src/components/Card/Card.css index 543f0d2..e3e4201 100644 --- a/src/components/Card/Card.css +++ b/src/components/Card/Card.css @@ -1,8 +1,15 @@ .card { - border: 1px solid #96969633; + border: 1px solid rgba(150, 150, 150, 0.2); border-radius: 16px; padding: 16px; - background-color: #232323; + background-color: rgb(35, 35, 35); + + @media (max-width: 800px) { + &, + td:nth-child(2) { + padding: 8px; + } + } > header { display: flex; @@ -12,7 +19,7 @@ margin-bottom: 16px; svg { - color: #969696; + color: rgba(150, 150, 150, 1); } > div { diff --git a/src/components/CardNumbers/CardNumbers.css b/src/components/CardNumbers/CardNumbers.css index 25b52be..11a39d4 100644 --- a/src/components/CardNumbers/CardNumbers.css +++ b/src/components/CardNumbers/CardNumbers.css @@ -1,10 +1,10 @@ .card-number { - --codex-card-number-label-color: #7b7b7b; - --codex-card-number-unit-color: #969696; + --codex-card-number-label-color: rgb(123, 123, 123); + --codex-card-number-unit-color: rgba(150, 150, 150, 1); &[aria-invalid] { - --codex-card-number-label-color: var(--codex-input-color-error); - --codex-card-number-unit-color: var(--codex-input-color-error); + --codex-card-number-label-color: var(-codex-color-error); + --codex-card-number-unit-color: var(-codex-color-error); } position: relative; @@ -33,21 +33,6 @@ color: var(--codex-card-number-unit-color); } - /* svg::after { - content: attr(data-title); - background-color: #2f2f2f; - color: #fff; - padding: 8px; - border-radius: 4px; - font-size: 12px; - line-height: 14px; - display: block; - white-space: nowrap; - position: absolute; - right: 1rem; - overflow: visible; - } */ - span { font-family: Inter; font-size: 12px; diff --git a/src/components/CardNumbers/CardNumbers.tsx b/src/components/CardNumbers/CardNumbers.tsx index 03aa7f7..4b2896e 100644 --- a/src/components/CardNumbers/CardNumbers.tsx +++ b/src/components/CardNumbers/CardNumbers.tsx @@ -58,34 +58,6 @@ export function CardNumbers({ {unit} - - {/*
-
- <> -

- - - -

-
- {title} -
-
- {error ? ( - {error} - ) : ( - {helper} - )} */}
); } diff --git a/src/components/ConnectedAccount/ConnectedAccount.css b/src/components/ConnectedAccount/ConnectedAccount.css index 55f6c46..b0e7351 100644 --- a/src/components/ConnectedAccount/ConnectedAccount.css +++ b/src/components/ConnectedAccount/ConnectedAccount.css @@ -2,7 +2,7 @@ border-radius: 8px; display: flex; flex-direction: column; - min-width: 550px; + /* min-width: 550px; */ main { flex: 1; @@ -13,8 +13,8 @@ display: flex; list-style-type: none; margin-top: 16px; - border: 1px solid #96969633; - background-color: #14141499; + border: 1px solid rgba(150, 150, 150, 0.2); + background-color: rgba(20, 20, 20, 0.6); height: 24px; border-radius: 6px; @@ -28,18 +28,22 @@ font-weight: 500; line-height: 16px; text-align: left; - color: #969696; + color: rgba(150, 150, 150, 1); + + &:hover { + cursor: pointer; + } &[aria-selected] { - background: #2f2f2f; + background: rgb(47, 47, 47); color: white; } } } button { - background-color: #161616; - border: 1px solid #96969633; + background-color: rgb(22, 22, 22); + border: 1px solid rgba(150, 150, 150, 0.2); height: 24px; width: 24px; border-radius: 6px; @@ -67,7 +71,7 @@ line-height: 20px; letter-spacing: -0.006em; text-align: left; - color: #969696; + color: rgba(150, 150, 150, 1); } var { @@ -87,7 +91,7 @@ font-weight: 500; line-height: 16px; text-align: left; - color: #7d7d7d; + color: rgb(125, 125, 125); } } } diff --git a/src/components/ConnectedAccount/ConnectedAccount.tsx b/src/components/ConnectedAccount/ConnectedAccount.tsx index 37ecf33..1e3f182 100644 --- a/src/components/ConnectedAccount/ConnectedAccount.tsx +++ b/src/components/ConnectedAccount/ConnectedAccount.tsx @@ -2,18 +2,36 @@ import "./ConnectedAccount.css"; import { WalletCard } from "./WalletCard"; import { ProgressCircle } from "./ProgressCircle"; import ArrowRightIcon from "../../assets/icons/arrow-right.svg?react"; +import { useState } from "react"; +import { attributes } from "../../utils/attributes"; + +type TabType = "weekly" | "daily" | "monthly"; export function ConnectedAccount() { + const [tab, setTab] = useState("monthly"); + return (
- +
    -
  • Daily
  • -
  • Weekly
  • -
  • Monthly
  • +
  • setTab("daily")} + {...attributes({ "aria-selected": tab === "daily" })}> + Daily +
  • +
  • setTab("weekly")} + {...attributes({ "aria-selected": tab === "weekly" })}> + Weekly +
  • +
  • setTab("monthly")} + {...attributes({ "aria-selected": tab === "monthly" })}> + Monthly +
diff --git a/src/components/ConnectedAccount/ProgressCircle.css b/src/components/ConnectedAccount/ProgressCircle.css index 6f73ad1..fa55130 100644 --- a/src/components/ConnectedAccount/ProgressCircle.css +++ b/src/components/ConnectedAccount/ProgressCircle.css @@ -3,20 +3,21 @@ width: 48px; height: 48px; display: flex; - background: #2f2f2f; + background: rgb(47, 47, 47); background-image: - -webkit-linear-gradient(90deg, #2f2f2f 50%, transparent 50%), - -webkit-linear-gradient(270deg, var(--codex-color-primary) 50%, #2f2f2f 50%); - background-image: linear-gradient(90deg, #2f2f2f 50%, transparent 50%), - linear-gradient(270deg, var(--codex-color-primary) 50%, #2f2f2f 50%); + -webkit-linear-gradient(90deg, rgb(47, 47, 47) 50%, transparent 50%), + -webkit-linear-gradient(270deg, var(--codex-color-primary) 50%, rgb + (47, 47, 47) 50%); + background-image: linear-gradient(90deg, rgb(47, 47, 47) 50%, transparent 50%), + linear-gradient(270deg, var(--codex-color-primary) 50%, rgb(47, 47, 47) 50%); div { border-radius: 50%; width: 36px; height: 36px; margin: auto; - background: #232323; + background: rgb(35, 35, 35); text-align: center; box-sizing: border-box; } diff --git a/src/components/ConnectedAccount/ProgressCircle.tsx b/src/components/ConnectedAccount/ProgressCircle.tsx index 1137d1b..652b39b 100644 --- a/src/components/ConnectedAccount/ProgressCircle.tsx +++ b/src/components/ConnectedAccount/ProgressCircle.tsx @@ -4,6 +4,7 @@ type Props = { value: number; }; +/* eslint-disable @typescript-eslint/no-unused-vars */ export function ProgressCircle(_: Props) { return (
diff --git a/src/components/ConnectedAccount/WalletCard.css b/src/components/ConnectedAccount/WalletCard.css index f0fa1d8..f8f4b57 100644 --- a/src/components/ConnectedAccount/WalletCard.css +++ b/src/components/ConnectedAccount/WalletCard.css @@ -10,7 +10,7 @@ background-repeat: no-repeat; background-size: cover; - border: 1px solid #96969633; + border: 1px solid rgba(150, 150, 150, 0.2); border-radius: 16px; padding: 16px; box-sizing: border-box; @@ -36,8 +36,8 @@ align-items: center; button { - background-color: #161616; - border: 1px solid #96969633; + background-color: rgb(22, 22, 22); + border: 1px solid rgba(150, 150, 150, 0.2); height: 24px; width: 24px; cursor: pointer; @@ -47,7 +47,7 @@ align-items: center; &:hover { - box-shadow: 0 0 0 3px var(--codex-border-color); + box-shadow: 0 0 0 3px rgba(150, 150, 150, 0.2); } &:first-child { @@ -84,7 +84,7 @@ line-height: 20px; letter-spacing: -0.006em; text-align: left; - color: #ffffffb2; + color: rgb(255, 255, 255, 0.7); } var { @@ -92,7 +92,7 @@ font-weight: 500; line-height: 40px; letter-spacing: -0.005em; - color: var(--text-strong-950, #ffffff); + color: rgb(255, 255, 255); display: block; font-style: normal; } @@ -130,30 +130,60 @@ } select { - background-color: #161616; + background-color: rgb(22, 22, 22); border-radius: 8px; - border: 1px solid #96969633; - padding: 6px 6px 6px 44px; + border: 1px solid rgba(150, 150, 150, 0.2); + padding: 6px 24px 6px 34px; outline: none; -moz-appearance: none; /* Firefox */ -webkit-appearance: none; /* Safari and Chrome */ appearance: none; position: relative; transition: box-shadow 0.35s; + height: 31px; + font-size: 0; &:hover { - box-shadow: 0 0 0 3px var(--codex-border-color); + box-shadow: 0 0 0 3px rgba(150, 150, 150, 0.2); } - &:has(option[value="US"]:checked) { - background-image: url(/icons/us-flag.svg); + &:has(option:checked) { background-position: 10px; background-repeat: no-repeat; background-size: 16px; } + &:has(option[value="USD"]:checked) { + background-image: url(/icons/us-flag.svg); + } + + &:has(option[value="EUR"]:checked) { + background-image: url(/icons/euro-flag.svg); + } + + &:has(option[value="AUD"]:checked) { + background-image: url(/icons/aud-flag.svg); + } + + &:has(option[value="CAD"]:checked) { + background-image: url(/icons/cad-flag.svg); + } + + &:has(option[value="CNY"]:checked) { + background-image: url(/icons/cny-flag.svg); + } + + &:has(option[value="BTC"]:checked) { + background-image: url(/icons/btc-flag.svg); + } + + &:has(option[value="ETH"]:checked) { + background-image: url(/icons/eth-flag.svg); + } + option { border-radius: 32px; + font-size: 16px; } } @@ -166,11 +196,11 @@ } small { - color: #3ee089; + color: rgb(62, 224, 137); height: 20px; width: 42px; border-radius: 16px; - background-color: #1fc16b29; + background-color: rgb(31, 193, 107, 0.16); display: flex; align-items: center; justify-content: center; @@ -192,4 +222,8 @@ top: 10px; } } + + .lines { + height: 200; + } } diff --git a/src/components/ConnectedAccount/WalletCard.tsx b/src/components/ConnectedAccount/WalletCard.tsx index 5f6ec8c..0ffdf59 100644 --- a/src/components/ConnectedAccount/WalletCard.tsx +++ b/src/components/ConnectedAccount/WalletCard.tsx @@ -1,10 +1,133 @@ import "./WalletCard.css"; import ArrowRightIcon from "../../assets/icons/arrow-right.svg?react"; import ArrowLeftIcon from "../../assets/icons/arrow-left.svg?react"; -import WalletChart from "../../assets/icons/chart.svg?react"; -import WalletLines from "../../assets/icons/lines.svg?react"; +import { useState, ChangeEvent, useRef, useEffect } from "react"; + +import * as echarts from "echarts/core"; +import { LineChart } from "echarts/charts"; +import { GridComponent } from "echarts/components"; +import { UniversalTransition } from "echarts/features"; +import { CanvasRenderer } from "echarts/renderers"; + +const defaultTokenValue = 1540; + +echarts.use([GridComponent, LineChart, CanvasRenderer, UniversalTransition]); + +type Props = { + tab: "weekly" | "daily" | "monthly"; +}; + +export function WalletCard({ tab }: Props) { + const [tokenValue, setTokenValue] = useState(defaultTokenValue); + const [currency, setCurrency] = useState("USD"); + const div = useRef(null); + const chart = useRef(null); + const [, setRefresher] = useState(Date.now()); + + useEffect(() => { + if (div.current && !chart.current) { + chart.current = echarts.init(div.current, null, { + renderer: "svg", + }); + setRefresher(Date.now()); + } + }, [chart, div]); + + useEffect(() => { + const refresh = () => chart.current?.resize(); + + window.addEventListener("resize", refresh); + + return () => { + window.removeEventListener("resize", refresh); + }; + }, []); + + const onCurrencyChange = async (e: ChangeEvent) => { + const value = e.currentTarget.value; + setCurrency(value); + + if (value === "USD") { + setTokenValue(1540); + } else if (["BTC", "ETH"].includes(value) === false) { + const json = await fetch( + "https://cdn.jsdelivr.net/npm/@fawazahmed0/currency-api@latest/v1/currencies/usd.json" + ).then((res) => res.json()); + setTokenValue(defaultTokenValue * json.usd[value.toLocaleLowerCase()]); + } else { + const json = await fetch( + "https://api.coinbase.com/v2/prices/" + + value.toLocaleLowerCase() + + "-USD/spot.json" + ).then((res) => res.json()); + setTokenValue(defaultTokenValue / json.data.amount); + } + }; + + if (chart.current) { + const today = new Date(); + const startOfWeek = today.getDate() - today.getDay() + 1; + const startDates = []; + + today.setDate(startOfWeek); + + for (let i = 0; i < 5; i++) { + startDates.push(today.toISOString().split("T")[0]); + today.setDate(today.getDate() + 7); + } + + const data = { + daily: ["MON", "TUE", "WED", "THU", "WED", "SAT", "SUN"], + weekly: startDates, + monthly: ["JAN", "FEB", "MAR", "APR", "MAY", "JUN"], + }[tab]; + + const option = { + color: ["#3EE089"], + xAxis: { + type: "category", + data: data, + show: true, + splitLine: { + show: true, + lineStyle: { + width: 0.5, + type: "dashed", + }, + }, + }, + yAxis: { + type: "value", + show: false, + }, + grid: [ + { + left: 0, + right: 0, + top: 50, + bottom: 50, + }, + ], + series: [ + { + data: [220, 932, 401, 934, 1290, 1330, 1450].slice(0, data.length), + type: "line", + smooth: true, + lineStyle: { + normal: { + color: "#3EE089", + }, + }, + }, + ], + tooltip: { + type: "item", + }, + }; + + chart.current.setOption(option, true); + } -export function WalletCard() { return (
@@ -26,8 +149,12 @@ export function WalletCard() {
- - + {/* */} + {/* */} +
@@ -35,12 +162,21 @@ export function WalletCard() {
TOKEN
- $1,540 USD + + {tokenValue.toFixed(["BTC", "ETH"].includes(currency) ? 8 : 2)}{" "} + {currency} + + 5%
- + + + + + + +
diff --git a/src/components/CustomStateCellRender/CustomStateCellRender.tsx b/src/components/CustomStateCellRender/CustomStateCellRender.tsx index 6f4ae77..990552c 100644 --- a/src/components/CustomStateCellRender/CustomStateCellRender.tsx +++ b/src/components/CustomStateCellRender/CustomStateCellRender.tsx @@ -13,31 +13,22 @@ export const CustomStateCellRender = ({ state, message }: Props) => { pending: PurchaseStateIcon, submitted: PurchaseStateIcon, started: PurchaseStateIcon, - finished: SuccessCircleIcon, + finished: () => , cancelled: ErrorCircleIcon, errored: ErrorCircleIcon, }; - const states = { - cancelled: "error", - errored: "error", - pending: "warning", - started: "loading", - submitted: "loading", - finished: "success", - }; - const Icon = icons[state as keyof typeof icons] || PurchaseStateIcon; return ( -

+

{message ? ( - + ) : ( - + )}

diff --git a/src/components/Debug/Debug.tsx b/src/components/Debug/Debug.tsx index 9036a8b..12e65c5 100644 --- a/src/components/Debug/Debug.tsx +++ b/src/components/Debug/Debug.tsx @@ -8,7 +8,7 @@ export function Debug() { if (isPending) { return ( -
+
); diff --git a/src/components/Dialog/Dialog.css b/src/components/Dialog/Dialog.css deleted file mode 100644 index cdb76e9..0000000 --- a/src/components/Dialog/Dialog.css +++ /dev/null @@ -1,11 +0,0 @@ -.dialog::backdrop { - background: rgba(70, 70, 70, 0.75); - backdrop-filter: blur(2px); -} - -.dialog { - background-color: var(--codex-background-secondary); - border: none; - color: var(--codex-color); - min-width: 200px; -} diff --git a/src/components/Dialog/Dialog.tsx b/src/components/Dialog/Dialog.tsx deleted file mode 100644 index 1b99e36..0000000 --- a/src/components/Dialog/Dialog.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { ReactNode, useEffect, useRef } from "react"; -import "./Dialog.css"; -import { Button } from "@codex-storage/marketplace-ui-components"; - -type Props = { - open: boolean; - children: ReactNode; - onClose: () => void; -}; - -export function Dialog({ open, children, onClose }: Props) { - const ref = useRef(null); - - useEffect(() => { - if (open) { - ref.current?.showModal(); - } else { - ref.current?.close(); - } - }, [open]); - - return ( - -
{children}
- -
- ); -} diff --git a/src/components/Download/Download.tsx b/src/components/Download/Download.tsx index 26f1675..a7bcc63 100644 --- a/src/components/Download/Download.tsx +++ b/src/components/Download/Download.tsx @@ -19,8 +19,9 @@ export function Download() { id="cid" placeholder="CID" inputClassName="download-input" - size={"medium" as any} + variant={"medium"} autoComplete="off" + value={cid} onChange={onCidChange}> diff --git a/src/components/ErrorIcon/ErrorIcon.tsx b/src/components/ErrorIcon/ErrorIcon.tsx deleted file mode 100644 index 1f41214..0000000 --- a/src/components/ErrorIcon/ErrorIcon.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { CircleX } from "lucide-react"; - -export function ErrorIcon() { - return ( - - - - ); -} diff --git a/src/components/ErrorPlaceholder/ErrorPlaceholder.tsx b/src/components/ErrorPlaceholder/ErrorPlaceholder.tsx index a5c50fb..3e42e6c 100644 --- a/src/components/ErrorPlaceholder/ErrorPlaceholder.tsx +++ b/src/components/ErrorPlaceholder/ErrorPlaceholder.tsx @@ -1,5 +1,5 @@ import { Placeholder } from "@codex-storage/marketplace-ui-components"; -import { ErrorIcon } from "../ErrorIcon/ErrorIcon"; +import ErrorCircleIcon from "../../assets/icons/error-circle.svg?react"; type Props = { subtitle?: string; @@ -13,7 +13,7 @@ export function ErrorPlaceholder({ subtitle, error }: Props) { return ( } + Icon={} title="Error" subtitle={subtitle} message={message}> diff --git a/src/components/FileCellRender/FileCell.css b/src/components/FileCellRender/FileCell.css index 3c0a853..a5e075f 100644 --- a/src/components/FileCellRender/FileCell.css +++ b/src/components/FileCellRender/FileCell.css @@ -1,24 +1,18 @@ -.fileCell { +.file-render { display: flex; gap: 0.75rem; -} -.fileCell-cid { - white-space: nowrap; -} + .tooltip:hover::after { + left: 0; + } -.fileCell-subtitle { - display: flex; - align-items: center; - gap: 0.5rem; - position: relative; -} - -.fileCell-tooltip { - display: flex; - align-items: center; -} - -.fileCell .tooltip:hover:after { - left: -33%; + small { + white-space: nowrap; + font-family: Inter; + font-size: 12px; + font-weight: 500; + line-height: 16px; + text-align: left; + color: rgb(125, 125, 125); + } } diff --git a/src/components/FileCellRender/FileCell.tsx b/src/components/FileCellRender/FileCell.tsx index 9095046..07c699a 100644 --- a/src/components/FileCellRender/FileCell.tsx +++ b/src/components/FileCellRender/FileCell.tsx @@ -69,17 +69,17 @@ export function FileCell({ requestId, purchaseCid, data, onMetadata }: Props) { return ( -
+
- +
{filename} - - +
+
- {cidTruncated} + {cidTruncated} - +
diff --git a/src/components/Files/FileActions.css b/src/components/Files/FileActions.css index 242ffac..6ec1267 100644 --- a/src/components/Files/FileActions.css +++ b/src/components/Files/FileActions.css @@ -2,18 +2,48 @@ > div { display: inline-flex; align-items: center; - border: 1px solid var(--codex-border-color); - border-radius: var(--codex-border-radius); + border: 1px solid rgba(150, 150, 150, 0.2); + border-radius: 10px; padding: 0.5rem; - background-color: #14141499; + background-color: rgba(20, 20, 20, 0.6); gap: 8px; padding: 10px; + } - .button-icon { - width: 40px; - height: 40px; - background-color: #2f2f2f; - border: 1px solid #96969633; + ul { + transition: bottom 0.35s; + position: fixed; + bottom: -500px; + left: 0; + right: 0; + background-color: rgba(47, 47, 47, 1); + border-top: 1px solid rgba(150, 150, 150, 0.2); + border-top-left-radius: 12px; + border-top-right-radius: 12px; + + padding: 16px; + + &[aria-expanded] { + bottom: 0; + z-index: 11; + } + + li { + display: flex; + align-items: center; + gap: 16px; + } + + li + li { + margin-top: 16px; + padding-top: 16px; + border-top: 1px solid rgba(150, 150, 150, 0.2); + } + } + + @media (max-width: 800px) { + .folder-button { + display: none; } } } diff --git a/src/components/Files/FileActions.tsx b/src/components/Files/FileActions.tsx index 18151dd..1e6eae0 100644 --- a/src/components/Files/FileActions.tsx +++ b/src/components/Files/FileActions.tsx @@ -1,10 +1,19 @@ -import { ButtonIcon, Cell } from "@codex-storage/marketplace-ui-components"; +import { + Backdrop, + ButtonIcon, + Cell, +} from "@codex-storage/marketplace-ui-components"; import { FolderButton } from "./FolderButton"; import { CodexDataContent } from "@codex-storage/sdk-js"; import { CodexSdk } from "../../sdk/codex"; import "./FileActions.css"; import DownloadIcon from "../../assets/icons/download-file.svg?react"; import InfoFileIcon from "../../assets/icons/info-file.svg?react"; +import DotsIcon from "../../assets/icons/dots.svg?react"; +import { useIsMobile } from "../../hooks/useMobile"; +import { useState } from "react"; +import { attributes } from "../../utils/attributes"; +import CopyIcon from "../../assets/icons/copy.svg?react"; type Props = { content: CodexDataContent; @@ -19,15 +28,62 @@ export function FileActions({ onFolderToggle, onDetails, }: Props) { + const isMobile = useIsMobile(); const url = CodexSdk.url() + "/api/codex/v1/data/"; + const [isExpanded, setIsExpanded] = useState(false); + + const onClose = () => setIsExpanded(false); + + const onOpen = () => setIsExpanded(true); + + const onCopy = (cid: string) => { + setIsExpanded(false); + navigator.clipboard.writeText(cid); + }; + + if (isMobile) { + return ( + + <> + ( + + )}> +
    +
  • { + window.open(url + content.cid, "_blank"); + setIsExpanded(false); + }}> + Download +
  • +
  • { + onDetails(content.cid); + setIsExpanded(false); + }}> + Details +
  • +
  • onCopy(content.cid)}> + Copy +
  • +
+ + +
+ ); + } return (
window.open(url + content.cid, "_blank")} - Icon={DownloadIcon}> + Icon={() => }> [ diff --git a/src/components/Files/FileCell.css b/src/components/Files/FileCell.css index b0a4d65..6fbb294 100644 --- a/src/components/Files/FileCell.css +++ b/src/components/Files/FileCell.css @@ -15,8 +15,14 @@ .button-icon { width: 40px; height: 40px; - background-color: #14141499; - border: 1px solid #96969633; + background-color: rgba(20, 20, 20, 0.6); + border: 1px solid rgba(150, 150, 150, 0.2); + + @media (max-width: 800px) { + & { + display: none; + } + } } } } diff --git a/src/components/Files/FileCell.tsx b/src/components/Files/FileCell.tsx index 987ec94..b29d3a4 100644 --- a/src/components/Files/FileCell.tsx +++ b/src/components/Files/FileCell.tsx @@ -14,11 +14,27 @@ type Props = { }; export function FileCell({ content }: Props) { - const [toast, setToast] = useState({ time: 0, message: "" }); + const [toast, setToast] = useState({ + time: 0, + message: "", + variant: "success" as "success" | "error", + }); const onCopy = (cid: string) => { - navigator.clipboard.writeText(cid); - setToast({ message: "CID copied to the clipboard.", time: Date.now() }); + if (navigator.clipboard) { + navigator.clipboard.writeText(cid); + setToast({ + message: "CID copied to the clipboard.", + time: Date.now(), + variant: "success" as "success", + }); + } else { + setToast({ + message: "Sorry the CID cannot be copied to the clipboard.", + time: Date.now(), + variant: "error" as "error", + }); + } }; return ( @@ -44,7 +60,11 @@ export function FileCell({ content }: Props) { )}>
- +
); diff --git a/src/components/Files/FileDetails.css b/src/components/Files/FileDetails.css index 4f78919..6db82d7 100644 --- a/src/components/Files/FileDetails.css +++ b/src/components/Files/FileDetails.css @@ -1,6 +1,6 @@ .file-details { - background-color: #232323; - border-left: 1px solid #96969633; + background-color: rgb(35, 35, 35); + border-left: 1px solid rgba(150, 150, 150, 0.2); border-top-left-radius: 16px; border-bottom-left-radius: 16px; padding: 16px; @@ -21,22 +21,11 @@ span { flex-grow: 1; } - - .button-icon { - background-color: #2f2f2f; - border: 1px solid #96969633; - - svg { - position: relative; - left: -3px; - top: -1px; - } - } } .preview { - background-color: #14141499; - border: 1px solid #69696933; + background-color: rgba(20, 20, 20, 0.6); + border: 1px solid rgba(105, 105, 105, 0.2); height: 150px; margin: auto; border-radius: 10px; @@ -63,7 +52,7 @@ line-height: 24px; letter-spacing: -0.011em; text-align: left; - color: #ffffff33; + color: rgb(255, 255, 255, 0.2); p { margin-top: 8px; @@ -95,7 +84,7 @@ line-height: 20px; letter-spacing: -0.006em; text-align: left; - color: #ffffffcc; + color: rgba (255, 255, 255, 0.8); } &:last-child p:nth-child(2) { @@ -106,14 +95,14 @@ letter-spacing: -0.006em; text-align: left; - color: #6beca1; + color: rgb(107, 236, 161); } } } .buttons { padding: 16px 0; - border-bottom: 1px solid #96969633; + border-bottom: 1px solid rgba(150, 150, 150, 0.2); display: flex; gap: 16px; @@ -128,7 +117,7 @@ header { margin-top: 16px; display: block; - border-bottom: 1px solid #96969633; + border-bottom: 1px solid rgba(150, 150, 150, 0.2); padding-bottom: 16px; > span { @@ -138,15 +127,15 @@ } thead tr th { - border-top: 1px solid #96969633; - border-bottom: 1px solid #96969633; + border-top: 1px solid rgba(150, 150, 150, 0.2); + border-bottom: 1px solid rgba(150, 150, 150, 0.2); &:first-child { - border-left: 1px solid #96969633; + border-left: 1px solid rgba(150, 150, 150, 0.2); } &:last-child { - border-right: 1px solid #96969633; + border-right: 1px solid rgba(150, 150, 150, 0.2); } } diff --git a/src/components/Files/FileDetails.tsx b/src/components/Files/FileDetails.tsx index 4ad1817..8d0b1d0 100644 --- a/src/components/Files/FileDetails.tsx +++ b/src/components/Files/FileDetails.tsx @@ -5,8 +5,7 @@ import { WebFileIcon, } from "@codex-storage/marketplace-ui-components"; import { CodexDataContent, CodexPurchase } from "@codex-storage/sdk-js"; -import { PrettyBytes } from "../../utils/bytes"; -import { Dates } from "../../utils/dates"; +import { Bytes } from "../../utils/bytes"; import { CidCopyButton } from "./CidCopyButton"; import "./FileDetails.css"; import { CodexSdk } from "../../sdk/codex"; @@ -43,7 +42,8 @@ export function FileDetails({ onClose, details }: Props) { } return { - error: false as any, + /* eslint-disable @typescript-eslint/prefer-as-const */ + error: false as false, data: all, }; }) @@ -115,7 +115,11 @@ export function FileDetails({ onClose, details }: Props) {
  • Date:

    -

    {Dates.format(details.manifest.uploadedAt).toString()}

    +

    + {FilesUtils.formatDate( + details.manifest.uploadedAt + ).toString()} +

  • @@ -125,7 +129,7 @@ export function FileDetails({ onClose, details }: Props) {
  • Size:

    -

    {PrettyBytes(details.manifest.datasetSize)}

    +

    {Bytes.pretty(details.manifest.datasetSize)}

  • diff --git a/src/components/Files/FileFilters.css b/src/components/Files/FileFilters.css index 7606270..ff9a1f9 100644 --- a/src/components/Files/FileFilters.css +++ b/src/components/Files/FileFilters.css @@ -2,14 +2,14 @@ padding: 4px 8px; gap: 8px; border-radius: 6px; - border: 1px solid #96969633; - background-color: #2f2f2f; + border: 1px solid rgba(150, 150, 150, 0.2); + background-color: rgb(47, 47, 47); font-family: Inter; font-size: 12px; font-weight: 500; line-height: 16px; text-align: left; - color: #969696; + color: rgba(150, 150, 150, 1); text-transform: capitalize; display: inline-flex; align-items: center; @@ -17,11 +17,11 @@ transition: box-shadow 0.35s; &:hover { - box-shadow: 0 0 0 3px var(--codex-border-color); + box-shadow: 0 0 0 3px rgba(150, 150, 150, 0.2); } svg { - color: #969696; + color: rgba(150, 150, 150, 1); } &.filter--active { diff --git a/src/components/Files/Files.css b/src/components/Files/Files.css index 68a5aa9..09beff0 100644 --- a/src/components/Files/Files.css +++ b/src/components/Files/Files.css @@ -24,6 +24,17 @@ } table thead tr th { - background-color: #14141499; + background-color: rgba(20, 20, 20, 0.6); + } + + @media (max-width: 800px) { + table th:nth-child(2), + table td:nth-child(2), + table th:nth-child(3), + table td:nth-child(3), + section, + .filters { + display: none; + } } } diff --git a/src/components/Files/Files.tsx b/src/components/Files/Files.tsx index 9f5e275..172e727 100644 --- a/src/components/Files/Files.tsx +++ b/src/components/Files/Files.tsx @@ -1,6 +1,5 @@ import { ChangeEvent, useEffect, useState } from "react"; -import { PrettyBytes } from "../../utils/bytes"; -import { Dates } from "../../utils/dates"; +import { Bytes } from "../../utils/bytes"; import "./Files.css"; import { Tabs, @@ -165,8 +164,10 @@ export function Files({ limit }: Props) { , - {PrettyBytes(c.manifest.datasetSize)}, - {Dates.format(c.manifest.uploadedAt).toString()}, + {Bytes.pretty(c.manifest.datasetSize)}, + + {FilesUtils.formatDate(c.manifest.uploadedAt).toString()} + , diff --git a/src/components/Files/FolderButton.css b/src/components/Files/FolderButton.css index 3e1a900..37477cd 100644 --- a/src/components/Files/FolderButton.css +++ b/src/components/Files/FolderButton.css @@ -4,12 +4,12 @@ transform: translate(310px, -200px); opacity: 0; transition: opacity 0.15s; - background-color: var(--codex-background); + background-color: rgba(47, 47, 47, 1); padding: 0.5rem; - border-radius: var(--codex-border-radius); + border-radius: 8px; width: 150px; right: -40px; - border: 1px solid var(--codex-border-color); + border: 1px solid rgba(150, 150, 150, 0.2); z-index: -1; &[aria-expanded] { @@ -22,13 +22,13 @@ padding: 0.75rem; transition: background-color 0.35s; cursor: pointer; - border-radius: var(--codex-border-radius); + border-radius: 8px; display: flex; align-items: center; justify-content: space-between; &:hover { - background-color: var(--codex-background-light); + background-color: rgba(150, 150, 150, 0.1); } } diff --git a/src/components/Files/FolderButton.tsx b/src/components/Files/FolderButton.tsx index dbbc2aa..8b60849 100644 --- a/src/components/Files/FolderButton.tsx +++ b/src/components/Files/FolderButton.tsx @@ -1,10 +1,10 @@ import { Backdrop, ButtonIcon } from "@codex-storage/marketplace-ui-components"; -import { CheckCircle } from "lucide-react"; import "./FolderButton.css"; import { useState } from "react"; import { attributes } from "../../utils/attributes"; import { classnames } from "../../utils/classnames"; import FolderIcon from "../../assets/icons/folder.svg?react"; +import SuccessCircleIcon from "../../assets/icons/success-circle.svg?react"; type Props = { folders: [string, boolean][]; @@ -42,7 +42,7 @@ export function FolderButton({ folders, onFolderToggle }: Props) { {folders.map(([folder, isActive]) => (
    onFolderToggle(folder)}> {folder} - {isActive && } + {isActive && }
    ))}
  • diff --git a/src/components/Files/files.utils.test.ts b/src/components/Files/files.utils.test.ts index 355d92e..7e43cc6 100644 --- a/src/components/Files/files.utils.test.ts +++ b/src/components/Files/files.utils.test.ts @@ -292,4 +292,10 @@ describe("files", () => { assert.deepEqual(FilesUtils.applyFilters(files, ["archive"]), [files[1]]); }); + + it("formats date", async () => { + const utcDate = new Date(Date.UTC(2024, 10, 20, 11, 36)); + + assert.equal(FilesUtils.formatDate(1732102577), "20 Nov 2024, " + utcDate.getHours() + ":" + utcDate.getMinutes()); + }) }) \ No newline at end of file diff --git a/src/components/Files/files.utils.ts b/src/components/Files/files.utils.ts index 3cffb64..4dcffdb 100644 --- a/src/components/Files/files.utils.ts +++ b/src/components/Files/files.utils.ts @@ -89,6 +89,16 @@ export const FilesUtils = { return files.filter( (file) => filters.length === 0 || filters.includes(this.type(file.manifest.mimetype)) ) + }, + formatDate(date: number) { + if (!date) { + return "-"; + } + + return new Intl.DateTimeFormat("en-GB", { + dateStyle: "medium", + timeStyle: "short", + }).format(new Date(date * 1000)); } }; diff --git a/src/components/HealthChecks/HealthChecks.css b/src/components/HealthChecks/HealthChecks.css index 6ff3ceb..58da689 100644 --- a/src/components/HealthChecks/HealthChecks.css +++ b/src/components/HealthChecks/HealthChecks.css @@ -87,7 +87,7 @@ font-size: 12px; font-weight: 400; line-height: 14px; - color: #828282; + color: rgb(130, 130, 130); padding-left: 1.25rem; margin-top: 1.75rem; margin-bottom: 3rem; @@ -101,8 +101,8 @@ align-items: center; padding: 16px 0; gap: 16px; - border-top: 1px solid #96969633; - border-bottom: 1px solid #96969633; + border-top: 1px solid rgba(150, 150, 150, 0.2); + border-bottom: 1px solid rgba(150, 150, 150, 0.2); &:first-child { font-family: Inter; diff --git a/src/components/HealthChecks/HealthChecks.tsx b/src/components/HealthChecks/HealthChecks.tsx index 3a3525b..5f800dc 100644 --- a/src/components/HealthChecks/HealthChecks.tsx +++ b/src/components/HealthChecks/HealthChecks.tsx @@ -7,7 +7,7 @@ import { Input, Spinner } from "@codex-storage/marketplace-ui-components"; import { classnames } from "../../utils/classnames"; import "./HealthChecks.css"; import { CodexSdk } from "../../sdk/codex"; -import { HealthCheckUtil } from "./health-check.utils"; +import { HealthCheckUtils } from "./health-check.utils"; import { PortForwardingUtil } from "../../hooks/port-forwarding.util"; import SuccessCircleIcon from "../../assets/icons/success-circle.svg?react"; import ErrorCircleIcon from "../../assets/icons/error-circle.svg?react"; @@ -30,9 +30,9 @@ export function HealthChecks({ online, onStepValid }: Props) { const [isAddressInvalid, setIsAddressInvalid] = useState(false); const [isPortInvalid, setIsPortInvalid] = useState(false); const [address, setAddress] = useState( - HealthCheckUtil.removePort(CodexSdk.url()) + HealthCheckUtils.removePort(CodexSdk.url()) ); - const [port, setPort] = useState(HealthCheckUtil.getPort(CodexSdk.url())); + const [port, setPort] = useState(HealthCheckUtils.getPort(CodexSdk.url())); const queryClient = useQueryClient(); useEffect( @@ -54,12 +54,16 @@ export function HealthChecks({ online, onStepValid }: Props) { setIsAddressInvalid(!element.checkValidity()); - const address = HealthCheckUtil.removePort(value); - setAddress(address); + setAddress(value); - if (HealthCheckUtil.containsPort(value)) { - const p = HealthCheckUtil.getPort(value); + if (HealthCheckUtils.containsPort(value)) { + const address = HealthCheckUtils.removePort(value); + setAddress(address); + + const p = HealthCheckUtils.getPort(value); setPort(p); + } else { + setAddress(value); } }; @@ -74,7 +78,7 @@ export function HealthChecks({ online, onStepValid }: Props) { const onSave = () => { const url = address + ":" + port; - if (HealthCheckUtil.isUrlInvalid(url)) { + if (HealthCheckUtils.isUrlInvalid(url)) { return; } @@ -112,7 +116,7 @@ export function HealthChecks({ online, onStepValid }: Props) { {isAddressInvalid ? ( ) : ( - + )}
    @@ -125,7 +129,7 @@ export function HealthChecks({ online, onStepValid }: Props) { value={port} isInvalid={isPortInvalid} placeholder="8080"> - +
    @@ -152,9 +156,9 @@ export function HealthChecks({ online, onStepValid }: Props) {
  • {online ? ( - + ) : ( - + )} Internet connection @@ -164,9 +168,9 @@ export function HealthChecks({ online, onStepValid }: Props) { {codex.isFetching ? ( ) : codex.isSuccess ? ( - + ) : ( - + )} Codex connection @@ -176,9 +180,9 @@ export function HealthChecks({ online, onStepValid }: Props) { {portForwarding.isFetching ? ( ) : portForwarding.enabled ? ( - + ) : ( - + )} Port forwarding @@ -188,9 +192,9 @@ export function HealthChecks({ online, onStepValid }: Props) { {persistence.isFetching ? ( ) : persistence.enabled ? ( - + ) : ( - + )} Marketplace diff --git a/src/components/HealthChecks/health-check.utils.test.ts b/src/components/HealthChecks/health-check.utils.test.ts index 4565603..0d6e1e7 100644 --- a/src/components/HealthChecks/health-check.utils.test.ts +++ b/src/components/HealthChecks/health-check.utils.test.ts @@ -1,34 +1,34 @@ import { assert, describe, it } from "vitest"; -import { HealthCheckUtil } from "./health-check.utils"; +import { HealthCheckUtils } from "./health-check.utils"; describe("health check", () => { it("remove the port from an url", async () => { - assert.deepEqual(HealthCheckUtil.removePort("http://localhost:8080"), "http://localhost"); + assert.deepEqual(HealthCheckUtils.removePort("http://localhost:8080"), "http://localhost"); }); it("get the port from an url", async () => { - assert.deepEqual(HealthCheckUtil.getPort("http://localhost:8080"), 8080); + assert.deepEqual(HealthCheckUtils.getPort("http://localhost:8080"), 8080); }); it("get the default port when the url does not contain the port", async () => { - assert.deepEqual(HealthCheckUtil.getPort("http://localhost"), 80); + assert.deepEqual(HealthCheckUtils.getPort("http://localhost"), 80); }); it("returns true when the url contains a port", async () => { - assert.deepEqual(HealthCheckUtil.containsPort("http://localhost:8080"), true); + assert.deepEqual(HealthCheckUtils.containsPort("http://localhost:8080"), true); }); it("returns false when the url does not contain a port", async () => { - assert.deepEqual(HealthCheckUtil.containsPort("http://localhost"), false); + assert.deepEqual(HealthCheckUtils.containsPort("http://localhost"), false); }); it("returns true when the url is invalid", async () => { - assert.deepEqual(HealthCheckUtil.isUrlInvalid("http://"), true); + assert.deepEqual(HealthCheckUtils.isUrlInvalid("http://"), true); }); it("returns false when the url is valid", async () => { - assert.deepEqual(HealthCheckUtil.isUrlInvalid("http://localhost:8080"), false); + assert.deepEqual(HealthCheckUtils.isUrlInvalid("http://localhost:8080"), false); }); it("returns the tcp port", async () => { @@ -57,7 +57,7 @@ describe("health check", () => { "revision": "2fb7031e" } } - assert.deepEqual(HealthCheckUtil.getTcpPort(debug), { error: false, data: 8070 }); + assert.deepEqual(HealthCheckUtils.getTcpPort(debug), { error: false, data: 8070 }); }); it("returns an error when the addr is empty", async () => { @@ -85,7 +85,7 @@ describe("health check", () => { "revision": "2fb7031e" } } - assert.deepEqual(HealthCheckUtil.getTcpPort(debug).error, true); + assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); }); it("returns an error when the addr is misformated", async () => { @@ -114,7 +114,7 @@ describe("health check", () => { "revision": "2fb7031e" } } - assert.deepEqual(HealthCheckUtil.getTcpPort(debug).error, true); + assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); }); it("returns an error when the port is misformated", async () => { @@ -143,6 +143,14 @@ describe("health check", () => { "revision": "2fb7031e" } } - assert.deepEqual(HealthCheckUtil.getTcpPort(debug).error, true); + assert.deepEqual(HealthCheckUtils.getTcpPort(debug).error, true); + }); + + it("extracts the announced ip", async () => { + assert.deepEqual(HealthCheckUtils.extractAnnounceAddresses([ + "/ip4/127.0.0.1/tcp/8070" + ]).data, "127.0.0.1"); + assert.deepEqual(HealthCheckUtils.extractAnnounceAddresses([]).error, true); + assert.deepEqual(HealthCheckUtils.extractAnnounceAddresses(["hello"]).error, true); }); }) \ No newline at end of file diff --git a/src/components/HealthChecks/health-check.utils.ts b/src/components/HealthChecks/health-check.utils.ts index 65250a4..096eacb 100644 --- a/src/components/HealthChecks/health-check.utils.ts +++ b/src/components/HealthChecks/health-check.utils.ts @@ -1,6 +1,6 @@ import { CodexDebugInfo, SafeValue, CodexError } from "@codex-storage/sdk-js" -export const HealthCheckUtil = { +export const HealthCheckUtils = { removePort(url: string) { const parts = url.split(":") return parts[0] + ":" + parts[1] @@ -29,6 +29,21 @@ export const HealthCheckUtil = { } }, + extractAnnounceAddresses(announceAddresses: string[]): SafeValue { + if (announceAddresses.length === 0) { + return { error: true, data: new CodexError("Not existing announce address") } + } + + + const ip = announceAddresses[0].split("/") + + if (ip.length !== 5) { + return { error: true, data: new CodexError("Misformatted ip") } + } + + return { error: false, data: ip[2] } + }, + getTcpPort(info: CodexDebugInfo): SafeValue { if (info.addrs.length === 0) { return { error: true, data: new CodexError("Not existing address") } diff --git a/src/components/LogLevel/LogLevel.css b/src/components/LogLevel/LogLevel.css index 74ac045..42bca48 100644 --- a/src/components/LogLevel/LogLevel.css +++ b/src/components/LogLevel/LogLevel.css @@ -7,11 +7,17 @@ > div:first-child { position: relative; + @media (max-width: 800px) { + & { + flex: 1; + } + } + svg { position: absolute; top: 11px; left: 16px; - color: #969696; + color: rgba(150, 150, 150, 1); } } @@ -20,7 +26,13 @@ } select { - border-color: #969696; + border-color: rgba(150, 150, 150, 1); padding-left: 40px; + + @media (max-width: 800px) { + & { + width: 100%; + } + } } } diff --git a/src/components/ManifestFetch/ManifestFetch.tsx b/src/components/ManifestFetch/ManifestFetch.tsx index 1250ff4..082f1a2 100644 --- a/src/components/ManifestFetch/ManifestFetch.tsx +++ b/src/components/ManifestFetch/ManifestFetch.tsx @@ -48,7 +48,7 @@ export function ManifestFetch() { id="cid" value={cid} placeholder="CID" - size={"medium" as any} + variant={"medium"} autoComplete="off" onChange={onCidChange}> diff --git a/src/components/Menu/Menu.tsx b/src/components/Menu/Menu.tsx index 34bb513..e4abd90 100644 --- a/src/components/Menu/Menu.tsx +++ b/src/components/Menu/Menu.tsx @@ -1,8 +1,7 @@ import { attributes } from "../../utils/attributes"; import "./menu.css"; -import { ComponentType, useState } from "react"; +import { ComponentType, useEffect } from "react"; import { classnames } from "../../utils/classnames"; -import { Link } from "@tanstack/react-router"; import HomeIcon from "../../assets/icons/home.svg?react"; import ExpandIcon from "../../assets/icons/expand.svg?react"; import WalletIcon from "../../assets/icons/wallet.svg?react"; @@ -17,13 +16,21 @@ import PurchaseIcon from "../../assets/icons/purchase.svg?react"; import HostIcon from "../../assets/icons/host.svg?react"; import LogsIcon from "../../assets/icons/logs.svg?react"; import SettingsIcon from "../../assets/icons/settings.svg?react"; +import CloseIcon from "../../assets/icons/close.svg?react"; import HelpIcon from "../../assets/icons/help.svg?react"; import DisclaimerIcon from "../../assets/icons/disclaimer.svg?react"; +import { NavLink } from "react-router-dom"; +import { useIsMobile } from "../../hooks/useMobile"; export type MenuItemComponentProps = { onClick: () => void; }; +export type Props = { + isExpanded: boolean; + onExpanded: (val: boolean) => void; +}; + export type MenuItem = | { type: "separator"; @@ -36,16 +43,30 @@ export type MenuItem = Component: ComponentType; }; -export function Menu() { - const [isExpanded, setIsExpanded] = useState(true); +export function Menu({ isExpanded, onExpanded }: Props) { + const isMobile = useIsMobile(); const onLogoClick = () => { if (isExpanded === false) { - setIsExpanded(true); + onExpanded(true); } }; - const onExpandMenu = () => setIsExpanded(!isExpanded); + useEffect(() => { + if (isMobile) { + onExpanded(false); + } + }, [isMobile, onExpanded]); + + const onExpandMenu = () => onExpanded(!isExpanded); + + const onClose = () => { + if (isMobile) { + onExpanded(false); + } + }; + + const Icon = isMobile ? CloseIcon : ExpandIcon; return ( <> @@ -59,42 +80,43 @@ export function Menu() {
    - +
    - + Dashboard - - + + Wallet - - + + Files - - + + data-title="Coming soon" + end> Nodes - - + @@ -102,10 +124,10 @@ export function Menu() { Analytics - - + @@ -113,52 +135,52 @@ export function Menu() { Devices - +
    - + Purchases - - + + - + Host - +
    - + - + Peers - - + + - + Log - +
    - + Settings - - + + Help - - + + Disclaimer - +
  • diff --git a/src/components/Menu/menu.css b/src/components/Menu/menu.css index 459116b..b0edb2d 100644 --- a/src/components/Menu/menu.css +++ b/src/components/Menu/menu.css @@ -1,46 +1,38 @@ .menu { display: flex; flex-direction: column; - background-color: #1c1c1c; - border-radius: var(--codex-border-radius); + background-color: rgb(28, 28, 28); transition: left 0.25s; position: sticky; z-index: 10; - view-transition-name: main-menu; height: 100%; top: 0; transition: width 0.5s, font-size 0.5s, - left 0.05s; - min-width: 0; + left 0.5s; width: 272px; min-width: 80px; - @media (max-width: 1199px) { + @media (max-width: 800px) { & { - width: 80px; - .items { - a { - width: 26px; - gap: 0; - display: flex; - justify-content: center; + left: -300px; + position: fixed; + z-index: 12; + width: 100%; + } - span + span { - font-size: 0; - display: none; - } - } - } + &[aria-expanded] { + left: 0px; + font-size: 12px; } } @media (min-width: 1200px) { &[aria-expanded] a[data-title]:hover::after { content: attr(data-title); - background-color: #2f2f2f; - color: #fff; + background-color: rgb(47, 47, 47); + color: rgb(255, 255, 255); padding: 8px; border-radius: 4px; font-size: 12px; @@ -63,9 +55,11 @@ display: flex; justify-content: center; - span + span { - font-size: 0; - display: none; + @media (min-width: 801px) { + span + span { + font-size: 0; + display: none; + } } } } @@ -86,7 +80,7 @@ display: flex; align-items: center; gap: 1.5rem; - background-color: #060606; + background-color: rgb(6, 6, 6); border-radius: 8px; > svg:first-child { @@ -127,7 +121,7 @@ height: 100%; margin-bottom: 2.5rem; gap: 0.5rem; - border-top: 1px solid #96969633; + border-top: 1px solid rgba(150, 150, 150, 0.2); &::before { height: 20px; @@ -154,17 +148,17 @@ top: 115px; } - &:has(.active:nth-child(4))::before { + /* &:has(.active:nth-child(4))::before { top: 158px; - } - + } */ + /* &:has(.active:nth-child(5))::before { top: 201px; } &:has(.active:nth-child(6))::before { top: 244px; - } + } */ &:has(.active:nth-child(8))::before { top: 339px; @@ -201,7 +195,7 @@ hr { margin-top: 1.5rem; margin-bottom: 1.5rem; - border: 0.1px solid #96969633; + border: 0.1px solid rgba(150, 150, 150, 0.2); width: 100%; } @@ -220,16 +214,16 @@ font-weight: 500; line-height: 20px; letter-spacing: -0.006em; - color: #969696; + color: rgba(150, 150, 150, 1); border-radius: 8px; transition: background-color 0.35s; position: relative; margin-left: 6px; &:hover:not([aria-disabled="true"]), - &.active { - background-color: var(--codex-highlight-color); - color: #c7c7c7; + &.active:not([aria-disabled="true"]) { + background-color: rgb(47, 47, 47); + color: rgb(199, 199, 199); } span:first-child { @@ -244,10 +238,15 @@ span + span { display: inline-block; overflow: hidden; - min-width: 0; } - &.active span:first-child { + @media (min-width: 801px) { + span + span { + min-width: 0; + } + } + + &.active:not([aria-disabled="true"]) span:first-child { color: var(--codex-color-primary); } } diff --git a/src/components/NodeSpace/NodeSpace.css b/src/components/NodeSpace/NodeSpace.css index 8c7c82d..166422a 100644 --- a/src/components/NodeSpace/NodeSpace.css +++ b/src/components/NodeSpace/NodeSpace.css @@ -8,6 +8,6 @@ text-align: left; padding-top: 16px; margin-bottom: 16px; - border-top: 1px solid #96969633; + border-top: 1px solid rgba(150, 150, 150, 0.2); } } diff --git a/src/components/NodeSpace/nodeSpace.domain.ts b/src/components/NodeSpace/nodeSpace.domain.ts deleted file mode 100644 index f8b8a3a..0000000 --- a/src/components/NodeSpace/nodeSpace.domain.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const nodeSpaceAllocationColors = [ - "var(--codex-color-primary)", - "#f9fa93", - "#ccc", -] \ No newline at end of file diff --git a/src/components/OnBoarding/OnBoardingLayout.css b/src/components/OnBoarding/OnBoardingLayout.css index c58252a..9b129ea 100644 --- a/src/components/OnBoarding/OnBoardingLayout.css +++ b/src/components/OnBoarding/OnBoardingLayout.css @@ -36,6 +36,12 @@ section > *:first-child { flex: 0.5; + + @media (max-width: 800px) { + & { + flex: 0.2; + } + } } h1 { @@ -85,7 +91,7 @@ } &[aria-selected] { - box-shadow: 0px 0px 12px 0px #fff; + box-shadow: 0px 0px 12px 0px rgb(255, 255, 255); opacity: 1; } } @@ -114,7 +120,7 @@ cursor: pointer; display: inline-flex; align-items: center; - color: var(--codex-color-error-hexa); + color: rgb(204, 108, 108); &:hover { animation-name: example; @@ -142,7 +148,7 @@ line-height: 16.34px; max-width: 532px; margin-top: 20px; - color: var(--codex-input-label-color); + color: rgba(130, 130, 130, 1); } label { @@ -166,13 +172,14 @@ letter-spacing: 0.01em; margin-top: 32px; font-family: Inter; - color: #7bfbaf; + color: rgb(123, 251, 175); gap: 4px; text-decoration: none; - border-bottom: 2px solid #7bfbaf; + border-bottom: 2px solid rgb(123, 251, 175); cursor: pointer; display: inline-flex; align-items: center; + gap: 8px; } } @@ -192,7 +199,7 @@ .navigation { cursor: pointer; - position: absolute; + position: fixed; right: 16px; bottom: 16px; border-bottom: none; @@ -202,6 +209,12 @@ right: 6rem; bottom: 16px; + @media (max-width: 800px) { + & { + right: 16px; + } + } + &:hover { animation-name: example; animation-duration: 2.5s; @@ -217,6 +230,10 @@ padding: 16px; max-width: 700px; } + + .input input { + --codex-input-background-color: rgba(35, 35, 35, 1); + } } @keyframes rotate { diff --git a/src/components/OnBoarding/OnBoardingLayout.tsx b/src/components/OnBoarding/OnBoardingLayout.tsx index 9f752a1..0e32889 100644 --- a/src/components/OnBoarding/OnBoardingLayout.tsx +++ b/src/components/OnBoarding/OnBoardingLayout.tsx @@ -4,7 +4,7 @@ import Logotype from "../../assets/icons/logotype.svg?react"; import { attributes } from "../../utils/attributes"; import "./OnBoardingLayout.css"; import { BackgroundImage } from "../BackgroundImage/BackgroundImage"; -import { useNavigate } from "@tanstack/react-router"; +import { useNavigate } from "react-router-dom"; type Props = { children: ReactElement<{ onStepValid: (isValid: boolean) => void }>; @@ -13,7 +13,7 @@ type Props = { }; export function OnBoardingLayout({ children, step }: Props) { - const navigate = useNavigate({ from: window.location.pathname }); + const navigate = useNavigate(); return (
  • navigate({ to: "/" })}>
  • + onClick={() => navigate("/")}>
  • navigate({ to: "/onboarding-name" })}>
  • + onClick={() => navigate("/onboarding-name")}>
  • navigate({ to: "/onboarding-checks" })}>
  • + onClick={() => navigate("/onboarding-checks")}> diff --git a/src/components/Peers/PeerCountryCell.css b/src/components/Peers/PeerCountryCell.css index b2489b3..fa61a27 100644 --- a/src/components/Peers/PeerCountryCell.css +++ b/src/components/Peers/PeerCountryCell.css @@ -4,7 +4,7 @@ gap: 1rem; span:first-child { - background-color: #141414; + background-color: rgb(20, 20, 20); border-radius: 50%; padding: 12px; } diff --git a/src/components/Peers/Peers.tsx b/src/components/Peers/Peers.tsx deleted file mode 100644 index 93faf98..0000000 --- a/src/components/Peers/Peers.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { - TabSortState, - Row, - Cell, - Table, -} from "@codex-storage/marketplace-ui-components"; -import { useCallback, useState } from "react"; -import { PeerCountryCell } from "./PeerCountryCell"; -import "./Peers.css"; -import { PeerGeo, PeerNode, PeerSortFn, PeerUtils } from "./peers.utils"; -import { PeersMap } from "./PeersMap"; -import { useDebug } from "../../hooks/useDebug"; -import { PeersQuality } from "./PeersQuality"; -import { PeersChart } from "./PeersChart"; -import SuccessCircleIcon from "../../assets/icons/success-circle.svg?react"; -import ErrorCircleIcon from "../../assets/icons/error-circle.svg?react"; -import PeersIcon from "../../assets/icons/peers.svg?react"; - -const throwOnError = true; - -export const Peers = () => { - const { data } = useDebug(throwOnError); - const [ips, setIps] = useState>({}); - - const onPinAdd = useCallback((node: PeerNode, geo: PeerGeo) => { - const [ip = ""] = node.address.split(":"); - setIps((ips) => ({ ...ips, [ip]: geo })); - }, []); - - const [sortFn, setSortFn] = useState(() => - PeerUtils.sortByBoolean("desc") - ); - - const onSortByCountry = (state: TabSortState) => - setSortFn(() => PeerUtils.sortByCountry(state, ips)); - - const onSortActive = (state: TabSortState) => - setSortFn(() => PeerUtils.sortByBoolean(state)); - - const headers = [ - ["Country", onSortByCountry], - ["PeerId"], - ["Active", onSortActive], - ] satisfies [string, ((state: TabSortState) => void)?][]; - - const nodes = data?.table.nodes || []; - const sorted = sortFn ? nodes.slice().sort(sortFn) : nodes; - - const rows = sorted.map((node) => { - const [ip = ""] = node.address.split(":"); - const geo = ips[ip]; - - return ( - , - {node.peerId}, - - {node.seen ? ( -
    - Active -
    - ) : ( -
    - Inactive -
    - )} -
    , - ]}>
    - ); - }); - - const actives = PeerUtils.countActives(sorted); - const degrees = PeerUtils.calculareDegrees(sorted); - const good = PeerUtils.isGoodQuality(actives); - - return ( -
    -
    - -
    -
      -
    • Legend
    • -
    • 1-3
    • -
    • 3-5
    • -
    • 5 +
    • -
    -
    -
    - - Connections -
    -
    - -
    -
    - -
    -
    -
    -
    - - - - ); -}; diff --git a/src/components/Peers/PeersCard.css b/src/components/Peers/PeersCard.css index c5007ed..9d9d75d 100644 --- a/src/components/Peers/PeersCard.css +++ b/src/components/Peers/PeersCard.css @@ -2,8 +2,8 @@ position: relative; .peers-map { - border-top: 1px solid #96969633; - border-bottom: 1px solid #96969633; + border-top: 1px solid rgba(150, 150, 150, 0.2); + border-bottom: 1px solid rgba(150, 150, 150, 0.2); width: 100%; svg { @@ -15,6 +15,15 @@ position: absolute; left: 0; right: 0; + top: -35px; + bottom: 0; + margin: auto; + + @media (max-width: 800px) { + & { + transform: scale(0.8); + } + } } footer { diff --git a/src/components/Peers/PeersChart.css b/src/components/Peers/PeersChart.css index e01d60f..108415e 100644 --- a/src/components/Peers/PeersChart.css +++ b/src/components/Peers/PeersChart.css @@ -5,6 +5,7 @@ overflow: hidden; margin: auto; left: -32px; + border-radius: 5px; @media (min-width: 1000px) { & { @@ -26,10 +27,11 @@ content: ""; width: inherit; height: inherit; - border: 45px solid #323232; + border: 45px solid rgb(50, 50, 50); border-bottom: none; border-top-left-radius: 175px; border-top-right-radius: 175px; + border-bottom-right-radius: 5px; } div { @@ -37,11 +39,13 @@ top: 100%; width: inherit; height: inherit; - border: 45px solid #323232; + border: 45px solid rgb(50, 50, 50); border-top: none; border-bottom-left-radius: 175px; border-bottom-right-radius: 175px; transform-origin: 50% 0; + border-top-left-radius: 5px; + border-top-right-radius: 5px; } div:nth-child(1) { @@ -52,13 +56,13 @@ span { font-family: Inter; - font-size: 38.67px; + font-size: 50px; font-weight: 500; line-height: 48.34px; letter-spacing: -0.005em; text-align: center; position: absolute; - bottom: 0; + bottom: 20px; left: calc(50% - 24px); } } diff --git a/src/components/Peers/PeersChart.tsx b/src/components/Peers/PeersChart.tsx index 3406f87..157da63 100644 --- a/src/components/Peers/PeersChart.tsx +++ b/src/components/Peers/PeersChart.tsx @@ -15,9 +15,11 @@ export function PeersChart({ actives, degrees }: Props) { }; return ( -
    -
    - {actives} -
    + <> +
    +
    + {actives} +
    + ); } diff --git a/src/components/Peers/PeersQuality.tsx b/src/components/Peers/PeersQuality.tsx index 5fb8fa4..e4d0245 100644 --- a/src/components/Peers/PeersQuality.tsx +++ b/src/components/Peers/PeersQuality.tsx @@ -10,7 +10,7 @@ export function PeersQuality({ good }: Props) { if (good) { return (
    - + Peer connections in good standing.
    ); diff --git a/src/components/Peers/peers.utils.test.ts b/src/components/Peers/peers.utils.test.ts index 74cc315..9a7b8e7 100644 --- a/src/components/Peers/peers.utils.test.ts +++ b/src/components/Peers/peers.utils.test.ts @@ -1,5 +1,5 @@ import { assert, describe, it } from "vitest"; -import { PeerGeo, PeerUtils } from "./peers.utils"; +import { PeerGeo, PeerNode, PeerUtils } from "./peers.utils"; describe("peers", () => { it("sorts by boolean", async () => { @@ -41,14 +41,14 @@ describe("peers", () => { }); it("adds a new pin", async () => { - const latLng = { latitude: 0, longitude: 0 } as any - const values = PeerUtils.incPin([], latLng) + const latLng = { latitude: 0, longitude: 0 } + const values = PeerUtils.incPin([], latLng as PeerNode & PeerGeo) assert.deepEqual(values, [[latLng, 1]]); }); it("increments an existing pin", async () => { - const latLng = { lat: 0, lng: 0 } as any + const latLng = { lat: 0, lng: 0 } as unknown as PeerNode & PeerGeo const values = PeerUtils.incPin([[latLng, 1]], latLng) assert.deepEqual(values, [[latLng, 2]]); diff --git a/src/components/Peers/peers.utils.ts b/src/components/Peers/peers.utils.ts index bfd6c05..799e4d5 100644 --- a/src/components/Peers/peers.utils.ts +++ b/src/components/Peers/peers.utils.ts @@ -55,6 +55,14 @@ export const PeerUtils = { return (actives / total) * 180 }, + calcularePercent: (peers: PeerNode[]) => { + const actives = PeerUtils.countActives(peers); + const total = peers.length || 1; + + return (actives / total) * 100 + }, + + isGoodQuality(actives: number) { return actives > 0 }, diff --git a/src/components/Purchase/PurchasesTable.tsx b/src/components/Purchase/PurchasesTable.tsx index e8553a1..c776850 100644 --- a/src/components/Purchase/PurchasesTable.tsx +++ b/src/components/Purchase/PurchasesTable.tsx @@ -114,7 +114,7 @@ export function PurchasesTable() { if (isPending) { return ( -
    +
    ); diff --git a/src/components/Range/Range.css b/src/components/Range/Range.css deleted file mode 100644 index d9e9919..0000000 --- a/src/components/Range/Range.css +++ /dev/null @@ -1,145 +0,0 @@ -.range { - /* width: 100%; - accent-color: var(--codex-color-primary); - height: 1px; - outline: none; */ - --val: 50; - width: 100%; - margin: 1.5rem 0; -} - -.range-labels { - display: flex; - justify-content: space-between; -} - -@property --c { - syntax: ""; - inherits: true; - initial-value: #0000; -} - -.glow { - --c: rgb(0, 255, 255, calc(0.25 + var(--val) / 125)); - --c: hsl(160deg 80% 50% / calc(0.25 + var(--val) / 125)); - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; - background: transparent; - cursor: pointer; - position: relative; -} - -.glow::before { - content: ""; - position: absolute; - top: 0; - left: 0; - width: calc((var(--val) - 1) * 1%); - min-width: 0.5em; - height: 100%; - background: var(--c); - box-shadow: - 0 0 0.2em 0 hsl(0 0% 0%) inset, - -0.1em 0.1em 0.1em -0.1em hsl(0 0% 100% / 0.5), - 0 0 calc(1em + 0.001em * var(--val)) calc(0.1em + 0.00025em * var(--val)) - var(--c); - border-radius: 1em 0 0 1em; - aopacity: calc(20% + var(--val) * 1%); -} - -/***** Track Styles *****/ -/***** Chrome, Safari, Opera, and Edge Chromium *****/ -.glow::-webkit-slider-runnable-track { - box-shadow: - 0 0 0.2em 0 hsl(0 0% 0%) inset, - -0.1em 0.1em 0.1em -0.1em hsl(0 0% 100% / 0.5); - background: linear-gradient(to bottom right, #0001, #0000), #343133; - border-radius: 1em; - height: 1em; -} - -/******** Firefox ********/ -.glow::-moz-range-track { - box-shadow: - 0 0 2px 0 hsl(0 0% 0%) inset, - -1px 1px 1px -1px hsl(0 0% 100% / 0.5); - background: - linear-gradient(var(--c) 0 0) 0 0 / calc(var(--val) * 1%) 100% no-repeat, - linear-gradient(to bottom right, #0001, #0000), - #343133; - border-radius: 1em; - height: 1em; -} - -/***** Thumb Styles *****/ -/***** Chrome, Safari, Opera, and Edge Chromium *****/ -.glow::-webkit-slider-thumb { - --d: var(--c); - --d: rgb(from var(--c) r g b / calc(0.35 * var(--val) * 1%)); - -webkit-appearance: none; /* Override default look */ - appearance: none; - background-color: #5cd5eb; - transform: translateY(calc(-50% + 0.5em)); - width: 4em; - aspect-ratio: 1; - background: red; - border-radius: 50%; - background: - radial-gradient( - farthest-side, - #0000 22.5%, - var(--d) 0, - #0000 calc(var(--val) * 0.75%) - ) - 50% 50% / 100% 100% no-repeat, - radial-gradient(#0000 15%, #343133 16%, #545153 20%), - repeating-linear-gradient(#0000 0 10%, #0002 0 20%) 50% 50% / 25% 25% - no-repeat, - repeating-linear-gradient(90deg, #0000 0 10%, #0002 0 20%) 50% 50% / 25% 25% - no-repeat, - radial-gradient(var(--c) 17%, #0000 0), - #545153; - box-shadow: - inset -0.15em -0.15em 0.2em #0008, - inset 0.15em 0.15em 0.2em #ffffff22, - inset calc(var(--val) * 1em / 500) 0em calc(var(--val) * 1em / 500) - calc(var(--val) * -1em / 700) var(--c), - 0.25em 0.25em 0.5em #0006, - calc(0.0125em * var(--val)) calc(0.005em * var(--val)) - calc(0.02em * var(--val)) calc(-0.01em * var(--val)) #000a; - border-radius: 50%; -} - -/***** Firefox *****/ -.glow::-moz-range-thumb { - /* --d: var(--c); - --d: rgb(from var(--c) r g b / calc(0.35 * var(--val) * 1%)); */ - border: none; /*Removes extra border that FF applies*/ - -webkit-appearance: none; /* Override default look */ - appearance: none; - background-color: #5cd5eb; - width: 4em; - height: 4em; - aspect-ratio: 1; - background: red; - border-radius: 50%; - background: -/* radial-gradient(farthest-side, #0000 22.5%, var(--d) 0, #0000 calc(var(--val) * 0.75%)) 50% 50% / 100% 100% no-repeat, */ - radial-gradient(#0000 15%, #343133 16%, #545153 20%), - repeating-linear-gradient(#0000 0 10%, #0002 0 20%) 50% 50% / 25% 25% - no-repeat, - repeating-linear-gradient(90deg, #0000 0 10%, #0002 0 20%) 50% 50% / 25% 25% - no-repeat, - radial-gradient(var(--c) 17%, #0000 0), - #545153; - box-shadow: - inset -0.15em -0.15em 0.2em #0008, - inset 0.15em 0.15em 0.2em #ffffff22, - inset calc(var(--val) * 1em / 500) 0em calc(var(--val) * 1em / 500) - calc(var(--val) * -1em / 700) var(--c), - 0.25em 0.25em 0.5em #0006, - calc(0.015em * var(--val)) calc(0.005em * var(--val)) - calc(0.02em * var(--val)) calc(-0.01em * var(--val)) #0008; - border-radius: 50%; -} diff --git a/src/components/Range/Range.tsx b/src/components/Range/Range.tsx deleted file mode 100644 index e94415d..0000000 --- a/src/components/Range/Range.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import { ChangeEvent, FormEvent, useState } from "react"; -import "./Range.css"; - -type Props = { - label?: string; - max: number; - labels: string[]; - className?: string; - onChange: (e: ChangeEvent) => void; - defaultValue?: number | string; - value?: number | string; -}; - -export function Range({ - label, - max, - onChange, - defaultValue, - value, - className = "", -}: Props) { - const [val, setVal] = useState(value); - - const onInput = (e: FormEvent) => { - setVal(parseInt(e.currentTarget.value, 10)); - }; - - return ( -
    - {label} - - {/*
    - {labels.map((l) => ( -
    - {l} -
    - ))} -
    */} -
    - ); -} diff --git a/src/components/RequireAssitance/RequireAssitance.css b/src/components/RequireAssitance/RequireAssitance.css index db48d0e..f109613 100644 --- a/src/components/RequireAssitance/RequireAssitance.css +++ b/src/components/RequireAssitance/RequireAssitance.css @@ -1,14 +1,14 @@ .require-assistance { - background-color: #0a1410; + background-color: rgb(10, 20, 16); box-sizing: border-box; padding: 16px; border-radius: 16px; - border-left: 4px solid #6ccc93; + border-left: 4px solid rgb(108, 204, 147); height: 144px; display: flex; flex-direction: column; justify-content: space-around; - width: 500px; + /* width: 500px; */ flex: 1 1 auto; cursor: pointer; text-decoration: none; @@ -21,7 +21,7 @@ font-weight: 400; line-height: 20px; text-align: left; - color: #6ccc93; + color: rgb(108, 204, 147); } h6 { @@ -31,7 +31,7 @@ line-height: 19.36px; letter-spacing: 0.01em; text-align: left; - color: #7bfbaf; + color: rgb(123, 251, 175); margin-bottom: 4px; } } diff --git a/src/components/RouteErrorBoundary/RouteErrorBoundary.tsx b/src/components/RouteErrorBoundary/RouteErrorBoundary.tsx new file mode 100644 index 0000000..7c06203 --- /dev/null +++ b/src/components/RouteErrorBoundary/RouteErrorBoundary.tsx @@ -0,0 +1,19 @@ +import { Placeholder } from "@codex-storage/marketplace-ui-components"; +import { useRouteError } from "react-router-dom"; +import ErrorCircleIcon from "../../assets/icons/error-circle.svg?react"; + +export function RouteErrorBoundary() { + const error = useRouteError(); + + const message = Object.prototype.hasOwnProperty.call(error, "message") + ? (error as { message: string }).message + : `${error}`; + + return ( + } + title="Error" + subtitle={""} + message={message}> + ); +} diff --git a/src/components/StorageRequestSetup/Commitment.css b/src/components/StorageRequestSetup/Commitment.css new file mode 100644 index 0000000..75837d4 --- /dev/null +++ b/src/components/StorageRequestSetup/Commitment.css @@ -0,0 +1,7 @@ +.commitment { + --codex-input-group-background-color: transparent; + + span { + right: 155px; + } +} diff --git a/src/components/StorageRequestSetup/Commitment.tsx b/src/components/StorageRequestSetup/Commitment.tsx new file mode 100644 index 0000000..74c3b50 --- /dev/null +++ b/src/components/StorageRequestSetup/Commitment.tsx @@ -0,0 +1,70 @@ +import { InputGroup, Tooltip } from "@codex-storage/marketplace-ui-components"; +import "../CardNumbers/CardNumbers.css"; +import "./Commitment.css"; + +import { ChangeEvent, useState } from "react"; +import { classnames } from "../../utils/classnames"; +import InfoIcon from "../../assets/icons/info.svg?react"; +import { attributes } from "../../utils/attributes"; + +type Props = { + unit: "months" | "days"; + value: string; + onChange: (value: string, unit: "months" | "days") => void; + onValidation?: (value: string) => string; +}; + +const TESTNET_MAX_VALUE = 7; + +export function Commitment({ unit, value, onValidation, onChange }: Props) { + const [error, setError] = useState(""); + + const onValueChange = (e: ChangeEvent) => { + onValueOrUnitChange(e.currentTarget.value, unit); + }; + const onUnitChange = (e: ChangeEvent) => { + onValueOrUnitChange(value, e.currentTarget.value as "months" | "days"); + }; + + const onValueOrUnitChange = (val: string, unit: "months" | "days") => { + onChange(val, unit); + + const msg = onValidation?.(val); + + if (msg) { + setError(msg); + return; + } + + setError(""); + }; + + return ( +
    + + + + + + {"Contract duration"} +
    + ); +} diff --git a/src/components/StorageRequestSetup/StorageRequestAvailability.css b/src/components/StorageRequestSetup/StorageRequestAvailability.css deleted file mode 100644 index 8768c3d..0000000 --- a/src/components/StorageRequestSetup/StorageRequestAvailability.css +++ /dev/null @@ -1,5 +0,0 @@ -.storageRequestAvailability { - flex: 1; - display: flex; - align-items: center; -} diff --git a/src/components/StorageRequestSetup/StorageRequestAvailability.tsx b/src/components/StorageRequestSetup/StorageRequestAvailability.tsx deleted file mode 100644 index c658d3d..0000000 --- a/src/components/StorageRequestSetup/StorageRequestAvailability.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import { ChangeEvent, useEffect, useRef, useState } from "react"; -import "./StorageRequestAvailability.css"; -import { WebStorage } from "../../utils/web-storage"; -import { StorageAvailabilityUnit, StorageAvailabilityValue } from "./types"; -import { InputGroup } from "@codex-storage/marketplace-ui-components"; - -type Props = { - onToggleNext: (next: boolean) => void; -}; - -export function StorageRequestAvailability({ onToggleNext }: Props) { - const [unit, setUnit] = useState("minutes"); - const [value, setValue] = useState(0); - const cache = useRef(null); - - useEffect(() => { - if (cache.current) { - return; - } - - WebStorage.get("storage-request-step-2").then( - (val) => { - if (val) { - cache.current = val; - setUnit(val.unit); - setValue(val.value); - onToggleNext(true); - } - } - ); - - return () => { - WebStorage.set("storage-request-step-2", cache.current); - }; - }, [onToggleNext]); - - const onChange = (e: ChangeEvent) => { - if (!cache.current) { - cache.current = { unit: "months", value: 0 }; - } - - cache.current.value = parseInt(e.currentTarget.value, 10); - - setValue(parseInt(e.currentTarget.value, 10)); - onToggleNext(!!e.currentTarget.value); - }; - - const onUnitChange = (e: ChangeEvent) => { - if (!cache.current) { - cache.current = { unit: "months", value: 0 }; - } - - setUnit(e.currentTarget.value as StorageAvailabilityUnit); - cache.current.unit = e.currentTarget.value as StorageAvailabilityUnit; - }; - - return ( - <> - - How long do you want to store your file? - - - - - ); -} diff --git a/src/components/StorageRequestSetup/StorageRequestCreate.css b/src/components/StorageRequestSetup/StorageRequestCreate.css index 2b746c1..6c6a2ec 100644 --- a/src/components/StorageRequestSetup/StorageRequestCreate.css +++ b/src/components/StorageRequestSetup/StorageRequestCreate.css @@ -1,9 +1,4 @@ .storage-request { - .modal dialog { - width: 80%; - max-width: 100% !important; - } - header { display: flex; align-items: flex-start; @@ -16,7 +11,7 @@ font-weight: 400; line-height: 16px; text-align: left; - color: #969696; + color: rgba(150, 150, 150, 1); } } diff --git a/src/components/StorageRequestSetup/StorageRequestCreate.tsx b/src/components/StorageRequestSetup/StorageRequestCreate.tsx index 8d63361..3158d41 100644 --- a/src/components/StorageRequestSetup/StorageRequestCreate.tsx +++ b/src/components/StorageRequestSetup/StorageRequestCreate.tsx @@ -13,17 +13,17 @@ import { import { StorageRequestSuccess } from "./StorageRequestSuccess"; import { Times } from "../../utils/times"; import { useStorageRequestMutation } from "./useStorageRequestMutation"; -import { Plus } from "lucide-react"; import "./StorageRequestCreate.css"; import { StorageRequestError } from "./StorageRequestError"; import PurchaseIcon from "../../assets/icons/purchase.svg?react"; +import PlusIcon from "../../assets/icons/plus.svg?react"; const CONFIRM_STATE = 2; const defaultStorageRequest: StorageRequest = { cid: "", - availabilityUnit: "months", availability: 1, + availabilityUnit: "days", tolerance: 1, proofProbability: 1, nodes: 3, @@ -43,7 +43,7 @@ export function StorageRequestCreate() { useEffect(() => { Promise.all([ WebStorage.get("storage-request-step"), - WebStorage.get("storage-request"), + WebStorage.get("storage-request-3"), ]).then(([s, data]) => { if (s) { dispatch({ @@ -83,11 +83,11 @@ export function StorageRequestCreate() { WebStorage.set("storage-request-step", step); if (step == CONFIRM_STATE) { - const { availabilityUnit, availability, expiration, ...rest } = + const { availability, availabilityUnit, expiration, ...rest } = storageRequest; mutateAsync({ ...rest, - duration: Times.toSeconds(availability, availabilityUnit), + duration: Math.trunc(availability * Times.value(availabilityUnit)), expiry: expiration * 60, }); } else { @@ -101,7 +101,7 @@ export function StorageRequestCreate() { const onStorageRequestChange = (data: Partial) => { const val = { ...storageRequest, ...data }; - WebStorage.set("storage-request", val); + WebStorage.set("storage-request-3", val); setStorageRequest(val); }; @@ -121,7 +121,7 @@ export function StorageRequestCreate() {
    @@ -283,22 +276,19 @@ export function StorageRequestReview({
    - + onValidation={isInvalidAvailability}> + title="Penality tokens"> + title="Reward tokens for hosts">
    @@ -321,14 +311,9 @@ export function StorageRequestReview({ unit={"Expiration"} value={storageRequest.expiration.toString()} onChange={onExpirationChange} - className="storageRequestReview-expiration" onValidation={isInvalidNumber} title="Request expiration in minutes"> - } - title="Warning" - variant="warning" - className="storageRequestReview-alert"> + } title="Warning" variant="warning"> If no suitable hosts are found for the CID{" "} {Strings.shortId(storageRequest.cid)} matching your storage requirements, you will incur a charge a small amount of tokens. diff --git a/src/components/StorageRequestSetup/StorageRequestSetup.css b/src/components/StorageRequestSetup/StorageRequestSetup.css deleted file mode 100644 index a836b75..0000000 --- a/src/components/StorageRequestSetup/StorageRequestSetup.css +++ /dev/null @@ -1,78 +0,0 @@ -.storageRequest-title { - margin-bottom: 0.5rem; - font-weight: 600; -} - -.storageRequest-intro { - margin-bottom: 0.5rem; -} - -.storageRequest-steps { - margin-top: 0.5rem; - display: flex; - flex-direction: column; - gap: 0.75rem; -} - -.storageRequest-step { - display: flex; - align-items: center; - gap: 0.75rem; -} - -.storageRequest-stepText { - flex: 1; -} - -.storageRequest-stepCompleted { - text-decoration: line-through; - mix-blend-mode: difference; -} - -.storageRequest-stepDisabled { - background-color: var(--codex-border-color); - color: var(--codex-text-disabled); - border: none; - border-radius: var(--codex-border-radius); - padding: 0.25rem 0.75rem; - opacity: 0.7; -} - -.storageRequest-step-action { - background-color: var(--codex-border-color); - color: var(--codex-text-disabled); - border: none; - border-radius: var(--codex-border-radius); - padding: 0.25rem 0.75rem; - cursor: pointer; - transition: opacity 0.35s; -} - -.storageRequest-step-action:hover { - opacity: 0.8; -} - -.storageRequest-title { - font-size: 1rem; - font-weight: 600; - width: 100%; - display: inline-block; - margin-bottom: 0.75rem; - text-align: center; -} - -@media (max-width: 800px) { - .storageRequest { - .stepper-body, - .stepper { - /* width: calc(100% - 3rem); */ - } - } -} - -@media (min-width: 801px) { - .storageRequest { - margin: auto; - width: 85%; - } -} diff --git a/src/components/StorageRequestSetup/StorageRequestSetup.tsx b/src/components/StorageRequestSetup/StorageRequestSetup.tsx deleted file mode 100644 index b25a475..0000000 --- a/src/components/StorageRequestSetup/StorageRequestSetup.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { CircleCheck, Database, Server } from "lucide-react"; -import { ICON_SIZE } from "../../utils/constants"; -import "./StorageRequestSetup.css"; - -export function StorageRequestSetup() { - return ( -
    -

    Storage setup

    -

    - You need to follow these steps to start a new request storage. -

    -

    - 3 of 5 completed -

    -
    -
    - - - Offers storage for sale - - -
    -
    - - - Updates availability - - -
    -
    - - - Get availability's reservations - - -
    -
    - - - Check list of purchase IDs - - -
    -
    - - - Check storage that is for sale - - -
    -
    -
    - ); -} diff --git a/src/components/StorageRequestSetup/StorageRequestSuccess.css b/src/components/StorageRequestSetup/StorageRequestSuccess.css index 3fe9b07..d51d1dd 100644 --- a/src/components/StorageRequestSetup/StorageRequestSuccess.css +++ b/src/components/StorageRequestSetup/StorageRequestSuccess.css @@ -1,7 +1,7 @@ -.storageRequestDone { +.storage-success { margin: auto; -} -.storageRequestDone-icon { - color: var(--codex-color-primary); + svg { + color: var(--codex-color-primary); + } } diff --git a/src/components/StorageRequestSetup/StorageRequestSuccess.tsx b/src/components/StorageRequestSetup/StorageRequestSuccess.tsx index 685c39c..70aa37e 100644 --- a/src/components/StorageRequestSetup/StorageRequestSuccess.tsx +++ b/src/components/StorageRequestSetup/StorageRequestSuccess.tsx @@ -1,8 +1,8 @@ import { Placeholder } from "@codex-storage/marketplace-ui-components"; -import { CircleCheck } from "lucide-react"; import "./StorageRequestSuccess.css"; import { StorageRequestComponentProps } from "./types"; import { useEffect } from "react"; +import SuccessCircleIcon from "../../assets/icons/success-circle.svg?react"; export function StorageRequestSuccess({ dispatch, @@ -17,10 +17,10 @@ export function StorageRequestSuccess({ return ( } - className="storageRequestDone" + Icon={} + className="storage-success" title="Your request is being processed." - message=" Processing your request may take some time. Once completed, it will + message="Processing your request may take some time. Once completed, it will appear in your purchase list. You can safely close this dialog."> ); } diff --git a/src/components/StorageRequestSetup/types.ts b/src/components/StorageRequestSetup/types.ts index 5a64ff3..c459698 100644 --- a/src/components/StorageRequestSetup/types.ts +++ b/src/components/StorageRequestSetup/types.ts @@ -16,29 +16,14 @@ export type StoragePriceStepValue = { expiration: number; }; -export type StorageAvailabilityUnit = - | "days" - | "months" - | "years" - | "minutes" - | "hours"; - export type StorageAvailabilityValue = { value: number; - unit: StorageAvailabilityUnit; }; -export type AvailabilityUnit = - | "days" - | "months" - | "years" - | "minutes" - | "hours"; - export type StorageRequest = { cid: string; availability: number; - availabilityUnit: AvailabilityUnit; + availabilityUnit: "months" | "days"; tolerance: number; proofProbability: number; nodes: number; diff --git a/src/components/StorageRequestSetup/useStorageRequestMutation.ts b/src/components/StorageRequestSetup/useStorageRequestMutation.ts index 1c349a6..322a865 100644 --- a/src/components/StorageRequestSetup/useStorageRequestMutation.ts +++ b/src/components/StorageRequestSetup/useStorageRequestMutation.ts @@ -29,7 +29,7 @@ export function useStorageRequestMutation( // } WebStorage.delete("storage-request-step"); - WebStorage.delete("storage-request"); + WebStorage.delete("storage-request-3"); setError(null); diff --git a/src/components/SuccessIcon/SuccessIcon.tsx b/src/components/SuccessIcon/SuccessIcon.tsx deleted file mode 100644 index ea06811..0000000 --- a/src/components/SuccessIcon/SuccessIcon.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import { CircleCheck } from "lucide-react"; - -export function SuccessIcon() { - return ( - - - - ); -} diff --git a/src/components/TruncateCell/TruncateCell.css b/src/components/TruncateCell/TruncateCell.css index 0ea52f5..5412d0e 100644 --- a/src/components/TruncateCell/TruncateCell.css +++ b/src/components/TruncateCell/TruncateCell.css @@ -1,26 +1,11 @@ -.truncateCell { +.truncate-cell { position: relative; -} -.truncateCell .tooltip:hover:after { - left: -33%; -} - -.truncateCell-point { - height: 0.5rem; - width: 3rem; - border-radius: var(--codex-border-radius); - display: inline-block; -} - -.truncateCell--ellipsis { - overflow: hidden; - white-space: nowrap; - text-overflow: ellipsis; - max-width: 150px; -} - -.table-tbodyTr:hover .truncateCell--ellipsis { - white-space: unset; - word-break: break-all; + small { + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + max-width: 150px; + display: inline-block; + } } diff --git a/src/components/TruncateCell/TruncateCell.tsx b/src/components/TruncateCell/TruncateCell.tsx index 238a5dd..cecac0c 100644 --- a/src/components/TruncateCell/TruncateCell.tsx +++ b/src/components/TruncateCell/TruncateCell.tsx @@ -1,4 +1,4 @@ -import { Cell } from "@codex-storage/marketplace-ui-components"; +import { Cell, Tooltip } from "@codex-storage/marketplace-ui-components"; import "./TruncateCell.css"; type Props = { @@ -11,11 +11,11 @@ export function TruncateCell({ value }: Props) { } return ( - -
    -
    - {value} -
    + +
    + + {value} +
    ); diff --git a/src/components/TruncateCellRender/TruncateCellRender.tsx b/src/components/TruncateCellRender/TruncateCellRender.tsx deleted file mode 100644 index 10d84a0..0000000 --- a/src/components/TruncateCellRender/TruncateCellRender.tsx +++ /dev/null @@ -1,4 +0,0 @@ -export function TruncateCellRender(cid: string) { - const truncated = cid.slice(0, 5) + ".".repeat(5) + cid.slice(-5); - return {truncated}; -} diff --git a/src/components/Versions/Versions.css b/src/components/Versions/Versions.css index 4e43756..f20e152 100644 --- a/src/components/Versions/Versions.css +++ b/src/components/Versions/Versions.css @@ -13,7 +13,7 @@ font-weight: 500; line-height: 24px; letter-spacing: -0.011em; - color: #99a0ae; + color: rgb(153, 160, 174); } small { diff --git a/src/components/Versions/Versions.tsx b/src/components/Versions/Versions.tsx index 23e0357..faa5cba 100644 --- a/src/components/Versions/Versions.tsx +++ b/src/components/Versions/Versions.tsx @@ -13,7 +13,7 @@ export function Versions() { return (
    - +

    Client

    VER. {version} @@ -21,7 +21,7 @@ export function Versions() {

    Vault

    VER. {VersionsUtil.codexVersion()} - +
    ); diff --git a/src/components/WalletLogin/WalletLogin.css b/src/components/WalletLogin/WalletLogin.css index 2aeb48f..245e38e 100644 --- a/src/components/WalletLogin/WalletLogin.css +++ b/src/components/WalletLogin/WalletLogin.css @@ -3,7 +3,7 @@ display: flex; align-items: center; gap: 16px; - background-color: #252525; + background-color: rgb(37, 37, 37); filter: grayscale(30); transition: filter 0.5s; @@ -17,7 +17,7 @@ font-size: 8px; font-weight: 700; text-transform: uppercase; - color: #6e6e6e; + color: rgb(110, 110, 110); display: block; font-size: 10px; } @@ -27,7 +27,7 @@ font-family: Inter; font-size: 12px; font-weight: 700; - color: #ffffff99; + color: rgb(255, 255, 255, 0.6); font-style: normal; font-size: 16px; } @@ -45,7 +45,7 @@ font-weight: 700; line-height: 10px; text-align: left; - color: #3ee089; + color: rgb(62, 224, 137); font-style: normal; } @@ -54,7 +54,7 @@ font-size: 10px; font-weight: 700; line-height: 10px; - color: #6e6e6e; + color: rgb(110, 110, 110); cursor: pointer; } } diff --git a/src/components/Welcome/WelcomeCard.css b/src/components/Welcome/WelcomeCard.css index baa2061..8ba9ed1 100644 --- a/src/components/Welcome/WelcomeCard.css +++ b/src/components/Welcome/WelcomeCard.css @@ -2,7 +2,7 @@ display: flex; flex-direction: column; flex: 1 1 50%; - min-width: 420px; + /* min-width: 420px; */ .card { position: relative; @@ -11,7 +11,7 @@ > div { padding: 16px; - background-color: #141414; + background-color: rgb(20, 20, 20); flex: 1; display: flex; flex-direction: column; @@ -40,7 +40,7 @@ font-weight: 400; line-height: 14px; text-align: left; - color: #7f948d; + color: rgb(127, 148, 141); } div { @@ -56,12 +56,22 @@ line-height: 19.36px; letter-spacing: 0.01em; text-align: left; - color: #7bfbaf; + color: rgb(123, 251, 175); + display: flex; + align-items: center; display: flex; align-items: center; + &:first-child { + border-bottom: 1px solid rgb(123, 251, 175); + text-decoration: none; + gap: 8px; + } + &:nth-child(2) { gap: 12px; + padding-bottom: 2px; + text-underline-offset: 5px; } } } @@ -69,4 +79,10 @@ footer { margin-top: 32px; } + + @media (max-width: 600px) { + img { + display: none; + } + } } diff --git a/src/components/Welcome/WelcomeCard.tsx b/src/components/Welcome/WelcomeCard.tsx index 77f6357..76dcae2 100644 --- a/src/components/Welcome/WelcomeCard.tsx +++ b/src/components/Welcome/WelcomeCard.tsx @@ -1,6 +1,4 @@ import "./WelcomeCard.css"; -import { Link } from "@tanstack/react-router"; -import { ArrowRight } from "lucide-react"; import { Alert } from "@codex-storage/marketplace-ui-components"; import { useEffect, useRef, useState } from "react"; import { classnames } from "../../utils/classnames"; @@ -8,7 +6,9 @@ import Logotype from "../../assets/icons/logotype.svg?react"; import Logo from "../../assets/icons/logo.svg?react"; import DiscordIcon from "../../assets/icons/discord.svg?react"; import WarningIcon from "../../assets/icons/warning.svg?react"; +import ArrowIcon from "../../assets/icons/arrow-onboarding.svg?react"; import { WelcomeImage } from "./WelcomeImage"; +import { Link } from "react-router-dom"; export function WelcomeCard() { const ref = useRef(null); @@ -47,11 +47,11 @@ export function WelcomeCard() {

    diff --git a/src/hooks/port-forwarding.util.ts b/src/hooks/port-forwarding.util.ts index 6833ca9..0cce763 100644 --- a/src/hooks/port-forwarding.util.ts +++ b/src/hooks/port-forwarding.util.ts @@ -1,8 +1,14 @@ import { CodexDebugInfo, SafeValue, CodexError } from "@codex-storage/sdk-js" export const PortForwardingUtil = { - check: (port: number) => fetch(import.meta.env.VITE_GEO_IP_URL + "/port/" + port) - .then((res) => res.json()), + check: (ip: string, port: number) => { + const headers = { + "X-Real-IP-Custom": ip + } + + return fetch(import.meta.env.VITE_GEO_IP_URL + "/port/" + port, { headers }) + .then((res) => res.json()) + }, getTcpPort(info: CodexDebugInfo): SafeValue { if (info.addrs.length === 0) { diff --git a/src/hooks/useMobile.ts b/src/hooks/useMobile.ts new file mode 100644 index 0000000..99305e7 --- /dev/null +++ b/src/hooks/useMobile.ts @@ -0,0 +1,19 @@ +import { useEffect, useState } from "react"; + +export const useIsMobile = () => { + const [isMobile, setIsMobile] = useState(window.innerWidth <= 800); + + const checkIsMobile = () => { + setIsMobile(window.innerWidth <= 800); + }; + + useEffect(() => { + window.addEventListener('resize', checkIsMobile); + + return () => { + window.removeEventListener('resize', checkIsMobile); + }; + }, []); + + return isMobile; +}; \ No newline at end of file diff --git a/src/hooks/usePersistence.tsx b/src/hooks/usePersistence.tsx index b66d68d..7546f11 100644 --- a/src/hooks/usePersistence.tsx +++ b/src/hooks/usePersistence.tsx @@ -9,7 +9,7 @@ export function usePersistence(isCodexOnline: boolean) { queryKey: [], queryFn: async () => { return CodexSdk.marketplace() - .purchases() + .activeSlots() .then((data) => Promises.rejectOnError(data, report)); }, diff --git a/src/hooks/usePortForwarding.tsx b/src/hooks/usePortForwarding.tsx index f77beb1..8782029 100644 --- a/src/hooks/usePortForwarding.tsx +++ b/src/hooks/usePortForwarding.tsx @@ -2,6 +2,7 @@ import { useQuery } from "@tanstack/react-query"; import { Errors } from "../utils/errors"; import { CodexDebugInfo } from "@codex-storage/sdk-js"; import { PortForwardingUtil } from "./port-forwarding.util"; +import { HealthCheckUtils } from "../components/HealthChecks/health-check.utils"; type PortForwardingResponse = { reachable: boolean }; @@ -9,12 +10,21 @@ export function usePortForwarding(info: CodexDebugInfo | undefined) { const { data, isFetching, refetch } = useQuery({ queryFn: (): Promise => { const port = PortForwardingUtil.getTcpPort(info!); + if (port.error) { Errors.report(port); return Promise.resolve({ reachable: false }); } else { - return PortForwardingUtil.check(port.data).catch((e) => - Errors.report(e) + const ip = HealthCheckUtils.extractAnnounceAddresses( + info!.announceAddresses + ); + if (ip.error) { + Errors.report(ip); + return Promise.resolve({ reachable: false }); + } + + return PortForwardingUtil.check(ip.data, port.data).catch( + Errors.report ); } }, diff --git a/src/index.css b/src/index.css index a144b1c..1ed3ae2 100644 --- a/src/index.css +++ b/src/index.css @@ -1,7 +1,3 @@ -@import url(./assets/css/container.css); -@import url(./assets/css/indicator.css); -@import url(./assets/css/text.css); - @font-face { font-family: Inter; font-weight: 300 800; @@ -15,38 +11,12 @@ } :root { - --codex-background: #1c1c1c; - --codex-color: white; - --codex-color-contrast: #f8f8f8; - --codex-color-error: 204, 108, 108; - --codex-color-error-hexa: #cc6c6c; - --codex-color-warning: 234, 179, 8; - --codex-color-success: 20, 184, 166; - --codex-color-blue: 30, 64, 175; - --codex-color-grey: 170, 170, 170; - --codex-color-primary: #6fcb94; - --codex-color-primary-rgb: 193, 240, 164; - --codex-color-primary-variant: #c1f0a4cc; - --codex-color-on-primary: #333; - --codex-color-disabled: #717171; - --codex-color-light: rgb(150 150 150); - --codex-border-color: #96969633; - --codex-input-border-color: #494949; - --codex-background-secondary: rgb(38 38 38); - --codex-highlight-color: #2f2f2f; - --codex-background-light: rgb(64 64 64); - --codex-background-backdrop: rgba(70, 70, 70, 0.75); - --codex-border-radius: 0.5rem; - --codex-font-size: 14px; + --codex-color-primary: rgb(111, 203, 148); + --codex-color-error: rgb(251, 55, 72); --codex-font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Arial, Noto Sans, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol, Noto Color Emoji; - --codex-input-label-color: #7b7b7b; - --codex-input-border-color: #494949; - --codex-input-background: #232323; - --codex-input-color-error: #fb3748; - --codex-row-gap: 16px; -webkit-tap-highlight-color: transparent; -webkit-text-size-adjust: 100%; @@ -55,47 +25,46 @@ font-feature-settings: normal; font-variation-settings: normal; tab-size: 4; - font-size: 1.15rem; - font-size: var(--codex-font-size); + font-size: 14px; color-scheme: dark; - color: var(--codex-color); - background: #000000; /* Fallback color */ + color: white; + background: rgb(0, 0, 0); /* Fallback color */ background: -webkit-linear-gradient( 246.02deg, - #000000 30.36%, - #222222 91.05% + rgb(0, 0, 0) 30.36%, + rgb(34, 34, 34) 91.05% ); /* For Safari and older Chrome */ background: -moz-linear-gradient( 246.02deg, - #000000 30.36%, - #222222 91.05% + rgb(0, 0, 0) 30.36%, + rgb(34, 34, 34) 91.05% ); /* For older Firefox */ background: linear-gradient( 246.02deg, - #000000 30.36%, - #222222 91.05% + rgb(0, 0, 0) 30.36%, + rgb(34, 34, 34) 91.05% ); /* Standard syntax */ } ::selection { background: var(--codex-color-primary); - color: #3a0b5a; + color: rgb(58, 11, 90); } ::-webkit-scrollbar { height: 12px; width: 8px; - background: #aaa; + background: rgb(170, 170, 170); } ::-webkit-scrollbar-thumb { - background: #444; + background: rgb(68, 68, 68); -webkit-border-radius: 1ex; -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.75); } ::-webkit-scrollbar-corner { - background: #000; + background: rgb(0, 0, 0); } html { @@ -183,14 +152,14 @@ input:-webkit-autofill:active { } .gap { - gap: var(--codex-row-gap); + gap: 16px; } .card { - border: 1px solid #96969633; + border: 1px solid rgba(150, 150, 150, 0.2); border-radius: 16px; padding: 16px; - background-color: #232323; + background-color: rgb(35, 35, 35); > header { display: flex; @@ -200,7 +169,7 @@ input:-webkit-autofill:active { margin-bottom: 16px; svg { - color: #969696; + color: rgba(150, 150, 150, 1); } > div { diff --git a/src/main.tsx b/src/main.tsx index 9d687a8..0fe4066 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,19 +1,26 @@ -import { - ErrorComponentProps, - RouterProvider, - createRouter, -} from "@tanstack/react-router"; import { StrictMode } from "react"; -import ReactDOM from "react-dom/client"; import "./index.css"; - +import { render } from "preact"; // Import the generated route tree -import App from "./App.tsx"; -import { routeTree } from "./routeTree.gen"; -import { Failure } from "@codex-storage/marketplace-ui-components"; import * as Sentry from "@sentry/react"; import { CodexSdk } from "./sdk/codex"; -import { ErrorPlaceholder } from "./components/ErrorPlaceholder/ErrorPlaceholder.tsx"; +import { OnBoardingRoute } from "./routes/onboarding.tsx"; +import { createBrowserRouter, RouterProvider } from "react-router-dom"; +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { OnBoardingNameRoute } from "./routes/onboarding-name.tsx"; +import { OnBoardingChecksRoute } from "./routes/onboarding-checks.tsx"; +import { Root } from "./routes/root.tsx"; +import { DashboardRoute } from "./routes/dashboard/dashboard.tsx"; +import { WalletRoute } from "./routes/dashboard/wallet.tsx"; +import { FilesRoute } from "./routes/dashboard/files.tsx"; +import { PurchasesRoute } from "./routes/dashboard/purchases.tsx"; +import { AvailabilitiesRoute } from "./routes/dashboard/availabilities.tsx"; +import { PeersRoute } from "./routes/dashboard/peers.tsx"; +import { LogsRoute } from "./routes/dashboard/logs.tsx"; +import { SettingsRoute } from "./routes/dashboard/settings.tsx"; +import { HelpRoute } from "./routes/dashboard/help.tsx"; +import { DisclaimerRoute } from "./routes/dashboard/disclaimer.tsx"; +import { RouteErrorBoundary } from "./components/RouteErrorBoundary/RouteErrorBoundary.tsx"; if (import.meta.env.PROD && !import.meta.env.CI) { Sentry.init({ @@ -39,48 +46,85 @@ if (import.meta.env.PROD && !import.meta.env.CI) { }); } -// Create a new router instance -const router = createRouter({ - routeTree, - defaultPreload: "viewport", - defaultNotFoundComponent: () => { - return ( - {}} - /> - ); +const router = createBrowserRouter([ + { + path: "/", + element: , + errorElement: , }, - defaultErrorComponent: - () => - ({ error }: ErrorComponentProps) => ( - - ), -}); + { + path: "/onboarding-name", + element: , + errorElement: , + }, + { + path: "/onboarding-checks", + element: , + errorElement: , + }, + { + path: "/dashboard", + element: , + errorElement: , + children: [ + { + path: "", + element: , + }, + { + path: "wallet", + element: , + }, + { + path: "files", + element: , + }, + { + path: "purchases", + element: , + }, + { + path: "availabilities", + element: , + }, + { + path: "peers", + element: , + }, + { + path: "logs", + element: , + }, + { + path: "settings", + element: , + }, + { + path: "help", + element: , + }, + { + path: "disclaimer", + element: , + }, + ], + }, +]); -// Register the router instance for type safety -declare module "@tanstack/react-router" { - interface Register { - router: typeof router; - } -} +const queryClient = new QueryClient(); // Render the app const rootElement = document.getElementById("root")!; if (rootElement) { - const root = ReactDOM.createRoot(rootElement); - CodexSdk.load().then(() => { - root.render( + render( - + - - + + , + rootElement ); }); } diff --git a/src/proxy.ts b/src/proxy.ts index 84419ed..28be468 100644 --- a/src/proxy.ts +++ b/src/proxy.ts @@ -5,7 +5,6 @@ import { SafeValue, } from "@codex-storage/sdk-js"; import { CodexSdk as Sdk } from "./sdk/codex"; -import { PortForwardingUtil as PUtil } from "./hooks/port-forwarding.util"; import { WebStorage } from "./utils/web-storage"; class CodexDataMock extends CodexData { @@ -142,13 +141,3 @@ export const CodexSdk = { }; -export const PortForwardingUtil = { - ...PUtil, - check: (port: number) => { - if (import.meta.env.CI) { - return Promise.resolve({ reachable: true }) - } - - return PUtil.check(port) - } -} \ No newline at end of file diff --git a/src/routeTree.gen.ts b/src/routeTree.gen.ts deleted file mode 100644 index d5991c6..0000000 --- a/src/routeTree.gen.ts +++ /dev/null @@ -1,614 +0,0 @@ -/* prettier-ignore-start */ - -/* eslint-disable */ - -// @ts-nocheck - -// noinspection JSUnusedGlobalSymbols - -// This file is auto-generated by TanStack Router - -// Import Routes - -import { Route as rootRoute } from './routes/__root' -import { Route as OnboardingNameImport } from './routes/onboarding-name' -import { Route as OnboardingChecksImport } from './routes/onboarding-checks' -import { Route as DashboardImport } from './routes/dashboard' -import { Route as IndexImport } from './routes/index' -import { Route as DashboardIndexImport } from './routes/dashboard/index' -import { Route as DashboardWalletImport } from './routes/dashboard/wallet' -import { Route as DashboardSettingsImport } from './routes/dashboard/settings' -import { Route as DashboardRequestsImport } from './routes/dashboard/requests' -import { Route as DashboardPurchasesImport } from './routes/dashboard/purchases' -import { Route as DashboardPeersImport } from './routes/dashboard/peers' -import { Route as DashboardNodesImport } from './routes/dashboard/nodes' -import { Route as DashboardLogsImport } from './routes/dashboard/logs' -import { Route as DashboardHelpImport } from './routes/dashboard/help' -import { Route as DashboardFilesImport } from './routes/dashboard/files' -import { Route as DashboardFavoritesImport } from './routes/dashboard/favorites' -import { Route as DashboardDisclaimerImport } from './routes/dashboard/disclaimer' -import { Route as DashboardDeviceImport } from './routes/dashboard/device' -import { Route as DashboardAvailabilitiesImport } from './routes/dashboard/availabilities' -import { Route as DashboardAnalyticsImport } from './routes/dashboard/analytics' -import { Route as DashboardAboutImport } from './routes/dashboard/about' - -// Create/Update Routes - -const OnboardingNameRoute = OnboardingNameImport.update({ - id: '/onboarding-name', - path: '/onboarding-name', - getParentRoute: () => rootRoute, -} as any) - -const OnboardingChecksRoute = OnboardingChecksImport.update({ - id: '/onboarding-checks', - path: '/onboarding-checks', - getParentRoute: () => rootRoute, -} as any) - -const DashboardRoute = DashboardImport.update({ - id: '/dashboard', - path: '/dashboard', - getParentRoute: () => rootRoute, -} as any) - -const IndexRoute = IndexImport.update({ - id: '/', - path: '/', - getParentRoute: () => rootRoute, -} as any) - -const DashboardIndexRoute = DashboardIndexImport.update({ - id: '/', - path: '/', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardWalletRoute = DashboardWalletImport.update({ - id: '/wallet', - path: '/wallet', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardSettingsRoute = DashboardSettingsImport.update({ - id: '/settings', - path: '/settings', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardRequestsRoute = DashboardRequestsImport.update({ - id: '/requests', - path: '/requests', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardPurchasesRoute = DashboardPurchasesImport.update({ - id: '/purchases', - path: '/purchases', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardPeersRoute = DashboardPeersImport.update({ - id: '/peers', - path: '/peers', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardNodesRoute = DashboardNodesImport.update({ - id: '/nodes', - path: '/nodes', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardLogsRoute = DashboardLogsImport.update({ - id: '/logs', - path: '/logs', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardHelpRoute = DashboardHelpImport.update({ - id: '/help', - path: '/help', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardFilesRoute = DashboardFilesImport.update({ - id: '/files', - path: '/files', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardFavoritesRoute = DashboardFavoritesImport.update({ - id: '/favorites', - path: '/favorites', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardDisclaimerRoute = DashboardDisclaimerImport.update({ - id: '/disclaimer', - path: '/disclaimer', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardDeviceRoute = DashboardDeviceImport.update({ - id: '/device', - path: '/device', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardAvailabilitiesRoute = DashboardAvailabilitiesImport.update({ - id: '/availabilities', - path: '/availabilities', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardAnalyticsRoute = DashboardAnalyticsImport.update({ - id: '/analytics', - path: '/analytics', - getParentRoute: () => DashboardRoute, -} as any) - -const DashboardAboutRoute = DashboardAboutImport.update({ - id: '/about', - path: '/about', - getParentRoute: () => DashboardRoute, -} as any) - -// Populate the FileRoutesByPath interface - -declare module '@tanstack/react-router' { - interface FileRoutesByPath { - '/': { - id: '/' - path: '/' - fullPath: '/' - preLoaderRoute: typeof IndexImport - parentRoute: typeof rootRoute - } - '/dashboard': { - id: '/dashboard' - path: '/dashboard' - fullPath: '/dashboard' - preLoaderRoute: typeof DashboardImport - parentRoute: typeof rootRoute - } - '/onboarding-checks': { - id: '/onboarding-checks' - path: '/onboarding-checks' - fullPath: '/onboarding-checks' - preLoaderRoute: typeof OnboardingChecksImport - parentRoute: typeof rootRoute - } - '/onboarding-name': { - id: '/onboarding-name' - path: '/onboarding-name' - fullPath: '/onboarding-name' - preLoaderRoute: typeof OnboardingNameImport - parentRoute: typeof rootRoute - } - '/dashboard/about': { - id: '/dashboard/about' - path: '/about' - fullPath: '/dashboard/about' - preLoaderRoute: typeof DashboardAboutImport - parentRoute: typeof DashboardImport - } - '/dashboard/analytics': { - id: '/dashboard/analytics' - path: '/analytics' - fullPath: '/dashboard/analytics' - preLoaderRoute: typeof DashboardAnalyticsImport - parentRoute: typeof DashboardImport - } - '/dashboard/availabilities': { - id: '/dashboard/availabilities' - path: '/availabilities' - fullPath: '/dashboard/availabilities' - preLoaderRoute: typeof DashboardAvailabilitiesImport - parentRoute: typeof DashboardImport - } - '/dashboard/device': { - id: '/dashboard/device' - path: '/device' - fullPath: '/dashboard/device' - preLoaderRoute: typeof DashboardDeviceImport - parentRoute: typeof DashboardImport - } - '/dashboard/disclaimer': { - id: '/dashboard/disclaimer' - path: '/disclaimer' - fullPath: '/dashboard/disclaimer' - preLoaderRoute: typeof DashboardDisclaimerImport - parentRoute: typeof DashboardImport - } - '/dashboard/favorites': { - id: '/dashboard/favorites' - path: '/favorites' - fullPath: '/dashboard/favorites' - preLoaderRoute: typeof DashboardFavoritesImport - parentRoute: typeof DashboardImport - } - '/dashboard/files': { - id: '/dashboard/files' - path: '/files' - fullPath: '/dashboard/files' - preLoaderRoute: typeof DashboardFilesImport - parentRoute: typeof DashboardImport - } - '/dashboard/help': { - id: '/dashboard/help' - path: '/help' - fullPath: '/dashboard/help' - preLoaderRoute: typeof DashboardHelpImport - parentRoute: typeof DashboardImport - } - '/dashboard/logs': { - id: '/dashboard/logs' - path: '/logs' - fullPath: '/dashboard/logs' - preLoaderRoute: typeof DashboardLogsImport - parentRoute: typeof DashboardImport - } - '/dashboard/nodes': { - id: '/dashboard/nodes' - path: '/nodes' - fullPath: '/dashboard/nodes' - preLoaderRoute: typeof DashboardNodesImport - parentRoute: typeof DashboardImport - } - '/dashboard/peers': { - id: '/dashboard/peers' - path: '/peers' - fullPath: '/dashboard/peers' - preLoaderRoute: typeof DashboardPeersImport - parentRoute: typeof DashboardImport - } - '/dashboard/purchases': { - id: '/dashboard/purchases' - path: '/purchases' - fullPath: '/dashboard/purchases' - preLoaderRoute: typeof DashboardPurchasesImport - parentRoute: typeof DashboardImport - } - '/dashboard/requests': { - id: '/dashboard/requests' - path: '/requests' - fullPath: '/dashboard/requests' - preLoaderRoute: typeof DashboardRequestsImport - parentRoute: typeof DashboardImport - } - '/dashboard/settings': { - id: '/dashboard/settings' - path: '/settings' - fullPath: '/dashboard/settings' - preLoaderRoute: typeof DashboardSettingsImport - parentRoute: typeof DashboardImport - } - '/dashboard/wallet': { - id: '/dashboard/wallet' - path: '/wallet' - fullPath: '/dashboard/wallet' - preLoaderRoute: typeof DashboardWalletImport - parentRoute: typeof DashboardImport - } - '/dashboard/': { - id: '/dashboard/' - path: '/' - fullPath: '/dashboard/' - preLoaderRoute: typeof DashboardIndexImport - parentRoute: typeof DashboardImport - } - } -} - -// Create and export the route tree - -interface DashboardRouteChildren { - DashboardAboutRoute: typeof DashboardAboutRoute - DashboardAnalyticsRoute: typeof DashboardAnalyticsRoute - DashboardAvailabilitiesRoute: typeof DashboardAvailabilitiesRoute - DashboardDeviceRoute: typeof DashboardDeviceRoute - DashboardDisclaimerRoute: typeof DashboardDisclaimerRoute - DashboardFavoritesRoute: typeof DashboardFavoritesRoute - DashboardFilesRoute: typeof DashboardFilesRoute - DashboardHelpRoute: typeof DashboardHelpRoute - DashboardLogsRoute: typeof DashboardLogsRoute - DashboardNodesRoute: typeof DashboardNodesRoute - DashboardPeersRoute: typeof DashboardPeersRoute - DashboardPurchasesRoute: typeof DashboardPurchasesRoute - DashboardRequestsRoute: typeof DashboardRequestsRoute - DashboardSettingsRoute: typeof DashboardSettingsRoute - DashboardWalletRoute: typeof DashboardWalletRoute - DashboardIndexRoute: typeof DashboardIndexRoute -} - -const DashboardRouteChildren: DashboardRouteChildren = { - DashboardAboutRoute: DashboardAboutRoute, - DashboardAnalyticsRoute: DashboardAnalyticsRoute, - DashboardAvailabilitiesRoute: DashboardAvailabilitiesRoute, - DashboardDeviceRoute: DashboardDeviceRoute, - DashboardDisclaimerRoute: DashboardDisclaimerRoute, - DashboardFavoritesRoute: DashboardFavoritesRoute, - DashboardFilesRoute: DashboardFilesRoute, - DashboardHelpRoute: DashboardHelpRoute, - DashboardLogsRoute: DashboardLogsRoute, - DashboardNodesRoute: DashboardNodesRoute, - DashboardPeersRoute: DashboardPeersRoute, - DashboardPurchasesRoute: DashboardPurchasesRoute, - DashboardRequestsRoute: DashboardRequestsRoute, - DashboardSettingsRoute: DashboardSettingsRoute, - DashboardWalletRoute: DashboardWalletRoute, - DashboardIndexRoute: DashboardIndexRoute, -} - -const DashboardRouteWithChildren = DashboardRoute._addFileChildren( - DashboardRouteChildren, -) - -export interface FileRoutesByFullPath { - '/': typeof IndexRoute - '/dashboard': typeof DashboardRouteWithChildren - '/onboarding-checks': typeof OnboardingChecksRoute - '/onboarding-name': typeof OnboardingNameRoute - '/dashboard/about': typeof DashboardAboutRoute - '/dashboard/analytics': typeof DashboardAnalyticsRoute - '/dashboard/availabilities': typeof DashboardAvailabilitiesRoute - '/dashboard/device': typeof DashboardDeviceRoute - '/dashboard/disclaimer': typeof DashboardDisclaimerRoute - '/dashboard/favorites': typeof DashboardFavoritesRoute - '/dashboard/files': typeof DashboardFilesRoute - '/dashboard/help': typeof DashboardHelpRoute - '/dashboard/logs': typeof DashboardLogsRoute - '/dashboard/nodes': typeof DashboardNodesRoute - '/dashboard/peers': typeof DashboardPeersRoute - '/dashboard/purchases': typeof DashboardPurchasesRoute - '/dashboard/requests': typeof DashboardRequestsRoute - '/dashboard/settings': typeof DashboardSettingsRoute - '/dashboard/wallet': typeof DashboardWalletRoute - '/dashboard/': typeof DashboardIndexRoute -} - -export interface FileRoutesByTo { - '/': typeof IndexRoute - '/onboarding-checks': typeof OnboardingChecksRoute - '/onboarding-name': typeof OnboardingNameRoute - '/dashboard/about': typeof DashboardAboutRoute - '/dashboard/analytics': typeof DashboardAnalyticsRoute - '/dashboard/availabilities': typeof DashboardAvailabilitiesRoute - '/dashboard/device': typeof DashboardDeviceRoute - '/dashboard/disclaimer': typeof DashboardDisclaimerRoute - '/dashboard/favorites': typeof DashboardFavoritesRoute - '/dashboard/files': typeof DashboardFilesRoute - '/dashboard/help': typeof DashboardHelpRoute - '/dashboard/logs': typeof DashboardLogsRoute - '/dashboard/nodes': typeof DashboardNodesRoute - '/dashboard/peers': typeof DashboardPeersRoute - '/dashboard/purchases': typeof DashboardPurchasesRoute - '/dashboard/requests': typeof DashboardRequestsRoute - '/dashboard/settings': typeof DashboardSettingsRoute - '/dashboard/wallet': typeof DashboardWalletRoute - '/dashboard': typeof DashboardIndexRoute -} - -export interface FileRoutesById { - __root__: typeof rootRoute - '/': typeof IndexRoute - '/dashboard': typeof DashboardRouteWithChildren - '/onboarding-checks': typeof OnboardingChecksRoute - '/onboarding-name': typeof OnboardingNameRoute - '/dashboard/about': typeof DashboardAboutRoute - '/dashboard/analytics': typeof DashboardAnalyticsRoute - '/dashboard/availabilities': typeof DashboardAvailabilitiesRoute - '/dashboard/device': typeof DashboardDeviceRoute - '/dashboard/disclaimer': typeof DashboardDisclaimerRoute - '/dashboard/favorites': typeof DashboardFavoritesRoute - '/dashboard/files': typeof DashboardFilesRoute - '/dashboard/help': typeof DashboardHelpRoute - '/dashboard/logs': typeof DashboardLogsRoute - '/dashboard/nodes': typeof DashboardNodesRoute - '/dashboard/peers': typeof DashboardPeersRoute - '/dashboard/purchases': typeof DashboardPurchasesRoute - '/dashboard/requests': typeof DashboardRequestsRoute - '/dashboard/settings': typeof DashboardSettingsRoute - '/dashboard/wallet': typeof DashboardWalletRoute - '/dashboard/': typeof DashboardIndexRoute -} - -export interface FileRouteTypes { - fileRoutesByFullPath: FileRoutesByFullPath - fullPaths: - | '/' - | '/dashboard' - | '/onboarding-checks' - | '/onboarding-name' - | '/dashboard/about' - | '/dashboard/analytics' - | '/dashboard/availabilities' - | '/dashboard/device' - | '/dashboard/disclaimer' - | '/dashboard/favorites' - | '/dashboard/files' - | '/dashboard/help' - | '/dashboard/logs' - | '/dashboard/nodes' - | '/dashboard/peers' - | '/dashboard/purchases' - | '/dashboard/requests' - | '/dashboard/settings' - | '/dashboard/wallet' - | '/dashboard/' - fileRoutesByTo: FileRoutesByTo - to: - | '/' - | '/onboarding-checks' - | '/onboarding-name' - | '/dashboard/about' - | '/dashboard/analytics' - | '/dashboard/availabilities' - | '/dashboard/device' - | '/dashboard/disclaimer' - | '/dashboard/favorites' - | '/dashboard/files' - | '/dashboard/help' - | '/dashboard/logs' - | '/dashboard/nodes' - | '/dashboard/peers' - | '/dashboard/purchases' - | '/dashboard/requests' - | '/dashboard/settings' - | '/dashboard/wallet' - | '/dashboard' - id: - | '__root__' - | '/' - | '/dashboard' - | '/onboarding-checks' - | '/onboarding-name' - | '/dashboard/about' - | '/dashboard/analytics' - | '/dashboard/availabilities' - | '/dashboard/device' - | '/dashboard/disclaimer' - | '/dashboard/favorites' - | '/dashboard/files' - | '/dashboard/help' - | '/dashboard/logs' - | '/dashboard/nodes' - | '/dashboard/peers' - | '/dashboard/purchases' - | '/dashboard/requests' - | '/dashboard/settings' - | '/dashboard/wallet' - | '/dashboard/' - fileRoutesById: FileRoutesById -} - -export interface RootRouteChildren { - IndexRoute: typeof IndexRoute - DashboardRoute: typeof DashboardRouteWithChildren - OnboardingChecksRoute: typeof OnboardingChecksRoute - OnboardingNameRoute: typeof OnboardingNameRoute -} - -const rootRouteChildren: RootRouteChildren = { - IndexRoute: IndexRoute, - DashboardRoute: DashboardRouteWithChildren, - OnboardingChecksRoute: OnboardingChecksRoute, - OnboardingNameRoute: OnboardingNameRoute, -} - -export const routeTree = rootRoute - ._addFileChildren(rootRouteChildren) - ._addFileTypes() - -/* prettier-ignore-end */ - -/* ROUTE_MANIFEST_START -{ - "routes": { - "__root__": { - "filePath": "__root.tsx", - "children": [ - "/", - "/dashboard", - "/onboarding-checks", - "/onboarding-name" - ] - }, - "/": { - "filePath": "index.tsx" - }, - "/dashboard": { - "filePath": "dashboard.tsx", - "children": [ - "/dashboard/about", - "/dashboard/analytics", - "/dashboard/availabilities", - "/dashboard/device", - "/dashboard/disclaimer", - "/dashboard/favorites", - "/dashboard/files", - "/dashboard/help", - "/dashboard/logs", - "/dashboard/nodes", - "/dashboard/peers", - "/dashboard/purchases", - "/dashboard/requests", - "/dashboard/settings", - "/dashboard/wallet", - "/dashboard/" - ] - }, - "/onboarding-checks": { - "filePath": "onboarding-checks.tsx" - }, - "/onboarding-name": { - "filePath": "onboarding-name.tsx" - }, - "/dashboard/about": { - "filePath": "dashboard/about.tsx", - "parent": "/dashboard" - }, - "/dashboard/analytics": { - "filePath": "dashboard/analytics.tsx", - "parent": "/dashboard" - }, - "/dashboard/availabilities": { - "filePath": "dashboard/availabilities.tsx", - "parent": "/dashboard" - }, - "/dashboard/device": { - "filePath": "dashboard/device.tsx", - "parent": "/dashboard" - }, - "/dashboard/disclaimer": { - "filePath": "dashboard/disclaimer.tsx", - "parent": "/dashboard" - }, - "/dashboard/favorites": { - "filePath": "dashboard/favorites.tsx", - "parent": "/dashboard" - }, - "/dashboard/files": { - "filePath": "dashboard/files.tsx", - "parent": "/dashboard" - }, - "/dashboard/help": { - "filePath": "dashboard/help.tsx", - "parent": "/dashboard" - }, - "/dashboard/logs": { - "filePath": "dashboard/logs.tsx", - "parent": "/dashboard" - }, - "/dashboard/nodes": { - "filePath": "dashboard/nodes.tsx", - "parent": "/dashboard" - }, - "/dashboard/peers": { - "filePath": "dashboard/peers.tsx", - "parent": "/dashboard" - }, - "/dashboard/purchases": { - "filePath": "dashboard/purchases.tsx", - "parent": "/dashboard" - }, - "/dashboard/requests": { - "filePath": "dashboard/requests.tsx", - "parent": "/dashboard" - }, - "/dashboard/settings": { - "filePath": "dashboard/settings.tsx", - "parent": "/dashboard" - }, - "/dashboard/wallet": { - "filePath": "dashboard/wallet.tsx", - "parent": "/dashboard" - }, - "/dashboard/": { - "filePath": "dashboard/index.tsx", - "parent": "/dashboard" - } - } -} -ROUTE_MANIFEST_END */ diff --git a/src/routes/__root.tsx b/src/routes/__root.tsx deleted file mode 100644 index 9e9864f..0000000 --- a/src/routes/__root.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { - createRootRoute, - Outlet, - ScrollRestoration, -} from "@tanstack/react-router"; - -export const Route = createRootRoute({ - component: () => { - return ( - <> - - - - ); - }, -}); diff --git a/src/routes/dashboard.tsx b/src/routes/dashboard.tsx deleted file mode 100644 index 8c47007..0000000 --- a/src/routes/dashboard.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { - createFileRoute, - Outlet, - ScrollRestoration, -} from "@tanstack/react-router"; -import "./layout.css"; -import { Menu } from "../components/Menu/Menu"; -import { useState } from "react"; -import { AppBar } from "../components/AppBar/AppBar"; -import { Backdrop } from "@codex-storage/marketplace-ui-components"; - -const Layout = () => { - const [hasMobileMenu, setHasMobileMenu] = useState(false); - - const onIconClick = () => { - if (window.innerWidth <= 999) { - setHasMobileMenu(true); - } - }; - - const onClose = () => setHasMobileMenu(false); - - return ( -
    - - -
    - -
    - - -
    -
    - - -
    - ); -}; - -export const Route = createFileRoute("/dashboard")({ - component: Layout, -}); diff --git a/src/routes/dashboard/about.tsx b/src/routes/dashboard/about.tsx deleted file mode 100644 index b18c86d..0000000 --- a/src/routes/dashboard/about.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { CodexDataContent } from "@codex-storage/sdk-js"; -import { createFileRoute, useRouterState } from "@tanstack/react-router"; -import { PrettyBytes } from "../../utils/bytes"; -import { Button, WebFileIcon } from "@codex-storage/marketplace-ui-components"; - -function ProtectedIcon({ isProtected }: { isProtected: boolean }) { - if (isProtected) { - return ( - - lock - - ); - } - - return ( - - lock_open - - ); -} - -const About = () => { - { - const c = useRouterState({ - select: (s) => s.location.state, - }) as CodexDataContent; - - if (!c.cid) { - return
    ; - } - - return ( -
    -
    -
    - -
    -
    - {c.manifest.filename} -
    - - {PrettyBytes(c.manifest.datasetSize)} -{" "} - {c.manifest.uploadedAt} - ...{c.cid.slice(-5)} - -
    -
    -
    - {ProtectedIcon({ isProtected: c.manifest.protected })} - - - expand_circle_right - - -
    -
    -
    - -

    File details

    -
    -

    - Cid: - {c.cid} -

    - -

    - Name: - {c.manifest.filename} -

    - -

    - Uploaded: - {c.manifest.uploadedAt} -

    - -

    - File size: - {PrettyBytes(c.manifest.datasetSize)} -

    - -

    - Protected: - {c.manifest.protected ? "Yes" : "No"} -

    - - -
    -
    -
    - ); - } -}; - -export const Route = createFileRoute("/dashboard/about")({ - component: () => About, -}); diff --git a/src/routes/dashboard/analytics.tsx b/src/routes/dashboard/analytics.tsx deleted file mode 100644 index ab7c726..0000000 --- a/src/routes/dashboard/analytics.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { createFileRoute } from "@tanstack/react-router"; - -export const Route = createFileRoute("/dashboard/analytics")({ - component: () =>
    Hello /dashboard/analytics!
    , -}); diff --git a/src/routes/dashboard/availabilities.css b/src/routes/dashboard/availabilities.css index 5c5f636..4898d1d 100644 --- a/src/routes/dashboard/availabilities.css +++ b/src/routes/dashboard/availabilities.css @@ -4,22 +4,37 @@ flex-wrap: wrap; gap: 16px; - dialog { - width: 80%; - } - > .card { flex: 1 1 50%; + + @media (max-width: 800px) { + & { + flex: 1 1 100%; + } + } } .table { + @media (max-width: 800px) { + th:nth-child(3), + td:nth-child(3), + th:nth-child(4), + td:nth-child(4), + th:nth-child(5), + td:nth-child(5), + th:nth-child(6), + td:nth-child(6) { + display: none; + } + } + table thead tr th { - background-color: #14141499; + background-color: rgba(20, 20, 20, 0.6); } table tbody tr.availabilty-row { td { - background-color: #292929; + background-color: rgb(41, 41, 41); padding: 6px 12px; &:first-child { @@ -54,14 +69,13 @@ font-weight: 400; line-height: 16px; text-align: left; - color: #ffffffcc; + color: rgba (255, 255, 255, 0.8); } } } aside { display: flex; - width: 400px; flex: 1 1 30%; .card { @@ -80,7 +94,7 @@ } .node-space { - border-bottom: 1px solid #96969633; + border-bottom: 1px solid rgba(150, 150, 150, 0.2); padding-bottom: 16px; h6 { @@ -108,144 +122,18 @@ line-height: 20px; letter-spacing: -0.006em; text-align: left; - color: #969696cc; + color: rgba(150, 150, 150, 0.8); } } } -} -.availabilities-actions { - padding: 1rem; - display: flex; - align-items: center; - justify-content: flex-end; -} + .space-allocation { + flex-direction: column; -.availabilities-loader { - margin: auto; - display: block; -} - -.availabilities-header { - position: relative; -} - -.availabilities-content { - display: flex; - flex-direction: column; -} - -.nodeSpaceAllocation-bar { - background-color: var(--codex-background-light); - padding: 0.25rem; - border-radius: var(--codex-border-radius); -} - -.availabilities-space-allocation .nodeSpaceAllocation-legendRow, -.availabilities-space-allocation .nodeSpaceAllocation-barItem { - transition: opacity 0.35s; - opacity: 0.3; -} - -.availabilities-space-allocation .nodeSpaceAllocation-barItem:hover { - opacity: 1; -} - -.availabilities-space-allocation { - flex: 1; -} -/* -// This isn't the best approach, but it will suffice for now. -// The issue is that there is no sibling index to create a generic rule. -// Additionally, rerendering the components with React on hover feels like overkill. -// We are also uncertain about the number of availabilities that will be in the table, -// so this workaround is acceptable for the time being. -// @for $i from 1 through 30 { -// .availabilities-table:has(.table-tbodyTr:nth-child(#{$i}):hover) -// + .availabilities-space -// .nodeSpaceAllocation-barItem:nth-child(#{$i}), -// .availabilities-table:has(.table-tbodyTr:nth-child(#{$i}):hover) -// + .availabilities-space -// .nodeSpaceAllocation-legendRow:nth-child(#{$i}) { -// opacity: 1; -// } - -// .availabilities-table:has(.table-tbodyTr:nth-child(#{$i}):hover) -// + .availabilities-space -// .nodeSpaceAllocation-barItem:nth-child(#{$i})::after { -// opacity: 1; -// z-index: 1; -// } - -// .availabilities-table:has( -// ~ .availabilities-space -// .nodeSpaceAllocation-barItem:nth-child(#{$i}):hover -// ) -// .table-tbodyTr:nth-child(#{$i}) { -// background-color: var(--codex-background-light); -// } -// } -*/ - -.plus { - border-radius: 50%; - width: 5rem; - height: 5rem; - display: flex; - align-items: center; - justify-content: center; - position: absolute; - left: 0; - right: 0; - bottom: 0; - top: 0; - margin: auto; - z-index: 1; -} - -.plus .button-label { - display: none; -} - -.progress { - border: 1px solid var(--codex-border-color); - height: 8px; - width: 200px; - border-radius: var(--codex-border-radius); - background-color: var(--codex-background); - display: flex; -} - -.progress-bar { - height: 100%; - background-color: var(--codex-progress-bar); - display: inline-block; - border-radius: var(--codex-border-radius); -} - -.progress-container { - text-align: right; - display: flex; - flex-direction: column; - gap: 0.5rem; - align-items: center; -} - -.slot { - background-color: transparent; - background-image: repeating-linear-gradient( - -45deg, - transparent, - transparent 1rem, - rgb(var(--codex-color-primary-rgb)) 1rem, - rgb(var(--codex-color-primary-rgb)) 1.5rem - ); - background-size: 200% 200%; - animation: barberpole 10s linear infinite; -} - -@keyframes barberpole { - 100% { - background-position: 100% 100%; + header { + width: 100%; + margin-bottom: 0; + margin-top: 0; + } } } diff --git a/src/routes/dashboard/availabilities.tsx b/src/routes/dashboard/availabilities.tsx index dc22f94..20d83f1 100644 --- a/src/routes/dashboard/availabilities.tsx +++ b/src/routes/dashboard/availabilities.tsx @@ -1,6 +1,3 @@ -import { createFileRoute } from "@tanstack/react-router"; -import { ErrorBoundary } from "@sentry/react"; -import { ErrorPlaceholder } from "../../components/ErrorPlaceholder/ErrorPlaceholder"; import { Button, SpaceAllocationItem, @@ -13,10 +10,9 @@ import "./availabilities.css"; import { AvailabilitiesTable } from "../../components/Availability/AvailabilitiesTable"; import { AvailabilityEdit } from "../../components/Availability/AvailabilityEdit"; import { Strings } from "../../utils/strings"; -import { PrettyBytes } from "../../utils/bytes"; +import { Bytes } from "../../utils/bytes"; import { Sunburst } from "../../components/Availability/Sunburst"; import { Errors } from "../../utils/errors"; -import { availabilityColors } from "../../components/Availability/availability.colors"; import { AvailabilityWithSlots } from "../../components/Availability/types"; import { WebStorage } from "../../utils/web-storage"; import { NodeSpace } from "../../components/NodeSpace/NodeSpace"; @@ -31,7 +27,7 @@ const defaultSpace = { totalBlocks: 0, }; -export function Availabilities() { +export function AvailabilitiesRoute() { { // Error will be catched in ErrorBounday const { data: availabilities = [], isPending } = useQuery< @@ -115,8 +111,8 @@ export function Availabilities() { (a, index) => ({ title: Strings.shortId(a.id), size: a.totalSize, - tooltip: a.id + "\u000D\u000A" + PrettyBytes(a.totalSize), - color: availabilityColors[index], + tooltip: a.id + "\u000D\u000A" + Bytes.pretty(a.totalSize), + color: AvailabilityUtils.availabilityColors[index], }) ); @@ -128,7 +124,7 @@ export function Availabilities() { if (isPending) { return ( -
    +
    ); @@ -174,7 +170,7 @@ export function Availabilities() {
    Node - {PrettyBytes(space.quotaMaxBytes)} allocated for the node + {Bytes.pretty(space.quotaMaxBytes)} allocated for the node
    @@ -183,14 +179,3 @@ export function Availabilities() { ); } } - -export const Route = createFileRoute("/dashboard/availabilities")({ - component: () => ( - ( - - )}> - - - ), -}); diff --git a/src/routes/dashboard/index.css b/src/routes/dashboard/dashboard.css similarity index 78% rename from src/routes/dashboard/index.css rename to src/routes/dashboard/dashboard.css index ddac5ec..65b8456 100644 --- a/src/routes/dashboard/index.css +++ b/src/routes/dashboard/dashboard.css @@ -13,11 +13,11 @@ @media (min-width: 1600px) { & { - flex: 1 1 23%; + flex: 1 1 35%; } &.welcome-card { - flex: 1 1 30%; + flex: 1 1 35%; } &.card--main--files { @@ -37,24 +37,30 @@ font-weight: 700; line-height: 14.52px; letter-spacing: 0.01em; - color: #969696cc; + color: rgba(150, 150, 150, 0.8); text-transform: uppercase; } h4 { font-family: Inter; - font-size: 32px; + font-size: 16px; font-weight: 400; - line-height: 38.73px; letter-spacing: 0.01em; color: white; + + @media (min-width: 801px) { + & { + font-size: 32px; + line-height: 38.73px; + } + } } .emoji { border-radius: 50%; width: 52px; height: 52px; - background-color: #4a9a73; + background-color: rgb(74, 154, 115); display: flex; align-items: center; justify-content: center; @@ -89,4 +95,11 @@ flex-basis: 66%; } } + + .gauge { + position: absolute; + left: 0; + right: 0; + margin: auto; + } } diff --git a/src/routes/dashboard/index.tsx b/src/routes/dashboard/dashboard.tsx similarity index 87% rename from src/routes/dashboard/index.tsx rename to src/routes/dashboard/dashboard.tsx index 7d3c8d7..15531d9 100644 --- a/src/routes/dashboard/index.tsx +++ b/src/routes/dashboard/dashboard.tsx @@ -1,8 +1,7 @@ -import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { Files } from "../../components/Files/Files.tsx"; import { WelcomeCard } from "../../components/Welcome/WelcomeCard.tsx"; import { Download } from "../../components/Download/Download.tsx"; -import "./index.css"; +import "./dashboard.css"; import { Versions } from "../../components/Versions/Versions.tsx"; import { WebStorage } from "../../utils/web-storage.ts"; import { ConnectedAccount } from "../../components/ConnectedAccount/ConnectedAccount.tsx"; @@ -19,14 +18,11 @@ import DownloadIcon from "../../assets/icons/download.svg?react"; import FetchIcon from "../../assets/icons/fetch.svg?react"; import { ManifestFetch } from "../../components/ManifestFetch/ManifestFetch.tsx"; import FilesIconOutline from "../../assets/icons/files-outline.svg?react"; +import { useNavigate } from "react-router-dom"; -export const Route = createFileRoute("/dashboard/")({ - component: Dashboard, -}); - -function Dashboard() { +export function DashboardRoute() { const username = WebStorage.onBoarding.getDisplayName(); - const naviguate = useNavigate({ from: window.location.pathname }); + const naviguate = useNavigate(); const emoji = WebStorage.onBoarding.getEmoji(); return ( @@ -56,14 +52,14 @@ function Dashboard() { icon={} title="Storage" buttonLabel="Details" - buttonAction={() => naviguate({ to: "/dashboard/availabilities" })}> + buttonAction={() => naviguate("/dashboard/availabilities")}> } title="Peers" buttonLabel="Details" - buttonAction={() => naviguate({ to: "/dashboard/peers" })}> + buttonAction={() => naviguate("/dashboard/peers")}>
    diff --git a/src/routes/dashboard/device.tsx b/src/routes/dashboard/device.tsx deleted file mode 100644 index 049ff50..0000000 --- a/src/routes/dashboard/device.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { createFileRoute } from "@tanstack/react-router"; - -export const Route = createFileRoute("/dashboard/device")({ - component: () =>
    Hello /dashboard/device!
    , -}); diff --git a/src/routes/dashboard/disclaimer.css b/src/routes/dashboard/disclaimer.css index ad2febf..d8c674d 100644 --- a/src/routes/dashboard/disclaimer.css +++ b/src/routes/dashboard/disclaimer.css @@ -2,13 +2,13 @@ max-width: 600px; margin: auto; padding: 32px; -} -.disclaimer-title { - margin-bottom: 3rem; - margin-top: 3rem; -} + h1 { + margin-bottom: 3rem; + margin-top: 3rem; + } -.disclaimer-text { - line-height: 1.5rem; + p { + line-height: 1.5rem; + } } diff --git a/src/routes/dashboard/disclaimer.tsx b/src/routes/dashboard/disclaimer.tsx index 2e3d41f..dbe7dfd 100644 --- a/src/routes/dashboard/disclaimer.tsx +++ b/src/routes/dashboard/disclaimer.tsx @@ -1,39 +1,33 @@ -import { createFileRoute } from "@tanstack/react-router"; import "./disclaimer.css"; -export const Route = createFileRoute("/dashboard/disclaimer")({ - component: () => ( -
    -
    -

    Disclaimer

    +export const DisclaimerRoute = () => ( +
    +

    Disclaimer

    -

    - The website and the content herein is not intended for public use and - is for informational and demonstration purposes only. -

    +

    + The website and the content herein is not intended for public use and is + for informational and demonstration purposes only. +

    -
    +
    -

    - The website and any associated functionalities are provided on an “as - is” basis without any guarantees, warranties, or representations of - any kind, either express or implied. The website and any associated - functionalities may not reflect the final version of the project and - is subject to changes, updates, or removal at any time and without - notice. -

    +

    + The website and any associated functionalities are provided on an “as is” + basis without any guarantees, warranties, or representations of any kind, + either express or implied. The website and any associated functionalities + may not reflect the final version of the project and is subject to + changes, updates, or removal at any time and without notice. +

    -
    +
    -

    - By accessing and using this website, you agree that we, Logos - Collective Association and its affiliates, will not be liable for any - direct, indirect, incidental, or consequential damages arising from - the use of, or inability to use, this website. Any data, content, or - interactions on this site are non-binding and should not be considered - final or actionable. Your use of this website is at your sole risk. -

    -
    -
    - ), -}); +

    + By accessing and using this website, you agree that we, Logos Collective + Association and its affiliates, will not be liable for any direct, + indirect, incidental, or consequential damages arising from the use of, or + inability to use, this website. Any data, content, or interactions on this + site are non-binding and should not be considered final or actionable. + Your use of this website is at your sole risk. +

    +
    +); diff --git a/src/routes/dashboard/favorites.tsx b/src/routes/dashboard/favorites.tsx deleted file mode 100644 index c96d39f..0000000 --- a/src/routes/dashboard/favorites.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { createFileRoute } from "@tanstack/react-router"; -import { Files } from "../../components/Files/Files"; -import { ErrorBoundary } from "@sentry/react"; -import { ErrorPlaceholder } from "../../components/ErrorPlaceholder/ErrorPlaceholder"; - -export const Route = createFileRoute("/dashboard/favorites")({ - component: () => ( - <> - ( - - )}> -
    - -
    -
    - - ), -}); diff --git a/src/routes/dashboard/files.tsx b/src/routes/dashboard/files.tsx index 39092ba..fa9b860 100644 --- a/src/routes/dashboard/files.tsx +++ b/src/routes/dashboard/files.tsx @@ -1,4 +1,3 @@ -import { createFileRoute } from "@tanstack/react-router"; import { Files } from "../../components/Files/Files"; import "./files.css"; import { UploadCard } from "../../components/UploadCard/UploadCard"; @@ -10,28 +9,24 @@ import FetchIcon from "../../assets/icons/fetch.svg?react"; import { Card } from "../../components/Card/Card"; import FilesIconOutline from "../../assets/icons/files-outline.svg?react"; -export const Route = createFileRoute("/dashboard/files")({ - component: () => ( -
    - } - title="Files"> - +export const FilesRoute = () => ( +
    + } title="Files"> + + + +
    - ), -}); + } title="Fetch manifest"> + + + +
    +); diff --git a/src/routes/dashboard/help.css b/src/routes/dashboard/help.css index eeeef17..5793bf0 100644 --- a/src/routes/dashboard/help.css +++ b/src/routes/dashboard/help.css @@ -1,44 +1,44 @@ .help { max-width: 600px; margin: auto; -} -.help-title { - margin-bottom: 3rem; - margin-top: 3rem; -} + h1 { + margin-bottom: 3rem; + margin-top: 3rem; + } -.help-text { - color: var(--codex-color-light); -} + > div { + padding-bottom: 2rem; + margin-bottom: 2rem; + border-bottom: 1px solid rgba(150, 150, 150, 0.2); + gap: 1rem; + display: flex; + align-items: flex-start; -.help-itemTitle { - font-size: 1.125rem; - line-height: 1.75rem; - font-weight: bold; - margin-bottom: 0.75rem; -} + div { + font-size: 1.125rem; + } + } -.help-itemIcon { - color: var(--codex-color-disabled); - min-width: 1.5rem; - height: auto; -} + h2 { + font-size: 1.125rem; + line-height: 1.75rem; + font-weight: bold; + margin-bottom: 0.75rem; + } -.help-itemBody { - font-size: 1.125rem; -} + p { + color: rgb(150 150 150); + } -.help-item { - padding-bottom: 2rem; - margin-bottom: 2rem; - border-bottom: 1px solid var(--codex-border-color); - gap: 1rem; - display: flex; - align-items: flex-start; -} + svg { + color: rgb(113, 113, 113); + min-width: 1.5rem; + height: auto; + } -.help-link { - color: var(--codex-color-primary); - text-decoration: underline; + a { + color: var(--codex-color-primary); + text-decoration: underline; + } } diff --git a/src/routes/dashboard/help.tsx b/src/routes/dashboard/help.tsx index d72e760..78afbfc 100644 --- a/src/routes/dashboard/help.tsx +++ b/src/routes/dashboard/help.tsx @@ -1,10 +1,9 @@ -import { createFileRoute } from "@tanstack/react-router"; import "./help.css"; -import { HelpCircle } from "lucide-react"; import { useEffect } from "react"; import * as Sentry from "@sentry/react"; +import HelpIcon from "../../assets/icons/help.svg?react"; -const Help = () => { +export const HelpRoute = () => { useEffect(() => { const feedback = Sentry.feedbackIntegration({ // Additional SDK configuration goes in here, for example: @@ -18,99 +17,88 @@ const Help = () => { }, []); return ( -
    -
    -

    You might be wondering...

    +
    +

    You might be wondering...

    -
    - -
    -

    What's Codex?

    -

    - Codex is a decentralised data storage platform that provides - exceptionally strong censorship resistance and durability - guarantees. It serves as the storage layer of the Logos tech - stack. -

    -
    +
    + +
    +

    What's Codex?

    +

    + Codex is a decentralised data storage platform that provides + exceptionally strong censorship resistance and durability + guarantees. It serves as the storage layer of the Logos tech stack. +

    +
    -
    - -
    -

    - What is the purpose of this web application? -

    -

    - This application allows you to interact with the Codex Marketplace - network in a user-friendly manner. -

    -
    +
    + +
    +

    What is the purpose of this web application?

    +

    + This application allows you to interact with the Codex Marketplace + network in a user-friendly manner. +

    +
    -
    - -
    -

    Can Codex handle big files ?

    -

    - Codex can handle very large files, which is its main purpose. - However, for this UI, the files used should not be too large. -

    -
    +
    + +
    +

    Can Codex handle big files ?

    +

    + Codex can handle very large files, which is its main purpose. + However, for this UI, the files used should not be too large. +

    +
    -
    - -
    -

    Is it production ready ?

    -

    - Not at all! This is a very early alpha version. You should expect - to encounter bugs, but don't worry—feel free to reach out to us if - you need assistance. -

    -
    +
    + +
    +

    Is it production ready ?

    +

    + Not at all! This is a very early alpha version. You should expect to + encounter bugs, but don't worry—feel free to reach out to us if you + need assistance. +

    +
    -
    - -
    -

    - How can I reach you if I am stuck ? -

    -

    - Please create a new issue on our GitHub repository  - - https://github.com/codex-storage/codex-marketplace-ui - - . -

    -
    +
    + +
    +

    How can I reach you if I am stuck ?

    +

    + Please create a new issue on our GitHub repository  + + https://github.com/codex-storage/codex-marketplace-ui + + . +

    +
    -
    - -
    -

    How can I build and run Codex ?

    -

    - For instructions, please visit{" "} - - https://docs.codex.storage - - . -

    -
    +
    + +
    +

    How can I build and run Codex ?

    +

    + For instructions, please visit{" "} + + https://docs.codex.storage + + . +

    ); }; - -export const Route = createFileRoute("/dashboard/help")({ - component: Help, -}); diff --git a/src/routes/dashboard/logs.css b/src/routes/dashboard/logs.css index 75107a5..653c501 100644 --- a/src/routes/dashboard/logs.css +++ b/src/routes/dashboard/logs.css @@ -1,10 +1,17 @@ .logs-card { display: flex; justify-content: space-between; - border: 1px solid #96969633; + border: 1px solid rgba(150, 150, 150, 0.2); border-radius: 16px; margin-bottom: 16px; + @media (max-width: 800px) { + & { + flex-direction: column; + gap: 16px; + } + } + > div:first-child { padding: 16px; } @@ -24,12 +31,23 @@ font-weight: 400; line-height: 16px; text-align: left; - color: #969696cc; + color: rgba(150, 150, 150, 0.8); } .button { - width: 187px; gap: 8px; + + @media (min-width: 801px) { + & { + width: 187px; + } + } + + @media (max-width: 800px) { + span { + display: none; + } + } } } @@ -42,7 +60,7 @@ line-height: 24px; letter-spacing: -0.011em; text-align: left; - color: #757575; + color: rgb(117, 117, 117); } } } diff --git a/src/routes/dashboard/logs.tsx b/src/routes/dashboard/logs.tsx index 8b5ee93..7ef6feb 100644 --- a/src/routes/dashboard/logs.tsx +++ b/src/routes/dashboard/logs.tsx @@ -1,4 +1,3 @@ -import { createFileRoute } from "@tanstack/react-router"; import "./logs.css"; import { RequireAssitance } from "../../components/RequireAssitance/RequireAssitance"; import { LogLevel } from "../../components/LogLevel/LogLevel"; @@ -11,7 +10,7 @@ const throwOnError = false; // Sentry.showReportDialog({}); -const Logs = () => { +export const LogsRoute = () => { const { data } = useDebug(throwOnError); useEffect(() => { @@ -26,6 +25,7 @@ const Logs = () => { }; }, []); + /* eslint-disable @typescript-eslint/no-unused-vars */ const { table, ...rest } = data ?? {}; return ( @@ -55,7 +55,3 @@ const Logs = () => {
    ); }; - -export const Route = createFileRoute("/dashboard/logs")({ - component: Logs, -}); diff --git a/src/routes/dashboard/nodes.tsx b/src/routes/dashboard/nodes.tsx deleted file mode 100644 index c8d1738..0000000 --- a/src/routes/dashboard/nodes.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { createFileRoute } from '@tanstack/react-router' - -export const Route = createFileRoute('/dashboard/nodes')({ - component: () =>
    Hello /nodes!
    , -}) diff --git a/src/components/Peers/Peers.css b/src/routes/dashboard/peers.css similarity index 70% rename from src/components/Peers/Peers.css rename to src/routes/dashboard/peers.css index 18669ad..851cf1e 100644 --- a/src/components/Peers/Peers.css +++ b/src/routes/dashboard/peers.css @@ -9,13 +9,12 @@ } > div:first-child { - width: calc(100% - 16px); - border: 1px solid #96969633; - padding: 16px; + width: 100%; + border: 1px solid rgba(150, 150, 150, 0.2); border-radius: 16px; position: relative; - @media (min-width: 1000px) { + @media (min-width: 801px) { & { width: calc(100% - 128px - 16px); padding: 16px 16px 16px 128px; @@ -26,7 +25,7 @@ ul { display: none; - @media (min-width: 1000px) { + @media (min-width: 801px) { & { list-style-type: none; width: 71px; @@ -38,7 +37,7 @@ } li { - border-bottom: 1px solid #969696cc; + border-bottom: 1px solid rgba(150, 150, 150, 0.8); padding: 16px 0; text-align: right; } @@ -49,7 +48,7 @@ line-height: 20px; letter-spacing: -0.006em; text-align: left; - color: #7b7b7b; + color: rgb(123, 123, 123); } li:not(:first-child) { @@ -89,29 +88,23 @@ } .connections { - background-color: #232323; - border: 1px solid #96969633; + background-color: rgb(35, 35, 35); + border: 1px solid rgba(150, 150, 150, 0.2); border-radius: 16px; max-width: 280px; padding: 16px; - transform: scale(0.7); + /* transform: scale(0.7); */ width: 280px; - @media (max-width: 999px) { + @media (max-width: 800px) { & { position: relative; - bottom: -32px; - left: -32px; + width: calc(100% - 32px); + max-width: inherit; } } - @media (min-width: 1000px) { - & { - transform: scale(1); - } - } - - @media (min-width: 1000px) { + @media (min-width: 801px) { & { position: absolute; bottom: 16px; @@ -124,9 +117,9 @@ display: flex; align-items: center; gap: 8px; - color: #969696; + color: rgba(150, 150, 150, 1); padding-bottom: 16px; - border-bottom: 1px solid #96969633; + border-bottom: 1px solid rgba(150, 150, 150, 0.2); span { font-family: Inter; @@ -139,7 +132,7 @@ } footer { - border-top: 1px solid #96969633; + border-top: 1px solid rgba(150, 150, 150, 0.2); padding-top: 16px; } } @@ -160,25 +153,34 @@ border-radius: 8px; &.status--active { - color: #1daf61; - background-color: #6fcb9433; + color: rgb(29, 175, 97); + background-color: rgb(111, 203, 148, 0.2); } &.status--inactive { - color: #fb3748; - background-color: #fb374833; + color: rgb(251, 55, 72); + background-color: rgb(251, 55, 72, 0.2); } } } - } - .peers-chart { - transform: scale(0.5); - - @media (min-width: 1000px) { - & { - transform: scale(0.73); + @media (max-width: 800px) { + th:nth-child(2), + td:nth-child(2) { + display: none; } } } + + .gauge { + margin: auto; + } + + @media (max-width: 800px) { + .peers-chart { + transform: scale(0.8); + margin: auto; + left: 0; + } + } } diff --git a/src/routes/dashboard/peers.tsx b/src/routes/dashboard/peers.tsx index a9c8827..eb884fa 100644 --- a/src/routes/dashboard/peers.tsx +++ b/src/routes/dashboard/peers.tsx @@ -1,15 +1,111 @@ -import { ErrorBoundary } from "@sentry/react"; -import { ErrorPlaceholder } from "../../components/ErrorPlaceholder/ErrorPlaceholder"; -import { createFileRoute } from "@tanstack/react-router"; -import { Peers } from "../../components/Peers/Peers"; +import { + TabSortState, + Row, + Cell, + Table, +} from "@codex-storage/marketplace-ui-components"; +import { useCallback, useState } from "react"; +import { PeerCountryCell } from "../../components/Peers/PeerCountryCell"; +import "./peers.css"; +import { + PeerGeo, + PeerNode, + PeerSortFn, + PeerUtils, +} from "../../components/Peers/peers.utils"; +import { PeersMap } from "../../components/Peers/PeersMap"; +import { useDebug } from "../../hooks/useDebug"; +import { PeersQuality } from "../../components/Peers/PeersQuality"; +import { PeersChart } from "../../components/Peers/PeersChart"; +import SuccessCircleIcon from "../../assets/icons/success-circle.svg?react"; +import ErrorCircleIcon from "../../assets/icons/error-circle.svg?react"; +import PeersIcon from "../../assets/icons/peers.svg?react"; -export const Route = createFileRoute("/dashboard/peers")({ - component: () => ( - ( - - )}> - - - ), -}); +const throwOnError = true; + +export const PeersRoute = () => { + const { data } = useDebug(throwOnError); + const [ips, setIps] = useState>({}); + + const onPinAdd = useCallback((node: PeerNode, geo: PeerGeo) => { + const [ip = ""] = node.address.split(":"); + setIps((ips) => ({ ...ips, [ip]: geo })); + }, []); + + const [sortFn, setSortFn] = useState(() => + PeerUtils.sortByBoolean("desc") + ); + + const onSortByCountry = (state: TabSortState) => + setSortFn(() => PeerUtils.sortByCountry(state, ips)); + + const onSortActive = (state: TabSortState) => + setSortFn(() => PeerUtils.sortByBoolean(state)); + + const headers = [ + ["Country", onSortByCountry], + ["PeerId"], + ["Active", onSortActive], + ] satisfies [string, ((state: TabSortState) => void)?][]; + + const nodes = data?.table.nodes || []; + const sorted = sortFn ? nodes.slice().sort(sortFn) : nodes; + + const rows = sorted.map((node) => { + const [ip = ""] = node.address.split(":"); + const geo = ips[ip]; + + return ( + , + {node.peerId}, + + {node.seen ? ( +
    + Active +
    + ) : ( +
    + Inactive +
    + )} +
    , + ]}>
    + ); + }); + + const actives = PeerUtils.countActives(sorted); + const degrees = PeerUtils.calculareDegrees(sorted); + const good = PeerUtils.isGoodQuality(actives); + + return ( +
    +
    + +
    +
      +
    • Legend
    • +
    • 1-3
    • +
    • 3-5
    • +
    • 5 +
    • +
    +
    +
    + + Connections +
    +
    + +
    +
    + +
    +
    +
    +
    + +
    + + ); +}; diff --git a/src/routes/dashboard/purchases.css b/src/routes/dashboard/purchases.css index afb1ae9..c26a437 100644 --- a/src/routes/dashboard/purchases.css +++ b/src/routes/dashboard/purchases.css @@ -8,18 +8,20 @@ .table { table thead tr th { - background-color: #14141499; + background-color: rgba(20, 20, 20, 0.6); + } + + @media (max-width: 800px) { + th:nth-child(2), + td:nth-child(2), + th:nth-child(3), + td:nth-child(3), + th:nth-child(5), + td:nth-child(5), + th:nth-child(6), + td:nth-child(6) { + display: none; + } } } } - -.purchases-loader { - margin: auto; - display: block; -} - -@media (max-width: 800px) { - .purchases-modal { - width: calc(100% - 2rem); - } -} diff --git a/src/routes/dashboard/purchases.tsx b/src/routes/dashboard/purchases.tsx index dbf0039..cde4d80 100644 --- a/src/routes/dashboard/purchases.tsx +++ b/src/routes/dashboard/purchases.tsx @@ -1,31 +1,24 @@ -import { createFileRoute } from "@tanstack/react-router"; import { StorageRequestCreate } from "../../components/StorageRequestSetup/StorageRequestCreate"; import "./purchases.css"; import { ErrorPlaceholder } from "../../components/ErrorPlaceholder/ErrorPlaceholder"; import { ErrorBoundary } from "@sentry/react"; import { PurchasesTable } from "../../components/Purchase/PurchasesTable"; -const Purchases = () => { +export const PurchasesRoute = () => { return ( -
    -
    - -
    - -
    - -
    -
    - ); -}; - -export const Route = createFileRoute("/dashboard/purchases")({ - component: () => ( ( )}> - +
    +
    + +
    + +
    + +
    +
    - ), -}); + ); +}; diff --git a/src/routes/dashboard/requests.css b/src/routes/dashboard/requests.css deleted file mode 100644 index c004805..0000000 --- a/src/routes/dashboard/requests.css +++ /dev/null @@ -1,7 +0,0 @@ -.requests { - display: flex; - flex-direction: column; - align-items: center; - justify-content: center; - background-color: var(--codex-background-light); -} diff --git a/src/routes/dashboard/requests.tsx b/src/routes/dashboard/requests.tsx deleted file mode 100644 index f688115..0000000 --- a/src/routes/dashboard/requests.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import { createFileRoute } from "@tanstack/react-router"; -import "./requests.css"; -import { StorageRequestSetup } from "../../components/StorageRequestSetup/StorageRequestSetup"; - -export const Route = createFileRoute("/dashboard/requests")({ - component: () => { - return ( -
    -
    - - -
    - ); - }, -}); diff --git a/src/routes/dashboard/settings.css b/src/routes/dashboard/settings.css index c4379c2..adcb085 100644 --- a/src/routes/dashboard/settings.css +++ b/src/routes/dashboard/settings.css @@ -24,7 +24,7 @@ .user-info { padding-bottom: 16px; margin-bottom: 16px; - border-bottom: 1px solid #96969633; + border-bottom: 1px solid rgba(150, 150, 150, 0.2); } } @@ -41,19 +41,8 @@ .address svg { top: 55px; } -} -/* -.settings-title { - font-weight: bold; - font-size: 1.125rem; - line-height: 1.75rem; - margin-bottom: 0.75rem; -} -.settings-input { - margin-bottom: 0.75rem; + .input input { + --codex-input-background-color: rgba(35, 35, 35, 1); + } } - -.settings-debug-loader { - margin: auto; -} */ diff --git a/src/routes/dashboard/settings.tsx b/src/routes/dashboard/settings.tsx index 182fe10..5478c67 100644 --- a/src/routes/dashboard/settings.tsx +++ b/src/routes/dashboard/settings.tsx @@ -1,4 +1,3 @@ -import { createFileRoute } from "@tanstack/react-router"; import "./settings.css"; import { ErrorBoundary } from "@sentry/react"; import { ErrorPlaceholder } from "../../components/ErrorPlaceholder/ErrorPlaceholder"; @@ -9,79 +8,40 @@ import Logo from "../../assets/icons/logo.svg?react"; import { Versions } from "../../components/Versions/Versions"; import { BackgroundImage } from "../../components/BackgroundImage/BackgroundImage"; -export const Route = createFileRoute("/dashboard/settings")({ - component: () => ( -
    -
    -
    - - -
    - -
    -
    -

    Personalization

    - ( - - )}> - - - -

    Connection

    - - ( - - )}> - {}} /> - -
    - - - - {/*
    - ( - - )}> - - +export const SettingsRoute = () => ( +
    +
    +
    + +
    + +
    +
    +

    Personalization

    + ( + + )}> + + -
    - { - useEffect(() => { - document.addEventListener("codexinvalidatequeries", resetError); +

    Connection

    - return () => { - document.removeEventListener( - "codexinvalidatequeries", - resetError - ); - }; - }, [resetError]); + ( + + )}> + {}} /> + +
    - return ( - - ); - }}> - - -
    */} -
    - ), -}); + +
    +); diff --git a/src/routes/dashboard/wallet.css b/src/routes/dashboard/wallet.css index d6fda3f..4092469 100644 --- a/src/routes/dashboard/wallet.css +++ b/src/routes/dashboard/wallet.css @@ -1,25 +1,39 @@ .wallet-page { display: flex; gap: 16px; + flex-wrap: wrap; .card { + flex: 1; filter: grayscale(30); transition: filter 0.5s; &:hover { filter: none; } + + > ul li { + border-bottom: 1px solid rgba(150, 150, 150, 0.2); + margin-bottom: 16px; + padding-bottom: 16px; + } } .buttons { - display: flex; justify-content: space-between; margin-top: 16px; margin-bottom: 16px; - border-top: 1px solid #96969633; - border-bottom: 1px solid #96969633; + border-top: 1px solid rgba(150, 150, 150, 0.2); + border-bottom: 1px solid rgba(150, 150, 150, 0.2); padding-top: 16px; padding-bottom: 16px; + display: none; + + @media (min-width: 801px) { + & { + display: flex; + } + } div { display: flex; @@ -34,34 +48,30 @@ font-weight: 500; line-height: 16px; text-align: left; - color: #969696; + color: rgba(150, 150, 150, 1); } } span { height: 36px; width: 1px; - background-color: #ffffff33; + background-color: rgb(255, 255, 255, 0.2); margin: auto 0; } } .button-icon { - background-color: #2f2f2f; + background-color: rgb(47, 47, 47); height: 60px; width: 60px; - color: #96969666; - border: 0.75px solid #96969633; + color: rgb(150, 150, 150, 0.4); + border: 0.75px solid rgba(150, 150, 150, 0.2); svg { mix-blend-mode: unset; } } - .card { - flex: 1; - } - .require-assistance { max-height: 145px; margin-top: 8px; @@ -80,7 +90,7 @@ align-items: center; justify-content: center; gap: 8px; - color: #969696; + color: rgba(150, 150, 150, 1); font-size: 20px; } } @@ -98,9 +108,6 @@ li { display: flex; gap: 48px; - border-bottom: 1px solid #96969633; - margin-bottom: 16px; - padding-bottom: 16px; div { display: flex; @@ -114,7 +121,7 @@ line-height: 20px; letter-spacing: -0.006em; text-align: left; - color: #ffffffb2; + color: rgb(255, 255, 255, 0.7); } p { diff --git a/src/routes/dashboard/wallet.tsx b/src/routes/dashboard/wallet.tsx index 247d9bb..b43a61f 100644 --- a/src/routes/dashboard/wallet.tsx +++ b/src/routes/dashboard/wallet.tsx @@ -1,4 +1,3 @@ -import { createFileRoute } from "@tanstack/react-router"; import { ConnectedAccount } from "../../components/ConnectedAccount/ConnectedAccount"; import { Card } from "../../components/Card/Card"; import WalletIcon from "../../assets/icons/wallet.svg?react"; @@ -24,7 +23,7 @@ import { Tabs, } from "@codex-storage/marketplace-ui-components"; -const Wallet = () => { +export const WalletRoute = () => { const tabs: TabProps[] = [ { label: "Tokens", @@ -100,9 +99,7 @@ const Wallet = () => { - } - title="Activity"> + } title="">
    @@ -114,7 +111,3 @@ const Wallet = () => {
    ); }; - -export const Route = createFileRoute("/dashboard/wallet")({ - component: Wallet, -}); diff --git a/src/routes/onboarding-checks.tsx b/src/routes/onboarding-checks.tsx index 3d6a5ec..a6c3407 100644 --- a/src/routes/onboarding-checks.tsx +++ b/src/routes/onboarding-checks.tsx @@ -1,4 +1,3 @@ -import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { useState } from "react"; import { attributes } from "../utils/attributes"; import ArrowRightCircle from "../assets/icons/arrow-circle.svg?react"; @@ -7,12 +6,13 @@ import { HealthChecks } from "../components/HealthChecks/HealthChecks"; import { useNetwork } from "../network/useNetwork"; import { WebStorage } from "../utils/web-storage"; import AlphaIcon from "../assets/icons/alpha.svg?react"; +import { useNavigate } from "react-router-dom"; -const OnBoardingChecks = () => { +export const OnBoardingChecksRoute = () => { const online = useNetwork(); const displayName = WebStorage.onBoarding.getDisplayName(); const [isStepValid, setIsStepValid] = useState(false); - const navigate = useNavigate({ from: "/onboarding-checks" }); + const navigate = useNavigate(); // useEffect(() => { // const onKeyPress = (event: Event) => { @@ -31,7 +31,7 @@ const OnBoardingChecks = () => { const onNextStep = () => { if (isStepValid) { - navigate({ to: "/dashboard" }); + navigate("/dashboard"); } }; @@ -70,7 +70,3 @@ const OnBoardingChecks = () => { ); }; - -export const Route = createFileRoute("/onboarding-checks")({ - component: OnBoardingChecks, -}); diff --git a/src/routes/onboarding-name.tsx b/src/routes/onboarding-name.tsx index 834a2c6..dd10761 100644 --- a/src/routes/onboarding-name.tsx +++ b/src/routes/onboarding-name.tsx @@ -1,4 +1,3 @@ -import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { useState } from "react"; import { OnBoardingLayout } from "../components/OnBoarding/OnBoardingLayout"; import { attributes } from "../utils/attributes"; @@ -6,36 +5,22 @@ import ArrowRightCircle from "../assets/icons/arrow-circle.svg?react"; import { UserInfo } from "../components/UserInfo/UserInfo"; import { WebStorage } from "../utils/web-storage"; import AlphaIcon from "../assets/icons/alpha.svg?react"; +import { useNavigate } from "react-router-dom"; -const OnBoardingName = () => { +export const OnBoardingNameRoute = () => { const [isStepValid, setIsStepValid] = useState( !!WebStorage.onBoarding.getDisplayName() ); - const navigate = useNavigate({ from: "/onboarding-name" }); + const navigate = useNavigate(); const onNameChange = (value: string) => setIsStepValid(!!value); const onNextStep = () => { if (isStepValid) { - navigate({ to: "/onboarding-checks" }); + navigate("/onboarding-checks"); } }; - // useEffect(() => { - // const onKeyPress = (event: Event) => { - // const e = event as KeyboardEvent; - // if (e.key === "ArrowRight") { - // navigate({ to: "/onboarding-checks" }); - // } else if (e.key === "ArrowLeft") { - // navigate({ to: "/" }); - // } - // }; - - // document.addEventListener("keydown", onKeyPress); - - // return () => document.removeEventListener("keydown", onKeyPress); - // }, [navigate]); - return ( <> @@ -64,7 +49,3 @@ const OnBoardingName = () => { ); }; - -export const Route = createFileRoute("/onboarding-name")({ - component: OnBoardingName, -}); diff --git a/src/routes/index.tsx b/src/routes/onboarding.tsx similarity index 74% rename from src/routes/index.tsx rename to src/routes/onboarding.tsx index a79445e..5abf615 100644 --- a/src/routes/index.tsx +++ b/src/routes/onboarding.tsx @@ -1,50 +1,28 @@ -import { createFileRoute, useNavigate } from "@tanstack/react-router"; import { useState } from "react"; import { Modal } from "@codex-storage/marketplace-ui-components"; -import { ArrowRight } from "lucide-react"; import { OnBoardingLayout } from "../components/OnBoarding/OnBoardingLayout"; import AlphaIcon from "../assets/icons/alpha.svg?react"; import AlphaText from "../assets/icons/alphatext.svg?react"; -import ArrowRightCircle from "../assets/icons/arrow-circle.svg?react"; +import ArrowCircleIcon from "../assets/icons/arrow-circle.svg?react"; +import { useNavigate } from "react-router-dom"; +import ArrowIcon from "../assets/icons/arrow-onboarding.svg?react"; -export const Route = createFileRoute("/")({ - component: Index, - beforeLoad: async () => { - // throw redirect({ - // to: "/dashboard", - // }); - }, -}); - -function Index() { +export function OnBoardingRoute() { const [modal, setModal] = useState(false); - const navigate = useNavigate({ from: "/" }); + const navigate = useNavigate(); const onLegalDisclaimerOpen = () => setModal(true); const onLegalDisclaimerClose = () => setModal(false); - const onNextStep = () => navigate({ to: "/onboarding-name" }); - - // useEffect(() => { - // const onKeyPress = (event: Event) => { - // const e = event as KeyboardEvent; - // if (e.key === "ArrowRight") { - // navigate({ to: "/onboarding-name" }); - // } - // }; - - // document.addEventListener("keydown", onKeyPress); - - // return () => document.removeEventListener("keydown", onKeyPress); - // }, [navigate]); + const onNextStep = () => navigate("/onboarding-name"); return ( <> <>
    - +
    - Let’s get started + Let’s get started
    - + diff --git a/src/routes/layout.css b/src/routes/root.css similarity index 87% rename from src/routes/layout.css rename to src/routes/root.css index 16ec77c..d2ef3bd 100644 --- a/src/routes/layout.css +++ b/src/routes/root.css @@ -5,12 +5,12 @@ > main { flex: 1; - background-color: #141414; + background-color: rgb(20, 20, 20); > div { - padding: 16px; + padding: 8px; - @media (min-width: 1000px) { + @media (min-width: 800px) { padding: 24px 48px; } } @@ -50,7 +50,7 @@ font-weight: 500; line-height: 24px; letter-spacing: -0.011em; - color: #99a0ae; + color: rgb(153, 160, 174); } .dashboard-welcome-versionValue { diff --git a/src/routes/root.tsx b/src/routes/root.tsx new file mode 100644 index 0000000..a446afe --- /dev/null +++ b/src/routes/root.tsx @@ -0,0 +1,38 @@ +import "./root.css"; +import { Menu } from "../components/Menu/Menu"; +import { useCallback, useState } from "react"; +import { AppBar } from "../components/AppBar/AppBar"; +import { Backdrop } from "@codex-storage/marketplace-ui-components"; +import { Outlet, ScrollRestoration } from "react-router-dom"; +import { useIsMobile } from "../hooks/useMobile"; + +export const Root = () => { + const isMobile = useIsMobile(); + const [isExpanded, setIsExpanded] = useState(!isMobile); + + const onExpanded = useCallback((val: boolean) => setIsExpanded(val), []); + + const onIconClick = () => { + if (isMobile) { + setIsExpanded(true); + } + }; + + const onClose = () => setIsExpanded(false); + + return ( +
    + + +
    + +
    + + +
    +
    + + +
    + ); +}; diff --git a/src/utils/arrays.ts b/src/utils/arrays.ts deleted file mode 100644 index ab6ee1d..0000000 --- a/src/utils/arrays.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const Arrays = { - toggle: (arr: Array, value: T) => - arr.includes(value) ? arr.filter(i => i !== value) : [...arr, value] -} \ No newline at end of file diff --git a/src/utils/bytes.test.ts b/src/utils/bytes.test.ts new file mode 100644 index 0000000..1c7f3e6 --- /dev/null +++ b/src/utils/bytes.test.ts @@ -0,0 +1,12 @@ +import { assert, describe, it } from "vitest"; +import { Bytes } from "./bytes"; +import { GB } from "./constants"; + +describe("bytes", () => { + it("display the bytes", async () => { + assert.equal(Bytes.pretty(0), "0 B"); + assert.equal(Bytes.pretty(512), "512.0 B"); + assert.equal(Bytes.pretty(1025), "1.0 KB"); + assert.equal(Bytes.pretty(GB), "1.0 GB"); + }); +}) \ No newline at end of file diff --git a/src/utils/bytes.ts b/src/utils/bytes.ts index 7cf307a..a3171fe 100644 --- a/src/utils/bytes.ts +++ b/src/utils/bytes.ts @@ -1,14 +1,17 @@ -export const PrettyBytes = (bytes: number) => { - const sizes = ["bytes", "KB", "MB", "GB", "TB"]; - if (bytes == 0) { - return "0 b"; +export const Bytes = { + pretty(bytes: number) { + const sizes = ["B", "KB", "MB", "GB", "TB"]; + if (bytes == 0) { + return "0 B"; + } + + const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)).toString()); + + if (i == 0) { + return bytes.toFixed(1) + " " + sizes[i]; + } + + return (bytes / Math.pow(1024, i)).toFixed(1) + " " + sizes[i]; } - const i = parseInt(Math.floor(Math.log(bytes) / Math.log(1024)).toString()); - - if (i == 0) { - return bytes + " " + sizes[i]; - } - - return (bytes / Math.pow(1024, i)).toFixed(1) + " " + sizes[i]; -}; +} \ No newline at end of file diff --git a/src/utils/dates.ts b/src/utils/dates.ts deleted file mode 100644 index d34def9..0000000 --- a/src/utils/dates.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const Dates = { - format(date: number) { - if (!date) { - return "-"; - } - - return new Intl.DateTimeFormat("en-GB", { - dateStyle: "medium", - timeStyle: "short", - }).format(new Date(date * 1000)); - }, -}; diff --git a/src/utils/times.test.ts b/src/utils/times.test.ts new file mode 100644 index 0000000..e2cb3e2 --- /dev/null +++ b/src/utils/times.test.ts @@ -0,0 +1,28 @@ +import { assert, describe, it } from "vitest"; +import { Times } from "./times"; + +describe("times", () => { + it("display the times", async () => { + assert.equal(Times.pretty(0), "0 second"); + assert.equal(Times.pretty(2), "2 seconds"); + assert.equal(Times.pretty(60), "1 minute"); + assert.equal(Times.pretty(90), "1.5 minutes"); + assert.equal(Times.pretty(3600), "1 hour"); + assert.equal(Times.pretty(3600 * 2), "2 hours"); + assert.equal(Times.pretty(3600 * 24), "1 day"); + assert.equal(Times.pretty(3600 * 36), "1.5 days"); + assert.equal(Times.pretty(3600 * 24 * 30), "1 month"); + }); + + it("guess the time unit", async () => { + assert.equal(Times.unit(0), "hours"); + assert.equal(Times.unit(3600 * 24), "days"); + assert.equal(Times.unit(3600 * 24 * 30), "months"); + }) + + it("get the seconds for a time unit given", async () => { + assert.equal(Times.value("hours"), 3600); + assert.equal(Times.value("days"), 3600 * 24); + assert.equal(Times.value("months"), 3600 * 24 * 30); + }) +}) \ No newline at end of file diff --git a/src/utils/times.ts b/src/utils/times.ts index 1ff5c4d..055513b 100644 --- a/src/utils/times.ts +++ b/src/utils/times.ts @@ -6,31 +6,33 @@ export type TimesUnit = | "hours" | "seconds"; -const plural = (value: number, unit: TimesUnit) => - value > 1 ? value + ` ${unit}` : value + ` ${unit.slice(0, -1)}`; +const plural = (value: number, unit: TimesUnit) => { + const val = Number.isInteger(value) ? value : value.toFixed(1) + return value > 1 ? val + ` ${unit}` : val + ` ${unit.slice(0, -1)}`; +} export const Times = { toSeconds(value: number, unit: TimesUnit) { - let seconds = value; + let val = value; /* eslint-disable no-fallthrough */ switch (unit) { // @ts-expect-error - We don't want to break case "years": - seconds *= 365; + val *= 365; // @ts-expect-error - We don't want to break case "months": - seconds *= 30; + val *= 30; // @ts-expect-error - We don't want to break case "days": - seconds *= 24; + val *= 24; // @ts-expect-error - We don't want to break case "hours": - seconds *= 60; + val *= 60; case "minutes": - seconds *= 60; + val *= 60; } - return seconds; + return val; }, pretty(value: number) { @@ -62,7 +64,7 @@ export const Times = { return plural(value, "seconds"); }, - unit(value: number) { + unit(value: number): "months" | "days" | "hours" { let seconds = 30 * 24 * 60 * 60; if (value >= seconds) { @@ -77,7 +79,7 @@ export const Times = { return "hours" }, - unitValue(unit: "hours" | "days" | "months") { + value(unit: "hours" | "days" | "months") { switch (unit) { case "months": { return 30 * 24 * 60 * 60 @@ -90,4 +92,5 @@ export const Times = { } } } + }; diff --git a/vite.config.ts b/vite.config.ts index b4a2237..b3c28f0 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,12 +1,12 @@ -import { TanStackRouterVite } from "@tanstack/router-plugin/vite"; -import react from "@vitejs/plugin-react"; +// import react from "@vitejs/plugin-react"; import { defineConfig } from "vite"; import packageJson from "./package.json"; import svgr from "vite-plugin-svgr"; +import preact from '@preact/preset-vite' // https://vitejs.dev/config/ export default defineConfig({ - plugins: [TanStackRouterVite(), react(), svgr({ + plugins: [preact(), svgr({ svgrOptions: { plugins: ["@svgr/plugin-svgo", "@svgr/plugin-jsx"], svgoConfig: { @@ -43,7 +43,8 @@ export default defineConfig({ alias: { "../sdk/codex": "../proxy", "../../sdk/codex": "../../proxy", - "./port-forwarding.util": "../proxy", + react: 'preact/compat', + 'react-dom': 'preact/compat' }, }, });