Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Admin UI - Accordion Component #4505

Merged
merged 60 commits into from
Feb 10, 2025
Merged
Show file tree
Hide file tree
Changes from 9 commits
Commits
Show all changes
60 commits
Select commit Hold shift + click to select a range
9ea14e8
wip
adrians5j Jan 22, 2025
ac949f1
wip
adrians5j Jan 22, 2025
2bc9162
Merge remote-tracking branch 'refs/remotes/origin/feat/new-admin-ui' …
adrians5j Jan 24, 2025
11b2e36
wip
adrians5j Jan 24, 2025
83f16ee
wip
adrians5j Jan 26, 2025
0c84634
wip
adrians5j Jan 26, 2025
2e0b203
wip
adrians5j Jan 27, 2025
10b41f8
wip
adrians5j Jan 27, 2025
5cc2a8f
wip
adrians5j Jan 27, 2025
704561c
wip
adrians5j Jan 27, 2025
015611c
wip
adrians5j Feb 3, 2025
3ca70d2
wip
adrians5j Feb 3, 2025
4b5d40b
wip
adrians5j Feb 3, 2025
b5e60de
Merge remote-tracking branch 'refs/remotes/origin/feat/new-admin-ui' …
adrians5j Feb 4, 2025
99f2e65
wip
adrians5j Feb 5, 2025
b3808af
wip
adrians5j Feb 5, 2025
f12ab9a
wip
adrians5j Feb 5, 2025
83a1d09
wip
adrians5j Feb 5, 2025
483d6a1
wip
adrians5j Feb 5, 2025
9f7b6bb
wip
adrians5j Feb 5, 2025
f3de0f5
wip
adrians5j Feb 6, 2025
c6dd8e0
wip
adrians5j Feb 6, 2025
4ece986
wip
adrians5j Feb 6, 2025
2203129
wip
adrians5j Feb 6, 2025
2d65e51
wip
adrians5j Feb 6, 2025
c374ecb
wip
adrians5j Feb 6, 2025
e4971ef
wip
adrians5j Feb 6, 2025
9441782
wip
adrians5j Feb 6, 2025
1f16139
wip
adrians5j Feb 6, 2025
c204093
wip
adrians5j Feb 6, 2025
674f4ec
wip
adrians5j Feb 6, 2025
e66d20d
wip
adrians5j Feb 6, 2025
a9e4de2
wip
adrians5j Feb 6, 2025
74f78f4
wip
adrians5j Feb 6, 2025
d0487a9
wip
adrians5j Feb 6, 2025
e859420
wip
adrians5j Feb 6, 2025
60cda1d
wip
adrians5j Feb 6, 2025
bd4a7d4
wip
adrians5j Feb 6, 2025
c5afa9d
fix: rename skeletonPulse to skeleton-pulse
adrians5j Feb 7, 2025
cf9c947
fix: use TW numbers instead of px
adrians5j Feb 7, 2025
effc6fa
fix: remove redundant displayName setting
adrians5j Feb 7, 2025
844a55e
fix: make Icon label prop required again
adrians5j Feb 7, 2025
5e5cb9c
fix: use `cva`
adrians5j Feb 7, 2025
002ee3e
fix: remove default value
adrians5j Feb 7, 2025
b13d00c
fix: use `cva`
adrians5j Feb 7, 2025
6199d04
fix: use `cva`
adrians5j Feb 7, 2025
09dc98c
fix: remove context
adrians5j Feb 7, 2025
22efe18
fix: remove comment
adrians5j Feb 7, 2025
a7c769c
wip
adrians5j Feb 10, 2025
747fa3f
wip
adrians5j Feb 10, 2025
e408823
wip
adrians5j Feb 10, 2025
d2c65f3
wip
adrians5j Feb 10, 2025
1c05b9b
wip
adrians5j Feb 10, 2025
a6e9e4a
Merge remote-tracking branch 'refs/remotes/origin/feat/new-admin-ui' …
adrians5j Feb 10, 2025
cdb3bcb
wip
adrians5j Feb 10, 2025
64c3a74
wip
adrians5j Feb 10, 2025
42df0a0
wip
adrians5j Feb 10, 2025
ffad86a
wip
adrians5j Feb 10, 2025
c5cd0aa
wip
adrians5j Feb 10, 2025
0198736
wip
adrians5j Feb 10, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ const createTailwindConfigTheme = normalizedFigmaExport => {
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
skeletonPulse: "skeletonPulse 1400ms ease-in-out infinite"
"skeleton-pulse": "skeleton-pulse 1400ms ease-in-out infinite"
},
backgroundColor: normalizedFigmaExport.reduce(
(acc, { type, variantName }) => {
Expand Down Expand Up @@ -140,7 +140,7 @@ const createTailwindConfigTheme = normalizedFigmaExport => {
from: { height: "var(--radix-accordion-content-height)" },
to: { height: "0" }
},
skeletonPulse: {
"skeleton-pulse": {
"0%, 100%": { backgroundColor: "hsl(var(--bg-neutral-dimmed))" },
"50%": { backgroundColor: "hsl(var(--bg-neutral-muted))" }
}
Expand Down
48 changes: 29 additions & 19 deletions packages/admin-ui/src/Accordion/Accordion.tsx
Original file line number Diff line number Diff line change
@@ -1,19 +1,37 @@
import React, { useMemo } from "react";
import { cn, makeDecoratable, withStaticProps } from "~/utils";
import { makeDecoratable, withStaticProps } from "~/utils";
import { AccordionRoot } from "./components/AccordionRoot";
import { AccordionContext, useAccordion } from "./components/AccordionContext";
import { AccordionItem, type AccordionItemProps } from "./components/AccordionItem";
import { cva, type VariantProps } from "class-variance-authority";

type AccordionProps = React.ComponentPropsWithoutRef<typeof AccordionRoot> & {
children: React.ReactNode;
variant?: "underline" | "container";
background?: "transparent" | "base" | "light";
};
const accordionVariants = cva("wby-group w-full", {
variants: {
variant: {
container: "wby-accordion-variant-container wby-gap-xs wby-flex wby-flex-col",
underline: "wby-accordion-variant-underline "
},
background: {
base: "wby-accordion-background-base",
light: "wby-accordion-background-light",
transparent: "wby-accordion-background-transparent"
}
},
defaultVariants: {
variant: "underline",
background: "base"
}
});

type AccordionProps = React.ComponentPropsWithoutRef<typeof AccordionRoot> &
VariantProps<typeof accordionVariants> & {
children: React.ReactNode;
};

const AccordionBase = ({
children,
variant,
background = "base",
background,
className,
...baseRootProps
}: AccordionProps) => {
const rootProps = useMemo(() => {
Expand All @@ -28,25 +46,17 @@ const AccordionBase = ({
return (
<AccordionRoot
{...rootProps}
className={cn(
"w-full",
{ "wby-gap-xs wby-flex wby-flex-col": variant === "container" },
rootProps.className
)}
className={accordionVariants({ variant, background, className })}
>
<AccordionContext.Provider value={{ variant, background }}>
{children}
</AccordionContext.Provider>
{children}
</AccordionRoot>
);
};

AccordionBase.displayName = "Accordion";

const DecoratableAccordion = makeDecoratable("Accordion", AccordionBase);

const Accordion = withStaticProps(DecoratableAccordion, {
Item: AccordionItem
});

export { Accordion, type AccordionProps, type AccordionItemProps, useAccordion };
export { Accordion, type AccordionProps, type AccordionItemProps };
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,17 @@ const accordionContentVariants = cva(
// Using pixel values here because of non-existing design tokens.
variants: {
withIcon: {
true: "wby-pl-[36px]"
true: "wby-pl-9"
},
withHandle: {
true: "wby-pl-[20px]"
true: "wby-pl-5"
}
},
compoundVariants: [
{
withIcon: true,
withHandle: true,
className: "wby-pl-[56px]"
className: "wby-pl-14"
}
],
defaultVariants: {
Expand All @@ -41,7 +41,7 @@ const AccordionContent = ({ children, withIcon, withHandle, ...props }: Accordio
{...props}
className={cn(accordionContentVariants({ withHandle, withIcon }), props.className)}
>
<div className={"wby-pt-sm wby-pb-lg wby-pl-md wby-pr-[52px]"}>{children}</div>
<div className={"wby-pt-sm wby-pb-lg wby-pl-md wby-pr-13"}>{children}</div>
</AccordionPrimitive.Content>
);
};
Expand Down
16 changes: 0 additions & 16 deletions packages/admin-ui/src/Accordion/components/AccordionContext.tsx

This file was deleted.

22 changes: 10 additions & 12 deletions packages/admin-ui/src/Accordion/components/AccordionItem.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@ import { AccordionContent } from "./AccordionContent";
import { AccordionItemIcon } from "./AccordionItemIcon";
import { AccordionItemAction } from "./AccordionItemAction";
import { AccordionItemHandle } from "./AccordionItemHandle";
import { useAccordion } from "~/Accordion";

interface AccordionItemProps
extends Omit<React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>, "title"> {
Expand All @@ -19,12 +18,11 @@ interface AccordionItemProps
}

const AccordionItemBase = (props: AccordionItemProps) => {
const { variant, background } = useAccordion();

const { itemProps, triggerProps, contentProps } = React.useMemo(() => {
const {
// Item props.
value,
className,

// Content props.
children,
Expand All @@ -35,7 +33,8 @@ const AccordionItemBase = (props: AccordionItemProps) => {

return {
itemProps: {
value
value,
className
},
triggerProps,
contentProps: { children, withIcon: !!props.icon, withHandle: !!props.handle }
Expand All @@ -46,12 +45,13 @@ const AccordionItemBase = (props: AccordionItemProps) => {
<AccordionPrimitive.Item
{...itemProps}
className={cn(
"wby-border-b-sm wby-border-b-neutral-dimmed data-[state=open]:wby-rounded-bl-lg data-[state=open]:wby-rounded-br-lg",
{
"wby-rounded-lg": variant === "container",
"wby-bg-neutral-base": background === "base",
"wby-bg-neutral-light": background === "light"
}
[
"wby-border-b-sm wby-border-b-neutral-dimmed data-[state=open]:wby-rounded-bl-lg data-[state=open]:wby-rounded-br-lg",
"group-[.wby-accordion-variant-container]:wby-rounded-lg",
"group-[.wby-accordion-background-base]:wby-bg-neutral-base",
"group-[.wby-accordion-background-light]:wby-bg-neutral-light"
],
itemProps.className
)}
>
<AccordionTrigger {...triggerProps} />
Expand All @@ -60,8 +60,6 @@ const AccordionItemBase = (props: AccordionItemProps) => {
);
};

AccordionItemBase.displayName = "AccordionItem";

const DecoratableAccordionItem = makeDecoratable("AccordionItem", AccordionItemBase);

const AccordionItem = withStaticProps(DecoratableAccordionItem, {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,9 @@ import { makeDecoratable } from "~/utils";
import { Icon, IconProps as IconProps } from "~/Icon";
import { ReactComponent as DragHandleIcon } from "@material-design-icons/svg/filled/drag_indicator.svg";

interface AccordionItemHandleProps extends Omit<IconProps, "icon"> {
interface AccordionItemHandleProps extends Omit<IconProps, "icon" | "label"> {
icon?: React.ReactElement;
label?: string;
}

const AccordionItemHandleBase = ({ onClick, ...props }: AccordionItemHandleProps) => {
Expand All @@ -27,6 +28,7 @@ const AccordionItemHandleBase = ({ onClick, ...props }: AccordionItemHandleProps
color={"neutral-light"}
className={"wby-mx-xxs"}
icon={<DragHandleIcon />}
label={"Drag handle"}
{...props}
onClick={onClickCallback}
/>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,7 @@ const AccordionTrigger = ({ title, description, actions, icon, handle }: Accordi
className={"wby-transition"}
color={"neutral-strong"}
data-role={"open-close-indicator"}
label={"Open/close indicator"}
icon={<KeyboardArrowDownIcon />}
/>
</div>
Expand Down
4 changes: 2 additions & 2 deletions packages/admin-ui/src/Icon/Icon.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,12 @@ const iconVariants = cva("", {
interface IconProps
extends Omit<React.HTMLAttributes<HTMLOrSVGElement>, "color">,
VariantProps<typeof iconVariants> {
label?: string; // We don't want to force the label to be required.
label: string; // We don't want to force the label to be required.
adrians5j marked this conversation as resolved.
Show resolved Hide resolved
icon: React.ReactElement;
}

const IconBase = React.forwardRef<HTMLOrSVGElement, IconProps>((props, ref) => {
const { label = "", icon, color, size, className, ...rest } = props;
const { label, icon, color, size, className, ...rest } = props;
return (
<AccessibleIcon.Root label={label}>
{React.cloneElement(icon, {
Expand Down
2 changes: 1 addition & 1 deletion packages/admin-ui/src/Skeleton/Skeleton.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React from "react";
import { cn, cva, VariantProps, makeDecoratable } from "~/utils";

const skeletonVariants = cva("wby-animate-skeletonPulse wby-rounded-sm", {
const skeletonVariants = cva("wby-animate-skeleton-pulse wby-rounded-sm", {
variants: {
type: {
text: "wby-w-full",
Expand Down
4 changes: 2 additions & 2 deletions packages/admin-ui/tailwind.config.theme.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ module.exports = {
animation: {
"accordion-down": "accordion-down 0.2s ease-out",
"accordion-up": "accordion-up 0.2s ease-out",
skeletonPulse: "skeletonPulse 1400ms ease-in-out infinite"
"skeleton-pulse": "skeleton-pulse 1400ms ease-in-out infinite"
},
backgroundColor: {
transparent: "transparent",
Expand Down Expand Up @@ -249,7 +249,7 @@ module.exports = {
from: { height: "var(--radix-accordion-content-height)" },
to: { height: "0" }
},
skeletonPulse: {
"skeleton-pulse": {
"0%, 100%": { backgroundColor: "hsl(var(--bg-neutral-dimmed))" },
"50%": { backgroundColor: "hsl(var(--bg-neutral-muted))" }
}
Expand Down
23 changes: 14 additions & 9 deletions packages/ui/src/Accordion/AccordionItem.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,15 @@
import React, { useMemo } from "react";
import { ListItem } from "../List";
import { Accordion as AdminUiAccordion } from "@webiny/admin-ui";
import { withStaticProps } from "@webiny/admin-ui/utils";

export interface AccordionItemProps {
/**
* Element displayed when accordion is expanded.
*/
children:
| React.ReactElement<typeof ListItem>[]
| React.ReactElement<typeof AccordionItem>
| React.ReactElement<typeof AccordionItem>[];
children: React.ReactElement;

/**
* @deprecated This prop no longer has any effect.
* Elevation number, default set to 2
*/
elevation?: number;
Expand All @@ -21,18 +18,26 @@ export interface AccordionItemProps {
* Append a class name
*/
className?: string;

value?: string;

title?: string;

icon?: React.ReactElement;
}

const AccordionItemBase = (props: any) => {
const AccordionItemBase = (props: AccordionItemProps) => {
const value = useMemo(() => {
return props.value || props.title;
return props.value || props.title || "";
}, [props.value, props.title]);

const icon = useMemo(() => {
return props.icon ? <AdminUiAccordion.Item.Icon icon={props.icon} /> : null;
return props.icon ? (
<AdminUiAccordion.Item.Icon icon={props.icon} label={props.title || ""} />
) : null;
}, [props.icon]);

return <AdminUiAccordion.Item {...props} value={value} icon={icon} />;
return <AdminUiAccordion.Item {...props} value={value} icon={icon} title={props.title || ""} />;
};

/**
Expand Down
Loading