Skip to content

Commit

Permalink
Merge 484bc3a into c29d2ab
Browse files Browse the repository at this point in the history
  • Loading branch information
JulianNymark authored May 8, 2023
2 parents c29d2ab + 484bc3a commit 762771a
Show file tree
Hide file tree
Showing 17 changed files with 761 additions and 131 deletions.
12 changes: 12 additions & 0 deletions .changeset/honest-doors-flow.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
---
"@navikt/ds-css": major
"@navikt/ds-react": major
---

Update Accordion

WHAT: Css changes break backwards compatability, so this update is marked as a major change

WHY: New and improved design was desired.

HOW to update: Update application dependencies (no codemods)
154 changes: 125 additions & 29 deletions @navikt/core/css/accordion.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,73 +2,169 @@
position: relative;
}

/*************************
* Header *
*************************/
.navds-accordion__header {
--__ac-accordion-header-shadow-color: var(--ac-accordion-header-border, var(--a-border-divider));
--__ac-accordion-header-shadow: inset 2px 0 0 0 var(--a-transparent), inset -2px 0 0 0 var(--a-transparent),
inset 0 2px 0 0 var(--__ac-accordion-header-shadow-color);

width: 100%;
display: flex;
justify-content: space-between;
justify-content: flex-start;
align-items: flex-start;
gap: var(--a-spacing-2);
padding: 14px var(--a-spacing-3) var(--a-spacing-3);
padding: var(--a-spacing-3);
margin: 0;
text-align: left;
background: var(--ac-accordion-header-bg, var(--a-surface-transparent));
cursor: pointer;
border: none;
border-bottom: 2px solid var(--ac-accordion-header-border, var(--a-border-divider));
position: relative;
box-shadow: var(--__ac-accordion-header-shadow);
}

.navds-accordion__header:hover {
background-color: var(--ac-accordion-header-bg-hover, var(--a-surface-hover));
text-decoration: underline;
color: var(--ac-accordion-header-text-hover, inherit);
}

.navds-accordion--small .navds-accordion__header {
padding: var(--a-spacing-2) var(--a-spacing-3);
}

.navds-accordion--medium .navds-accordion__header {
padding: var(--a-spacing-3);
}

.navds-accordion--large .navds-accordion__header {
padding: var(--a-spacing-4) var(--a-spacing-3);
}

.navds-accordion__item:last-child > :where(.navds-accordion__header) {
box-shadow: var(--__ac-accordion-header-shadow), inset 0 -2px 0 0 var(--__ac-accordion-header-shadow-color);
}

.navds-accordion__item:last-child:where(.navds-accordion__item--open) :where(.navds-accordion__header) {
box-shadow: inset 2px 0 0 0 var(--a-transparent), inset -2px 0 0 0 var(--a-transparent), inset 0 2px 0 0 var(--a-transparent),
inset 0 2px 0 0 var(--__ac-accordion-header-shadow-color);
}

.navds-accordion__item:last-child:where(.navds-accordion__item--open) {
box-shadow: inset 2px 0 0 0 var(--a-transparent), inset -2px 0 0 0 var(--a-transparent), inset 0 2px 0 0 var(--a-transparent),
inset 0 -2px 0 0 var(--__ac-accordion-header-shadow-color);
}

.navds-accordion__item--open > :where(.navds-accordion__header) {
box-shadow: var(--__ac-accordion-header-shadow);
}

