From 0b3146f7278929c4d1b33dd8f94f34e351e5e5a9 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Fri, 8 Apr 2022 22:36:24 +0200 Subject: chore: add a Settings modal component --- .../molecules/forms/labelled-field.module.scss | 9 +++ .../molecules/forms/labelled-field.stories.tsx | 33 +++++++-- src/components/molecules/forms/labelled-field.tsx | 34 +++++++-- .../molecules/forms/labelled-select.module.scss | 9 +++ .../molecules/forms/labelled-select.stories.tsx | 80 ++++++++++++++++++++-- src/components/molecules/forms/labelled-select.tsx | 51 ++++++++++++-- .../molecules/forms/motion-toggle.stories.tsx | 15 ++++ src/components/molecules/forms/motion-toggle.tsx | 8 ++- .../molecules/forms/prism-theme-toggle.stories.tsx | 15 ++++ .../molecules/forms/prism-theme-toggle.tsx | 11 ++- .../forms/select-with-tooltip.module.scss | 10 +-- .../forms/select-with-tooltip.stories.tsx | 77 +++++++++++++++++---- .../molecules/forms/select-with-tooltip.tsx | 34 +++++---- .../molecules/forms/theme-toggle.stories.tsx | 15 ++++ src/components/molecules/forms/theme-toggle.tsx | 8 ++- 15 files changed, 344 insertions(+), 65 deletions(-) create mode 100644 src/components/molecules/forms/labelled-field.module.scss create mode 100644 src/components/molecules/forms/labelled-select.module.scss (limited to 'src/components/molecules/forms') diff --git a/src/components/molecules/forms/labelled-field.module.scss b/src/components/molecules/forms/labelled-field.module.scss new file mode 100644 index 0000000..64ef3d0 --- /dev/null +++ b/src/components/molecules/forms/labelled-field.module.scss @@ -0,0 +1,9 @@ +.label { + &--left { + margin-right: var(--spacing-2xs); + } + + &--top { + display: block; + } +} diff --git a/src/components/molecules/forms/labelled-field.stories.tsx b/src/components/molecules/forms/labelled-field.stories.tsx index eb7f8b5..b77d71e 100644 --- a/src/components/molecules/forms/labelled-field.stories.tsx +++ b/src/components/molecules/forms/labelled-field.stories.tsx @@ -1,4 +1,5 @@ import { ComponentMeta, ComponentStory } from '@storybook/react'; +import { useState } from 'react'; import LabelledFieldComponent from './labelled-field'; export default { @@ -6,6 +7,7 @@ export default { component: LabelledFieldComponent, args: { disabled: false, + labelPosition: 'top', required: false, }, argTypes: { @@ -43,6 +45,21 @@ export default { required: true, }, }, + labelPosition: { + control: { + type: 'select', + }, + description: 'The label position.', + options: ['left', 'top'], + table: { + category: 'Options', + defaultValue: { summary: 'top' }, + }, + type: { + name: 'string', + required: false, + }, + }, max: { control: { type: 'number', @@ -155,7 +172,7 @@ export default { }, value: { control: { - type: 'text', + type: null, }, description: 'Field value.', type: { @@ -166,15 +183,19 @@ export default { }, } as ComponentMeta; -const Template: ComponentStory = (args) => ( - -); +const Template: ComponentStory = ({ + value: _value, + setValue: _setValue, + ...args +}) => { + const [value, setValue] = useState(''); + + return ; +}; export const LabelledField = Template.bind({}); LabelledField.args = { id: 'labelled-field-storybook', label: 'Labelled field', name: 'labelled-field-storybook', - setValue: () => null, - value: '', }; diff --git a/src/components/molecules/forms/labelled-field.tsx b/src/components/molecules/forms/labelled-field.tsx index 7f81e23..08d0126 100644 --- a/src/components/molecules/forms/labelled-field.tsx +++ b/src/components/molecules/forms/labelled-field.tsx @@ -1,20 +1,46 @@ import Field, { type FieldProps } from '@components/atoms/forms/field'; import Label from '@components/atoms/forms/label'; -import { FC } from 'react'; +import { VFC } from 'react'; +import styles from './labelled-field.module.scss'; -type LabelledFieldProps = FieldProps & { +export type LabelledFieldProps = FieldProps & { + /** + * Visually hide the field label. Default: false. + */ + hideLabel?: boolean; + /** + * The field label. + */ label: string; + /** + * The label position. Default: top. + */ + labelPosition?: 'left' | 'top'; }; -const LabelledField: FC = ({ +/** + * LabelledField component + * + * Render a field tied to a label. + */ +const LabelledField: VFC = ({ + hideLabel = false, id, label, + labelPosition = 'top', required, ...props }) => { + const positionModifier = `label--${labelPosition}`; + const visibilityClass = hideLabel ? 'screen-reader-text' : ''; + return ( <> -