Skip to content

Commit c2d6c57

Browse files
authored
fix: according last item border (#240)
* fix: according last item border * restyle * cleanup
1 parent 59fbe0a commit c2d6c57

File tree

3 files changed

+77
-26
lines changed

3 files changed

+77
-26
lines changed

src/accordion/Accordion.tsx

Lines changed: 31 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@ export interface AccordionProps {
1111

1212
const accordionItemCSS = css`
1313
cursor: pointer;
14-
padding: var(--accordion-padding-top) var(--accordion-padding-side);
14+
height: 40px;
15+
padding: 0 var(--accordion-padding-side);
1516
display: block;
1617
width: 100%;
1718
display: flex;
@@ -25,15 +26,9 @@ const accordionItemCSS = css`
2526
text-align: start;
2627
color: var(--ac-global-text-color-900);
2728
border-bottom: 1px solid var(--ac-global-border-color-dark);
28-
/* remove outline - TODO might need to give a visual cue that this area is in focus */
29-
outline: none;
30-
background-color: var(--ac-global-background-color-light);
31-
transition: background-color 0.2s ease-in-out;
29+
transition: background-color ease-in-out 0.2s;
3230
&:hover {
33-
background-color: var(--ac-global-background-color-light-hover);
34-
}
35-
.ac-accordion-item__title {
36-
font-size: var(--accordion-font-size);
31+
background-color: var(--ac-global-background-color-light);
3732
}
3833
`;
3934

@@ -48,12 +43,16 @@ export function Accordion({ children }: AccordionProps) {
4843
role="region"
4944
css={css`
5045
--accordion-animation-duration: ${theme.animation.global.duration}ms;
51-
5246
&.ac-accordion--default {
5347
--accordion-padding-top: var(--ac-global-dimension-static-size-100);
5448
--accordion-padding-side: var(--ac-global-dimension-static-size-200);
5549
--accordion-font-size: ${theme.typography.sizes.medium.fontSize}px;
5650
}
51+
.ac-accordion-item:not(:last-of-type) {
52+
.ac-accordion-itemContent {
53+
border-bottom: 1px solid var(--ac-global-border-color-dark);
54+
}
55+
}
5756
`}
5857
>
5958
{children}
@@ -77,6 +76,10 @@ export interface AccordionItemProps {
7776
* Callback function for when the collapsed state changes
7877
*/
7978
onChange?: (isOpen: boolean) => void;
79+
/**
80+
* An extra element to show on the right hand side
81+
*/
82+
extra?: ReactNode;
8083
}
8184

8285
export function AccordionItem(props: AccordionItemProps) {
@@ -87,6 +90,7 @@ export function AccordionItem(props: AccordionItemProps) {
8790
defaultIsOpen = true,
8891
onChange,
8992
children,
93+
extra,
9094
} = props;
9195
const [isOpen, setIsOpen] = useState(defaultIsOpen);
9296
const contentId = `${id}-content`,
@@ -137,23 +141,32 @@ export function AccordionItem(props: AccordionItemProps) {
137141
aria-expanded={isOpen}
138142
>
139143
{titleEl}
140-
<Icon
141-
svg={<ArrowIosDownwardOutline />}
142-
className="ac-accordion-itemIndicator"
144+
<div
143145
css={css`
144-
transition: transform ease var(--accordion-animation-duration);
145-
transform: rotate(0deg);
146+
display: flex;
147+
flex-direction: row;
148+
align-items: center;
149+
gap: var(--ac-global-dimension-static-size-100);
146150
`}
147-
aria-hidden={true}
148-
/>
151+
>
152+
{extra}
153+
<Icon
154+
svg={<ArrowIosDownwardOutline />}
155+
className="ac-accordion-itemIndicator"
156+
css={css`
157+
transition: transform ease var(--accordion-animation-duration);
158+
transform: rotate(0deg);
159+
`}
160+
aria-hidden={true}
161+
/>
162+
</div>
149163
</button>
150164
</Heading>
151165
<div
152166
className="ac-accordion-itemContent"
153167
id={contentId}
154168
role="region"
155169
css={css`
156-
border-bottom: 1px solid var(--ac-global-border-color-dark);
157170
display: ${isOpen ? 'block' : 'none'};
158171
`}
159172
aria-labelledby={headerId}

src/card/Card.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ export function useStyleBorderColor(styleProps: HTMLAttributes<HTMLElement>) {
8080
: `var(--ac-global-border-color-default)`;
8181
}, [styleProps.style]);
8282
}
83+
8384
export function Card({
8485
title,
8586
subTitle,

stories/Accordion.stories.tsx

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@ import {
77
AccordionItem,
88
Card,
99
Counter,
10+
Text,
11+
Button,
12+
View,
1013
} from '../src';
1114
import InfoTip from './components/InfoTip';
1215
import { ThemeSplitView } from './components/ThemeSplitView';
@@ -20,14 +23,17 @@ const meta: Meta = {
2023
};
2124

2225
const AccordionContents = () => (
23-
<p style={{ padding: 16, margin: 10 }}>
24-
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
25-
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
26-
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
27-
consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse
28-
cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat
29-
non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
30-
</p>
26+
<View padding="size-100">
27+
<Text>
28+
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
29+
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
30+
veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
31+
commodo consequat. Duis aute irure dolor in reprehenderit in voluptate
32+
velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat
33+
cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id
34+
est laborum
35+
</Text>
36+
</View>
3137
);
3238

3339
export default meta;
@@ -68,3 +74,34 @@ const Template: Story<AccordionProps> = args => {
6874
// By passing using the Args format for exported stories, you can control the props for a component for reuse in a test
6975
// https://storybook.js.org/docs/react/workflows/unit-testing
7076
export const Default = Template.bind({});
77+
78+
export function simple() {
79+
return (
80+
<ThemeSplitView>
81+
<Accordion>
82+
<AccordionItem
83+
title="2 Predictions"
84+
titleExtra={<InfoTip>Description of predictions</InfoTip>}
85+
id="predictions"
86+
extra={
87+
<Button variant="default" size="compact">
88+
Edit
89+
</Button>
90+
}
91+
>
92+
<AccordionContents />
93+
</AccordionItem>
94+
<AccordionItem
95+
title="Features"
96+
titleExtra={<Counter variant="light">100</Counter>}
97+
id="features"
98+
>
99+
<AccordionContents />
100+
</AccordionItem>
101+
<AccordionItem title="10 Actuals" id="actuals">
102+
<AccordionContents />
103+
</AccordionItem>
104+
</Accordion>
105+
</ThemeSplitView>
106+
);
107+
}

0 commit comments

Comments
 (0)