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 @@
7575 "@vitejs/plugin-react": "^6.0.0",
7676 "babel-plugin-react-compiler": "1.0.0",
7777 "compression": "^1.8.1",
78 "jsdom": "^30.0.1",
7879 "react-test-renderer": "19.2.6",
7980 "tailwindcss": "^4.0.0",
8081 "unified": "^11.0.5",
apps/web/src/components/AppSidebarLayout.tsx+10-3
......@@ -79,6 +79,7 @@ function readInitialThreadSidebarWidth(): number {
7979}
8080
8181function SidebarControl() {
82 const usagePageOpen = useLocation({ select: (location) => location.pathname === "/usage" });
8283 const keybindings = useAtomValue(primaryServerKeybindingsAtom);
8384 const { toggleSidebar } = useSidebar();
8485 const isSidebarVisible = useSidebarVisibility();
......@@ -86,7 +87,9 @@ function SidebarControl() {
8687 const stageBackdropVariant = useSidebarStageBackdropVariant(
8788 environmentIdentificationMode === "artwork",
8889 );
89 const shortcutLabel = shortcutLabelForCommand(keybindings, "sidebar.toggle");
90 const shortcutLabel = shortcutLabelForCommand(keybindings, "sidebar.toggle", {
91 context: { usagePageOpen },
92 });
9093
9194 useEffect(() => {
9295 const onKeyDown = (event: KeyboardEvent) => {
......@@ -106,7 +109,11 @@ function SidebarControl() {
106109 // available everywhere else, including the plain-text composer.
107110 return;
108111 }
109 if (resolveShortcutCommand(event, keybindings) !== "sidebar.toggle") return;
112 if (
113 resolveShortcutCommand(event, keybindings, { context: { usagePageOpen } }) !==
114 "sidebar.toggle"
115 )
116 return;
110117
111118 event.preventDefault();
112119 event.stopPropagation();
......@@ -116,7 +123,7 @@ function SidebarControl() {
116123 // Capture before focused editors consume commands such as Mod+B for rich-text formatting.
117124 window.addEventListener("keydown", onKeyDown, true);
118125 return () => window.removeEventListener("keydown", onKeyDown, true);
119 }, [keybindings, toggleSidebar]);
126 }, [keybindings, toggleSidebar, usagePageOpen]);
120127
121128 return (
122129 // 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", () => {
4646 );
4747 },
4848 );
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
4967 it("builds searchable rows with readable key and when values", () => {
5068 const rows = buildKeybindingRows(
5169 [
apps/web/src/components/settings/KeybindingsSettings.logic.ts+21-3
......@@ -13,6 +13,17 @@ import {
1313
1414import { shortcutKeyFromEvent } from "../../keybindings";
1515import { 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
1728export type KeybindingSource = "Default" | "Custom" | "Project";
1829
......@@ -204,7 +215,9 @@ export function buildKeybindingRows(
204215 });
205216
206217 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);
208221 if (commandCompare !== 0) return commandCompare;
209222 return left.key.localeCompare(right.key);
210223 });
......@@ -277,13 +290,18 @@ export function buildKeybindingCommandOptions(
277290 for (const binding of keybindings) {
278291 commands.add(binding.command);
279292 }
280 return [...commands].toSorted((left, right) =>
281 commandLabel(left).localeCompare(commandLabel(right)),
293 return [...commands].toSorted(
294 (left, right) =>
295 compareUsageCommands(left, right) ?? commandLabel(left).localeCompare(commandLabel(right)),
282296 );
283297}
284298
285299export function commandLabel(command: KeybindingCommand): string {
286300 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}`;
287305 const raw = String(command);
288306 if (raw.startsWith("script.") && raw.endsWith(".run")) {
289307 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 @@
11import { EnvironmentId, ProviderInstanceId, USAGE_CONTRACT_VERSION } from "@t3tools/contracts";
22import { mergeUsage } from "@t3tools/shared/usageMerge";
33import { StrictMode, act } from "react";
4import { DEFAULT_RESOLVED_KEYBINDINGS } from "@t3tools/shared/keybindings";
45import { create, type ReactTestRenderer } from "react-test-renderer";
56import { afterEach, beforeEach, expect, it, vi } from "vite-plus/test";
67
......@@ -9,11 +10,21 @@ const state = vi.hoisted(() => ({
910 refreshProviders: vi.fn(async () => undefined),
1011 metric: "limits",
1112}));
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}));
1321vi.mock("../../state/presentation", () => ({
1422 environmentPresentations: { presentationsAtom: null },
1523}));
16vi.mock("../../state/server", () => ({ serverEnvironment: { refreshProviders: null } }));
24vi.mock("../../state/server", () => ({
25 serverEnvironment: { refreshProviders: null },
26 primaryServerKeybindingsAtom: "keybindings",
27}));
1728vi.mock("../../state/use-atom-command", () => ({ useAtomCommand: () => state.refreshProviders }));
1829vi.mock("../../env", () => ({ isElectron: false }));
1930vi.mock("../../hooks/useSettings", () => ({ usePrimarySettings: () => "24h" }));
......@@ -86,6 +97,7 @@ import { UsagePage } from "./UsagePage";
8697let renderer: ReactTestRenderer;
8798let environmentNumber = 0;
8899beforeEach(() => {
100 vi.stubGlobal("window", new EventTarget());
89101 vi.stubGlobal("IS_REACT_ACT_ENVIRONMENT", true);
90102 vi.spyOn(Date, "now").mockReturnValue(Date.parse("2026-09-11T12:00:00Z"));
91103 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 {
2525import { isElectron } from "../../env";
2626import { cn } from "../../lib/utils";
2727import { 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";
2932import { useUsage, type EnvironmentUsageStatus } from "../../state/usage";
3033import { useAtomCommand } from "../../state/use-atom-command";
3134import {
......@@ -65,8 +68,15 @@ import { WorkspacePageContainer } from "../WorkspacePageContainer";
6568import { WorkspacePageHeader } from "../WorkspacePageHeader";
6669import { UsageLimitsSection } from "./UsageLimits";
6770import { UsagePriceOverrides } from "./UsagePriceOverrides";
68import { UsageProviderChart, type UsageChartMetric } from "./UsageProviderChart";
71import { UsageProviderChart } from "./UsageProviderChart";
6972import { sortModelsByTokens } from "./usageBreakdown";
73import {
74 METRIC_OPTIONS,
75 WINDOW_OPTIONS,
76 resolveUsageShortcut,
77 type UsageMetric,
78} from "./usageShortcuts";
79import { useEscapeToGoBack } from "../../hooks/useNavigateBack";
7080import { PROVIDER_ORDER, PROVIDER_PRESENTATION, providersWithUsage } from "./usageProviders";
7181import {
7282 readUsagePagePreferences,
......@@ -74,30 +84,26 @@ import {
7484 type UsagePagePreferences,
7585} 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
8487function isUsageMetric(value: string | null | undefined): value is UsageMetric {
8588 return METRIC_OPTIONS.some((option) => option.value === value);
8689}
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
9591function isUsageWindowDays(value: number): value is UsagePagePreferences["windowDays"] {
9692 return WINDOW_OPTIONS.some((option) => option.days === value);
9793}
9894
9995export function UsagePage() {
10096 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 };
101107 const [windowSelection, setWindowSelection] = useState(() => ({
102108 days: preferences.windowDays,
103109 window: makeWindow(
......@@ -217,6 +223,32 @@ export function UsagePage() {
217223 setLimitsNow(Date.now());
218224 }
219225 };
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
220252 const refreshWindow = () => {
221253 if (refreshingRef.current) return;
222254
......@@ -302,7 +334,7 @@ export function UsagePage() {
302334 }}
303335 >
304336 {METRIC_OPTIONS.map((option) => (
305 <Toggle key={option.value} value={option.value}>
337 <Toggle key={option.value} value={option.value} title={shortcutTitle(option)}>
306338 {option.label}
307339 </Toggle>
308340 ))}
......@@ -320,7 +352,7 @@ export function UsagePage() {
320352 }}
321353 >
322354 {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)}>
324356 {option.label}
325357 </Toggle>
326358 ))}
......@@ -355,7 +387,7 @@ export function UsagePage() {
355387 </SelectTrigger>
356388 <SelectPopup align="end" alignItemWithTrigger={false}>
357389 {METRIC_OPTIONS.map((option) => (
358 <SelectItem key={option.value} value={option.value}>
390 <SelectItem key={option.value} value={option.value} title={shortcutTitle(option)}>
359391 {option.label}
360392 </SelectItem>
361393 ))}
......@@ -378,7 +410,11 @@ export function UsagePage() {
378410 </SelectTrigger>
379411 <SelectPopup align="end" alignItemWithTrigger={false}>
380412 {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 >
382418 {option.label}
383419 </SelectItem>
384420 ))}
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", () => {
13911391 });
13921392 }
13931393});
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";
132132import { useOpenPanelPullRequestUrl } from "../hooks/useOpenPanelPullRequestUrl";
133133import { writeTextToClipboard } from "../hooks/useCopyToClipboard";
134134import { toastManager } from "../components/ui/toast";
135import { useEscapeToGoBack } from "../hooks/useNavigateBack";
135136import { usePanelAnimationSettings, usePanelPresence } from "../panelAnimations";
136137import {
137138 PULL_REQUESTS_PANEL_REF,
......@@ -340,6 +341,7 @@ export const Route = createFileRoute("/_chat/pull-requests")({
340341});
341342
342343function PullRequestsRouteView() {
344 useEscapeToGoBack();
343345 const search = Route.useSearch();
344346 const sort = search.sort ?? "ready";
345347 const statsPolicy: PullRequestStatsPolicy =
......@@ -2063,8 +2065,9 @@ function PullRequestsRouteView() {
20632065 if (command === "rightPanel.toggle") toggleRightPanelFromShortcut(event);
20642066 if (command === "thread.copyReference") copyPullRequestFromShortcut(event);
20652067 };
2066 window.addEventListener("keydown", onKeyDown);
2067 return () => window.removeEventListener("keydown", onKeyDown);
2068 // Let panel shortcuts consume Escape before page navigation at window.
2069 document.addEventListener("keydown", onKeyDown);
2070 return () => document.removeEventListener("keydown", onKeyDown);
20682071 }, [keybindings]);
20692072
20702073 return (
apps/web/src/routes/settings.tsx+3-22
......@@ -1,5 +1,5 @@
11import { Outlet, createFileRoute, redirect, useLocation } from "@tanstack/react-router";
2import { useEffect, useState, type ReactNode } from "react";
2import { useState, type ReactNode } from "react";
33import { RotateCcwIcon } from "lucide-react";
44import { Button } from "../components/ui/button";
55import { useSettingsRestore } from "../components/settings/SettingsPanels";
......@@ -9,6 +9,7 @@ import { SidebarInset } from "../components/ui/sidebar";
99import { useNavigateToMainApp } from "../components/sidebar/mainAppLocation";
1010import { WorkspacePageHeader } from "../components/WorkspacePageHeader";
1111import { isElectron } from "../env";
12import { useEscapeToGoBack } from "../hooks/useNavigateBack";
1213import {
1314 SettingsScopeProvider,
1415 useSettingsScope,
......@@ -112,30 +113,10 @@ function SettingsScopeBoundary({ pathname, children }: { pathname: string; child
112113function SettingsContentLayout() {
113114 const location = useLocation();
114115 const navigateToMainApp = useNavigateToMainApp();
116 useEscapeToGoBack(navigateToMainApp);
115117 const { search } = useSettingsScope();
116118 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
139120 return (
140121 <SidebarInset className="h-dvh min-h-0 overflow-hidden overscroll-y-none isolate">
141122 <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`.
8484## When conditions
8585
8686Available context keys are `terminalFocus`, `terminalOpen`, `previewFocus`,
87`previewOpen`, `modelPickerOpen`, `editableFocus`, `isWeb`, and `isDesktop`.
87`previewOpen`, `modelPickerOpen`, `usagePageOpen`, `editableFocus`, `isWeb`, and `isDesktop`.
8888`editableFocus` is true while a text field, the composer, or another editor has
8989the keyboard. `isWeb` is true in a browser tab. `isDesktop` is true in the
9090desktop 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
120120Claude quotas. Tap it to open **Usage → Limits**. On iOS, use **Edit Widget** to choose Session,
121121Weekly, or both for each provider. Reopen T3 to refresh expired readings. The Android widget
122122requires 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 @@
5353 "ignoreDependencies": ["playwright-core", "electron-builder"],
5454 },
5555 "apps/web": {
56 // Vitest loads this through the per-file @vitest-environment directive.
57 "ignoreDependencies": ["jsdom"],
5658 // Worktree setup (scripts/setup-worktree.ts) runs this directly.
5759 "entry": ["scripts/warm-dep-cache.ts"],
5860 // 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 = [
9292 "chat.new",
9393 "chat.newLocal",
9494 "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",
95102 ...MODEL_PICKER_KEYBINDING_COMMANDS,
96103 ...THREAD_KEYBINDING_COMMANDS,
97104] as const;
packages/shared/src/keybindings.ts+7
......@@ -76,6 +76,13 @@ export const DEFAULT_KEYBINDINGS: ReadonlyArray<KeybindingRule> = [
7676 command,
7777 when: "modelPickerOpen && isDesktop",
7878 })),
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" },
7986];
8087
8188function normalizeKeyToken(token: string): string {
pnpm-lock.yaml+323-46
......@@ -35,6 +35,7 @@ catalogs:
3535 version: 0.3.3
3636
3737overrides:
38 '@exodus/bytes>@noble/hashes': 1.8.0
3839 '@react-navigation/core': 7.21.13
3940 dbus-next>usocket: '-'
4041 '@anthropic-ai/claude-agent-sdk>@anthropic-ai/claude-agent-sdk-darwin-arm64': '-'
......@@ -135,7 +136,7 @@ importers:
135136 version: 7.0.2
136137 vite-plus:
137138 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
140141 apps/desktop:
141142 dependencies:
......@@ -214,7 +215,7 @@ importers:
214215 version: 4.3.3
215216 vite-plus:
216217 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
219220 apps/marketing:
220221 dependencies:
......@@ -577,7 +578,7 @@ importers:
577578 version: link:../../packages/effect-codex-app-server
578579 vite-plus:
579580 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
582583 apps/web:
583584 dependencies:
......@@ -765,6 +766,9 @@ importers:
765766 compression:
766767 specifier: ^1.8.1
767768 version: 1.8.1
769 jsdom:
770 specifier: ^30.0.1
771 version: 30.1.0(@noble/hashes@1.8.0)
768772 react-test-renderer:
769773 specifier: 19.2.6
770774 version: 19.2.6(react@19.2.6)
......@@ -779,7 +783,7 @@ importers:
779783 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)'
780784 vite-plus:
781785 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
784788 infra/relay:
785789 dependencies:
......@@ -834,7 +838,7 @@ importers:
834838 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)'
835839 vite-plus:
836840 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
839843 oxlint-plugin-t3code:
840844 dependencies:
......@@ -853,7 +857,7 @@ importers:
853857 version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
854858 vite-plus:
855859 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
858862 packages/client-runtime:
859863 dependencies:
......@@ -896,7 +900,7 @@ importers:
896900 version: 2.0.2
897901 vite-plus:
898902 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
901905 packages/contracts:
902906 dependencies:
......@@ -909,7 +913,7 @@ importers:
909913 version: 4.0.0-rc.115(patch_hash=172bd95ef73a13d322888984415d5d18d9d2aa8e13fa529eac235efac837e902)(effect@4.0.0-rc.115(patch_hash=0dfc4bb8ebd80fb3e06b91ef61346f5259517ab0f2437644fe95ae531084b1f5))
910914 vite-plus:
911915 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
914918 packages/effect-acp:
915919 dependencies:
......@@ -931,7 +935,7 @@ importers:
931935 version: 24.12.4
932936 vite-plus:
933937 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
936940 packages/effect-codex-app-server:
937941 dependencies:
......@@ -953,7 +957,7 @@ importers:
953957 version: 24.12.4
954958 vite-plus:
955959 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
958962 packages/shared:
959963 dependencies:
......@@ -987,7 +991,7 @@ importers:
987991 version: 24.12.4
988992 vite-plus:
989993 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
992996 packages/ssh:
993997 dependencies:
......@@ -1012,7 +1016,7 @@ importers:
10121016 version: 24.12.4
10131017 vite-plus:
10141018 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
10171021 packages/tailscale:
10181022 dependencies:
......@@ -1031,7 +1035,7 @@ importers:
10311035 version: 24.12.4
10321036 vite-plus:
10331037 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
10361040 scripts:
10371041 dependencies:
......@@ -1074,7 +1078,7 @@ importers:
10741078 version: typescript@6.0.3
10751079 vite-plus:
10761080 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
10791083packages:
10801084
......@@ -1144,6 +1148,14 @@ packages:
11441148 zod:
11451149 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
11471159 '@astrojs/check@0.9.10':
11481160 resolution: {integrity: sha512-zgx/UQMozdjOa3bOxjgeCFdtpE3c9rRX6xHwa+2QXvy8z8Akifu2AtubHyv/zzC2znO8dl8fFWL4K+Ba9kS8HQ==}
11491161 hasBin: true
......@@ -1772,6 +1784,10 @@ packages:
17721784 '@blazediff/core@1.9.1':
17731785 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
17751791 '@bruits/satteri-darwin-arm64@0.10.5':
17761792 resolution: {integrity: sha512-27KTVl4TJkVahMy/ohyA7qd4938G5UNneFUz/PsScYfpIhj0IVAS23mpcJXdPF44sa6nva198lmV/cKIb2YPyA==}
17771793 cpu: [arm64]
......@@ -2027,6 +2043,42 @@ packages:
20272043 resolution: {integrity: sha512-WTYHwlBhImGmmMt81crxaRvNdZXlBNemFyrP5GGHj2WeDTJMBrHgHTaladTypXHXrviFFBBGROl5moijRQ4ODA==}
20282044 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
20302082 '@date-fns/tz@1.5.0':
20312083 resolution: {integrity: sha512-lwYN/vDPeNRULcepoE/LO2Pgx+7/RV+S9ARfbc9lr2DtGkOD7pAiruHvbR1RX3Qyf6ja47EWJDMsNK5vK08DJg==}
20322084
......@@ -2648,6 +2700,15 @@ packages:
26482700 resolution: {integrity: sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ==}
26492701 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
26512712 '@exodus/schemasafe@1.3.0':
26522713 resolution: {integrity: sha512-5Aap/GaRupgNx/feGBwLLTVv8OQFfv3pq2lPRzPg9R+IOBnDgghTGW7l7EuVXOvg5cc/xSAlRW8rBrjIC3Nvqw==}
26532714
......@@ -6281,6 +6342,9 @@ packages:
62816342 before-after-hook@4.0.0:
62826343 resolution: {integrity: sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==}
62836344
6345 bidi-js@1.1.0:
6346 resolution: {integrity: sha512-fX1Onk0tdVPC7obPWB5EbJ1z7NVhLq4m2xZLq2YXBkxzMXIGRpNMU88n0EPgWseKl12J7zXs7qrDxPK4sRs2fg==}
6347
62846348 big-integer@1.6.52:
62856349 resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==}
62866350 engines: {node: '>=0.6'}
......@@ -6722,6 +6786,10 @@ packages:
67226786 resolution: {integrity: sha512-1+BhOB8ahCn4O0cep0Sh2l9KCOfOdY+BXJnKMHFFzDEouSr/el18QwXEMRlOj9UY5nCeA8UN3a/82rUWRBeyBw==}
67236787 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
67256793 date-fns@4.4.0:
67266794 resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==}
67276795
......@@ -6757,6 +6825,9 @@ packages:
67576825 supports-color:
67586826 optional: true
67596827
6828 decimal.js@10.6.0:
6829 resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
6830
67606831 decode-named-character-reference@1.3.0:
67616832 resolution: {integrity: sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==}
67626833
......@@ -7120,6 +7191,10 @@ packages:
71207191 resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==}
71217192 engines: {node: '>=0.12'}
71227193
7194 entities@8.1.0:
7195 resolution: {integrity: sha512-kxL7msIffSuh9aaFAMD7rxAIuTRMAHMeBtgHW2yUdWw732ZNh4MehkF2gdjvtdmikkaIP9bFDDJOPlsvm7avrA==}
7196 engines: {node: '>=20.19.0'}
7197
71237198 env-paths@2.2.1:
71247199 resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
71257200 engines: {node: '>=6'}
......@@ -7909,6 +7984,10 @@ packages:
79097984 resolution: {integrity: sha512-puUZAUKT5m8Zzvs72XWy3HtvVbTWljRE66cP60bxJzAqf2DgICo7lYTY2IHUmLnNpjYvw5bvmoHvPc0QO2a62w==}
79107985 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
79127991 html-escaper@3.0.3:
79137992 resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==}
79147993
......@@ -8047,6 +8126,9 @@ packages:
80478126 resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==}
80488127 engines: {node: '>=12'}
80498128
8129 is-potential-custom-element-name@1.0.1:
8130 resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
8131
80508132 is-promise@4.0.0:
80518133 resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==}
80528134
......@@ -8143,6 +8225,15 @@ packages:
81438225 jsc-safe-url@0.2.4:
81448226 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
81468237 jsesc@3.1.0:
81478238 resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
81488239 engines: {node: '>=6'}
......@@ -8366,6 +8457,10 @@ packages:
83668457 resolution: {integrity: sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g==}
83678458 engines: {node: 20 || >=22}
83688459
8460 lru-cache@11.5.3:
8461 resolution: {integrity: sha512-U4N8FgzmWxc8k1VH8Kr6lQg18U7Fjvby6wXHVRX/ZZ7IwWbRMgrRbP0Wrb5q5NVinryp4SQampHKdvtecItxUg==}
8462 engines: {node: 20 || >=22}
8463
83698464 lru-cache@5.1.1:
83708465 resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
83718466
......@@ -9150,6 +9245,9 @@ packages:
91509245 parse5@7.3.0:
91519246 resolution: {integrity: sha512-IInvU7fabl34qmi9gY8XOVxhYyMyuH2xUNpb2q8/Y+7552KlejkRvqvD19nMoUW/uQGGbqNpA6Tufu5FL5BZgw==}
91529247
9248 parse5@8.0.1:
9249 resolution: {integrity: sha512-z1e/HMG90obSGeidlli3hj7cbocou0/wa5HacvI3ASx34PecNjNQeaHNo5WIZpWofN9kgkqV1q5YvXe3F0FoPw==}
9250
91539251 parseurl@1.3.3:
91549252 resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==}
91559253 engines: {node: '>= 0.8'}
......@@ -9874,6 +9972,10 @@ packages:
98749972 resolution: {integrity: sha512-42tBVwLWnaQvW5zc4HbZrTuWccECCZfBi92FDuwtqxasH+JbPB3/FOKb1m222K42R4WxuxzzMsTswfzgtSu64Q==}
98759973 engines: {node: '>=11.0.0'}
98769974
9975 saxes@6.0.0:
9976 resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
9977 engines: {node: '>=v12.22.7'}
9978
98779979 scheduler@0.27.0:
98789980 resolution: {integrity: sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==}
98799981
......@@ -10340,6 +10442,10 @@ packages:
1034010442 resolution: {integrity: sha512-LktZQb3IeoUWB9lqR5EWTHgW/VTITCXg4D21M+lvybRVdylLrRMnqaIONLVb5mav8vM19m44HIcGq4qASeu2Qw==}
1034110443 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
1034310449 tr46@0.0.3:
1034410450 resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==}
1034510451
......@@ -10347,6 +10453,10 @@ packages:
1034710453 resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
1034810454 engines: {node: '>=18'}
1034910455
10456 tr46@6.0.0:
10457 resolution: {integrity: sha512-bLVMLPtstlZ4iMQHpFHTR7GAGj2jxi8Dg0s2h2MafAE4uSWF98FC/3MomU51iQAMf8/qDUbKWf5GxuvvVcXEhw==}
10458 engines: {node: '>=20'}
10459
1035010460 trim-lines@3.0.1:
1035110461 resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
1035210462
......@@ -10837,6 +10947,10 @@ packages:
1083710947 w3c-keyname@2.2.8:
1083810948 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
1084010954 walk-up-path@4.0.0:
1084110955 resolution: {integrity: sha512-3hu+tD8YzSLGuFYtPRb48vdhKMi0KQV5sn+uWr8+7dMEq/2G/dtLrdDinkLjqq5TIbIBjYJ4Ax/n3YiaW7QM8A==}
1084210956 engines: {node: 20 || >=22}
......@@ -10863,12 +10977,20 @@ packages:
1086310977 resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
1086410978 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
1086610984 webpack-virtual-modules@0.6.2:
1086710985 resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
1086810986
1086910987 whatwg-fetch@3.6.20:
1087010988 resolution: {integrity: sha512-EqhiFU6daOA8kpjOWTL0olhVOF3i7OrFzSYiGsEMB8GcXS+RrzauAERX65xMeNWVqxA6HXH2m69Z9LaKKdisfg==}
1087110989
10990 whatwg-mimetype@5.0.0:
10991 resolution: {integrity: sha512-sXcNcHOC51uPGF0P/D4NVtrkjSU2fNsm9iog4ZvZJsL3rjoDAzXZhkm2MWt1y+PUdggKAYVoMAIYcs78wJ51Cw==}
10992 engines: {node: '>=20'}
10993
1087210994 whatwg-url-minimum@0.1.2:
1087310995 resolution: {integrity: sha512-XPEm0XFQWNVG292lII1PrRRJl3sItrs7CettZ4ncYxuDVpLyy+NwlGyut2hXI0JswcJUxeCH+CyOJK0ZzAXD6A==}
1087410996
......@@ -10876,6 +10998,14 @@ packages:
1087610998 resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
1087710999 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
1087911009 whatwg-url@5.0.0:
1088011010 resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==}
1088111011
......@@ -10947,6 +11077,10 @@ packages:
1094711077 resolution: {integrity: sha512-kCz5k7J7XbJtjABOvkc5lJmkiDh8VhjVCGNiqdKCscmVpdVUpEAyXv1xmCLkQJ5dsHqx3IPO4XW+NTDhU/fatA==}
1094811078 engines: {node: '>=10.0.0'}
1094911079
11080 xml-name-validator@5.0.0:
11081 resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
11082 engines: {node: '>=18'}
11083
1095011084 xml-naming@0.1.0:
1095111085 resolution: {integrity: sha512-k8KO9hrMyNk6tUWqUfkTEZbezRRpONVOzUTnc97VnCvyj6Tf9lyUR9EDAIeiVLv56jsMcoXEwjW8Kv5yPY52lw==}
1095211086 engines: {node: '>=16.0.0'}
......@@ -10971,6 +11105,9 @@ packages:
1097111105 resolution: {integrity: sha512-yMqGBqtXyeN1e3TGYvgNgDVZ3j84W4cwkOXQswghol6APgZWaff9lnbvN7MHYJOiXsvGPXtjTYJEiC9J2wv9Eg==}
1097211106 engines: {node: '>=8.0'}
1097311107
11108 xmlchars@2.2.0:
11109 resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
11110
1097411111 xtend@4.0.2:
1097511112 resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
1097611113 engines: {node: '>=0.4'}
......@@ -11149,6 +11286,21 @@ snapshots:
1114911286 optionalDependencies:
1115011287 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
1115211304 '@astrojs/check@0.9.10(prettier@3.8.3)(typescript@6.0.3)':
1115311305 dependencies:
1115411306 '@astrojs/language-server': 2.16.10(prettier@3.8.3)(typescript@6.0.3)
......@@ -12017,6 +12169,10 @@ snapshots:
1201712169
1201812170 '@blazediff/core@1.9.1': {}
1201912171
12172 '@bramus/specificity@2.4.2':
12173 dependencies:
12174 css-tree: 3.2.1
12175
1202012176 '@bruits/satteri-darwin-arm64@0.10.5':
1202112177 optional: true
1202212178
......@@ -12248,6 +12404,30 @@ snapshots:
1224812404 '@crowecawcaw/xa11y-win32-arm64-msvc': 0.13.0
1224912405 '@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
1225112431 '@date-fns/tz@1.5.0': {}
1225212432
1225312433 '@daypicker/react@10.0.1(@types/react@19.2.16)(react@19.2.6)':
......@@ -12793,6 +12973,10 @@ snapshots:
1279312973 dependencies:
1279412974 '@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
1279612980 '@exodus/schemasafe@1.3.0': {}
1279712981
1279812982 '@expo-google-fonts/dm-sans@0.4.2': {}
......@@ -15775,12 +15959,12 @@ snapshots:
1577515959 '@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)
1577615960 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)))':
1577915963 dependencies:
1578015964 '@testing-library/dom': 10.4.1
1578115965 '@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)))
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))
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)))
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))
1578415968 transitivePeerDependencies:
1578515969 - bufferutil
1578615970 - msw
......@@ -15792,14 +15976,14 @@ snapshots:
1579215976 '@testing-library/dom': 10.4.1
1579315977 '@testing-library/user-event': 14.6.1(@testing-library/dom@10.4.1)
1579415978 '@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))
1579615980 transitivePeerDependencies:
1579715981 - bufferutil
1579815982 - msw
1579915983 - utf-8-validate
1580015984 - 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)))':
1580315987 dependencies:
1580415988 '@blazediff/core': 1.9.1
1580515989 '@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:
1580815992 pngjs: 7.0.0
1580915993 sirv: 3.0.2
1581015994 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))
1581215996 ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1581315997 transitivePeerDependencies:
1581415998 - bufferutil
......@@ -15825,7 +16009,7 @@ snapshots:
1582516009 pngjs: 7.0.0
1582616010 sirv: 3.0.2
1582716011 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))
1582916013 ws: 8.21.3(bufferutil@4.1.0)(utf-8-validate@6.0.6)
1583016014 transitivePeerDependencies:
1583116015 - bufferutil
......@@ -16601,6 +16785,10 @@ snapshots:
1660116785
1660216786 before-after-hook@4.0.0: {}
1660316787
16788 bidi-js@1.1.0:
16789 dependencies:
16790 require-from-string: 2.0.2
16791
1660416792 big-integer@1.6.52: {}
1660516793
1660616794 bippy@0.5.41(react@19.2.6):
......@@ -17048,6 +17236,13 @@ snapshots:
1704817236
1704917237 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
1705117246 date-fns@4.4.0: {}
1705217247
1705317248 dbus-next@0.10.2(patch_hash=cfff57561b0ee59b5addb3b2e6c6f20906e967507a530ab67e8db8108e520ba4):
......@@ -17076,6 +17271,8 @@ snapshots:
1707617271 dependencies:
1707717272 ms: 2.1.3
1707817273
17274 decimal.js@10.6.0: {}
17275
1707917276 decode-named-character-reference@1.3.0:
1708017277 dependencies:
1708117278 character-entities: 2.0.2
......@@ -17345,6 +17542,8 @@ snapshots:
1734517542
1734617543 entities@6.0.1: {}
1734717544
17545 entities@8.1.0: {}
17546
1734817547 env-paths@2.2.1: {}
1734917548
1735017549 env-paths@3.0.0: {}
......@@ -18483,6 +18682,12 @@ snapshots:
1848318682 dependencies:
1848418683 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
1848618691 html-escaper@3.0.3: {}
1848718692
1848818693 html-url-attributes@3.0.1: {}
......@@ -18608,6 +18813,8 @@ snapshots:
1860818813
1860918814 is-plain-obj@4.1.0: {}
1861018815
18816 is-potential-custom-element-name@1.0.1: {}
18817
1861118818 is-promise@4.0.0: {}
1861218819
1861318820 is-unicode-supported@2.1.0: {}
......@@ -18689,6 +18896,31 @@ snapshots:
1868918896
1869018897 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
1869218924 jsesc@3.1.0: {}
1869318925
1869418926 json-buffer@3.0.1: {}
......@@ -18888,6 +19120,8 @@ snapshots:
1888819120
1888919121 lru-cache@11.5.2: {}
1889019122
19123 lru-cache@11.5.3: {}
19124
1889119125 lru-cache@5.1.1:
1889219126 dependencies:
1889319127 yallist: 3.1.1
......@@ -20104,7 +20338,7 @@ snapshots:
2010420338 '@oxc-resolver/binding-win32-arm64-msvc': 11.24.2
2010520339 '@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)):
2010820342 dependencies:
2010920343 tinypool: 2.1.2
2011020344 optionalDependencies:
......@@ -20127,9 +20361,9 @@ snapshots:
2012720361 '@oxfmt/binding-win32-arm64-msvc': 0.68.0
2012820362 '@oxfmt/binding-win32-ia32-msvc': 0.68.0
2012920363 '@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)):
2013320367 dependencies:
2013420368 tinypool: 2.1.2
2013520369 optionalDependencies:
......@@ -20152,7 +20386,7 @@ snapshots:
2015220386 '@oxfmt/binding-win32-arm64-msvc': 0.68.0
2015320387 '@oxfmt/binding-win32-ia32-msvc': 0.68.0
2015420388 '@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
2015720391 oxlint-tsgolint@7.0.2001:
2015820392 optionalDependencies:
......@@ -20163,7 +20397,7 @@ snapshots:
2016320397 '@oxlint-tsgolint/win32-arm64': 7.0.2001
2016420398 '@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)):
2016720401 optionalDependencies:
2016820402 '@oxlint/binding-android-arm-eabi': 1.83.0
2016920403 '@oxlint/binding-android-arm64': 1.83.0
......@@ -20185,9 +20419,9 @@ snapshots:
2018520419 '@oxlint/binding-win32-ia32-msvc': 1.83.0
2018620420 '@oxlint/binding-win32-x64-msvc': 1.83.0
2018720421 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)):
2019120425 optionalDependencies:
2019220426 '@oxlint/binding-android-arm-eabi': 1.83.0
2019320427 '@oxlint/binding-android-arm64': 1.83.0
......@@ -20209,7 +20443,7 @@ snapshots:
2020920443 '@oxlint/binding-win32-ia32-msvc': 1.83.0
2021020444 '@oxlint/binding-win32-x64-msvc': 1.83.0
2021120445 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
2021420448 p-cancelable@2.1.1: {}
2021520449
......@@ -20262,6 +20496,10 @@ snapshots:
2026220496 dependencies:
2026320497 entities: 6.0.1
2026420498
20499 parse5@8.0.1:
20500 dependencies:
20501 entities: 8.1.0
20502
2026520503 parseurl@1.3.3: {}
2026620504
2026720505 path-browserify@1.0.1: {}
......@@ -20551,8 +20789,7 @@ snapshots:
2055120789 end-of-stream: 1.4.5
2055220790 once: 1.4.0
2055320791
20554 punycode@2.3.1:
20555 optional: true
20792 punycode@2.3.1: {}
2055620793
2055720794 pvtsutils@1.3.6:
2055820795 dependencies:
......@@ -21199,6 +21436,10 @@ snapshots:
2119921436
2120021437 sax@1.6.1: {}
2120121438
21439 saxes@6.0.0:
21440 dependencies:
21441 xmlchars: 2.2.0
21442
2120221443 scheduler@0.27.0: {}
2120321444
2120421445 schema-utils@4.3.3:
......@@ -21688,13 +21929,11 @@ snapshots:
2168821929
2168921930 tinyrainbow@3.1.0: {}
2169021931
21691 tldts-core@7.4.2:
21692 optional: true
21932 tldts-core@7.4.2: {}
2169321933
2169421934 tldts@7.4.2:
2169521935 dependencies:
2169621936 tldts-core: 7.4.2
21697 optional: true
2169821937
2169921938 tmp-promise@3.0.3:
2170021939 dependencies:
......@@ -21719,6 +21958,10 @@ snapshots:
2171921958 tldts: 7.4.2
2172021959 optional: true
2172121960
21961 tough-cookie@6.0.2:
21962 dependencies:
21963 tldts: 7.4.2
21964
2172221965 tr46@0.0.3: {}
2172321966
2172421967 tr46@5.1.1:
......@@ -21726,6 +21969,10 @@ snapshots:
2172621969 punycode: 2.3.1
2172721970 optional: true
2172821971
21972 tr46@6.0.0:
21973 dependencies:
21974 punycode: 2.3.1
21975
2172921976 trim-lines@3.0.1: {}
2173021977
2173121978 trough@2.2.0: {}
......@@ -22004,12 +22251,12 @@ snapshots:
2200422251 '@types/unist': 3.0.3
2200522252 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):
2200822255 dependencies:
2200922256 '@oxc-project/types': 0.150.0
2201022257 '@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)))
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)))
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)))
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)))
2201322260 '@vitest/expect': 4.1.11
2201422261 '@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))
2201522262 '@vitest/pretty-format': 4.1.11
......@@ -22017,11 +22264,11 @@ snapshots:
2201722264 '@vitest/snapshot': 4.1.11
2201822265 '@vitest/spy': 4.1.11
2201922266 '@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))
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))
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))
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))
2202222269 oxlint-tsgolint: 7.0.2001
2202322270 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))
2202522272 optionalDependencies:
2202622273 '@voidzero-dev/vite-plus-darwin-arm64': 0.3.3
2202722274 '@voidzero-dev/vite-plus-darwin-x64': 0.3.3
......@@ -22061,7 +22308,7 @@ snapshots:
2206122308 - utf-8-validate
2206222309 - 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):
2206522312 dependencies:
2206622313 '@oxc-project/types': 0.150.0
2206722314 '@oxlint/plugins': 1.79.0
......@@ -22074,11 +22321,11 @@ snapshots:
2207422321 '@vitest/snapshot': 4.1.11
2207522322 '@vitest/spy': 4.1.11
2207622323 '@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))
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))
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))
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))
2207922326 oxlint-tsgolint: 7.0.2001
2208022327 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))
2208222329 optionalDependencies:
2208322330 '@voidzero-dev/vite-plus-darwin-arm64': 0.3.3
2208422331 '@voidzero-dev/vite-plus-darwin-x64': 0.3.3
......@@ -22122,7 +22369,7 @@ snapshots:
2212222369 optionalDependencies:
2212322370 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)):
2212622373 dependencies:
2212722374 '@vitest/expect': 4.1.11
2212822375 '@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:
2214722394 optionalDependencies:
2214822395 '@types/node': 24.12.4
2214922396 '@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)
2215022398 transitivePeerDependencies:
2215122399 - 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)):
2215422402 dependencies:
2215522403 '@vitest/expect': 4.1.11
2215622404 '@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:
2217522423 optionalDependencies:
2217622424 '@types/node': 24.12.4
2217722425 '@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)
2217822427 transitivePeerDependencies:
2217922428 - msw
2218022429
......@@ -22279,6 +22528,10 @@ snapshots:
2227922528
2228022529 w3c-keyname@2.2.8: {}
2228122530
22531 w3c-xmlserializer@5.0.0:
22532 dependencies:
22533 xml-name-validator: 5.0.0
22534
2228222535 walk-up-path@4.0.0: {}
2228322536
2228422537 walker@1.0.8:
......@@ -22306,10 +22559,14 @@ snapshots:
2230622559 webidl-conversions@7.0.0:
2230722560 optional: true
2230822561
22562 webidl-conversions@8.0.1: {}
22563
2230922564 webpack-virtual-modules@0.6.2: {}
2231022565
2231122566 whatwg-fetch@3.6.20: {}
2231222567
22568 whatwg-mimetype@5.0.0: {}
22569
2231322570 whatwg-url-minimum@0.1.2: {}
2231422571
2231522572 whatwg-url@14.2.0:
......@@ -22318,6 +22575,22 @@ snapshots:
2231822575 webidl-conversions: 7.0.0
2231922576 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
2232122594 whatwg-url@5.0.0:
2232222595 dependencies:
2232322596 tr46: 0.0.3
......@@ -22384,6 +22657,8 @@ snapshots:
2238422657 simple-plist: 1.3.1
2238522658 uuid: 7.0.3
2238622659
22660 xml-name-validator@5.0.0: {}
22661
2238722662 xml-naming@0.1.0: {}
2238822663
2238922664 xml-naming@0.3.0: {}
......@@ -22402,6 +22677,8 @@ snapshots:
2240222677
2240322678 xmlbuilder@15.1.1: {}
2240422679
22680 xmlchars@2.2.0: {}
22681
2240522682 xtend@4.0.2:
2240622683 optional: true
2240722684
pnpm-workspace.yaml+2
......@@ -98,6 +98,8 @@ minimumReleaseAgeExclude:
9898 - cn@0.3.2
9999
100100overrides:
101 # Keep jsdom's optional peer consistent so Vite+ has one test-runner instance.
102 "@exodus/bytes>@noble/hashes": "1.8.0"
101103 # Earlier React Navigation declarations create a circular type alias in TypeScript 7.
102104 "@react-navigation/core": 7.21.13
103105 # The dbus-next patch drops usocket from the package, but pnpm resolves from the