review dropdown lolo

This commit is contained in:
Max S 2024-07-26 16:24:05 +02:00
parent 30af203045
commit d777d15db6
4 changed files with 77 additions and 48 deletions

View File

@ -1,45 +1,64 @@
@import "@Themes/constants.scss"; @import "@Themes/constants.scss";
.root { .root {
cursor: pointer; .label {
height: 56px;
display: flex;
align-items: center;
padding: var(--spacing-2, 16px) var(--spacing-sm, 8px);
gap: var(--spacing-2, 16px);
border-radius: var(--input-radius, 0px);
border: 1px solid var(--dropdown-input-border-default, #d7dce0);
background: var(--dropdown-input-background, #fff);
.content {
width: 100%;
display: flex;
padding: 0px var(--spacing-2, 16px); padding: 0px var(--spacing-2, 16px);
}
.container {
cursor: pointer;
display: flex;
align-items: center; align-items: center;
flex: 1 0 0; height: 56px;
}
&:hover { padding: var(--spacing-2, 16px) var(--spacing-sm, 8px);
border-color: var(--dropdown-input-border-hovered); gap: var(--spacing-2, 16px);
}
&.active { border-radius: var(--input-radius, 0px);
border-color: var(--dropdown-input-border-filled); border: 1px solid var(--dropdown-input-border-default, #d7dce0);
} background: var(--dropdown-input-background, #fff);
&.open { .content {
border-color: var(--dropdown-input-border-expanded); width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
height: 24px;
.value {
width: 100%;
display: flex;
padding: 0px var(--spacing-2, 16px);
align-items: center;
flex: 1 0 0;
}
svg { svg {
transform: rotate(180deg); width: 24px;
height: 24px;
cursor: pointer;
stroke: var(--button-icon-button-default-default);
}
}
&:hover {
border-color: var(--dropdown-input-border-hovered);
}
&.active {
border-color: var(--dropdown-input-border-filled);
}
&.open {
border-color: var(--dropdown-input-border-expanded);
svg {
transform: rotate(180deg);
}
}
&.disabled {
opacity: var(--opacity-disabled, 0.3);
pointer-events: none;
} }
} }
&.disabled {
opacity: var(--opacity-disabled, 0.3);
pointer-events: none;
}
} }

View File

@ -3,7 +3,6 @@ import { ChevronDownIcon } from "@heroicons/react/24/outline";
import classNames from "classnames"; import classNames from "classnames";
import { useCallback, useEffect, useState } from "react"; import { useCallback, useEffect, useState } from "react";
import IconButton from "../IconButton";
import Typography, { ETypo, ETypoColor } from "../Typography"; import Typography, { ETypo, ETypoColor } from "../Typography";
import classes from "./classes.module.scss"; import classes from "./classes.module.scss";
import DropdownMenu from "./DropdownMenu"; import DropdownMenu from "./DropdownMenu";
@ -11,6 +10,7 @@ import { IOption } from "./DropdownMenu/DropdownOption";
type IProps = { type IProps = {
options: IOption[]; options: IOption[];
label?: string;
placeholder?: string; placeholder?: string;
disabled?: boolean; disabled?: boolean;
onSelect?: (option: IOption) => void; onSelect?: (option: IOption) => void;
@ -36,22 +36,30 @@ export default function Dropdown(props: IProps) {
return ( return (
<DropdownMenu options={options} openable={openable} onSelect={handleOnSelect} selectedOption={selectedOption}> <DropdownMenu options={options} openable={openable} onSelect={handleOnSelect} selectedOption={selectedOption}>
<div <div className={classes["root"]}>
className={classNames([ {props.label && (
classes["root"], <Typography className={classes["label"]} typo={ETypo.TEXT_MD_REGULAR} color={ETypoColor.CONTRAST_DEFAULT}>
openable.isOpen && classes["open"], {props.label}
disabled && classes["disabled"],
!!selectedOption && classes["active"],
])}
onClick={openable.toggle}>
<div className={classes["content"]}>
<Typography
typo={ETypo.TEXT_MD_REGULAR}
color={!!selectedOption ? ETypoColor.DROPDOWN_CONTRAST_ACTIVE : ETypoColor.DROPDOWN_CONTRAST_DEFAULT}>
{getLabel(selectedOption) ?? placeholder}
</Typography> </Typography>
)}
<div
className={classNames([
classes["container"],
openable.isOpen && classes["open"],
disabled && classes["disabled"],
!!selectedOption && classes["active"],
])}
onClick={openable.toggle}>
<div className={classes["content"]}>
<Typography
className={classes["value"]}
typo={!!selectedOption ? ETypo.TEXT_MD_SEMIBOLD : ETypo.TEXT_MD_REGULAR}
color={!!selectedOption ? ETypoColor.DROPDOWN_CONTRAST_ACTIVE : ETypoColor.DROPDOWN_CONTRAST_DEFAULT}>
{getLabel(selectedOption) ?? placeholder}
</Typography>
<ChevronDownIcon />
</div>
</div> </div>
<IconButton icon={<ChevronDownIcon />} />
</div> </div>
</DropdownMenu> </DropdownMenu>
); );

View File

@ -41,6 +41,7 @@
.input-container { .input-container {
display: flex; display: flex;
align-items: center;
flex: 1; flex: 1;
gap: 8px; gap: 8px;
padding: 0px var(--spacing-2, 16px); padding: 0px var(--spacing-2, 16px);

View File

@ -127,6 +127,7 @@ export default function DesignSystem() {
}, },
]} ]}
placeholder="Placeholder" placeholder="Placeholder"
label="Label"
/> />
<Typography typo={ETypo.TEXT_LG_BOLD}>Navigation latérale</Typography> <Typography typo={ETypo.TEXT_LG_BOLD}>Navigation latérale</Typography>
<SearchBlockList <SearchBlockList