diff --git a/apps/client/package.json b/apps/client/package.json
index f200659e8..5aeacd277 100644
--- a/apps/client/package.json
+++ b/apps/client/package.json
@@ -19,13 +19,13 @@
"axios": "^1.12.2",
"csv-stringify": "^6.6.0",
"prismjs": "^1.30.0",
+ "qrcode": "^1.5.4",
"react": "^19.2.3",
"react-colorful": "^5.6.1",
"react-dom": "^19.2.3",
"react-fast-compare": "^3.2.2",
"react-hook-form": "^7.62.0",
"react-icons": "5.5.0",
- "react-qr-code": "^2.0.18",
"react-router": "^7.11.0",
"react-simple-code-editor": "^0.14.1",
"react-virtuoso": "^4.17.0",
@@ -59,6 +59,7 @@
"devDependencies": {
"@sentry/vite-plugin": "5.1.1",
"@types/prismjs": "^1.26.6",
+ "@types/qrcode": "^1.5.6",
"@types/react": "^19.1.12",
"@types/react-dom": "^19.1.9",
"@vitejs/plugin-react": "5.2.0",
@@ -67,7 +68,7 @@
"ontime-utils": "workspace:*",
"sass": "^1.57.1",
"typescript": "catalog:",
- "vite": "7.3.1",
+ "vite": "8.0.1",
"vite-plugin-compression2": "2.5.1",
"vite-plugin-prismjs-plus": "1.1.1",
"vite-plugin-svgr": "4.5.0",
diff --git a/apps/client/src/common/components/qr-code/QrCode.module.scss b/apps/client/src/common/components/qr-code/QrCode.module.scss
new file mode 100644
index 000000000..39a30da51
--- /dev/null
+++ b/apps/client/src/common/components/qr-code/QrCode.module.scss
@@ -0,0 +1,22 @@
+@use '@/theme/viewerDefs' as *;
+
+.square {
+ border-radius: $component-border-radius-sm;
+ background-color: $viewer-color;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.blink {
+ animation: blink 1s ease-in-out infinite alternate;
+}
+
+@keyframes blink {
+ 0% {
+ opacity: 10%;
+ }
+ 100% {
+ opacity: 100%;
+ }
+}
diff --git a/apps/client/src/common/components/qr-code/QrCode.tsx b/apps/client/src/common/components/qr-code/QrCode.tsx
new file mode 100644
index 000000000..45813ece8
--- /dev/null
+++ b/apps/client/src/common/components/qr-code/QrCode.tsx
@@ -0,0 +1,43 @@
+import { toString } from 'qrcode';
+import { Suspense, use } from 'react';
+
+import { cx } from '../../utils/styleUtils';
+
+import style from './QrCode.module.scss';
+
+interface QRCodeProps {
+ value: string;
+ size: number;
+}
+
+export default function QRCode({ value, size }: QRCodeProps) {
+ 'use memo';
+ const svgPromise = toString(value, {
+ width: size,
+ margin: 2,
+ color: { dark: '#101010', light: '#cfcfcf' },
+ });
+
+ return (
+ }>
+
+
+ );
+}
+
+function QrFallback({ size }: { size: number }) {
+ 'use memo';
+ return ;
+}
+
+function QrSvg({ svgPromise, size }: { svgPromise: Promise; size: number }) {
+ 'use memo';
+ const svg = use(svgPromise);
+ return (
+
+ );
+}
diff --git a/apps/client/src/features/sharing/GenerateLinkForm.module.scss b/apps/client/src/features/sharing/GenerateLinkForm.module.scss
index b88daa3a1..5c1d572b6 100644
--- a/apps/client/src/features/sharing/GenerateLinkForm.module.scss
+++ b/apps/client/src/features/sharing/GenerateLinkForm.module.scss
@@ -1,9 +1,3 @@
-.qrCode {
- padding: 0.5rem;
- background: $ui-white;
- border-radius: 3px;
-}
-
.column {
margin-top: 1rem;
display: flex;
diff --git a/apps/client/src/features/sharing/GenerateLinkForm.tsx b/apps/client/src/features/sharing/GenerateLinkForm.tsx
index e0555b773..283694678 100644
--- a/apps/client/src/features/sharing/GenerateLinkForm.tsx
+++ b/apps/client/src/features/sharing/GenerateLinkForm.tsx
@@ -2,7 +2,6 @@ import { OntimeView, URLPreset } from 'ontime-types';
import { generateId } from 'ontime-utils';
import { useRef, useState } from 'react';
import { FieldErrors, useForm } from 'react-hook-form';
-import QRCode from 'react-qr-code';
import { generateUrl } from '../../common/api/session';
import { maybeAxiosError } from '../../common/api/utils';
@@ -10,6 +9,7 @@ import Button from '../../common/components/buttons/Button';
import CopyTag from '../../common/components/copy-tag/CopyTag';
import Info from '../../common/components/info/Info';
import Input from '../../common/components/input/input/Input';
+import QRCode from '../../common/components/qr-code/QrCode';
import Select from '../../common/components/select/Select';
import Switch from '../../common/components/switch/Switch';
import { useUpdateUrlPreset } from '../../common/hooks-query/useUrlPresets';
@@ -275,7 +275,7 @@ export default function GenerateLinkForm({ hostOptions, pathOptions, presets, is
Share this link
-
+
{url}
diff --git a/apps/client/src/views/backstage/Backstage.scss b/apps/client/src/views/backstage/Backstage.scss
index 1aaeb30bb..a02226a16 100644
--- a/apps/client/src/views/backstage/Backstage.scss
+++ b/apps/client/src/views/backstage/Backstage.scss
@@ -179,12 +179,6 @@
flex: 1;
}
- &__qr {
- padding: 0.5rem;
- background-color: $ui-white;
- border-radius: 2px;
- }
-
&__img {
padding: 0.5rem;
border-radius: 2px;
diff --git a/apps/client/src/views/backstage/Backstage.tsx b/apps/client/src/views/backstage/Backstage.tsx
index 0dd7c35ab..326938b57 100644
--- a/apps/client/src/views/backstage/Backstage.tsx
+++ b/apps/client/src/views/backstage/Backstage.tsx
@@ -2,9 +2,9 @@ import { useViewportSize } from '@mantine/hooks';
import { OntimeView, ProjectData } from 'ontime-types';
import { millisToString, removeLeadingZero } from 'ontime-utils';
import { useEffect, useMemo, useState } from 'react';
-import QRCode from 'react-qr-code';
import ProgressBar from '../../common/components/progress-bar/ProgressBar';
+import QRCode from '../../common/components/qr-code/QrCode';
import Empty from '../../common/components/state/Empty';
import EmptyPage from '../../common/components/state/EmptyPage';
import TitleCard from '../../common/components/title-card/TitleCard';
@@ -171,7 +171,7 @@ function Backstage({ events, customFields, projectData, isMirrored, settings }:
{extraInfo &&
}
- {projectData.url &&
}
+ {projectData.url &&
}
{projectData.info &&
{projectData.info}
}
diff --git a/e2e/tests/000-upload-showfile.spec.ts b/e2e/tests/000-upload-showfile.spec.ts
index ebbdb8201..180280fc4 100644
--- a/e2e/tests/000-upload-showfile.spec.ts
+++ b/e2e/tests/000-upload-showfile.spec.ts
@@ -7,7 +7,7 @@ const fileToUpload = 'e2e/tests/fixtures/e2e-test-db.json';
const fileToDownload = 'e2e/tests/fixtures/tmp/';
test('project file upload', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
// Try to close welcome modal if it appears (times out silently if not present)
try {
@@ -47,7 +47,7 @@ test('project file upload', async ({ page }) => {
//TODO: this works when testing locally, but not in github actions
test.fixme('project file download', async ({ page }) => {
- await page.goto('http://localhost:4001/editor/?settings=project__manage');
+ await page.goto('/editor/?settings=project__manage');
await page
.getByRole('row', { name: /.*currently loaded/i })
diff --git a/e2e/tests/002-view-navigation.spec.ts b/e2e/tests/002-view-navigation.spec.ts
index dabf5ac24..e970e162f 100644
--- a/e2e/tests/002-view-navigation.spec.ts
+++ b/e2e/tests/002-view-navigation.spec.ts
@@ -2,7 +2,7 @@ import { type Page, expect, test } from '@playwright/test';
test.describe('test view navigation feature', () => {
test.beforeEach(async ({ page }) => {
- await page.goto('http://localhost:4001/');
+ await page.goto('/');
await expect(page.locator('data-testid=timer-view')).toBeVisible();
});
@@ -10,51 +10,51 @@ test.describe('test view navigation feature', () => {
await openNavigationMenu(page);
await page.getByRole('button', { name: 'Timeline' }).click();
page.locator('data-testid=timeline-view');
- await expect(page).toHaveURL('http://localhost:4001/timeline');
+ await expect(page).toHaveURL('/timeline');
});
test('Backstage', async ({ page }) => {
await openNavigationMenu(page);
await page.getByRole('button', { name: 'Backstage' }).click();
page.locator('data-testid=backstage-view');
- await expect(page).toHaveURL('http://localhost:4001/backstage');
+ await expect(page).toHaveURL('/backstage');
});
test('Studio Clock', async ({ page }) => {
await openNavigationMenu(page);
await page.getByRole('button', { name: 'Studio Clock' }).click();
page.locator('data-testid=studio-view');
- await expect(page).toHaveURL('http://localhost:4001/studio');
+ await expect(page).toHaveURL('/studio');
});
test('Countdown', async ({ page }) => {
await openNavigationMenu(page);
await page.getByRole('button', { name: 'Countdown' }).click();
page.locator('data-testid=countdown-view');
- await expect(page).toHaveURL('http://localhost:4001/countdown');
+ await expect(page).toHaveURL('/countdown');
});
test('Project Info', async ({ page }) => {
await openNavigationMenu(page);
await page.getByRole('button', { name: 'Project Info' }).click();
page.locator('data-testid=project-view');
- await expect(page).toHaveURL('http://localhost:4001/info');
+ await expect(page).toHaveURL('/info');
});
test('Timer', async ({ page }) => {
await openNavigationMenu(page);
await page.getByRole('button', { name: 'Timer', exact: true }).click();
page.locator('data-testid=timer-view');
- await expect(page).toHaveURL('http://localhost:4001/timer');
+ await expect(page).toHaveURL('/timer');
});
test('not-found', async ({ page }) => {
- await page.goto('http://localhost:4001/not-found');
+ await page.goto('/not-found');
await expect(page).toHaveTitle(/ontime/);
await expect(page.getByRole('heading', { name: 'Not found' })).toBeVisible();
- await page.goto('http://localhost:4001/preset/not-found');
+ await page.goto('/preset/not-found');
await expect(page).toHaveTitle(/ontime/);
await expect(page.getByRole('heading', { name: 'Not found' })).toBeVisible();
diff --git a/e2e/tests/features/201-message-control.spec.ts b/e2e/tests/features/201-message-control.spec.ts
index 90358fef2..2bb033c55 100644
--- a/e2e/tests/features/201-message-control.spec.ts
+++ b/e2e/tests/features/201-message-control.spec.ts
@@ -4,14 +4,14 @@ test('message control sends messages to screens', async ({ context }) => {
const editorPage = await context.newPage();
const featurePage = await context.newPage();
- await editorPage.goto('http://localhost:4001/messagecontrol');
+ await editorPage.goto('/messagecontrol');
// stage timer message
await editorPage.getByPlaceholder('Message shown fullscreen in stage timer').click();
await editorPage.getByPlaceholder('Message shown fullscreen in stage timer').fill('testing stage');
await editorPage.getByRole('button', { name: /toggle timer message/i }).click({ timeout: 5000 });
- await featurePage.goto('http://localhost:4001/timer');
+ await featurePage.goto('/timer');
await featurePage.waitForLoadState('load', { timeout: 5000 });
await expect(featurePage.getByText('testing stage')).toBeVisible();
diff --git a/e2e/tests/features/203-delay-block.spec.ts b/e2e/tests/features/203-delay-block.spec.ts
index 530443bcd..a2dfb10ba 100644
--- a/e2e/tests/features/203-delay-block.spec.ts
+++ b/e2e/tests/features/203-delay-block.spec.ts
@@ -1,7 +1,7 @@
import { expect, test } from '@playwright/test';
test('delays add time to events', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
// delete all events and add a new one
await page.getByRole('button', { name: 'Edit' }).click();
@@ -50,7 +50,7 @@ test('delays add time to events', async ({ page }) => {
});
test('delays are show correctly', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
// add a test event
await page.getByRole('button', { name: 'Edit' }).click();
@@ -81,10 +81,10 @@ test('delays are show correctly', async ({ page }) => {
await page.getByText('New start 00:11').click();
// delay is shown in the cuesheet
- await page.goto('http://localhost:4001/cuesheet');
+ await page.goto('/cuesheet');
await page.getByRole('cell', { name: 'Delayed by 1 min' }).click();
// delay is shown in the backstage view
- await page.goto('http://localhost:4001/backstage');
+ await page.goto('/backstage');
await page.getByText('00:11→00:21').click();
});
diff --git a/e2e/tests/features/204-editor-crud.spec.ts b/e2e/tests/features/204-editor-crud.spec.ts
index be45c6bd8..3ad48290b 100644
--- a/e2e/tests/features/204-editor-crud.spec.ts
+++ b/e2e/tests/features/204-editor-crud.spec.ts
@@ -1,7 +1,7 @@
import { expect, test } from '@playwright/test';
test('CRUD operations on the rundown', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
await page.getByRole('button', { name: 'Edit' }).click();
await page.getByRole('button', { name: 'Rundown menu' }).click();
diff --git a/e2e/tests/features/206-url-preset.spec.ts b/e2e/tests/features/206-url-preset.spec.ts
index a7e2d9165..26284c418 100644
--- a/e2e/tests/features/206-url-preset.spec.ts
+++ b/e2e/tests/features/206-url-preset.spec.ts
@@ -8,7 +8,7 @@ test.describe('URL Preset', () => {
test.beforeAll(async ({ browser }) => {
const context = await browser.newContext();
const page = await context.newPage();
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
// Create the preset that will be used by other tests
await page.getByRole('button', { name: 'Toggle settings' }).click();
@@ -31,7 +31,7 @@ test.describe('URL Preset', () => {
});
test('Unwrapping a preset from a view', async ({ page }) => {
- await page.goto('http://localhost:4001/timer');
+ await page.goto('/timer');
// 1. the URL points to the view
expect(page.url().includes('hideTimerSeconds=true')).not.toBeTruthy();
@@ -52,7 +52,7 @@ test.describe('URL Preset', () => {
});
test('Sharing a link to an unwrapped preset', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
// open settings
await page.getByRole('button', { name: 'Toggle settings' }).click();
@@ -83,7 +83,7 @@ test.describe('URL Preset', () => {
});
test('Sharing a link to a masked preset', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
// open settings
await page.getByRole('button', { name: 'Toggle settings' }).click();
@@ -118,7 +118,7 @@ test.describe('Sharing from cuesheet', () => {
test.beforeAll(async ({ browser }) => {
const context = await browser.newContext();
const page = await context.newPage();
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
// we create some elements to test with
await page.getByRole('button', { name: 'Rundown menu' }).click();
@@ -135,7 +135,7 @@ test.describe('Sharing from cuesheet', () => {
test('Sharing a link with readonly permissions', async ({ page }, testInfo) => {
const alias = `cuesheet-read-test-${testInfo.retry}-${Date.now()}`;
- await page.goto('http://localhost:4001/cuesheet');
+ await page.goto('/cuesheet');
await expect(page.getByTestId('cuesheet')).toBeVisible();
await page.getByRole('button', { name: 'Share...' }).click();
@@ -189,7 +189,7 @@ test.describe('Sharing from cuesheet', () => {
test('Sharing a link with scoped read-write permissions', async ({ page }, testInfo) => {
const alias = `cuesheet-scope-test-${testInfo.retry}-${Date.now()}`;
- await page.goto('http://localhost:4001/cuesheet');
+ await page.goto('/cuesheet');
await expect(page.getByTestId('cuesheet')).toBeVisible();
await page.getByRole('button', { name: 'Share...' }).click();
diff --git a/e2e/tests/features/207-view-params.spec.ts b/e2e/tests/features/207-view-params.spec.ts
index 244a24614..8179f6ac3 100644
--- a/e2e/tests/features/207-view-params.spec.ts
+++ b/e2e/tests/features/207-view-params.spec.ts
@@ -1,7 +1,7 @@
import { expect, test } from '@playwright/test';
test('View params configures timer view', async ({ page }) => {
- await page.goto('http://localhost:4001/timer');
+ await page.goto('/timer');
await expect(page.getByText('TIME NOW')).toBeInViewport();
diff --git a/e2e/tests/features/208-auxtimer.spec.ts b/e2e/tests/features/208-auxtimer.spec.ts
index c830adfbe..022dcf993 100644
--- a/e2e/tests/features/208-auxtimer.spec.ts
+++ b/e2e/tests/features/208-auxtimer.spec.ts
@@ -1,7 +1,7 @@
import { expect, test } from '@playwright/test';
test('Aux timer buttons', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
await page.getByTestId('time-input-aux1').click();
await page.getByTestId('time-input-aux1').fill('123456');
await page.getByTestId('time-input-aux1').press('Enter');
diff --git a/e2e/tests/features/209-rundown-shortcuts.spec.ts b/e2e/tests/features/209-rundown-shortcuts.spec.ts
index c518288a0..a3717f9d2 100644
--- a/e2e/tests/features/209-rundown-shortcuts.spec.ts
+++ b/e2e/tests/features/209-rundown-shortcuts.spec.ts
@@ -1,7 +1,7 @@
import { expect, test } from '@playwright/test';
test('Copy-paste', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Edit' }).click();
// clear rundown
@@ -32,7 +32,7 @@ test('Copy-paste', async ({ page }) => {
});
test('Cut-paste', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Edit' }).click();
// clear rundown
@@ -64,7 +64,7 @@ test('Cut-paste', async ({ page }) => {
});
test('Move', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Edit' }).click();
// clear rundown
@@ -102,7 +102,7 @@ test('Move', async ({ page }) => {
});
test('Add group', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Edit' }).click();
// clear rundown
@@ -137,7 +137,7 @@ test('Add group', async ({ page }) => {
});
test('Add delay', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Edit' }).click();
// clear rundown
@@ -168,7 +168,7 @@ test('Add delay', async ({ page }) => {
});
test('Add event', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Edit' }).click();
// clear rundown
@@ -195,11 +195,11 @@ test('Add event', async ({ page }) => {
});
test('Delete event', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Edit' }).click();
// clear rundown
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Rundown menu' }).click();
await page.getByRole('menuitem', { name: 'Clear all' }).click();
await page.getByRole('button', { name: 'Delete all' }).click();
@@ -218,7 +218,7 @@ test('Delete event', async ({ page }) => {
});
test('Find in rundown', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await expect(page.getByTestId('panel-rundown')).toBeVisible();
await page.keyboard.press('ControlOrMeta+f');
@@ -229,7 +229,7 @@ test('Find in rundown', async ({ page }) => {
});
test('Open settings', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
await expect(page.getByTestId('editor-container')).toBeVisible();
await page.keyboard.press('ControlOrMeta+,');
diff --git a/e2e/tests/features/210-client-remote.spec.ts b/e2e/tests/features/210-client-remote.spec.ts
index cc547d152..3c4ea1855 100644
--- a/e2e/tests/features/210-client-remote.spec.ts
+++ b/e2e/tests/features/210-client-remote.spec.ts
@@ -4,8 +4,8 @@ test('redirect', async ({ context }) => {
const controllerPage = await context.newPage();
const remotePage = await context.newPage();
- await controllerPage.goto('http://localhost:4001/editor?settings=network__clients');
- await remotePage.goto('http://localhost:4001/timer');
+ await controllerPage.goto('/editor?settings=network__clients');
+ await remotePage.goto('/timer');
await controllerPage.getByTestId('not-self-redirect').click();
await controllerPage.getByRole('textbox', { name: 'http://localhost:' }).click();
@@ -19,8 +19,8 @@ test('identify', async ({ context }) => {
const controllerPage = await context.newPage();
const remotePage = await context.newPage();
- await controllerPage.goto('http://localhost:4001/editor?settings=network__clients');
- await remotePage.goto('http://localhost:4001/timer');
+ await controllerPage.goto('/editor?settings=network__clients');
+ await remotePage.goto('/timer');
await controllerPage.getByTestId('not-self-identify').click();
@@ -31,8 +31,8 @@ test('rename', async ({ context }) => {
const controllerPage = await context.newPage();
const remotePage = await context.newPage();
- await controllerPage.goto('http://localhost:4001/editor?settings=network__clients');
- await remotePage.goto('http://localhost:4001/timer');
+ await controllerPage.goto('/editor?settings=network__clients');
+ await remotePage.goto('/timer');
await controllerPage.getByTestId('not-self-rename').click();
await controllerPage.getByPlaceholder('new name').click();
diff --git a/e2e/tests/features/211-report-data.spec.ts b/e2e/tests/features/211-report-data.spec.ts
index e8030f887..c1199d77f 100644
--- a/e2e/tests/features/211-report-data.spec.ts
+++ b/e2e/tests/features/211-report-data.spec.ts
@@ -1,7 +1,7 @@
import { expect, test } from '@playwright/test';
test('show warning when event crosses midnight', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
await page.getByRole('button', { name: 'Edit' }).click();
@@ -24,7 +24,7 @@ test('show warning when event crosses midnight', async ({ page }) => {
});
test('show warning when event starts next day midnight', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
await page.getByRole('button', { name: 'Edit' }).click();
diff --git a/e2e/tests/features/212-time-until.spec.ts b/e2e/tests/features/212-time-until.spec.ts
index ed52d52b6..15801c336 100644
--- a/e2e/tests/features/212-time-until.spec.ts
+++ b/e2e/tests/features/212-time-until.spec.ts
@@ -129,7 +129,7 @@ test('time until absolute', async ({ context }) => {
test('time until relative', async ({ context }) => {
const editor = await context.newPage();
- editor.goto('http://localhost:4001/editor');
+ editor.goto('/editor');
await editor.getByRole('button', { name: 'Edit' }).click();
await editor.getByRole('button', { name: 'Rundown menu' }).click();
diff --git a/e2e/tests/features/213-arrange-while-playing.spec.ts b/e2e/tests/features/213-arrange-while-playing.spec.ts
index 58cadf095..1850b2d0c 100644
--- a/e2e/tests/features/213-arrange-while-playing.spec.ts
+++ b/e2e/tests/features/213-arrange-while-playing.spec.ts
@@ -1,7 +1,7 @@
import { expect, test } from '@playwright/test';
test('Rearrange while playing', async ({ page }) => {
- await page.goto('http://localhost:4001/rundown');
+ await page.goto('/rundown');
await page.getByRole('button', { name: 'Edit' }).click();
// clear rundown
@@ -34,7 +34,7 @@ test('Rearrange while playing', async ({ page }) => {
});
test('flag and unflag an event while playing', async ({ page }) => {
- await page.goto('http://localhost:4001/editor/');
+ await page.goto('/editor/');
await page.getByRole('button', { name: 'Edit' }).click();
await page.getByRole('button', { name: 'Rundown menu' }).click();
diff --git a/e2e/tests/features/301-spreadsheet-import.spec.ts b/e2e/tests/features/301-spreadsheet-import.spec.ts
index 5df4d58da..8115a8aed 100644
--- a/e2e/tests/features/301-spreadsheet-import.spec.ts
+++ b/e2e/tests/features/301-spreadsheet-import.spec.ts
@@ -3,7 +3,7 @@ import { expect, test } from '@playwright/test';
const fileToUpload = 'e2e/tests/fixtures/test-sheet.xlsx';
test('sheet file upload', async ({ page }) => {
- await page.goto('http://localhost:4001/editor');
+ await page.goto('/editor');
await page.getByRole('button', { name: 'Edit' }).click();
await page.getByRole('button', { name: 'Rundown menu' }).click();
await page.getByRole('menuitem', { name: 'Clear all' }).click();
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 6bdc101e0..a87a2f920 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -103,6 +103,9 @@ importers:
prismjs:
specifier: ^1.30.0
version: 1.30.0
+ qrcode:
+ specifier: ^1.5.4
+ version: 1.5.4
react:
specifier: ^19.2.3
version: 19.2.3
@@ -121,9 +124,6 @@ importers:
react-icons:
specifier: 5.5.0
version: 5.5.0(react@19.2.3)
- react-qr-code:
- specifier: ^2.0.18
- version: 2.0.18(react@19.2.3)
react-router:
specifier: ^7.11.0
version: 7.11.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)
@@ -146,6 +146,9 @@ importers:
'@types/prismjs':
specifier: ^1.26.6
version: 1.26.6
+ '@types/qrcode':
+ specifier: ^1.5.6
+ version: 1.5.6
'@types/react':
specifier: ^19.1.12
version: 19.1.12
@@ -154,7 +157,7 @@ importers:
version: 19.1.9(@types/react@19.1.12)
'@vitejs/plugin-react':
specifier: 5.2.0
- version: 5.2.0(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5))
+ version: 5.2.0(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5))
babel-plugin-react-compiler:
specifier: 1.0.0
version: 1.0.0
@@ -171,20 +174,20 @@ importers:
specifier: 'catalog:'
version: 6.0.0-beta
vite:
- specifier: 7.3.1
- version: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)
+ specifier: 8.0.1
+ version: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)
vite-plugin-compression2:
specifier: 2.5.1
version: 2.5.1(rollup@4.59.0)
vite-plugin-prismjs-plus:
specifier: 1.1.1
- version: 1.1.1(prismjs@1.30.0)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5))
+ version: 1.1.1(prismjs@1.30.0)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5))
vite-plugin-svgr:
specifier: 4.5.0
- version: 4.5.0(rollup@4.59.0)(typescript@6.0.0-beta)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5))
+ version: 4.5.0(rollup@4.59.0)(typescript@6.0.0-beta)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5))
vite-tsconfig-paths:
specifier: 6.1.1
- version: 6.1.1(typescript@6.0.0-beta)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5))
+ version: 6.1.1(typescript@6.0.0-beta)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5))
vitest:
specifier: 'catalog:'
version: 4.0.17(@types/node@25.4.0)(happy-dom@16.8.1)(jiti@2.6.1)(jsdom@21.1.0)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)
@@ -593,6 +596,15 @@ packages:
resolution: {integrity: sha512-Wn9sPYIVFRFl5HmwMJkARCCf7rqK/EurkfQ/rJZ14mHP3iYTjZSIOSVonEAnhWeAXwtw7zOekGRlc6yTtZ0t+g==}
engines: {node: '>=16.4'}
+ '@emnapi/core@1.9.1':
+ resolution: {integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==}
+
+ '@emnapi/runtime@1.9.1':
+ resolution: {integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==}
+
+ '@emnapi/wasi-threads@1.2.0':
+ resolution: {integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==}
+
'@esbuild/aix-ppc64@0.24.2':
resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==}
engines: {node: '>=18'}
@@ -1126,6 +1138,9 @@ packages:
peerDependencies:
react: ^18.x || ^19.x
+ '@napi-rs/wasm-runtime@1.1.1':
+ resolution: {integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==}
+
'@npmcli/agent@3.0.0':
resolution: {integrity: sha512-S79NdEgDQd/NGCay6TCoVzXSj74skRZIKJcpJjC5lOq34SZzyI6MqtiiWoiVWoVrTcGjNeC4ipbh1VIHlpfF5Q==}
engines: {node: ^18.17.0 || >=20.5.0}
@@ -1134,6 +1149,9 @@ packages:
resolution: {integrity: sha512-/xGlezI6xfGO9NwuJlnwz/K14qD1kCSAGtacBHnGzeAIuJGazcp45KP5NuyARXoKb7cwulAGWVsbeSxdG/cb0Q==}
engines: {node: ^18.17.0 || >=20.5.0}
+ '@oxc-project/types@0.120.0':
+ resolution: {integrity: sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==}
+
'@oxfmt/binding-android-arm-eabi@0.35.0':
resolution: {integrity: sha512-BaRKlM3DyG81y/xWTsE6gZiv89F/3pHe2BqX2H4JbiB8HNVlWWtplzgATAE5IDSdwChdeuWLDTQzJ92Lglw3ZA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -1483,6 +1501,98 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ '@rolldown/binding-android-arm64@1.0.0-rc.10':
+ resolution: {integrity: sha512-jOHxwXhxmFKuXztiu1ORieJeTbx5vrTkcOkkkn2d35726+iwhrY1w/+nYY/AGgF12thg33qC3R1LMBF5tHTZHg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.10':
+ resolution: {integrity: sha512-gED05Teg/vtTZbIJBc4VNMAxAFDUPkuO/rAIyyxZjTj1a1/s6z5TII/5yMGZ0uLRCifEtwUQn8OlYzuYc0m70w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.10':
+ resolution: {integrity: sha512-rI15NcM1mA48lqrIxVkHfAqcyFLcQwyXWThy+BQ5+mkKKPvSO26ir+ZDp36AgYoYVkqvMcdS8zOE6SeBsR9e8A==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.10':
+ resolution: {integrity: sha512-XZRXHdTa+4ME1MuDVp021+doQ+z6Ei4CCFmNc5/sKbqb8YmkiJdj8QKlV3rCI0AJtAeSB5n0WGPuJWNL9p/L2w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10':
+ resolution: {integrity: sha512-R0SQMRluISSLzFE20sPWYHVmJdDQnRyc/FzSCN72BqQmh2SOZUFG+N3/vBZpR4C6WpEUVYJLrYUXaj43sJsNLA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10':
+ resolution: {integrity: sha512-Y1reMrV/o+cwpduYhJuOE3OMKx32RMYCidf14y+HssARRmhDuWXJ4yVguDg2R/8SyyGNo+auzz64LnPK9Hq6jg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.10':
+ resolution: {integrity: sha512-vELN+HNb2IzuzSBUOD4NHmP9yrGwl1DVM29wlQvx1OLSclL0NgVWnVDKl/8tEks79EFek/kebQKnNJkIAA4W2g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10':
+ resolution: {integrity: sha512-ZqrufYTgzxbHwpqOjzSsb0UV/aV2TFIY5rP8HdsiPTv/CuAgCRjM6s9cYFwQ4CNH+hf9Y4erHW1GjZuZ7WoI7w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10':
+ resolution: {integrity: sha512-gSlmVS1FZJSRicA6IyjoRoKAFK7IIHBs7xJuHRSmjImqk3mPPWbR7RhbnfH2G6bcmMEllCt2vQ/7u9e6bBnByg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.10':
+ resolution: {integrity: sha512-eOCKUpluKgfObT2pHjztnaWEIbUabWzk3qPZ5PuacuPmr4+JtQG4k2vGTY0H15edaTnicgU428XW/IH6AimcQw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.10':
+ resolution: {integrity: sha512-Xdf2jQbfQowJnLcgYfD/m0Uu0Qj5OdxKallD78/IPPfzaiaI4KRAwZzHcKQ4ig1gtg1SuzC7jovNiM2TzQsBXA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.10':
+ resolution: {integrity: sha512-o1hYe8hLi1EY6jgPFyxQgQ1wcycX+qz8eEbVmot2hFkgUzPxy9+kF0u0NIQBeDq+Mko47AkaFFaChcvZa9UX9Q==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.10':
+ resolution: {integrity: sha512-Ugv9o7qYJudqQO5Y5y2N2SOo6S4WiqiNOpuQyoPInnhVzCY+wi/GHltcLHypG9DEUYMB0iTB/huJrpadiAcNcA==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10':
+ resolution: {integrity: sha512-7UODQb4fQUNT/vmgDZBl3XOBAIOutP5R3O/rkxg0aLfEGQ4opbCgU5vOw/scPe4xOqBwL9fw7/RP1vAMZ6QlAQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.10':
+ resolution: {integrity: sha512-PYxKHMVHOb5NJuDL53vBUl1VwUjymDcYI6rzpIni0C9+9mTiJedvUxSk7/RPp7OOAm3v+EjgMu9bIy3N6b408w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.0-rc.10':
+ resolution: {integrity: sha512-UkVDEFk1w3mveXeKgaTuYfKWtPbvgck1dT8TUG3bnccrH0XtLTuAyfCoks4Q/M5ZGToSVJTIQYCzy2g/atAOeg==}
+
'@rolldown/pluginutils@1.0.0-rc.3':
resolution: {integrity: sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q==}
@@ -1923,6 +2033,7 @@ packages:
'@table-nav/core@0.0.7':
resolution: {integrity: sha512-pCh18jHDRe3tw9sJZXfKi4cSD6VjHbn40CYdqhp5X91SIX7rakDEQAsTx6F7Fv9TUv265l+5rUDcYNaJ0N0cqQ==}
+ deprecated: Bad workplace dependencies
'@table-nav/react@0.0.7':
resolution: {integrity: sha512-S+DsD/qDqp50Z4dqt5tZFMWA3sRu0OOT/grMQuq/z/52jPEKJB+b9t+YSH8Ms55vCJOJ0DxuYldJpYrJLMG5ew==}
@@ -1961,6 +2072,9 @@ packages:
resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==}
engines: {node: '>= 10'}
+ '@tybys/wasm-util@0.10.1':
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
'@types/babel__core@7.20.5':
resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
@@ -2044,6 +2158,9 @@ packages:
'@types/prismjs@1.26.6':
resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==}
+ '@types/qrcode@1.5.6':
+ resolution: {integrity: sha512-te7NQcV2BOvdj2b1hCAHzAoMNuj65kNBMz0KBaxM6c3VGBOhU0dURQKOtH8CFNI/dsKkwlv32p26qYQTWoB5bw==}
+
'@types/qs@6.9.7':
resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==}
@@ -2383,6 +2500,10 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
+ camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+
camelcase@6.3.0:
resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
engines: {node: '>=10'}
@@ -2441,6 +2562,9 @@ packages:
resolution: {integrity: sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==}
engines: {node: '>=8'}
+ cliui@6.0.0:
+ resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
+
cliui@8.0.1:
resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
engines: {node: '>=12'}
@@ -2612,6 +2736,10 @@ packages:
supports-color:
optional: true
+ decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+
decimal.js@10.6.0:
resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
@@ -2658,6 +2786,9 @@ packages:
detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
+ dijkstrajs@1.0.3:
+ resolution: {integrity: sha512-qiSlmBq9+BCdCA/L46dw8Uy93mloxsPSbwnm5yrKn2vMPiy8KyAskTF6zuV/j5BMsmOGZDPs7KjU+mjb670kfA==}
+
dir-compare@3.3.0:
resolution: {integrity: sha512-J7/et3WlGUCxjdnD3HAAzQ6nsnc0WL6DD7WcwJb7c39iH1+AWfg+9OqzJNaI6PkBwBvm1mhZNL9iY/nRiZXlPg==}
@@ -2917,6 +3048,10 @@ packages:
resolution: {integrity: sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==}
engines: {node: '>= 0.8'}
+ find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+
find-up@5.0.0:
resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
engines: {node: '>=10'}
@@ -3429,6 +3564,10 @@ packages:
resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+
locate-path@6.0.0:
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
engines: {node: '>=10'}
@@ -3461,10 +3600,6 @@ packages:
resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
engines: {node: '>=10'}
- loose-envify@1.4.0:
- resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
- hasBin: true
-
lowdb@7.0.1:
resolution: {integrity: sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw==}
engines: {node: '>=18'}
@@ -3772,10 +3907,18 @@ packages:
resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==}
engines: {node: '>=8'}
+ p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+
p-limit@3.1.0:
resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
engines: {node: '>=10'}
+ p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+
p-locate@5.0.0:
resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
engines: {node: '>=10'}
@@ -3784,6 +3927,10 @@ packages:
resolution: {integrity: sha512-tkAQEw8ysMzmkhgw8k+1U/iPhWNhykKnSk4Rd5zLoPJCuJaGRPo6YposrZgaxHKzDHdDWWZvE/Sk7hsL2X/CpQ==}
engines: {node: '>=18'}
+ p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
package-json-from-dist@1.0.1:
resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==}
@@ -3883,6 +4030,10 @@ packages:
resolution: {integrity: sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ==}
engines: {node: '>=10.4.0'}
+ pngjs@5.0.0:
+ resolution: {integrity: sha512-40QW5YalBNfQo5yRYmiw7Yz6TKKVr3h6970B2YE+3fQpsWcrbj1PzJgxeJ19DRQjhMbKPIuMY8rFaXc8moolVw==}
+ engines: {node: '>=10.13.0'}
+
postcss-load-config@6.0.1:
resolution: {integrity: sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==}
engines: {node: '>= 18'}
@@ -3924,9 +4075,6 @@ packages:
resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==}
engines: {node: '>=10'}
- prop-types@15.8.1:
- resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
-
proper-lockfile@4.1.2:
resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==}
@@ -3947,8 +4095,10 @@ packages:
resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
engines: {node: '>=6'}
- qr.js@0.0.0:
- resolution: {integrity: sha512-c4iYnWb+k2E+vYpRimHqSu575b1/wKl4XFeJGpFmrJQz5I88v9aY2czh7s0w36srfCM1sXgC/xpoJz5dJfq+OQ==}
+ qrcode@1.5.4:
+ resolution: {integrity: sha512-1ca71Zgiu6ORjHqFBDpnSMTR2ReToX4l1Au1VFLyVeBTFavzQnv5JxMFr3ukHVKpSrSA2MCk0lNJSykjUfz7Zg==}
+ engines: {node: '>=10.13.0'}
+ hasBin: true
qs@6.11.0:
resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==}
@@ -4001,11 +4151,6 @@ packages:
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
- react-qr-code@2.0.18:
- resolution: {integrity: sha512-v1Jqz7urLMhkO6jkgJuBYhnqvXagzceg3qJUWayuCK/c6LTIonpWbwxR1f1APGd4xrW/QcQEovNrAojbUz65Tg==}
- peerDependencies:
- react: '*'
-
react-refresh@0.18.0:
resolution: {integrity: sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw==}
engines: {node: '>=0.10.0'}
@@ -4066,6 +4211,9 @@ packages:
resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
engines: {node: '>=0.10.0'}
+ require-main-filename@2.0.0:
+ resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+
requires-port@1.0.0:
resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==}
@@ -4115,6 +4263,11 @@ packages:
resolution: {integrity: sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==}
engines: {node: '>=8.0'}
+ rolldown@1.0.0-rc.10:
+ resolution: {integrity: sha512-q7j6vvarRFmKpgJUT8HCAUljkgzEp4LAhPlJUvQhA5LA1SUL36s5QCysMutErzL3EbNOZOkoziSx9iZC4FddKA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
rollup@4.41.1:
resolution: {integrity: sha512-cPmwD3FnFv8rKMBc1MxWCwVQFxwf1JEmSX3iQXrRVVG15zerAIXRjMFVWnd5Q5QvgKF7Aj+5ykXFhUl+QGnyOw==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
@@ -4196,6 +4349,9 @@ packages:
server-timing@3.3.3:
resolution: {integrity: sha512-TP0xWAca4oM8H/PSdeaGgp2qm+HrZ2cWCRcMXS2t500a7Wum/hSojlpTW43VZsIUSVNlKPFGDknH34IqF+mbBg==}
+ set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+
set-cookie-parser@2.7.1:
resolution: {integrity: sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==}
@@ -4698,6 +4854,49 @@ packages:
yaml:
optional: true
+ vite@8.0.1:
+ resolution: {integrity: sha512-wt+Z2qIhfFt85uiyRt5LPU4oVEJBXj8hZNWKeqFG4gRG/0RaRGJ7njQCwzFVjO+v4+Ipmf5CY7VdmZRAYYBPHw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.1.0
+ esbuild: ^0.27.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
+ optional: true
+ less:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
vitest@4.0.17:
resolution: {integrity: sha512-FQMeF0DJdWY0iOnbv466n/0BudNdKj1l5jYgl5JVTwjSsZSlqyXFt/9+1sEyhR6CLowbZpV7O1sCHrzBhucKKg==}
engines: {node: ^20.0.0 || ^22.0.0 || >=24.0.0}
@@ -4776,6 +4975,9 @@ packages:
whatwg-url@7.1.0:
resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
+ which-module@2.0.1:
+ resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+
which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'}
@@ -4799,6 +5001,10 @@ packages:
resolution: {integrity: sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==}
engines: {node: '>=0.8'}
+ wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+
wrap-ansi@7.0.0:
resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
engines: {node: '>=10'}
@@ -4850,6 +5056,9 @@ packages:
xmlchars@2.2.0:
resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+ y18n@4.0.3:
+ resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==}
+
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@@ -4864,10 +5073,18 @@ packages:
resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==}
engines: {node: '>=18'}
+ yargs-parser@18.1.3:
+ resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+ engines: {node: '>=6'}
+
yargs-parser@21.1.1:
resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
engines: {node: '>=12'}
+ yargs@15.4.1:
+ resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+ engines: {node: '>=8'}
+
yargs@17.7.2:
resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
engines: {node: '>=12'}
@@ -5293,6 +5510,22 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ '@emnapi/core@1.9.1':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.0
+ tslib: 2.6.2
+ optional: true
+
+ '@emnapi/runtime@1.9.1':
+ dependencies:
+ tslib: 2.6.2
+ optional: true
+
+ '@emnapi/wasi-threads@1.2.0':
+ dependencies:
+ tslib: 2.6.2
+ optional: true
+
'@esbuild/aix-ppc64@0.24.2':
optional: true
@@ -5612,6 +5845,13 @@ snapshots:
dependencies:
react: 19.2.3
+ '@napi-rs/wasm-runtime@1.1.1':
+ dependencies:
+ '@emnapi/core': 1.9.1
+ '@emnapi/runtime': 1.9.1
+ '@tybys/wasm-util': 0.10.1
+ optional: true
+
'@npmcli/agent@3.0.0':
dependencies:
agent-base: 7.1.4
@@ -5626,6 +5866,8 @@ snapshots:
dependencies:
semver: 7.7.4
+ '@oxc-project/types@0.120.0': {}
+
'@oxfmt/binding-android-arm-eabi@0.35.0':
optional: true
@@ -5826,6 +6068,55 @@ snapshots:
dependencies:
playwright: 1.55.0
+ '@rolldown/binding-android-arm64@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.10':
+ dependencies:
+ '@napi-rs/wasm-runtime': 1.1.1
+ optional: true
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.10':
+ optional: true
+
+ '@rolldown/pluginutils@1.0.0-rc.10': {}
+
'@rolldown/pluginutils@1.0.0-rc.3': {}
'@rollup/pluginutils@5.1.4(rollup@4.59.0)':
@@ -6210,6 +6501,11 @@ snapshots:
'@tootallnate/once@2.0.0': {}
+ '@tybys/wasm-util@0.10.1':
+ dependencies:
+ tslib: 2.6.2
+ optional: true
+
'@types/babel__core@7.20.5':
dependencies:
'@babel/parser': 7.28.3
@@ -6290,7 +6586,7 @@ snapshots:
'@types/keyv@3.1.4':
dependencies:
- '@types/node': 22.15.26
+ '@types/node': 25.4.0
'@types/mime@1.3.5': {}
@@ -6318,6 +6614,10 @@ snapshots:
'@types/prismjs@1.26.6': {}
+ '@types/qrcode@1.5.6':
+ dependencies:
+ '@types/node': 25.4.0
+
'@types/qs@6.9.7': {}
'@types/range-parser@1.2.4': {}
@@ -6360,7 +6660,7 @@ snapshots:
'@types/node': 22.15.26
optional: true
- '@vitejs/plugin-react@5.2.0(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5))':
+ '@vitejs/plugin-react@5.2.0(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5))':
dependencies:
'@babel/core': 7.29.0
'@babel/plugin-transform-react-jsx-self': 7.27.1(@babel/core@7.29.0)
@@ -6368,7 +6668,7 @@ snapshots:
'@rolldown/pluginutils': 1.0.0-rc.3
'@types/babel__core': 7.20.5
react-refresh: 0.18.0
- vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)
+ vite: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)
transitivePeerDependencies:
- supports-color
@@ -6823,6 +7123,8 @@ snapshots:
callsites@3.1.0: {}
+ camelcase@5.3.1: {}
+
camelcase@6.3.0: {}
caniuse-lite@1.0.30001720: {}
@@ -6867,6 +7169,12 @@ snapshots:
string-width: 4.2.3
optional: true
+ cliui@6.0.0:
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+
cliui@8.0.1:
dependencies:
string-width: 4.2.3
@@ -7020,6 +7328,8 @@ snapshots:
dependencies:
ms: 2.1.3
+ decamelize@1.2.0: {}
+
decimal.js@10.6.0:
optional: true
@@ -7061,6 +7371,8 @@ snapshots:
detect-node@2.1.0:
optional: true
+ dijkstrajs@1.0.3: {}
+
dir-compare@3.3.0:
dependencies:
buffer-equal: 1.0.1
@@ -7463,6 +7775,11 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ find-up@4.1.0:
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+
find-up@5.0.0:
dependencies:
locate-path: 6.0.0
@@ -8037,7 +8354,6 @@ snapshots:
lightningcss-linux-x64-musl: 1.32.0
lightningcss-win32-arm64-msvc: 1.32.0
lightningcss-win32-x64-msvc: 1.32.0
- optional: true
lilconfig@3.1.3: {}
@@ -8045,6 +8361,10 @@ snapshots:
load-tsconfig@0.2.5: {}
+ locate-path@5.0.0:
+ dependencies:
+ p-locate: 4.1.0
+
locate-path@6.0.0:
dependencies:
p-locate: 5.0.0
@@ -8070,10 +8390,6 @@ snapshots:
chalk: 4.1.2
is-unicode-supported: 0.1.0
- loose-envify@1.4.0:
- dependencies:
- js-tokens: 4.0.0
-
lowdb@7.0.1:
dependencies:
steno: 4.0.2
@@ -8410,16 +8726,26 @@ snapshots:
p-cancelable@2.1.1: {}
+ p-limit@2.3.0:
+ dependencies:
+ p-try: 2.2.0
+
p-limit@3.1.0:
dependencies:
yocto-queue: 0.1.0
+ p-locate@4.1.0:
+ dependencies:
+ p-limit: 2.3.0
+
p-locate@5.0.0:
dependencies:
p-limit: 3.1.0
p-map@7.0.4: {}
+ p-try@2.2.0: {}
+
package-json-from-dist@1.0.1: {}
parent-module@1.0.1:
@@ -8504,6 +8830,8 @@ snapshots:
base64-js: 1.5.1
xmlbuilder: 15.1.1
+ pngjs@5.0.0: {}
+
postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.8)(tsx@4.20.5):
dependencies:
lilconfig: 3.1.3
@@ -8531,12 +8859,6 @@ snapshots:
err-code: 2.0.3
retry: 0.12.0
- prop-types@15.8.1:
- dependencies:
- loose-envify: 1.4.0
- object-assign: 4.1.1
- react-is: 16.13.1
-
proper-lockfile@4.1.2:
dependencies:
graceful-fs: 4.2.11
@@ -8562,7 +8884,11 @@ snapshots:
punycode@2.3.1: {}
- qr.js@0.0.0: {}
+ qrcode@1.5.4:
+ dependencies:
+ dijkstrajs: 1.0.3
+ pngjs: 5.0.0
+ yargs: 15.4.1
qs@6.11.0:
dependencies:
@@ -8608,12 +8934,6 @@ snapshots:
react-is@16.13.1: {}
- react-qr-code@2.0.18(react@19.2.3):
- dependencies:
- prop-types: 15.8.1
- qr.js: 0.0.0
- react: 19.2.3
-
react-refresh@0.18.0: {}
react-router@7.11.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3):
@@ -8679,6 +8999,8 @@ snapshots:
require-directory@2.1.1: {}
+ require-main-filename@2.0.0: {}
+
requires-port@1.0.0:
optional: true
@@ -8728,6 +9050,27 @@ snapshots:
sprintf-js: 1.1.3
optional: true
+ rolldown@1.0.0-rc.10:
+ dependencies:
+ '@oxc-project/types': 0.120.0
+ '@rolldown/pluginutils': 1.0.0-rc.10
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.0.0-rc.10
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.10
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.10
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.10
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.10
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.10
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.10
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.10
+ '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.10
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.10
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.10
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.10
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.10
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.10
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.10
+
rollup@4.41.1:
dependencies:
'@types/estree': 1.0.7
@@ -8873,6 +9216,8 @@ snapshots:
minimist: 1.2.8
on-headers: 1.0.2
+ set-blocking@2.0.0: {}
+
set-cookie-parser@2.7.1: {}
setprototypeof@1.2.0: {}
@@ -9317,28 +9662,28 @@ snapshots:
transitivePeerDependencies:
- rollup
- vite-plugin-prismjs-plus@1.1.1(prismjs@1.30.0)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)):
+ vite-plugin-prismjs-plus@1.1.1(prismjs@1.30.0)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)):
dependencies:
prismjs: 1.30.0
- vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)
+ vite: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)
- vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@6.0.0-beta)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)):
+ vite-plugin-svgr@4.5.0(rollup@4.59.0)(typescript@6.0.0-beta)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)):
dependencies:
'@rollup/pluginutils': 5.3.0(rollup@4.59.0)
'@svgr/core': 8.1.0(typescript@6.0.0-beta)
'@svgr/plugin-jsx': 8.1.0(@svgr/core@8.1.0(typescript@6.0.0-beta))
- vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)
+ vite: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)
transitivePeerDependencies:
- rollup
- supports-color
- typescript
- vite-tsconfig-paths@6.1.1(typescript@6.0.0-beta)(vite@7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)):
+ vite-tsconfig-paths@6.1.1(typescript@6.0.0-beta)(vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)):
dependencies:
debug: 4.4.3
globrex: 0.1.2
tsconfck: 3.1.6(typescript@6.0.0-beta)
- vite: 7.3.1(@types/node@25.4.0)(jiti@2.6.1)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5)
+ vite: 8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5)
transitivePeerDependencies:
- supports-color
- typescript
@@ -9375,6 +9720,21 @@ snapshots:
sass: 1.92.0
tsx: 4.20.5
+ vite@8.0.1(@types/node@25.4.0)(esbuild@0.27.4)(jiti@2.6.1)(sass@1.92.0)(tsx@4.20.5):
+ dependencies:
+ lightningcss: 1.32.0
+ picomatch: 4.0.3
+ postcss: 8.5.8
+ rolldown: 1.0.0-rc.10
+ tinyglobby: 0.2.15
+ optionalDependencies:
+ '@types/node': 25.4.0
+ esbuild: 0.27.4
+ fsevents: 2.3.3
+ jiti: 2.6.1
+ sass: 1.92.0
+ tsx: 4.20.5
+
vitest@4.0.17(@types/node@22.15.26)(happy-dom@16.8.1)(jiti@2.6.1)(jsdom@21.1.0)(lightningcss@1.32.0)(sass@1.92.0)(tsx@4.20.5):
dependencies:
'@vitest/expect': 4.0.17
@@ -9506,6 +9866,8 @@ snapshots:
tr46: 1.0.1
webidl-conversions: 4.0.2
+ which-module@2.0.1: {}
+
which@2.0.2:
dependencies:
isexe: 2.0.0
@@ -9523,6 +9885,12 @@ snapshots:
word@0.3.0: {}
+ wrap-ansi@6.2.0:
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
wrap-ansi@7.0.0:
dependencies:
ansi-styles: 4.3.0
@@ -9560,6 +9928,8 @@ snapshots:
xmlchars@2.2.0:
optional: true
+ y18n@4.0.3: {}
+
y18n@5.0.8: {}
yallist@3.1.1: {}
@@ -9568,8 +9938,27 @@ snapshots:
yallist@5.0.0: {}
+ yargs-parser@18.1.3:
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
+
yargs-parser@21.1.1: {}
+ yargs@15.4.1:
+ dependencies:
+ cliui: 6.0.0
+ decamelize: 1.2.0
+ find-up: 4.1.0
+ get-caller-file: 2.0.5
+ require-directory: 2.1.1
+ require-main-filename: 2.0.0
+ set-blocking: 2.0.0
+ string-width: 4.2.3
+ which-module: 2.0.1
+ y18n: 4.0.3
+ yargs-parser: 18.1.3
+
yargs@17.7.2:
dependencies:
cliui: 8.0.1