From 6497bb8a208d21b85a9f0b7abb6f83d427a9b380 Mon Sep 17 00:00:00 2001 From: eirikbacker Date: Tue, 24 Sep 2024 11:47:07 +0200 Subject: [PATCH 01/23] feat(Field): start implementing field api --- .../react/src/components/form/Field/Field.mdx | 8 ++++++++ .../components/form/Field/Field.stories.tsx | 20 +++++++++++++++++++ .../react/src/components/form/Field/Field.tsx | 13 ++++++++++++ .../react/src/components/form/Field/index.ts | 1 + packages/react/src/components/index.ts | 1 + 5 files changed, 43 insertions(+) create mode 100644 packages/react/src/components/form/Field/Field.mdx create mode 100644 packages/react/src/components/form/Field/Field.stories.tsx create mode 100644 packages/react/src/components/form/Field/Field.tsx create mode 100644 packages/react/src/components/form/Field/index.ts diff --git a/packages/react/src/components/form/Field/Field.mdx b/packages/react/src/components/form/Field/Field.mdx new file mode 100644 index 0000000000..17035526b1 --- /dev/null +++ b/packages/react/src/components/form/Field/Field.mdx @@ -0,0 +1,8 @@ +import { Meta, Controls, Primary } from '@storybook/blocks'; + +import * as FieldStories from './Field.stories'; + + + + + diff --git a/packages/react/src/components/form/Field/Field.stories.tsx b/packages/react/src/components/form/Field/Field.stories.tsx new file mode 100644 index 0000000000..00b5c8e79c --- /dev/null +++ b/packages/react/src/components/form/Field/Field.stories.tsx @@ -0,0 +1,20 @@ +import type { Meta, StoryFn } from '@storybook/react'; + +import { Textarea } from '../Textarea'; +import { Textfield } from '../Textfield'; + +import { Field } from '.'; + +type Story = StoryFn; + +export default { + title: 'Komponenter/Field', + component: Field, +} as Meta; + +export const Preview: Story = (args) => ( + + + + +); diff --git a/packages/react/src/components/form/Field/Field.tsx b/packages/react/src/components/form/Field/Field.tsx new file mode 100644 index 0000000000..8a50a64139 --- /dev/null +++ b/packages/react/src/components/form/Field/Field.tsx @@ -0,0 +1,13 @@ +import cl from 'clsx/lite'; +import type { HTMLAttributes } from 'react'; +import { forwardRef, useContext } from 'react'; + +export type FieldProps = HTMLAttributes; + +export const Field = forwardRef( + function Field(props, ref) { + const { className, ...rest } = props; + + return
; + }, +); diff --git a/packages/react/src/components/form/Field/index.ts b/packages/react/src/components/form/Field/index.ts new file mode 100644 index 0000000000..deacb78271 --- /dev/null +++ b/packages/react/src/components/form/Field/index.ts @@ -0,0 +1 @@ +export * from './Field'; diff --git a/packages/react/src/components/index.ts b/packages/react/src/components/index.ts index a4eec0aa5e..9949a1e24b 100644 --- a/packages/react/src/components/index.ts +++ b/packages/react/src/components/index.ts @@ -16,6 +16,7 @@ export * from './Chip'; export * from './Pagination'; export * from './SkipLink'; export * from './Tooltip'; +export * from './form/Field'; export * from './form/Checkbox'; export * from './form/Radio'; export * from './form/Fieldset'; From 8d66fa6d29f5f66fcc37c55ac953a8996bf5f42b Mon Sep 17 00:00:00 2001 From: eirikbacker Date: Wed, 25 Sep 2024 18:48:27 +0200 Subject: [PATCH 02/23] fix(Field): create a11yField utility --- .../ValidationMessage/ValidationMessage.tsx | 1 + .../components/form/Field/Field.stories.tsx | 31 ++++++++++++++----- .../react/src/components/form/Field/Field.tsx | 22 ++++++++----- .../src/components/form/Field/FieldHelp.tsx | 10 ++++++ .../components/form/Field/FieldValidation.tsx | 13 ++++++++ .../src/components/form/Field/a11yField.ts | 27 ++++++++++++++++ .../react/src/components/form/Field/index.ts | 25 ++++++++++++++- 7 files changed, 112 insertions(+), 17 deletions(-) create mode 100644 packages/react/src/components/form/Field/FieldHelp.tsx create mode 100644 packages/react/src/components/form/Field/FieldValidation.tsx create mode 100644 packages/react/src/components/form/Field/a11yField.ts diff --git a/packages/react/src/components/Typography/ValidationMessage/ValidationMessage.tsx b/packages/react/src/components/Typography/ValidationMessage/ValidationMessage.tsx index d0e514de37..4863924bba 100644 --- a/packages/react/src/components/Typography/ValidationMessage/ValidationMessage.tsx +++ b/packages/react/src/components/Typography/ValidationMessage/ValidationMessage.tsx @@ -35,6 +35,7 @@ export const ValidationMessage = forwardRef< className={cl(`ds-validation-message--${size}`, className)} data-error={error || undefined} data-spacing={spacing || undefined} + data-validation ref={ref} {...rest} /> diff --git a/packages/react/src/components/form/Field/Field.stories.tsx b/packages/react/src/components/form/Field/Field.stories.tsx index 00b5c8e79c..1863b2a757 100644 --- a/packages/react/src/components/form/Field/Field.stories.tsx +++ b/packages/react/src/components/form/Field/Field.stories.tsx @@ -1,7 +1,6 @@ import type { Meta, StoryFn } from '@storybook/react'; -import { Textarea } from '../Textarea'; -import { Textfield } from '../Textfield'; +import { Label } from '../../Typography/Label'; import { Field } from '.'; @@ -12,9 +11,25 @@ export default { component: Field, } as Meta; -export const Preview: Story = (args) => ( - - - - -); +// TMP toggles to test a11yField utility +const toggles = { + label: true, + description: true, + validation: true, +}; + +export const Preview: Story = (args) => { + const { label, description, validation } = args as typeof toggles; + + return ( + + {label && } + {description && Beskrivelse} +