Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions packages/@react-spectrum/s2/chromatic/Accordion.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,13 @@ import {
} from '../src/Accordion';

import {ActionButton} from '../src/ActionButton';
import File from '../s2wf-icons/S2_Icon_File_20_N.svg';
import type {Meta, StoryObj} from '@storybook/react';
import NewIcon from '../s2wf-icons/S2_Icon_New_20_N.svg';
import People from '../s2wf-icons/S2_Icon_People_20_N.svg';
import React from 'react';
import {style} from '../style/spectrum-theme' with {type: 'macro'};
import {Text} from '../src/Content';
import {TextField} from '../src/TextField';

const meta: Meta<typeof Accordion> = {
Expand Down Expand Up @@ -151,3 +154,34 @@ export const WithActionButton: Story = {
);
}
};

export const WithIcon: Story = {
render: args => {
return (
<div className={style({minHeight: 240})}>
<Accordion {...args}>
<AccordionItem id="files">
<AccordionItemTitle>
<File />
<Text>Files</Text>
</AccordionItemTitle>
<AccordionItemPanel>Files content</AccordionItemPanel>
</AccordionItem>
<AccordionItem id="people">
<AccordionItemTitle>
<People />
<Text>People</Text>
</AccordionItemTitle>
<AccordionItemPanel>
<TextField
label="Name"
styles={style({maxWidth: 176})}
placeholder="Enter your name"
/>
</AccordionItemPanel>
</AccordionItem>
</Accordion>
</div>
);
}
};
18 changes: 18 additions & 0 deletions packages/@react-spectrum/s2/chromatic/Disclosure.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@
import {ActionButton} from '../src/ActionButton';

import {Disclosure, DisclosureHeader, DisclosurePanel, DisclosureTitle} from '../src/Disclosure';
import File from '../s2wf-icons/S2_Icon_File_20_N.svg';
import type {Meta, StoryObj} from '@storybook/react';
import NewIcon from '../s2wf-icons/S2_Icon_New_20_N.svg';
import React from 'react';
import {style} from '../style/spectrum-theme' with {type: 'macro'};
import {Text} from '../src/Content';

const meta: Meta<typeof Disclosure> = {
component: Disclosure,
Expand Down Expand Up @@ -77,3 +79,19 @@ export const WithActionButton: Story = {
);
}
};

export const WithIcon: Story = {
render: args => {
return (
<div className={style({minHeight: 240})}>
<Disclosure {...args}>
<DisclosureTitle>
<File />
<Text>Files</Text>
</DisclosureTitle>
<DisclosurePanel>Files content</DisclosurePanel>
</Disclosure>
</div>
);
}
};
2 changes: 2 additions & 0 deletions packages/@react-spectrum/s2/exports/Accordion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,5 @@ export type {
AccordionItemRenderProps
} from '../src/Accordion';
export type {Key} from '@react-types/shared';

export {Text} from '../src/Content';
2 changes: 2 additions & 0 deletions packages/@react-spectrum/s2/exports/Disclosure.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,5 @@ export {
DisclosureTitle
} from '../src/Disclosure';
export type {DisclosureProps, DisclosurePanelProps} from '../src/Disclosure';

export {Text} from '../src/Content';
43 changes: 34 additions & 9 deletions packages/@react-spectrum/s2/src/Disclosure.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -23,12 +23,13 @@ import {
baseColor,
centerPadding,
focusRing,
fontRelative,
lightDark,
space,
style
} from '../style' with {type: 'macro'};
import {Button} from 'react-aria-components/Button';
import {CenterBaseline} from './CenterBaseline';
import {CenterBaseline, centerBaseline} from './CenterBaseline';

import Chevron from '../ui-icons/Chevron';

