diff --git a/docs/framework/react/guides/devtools.md b/docs/framework/react/guides/devtools.md new file mode 100644 index 000000000..de0aa319e --- /dev/null +++ b/docs/framework/react/guides/devtools.md @@ -0,0 +1,58 @@ +--- +id: devtools +title: Devtools +--- + +TanStack Form comes with a ready to go suit of devtools. + +## Setup + +Install the [TanStack Devtools](https://tanstack.com/devtools/) library, this will install the devtools core as well as provide you framework specific adapters. + +```bash +npm i @tanstack/devtools +``` + +Next in the root of your application import the `TanstackDevtools` from the required framework adapter (in this case @tanstack/react-devtools). + +```tsx +import { TanstackDevtools } from '@tanstack/react-devtools' + +import App from './App' + +createRoot(document.getElementById('root')!).render( + + + + + , +) +``` + +Import the `FormDevtools` form **TanStack Form** and provide it to the `TanstackDevtools` component along with a label for the menu. + +```tsx +import { FormDevtools } from '@tanstack/react-form' +import { TanstackDevtools } from '@tanstack/react-devtools' + +import App from './App' + +createRoot(document.getElementById('root')!).render( + + + + , + }, + ]} + /> + , +) +``` + +Finally add any additional configuration you desire to the `TanstackDevtools` component, more information can be found under the [TanStack Devtools Configuration](https://tanstack.com/devtools/) section. + +A complete working example can be found in our [examples section](https://tanstack.com/form/latest/docs/framework/react/examples/devtools). diff --git a/examples/react/devtools/.eslintrc.cjs b/examples/react/devtools/.eslintrc.cjs new file mode 100644 index 000000000..35853b617 --- /dev/null +++ b/examples/react/devtools/.eslintrc.cjs @@ -0,0 +1,11 @@ +// @ts-check + +/** @type {import('eslint').Linter.Config} */ +const config = { + extends: ['plugin:react/recommended', 'plugin:react-hooks/recommended'], + rules: { + 'react/no-children-prop': 'off', + }, +} + +module.exports = config diff --git a/examples/react/devtools/.gitignore b/examples/react/devtools/.gitignore new file mode 100644 index 000000000..4673b022e --- /dev/null +++ b/examples/react/devtools/.gitignore @@ -0,0 +1,27 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# production +/build + +pnpm-lock.yaml +yarn.lock +package-lock.json + +# misc +.DS_Store +.env.local +.env.development.local +.env.test.local +.env.production.local + +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/examples/react/devtools/README.md b/examples/react/devtools/README.md new file mode 100644 index 000000000..1cf889265 --- /dev/null +++ b/examples/react/devtools/README.md @@ -0,0 +1,6 @@ +# Example + +To run this example: + +- `npm install` +- `npm run dev` diff --git a/examples/react/devtools/index.html b/examples/react/devtools/index.html new file mode 100644 index 000000000..5d0e76cd4 --- /dev/null +++ b/examples/react/devtools/index.html @@ -0,0 +1,16 @@ + + + + + + + + + TanStack Form React Simple Example App + + + +
+ + + diff --git a/examples/react/devtools/package.json b/examples/react/devtools/package.json new file mode 100644 index 000000000..9e4117024 --- /dev/null +++ b/examples/react/devtools/package.json @@ -0,0 +1,36 @@ +{ + "name": "@tanstack/form-example-react-devtools", + "private": true, + "type": "module", + "scripts": { + "dev": "vite --port=3001", + "build": "vite build", + "preview": "vite preview", + "test:types": "tsc" + }, + "dependencies": { + "@tanstack/react-devtools": "0.4.3", + "@tanstack/react-form": "^1.17.0", + "@tanstack/react-form-devtools": "workspace:*", + "react": "^19.0.0", + "react-dom": "^19.0.0" + }, + "devDependencies": { + "@types/react": "^19.0.7", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.5.2", + "vite": "^7.0.6" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + } +} diff --git a/examples/react/devtools/public/emblem-light.svg b/examples/react/devtools/public/emblem-light.svg new file mode 100644 index 000000000..a58e69ad5 --- /dev/null +++ b/examples/react/devtools/public/emblem-light.svg @@ -0,0 +1,13 @@ + + + + emblem-light + Created with Sketch. + + + + + + + + \ No newline at end of file diff --git a/examples/react/devtools/src/App.tsx b/examples/react/devtools/src/App.tsx new file mode 100644 index 000000000..c786ca49f --- /dev/null +++ b/examples/react/devtools/src/App.tsx @@ -0,0 +1,160 @@ +import { useForm } from '@tanstack/react-form' +import * as React from 'react' +import { createRoot } from 'react-dom/client' +import type { AnyFieldApi } from '@tanstack/react-form' + +function FieldInfo({ field }: { field: AnyFieldApi }) { + return ( + <> + {field.state.meta.isTouched && !field.state.meta.isValid ? ( + {field.state.meta.errors.join(',')} + ) : null} + {field.state.meta.isValidating ? 'Validating...' : null} + + ) +} + +export default function App() { + const form = useForm({ + defaultValues: { + firstName: '', + lastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value) + }, + }) + + const form2 = useForm({ + formId: 'hello', + defaultValues: { + secondFirstName: '', + secondLastName: '', + }, + onSubmit: async ({ value }) => { + // Do something with form data + console.log(value) + }, + }) + + return ( +
+

Form Devtools Example

+
{ + e.preventDefault() + e.stopPropagation() + form.handleSubmit() + }} + > +
+ {/* A type-safe field component*/} + + !value + ? 'A first name is required' + : value.length < 3 + ? 'First name must be at least 3 characters' + : undefined, + }} + children={(field) => { + return ( + <> + + field.handleChange(e.target.value)} + /> + + + ) + }} + /> +
+ +
+ ( + <> + + field.handleChange(e.target.value)} + /> + + + )} + /> +
+ [state.canSubmit, state.isSubmitting]} + children={([canSubmit, isSubmitting]) => ( + <> + + + + )} + /> + + +

Form Devtools Example 2

