From 1f9eb72b23148cc7e5180dc691c11e507ef660fa Mon Sep 17 00:00:00 2001 From: Josh Farrant Date: Tue, 3 Dec 2024 14:03:52 +0000 Subject: [PATCH] Add CheckboxGroup and RadioGroup components (#830) * add CheckboxGroup, RadioGroup, and InputGroup components * add changeset * update snapshots * improve changeset * remove unused InputGroup test file * fixed broken animation * github-actions[bot] Regenerated snapshots * rename InputGroup to ControlGroup * reset snapshots * reduce Caption and Validation font-size to 100 * rename CSS declaration file * github-actions[bot] Regenerated snapshots * add documentation for CheckboxGroup and RadioGroup components * reduce font-weight on FormControl labels within a ControlGroup * github-actions[bot] Regenerated snapshots * update changeset * update changeset semver bump * various docs updates based on PR feedback * leverage Text component * split stories up into multiple fies * remove regex * updated docs to align with prc * fix tabs in React docs * fix case * stop forwarding unused prop to Radio * correct casing * modify styles to avoid :global selector * update animation easing * update links in docs * update changeset * github-actions[bot] Regenerated snapshots * remove nested describe --------- Co-authored-by: joshfarrant --- .changeset/popular-seas-yawn.md | 49 +++++ .../CheckboxGroup/images/anatomy.png | Bin 0 -> 59438 bytes .../components/CheckboxGroup/index.mdx | 43 ++++ .../components/CheckboxGroup/react.mdx | 188 ++++++++++++++++++ .../components/RadioGroup/images/anatomy.png | Bin 0 -> 62067 bytes .../content/components/RadioGroup/index.mdx | 51 +++++ .../content/components/RadioGroup/react.mdx | 164 +++++++++++++++ .../src/@primer/gatsby-theme-doctocat/nav.yml | 4 + .../CheckboxGroup.examples.stories.tsx | 47 +++++ .../CheckboxGroup/CheckboxGroup.stories.tsx | 97 +++++++++ .../CheckboxGroup/CheckboxGroup.test.tsx | 151 ++++++++++++++ .../src/forms/CheckboxGroup/CheckboxGroup.tsx | 14 ++ .../CheckboxGroup.visual.spec.ts | 27 +++ ...kboxGroup-CheckboxGroup-Inline-1-linux.png | Bin 0 -> 13840 bytes ...Group-CheckboxGroup-Playground-1-linux.png | Bin 0 -> 17341 bytes .../react/src/forms/CheckboxGroup/index.ts | 1 + .../ControlGroup/ControlGroup.module.css | 59 ++++++ .../ControlGroup/ControlGroup.module.css.d.ts | 13 ++ .../src/forms/ControlGroup/ControlGroup.tsx | 120 +++++++++++ .../react/src/forms/ControlGroup/index.ts | 1 + .../src/forms/FormControl/FormControl.tsx | 1 - .../RadioGroup.examples.stories.tsx | 47 +++++ .../forms/RadioGroup/RadioGroup.stories.tsx | 97 +++++++++ .../src/forms/RadioGroup/RadioGroup.test.tsx | 151 ++++++++++++++ .../react/src/forms/RadioGroup/RadioGroup.tsx | 14 ++ .../RadioGroup/RadioGroup.visual.spec.ts | 25 +++ ...n-RadioGroup-RadioGroup-Inline-1-linux.png | Bin 0 -> 12993 bytes ...dioGroup-RadioGroup-Playground-1-linux.png | Bin 0 -> 17975 bytes packages/react/src/forms/RadioGroup/index.ts | 1 + packages/react/src/forms/index.ts | 2 + 30 files changed, 1366 insertions(+), 1 deletion(-) create mode 100644 .changeset/popular-seas-yawn.md create mode 100644 apps/docs/content/components/CheckboxGroup/images/anatomy.png create mode 100644 apps/docs/content/components/CheckboxGroup/index.mdx create mode 100644 apps/docs/content/components/CheckboxGroup/react.mdx create mode 100644 apps/docs/content/components/RadioGroup/images/anatomy.png create mode 100644 apps/docs/content/components/RadioGroup/index.mdx create mode 100644 apps/docs/content/components/RadioGroup/react.mdx create mode 100644 packages/react/src/forms/CheckboxGroup/CheckboxGroup.examples.stories.tsx create mode 100644 packages/react/src/forms/CheckboxGroup/CheckboxGroup.stories.tsx create mode 100644 packages/react/src/forms/CheckboxGroup/CheckboxGroup.test.tsx create mode 100644 packages/react/src/forms/CheckboxGroup/CheckboxGroup.tsx create mode 100644 packages/react/src/forms/CheckboxGroup/CheckboxGroup.visual.spec.ts create mode 100644 packages/react/src/forms/CheckboxGroup/CheckboxGroup.visual.spec.ts-snapshots/Visual-Comparison-CheckboxGroup-CheckboxGroup-Inline-1-linux.png create mode 100644 packages/react/src/forms/CheckboxGroup/CheckboxGroup.visual.spec.ts-snapshots/Visual-Comparison-CheckboxGroup-CheckboxGroup-Playground-1-linux.png create mode 100644 packages/react/src/forms/CheckboxGroup/index.ts create mode 100644 packages/react/src/forms/ControlGroup/ControlGroup.module.css create mode 100644 packages/react/src/forms/ControlGroup/ControlGroup.module.css.d.ts create mode 100644 packages/react/src/forms/ControlGroup/ControlGroup.tsx create mode 100644 packages/react/src/forms/ControlGroup/index.ts create mode 100644 packages/react/src/forms/RadioGroup/RadioGroup.examples.stories.tsx create mode 100644 packages/react/src/forms/RadioGroup/RadioGroup.stories.tsx create mode 100644 packages/react/src/forms/RadioGroup/RadioGroup.test.tsx create mode 100644 packages/react/src/forms/RadioGroup/RadioGroup.tsx create mode 100644 packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts create mode 100644 packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts-snapshots/Visual-Comparison-RadioGroup-RadioGroup-Inline-1-linux.png create mode 100644 packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts-snapshots/Visual-Comparison-RadioGroup-RadioGroup-Playground-1-linux.png create mode 100644 packages/react/src/forms/RadioGroup/index.ts diff --git a/.changeset/popular-seas-yawn.md b/.changeset/popular-seas-yawn.md new file mode 100644 index 000000000..8fe0fdccc --- /dev/null +++ b/.changeset/popular-seas-yawn.md @@ -0,0 +1,49 @@ +--- +'@primer/react-brand': minor +--- + +New `CheckboxGroup` and `RadioGroup` components to group `Checkbox` and `Radio` components are now available. + +`CheckboxGroup` + +```jsx + + Choose your favorite features + + Actions notifications + + + + Packages + + + + Codespaces + + + +``` + +🔗 [Read the documentation for more `CheckboxGroup` examples](https://primer.style/brand/components/RadioGroup/react) + +`RadioGroup`: + +```jsx + + Choose your primary workspace + + Codespaces + + + + Local environment + + + + Pen and paper + + + +``` + +🔗 [Read the documentation for more `RadioGroup` examples](https://primer.style/brand/components/RadioGroup/react) diff --git a/apps/docs/content/components/CheckboxGroup/images/anatomy.png b/apps/docs/content/components/CheckboxGroup/images/anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..ebf0fa9b83b54df9ffda7c7272f380bdc7a707f9 GIT binary patch literal 59438 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�!>ZfzJ41VO<<5s~6{D@YL( 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 + +**Label:** A title that labels the group of options and helps users understand the relationship between the options in the group. + +**Required indicator:** Indicates that a selection is required. + +**Caption:** May be used to provide additional context about the checkbox group when the label alone is not sufficient + +**Options:** A list of options represented using [checkboxes](/components/Checkbox). + +**Validation message:** A message explaining why the selection failed validation. See the [form pattern documentation](https://primer.style/ui-patterns/forms/overview#validation-message) for more information on form validation patterns. + +## Accessibility + +Once a user checks an option from a checkbox group, the result should not be saved or applied until the user has explicitly submitted their input using a "save" or "submit" button. See the [saving pattern guidelines](https://primer.style/ui-patterns/saving) for more information. + +## Related components + +- [Checkbox](/components/Checkbox): Used to render an individual checkbox control. +- [FormControl](/components/FormControl): Used to group individual controls with an associated label. +- [RadioGroup](/components/RadioGroup): Similar to `CheckboxGroup`, but used for organizing radio controls. diff --git a/apps/docs/content/components/CheckboxGroup/react.mdx b/apps/docs/content/components/CheckboxGroup/react.mdx new file mode 100644 index 000000000..d1736299e --- /dev/null +++ b/apps/docs/content/components/CheckboxGroup/react.mdx @@ -0,0 +1,188 @@ +--- +title: Checkbox group +description: Checkbox group renders a set of checkboxes. +source: https://github.com/primer/brand/blob/main/packages/react/src/forms/CheckboxGroup/CheckboxGroup.tsx +figma: 'https://www.figma.com/design/BJ95AjraesmRCWsKA013GS/Primer-Brand?node-id=10467-3273&t=GA5GtEqPtQ9yeRaN-4' +storybook: '/brand/storybook/?path=/story/components-forms-checkboxgroup--playground' +--- + +import ComponentLayout from '../../../src/layouts/component-layout' +export default ComponentLayout + +import {Label} from '@primer/react' +import {PropTableValues} from '../../../src/components' + +```js +import {CheckboxGroup} from '@primer/react-brand' +``` + +## Examples + +### Default + +`CheckboxGroup` creates a semantic container for multiple related checkboxes. + +```jsx live + + Choose your favorite features + + Actions notifications + + + + Packages + + + + Codespaces + + + +``` + +### With caption + +Use `CheckboxGroup.Caption` to provide additional context for the group. + +```jsx live + + Notification preferences + + Select how you'd like to be notified + + + Email notifications + + + + Browser notifications + + + + Mobile notifications + + + +``` + +### With validation + +`CheckboxGroup.Validation` can display success or error states with appropriate icons. + +```jsx live + + + Valid selection + + Option one + + + + Option two + + + + Great choice! + + + + + Invalid selection + + Option one + + + + Option two + + + + Please select at least one option + + + +``` + +### Visually hidden label + +When context is clear, labels can be visually hidden while remaining accessible to screen readers. + +```jsx live + + Filter options + + + Show all + + + + Show active only + + + + +``` + +### Inline + +When space is limited, checkboxes can be arranged horizontally using the [Stack](/components/Stack) component. + +```jsx live + + Filter options + + Some inline checkboxes with a visually hidden label + + + + Choice one + + + + Choice two + + + + Choice three + + + + +``` + +## Component props + +### CheckboxGroup + +| Name | Type | Default | Description | +| :--------- | :--------------------- | :-----: | :--------------------------------------------------------------- | +| `children` | `React.ReactElement[]` | | CheckboxGroup components and FormControl components | +| `id` | `string` | | Sets a custom id. If not provided, a unique id will be generated | + +`CheckboxGroup` extends the HTML `fieldset` element and supports all `fieldset` props. + +### CheckboxGroup.Label + +| Name | Type | Default | Description | +| :--------------- | :-------- | :-----: | :-------------------------------------- | +| `children` | `string` | | Label text | +| `visuallyHidden` | `boolean` | `false` | Hide label visually but keep accessible | + +`CheckboxGroup.Label` extends the HTML `legend` element and supports all `legend` props. + +### CheckboxGroup.Caption + +| Name | Type | Default | Description | +| :--------- | :------- | :-----: | :----------- | +| `children` | `string` | | Caption text | + +`CheckboxGroup.Caption` extends the `span` element and supports all `span` props. + +### CheckboxGroup.Validation + +| Name | Type | Default | Description | +| :--------- | :--------------------------------------------------------------- | :-----: | :--------------------------------- | +| `children` | `string` | | Validation message | +| `variant` | | | Sets the validation state and icon | + +`CheckboxGroup.Validation` extends the `span` element and supports all `span` props. diff --git a/apps/docs/content/components/RadioGroup/images/anatomy.png b/apps/docs/content/components/RadioGroup/images/anatomy.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4c26fee89dd579206389c9f39b56caef6277df GIT binary patch literal 62067 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 literal 0 HcmV?d00001 diff --git a/apps/docs/content/components/RadioGroup/index.mdx b/apps/docs/content/components/RadioGroup/index.mdx new file mode 100644 index 000000000..61e4fb0ae --- /dev/null +++ b/apps/docs/content/components/RadioGroup/index.mdx @@ -0,0 +1,51 @@ +--- +title: Radio group +description: Radio group is used to render a short list of mutually exclusive options. +--- + +import ComponentLayout from '../../../src/layouts/component-layout' + +import anatomy from './images/anatomy.png' +export default ComponentLayout + +## Usage + +Use radio group to allow users to select a single option from a short list of related options. + +### Orientation + +A vertical orientation makes options easier to visually scan. + +### Anatomy + +Anatomy diagram + +**Label:** A title that labels the group of options and helps users understand the relationship between the options in the group + +**Required indicator:** Indicates that a selection is required + +**Caption:** May be used to provide additional context about the radio group when the label alone is not sufficient + +**Options:** A list of mutually exclusive options represented using [radio buttons](/components/Radio) + +**Validation message:** A message explaining why the selection failed validation. See the [form pattern documentation](https://primer.style/ui-patterns/forms/overview#validation-message) for more information on form validation patterns. + +### Best practices + +- Put radio buttons in a logical order +- Only use a radio group for a short list of options: aim for 6 or less options. For longer sets of options, consider using a [select](/components/Select) or an [action menu](/components/ActionMenu) +- Radio buttons cannot be unchecked, so only use a radio group when a selection is required. Consider the following alternatives: + - use a radio group, but with one option that equates to "none of these options" + - use a [checkbox group](/components/CheckboxGroup) that fails validation if more than one option is selected +- If there is an option that's the most likely option to be checked, that option should be checked by default + +## Accessibility + +- Once a user checks an option from a radio group, the result should not be saved or applied until the user has explicitly submitted their input using a "save" or "submit" button. A radio group is a single tab stop, and the options can be navigated using the arrow keys: this means assistive technologies like a screen reader cannot "read" an option without selecting it. See the [saving pattern guidelines](https://primer.style/ui-patterns/saving) for more information. +- Radio groups must be labeled. The label may be visually hidden, but visible labels are preferred. + +## Related components + +- [FormControl](/components/FormControl): Used to group form controls with labels +- [Radio](/components/Radio): Individual radio button control +- [CheckboxGroup](/components/CheckboxGroup): For allowing multiple selections diff --git a/apps/docs/content/components/RadioGroup/react.mdx b/apps/docs/content/components/RadioGroup/react.mdx new file mode 100644 index 000000000..5c7a96c58 --- /dev/null +++ b/apps/docs/content/components/RadioGroup/react.mdx @@ -0,0 +1,164 @@ +--- +title: Radio group +description: Radio group is used to render a short list of mutually exclusive options. +source: https://github.com/primer/brand/blob/main/packages/react/src/forms/RadioGroup/RadioGroup.tsx +figma: 'https://www.figma.com/design/BJ95AjraesmRCWsKA013GS/Primer-Brand?node-id=10467-3461&t=GA5GtEqPtQ9yeRaN-4' +storybook: '/brand/storybook/?path=/story/components-forms-radiogroup--playground' +--- + +import ComponentLayout from '../../../src/layouts/component-layout' +export default ComponentLayout + +import {Label} from '@primer/react' +import {PropTableValues} from '../../../src/components' + +```js +import {RadioGroup} from '@primer/react-brand' +``` + +## Examples + +### Default + +`RadioGroup` creates a semantic container for multiple related radio inputs. Note that all radio inputs must share the same `name` prop to function as a group. + +```jsx live + + Choose your primary workspace + + Codespaces + + + + Local environment + + + + Pen and paper + + + +``` + +### With caption + +Use `RadioGroup.Caption` to provide additional context for the group. + +```jsx live + + Repository visibility + + Choose who can see and access your repository + + + Public + + + + Private + + + +``` + +### With validation + +`RadioGroup.Validation` can display success or error states with appropriate icons. + +```jsx live + + + Valid selection + + Basic plan + + + + Pro plan + + + + Great choice! + + + + + Invalid selection + + Basic plan + + + + Pro plan + + + + Please select a plan to continue + + + +``` + +### Inline + +When space is limited, radio inputs can be arranged horizontally using the [Stack](/components/Stack) component. + +```jsx live + + Time period + + Some inline radio inputs with a visually hidden label + + + + Last 7 days + + + + Last 30 days + + + + Last year + + + + +``` + +## Component props + +### RadioGroup + +| Name | Type | Default | Description | +| :--------- | :--------------------- | :-----: | :--------------------------------------------------------------- | +| `children` | `React.ReactElement[]` | | RadioGroup components and FormControl components | +| `id` | `string` | | Sets a custom id. If not provided, a unique id will be generated | + +`RadioGroup` extends the HTML `fieldset` element and supports all `fieldset` props. + +### RadioGroup.Label + +| Name | Type | Default | Description | +| :--------------- | :-------- | :-----: | :-------------------------------------- | +| `children` | `string` | | Label text | +| `visuallyHidden` | `boolean` | `false` | Hide label visually but keep accessible | + +`RadioGroup.Label` extends the HTML `legend` element and supports all `legend` props. + +### RadioGroup.Caption + +| Name | Type | Default | Description | +| :--------- | :------- | :-----: | :----------- | +| `children` | `string` | | Caption text | + +`RadioGroup.Caption` extends the `span` element and supports all `span` props. + +### RadioGroup.Validation + +| Name | Type | Default | Description | +| :--------- | :--------------------------------------------------------------- | :-----: | :--------------------------------- | +| `children` | `string` | | Validation message | +| `variant` | | | Sets the validation state and icon | + +`RadioGroup.Validation` extends the `span` element and supports all `span` props. diff --git a/apps/docs/src/@primer/gatsby-theme-doctocat/nav.yml b/apps/docs/src/@primer/gatsby-theme-doctocat/nav.yml index 6b3459ca8..9bc402578 100644 --- a/apps/docs/src/@primer/gatsby-theme-doctocat/nav.yml +++ b/apps/docs/src/@primer/gatsby-theme-doctocat/nav.yml @@ -111,10 +111,14 @@ children: - title: Checkbox url: /components/Checkbox + - title: CheckboxGroup + url: /components/CheckboxGroup - title: Form control url: /components/FormControl - title: Radio url: /components/Radio + - title: RadioGroup + url: /components/RadioGroup - title: Select url: /components/Select - title: Textarea diff --git a/packages/react/src/forms/CheckboxGroup/CheckboxGroup.examples.stories.tsx b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.examples.stories.tsx new file mode 100644 index 000000000..cd41a3b54 --- /dev/null +++ b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.examples.stories.tsx @@ -0,0 +1,47 @@ +import React from 'react' +import type {Meta, StoryObj} from '@storybook/react' + +import {CheckboxGroup} from '.' +import {Checkbox, FormControl, Stack} from '../..' +import baseMeta, {type MetaProps} from './CheckboxGroup.stories' + +const meta: Meta = {...baseMeta, title: 'Components/Forms/CheckboxGroup/Examples'} +export default meta + +type Story = StoryObj + +export const Inline: Story = { + args: { + labelChildren: 'Inline example', + labelVisuallyHidden: false, + captionChildren: 'Checkboxes can be displayed inline too', + validationChildren: '', + }, + render: ({labelChildren, labelVisuallyHidden, captionChildren, validationChildren, validationVariant}) => { + return ( + + {labelChildren} + {captionChildren ? {captionChildren} : null} + + + + Choice one + + + + Choice two + + + + Choice three + + + + + {validationChildren ? ( + {validationChildren} + ) : null} + + ) + }, +} diff --git a/packages/react/src/forms/CheckboxGroup/CheckboxGroup.stories.tsx b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.stories.tsx new file mode 100644 index 000000000..bbca991be --- /dev/null +++ b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.stories.tsx @@ -0,0 +1,97 @@ +import React from 'react' +import type {Meta, StoryObj} from '@storybook/react' + +import {CheckboxGroup, type CheckboxGroupProps} from '.' +import {Checkbox, FormControl, type FormValidationStatus} from '../..' + +type CheckboxGroupStoryProps = { + labelChildren: string + labelVisuallyHidden: boolean + captionChildren: string + validationChildren: string + validationVariant: FormValidationStatus +} + +export type MetaProps = CheckboxGroupProps & CheckboxGroupStoryProps + +const meta: Meta = { + title: 'Components/Forms/CheckboxGroup', + component: CheckboxGroup, + args: { + labelChildren: 'Choices', + labelVisuallyHidden: false, + captionChildren: 'Select all that apply', + validationChildren: 'Great job!', + validationVariant: 'success', + }, + argTypes: { + labelChildren: { + name: 'Text', + control: 'text', + table: { + category: 'Label', + }, + }, + labelVisuallyHidden: { + name: 'Visually hidden', + control: 'boolean', + table: { + category: 'Label', + }, + }, + captionChildren: { + name: 'Text', + control: 'text', + table: { + category: 'Caption', + }, + }, + validationChildren: { + name: 'Text', + control: 'text', + table: { + category: 'Validation', + }, + }, + validationVariant: { + name: 'Variant', + options: ['error', 'success'], + control: {type: 'inline-radio'}, + table: { + category: 'Validation', + }, + }, + }, +} + +export default meta + +type Story = StoryObj + +export const Playground: Story = { + render: ({labelChildren, labelVisuallyHidden, captionChildren, validationChildren, validationVariant}) => { + return ( + + {labelChildren} + {captionChildren ? {captionChildren} : null} + + + Choice one + + + + Choice two + + + + Choice three + + + + {validationChildren ? ( + {validationChildren} + ) : null} + + ) + }, +} diff --git a/packages/react/src/forms/CheckboxGroup/CheckboxGroup.test.tsx b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.test.tsx new file mode 100644 index 000000000..9cbbec4ca --- /dev/null +++ b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.test.tsx @@ -0,0 +1,151 @@ +import React, {render, cleanup} from '@testing-library/react' +import '@testing-library/jest-dom' +import {axe, toHaveNoViolations} from 'jest-axe' + +import {CheckboxGroup} from './CheckboxGroup' +import {Checkbox} from '../Checkbox' +import {FormControl} from '../FormControl' + +expect.extend(toHaveNoViolations) + +describe('CheckboxGroup', () => { + afterEach(cleanup) + + it('renders a checkbox group correctly into the document', () => { + const {getByLabelText, getByRole, getByText} = render( + + Choices + You can only pick one + + Choice one + + + + Choice two + + + + Choice three + + + + Great job! + , + ) + + expect(getByRole('group', {name: 'Choices'})).toBeInTheDocument() + expect(getByText('You can only pick one')).toBeInTheDocument() + expect(getByLabelText('Choice one')).toBeInTheDocument() + expect(getByLabelText('Choice two')).toBeInTheDocument() + expect(getByLabelText('Choice three')).toBeInTheDocument() + expect(getByText('Great job!')).toBeInTheDocument() + }) + + it('has no a11y violations', async () => { + const {container} = render( + + Choices + You can only pick one + + Choice one + + + + Choice two + + + + Choice three + + + + Great job! + , + ) + const results = await axe(container) + + expect(results).toHaveNoViolations() + }) + + it('associates the hint with the input using aria-describedby', () => { + const {getByRole, getByText} = render( + + Choices + You can only pick one + + Choice one + + + + Choice two + + + + Choice three + + + , + ) + + const fieldset = getByRole('group', {name: 'Choices'}) + const caption = getByText('You can only pick one') + + expect(fieldset).toHaveAttribute('aria-describedby', caption.id) + }) + + it('associates the validation with the input using aria-describedby', () => { + const {getByRole, getByText} = render( + + Choices + + Choice one + + + + Choice two + + + + Choice three + + + + Uh oh! + , + ) + + const fieldset = getByRole('group', {name: 'Choices'}) + const validation = getByText('Uh oh!') + + expect(fieldset).toHaveAttribute('aria-describedby', validation.id) + }) + + it('associates both a hint and validation with the input using aria-describedby', () => { + const {getByRole, getByText} = render( + + Choices + You can only pick one + + Choice one + + + + Choice two + + + + Choice three + + + + Great job! + , + ) + + const fieldset = getByRole('group', {name: 'Choices'}) + const hint = getByText('You can only pick one') + const validation = getByText('Great job!') + + expect(fieldset).toHaveAttribute('aria-describedby', `${hint.id} ${validation.id}`) + }) +}) diff --git a/packages/react/src/forms/CheckboxGroup/CheckboxGroup.tsx b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.tsx new file mode 100644 index 000000000..50f82fb8f --- /dev/null +++ b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.tsx @@ -0,0 +1,14 @@ +import { + ControlGroup, + type ControlGroupCaptionProps, + type ControlGroupLabelProps, + type ControlGroupProps, + type ControlGroupValidationProps, +} from '../ControlGroup' + +export type CheckboxGroupProps = ControlGroupProps +export type CheckboxGroupLabelProps = ControlGroupLabelProps +export type CheckboxGroupCaptionProps = ControlGroupCaptionProps +export type CheckboxGroupValidationProps = ControlGroupValidationProps + +export const CheckboxGroup = ControlGroup diff --git a/packages/react/src/forms/CheckboxGroup/CheckboxGroup.visual.spec.ts b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.visual.spec.ts new file mode 100644 index 000000000..09daf9612 --- /dev/null +++ b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.visual.spec.ts @@ -0,0 +1,27 @@ +/* + * Do not modify this file directly. + * This file was generated by: playwright.generate-tests.ts. + * Regenerate using: npm run test:visual:generate + */ +import {test, expect} from '@playwright/test' + +// eslint-disable-next-line i18n-text/no-en +test.describe('Visual Comparison: CheckboxGroup', () => { + test('CheckboxGroup / Playground', async ({page}) => { + await page.goto( + 'http://localhost:6006/iframe.html?args=&id=components-forms-checkboxgroup--playground&viewMode=story', + ) + + await page.waitForTimeout(500) + expect(await page.screenshot({fullPage: true})).toMatchSnapshot() + }) + + test('CheckboxGroup / Inline', async ({page}) => { + await page.goto( + 'http://localhost:6006/iframe.html?args=&id=components-forms-checkboxgroup-examples--inline&viewMode=story', + ) + + await page.waitForTimeout(500) + expect(await page.screenshot({fullPage: true})).toMatchSnapshot() + }) +}) diff --git a/packages/react/src/forms/CheckboxGroup/CheckboxGroup.visual.spec.ts-snapshots/Visual-Comparison-CheckboxGroup-CheckboxGroup-Inline-1-linux.png b/packages/react/src/forms/CheckboxGroup/CheckboxGroup.visual.spec.ts-snapshots/Visual-Comparison-CheckboxGroup-CheckboxGroup-Inline-1-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..2efac547ce83f55589418fac29683329e38bcd98 GIT binary patch literal 13840 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 literal 0 HcmV?d00001 diff --git a/packages/react/src/forms/CheckboxGroup/index.ts b/packages/react/src/forms/CheckboxGroup/index.ts new file mode 100644 index 000000000..bc646255b --- /dev/null +++ b/packages/react/src/forms/CheckboxGroup/index.ts @@ -0,0 +1 @@ +export * from './CheckboxGroup' diff --git a/packages/react/src/forms/ControlGroup/ControlGroup.module.css b/packages/react/src/forms/ControlGroup/ControlGroup.module.css new file mode 100644 index 000000000..ad9d0d0a6 --- /dev/null +++ b/packages/react/src/forms/ControlGroup/ControlGroup.module.css @@ -0,0 +1,59 @@ +.ControlGroup__container { + display: flex; + flex-direction: column; + gap: var(--base-size-8); + font-family: var(--brand-body-fontFamily); + font-size: var(--brand-text-size-100); + border: none; + margin: 0; + padding: 0; +} + +.ControlGroup__label { + margin: 0; + padding: 0; + margin-block-end: var(--base-size-8); +} + +.ControlGroup__validation { + display: flex; + gap: var(--base-size-4); + font-weight: var(--base-text-weight-medium); +} + +.ControlGroup__validation--success { + color: var(--brand-color-success-fg); +} + +.ControlGroup__validation--error { + color: var(--brand-color-error-fg); +} + +.ControlGroup__validation-icon--success { + position: relative; + top: -1px; +} + +.ControlGroup__validation-icon--error { + position: relative; + top: -0.5px; +} + +.ControlGroup__validation--animate-in { + animation: 170ms ControlGroupValidationFadeIn var(--brand-animation-easing-glide); +} + +.ControlGroup__container label { + font-weight: var(--base-text-weight-medium); +} + +@keyframes ControlGroupValidationFadeIn { + 0% { + opacity: 0; + transform: translateY(-100%); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} diff --git a/packages/react/src/forms/ControlGroup/ControlGroup.module.css.d.ts b/packages/react/src/forms/ControlGroup/ControlGroup.module.css.d.ts new file mode 100644 index 000000000..9dd9a2b55 --- /dev/null +++ b/packages/react/src/forms/ControlGroup/ControlGroup.module.css.d.ts @@ -0,0 +1,13 @@ +declare const styles: { + readonly "ControlGroup__container": string; + readonly "ControlGroup__label": string; + readonly "ControlGroup__validation": string; + readonly "ControlGroup__validation--success": string; + readonly "ControlGroup__validation--error": string; + readonly "ControlGroup__validation-icon--success": string; + readonly "ControlGroup__validation-icon--error": string; + readonly "ControlGroup__validation--animate-in": string; + readonly "ControlGroupValidationFadeIn": string; +}; +export = styles; + diff --git a/packages/react/src/forms/ControlGroup/ControlGroup.tsx b/packages/react/src/forms/ControlGroup/ControlGroup.tsx new file mode 100644 index 000000000..022f1483e --- /dev/null +++ b/packages/react/src/forms/ControlGroup/ControlGroup.tsx @@ -0,0 +1,120 @@ +import React, {Children, createContext, forwardRef, isValidElement, useContext, type HTMLAttributes} from 'react' +import clsx from 'clsx' +import {AlertFillIcon, CheckCircleFillIcon} from '@primer/octicons-react' +import {useId} from '@reach/auto-id' + +import type {FormValidationStatus} from '..' +import {Text} from '../..' +import styles from './ControlGroup.module.css' + +type ControlGroupContext = { + id?: string +} + +const ControlGroupContext = createContext(null) + +const useControlGroup = () => { + const context = useContext(ControlGroupContext) + + if (!context) { + throw new Error( + 'useControlGroup must be used within an ControlGroupProvider. Did you forget to wrap your component in a ?', + ) + } + + return context +} + +export type ControlGroupProps = HTMLAttributes +const _ControlGroup = forwardRef(({className, id, ...props}, ref) => { + const uniqueId = useId(id) + + const containsCaption = Children.toArray(props.children).some( + child => isValidElement(child) && child.type === ControlGroupCaption, + ) + const containsValidation = Children.toArray(props.children).some( + child => isValidElement(child) && child.type === ControlGroupValidation, + ) + + const describedBy = + [containsCaption && `${uniqueId}-caption`, containsValidation && `${uniqueId}-validation`] + .filter(Boolean) + .join(' ') || undefined + + return ( + +
+ + ) +}) + +export type ControlGroupLabelProps = {visuallyHidden?: boolean} & HTMLAttributes +const ControlGroupLabel = forwardRef( + ({children, className, visuallyHidden, ...props}, ref) => { + return ( + + + {children} + + + ) + }, +) + +export type ControlGroupCaptionProps = HTMLAttributes +const ControlGroupCaption = forwardRef(({className, ...props}, ref) => { + const {id} = useControlGroup() + + return +}) + +export type ControlGroupValidationProps = {variant: FormValidationStatus} & HTMLAttributes +const ControlGroupValidation = forwardRef( + ({className, variant, children, ...props}, ref) => { + const {id} = useControlGroup() + + return ( + + {variant === 'success' && ( + + + + )} + {variant === 'error' && ( + + + + )} + {children} + + ) + }, +) + +export const ControlGroup = Object.assign(_ControlGroup, { + Label: ControlGroupLabel, + Caption: ControlGroupCaption, + Validation: ControlGroupValidation, +}) diff --git a/packages/react/src/forms/ControlGroup/index.ts b/packages/react/src/forms/ControlGroup/index.ts new file mode 100644 index 000000000..9d8e5fc9e --- /dev/null +++ b/packages/react/src/forms/ControlGroup/index.ts @@ -0,0 +1 @@ +export * from './ControlGroup' diff --git a/packages/react/src/forms/FormControl/FormControl.tsx b/packages/react/src/forms/FormControl/FormControl.tsx index f3ca02e0a..5fdafbe6f 100644 --- a/packages/react/src/forms/FormControl/FormControl.tsx +++ b/packages/react/src/forms/FormControl/FormControl.tsx @@ -127,7 +127,6 @@ const Root = ({ id: uniqueId, name: child.props.name, required: child.props.required || required, - validationStatus: child.props.validationStatus || validationStatus, 'aria-describedby': describedBy, }) diff --git a/packages/react/src/forms/RadioGroup/RadioGroup.examples.stories.tsx b/packages/react/src/forms/RadioGroup/RadioGroup.examples.stories.tsx new file mode 100644 index 000000000..9d301dfd3 --- /dev/null +++ b/packages/react/src/forms/RadioGroup/RadioGroup.examples.stories.tsx @@ -0,0 +1,47 @@ +import React from 'react' +import type {Meta, StoryObj} from '@storybook/react' + +import {RadioGroup} from '.' +import {Radio, FormControl, Stack} from '../..' +import baseMeta, {type MetaProps} from './RadioGroup.stories' + +const meta: Meta = {...baseMeta, title: 'Components/Forms/RadioGroup/Examples'} +export default meta + +type Story = StoryObj + +export const Inline: Story = { + args: { + labelChildren: 'Inline example', + labelVisuallyHidden: false, + captionChildren: 'Radios can be displayed inline too', + validationChildren: '', + }, + render: ({labelChildren, labelVisuallyHidden, captionChildren, validationChildren, validationVariant}) => { + return ( + + {labelChildren} + {captionChildren ? {captionChildren} : null} + + + + 0-99 + + + + 100-999 + + + + 1000+ + + + + + {validationChildren ? ( + {validationChildren} + ) : null} + + ) + }, +} diff --git a/packages/react/src/forms/RadioGroup/RadioGroup.stories.tsx b/packages/react/src/forms/RadioGroup/RadioGroup.stories.tsx new file mode 100644 index 000000000..755f1ef1b --- /dev/null +++ b/packages/react/src/forms/RadioGroup/RadioGroup.stories.tsx @@ -0,0 +1,97 @@ +import React from 'react' +import type {Meta, StoryObj} from '@storybook/react' + +import {RadioGroup, type RadioGroupProps} from '.' +import {Radio, FormControl, type FormValidationStatus} from '../..' + +type RadioGroupStoryProps = { + labelChildren: string + labelVisuallyHidden: boolean + captionChildren: string + validationChildren: string + validationVariant: FormValidationStatus +} + +export type MetaProps = RadioGroupProps & RadioGroupStoryProps + +const meta: Meta = { + title: 'Components/Forms/RadioGroup', + component: RadioGroup, + args: { + labelChildren: 'Number of users', + labelVisuallyHidden: false, + captionChildren: 'You can always change this later.', + validationChildren: `That's the perfect number!`, + validationVariant: 'success', + }, + argTypes: { + labelChildren: { + name: 'Text', + control: 'text', + table: { + category: 'Label', + }, + }, + labelVisuallyHidden: { + name: 'Visually hidden', + control: 'boolean', + table: { + category: 'Label', + }, + }, + captionChildren: { + name: 'Text', + control: 'text', + table: { + category: 'Caption', + }, + }, + validationChildren: { + name: 'Text', + control: 'text', + table: { + category: 'Validation', + }, + }, + validationVariant: { + name: 'Variant', + options: ['error', 'success'], + control: {type: 'inline-radio'}, + table: { + category: 'Validation', + }, + }, + }, +} + +export default meta + +type Story = StoryObj + +export const Playground: Story = { + render: ({labelChildren, labelVisuallyHidden, captionChildren, validationChildren, validationVariant}) => { + return ( + + {labelChildren} + {captionChildren ? {captionChildren} : null} + + + 0-99 + + + + 100-999 + + + + 1000+ + + + + {validationChildren ? ( + {validationChildren} + ) : null} + + ) + }, +} diff --git a/packages/react/src/forms/RadioGroup/RadioGroup.test.tsx b/packages/react/src/forms/RadioGroup/RadioGroup.test.tsx new file mode 100644 index 000000000..283fb9f68 --- /dev/null +++ b/packages/react/src/forms/RadioGroup/RadioGroup.test.tsx @@ -0,0 +1,151 @@ +import React, {render, cleanup} from '@testing-library/react' +import '@testing-library/jest-dom' +import {axe, toHaveNoViolations} from 'jest-axe' + +import {RadioGroup} from './RadioGroup' +import {Radio} from '../Radio' +import {FormControl} from '../FormControl' + +expect.extend(toHaveNoViolations) + +describe('RadioGroup', () => { + afterEach(cleanup) + + it('renders a radio group correctly into the document', () => { + const {getByLabelText, getByRole, getByText} = render( + + Choices + You can only pick one + + Choice one + + + + Choice two + + + + Choice three + + + + Great job! + , + ) + + expect(getByRole('group', {name: 'Choices'})).toBeInTheDocument() + expect(getByText('You can only pick one')).toBeInTheDocument() + expect(getByLabelText('Choice one')).toBeInTheDocument() + expect(getByLabelText('Choice two')).toBeInTheDocument() + expect(getByLabelText('Choice three')).toBeInTheDocument() + expect(getByText('Great job!')).toBeInTheDocument() + }) + + it('has no a11y violations', async () => { + const {container} = render( + + Choices + You can only pick one + + Choice one + + + + Choice two + + + + Choice three + + + + Great job! + , + ) + const results = await axe(container) + + expect(results).toHaveNoViolations() + }) + + it('associates the hint with the input using aria-describedby', () => { + const {getByRole, getByText} = render( + + Choices + You can only pick one + + Choice one + + + + Choice two + + + + Choice three + + + , + ) + + const fieldset = getByRole('group', {name: 'Choices'}) + const caption = getByText('You can only pick one') + + expect(fieldset).toHaveAttribute('aria-describedby', caption.id) + }) + + it('associates the validation with the input using aria-describedby', () => { + const {getByRole, getByText} = render( + + Choices + + Choice one + + + + Choice two + + + + Choice three + + + + Uh oh! + , + ) + + const fieldset = getByRole('group', {name: 'Choices'}) + const validation = getByText('Uh oh!') + + expect(fieldset).toHaveAttribute('aria-describedby', validation.id) + }) + + it('associates both a hint and validation with the input using aria-describedby', () => { + const {getByRole, getByText} = render( + + Choices + You can only pick one + + Choice one + + + + Choice two + + + + Choice three + + + + Great job! + , + ) + + const fieldset = getByRole('group', {name: 'Choices'}) + const hint = getByText('You can only pick one') + const validation = getByText('Great job!') + + expect(fieldset).toHaveAttribute('aria-describedby', `${hint.id} ${validation.id}`) + }) +}) diff --git a/packages/react/src/forms/RadioGroup/RadioGroup.tsx b/packages/react/src/forms/RadioGroup/RadioGroup.tsx new file mode 100644 index 000000000..a96dd8c71 --- /dev/null +++ b/packages/react/src/forms/RadioGroup/RadioGroup.tsx @@ -0,0 +1,14 @@ +import { + ControlGroup, + type ControlGroupCaptionProps, + type ControlGroupLabelProps, + type ControlGroupProps, + type ControlGroupValidationProps, +} from '../ControlGroup' + +export type RadioGroupProps = ControlGroupProps +export type RadioGroupLabelProps = ControlGroupLabelProps +export type RadioGroupCaptionProps = ControlGroupCaptionProps +export type RadioGroupValidationProps = ControlGroupValidationProps + +export const RadioGroup = ControlGroup diff --git a/packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts b/packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts new file mode 100644 index 000000000..a529ce8b2 --- /dev/null +++ b/packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts @@ -0,0 +1,25 @@ +/* + * Do not modify this file directly. + * This file was generated by: playwright.generate-tests.ts. + * Regenerate using: npm run test:visual:generate + */ +import {test, expect} from '@playwright/test' + +// eslint-disable-next-line i18n-text/no-en +test.describe('Visual Comparison: RadioGroup', () => { + test('RadioGroup / Playground', async ({page}) => { + await page.goto('http://localhost:6006/iframe.html?args=&id=components-forms-radiogroup--playground&viewMode=story') + + await page.waitForTimeout(500) + expect(await page.screenshot({fullPage: true})).toMatchSnapshot() + }) + + test('RadioGroup / Inline', async ({page}) => { + await page.goto( + 'http://localhost:6006/iframe.html?args=&id=components-forms-radiogroup-examples--inline&viewMode=story', + ) + + await page.waitForTimeout(500) + expect(await page.screenshot({fullPage: true})).toMatchSnapshot() + }) +}) diff --git a/packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts-snapshots/Visual-Comparison-RadioGroup-RadioGroup-Inline-1-linux.png b/packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts-snapshots/Visual-Comparison-RadioGroup-RadioGroup-Inline-1-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..1fa752fe3fece61f0be8f0c9a9182613c8e7031e GIT binary patch literal 12993 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 literal 0 HcmV?d00001 diff --git a/packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts-snapshots/Visual-Comparison-RadioGroup-RadioGroup-Playground-1-linux.png b/packages/react/src/forms/RadioGroup/RadioGroup.visual.spec.ts-snapshots/Visual-Comparison-RadioGroup-RadioGroup-Playground-1-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..a8e90b86e9499194dfc7fd1b7cffabe2ba672bb0 GIT binary patch literal 17975 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