Expand All @@ -43,7 +44,9 @@ import {
import {filterDOMProps} from 'react-aria/filterDOMProps';
import {getAllowedOverrides, StyleProps, UnsafeStyles} from './style-utils' with {type: 'macro'};
import {Heading} from 'react-aria-components/Heading';
import {IconContext} from './Icon';
import React, {createContext, forwardRef, ReactNode, useContext} from 'react';
import {Text, TextContext} from './Content';
import {useDOMRef} from './useDOMRef';
import {useLocale} from 'react-aria/I18nProvider';
import {useSpectrumContextProps} from './useSpectrumContextProps';
Expand Down Expand Up @@ -171,12 +174,16 @@ const buttonStyles = style({
}
},
lineHeight: 'ui',
display: 'flex',
flexGrow: 1,
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this removal seems undesireable?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

i think it should be fine? the parent has flexGrow 1: and button is the only flex child and since it has width: 'full, it with always take up the parent's full width

display: 'grid',
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this is fine, but any particular reason for switching to grid?

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah it was either use grid or use flex and wrap the icon and text within another div. i can't use gap on button styles bc the spacing if different between the chevron + icon and icon + text. since i didn't really want to add another node, i opted to use grid

gridTemplateAreas: ['expand-button icon label'],
gridTemplateColumns: ['auto', 'auto', 'minmax(0, 1fr)'],
alignItems: 'baseline',
paddingX: 'calc(self(minHeight) * 3/8 - 1px)',
'--spacingGap': {
type: 'marginEnd',
value: 'calc(self(minHeight) * 3/8 - 1px)'
},
paddingX: '--spacingGap',
paddingY: centerPadding(),
gap: 'calc(self(minHeight) * 3/8 - 1px)',
minHeight: {
// compact is equivalent to 'control', but other densities have more padding.
size: {
Expand Down Expand Up @@ -238,8 +245,7 @@ const chevronStyles = style({
'--iconPrimary': {
type: 'fill',
value: 'currentColor'
},
flexShrink: 0
}
});

const InternalDisclosureHeader = createContext<{} | null>(null);
Expand Down Expand Up @@ -306,10 +312,29 @@ export const DisclosureTitle = forwardRef(function DisclosureTitle(
<Button
className={renderProps => buttonStyles({...renderProps, size, density, isQuiet})}
slot="trigger">
<CenterBaseline>
<CenterBaseline styles={style({gridArea: 'expand-button', marginEnd: '--spacingGap'})}>
<Chevron size={size} className={chevronStyles({isExpanded, isRTL})} aria-hidden="true" />
</CenterBaseline>
{props.children}
<Provider
values={[
[
IconContext,
{
render: centerBaseline({
slot: 'icon',
styles: style({
gridArea: 'icon',
marginEnd: 'text-to-visual',
'--iconPrimary': {type: 'fill', value: 'currentColor'}
})
}),
styles: style({size: fontRelative(16)})
}
],
[TextContext, {styles: style({gridArea: 'label'})}]
]}>
{typeof props.children === 'string' ? <Text>{props.children}</Text> : props.children}
</Provider>
</Button>
</Heading>
);
Expand Down
39 changes: 38 additions & 1 deletion packages/@react-spectrum/s2/stories/Accordion.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,14 @@ import {
} from '../src/Accordion';

import {ActionButton} from '../src/ActionButton';
import File from '../s2wf-icons/S2_Icon_File_20_N.svg';
import {Key} from '@react-types/shared';
import type {Meta, StoryObj} from '@storybook/react';
import NewIcon from '../s2wf-icons/S2_Icon_New_20_N.svg';
import People from '../s2wf-icons/S2_Icon_People_20_N.svg';
import React from 'react';
import {style} from '../style' with {type: 'macro'};
import {Text} from '../src/Content';
import {TextField} from '../src/TextField';

const meta: Meta<typeof Accordion> = {
Expand Down Expand Up @@ -185,7 +188,10 @@ export const WithActionButton: Story = {
<Accordion {...args}>
<AccordionItem id="files">
<AccordionItemHeader>
<AccordionItemTitle>Files</AccordionItemTitle>
<AccordionItemTitle>
<File />
Files
</AccordionItemTitle>
<ActionButton aria-label="Add new file">
<NewIcon />
</ActionButton>
Expand All @@ -212,3 +218,34 @@ export const WithActionButton: Story = {
);
}
};

export const WithIcon: Story = {
render: args => {
return (
<div className={style({minHeight: 240})}>
<Accordion {...args}>
<AccordionItem id="files">
<AccordionItemTitle>
<File />
<Text>Files</Text>
</AccordionItemTitle>
<AccordionItemPanel>Files content</AccordionItemPanel>
</AccordionItem>
<AccordionItem id="people">
<AccordionItemTitle>
<People />
<Text>People</Text>
</AccordionItemTitle>
<AccordionItemPanel>
<TextField
label="Name"
styles={style({maxWidth: 176})}
placeholder="Enter your name"
/>
</AccordionItemPanel>
</AccordionItem>
</Accordion>
</div>
);
}
};
18 changes: 18 additions & 0 deletions packages/@react-spectrum/s2/stories/Disclosure.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,12 @@
import {ActionButton} from '../src/ActionButton';

import {Disclosure, DisclosureHeader, DisclosurePanel, DisclosureTitle} from '../src/Disclosure';
import File from '../s2wf-icons/S2_Icon_File_20_N.svg';
import type {Meta, StoryObj} from '@storybook/react';
import NewIcon from '../s2wf-icons/S2_Icon_New_20_N.svg';
import React from 'react';
import {style} from '../style' with {type: 'macro'};
import {Text} from '../src/Content';

const meta: Meta<typeof Disclosure> = {
component: Disclosure,
Expand Down Expand Up @@ -121,3 +123,19 @@ export const WithActionButton: Story = {
);
}
};

export const WithIcon: Story = {
render: args => {
return (
<div className={style({minHeight: 240})}>
<Disclosure {...args}>
<DisclosureTitle>
<File />
<Text>Files</Text>
</DisclosureTitle>
<DisclosurePanel>Files content</DisclosurePanel>
</Disclosure>
</div>
);
}
};
35 changes: 35 additions & 0 deletions packages/dev/s2-docs/pages/s2/Accordion.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,41 @@ import {style} from '@react-spectrum/s2/style' with {type: 'macro'};
</Accordion>
```

### Slots

`AccordionItemTitle` supports icons, `Text` as children.

```tsx render
"use client";
import {Accordion, AccordionItem, AccordionItemTitle, AccordionItemPanel, AccordionItemHeader, Text} from '@react-spectrum/s2/Accordion';
import Project from '@react-spectrum/s2/icons/Project';
import Settings from '@react-spectrum/s2/icons/Settings';
import {style} from '@react-spectrum/s2/style' with {type: 'macro'};

<Accordion>
<AccordionItem styles={style({width: 250})}>
<AccordionItemHeader>
{/*- begin highlight -*/}
<AccordionItemTitle>
<Project />
<Text>Project Settings</Text>
</AccordionItemTitle>
{/*- end highlight -*/}
</AccordionItemHeader>
<AccordionItemPanel>
Configure your project settings including name, description, and permissions.
</AccordionItemPanel>
</AccordionItem>
<AccordionItem id="preferences">
<AccordionItemTitle>
<Settings />
<Text>Preferences</Text>
</AccordionItemTitle>
<AccordionItemPanel>User preferences content</AccordionItemPanel>
</AccordionItem>
</Accordion>
```

## API

```tsx links={{Accordion: '#accordion', AccordionItem: '#accordionitem', AccordionItemHeader: '#accordionitemheader', AccordionItemTitle: '#accordionitemtitle', AccordionItemPanel: '#accordionitempanel'}}
Expand Down
26 changes: 26 additions & 0 deletions packages/dev/s2-docs/pages/s2/Disclosure.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,32 @@ import {style} from '@react-spectrum/s2/style' with {type: 'macro'};
</Disclosure>
```

### Slots

`DisclosureTitle` supports icons, `Text` as children.

```tsx render
"use client"

import {Disclosure, DisclosureTitle, DisclosurePanel, DisclosureHeader, Text} from '@react-spectrum/s2/Disclosure';
import Project from '@react-spectrum/s2/icons/Project';
import {style} from '@react-spectrum/s2/style' with {type: 'macro'};

<Disclosure styles={style({width: 250})}>
<DisclosureHeader>
{/*- begin highlight -*/}
<DisclosureTitle>
<Project />
<Text>Project Settings</Text>
</DisclosureTitle>
{/*- end highlight -*/}
</DisclosureHeader>
<DisclosurePanel>
Configure your project settings including name, description, and permissions.
</DisclosurePanel>
</Disclosure>
```

## API

```tsx links={{Disclosure: '#disclosure', DisclosureHeader: '#disclosureheader', DisclosureTitle: '#disclosuretitle', DisclosurePanel: '#disclosurepanel'}}
Expand Down
Loading