+
+ {/* A type-safe field component*/} + + !value + ? 'A first name is required' + : value.length < 3 + ? 'First name must be at least 3 characters' + : undefined, + }} + children={(field) => { + return ( + <> + + field.handleChange(e.target.value)} + /> + + + ) + }} + /> +
+
+ ) +} + +const rootElement = document.getElementById('root')! + +createRoot(rootElement).render( + + + , +) diff --git a/examples/react/devtools/src/index.tsx b/examples/react/devtools/src/index.tsx new file mode 100644 index 000000000..4e4ab44cc --- /dev/null +++ b/examples/react/devtools/src/index.tsx @@ -0,0 +1,24 @@ +import { StrictMode } from 'react' +import { createRoot } from 'react-dom/client' + +import { FormDevtools } from '@tanstack/react-form-devtools' +import { TanStackDevtools } from '@tanstack/react-devtools' + +import App from './App' + +createRoot(document.getElementById('root')!).render( + + + + , + }, + ]} + /> + , +) diff --git a/examples/react/devtools/tsconfig.json b/examples/react/devtools/tsconfig.json new file mode 100644 index 000000000..22b43163b --- /dev/null +++ b/examples/react/devtools/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compilerOptions": { + "target": "ESNext", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "Bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"] +} diff --git a/packages/form-core/package.json b/packages/form-core/package.json index 547e4c63b..2a37c881b 100644 --- a/packages/form-core/package.json +++ b/packages/form-core/package.json @@ -51,6 +51,7 @@ "src" ], "dependencies": { + "@tanstack/devtools-event-client": "^0.2.2", "@tanstack/store": "^0.7.2" }, "devDependencies": { diff --git a/packages/form-core/src/EventClient.ts b/packages/form-core/src/EventClient.ts new file mode 100644 index 000000000..af1c26d15 --- /dev/null +++ b/packages/form-core/src/EventClient.ts @@ -0,0 +1,20 @@ +import { EventClient } from '@tanstack/devtools-event-client' + +import type { AnyFormState } from './FormApi' + +type EventMap = { + 'form-devtools:broadcast-form-state': { id: string; state: AnyFormState } + 'form-devtools:request-form-state': { id: string } + 'form-devtools:broadcast-form-unmounted': { id: string } +} + +class FormEventClient extends EventClient { + constructor() { + super({ + // debug: true, + pluginId: 'form-devtools', + }) + } +} + +export const formEventClient = new FormEventClient() diff --git a/packages/form-core/src/FormApi.ts b/packages/form-core/src/FormApi.ts index 0c62c5cd6..f91ca8ff2 100644 --- a/packages/form-core/src/FormApi.ts +++ b/packages/form-core/src/FormApi.ts @@ -18,6 +18,7 @@ import { standardSchemaValidators, } from './standardSchemaValidator' import { defaultFieldMeta, metaHelper } from './metaHelper' +import { formEventClient } from './EventClient' import type { ValidationLogicFn } from './ValidationLogic' import type { StandardSchemaV1, @@ -930,6 +931,11 @@ export class FormApi< */ prevTransformArray: unknown[] = [] + /** + * @private + */ + private _formId: string + /** * Constructs a new `FormApi` instance with the given form options. */ @@ -949,6 +955,8 @@ export class FormApi< TSubmitMeta >, ) { + this._formId = opts?.formId ?? crypto.randomUUID() + this.baseStore = new Store( getDefaultFormState({ ...(opts?.defaultState as any), @@ -1240,10 +1248,30 @@ export class FormApi< this.handleSubmit = this.handleSubmit.bind(this) this.update(opts || {}) + + this.store.subscribe(() => { + formEventClient.emit('broadcast-form-state', { + id: this._formId, + state: this.store.state, + }) + }) + + formEventClient.on('request-form-state', (_e) => { + const e = _e as unknown as { + id: string + } + + if (e.id === this._formId) { + formEventClient.emit('broadcast-form-state', { + id: this._formId, + state: this.store.state, + }) + } + }) } - get formId(): string | undefined { - return this.options.formId + formId(): string | undefined { + return this._formId } /** diff --git a/packages/form-core/src/index.ts b/packages/form-core/src/index.ts index 3e884d62e..825eee5c6 100644 --- a/packages/form-core/src/index.ts +++ b/packages/form-core/src/index.ts @@ -8,3 +8,4 @@ export * from './formOptions' export * from './standardSchemaValidator' export * from './FieldGroupApi' export * from './ValidationLogic' +export * from './EventClient' diff --git a/packages/form-devtools/README.md b/packages/form-devtools/README.md new file mode 100644 index 000000000..5db77cbe6 --- /dev/null +++ b/packages/form-devtools/README.md @@ -0,0 +1,35 @@ + + +![TanStack Form Header](https://github.com/TanStack/form/raw/main/media/repo-header.png) + +Signals for managing form state in Solid + + + #TanStack + + + + + + + + + + semantic-release + + Join the discussion on Github +Best of JS + + + + + Gitpod Ready-to-Code + + +Enjoy this library? Try the entire [TanStack](https://tanstack.com)! [TanStack Table](https://github.com/TanStack/table), [TanStack Router](https://github.com/tanstack/router), [TanStack Virtual](https://github.com/tanstack/virtual), [React Charts](https://github.com/TanStack/react-charts), [React Ranger](https://github.com/TanStack/ranger) + +## Visit [tanstack.com/form](https://tanstack.com/form) for docs, guides, API and more! + +### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) + + diff --git a/packages/form-devtools/eslint.config.js b/packages/form-devtools/eslint.config.js new file mode 100644 index 000000000..8ce6ad05f --- /dev/null +++ b/packages/form-devtools/eslint.config.js @@ -0,0 +1,5 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +export default [...rootConfig] diff --git a/packages/form-devtools/package.json b/packages/form-devtools/package.json new file mode 100644 index 000000000..6fd5bbd7d --- /dev/null +++ b/packages/form-devtools/package.json @@ -0,0 +1,73 @@ +{ + "name": "@tanstack/form-devtools", + "version": "1.17.0", + "description": "Powerful, type-safe forms for Solid.", + "author": "tannerlinsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/form.git", + "directory": "packages/form-devtools" + }, + "homepage": "https://tanstack.com/form", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "scripts": { + "clean": "premove ./dist ./coverage", + "test:eslint": "eslint ./src ./tests", + "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js", + "test:types:ts58": "tsc", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict", + "build": "vite build && tsc -p tsconfig.build.json" + }, + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "solid": { + "types": "./dist/source/index.d.ts", + "default": "./dist/source/index.jsx" + }, + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "dependencies": { + "@tanstack/form-core": "workspace:*", + "@tanstack/devtools-ui": "^0.3.1", + "clsx": "^2.1.1", + "dayjs": "^1.11.13", + "@tanstack/solid-store": "^0.7.3", + "goober": "^2.1.16" + }, + "devDependencies": { + "solid-js": "^1.9.7", + "vite": "^7.0.6", + "vite-plugin-solid": "^2.11.6" + }, + "peerDependencies": { + "solid-js": "^1.6.0" + } +} diff --git a/packages/form-devtools/src/TanstackFormDevtoolsPanel.tsx b/packages/form-devtools/src/TanstackFormDevtoolsPanel.tsx new file mode 100644 index 000000000..af9c5f72a --- /dev/null +++ b/packages/form-devtools/src/TanstackFormDevtoolsPanel.tsx @@ -0,0 +1,33 @@ +import { render } from 'solid-js/web' +import { Devtools } from './components' + +export interface TanstackFormDevtoolsPanelConfig {} + +class TanstackFormDevtoolsPanel { + #isMounted = false + #dispose?: () => void + + // constructor(config: TanstackFormDevtoolsPanelConfig) {} + constructor() {} + + mount(el: T) { + if (this.#isMounted) { + throw new Error('Devtools is already mounted') + } + const dispose = render(() => { + return + }, el) + this.#isMounted = true + this.#dispose = dispose + } + + unmount() { + if (!this.#isMounted) { + throw new Error('Devtools is not mounted') + } + this.#dispose?.() + this.#isMounted = false + } +} + +export { TanstackFormDevtoolsPanel } diff --git a/packages/form-devtools/src/components/DetailsPanel.tsx b/packages/form-devtools/src/components/DetailsPanel.tsx new file mode 100644 index 000000000..2f44b3cb8 --- /dev/null +++ b/packages/form-devtools/src/components/DetailsPanel.tsx @@ -0,0 +1,59 @@ +import { JsonTree } from '@tanstack/devtools-ui' +import { useStyles } from '../styles/use-styles' + +type DetailsPanelProps = { + selectedInstance: () => { instance: any; type: string } | null + utilState: () => { lastUpdatedByKey: Record } +} + +export function DetailsPanel(props: DetailsPanelProps) { + const styles = useStyles() + + return ( +
+ {(() => { + const entry = props.selectedInstance() + if (!entry) { + return ( +
+ Select a util from the left panel to view its state +
+ ) + } + + return ( + <> + {/* */} + +
+
+
Actions
+ {/* */} +
+ +
+
State
+
+ +
+
+ +
+
Options
+
+ +
+
+
+ + ) + })()} +
+ ) +} diff --git a/packages/form-devtools/src/components/Shell.tsx b/packages/form-devtools/src/components/Shell.tsx new file mode 100644 index 000000000..47ba0b78b --- /dev/null +++ b/packages/form-devtools/src/components/Shell.tsx @@ -0,0 +1,100 @@ +import { createMemo, createSignal, onCleanup, onMount } from 'solid-js' +import { useStyles } from '../styles/use-styles' +import { useFormStateArray } from '../contexts/eventClientContext' +// import { UTIL_GROUPS } from './util-groups' +import { UtilList } from './UtilList' +import { DetailsPanel } from './DetailsPanel' + +export function Shell() { + const styles = useStyles() + const formArray = useFormStateArray() + const [selectedKey, setSelectedKey] = createSignal(null) + const [leftPanelWidth, setLeftPanelWidth] = createSignal(300) + const [isDragging, setIsDragging] = createSignal(false) + + const selectedInstance = createMemo(() => { + const key = selectedKey() + if (!key) return null + const instance = formArray().find((form) => form.id === key) + if (instance) { + return instance + } + + return null + }) + + let dragStartX = 0 + let dragStartWidth = 0 + + const handleMouseDown = (e: MouseEvent) => { + e.preventDefault() + e.stopPropagation() + setIsDragging(true) + document.body.style.cursor = 'col-resize' + document.body.style.userSelect = 'none' + dragStartX = e.clientX + dragStartWidth = leftPanelWidth() + } + + const handleMouseMove = (e: MouseEvent) => { + if (!isDragging()) return + + e.preventDefault() + const deltaX = e.clientX - dragStartX + const newWidth = Math.max(150, Math.min(800, dragStartWidth + deltaX)) + setLeftPanelWidth(newWidth) + } + + const handleMouseUp = () => { + setIsDragging(false) + document.body.style.cursor = '' + document.body.style.userSelect = '' + } + + onMount(() => { + document.addEventListener('mousemove', handleMouseMove) + document.addEventListener('mouseup', handleMouseUp) + }) + + onCleanup(() => { + document.removeEventListener('mousemove', handleMouseMove) + document.removeEventListener('mouseup', handleMouseUp) + }) + + return ( +
+
TanStack Form
+ +
+
+ +
+ +
+ +
+
Details
+ {/* */} +
{JSON.stringify(selectedInstance())}
+
+
+
+ ) +} diff --git a/packages/form-devtools/src/components/UtilList.tsx b/packages/form-devtools/src/components/UtilList.tsx new file mode 100644 index 000000000..78574f6bc --- /dev/null +++ b/packages/form-devtools/src/components/UtilList.tsx @@ -0,0 +1,39 @@ +import { For } from 'solid-js' +import clsx from 'clsx' +import { useStyles } from '../styles/use-styles' +import type { AnyFormState } from '@tanstack/form-core' + +type UtilListProps = { + selectedKey: () => string | null + setSelectedKey: (key: string | null) => void + utilState: () => Array<{ id: string; state: AnyFormState }> +} + +export function UtilList(props: UtilListProps) { + const styles = useStyles() + + return ( +
+ {props.utilState().length > 0 && ( +
+ + {(instance) => { + return ( +
props.setSelectedKey(instance.id)} + > +
{instance.id}
+
+ ) + }} +
+
+ )} +
+ ) +} diff --git a/packages/form-devtools/src/components/index.tsx b/packages/form-devtools/src/components/index.tsx new file mode 100644 index 000000000..ce268441f --- /dev/null +++ b/packages/form-devtools/src/components/index.tsx @@ -0,0 +1,11 @@ +import { FormEventClientProvider } from '../contexts/eventClientContext' + +import { Shell } from './Shell' + +export function Devtools() { + return ( + + + + ) +} diff --git a/packages/form-devtools/src/contexts/eventClientContext.tsx b/packages/form-devtools/src/contexts/eventClientContext.tsx new file mode 100644 index 000000000..c7dcb739a --- /dev/null +++ b/packages/form-devtools/src/contexts/eventClientContext.tsx @@ -0,0 +1,96 @@ +import { + createContext, + createEffect, + createSignal, + onCleanup, + useContext, +} from 'solid-js' +import { formEventClient } from '@tanstack/form-core' + +import type { ParentComponent } from 'solid-js' +import type { AnyFormState } from '@tanstack/form-core' + +const updateOrAddToArray = ( + oldArray: Array<{ id: string; state: AnyFormState }>, + newItem: { id: string; state: AnyFormState }, +): Array<{ id: string; state: AnyFormState }> => { + const index = oldArray.findIndex((item) => item.id === newItem.id) + if (index !== -1) { + // Update existing item + return oldArray.map((item, i) => (i === index ? newItem : item)) + } + // Add new item + return [...oldArray, newItem] +} +const removeFromArray = ( + oldArray: Array<{ id: string; state: AnyFormState }>, + removedItem: string, +): Array<{ id: string; state: AnyFormState }> => { + return oldArray.filter((item) => item.id !== removedItem) +} + +function useProviderValue() { + const [formStateArray, setFormStateArray] = createSignal< + Array<{ id: string; state: AnyFormState }> + >([]) + + createEffect(() => { + const cleanup = formEventClient.on('broadcast-form-state', (_e) => { + const e = _e as unknown as { + type: string + payload: { id: string; state: AnyFormState } + } + + setFormStateArray(updateOrAddToArray(formStateArray(), e.payload)) + }) + + onCleanup(() => cleanup()) + }) + + createEffect(() => { + const cleanup = formEventClient.on('broadcast-form-unmounted', (_e) => { + const e = _e as unknown as { + type: string + payload: { id: string } + } + + console.log('unmounted', e) + + setFormStateArray(removeFromArray(formStateArray(), e.payload.id)) + }) + + onCleanup(() => cleanup()) + }) + + return { formStateArray } +} + +export type ContextType = ReturnType + +const FormEventClientContext = createContext(undefined) + +export const FormEventClientProvider: ParentComponent = (props) => { + const value = useProviderValue() + + return ( + + {props.children} + + ) +} + +function useFormEventClient() { + const context = useContext(FormEventClientContext) + + if (context === undefined) { + throw new Error( + `useEventClient must be used within a FormEventClientContext`, + ) + } + + return context +} + +export function useFormStateArray() { + return useFormEventClient().formStateArray +} diff --git a/packages/form-devtools/src/index.tsx b/packages/form-devtools/src/index.tsx new file mode 100644 index 000000000..97bcb4945 --- /dev/null +++ b/packages/form-devtools/src/index.tsx @@ -0,0 +1 @@ +export * from './TanstackFormDevtoolsPanel' diff --git a/packages/form-devtools/src/styles/tokens.ts b/packages/form-devtools/src/styles/tokens.ts new file mode 100644 index 000000000..9d247cf18 --- /dev/null +++ b/packages/form-devtools/src/styles/tokens.ts @@ -0,0 +1,305 @@ +export const tokens = { + colors: { + inherit: 'inherit', + current: 'currentColor', + transparent: 'transparent', + black: '#000000', + white: '#ffffff', + neutral: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + darkGray: { + 50: '#525c7a', + 100: '#49536e', + 200: '#414962', + 300: '#394056', + 400: '#313749', + 500: '#292e3d', + 600: '#212530', + 700: '#191c24', + 800: '#111318', + 900: '#0b0d10', + }, + gray: { + 50: '#f9fafb', + 100: '#f2f4f7', + 200: '#eaecf0', + 300: '#d0d5dd', + 400: '#98a2b3', + 500: '#667085', + 600: '#475467', + 700: '#344054', + 800: '#1d2939', + 900: '#101828', + }, + blue: { + 25: '#F5FAFF', + 50: '#EFF8FF', + 100: '#D1E9FF', + 200: '#B2DDFF', + 300: '#84CAFF', + 400: '#53B1FD', + 500: '#2E90FA', + 600: '#1570EF', + 700: '#175CD3', + 800: '#1849A9', + 900: '#194185', + }, + green: { + 25: '#F6FEF9', + 50: '#ECFDF3', + 100: '#D1FADF', + 200: '#A6F4C5', + 300: '#6CE9A6', + 400: '#32D583', + 500: '#12B76A', + 600: '#039855', + 700: '#027A48', + 800: '#05603A', + 900: '#054F31', + }, + red: { + 50: '#fef2f2', + 100: '#fee2e2', + 200: '#fecaca', + 300: '#fca5a5', + 400: '#f87171', + 500: '#ef4444', + 600: '#dc2626', + 700: '#b91c1c', + 800: '#991b1b', + 900: '#7f1d1d', + 950: '#450a0a', + }, + yellow: { + 25: '#FFFCF5', + 50: '#FFFAEB', + 100: '#FEF0C7', + 200: '#FEDF89', + 300: '#FEC84B', + 400: '#FDB022', + 500: '#F79009', + 600: '#DC6803', + 700: '#B54708', + 800: '#93370D', + 900: '#7A2E0E', + }, + purple: { + 25: '#FAFAFF', + 50: '#F4F3FF', + 100: '#EBE9FE', + 200: '#D9D6FE', + 300: '#BDB4FE', + 400: '#9B8AFB', + 500: '#7A5AF8', + 600: '#6938EF', + 700: '#5925DC', + 800: '#4A1FB8', + 900: '#3E1C96', + }, + teal: { + 25: '#F6FEFC', + 50: '#F0FDF9', + 100: '#CCFBEF', + 200: '#99F6E0', + 300: '#5FE9D0', + 400: '#2ED3B7', + 500: '#15B79E', + 600: '#0E9384', + 700: '#107569', + 800: '#125D56', + 900: '#134E48', + }, + pink: { + 25: '#fdf2f8', + 50: '#fce7f3', + 100: '#fbcfe8', + 200: '#f9a8d4', + 300: '#f472b6', + 400: '#ec4899', + 500: '#db2777', + 600: '#be185d', + 700: '#9d174d', + 800: '#831843', + 900: '#500724', + }, + cyan: { + 25: '#ecfeff', + 50: '#cffafe', + 100: '#a5f3fc', + 200: '#67e8f9', + 300: '#22d3ee', + 400: '#06b6d4', + 500: '#0891b2', + 600: '#0e7490', + 700: '#155e75', + 800: '#164e63', + 900: '#083344', + }, + }, + alpha: { + 100: 'ff', + 90: 'e5', + 80: 'cc', + 70: 'b3', + 60: '99', + 50: '80', + 40: '66', + 30: '4d', + 20: '33', + 10: '1a', + 0: '00', + }, + font: { + size: { + '2xs': 'calc(var(--tsrd-font-size) * 0.625)', + xs: 'calc(var(--tsrd-font-size) * 0.75)', + sm: 'calc(var(--tsrd-font-size) * 0.875)', + md: 'var(--tsrd-font-size)', + lg: 'calc(var(--tsrd-font-size) * 1.125)', + xl: 'calc(var(--tsrd-font-size) * 1.25)', + '2xl': 'calc(var(--tsrd-font-size) * 1.5)', + '3xl': 'calc(var(--tsrd-font-size) * 1.875)', + '4xl': 'calc(var(--tsrd-font-size) * 2.25)', + '5xl': 'calc(var(--tsrd-font-size) * 3)', + '6xl': 'calc(var(--tsrd-font-size) * 3.75)', + '7xl': 'calc(var(--tsrd-font-size) * 4.5)', + '8xl': 'calc(var(--tsrd-font-size) * 6)', + '9xl': 'calc(var(--tsrd-font-size) * 8)', + }, + lineHeight: { + '3xs': 'calc(var(--tsrd-font-size) * 0.75)', + '2xs': 'calc(var(--tsrd-font-size) * 0.875)', + xs: 'calc(var(--tsrd-font-size) * 1)', + sm: 'calc(var(--tsrd-font-size) * 1.25)', + md: 'calc(var(--tsrd-font-size) * 1.5)', + lg: 'calc(var(--tsrd-font-size) * 1.75)', + xl: 'calc(var(--tsrd-font-size) * 2)', + '2xl': 'calc(var(--tsrd-font-size) * 2.25)', + '3xl': 'calc(var(--tsrd-font-size) * 2.5)', + '4xl': 'calc(var(--tsrd-font-size) * 2.75)', + '5xl': 'calc(var(--tsrd-font-size) * 3)', + '6xl': 'calc(var(--tsrd-font-size) * 3.25)', + '7xl': 'calc(var(--tsrd-font-size) * 3.5)', + '8xl': 'calc(var(--tsrd-font-size) * 3.75)', + '9xl': 'calc(var(--tsrd-font-size) * 4)', + }, + weight: { + thin: '100', + extralight: '200', + light: '300', + normal: '400', + medium: '500', + semibold: '600', + bold: '700', + extrabold: '800', + black: '900', + }, + fontFamily: { + sans: 'ui-sans-serif, Inter, system-ui, sans-serif, sans-serif', + mono: `ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, 'Liberation Mono', 'Courier New', monospace`, + }, + }, + breakpoints: { + xs: '320px', + sm: '640px', + md: '768px', + lg: '1024px', + xl: '1280px', + '2xl': '1536px', + }, + border: { + radius: { + none: '0px', + xs: 'calc(var(--tsrd-font-size) * 0.125)', + sm: 'calc(var(--tsrd-font-size) * 0.25)', + md: 'calc(var(--tsrd-font-size) * 0.375)', + lg: 'calc(var(--tsrd-font-size) * 0.5)', + xl: 'calc(var(--tsrd-font-size) * 0.75)', + '2xl': 'calc(var(--tsrd-font-size) * 1)', + '3xl': 'calc(var(--tsrd-font-size) * 1.5)', + full: '9999px', + }, + }, + size: { + 0: '0px', + 0.25: 'calc(var(--tsrd-font-size) * 0.0625)', + 0.5: 'calc(var(--tsrd-font-size) * 0.125)', + 1: 'calc(var(--tsrd-font-size) * 0.25)', + 1.5: 'calc(var(--tsrd-font-size) * 0.375)', + 2: 'calc(var(--tsrd-font-size) * 0.5)', + 2.5: 'calc(var(--tsrd-font-size) * 0.625)', + 3: 'calc(var(--tsrd-font-size) * 0.75)', + 3.5: 'calc(var(--tsrd-font-size) * 0.875)', + 4: 'calc(var(--tsrd-font-size) * 1)', + 4.5: 'calc(var(--tsrd-font-size) * 1.125)', + 5: 'calc(var(--tsrd-font-size) * 1.25)', + 5.5: 'calc(var(--tsrd-font-size) * 1.375)', + 6: 'calc(var(--tsrd-font-size) * 1.5)', + 6.5: 'calc(var(--tsrd-font-size) * 1.625)', + 7: 'calc(var(--tsrd-font-size) * 1.75)', + 8: 'calc(var(--tsrd-font-size) * 2)', + 9: 'calc(var(--tsrd-font-size) * 2.25)', + 10: 'calc(var(--tsrd-font-size) * 2.5)', + 11: 'calc(var(--tsrd-font-size) * 2.75)', + 12: 'calc(var(--tsrd-font-size) * 3)', + 14: 'calc(var(--tsrd-font-size) * 3.5)', + 16: 'calc(var(--tsrd-font-size) * 4)', + 20: 'calc(var(--tsrd-font-size) * 5)', + 24: 'calc(var(--tsrd-font-size) * 6)', + 28: 'calc(var(--tsrd-font-size) * 7)', + 32: 'calc(var(--tsrd-font-size) * 8)', + 36: 'calc(var(--tsrd-font-size) * 9)', + 40: 'calc(var(--tsrd-font-size) * 10)', + 44: 'calc(var(--tsrd-font-size) * 11)', + 48: 'calc(var(--tsrd-font-size) * 12)', + 52: 'calc(var(--tsrd-font-size) * 13)', + 56: 'calc(var(--tsrd-font-size) * 14)', + 60: 'calc(var(--tsrd-font-size) * 15)', + 64: 'calc(var(--tsrd-font-size) * 16)', + 72: 'calc(var(--tsrd-font-size) * 18)', + 80: 'calc(var(--tsrd-font-size) * 20)', + 96: 'calc(var(--tsrd-font-size) * 24)', + }, + shadow: { + xs: (_: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 2px 0 rgb(0 0 0 / 0.05)` as const, + sm: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 1px 3px 0 ${color}, 0 1px 2px -1px ${color}` as const, + md: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 4px 6px -1px ${color}, 0 2px 4px -2px ${color}` as const, + lg: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 10px 15px -3px ${color}, 0 4px 6px -4px ${color}` as const, + xl: (color: string = 'rgb(0 0 0 / 0.1)') => + `0 20px 25px -5px ${color}, 0 8px 10px -6px ${color}` as const, + '2xl': (color: string = 'rgb(0 0 0 / 0.25)') => + `0 25px 50px -12px ${color}` as const, + inner: (color: string = 'rgb(0 0 0 / 0.05)') => + `inset 0 2px 4px 0 ${color}` as const, + none: () => `none` as const, + }, + zIndices: { + hide: -1, + auto: 'auto', + base: 0, + docked: 10, + dropdown: 1000, + sticky: 1100, + banner: 1200, + overlay: 1300, + modal: 1400, + popover: 1500, + skipLink: 1600, + toast: 1700, + tooltip: 1800, + }, +} as const diff --git a/packages/form-devtools/src/styles/use-styles.ts b/packages/form-devtools/src/styles/use-styles.ts new file mode 100644 index 000000000..2b15e8558 --- /dev/null +++ b/packages/form-devtools/src/styles/use-styles.ts @@ -0,0 +1,379 @@ +import * as goober from 'goober' +import { createSignal } from 'solid-js' +import { tokens } from './tokens' + +const stylesFactory = () => { + const { colors, font, size, alpha, border } = tokens + const { fontFamily, size: fontSize } = font + const css = goober.css + + return { + devtoolsPanel: css` + background: ${colors.darkGray[900]}; + color: ${colors.gray[100]}; + font-family: ${fontFamily.sans}; + font-size: ${fontSize.sm}; + box-sizing: border-box; + display: flex; + flex-direction: column; + width: 100%; + height: 100%; + overflow: hidden; + `, + stickyHeader: css` + position: sticky; + top: 0; + z-index: 10; + background: ${colors.darkGray[900]}; + padding: ${size[2]}; + font-size: ${fontSize.lg}; + font-weight: ${font.weight.bold}; + color: #eeaf00; + letter-spacing: 0.04em; + text-transform: uppercase; + border-bottom: 1px solid ${colors.darkGray[700]}; + box-shadow: 0 2px 8px 0 ${colors.black + alpha[40]}; + flex-shrink: 0; + `, + mainContainer: css` + display: flex; + flex: 1; + min-height: 0; + overflow: hidden; + padding: ${size[2]}; + padding-top: 0; + `, + dragHandle: css` + width: 8px; + background: ${colors.darkGray[600]}; + cursor: col-resize; + position: relative; + transition: all 0.2s ease; + user-select: none; + pointer-events: all; + margin: 0 ${size[1]}; + border-radius: 2px; + + &:hover { + background: ${colors.blue[500]}; + margin: 0 ${size[1]}; + } + + &.dragging { + background: ${colors.blue[600]}; + margin: 0 ${size[1]}; + } + + &::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 2px; + height: 20px; + background: ${colors.darkGray[400]}; + border-radius: 1px; + pointer-events: none; + } + + &:hover::after, + &.dragging::after { + background: ${colors.blue[300]}; + } + `, + leftPanel: css` + background: ${colors.darkGray[800]}; + border-radius: ${border.radius.lg}; + border: 1px solid ${colors.darkGray[700]}; + display: flex; + flex-direction: column; + overflow: hidden; + min-height: 0; + flex-shrink: 0; + `, + rightPanel: css` + background: ${colors.darkGray[800]}; + border-radius: ${border.radius.lg}; + border: 1px solid ${colors.darkGray[700]}; + display: flex; + flex-direction: column; + overflow: hidden; + min-height: 0; + flex: 1; + `, + panelHeader: css` + font-size: ${fontSize.md}; + font-weight: ${font.weight.bold}; + color: ${colors.blue[400]}; + padding: ${size[2]}; + border-bottom: 1px solid ${colors.darkGray[700]}; + background: ${colors.darkGray[800]}; + flex-shrink: 0; + `, + utilList: css` + flex: 1; + overflow-y: auto; + padding: ${size[1]}; + min-height: 0; + `, + utilGroup: css` + margin-bottom: ${size[2]}; + `, + utilGroupHeader: css` + font-size: ${fontSize.xs}; + font-weight: ${font.weight.semibold}; + color: ${colors.gray[400]}; + text-transform: uppercase; + letter-spacing: 0.05em; + margin-bottom: ${size[1]}; + padding: ${size[1]} ${size[2]}; + background: ${colors.darkGray[700]}; + border-radius: ${border.radius.md}; + `, + utilRow: css` + display: flex; + justify-content: space-between; + align-items: center; + padding: ${size[2]}; + margin-bottom: ${size[1]}; + background: ${colors.darkGray[700]}; + border-radius: ${border.radius.md}; + cursor: pointer; + transition: all 0.2s ease; + border: 1px solid transparent; + + &:hover { + background: ${colors.darkGray[600]}; + border-color: ${colors.darkGray[500]}; + } + `, + utilRowSelected: css` + background: ${colors.blue[900] + alpha[20]}; + border-color: ${colors.blue[500]}; + box-shadow: 0 0 0 1px ${colors.blue[500] + alpha[30]}; + `, + utilKey: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + color: ${colors.gray[100]}; + flex: 1; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + `, + utilStatus: css` + font-size: ${fontSize.xs}; + color: ${colors.gray[400]}; + text-transform: uppercase; + letter-spacing: 0.05em; + padding: ${size[1]} ${size[1]}; + background: ${colors.darkGray[600]}; + border-radius: ${border.radius.sm}; + margin-left: ${size[1]}; + `, + stateDetails: css` + flex: 1; + overflow-y: auto; + padding: ${size[2]}; + min-height: 0; + `, + stateHeader: css` + margin-bottom: ${size[2]}; + padding-bottom: ${size[2]}; + border-bottom: 1px solid ${colors.darkGray[700]}; + `, + stateTitle: css` + font-size: ${fontSize.md}; + font-weight: ${font.weight.bold}; + color: ${colors.blue[400]}; + margin-bottom: ${size[1]}; + `, + stateKey: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + color: ${colors.gray[400]}; + word-break: break-all; + `, + stateContent: css` + background: ${colors.darkGray[700]}; + border-radius: ${border.radius.md}; + padding: ${size[2]}; + border: 1px solid ${colors.darkGray[600]}; + `, + detailsGrid: css` + display: grid; + grid-template-columns: 1fr; + gap: ${size[2]}; + align-items: start; + `, + detailSection: css` + background: ${colors.darkGray[700]}; + border: 1px solid ${colors.darkGray[600]}; + border-radius: ${border.radius.md}; + padding: ${size[2]}; + `, + detailSectionHeader: css` + font-size: ${fontSize.sm}; + font-weight: ${font.weight.bold}; + color: ${colors.gray[200]}; + margin-bottom: ${size[1]}; + text-transform: uppercase; + letter-spacing: 0.04em; + `, + actionsRow: css` + display: flex; + flex-wrap: wrap; + gap: ${size[2]}; + `, + actionButton: css` + display: inline-flex; + align-items: center; + gap: ${size[1]}; + padding: ${size[1]} ${size[2]}; + border-radius: ${border.radius.md}; + border: 1px solid ${colors.darkGray[500]}; + background: ${colors.darkGray[600]}; + color: ${colors.gray[100]}; + font-size: ${fontSize.xs}; + cursor: pointer; + user-select: none; + transition: + background 0.15s, + border-color 0.15s; + &:hover { + background: ${colors.darkGray[500]}; + border-color: ${colors.darkGray[400]}; + } + &:disabled { + opacity: 0.5; + cursor: not-allowed; + &:hover { + background: ${colors.darkGray[600]}; + border-color: ${colors.darkGray[500]}; + } + } + `, + actionDotBlue: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.blue[400]}; + `, + actionDotGreen: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.green[400]}; + `, + actionDotRed: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.red[400]}; + `, + actionDotYellow: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.yellow[400]}; + `, + actionDotOrange: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.pink[400]}; + `, + actionDotPurple: css` + width: 6px; + height: 6px; + border-radius: 9999px; + background: ${colors.purple[400]}; + `, + infoGrid: css` + display: grid; + grid-template-columns: auto 1fr; + gap: ${size[1]}; + row-gap: ${size[1]}; + align-items: center; + `, + infoLabel: css` + color: ${colors.gray[400]}; + font-size: ${fontSize.xs}; + text-transform: uppercase; + letter-spacing: 0.05em; + `, + infoValueMono: css` + font-family: ${fontFamily.mono}; + font-size: ${fontSize.xs}; + color: ${colors.gray[100]}; + word-break: break-all; + `, + noSelection: css` + flex: 1; + display: flex; + align-items: center; + justify-content: center; + color: ${colors.gray[500]}; + font-style: italic; + text-align: center; + padding: ${size[4]}; + `, + // Keep existing styles for backward compatibility + sectionContainer: css` + display: flex; + flex-wrap: wrap; + gap: ${size[4]}; + `, + section: css` + background: ${colors.darkGray[800]}; + border-radius: ${border.radius.lg}; + box-shadow: ${tokens.shadow.md(colors.black + alpha[80])}; + padding: ${size[4]}; + margin-bottom: ${size[4]}; + border: 1px solid ${colors.darkGray[700]}; + min-width: 0; + max-width: 33%; + max-height: fit-content; + `, + sectionHeader: css` + font-size: ${fontSize.lg}; + font-weight: ${font.weight.bold}; + margin-bottom: ${size[2]}; + color: ${colors.blue[400]}; + letter-spacing: 0.01em; + display: flex; + align-items: center; + gap: ${size[2]}; + `, + sectionEmpty: css` + color: ${colors.gray[500]}; + font-size: ${fontSize.sm}; + font-style: italic; + margin: ${size[2]} 0; + `, + instanceList: css` + display: flex; + flex-direction: column; + gap: ${size[2]}; + `, + instanceCard: css` + background: ${colors.darkGray[700]}; + border-radius: ${border.radius.md}; + padding: ${size[3]}; + border: 1px solid ${colors.darkGray[600]}; + font-size: ${fontSize.sm}; + color: ${colors.gray[100]}; + font-family: ${fontFamily.mono}; + overflow-x: auto; + transition: + box-shadow 0.3s, + background 0.3s; + `, + } +} + +export function useStyles() { + const [_styles] = createSignal(stylesFactory()) + return _styles +} diff --git a/packages/form-devtools/tsconfig.build.json b/packages/form-devtools/tsconfig.build.json new file mode 100644 index 000000000..14414d318 --- /dev/null +++ b/packages/form-devtools/tsconfig.build.json @@ -0,0 +1,17 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "solid-js", + "moduleResolution": "Bundler", + "rootDir": "src", + "outDir": "dist/source", + "noEmit": false, + "declaration": true, + "sourceMap": true, + "paths": { + "@tanstack/form-core": ["../../form-core/src"] + } + }, + "include": ["src"] +} diff --git a/packages/form-devtools/tsconfig.docs.json b/packages/form-devtools/tsconfig.docs.json new file mode 100644 index 000000000..2c9444e16 --- /dev/null +++ b/packages/form-devtools/tsconfig.docs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "@tanstack/form-core": ["../form-core/src"] + } + }, + "exclude": ["tests", "eslint.config.js", "vite.config.ts"] +} diff --git a/packages/form-devtools/tsconfig.json b/packages/form-devtools/tsconfig.json new file mode 100644 index 000000000..86a377267 --- /dev/null +++ b/packages/form-devtools/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "preserve", + "jsxImportSource": "solid-js", + "moduleResolution": "Bundler", + "paths": { + "@tanstack/form-core": ["../form-core/src"] + } + }, + "include": ["src", "tests", "eslint.config.js", "vite.config.ts"] +} diff --git a/packages/form-devtools/vite.config.ts b/packages/form-devtools/vite.config.ts new file mode 100644 index 000000000..14ab01c19 --- /dev/null +++ b/packages/form-devtools/vite.config.ts @@ -0,0 +1,25 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import solid from 'vite-plugin-solid' +import packageJson from './package.json' + +const config = defineConfig({ + plugins: [solid()], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + setupFiles: ['./tests/test-setup.ts'], + coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, + typecheck: { enabled: true }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.tsx'], + srcDir: './src', + }), +) diff --git a/packages/react-form-devtools/README.md b/packages/react-form-devtools/README.md new file mode 100644 index 000000000..1866876e9 --- /dev/null +++ b/packages/react-form-devtools/README.md @@ -0,0 +1,35 @@ + + +![TanStack Form Header](https://github.com/TanStack/form/raw/main/media/repo-header.png) + +Hooks for managing form state in React + + + #TanStack + + + + + + + + + + semantic-release + + Join the discussion on Github +Best of JS + + + + + Gitpod Ready-to-Code + + +Enjoy this library? Try the entire [TanStack](https://tanstack.com)! [TanStack Table](https://github.com/TanStack/table), [TanStack Router](https://github.com/tanstack/router), [TanStack Virtual](https://github.com/tanstack/virtual), [React Charts](https://github.com/TanStack/react-charts), [React Ranger](https://github.com/TanStack/ranger) + +## Visit [tanstack.com/form](https://tanstack.com/form) for docs, guides, API and more! + +### [Become a Sponsor!](https://github.com/sponsors/tannerlinsley/) + + diff --git a/packages/react-form-devtools/eslint.config.js b/packages/react-form-devtools/eslint.config.js new file mode 100644 index 000000000..dd590b561 --- /dev/null +++ b/packages/react-form-devtools/eslint.config.js @@ -0,0 +1,25 @@ +// @ts-check + +import pluginReact from '@eslint-react/eslint-plugin' +import reactCompiler from 'eslint-plugin-react-compiler' +import pluginReactHooks from 'eslint-plugin-react-hooks' +import rootConfig from '../../eslint.config.js' + +export default [ + ...rootConfig, + { + files: ['**/*.{ts,tsx}'], + ...pluginReact.configs.recommended, + }, + { + plugins: { + 'react-hooks': pluginReactHooks, + 'react-compiler': reactCompiler, + }, + rules: { + 'react-hooks/exhaustive-deps': 'error', + 'react-hooks/rules-of-hooks': 'error', + 'react-compiler/react-compiler': 'error', + }, + }, +] diff --git a/packages/react-form-devtools/package.json b/packages/react-form-devtools/package.json new file mode 100644 index 000000000..cf0d71afd --- /dev/null +++ b/packages/react-form-devtools/package.json @@ -0,0 +1,68 @@ +{ + "name": "@tanstack/react-form-devtools", + "version": "0.0.1", + "description": "Powerful, type-safe forms for React.", + "author": "tannerlinsley", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/form.git", + "directory": "packages/react-form" + }, + "homepage": "https://tanstack.com/form", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "scripts": { + "clean": "premove ./dist ./coverage", + "test:eslint": "eslint ./src ./tests", + "test:types": "pnpm run \"/^test:types:ts[0-9]{2}$/\"", + "test:types:ts54": "node ../../node_modules/typescript54/lib/tsc.js", + "test:types:ts55": "node ../../node_modules/typescript55/lib/tsc.js", + "test:types:ts56": "node ../../node_modules/typescript56/lib/tsc.js", + "test:types:ts57": "node ../../node_modules/typescript57/lib/tsc.js", + "test:types:ts58": "tsc", + "test:lib": "vitest", + "test:lib:dev": "pnpm run test:lib --watch", + "test:build": "publint --strict", + "build": "vite build" + }, + "type": "module", + "types": "dist/esm/index.d.ts", + "main": "dist/cjs/index.cjs", + "module": "dist/esm/index.js", + "exports": { + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/cjs/index.d.cts", + "default": "./dist/cjs/index.cjs" + } + }, + "./package.json": "./package.json" + }, + "sideEffects": false, + "files": [ + "dist", + "src" + ], + "dependencies": { + "@tanstack/form-devtools": "workspace:*" + }, + "devDependencies": { + "@types/react": "^19.0.7", + "@types/react-dom": "^19.0.3", + "@vitejs/plugin-react": "^4.5.2", + "eslint-plugin-react-compiler": "19.0.0-beta-ebf51a3-20250411", + "react": "^19.0.0", + "react-dom": "^19.0.0", + "vite": "^7.0.6" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + } +} diff --git a/packages/react-form-devtools/src/FormDevtools.tsx b/packages/react-form-devtools/src/FormDevtools.tsx new file mode 100644 index 000000000..e0cf811f2 --- /dev/null +++ b/packages/react-form-devtools/src/FormDevtools.tsx @@ -0,0 +1,19 @@ +import { TanstackFormDevtoolsPanel } from '@tanstack/form-devtools' +import { useEffect, useRef, useState } from 'react' + +export function FormDevtools(): React.ReactElement | null { + const [devtools] = useState(new TanstackFormDevtoolsPanel()) + const ref = useRef(null) + + useEffect(() => { + if (ref.current) { + devtools.mount(ref.current) + } + + return () => { + devtools.unmount() + } + }, [devtools]) + + return
+} diff --git a/packages/react-form-devtools/src/index.ts b/packages/react-form-devtools/src/index.ts new file mode 100644 index 000000000..688c83c5d --- /dev/null +++ b/packages/react-form-devtools/src/index.ts @@ -0,0 +1 @@ +export * from './FormDevtools' diff --git a/packages/react-form-devtools/tests/form-devtools.spec.ts b/packages/react-form-devtools/tests/form-devtools.spec.ts new file mode 100644 index 000000000..e69de29bb diff --git a/packages/react-form-devtools/tests/test-setup.ts b/packages/react-form-devtools/tests/test-setup.ts new file mode 100644 index 000000000..33e431061 --- /dev/null +++ b/packages/react-form-devtools/tests/test-setup.ts @@ -0,0 +1,6 @@ +import '@testing-library/jest-dom/vitest' +import { cleanup } from '@testing-library/react' +import { afterEach } from 'vitest' + +// https://testing-library.com/docs/react-testing-library/api#cleanup +afterEach(() => cleanup()) diff --git a/packages/react-form-devtools/tsconfig.docs.json b/packages/react-form-devtools/tsconfig.docs.json new file mode 100644 index 000000000..2c9444e16 --- /dev/null +++ b/packages/react-form-devtools/tsconfig.docs.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "paths": { + "@tanstack/form-core": ["../form-core/src"] + } + }, + "exclude": ["tests", "eslint.config.js", "vite.config.ts"] +} diff --git a/packages/react-form-devtools/tsconfig.json b/packages/react-form-devtools/tsconfig.json new file mode 100644 index 000000000..52d4fd7bb --- /dev/null +++ b/packages/react-form-devtools/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-jsx", + "moduleResolution": "Bundler", + "paths": { + "@tanstack/form-core": ["../form-core/src"] + } + }, + "include": ["src", "tests", "eslint.config.js", "vite.config.ts"] +} diff --git a/packages/react-form-devtools/vite.config.ts b/packages/react-form-devtools/vite.config.ts new file mode 100644 index 000000000..2602de084 --- /dev/null +++ b/packages/react-form-devtools/vite.config.ts @@ -0,0 +1,25 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import { tanstackViteConfig } from '@tanstack/config/vite' +import react from '@vitejs/plugin-react' +import packageJson from './package.json' + +const config = defineConfig({ + plugins: [react()], + test: { + name: packageJson.name, + dir: './tests', + watch: false, + environment: 'jsdom', + setupFiles: ['./tests/test-setup.ts'], + coverage: { enabled: true, provider: 'istanbul', include: ['src/**/*'] }, + typecheck: { enabled: true }, + }, +}) + +export default mergeConfig( + config, + tanstackViteConfig({ + entry: ['./src/index.ts'], + srcDir: './src', + }), +) diff --git a/packages/react-form/src/useForm.tsx b/packages/react-form/src/useForm.tsx index 0a3899108..14bec4976 100644 --- a/packages/react-form/src/useForm.tsx +++ b/packages/react-form/src/useForm.tsx @@ -1,18 +1,17 @@ -import { FormApi, functionalUpdate } from '@tanstack/form-core' +import { FormApi, formEventClient, functionalUpdate } from '@tanstack/form-core' import { useStore } from '@tanstack/react-store' -import { useState } from 'react' +import { useEffect, useId, useRef, useState } from 'react' import { Field } from './useField' import { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect' import type { AnyFormApi, AnyFormState, - BaseFormOptions, FormAsyncValidateOrFn, FormOptions, FormState, FormValidateOrFn, } from '@tanstack/form-core' -import type { ComponentType, JSX, PropsWithChildren, ReactNode } from 'react' +import type { PropsWithChildren, ReactNode } from 'react' import type { FieldComponent } from './useField' import type { NoInfer } from '@tanstack/react-store' @@ -183,6 +182,10 @@ export function useForm< TSubmitMeta >, ) { + const formId = useId() + + const options = opts?.formId ? opts : { ...opts, formId: formId } + const [formApi] = useState(() => { const api = new FormApi< TFormData, @@ -197,7 +200,7 @@ export function useForm< TOnDynamicAsync, TOnServer, TSubmitMeta - >(opts) + >(options) const extendedApi: ReactFormExtendedApi< TFormData, @@ -241,5 +244,16 @@ export function useForm< formApi.update(opts) }) + /** + * clean up for devtools + */ + useIsomorphicLayoutEffect(() => { + return () => { + formEventClient.emit('broadcast-form-unmounted', { + id: formId, + }) + } + }) + return formApi } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2e1641bc4..ee3b91d64 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -88,10 +88,10 @@ importers: version: typescript@5.8.3 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vitest: specifier: ^3.2.3 - version: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/angular/array: dependencies: @@ -134,7 +134,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^20.0.0 - version: 20.0.5(nfnantpvxxnln3gt24dyppef6e) + version: 20.0.5(454e04673bed95c3d186db30149c134f) '@angular/cli': specifier: ^20.0.0 version: 20.0.5(@types/node@24.1.0)(chokidar@4.0.3) @@ -186,7 +186,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^20.0.0 - version: 20.0.5(ihmsye2bouaxe4zli4d5fzwduq) + version: 20.0.5(76ecc4c34b81a4060af826234478a183) '@angular/cli': specifier: ^20.0.0 version: 20.0.5(@types/node@24.1.0)(chokidar@4.0.3) @@ -238,7 +238,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^20.0.0 - version: 20.0.5(ihmsye2bouaxe4zli4d5fzwduq) + version: 20.0.5(454e04673bed95c3d186db30149c134f) '@angular/cli': specifier: ^20.0.0 version: 20.0.5(@types/node@24.1.0)(chokidar@4.0.3) @@ -299,7 +299,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^20.0.0 - version: 20.0.5(ihmsye2bouaxe4zli4d5fzwduq) + version: 20.0.5(454e04673bed95c3d186db30149c134f) '@angular/cli': specifier: ^20.0.0 version: 20.0.5(@types/node@24.1.0)(chokidar@4.0.3) @@ -321,7 +321,7 @@ importers: devDependencies: vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/lit/simple: dependencies: @@ -334,7 +334,7 @@ importers: devDependencies: vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/lit/standard-schema: dependencies: @@ -359,7 +359,7 @@ importers: devDependencies: vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/lit/ui-libraries: dependencies: @@ -375,7 +375,7 @@ importers: devDependencies: vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/react/array: dependencies: @@ -400,7 +400,7 @@ importers: version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/react/compiler: dependencies: @@ -431,7 +431,38 @@ importers: version: 19.0.0-beta-ebf51a3-20250411(eslint@9.32.0(jiti@2.4.2)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + + examples/react/devtools: + dependencies: + '@tanstack/react-devtools': + specifier: 0.4.3 + version: 0.4.3(@types/react-dom@19.1.5(@types/react@19.1.6))(@types/react@19.1.6)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.7) + '@tanstack/react-form': + specifier: ^1.17.0 + version: link:../../../packages/react-form + '@tanstack/react-form-devtools': + specifier: workspace:* + version: link:../../../packages/react-form-devtools + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + devDependencies: + '@types/react': + specifier: ^19.0.7 + version: 19.1.6 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.1.5(@types/react@19.1.6) + '@vitejs/plugin-react': + specifier: ^4.5.2 + version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + vite: + specifier: ^7.0.6 + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/react/dynamic: dependencies: @@ -456,7 +487,7 @@ importers: version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) zod: specifier: ^3.25.76 version: 3.25.76 @@ -484,7 +515,7 @@ importers: version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/react/large-form: dependencies: @@ -509,7 +540,7 @@ importers: version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/react/next-server-actions: dependencies: @@ -568,7 +599,7 @@ importers: version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/react/remix: dependencies: @@ -611,7 +642,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(typescript@5.8.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) @@ -639,7 +670,7 @@ importers: version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/react/standard-schema: dependencies: @@ -676,7 +707,7 @@ importers: version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/react/tanstack-start: dependencies: @@ -716,7 +747,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-tsconfig-paths: specifier: ^5.1.4 version: 5.1.4(typescript@5.8.2)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) @@ -777,7 +808,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/solid/array: dependencies: @@ -793,7 +824,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.6 version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) @@ -812,7 +843,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.6 version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) @@ -831,7 +862,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.6 version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) @@ -868,7 +899,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.6 version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) @@ -893,7 +924,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/svelte/simple: dependencies: @@ -915,7 +946,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/svelte/standard-schema: dependencies: @@ -949,7 +980,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) examples/vue/array: dependencies: @@ -968,7 +999,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vue-tsc: specifier: ^2.2.2 version: 2.2.10(typescript@5.8.2) @@ -990,7 +1021,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vue-tsc: specifier: ^2.2.2 version: 2.2.10(typescript@5.8.2) @@ -1030,7 +1061,7 @@ importers: version: 5.8.2 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vue-tsc: specifier: ^2.2.2 version: 2.2.10(typescript@5.8.2) @@ -1049,10 +1080,10 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^1.17.1 - version: 1.17.1(hktgnfkj6jpck5dy63x3zbeziu) + version: 1.17.1(daa254f2130e13b71188b1fb05418dd5) '@analogjs/vitest-angular': specifier: ^1.17.1 - version: 1.19.0(@analogjs/vite-plugin-angular@1.17.1(hktgnfkj6jpck5dy63x3zbeziu))(@angular-devkit/architect@0.2000.5(chokidar@4.0.3))(vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + version: 1.19.0(@analogjs/vite-plugin-angular@1.17.1(daa254f2130e13b71188b1fb05418dd5))(@angular-devkit/architect@0.2000.5(chokidar@4.0.3))(vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) '@angular/common': specifier: ^20.0.0 version: 20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) @@ -1073,7 +1104,7 @@ importers: version: 20.0.6(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/compiler@20.0.6)(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.0.6(@angular/animations@20.0.6(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))) '@testing-library/angular': specifier: ^17.4.0 - version: 17.4.0(et63vsrkp2gh7imm5w2nfv6y4q) + version: 17.4.0(17cd88c55c4aad4a6f5d297438ec4b45) ng-packagr: specifier: ^20.0.0 version: 20.0.1(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(tslib@2.8.1)(typescript@5.8.2) @@ -1089,6 +1120,9 @@ importers: packages/form-core: dependencies: + '@tanstack/devtools-event-client': + specifier: ^0.2.2 + version: 0.2.2 '@tanstack/store': specifier: ^0.7.2 version: 0.7.2 @@ -1103,6 +1137,37 @@ importers: specifier: ^3.25.76 version: 3.25.76 + packages/form-devtools: + dependencies: + '@tanstack/devtools-ui': + specifier: ^0.3.1 + version: 0.3.1(csstype@3.1.3)(solid-js@1.9.7) + '@tanstack/form-core': + specifier: workspace:* + version: link:../form-core + '@tanstack/solid-store': + specifier: ^0.7.3 + version: 0.7.3(solid-js@1.9.7) + clsx: + specifier: ^2.1.1 + version: 2.1.1 + dayjs: + specifier: ^1.11.13 + version: 1.11.13 + goober: + specifier: ^2.1.16 + version: 2.1.16(csstype@3.1.3) + devDependencies: + solid-js: + specifier: ^1.9.7 + version: 1.9.7 + vite: + specifier: ^7.0.6 + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite-plugin-solid: + specifier: ^2.11.6 + version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + packages/lit-form: dependencies: '@tanstack/form-core': @@ -1151,7 +1216,35 @@ importers: version: 19.1.0(react@19.1.0) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + + packages/react-form-devtools: + dependencies: + '@tanstack/form-devtools': + specifier: workspace:* + version: link:../form-devtools + devDependencies: + '@types/react': + specifier: ^19.0.7 + version: 19.1.6 + '@types/react-dom': + specifier: ^19.0.3 + version: 19.1.5(@types/react@19.1.6) + '@vitejs/plugin-react': + specifier: ^4.5.2 + version: 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + eslint-plugin-react-compiler: + specifier: 19.0.0-beta-ebf51a3-20250411 + version: 19.0.0-beta-ebf51a3-20250411(eslint@9.32.0(jiti@2.4.2)) + react: + specifier: ^19.0.0 + version: 19.1.0 + react-dom: + specifier: ^19.0.0 + version: 19.1.0(react@19.1.0) + vite: + specifier: ^7.0.6 + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) packages/solid-form: dependencies: @@ -1167,7 +1260,7 @@ importers: version: 1.9.7 vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-solid: specifier: ^2.11.6 version: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) @@ -1211,7 +1304,7 @@ importers: version: 5.2.4(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3)) vite: specifier: ^7.0.6 - version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + version: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vue: specifier: ^3.5.13 version: 3.5.16(typescript@5.8.3) @@ -4331,6 +4424,26 @@ packages: resolution: {integrity: sha512-LtoMMhxAlorcGhmFYI+LhPgbPZCkgP6ra1YL604EeF6U98pLlQ3iWIGMdWSC+vWmPBWBNgmDBAhnAobLROJmwg==} engines: {node: '>=18'} + '@solid-primitives/event-listener@2.4.3': + resolution: {integrity: sha512-h4VqkYFv6Gf+L7SQj+Y6puigL/5DIi7x5q07VZET7AWcS+9/G3WfIE9WheniHWJs51OEkRB43w6lDys5YeFceg==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/keyboard@1.3.3': + resolution: {integrity: sha512-9dQHTTgLBqyAI7aavtO+HnpTVJgWQA1ghBSrmLtMu1SMxLPDuLfuNr+Tk5udb4AL4Ojg7h9JrKOGEEDqsJXWJA==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/rootless@1.5.2': + resolution: {integrity: sha512-9HULb0QAzL2r47CCad0M+NKFtQ+LrGGNHZfteX/ThdGvKIg2o2GYhBooZubTCd/RTu2l2+Nw4s+dEfiDGvdrrQ==} + peerDependencies: + solid-js: ^1.6.12 + + '@solid-primitives/utils@6.3.2': + resolution: {integrity: sha512-hZ/M/qr25QOCcwDPOHtGjxTD8w2mNyVAYvcfgwzBHq2RwNqHNdDNsMZYap20+ruRwW4A3Cdkczyoz0TSxLCAPQ==} + peerDependencies: + solid-js: ^1.6.12 + '@solidjs/testing-library@0.8.10': resolution: {integrity: sha512-qdeuIerwyq7oQTIrrKvV0aL9aFeuwTd86VYD3afdq5HYEwoox1OBTJy4y8A3TFZr8oAR0nujYgCzY/8wgHGfeQ==} engines: {node: '>= 14'} @@ -4468,6 +4581,26 @@ packages: resolution: {integrity: sha512-q6P0aYj7X65biWDKkKFQ4feQoxF8Bcxd3U3CU5zjBt9sgUrc/w8kEfHoGy0cHtgsTSMLfPrzaAtvp6hTbofZmw==} engines: {node: '>=18'} + '@tanstack/devtools-event-bus@0.2.2': + resolution: {integrity: sha512-Ddl2F0TywxvbrBObYqVY5eaLX+j2KO7zqrcOZvQ+lir998BrgKJJ5sH/xQ+nA32t3Y1ciD18edOeUo8kEWWiFQ==} + engines: {node: '>=18'} + + '@tanstack/devtools-event-client@0.2.2': + resolution: {integrity: sha512-EnVT9P4H8Z6wX9Z2WUT1K29AcRsDAo0GuOsJPgWi2khP/DB7ZUmQ+OUBO9xBbxYeHBJk6/nvMuucJgyYBwhYhA==} + engines: {node: '>=18'} + + '@tanstack/devtools-ui@0.3.1': + resolution: {integrity: sha512-vTbdo7aXm0tHYXTiRamee/73OHHahmMg/I4sxrmJWBscMP/NER234qrjPCHzAfzq/w4ddcJIVvXQjGJmBE0bfw==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + + '@tanstack/devtools@0.4.2': + resolution: {integrity: sha512-rHEl1rAwiEe1I/OE97FfjPW0GvLuGUInBZf1/d8agK5ynNPVOZf5W/I5r9pHPBEX6ZCRu55lqJnG9QsrSiXPxA==} + engines: {node: '>=18'} + peerDependencies: + solid-js: '>=1.9.7' + '@tanstack/directive-functions-plugin@1.129.7': resolution: {integrity: sha512-2VvlVmDvwHOnDAXQQa+gnhDnWPW59JcqePFf1ujOG0QGv+pw1G+JzHpiLZs4Dwr4myMxMGzFp5AWtvF96rpE7Q==} engines: {node: '>=12'} @@ -4489,6 +4622,15 @@ packages: '@tanstack/query-core@5.80.7': resolution: {integrity: sha512-s09l5zeUKC8q7DCCCIkVSns8zZrK4ZDT6ryEjxNBFi68G4z2EBobBS7rdOY3r6W1WbUDpc1fe5oY+YO/+2UVUg==} + '@tanstack/react-devtools@0.4.3': + resolution: {integrity: sha512-lw0fxj0pz/+nQoEE8FyGfLzxHmCmAvhEtvPvSimkmE/cJ4S0DP1UNJfQ2EiadzFH42nmqFGqhnz0UHuOyGIrEw==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': '>=16.8' + '@types/react-dom': '>=16.8' + react: '>=16.8' + react-dom: '>=16.8' + '@tanstack/react-query@5.80.7': resolution: {integrity: sha512-u2F0VK6+anItoEvB3+rfvTO9GEh2vb00Je05OwlUe/A0lkJBgW1HckiY3f9YZa+jx6IOe4dHPh10dyp9aY3iRQ==} peerDependencies: @@ -6121,6 +6263,9 @@ packages: resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} engines: {node: '>=18'} + dayjs@1.11.13: + resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==} + db0@0.3.2: resolution: {integrity: sha512-xzWNQ6jk/+NtdfLyXEipbX55dmDSeteLFt/ayF+wZUU5bzKgmrDOxmInUTbyVRp46YwnJdkDA1KhB7WIXFofJw==} peerDependencies: @@ -7140,6 +7285,11 @@ packages: engines: {node: '>=0.6.0'} hasBin: true + goober@2.1.16: + resolution: {integrity: sha512-erjk19y1U33+XAMe1VTvIONHYoSqE4iS7BYUZfHaqeohLmnC0FdxEh7rQU+6MZ4OajItzjZFSRtVANrQwNq6/g==} + peerDependencies: + csstype: ^3.0.10 + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} @@ -11166,6 +11316,18 @@ packages: utf-8-validate: optional: true + ws@8.18.3: + resolution: {integrity: sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + xml-name-validator@5.0.0: resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} engines: {node: '>=18'} @@ -11278,19 +11440,19 @@ snapshots: '@jridgewell/gen-mapping': 0.3.12 '@jridgewell/trace-mapping': 0.3.29 - '@analogjs/vite-plugin-angular@1.17.1(hktgnfkj6jpck5dy63x3zbeziu)': + '@analogjs/vite-plugin-angular@1.17.1(daa254f2130e13b71188b1fb05418dd5)': dependencies: ts-morph: 21.0.1 vfile: 6.0.3 optionalDependencies: '@angular-devkit/build-angular': 20.0.5(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(@angular/compiler@20.0.6)(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.0.6(@angular/animations@20.0.6(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@swc/core@1.12.1)(@types/node@24.1.0)(chokidar@4.0.3)(jiti@2.4.2)(ng-packagr@20.0.1(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(tslib@2.8.1)(typescript@5.8.2))(tsx@4.19.4)(typescript@5.8.2)(vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(yaml@2.8.0) - '@angular/build': 20.0.5(hwkkgkqv5bnzzempybnrx5sqsq) + '@angular/build': 20.0.5(adc485a213f91c05bfbb1034a9c0520e) - '@analogjs/vitest-angular@1.19.0(@analogjs/vite-plugin-angular@1.17.1(hktgnfkj6jpck5dy63x3zbeziu))(@angular-devkit/architect@0.2000.5(chokidar@4.0.3))(vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': + '@analogjs/vitest-angular@1.19.0(@analogjs/vite-plugin-angular@1.17.1(daa254f2130e13b71188b1fb05418dd5))(@angular-devkit/architect@0.2000.5(chokidar@4.0.3))(vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - '@analogjs/vite-plugin-angular': 1.17.1(hktgnfkj6jpck5dy63x3zbeziu) + '@analogjs/vite-plugin-angular': 1.17.1(daa254f2130e13b71188b1fb05418dd5) '@angular-devkit/architect': 0.2000.5(chokidar@4.0.3) - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) '@angular-devkit/architect@0.2000.5(chokidar@4.0.3)': dependencies: @@ -11299,13 +11461,13 @@ snapshots: transitivePeerDependencies: - chokidar - ? '@angular-devkit/build-angular@20.0.5(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(@angular/compiler@20.0.6)(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.0.6(@angular/animations@20.0.6(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@swc/core@1.12.1)(@types/node@24.1.0)(chokidar@4.0.3)(jiti@2.4.2)(ng-packagr@20.0.1(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(tslib@2.8.1)(typescript@5.8.2))(tsx@4.19.4)(typescript@5.8.2)(vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(yaml@2.8.0)' - : dependencies: + '@angular-devkit/build-angular@20.0.5(454e04673bed95c3d186db30149c134f)': + dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2000.5(chokidar@4.0.3) '@angular-devkit/build-webpack': 0.2000.5(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.99.8(@swc/core@1.12.1)(esbuild@0.25.5)))(webpack@5.99.8(@swc/core@1.12.1)(esbuild@0.25.5)) '@angular-devkit/core': 20.0.5(chokidar@4.0.3) - '@angular/build': 20.0.5(6mrzl7z5ywd2pbs5xvufr2guse) + '@angular/build': 20.0.5(ab08a5d67142ee74cb28c7ed009213e5) '@angular/compiler-cli': 20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2) '@babel/core': 7.27.1 '@babel/generator': 7.27.1 @@ -11384,15 +11546,14 @@ snapshots: - vitest - webpack-cli - yaml - optional: true - '@angular-devkit/build-angular@20.0.5(ihmsye2bouaxe4zli4d5fzwduq)': + '@angular-devkit/build-angular@20.0.5(76ecc4c34b81a4060af826234478a183)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2000.5(chokidar@4.0.3) '@angular-devkit/build-webpack': 0.2000.5(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.99.8(@swc/core@1.12.1)(esbuild@0.25.5)))(webpack@5.99.8(@swc/core@1.12.1)(esbuild@0.25.5)) '@angular-devkit/core': 20.0.5(chokidar@4.0.3) - '@angular/build': 20.0.5(6mrzl7z5ywd2pbs5xvufr2guse) + '@angular/build': 20.0.5(c8c0d9e035ff0b13e082888640848146) '@angular/compiler-cli': 20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2) '@babel/core': 7.27.1 '@babel/generator': 7.27.1 @@ -11472,13 +11633,13 @@ snapshots: - webpack-cli - yaml - '@angular-devkit/build-angular@20.0.5(nfnantpvxxnln3gt24dyppef6e)': - dependencies: + ? '@angular-devkit/build-angular@20.0.5(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(@angular/compiler@20.0.6)(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(@angular/platform-browser@20.0.6(@angular/animations@20.0.6(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1)))(@swc/core@1.12.1)(@types/node@24.1.0)(chokidar@4.0.3)(jiti@2.4.2)(ng-packagr@20.0.1(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(tslib@2.8.1)(typescript@5.8.2))(tsx@4.19.4)(typescript@5.8.2)(vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(yaml@2.8.0)' + : dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2000.5(chokidar@4.0.3) '@angular-devkit/build-webpack': 0.2000.5(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.99.8(@swc/core@1.12.1)(esbuild@0.25.5)))(webpack@5.99.8(@swc/core@1.12.1)(esbuild@0.25.5)) '@angular-devkit/core': 20.0.5(chokidar@4.0.3) - '@angular/build': 20.0.5(qrp3qr5lauwc4sbzayitwm7324) + '@angular/build': 20.0.5(ab08a5d67142ee74cb28c7ed009213e5) '@angular/compiler-cli': 20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2) '@babel/core': 7.27.1 '@babel/generator': 7.27.1 @@ -11557,6 +11718,7 @@ snapshots: - vitest - webpack-cli - yaml + optional: true '@angular-devkit/build-webpack@0.2000.5(chokidar@4.0.3)(webpack-dev-server@5.2.1(webpack@5.99.8(@swc/core@1.12.1)(esbuild@0.25.5)))(webpack@5.99.8(@swc/core@1.12.1)(esbuild@0.25.5))': dependencies: @@ -11594,7 +11756,7 @@ snapshots: '@angular/core': 20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1) tslib: 2.8.1 - '@angular/build@20.0.5(6mrzl7z5ywd2pbs5xvufr2guse)': + '@angular/build@20.0.5(ab08a5d67142ee74cb28c7ed009213e5)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2000.5(chokidar@4.0.3) @@ -11624,7 +11786,7 @@ snapshots: tinyglobby: 0.2.13 tslib: 2.8.1 typescript: 5.8.2 - vite: 6.3.5(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(sugarss@4.0.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) watchpack: 2.4.2 optionalDependencies: '@angular/core': 20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1) @@ -11633,7 +11795,7 @@ snapshots: lmdb: 3.3.0 ng-packagr: 20.0.1(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(tslib@2.8.1)(typescript@5.8.2) postcss: 8.5.3 - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - chokidar @@ -11647,7 +11809,7 @@ snapshots: - tsx - yaml - '@angular/build@20.0.5(hwkkgkqv5bnzzempybnrx5sqsq)': + '@angular/build@20.0.5(adc485a213f91c05bfbb1034a9c0520e)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2000.5(chokidar@4.0.3) @@ -11685,7 +11847,8 @@ snapshots: less: 4.3.0 lmdb: 3.3.0 ng-packagr: 20.0.1(@angular/compiler-cli@20.0.6(@angular/compiler@20.0.6)(typescript@5.8.2))(tslib@2.8.1)(typescript@5.8.2) - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + postcss: 8.5.6 + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - chokidar @@ -11700,7 +11863,7 @@ snapshots: - yaml optional: true - '@angular/build@20.0.5(qrp3qr5lauwc4sbzayitwm7324)': + '@angular/build@20.0.5(c8c0d9e035ff0b13e082888640848146)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2000.5(chokidar@4.0.3) @@ -14442,12 +14605,12 @@ snapshots: tar-fs: 2.1.3 tsconfig-paths: 4.2.0 valibot: 0.41.0(typescript@5.8.2) - vite-node: 3.2.3(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.3(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) ws: 7.5.10 optionalDependencies: '@remix-run/serve': 2.16.8(typescript@5.8.2) typescript: 5.8.2 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -14837,6 +15000,27 @@ snapshots: '@sindresorhus/merge-streams@2.3.0': {} + '@solid-primitives/event-listener@2.4.3(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/keyboard@1.3.3(solid-js@1.9.7)': + dependencies: + '@solid-primitives/event-listener': 2.4.3(solid-js@1.9.7) + '@solid-primitives/rootless': 1.5.2(solid-js@1.9.7) + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/rootless@1.5.2(solid-js@1.9.7)': + dependencies: + '@solid-primitives/utils': 6.3.2(solid-js@1.9.7) + solid-js: 1.9.7 + + '@solid-primitives/utils@6.3.2(solid-js@1.9.7)': + dependencies: + solid-js: 1.9.7 + '@solidjs/testing-library@0.8.10(solid-js@1.9.7)': dependencies: '@testing-library/dom': 10.4.0 @@ -14876,7 +15060,7 @@ snapshots: '@sveltejs/vite-plugin-svelte': 5.1.0(svelte@5.34.3)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) debug: 4.4.1 svelte: 5.34.3 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -14888,7 +15072,7 @@ snapshots: kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.34.3 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vitefu: 1.0.6(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) transitivePeerDependencies: - supports-color @@ -14972,6 +15156,36 @@ snapshots: - typescript - vite + '@tanstack/devtools-event-bus@0.2.2': + dependencies: + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - utf-8-validate + + '@tanstack/devtools-event-client@0.2.2': {} + + '@tanstack/devtools-ui@0.3.1(csstype@3.1.3)(solid-js@1.9.7)': + dependencies: + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.7 + transitivePeerDependencies: + - csstype + + '@tanstack/devtools@0.4.2(csstype@3.1.3)(solid-js@1.9.7)': + dependencies: + '@solid-primitives/keyboard': 1.3.3(solid-js@1.9.7) + '@tanstack/devtools-event-bus': 0.2.2 + '@tanstack/devtools-ui': 0.3.1(csstype@3.1.3)(solid-js@1.9.7) + clsx: 2.1.1 + goober: 2.1.16(csstype@3.1.3) + solid-js: 1.9.7 + transitivePeerDependencies: + - bufferutil + - csstype + - utf-8-validate + '@tanstack/directive-functions-plugin@1.129.7(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@babel/code-frame': 7.27.1 @@ -14981,7 +15195,7 @@ snapshots: '@tanstack/router-utils': 1.129.7 babel-dead-code-elimination: 1.0.10 tiny-invariant: 1.3.3 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -15017,6 +15231,19 @@ snapshots: '@tanstack/query-core@5.80.7': {} + '@tanstack/react-devtools@0.4.3(@types/react-dom@19.1.5(@types/react@19.1.6))(@types/react@19.1.6)(csstype@3.1.3)(react-dom@19.1.0(react@19.1.0))(react@19.1.0)(solid-js@1.9.7)': + dependencies: + '@tanstack/devtools': 0.4.2(csstype@3.1.3)(solid-js@1.9.7) + '@types/react': 19.1.6 + '@types/react-dom': 19.1.5(@types/react@19.1.6) + react: 19.1.0 + react-dom: 19.1.0(react@19.1.0) + transitivePeerDependencies: + - bufferutil + - csstype + - solid-js + - utf-8-validate + '@tanstack/react-query@5.80.7(react@19.1.0)': dependencies: '@tanstack/query-core': 5.80.7 @@ -15049,7 +15276,7 @@ snapshots: '@tanstack/start-plugin-core': 1.130.10(@tanstack/react-router@1.130.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0))(encoding@0.1.13)(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)))(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(webpack@5.99.8(@swc/core@1.12.1)) '@vitejs/plugin-react': 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) pathe: 2.0.3 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -15105,7 +15332,7 @@ snapshots: '@vitejs/plugin-react': 4.5.2(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) react: 19.1.0 react-dom: 19.1.0(react@19.1.0) - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -15186,7 +15413,7 @@ snapshots: zod: 3.25.76 optionalDependencies: '@tanstack/react-router': 1.130.10(react-dom@19.1.0(react@19.1.0))(react@19.1.0) - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) webpack: 5.99.8(@swc/core@1.12.1)(esbuild@0.25.5) transitivePeerDependencies: @@ -15251,7 +15478,7 @@ snapshots: nitropack: 2.11.12(encoding@0.1.13) pathe: 2.0.3 ufo: 1.6.1 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vitefu: 1.1.1(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) xmlbuilder2: 3.1.1 zod: 3.25.76 @@ -15360,7 +15587,7 @@ snapshots: vue: 3.5.16(typescript@5.8.3) vue-demi: 0.14.10(vue@3.5.16(typescript@5.8.3)) - '@testing-library/angular@17.4.0(et63vsrkp2gh7imm5w2nfv6y4q)': + '@testing-library/angular@17.4.0(17cd88c55c4aad4a6f5d297438ec4b45)': dependencies: '@angular/animations': 20.0.6(@angular/common@20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2))(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1)) '@angular/common': 20.0.6(@angular/core@20.0.6(@angular/compiler@20.0.6)(rxjs@7.8.2)(zone.js@0.15.1))(rxjs@7.8.2) @@ -15417,8 +15644,8 @@ snapshots: '@testing-library/dom': 10.4.0 svelte: 5.34.3 optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)': dependencies: @@ -15967,7 +16194,7 @@ snapshots: '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0))': dependencies: - vite: 6.3.5(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(sugarss@4.0.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) + vite: 6.3.5(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) '@vitejs/plugin-basic-ssl@2.0.0(vite@6.3.5(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: @@ -15978,7 +16205,7 @@ snapshots: dependencies: '@rolldown/pluginutils': 1.0.0-beta.11 '@swc/core': 1.12.1 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@swc/helpers' @@ -15990,18 +16217,18 @@ snapshots: '@rolldown/pluginutils': 1.0.0-beta.11 '@types/babel__core': 7.20.5 react-refresh: 0.17.0 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color '@vitejs/plugin-vue@5.2.4(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.2))': dependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vue: 3.5.16(typescript@5.8.2) '@vitejs/plugin-vue@5.2.4(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))(vue@3.5.16(typescript@5.8.3))': dependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vue: 3.5.16(typescript@5.8.3) '@vitest/coverage-istanbul@3.2.3(vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': @@ -16016,7 +16243,7 @@ snapshots: magicast: 0.3.5 test-exclude: 7.0.1 tinyrainbow: 2.0.0 - vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vitest: 3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color @@ -16037,13 +16264,13 @@ snapshots: vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0) optional: true - '@vitest/mocker@3.2.3(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': + '@vitest/mocker@3.2.3(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.3 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) '@vitest/pretty-format@3.2.3': dependencies: @@ -17167,6 +17394,8 @@ snapshots: whatwg-mimetype: 4.0.0 whatwg-url: 14.2.0 + dayjs@1.11.13: {} + db0@0.3.2: {} de-indent@1.0.2: {} @@ -18372,6 +18601,10 @@ snapshots: dependencies: minimist: 1.2.8 + goober@2.1.16(csstype@3.1.3): + dependencies: + csstype: 3.1.3 + gopd@1.2.0: {} graceful-fs@4.2.11: {} @@ -21860,6 +22093,11 @@ snapshots: dependencies: postcss: 8.5.5 + sugarss@4.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + optional: true + supports-color@10.0.0: {} supports-color@7.2.0: @@ -22555,13 +22793,13 @@ snapshots: - yaml optional: true - vite-node@3.2.3(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): + vite-node@3.2.3(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -22589,7 +22827,7 @@ snapshots: magic-string: 0.30.17 typescript: 5.8.2 optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - rollup @@ -22597,7 +22835,7 @@ snapshots: vite-plugin-externalize-deps@0.9.0(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): dependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.6.3)(solid-js@1.9.7)(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): dependencies: @@ -22607,7 +22845,7 @@ snapshots: merge-anything: 5.1.7 solid-js: 1.9.7 solid-refresh: 0.6.3(solid-js@1.9.7) - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vitefu: 1.0.6(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) optionalDependencies: '@testing-library/jest-dom': 6.6.3 @@ -22620,7 +22858,7 @@ snapshots: globrex: 0.1.2 tsconfck: 3.1.6(typescript@5.8.2) optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) transitivePeerDependencies: - supports-color - typescript @@ -22656,7 +22894,7 @@ snapshots: tsx: 4.19.4 yaml: 2.8.0 - vite@6.3.5(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(sugarss@4.0.1)(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): + vite@6.3.5(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.88.0)(sugarss@4.0.1(postcss@8.5.6))(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.5(picomatch@4.0.2) @@ -22670,7 +22908,7 @@ snapshots: jiti: 2.4.2 less: 4.3.0 sass: 1.88.0 - sugarss: 4.0.1(postcss@8.5.5) + sugarss: 4.0.1(postcss@8.5.6) terser: 5.39.1 tsx: 4.19.4 yaml: 2.8.0 @@ -22714,7 +22952,7 @@ snapshots: yaml: 2.8.0 optional: true - vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): + vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.6(picomatch@4.0.3) @@ -22728,18 +22966,18 @@ snapshots: jiti: 2.4.2 less: 4.3.0 sass: 1.89.1 - sugarss: 4.0.1(postcss@8.5.5) + sugarss: 4.0.1(postcss@8.5.6) terser: 5.40.0 tsx: 4.19.4 yaml: 2.8.0 vitefu@1.0.6(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vitefu@1.1.1(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)): optionalDependencies: - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.88.0)(sugarss@4.0.1(postcss@8.5.3))(terser@5.39.1)(tsx@4.19.4)(yaml@2.8.0): dependencies: @@ -22785,11 +23023,11 @@ snapshots: - yaml optional: true - vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): + vitest@3.2.3(@types/debug@4.1.12)(@types/node@24.1.0)(jiti@2.4.2)(jsdom@26.1.0)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.3 - '@vitest/mocker': 3.2.3(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) + '@vitest/mocker': 3.2.3(vite@7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.3 '@vitest/runner': 3.2.3 '@vitest/snapshot': 3.2.3 @@ -22807,8 +23045,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.0 tinyrainbow: 2.0.0 - vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) - vite-node: 3.2.3(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1)(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite: 7.0.6(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) + vite-node: 3.2.3(@types/node@24.1.0)(jiti@2.4.2)(less@4.3.0)(sass@1.89.1)(sugarss@4.0.1(postcss@8.5.6))(terser@5.40.0)(tsx@4.19.4)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -23133,6 +23371,8 @@ snapshots: ws@8.18.2: {} + ws@8.18.3: {} + xml-name-validator@5.0.0: {} xmlbuilder2@3.1.1: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 47d0b79bc..46341e623 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ +//: https://github.com/jsdom/cssstyle/issues/182 packages: - 'packages/**' - 'examples/angular/**' @@ -6,3 +7,219 @@ packages: - 'examples/vue/**' - 'examples/lit/**' - 'examples/svelte/**' +catalog: + '@analogjs/vite-plugin-angular': ^1.17.1 + '@analogjs/vitest-angular': ^1.17.1 + '@angular/common': ^20.0.0 + '@angular/compiler': ^20.0.0 + '@angular/compiler-cli': ^20.0.0 + '@angular/core': ^20.0.0 + '@angular/platform-browser': ^20.0.0 + '@angular/platform-browser-dynamic': ^20.0.0 + '@eslint-react/eslint-plugin': ^1.52.2 + '@solidjs/testing-library': ^0.8.10 + '@sveltejs/package': ^2.3.11 + '@sveltejs/vite-plugin-svelte': ^5.1.0 + '@tanstack/config': 0.20.0 + '@tanstack/devtools': 0.1.1 + '@tanstack/devtools-event-': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-bus-plugin@11 + '@tanstack/devtools-event-c': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client + '@tanstack/devtools-event-cl': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client + '@tanstack/devtools-event-cli': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client + '@tanstack/devtools-event-clie': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client + '@tanstack/devtools-event-clien': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client + '@tanstack/devtools-event-client': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client + '@tanstack/devtools-ui': ^0.3.1 + '@tanstack/react--devtools': 0.2.0 + '@tanstack/react-devtools': https://pkg.pr.new/TanStack/devtools/@tanstack/react-devtools@11 + '@tanstack/react-form': ^1.17.0 + '@tanstack/react-form-devtools': 0.2.0 + '@tanstack/react-start': ^1.130.10 + '@tanstack/react-store': ^0.7.3 + '@tanstack/solid-store': ^0.7.3 + '@tanstack/store': ^0.7.2 + '@tanstack/svelte-store': ^0.7.3 + '@testing-library/angular': ^17.4.0 + '@testing-library/jest-dom': ^6.6.3 + '@testing-library/react': ^16.3.0 + '@testing-library/svelte': ^5.2.8 + '@testing-library/user-event': ^14.6.1 + '@testing-library/vue': ^8.1.0 + '@types/node': ^24.1.0 + '@types/react': ^19.0.7 + '@types/react-dom': ^19.0.3 + '@vitejs/plugin-react': ^4.5.2 + '@vitest/coverage-istanbul': ^3.2.3 + arktype: ^2.1.20 + babel-plugin-react-compiler: 19.0.0-beta-ebf51a3-20250411 + clsx: ^2.1.1 + dayjs: ^1.11.13 + decode-formdata: ^0.9.0 + devalue: ^5.1.1 + eslint: 9.32.0 + eslint-plugin-react-compiler: 19.0.0-beta-ebf51a3-20250411 + eslint-plugin-react-hooks: ^5.2.0 + goober: ^2.1.16 + jsdom: ^26.1.0 + knip: ^5.61.0 + lit: ^3.3.0 + markdown-link-extractor: ^4.0.2 + ng-packagr: ^20.0.0 + nx: 21.3.11 + premove: ^4.0.0 + prettier: ^3.6.2 + publint: ^0.3.12 + react: ^19.0.0 + react-dom: ^19.0.0 + sherif: ^1.5.0 + solid-js: ^1.9.7 + svelte: ^5.34.3 + svelte-check: ^4.2.1 + tinyglobby: ^0.2.14 + tslib: ^2.8.1 + typescript: 5.8.2 + typescript54: npm:typescript@5.8.3 + typescript55: npm:typescript@5.8.3 + typescript56: npm:typescript@5.8.3 + typescript57: npm:typescript@5.8.3 + valibot: ^1.1.0 + vite: ^7.0.6 + vite-plugin-solid: ^2.11.6 + vite-tsconfig-paths: ^5.1.4 + vitest: ^3.2.3 + zod: ^3.25.76 + zone.js: 0.15.1 +catalogs: + conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event1 + conflicts_conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event + conflicts_conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventm: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event- + conflicts_conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmc: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-c + conflicts_conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmcl: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-cl + conflicts_conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmcli: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-cli + conflicts_conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclie: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-clie + conflicts_conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclien: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-clien + conflicts_conflicts_@tanstack/devtools-event-bus-plugin_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmevent1_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclient: + '@tanstack/devtools-event-bus-plugin': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client + conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11: + '@tanstack/devtools-event-client': https://pkg.pr.new/TanStack/devtools/@tanstack/devtools-event-client@11 + conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b: + '@tanstack/react-devtools': https://pkg.pr.new/TanStack/devtools/@tanstack/react-devtools@0a0219b + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_: + '@tanstack/react-devtools': '' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_a: + '@tanstack/react-devtools': '@' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_at: + '@tanstack/react-devtools': '@t' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_ata: + '@tanstack/react-devtools': '@ta' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atan: + '@tanstack/react-devtools': '@tan' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atans: + '@tanstack/react-devtools': '@tans' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanst: + '@tanstack/react-devtools': '@tanst' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atansta: + '@tanstack/react-devtools': '@tansta' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstac: + '@tanstack/react-devtools': '@tanstac' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstacl: + '@tanstack/react-devtools': '@tanstacl' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack: + '@tanstack/react-devtools': '@tanstack' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/: + '@tanstack/react-devtools': '@tanstack/' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/r: + '@tanstack/react-devtools': '@tanstack/r' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/re: + '@tanstack/react-devtools': '@tanstack/re' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/rea: + '@tanstack/react-devtools': '@tanstack/rea' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reac: + '@tanstack/react-devtools': '@tanstack/reac' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/react: + '@tanstack/react-devtools': '@tanstack/react' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactm: + '@tanstack/react-devtools': '@tanstack/react-' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactmd: + '@tanstack/react-devtools': '@tanstack/react-d' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactmde: + '@tanstack/react-devtools': '@tanstack/react-de' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactmdev: + '@tanstack/react-devtools': '@tanstack/react-dev' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactmdevt: + '@tanstack/react-devtools': '@tanstack/react-devt' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactmdevto: + '@tanstack/react-devtools': '@tanstack/react-devto' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactmdevtoo: + '@tanstack/react-devtools': '@tanstack/react-devtoo' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactmdevtool: + '@tanstack/react-devtools': '@tanstack/react-devtool' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_atanstack/reactmdevtools: + '@tanstack/react-devtools': '@tanstack/react-devtools' + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_tanstack/devtoolsmeventmclienta11: + '@tanstack/devtools-event-client': tanstack/devtools-event-client@11 + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_tanstack/devtoolsmeventmclienta1: + '@tanstack/devtools-event-client': tanstack/devtools-event-client@1 + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_tanstack/devtoolsmeventmclienta: + '@tanstack/devtools-event-client': tanstack/devtools-event-client@ + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_tanstack/devtoolsmeventmclient: + '@tanstack/devtools-event-client': tanstack/devtools-event-client + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_atanstack/devtoolsmeventmclient: + '@tanstack/devtools-event-client': '@tanstack/devtools-event-client' + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_:atanstack/reactmdevtools: + '@tanstack/react-devtools': :@tanstack/react-devtools + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_filatanstack/reactmdevtools: + '@tanstack/react-devtools': fil@tanstack/react-devtools + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_fiatanstack/reactmdevtools: + '@tanstack/react-devtools': fi@tanstack/react-devtools + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_fatanstack/reactmdevtools: + '@tanstack/react-devtools': f@tanstack/react-devtools + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_ile:atanstack/reactmdevtools: + '@tanstack/react-devtools': ile:@tanstack/react-devtools + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_ileatanstack/reactmdevtools: + '@tanstack/react-devtools': ile@tanstack/react-devtools + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_ilatanstack/reactmdevtools: + '@tanstack/react-devtools': il@tanstack/react-devtools + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_iatanstack/reactmdevtools: + '@tanstack/react-devtools': i@tanstack/react-devtools + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_0_2_0: + '@tanstack/react-devtools': 0.2.0 + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_: + '@tanstack/devtools-event-client': '' + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_0_2_0: + '@tanstack/devtools-event-client': 0.2.0 + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_h0_2_0: + '@tanstack/devtools-event-client': ^0.2.0 + conflicts_@tanstack/react-form-devtools_h1_17_0: + '@tanstack/react-form-devtools': ^1.17.0 + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_w: + '@tanstack/react-devtools': w + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_wo: + '@tanstack/react-devtools': wo + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_wor: + '@tanstack/react-devtools': wor + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_work: + '@tanstack/react-devtools': work + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_worka: + '@tanstack/react-devtools': worka + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_workap: + '@tanstack/react-devtools': workap + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_workaps: + '@tanstack/react-devtools': workaps + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_workapc: + '@tanstack/react-devtools': workapc + conflicts_conflicts_@tanstack/react-devtools_https://pkg_pr_new/TanStack/devtools/atanstack/reactmdevtoolsa0a0219b_0_4_3: + '@tanstack/react-devtools': 0.4.3 + conflicts_conflicts_@tanstack/devtools-event-client_https://pkg_pr_new/TanStack/devtools/atanstack/devtoolsmeventmclienta11_h0_2_2: + '@tanstack/devtools-event-client': ^0.2.2 +overrides: + cssstyle: 4.4.0