authorgravatar for admin@snappeh.comTristan Knight <admin@snappeh.com> 2026-09-26 09:26:29+01:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2026-09-26 03:26:29-05:00
logdaafcc4a972b25eb762962cb72575b1a2e583d61
treec0e5339526c60c72410c0214dee70d7316cf8f11
parentfe6388f01d5ae9f9db43079c6f5b2c31869067ca
signature Signed by PGP key B5690EEEBB952194

feat(web): add keyboard navigation for usage (#10158)


20 files changed, 811 insertions(+), 99 deletions(-)

apps/web/package.json+1
...@@ -75,6 +75,7 @@...@@ -75,6 +75,7 @@
75 "@vitejs/plugin-react": "^6.0.0",75 "@vitejs/plugin-react": "^6.0.0",
76 "babel-plugin-react-compiler": "1.0.0",76 "babel-plugin-react-compiler": "1.0.0",
77 "compression": "^1.8.1",77 "compression": "^1.8.1",
78 "jsdom": "^30.0.1",
78 "react-test-renderer": "19.2.6",79 "react-test-renderer": "19.2.6",
79 "tailwindcss": "^4.0.0",80 "tailwindcss": "^4.0.0",
80 "unified": "^11.0.5",81 "unified": "^11.0.5",
apps/web/src/components/AppSidebarLayout.tsx+10-3
...@@ -79,6 +79,7 @@ function readInitialThreadSidebarWidth(): number {...@@ -79,6 +79,7 @@ function readInitialThreadSidebarWidth(): number {
79}79}
8080
81function SidebarControl() {81function SidebarControl() {
82 const usagePageOpen = useLocation({ select: (location) => location.pathname === "/usage" });
82 const keybindings = useAtomValue(primaryServerKeybindingsAtom);83 const keybindings = useAtomValue(primaryServerKeybindingsAtom);
83 const { toggleSidebar } = useSidebar();84 const { toggleSidebar } = useSidebar();
84 const isSidebarVisible = useSidebarVisibility();85 const isSidebarVisible = useSidebarVisibility();
...@@ -86,7 +87,9 @@ function SidebarControl() {...@@ -86,7 +87,9 @@ function SidebarControl() {
86 const stageBackdropVariant = useSidebarStageBackdropVariant(87 const stageBackdropVariant = useSidebarStageBackdropVariant(
87 environmentIdentificationMode === "artwork",88 environmentIdentificationMode === "artwork",
88 );89 );
89 const shortcutLabel = shortcutLabelForCommand(keybindings, "sidebar.toggle");90 const shortcutLabel = shortcutLabelForCommand(keybindings, "sidebar.toggle", {
91 context: { usagePageOpen },
92 });
9093
91 useEffect(() => {94 useEffect(() => {
92 const onKeyDown = (event: KeyboardEvent) => {95 const onKeyDown = (event: KeyboardEvent) => {
...@@ -106,7 +109,11 @@ function SidebarControl() {...@@ -106,7 +109,11 @@ function SidebarControl() {
106 // available everywhere else, including the plain-text composer.109 // available everywhere else, including the plain-text composer.
107 return;110 return;
108 }111 }
109 if (resolveShortcutCommand(event, keybindings) !== "sidebar.toggle") return;112 if (
113 resolveShortcutCommand(event, keybindings, { context: { usagePageOpen } }) !==
114 "sidebar.toggle"
115 )
116 return;
110117
111 event.preventDefault();118 event.preventDefault();
112 event.stopPropagation();119 event.stopPropagation();
...@@ -116,7 +123,7 @@ function SidebarControl() {...@@ -116,7 +123,7 @@ function SidebarControl() {
116 // Capture before focused editors consume commands such as Mod+B for rich-text formatting.123 // Capture before focused editors consume commands such as Mod+B for rich-text formatting.
117 window.addEventListener("keydown", onKeyDown, true);124 window.addEventListener("keydown", onKeyDown, true);
118 return () => window.removeEventListener("keydown", onKeyDown, true);125 return () => window.removeEventListener("keydown", onKeyDown, true);
119 }, [keybindings, toggleSidebar]);126 }, [keybindings, toggleSidebar, usagePageOpen]);
120127
121 return (128 return (
122 // The right-side layout controls carry mr-px (border compensation inside129 // The right-side layout controls carry mr-px (border compensation inside
apps/web/src/components/settings/KeybindingsSettings.logic.test.ts+18
...@@ -46,6 +46,24 @@ describe("KeybindingsSettings.logic", () => {...@@ -46,6 +46,24 @@ describe("KeybindingsSettings.logic", () => {
46 );46 );
47 },47 },
48 );48 );
49 it("orders Usage bindings and command choices like the page", () => {
50 const expected = [
51 "usage.cost",
52 "usage.open",
53 "usage.tokens",
54 "usage.limits",
55 "usage.period.day",
56 "usage.period.week",
57 "usage.period.month",
58 "usage.period.quarter",
59 ];
60 const bindings = DEFAULT_RESOLVED_KEYBINDINGS.toReversed();
61 expect(buildKeybindingRows(bindings, "usage").map((row) => row.command)).toEqual(expected);
62 expect(
63 buildKeybindingCommandOptions(bindings).filter((command) => command.startsWith("usage.")),
64 ).toEqual(expected);
65 });
66
49 it("builds searchable rows with readable key and when values", () => {67 it("builds searchable rows with readable key and when values", () => {
50 const rows = buildKeybindingRows(68 const rows = buildKeybindingRows(
51 [69 [
apps/web/src/components/settings/KeybindingsSettings.logic.ts+21-3
...@@ -13,6 +13,17 @@ import {...@@ -13,6 +13,17 @@ import {
1313
14import { shortcutKeyFromEvent } from "../../keybindings";14import { shortcutKeyFromEvent } from "../../keybindings";
15import { isMacPlatform } from "../../lib/utils";15import { isMacPlatform } from "../../lib/utils";
16import { METRIC_OPTIONS, WINDOW_OPTIONS } from "../usage/usageShortcuts";
17
18const usageCommandOrder = new Map<KeybindingCommand, number>(
19 [...METRIC_OPTIONS, ...WINDOW_OPTIONS].map((option, index) => [option.command, index]),
20);
21
22function compareUsageCommands(left: KeybindingCommand, right: KeybindingCommand): number | null {
23 const leftIndex = usageCommandOrder.get(left);
24 const rightIndex = usageCommandOrder.get(right);
25 return leftIndex !== undefined && rightIndex !== undefined ? leftIndex - rightIndex : null;
26}
1627
17export type KeybindingSource = "Default" | "Custom" | "Project";28export type KeybindingSource = "Default" | "Custom" | "Project";
1829
...@@ -204,7 +215,9 @@ export function buildKeybindingRows(...@@ -204,7 +215,9 @@ export function buildKeybindingRows(
204 });215 });
205216
206 rowsWithConflicts.sort((left, right) => {217 rowsWithConflicts.sort((left, right) => {
207 const commandCompare = left.command.localeCompare(right.command);218 const commandCompare =
219 compareUsageCommands(left.command, right.command) ??
220 left.command.localeCompare(right.command);
208 if (commandCompare !== 0) return commandCompare;221 if (commandCompare !== 0) return commandCompare;
209 return left.key.localeCompare(right.key);222 return left.key.localeCompare(right.key);
210 });223 });
...@@ -277,13 +290,18 @@ export function buildKeybindingCommandOptions(...@@ -277,13 +290,18 @@ export function buildKeybindingCommandOptions(
277 for (const binding of keybindings) {290 for (const binding of keybindings) {
278 commands.add(binding.command);291 commands.add(binding.command);
279 }292 }
280 return [...commands].toSorted((left, right) =>293 return [...commands].toSorted(
281 commandLabel(left).localeCompare(commandLabel(right)),294 (left, right) =>
295 compareUsageCommands(left, right) ?? commandLabel(left).localeCompare(commandLabel(right)),
282 );296 );
283}297}
284298
285export function commandLabel(command: KeybindingCommand): string {299export function commandLabel(command: KeybindingCommand): string {
286 if (command === "thread.copyReference") return "Pull Request: Copy Link or Thread ID";300 if (command === "thread.copyReference") return "Pull Request: Copy Link or Thread ID";
301 const usageMetric = METRIC_OPTIONS.find((option) => option.command === command);
302 if (usageMetric) return `Usage: ${usageMetric.label}`;
303 const usagePeriod = WINDOW_OPTIONS.find((option) => option.command === command);
304 if (usagePeriod) return `Usage: Period: ${usagePeriod.label}`;
287 const raw = String(command);305 const raw = String(command);
288 if (raw.startsWith("script.") && raw.endsWith(".run")) {306 if (raw.startsWith("script.") && raw.endsWith(".run")) {
289 return `Run Script: ${titleCaseCommandSegment(raw.slice("script.".length, -".run".length))}`;307 return `Run Script: ${titleCaseCommandSegment(raw.slice("script.".length, -".run".length))}`;
apps/web/src/components/usage/UsagePage.refresh.test.tsx+14-2
...@@ -1,6 +1,7 @@...@@ -1,6 +1,7 @@
1import { EnvironmentId, ProviderInstanceId, USAGE_CONTRACT_VERSION } from "@t3tools/contracts";1import { EnvironmentId, ProviderInstanceId, USAGE_CONTRACT_VERSION } from "@t3tools/contracts";
2import { mergeUsage } from "@t3tools/shared/usageMerge";2import { mergeUsage } from "@t3tools/shared/usageMerge";
3import { StrictMode, act } from "react";3import { StrictMode, act } from "react";
4import { DEFAULT_RESOLVED_KEYBINDINGS } from "@t3tools/shared/keybindings";
4import { create, type ReactTestRenderer } from "react-test-renderer";5import { create, type ReactTestRenderer } from "react-test-renderer";
5import { afterEach, beforeEach, expect, it, vi } from "vite-plus/test";6import { afterEach, beforeEach, expect, it, vi } from "vite-plus/test";
67
...@@ -9,11 +10,21 @@ const state = vi.hoisted(() => ({...@@ -9,11 +10,21 @@ const state = vi.hoisted(() => ({
9 refreshProviders: vi.fn(async () => undefined),10 refreshProviders: vi.fn(async () => undefined),
10 metric: "limits",11 metric: "limits",
11}));12}));
12vi.mock("@effect/atom-react", () => ({ useAtomValue: () => state.presentations }));13vi.mock("@effect/atom-react", () => ({
14 useAtomValue: (atom: unknown) =>
15 atom === "keybindings" ? DEFAULT_RESOLVED_KEYBINDINGS : state.presentations,
16}));
17vi.mock("@tanstack/react-router", () => ({
18 useNavigate: () => vi.fn(),
19 useCanGoBack: () => false,
20}));
13vi.mock("../../state/presentation", () => ({21vi.mock("../../state/presentation", () => ({
14 environmentPresentations: { presentationsAtom: null },22 environmentPresentations: { presentationsAtom: null },
15}));23}));
16vi.mock("../../state/server", () => ({ serverEnvironment: { refreshProviders: null } }));24vi.mock("../../state/server", () => ({
25 serverEnvironment: { refreshProviders: null },
26 primaryServerKeybindingsAtom: "keybindings",
27}));
17vi.mock("../../state/use-atom-command", () => ({ useAtomCommand: () => state.refreshProviders }));28vi.mock("../../state/use-atom-command", () => ({ useAtomCommand: () => state.refreshProviders }));
18vi.mock("../../env", () => ({ isElectron: false }));29vi.mock("../../env", () => ({ isElectron: false }));
19vi.mock("../../hooks/useSettings", () => ({ usePrimarySettings: () => "24h" }));30vi.mock("../../hooks/useSettings", () => ({ usePrimarySettings: () => "24h" }));
...@@ -86,6 +97,7 @@ import { UsagePage } from "./UsagePage";...@@ -86,6 +97,7 @@ import { UsagePage } from "./UsagePage";
86let renderer: ReactTestRenderer;97let renderer: ReactTestRenderer;
87let environmentNumber = 0;98let environmentNumber = 0;
88beforeEach(() => {99beforeEach(() => {
100 vi.stubGlobal("window", new EventTarget());
89 vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);101 vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
90 vi.spyOn(Date, "now").mockReturnValue(Date.parse("2026-09-11T12:00:00Z"));102 vi.spyOn(Date, "now").mockReturnValue(Date.parse("2026-09-11T12:00:00Z"));
91 environmentNumber += 1;103 environmentNumber += 1;
apps/web/src/components/usage/UsagePage.test.tsx created+152
...@@ -0,0 +1,152 @@
1import { EnvironmentId, UsageDay, USAGE_CONTRACT_VERSION } from "@t3tools/contracts";
2import { mergeUsage } from "@t3tools/shared/usageMerge";
3import { act } from "react";
4import { createRoot, type Root } from "react-dom/client";
5import { afterEach, beforeEach, describe, expect, it, vi } from "vite-plus/test";
6
7const testState = vi.hoisted(() => ({
8 useUsage: vi.fn(),
9 navigate: vi.fn(),
10 canGoBack: true,
11}));
12
13vi.mock("../../env", () => ({ isElectron: false }));
14vi.mock("@tanstack/react-router", () => ({
15 useNavigate: () => testState.navigate,
16 useCanGoBack: () => testState.canGoBack,
17}));
18vi.mock("../../state/usage", () => ({ useUsage: testState.useUsage }));
19vi.mock("../ui/scroll-area", () => ({ ScrollArea: "div" }));
20vi.mock("../ui/select", () => ({
21 Select: "div",
22 SelectItem: "div",
23 SelectPopup: "div",
24 SelectTrigger: "div",
25 SelectValue: "div",
26}));
27vi.mock("../ui/sidebar", () => ({ SidebarInset: "div" }));
28vi.mock("../ui/toggle-group", () => ({ Toggle: "button", ToggleGroup: "div" }));
29vi.mock("../WorkspaceBreadcrumb", () => ({
30 WorkspaceBreadcrumb: "div",
31 WorkspaceBreadcrumbItem: "div",
32 WorkspaceBreadcrumbSeparator: "span",
33}));
34vi.mock("../WorkspacePageContainer", () => ({ WorkspacePageContainer: "main" }));
35vi.mock("../WorkspacePageHeader", () => ({ WorkspacePageHeader: "header" }));
36vi.mock("./UsageProviderChart", () => ({ UsageProviderChart: "div" }));
37vi.mock("./UsagePriceOverrides", () => ({ UsagePriceOverrides: () => null }));
38vi.mock("./usageProviders", async (importOriginal) => {
39 const actual = await importOriginal<typeof import("./usageProviders")>();
40 return {
41 ...actual,
42 PROVIDER_PRESENTATION: {
43 codex: { color: "white", label: "Codex", mark: "span" },
44 claude: { color: "orange", label: "Claude Code", mark: "span" },
45 },
46 };
47});
48
49import { UsagePage } from "./UsagePage";
50const environments = [
51 {
52 environmentId: EnvironmentId.make("test-environment"),
53 label: "Test environment",
54 isPending: false,
55 error: null,
56 summary: {
57 contractVersion: USAGE_CONTRACT_VERSION,
58 readAt: "2026-08-11T12:37:00.000Z",
59 sinceDay: UsageDay.make("2026-08-10"),
60 untilDay: UsageDay.make("2026-08-11"),
61 timeZone: "UTC",
62 buckets: [],
63 sources: [],
64 pricing: { status: "fresh", source: "test", fetchedAt: null, knownModels: 1 },
65 scanDurationMs: 1,
66 },
67 },
68];
69
70beforeEach(() => {
71 testState.useUsage.mockReturnValue({
72 merged: mergeUsage([], USAGE_CONTRACT_VERSION),
73 environments,
74 selectedEnvironments: environments,
75 isPending: false,
76 isPartial: false,
77 refresh: vi.fn(),
78 });
79});
80
81describe("UsagePage Escape navigation", () => {
82 let renderer: Root;
83 let container: HTMLDivElement;
84 let back: ReturnType<typeof vi.spyOn>;
85
86 beforeEach(async () => {
87 back = vi.spyOn(window.history, "back").mockImplementation(() => {});
88 testState.navigate.mockClear();
89 testState.canGoBack = true;
90 vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
91 container = document.createElement("div");
92 document.body.append(container);
93 renderer = createRoot(container);
94 await act(() => {
95 renderer.render(<UsagePage />);
96 });
97 });
98
99 afterEach(async () => {
100 await act(() => renderer.unmount());
101 container.remove();
102 back.mockRestore();
103 vi.unstubAllGlobals();
104 });
105
106 function escape(properties: { repeat?: boolean; isComposing?: boolean } = {}) {
107 return new KeyboardEvent("keydown", {
108 bubbles: true,
109 cancelable: true,
110 key: "Escape",
111 ...properties,
112 });
113 }
114
115 it("returns to the previous page on Escape", () => {
116 document.body.dispatchEvent(escape());
117 expect(back).toHaveBeenCalledOnce();
118 expect(testState.navigate).not.toHaveBeenCalled();
119 });
120
121 it("returns home when there is no previous app page", async () => {
122 testState.canGoBack = false;
123 await act(() => renderer.render(<UsagePage />));
124
125 document.body.dispatchEvent(escape());
126 expect(testState.navigate).toHaveBeenCalledWith({ to: "/" });
127 expect(back).not.toHaveBeenCalled();
128 });
129
130 it("closes the environment menu before Escape navigates back", async () => {
131 const trigger = container.querySelector<HTMLButtonElement>('[data-slot="menu-trigger"]')!;
132 await act(() => trigger.click());
133 expect(document.querySelector('[role="menu"]')).not.toBeNull();
134
135 await act(() => {
136 document.activeElement!.dispatchEvent(escape());
137 });
138 expect(trigger.getAttribute("aria-expanded")).toBe("false");
139 expect(back).not.toHaveBeenCalled();
140
141 document.body.dispatchEvent(escape());
142 expect(back).toHaveBeenCalledOnce();
143 });
144
145 it.each([{ repeat: true }, { isComposing: true }])("ignores Escape with %j", (properties) => {
146 document.body.dispatchEvent(escape(properties));
147 expect(back).not.toHaveBeenCalled();
148 expect(testState.navigate).not.toHaveBeenCalled();
149 });
150});
151
152// @vitest-environment jsdom
apps/web/src/components/usage/UsagePage.tsx+56-20
...@@ -25,7 +25,10 @@ import {...@@ -25,7 +25,10 @@ import {
25import { isElectron } from "../../env";25import { isElectron } from "../../env";
26import { cn } from "../../lib/utils";26import { cn } from "../../lib/utils";
27import { environmentPresentations } from "../../state/presentation";27import { environmentPresentations } from "../../state/presentation";
28import { serverEnvironment } from "../../state/server";28import { primaryServerKeybindingsAtom, serverEnvironment } from "../../state/server";
29import { isCommandPaletteOpen } from "../../commandPaletteBus";
30import { isModelPickerOpen } from "../../modelPickerVisibility";
31import { shortcutLabelForCommand } from "../../keybindings";
29import { useUsage, type EnvironmentUsageStatus } from "../../state/usage";32import { useUsage, type EnvironmentUsageStatus } from "../../state/usage";
30import { useAtomCommand } from "../../state/use-atom-command";33import { useAtomCommand } from "../../state/use-atom-command";
31import {34import {
...@@ -65,8 +68,15 @@ import { WorkspacePageContainer } from "../WorkspacePageContainer";...@@ -65,8 +68,15 @@ import { WorkspacePageContainer } from "../WorkspacePageContainer";
65import { WorkspacePageHeader } from "../WorkspacePageHeader";68import { WorkspacePageHeader } from "../WorkspacePageHeader";
66import { UsageLimitsSection } from "./UsageLimits";69import { UsageLimitsSection } from "./UsageLimits";
67import { UsagePriceOverrides } from "./UsagePriceOverrides";70import { UsagePriceOverrides } from "./UsagePriceOverrides";
68import { UsageProviderChart, type UsageChartMetric } from "./UsageProviderChart";71import { UsageProviderChart } from "./UsageProviderChart";
69import { sortModelsByTokens } from "./usageBreakdown";72import { sortModelsByTokens } from "./usageBreakdown";
73import {
74 METRIC_OPTIONS,
75 WINDOW_OPTIONS,
76 resolveUsageShortcut,
77 type UsageMetric,
78} from "./usageShortcuts";
79import { useEscapeToGoBack } from "../../hooks/useNavigateBack";
70import { PROVIDER_ORDER, PROVIDER_PRESENTATION, providersWithUsage } from "./usageProviders";80import { PROVIDER_ORDER, PROVIDER_PRESENTATION, providersWithUsage } from "./usageProviders";
71import {81import {
72 readUsagePagePreferences,82 readUsagePagePreferences,
...@@ -74,30 +84,26 @@ import {...@@ -74,30 +84,26 @@ import {
74 type UsagePagePreferences,84 type UsagePagePreferences,
75} from "./usagePagePreferences";85} from "./usagePagePreferences";
7686
77type UsageMetric = UsageChartMetric | "limits";
78const METRIC_OPTIONS = [
79 { value: "cost", label: "Cost" },
80 { value: "tokens", label: "Tokens" },
81 { value: "limits", label: "Limits" },
82] as const satisfies readonly { value: UsageMetric; label: string }[];
83
84function isUsageMetric(value: string | null | undefined): value is UsageMetric {87function isUsageMetric(value: string | null | undefined): value is UsageMetric {
85 return METRIC_OPTIONS.some((option) => option.value === value);88 return METRIC_OPTIONS.some((option) => option.value === value);
86}89}
8790
88const WINDOW_OPTIONS = [
89 { days: 1, label: "Past 24h" },
90 { days: 7, label: "7 days" },
91 { days: 30, label: "30 days" },
92 { days: 90, label: "90 days" },
93] as const;
94
95function isUsageWindowDays(value: number): value is UsagePagePreferences["windowDays"] {91function isUsageWindowDays(value: number): value is UsagePagePreferences["windowDays"] {
96 return WINDOW_OPTIONS.some((option) => option.days === value);92 return WINDOW_OPTIONS.some((option) => option.days === value);
97}93}
9894
99export function UsagePage() {95export function UsagePage() {
100 const [preferences, setPreferences] = useState(readUsagePagePreferences);96 const [preferences, setPreferences] = useState(readUsagePagePreferences);
97 useEscapeToGoBack();
98 const keybindings = useAtomValue(primaryServerKeybindingsAtom);
99 const shortcutTitle = (
100 option: (typeof METRIC_OPTIONS)[number] | (typeof WINDOW_OPTIONS)[number],
101 ) => {
102 const shortcut = shortcutLabelForCommand(keybindings, option.command, {
103 context: { usagePageOpen: true },
104 });
105 return shortcut ? `${option.label} (${shortcut})` : option.label;
106 };
101 const [windowSelection, setWindowSelection] = useState(() => ({107 const [windowSelection, setWindowSelection] = useState(() => ({
102 days: preferences.windowDays,108 days: preferences.windowDays,
103 window: makeWindow(109 window: makeWindow(
...@@ -217,6 +223,32 @@ export function UsagePage() {...@@ -217,6 +223,32 @@ export function UsagePage() {
217 setLimitsNow(Date.now());223 setLimitsNow(Date.now());
218 }224 }
219 };225 };
226 const onUsageKeyDown = useEffectEvent((event: KeyboardEvent) => {
227 if (
228 event.defaultPrevented ||
229 event.repeat ||
230 event.isComposing ||
231 isCommandPaletteOpen() ||
232 isModelPickerOpen()
233 )
234 return;
235
236 const command = resolveUsageShortcut(event, keybindings);
237 const metricOption = METRIC_OPTIONS.find((option) => option.command === command);
238 const periodOption = WINDOW_OPTIONS.find((option) => option.command === command);
239 if (!metricOption && !periodOption) return;
240
241 event.preventDefault();
242 event.stopPropagation();
243 if (metricOption) selectMetric(metricOption.value);
244 if (periodOption && !showingLimits) selectWindow(periodOption.days);
245 });
246
247 useEffect(() => {
248 globalThis.window.addEventListener("keydown", onUsageKeyDown, true);
249 return () => globalThis.window.removeEventListener("keydown", onUsageKeyDown, true);
250 }, []);
251
220 const refreshWindow = () => {252 const refreshWindow = () => {
221 if (refreshingRef.current) return;253 if (refreshingRef.current) return;
222254
...@@ -302,7 +334,7 @@ export function UsagePage() {...@@ -302,7 +334,7 @@ export function UsagePage() {
302 }}334 }}
303 >335 >
304 {METRIC_OPTIONS.map((option) => (336 {METRIC_OPTIONS.map((option) => (
305 <Toggle key={option.value} value={option.value}>337 <Toggle key={option.value} value={option.value} title={shortcutTitle(option)}>
306 {option.label}338 {option.label}
307 </Toggle>339 </Toggle>
308 ))}340 ))}
...@@ -320,7 +352,7 @@ export function UsagePage() {...@@ -320,7 +352,7 @@ export function UsagePage() {
320 }}352 }}
321 >353 >
322 {WINDOW_OPTIONS.map((option) => (354 {WINDOW_OPTIONS.map((option) => (
323 <Toggle key={option.days} value={String(option.days)}>355 <Toggle key={option.days} value={String(option.days)} title={shortcutTitle(option)}>
324 {option.label}356 {option.label}
325 </Toggle>357 </Toggle>
326 ))}358 ))}
...@@ -355,7 +387,7 @@ export function UsagePage() {...@@ -355,7 +387,7 @@ export function UsagePage() {
355 </SelectTrigger>387 </SelectTrigger>
356 <SelectPopup align="end" alignItemWithTrigger={false}>388 <SelectPopup align="end" alignItemWithTrigger={false}>
357 {METRIC_OPTIONS.map((option) => (389 {METRIC_OPTIONS.map((option) => (
358 <SelectItem key={option.value} value={option.value}>390 <SelectItem key={option.value} value={option.value} title={shortcutTitle(option)}>
359 {option.label}391 {option.label}
360 </SelectItem>392 </SelectItem>
361 ))}393 ))}
...@@ -378,7 +410,11 @@ export function UsagePage() {...@@ -378,7 +410,11 @@ export function UsagePage() {
378 </SelectTrigger>410 </SelectTrigger>
379 <SelectPopup align="end" alignItemWithTrigger={false}>411 <SelectPopup align="end" alignItemWithTrigger={false}>
380 {WINDOW_OPTIONS.map((option) => (412 {WINDOW_OPTIONS.map((option) => (
381 <SelectItem key={option.days} value={String(option.days)}>413 <SelectItem
414 key={option.days}
415 value={String(option.days)}
416 title={shortcutTitle(option)}
417 >
382 {option.label}418 {option.label}
383 </SelectItem>419 </SelectItem>
384 ))}420 ))}
apps/web/src/components/usage/usageShortcuts.test.ts created+44
...@@ -0,0 +1,44 @@
1import { DEFAULT_RESOLVED_KEYBINDINGS } from "@t3tools/shared/keybindings";
2import { afterEach, describe, expect, it, vi } from "vite-plus/test";
3import { resolveUsageShortcut } from "./usageShortcuts";
4
5class TestElement extends EventTarget {
6 constructor(
7 readonly tagName: string,
8 readonly isContentEditable = false,
9 ) {
10 super();
11 }
12
13 closest() {
14 return null;
15 }
16}
17
18afterEach(() => vi.unstubAllGlobals());
19
20describe("Usage shortcuts while typing", () => {
21 it.each([new TestElement("INPUT"), new TestElement("TEXTAREA"), new TestElement("DIV", true)])(
22 "leaves letters to the focused $tagName field",
23 (target) => {
24 vi.stubGlobal("HTMLElement", TestElement);
25 vi.stubGlobal("navigator", { platform: "Linux" });
26 const event = {
27 key: "t",
28 metaKey: false,
29 ctrlKey: false,
30 shiftKey: false,
31 altKey: false,
32 target,
33 };
34
35 expect(resolveUsageShortcut(event, DEFAULT_RESOLVED_KEYBINDINGS)).toBeNull();
36 expect(
37 resolveUsageShortcut(
38 { ...event, target: new TestElement("BODY") },
39 DEFAULT_RESOLVED_KEYBINDINGS,
40 ),
41 ).toBe("usage.tokens");
42 },
43 );
44});
apps/web/src/components/usage/usageShortcuts.ts created+39
...@@ -0,0 +1,39 @@
1import type { KeybindingCommand, ResolvedKeybindingsConfig } from "@t3tools/contracts";
2import type { UsageChartMetric } from "./UsageProviderChart";
3import { resolveShortcutCommand, type ShortcutEventLike } from "../../keybindings";
4
5export type UsageMetric = UsageChartMetric | "limits";
6export const METRIC_OPTIONS = [
7 { value: "cost", label: "Cost", command: "usage.cost" },
8 { value: "tokens", label: "Tokens", command: "usage.tokens" },
9 { value: "limits", label: "Limits", command: "usage.limits" },
10] as const satisfies readonly { value: UsageMetric; label: string; command: KeybindingCommand }[];
11
12export const WINDOW_OPTIONS = [
13 { days: 1, label: "Past 24h", command: "usage.period.day" },
14 { days: 7, label: "7 days", command: "usage.period.week" },
15 { days: 30, label: "30 days", command: "usage.period.month" },
16 { days: 90, label: "90 days", command: "usage.period.quarter" },
17] as const;
18
19/** Resolves page shortcuts without taking letters from fields or popup controls. */
20export function resolveUsageShortcut(
21 event: ShortcutEventLike & { target: EventTarget | null },
22 keybindings: ResolvedKeybindingsConfig,
23) {
24 const target = event.target;
25 if (
26 target instanceof HTMLElement &&
27 (target.tagName === "INPUT" ||
28 target.tagName === "TEXTAREA" ||
29 target.tagName === "SELECT" ||
30 target.isContentEditable ||
31 target.closest('[role="dialog"], [aria-modal="true"], [data-slot$="popup"]'))
32 ) {
33 return null;
34 }
35
36 return resolveShortcutCommand(event, keybindings, {
37 context: { usagePageOpen: true },
38 });
39}
apps/web/src/hooks/useNavigateBack.ts created+40
...@@ -0,0 +1,40 @@
1import { useCanGoBack, useNavigate } from "@tanstack/react-router";
2import { useCallback, useEffect } from "react";
3
4/** Returns to the previous app page, or home when opened without app history. */
5function useNavigateBack() {
6 const navigate = useNavigate();
7 const canGoBack = useCanGoBack();
8
9 return useCallback(() => {
10 if (canGoBack) {
11 window.history.back();
12 return;
13 }
14 void navigate({ to: "/" });
15 }, [canGoBack, navigate]);
16}
17
18/** Enables page-level Escape navigation, letting controls consume Escape first. */
19export function useEscapeToGoBack(onEscape?: () => void) {
20 const navigateBack = useNavigateBack();
21 const handleEscape = onEscape ?? navigateBack;
22
23 useEffect(() => {
24 const onKeyDown = (event: KeyboardEvent) => {
25 if (event.defaultPrevented || event.repeat || event.isComposing || event.key !== "Escape")
26 return;
27 event.preventDefault();
28
29 const activeElement = document.activeElement;
30 if (activeElement instanceof HTMLElement) {
31 activeElement.blur();
32 }
33
34 handleEscape();
35 };
36
37 window.addEventListener("keydown", onKeyDown);
38 return () => window.removeEventListener("keydown", onKeyDown);
39 }, [handleEscape]);
40}
apps/web/src/keybindings.test.ts+57
...@@ -1391,3 +1391,60 @@ describe("composer and pull request shortcuts", () => {...@@ -1391,3 +1391,60 @@ describe("composer and pull request shortcuts", () => {
1391 });1391 });
1392 }1392 }
1393});1393});
1394
1395describe("Usage shortcuts", () => {
1396 it("scopes letter shortcuts to Usage", () => {
1397 assert.strictEqual(
1398 resolveShortcutCommand(event({ key: "t" }), DEFAULT_RESOLVED_KEYBINDINGS, {
1399 platform: "Linux",
1400 context: { usagePageOpen: true },
1401 }),
1402 "usage.tokens",
1403 );
1404 assert.isNull(
1405 resolveShortcutCommand(event({ key: "t" }), DEFAULT_RESOLVED_KEYBINDINGS, {
1406 platform: "Linux",
1407 }),
1408 );
1409 });
1410
1411 it.each(["Linux", "MacIntel"])(
1412 "preserves desktop numbered thread shortcuts on Usage on %s",
1413 (platform) => {
1414 const shortcut = event({
1415 key: "2",
1416 ctrlKey: platform === "Linux",
1417 metaKey: platform === "MacIntel",
1418 });
1419 assert.strictEqual(
1420 resolveShortcutCommand(shortcut, DEFAULT_RESOLVED_KEYBINDINGS, {
1421 platform,
1422 context: { usagePageOpen: true, isDesktop: true },
1423 }),
1424 "thread.jump.2",
1425 );
1426 assert.isNotNull(
1427 shortcutLabelForCommand(DEFAULT_RESOLVED_KEYBINDINGS, "thread.jump.2", {
1428 platform,
1429 context: { usagePageOpen: true, isDesktop: true },
1430 }),
1431 );
1432 },
1433 );
1434
1435 it("matches shifted number keys for periods and only on Usage", () => {
1436 const shortcut = event({ key: "!", code: "Digit1", ctrlKey: true, shiftKey: true });
1437 assert.strictEqual(
1438 resolveShortcutCommand(shortcut, DEFAULT_RESOLVED_KEYBINDINGS, {
1439 platform: "Linux",
1440 context: { usagePageOpen: true },
1441 }),
1442 "usage.period.day",
1443 );
1444 assert.isNull(
1445 resolveShortcutCommand(shortcut, DEFAULT_RESOLVED_KEYBINDINGS, {
1446 platform: "Linux",
1447 }),
1448 );
1449 });
1450});
apps/web/src/routes/_chat.pull-requests.tsx+5-2
...@@ -132,6 +132,7 @@ import { useLiveRefresh } from "../hooks/useLiveRefresh";...@@ -132,6 +132,7 @@ import { useLiveRefresh } from "../hooks/useLiveRefresh";
132import { useOpenPanelPullRequestUrl } from "../hooks/useOpenPanelPullRequestUrl";132import { useOpenPanelPullRequestUrl } from "../hooks/useOpenPanelPullRequestUrl";
133import { writeTextToClipboard } from "../hooks/useCopyToClipboard";133import { writeTextToClipboard } from "../hooks/useCopyToClipboard";
134import { toastManager } from "../components/ui/toast";134import { toastManager } from "../components/ui/toast";
135import { useEscapeToGoBack } from "../hooks/useNavigateBack";
135import { usePanelAnimationSettings, usePanelPresence } from "../panelAnimations";136import { usePanelAnimationSettings, usePanelPresence } from "../panelAnimations";
136import {137import {
137 PULL_REQUESTS_PANEL_REF,138 PULL_REQUESTS_PANEL_REF,
...@@ -340,6 +341,7 @@ export const Route = createFileRoute("/_chat/pull-requests")({...@@ -340,6 +341,7 @@ export const Route = createFileRoute("/_chat/pull-requests")({
340});341});
341342
342function PullRequestsRouteView() {343function PullRequestsRouteView() {
344 useEscapeToGoBack();
343 const search = Route.useSearch();345 const search = Route.useSearch();
344 const sort = search.sort ?? "ready";346 const sort = search.sort ?? "ready";
345 const statsPolicy: PullRequestStatsPolicy =347 const statsPolicy: PullRequestStatsPolicy =
...@@ -2063,8 +2065,9 @@ function PullRequestsRouteView() {...@@ -2063,8 +2065,9 @@ function PullRequestsRouteView() {
2063 if (command === "rightPanel.toggle") toggleRightPanelFromShortcut(event);2065 if (command === "rightPanel.toggle") toggleRightPanelFromShortcut(event);
2064 if (command === "thread.copyReference") copyPullRequestFromShortcut(event);2066 if (command === "thread.copyReference") copyPullRequestFromShortcut(event);
2065 };2067 };
2066 window.addEventListener("keydown", onKeyDown);2068 // Let panel shortcuts consume Escape before page navigation at window.
2067 return () => window.removeEventListener("keydown", onKeyDown);2069 document.addEventListener("keydown", onKeyDown);
2070 return () => document.removeEventListener("keydown", onKeyDown);
2068 }, [keybindings]);2071 }, [keybindings]);
20692072
2070 return (2073 return (
apps/web/src/routes/settings.tsx+3-22
...@@ -1,5 +1,5 @@...@@ -1,5 +1,5 @@
1import { Outlet, createFileRoute, redirect, useLocation } from "@tanstack/react-router";1import { Outlet, createFileRoute, redirect, useLocation } from "@tanstack/react-router";
2import { useEffect, useState, type ReactNode } from "react";2import { useState, type ReactNode } from "react";
3import { RotateCcwIcon } from "lucide-react";3import { RotateCcwIcon } from "lucide-react";
4import { Button } from "../components/ui/button";4import { Button } from "../components/ui/button";
5import { useSettingsRestore } from "../components/settings/SettingsPanels";5import { useSettingsRestore } from "../components/settings/SettingsPanels";
...@@ -9,6 +9,7 @@ import { SidebarInset } from "../components/ui/sidebar";...@@ -9,6 +9,7 @@ import { SidebarInset } from "../components/ui/sidebar";
9import { useNavigateToMainApp } from "../components/sidebar/mainAppLocation";9import { useNavigateToMainApp } from "../components/sidebar/mainAppLocation";
10import { WorkspacePageHeader } from "../components/WorkspacePageHeader";10import { WorkspacePageHeader } from "../components/WorkspacePageHeader";
11import { isElectron } from "../env";11import { isElectron } from "../env";
12import { useEscapeToGoBack } from "../hooks/useNavigateBack";
12import {13import {
13 SettingsScopeProvider,14 SettingsScopeProvider,
14 useSettingsScope,15 useSettingsScope,
...@@ -112,30 +113,10 @@ function SettingsScopeBoundary({ pathname, children }: { pathname: string; child...@@ -112,30 +113,10 @@ function SettingsScopeBoundary({ pathname, children }: { pathname: string; child
112function SettingsContentLayout() {113function SettingsContentLayout() {
113 const location = useLocation();114 const location = useLocation();
114 const navigateToMainApp = useNavigateToMainApp();115 const navigateToMainApp = useNavigateToMainApp();
116 useEscapeToGoBack(navigateToMainApp);
115 const { search } = useSettingsScope();117 const { search } = useSettingsScope();
116 const [restoreSignal, setRestoreSignal] = useState(0);118 const [restoreSignal, setRestoreSignal] = useState(0);
117119
118 useEffect(() => {
119 const onKeyDown = (event: KeyboardEvent) => {
120 if (event.defaultPrevented) return;
121 if (event.key === "Escape") {
122 event.preventDefault();
123
124 const activeElement = document.activeElement;
125 if (activeElement instanceof HTMLElement) {
126 activeElement.blur();
127 }
128
129 void navigateToMainApp();
130 }
131 };
132
133 window.addEventListener("keydown", onKeyDown);
134 return () => {
135 window.removeEventListener("keydown", onKeyDown);
136 };
137 }, [navigateToMainApp]);
138
139 return (120 return (
140 <SidebarInset className="h-dvh min-h-0 overflow-hidden overscroll-y-none isolate">121 <SidebarInset className="h-dvh min-h-0 overflow-hidden overscroll-y-none isolate">
141 <div className="flex min-h-0 min-w-0 flex-1 flex-col bg-background text-foreground">122 <div className="flex min-h-0 min-w-0 flex-1 flex-col bg-background text-foreground">
docs/user/keybindings.md+1-1
...@@ -84,7 +84,7 @@ Join modifiers and a key with `+`, such as `mod+shift+d` or `ctrl+l`....@@ -84,7 +84,7 @@ Join modifiers and a key with `+`, such as `mod+shift+d` or `ctrl+l`.
84## When conditions84## When conditions
8585
86Available context keys are `terminalFocus`, `terminalOpen`, `previewFocus`,86Available context keys are `terminalFocus`, `terminalOpen`, `previewFocus`,
87`previewOpen`, `modelPickerOpen`, `editableFocus`, `isWeb`, and `isDesktop`.87`previewOpen`, `modelPickerOpen`, `usagePageOpen`, `editableFocus`, `isWeb`, and `isDesktop`.
88`editableFocus` is true while a text field, the composer, or another editor has88`editableFocus` is true while a text field, the composer, or another editor has
89the keyboard. `isWeb` is true in a browser tab. `isDesktop` is true in the89the keyboard. `isWeb` is true in a browser tab. `isDesktop` is true in the
90desktop app. Unknown keys evaluate to `false`.90desktop app. Unknown keys evaluate to `false`.
docs/user/usage.md+9
...@@ -120,3 +120,12 @@ Add **Subscription usage** from your iOS or Android widget gallery to see remain...@@ -120,3 +120,12 @@ Add **Subscription usage** from your iOS or Android widget gallery to see remain
120Claude quotas. Tap it to open **Usage → Limits**. On iOS, use **Edit Widget** to choose Session,120Claude quotas. Tap it to open **Usage → Limits**. On iOS, use **Edit Widget** to choose Session,
121Weekly, or both for each provider. Reopen T3 to refresh expired readings. The Android widget121Weekly, or both for each provider. Reopen T3 to refresh expired readings. The Android widget
122requires Android 12L or later.122requires Android 12L or later.
123
124## Keyboard shortcuts
125
126On web and desktop, open Usage from the command palette. While on Usage,
127press `C`, `T`, or `L` for Cost, Tokens, or Limits while not typing in a field.
128Use `Ctrl+Shift+1/2/3/4` (`Cmd+Shift+1/2/3/4` on macOS) for the past
12924 hours, 7 days, 30 days, or 90 days. Period shortcuts do nothing on Limits.
130Press `Escape` to return to the previous page. Customize these shortcuts in
131**Settings → Keybindings**.
knip.jsonc+2
...@@ -53,6 +53,8 @@...@@ -53,6 +53,8 @@
53 "ignoreDependencies": ["playwright-core", "electron-builder"],53 "ignoreDependencies": ["playwright-core", "electron-builder"],
54 },54 },
55 "apps/web": {55 "apps/web": {
56 // Vitest loads this through the per-file @vitest-environment directive.
57 "ignoreDependencies": ["jsdom"],
56 // Worktree setup (scripts/setup-worktree.ts) runs this directly.58 // Worktree setup (scripts/setup-worktree.ts) runs this directly.
57 "entry": ["scripts/warm-dep-cache.ts"],59 "entry": ["scripts/warm-dep-cache.ts"],
58 // UI component modules are copied and adapted as cohesive sets. Keep their60 // UI component modules are copied and adapted as cohesive sets. Keep their
packages/contracts/src/keybindings.ts+7
...@@ -92,6 +92,13 @@ export const STATIC_KEYBINDING_COMMANDS = [...@@ -92,6 +92,13 @@ export const STATIC_KEYBINDING_COMMANDS = [
92 "chat.new",92 "chat.new",
93 "chat.newLocal",93 "chat.newLocal",
94 "editor.openFavorite",94 "editor.openFavorite",
95 "usage.cost",
96 "usage.tokens",
97 "usage.limits",
98 "usage.period.day",
99 "usage.period.week",
100 "usage.period.month",
101 "usage.period.quarter",
95 ...MODEL_PICKER_KEYBINDING_COMMANDS,102 ...MODEL_PICKER_KEYBINDING_COMMANDS,
96 ...THREAD_KEYBINDING_COMMANDS,103 ...THREAD_KEYBINDING_COMMANDS,
97] as const;104] as const;
packages/shared/src/keybindings.ts+7
...@@ -76,6 +76,13 @@ export const DEFAULT_KEYBINDINGS: ReadonlyArray<KeybindingRule> = [...@@ -76,6 +76,13 @@ export const DEFAULT_KEYBINDINGS: ReadonlyArray<KeybindingRule> = [
76 command,76 command,
77 when: "modelPickerOpen && isDesktop",77 when: "modelPickerOpen && isDesktop",
78 })),78 })),
79 { key: "c", command: "usage.cost", when: "usagePageOpen" },
80 { key: "t", command: "usage.tokens", when: "usagePageOpen" },
81 { key: "l", command: "usage.limits", when: "usagePageOpen" },
82 { key: "mod+shift+1", command: "usage.period.day", when: "usagePageOpen" },
83 { key: "mod+shift+2", command: "usage.period.week", when: "usagePageOpen" },
84 { key: "mod+shift+3", command: "usage.period.month", when: "usagePageOpen" },
85 { key: "mod+shift+4", command: "usage.period.quarter", when: "usagePageOpen" },
79];86];
8087
81function normalizeKeyToken(token: string): string {88function normalizeKeyToken(token: string): string {
pnpm-lock.yaml+323-46
...@@ -35,6 +35,7 @@ catalogs:...@@ -35,6 +35,7 @@ catalogs:
35 version: 0.3.335 version: 0.3.3
3636
37overrides:37overrides:
38 '@exodus/bytes>@noble/hashes': 1.8.0
38 '@react-navigation/core': 7.21.1339 '@react-navigation/core': 7.21.13
39 dbus-next>usocket: '-'40 dbus-next>usocket: '-'
40 '@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-darwin-arm64': '-'41 '@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-darwin-arm64': '-'
...@@ -135,7 +136,7 @@ importers:...@@ -135,7 +136,7 @@ importers:
135 version: 7.0.2136 version: 7.0.2
136 vite-plus:137 vite-plus:
137 specifier: 'catalog:'138 specifier: 'catalog:'
138 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)139 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
139140
140 apps/desktop:141 apps/desktop:
141 dependencies:142 dependencies:
...@@ -214,7 +215,7 @@ importers:...@@ -214,7 +215,7 @@ importers:
214 version: 4.3.3215 version: 4.3.3
215 vite-plus:216 vite-plus:
216 specifier: 'catalog:'217 specifier: 'catalog:'
217 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)218 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
218219
219 apps/marketing:220 apps/marketing:
220 dependencies:221 dependencies:
...@@ -577,7 +578,7 @@ importers:...@@ -577,7 +578,7 @@ importers:
577 version: link:../../packages/effect-codex-app-server578 version: link:../../packages/effect-codex-app-server
578 vite-plus:579 vite-plus:
579 specifier: 'catalog:'580 specifier: 'catalog:'
580 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)581 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
581582
582 apps/web:583 apps/web:
583 dependencies:584 dependencies:
...@@ -765,6 +766,9 @@ importers:...@@ -765,6 +766,9 @@ importers:
765 compression:766 compression:
766 specifier: ^1.8.1767 specifier: ^1.8.1
767 version: 1.8.1768 version: 1.8.1
769 jsdom:
770 specifier: ^30.0.1
771 version: 30.1.0(@noble/hashes@1.8.0)
768 react-test-renderer:772 react-test-renderer:
769 specifier: 19.2.6773 specifier: 19.2.6
770 version: 19.2.6(react@19.2.6)774 version: 19.2.6(react@19.2.6)
...@@ -779,7 +783,7 @@ importers:...@@ -779,7 +783,7 @@ importers:
779 version: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'783 version: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
780 vite-plus:784 vite-plus:
781 specifier: 'catalog:'785 specifier: 'catalog:'
782 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)786 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
783787
784 infra/relay:788 infra/relay:
785 dependencies:789 dependencies:
...@@ -834,7 +838,7 @@ importers:...@@ -834,7 +838,7 @@ importers:
834 version: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'838 version: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
835 vite-plus:839 vite-plus:
836 specifier: 'catalog:'840 specifier: 'catalog:'
837 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)841 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
838842
839 oxlint-plugin-t3code:843 oxlint-plugin-t3code:
840 dependencies:844 dependencies:
...@@ -853,7 +857,7 @@ importers:...@@ -853,7 +857,7 @@ importers:
853 version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))857 version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
854 vite-plus:858 vite-plus:
855 specifier: 'catalog:'859 specifier: 'catalog:'
856 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)860 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
857861
858 packages/client-runtime:862 packages/client-runtime:
859 dependencies:863 dependencies:
...@@ -896,7 +900,7 @@ importers:...@@ -896,7 +900,7 @@ importers:
896 version: 2.0.2900 version: 2.0.2
897 vite-plus:901 vite-plus:
898 specifier: 'catalog:'902 specifier: 'catalog:'
899 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)903 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
900904
901 packages/contracts:905 packages/contracts:
902 dependencies:906 dependencies:
...@@ -909,7 +913,7 @@ importers:...@@ -909,7 +913,7 @@ importers:
909 version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))913 version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
910 vite-plus:914 vite-plus:
911 specifier: 'catalog:'915 specifier: 'catalog:'
912 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)916 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
913917
914 packages/effect-acp:918 packages/effect-acp:
915 dependencies:919 dependencies:
...@@ -931,7 +935,7 @@ importers:...@@ -931,7 +935,7 @@ importers:
931 version: 24.12.4935 version: 24.12.4
932 vite-plus:936 vite-plus:
933 specifier: 'catalog:'937 specifier: 'catalog:'
934 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)938 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
935939
936 packages/effect-codex-app-server:940 packages/effect-codex-app-server:
937 dependencies:941 dependencies:
...@@ -953,7 +957,7 @@ importers:...@@ -953,7 +957,7 @@ importers:
953 version: 24.12.4957 version: 24.12.4
954 vite-plus:958 vite-plus:
955 specifier: 'catalog:'959 specifier: 'catalog:'
956 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)960 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
957961
958 packages/shared:962 packages/shared:
959 dependencies:963 dependencies:
...@@ -987,7 +991,7 @@ importers:...@@ -987,7 +991,7 @@ importers:
987 version: 24.12.4991 version: 24.12.4
988 vite-plus:992 vite-plus:
989 specifier: 'catalog:'993 specifier: 'catalog:'
990 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)994 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
991995
992 packages/ssh:996 packages/ssh:
993 dependencies:997 dependencies:
...@@ -1012,7 +1016,7 @@ importers:...@@ -1012,7 +1016,7 @@ importers:
1012 version: 24.12.41016 version: 24.12.4
1013 vite-plus:1017 vite-plus:
1014 specifier: 'catalog:'1018 specifier: 'catalog:'
1015 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)1019 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
10161020
1017 packages/tailscale:1021 packages/tailscale:
1018 dependencies:1022 dependencies:
...@@ -1031,7 +1035,7 @@ importers:...@@ -1031,7 +1035,7 @@ importers:
1031 version: 24.12.41035 version: 24.12.4
1032 vite-plus:1036 vite-plus:
1033 specifier: 'catalog:'1037 specifier: 'catalog:'
1034 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)1038 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
10351039
1036 scripts:1040 scripts:
1037 dependencies:1041 dependencies:
...@@ -1074,7 +1078,7 @@ importers:...@@ -1074,7 +1078,7 @@ importers:
1074 version: typescript@6.0.31078 version: typescript@6.0.3
1075 vite-plus:1079 vite-plus:
1076 specifier: 'catalog:'1080 specifier: 'catalog:'
1077 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)1081 version: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
10781082
1079packages:1083packages:
10801084
...@@ -1144,6 +1148,14 @@ packages:...@@ -1144,6 +1148,14 @@ packages:
1144 zod:1148 zod:
1145 optional: true1149 optional: true
11461150
1151 '@asamuzakjp/css-color@7.0.1':
1152 resolution: {integrity: sha512-C9duntabagkBZ1LebM7FKmphR4Q1pBclLxVbZETQV0akkFjV0ooFxo8FlvAQyKj9F6l8rEnmidgcTlpyxFYizg==}
1153 engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0}
1154
1155 '@asamuzakjp/dom-selector@9.2.1':
1156 resolution: {integrity: sha512-NT4s3yZLjovPpliRpTvdsdzyPjqRqiCZj9MxnarBihbaY5MbAG7DWAJcrLlhmC7xKTNCXsTELcqB8YsqpLnUFQ==}
1157 engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0}
1158
1147 '@astrojs/check@0.9.10':1159 '@astrojs/check@0.9.10':
1148 resolution: {integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==}1160 resolution: {integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==}
1149 hasBin: true1161 hasBin: true
...@@ -1772,6 +1784,10 @@ packages:...@@ -1772,6 +1784,10 @@ packages:
1772 '@blazediff/core@1.9.1':1784 '@blazediff/core@1.9.1':
1773 resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==}1785 resolution: {integrity: sha512-ehg3jIkYKulZh+8om/O25vkvSsXXwC+skXmyA87FFx6A/45eqOkZsBltMw/TVteb0mloiGT8oGRTcjRAz66zaA==}
17741786
1787 '@bramus/specificity@2.4.2':
1788 resolution: {integrity: sha512-ctxtJ/eA+t+6q2++vj5j7FYX3nRu311q1wfYH3xjlLOsczhlhxAg2FWNUXhpGvAw3BWo1xBcvOV6/YLc2r5FJw==}
1789 hasBin: true
1790
1775 '@bruits/satteri-darwin-arm64@0.10.5':1791 '@bruits/satteri-darwin-arm64@0.10.5':
1776 resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==}1792 resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==}
1777 cpu: [arm64]1793 cpu: [arm64]
...@@ -2027,6 +2043,42 @@ packages:...@@ -2027,6 +2043,42 @@ packages:
2027 resolution: {integrity: sha512-WTYHwlBhImGmmMt81crxaRvNdZXlBNemFyrP5GGHj2WeDTJMBrHgHTaladTypXHXrviFFBBGROl5moijRQ4ODA==}2043 resolution: {integrity: sha512-WTYHwlBhImGmmMt81crxaRvNdZXlBNemFyrP5GGHj2WeDTJMBrHgHTaladTypXHXrviFFBBGROl5moijRQ4ODA==}
2028 engines: {node: '>=18'}2044 engines: {node: '>=18'}
20292045
2046 '@csstools/color-helpers@6.1.1':
2047 resolution: {integrity: sha512-gLNsunvwf3mCi5u5o46/Z/JcJMnhbHSaZ69rkgPzNM3J4s8hWwpPUQB6/tt0EDFyCiWzxANlx+2LJwpYj4zS1w==}
2048 engines: {node: '>=20.19.0'}
2049
2050 '@csstools/css-calc@3.4.0':
2051 resolution: {integrity: sha512-XQKj5B7QiZcHiegCOCAzcAOJdhGgWOHbbu62h5e5mkHnn8lWcfiJhllkqWmxu5zWR9jucPHuo1iTB56P033hcg==}
2052 engines: {node: '>=20.19.0'}
2053 peerDependencies:
2054 '@csstools/css-parser-algorithms': ^4.0.0
2055 '@csstools/css-tokenizer': ^4.0.0
2056
2057 '@csstools/css-color-parser@4.2.3':
2058 resolution: {integrity: sha512-y4LpL+lmpuyKDiEFq2PnZUVFdAjsoB/qQJod79yLNokXyW7jewi+/WJ69EfItj8A2unWtxXnGjw6LYXgXu5ZjA==}
2059 engines: {node: '>=20.19.0'}
2060 peerDependencies:
2061 '@csstools/css-parser-algorithms': ^4.0.0
2062 '@csstools/css-tokenizer': ^4.0.0
2063
2064 '@csstools/css-parser-algorithms@4.0.0':
2065 resolution: {integrity: sha512-+B87qS7fIG3L5h3qwJ/IFbjoVoOe/bpOdh9hAjXbvx0o8ImEmUsGXN0inFOnk2ChCFgqkkGFQ+TpM5rbhkKe4w==}
2066 engines: {node: '>=20.19.0'}
2067 peerDependencies:
2068 '@csstools/css-tokenizer': ^4.0.0
2069
2070 '@csstools/css-syntax-patches-for-csstree@1.1.14':
2071 resolution: {integrity: sha512-HpbVXyrofRXpHpgkNIjU/3EWR4WJvOkO3emNK/L6X/mTJU7bGUI3AkkpoTNXznQLp0KRjLHELTGeKI5dIkI9JQ==}
2072 peerDependencies:
2073 css-tree: ^3.2.1
2074 peerDependenciesMeta:
2075 css-tree:
2076 optional: true
2077
2078 '@csstools/css-tokenizer@4.0.1':
2079 resolution: {integrity: sha512-bPlN9S9O1A0euCpEWE4qnvB5YDuyYVsUTrxSgmAM1Is0j4tICHoVyOVAXfWMP/kS9ZrjvyIXWV2PmomiAXXqOw==}
2080 engines: {node: '>=20.19.0'}
2081
2030 '@date-fns/tz@1.5.0':2082 '@date-fns/tz@1.5.0':
2031 resolution: {integrity: sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==}2083 resolution: {integrity: sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==}
20322084
...@@ -2648,6 +2700,15 @@ packages:...@@ -2648,6 +2700,15 @@ packages:
2648 resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}2700 resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
2649 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}2701 engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
26502702
2703 '@exodus/bytes@1.15.1':
2704 resolution: {integrity: sha512-S6mL0yNB/Abt9Ei4tq8gDhcczc4S3+vQ4ra7vxnAf+YHC02srtqxKKZghx2Dq6p0e66THKwR6r8N6P95wEty7Q==}
2705 engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
2706 peerDependencies:
2707 '@noble/hashes': 1.8.0
2708 peerDependenciesMeta:
2709 '@noble/hashes':
2710 optional: true
2711
2651 '@exodus/schemasafe@1.3.0':2712 '@exodus/schemasafe@1.3.0':
2652 resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==}2713 resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==}
26532714
...@@ -6281,6 +6342,9 @@ packages:...@@ -6281,6 +6342,9 @@ packages:
6281 before-after-hook@4.0.0:6342 before-after-hook@4.0.0:
6282 resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==}6343 resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==}
62836344
6345 bidi-js@1.1.0:
6346 resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==}
6347
6284 big-integer@1.6.52:6348 big-integer@1.6.52:
6285 resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}6349 resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
6286 engines: {node: '>=0.6'}6350 engines: {node: '>=0.6'}
...@@ -6722,6 +6786,10 @@ packages:...@@ -6722,6 +6786,10 @@ packages:
6722 resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==}6786 resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==}
6723 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}6787 engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
67246788
6789 data-urls@7.0.0:
6790 resolution: {integrity: sha512-23XHcCF+coGYevirZceTVD7NdJOqVn+49IHyxgszm+JIiHLoB2TkmPtsYkNWT1pvRSGkc35L6NHs0yHkN2SumA==}
6791 engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
6792
6725 date-fns@4.4.0:6793 date-fns@4.4.0:
6726 resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==}6794 resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==}
67276795
...@@ -6757,6 +6825,9 @@ packages:...@@ -6757,6 +6825,9 @@ packages:
6757 supports-color:6825 supports-color:
6758 optional: true6826 optional: true
67596827
6828 decimal.js@10.6.0:
6829 resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
6830
6760 decode-named-character-reference@1.3.0:6831 decode-named-character-reference@1.3.0:
6761 resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}6832 resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
67626833
...@@ -7120,6 +7191,10 @@ packages:...@@ -7120,6 +7191,10 @@ packages:
7120 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}7191 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
7121 engines: {node: '>=0.12'}7192 engines: {node: '>=0.12'}
71227193
7194 entities@8.1.0:
7195 resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==}
7196 engines: {node: '>=20.19.0'}
7197
7123 env-paths@2.2.1:7198 env-paths@2.2.1:
7124 resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}7199 resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
7125 engines: {node: '>=6'}7200 engines: {node: '>=6'}
...@@ -7909,6 +7984,10 @@ packages:...@@ -7909,6 +7984,10 @@ packages:
7909 resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}7984 resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
7910 engines: {node: ^16.14.0 || >=18.0.0}7985 engines: {node: ^16.14.0 || >=18.0.0}
79117986
7987 html-encoding-sniffer@6.0.0:
7988 resolution: {integrity: sha512-CV9TW3Y3f8/wT0BRFc1/KAVQ3TUHiXmaAb6VW9vtiMFf7SLoMd1PdAc4W3KFOFETBJUb90KatHqlsZMWV+R9Gg==}
7989 engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
7990
7912 html-escaper@3.0.3:7991 html-escaper@3.0.3:
7913 resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}7992 resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
79147993
...@@ -8047,6 +8126,9 @@ packages:...@@ -8047,6 +8126,9 @@ packages:
8047 resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}8126 resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
8048 engines: {node: '>=12'}8127 engines: {node: '>=12'}
80498128
8129 is-potential-custom-element-name@1.0.1:
8130 resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
8131
8050 is-promise@4.0.0:8132 is-promise@4.0.0:
8051 resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}8133 resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
80528134
...@@ -8143,6 +8225,15 @@ packages:...@@ -8143,6 +8225,15 @@ packages:
8143 jsc-safe-url@0.2.4:8225 jsc-safe-url@0.2.4:
8144 resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==}8226 resolution: {integrity: sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==}
81458227
8228 jsdom@30.1.0:
8229 resolution: {integrity: sha512-h/Q+H+KmlGf49ITw3TrykSVbg04S75S2O7ZtJc9gMGOWBrQRZmx5AJIKLtJ01e6Kszl+/tpFthCVqxNifxhoqg==}
8230 engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0}
8231 peerDependencies:
8232 canvas: ^3.2.3
8233 peerDependenciesMeta:
8234 canvas:
8235 optional: true
8236
8146 jsesc@3.1.0:8237 jsesc@3.1.0:
8147 resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}8238 resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
8148 engines: {node: '>=6'}8239 engines: {node: '>=6'}
...@@ -8366,6 +8457,10 @@ packages:...@@ -8366,6 +8457,10 @@ packages:
8366 resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==}8457 resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==}
8367 engines: {node: 20 || >=22}8458 engines: {node: 20 || >=22}
83688459
8460 lru-cache@11.5.3:
8461 resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==}
8462 engines: {node: 20 || >=22}
8463
8369 lru-cache@5.1.1:8464 lru-cache@5.1.1:
8370 resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}8465 resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
83718466
...@@ -9150,6 +9245,9 @@ packages:...@@ -9150,6 +9245,9 @@ packages:
9150 parse5@7.3.0:9245 parse5@7.3.0:
9151 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}9246 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
91529247
9248 parse5@8.0.1:
9249 resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==}
9250
9153 parseurl@1.3.3:9251 parseurl@1.3.3:
9154 resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}9252 resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
9155 engines: {node: '>= 0.8'}9253 engines: {node: '>= 0.8'}
...@@ -9874,6 +9972,10 @@ packages:...@@ -9874,6 +9972,10 @@ packages:
9874 resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}9972 resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
9875 engines: {node: '>=11.0.0'}9973 engines: {node: '>=11.0.0'}
98769974
9975 saxes@6.0.0:
9976 resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
9977 engines: {node: '>=v12.22.7'}
9978
9877 scheduler@0.27.0:9979 scheduler@0.27.0:
9878 resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}9980 resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
98799981
...@@ -10340,6 +10442,10 @@ packages:...@@ -10340,6 +10442,10 @@ packages:
10340 resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==}10442 resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==}
10341 engines: {node: '>=16'}10443 engines: {node: '>=16'}
1034210444
10445 tough-cookie@6.0.2:
10446 resolution: {integrity: sha512-exgYmnmL/sJpR3upZfXG5PoatXQii55xAiXGXzY+sROLZ/Y+SLcp9PgJNI9Vz37HpQ74WvDcLT8eqm+kV3FzrA==}
10447 engines: {node: '>=16'}
10448
10343 tr46@0.0.3:10449 tr46@0.0.3:
10344 resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}10450 resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
1034510451
...@@ -10347,6 +10453,10 @@ packages:...@@ -10347,6 +10453,10 @@ packages:
10347 resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}10453 resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
10348 engines: {node: '>=18'}10454 engines: {node: '>=18'}
1034910455
10456 tr46@6.0.0:
10457 resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
10458 engines: {node: '>=20'}
10459
10350 trim-lines@3.0.1:10460 trim-lines@3.0.1:
10351 resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}10461 resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
1035210462
...@@ -10837,6 +10947,10 @@ packages:...@@ -10837,6 +10947,10 @@ packages:
10837 w3c-keyname@2.2.8:10947 w3c-keyname@2.2.8:
10838 resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}10948 resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
1083910949
10950 w3c-xmlserializer@5.0.0:
10951 resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
10952 engines: {node: '>=18'}
10953
10840 walk-up-path@4.0.0:10954 walk-up-path@4.0.0:
10841 resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==}10955 resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==}
10842 engines: {node: 20 || >=22}10956 engines: {node: 20 || >=22}
...@@ -10863,12 +10977,20 @@ packages:...@@ -10863,12 +10977,20 @@ packages:
10863 resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}10977 resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
10864 engines: {node: '>=12'}10978 engines: {node: '>=12'}
1086510979
10980 webidl-conversions@8.0.1:
10981 resolution: {integrity: sha512-BMhLD/Sw+GbJC21C/UgyaZX41nPt8bUTg+jWyDeg7e7YN4xOM05YPSIXceACnXVtqyEw/LMClUQMtMZ+PGGpqQ==}
10982 engines: {node: '>=20'}
10983
10866 webpack-virtual-modules@0.6.2:10984 webpack-virtual-modules@0.6.2:
10867 resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}10985 resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
1086810986
10869 whatwg-fetch@3.6.20:10987 whatwg-fetch@3.6.20:
10870 resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}10988 resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
1087110989
10990 whatwg-mimetype@5.0.0:
10991 resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==}
10992 engines: {node: '>=20'}
10993
10872 whatwg-url-minimum@0.1.2:10994 whatwg-url-minimum@0.1.2:
10873 resolution: {integrity: sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==}10995 resolution: {integrity: sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==}
1087410996
...@@ -10876,6 +10998,14 @@ packages:...@@ -10876,6 +10998,14 @@ packages:
10876 resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}10998 resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
10877 engines: {node: '>=18'}10999 engines: {node: '>=18'}
1087811000
11001 whatwg-url@16.0.1:
11002 resolution: {integrity: sha512-1to4zXBxmXHV3IiSSEInrreIlu02vUOvrhxJJH5vcxYTBDAx51cqZiKdyTxlecdKNSjj8EcxGBxNf6Vg+945gw==}
11003 engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0}
11004
11005 whatwg-url@17.1.2:
11006 resolution: {integrity: sha512-TEZA+Zqxin7Jjsm2cjRohCmen5awh+hT6Zi3VZdqZlNRk7zvOI/9WpBFg/DWlA56bWnzwm6DuB8NS0EsxQH9uQ==}
11007 engines: {node: ^22.14.0 || >=24.0.0}
11008
10879 whatwg-url@5.0.0:11009 whatwg-url@5.0.0:
10880 resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}11010 resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
1088111011
...@@ -10947,6 +11077,10 @@ packages:...@@ -10947,6 +11077,10 @@ packages:
10947 resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==}11077 resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==}
10948 engines: {node: '>=10.0.0'}11078 engines: {node: '>=10.0.0'}
1094911079
11080 xml-name-validator@5.0.0:
11081 resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
11082 engines: {node: '>=18'}
11083
10950 xml-naming@0.1.0:11084 xml-naming@0.1.0:
10951 resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==}11085 resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==}
10952 engines: {node: '>=16.0.0'}11086 engines: {node: '>=16.0.0'}
...@@ -10971,6 +11105,9 @@ packages:...@@ -10971,6 +11105,9 @@ packages:
10971 resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==}11105 resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==}
10972 engines: {node: '>=8.0'}11106 engines: {node: '>=8.0'}
1097311107
11108 xmlchars@2.2.0:
11109 resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
11110
10974 xtend@4.0.2:11111 xtend@4.0.2:
10975 resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}11112 resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
10976 engines: {node: '>=0.4'}11113 engines: {node: '>=0.4'}
...@@ -11149,6 +11286,21 @@ snapshots:...@@ -11149,6 +11286,21 @@ snapshots:
11149 optionalDependencies:11286 optionalDependencies:
11150 zod: 4.6.511287 zod: 4.6.5
1115111288
11289 '@asamuzakjp/css-color@7.0.1':
11290 dependencies:
11291 '@csstools/css-calc': 3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)
11292 '@csstools/css-color-parser': 4.2.3(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)
11293 '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1)
11294 '@csstools/css-tokenizer': 4.0.1
11295 lru-cache: 11.5.3
11296
11297 '@asamuzakjp/dom-selector@9.2.1':
11298 dependencies:
11299 bidi-js: 1.1.0
11300 css-tree: 3.2.1
11301 is-potential-custom-element-name: 1.0.1
11302 lru-cache: 11.5.3
11303
11152 '@astrojs/check@0.9.10(prettier@3.8.3)(typescript@6.0.3)':11304 '@astrojs/check@0.9.10(prettier@3.8.3)(typescript@6.0.3)':
11153 dependencies:11305 dependencies:
11154 '@astrojs/language-server': 2.16.10(prettier@3.8.3)(typescript@6.0.3)11306 '@astrojs/language-server': 2.16.10(prettier@3.8.3)(typescript@6.0.3)
...@@ -12017,6 +12169,10 @@ snapshots:...@@ -12017,6 +12169,10 @@ snapshots:
1201712169
12018 '@blazediff/core@1.9.1': {}12170 '@blazediff/core@1.9.1': {}
1201912171
12172 '@bramus/specificity@2.4.2':
12173 dependencies:
12174 css-tree: 3.2.1
12175
12020 '@bruits/satteri-darwin-arm64@0.10.5':12176 '@bruits/satteri-darwin-arm64@0.10.5':
12021 optional: true12177 optional: true
1202212178
...@@ -12248,6 +12404,30 @@ snapshots:...@@ -12248,6 +12404,30 @@ snapshots:
12248 '@crowecawcaw/xa11y-win32-arm64-msvc': 0.13.012404 '@crowecawcaw/xa11y-win32-arm64-msvc': 0.13.0
12249 '@crowecawcaw/xa11y-win32-x64-msvc': 0.13.012405 '@crowecawcaw/xa11y-win32-x64-msvc': 0.13.0
1225012406
12407 '@csstools/color-helpers@6.1.1': {}
12408
12409 '@csstools/css-calc@3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)':
12410 dependencies:
12411 '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1)
12412 '@csstools/css-tokenizer': 4.0.1
12413
12414 '@csstools/css-color-parser@4.2.3(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)':
12415 dependencies:
12416 '@csstools/color-helpers': 6.1.1
12417 '@csstools/css-calc': 3.4.0(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1))(@csstools/css-tokenizer@4.0.1)
12418 '@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.1)
12419 '@csstools/css-tokenizer': 4.0.1
12420
12421 '@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.1)':
12422 dependencies:
12423 '@csstools/css-tokenizer': 4.0.1
12424
12425 '@csstools/css-syntax-patches-for-csstree@1.1.14(css-tree@3.2.1)':
12426 optionalDependencies:
12427 css-tree: 3.2.1
12428
12429 '@csstools/css-tokenizer@4.0.1': {}
12430
12251 '@date-fns/tz@1.5.0': {}12431 '@date-fns/tz@1.5.0': {}
1225212432
12253 '@daypicker/react@10.0.1(@types/react@19.2.16)(react@19.2.6)':12433 '@daypicker/react@10.0.1(@types/react@19.2.16)(react@19.2.6)':
...@@ -12793,6 +12973,10 @@ snapshots:...@@ -12793,6 +12973,10 @@ snapshots:
12793 dependencies:12973 dependencies:
12794 '@types/json-schema': 7.0.1512974 '@types/json-schema': 7.0.15
1279512975
12976 '@exodus/bytes@1.15.1(@noble/hashes@1.8.0)':
12977 optionalDependencies:
12978 '@noble/hashes': 1.8.0
12979
12796 '@exodus/schemasafe@1.3.0': {}12980 '@exodus/schemasafe@1.3.0': {}
1279712981
12798 '@expo-google-fonts/dm-sans@0.4.2': {}12982 '@expo-google-fonts/dm-sans@0.4.2': {}
...@@ -15775,12 +15959,12 @@ snapshots:...@@ -15775,12 +15959,12 @@ snapshots:
15775 '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.2.5)15959 '@rolldown/plugin-babel': 0.2.3(@babel/core@7.29.7)(@babel/plugin-transform-runtime@7.29.7(@babel/core@7.29.7))(@babel/runtime@7.29.7)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(rolldown@1.2.5)
15776 babel-plugin-react-compiler: 1.0.015960 babel-plugin-react-compiler: 1.0.0
1577715961
15778 '@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))':15962 '@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))':
15779 dependencies:15963 dependencies:
15780 '@testing-library/dom': 10.4.115964 '@testing-library/dom': 10.4.1
15781 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)15965 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
15782 '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))15966 '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))
15783 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))15967 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
15784 transitivePeerDependencies:15968 transitivePeerDependencies:
15785 - bufferutil15969 - bufferutil
15786 - msw15970 - msw
...@@ -15792,14 +15976,14 @@ snapshots:...@@ -15792,14 +15976,14 @@ snapshots:
15792 '@testing-library/dom': 10.4.115976 '@testing-library/dom': 10.4.1
15793 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)15977 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
15794 '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)15978 '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)
15795 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))15979 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
15796 transitivePeerDependencies:15980 transitivePeerDependencies:
15797 - bufferutil15981 - bufferutil
15798 - msw15982 - msw
15799 - utf-8-validate15983 - utf-8-validate
15800 - vite15984 - vite
1580115985
15802 '@vitest/browser@4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))':15986 '@vitest/browser@4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))':
15803 dependencies:15987 dependencies:
15804 '@blazediff/core': 1.9.115988 '@blazediff/core': 1.9.1
15805 '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))15989 '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
...@@ -15808,7 +15992,7 @@ snapshots:...@@ -15808,7 +15992,7 @@ snapshots:
15808 pngjs: 7.0.015992 pngjs: 7.0.0
15809 sirv: 3.0.215993 sirv: 3.0.2
15810 tinyrainbow: 3.1.015994 tinyrainbow: 3.1.0
15811 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))15995 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
15812 ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)15996 ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
15813 transitivePeerDependencies:15997 transitivePeerDependencies:
15814 - bufferutil15998 - bufferutil
...@@ -15825,7 +16009,7 @@ snapshots:...@@ -15825,7 +16009,7 @@ snapshots:
15825 pngjs: 7.0.016009 pngjs: 7.0.0
15826 sirv: 3.0.216010 sirv: 3.0.2
15827 tinyrainbow: 3.1.016011 tinyrainbow: 3.1.0
15828 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))16012 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
15829 ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)16013 ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
15830 transitivePeerDependencies:16014 transitivePeerDependencies:
15831 - bufferutil16015 - bufferutil
...@@ -16601,6 +16785,10 @@ snapshots:...@@ -16601,6 +16785,10 @@ snapshots:
1660116785
16602 before-after-hook@4.0.0: {}16786 before-after-hook@4.0.0: {}
1660316787
16788 bidi-js@1.1.0:
16789 dependencies:
16790 require-from-string: 2.0.2
16791
16604 big-integer@1.6.52: {}16792 big-integer@1.6.52: {}
1660516793
16606 bippy@0.5.41(react@19.2.6):16794 bippy@0.5.41(react@19.2.6):
...@@ -17048,6 +17236,13 @@ snapshots:...@@ -17048,6 +17236,13 @@ snapshots:
1704817236
17049 culori@4.0.2: {}17237 culori@4.0.2: {}
1705017238
17239 data-urls@7.0.0(@noble/hashes@1.8.0):
17240 dependencies:
17241 whatwg-mimetype: 5.0.0
17242 whatwg-url: 16.0.1(@noble/hashes@1.8.0)
17243 transitivePeerDependencies:
17244 - '@noble/hashes'
17245
17051 date-fns@4.4.0: {}17246 date-fns@4.4.0: {}
1705217247
17053 dbus-next@0.10.2(patch_hash=cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4):17248 dbus-next@0.10.2(patch_hash=cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4):
...@@ -17076,6 +17271,8 @@ snapshots:...@@ -17076,6 +17271,8 @@ snapshots:
17076 dependencies:17271 dependencies:
17077 ms: 2.1.317272 ms: 2.1.3
1707817273
17274 decimal.js@10.6.0: {}
17275
17079 decode-named-character-reference@1.3.0:17276 decode-named-character-reference@1.3.0:
17080 dependencies:17277 dependencies:
17081 character-entities: 2.0.217278 character-entities: 2.0.2
...@@ -17345,6 +17542,8 @@ snapshots:...@@ -17345,6 +17542,8 @@ snapshots:
1734517542
17346 entities@6.0.1: {}17543 entities@6.0.1: {}
1734717544
17545 entities@8.1.0: {}
17546
17348 env-paths@2.2.1: {}17547 env-paths@2.2.1: {}
1734917548
17350 env-paths@3.0.0: {}17549 env-paths@3.0.0: {}
...@@ -18483,6 +18682,12 @@ snapshots:...@@ -18483,6 +18682,12 @@ snapshots:
18483 dependencies:18682 dependencies:
18484 lru-cache: 10.4.318683 lru-cache: 10.4.3
1848518684
18685 html-encoding-sniffer@6.0.0(@noble/hashes@1.8.0):
18686 dependencies:
18687 '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0)
18688 transitivePeerDependencies:
18689 - '@noble/hashes'
18690
18486 html-escaper@3.0.3: {}18691 html-escaper@3.0.3: {}
1848718692
18488 html-url-attributes@3.0.1: {}18693 html-url-attributes@3.0.1: {}
...@@ -18608,6 +18813,8 @@ snapshots:...@@ -18608,6 +18813,8 @@ snapshots:
1860818813
18609 is-plain-obj@4.1.0: {}18814 is-plain-obj@4.1.0: {}
1861018815
18816 is-potential-custom-element-name@1.0.1: {}
18817
18611 is-promise@4.0.0: {}18818 is-promise@4.0.0: {}
1861218819
18613 is-unicode-supported@2.1.0: {}18820 is-unicode-supported@2.1.0: {}
...@@ -18689,6 +18896,31 @@ snapshots:...@@ -18689,6 +18896,31 @@ snapshots:
1868918896
18690 jsc-safe-url@0.2.4: {}18897 jsc-safe-url@0.2.4: {}
1869118898
18899 jsdom@30.1.0(@noble/hashes@1.8.0):
18900 dependencies:
18901 '@asamuzakjp/css-color': 7.0.1
18902 '@asamuzakjp/dom-selector': 9.2.1
18903 '@bramus/specificity': 2.4.2
18904 '@csstools/css-syntax-patches-for-csstree': 1.1.14(css-tree@3.2.1)
18905 '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0)
18906 css-tree: 3.2.1
18907 data-urls: 7.0.0(@noble/hashes@1.8.0)
18908 decimal.js: 10.6.0
18909 html-encoding-sniffer: 6.0.0(@noble/hashes@1.8.0)
18910 is-potential-custom-element-name: 1.0.1
18911 lru-cache: 11.5.2
18912 parse5: 8.0.1
18913 saxes: 6.0.0
18914 tough-cookie: 6.0.2
18915 undici: 8.10.2
18916 w3c-xmlserializer: 5.0.0
18917 webidl-conversions: 8.0.1
18918 whatwg-mimetype: 5.0.0
18919 whatwg-url: 17.1.2(@noble/hashes@1.8.0)
18920 xml-name-validator: 5.0.0
18921 transitivePeerDependencies:
18922 - '@noble/hashes'
18923
18692 jsesc@3.1.0: {}18924 jsesc@3.1.0: {}
1869318925
18694 json-buffer@3.0.1: {}18926 json-buffer@3.0.1: {}
...@@ -18888,6 +19120,8 @@ snapshots:...@@ -18888,6 +19120,8 @@ snapshots:
1888819120
18889 lru-cache@11.5.2: {}19121 lru-cache@11.5.2: {}
1889019122
19123 lru-cache@11.5.3: {}
19124
18891 lru-cache@5.1.1:19125 lru-cache@5.1.1:
18892 dependencies:19126 dependencies:
18893 yallist: 3.1.119127 yallist: 3.1.1
...@@ -20104,7 +20338,7 @@ snapshots:...@@ -20104,7 +20338,7 @@ snapshots:
20104 '@oxc-resolver/binding-win32-arm64-msvc': 11.24.220338 '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2
20105 '@oxc-resolver/binding-win32-x64-msvc': 11.24.220339 '@oxc-resolver/binding-win32-x64-msvc': 11.24.2
2010620340
20107 oxfmt@0.68.0(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):20341 oxfmt@0.68.0(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):
20108 dependencies:20342 dependencies:
20109 tinypool: 2.1.220343 tinypool: 2.1.2
20110 optionalDependencies:20344 optionalDependencies:
...@@ -20127,9 +20361,9 @@ snapshots:...@@ -20127,9 +20361,9 @@ snapshots:
20127 '@oxfmt/binding-win32-arm64-msvc': 0.68.020361 '@oxfmt/binding-win32-arm64-msvc': 0.68.0
20128 '@oxfmt/binding-win32-ia32-msvc': 0.68.020362 '@oxfmt/binding-win32-ia32-msvc': 0.68.0
20129 '@oxfmt/binding-win32-x64-msvc': 0.68.020363 '@oxfmt/binding-win32-x64-msvc': 0.68.0
20130 vite-plus: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)20364 vite-plus: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
2013120365
20132 oxfmt@0.68.0(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):20366 oxfmt@0.68.0(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):
20133 dependencies:20367 dependencies:
20134 tinypool: 2.1.220368 tinypool: 2.1.2
20135 optionalDependencies:20369 optionalDependencies:
...@@ -20152,7 +20386,7 @@ snapshots:...@@ -20152,7 +20386,7 @@ snapshots:
20152 '@oxfmt/binding-win32-arm64-msvc': 0.68.020386 '@oxfmt/binding-win32-arm64-msvc': 0.68.0
20153 '@oxfmt/binding-win32-ia32-msvc': 0.68.020387 '@oxfmt/binding-win32-ia32-msvc': 0.68.0
20154 '@oxfmt/binding-win32-x64-msvc': 0.68.020388 '@oxfmt/binding-win32-x64-msvc': 0.68.0
20155 vite-plus: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)20389 vite-plus: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
2015620390
20157 oxlint-tsgolint@7.0.2001:20391 oxlint-tsgolint@7.0.2001:
20158 optionalDependencies:20392 optionalDependencies:
...@@ -20163,7 +20397,7 @@ snapshots:...@@ -20163,7 +20397,7 @@ snapshots:
20163 '@oxlint-tsgolint/win32-arm64': 7.0.200120397 '@oxlint-tsgolint/win32-arm64': 7.0.2001
20164 '@oxlint-tsgolint/win32-x64': 7.0.200120398 '@oxlint-tsgolint/win32-x64': 7.0.2001
2016520399
20166 oxlint@1.83.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):20400 oxlint@1.83.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):
20167 optionalDependencies:20401 optionalDependencies:
20168 '@oxlint/binding-android-arm-eabi': 1.83.020402 '@oxlint/binding-android-arm-eabi': 1.83.0
20169 '@oxlint/binding-android-arm64': 1.83.020403 '@oxlint/binding-android-arm64': 1.83.0
...@@ -20185,9 +20419,9 @@ snapshots:...@@ -20185,9 +20419,9 @@ snapshots:
20185 '@oxlint/binding-win32-ia32-msvc': 1.83.020419 '@oxlint/binding-win32-ia32-msvc': 1.83.0
20186 '@oxlint/binding-win32-x64-msvc': 1.83.020420 '@oxlint/binding-win32-x64-msvc': 1.83.0
20187 oxlint-tsgolint: 7.0.200120421 oxlint-tsgolint: 7.0.2001
20188 vite-plus: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)20422 vite-plus: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
2018920423
20190 oxlint@1.83.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):20424 oxlint@1.83.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)):
20191 optionalDependencies:20425 optionalDependencies:
20192 '@oxlint/binding-android-arm-eabi': 1.83.020426 '@oxlint/binding-android-arm-eabi': 1.83.0
20193 '@oxlint/binding-android-arm64': 1.83.020427 '@oxlint/binding-android-arm64': 1.83.0
...@@ -20209,7 +20443,7 @@ snapshots:...@@ -20209,7 +20443,7 @@ snapshots:
20209 '@oxlint/binding-win32-ia32-msvc': 1.83.020443 '@oxlint/binding-win32-ia32-msvc': 1.83.0
20210 '@oxlint/binding-win32-x64-msvc': 1.83.020444 '@oxlint/binding-win32-x64-msvc': 1.83.0
20211 oxlint-tsgolint: 7.0.200120445 oxlint-tsgolint: 7.0.2001
20212 vite-plus: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)20446 vite-plus: 0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0)
2021320447
20214 p-cancelable@2.1.1: {}20448 p-cancelable@2.1.1: {}
2021520449
...@@ -20262,6 +20496,10 @@ snapshots:...@@ -20262,6 +20496,10 @@ snapshots:
20262 dependencies:20496 dependencies:
20263 entities: 6.0.120497 entities: 6.0.1
2026420498
20499 parse5@8.0.1:
20500 dependencies:
20501 entities: 8.1.0
20502
20265 parseurl@1.3.3: {}20503 parseurl@1.3.3: {}
2026620504
20267 path-browserify@1.0.1: {}20505 path-browserify@1.0.1: {}
...@@ -20551,8 +20789,7 @@ snapshots:...@@ -20551,8 +20789,7 @@ snapshots:
20551 end-of-stream: 1.4.520789 end-of-stream: 1.4.5
20552 once: 1.4.020790 once: 1.4.0
2055320791
20554 punycode@2.3.1:20792 punycode@2.3.1: {}
20555 optional: true
2055620793
20557 pvtsutils@1.3.6:20794 pvtsutils@1.3.6:
20558 dependencies:20795 dependencies:
...@@ -21199,6 +21436,10 @@ snapshots:...@@ -21199,6 +21436,10 @@ snapshots:
2119921436
21200 sax@1.6.1: {}21437 sax@1.6.1: {}
2120121438
21439 saxes@6.0.0:
21440 dependencies:
21441 xmlchars: 2.2.0
21442
21202 scheduler@0.27.0: {}21443 scheduler@0.27.0: {}
2120321444
21204 schema-utils@4.3.3:21445 schema-utils@4.3.3:
...@@ -21688,13 +21929,11 @@ snapshots:...@@ -21688,13 +21929,11 @@ snapshots:
2168821929
21689 tinyrainbow@3.1.0: {}21930 tinyrainbow@3.1.0: {}
2169021931
21691 tldts-core@7.4.2:21932 tldts-core@7.4.2: {}
21692 optional: true
2169321933
21694 tldts@7.4.2:21934 tldts@7.4.2:
21695 dependencies:21935 dependencies:
21696 tldts-core: 7.4.221936 tldts-core: 7.4.2
21697 optional: true
2169821937
21699 tmp-promise@3.0.3:21938 tmp-promise@3.0.3:
21700 dependencies:21939 dependencies:
...@@ -21719,6 +21958,10 @@ snapshots:...@@ -21719,6 +21958,10 @@ snapshots:
21719 tldts: 7.4.221958 tldts: 7.4.2
21720 optional: true21959 optional: true
2172121960
21961 tough-cookie@6.0.2:
21962 dependencies:
21963 tldts: 7.4.2
21964
21722 tr46@0.0.3: {}21965 tr46@0.0.3: {}
2172321966
21724 tr46@5.1.1:21967 tr46@5.1.1:
...@@ -21726,6 +21969,10 @@ snapshots:...@@ -21726,6 +21969,10 @@ snapshots:
21726 punycode: 2.3.121969 punycode: 2.3.1
21727 optional: true21970 optional: true
2172821971
21972 tr46@6.0.0:
21973 dependencies:
21974 punycode: 2.3.1
21975
21729 trim-lines@3.0.1: {}21976 trim-lines@3.0.1: {}
2173021977
21731 trough@2.2.0: {}21978 trough@2.2.0: {}
...@@ -22004,12 +22251,12 @@ snapshots:...@@ -22004,12 +22251,12 @@ snapshots:
22004 '@types/unist': 3.0.322251 '@types/unist': 3.0.3
22005 vfile-message: 4.0.322252 vfile-message: 4.0.3
2200622253
22007 vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0):22254 vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0):
22008 dependencies:22255 dependencies:
22009 '@oxc-project/types': 0.150.022256 '@oxc-project/types': 0.150.0
22010 '@oxlint/plugins': 1.79.022257 '@oxlint/plugins': 1.79.0
22011 '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))22258 '@vitest/browser': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))
22012 '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))22259 '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(utf-8-validate@6.0.6)(vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)))
22013 '@vitest/expect': 4.1.1122260 '@vitest/expect': 4.1.11
22014 '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))22261 '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
22015 '@vitest/pretty-format': 4.1.1122262 '@vitest/pretty-format': 4.1.11
...@@ -22017,11 +22264,11 @@ snapshots:...@@ -22017,11 +22264,11 @@ snapshots:
22017 '@vitest/snapshot': 4.1.1122264 '@vitest/snapshot': 4.1.11
22018 '@vitest/spy': 4.1.1122265 '@vitest/spy': 4.1.11
22019 '@vitest/utils': 4.1.1122266 '@vitest/utils': 4.1.11
22020 oxfmt: 0.68.0(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))22267 oxfmt: 0.68.0(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))
22021 oxlint: 1.83.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))22268 oxlint: 1.83.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))
22022 oxlint-tsgolint: 7.0.200122269 oxlint-tsgolint: 7.0.2001
22023 vite: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'22270 vite: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
22024 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11))(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))22271 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11))(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
22025 optionalDependencies:22272 optionalDependencies:
22026 '@voidzero-dev/vite-plus-darwin-arm64': 0.3.322273 '@voidzero-dev/vite-plus-darwin-arm64': 0.3.3
22027 '@voidzero-dev/vite-plus-darwin-x64': 0.3.322274 '@voidzero-dev/vite-plus-darwin-x64': 0.3.3
...@@ -22061,7 +22308,7 @@ snapshots:...@@ -22061,7 +22308,7 @@ snapshots:
22061 - utf-8-validate22308 - utf-8-validate
22062 - yaml22309 - yaml
2206322310
22064 vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0):22311 vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0):
22065 dependencies:22312 dependencies:
22066 '@oxc-project/types': 0.150.022313 '@oxc-project/types': 0.150.0
22067 '@oxlint/plugins': 1.79.022314 '@oxlint/plugins': 1.79.0
...@@ -22074,11 +22321,11 @@ snapshots:...@@ -22074,11 +22321,11 @@ snapshots:
22074 '@vitest/snapshot': 4.1.1122321 '@vitest/snapshot': 4.1.11
22075 '@vitest/spy': 4.1.1122322 '@vitest/spy': 4.1.11
22076 '@vitest/utils': 4.1.1122323 '@vitest/utils': 4.1.11
22077 oxfmt: 0.68.0(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))22324 oxfmt: 0.68.0(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))
22078 oxlint: 1.83.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))22325 oxlint: 1.83.0(oxlint-tsgolint@7.0.2001)(vite-plus@0.3.3(@types/node@24.12.4)(bufferutil@4.1.0)(esbuild@0.28.2)(jiti@2.7.0)(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(utf-8-validate@6.0.6)(yaml@2.9.0))
22079 oxlint-tsgolint: 7.0.200122326 oxlint-tsgolint: 7.0.2001
22080 vite: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'22327 vite: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0)'
22081 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))22328 vitest: 4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
22082 optionalDependencies:22329 optionalDependencies:
22083 '@voidzero-dev/vite-plus-darwin-arm64': 0.3.322330 '@voidzero-dev/vite-plus-darwin-arm64': 0.3.3
22084 '@voidzero-dev/vite-plus-darwin-x64': 0.3.322331 '@voidzero-dev/vite-plus-darwin-x64': 0.3.3
...@@ -22122,7 +22369,7 @@ snapshots:...@@ -22122,7 +22369,7 @@ snapshots:
22122 optionalDependencies:22369 optionalDependencies:
22123 vite: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'22370 vite: '@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0)'
2212422371
22125 vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11))(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3)):22372 vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11))(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3)):
22126 dependencies:22373 dependencies:
22127 '@vitest/expect': 4.1.1122374 '@vitest/expect': 4.1.11
22128 '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))22375 '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@6.0.3)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@6.0.3))
...@@ -22147,10 +22394,11 @@ snapshots:...@@ -22147,10 +22394,11 @@ snapshots:
22147 optionalDependencies:22394 optionalDependencies:
22148 '@types/node': 24.12.422395 '@types/node': 24.12.4
22149 '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)22396 '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)
22397 jsdom: 30.1.0(@noble/hashes@1.8.0)
22150 transitivePeerDependencies:22398 transitivePeerDependencies:
22151 - msw22399 - msw
2215222400
22153 vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)):22401 vitest@4.1.11(@types/node@24.12.4)(@vitest/browser-preview@4.1.11)(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(jsdom@30.1.0(@noble/hashes@1.8.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2)):
22154 dependencies:22402 dependencies:
22155 '@vitest/expect': 4.1.1122403 '@vitest/expect': 4.1.11
22156 '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))22404 '@vitest/mocker': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))
...@@ -22175,6 +22423,7 @@ snapshots:...@@ -22175,6 +22423,7 @@ snapshots:
22175 optionalDependencies:22423 optionalDependencies:
22176 '@types/node': 24.12.422424 '@types/node': 24.12.4
22177 '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)22425 '@vitest/browser-preview': 4.1.11(@voidzero-dev/vite-plus-core@0.3.3(@types/node@24.12.4)(esbuild@0.28.2)(jiti@2.7.0)(terser@5.48.0)(typescript@7.0.2)(unrun@0.2.39)(yaml@2.9.0))(bufferutil@4.1.0)(msw@2.12.11(@types/node@24.12.4)(typescript@7.0.2))(utf-8-validate@6.0.6)(vitest@4.1.11)
22426 jsdom: 30.1.0(@noble/hashes@1.8.0)
22178 transitivePeerDependencies:22427 transitivePeerDependencies:
22179 - msw22428 - msw
2218022429
...@@ -22279,6 +22528,10 @@ snapshots:...@@ -22279,6 +22528,10 @@ snapshots:
2227922528
22280 w3c-keyname@2.2.8: {}22529 w3c-keyname@2.2.8: {}
2228122530
22531 w3c-xmlserializer@5.0.0:
22532 dependencies:
22533 xml-name-validator: 5.0.0
22534
22282 walk-up-path@4.0.0: {}22535 walk-up-path@4.0.0: {}
2228322536
22284 walker@1.0.8:22537 walker@1.0.8:
...@@ -22306,10 +22559,14 @@ snapshots:...@@ -22306,10 +22559,14 @@ snapshots:
22306 webidl-conversions@7.0.0:22559 webidl-conversions@7.0.0:
22307 optional: true22560 optional: true
2230822561
22562 webidl-conversions@8.0.1: {}
22563
22309 webpack-virtual-modules@0.6.2: {}22564 webpack-virtual-modules@0.6.2: {}
2231022565
22311 whatwg-fetch@3.6.20: {}22566 whatwg-fetch@3.6.20: {}
2231222567
22568 whatwg-mimetype@5.0.0: {}
22569
22313 whatwg-url-minimum@0.1.2: {}22570 whatwg-url-minimum@0.1.2: {}
2231422571
22315 whatwg-url@14.2.0:22572 whatwg-url@14.2.0:
...@@ -22318,6 +22575,22 @@ snapshots:...@@ -22318,6 +22575,22 @@ snapshots:
22318 webidl-conversions: 7.0.022575 webidl-conversions: 7.0.0
22319 optional: true22576 optional: true
2232022577
22578 whatwg-url@16.0.1(@noble/hashes@1.8.0):
22579 dependencies:
22580 '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0)
22581 tr46: 6.0.0
22582 webidl-conversions: 8.0.1
22583 transitivePeerDependencies:
22584 - '@noble/hashes'
22585
22586 whatwg-url@17.1.2(@noble/hashes@1.8.0):
22587 dependencies:
22588 '@exodus/bytes': 1.15.1(@noble/hashes@1.8.0)
22589 tr46: 6.0.0
22590 webidl-conversions: 8.0.1
22591 transitivePeerDependencies:
22592 - '@noble/hashes'
22593
22321 whatwg-url@5.0.0:22594 whatwg-url@5.0.0:
22322 dependencies:22595 dependencies:
22323 tr46: 0.0.322596 tr46: 0.0.3
...@@ -22384,6 +22657,8 @@ snapshots:...@@ -22384,6 +22657,8 @@ snapshots:
22384 simple-plist: 1.3.122657 simple-plist: 1.3.1
22385 uuid: 7.0.322658 uuid: 7.0.3
2238622659
22660 xml-name-validator@5.0.0: {}
22661
22387 xml-naming@0.1.0: {}22662 xml-naming@0.1.0: {}
2238822663
22389 xml-naming@0.3.0: {}22664 xml-naming@0.3.0: {}
...@@ -22402,6 +22677,8 @@ snapshots:...@@ -22402,6 +22677,8 @@ snapshots:
2240222677
22403 xmlbuilder@15.1.1: {}22678 xmlbuilder@15.1.1: {}
2240422679
22680 xmlchars@2.2.0: {}
22681
22405 xtend@4.0.2:22682 xtend@4.0.2:
22406 optional: true22683 optional: true
2240722684
pnpm-workspace.yaml+2
...@@ -98,6 +98,8 @@ minimumReleaseAgeExclude:...@@ -98,6 +98,8 @@ minimumReleaseAgeExclude:
98 - cn@0.3.298 - cn@0.3.2
9999
100overrides:100overrides:
101 # Keep jsdom's optional peer consistent so Vite+ has one test-runner instance.
102 "@exodus/bytes>@noble/hashes": "1.8.0"
101 # Earlier React Navigation declarations create a circular type alias in TypeScript 7.103 # Earlier React Navigation declarations create a circular type alias in TypeScript 7.
102 "@react-navigation/core": 7.21.13104 "@react-navigation/core": 7.21.13
103 # The dbus-next patch drops usocket from the package, but pnpm resolves from the105 # The dbus-next patch drops usocket from the package, but pnpm resolves from the