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

Diff for: docs/migration.md

+5
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

Diff for: packages/dropdowns/README.md

+1-1
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" />

Diff for: packages/dropdowns/demo/combobox.stories.mdx

+5-12
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,

Diff for: packages/dropdowns/demo/stories/ComboboxStory.tsx

+5-8
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>

Diff for: packages/dropdowns/demo/~patterns/stories/ListboxStory.tsx

+2-2
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}

Diff for: packages/dropdowns/src/elements/combobox/Combobox.spec.tsx

+4-7
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
);

Diff for: packages/dropdowns/src/elements/combobox/Field.tsx

+18-5
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;

Diff for: packages/dropdowns/src/elements/combobox/Hint.tsx

+2
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) => {

Diff for: packages/dropdowns/src/elements/combobox/Label.tsx

+2
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>(

Diff for: packages/dropdowns/src/elements/combobox/Message.tsx

+2
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) => {

Diff for: packages/dropdowns/src/views/combobox/StyledHint.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
import styled from 'styled-components';
99
import { retrieveComponentStyles, DEFAULT_THEME } from '@zendeskgarden/react-theming';
10-
import { Hint } from '@zendeskgarden/react-forms';
10+
import { Field } from '@zendeskgarden/react-forms';
1111

1212
const COMPONENT_ID = 'dropdowns.combobox.hint';
1313

14-
export const StyledHint = styled(Hint).attrs({
14+
export const StyledHint = styled(Field.Hint).attrs({
1515
'data-garden-id': COMPONENT_ID,
1616
'data-garden-version': PACKAGE_VERSION
1717
})`

Diff for: packages/dropdowns/src/views/combobox/StyledLabel.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
import styled from 'styled-components';
99
import { retrieveComponentStyles, DEFAULT_THEME } from '@zendeskgarden/react-theming';
10-
import { Label } from '@zendeskgarden/react-forms';
10+
import { Field } from '@zendeskgarden/react-forms';
1111

1212
const COMPONENT_ID = 'dropdowns.combobox.label';
1313

14-
export const StyledLabel = styled(Label).attrs({
14+
export const StyledLabel = styled(Field.Label).attrs({
1515
'data-garden-id': COMPONENT_ID,
1616
'data-garden-version': PACKAGE_VERSION
1717
})`

Diff for: packages/dropdowns/src/views/combobox/StyledMessage.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,11 @@
77

88
import styled from 'styled-components';
99
import { retrieveComponentStyles, DEFAULT_THEME } from '@zendeskgarden/react-theming';
10-
import { Message } from '@zendeskgarden/react-forms';
10+
import { Field } from '@zendeskgarden/react-forms';
1111

1212
const COMPONENT_ID = 'dropdowns.combobox.message';
1313

14-
export const StyledMessage = styled(Message).attrs({
14+
export const StyledMessage = styled(Field.Message).attrs({
1515
'data-garden-id': COMPONENT_ID,
1616
'data-garden-version': PACKAGE_VERSION
1717
})`

Diff for: packages/typography/demo/stories/data.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ if __name__ == '__main__':
287287
288288
import React from 'react';
289289
import { Col, Row } from '@zendeskgarden/react-grid';
290-
import { Combobox, Field, Label, Option, Tag } from '@zendeskgarden/react-dropdowns.next';
290+
import { Combobox, Field, Option, Tag } from '@zendeskgarden/react-dropdowns.next';
291291
import { ReactComponent as AvatarIcon } from '@zendeskgarden/svg-icons/src/16/user-solo-stroke.svg';
292292
293293
const OPTIONS = [
@@ -330,7 +330,7 @@ const Example = () => {
330330
<Row justifyContent="center">
331331
<Col sm={5}>
332332
<Field>
333-
<Label>Horticulturalists</Label>
333+
<Field.Label>Horticulturalists</Field.Label>
334334
<Combobox isMultiselectable maxHeight="auto">
335335
{OPTIONS.map(option => (
336336
<Option

0 commit comments

Comments
 (0)