.navds-accordion__header:focus {
.navds-accordion__header:focus-visible {
outline: none;
box-shadow: var(--a-shadow-focus);
border-radius: var(--a-border-radius-large);
}

.navds-accordion__header:hover {
color: var(--ac-accordion-header-text-hover, var(--a-text-action-on-action-subtle));
border-color: var(--ac-accordion-header-border-hover, var(--a-border-default));
background: var(--ac-accordion-header-bg-hover, var(--a-surface-transparent));
@supports not selector(:focus-visible) {
.navds-accordion__header:focus {
outline: none;
box-shadow: var(--a-shadow-focus);
border-radius: var(--a-border-radius-large);
}
}

.navds-accordion__header-content {
overflow: hidden;
text-overflow: ellipsis;
}

.navds-accordion__item--open > .navds-accordion__header {
background-color: var(--ac-accordion-header-bg-open, var(--ac-accordion-item-bg-open, var(--a-surface-action-subtle)));
border-color: var(--ac-accordion-item-border-open, var(--a-surface-action-subtle));
/*************************
* Icon *
*************************/
.navds-accordion__icon-wrapper {
display: grid;
place-content: center;
border-radius: var(--a-border-radius-medium);
height: var(--a-spacing-6);
width: var(--a-spacing-6);
align-self: center;
}

.navds-accordion__item--open > :where(.navds-accordion__header:hover) {
background-color: var(--ac-accordion-header-bg-open-hover, var(--a-surface-action-subtle));
.navds-accordion__header:hover > .navds-accordion__icon-wrapper {
background-color: var(--ac-accordion-header-icon-bg-hover, var(--a-surface-neutral-subtle-hover));
}

.navds-accordion__content {
padding: var(--a-spacing-3) var(--a-spacing-3) 18px;
border-bottom: 2px solid var(--ac-accordion-content-border, var(--a-border-divider));
.navds-accordion__header-chevron {
border-radius: var(--a-border-radius-medium);
font-size: 1.5rem;
height: 1.75rem;
flex-shrink: 0;
transition: transform 150ms ease-in-out;
align-self: center;
}

.navds-accordion__item--open > .navds-accordion__header:hover + * .navds-accordion__content {
border-color: var(--ac-accordion-content-border-open, var(--a-border-default));
:where(.navds-accordion__header):hover > :where(.navds-accordion__icon-wrapper) > :where(.navds-accordion__header-chevron) {
transform: translateY(1px);
}

.navds-accordion__expand-icon {
font-size: 1.5rem;
height: 1.75rem;
flex-shrink: 0;
.navds-accordion__item--open
> :where(.navds-accordion__header)
> :where(.navds-accordion__icon-wrapper)
> :where(.navds-accordion__header-chevron) {
transform: translateY(0) rotate(-180deg);
}

.navds-accordion__item--open > .navds-accordion__header > .navds-accordion__expand-icon {
transform: rotateZ(180deg);
.navds-accordion__item--open
> :where(.navds-accordion__header):hover
> :where(.navds-accordion__icon-wrapper)
> :where(.navds-accordion__header-chevron) {
transform: translateY(-1px) rotate(-180deg);
}

.navds-accordion__expand-icon--filled {
display: none;
/*************************
* Variant/Default *
*************************/
.navds-accordion__item--open {
background-color: var(--ac-accordion-item-bg-open, var(--a-transparent));
}

.navds-accordion__header:hover > .navds-accordion__expand-icon.navds-accordion__expand-icon--filled {
display: inherit;
/*************************
* Variant/Neutral *
*************************/
.navds-accordion__item--open.navds-accordion__item--neutral {
background-color: var(--ac-accordion-neutral-item-bg-open, var(--a-surface-neutral-subtle));
}

.navds-accordion__header:hover > .navds-accordion__expand-icon {
/*************************
* Content *
*************************/
.navds-accordion__content {
padding: 0 var(--a-spacing-3) var(--a-spacing-5) var(--a-spacing-11);
animation: fadeAccordionContent 250ms ease;
}

.navds-accordion__content--closed {
display: none;
}

.navds-accordion__item--no-animation :where(.navds-accordion__content) {
animation: none;
}

@keyframes fadeAccordionContent {
0% {
opacity: 0.25;
transform: translateY(-8px);
}

40% {
opacity: 0.7;
}

100% {
opacity: 1;
transform: translateY(0);
}
}
4 changes: 2 additions & 2 deletions @navikt/core/css/expansioncard.css
Original file line number Diff line number Diff line change
Expand Up @@ -173,13 +173,13 @@
animation: fadeExpansionCard 250ms ease;
}

.navds-expansioncard--no-fade :where(.navds-expansioncard__content-inner) {
.navds-expansioncard--no-animation :where(.navds-expansioncard__content-inner) {
animation: none;
}

@keyframes fadeExpansionCard {
0% {
opacity: 0;
opacity: 0.25;
transform: translateY(-8px);
}

Expand Down
14 changes: 5 additions & 9 deletions @navikt/core/css/tokens.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,17 +14,13 @@
"--ac-alert-icon-success-color": "--a-icon-success"
},
"accordion": {
"--ac-accordion-header-bg": "--ac-surface-transparent",
"--ac-accordion-header-bg-hover": "--ac-surface-transparent",
"--ac-accordion-header-bg": "--a-surface-transparent",
"--ac-accordion-header-bg-hover": "--a-surface-hover",
"--ac-accordion-header-text-hover": "inherit",
"--ac-accordion-header-border": "--a-border-divider",
"--ac-accordion-header-text-hover": "--a-text-action-on-action-subtle",
"--ac-accordion-header-border-hover": "--a-border-default",
"--ac-accordion-item-bg-open": "--a-surface-action-subtle",
"--ac-accordion-header-bg-open": "--ac-accordion-item-bg-open",
"--ac-accordion-header-bg-open-hover": "--a-surface-action-subtle",
"--ac-accordion-item-border-open": "--a-surface-action-subtle",
"--ac-accordion-content-border": "--a-border-divider",
"--ac-accordion-content-border-open": "--a-border-default"
"--ac-accordion-neutral-item-bg-open": "--a-surface-neutral-subtle",
"--ac-accordion-header-icon-bg-hover": "--a-surface-neutral-subtle-hover"
},
"button": {
"--ac-button-border-radius": "--a-border-radius-medium",
Expand Down
46 changes: 43 additions & 3 deletions @navikt/core/react/src/accordion/Accordion.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import React, { forwardRef } from "react";
import AccordionItem, { AccordionItemType } from "./AccordionItem";
import AccordionContent, { AccordionContentType } from "./AccordionContent";
import AccordionHeader, { AccordionHeaderType } from "./AccordionHeader";
import { AccordionContext } from "./AccordionContext";

interface AccordionComponent
extends React.ForwardRefExoticComponent<
Expand All @@ -14,16 +15,55 @@ interface AccordionComponent
}

export interface AccordionProps extends React.HTMLAttributes<HTMLDivElement> {
/**
* @default 'default'
*/
variant?: "default" | "neutral";
/**
* @default 'large'
*/
headingSize?: "large" | "medium" | "small" | "xsmall";
/**
* @default "medium"
*/
size?: "large" | "medium" | "small";
/**
* Instances of Accordion.Item
*/
children: React.ReactNode;
}

export const Accordion = forwardRef<HTMLDivElement, AccordionProps>(
({ className, ...rest }, ref) => (
<div {...rest} className={cl("navds-accordion", className)} ref={ref} />
)
(
{
className,
variant = "default",
headingSize = "medium",
size = "medium",
...rest
},
ref
) => {
return (
<AccordionContext.Provider
value={{
variant,
headingSize,
size,
}}
>
<div
{...rest}
className={cl(
"navds-accordion",
className,
`navds-accordion--${size}`
)}
ref={ref}
/>
</AccordionContext.Provider>
);
}
) as AccordionComponent;

Accordion.Header = AccordionHeader;
Expand Down
25 changes: 14 additions & 11 deletions @navikt/core/react/src/accordion/AccordionContent.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import cl from "clsx";
import React, { forwardRef, useContext } from "react";
import AnimateHeight from "../util/AnimateHeight";
import { BodyLong } from "../typography/BodyLong";
import { AccordionItemContext } from "./AccordionItem";

Expand Down Expand Up @@ -28,16 +27,20 @@ const AccordionContent: AccordionContentType = forwardRef(
}

return (
<AnimateHeight height={context.open ? "auto" : 0} duration={250}>
<BodyLong
{...rest}
as="div"
ref={ref}
className={cl("navds-accordion__content", className)}
>
{children}
</BodyLong>
</AnimateHeight>
<BodyLong
{...rest}
as="div"
ref={ref}
className={cl(
"navds-accordion__content",
{
"navds-accordion__content--closed": !context.open,
},
className
)}
>
{children}
</BodyLong>
);
}
);
Expand Down
15 changes: 15 additions & 0 deletions @navikt/core/react/src/accordion/AccordionContext.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { createContext } from "react";

export type AccordionContextProps = {
variant?: "default" | "neutral";
headingSize?: "large" | "medium" | "small" | "xsmall";
size?: "large" | "medium" | "small";
openItems?: number[];
};

export const AccordionContext = createContext<AccordionContextProps | null>({
variant: "default",
headingSize: "small",
size: "medium",
openItems: [],
});
Loading

0 comments on commit 762771a

Please sign in to comment.