feat: add react-scan in dev

This commit is contained in:
Aarnav Tale 2025-01-24 08:17:12 -05:00
parent 665509e710
commit 0f75636342
No known key found for this signature in database
8 changed files with 577 additions and 133 deletions

View File

@ -1,12 +1,12 @@
import type { Dispatch, SetStateAction } from 'react'; import type { Dispatch, SetStateAction } from 'react';
import React, { useRef } from 'react'; import React, { useRef } from 'react';
import { useButton, type AriaButtonOptions } from 'react-aria'; import { type AriaButtonOptions, useButton } from 'react-aria';
import { cn } from '~/utils/cn'; import { cn } from '~/utils/cn';
export interface ButtonProps extends AriaButtonOptions<'button'> { export interface ButtonProps extends AriaButtonOptions<'button'> {
variant?: 'heavy' | 'light' variant?: 'heavy' | 'light' | 'danger';
className?: string className?: string;
children?: React.ReactNode children?: React.ReactNode;
} }
export default function Button({ variant = 'light', ...props }: ButtonProps) { export default function Button({ variant = 'light', ...props }: ButtonProps) {
@ -25,8 +25,11 @@ export default function Button({ variant = 'light', ...props }: ButtonProps) {
? [ ? [
'bg-headplane-900 dark:bg-headplane-50 font-semibold', 'bg-headplane-900 dark:bg-headplane-50 font-semibold',
'hover:bg-headplane-900/90 dark:hover:bg-headplane-50/90', 'hover:bg-headplane-900/90 dark:hover:bg-headplane-50/90',
'text-headplane-200 dark:text-headplane-800' 'text-headplane-200 dark:text-headplane-800',
] : [ ]
: variant === 'danger'
? ['bg-red-500 text-white font-semibold', 'hover:bg-red-500/90']
: [
'bg-headplane-100 dark:bg-headplane-700/30 font-medium', 'bg-headplane-100 dark:bg-headplane-700/30 font-medium',
'hover:bg-headplane-200/90 dark:hover:bg-headplane-800/30', 'hover:bg-headplane-200/90 dark:hover:bg-headplane-800/30',
]), ]),
@ -35,5 +38,5 @@ export default function Button({ variant = 'light', ...props }: ButtonProps) {
> >
{props.children} {props.children}
</button> </button>
) );
} }

View File

