diff --git a/common/shared/vite/data.ts b/common/shared/vite/data.ts index 4bc747be80..91dda4a10f 100644 --- a/common/shared/vite/data.ts +++ b/common/shared/vite/data.ts @@ -48,7 +48,7 @@ export const peerDepsMap = { '@wendellhu/redi': { global: '@wendellhu/redi', name: '@wendellhu/redi', - version: '1.0.1', + version: '1.1.0', }, '@wendellhu/redi/react-bindings': { global: '@wendellhu/redi/react-bindings', diff --git a/package.json b/package.json index dae05cdd23..4573cfdec6 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "@antfu/eslint-config": "^6.7.3", "@commitlint/cli": "^20.2.0", "@commitlint/config-conventional": "^20.2.0", - "@eslint-react/eslint-plugin": "^2.4.0", + "@eslint-react/eslint-plugin": "^2.5.0", "@playwright/test": "^1.57.0", "@release-it-plugins/workspaces": "^5.0.3", "@release-it/conventional-changelog": "^10.0.4", @@ -67,7 +67,7 @@ "fs-extra": "^11.3.3", "husky": "^9.1.7", "lint-staged": "^16.2.7", - "posthog-node": "^5.18.0", + "posthog-node": "^5.18.1", "react": "19.2.3", "react-dom": "19.2.3", "release-it": "^19.2.2", diff --git a/packages/core/package.json b/packages/core/package.json index 3a389fe384..e0acf43d70 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -69,13 +69,13 @@ "build": "univer-cli build" }, "peerDependencies": { - "@wendellhu/redi": "1.0.1", + "@wendellhu/redi": "1.1.0", "rxjs": ">=7.0.0" }, "dependencies": { "@univerjs/protocol": "0.1.48", "@univerjs/themes": "workspace:*", - "@wendellhu/redi": "1.0.1", + "@wendellhu/redi": "1.1.0", "async-lock": "^1.4.1", "dayjs": "^1.11.19", "fast-diff": "1.3.0", diff --git a/packages/design/src/components/gradient-color-picker/GradientColorPicker.stories.tsx b/packages/design/src/components/gradient-color-picker/GradientColorPicker.stories.tsx new file mode 100644 index 0000000000..45544c12ae --- /dev/null +++ b/packages/design/src/components/gradient-color-picker/GradientColorPicker.stories.tsx @@ -0,0 +1,53 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import type { Meta } from '@storybook/react'; +import type { IGradientValue } from './GradientColorPicker'; +import { useState } from 'react'; +import { GradientColorPicker } from './GradientColorPicker'; + +const meta: Meta = { + title: 'Components / GradientColorPicker', + component: GradientColorPicker, + parameters: { + layout: 'centered', + }, + tags: ['autodocs'], +}; + +export default meta; + +export const Playground = { + render() { + const [value, setValue] = useState({ + type: 'linear', + stops: [ + { color: '#409eff', offset: 0 }, + { color: '#67c23a', offset: 100 }, + ], + angle: 90, + }); + + return ( +
+
+ {JSON.stringify(value, null, 2)} +
+ +
+ ); + }, +}; diff --git a/packages/design/src/components/gradient-color-picker/GradientColorPicker.tsx b/packages/design/src/components/gradient-color-picker/GradientColorPicker.tsx new file mode 100644 index 0000000000..6e19e719b2 --- /dev/null +++ b/packages/design/src/components/gradient-color-picker/GradientColorPicker.tsx @@ -0,0 +1,269 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { DeleteIcon } from '@univerjs/icons'; +import { useContext, useMemo, useRef, useState } from 'react'; +import { clsx } from '../../helper/clsx'; +import { Button } from '../button/Button'; +import { ColorPicker } from '../color-picker/ColorPicker'; +import { ConfigContext } from '../config-provider/ConfigProvider'; +import { InputNumber } from '../input-number/InputNumber'; +import { Segmented } from '../segmented/Segmented'; +import { Tooltip } from '../tooltip/Tooltip'; + +export type GradientType = 'linear' | 'radial' | 'angular' | 'diamond'; + +export interface IGradientStop { + color: string; + offset: number; +} + +export interface IGradientValue { + type: GradientType; + stops: IGradientStop[]; + angle?: number; +} + +export interface IGradientColorPickerProps { + className?: string; + value?: IGradientValue; + onChange?: (value: IGradientValue) => void; +} + +const DEFAULT_VALUE: IGradientValue = { + type: 'linear', + stops: [ + { color: '#ffffff', offset: 0 }, + { color: '#000000', offset: 100 }, + ], + angle: 90, +}; + +export function GradientColorPicker(props: IGradientColorPickerProps) { + const { className, value = DEFAULT_VALUE, onChange } = props; + const { locale } = useContext(ConfigContext); + const [selectedIndex, setSelectedIndex] = useState(0); + const barRef = useRef(null); + + const stops = useMemo(() => { + return [...value.stops].sort((a, b) => a.offset - b.offset); + }, [value.stops]); + + const handleTypeChange = (type: GradientType) => { + onChange?.({ ...value, type }); + }; + + const handleAngleChange = (angle: number | null) => { + onChange?.({ ...value, angle: angle ?? 0 }); + }; + + const handleStopColorChange = (color: string) => { + const newStops = [...value.stops]; + newStops[selectedIndex] = { ...newStops[selectedIndex], color }; + onChange?.({ ...value, stops: newStops }); + }; + + const handleStopOffsetChange = (offset: number | null) => { + if (offset === null) return; + const newStops = [...value.stops]; + newStops[selectedIndex] = { ...newStops[selectedIndex], offset }; + onChange?.({ ...value, stops: newStops }); + }; + + // const handleFlip = () => { + // const newStops = value.stops.map((stop) => ({ + // ...stop, + // offset: 100 - stop.offset, + // })); + // onChange?.({ ...value, stops: newStops }); + // }; + + const handleAddStop = (e: React.MouseEvent) => { + if (!barRef.current) return; + const rect = barRef.current.getBoundingClientRect(); + const offset = Math.round(((e.clientX - rect.left) / rect.width) * 100); + + // Find color at this offset (simple linear interpolation) + const leftStop = [...stops].reverse().find((s) => s.offset <= offset) || stops[0]; + // const rightStop = stops.find((s) => s.offset >= offset) || stops[stops.length - 1]; + + const newStop = { color: leftStop.color, offset }; + const newStops = [...value.stops, newStop]; + onChange?.({ ...value, stops: newStops }); + setSelectedIndex(newStops.length - 1); + }; + + const handleRemoveStop = () => { + if (value.stops.length <= 2) return; + const newStops = value.stops.filter((_, i) => i !== selectedIndex); + onChange?.({ ...value, stops: newStops }); + setSelectedIndex(0); + }; + + const gradientPreview = useMemo(() => { + const stopsStr = stops.map((s) => `${s.color} ${s.offset}%`).join(', '); + return `linear-gradient(to right, ${stopsStr})`; + }, [stops]); + + const mainPreview = useMemo(() => { + const stopsStr = stops.map((s) => `${s.color} ${s.offset}%`).join(', '); + switch (value.type) { + case 'linear': + return `linear-gradient(${value.angle}deg, ${stopsStr})`; + case 'radial': + return `radial-gradient(circle, ${stopsStr})`; + case 'angular': + return `conic-gradient(from ${value.angle}deg, ${stopsStr})`; + case 'diamond': + // Diamond is tricky in CSS, using a placeholder or approximation + return `radial-gradient(circle, ${stopsStr})`; + default: + return `linear-gradient(${value.angle}deg, ${stopsStr})`; + } + }, [value, stops]); + + return ( +
+ handleTypeChange(v as GradientType)} + /> + +
+ +
+
+ {value.stops.map((stop, index) => ( +
{ + e.stopPropagation(); + setSelectedIndex(index); + }} + onPointerDown={(e) => { + const startX = e.clientX; + const startOffset = stop.offset; + + const handlePointerMove = (moveEvent: PointerEvent) => { + if (!barRef.current) return; + const rect = barRef.current.getBoundingClientRect(); + const deltaX = moveEvent.clientX - startX; + const deltaOffset = (deltaX / rect.width) * 100; + const newOffset = Math.max(0, Math.min(100, Math.round(startOffset + deltaOffset))); + + const newStops = [...value.stops]; + newStops[index] = { ...newStops[index], offset: newOffset }; + onChange?.({ ...value, stops: newStops }); + }; + + const handlePointerUp = () => { + window.removeEventListener('pointermove', handlePointerMove); + window.removeEventListener('pointerup', handlePointerUp); + }; + + window.addEventListener('pointermove', handlePointerMove); + window.addEventListener('pointerup', handlePointerUp); + }} + /> + ))} +
+ +
+
+
{locale?.GradientColorPicker.offset}
+ +
+ {(value.type === 'linear' || value.type === 'angular') && ( +
+
{locale?.GradientColorPicker.angle}
+ +
+ )} +
+ + + +
+
+ +
+ +
+
+ ); +} diff --git a/packages/design/src/components/gradient-color-picker/__tests__/index.spec.tsx b/packages/design/src/components/gradient-color-picker/__tests__/index.spec.tsx new file mode 100644 index 0000000000..457fdbc51c --- /dev/null +++ b/packages/design/src/components/gradient-color-picker/__tests__/index.spec.tsx @@ -0,0 +1,162 @@ +/** + * Copyright 2023-present DreamNum Co., Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @vitest-environment jsdom + */ + +import type { IGradientValue } from '../GradientColorPicker'; +import { cleanup, fireEvent, render } from '@testing-library/react'; +import { afterEach, describe, expect, it, vi } from 'vitest'; +import { GradientColorPicker } from '../GradientColorPicker'; +import '@testing-library/jest-dom/vitest'; + +afterEach(cleanup); + +const defaultValue: IGradientValue = { + type: 'linear', + stops: [ + { color: '#ffffff', offset: 0 }, + { color: '#000000', offset: 100 }, + ], + angle: 90, +}; + +describe('GradientColorPicker', () => { + it('renders correctly', () => { + const { container } = render(); + expect(container).toBeDefined(); + // Check if segmented items are rendered - they are buttons inside the segmented container + const segmented = container.querySelector('[data-u-comp="segmented"]'); + expect(segmented?.querySelectorAll('button').length).toBe(4); + }); + + it('should call onChange when type changes', () => { + const onChange = vi.fn(); + const { container } = render(); + + const segmented = container.querySelector('[data-u-comp="segmented"]'); + const items = segmented?.querySelectorAll('button'); + // Click 'radial' (index 1) + if (items && items[1]) { + fireEvent.click(items[1]); + } + + expect(onChange).toHaveBeenCalledWith(expect.objectContaining({ + type: 'radial', + })); + }); + + it('should call onChange when offset changes', () => { + const onChange = vi.fn(); + const { container } = render(); + + const inputs = container.querySelectorAll('input'); + const offsetInput = inputs[0]; // First input is offset + + fireEvent.change(offsetInput, { target: { value: '50' } }); + + expect(onChange).toHaveBeenCalledWith(expect.objectContaining({ + stops: expect.arrayContaining([ + expect.objectContaining({ offset: 50 }), + ]), + })); + }); + + it('should call onChange when angle changes', () => { + const onChange = vi.fn(); + const { container } = render(); + + const inputs = container.querySelectorAll('input'); + const angleInput = inputs[1]; // Second input is angle for linear + + fireEvent.change(angleInput, { target: { value: '180' } }); + + expect(onChange).toHaveBeenCalledWith(expect.objectContaining({ + angle: 180, + })); + }); + + it('should select stop when clicked', () => { + const { container } = render(); + // Find stops by their style (left: 0% or left: 100%) or by their common classes + // The stops have univer-absolute and univer-rounded-full + const stops = container.querySelectorAll('.univer-absolute.univer-rounded-full.univer-border-2'); + + // Click the second stop + fireEvent.click(stops[1]); + + // The second stop should have the selected class (z-10) + expect(stops[1]).toHaveClass('univer-z-10'); + }); + + it('should call onChange when a stop is removed', () => { + const onChange = vi.fn(); + const valueWithThreeStops: IGradientValue = { + ...defaultValue, + stops: [ + { color: '#ffffff', offset: 0 }, + { color: '#ff0000', offset: 50 }, + { color: '#000000', offset: 100 }, + ], + }; + const { container } = render(); + + // Find delete button - it's the one with univer-border-red-500 or similar + const deleteButton = container.querySelector('.univer-border-red-500'); + if (deleteButton) { + fireEvent.click(deleteButton); + } + + expect(onChange).toHaveBeenCalled(); + const calledValue = onChange.mock.calls[0][0] as IGradientValue; + expect(calledValue.stops.length).toBe(2); + }); + + it('should disable delete button when only 2 stops remain', () => { + const { container } = render(); + const deleteButton = container.querySelector('.univer-border-red-500'); + expect(deleteButton).toBeDisabled(); + }); + + it('should call onChange when clicking the bar to add a stop', () => { + const onChange = vi.fn(); + const { container } = render(); + + const bar = container.querySelector('.univer-cursor-crosshair'); + if (bar) { + // Mock getBoundingClientRect for the bar + bar.getBoundingClientRect = vi.fn(() => ({ + left: 0, + width: 100, + top: 0, + height: 10, + bottom: 10, + right: 100, + x: 0, + y: 0, + toJSON: () => {}, + })); + + fireEvent.click(bar, { clientX: 50 }); + } + + expect(onChange).toHaveBeenCalled(); + const calledValue = onChange.mock.calls[0][0] as IGradientValue; + expect(calledValue.stops.length).toBe(3); + expect(calledValue.stops.some((s) => s.offset === 50)).toBe(true); + }); +}); diff --git a/packages/design/src/index.ts b/packages/design/src/index.ts index 59b261f671..a344d3e73d 100644 --- a/packages/design/src/index.ts +++ b/packages/design/src/index.ts @@ -37,6 +37,7 @@ export { DropdownMenu, type IDropdownMenuProps } from './components/dropdown-men export { Dropdown, type IDropdownProps } from './components/dropdown/Dropdown'; export { FormDualColumnLayout, FormLayout, type IFormDualColumnLayoutProps, type IFormLayoutProps } from './components/form-layout'; export { Gallery, type IGalleryProps } from './components/gallery/Gallery'; +export { GradientColorPicker, type GradientType, type IGradientColorPickerProps, type IGradientStop, type IGradientValue } from './components/gradient-color-picker/GradientColorPicker'; export { HoverCard, type IHoverCardProps } from './components/hover-card/HoverCard'; export { type IInputNumberProps, InputNumber } from './components/input-number/InputNumber'; export { type IInputProps, Input } from './components/input/Input'; diff --git a/packages/design/src/locale/ca-ES.ts b/packages/design/src/locale/ca-ES.ts index 3f6548076a..dbd4551524 100644 --- a/packages/design/src/locale/ca-ES.ts +++ b/packages/design/src/locale/ca-ES.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: 'cancel·la', confirm: 'ok', }, + GradientColorPicker: { + linear: 'Lineal', + radial: 'Radial', + angular: 'Angular', + diamond: 'Diamant', + offset: 'Desplaçament', + angle: 'Angle', + flip: 'Girar', + delete: 'Eliminar', + }, }, }; diff --git a/packages/design/src/locale/en-US.ts b/packages/design/src/locale/en-US.ts index b6f578d929..08b21db067 100644 --- a/packages/design/src/locale/en-US.ts +++ b/packages/design/src/locale/en-US.ts @@ -49,6 +49,16 @@ const locale = { cancel: 'cancel', confirm: 'ok', }, + GradientColorPicker: { + linear: 'Linear', + radial: 'Radial', + angular: 'Angular', + diamond: 'Diamond', + offset: 'Offset', + angle: 'Angle', + flip: 'Flip', + delete: 'Delete', + }, }, }; diff --git a/packages/design/src/locale/es-ES.ts b/packages/design/src/locale/es-ES.ts index 0156c5c4de..1ac78c4e96 100644 --- a/packages/design/src/locale/es-ES.ts +++ b/packages/design/src/locale/es-ES.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: 'cancel·la', confirm: 'ok', }, + GradientColorPicker: { + linear: 'Lineal', + radial: 'Radial', + angular: 'Angular', + diamond: 'Diamant', + offset: 'Desplaçament', + angle: 'Angle', + flip: 'Girar', + delete: 'Eliminar', + }, }, }; diff --git a/packages/design/src/locale/fa-IR.ts b/packages/design/src/locale/fa-IR.ts index e2cbbb3c90..3466896c9c 100644 --- a/packages/design/src/locale/fa-IR.ts +++ b/packages/design/src/locale/fa-IR.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: 'لغو', confirm: 'باشه', }, + GradientColorPicker: { + linear: 'خطی', + radial: 'شعاعی', + angular: 'زاویه‌ای', + diamond: 'الماسی', + offset: 'افست', + angle: 'زاویه', + flip: 'برگردان', + delete: 'حذف', + }, }, }; diff --git a/packages/design/src/locale/fr-FR.ts b/packages/design/src/locale/fr-FR.ts index eb856bec2a..40cfe2f511 100644 --- a/packages/design/src/locale/fr-FR.ts +++ b/packages/design/src/locale/fr-FR.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: 'annuler', confirm: 'ok', }, + GradientColorPicker: { + linear: 'Linéaire', + radial: 'Radial', + angular: 'Angulaire', + diamond: 'Diamant', + offset: 'Décalage', + angle: 'Angle', + flip: 'Retourner', + delete: 'Supprimer', + }, }, }; diff --git a/packages/design/src/locale/ja-JP.ts b/packages/design/src/locale/ja-JP.ts index d7f0452df9..57b4f38a8e 100644 --- a/packages/design/src/locale/ja-JP.ts +++ b/packages/design/src/locale/ja-JP.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: 'キャンセル', confirm: '確認', }, + GradientColorPicker: { + linear: '線形', + radial: '円形', + angular: '角度', + diamond: '菱形', + offset: 'オフセット', + angle: '角度', + flip: '反転', + delete: '削除', + }, }, }; diff --git a/packages/design/src/locale/ko-KR.ts b/packages/design/src/locale/ko-KR.ts index 21d02c8da0..7f9b84a2da 100644 --- a/packages/design/src/locale/ko-KR.ts +++ b/packages/design/src/locale/ko-KR.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: '취소', confirm: '확인', }, + GradientColorPicker: { + linear: '선형', + radial: '방사형', + angular: '각도형', + diamond: '다이아몬드형', + offset: '오프셋', + angle: '각도', + flip: '뒤집기', + delete: '삭제', + }, }, }; diff --git a/packages/design/src/locale/ru-RU.ts b/packages/design/src/locale/ru-RU.ts index d8ee51a38c..ab9869ff68 100644 --- a/packages/design/src/locale/ru-RU.ts +++ b/packages/design/src/locale/ru-RU.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: 'отмена', confirm: 'ок', }, + GradientColorPicker: { + linear: 'линейный', + radial: 'радиальный', + angular: 'угловой', + diamond: 'ромбовидный', + offset: 'смещение', + angle: 'угол', + flip: 'перевернуть', + delete: 'удалить', + }, }, }; diff --git a/packages/design/src/locale/vi-VN.ts b/packages/design/src/locale/vi-VN.ts index 87d98842eb..5912d1d404 100644 --- a/packages/design/src/locale/vi-VN.ts +++ b/packages/design/src/locale/vi-VN.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: 'Hủy bỏ', confirm: 'Xác nhận', }, + GradientColorPicker: { + linear: 'Tuyến tính', + radial: 'Tỏa ra', + angular: 'Góc', + diamond: 'Hình thoi', + offset: 'Độ lệch', + angle: 'Góc', + flip: 'Lật', + delete: 'Xóa', + }, }, }; diff --git a/packages/design/src/locale/zh-CN.ts b/packages/design/src/locale/zh-CN.ts index d380289c2e..fcbd8c2df8 100644 --- a/packages/design/src/locale/zh-CN.ts +++ b/packages/design/src/locale/zh-CN.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: '取消', confirm: '确定', }, + GradientColorPicker: { + linear: '线性', + radial: '径向', + angular: '角向', + diamond: '菱形', + offset: '偏移', + angle: '角度', + flip: '翻转', + delete: '删除', + }, }, }; diff --git a/packages/design/src/locale/zh-TW.ts b/packages/design/src/locale/zh-TW.ts index b6a06f4dd3..c27befcefc 100644 --- a/packages/design/src/locale/zh-TW.ts +++ b/packages/design/src/locale/zh-TW.ts @@ -51,6 +51,16 @@ const locale: typeof enUS = { cancel: '取消', confirm: '確定', }, + GradientColorPicker: { + linear: '線性', + radial: '徑向', + angular: '角向', + diamond: '菱形', + offset: '偏移', + angle: '角度', + flip: '翻轉', + delete: '刪除', + }, }, }; diff --git a/packages/ui/package.json b/packages/ui/package.json index f51f30cbf3..d15e551e02 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -84,11 +84,11 @@ "@univerjs/design": "workspace:*", "@univerjs/engine-render": "workspace:*", "@univerjs/icons": "^1.1.0", - "@wendellhu/redi": "1.0.1", + "@wendellhu/redi": "1.1.0", "localforage": "^1.10.0" }, "devDependencies": { - "@testing-library/react": "^16.3.0", + "@testing-library/react": "^16.3.1", "@univerjs-infra/shared": "workspace:*", "@univerjs/themes": "workspace:*", "postcss": "^8.5.6", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea43a25115..99a38188e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -16,7 +16,7 @@ importers: devDependencies: '@antfu/eslint-config': specifier: ^6.7.3 - version: 6.7.3(@eslint-react/eslint-plugin@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.26)(eslint-plugin-format@1.1.0(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-react-refresh@0.4.26(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.16(@types/node@25.0.3)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@27.0.1)(sass@1.87.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) + version: 6.7.3(@eslint-react/eslint-plugin@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.26)(eslint-plugin-format@1.1.0(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-react-refresh@0.4.26(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.16(@types/node@25.0.3)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@27.0.1)(sass@1.87.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2)) '@commitlint/cli': specifier: ^20.2.0 version: 20.2.0(@types/node@25.0.3)(typescript@5.9.3) @@ -24,8 +24,8 @@ importers: specifier: ^20.2.0 version: 20.2.0 '@eslint-react/eslint-plugin': - specifier: ^2.4.0 - version: 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: ^2.5.0 + version: 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) '@playwright/test': specifier: ^1.57.0 version: 1.57.0 @@ -81,8 +81,8 @@ importers: specifier: ^16.2.7 version: 16.2.7 posthog-node: - specifier: ^5.18.0 - version: 5.18.0 + specifier: ^5.18.1 + version: 5.18.1 react: specifier: 19.2.3 version: 19.2.3 @@ -1095,8 +1095,8 @@ importers: specifier: workspace:* version: link:../themes '@wendellhu/redi': - specifier: 1.0.1 - version: 1.0.1(react@19.2.3) + specifier: 1.1.0 + version: 1.1.0(react@19.2.3) async-lock: specifier: ^1.4.1 version: 1.4.1 @@ -3359,15 +3359,15 @@ importers: specifier: ^1.1.0 version: 1.1.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@wendellhu/redi': - specifier: 1.0.1 - version: 1.0.1(react@19.2.3) + specifier: 1.1.0 + version: 1.1.0(react@19.2.3) localforage: specifier: ^1.10.0 version: 1.10.0 devDependencies: '@testing-library/react': - specifier: ^16.3.0 - version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + specifier: ^16.3.1 + version: 16.3.1(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) '@univerjs-infra/shared': specifier: workspace:* version: link:../../common/shared @@ -4377,40 +4377,40 @@ packages: resolution: {integrity: sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint-react/ast@2.4.0': - resolution: {integrity: sha512-xi/uVi4/jaqPDgF9tO4laLAAZLBrKXearHKIAJWmnY+ymu0LBjX8VaLuf6GuUq7ryek5NO2kOZDYNx4C3qV4iw==} + '@eslint-react/ast@2.5.0': + resolution: {integrity: sha512-8XqcwbksSR2ZALbxpUtzBMR1zEkTSACEUVrwQQ9gUMP6jd6q5CSMWMqZzsaWfWI58vHOZ7GFOuJ5alVNjFcJOw==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/core@2.4.0': - resolution: {integrity: sha512-Ibt8NlFhT+FffNKtZmb2xamHEFzwK0AzmmOUGVm/B49B2ShOOR3kQg7ZaVNUR3By0Q0hPlIYnefKH2KgaUJ7jA==} + '@eslint-react/core@2.5.0': + resolution: {integrity: sha512-yJ64p7uLgAjRHcUxdjU0EntCBNHfcl04xqh1QmyV+DXwIsTEti32Dpf6EFrxrcCkyJO2p1lfnP8HJCirS+prFg==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/eff@2.4.0': - resolution: {integrity: sha512-iWB2IaO+ygt8YPGXqUIg3KQmu3GgKecwbHrz0nasEO2BuhR7rAPaBcqnC3s8NvMUicJ/q03yWzfTgMuFST5+jg==} + '@eslint-react/eff@2.5.0': + resolution: {integrity: sha512-UHC5+Lgq2JTSClVJAhVv7gmxXagGiRPJ8Lr6n3UxeU/P6IWLE0VxvMnVa+vt/o8cdnM5HYPiLG5BEpQL2YRxkQ==} engines: {node: '>=20.19.0'} - '@eslint-react/eslint-plugin@2.4.0': - resolution: {integrity: sha512-+d3JGOc+EM80LGO7Ynz8vRRex+xA+ilM0/BDvwHTlvfdNK6GeH8EV7RewAClvGijfkEMxCoehglVRGwjzmoKbw==} + '@eslint-react/eslint-plugin@2.5.0': + resolution: {integrity: sha512-v5Fo5RLjeiEX7aWE5Jr5IY7oMCXKsLkMTGh0s4lxaoabAm83yqiSWF3gaZFiv5p8iNORCEPEusWByVyvC0To0g==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/shared@2.4.0': - resolution: {integrity: sha512-1LYGz8AzAN9knt56h2onTL4beTLxys/KzV+PJwODydAqYKIlWAOtJJK1HLwDrXneiLP8G2mHrt2XwcmrXzzaRw==} + '@eslint-react/shared@2.5.0': + resolution: {integrity: sha512-uNmGPscFfzh6NRxcRMawhAeM9VrvW+jNTH6tTTXMO2egz0CJ6qXxLS3GGe20WfwqSO7fFSGHWtfSmI7/uF/IjA==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - '@eslint-react/var@2.4.0': - resolution: {integrity: sha512-vIVIQfBS8qfzu/AM4/fAek+Qab63MZwintr7gdSOjRy5z/7Kixjzg5Nj1AeW78jBtPrZSDYUpYb8ZXM0mN/Qag==} + '@eslint-react/var@2.5.0': + resolution: {integrity: sha512-ATznXderowGQiji47Xbf1OhT6ZSarUSDULx8sTijTgzudQ6BefGva+wXb+jxM8QzvpBC5s7DnfkhMnO1202mNQ==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -5630,21 +5630,6 @@ packages: resolution: {integrity: sha512-zIcONa+hVtVSSep9UT3jZ5rizo2BsxgyDYU7WFD5eICBE7no3881HGeb/QkGfsJs6JTkY1aQhT7rIPC7e+0nnA==} engines: {node: '>=14', npm: '>=6', yarn: '>=1'} - '@testing-library/react@16.3.0': - resolution: {integrity: sha512-kFSyxiEDwv1WLl2fgsq6pPBbw5aWKrsY2/noi1Id0TK0UParSF62oFQFGHXIyaG4pp2tEub/Zlel+fjjZILDsw==} - engines: {node: '>=18'} - peerDependencies: - '@testing-library/dom': ^10.0.0 - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3 - react: 19.2.3 - react-dom: 19.2.3 - peerDependenciesMeta: - '@types/react': - optional: true - '@types/react-dom': - optional: true - '@testing-library/react@16.3.1': resolution: {integrity: sha512-gr4KtAWqIOQoucWYD/f6ki+j5chXfcPc74Col/6poTyqTmn7zRmodWahWRCp8tYd+GMqBonw6hstNzqjbs6gjw==} engines: {node: '>=18'} @@ -5855,16 +5840,32 @@ packages: peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/project-service@8.51.0': + resolution: {integrity: sha512-Luv/GafO07Z7HpiI7qeEW5NW8HUtZI/fo/kE0YbtQEFpJRUuR0ajcWfCE5bnMvL7QQFrmT/odMe8QZww8X2nfQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/scope-manager@8.50.1': resolution: {integrity: sha512-mfRx06Myt3T4vuoHaKi8ZWNTPdzKPNBhiblze5N50//TSHOAQQevl/aolqA/BcqqbJ88GUnLqjjcBc8EWdBcVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.51.0': + resolution: {integrity: sha512-JhhJDVwsSx4hiOEQPeajGhCWgBMBwVkxC/Pet53EpBVs7zHHtayKefw1jtPaNRXpI9RA2uocdmpdfE7T+NrizA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/tsconfig-utils@8.50.1': resolution: {integrity: sha512-ooHmotT/lCWLXi55G4mvaUF60aJa012QzvLK0Y+Mp4WdSt17QhMhWOaBWeGTFVkb2gDgBe19Cxy1elPXylslDw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/tsconfig-utils@8.51.0': + resolution: {integrity: sha512-Qi5bSy/vuHeWyir2C8u/uqGMIlIDu8fuiYWv48ZGlZ/k+PRPHtaAu7erpc7p5bzw2WNNSniuxoMSO4Ar6V9OXw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.50.1': resolution: {integrity: sha512-7J3bf022QZE42tYMO6SL+6lTPKFk/WphhRPe9Tw/el+cEwzLz1Jjz2PX3GtGQVxooLDKeMVmMt7fWpYRdG5Etg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5872,16 +5873,33 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/type-utils@8.51.0': + resolution: {integrity: sha512-0XVtYzxnobc9K0VU7wRWg1yiUrw4oQzexCG2V2IDxxCxhqBMSMbjB+6o91A+Uc0GWtgjCa3Y8bi7hwI0Tu4n5Q==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/types@8.50.1': resolution: {integrity: sha512-v5lFIS2feTkNyMhd7AucE/9j/4V9v5iIbpVRncjk/K0sQ6Sb+Np9fgYS/63n6nwqahHQvbmujeBL7mp07Q9mlA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.51.0': + resolution: {integrity: sha512-TizAvWYFM6sSscmEakjY3sPqGwxZRSywSsPEiuZF6d5GmGD9Gvlsv0f6N8FvAAA0CD06l3rIcWNbsN1e5F/9Ag==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.50.1': resolution: {integrity: sha512-woHPdW+0gj53aM+cxchymJCrh0cyS7BTIdcDxWUNsclr9VDkOSbqC13juHzxOmQ22dDkMZEpZB+3X1WpUvzgVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/typescript-estree@8.51.0': + resolution: {integrity: sha512-1qNjGqFRmlq0VW5iVlcyHBbCjPB7y6SxpBkrbhNWMy/65ZoncXCEPJxkRZL8McrseNH6lFhaxCIaX+vBuFnRng==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.50.1': resolution: {integrity: sha512-lCLp8H1T9T7gPbEuJSnHwnSuO9mDf8mfK/Nion5mZmiEaQD9sWf9W4dfeFqRyqRjF06/kBuTmAqcs9sewM2NbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -5889,10 +5907,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/utils@8.51.0': + resolution: {integrity: sha512-11rZYxSe0zabiKaCP2QAwRf/dnmgFgvTmeDTtZvUvXG3UuAdg/GU02NExmmIXzz3vLGgMdtrIosI84jITQOxUA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <6.0.0' + '@typescript-eslint/visitor-keys@8.50.1': resolution: {integrity: sha512-IrDKrw7pCRUR94zeuCSUWQ+w8JEf5ZX5jl/e6AHGSLi1/zIr0lgutfn/7JpfCey+urpgQEdrZVYzCaVVKiTwhQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.51.0': + resolution: {integrity: sha512-mM/JRQOzhVN1ykejrvwnBRV3+7yTKK8tVANVN3o1O0t0v7o+jqdVu9crPy5Y9dov15TJk/FTIgoUGHrTOVL3Zg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@univerjs/icons-svg@1.1.0': resolution: {integrity: sha512-ng+WOkkzNhDEa3eMoVOOcZB0XQTLrI6LSKfWYl0isjWuYjFwWQMgBDnVVHkfAx7v9QeDETKcSq8rPsZUkOiZlQ==} @@ -6091,8 +6120,8 @@ packages: '@webassemblyjs/wast-printer@1.14.1': resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} - '@wendellhu/redi@1.0.1': - resolution: {integrity: sha512-vKJFlaPjXsyqcJFNKJGmdLRup5uUZGQuZUA41e67at5y93kEYJo5FpJebAfs8LStJjItHWv21t0Aq+0UCSYSsw==} + '@wendellhu/redi@1.1.0': + resolution: {integrity: sha512-LKgJfzE9TxBi6Y63aDHcNGo0ALe0TOEb1gP1z6lOvnrVRcLylfVtq86ISxv1VHbx7LuF2Fc1oHEzIrJ44Kbufw==} engines: {node: '>=22.12.0'} peerDependencies: react: 19.2.3 @@ -7439,16 +7468,16 @@ packages: peerDependencies: eslint: ^9.0.0 - eslint-plugin-react-dom@2.4.0: - resolution: {integrity: sha512-nzBLj2bD2JJuIJlonENAE9Dp8Sy9Gw7Y45Y4mwjJ8PLV6hABP6W/sgeF0NXpzBiyClXRnjoCPRwylY0XjUaR+w==} + eslint-plugin-react-dom@2.5.0: + resolution: {integrity: sha512-d4at1AtRxk1lnUQweJSPLErMTBXOtnEmcdSclEouqSKi43FNNFdvZ9q91UGGHTtF3fxxiuUO6CLFMFLeaPi81w==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - eslint-plugin-react-hooks-extra@2.4.0: - resolution: {integrity: sha512-uLOSXhW1+RgXrkwErfnoiGSsAxdtCJyPG8yyswR+OL3bhaT3gwj5HcyEWpj+9GrzvDnb6oknfddpyAl2RmOOHw==} - engines: {node: '>=20.0.0'} + eslint-plugin-react-hooks-extra@2.5.0: + resolution: {integrity: sha512-573L9zhUZY0OlJWEBcmgdvJYa7zKd1Ns6fHLECIgl05H6c7KWo9YNmT05PRV/9n38KzbqOrv45RnVifxar96Yg==} + engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' @@ -7459,8 +7488,8 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 - eslint-plugin-react-naming-convention@2.4.0: - resolution: {integrity: sha512-7kmdrdKVO+54AUtUYzrpGqs9+wRREOWrr1A1DoMItZ8KXPv6TRWlUxm2opFFe2QysV0tSVvb4TVlfWxKcG1eLw==} + eslint-plugin-react-naming-convention@2.5.0: + resolution: {integrity: sha512-IdFVn99OnbpnS+irgBw5Kzz/+MQuofdlIFoJzsKtgTzdoq1Zo84GqXmJ9ONZwpJRw4tvzxoeamekzxyyF0xsug==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -7471,15 +7500,15 @@ packages: peerDependencies: eslint: '>=8.40' - eslint-plugin-react-web-api@2.4.0: - resolution: {integrity: sha512-NUGVZXgegv9l1zNNeX+n8EheGZtHcZGxBW6zmqUNr/762GikOgJHwaER8xDD073nKfEfFb+4JkBcpWRqAiTPnA==} + eslint-plugin-react-web-api@2.5.0: + resolution: {integrity: sha512-JJUzLld/ErE1KNnj4w9stqfb+LWw2nCXuDmyuT0FvWDZ4qD/wf7FuRERRUZWvz+yFnWAcMaEh/Gttkn7NiULIg==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <6.0.0' - eslint-plugin-react-x@2.4.0: - resolution: {integrity: sha512-ufKDXiDoMujcIT97Q6pCQs7j5q6Dtu/0AbXvrbNDLNXWVkCfZ7ayoRKMunvPU+WUHqnnzg9iv0o9QoaWwxG6rw==} + eslint-plugin-react-x@2.5.0: + resolution: {integrity: sha512-+vdAn6GeZiHhbTRLJmMixJy4VYqH3fgeBJCw1+d5gVa/ip/UMeWslM28wBWt2S7dI3g7s+bSuplXRAhdwGrQ4A==} engines: {node: '>=20.19.0'} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -9569,8 +9598,8 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} - posthog-node@5.18.0: - resolution: {integrity: sha512-SLBEs+sCThxzTGSSDEe97nZHuFFYh6DupObR1yQdvQND3CJh0ogZ0Sa1Vb+Tbrnf0cWbfBC9XNkm44yhaWf3aA==} + posthog-node@5.18.1: + resolution: {integrity: sha512-Hi7cRqAlvuEitdiurXJFdMip+BxcwYoX66at5RErMVP91V+Ph9BspGiawC3mJx/4znjwUjF29kAhf8oZQ2uJ5Q==} engines: {node: '>=20'} prelude-ls@1.1.2: @@ -10495,6 +10524,12 @@ packages: peerDependencies: typescript: '>=4.8.4' + ts-api-utils@2.3.0: + resolution: {integrity: sha512-6eg3Y9SF7SsAvGzRHQvvc1skDAhwI4YQ32ui1scxD1Ccr0G5qIIbUBT3pFTKX8kmWIQClHobtUdNuaBgwdfdWg==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + ts-declaration-location@1.0.7: resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} peerDependencies: @@ -11075,8 +11110,8 @@ packages: zod@4.1.12: resolution: {integrity: sha512-JInaHOamG8pt5+Ey8kGmdcAcg3OL9reK8ltczgHTAwNhMys/6ThXHityHxVV2p3fkw/c+MAvBHFVYHFZDmjMCQ==} - zod@4.2.1: - resolution: {integrity: sha512-0wZ1IRqGGhMP76gLqz8EyfBXKk0J2qo2+H3fi4mcUP/KtTocoX08nmIAHl1Z2kJIZbZee8KOpBCSNPRgauucjw==} + zod@4.3.2: + resolution: {integrity: sha512-b8L8yn4rIVfiXyHAmnr52/ZEpDumlT0bmxiq3Ws1ybrinhflGpt12Hvv54kYnEsGPRs6o/Ka3/ppA2OWY21IVg==} zustand@4.5.7: resolution: {integrity: sha512-CHOUy7mu3lbD6o6LJLfllpjkzhHXSBlX8B9+qPddUsIfeF5S/UZ5q0kmCsnRqT1UHFQZchNFDDzMbQsuesHWlw==} @@ -11102,7 +11137,7 @@ snapshots: '@alloc/quick-lru@5.2.0': {} - '@antfu/eslint-config@6.7.3(@eslint-react/eslint-plugin@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.26)(eslint-plugin-format@1.1.0(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-react-refresh@0.4.26(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.16(@types/node@25.0.3)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@27.0.1)(sass@1.87.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': + '@antfu/eslint-config@6.7.3(@eslint-react/eslint-plugin@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.26)(eslint-plugin-format@1.1.0(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-react-hooks@7.0.1(eslint@9.39.1(jiti@2.6.1)))(eslint-plugin-react-refresh@0.4.26(eslint@9.39.1(jiti@2.6.1)))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)(vitest@4.0.16(@types/node@25.0.3)(happy-dom@20.0.11)(jiti@2.6.1)(jsdom@27.0.1)(sass@1.87.0)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.2))': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.11.0 @@ -11142,7 +11177,7 @@ snapshots: vue-eslint-parser: 10.2.0(eslint@9.39.1(jiti@2.6.1)) yaml-eslint-parser: 1.3.2 optionalDependencies: - '@eslint-react/eslint-plugin': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eslint-plugin': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint-plugin-format: 1.1.0(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react-refresh: 0.4.26(eslint@9.39.1(jiti@2.6.1)) @@ -11961,27 +11996,27 @@ snapshots: '@eslint-community/regexpp@4.12.2': {} - '@eslint-react/ast@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/ast@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.4.0 - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/typescript-estree': 8.50.1(typescript@5.9.3) - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.3.1 typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/core@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/core@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.4.0 - '@eslint-react/shared': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@eslint-react/shared': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) birecord: 0.1.1 eslint: 9.39.1(jiti@2.6.1) ts-pattern: 5.9.0 @@ -11989,45 +12024,45 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint-react/eff@2.4.0': {} + '@eslint-react/eff@2.5.0': {} - '@eslint-react/eslint-plugin@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/eslint-plugin@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.4.0 - '@eslint-react/shared': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@eslint-react/shared': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/type-utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react-dom: 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-hooks-extra: 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-naming-convention: 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-web-api: 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint-plugin-react-x: 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - ts-api-utils: 2.1.0(typescript@5.9.3) + eslint-plugin-react-dom: 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks-extra: 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-naming-convention: 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-web-api: 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-x: 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + ts-api-utils: 2.3.0(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: - supports-color - '@eslint-react/shared@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/shared@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/eff': 2.4.0 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) ts-pattern: 5.9.0 typescript: 5.9.3 - zod: 4.2.1 + zod: 4.3.2 transitivePeerDependencies: - supports-color - '@eslint-react/var@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + '@eslint-react/var@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: - '@eslint-react/ast': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.4.0 - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) ts-pattern: 5.9.0 typescript: 5.9.3 @@ -13288,16 +13323,6 @@ snapshots: picocolors: 1.1.1 redent: 3.0.0 - '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': - dependencies: - '@babel/runtime': 7.27.1 - '@testing-library/dom': 10.4.0 - react: 19.2.3 - react-dom: 19.2.3(react@19.2.3) - optionalDependencies: - '@types/react': 19.2.7 - '@types/react-dom': 19.2.3(@types/react@19.2.7) - '@testing-library/react@16.3.1(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.7))(@types/react@19.2.7)(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': dependencies: '@babel/runtime': 7.28.4 @@ -13523,15 +13548,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/project-service@8.51.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/tsconfig-utils': 8.51.0(typescript@5.9.3) + '@typescript-eslint/types': 8.51.0 + debug: 4.4.3 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/scope-manager@8.50.1': dependencies: '@typescript-eslint/types': 8.50.1 '@typescript-eslint/visitor-keys': 8.50.1 + '@typescript-eslint/scope-manager@8.51.0': + dependencies: + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/visitor-keys': 8.51.0 + '@typescript-eslint/tsconfig-utils@8.50.1(typescript@5.9.3)': dependencies: typescript: 5.9.3 + '@typescript-eslint/tsconfig-utils@8.51.0(typescript@5.9.3)': + dependencies: + typescript: 5.9.3 + '@typescript-eslint/type-utils@8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@typescript-eslint/types': 8.50.1 @@ -13544,8 +13587,22 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/type-utils@8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + debug: 4.4.3 + eslint: 9.39.1(jiti@2.6.1) + ts-api-utils: 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/types@8.50.1': {} + '@typescript-eslint/types@8.51.0': {} + '@typescript-eslint/typescript-estree@8.50.1(typescript@5.9.3)': dependencies: '@typescript-eslint/project-service': 8.50.1(typescript@5.9.3) @@ -13561,6 +13618,21 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/typescript-estree@8.51.0(typescript@5.9.3)': + dependencies: + '@typescript-eslint/project-service': 8.51.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.51.0(typescript@5.9.3) + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/visitor-keys': 8.51.0 + debug: 4.4.3 + minimatch: 9.0.5 + semver: 7.7.3 + tinyglobby: 0.2.15 + ts-api-utils: 2.3.0(typescript@5.9.3) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/utils@8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': dependencies: '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) @@ -13572,11 +13644,27 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3)': + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.39.1(jiti@2.6.1)) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/typescript-estree': 8.51.0(typescript@5.9.3) + eslint: 9.39.1(jiti@2.6.1) + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.50.1': dependencies: '@typescript-eslint/types': 8.50.1 eslint-visitor-keys: 4.2.1 + '@typescript-eslint/visitor-keys@8.51.0': + dependencies: + '@typescript-eslint/types': 8.51.0 + eslint-visitor-keys: 4.2.1 + '@univerjs/icons-svg@1.1.0': {} '@univerjs/icons@1.1.0(react-dom@19.2.3(react@19.2.3))(react@19.2.3)': @@ -13876,7 +13964,7 @@ snapshots: '@webassemblyjs/ast': 1.14.1 '@xtuc/long': 4.2.2 - '@wendellhu/redi@1.0.1(react@19.2.3)': + '@wendellhu/redi@1.1.0(react@19.2.3)': optionalDependencies: react: 19.2.3 @@ -15314,16 +15402,16 @@ snapshots: yaml: 2.8.2 yaml-eslint-parser: 1.3.2 - eslint-plugin-react-dom@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-dom@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.4.0 - '@eslint-react/shared': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@eslint-react/shared': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.1(jiti@2.6.1) string-ts: 2.3.1 @@ -15332,17 +15420,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-hooks-extra@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-hooks-extra@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.4.0 - '@eslint-react/shared': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@eslint-react/shared': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/type-utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -15361,17 +15449,17 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-naming-convention@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-naming-convention@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.4.0 - '@eslint-react/shared': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@eslint-react/shared': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/type-utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -15383,16 +15471,16 @@ snapshots: dependencies: eslint: 9.39.1(jiti@2.6.1) - eslint-plugin-react-web-api@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-web-api@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.4.0 - '@eslint-react/shared': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@eslint-react/shared': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) string-ts: 2.3.1 ts-pattern: 5.9.0 @@ -15400,22 +15488,22 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-react-x@2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-plugin-react-x@2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@eslint-react/ast': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/core': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/eff': 2.4.0 - '@eslint-react/shared': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@eslint-react/var': 2.4.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/scope-manager': 8.50.1 - '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/types': 8.50.1 - '@typescript-eslint/utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/ast': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/core': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/eff': 2.5.0 + '@eslint-react/shared': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@eslint-react/var': 2.5.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/scope-manager': 8.51.0 + '@typescript-eslint/type-utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/types': 8.51.0 + '@typescript-eslint/utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) compare-versions: 6.1.1 eslint: 9.39.1(jiti@2.6.1) is-immutable-type: 5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) string-ts: 2.3.1 - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.3.0(typescript@5.9.3) ts-pattern: 5.9.0 typescript: 5.9.3 transitivePeerDependencies: @@ -16227,9 +16315,9 @@ snapshots: is-immutable-type@5.0.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@typescript-eslint/type-utils': 8.50.1(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.51.0(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) - ts-api-utils: 2.1.0(typescript@5.9.3) + ts-api-utils: 2.3.0(typescript@5.9.3) ts-declaration-location: 1.0.7(typescript@5.9.3) typescript: 5.9.3 transitivePeerDependencies: @@ -17852,7 +17940,7 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 - posthog-node@5.18.0: + posthog-node@5.18.1: dependencies: '@posthog/core': 1.9.0 @@ -18946,6 +19034,10 @@ snapshots: dependencies: typescript: 5.9.3 + ts-api-utils@2.3.0(typescript@5.9.3): + dependencies: + typescript: 5.9.3 + ts-declaration-location@1.0.7(typescript@5.9.3): dependencies: picomatch: 4.0.3 @@ -19542,7 +19634,7 @@ snapshots: zod@4.1.12: {} - zod@4.2.1: {} + zod@4.3.2: {} zustand@4.5.7(@types/react@19.2.7)(react@19.2.3): dependencies: