Skip to content

Commit e4bd245

Browse files
authored
feat(dropdowns): adds subcomponent mapping to Field (#1745)
1 parent 64c3e59 commit e4bd245

File tree

14 files changed

+54
-43
lines changed

14 files changed

+54
-43
lines changed

docs/migration.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,11 @@ consider additional positioning prop support on a case-by-case basis.
8888
renamed to `@zendeskgarden/react-dropdowns.legacy` in `v9`
8989
- `Menu`: value `auto` is no longer valid for the `fallbackPlacements` prop.
9090
- Removed `label` prop from `OptGroup`. Use `legend` instead.
91+
- Subcomponent exports have been deprecated and will be removed in a future major version. Update
92+
to subcomponent properties:
93+
- `Hint` -> `Field.Hint`
94+
- `Label` -> `Field.Label`
95+
- `Message` -> `Field.Message`
9196

9297
#### @zendeskgarden/react-forms
9398

packages/dropdowns/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { Field, Label, Combobox, Option } from '@zendeskgarden/react-dropdowns';
2828
*/
2929
<ThemeProvider>
3030
<Field>
31-
<Label>Combobox</Label>
31+
<Field.Label>Label</Field.Label>
3232
<Combobox>
3333
<Option value="One" />
3434
<Option value="Two" />

packages/dropdowns/demo/combobox.stories.mdx

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,6 @@
11
import { Meta, ArgsTable, Canvas, Story, Markdown } from '@storybook/addon-docs';
22
import { useArgs } from '@storybook/client-api';
3-
import {
4-
Combobox,
5-
Hint,
6-
Label,
7-
Message,
8-
Option,
9-
OptGroup,
10-
Tag
11-
} from '@zendeskgarden/react-dropdowns';
3+
import { Combobox, Field, Option, OptGroup, Tag } from '@zendeskgarden/react-dropdowns';
124
import { ComboboxStory } from './stories/ComboboxStory';
135
import { OPTIONS } from './stories/data';
146
import README from '../README.md';
@@ -17,9 +9,10 @@ import README from '../README.md';
179
title="Packages/Dropdowns/Combobox"
1810
component={Combobox}
1911
subcomponents={{
20-
Hint,
21-
Label,
22-
Message,
12+
Field,
13+
'Field.Hint': Field.Hint,
14+
'Field.Label': Field.Label,
15+
'Field.Message': Field.Message,
2316
Option,
2417
'Option.Meta': Option.Meta,
2518
OptGroup,

packages/dropdowns/demo/stories/ComboboxStory.tsx

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,11 +15,8 @@ import { Grid } from '@zendeskgarden/react-grid';
1515
import {
1616
Combobox,
1717
Field,
18-
Hint,
1918
IComboboxProps,
2019
IOptionProps,
21-
Label,
22-
Message,
2320
OptGroup,
2421
Option,
2522
Tag
@@ -127,10 +124,10 @@ export const ComboboxStory: Story<IArgs> = ({
127124
<Grid.Row justifyContent="center" style={{ height: 'calc(100vh - 80px)' }}>
128125
<Grid.Col alignSelf="center">
129126
<Field>
130-
<Label hidden={isLabelHidden} isRegular={isLabelRegular}>
127+
<Field.Label hidden={isLabelHidden} isRegular={isLabelRegular}>
131128
{label}
132-
</Label>
133-
{hint && <Hint>{hint}</Hint>}
129+
</Field.Label>
130+
{hint && <Field.Hint>{hint}</Field.Hint>}
134131
<Combobox
135132
validation={validation}
136133
{...args}
@@ -179,9 +176,9 @@ export const ComboboxStory: Story<IArgs> = ({
179176
)}
180177
</Combobox>
181178
{message && (
182-
<Message validation={validation} validationLabel={validationLabel}>
179+
<Field.Message validation={validation} validationLabel={validationLabel}>
183180
{message}
184-
</Message>
181+
</Field.Message>
185182
)}
186183
</Field>
187184
</Grid.Col>

packages/dropdowns/demo/~patterns/stories/ListboxStory.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import React, { useRef } from 'react';
99
import { Story } from '@storybook/react';
1010
import styled from 'styled-components';
11-
import { Combobox, Field, Label, Option } from '@zendeskgarden/react-dropdowns';
11+
import { Combobox, Field, Option } from '@zendeskgarden/react-dropdowns';
1212
import { getColorV8 } from '@zendeskgarden/react-theming';
1313
import { Paragraph } from '@zendeskgarden/react-typography';
1414

@@ -34,7 +34,7 @@ export const ListboxStory: Story<IArgs> = ({ listboxAppendToNode }) => {
3434
<div ref={portalNode} />
3535
<StyledContainer>
3636
<Field>
37-
<Label>Listbox portal pattern</Label>
37+
<Field.Label>Listbox portal pattern</Field.Label>
3838
<Combobox
3939
isAutocomplete
4040
isEditable={false}

packages/dropdowns/src/elements/combobox/Combobox.spec.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ import { Combobox } from './Combobox';
1414
import { OptGroup } from './OptGroup';
1515
import { Option } from './Option';
1616
import { Field } from './Field';
17-
import { Label } from './Label';
18-
import { Hint } from './Hint';
19-
import { Message } from './Message';
2017

2118
interface ITestComboboxProps extends IComboboxProps {
2219
fieldTestId?: string;
@@ -46,8 +43,8 @@ const TestCombobox = forwardRef<HTMLDivElement, ITestComboboxProps>(
4643
ref
4744
) => (
4845
<Field data-test-id={fieldTestId}>
49-
<Label data-test-id={labelTestId}>Label</Label>
50-
<Hint data-test-id={hintTestId}>Hint</Hint>
46+
<Field.Label data-test-id={labelTestId}>Label</Field.Label>
47+
<Field.Hint data-test-id={hintTestId}>Hint</Field.Hint>
5148
<Combobox
5249
data-test-id={comboboxTestId}
5350
inputProps={
@@ -59,13 +56,13 @@ const TestCombobox = forwardRef<HTMLDivElement, ITestComboboxProps>(
5956
>
6057
{children}
6158
</Combobox>
62-
<Message
59+
<Field.Message
6360
data-test-id={messageTestId}
6461
validation={validation}
6562
validationLabel={validationLabel}
6663
>
6764
Message
68-
</Message>
65+
</Field.Message>
6966
</Field>
7067
)
7168
);

packages/dropdowns/src/elements/combobox/Field.tsx

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
import React, { HTMLAttributes, LabelHTMLAttributes, forwardRef, useMemo, useState } from 'react';
99
import { FieldContext } from '../../context/useFieldContext';
1010
import { StyledField } from '../../views';
11+
import { Hint } from './Hint';
12+
import { Label } from './Label';
13+
import { Message } from './Message';
1114

12-
/**
13-
* @extends HTMLAttributes<HTMLDivElement>
14-
*/
15-
export const Field = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>((props, ref) => {
15+
const FieldComponent = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>((props, ref) => {
1616
const [labelProps, setLabelProps] = useState<LabelHTMLAttributes<HTMLLabelElement> | undefined>(
1717
undefined
1818
);
@@ -56,4 +56,17 @@ export const Field = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
5656
);
5757
});
5858

59-
Field.displayName = 'Field';
59+
FieldComponent.displayName = 'Field';
60+
61+
/**
62+
* @extends HTMLAttributes<HTMLDivElement>
63+
*/
64+
export const Field = FieldComponent as typeof FieldComponent & {
65+
Hint: typeof Hint;
66+
Label: typeof Label;
67+
Message: typeof Message;
68+
};
69+
70+
Field.Hint = Hint;
71+
Field.Label = Label;
72+
Field.Message = Message;

packages/dropdowns/src/elements/combobox/Hint.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ import useFieldContext from '../../context/useFieldContext';
1010
import { StyledHint } from '../../views';
1111

1212
/**
13+
* @deprecated use `Field.Hint` instead
14+
*
1315
* @extends HTMLAttributes<HTMLDivElement>
1416
*/
1517
export const Hint = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>((props, ref) => {

packages/dropdowns/src/elements/combobox/Label.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import { ILabelProps } from '../../types';
1313
import { StyledLabel } from '../../views';
1414

1515
/**
16+
* @deprecated use `Field.Label` instead
17+
*
1618
* @extends LabelHTMLAttributes<HTMLLabelElement>
1719
*/
1820
export const Label = forwardRef<HTMLLabelElement, ILabelProps>(

packages/dropdowns/src/elements/combobox/Message.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ import useFieldContext from '../../context/useFieldContext';
1313
import { StyledMessage } from '../../views';
1414

1515
/**
16+
* @deprecated use `Field.Message` instead
17+
*
1618
* @extends HTMLAttributes<HTMLDivElement>
1719
*/
1820
export const Message = forwardRef<HTMLDivElement, IMessageProps>((props, ref) => {

0 commit comments

Comments
 (0)