@ -1,51 +1,130 @@
import React, { Dispatch, ReactNode, SetStateAction } from 'react'; import React, { cloneElement, useRef } from 'react';
import Button, { ButtonProps } from '~/components/Button';
import Title from '~/components/Title';
import Text from '~/components/Text';
import Card from '~/components/Card';
import { import {
Dialog as AriaDialog, type AriaDialogProps,
DialogTrigger, type AriaModalOverlayProps,
Modal, Overlay,
ModalOverlay, useDialog,
} from 'react-aria-components'; useModalOverlay,
useOverlayTrigger,
} from 'react-aria';
import { Form, type HTMLFormMethod } from 'react-router';
import {
type OverlayTriggerProps,
type OverlayTriggerState,
useOverlayTriggerState,
} from 'react-stately';
import Button, { ButtonProps } from '~/components/Button';
import Card from '~/components/Card';
import IconButton, { IconButtonProps } from '~/components/IconButton';
import Text from '~/components/Text';
import Title from '~/components/Title';
import { cn } from '~/utils/cn'; import { cn } from '~/utils/cn';
interface ActionProps extends Omit<ButtonProps, 'variant'> { export interface DialogProps extends OverlayTriggerProps {
variant: 'cancel' | 'confirm'; children: [
React.ReactElement<ButtonProps> | React.ReactElement<IconButtonProps>,
React.ReactElement<DialogPanelProps>,
];
} }
function Action(props: ActionProps) { function Dialog(props: DialogProps) {
const state = useOverlayTriggerState(props);
const { triggerProps, overlayProps } = useOverlayTrigger(
{
type: 'dialog',
},
state,
);
const [button, panel] = props.children;
return ( return (
<Button <>
{...props} {cloneElement(button, triggerProps)}
type={props.variant === 'confirm' ? 'submit' : 'button'} {state.isOpen && (
variant={props.variant === 'cancel' ? 'light' : 'heavy'} <DModal state={state}>
/> {cloneElement(panel, {
...overlayProps,
close: () => state.close(),
})}
</DModal>
)}
</>
); );
} }
interface GutterProps { export interface DialogPanelProps extends AriaDialogProps {
children: ReactNode; children: React.ReactNode;
variant?: 'normal' | 'destructive';
onSubmit?: React.FormEventHandler<HTMLFormElement>;
method?: HTMLFormMethod;
// Anonymous (passed by parent)
close?: () => void;
} }
function Gutter({ children }: GutterProps) { function Panel(props: DialogPanelProps) {
const { children, onSubmit, close, variant, method = 'POST' } = props;
const ref = useRef<HTMLFormElement | null>(null);
const { dialogProps } = useDialog(
{
...props,
role: 'alertdialog',
},
ref,
);
return ( return (
<div className="mt-6 flex justify-end gap-4 mt-6"> <Form
{...dialogProps}
onSubmit={(event) => {
if (onSubmit) {
onSubmit(event);
}
close?.();
}}
method={method ?? 'POST'}
ref={ref}
className={cn(
'outline-none rounded-3xl w-full max-w-lg',
'bg-white dark:bg-headplane-900',
)}
>
<Card className="w-full max-w-lg">
{children} {children}
<div className="mt-6 flex justify-end gap-4">
<Button onPress={close}>Cancel</Button>
<Button
type="submit"
variant={variant === 'destructive' ? 'danger' : 'heavy'}
isDisabled={!(ref.current?.checkVisibility() ?? false)}
>
Confirm
</Button>
</div> </div>
) </Card>
</Form>
);
} }
interface PanelProps { interface DModalProps extends AriaModalOverlayProps {
children: (close: () => void) => ReactNode; children: React.ReactNode;
control?: [boolean, Dispatch<SetStateAction<boolean>>]; state: OverlayTriggerState;
className?: string;
} }
function Panel({ children, control, className }: PanelProps) { function DModal(props: DModalProps) {
const { children, state } = props;
const ref = useRef<HTMLDivElement>(null);
const { modalProps, underlayProps } = useModalOverlay(props, state, ref);
if (!state.isOpen) {
return null;
}
return ( return (
<ModalOverlay <Overlay>
<div
{...underlayProps}
aria-hidden="true" aria-hidden="true"
className={cn( className={cn(
'fixed inset-0 h-screen w-screen z-50', 'fixed inset-0 h-screen w-screen z-50',
@ -54,44 +133,24 @@ function Panel({ children, control, className }: PanelProps) {
'entering:animate-in exiting:animate-out', 'entering:animate-in exiting:animate-out',
'entering:fade-in entering:duration-100 entering:ease-out', 'entering:fade-in entering:duration-100 entering:ease-out',
'exiting:fade-out exiting:duration-50 exiting:ease-in', 'exiting:fade-out exiting:duration-50 exiting:ease-in',
className,
)} )}
isOpen={control ? control[0] : undefined} />
onOpenChange={control ? control[1] : undefined} <div
{...modalProps}
className={cn(
'fixed inset-0 h-screen w-screen z-50',
'flex items-center justify-center',
)}
> >
<Modal className={cn( {children}
'bg-white dark:bg-headplane-900 rounded-3xl w-full max-w-lg', </div>
'entering:animate-in exiting:animate-out', </Overlay>
'entering:zoom-in-95 entering:ease-out entering:duration-100',
'exiting:zoom-out-95 exiting:ease-in exiting:duration-50',
)}>
<Card variant="flat" className="w-full max-w-lg">
<AriaDialog role="alertdialog" className="outline-none">
{({ close }) => children(close)}
</AriaDialog>
</Card>
</Modal>
</ModalOverlay>
); );
} }
interface DialogProps {
children: ReactNode;
control?: [boolean, Dispatch<SetStateAction<boolean>>];
}
function Dialog({ children, control }: DialogProps) {
if (control) {
return children;
}
return <DialogTrigger>{children}</DialogTrigger>;
}
export default Object.assign(Dialog, { export default Object.assign(Dialog, {
Action,
Button, Button,
Gutter, IconButton,
Panel, Panel,
Title, Title,
Text, Text,

65
app/components/Input.tsx Normal file
View File

@ -0,0 +1,65 @@
import { useRef } from 'react';
import { type AriaTextFieldProps, useTextField } from 'react-aria';
import cn from '~/utils/cn';
export interface InputProps extends AriaTextFieldProps<HTMLInputElement> {
isRequired?: boolean;
}
export default function Input(props: InputProps) {
const { label } = props;
const ref = useRef<HTMLInputElement | null>(null);
const {
labelProps,
inputProps,
descriptionProps,
errorMessageProps,
isInvalid,
validationErrors,
} = useTextField(props, ref);
return (
<div className="flex flex-col">
<label
{...labelProps}
htmlFor={props.name}
className={cn(
'text-xs font-medium px-3 mb-0.5',
'text-headplane-700 dark:text-headplane-100',
)}
>
{label}
</label>
<input
{...inputProps}
required={props.isRequired}
ref={ref}
className={cn(
'rounded-xl px-3 py-2',
'focus:outline-none focus:ring',
'bg-white dark:bg-headplane-900',
'border border-headplane-100 dark:border-headplane-800',
)}
/>
{props.description && (
<div
{...descriptionProps}
className={cn(
'text-xs px-3 mt-1',
'text-headplane-500 dark:text-headplane-400',
)}
>
{props.description}
</div>
)}
{isInvalid && (
<div
{...errorMessageProps}
className={cn('text-xs px-3 mt-1', 'text-red-500 dark:text-red-400')}
>
{validationErrors.join(' ')}
</div>
)}
</div>
);
}

View File

@ -0,0 +1,99 @@
import { Minus, Plus } from 'lucide-react';
import { useRef } from 'react';
import {
type AriaNumberFieldProps,
useLocale,
useNumberField,
} from 'react-aria';
import { useNumberFieldState } from 'react-stately';
import IconButton from '~/components/IconButton';
import cn from '~/utils/cn';
export interface InputProps extends AriaNumberFieldProps {
isRequired?: boolean;
name?: string;
}
export default function NumberInput(props: InputProps) {
const { label, name } = props;
const { locale } = useLocale();
const state = useNumberFieldState({ ...props, locale });
const ref = useRef<HTMLInputElement | null>(null);
const {
labelProps,
inputProps,
groupProps,
incrementButtonProps,
decrementButtonProps,
descriptionProps,
errorMessageProps,
isInvalid,
validationErrors,
} = useNumberField(props, state, ref);
return (
<div className="flex flex-col">
<label
{...labelProps}
htmlFor={name}
className={cn(
'text-xs font-medium px-3 mb-0.5',
'text-headplane-700 dark:text-headplane-100',
)}
>
{label}
</label>
<div
{...groupProps}
className={cn(
'flex items-center gap-1 rounded-xl pr-1',
'focus-within:outline-none focus-within:ring',
'bg-white dark:bg-headplane-900',
'border border-headplane-100 dark:border-headplane-800',
)}
>
<input
{...inputProps}
required={props.isRequired}
name={name}
ref={ref}
className="w-full pl-3 py-2 rounded-l-xl focus:outline-none"
/>
<IconButton
{...decrementButtonProps}
label="Decrement"
className="w-7.5 h-7.5 rounded-lg"
>
<Minus className="p-1" />
</IconButton>
<IconButton
{...incrementButtonProps}
label="Increment"
className="w-7.5 h-7.5 rounded-lg"
>
<Plus className="p-1" />
</IconButton>
</div>
{props.description && (
<div
{...descriptionProps}
className={cn(
'text-xs px-3 mt-1',
'text-headplane-500 dark:text-headplane-400',
)}
>
{props.description}
</div>
)}
{isInvalid && (
<div
{...errorMessageProps}
className={cn('text-xs px-3 mt-1', 'text-red-500 dark:text-red-400')}
>
{validationErrors.join(' ')}
</div>
)}
</div>
);
}

View File

@ -1,12 +1,18 @@
import { startTransition, StrictMode } from "react"; import { StrictMode, startTransition } from 'react';
import { hydrateRoot } from "react-dom/client"; import { hydrateRoot } from 'react-dom/client';
import { HydratedRouter } from "react-router/dom"; import { HydratedRouter } from 'react-router/dom';
if (import.meta.env.DEV) {
import('react-scan').then(({ scan }) => {
scan({ enabled: true });
});
}
startTransition(() => { startTransition(() => {
hydrateRoot( hydrateRoot(
document, document,
<StrictMode> <StrictMode>
<HydratedRouter /> <HydratedRouter />
</StrictMode> </StrictMode>,
); );
}); });

View File

@ -2,3 +2,4 @@ import { type ClassValue, clsx } from 'clsx';
import { twMerge } from 'tailwind-merge'; import { twMerge } from 'tailwind-merge';
export const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs)); export const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs));
export default cn;

View File

@ -38,6 +38,7 @@
"react-dom": "19.0.0", "react-dom": "19.0.0",
"react-error-boundary": "^5.0.0", "react-error-boundary": "^5.0.0",
"react-router": "^7.0.0", "react-router": "^7.0.0",
"react-stately": "^3.35.0",
"remix-utils": "^8.0.0", "remix-utils": "^8.0.0",
"tailwind-merge": "^2.6.0", "tailwind-merge": "^2.6.0",
"tailwindcss-react-aria-components": "^1.2.0", "tailwindcss-react-aria-components": "^1.2.0",
@ -58,6 +59,7 @@
"lefthook": "^1.10.9", "lefthook": "^1.10.9",
"postcss": "^8.4.49", "postcss": "^8.4.49",
"react-router-dom": "^7.1.1", "react-router-dom": "^7.1.1",
"react-scan": "^0.1.0",
"tailwindcss": "^3.4.17", "tailwindcss": "^3.4.17",
"tailwindcss-animate": "^1.0.7", "tailwindcss-animate": "^1.0.7",
"typescript": "^5.7.2", "typescript": "^5.7.2",

View File

@ -97,6 +97,9 @@ importers:
react-router: react-router:
specifier: ^7.0.0 specifier: ^7.0.0
version: 7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) version: 7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-stately:
specifier: ^3.35.0
version: 3.35.0(react@19.0.0)
remix-utils: remix-utils:
specifier: ^8.0.0 specifier: ^8.0.0
version: 8.0.0(react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(zod@3.24.1) version: 8.0.0(react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(zod@3.24.1)
@ -114,7 +117,7 @@ importers:
version: 3.1.0(react@19.0.0) version: 3.1.0(react@19.0.0)
vite-node: vite-node:
specifier: ^3.0.1 specifier: ^3.0.1
version: 3.0.1(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) version: 3.0.1(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
ws: ws:
specifier: ^8.18.0 specifier: ^8.18.0
version: 8.18.0 version: 8.18.0
@ -133,7 +136,7 @@ importers:
version: 1.9.4 version: 1.9.4
'@react-router/dev': '@react-router/dev':
specifier: ^7.0.0 specifier: ^7.0.0
version: 7.1.1(@types/node@22.10.1)(jiti@1.21.7)(react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(tsx@4.19.2)(typescript@5.7.2)(vite@6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0) version: 7.1.1(@types/node@22.10.7)(jiti@1.21.7)(react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(tsx@4.19.2)(typescript@5.7.2)(vite@6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0)
'@types/ws': '@types/ws':
specifier: ^8.5.13 specifier: ^8.5.13
version: 8.5.13 version: 8.5.13
@ -152,6 +155,9 @@ importers:
react-router-dom: react-router-dom:
specifier: ^7.1.1 specifier: ^7.1.1
version: 7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0) version: 7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-scan:
specifier: ^0.1.0
version: 0.1.0(react-dom@19.0.0(react@19.0.0))(react-router-dom@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(rollup@4.29.1)
tailwindcss: tailwindcss:
specifier: ^3.4.17 specifier: ^3.4.17
version: 3.4.17 version: 3.4.17
@ -163,13 +169,13 @@ importers:
version: 5.7.2 version: 5.7.2
vite: vite:
specifier: ^6.0.6 specifier: ^6.0.6
version: 6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) version: 6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
vite-plugin-babel: vite-plugin-babel:
specifier: ^1.3.0 specifier: ^1.3.0
version: 1.3.0(@babel/core@7.26.0)(vite@6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) version: 1.3.0(@babel/core@7.26.0)(vite@6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
vite-tsconfig-paths: vite-tsconfig-paths:
specifier: ^5.1.4 specifier: ^5.1.4
version: 5.1.4(typescript@5.7.2)(vite@6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)) version: 5.1.4(typescript@5.7.2)(vite@6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))
packages: packages:
@ -369,6 +375,12 @@ packages:
cpu: [x64] cpu: [x64]
os: [win32] os: [win32]
'@clack/core@0.3.5':
resolution: {integrity: sha512-5cfhQNH+1VQ2xLQlmzXMqUoiaH0lRBq9/CLW9lTyMbuKLC3+xEK01tHVvyut++mLOn5urSHmkm6I0Lg9MaJSTQ==}
'@clack/prompts@0.8.2':
resolution: {integrity: sha512-6b9Ab2UiZwJYA9iMyboYyW9yJvAO9V753ZhS+DHKEjZRKAxPPOb7MXXu84lsPFG+vZt6FRFniZ8rXi+zCIw4yQ==}
'@codemirror/autocomplete@6.18.2': '@codemirror/autocomplete@6.18.2':
resolution: {integrity: sha512-wJGylKtMFR/Ds6Gh01+OovXE/pncPiKZNNBKuC39pKnH+XK5d9+WsNqcrdxPjFPFTigRBqse0rfxw9UxrfyhPg==} resolution: {integrity: sha512-wJGylKtMFR/Ds6Gh01+OovXE/pncPiKZNNBKuC39pKnH+XK5d9+WsNqcrdxPjFPFTigRBqse0rfxw9UxrfyhPg==}
peerDependencies: peerDependencies:
@ -850,6 +862,14 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'} engines: {node: '>=14'}
'@preact/signals-core@1.8.0':
resolution: {integrity: sha512-OBvUsRZqNmjzCZXWLxkZfhcgT+Fk8DDcT/8vD6a1xhDemodyy87UJRJfASMuSD8FaAIeGgGm85ydXhm7lr4fyA==}
'@preact/signals@1.3.2':
resolution: {integrity: sha512-naxcJgUJ6BTOROJ7C3QML7KvwKwCXQJYTc5L/b0eEsdYgPB6SxwoQ1vDGcS0Q7GVjAenVq/tXrybVdFShHYZWg==}
peerDependencies:
preact: 10.x
'@primer/octicons-react@19.14.0': '@primer/octicons-react@19.14.0':
resolution: {integrity: sha512-EKeavGV7s2HYac3ybb+6vfyqHGMUeG+OlZAus5ORfEjzXlorDAIjZ59fszVJj9DI6ArfFK/Cvg8V4JRfeUHjcw==} resolution: {integrity: sha512-EKeavGV7s2HYac3ybb+6vfyqHGMUeG+OlZAus5ORfEjzXlorDAIjZ59fszVJj9DI6ArfFK/Cvg8V4JRfeUHjcw==}
engines: {node: '>=8'} engines: {node: '>=8'}
@ -1490,6 +1510,15 @@ packages:
peerDependencies: peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1 react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
'@rollup/pluginutils@5.1.4':
resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
engines: {node: '>=14.0.0'}
peerDependencies:
rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
peerDependenciesMeta:
rollup:
optional: true
'@rollup/rollup-android-arm-eabi@4.29.1': '@rollup/rollup-android-arm-eabi@4.29.1':
resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==} resolution: {integrity: sha512-ssKhA8RNltTZLpG6/QNkCSge+7mBQGUqJRisZ2MDQcEGaK93QESEgWK2iOpIDZ7k9zPVkG5AS3ksvD5ZWxmItw==}
cpu: [arm] cpu: [arm]
@ -1597,9 +1626,15 @@ packages:
'@types/estree@1.0.6': '@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
'@types/node@20.17.16':
resolution: {integrity: sha512-vOTpLduLkZXePLxHiHsBLp98mHGnl8RptV4YAO3HfKO5UHjDvySGbxKtpYfy8Sx5+WKcgc45qNreJJRVM3L6mw==}
'@types/node@22.10.1': '@types/node@22.10.1':
resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==} resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==}
'@types/node@22.10.7':
resolution: {integrity: sha512-V09KvXxFiutGp6B7XkpaDXlNadZxrzajcY50EuoLIpQ6WWYCSvf19lVIazzfIzQvhUN2HjX12spLojTnhuKlGg==}
'@types/react-dom@19.0.2': '@types/react-dom@19.0.2':
resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==} resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==}
peerDependencies: peerDependencies:
@ -1643,6 +1678,11 @@ packages:
react: '>=16.8.0' react: '>=16.8.0'
react-dom: '>=16.8.0' react-dom: '>=16.8.0'
acorn@8.14.0:
resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==}
engines: {node: '>=0.4.0'}
hasBin: true
ajv@6.12.6: ajv@6.12.6:
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
@ -1714,6 +1754,9 @@ packages:
resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
engines: {node: '>=8'} engines: {node: '>=8'}
bippy@0.2.7:
resolution: {integrity: sha512-LTCos3SmOJHrag0qF91tLUZMMw6wA+i15ESRBp71pvfNlTMYcxYoJHJ/pvFhd+29Wm5vfgVxBHV7kP5OKUUipg==}
brace-expansion@2.0.1: brace-expansion@2.0.1:
resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
@ -1894,6 +1937,12 @@ packages:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'} engines: {node: '>=6'}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
exit-hook@2.2.1: exit-hook@2.2.1:
resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==}
engines: {node: '>=6'} engines: {node: '>=6'}
@ -1940,6 +1989,11 @@ packages:
resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==}
engines: {node: '>=12'} engines: {node: '>=12'}
fsevents@2.3.2:
resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
fsevents@2.3.3: fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@ -1952,8 +2006,8 @@ packages:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'} engines: {node: '>=6.9.0'}
get-tsconfig@4.8.1: get-tsconfig@4.9.0:
resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} resolution: {integrity: sha512-52n24W52sIueosRe0XZ8Ex5Yle+WbhfCKnV/gWXpbVR8FXNTfqdKEKUSypKso66VRHTvvcQxL44UTZbJRlCTnw==}
getpass@0.1.7: getpass@0.1.7:
resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==} resolution: {integrity: sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==}
@ -2126,6 +2180,10 @@ packages:
resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==} resolution: {integrity: sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==}
engines: {node: '>=0.6.0'} engines: {node: '>=0.6.0'}
kleur@4.1.5:
resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==}
engines: {node: '>=6'}
lefthook-darwin-arm64@1.10.9: lefthook-darwin-arm64@1.10.9:
resolution: {integrity: sha512-2ceuIUkwTcTncaYH/Y2bw2m3kuNkd+vqaJXQuSh0DAa0TRS9HmEQEV0CtLUlTp5tLg6PPHdTHnu2AhKAjfHhyw==} resolution: {integrity: sha512-2ceuIUkwTcTncaYH/Y2bw2m3kuNkd+vqaJXQuSh0DAa0TRS9HmEQEV0CtLUlTp5tLg6PPHdTHnu2AhKAjfHhyw==}
cpu: [arm64] cpu: [arm64]
@ -2247,6 +2305,10 @@ packages:
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
ms@2.1.3: ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@ -2345,6 +2407,10 @@ packages:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'} engines: {node: '>=8.6'}
picomatch@4.0.2:
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
engines: {node: '>=12'}
pify@2.3.0: pify@2.3.0:
resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -2353,6 +2419,16 @@ packages:
resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
engines: {node: '>= 6'} engines: {node: '>= 6'}
playwright-core@1.50.0:
resolution: {integrity: sha512-CXkSSlr4JaZs2tZHI40DsZUN/NIwgaUPsyLuOAaIZp2CyF2sN5MM5NJsyB188lFSSozFxQ5fPT4qM+f0tH/6wQ==}
engines: {node: '>=18'}
hasBin: true
playwright@1.50.0:
resolution: {integrity: sha512-+GinGfGTrd2IfX1TA4N2gNmeIksSb+IAe589ZH+FlmpV3MYTx6+buChGIuDLQwrGNCw2lWibqV50fU510N7S+w==}
engines: {node: '>=18'}
hasBin: true
postcss-import@15.1.0: postcss-import@15.1.0:
resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==}
engines: {node: '>=14.0.0'} engines: {node: '>=14.0.0'}
@ -2394,6 +2470,9 @@ packages:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14} engines: {node: ^10 || ^12 || >=14}
preact@10.25.4:
resolution: {integrity: sha512-jLdZDb+Q+odkHJ+MpW/9U5cODzqnB+fy2EiHSZES7ldV5LK7yjlVzTp7R8Xy6W6y75kfK8iWYtFVH7lvjwrCMA==}
prettier@2.8.8: prettier@2.8.8:
resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==}
engines: {node: '>=10.13.0'} engines: {node: '>=10.13.0'}
@ -2492,6 +2571,26 @@ packages:
react-dom: react-dom:
optional: true optional: true
react-scan@0.1.0:
resolution: {integrity: sha512-J40gyP7HgOJqrRqzoZrvZxwLLAE1EC1jn2flZqZi5OH0IX3x9KNnEmbiDxpCsXPzGPd5JWreU1cxXZtnmzANgQ==}
hasBin: true
peerDependencies:
'@remix-run/react': '>=1.0.0'
next: '>=13.0.0'
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-router: ^5.0.0 || ^6.0.0 || ^7.0.0
react-router-dom: ^5.0.0 || ^6.0.0 || ^7.0.0
peerDependenciesMeta:
'@remix-run/react':
optional: true
next:
optional: true
react-router:
optional: true
react-router-dom:
optional: true
react-stately@3.35.0: react-stately@3.35.0:
resolution: {integrity: sha512-1BH21J/TOHpyZe7c+f1BU2bnRWaBDTjLH0WdBuzNfPOXu7RBG3ebPIRvqd7UkPaVfIcol2QJnxe8S0a314JWKA==} resolution: {integrity: sha512-1BH21J/TOHpyZe7c+f1BU2bnRWaBDTjLH0WdBuzNfPOXu7RBG3ebPIRvqd7UkPaVfIcol2QJnxe8S0a314JWKA==}
peerDependencies: peerDependencies:
@ -2566,8 +2665,8 @@ packages:
resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
engines: {iojs: '>=1.0.0', node: '>=0.10.0'} engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
rfc4648@1.5.3: rfc4648@1.5.4:
resolution: {integrity: sha512-MjOWxM065+WswwnmNONOT+bD1nXzY9Km6u3kzvnx8F8/HXGZdz3T6e6vZJ8Q/RIMUSp/nxqjH3GwvJDy8ijeQQ==} resolution: {integrity: sha512-rRg/6Lb+IGfJqO05HZkN50UtY7K/JhxJag1kP23+zyMfrvoB0B7RWv06MbOzoc79RgCdNTiUaNsTT1AJZ7Z+cg==}
rimraf@5.0.10: rimraf@5.0.10:
resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==}
@ -2584,9 +2683,6 @@ packages:
safe-buffer@5.1.2: safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
safer-buffer@2.1.2: safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@ -2617,6 +2713,9 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'} engines: {node: '>=14'}
sisteransi@1.0.5:
resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
source-map-js@1.2.1: source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'} engines: {node: '>=0.10.0'}
@ -2768,6 +2867,9 @@ packages:
engines: {node: '>=14.17'} engines: {node: '>=14.17'}
hasBin: true hasBin: true
undici-types@6.19.8:
resolution: {integrity: sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==}
undici-types@6.20.0: undici-types@6.20.0:
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==} resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
@ -2783,6 +2885,10 @@ packages:
resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==}
engines: {node: '>= 10.0.0'} engines: {node: '>= 10.0.0'}
unplugin@2.1.0:
resolution: {integrity: sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==}
engines: {node: '>=18.12.0'}
update-browserslist-db@1.1.1: update-browserslist-db@1.1.1:
resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==} resolution: {integrity: sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==}
hasBin: true hasBin: true
@ -2897,6 +3003,9 @@ packages:
w3c-keyname@2.2.8: w3c-keyname@2.2.8:
resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==}
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
which@2.0.2: which@2.0.2:
resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
@ -3186,6 +3295,17 @@ snapshots:
'@biomejs/cli-win32-x64@1.9.4': '@biomejs/cli-win32-x64@1.9.4':
optional: true optional: true
'@clack/core@0.3.5':
dependencies:
picocolors: 1.1.1
sisteransi: 1.0.5
'@clack/prompts@0.8.2':
dependencies:
'@clack/core': 0.3.5
picocolors: 1.1.1
sisteransi: 1.0.5
'@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.1)(@lezer/common@1.2.3)': '@codemirror/autocomplete@6.18.2(@codemirror/language@6.10.8)(@codemirror/state@6.5.0)(@codemirror/view@6.36.1)(@lezer/common@1.2.3)':
dependencies: dependencies:
'@codemirror/language': 6.10.8 '@codemirror/language': 6.10.8
@ -3533,7 +3653,7 @@ snapshots:
js-yaml: 4.1.0 js-yaml: 4.1.0
jsonpath-plus: 10.2.0 jsonpath-plus: 10.2.0
request: 2.88.2 request: 2.88.2
rfc4648: 1.5.3 rfc4648: 1.5.4
stream-buffers: 3.0.3 stream-buffers: 3.0.3
tar: 7.4.3 tar: 7.4.3
tslib: 2.8.1 tslib: 2.8.1
@ -3602,6 +3722,13 @@ snapshots:
'@pkgjs/parseargs@0.11.0': '@pkgjs/parseargs@0.11.0':
optional: true optional: true
'@preact/signals-core@1.8.0': {}
'@preact/signals@1.3.2(preact@10.25.4)':
dependencies:
'@preact/signals-core': 1.8.0
preact: 10.25.4
'@primer/octicons-react@19.14.0(react@19.0.0)': '@primer/octicons-react@19.14.0(react@19.0.0)':
dependencies: dependencies:
react: 19.0.0 react: 19.0.0
@ -4267,7 +4394,7 @@ snapshots:
react: 19.0.0 react: 19.0.0
react-dom: 19.0.0(react@19.0.0) react-dom: 19.0.0(react@19.0.0)
'@react-router/dev@7.1.1(@types/node@22.10.1)(jiti@1.21.7)(react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(tsx@4.19.2)(typescript@5.7.2)(vite@6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0)': '@react-router/dev@7.1.1(@types/node@22.10.7)(jiti@1.21.7)(react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(tsx@4.19.2)(typescript@5.7.2)(vite@6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0))(yaml@2.7.0)':
dependencies: dependencies:
'@babel/core': 7.26.0 '@babel/core': 7.26.0
'@babel/generator': 7.26.3 '@babel/generator': 7.26.3
@ -4298,8 +4425,8 @@ snapshots:
semver: 7.6.3 semver: 7.6.3
set-cookie-parser: 2.7.1 set-cookie-parser: 2.7.1
valibot: 0.41.0(typescript@5.7.2) valibot: 0.41.0(typescript@5.7.2)
vite: 6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) vite: 6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
vite-node: 3.0.0-beta.2(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) vite-node: 3.0.0-beta.2(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
optionalDependencies: optionalDependencies:
typescript: 5.7.2 typescript: 5.7.2
transitivePeerDependencies: transitivePeerDependencies:
@ -4748,6 +4875,14 @@ snapshots:
'@react-types/shared': 3.27.0(react@19.0.0) '@react-types/shared': 3.27.0(react@19.0.0)
react: 19.0.0 react: 19.0.0
'@rollup/pluginutils@5.1.4(rollup@4.29.1)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
rollup: 4.29.1
'@rollup/rollup-android-arm-eabi@4.29.1': '@rollup/rollup-android-arm-eabi@4.29.1':
optional: true optional: true
@ -4818,10 +4953,19 @@ snapshots:
'@types/estree@1.0.6': {} '@types/estree@1.0.6': {}
'@types/node@20.17.16':
dependencies:
undici-types: 6.19.8
'@types/node@22.10.1': '@types/node@22.10.1':
dependencies: dependencies:
undici-types: 6.20.0 undici-types: 6.20.0
'@types/node@22.10.7':
dependencies:
undici-types: 6.20.0
optional: true
'@types/react-dom@19.0.2(@types/react@19.0.2)': '@types/react-dom@19.0.2(@types/react@19.0.2)':
dependencies: dependencies:
'@types/react': 19.0.2 '@types/react': 19.0.2
@ -4875,6 +5019,9 @@ snapshots:
- '@codemirror/lint' - '@codemirror/lint'
- '@codemirror/search' - '@codemirror/search'
acorn@8.14.0:
optional: true
ajv@6.12.6: ajv@6.12.6:
dependencies: dependencies:
fast-deep-equal: 3.1.3 fast-deep-equal: 3.1.3
@ -4946,6 +5093,8 @@ snapshots:
binary-extensions@2.3.0: {} binary-extensions@2.3.0: {}
bippy@0.2.7: {}
brace-expansion@2.0.1: brace-expansion@2.0.1:
dependencies: dependencies:
balanced-match: 1.0.2 balanced-match: 1.0.2
@ -5117,7 +5266,6 @@ snapshots:
'@esbuild/win32-arm64': 0.23.1 '@esbuild/win32-arm64': 0.23.1
'@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-ia32': 0.23.1
'@esbuild/win32-x64': 0.23.1 '@esbuild/win32-x64': 0.23.1
optional: true
esbuild@0.24.2: esbuild@0.24.2:
optionalDependencies: optionalDependencies:
@ -5149,6 +5297,12 @@ snapshots:
escalade@3.2.0: {} escalade@3.2.0: {}
estree-walker@2.0.2: {}
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.6
exit-hook@2.2.1: {} exit-hook@2.2.1: {}
extend@3.0.2: {} extend@3.0.2: {}
@ -5196,6 +5350,9 @@ snapshots:
jsonfile: 6.1.0 jsonfile: 6.1.0
universalify: 2.0.1 universalify: 2.0.1
fsevents@2.3.2:
optional: true
fsevents@2.3.3: fsevents@2.3.3:
optional: true optional: true
@ -5203,10 +5360,9 @@ snapshots:
gensync@1.0.0-beta.2: {} gensync@1.0.0-beta.2: {}
get-tsconfig@4.8.1: get-tsconfig@4.9.0:
dependencies: dependencies:
resolve-pkg-maps: 1.0.0 resolve-pkg-maps: 1.0.0
optional: true
getpass@0.1.7: getpass@0.1.7:
dependencies: dependencies:
@ -5365,6 +5521,8 @@ snapshots:
json-schema: 0.4.0 json-schema: 0.4.0
verror: 1.10.0 verror: 1.10.0
kleur@4.1.5: {}
lefthook-darwin-arm64@1.10.9: lefthook-darwin-arm64@1.10.9:
optional: true optional: true
@ -5456,6 +5614,8 @@ snapshots:
mkdirp@3.0.1: {} mkdirp@3.0.1: {}
mri@1.2.0: {}
ms@2.1.3: {} ms@2.1.3: {}
mz@2.7.0: mz@2.7.0:
@ -5545,10 +5705,20 @@ snapshots:
picomatch@2.3.1: {} picomatch@2.3.1: {}
picomatch@4.0.2: {}
pify@2.3.0: {} pify@2.3.0: {}
pirates@4.0.6: {} pirates@4.0.6: {}
playwright-core@1.50.0: {}
playwright@1.50.0:
dependencies:
playwright-core: 1.50.0
optionalDependencies:
fsevents: 2.3.2
postcss-import@15.1.0(postcss@8.4.49): postcss-import@15.1.0(postcss@8.4.49):
dependencies: dependencies:
postcss: 8.4.49 postcss: 8.4.49
@ -5586,6 +5756,8 @@ snapshots:
picocolors: 1.1.1 picocolors: 1.1.1
source-map-js: 1.2.1 source-map-js: 1.2.1
preact@10.25.4: {}
prettier@2.8.8: {} prettier@2.8.8: {}
proc-log@3.0.0: {} proc-log@3.0.0: {}
@ -5748,6 +5920,34 @@ snapshots:
optionalDependencies: optionalDependencies:
react-dom: 19.0.0(react@19.0.0) react-dom: 19.0.0(react@19.0.0)
react-scan@0.1.0(react-dom@19.0.0(react@19.0.0))(react-router-dom@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react-router@7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0))(react@19.0.0)(rollup@4.29.1):
dependencies:
'@babel/core': 7.26.0
'@babel/generator': 7.26.3
'@babel/types': 7.26.3
'@clack/core': 0.3.5
'@clack/prompts': 0.8.2
'@preact/signals': 1.3.2(preact@10.25.4)
'@rollup/pluginutils': 5.1.4(rollup@4.29.1)
'@types/node': 20.17.16
bippy: 0.2.7
esbuild: 0.24.2
estree-walker: 3.0.3
kleur: 4.1.5
mri: 1.2.0
playwright: 1.50.0
preact: 10.25.4
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
tsx: 4.19.2
optionalDependencies:
react-router: 7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-router-dom: 7.1.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
unplugin: 2.1.0
transitivePeerDependencies:
- rollup
- supports-color
react-stately@3.35.0(react@19.0.0): react-stately@3.35.0(react@19.0.0):
dependencies: dependencies:
'@react-stately/calendar': 3.7.0(react@19.0.0) '@react-stately/calendar': 3.7.0(react@19.0.0)
@ -5827,13 +6027,12 @@ snapshots:
oauth-sign: 0.9.0 oauth-sign: 0.9.0
performance-now: 2.1.0 performance-now: 2.1.0
qs: 6.5.3 qs: 6.5.3
safe-buffer: 5.2.1 safe-buffer: 5.1.2
tough-cookie: 2.5.0 tough-cookie: 2.5.0
tunnel-agent: 0.6.0 tunnel-agent: 0.6.0
uuid: 3.4.0 uuid: 3.4.0
resolve-pkg-maps@1.0.0: resolve-pkg-maps@1.0.0: {}
optional: true
resolve@1.22.10: resolve@1.22.10:
dependencies: dependencies:
@ -5845,7 +6044,7 @@ snapshots:
reusify@1.0.4: {} reusify@1.0.4: {}
rfc4648@1.5.3: {} rfc4648@1.5.4: {}
rimraf@5.0.10: rimraf@5.0.10:
dependencies: dependencies:
@ -5882,8 +6081,6 @@ snapshots:
safe-buffer@5.1.2: {} safe-buffer@5.1.2: {}
safe-buffer@5.2.1: {}
safer-buffer@2.1.2: {} safer-buffer@2.1.2: {}
scheduler@0.25.0: {} scheduler@0.25.0: {}
@ -5902,6 +6099,8 @@ snapshots:
signal-exit@4.1.0: {} signal-exit@4.1.0: {}
sisteransi@1.0.5: {}
source-map-js@1.2.1: {} source-map-js@1.2.1: {}
source-map-support@0.5.21: source-map-support@0.5.21:
@ -6062,14 +6261,13 @@ snapshots:
tsx@4.19.2: tsx@4.19.2:
dependencies: dependencies:
esbuild: 0.23.1 esbuild: 0.23.1
get-tsconfig: 4.8.1 get-tsconfig: 4.9.0
optionalDependencies: optionalDependencies:
fsevents: 2.3.3 fsevents: 2.3.3
optional: true
tunnel-agent@0.6.0: tunnel-agent@0.6.0:
dependencies: dependencies:
safe-buffer: 5.2.1 safe-buffer: 5.1.2
turbo-stream@2.4.0: {} turbo-stream@2.4.0: {}
@ -6079,6 +6277,8 @@ snapshots:
typescript@5.7.2: {} typescript@5.7.2: {}
undici-types@6.19.8: {}
undici-types@6.20.0: {} undici-types@6.20.0: {}
undici@6.21.0: {} undici@6.21.0: {}
@ -6087,6 +6287,12 @@ snapshots:
universalify@2.0.1: {} universalify@2.0.1: {}
unplugin@2.1.0:
dependencies:
acorn: 8.14.0
webpack-virtual-modules: 0.6.2
optional: true
update-browserslist-db@1.1.1(browserslist@4.24.2): update-browserslist-db@1.1.1(browserslist@4.24.2):
dependencies: dependencies:
browserslist: 4.24.2 browserslist: 4.24.2
@ -6127,13 +6333,13 @@ snapshots:
core-util-is: 1.0.2 core-util-is: 1.0.2
extsprintf: 1.3.0 extsprintf: 1.3.0
vite-node@3.0.0-beta.2(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0): vite-node@3.0.0-beta.2(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
dependencies: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.4.0 debug: 4.4.0
es-module-lexer: 1.5.4 es-module-lexer: 1.5.4
pathe: 1.1.2 pathe: 1.1.2
vite: 6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) vite: 6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- jiti - jiti
@ -6148,13 +6354,13 @@ snapshots:
- tsx - tsx
- yaml - yaml
vite-node@3.0.1(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0): vite-node@3.0.1(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
dependencies: dependencies:
cac: 6.7.14 cac: 6.7.14
debug: 4.4.0 debug: 4.4.0
es-module-lexer: 1.6.0 es-module-lexer: 1.6.0
pathe: 2.0.1 pathe: 2.0.1
vite: 6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) vite: 6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
transitivePeerDependencies: transitivePeerDependencies:
- '@types/node' - '@types/node'
- jiti - jiti
@ -6169,29 +6375,29 @@ snapshots:
- tsx - tsx
- yaml - yaml
vite-plugin-babel@1.3.0(@babel/core@7.26.0)(vite@6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)): vite-plugin-babel@1.3.0(@babel/core@7.26.0)(vite@6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)):
dependencies: dependencies:
'@babel/core': 7.26.0 '@babel/core': 7.26.0
vite: 6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) vite: 6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)): vite-tsconfig-paths@5.1.4(typescript@5.7.2)(vite@6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)):
dependencies: dependencies:
debug: 4.4.0 debug: 4.4.0
globrex: 0.1.2 globrex: 0.1.2
tsconfck: 3.1.4(typescript@5.7.2) tsconfck: 3.1.4(typescript@5.7.2)
optionalDependencies: optionalDependencies:
vite: 6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0) vite: 6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0)
transitivePeerDependencies: transitivePeerDependencies:
- supports-color - supports-color
- typescript - typescript
vite@6.0.6(@types/node@22.10.1)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0): vite@6.0.6(@types/node@22.10.7)(jiti@1.21.7)(tsx@4.19.2)(yaml@2.7.0):
dependencies: dependencies:
esbuild: 0.24.2 esbuild: 0.24.2
postcss: 8.4.49 postcss: 8.4.49
rollup: 4.29.1 rollup: 4.29.1
optionalDependencies: optionalDependencies:
'@types/node': 22.10.1 '@types/node': 22.10.7
fsevents: 2.3.3 fsevents: 2.3.3
jiti: 1.21.7 jiti: 1.21.7
tsx: 4.19.2 tsx: 4.19.2
@ -6199,6 +6405,9 @@ snapshots:
w3c-keyname@2.2.8: {} w3c-keyname@2.2.8: {}
webpack-virtual-modules@0.6.2:
optional: true
which@2.0.2: which@2.0.2:
dependencies: dependencies:
isexe: 2.0.0 isexe: 2.0.0