From fb860884857da73ee5b5e897745301cdf1d770a2 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Thu, 5 Oct 2023 18:58:30 +0200 Subject: refactor(components): make form components compliant with Eslint rules --- .../fields/boolean-field/boolean-field.stories.tsx | 15 +++--- .../fields/boolean-field/boolean-field.test.tsx | 6 +-- .../forms/fields/boolean-field/boolean-field.tsx | 2 +- .../atoms/forms/fields/checkbox/checkbox.test.tsx | 6 +-- .../atoms/forms/fields/checkbox/checkbox.tsx | 5 +- .../atoms/forms/fields/fields.module.scss | 1 - .../atoms/forms/fields/input/input.stories.tsx | 34 ++++++------- .../atoms/forms/fields/input/input.test.tsx | 6 +-- src/components/atoms/forms/fields/input/input.tsx | 9 +--- .../atoms/forms/fields/radio/radio.test.tsx | 6 +-- src/components/atoms/forms/fields/radio/radio.tsx | 5 +- .../atoms/forms/fields/select/select.stories.tsx | 4 +- .../atoms/forms/fields/select/select.test.tsx | 6 +-- .../atoms/forms/fields/select/select.tsx | 11 +---- .../forms/fields/text-area/text-area.stories.tsx | 4 +- .../forms/fields/text-area/text-area.test.tsx | 4 +- .../atoms/forms/fields/text-area/text-area.tsx | 7 --- .../atoms/forms/fieldset/fieldset.stories.tsx | 46 +++++++++--------- .../atoms/forms/fieldset/fieldset.test.tsx | 10 ++-- src/components/atoms/forms/fieldset/fieldset.tsx | 6 +-- src/components/atoms/forms/form/form.test.tsx | 10 ++-- src/components/atoms/forms/label/label.stories.tsx | 2 +- src/components/atoms/forms/label/label.test.tsx | 4 +- src/components/atoms/forms/label/label.tsx | 2 +- .../atoms/forms/legend/legend.stories.tsx | 4 +- src/components/atoms/forms/legend/legend.test.tsx | 4 +- .../labelled-field/labelled-field.stories.tsx | 8 ++-- .../forms/labelled-field/labelled-field.test.tsx | 6 +-- .../forms/labelled-field/labelled-field.tsx | 43 +++++++++++------ .../forms/radio-group/radio-group.fixture.ts | 41 ++++++++++++++++ .../forms/radio-group/radio-group.fixture.tsx | 41 ---------------- .../forms/radio-group/radio-group.stories.tsx | 4 +- .../forms/radio-group/radio-group.test.tsx | 8 ++-- .../molecules/forms/radio-group/radio-group.tsx | 9 ++-- .../molecules/forms/switch/switch.stories.tsx | 6 +-- .../molecules/forms/switch/switch.test.tsx | 12 ++--- src/components/molecules/forms/switch/switch.tsx | 55 +++++++++++++++------- .../forms/ackee-toggle/ackee-toggle.fixture.ts | 1 + .../forms/ackee-toggle/ackee-toggle.fixture.tsx | 1 - .../forms/ackee-toggle/ackee-toggle.stories.tsx | 2 +- .../forms/ackee-toggle/ackee-toggle.test.tsx | 4 +- .../forms/comment-form/comment-form.stories.tsx | 16 +++---- .../forms/comment-form/comment-form.test.tsx | 6 +-- .../forms/contact-form/contact-form.stories.tsx | 9 ++-- .../forms/contact-form/contact-form.test.tsx | 18 ++++--- .../forms/motion-toggle/motion-toggle.fixture.ts | 1 + .../forms/motion-toggle/motion-toggle.fixture.tsx | 1 - .../forms/motion-toggle/motion-toggle.stories.tsx | 2 +- .../forms/motion-toggle/motion-toggle.test.tsx | 4 +- .../forms/motion-toggle/motion-toggle.tsx | 14 ++++-- .../prism-theme-toggle.stories.tsx | 2 +- .../prism-theme-toggle/prism-theme-toggle.test.tsx | 4 +- .../forms/search-form/search-form.module.scss | 3 ++ .../forms/search-form/search-form.stories.tsx | 2 +- .../forms/search-form/search-form.test.tsx | 8 ++-- .../forms/theme-toggle/theme-toggle.stories.tsx | 2 +- .../forms/theme-toggle/theme-toggle.test.tsx | 4 +- 57 files changed, 291 insertions(+), 265 deletions(-) create mode 100644 src/components/molecules/forms/radio-group/radio-group.fixture.ts delete mode 100644 src/components/molecules/forms/radio-group/radio-group.fixture.tsx create mode 100644 src/components/organisms/forms/ackee-toggle/ackee-toggle.fixture.ts delete mode 100644 src/components/organisms/forms/ackee-toggle/ackee-toggle.fixture.tsx create mode 100644 src/components/organisms/forms/motion-toggle/motion-toggle.fixture.ts delete mode 100644 src/components/organisms/forms/motion-toggle/motion-toggle.fixture.tsx (limited to 'src') diff --git a/src/components/atoms/forms/fields/boolean-field/boolean-field.stories.tsx b/src/components/atoms/forms/fields/boolean-field/boolean-field.stories.tsx index cb017da..60dd352 100644 --- a/src/components/atoms/forms/fields/boolean-field/boolean-field.stories.tsx +++ b/src/components/atoms/forms/fields/boolean-field/boolean-field.stories.tsx @@ -1,5 +1,5 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { useState } from 'react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { useCallback, useState } from 'react'; import { BooleanField } from './boolean-field'; /** @@ -138,15 +138,12 @@ const Template: ComponentStory = ({ ...args }) => { const [isChecked, setIsChecked] = useState(checked); + const handleChange = useCallback(() => { + setIsChecked((prev) => !prev); + }, []); return ( - { - setIsChecked(!isChecked); - }} - {...args} - /> + ); }; diff --git a/src/components/atoms/forms/fields/boolean-field/boolean-field.test.tsx b/src/components/atoms/forms/fields/boolean-field/boolean-field.test.tsx index 1c7fe36..82c42d9 100644 --- a/src/components/atoms/forms/fields/boolean-field/boolean-field.test.tsx +++ b/src/components/atoms/forms/fields/boolean-field/boolean-field.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { BooleanField } from './boolean-field'; const handleChange = () => { @@ -19,7 +19,7 @@ describe('boolean field', () => { value="checkbox" /> ); - expect(screen.getByRole('checkbox')).toBeInTheDocument(); + expect(rtlScreen.getByRole('checkbox')).toBeInTheDocument(); }); it('renders a radio button', () => { @@ -32,6 +32,6 @@ describe('boolean field', () => { value="checkbox" /> ); - expect(screen.getByRole('radio')).toBeInTheDocument(); + expect(rtlScreen.getByRole('radio')).toBeInTheDocument(); }); }); diff --git a/src/components/atoms/forms/fields/boolean-field/boolean-field.tsx b/src/components/atoms/forms/fields/boolean-field/boolean-field.tsx index 7985c0b..5476cf5 100644 --- a/src/components/atoms/forms/fields/boolean-field/boolean-field.tsx +++ b/src/components/atoms/forms/fields/boolean-field/boolean-field.tsx @@ -1,4 +1,4 @@ -import { FC, InputHTMLAttributes } from 'react'; +import type { FC, InputHTMLAttributes } from 'react'; import styles from './boolean-field.module.scss'; export type BooleanFieldProps = Omit< diff --git a/src/components/atoms/forms/fields/checkbox/checkbox.test.tsx b/src/components/atoms/forms/fields/checkbox/checkbox.test.tsx index 59f9a4b..75fff77 100644 --- a/src/components/atoms/forms/fields/checkbox/checkbox.test.tsx +++ b/src/components/atoms/forms/fields/checkbox/checkbox.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Checkbox } from './checkbox'; const doNothing = () => { @@ -16,7 +16,7 @@ describe('Checkbox', () => { value="checkbox" /> ); - expect(screen.getByRole('checkbox')).not.toBeChecked(); + expect(rtlScreen.getByRole('checkbox')).not.toBeChecked(); }); it('renders a checked checkbox', () => { @@ -29,6 +29,6 @@ describe('Checkbox', () => { value="checkbox" /> ); - expect(screen.getByRole('checkbox')).toBeChecked(); + expect(rtlScreen.getByRole('checkbox')).toBeChecked(); }); }); diff --git a/src/components/atoms/forms/fields/checkbox/checkbox.tsx b/src/components/atoms/forms/fields/checkbox/checkbox.tsx index 2ac3809..9c175b7 100644 --- a/src/components/atoms/forms/fields/checkbox/checkbox.tsx +++ b/src/components/atoms/forms/fields/checkbox/checkbox.tsx @@ -1,5 +1,5 @@ -import { FC } from 'react'; -import { BooleanField, BooleanFieldProps } from '../boolean-field'; +import type { FC } from 'react'; +import { BooleanField, type BooleanFieldProps } from '../boolean-field'; export type CheckboxProps = Omit; @@ -9,5 +9,6 @@ export type CheckboxProps = Omit; * Render a checkbox input type. */ export const Checkbox: FC = (props) => ( + // eslint-disable-next-line react/jsx-no-literals -- Type allowed ); diff --git a/src/components/atoms/forms/fields/fields.module.scss b/src/components/atoms/forms/fields/fields.module.scss index f09117d..363c7ee 100644 --- a/src/components/atoms/forms/fields/fields.module.scss +++ b/src/components/atoms/forms/fields/fields.module.scss @@ -2,7 +2,6 @@ @use "../../../../styles/abstracts/mixins" as mix; .field { - width: 100%; padding: var(--spacing-2xs) var(--spacing-xs); background: var(--color-bg-tertiary); border: fun.convert-px(2) solid var(--color-border); diff --git a/src/components/atoms/forms/fields/input/input.stories.tsx b/src/components/atoms/forms/fields/input/input.stories.tsx index 35657f8..4744bc5 100644 --- a/src/components/atoms/forms/fields/input/input.stories.tsx +++ b/src/components/atoms/forms/fields/input/input.stories.tsx @@ -1,5 +1,5 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { ChangeEvent, useCallback, useState } from 'react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { type ChangeEvent, useCallback, useState } from 'react'; import { Input } from './input'; /** @@ -187,50 +187,50 @@ const Template: ComponentStory = ({ }; /** - * Input Story - DateTime + * Input Story - DateTimeField */ -export const DateTime = Template.bind({}); -DateTime.args = { +export const DateTimeField = Template.bind({}); +DateTimeField.args = { id: 'field-storybook', name: 'field-storybook', type: 'datetime-local', }; /** - * Input Story - Email + * Input Story - EmailField */ -export const Email = Template.bind({}); -Email.args = { +export const EmailField = Template.bind({}); +EmailField.args = { id: 'field-storybook', name: 'field-storybook', type: 'email', }; /** - * Input Story - Numeric + * Input Story - NumericField */ -export const Numeric = Template.bind({}); -Numeric.args = { +export const NumericField = Template.bind({}); +NumericField.args = { id: 'field-storybook', name: 'field-storybook', type: 'number', }; /** - * Input Story - Text + * Input Story - TextField */ -export const Text = Template.bind({}); -Text.args = { +export const TextField = Template.bind({}); +TextField.args = { id: 'field-storybook', name: 'field-storybook', type: 'text', }; /** - * Input Story - Time + * Input Story - TimeField */ -export const Time = Template.bind({}); -Time.args = { +export const TimeField = Template.bind({}); +TimeField.args = { id: 'field-storybook', name: 'field-storybook', type: 'time', diff --git a/src/components/atoms/forms/fields/input/input.test.tsx b/src/components/atoms/forms/fields/input/input.test.tsx index a5c4898..e97237d 100644 --- a/src/components/atoms/forms/fields/input/input.test.tsx +++ b/src/components/atoms/forms/fields/input/input.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Input } from './input'; const doNothing = () => { @@ -17,7 +17,7 @@ describe('Input', () => { value="" /> ); - expect(screen.getByRole('textbox')).toHaveAttribute('type', 'text'); + expect(rtlScreen.getByRole('textbox')).toHaveAttribute('type', 'text'); }); it('renders a search input', () => { @@ -30,6 +30,6 @@ describe('Input', () => { value="" /> ); - expect(screen.getByRole('searchbox')).toHaveAttribute('type', 'search'); + expect(rtlScreen.getByRole('searchbox')).toHaveAttribute('type', 'search'); }); }); diff --git a/src/components/atoms/forms/fields/input/input.tsx b/src/components/atoms/forms/fields/input/input.tsx index 0f0736c..c47534f 100644 --- a/src/components/atoms/forms/fields/input/input.tsx +++ b/src/components/atoms/forms/fields/input/input.tsx @@ -8,7 +8,7 @@ import styles from '../fields.module.scss'; export type InputProps = Omit< InputHTMLAttributes, - 'disabled' | 'hidden' | 'readonly' | 'required' | 'type' + 'disabled' | 'readonly' | 'required' | 'type' > & Required, 'id' | 'name'>> & { /** @@ -17,12 +17,6 @@ export type InputProps = Omit< * @default false */ isDisabled?: boolean; - /** - * Should the field be hidden? - * - * @default false - */ - isHidden?: boolean; /** * Should the field be readonly? * @@ -45,7 +39,6 @@ const InputWithRef = ( { className = '', isDisabled = false, - isHidden = false, isReadOnly = false, isRequired = false, ...props diff --git a/src/components/atoms/forms/fields/radio/radio.test.tsx b/src/components/atoms/forms/fields/radio/radio.test.tsx index ba8d68f..55eda9d 100644 --- a/src/components/atoms/forms/fields/radio/radio.test.tsx +++ b/src/components/atoms/forms/fields/radio/radio.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Radio } from './radio'; const doNothing = () => { @@ -11,7 +11,7 @@ describe('Radio', () => { render( ); - expect(screen.getByRole('radio')).not.toBeChecked(); + expect(rtlScreen.getByRole('radio')).not.toBeChecked(); }); it('renders a checked radio', () => { @@ -24,6 +24,6 @@ describe('Radio', () => { value="radio" /> ); - expect(screen.getByRole('radio')).toBeChecked(); + expect(rtlScreen.getByRole('radio')).toBeChecked(); }); }); diff --git a/src/components/atoms/forms/fields/radio/radio.tsx b/src/components/atoms/forms/fields/radio/radio.tsx index 6430b4a..5a518c7 100644 --- a/src/components/atoms/forms/fields/radio/radio.tsx +++ b/src/components/atoms/forms/fields/radio/radio.tsx @@ -1,5 +1,5 @@ -import { FC } from 'react'; -import { BooleanField, BooleanFieldProps } from '../boolean-field'; +import type { FC } from 'react'; +import { BooleanField, type BooleanFieldProps } from '../boolean-field'; export type RadioProps = Omit; @@ -9,5 +9,6 @@ export type RadioProps = Omit; * Render a radio input type. */ export const Radio: FC = (props) => ( + // eslint-disable-next-line react/jsx-no-literals -- Type allowed ); diff --git a/src/components/atoms/forms/fields/select/select.stories.tsx b/src/components/atoms/forms/fields/select/select.stories.tsx index c9e02d2..fddf354 100644 --- a/src/components/atoms/forms/fields/select/select.stories.tsx +++ b/src/components/atoms/forms/fields/select/select.stories.tsx @@ -1,5 +1,5 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { ChangeEvent, useCallback, useState } from 'react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { type ChangeEvent, useCallback, useState } from 'react'; import { Select as SelectComponent } from './select'; const selectOptions = [ diff --git a/src/components/atoms/forms/fields/select/select.test.tsx b/src/components/atoms/forms/fields/select/select.test.tsx index ae76c45..821a9aa 100644 --- a/src/components/atoms/forms/fields/select/select.test.tsx +++ b/src/components/atoms/forms/fields/select/select.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Select } from './select'; const doNothing = () => { @@ -25,7 +25,7 @@ describe('Select', () => { /> ); - expect(screen.getByRole('combobox')).toHaveValue(selected.value); + expect(rtlScreen.getByRole('combobox')).toHaveValue(selected.value); }); it('renders the select options', () => { @@ -39,6 +39,6 @@ describe('Select', () => { /> ); - expect(screen.getAllByRole('option')).toHaveLength(selectOptions.length); + expect(rtlScreen.getAllByRole('option')).toHaveLength(selectOptions.length); }); }); diff --git a/src/components/atoms/forms/fields/select/select.tsx b/src/components/atoms/forms/fields/select/select.tsx index 887dacc..7399727 100644 --- a/src/components/atoms/forms/fields/select/select.tsx +++ b/src/components/atoms/forms/fields/select/select.tsx @@ -1,4 +1,4 @@ -import { FC, SelectHTMLAttributes } from 'react'; +import type { FC, SelectHTMLAttributes } from 'react'; import styles from '../fields.module.scss'; export type SelectOptions = { @@ -18,7 +18,7 @@ export type SelectOptions = { export type SelectProps = Omit< SelectHTMLAttributes, - 'disabled' | 'hidden' | 'required' + 'disabled' | 'required' > & { /** * Should the select field be disabled? @@ -26,12 +26,6 @@ export type SelectProps = Omit< * @default false */ isDisabled?: boolean; - /** - * Should the select field be hidden? - * - * @default false - */ - isHidden?: boolean; /** * Is the select field required? * @@ -52,7 +46,6 @@ export type SelectProps = Omit< export const Select: FC = ({ className = '', isDisabled = false, - isHidden = false, isRequired = false, options, ...props diff --git a/src/components/atoms/forms/fields/text-area/text-area.stories.tsx b/src/components/atoms/forms/fields/text-area/text-area.stories.tsx index 2e77cb7..21214bd 100644 --- a/src/components/atoms/forms/fields/text-area/text-area.stories.tsx +++ b/src/components/atoms/forms/fields/text-area/text-area.stories.tsx @@ -1,5 +1,5 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { ChangeEvent, useCallback, useState } from 'react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { type ChangeEvent, useCallback, useState } from 'react'; import { TextArea as TextAreaComponent } from './text-area'; /** diff --git a/src/components/atoms/forms/fields/text-area/text-area.test.tsx b/src/components/atoms/forms/fields/text-area/text-area.test.tsx index 0079440..923f494 100644 --- a/src/components/atoms/forms/fields/text-area/text-area.test.tsx +++ b/src/components/atoms/forms/fields/text-area/text-area.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { TextArea } from './text-area'; const doNothing = () => { @@ -16,6 +16,6 @@ describe('TextArea', () => { value="" /> ); - expect(screen.getByRole('textbox')).toBeInTheDocument(); + expect(rtlScreen.getByRole('textbox')).toBeInTheDocument(); }); }); diff --git a/src/components/atoms/forms/fields/text-area/text-area.tsx b/src/components/atoms/forms/fields/text-area/text-area.tsx index bd99d7d..adb12eb 100644 --- a/src/components/atoms/forms/fields/text-area/text-area.tsx +++ b/src/components/atoms/forms/fields/text-area/text-area.tsx @@ -18,12 +18,6 @@ export type TextAreaProps = AllowedTextAreaProps & { * @default false */ isDisabled?: boolean; - /** - * Should the field be hidden? - * - * @default false - */ - isHidden?: boolean; /** * Should the field be readonly? * @@ -42,7 +36,6 @@ const TextAreaWithRef = ( { className = '', isDisabled = false, - isHidden = false, isReadOnly = false, isRequired = false, ...props diff --git a/src/components/atoms/forms/fieldset/fieldset.stories.tsx b/src/components/atoms/forms/fieldset/fieldset.stories.tsx index faf355f..a7d665d 100644 --- a/src/components/atoms/forms/fieldset/fieldset.stories.tsx +++ b/src/components/atoms/forms/fieldset/fieldset.stories.tsx @@ -1,7 +1,7 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Fieldset as FieldsetComponent } from './fieldset'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { Input } from '../fields'; import { Legend } from '../legend'; +import { Fieldset as FieldsetComponent } from './fieldset'; /** * Fieldset - Storybook Meta @@ -31,28 +31,26 @@ export default { }, } as ComponentMeta; -const Template: ComponentStory = (args) => { - return ( - -
- -
-
- -
-
- ); -}; +const Template: ComponentStory = (args) => ( + +
+ +
+
+ +
+
+); /** * Fieldset Story diff --git a/src/components/atoms/forms/fieldset/fieldset.test.tsx b/src/components/atoms/forms/fieldset/fieldset.test.tsx index 2554d59..86acc8b 100644 --- a/src/components/atoms/forms/fieldset/fieldset.test.tsx +++ b/src/components/atoms/forms/fieldset/fieldset.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Input } from '../fields'; import { Fieldset } from './fieldset'; @@ -15,8 +15,8 @@ describe('fieldset', () => { /> ); - expect(screen.getByRole('group')).toBeInTheDocument(); - expect(screen.getByRole('textbox')).not.toBeDisabled(); + expect(rtlScreen.getByRole('group')).toBeInTheDocument(); + expect(rtlScreen.getByRole('textbox')).not.toBeDisabled(); }); it('renders a disabled fieldset', () => { @@ -30,7 +30,7 @@ describe('fieldset', () => { /> ); - expect(screen.getByRole('group')).toBeInTheDocument(); - expect(screen.getByRole('textbox')).toBeDisabled(); + expect(rtlScreen.getByRole('group')).toBeInTheDocument(); + expect(rtlScreen.getByRole('textbox')).toBeDisabled(); }); }); diff --git a/src/components/atoms/forms/fieldset/fieldset.tsx b/src/components/atoms/forms/fieldset/fieldset.tsx index eb42961..85e7b3f 100644 --- a/src/components/atoms/forms/fieldset/fieldset.tsx +++ b/src/components/atoms/forms/fieldset/fieldset.tsx @@ -1,11 +1,11 @@ import { forwardRef, type FieldsetHTMLAttributes, - ForwardRefRenderFunction, - ReactElement, + type ForwardRefRenderFunction, + type ReactElement, } from 'react'; +import type { LegendProps } from '../legend'; import styles from './fieldset.module.scss'; -import { LegendProps } from '../legend'; export type FieldsetProps = Omit< FieldsetHTMLAttributes, diff --git a/src/components/atoms/forms/form/form.test.tsx b/src/components/atoms/forms/form/form.test.tsx index 217b7f6..90cac5f 100644 --- a/src/components/atoms/forms/form/form.test.tsx +++ b/src/components/atoms/forms/form/form.test.tsx @@ -1,14 +1,18 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Form } from './form'; +const doNothing = () => { + // Do nothing +}; + describe('Form', () => { it('renders a form', () => { render( -
null}> + Fields
); - expect(screen.getByRole('form')).toBeInTheDocument(); + expect(rtlScreen.getByRole('form')).toBeInTheDocument(); }); }); diff --git a/src/components/atoms/forms/label/label.stories.tsx b/src/components/atoms/forms/label/label.stories.tsx index 8460c45..195be97 100644 --- a/src/components/atoms/forms/label/label.stories.tsx +++ b/src/components/atoms/forms/label/label.stories.tsx @@ -1,4 +1,4 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { Label as LabelComponent } from './label'; /** diff --git a/src/components/atoms/forms/label/label.test.tsx b/src/components/atoms/forms/label/label.test.tsx index 710c80c..0c25379 100644 --- a/src/components/atoms/forms/label/label.test.tsx +++ b/src/components/atoms/forms/label/label.test.tsx @@ -1,10 +1,10 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Label } from './label'; describe('Label', () => { it('renders a field label', () => { render(); - expect(screen.getByText('A label')).toBeInTheDocument(); + expect(rtlScreen.getByText('A label')).toBeInTheDocument(); }); }); diff --git a/src/components/atoms/forms/label/label.tsx b/src/components/atoms/forms/label/label.tsx index 5087325..6692205 100644 --- a/src/components/atoms/forms/label/label.tsx +++ b/src/components/atoms/forms/label/label.tsx @@ -1,4 +1,4 @@ -import { FC, LabelHTMLAttributes, ReactNode } from 'react'; +import type { FC, LabelHTMLAttributes, ReactNode } from 'react'; import styles from './label.module.scss'; export type LabelSize = 'md' | 'sm'; diff --git a/src/components/atoms/forms/legend/legend.stories.tsx b/src/components/atoms/forms/legend/legend.stories.tsx index cda7f09..b23d889 100644 --- a/src/components/atoms/forms/legend/legend.stories.tsx +++ b/src/components/atoms/forms/legend/legend.stories.tsx @@ -1,6 +1,6 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Legend as LegendComponent } from './legend'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { Fieldset } from '../fieldset'; +import { Legend as LegendComponent } from './legend'; /** * Legend - Storybook Meta diff --git a/src/components/atoms/forms/legend/legend.test.tsx b/src/components/atoms/forms/legend/legend.test.tsx index fc759f7..088e8ad 100644 --- a/src/components/atoms/forms/legend/legend.test.tsx +++ b/src/components/atoms/forms/legend/legend.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Fieldset } from '../fieldset'; import { Legend } from './legend'; @@ -13,6 +13,6 @@ describe('legend', () => { ); - expect(screen.getByRole('group')).toHaveTextContent(body); + expect(rtlScreen.getByRole('group')).toHaveTextContent(body); }); }); diff --git a/src/components/molecules/forms/labelled-field/labelled-field.stories.tsx b/src/components/molecules/forms/labelled-field/labelled-field.stories.tsx index 1f29830..1d1af70 100644 --- a/src/components/molecules/forms/labelled-field/labelled-field.stories.tsx +++ b/src/components/molecules/forms/labelled-field/labelled-field.stories.tsx @@ -1,5 +1,5 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { ChangeEvent, useState } from 'react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { type ChangeEvent, useState, useCallback } from 'react'; import { Input, Label } from '../../../atoms'; import { LabelledField } from './labelled-field'; @@ -77,9 +77,9 @@ export default { const Template: ComponentStory = ({ ...args }) => { const id = 'sunt'; const [value, setValue] = useState(''); - const updateValue = (e: ChangeEvent) => { + const updateValue = useCallback((e: ChangeEvent) => { setValue(e.target.value); - }; + }, []); return ( { label={} /> ); - expect(screen.getByLabelText(label)).toBeInTheDocument(); - expect(screen.getByRole('textbox')).toHaveValue(value); + expect(rtlScreen.getByLabelText(label)).toBeInTheDocument(); + expect(rtlScreen.getByRole('textbox')).toHaveValue(value); }); }); diff --git a/src/components/molecules/forms/labelled-field/labelled-field.tsx b/src/components/molecules/forms/labelled-field/labelled-field.tsx index af492b3..ea0bd67 100644 --- a/src/components/molecules/forms/labelled-field/labelled-field.tsx +++ b/src/components/molecules/forms/labelled-field/labelled-field.tsx @@ -1,5 +1,10 @@ -import { FC, HTMLAttributes, ReactElement } from 'react'; import { + forwardRef, + type HTMLAttributes, + type ReactElement, + type ForwardRefRenderFunction, +} from 'react'; +import type { CheckboxProps, InputProps, LabelProps, @@ -37,27 +42,35 @@ export type LabelledFieldProps = Omit< label: ReactElement; }; -/** - * LabelledField component - * - * Render a field tied to a label. - */ -export const LabelledField: FC = ({ - className = '', - field, - isInline = false, - isReversedOrder = false, - label, - ...props -}) => { +const LabelledFieldWithRef: ForwardRefRenderFunction< + HTMLDivElement, + LabelledFieldProps +> = ( + { + className = '', + field, + isInline = false, + isReversedOrder = false, + label, + ...props + }, + ref +) => { const layoutClass = isInline ? 'wrapper--inline' : 'wrapper--stack'; const orderClass = isReversedOrder ? 'wrapper--reverse' : ''; const wrapperClass = `${styles.wrapper} ${styles[layoutClass]} ${styles[orderClass]} ${className}`; return ( -
+
{label} {field}
); }; + +/** + * LabelledField component + * + * Render a field tied to a label. + */ +export const LabelledField = forwardRef(LabelledFieldWithRef); diff --git a/src/components/molecules/forms/radio-group/radio-group.fixture.ts b/src/components/molecules/forms/radio-group/radio-group.fixture.ts new file mode 100644 index 0000000..618cde7 --- /dev/null +++ b/src/components/molecules/forms/radio-group/radio-group.fixture.ts @@ -0,0 +1,41 @@ +import type { RadioGroupItem } from './radio-group'; + +export const getOptions = (name = 'group1') => { + const value1 = 'option1'; + const value2 = 'option2'; + const value3 = 'option3'; + const value4 = 'option4'; + const value5 = 'option5'; + + const options: RadioGroupItem[] = [ + { + id: `${name}-${value1}`, + label: 'Option 1', + value: value1, + }, + { + id: `${name}-${value2}`, + label: 'Option 2', + value: value2, + }, + { + id: `${name}-${value3}`, + label: 'Option 3', + value: value3, + }, + { + id: `${name}-${value4}`, + label: 'Option 4', + value: value4, + }, + { + id: `${name}-${value5}`, + label: 'Option 5', + value: value5, + }, + ]; + + return options; +}; + +export const initialChoice = 'option2'; diff --git a/src/components/molecules/forms/radio-group/radio-group.fixture.tsx b/src/components/molecules/forms/radio-group/radio-group.fixture.tsx deleted file mode 100644 index f1cbc05..0000000 --- a/src/components/molecules/forms/radio-group/radio-group.fixture.tsx +++ /dev/null @@ -1,41 +0,0 @@ -import { RadioGroupItem } from './radio-group'; - -export const getOptions = (name: string = 'group1') => { - const value1 = 'option1'; - const value2 = 'option2'; - const value3 = 'option3'; - const value4 = 'option4'; - const value5 = 'option5'; - - const options: RadioGroupItem[] = [ - { - id: `${name}-${value1}`, - label: 'Option 1', - value: value1, - }, - { - id: `${name}-${value2}`, - label: 'Option 2', - value: value2, - }, - { - id: `${name}-${value3}`, - label: 'Option 3', - value: value3, - }, - { - id: `${name}-${value4}`, - label: 'Option 4', - value: value4, - }, - { - id: `${name}-${value5}`, - label: 'Option 5', - value: value5, - }, - ]; - - return options; -}; - -export const initialChoice = 'option2'; diff --git a/src/components/molecules/forms/radio-group/radio-group.stories.tsx b/src/components/molecules/forms/radio-group/radio-group.stories.tsx index 8e77c6e..4b92c34 100644 --- a/src/components/molecules/forms/radio-group/radio-group.stories.tsx +++ b/src/components/molecules/forms/radio-group/radio-group.stories.tsx @@ -1,8 +1,8 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { type ChangeEventHandler, useCallback, useState } from 'react'; import { Legend } from '../../../atoms'; import { RadioGroup as RadioGroupComponent } from './radio-group'; import { getOptions, initialChoice } from './radio-group.fixture'; -import { ChangeEventHandler, useCallback, useState } from 'react'; /** * RadioGroup - Storybook Meta diff --git a/src/components/molecules/forms/radio-group/radio-group.test.tsx b/src/components/molecules/forms/radio-group/radio-group.test.tsx index ba68925..61f4af6 100644 --- a/src/components/molecules/forms/radio-group/radio-group.test.tsx +++ b/src/components/molecules/forms/radio-group/radio-group.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Legend } from '../../../atoms'; import { RadioGroup } from './radio-group'; import { getOptions, initialChoice } from './radio-group.fixture'; @@ -23,7 +23,7 @@ describe('RadioGroup', () => { ); expect( - screen.getByRole('radiogroup', { name: legend }) + rtlScreen.getByRole('radiogroup', { name: legend }) ).toBeInTheDocument(); }); @@ -39,7 +39,7 @@ describe('RadioGroup', () => { /> ); - expect(screen.getAllByRole('radio')).toHaveLength(options.length); + expect(rtlScreen.getAllByRole('radio')).toHaveLength(options.length); }); it('can render an inlined radio group', () => { @@ -55,6 +55,6 @@ describe('RadioGroup', () => { /> ); - expect(screen.getByRole('radiogroup')).toHaveClass('group--inline'); + expect(rtlScreen.getByRole('radiogroup')).toHaveClass('group--inline'); }); }); diff --git a/src/components/molecules/forms/radio-group/radio-group.tsx b/src/components/molecules/forms/radio-group/radio-group.tsx index 0ca4dac..29b719c 100644 --- a/src/components/molecules/forms/radio-group/radio-group.tsx +++ b/src/components/molecules/forms/radio-group/radio-group.tsx @@ -1,11 +1,11 @@ -import { ForwardRefRenderFunction, forwardRef } from 'react'; +import { type ForwardRefRenderFunction, forwardRef } from 'react'; import { Fieldset, - FieldsetProps, + type FieldsetProps, Label, - LabelProps, + type LabelProps, Radio, - RadioProps, + type RadioProps, } from '../../../atoms'; import { LabelledField } from '../labelled-field'; import styles from './radio-group.module.scss'; @@ -78,6 +78,7 @@ const RadioGroupWithRef: ForwardRefRenderFunction< className={groupClass} isInline={isInline} ref={ref} + // eslint-disable-next-line react/jsx-no-literals -- Role allowed role="radiogroup" > {options.map((option) => ( diff --git a/src/components/molecules/forms/switch/switch.stories.tsx b/src/components/molecules/forms/switch/switch.stories.tsx index eb169ad..a88e6ab 100644 --- a/src/components/molecules/forms/switch/switch.stories.tsx +++ b/src/components/molecules/forms/switch/switch.stories.tsx @@ -1,7 +1,7 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { Switch as SwitchComponent, SwitchOption } from './switch'; -import { ChangeEventHandler, useCallback, useState } from 'react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { type ChangeEventHandler, useCallback, useState } from 'react'; import { Legend } from '../../../atoms'; +import { Switch as SwitchComponent, type SwitchOption } from './switch'; /** * Switch - Storybook Meta diff --git a/src/components/molecules/forms/switch/switch.test.tsx b/src/components/molecules/forms/switch/switch.test.tsx index 3d091cb..e2e27be 100644 --- a/src/components/molecules/forms/switch/switch.test.tsx +++ b/src/components/molecules/forms/switch/switch.test.tsx @@ -1,7 +1,7 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '@testing-library/react'; import { Legend } from '../../../atoms'; -import { Switch, SwitchOption } from './switch'; +import { Switch, type SwitchOption } from './switch'; const doNothing = () => { /* Do nothing. */ @@ -27,9 +27,9 @@ describe('Switch', () => { ); expect( - screen.getByRole('radiogroup', { name: legend }) + rtlScreen.getByRole('radiogroup', { name: legend }) ).toBeInTheDocument(); - expect(screen.getAllByRole('radio')).toHaveLength(items.length); + expect(rtlScreen.getAllByRole('radio')).toHaveLength(items.length); }); it('can render a disabled switch', () => { @@ -43,8 +43,8 @@ describe('Switch', () => { /> ); - const radios = screen.getAllByRole('radio'); + const radios = rtlScreen.getAllByRole('radio'); expect(radios.every((radio) => radio.disabled)).toBe(true); - expect(screen.getByRole('radiogroup')).toBeDisabled(); + expect(rtlScreen.getByRole('radiogroup')).toBeDisabled(); }); }); diff --git a/src/components/molecules/forms/switch/switch.tsx b/src/components/molecules/forms/switch/switch.tsx index d340a0c..df2ba0c 100644 --- a/src/components/molecules/forms/switch/switch.tsx +++ b/src/components/molecules/forms/switch/switch.tsx @@ -1,14 +1,21 @@ -import type { FC, ChangeEventHandler, ReactNode, ReactElement } from 'react'; +import { + type FC, + type ChangeEventHandler, + type ReactNode, + type ReactElement, + forwardRef, + type ForwardRefRenderFunction, +} from 'react'; import { Fieldset, type FieldsetProps, - LabelProps, - RadioProps, + type LabelProps, + type RadioProps, Label, Radio, } from '../../../atoms'; +import type { TooltipProps } from '../../tooltip'; import styles from './switch.module.scss'; -import { TooltipProps } from '../../tooltip'; type SwitchItemProps = Omit & Pick & { @@ -94,24 +101,31 @@ export type SwitchProps = Omit & { value: SwitchOption['value']; }; -/** - * Switch component. - */ -export const Switch: FC = ({ - className = '', - isDisabled = false, - items, - name, - onSwitch, - tooltip, - value, - ...props -}) => { +const SwitchWithRef: ForwardRefRenderFunction< + HTMLFieldSetElement, + SwitchProps +> = ( + { + className = '', + isDisabled = false, + items, + name, + onSwitch, + tooltip, + value, + ...props + }, + ref +) => { + const fieldsetClass = `${styles.fieldset} ${className}`; + return (
{tooltip} @@ -130,3 +144,8 @@ export const Switch: FC = ({
); }; + +/** + * Switch component. + */ +export const Switch = forwardRef(SwitchWithRef); diff --git a/src/components/organisms/forms/ackee-toggle/ackee-toggle.fixture.ts b/src/components/organisms/forms/ackee-toggle/ackee-toggle.fixture.ts new file mode 100644 index 0000000..04602f2 --- /dev/null +++ b/src/components/organisms/forms/ackee-toggle/ackee-toggle.fixture.ts @@ -0,0 +1 @@ +export const storageKey = 'ackee'; diff --git a/src/components/organisms/forms/ackee-toggle/ackee-toggle.fixture.tsx b/src/components/organisms/forms/ackee-toggle/ackee-toggle.fixture.tsx deleted file mode 100644 index 04602f2..0000000 --- a/src/components/organisms/forms/ackee-toggle/ackee-toggle.fixture.tsx +++ /dev/null @@ -1 +0,0 @@ -export const storageKey = 'ackee'; diff --git a/src/components/organisms/forms/ackee-toggle/ackee-toggle.stories.tsx b/src/components/organisms/forms/ackee-toggle/ackee-toggle.stories.tsx index b5f8ef8..4122ed2 100644 --- a/src/components/organisms/forms/ackee-toggle/ackee-toggle.stories.tsx +++ b/src/components/organisms/forms/ackee-toggle/ackee-toggle.stories.tsx @@ -1,4 +1,4 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { AckeeToggle } from './ackee-toggle'; import { storageKey } from './ackee-toggle.fixture'; diff --git a/src/components/organisms/forms/ackee-toggle/ackee-toggle.test.tsx b/src/components/organisms/forms/ackee-toggle/ackee-toggle.test.tsx index f7400f3..f7f5edf 100644 --- a/src/components/organisms/forms/ackee-toggle/ackee-toggle.test.tsx +++ b/src/components/organisms/forms/ackee-toggle/ackee-toggle.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '../../../../../tests/utils'; import { AckeeToggle } from './ackee-toggle'; import { storageKey } from './ackee-toggle.fixture'; @@ -8,7 +8,7 @@ describe('AckeeToggle', () => { it('renders a toggle component', () => { render(); expect( - screen.getByRole('radiogroup', { + rtlScreen.getByRole('radiogroup', { name: /Tracking:/i, }) ).toBeInTheDocument(); diff --git a/src/components/organisms/forms/comment-form/comment-form.stories.tsx b/src/components/organisms/forms/comment-form/comment-form.stories.tsx index a6069e6..a521bf7 100644 --- a/src/components/organisms/forms/comment-form/comment-form.stories.tsx +++ b/src/components/organisms/forms/comment-form/comment-form.stories.tsx @@ -1,5 +1,5 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; -import { CommentForm } from './comment-form'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; +import { CommentForm as CommentFormComponent } from './comment-form'; const saveComment = async () => { /** Do nothing. */ @@ -10,7 +10,7 @@ const saveComment = async () => { */ export default { title: 'Organisms/Forms', - component: CommentForm, + component: CommentFormComponent, args: { saveComment, titleAlignment: 'left', @@ -111,13 +111,13 @@ export default { }, }, }, -} as ComponentMeta; +} as ComponentMeta; -const Template: ComponentStory = (args) => ( - +const Template: ComponentStory = (args) => ( + ); /** - * Forms Stories - Comment + * Forms Stories - Comment form */ -export const Comment = Template.bind({}); +export const CommentForm = Template.bind({}); diff --git a/src/components/organisms/forms/comment-form/comment-form.test.tsx b/src/components/organisms/forms/comment-form/comment-form.test.tsx index ca02edc..88a7de9 100644 --- a/src/components/organisms/forms/comment-form/comment-form.test.tsx +++ b/src/components/organisms/forms/comment-form/comment-form.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '../../../../../tests/utils'; import { CommentForm } from './comment-form'; const saveComment = async () => { @@ -10,7 +10,7 @@ const title = 'Cum voluptas voluptatibus'; describe('CommentForm', () => { it('renders a form', () => { render(); - expect(screen.getByRole('form')).toBeInTheDocument(); + expect(rtlScreen.getByRole('form')).toBeInTheDocument(); }); it('renders an optional title', () => { @@ -18,7 +18,7 @@ describe('CommentForm', () => { ); expect( - screen.getByRole('heading', { level: 2, name: title }) + rtlScreen.getByRole('heading', { level: 2, name: title }) ).toBeInTheDocument(); }); }); diff --git a/src/components/organisms/forms/contact-form/contact-form.stories.tsx b/src/components/organisms/forms/contact-form/contact-form.stories.tsx index 4df3db0..962bfda 100644 --- a/src/components/organisms/forms/contact-form/contact-form.stories.tsx +++ b/src/components/organisms/forms/contact-form/contact-form.stories.tsx @@ -1,4 +1,4 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { ContactForm } from './contact-form'; /** @@ -59,7 +59,8 @@ const Template: ComponentStory = (args) => ( */ export const Contact = Template.bind({}); Contact.args = { - sendMail: async (_data, reset: () => void) => { - reset(); - }, + sendMail: async (_data, reset: () => void) => + new Promise(() => { + reset(); + }), }; diff --git a/src/components/organisms/forms/contact-form/contact-form.test.tsx b/src/components/organisms/forms/contact-form/contact-form.test.tsx index d788e09..0e2685e 100644 --- a/src/components/organisms/forms/contact-form/contact-form.test.tsx +++ b/src/components/organisms/forms/contact-form/contact-form.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '../../../../../tests/utils'; import { ContactForm } from './contact-form'; const props = { @@ -12,38 +12,42 @@ describe('ContactForm', () => { it('renders a contact form', () => { render(); expect( - screen.getByRole('form', { name: 'Contact form' }) + rtlScreen.getByRole('form', { name: 'Contact form' }) ).toBeInTheDocument(); }); it('renders a name field', () => { render(); - expect(screen.getByRole('textbox', { name: /^Name:/ })).toBeInTheDocument(); + expect( + rtlScreen.getByRole('textbox', { name: /^Name:/ }) + ).toBeInTheDocument(); }); it('renders an email field', () => { render(); expect( - screen.getByRole('textbox', { name: /^Email:/ }) + rtlScreen.getByRole('textbox', { name: /^Email:/ }) ).toBeInTheDocument(); }); it('renders an object field', () => { render(); expect( - screen.getByRole('textbox', { name: /^Object:/ }) + rtlScreen.getByRole('textbox', { name: /^Object:/ }) ).toBeInTheDocument(); }); it('renders a message field', () => { render(); expect( - screen.getByRole('textbox', { name: /^Message:/ }) + rtlScreen.getByRole('textbox', { name: /^Message:/ }) ).toBeInTheDocument(); }); it('renders a submit button', () => { render(); - expect(screen.getByRole('button', { name: /^Send/ })).toBeInTheDocument(); + expect( + rtlScreen.getByRole('button', { name: /^Send/ }) + ).toBeInTheDocument(); }); }); diff --git a/src/components/organisms/forms/motion-toggle/motion-toggle.fixture.ts b/src/components/organisms/forms/motion-toggle/motion-toggle.fixture.ts new file mode 100644 index 0000000..f13658a --- /dev/null +++ b/src/components/organisms/forms/motion-toggle/motion-toggle.fixture.ts @@ -0,0 +1 @@ +export const storageKey = 'reduced-motion'; diff --git a/src/components/organisms/forms/motion-toggle/motion-toggle.fixture.tsx b/src/components/organisms/forms/motion-toggle/motion-toggle.fixture.tsx deleted file mode 100644 index f13658a..0000000 --- a/src/components/organisms/forms/motion-toggle/motion-toggle.fixture.tsx +++ /dev/null @@ -1 +0,0 @@ -export const storageKey = 'reduced-motion'; diff --git a/src/components/organisms/forms/motion-toggle/motion-toggle.stories.tsx b/src/components/organisms/forms/motion-toggle/motion-toggle.stories.tsx index 7e541db..811830b 100644 --- a/src/components/organisms/forms/motion-toggle/motion-toggle.stories.tsx +++ b/src/components/organisms/forms/motion-toggle/motion-toggle.stories.tsx @@ -1,4 +1,4 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { MotionToggle } from './motion-toggle'; import { storageKey } from './motion-toggle.fixture'; diff --git a/src/components/organisms/forms/motion-toggle/motion-toggle.test.tsx b/src/components/organisms/forms/motion-toggle/motion-toggle.test.tsx index abae299..6952f46 100644 --- a/src/components/organisms/forms/motion-toggle/motion-toggle.test.tsx +++ b/src/components/organisms/forms/motion-toggle/motion-toggle.test.tsx @@ -1,5 +1,5 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '../../../../../tests/utils'; import { MotionToggle } from './motion-toggle'; import { storageKey } from './motion-toggle.fixture'; @@ -8,7 +8,7 @@ describe('MotionToggle', () => { it('renders a toggle component', () => { render(); expect( - screen.getByRole('radiogroup', { + rtlScreen.getByRole('radiogroup', { name: /Animations:/i, }) ).toBeInTheDocument(); diff --git a/src/components/organisms/forms/motion-toggle/motion-toggle.tsx b/src/components/organisms/forms/motion-toggle/motion-toggle.tsx index a8ca7ce..c141bf0 100644 --- a/src/components/organisms/forms/motion-toggle/motion-toggle.tsx +++ b/src/components/organisms/forms/motion-toggle/motion-toggle.tsx @@ -1,8 +1,12 @@ -import { ChangeEvent, FC } from 'react'; +import { useCallback, type FC } from 'react'; import { useIntl } from 'react-intl'; import { useAttributes, useLocalStorage } from '../../../../utils/hooks'; import { Legend } from '../../../atoms'; -import { Switch, SwitchOption, SwitchProps } from '../../../molecules'; +import { + Switch, + type SwitchOption, + type SwitchProps, +} from '../../../molecules'; export type MotionToggleValue = 'on' | 'off'; @@ -37,7 +41,7 @@ export const MotionToggle: FC = ({ ); useAttributes({ element: - typeof window !== 'undefined' ? document.documentElement : undefined, + typeof window === 'undefined' ? undefined : document.documentElement, attribute: 'reduced-motion', value: `${isReduced}`, }); @@ -71,9 +75,9 @@ export const MotionToggle: FC = ({ }, ]; - const updateSetting = (e: ChangeEvent) => { + const updateSetting = useCallback(() => { setIsReduced((prev) => !prev); - }; + }, [setIsReduced]); return ( { it('renders a toggle component', () => { render(); expect( - screen.getByRole('radiogroup', { + rtlScreen.getByRole('radiogroup', { name: /Code blocks:/i, }) ).toBeInTheDocument(); diff --git a/src/components/organisms/forms/search-form/search-form.module.scss b/src/components/organisms/forms/search-form/search-form.module.scss index e485380..1315fde 100644 --- a/src/components/organisms/forms/search-form/search-form.module.scss +++ b/src/components/organisms/forms/search-form/search-form.module.scss @@ -49,6 +49,9 @@ } .field { + min-width: 0; + width: 100%; + &:focus-within ~ .btn { background: var(--color-bg); border-color: var(--color-primary); diff --git a/src/components/organisms/forms/search-form/search-form.stories.tsx b/src/components/organisms/forms/search-form/search-form.stories.tsx index c5fbeb9..971a8ee 100644 --- a/src/components/organisms/forms/search-form/search-form.stories.tsx +++ b/src/components/organisms/forms/search-form/search-form.stories.tsx @@ -1,4 +1,4 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { SearchForm } from './search-form'; /** diff --git a/src/components/organisms/forms/search-form/search-form.test.tsx b/src/components/organisms/forms/search-form/search-form.test.tsx index 1af0a47..908a8eb 100644 --- a/src/components/organisms/forms/search-form/search-form.test.tsx +++ b/src/components/organisms/forms/search-form/search-form.test.tsx @@ -1,17 +1,19 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '../../../../../tests/utils'; import { SearchForm } from './search-form'; describe('SearchForm', () => { it('renders a search input', () => { render(); expect( - screen.getByRole('searchbox', { name: 'Search for:' }) + rtlScreen.getByRole('searchbox', { name: 'Search for:' }) ).toBeInTheDocument(); }); it('renders a submit button', () => { render(); - expect(screen.getByRole('button', { name: 'Search' })).toBeInTheDocument(); + expect( + rtlScreen.getByRole('button', { name: 'Search' }) + ).toBeInTheDocument(); }); }); diff --git a/src/components/organisms/forms/theme-toggle/theme-toggle.stories.tsx b/src/components/organisms/forms/theme-toggle/theme-toggle.stories.tsx index ac228b4..bfec65e 100644 --- a/src/components/organisms/forms/theme-toggle/theme-toggle.stories.tsx +++ b/src/components/organisms/forms/theme-toggle/theme-toggle.stories.tsx @@ -1,4 +1,4 @@ -import { ComponentMeta, ComponentStory } from '@storybook/react'; +import type { ComponentMeta, ComponentStory } from '@storybook/react'; import { ThemeToggle } from './theme-toggle'; /** diff --git a/src/components/organisms/forms/theme-toggle/theme-toggle.test.tsx b/src/components/organisms/forms/theme-toggle/theme-toggle.test.tsx index 9f8e4e1..d735936 100644 --- a/src/components/organisms/forms/theme-toggle/theme-toggle.test.tsx +++ b/src/components/organisms/forms/theme-toggle/theme-toggle.test.tsx @@ -1,12 +1,12 @@ import { describe, expect, it } from '@jest/globals'; -import { render, screen } from '../../../../../tests/utils'; +import { render, screen as rtlScreen } from '../../../../../tests/utils'; import { ThemeToggle } from './theme-toggle'; describe('ThemeToggle', () => { it('renders a toggle component', () => { render(); expect( - screen.getByRole('radiogroup', { + rtlScreen.getByRole('radiogroup', { name: /Theme:/i, }) ).toBeInTheDocument(); -- cgit v1.2.3