From 93bfc607cb04955304035d5a75ae13b48524e45a Mon Sep 17 00:00:00 2001 From: "codegen-sh[bot]" <131295404+codegen-sh[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 03:58:58 +0000 Subject: [PATCH 1/5] feat: add password field component with reveal/hide functionality - Add PasswordField UI component with eye/eye-off toggle icons - Add RemixHookForm wrapper for PasswordField - Create comprehensive Storybook story with create account form example - Include Zod schema validation for password confirmation - Add proper TypeScript types and accessibility features - Export components in index files for easy import --- .../password-field.stories.tsx | 220 ++++++++++++++++++ package.json | 5 +- .../components/src/remix-hook-form/index.ts | 1 + .../src/remix-hook-form/password-field.tsx | 33 +++ packages/components/src/ui/index.ts | 1 + packages/components/src/ui/password-field.tsx | 125 ++++++++++ 6 files changed, 384 insertions(+), 1 deletion(-) create mode 100644 apps/docs/src/remix-hook-form/password-field.stories.tsx create mode 100644 packages/components/src/remix-hook-form/password-field.tsx create mode 100644 packages/components/src/ui/password-field.tsx diff --git a/apps/docs/src/remix-hook-form/password-field.stories.tsx b/apps/docs/src/remix-hook-form/password-field.stories.tsx new file mode 100644 index 00000000..d8dc6653 --- /dev/null +++ b/apps/docs/src/remix-hook-form/password-field.stories.tsx @@ -0,0 +1,220 @@ +import { zodResolver } from '@hookform/resolvers/zod'; +import { PasswordField } from '@lambdacurry/forms/remix-hook-form/password-field'; +import { Button } from '@lambdacurry/forms/ui/button'; +import type { Meta, StoryContext, StoryObj } from '@storybook/react-vite'; +import { expect, userEvent } from '@storybook/test'; +import { useRef } from 'react'; +import { type ActionFunctionArgs, useFetcher } from 'react-router'; +import { RemixFormProvider, getValidatedFormData, useRemixForm } from 'remix-hook-form'; +import { z } from 'zod'; +import { withReactRouterStubDecorator } from '../lib/storybook/react-router-stub'; + +const formSchema = z + .object({ + password: z.string().min(8, 'Password must be at least 8 characters'), + confirmPassword: z.string().min(1, 'Please confirm your password'), + }) + .refine((data) => data.password === data.confirmPassword, { + message: "Passwords don't match", + path: ['confirmPassword'], + }); + +type FormData = z.infer; + +const INITIAL_PASSWORD = 'test123456'; +const WEAK_PASSWORD = '123'; +const WEAK_PASSWORD_ERROR = 'Password must be at least 8 characters'; +const MISMATCH_PASSWORD_ERROR = "Passwords don't match"; + +const CreateAccountForm = () => { + const fetcher = useFetcher<{ message: string; success: boolean }>(); + const methods = useRemixForm({ + resolver: zodResolver(formSchema), + defaultValues: { + password: INITIAL_PASSWORD, + confirmPassword: INITIAL_PASSWORD, + }, + fetcher, + submitConfig: { + action: '/', + method: 'post', + }, + }); + + const ref = useRef(null); + + return ( + + +
+
+

Create Account

+

Enter your password details to get started

+
+ + + + + +
+ + +
+ + + + {fetcher.data?.message && ( +

+ {fetcher.data.message} +

+ )} +
+
+
+ ); +}; + +const handleFormSubmission = async (request: Request) => { + const { data, errors } = await getValidatedFormData(request, zodResolver(formSchema)); + + if (errors) { + return { errors }; + } + + // Simulate account creation - data is validated at this point + console.log('Creating account with password length:', data.password.length); + return { + message: 'Account created successfully! Welcome aboard!', + success: true, + }; +}; + +const meta: Meta = { + title: 'RemixHookForm/PasswordField', + component: PasswordField, + parameters: { layout: 'centered' }, + tags: ['autodocs'], +}; + +export default meta; +type Story = StoryObj; + +// Test scenarios +const testDefaultValues = ({ canvas }: StoryContext) => { + const passwordInput = canvas.getByLabelText('Password'); + const confirmInput = canvas.getByLabelText('Confirm Password'); + expect(passwordInput).toHaveValue(INITIAL_PASSWORD); + expect(confirmInput).toHaveValue(INITIAL_PASSWORD); +}; + +const testPasswordVisibilityToggle = async ({ canvas }: StoryContext) => { + const passwordInput = canvas.getByLabelText('Password'); + const toggleButton = canvas.getByLabelText('Hide password'); + + // Initially password should be hidden (type="password") + expect(passwordInput).toHaveAttribute('type', 'password'); + + // Click toggle to show password + await userEvent.click(toggleButton); + expect(passwordInput).toHaveAttribute('type', 'text'); + expect(canvas.getByLabelText('Show password')).toBeInTheDocument(); + + // Click toggle to hide password again + await userEvent.click(canvas.getByLabelText('Show password')); + expect(passwordInput).toHaveAttribute('type', 'password'); + expect(canvas.getByLabelText('Hide password')).toBeInTheDocument(); +}; + +const testWeakPasswordValidation = async ({ canvas }: StoryContext) => { + const passwordInput = canvas.getByLabelText('Password'); + const submitButton = canvas.getByRole('button', { name: 'Create Account' }); + + await userEvent.click(passwordInput); + await userEvent.clear(passwordInput); + await userEvent.type(passwordInput, WEAK_PASSWORD); + await userEvent.click(submitButton); + + await expect(await canvas.findByText(WEAK_PASSWORD_ERROR)).toBeInTheDocument(); +}; + +const testPasswordMismatchValidation = async ({ canvas }: StoryContext) => { + const passwordInput = canvas.getByLabelText('Password'); + const confirmInput = canvas.getByLabelText('Confirm Password'); + const submitButton = canvas.getByRole('button', { name: 'Create Account' }); + + await userEvent.click(passwordInput); + await userEvent.clear(passwordInput); + await userEvent.type(passwordInput, 'validpassword123'); + + await userEvent.click(confirmInput); + await userEvent.clear(confirmInput); + await userEvent.type(confirmInput, 'differentpassword123'); + + await userEvent.click(submitButton); + + await expect(await canvas.findByText(MISMATCH_PASSWORD_ERROR)).toBeInTheDocument(); +}; + +const testValidSubmission = async ({ canvas }: StoryContext) => { + const passwordInput = canvas.getByLabelText('Password'); + const confirmInput = canvas.getByLabelText('Confirm Password'); + const submitButton = canvas.getByRole('button', { name: 'Create Account' }); + + await userEvent.click(passwordInput); + await userEvent.clear(passwordInput); + await userEvent.type(passwordInput, 'validpassword123'); + + await userEvent.click(confirmInput); + await userEvent.clear(confirmInput); + await userEvent.type(confirmInput, 'validpassword123'); + + await userEvent.click(submitButton); + + const successMessage = await canvas.findByText('Account created successfully! Welcome aboard!'); + expect(successMessage).toBeInTheDocument(); +}; + +const testRefFunctionality = async ({ canvas }: StoryContext) => { + const refInput = canvas.getByLabelText('Ref Example'); + const focusButton = canvas.getByRole('button', { name: 'Focus' }); + + await userEvent.click(focusButton); + expect(refInput).toHaveFocus(); +}; + +// Single story that contains all variants and tests +export const CreateAccountExample: Story = { + play: async (storyContext) => { + testDefaultValues(storyContext); + await testPasswordVisibilityToggle(storyContext); + await testWeakPasswordValidation(storyContext); + await testPasswordMismatchValidation(storyContext); + await testValidSubmission(storyContext); + await testRefFunctionality(storyContext); + }, + decorators: [ + withReactRouterStubDecorator({ + routes: [ + { + path: '/', + Component: CreateAccountForm, + action: async ({ request }: ActionFunctionArgs) => handleFormSubmission(request), + }, + ], + }), + ], +}; diff --git a/package.json b/package.json index 16f2631c..1a9afef4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,10 @@ "name": "forms", "version": "0.2.0", "private": true, - "workspaces": ["apps/*", "packages/*"], + "workspaces": [ + "apps/*", + "packages/*" + ], "scripts": { "start": "yarn dev", "dev": "turbo run dev", diff --git a/packages/components/src/remix-hook-form/index.ts b/packages/components/src/remix-hook-form/index.ts index fc225664..adf298c5 100644 --- a/packages/components/src/remix-hook-form/index.ts +++ b/packages/components/src/remix-hook-form/index.ts @@ -4,6 +4,7 @@ export * from './form-error'; export * from './date-picker'; export * from './dropdown-menu-select'; export * from './text-field'; +export * from './password-field'; export * from './radio-group'; export * from './radio-group-item'; export * from './switch'; diff --git a/packages/components/src/remix-hook-form/password-field.tsx b/packages/components/src/remix-hook-form/password-field.tsx new file mode 100644 index 00000000..58b926a2 --- /dev/null +++ b/packages/components/src/remix-hook-form/password-field.tsx @@ -0,0 +1,33 @@ +import type * as React from 'react'; +import { + PasswordField as BasePasswordField, + type PasswordInputProps as BasePasswordFieldProps, +} from '../ui/password-field'; +import { FormControl, FormDescription, FormLabel, FormMessage } from './form'; + +import { useRemixFormContext } from 'remix-hook-form'; + +export type PasswordFieldProps = Omit; + +export const PasswordField = function RemixPasswordField( + props: PasswordFieldProps & { ref?: React.Ref }, +) { + const { control } = useRemixFormContext(); + + // Merge the provided components with the default form components + const defaultComponents = { + FormControl, + FormLabel, + FormDescription, + FormMessage, + }; + + const components = { + ...defaultComponents, + ...props.components, + }; + + return ; +}; + +PasswordField.displayName = 'PasswordField'; diff --git a/packages/components/src/ui/index.ts b/packages/components/src/ui/index.ts index e7a37d02..bf3462dc 100644 --- a/packages/components/src/ui/index.ts +++ b/packages/components/src/ui/index.ts @@ -17,6 +17,7 @@ export * from './switch'; export * from './switch-field'; export * from './text-field'; export * from './text-input'; +export * from './password-field'; export * from './textarea-field'; export * from './textarea'; export * from './utils'; diff --git a/packages/components/src/ui/password-field.tsx b/packages/components/src/ui/password-field.tsx new file mode 100644 index 00000000..e9d0c598 --- /dev/null +++ b/packages/components/src/ui/password-field.tsx @@ -0,0 +1,125 @@ +import { Eye, EyeOff } from 'lucide-react'; +import type * as React from 'react'; +import { useState } from 'react'; +import type { Control, FieldPath, FieldValues } from 'react-hook-form'; +import { + type FieldComponents, + FormControl, + FormDescription, + FormField, + FormItem, + FormLabel, + FormMessage, +} from './form'; +import { type InputProps, TextInput } from './text-input'; +import { cn } from './utils'; + +export const PasswordToggleButton = ({ + isVisible, + onToggle, + className, +}: { + isVisible: boolean; + onToggle: () => void; + className?: string; +}) => { + return ( + + ); +}; + +// Create a specific interface for the password input props +export interface PasswordInputProps extends Omit { + control?: Control; + name: FieldPath; + label?: string | React.ReactNode; + description?: string; + components?: Partial & { + Input?: React.ComponentType>; + }; + prefix?: React.ReactNode; + className?: string; +} + +export const PasswordField = function PasswordField({ + control, + name, + label, + description, + className, + components, + prefix, + ref, + ...props +}: PasswordInputProps & { ref?: React.Ref }) { + const [isVisible, setIsVisible] = useState(false); + + // Use the custom Input component if provided, otherwise use the default TextInput + const InputComponent = components?.Input || TextInput; + + const toggleVisibility = () => { + setIsVisible(!isVisible); + }; + + return ( + { + return ( + + {label && {label}} +
+ {prefix && ( +
+ {prefix} +
+ )} +
+ + + +
+ +
+
+
+ {description && {description}} + {fieldState.error && ( + {fieldState.error.message} + )} +
+ ); + }} + /> + ); +}; + +PasswordField.displayName = 'PasswordField'; From b21950e13ac7a52c0f350a4efadb3b2f25ada458 Mon Sep 17 00:00:00 2001 From: "codegen-sh[bot]" <131295404+codegen-sh[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 04:07:04 +0000 Subject: [PATCH 2/5] fix: correct password visibility toggle test expectations The test was expecting 'Hide password' label initially, but the component correctly shows 'Show password' when password is hidden (isVisible = false). Updated test to match the correct component behavior. --- apps/docs/src/remix-hook-form/password-field.stories.tsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/docs/src/remix-hook-form/password-field.stories.tsx b/apps/docs/src/remix-hook-form/password-field.stories.tsx index d8dc6653..f3d847b4 100644 --- a/apps/docs/src/remix-hook-form/password-field.stories.tsx +++ b/apps/docs/src/remix-hook-form/password-field.stories.tsx @@ -123,7 +123,7 @@ const testDefaultValues = ({ canvas }: StoryContext) => { const testPasswordVisibilityToggle = async ({ canvas }: StoryContext) => { const passwordInput = canvas.getByLabelText('Password'); - const toggleButton = canvas.getByLabelText('Hide password'); + const toggleButton = canvas.getByLabelText('Show password'); // Initially password should be hidden (type="password") expect(passwordInput).toHaveAttribute('type', 'password'); @@ -131,12 +131,12 @@ const testPasswordVisibilityToggle = async ({ canvas }: StoryContext) => { // Click toggle to show password await userEvent.click(toggleButton); expect(passwordInput).toHaveAttribute('type', 'text'); - expect(canvas.getByLabelText('Show password')).toBeInTheDocument(); + expect(canvas.getByLabelText('Hide password')).toBeInTheDocument(); // Click toggle to hide password again - await userEvent.click(canvas.getByLabelText('Show password')); + await userEvent.click(canvas.getByLabelText('Hide password')); expect(passwordInput).toHaveAttribute('type', 'password'); - expect(canvas.getByLabelText('Hide password')).toBeInTheDocument(); + expect(canvas.getByLabelText('Show password')).toBeInTheDocument(); }; const testWeakPasswordValidation = async ({ canvas }: StoryContext) => { From fc6f6ac9deef6262c7534c4607e779dc623970cc Mon Sep 17 00:00:00 2001 From: "codegen-sh[bot]" <131295404+codegen-sh[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 04:09:59 +0000 Subject: [PATCH 3/5] fix: Fix password field story test - correct toggle button aria-label expectations The test was expecting 'Hide password' initially, but the component correctly starts with 'Show password' when the password is hidden. Updated the test to use proper DOM traversal to find the correct toggle button for each password field, avoiding conflicts with multiple password fields in the form. --- .../password-field.stories.tsx | 19 +++++++++++++++---- package.json | 5 +---- packages/components/package.json | 4 +--- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/apps/docs/src/remix-hook-form/password-field.stories.tsx b/apps/docs/src/remix-hook-form/password-field.stories.tsx index f3d847b4..8024e6e2 100644 --- a/apps/docs/src/remix-hook-form/password-field.stories.tsx +++ b/apps/docs/src/remix-hook-form/password-field.stories.tsx @@ -123,7 +123,12 @@ const testDefaultValues = ({ canvas }: StoryContext) => { const testPasswordVisibilityToggle = async ({ canvas }: StoryContext) => { const passwordInput = canvas.getByLabelText('Password'); - const toggleButton = canvas.getByLabelText('Show password'); + + // Find the toggle button within the same form item as the password input + const formItem = + passwordInput.closest('[class*="FormItem"], .form-item, [data-testid="form-item"]') || + passwordInput.parentElement?.parentElement; + const toggleButton = formItem?.querySelector('button[aria-label="Show password"]') as HTMLElement; // Initially password should be hidden (type="password") expect(passwordInput).toHaveAttribute('type', 'password'); @@ -131,12 +136,18 @@ const testPasswordVisibilityToggle = async ({ canvas }: StoryContext) => { // Click toggle to show password await userEvent.click(toggleButton); expect(passwordInput).toHaveAttribute('type', 'text'); - expect(canvas.getByLabelText('Hide password')).toBeInTheDocument(); + + // Find the hide button for the same field + const hideButton = formItem?.querySelector('button[aria-label="Hide password"]') as HTMLElement; + expect(hideButton).toBeInTheDocument(); // Click toggle to hide password again - await userEvent.click(canvas.getByLabelText('Hide password')); + await userEvent.click(hideButton); expect(passwordInput).toHaveAttribute('type', 'password'); - expect(canvas.getByLabelText('Show password')).toBeInTheDocument(); + + // Verify show button is back + const showButtonAgain = formItem?.querySelector('button[aria-label="Show password"]') as HTMLElement; + expect(showButtonAgain).toBeInTheDocument(); }; const testWeakPasswordValidation = async ({ canvas }: StoryContext) => { diff --git a/package.json b/package.json index 1a9afef4..16f2631c 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,7 @@ "name": "forms", "version": "0.2.0", "private": true, - "workspaces": [ - "apps/*", - "packages/*" - ], + "workspaces": ["apps/*", "packages/*"], "scripts": { "start": "yarn dev", "dev": "turbo run dev", diff --git a/packages/components/package.json b/packages/components/package.json index afc4cb8e..23e7fabd 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -18,9 +18,7 @@ "import": "./dist/ui/index.js" } }, - "files": [ - "dist" - ], + "files": ["dist"], "scripts": { "prepublishOnly": "yarn run build", "build": "vite build", From de0cacf847bd4254d16346b0a5ebcd955e682a23 Mon Sep 17 00:00:00 2001 From: "codegen-sh[bot]" <131295404+codegen-sh[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 04:19:10 +0000 Subject: [PATCH 4/5] chore: bump @lambdacurry/forms to v0.19.0 - Bump minor version for password field component release - Update yarn.lock with latest dependencies - Version includes new PasswordField component with reveal/hide functionality --- package.json | 5 +- packages/components/package.json | 6 +- yarn.lock | 529 ++++++++++++++++--------------- 3 files changed, 278 insertions(+), 262 deletions(-) diff --git a/package.json b/package.json index 16f2631c..1a9afef4 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,10 @@ "name": "forms", "version": "0.2.0", "private": true, - "workspaces": ["apps/*", "packages/*"], + "workspaces": [ + "apps/*", + "packages/*" + ], "scripts": { "start": "yarn dev", "dev": "turbo run dev", diff --git a/packages/components/package.json b/packages/components/package.json index 23e7fabd..d57cc76d 100644 --- a/packages/components/package.json +++ b/packages/components/package.json @@ -1,6 +1,6 @@ { "name": "@lambdacurry/forms", - "version": "0.18.1", + "version": "0.19.0", "type": "module", "main": "./dist/index.js", "types": "./dist/index.d.ts", @@ -18,7 +18,9 @@ "import": "./dist/ui/index.js" } }, - "files": ["dist"], + "files": [ + "dist" + ], "scripts": { "prepublishOnly": "yarn run build", "build": "vite build", diff --git a/yarn.lock b/yarn.lock index 3b098463..959eeb26 100644 --- a/yarn.lock +++ b/yarn.lock @@ -870,9 +870,9 @@ __metadata: linkType: hard "@date-fns/tz@npm:^1.2.0": - version: 1.2.0 - resolution: "@date-fns/tz@npm:1.2.0" - checksum: 10c0/411e9d4303b10951f6fd0189d18fb845f0d934a575df2176bc10daf664282c765fb6b057a977e446bbb1229151d89e7788978600a019f1fc24b5c75276d496bd + version: 1.3.1 + resolution: "@date-fns/tz@npm:1.3.1" + checksum: 10c0/f0d8822a4aa17b271481d85b2bdae8bdd25b38caaf2a52513310fa1d6e7fbf071e66dbc93766d5eb5473ffd14b0d674e4e8b6d297de507b1bacc78f4387154ad languageName: node linkType: hard @@ -1104,34 +1104,34 @@ __metadata: languageName: node linkType: hard -"@floating-ui/core@npm:^1.7.2": - version: 1.7.2 - resolution: "@floating-ui/core@npm:1.7.2" +"@floating-ui/core@npm:^1.7.3": + version: 1.7.3 + resolution: "@floating-ui/core@npm:1.7.3" dependencies: "@floating-ui/utils": "npm:^0.2.10" - checksum: 10c0/ea5909ae1bfad6d8dd60ab893c7751fd974d96b25481d13805935a089b39881b4d69425a0a84cc74c82269d8b64ca0117c472fc83e425143bee1bb21b247de9c + checksum: 10c0/edfc23800122d81df0df0fb780b7328ae6c5f00efbb55bd48ea340f4af8c5b3b121ceb4bb81220966ab0f87b443204d37105abdd93d94846468be3243984144c languageName: node linkType: hard -"@floating-ui/dom@npm:^1.7.2": - version: 1.7.2 - resolution: "@floating-ui/dom@npm:1.7.2" +"@floating-ui/dom@npm:^1.7.3": + version: 1.7.3 + resolution: "@floating-ui/dom@npm:1.7.3" dependencies: - "@floating-ui/core": "npm:^1.7.2" + "@floating-ui/core": "npm:^1.7.3" "@floating-ui/utils": "npm:^0.2.10" - checksum: 10c0/1b2ad76dc7fe245a1bb406cd5b64a1316f2ec642aebaa4d1928b56ced6fe71046f089e3fef9340bab234645b6333546211e363a630a9e7cfca6bf5031c39e0cb + checksum: 10c0/cba30e9af1a52fb7cb443ae516d7aec032b33da2fa50914dcb18fc834dc31c71922f5c7653431e70d493f347018b2ce6435c98b3f154d92082345689b4458e59 languageName: node linkType: hard "@floating-ui/react-dom@npm:^2.0.0": - version: 2.1.4 - resolution: "@floating-ui/react-dom@npm:2.1.4" + version: 2.1.5 + resolution: "@floating-ui/react-dom@npm:2.1.5" dependencies: - "@floating-ui/dom": "npm:^1.7.2" + "@floating-ui/dom": "npm:^1.7.3" peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: 10c0/2dade6b8e18de09c90b876249756155ab31f49b5a81d246a3dc568d0355bc9e4bc26485dfd27b9e3bf86585700f4d241e8f53e8321249ec9b012a266a86b9366 + checksum: 10c0/2dc9571845138e5f39952900fa4d1ad077968c97c1fd1eae30e624db42a29f6fc897c11f926b5e63c468d541eff78b41c2aa1ec45eed2f3a1cc8aa95898f3260 languageName: node linkType: hard @@ -1707,8 +1707,8 @@ __metadata: linkType: hard "@microsoft/api-extractor@npm:^7.50.1": - version: 7.52.9 - resolution: "@microsoft/api-extractor@npm:7.52.9" + version: 7.52.10 + resolution: "@microsoft/api-extractor@npm:7.52.10" dependencies: "@microsoft/api-extractor-model": "npm:7.30.7" "@microsoft/tsdoc": "npm:~0.15.1" @@ -1718,14 +1718,14 @@ __metadata: "@rushstack/terminal": "npm:0.15.4" "@rushstack/ts-command-line": "npm:5.0.2" lodash: "npm:~4.17.15" - minimatch: "npm:~3.0.3" + minimatch: "npm:10.0.3" resolve: "npm:~1.22.1" semver: "npm:~7.5.4" source-map: "npm:~0.6.1" typescript: "npm:5.8.2" bin: api-extractor: bin/api-extractor - checksum: 10c0/055c5febcf650aa3ce4e0a0f7acbaf9561027633484aef52fa7cd717e472b68d413d9ac2dd983704d3a1297c0c664f4eb6d0e371650f423186b611d2d70c9227 + checksum: 10c0/4bf45d24b672d36b9035d6ac025bdbe11979de36756b8871986166f7dac108dd70f57356e8746a882d55622ac5ae2a4ea8ac66cda1eefb37cab088ee660eec4a languageName: node linkType: hard @@ -2812,142 +2812,142 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.46.0" +"@rollup/rollup-android-arm-eabi@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.46.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-android-arm64@npm:4.46.0" +"@rollup/rollup-android-arm64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-android-arm64@npm:4.46.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.46.0" +"@rollup/rollup-darwin-arm64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-darwin-arm64@npm:4.46.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.46.0" +"@rollup/rollup-darwin-x64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-darwin-x64@npm:4.46.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-freebsd-arm64@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-freebsd-arm64@npm:4.46.0" +"@rollup/rollup-freebsd-arm64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.46.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-freebsd-x64@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-freebsd-x64@npm:4.46.0" +"@rollup/rollup-freebsd-x64@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-freebsd-x64@npm:4.46.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.46.0" +"@rollup/rollup-linux-arm-gnueabihf@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.46.2" conditions: os=linux & cpu=arm & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm-musleabihf@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.46.0" +"@rollup/rollup-linux-arm-musleabihf@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.46.2" conditions: os=linux & cpu=arm & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.46.0" +"@rollup/rollup-linux-arm64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.46.2" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.46.0" +"@rollup/rollup-linux-arm64-musl@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.46.2" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-loongarch64-gnu@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.46.0" +"@rollup/rollup-linux-loongarch64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.46.2" conditions: os=linux & cpu=loong64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-ppc64-gnu@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.46.0" +"@rollup/rollup-linux-ppc64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.46.2" conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.46.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.46.2" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-musl@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.46.0" +"@rollup/rollup-linux-riscv64-musl@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.46.2" conditions: os=linux & cpu=riscv64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.46.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.46.2" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.46.0" +"@rollup/rollup-linux-x64-gnu@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.46.2" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.46.0" +"@rollup/rollup-linux-x64-musl@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.46.2" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.46.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.46.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.46.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.46.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.46.0": - version: 4.46.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.46.0" +"@rollup/rollup-win32-x64-msvc@npm:4.46.2": + version: 4.46.2 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.46.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -3066,58 +3066,58 @@ __metadata: linkType: hard "@storybook/addon-docs@npm:^9.0.6": - version: 9.0.18 - resolution: "@storybook/addon-docs@npm:9.0.18" + version: 9.1.0 + resolution: "@storybook/addon-docs@npm:9.1.0" dependencies: "@mdx-js/react": "npm:^3.0.0" - "@storybook/csf-plugin": "npm:9.0.18" - "@storybook/icons": "npm:^1.2.12" - "@storybook/react-dom-shim": "npm:9.0.18" + "@storybook/csf-plugin": "npm:9.1.0" + "@storybook/icons": "npm:^1.4.0" + "@storybook/react-dom-shim": "npm:9.1.0" react: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" react-dom: "npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.0.18 - checksum: 10c0/12533921baeec0995b138884e47df64b48ce3fa2a8cbf17802f18c61265436e761199e77c2b0a5015af201332fb3e563216791026cdd2e4a87cf21a45c0b839c + storybook: ^9.1.0 + checksum: 10c0/c9f7024d6993cd8d9a344aa370c39922bcca88cf728bd19a4330493321333fe69fd7aedfcf6e8debb99e245a31cceaae28e0e4b00d45e9119a737467285b5364 languageName: node linkType: hard "@storybook/addon-links@npm:^9.0.6": - version: 9.0.18 - resolution: "@storybook/addon-links@npm:9.0.18" + version: 9.1.0 + resolution: "@storybook/addon-links@npm:9.1.0" dependencies: "@storybook/global": "npm:^5.0.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.18 + storybook: ^9.1.0 peerDependenciesMeta: react: optional: true - checksum: 10c0/15302c5207126efe234a4dfc33681ae7304104c9cf9e5acc866121fd7f9232bce64e7a2166b39fb1c9748773da0d8a9536ea488fbc28c26885951e3a929d5d97 + checksum: 10c0/128b220b5340318de38020060c33a7c443b072fb215f2dc61d36647fd882db470ebc12d267c58920f0cf9a9438df541d62cecca853d10ec25e9415451082c30a languageName: node linkType: hard -"@storybook/builder-vite@npm:9.0.18": - version: 9.0.18 - resolution: "@storybook/builder-vite@npm:9.0.18" +"@storybook/builder-vite@npm:9.1.0": + version: 9.1.0 + resolution: "@storybook/builder-vite@npm:9.1.0" dependencies: - "@storybook/csf-plugin": "npm:9.0.18" + "@storybook/csf-plugin": "npm:9.1.0" ts-dedent: "npm:^2.0.0" peerDependencies: - storybook: ^9.0.18 + storybook: ^9.1.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/9e69ff0b0ddfcba3dd2968d8cda1707c2f89ba76bdc9806068c767330d68d68974422c124a8a55c493b5896787a112f504cf68c6aa18b92ef1daa638d24f415e + checksum: 10c0/5ba8a8378168091669ba20b2f267aa1e1856329f8d5231a3b84f4afee53fcfe160ba93dbe670265ed2c5b07070491e7e57166d64092e725ff01a8e464c2b1e6f languageName: node linkType: hard -"@storybook/csf-plugin@npm:9.0.18": - version: 9.0.18 - resolution: "@storybook/csf-plugin@npm:9.0.18" +"@storybook/csf-plugin@npm:9.1.0": + version: 9.1.0 + resolution: "@storybook/csf-plugin@npm:9.1.0" dependencies: unplugin: "npm:^1.3.1" peerDependencies: - storybook: ^9.0.18 - checksum: 10c0/e5c1e32618a763e36b948ec0fe1fbb94c110d9799e48c229b83f22043ab27cd2eb89d7a0a50a8783253f6ef208827f39d7d37efabd556100ede6c0eefd951785 + storybook: ^9.1.0 + checksum: 10c0/e22df7afb1f2a1722ad71f90492a2b040ee22c1e521a1827f4c6bda6c2eb584b34ea05b010256b0ed95e3891e52e55b5b1acbf1d098d348ebb271cc63afd3735 languageName: node linkType: hard @@ -3137,7 +3137,7 @@ __metadata: languageName: node linkType: hard -"@storybook/icons@npm:^1.2.12": +"@storybook/icons@npm:^1.4.0": version: 1.4.0 resolution: "@storybook/icons@npm:1.4.0" peerDependencies: @@ -3159,25 +3159,25 @@ __metadata: languageName: node linkType: hard -"@storybook/react-dom-shim@npm:9.0.18": - version: 9.0.18 - resolution: "@storybook/react-dom-shim@npm:9.0.18" +"@storybook/react-dom-shim@npm:9.1.0": + version: 9.1.0 + resolution: "@storybook/react-dom-shim@npm:9.1.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.18 - checksum: 10c0/d2382f892aedc38c45a1c574fc0f80933d07518ded315e7765d024e1dd96cfe1be53e5c4438c2ed7f78e2d8128e96d0bb551b664a42c24dbc2337064a7207239 + storybook: ^9.1.0 + checksum: 10c0/8dd8ee7c3835862ee78619b97fc6f2c458f818238fe58d6ab415cb2be8b267f862c04b89762a611263c0c32066df7636226c045c954b9825a66340d22ce68254 languageName: node linkType: hard "@storybook/react-vite@npm:^9.0.6": - version: 9.0.18 - resolution: "@storybook/react-vite@npm:9.0.18" + version: 9.1.0 + resolution: "@storybook/react-vite@npm:9.1.0" dependencies: "@joshwooding/vite-plugin-react-docgen-typescript": "npm:0.6.1" "@rollup/pluginutils": "npm:^5.0.2" - "@storybook/builder-vite": "npm:9.0.18" - "@storybook/react": "npm:9.0.18" + "@storybook/builder-vite": "npm:9.1.0" + "@storybook/react": "npm:9.1.0" find-up: "npm:^7.0.0" magic-string: "npm:^0.30.0" react-docgen: "npm:^8.0.0" @@ -3186,27 +3186,27 @@ __metadata: peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.18 + storybook: ^9.1.0 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - checksum: 10c0/25b325da98620d5c2fac6570cd5927b894f002ae1da7fb0e6e4348eb14a87688a08bf0d276f8bde51bdde8ab06a2a5c0b849bff43b183f19e1ed7be85ae22aa2 + checksum: 10c0/a56b006cfe26d5969259a39af63cac2f8a1d811993d21d9cb0a008b2511b65f64a90524527153ec48d2d57409c1538a4f4429b53605962d65509d91ab8074f4f languageName: node linkType: hard -"@storybook/react@npm:9.0.18": - version: 9.0.18 - resolution: "@storybook/react@npm:9.0.18" +"@storybook/react@npm:9.1.0": + version: 9.1.0 + resolution: "@storybook/react@npm:9.1.0" dependencies: "@storybook/global": "npm:^5.0.0" - "@storybook/react-dom-shim": "npm:9.0.18" + "@storybook/react-dom-shim": "npm:9.1.0" peerDependencies: react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta - storybook: ^9.0.18 + storybook: ^9.1.0 typescript: ">= 4.9.x" peerDependenciesMeta: typescript: optional: true - checksum: 10c0/b18aa5e0b6f099ea129017cad166ed5a4f28a07f48a2efda0c1fb13d1c9433df6a5de3d663275e92c8ef8353b6d5c92e1febe603992dc25603c8e31fd3620255 + checksum: 10c0/302f0f6a80bfd867e3c33ae2e7d5be9d58fa79e4dc59b4ca5bd929397d7dd6fc28ace5b1fc7474a77e0a7287d5a946445fa1b25ca81004c4f20d900a48731af3 languageName: node linkType: hard @@ -3269,90 +3269,90 @@ __metadata: languageName: node linkType: hard -"@swc/core-darwin-arm64@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-darwin-arm64@npm:1.13.2" +"@swc/core-darwin-arm64@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-darwin-arm64@npm:1.13.3" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@swc/core-darwin-x64@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-darwin-x64@npm:1.13.2" +"@swc/core-darwin-x64@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-darwin-x64@npm:1.13.3" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@swc/core-linux-arm-gnueabihf@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-linux-arm-gnueabihf@npm:1.13.2" +"@swc/core-linux-arm-gnueabihf@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-linux-arm-gnueabihf@npm:1.13.3" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@swc/core-linux-arm64-gnu@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-linux-arm64-gnu@npm:1.13.2" +"@swc/core-linux-arm64-gnu@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-linux-arm64-gnu@npm:1.13.3" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-arm64-musl@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-linux-arm64-musl@npm:1.13.2" +"@swc/core-linux-arm64-musl@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-linux-arm64-musl@npm:1.13.3" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@swc/core-linux-x64-gnu@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-linux-x64-gnu@npm:1.13.2" +"@swc/core-linux-x64-gnu@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-linux-x64-gnu@npm:1.13.3" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@swc/core-linux-x64-musl@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-linux-x64-musl@npm:1.13.2" +"@swc/core-linux-x64-musl@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-linux-x64-musl@npm:1.13.3" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@swc/core-win32-arm64-msvc@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-win32-arm64-msvc@npm:1.13.2" +"@swc/core-win32-arm64-msvc@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-win32-arm64-msvc@npm:1.13.3" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@swc/core-win32-ia32-msvc@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-win32-ia32-msvc@npm:1.13.2" +"@swc/core-win32-ia32-msvc@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-win32-ia32-msvc@npm:1.13.3" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@swc/core-win32-x64-msvc@npm:1.13.2": - version: 1.13.2 - resolution: "@swc/core-win32-x64-msvc@npm:1.13.2" +"@swc/core-win32-x64-msvc@npm:1.13.3": + version: 1.13.3 + resolution: "@swc/core-win32-x64-msvc@npm:1.13.3" conditions: os=win32 & cpu=x64 languageName: node linkType: hard "@swc/core@npm:^1.5.22": - version: 1.13.2 - resolution: "@swc/core@npm:1.13.2" - dependencies: - "@swc/core-darwin-arm64": "npm:1.13.2" - "@swc/core-darwin-x64": "npm:1.13.2" - "@swc/core-linux-arm-gnueabihf": "npm:1.13.2" - "@swc/core-linux-arm64-gnu": "npm:1.13.2" - "@swc/core-linux-arm64-musl": "npm:1.13.2" - "@swc/core-linux-x64-gnu": "npm:1.13.2" - "@swc/core-linux-x64-musl": "npm:1.13.2" - "@swc/core-win32-arm64-msvc": "npm:1.13.2" - "@swc/core-win32-ia32-msvc": "npm:1.13.2" - "@swc/core-win32-x64-msvc": "npm:1.13.2" + version: 1.13.3 + resolution: "@swc/core@npm:1.13.3" + dependencies: + "@swc/core-darwin-arm64": "npm:1.13.3" + "@swc/core-darwin-x64": "npm:1.13.3" + "@swc/core-linux-arm-gnueabihf": "npm:1.13.3" + "@swc/core-linux-arm64-gnu": "npm:1.13.3" + "@swc/core-linux-arm64-musl": "npm:1.13.3" + "@swc/core-linux-x64-gnu": "npm:1.13.3" + "@swc/core-linux-x64-musl": "npm:1.13.3" + "@swc/core-win32-arm64-msvc": "npm:1.13.3" + "@swc/core-win32-ia32-msvc": "npm:1.13.3" + "@swc/core-win32-x64-msvc": "npm:1.13.3" "@swc/counter": "npm:^0.1.3" "@swc/types": "npm:^0.1.23" peerDependencies: @@ -3381,7 +3381,7 @@ __metadata: peerDependenciesMeta: "@swc/helpers": optional: true - checksum: 10c0/aa961c45fc4bb7b427bdf3b061eb009da577b4347864c56e22526e9dd27c83b1dfa21b931ce3a2d130b47d8067bf01743a13fa9851eaff32475caf50f97a6388 + checksum: 10c0/88a04c319082f8ae5e53b7d7a874014600296087cad3e07d0e927088a19ba2e8355cbced7da02476b5f89cc653e26d1e1c44d9f43ef07fb7b74ec4b5f9e95ef6 languageName: node linkType: hard @@ -3757,11 +3757,11 @@ __metadata: linkType: hard "@types/babel__traverse@npm:*, @types/babel__traverse@npm:^7.0.6, @types/babel__traverse@npm:^7.18.0": - version: 7.20.7 - resolution: "@types/babel__traverse@npm:7.20.7" + version: 7.28.0 + resolution: "@types/babel__traverse@npm:7.28.0" dependencies: - "@babel/types": "npm:^7.20.7" - checksum: 10c0/5386f0af44f8746b063b87418f06129a814e16bb2686965a575e9d7376b360b088b89177778d8c426012abc43dd1a2d8ec3218bfc382280c898682746ce2ffbd + "@babel/types": "npm:^7.28.2" + checksum: 10c0/b52d7d4e8fc6a9018fe7361c4062c1c190f5778cf2466817cb9ed19d69fbbb54f9a85ffedeb748ed8062d2cf7d4cc088ee739848f47c57740de1c48cbf0d0994 languageName: node linkType: hard @@ -3877,11 +3877,11 @@ __metadata: linkType: hard "@types/react@npm:^19.0.0": - version: 19.1.8 - resolution: "@types/react@npm:19.1.8" + version: 19.1.9 + resolution: "@types/react@npm:19.1.9" dependencies: csstype: "npm:^3.0.2" - checksum: 10c0/4908772be6dc941df276931efeb0e781777fa76e4d5d12ff9f75eb2dcc2db3065e0100efde16fde562c5bafa310cc8f50c1ee40a22640459e066e72cd342143e + checksum: 10c0/b418da4aaf18fbc6df4f1b7096dda7ee152d697cac00d729ffd855b2b44a3a9cfb2ecb017ed20979ea3a7d98a5ce5fcf01ac1a3614d4a3e4d7069a0c45e49b0f languageName: node linkType: hard @@ -4095,6 +4095,25 @@ __metadata: languageName: node linkType: hard +"@vitest/mocker@npm:3.2.4": + version: 3.2.4 + resolution: "@vitest/mocker@npm:3.2.4" + dependencies: + "@vitest/spy": "npm:3.2.4" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 || ^7.0.0-0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10c0/f7a4aea19bbbf8f15905847ee9143b6298b2c110f8b64789224cb0ffdc2e96f9802876aa2ca83f1ec1b6e1ff45e822abb34f0054c24d57b29ab18add06536ccd + languageName: node + linkType: hard + "@vitest/pretty-format@npm:2.0.5": version: 2.0.5 resolution: "@vitest/pretty-format@npm:2.0.5" @@ -4649,8 +4668,8 @@ __metadata: linkType: hard "babel-preset-current-node-syntax@npm:^1.0.0": - version: 1.1.0 - resolution: "babel-preset-current-node-syntax@npm:1.1.0" + version: 1.2.0 + resolution: "babel-preset-current-node-syntax@npm:1.2.0" dependencies: "@babel/plugin-syntax-async-generators": "npm:^7.8.4" "@babel/plugin-syntax-bigint": "npm:^7.8.3" @@ -4668,8 +4687,8 @@ __metadata: "@babel/plugin-syntax-private-property-in-object": "npm:^7.14.5" "@babel/plugin-syntax-top-level-await": "npm:^7.14.5" peerDependencies: - "@babel/core": ^7.0.0 - checksum: 10c0/0b838d4412e3322cb4436f246e24e9c00bebcedfd8f00a2f51489db683bd35406bbd55a700759c28d26959c6e03f84dd6a1426f576f440267c1d7a73c5717281 + "@babel/core": ^7.0.0 || ^8.0.0-0 + checksum: 10c0/94a4f81cddf9b051045d08489e4fff7336292016301664c138cfa3d9ffe3fe2ba10a24ad6ae589fd95af1ac72ba0216e1653555c187e694d7b17be0c002bea10 languageName: node linkType: hard @@ -4877,9 +4896,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001702, caniuse-lite@npm:^1.0.30001726": - version: 1.0.30001727 - resolution: "caniuse-lite@npm:1.0.30001727" - checksum: 10c0/f0a441c05d8925d728c2d02ce23b001935f52183a3bf669556f302568fe258d1657940c7ac0b998f92bc41383e185b390279a7d779e6d96a2b47881f56400221 + version: 1.0.30001731 + resolution: "caniuse-lite@npm:1.0.30001731" + checksum: 10c0/d8cddf817d5bec8e7c2106affdbf1bfc3923463ca16697c992b2efeb043e6a5d9dcb70cda913bc6acf9112fd66f9e80279316c08e7800359116925066a63fdfa languageName: node linkType: hard @@ -5532,9 +5551,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.173": - version: 1.5.191 - resolution: "electron-to-chromium@npm:1.5.191" - checksum: 10c0/26b22ec2ae2a152da09f062d8582e54384a15ddc2a27149cdc2747a0c3f46154370a37b9e687de2d6d71ea1ebc1319f8394283ffb1581f1d4495cdefffd7a2a6 + version: 1.5.194 + resolution: "electron-to-chromium@npm:1.5.194" + checksum: 10c0/7d72617857055d54552380b34be411933966fa1156dc8653e321d14e82e2af84114bac607e9e2926f885d560b2697a324981e4204d3da4e0f9604d4a468eeba1 languageName: node linkType: hard @@ -6111,12 +6130,12 @@ __metadata: linkType: hard "follow-redirects@npm:^1.0.0, follow-redirects@npm:^1.15.6": - version: 1.15.9 - resolution: "follow-redirects@npm:1.15.9" + version: 1.15.11 + resolution: "follow-redirects@npm:1.15.11" peerDependenciesMeta: debug: optional: true - checksum: 10c0/5829165bd112c3c0e82be6c15b1a58fa9dcfaede3b3c54697a82fe4a62dd5ae5e8222956b448d2f98e331525f05d00404aba7d696de9e761ef6e42fdc780244f + checksum: 10c0/d301f430542520a54058d4aeeb453233c564aaccac835d29d15e050beb33f339ad67d9bddbce01739c5dc46a6716dbe3d9d0d5134b1ca203effa11a7ef092343 languageName: node linkType: hard @@ -7052,9 +7071,9 @@ __metadata: linkType: hard "isbot@npm:^5.1.11": - version: 5.1.28 - resolution: "isbot@npm:5.1.28" - checksum: 10c0/1e9417986613e4b493e57e20b813d7e0130c845657ff14a11d39e4bf326056065850bf52773767f2681c0b7b146ba833d4686db16017dfbadd85a206c8396d90 + version: 5.1.29 + resolution: "isbot@npm:5.1.29" + checksum: 10c0/a230429cf6de4b551c129aee8a52b65a6f298a440301537072ddfe94e1eeb481d55bbab1a743084d079c23c71e72ebd89a421d6f7e897f9807493a2f4900319d languageName: node linkType: hard @@ -8248,6 +8267,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:10.0.3, minimatch@npm:^10.0.3": + version: 10.0.3 + resolution: "minimatch@npm:10.0.3" + dependencies: + "@isaacs/brace-expansion": "npm:^5.0.0" + checksum: 10c0/e43e4a905c5d70ac4cec8530ceaeccb9c544b1ba8ac45238e2a78121a01c17ff0c373346472d221872563204eabe929ad02669bb575cb1f0cc30facab369f70f + languageName: node + linkType: hard + "minimatch@npm:9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -8257,15 +8285,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^10.0.3": - version: 10.0.3 - resolution: "minimatch@npm:10.0.3" - dependencies: - "@isaacs/brace-expansion": "npm:^5.0.0" - checksum: 10c0/e43e4a905c5d70ac4cec8530ceaeccb9c544b1ba8ac45238e2a78121a01c17ff0c373346472d221872563204eabe929ad02669bb575cb1f0cc30facab369f70f - languageName: node - linkType: hard - "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -8284,15 +8303,6 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:~3.0.3": - version: 3.0.8 - resolution: "minimatch@npm:3.0.8" - dependencies: - brace-expansion: "npm:^1.1.7" - checksum: 10c0/72b226f452dcfb5075255f53534cb83fc25565b909e79b9be4fad463d735cb1084827f7013ff41d050e77ee6e474408c6073473edd2fb72c2fd630cfb0acc6ad - languageName: node - linkType: hard - "minimist@npm:^1.2.6, minimist@npm:^1.2.8": version: 1.2.8 resolution: "minimist@npm:1.2.8" @@ -8461,8 +8471,8 @@ __metadata: linkType: hard "node-gyp@npm:latest": - version: 11.2.0 - resolution: "node-gyp@npm:11.2.0" + version: 11.3.0 + resolution: "node-gyp@npm:11.3.0" dependencies: env-paths: "npm:^2.2.0" exponential-backoff: "npm:^3.1.1" @@ -8476,7 +8486,7 @@ __metadata: which: "npm:^5.0.0" bin: node-gyp: bin/node-gyp.js - checksum: 10c0/bd8d8c76b06be761239b0c8680f655f6a6e90b48e44d43415b11c16f7e8c15be346fba0cbf71588c7cdfb52c419d928a7d3db353afc1d952d19756237d8f10b9 + checksum: 10c0/5f4ad5a729386f7b50096efd4934b06c071dbfbc7d7d541a66d6959a7dccd62f53ff3dc95fffb60bf99d8da1270e23769f82246fcaa6c5645a70c967ae9a3398 languageName: node linkType: hard @@ -9019,27 +9029,27 @@ __metadata: languageName: node linkType: hard -"playwright-core@npm:1.54.1, playwright-core@npm:>=1.2.0": - version: 1.54.1 - resolution: "playwright-core@npm:1.54.1" +"playwright-core@npm:1.54.2, playwright-core@npm:>=1.2.0": + version: 1.54.2 + resolution: "playwright-core@npm:1.54.2" bin: playwright-core: cli.js - checksum: 10c0/b821262b024d7753b1bfa71eb2bc99f2dda12a869d175b2e1bc6ac2764bd661baf36d9d42f45caf622854ad7e4a6077b9b57014c74bb5a78fe339c9edf1c9019 + checksum: 10c0/44850e20bf35237c8c3dedf1096c655f8af939dde53c5469f72cae3dd744966858a302419b909a73d7a2093323123e7ebcc0fdd55151b4193afb7812c1fd2c88 languageName: node linkType: hard "playwright@npm:^1.14.0": - version: 1.54.1 - resolution: "playwright@npm:1.54.1" + version: 1.54.2 + resolution: "playwright@npm:1.54.2" dependencies: fsevents: "npm:2.3.2" - playwright-core: "npm:1.54.1" + playwright-core: "npm:1.54.2" dependenciesMeta: fsevents: optional: true bin: playwright: cli.js - checksum: 10c0/c5fedae31a03a1f4c4846569aef3ffb98da23000a4d255abfc8c2ede15b43cc7cd87b80f6fa078666c030373de8103787cf77ef7653ae9458aabbbd4320c2599 + checksum: 10c0/6f642fa70179eee5d5bf8a90df2a6147c9638ff926f4f3ad0a0517396b8a3fe00ccebf13377e032a75b3f0b2610ec1562293e0cfc3bde234181c7a50af8af80a languageName: node linkType: hard @@ -9264,22 +9274,22 @@ __metadata: linkType: hard "react-dom@npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0": - version: 19.1.0 - resolution: "react-dom@npm:19.1.0" + version: 19.1.1 + resolution: "react-dom@npm:19.1.1" dependencies: scheduler: "npm:^0.26.0" peerDependencies: - react: ^19.1.0 - checksum: 10c0/3e26e89bb6c67c9a6aa86cb888c7a7f8258f2e347a6d2a15299c17eb16e04c19194e3452bc3255bd34000a61e45e2cb51e46292392340432f133e5a5d2dfb5fc + react: ^19.1.1 + checksum: 10c0/8c91198510521299c56e4e8d5e3a4508b2734fb5e52f29eeac33811de64e76fe586ad32c32182e2e84e070d98df67125da346c3360013357228172dbcd20bcdd languageName: node linkType: hard "react-hook-form@npm:^7.51.0, react-hook-form@npm:^7.53.1": - version: 7.61.1 - resolution: "react-hook-form@npm:7.61.1" + version: 7.62.0 + resolution: "react-hook-form@npm:7.62.0" peerDependencies: react: ^16.8.0 || ^17 || ^18 || ^19 - checksum: 10c0/c241bca80f6d5f9f8b4f24b668670a3ee7249f9cf99537219c4ac1072431493d3768a910b6f2aaff20689a727d0e2797aeacb1ab9285b3e59309de3dd1bead41 + checksum: 10c0/451a25a2ddf07be14f690d2ad3f2f970e0b933fd059ef141c6da9e19d0566d739e9d5cc9c482e3533f3fd01d97e658b896a01ce45a1259ad7b0d4638ba0112c6 languageName: node linkType: hard @@ -9391,9 +9401,9 @@ __metadata: linkType: hard "react@npm:^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0, react@npm:^19.0.0": - version: 19.1.0 - resolution: "react@npm:19.1.0" - checksum: 10c0/530fb9a62237d54137a13d2cfb67a7db6a2156faed43eecc423f4713d9b20c6f2728b026b45e28fcd72e8eadb9e9ed4b089e99f5e295d2f0ad3134251bdd3698 + version: 19.1.1 + resolution: "react@npm:19.1.1" + checksum: 10c0/8c9769a2dfd02e603af6445058325e6c8a24b47b185d0e461f66a6454765ddcaecb3f0a90184836c68bb509f3c38248359edbc42f0d07c23eb500a5c30c87b4e languageName: node linkType: hard @@ -9598,29 +9608,29 @@ __metadata: linkType: hard "rollup@npm:^4.34.9, rollup@npm:^4.40.0": - version: 4.46.0 - resolution: "rollup@npm:4.46.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.46.0" - "@rollup/rollup-android-arm64": "npm:4.46.0" - "@rollup/rollup-darwin-arm64": "npm:4.46.0" - "@rollup/rollup-darwin-x64": "npm:4.46.0" - "@rollup/rollup-freebsd-arm64": "npm:4.46.0" - "@rollup/rollup-freebsd-x64": "npm:4.46.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.46.0" - "@rollup/rollup-linux-arm-musleabihf": "npm:4.46.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.46.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.46.0" - "@rollup/rollup-linux-loongarch64-gnu": "npm:4.46.0" - "@rollup/rollup-linux-ppc64-gnu": "npm:4.46.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.46.0" - "@rollup/rollup-linux-riscv64-musl": "npm:4.46.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.46.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.46.0" - "@rollup/rollup-linux-x64-musl": "npm:4.46.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.46.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.46.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.46.0" + version: 4.46.2 + resolution: "rollup@npm:4.46.2" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.46.2" + "@rollup/rollup-android-arm64": "npm:4.46.2" + "@rollup/rollup-darwin-arm64": "npm:4.46.2" + "@rollup/rollup-darwin-x64": "npm:4.46.2" + "@rollup/rollup-freebsd-arm64": "npm:4.46.2" + "@rollup/rollup-freebsd-x64": "npm:4.46.2" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.46.2" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.46.2" + "@rollup/rollup-linux-arm64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-arm64-musl": "npm:4.46.2" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-riscv64-musl": "npm:4.46.2" + "@rollup/rollup-linux-s390x-gnu": "npm:4.46.2" + "@rollup/rollup-linux-x64-gnu": "npm:4.46.2" + "@rollup/rollup-linux-x64-musl": "npm:4.46.2" + "@rollup/rollup-win32-arm64-msvc": "npm:4.46.2" + "@rollup/rollup-win32-ia32-msvc": "npm:4.46.2" + "@rollup/rollup-win32-x64-msvc": "npm:4.46.2" "@types/estree": "npm:1.0.8" fsevents: "npm:~2.3.2" dependenciesMeta: @@ -9668,7 +9678,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10c0/0e85ffd629de5ac8b714ce71ecf354cd3ef3357b430edb4103a3cae3fbff380a2680083dd6428d196584a6b287b4fa05d27563f85ac66400fb26d0dc5a6bb731 + checksum: 10c0/f428497fe119fe7c4e34f1020d45ba13e99b94c9aa36958d88823d932b155c9df3d84f53166f3ee913ff68ea6c7599a9ab34861d88562ad9d8420f64ca5dad4c languageName: node linkType: hard @@ -10108,13 +10118,14 @@ __metadata: linkType: hard "storybook@npm:^9.0.6": - version: 9.0.18 - resolution: "storybook@npm:9.0.18" + version: 9.1.0 + resolution: "storybook@npm:9.1.0" dependencies: "@storybook/global": "npm:^5.0.0" "@testing-library/jest-dom": "npm:^6.6.3" "@testing-library/user-event": "npm:^14.6.1" "@vitest/expect": "npm:3.2.4" + "@vitest/mocker": "npm:3.2.4" "@vitest/spy": "npm:3.2.4" better-opn: "npm:^3.0.2" esbuild: "npm:^0.18.0 || ^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0 || ^0.25.0" @@ -10129,7 +10140,7 @@ __metadata: optional: true bin: storybook: ./bin/index.cjs - checksum: 10c0/6db67e2c51a445d5aeee900cf553214f7b33834d395b1c12d40b28d6d35d6271826dcaa6e84d11aceadd0f69b38e447f82a4b215d1a92faeadca559d81df5e9a + checksum: 10c0/6360491360303042fd0e3fb1d6420eea78099e52c1ae49515ed1a4acaf8934df533e30d2c048f7db161daf0e7550c459353304f5ac58c6b74168f37524420c74 languageName: node linkType: hard @@ -10613,12 +10624,12 @@ __metadata: linkType: hard "typescript@npm:^5.7.2": - version: 5.8.3 - resolution: "typescript@npm:5.8.3" + version: 5.9.2 + resolution: "typescript@npm:5.9.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/5f8bb01196e542e64d44db3d16ee0e4063ce4f3e3966df6005f2588e86d91c03e1fb131c2581baf0fb65ee79669eea6e161cd448178986587e9f6844446dbb48 + checksum: 10c0/cd635d50f02d6cf98ed42de2f76289701c1ec587a363369255f01ed15aaf22be0813226bff3c53e99d971f9b540e0b3cc7583dbe05faded49b1b0bed2f638a18 languageName: node linkType: hard @@ -10633,12 +10644,12 @@ __metadata: linkType: hard "typescript@patch:typescript@npm%3A^5.7.2#optional!builtin": - version: 5.8.3 - resolution: "typescript@patch:typescript@npm%3A5.8.3#optional!builtin::version=5.8.3&hash=5786d5" + version: 5.9.2 + resolution: "typescript@patch:typescript@npm%3A5.9.2#optional!builtin::version=5.9.2&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10c0/39117e346ff8ebd87ae1510b3a77d5d92dae5a89bde588c747d25da5c146603a99c8ee588c7ef80faaf123d89ed46f6dbd918d534d641083177d5fac38b8a1cb + checksum: 10c0/34d2a8e23eb8e0d1875072064d5e1d9c102e0bdce56a10a25c0b917b8aa9001a9cf5c225df12497e99da107dc379360bc138163c66b55b95f5b105b50578067e languageName: node linkType: hard From a78b152a219bdcac20adb77e6a663c995790015f Mon Sep 17 00:00:00 2001 From: "codegen-sh[bot]" <131295404+codegen-sh[bot]@users.noreply.github.com> Date: Sun, 3 Aug 2025 04:40:38 +0000 Subject: [PATCH 5/5] feat: export PasswordToggleButtonProps interface - Define and export PasswordToggleButtonProps interface according to coding guidelines - Components should export both the component and its props type - Replace inline props definition with exported interface for better reusability --- packages/components/src/ui/password-field.tsx | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/components/src/ui/password-field.tsx b/packages/components/src/ui/password-field.tsx index e9d0c598..650e8c37 100644 --- a/packages/components/src/ui/password-field.tsx +++ b/packages/components/src/ui/password-field.tsx @@ -14,15 +14,13 @@ import { import { type InputProps, TextInput } from './text-input'; import { cn } from './utils'; -export const PasswordToggleButton = ({ - isVisible, - onToggle, - className, -}: { +export interface PasswordToggleButtonProps { isVisible: boolean; onToggle: () => void; className?: string; -}) => { +} + +export const PasswordToggleButton = ({ isVisible, onToggle, className }: PasswordToggleButtonProps) => { return (