diff --git a/openhands-ui/components/accordion/Accordion.tsx b/openhands-ui/components/accordion/Accordion.tsx index eac14e61b1..eabdc8ca0b 100644 --- a/openhands-ui/components/accordion/Accordion.tsx +++ b/openhands-ui/components/accordion/Accordion.tsx @@ -5,13 +5,13 @@ import { type AccordionItemPropsPublic, } from "./components/AccordionItem"; import { cn } from "../../shared/utils/cn"; -import type { HTMLProps } from "../../shared/types"; +import type { BaseProps, HTMLProps } from "../../shared/types"; export type AccordionProps = HTMLProps<"div"> & { expandedKeys: string[]; type?: "multi" | "single"; setExpandedKeys(keys: string[]): void; -}; +} & BaseProps; type AccordionType = React.FC> & { Item: React.FC>; @@ -23,6 +23,7 @@ const Accordion: AccordionType = ({ setExpandedKeys, children, type = "multi", + testId, ...props }) => { const onChange = useCallback( @@ -54,6 +55,7 @@ const Accordion: AccordionType = ({ return (
{items} diff --git a/openhands-ui/components/accordion/components/AccordionHeader.tsx b/openhands-ui/components/accordion/components/AccordionHeader.tsx index 3cd0211916..66e3e89579 100644 --- a/openhands-ui/components/accordion/components/AccordionHeader.tsx +++ b/openhands-ui/components/accordion/components/AccordionHeader.tsx @@ -1,5 +1,5 @@ import type { PropsWithChildren } from "react"; -import type { HTMLProps } from "../../../shared/types"; +import type { BaseProps, HTMLProps } from "../../../shared/types"; import { cn } from "../../../shared/utils/cn"; import { Icon, type IconProps } from "../../icon/Icon"; import { Typography } from "../../typography/Typography"; @@ -10,7 +10,7 @@ export type AccordionHeaderProps = Omit< > & { icon: IconProps["icon"]; expanded: boolean; -}; +} & BaseProps; export const AccordionHeader = ({ className, @@ -43,7 +43,8 @@ export const AccordionHeader = ({ // hover modifier "data-[expanded=true]:hover:bg-light-neutral-900", // focus modifier - "data-[expanded=false]:focus:bg-light-neutral-900" + "data-[expanded=false]:focus:bg-light-neutral-900", + className )} > diff --git a/openhands-ui/components/accordion/components/AccordionItem.tsx b/openhands-ui/components/accordion/components/AccordionItem.tsx index b74cd3b28b..f3866cf218 100644 --- a/openhands-ui/components/accordion/components/AccordionItem.tsx +++ b/openhands-ui/components/accordion/components/AccordionItem.tsx @@ -1,5 +1,5 @@ import type { PropsWithChildren } from "react"; -import type { HTMLProps } from "../../../shared/types"; +import type { BaseProps, HTMLProps } from "../../../shared/types"; import { cn } from "../../../shared/utils/cn"; import { type IconProps } from "../../icon/Icon"; import { AccordionHeader } from "./AccordionHeader"; @@ -11,10 +11,10 @@ export type AccordionItemProps = HTMLProps<"div"> & { value: string; label: React.ReactNode; onExpandedChange(value: boolean): void; -}; +} & BaseProps; export type AccordionItemPropsPublic = Omit< AccordionItemProps, - "expanded" | "onExpandedChange" + "expanded" | "onExpandedChange" | "className" | "style" | "testId" >; export const AccordionItem = ({ diff --git a/openhands-ui/components/accordion/components/AccordionPanel.tsx b/openhands-ui/components/accordion/components/AccordionPanel.tsx index 0f7466b042..b19c1166d2 100644 --- a/openhands-ui/components/accordion/components/AccordionPanel.tsx +++ b/openhands-ui/components/accordion/components/AccordionPanel.tsx @@ -1,10 +1,10 @@ import type { PropsWithChildren } from "react"; -import type { HTMLProps } from "../../../shared/types"; +import type { BaseProps, HTMLProps } from "../../../shared/types"; import { cn } from "../../../shared/utils/cn"; export type AccordionPanelProps = Omit, "aria-expanded"> & { expanded: boolean; -}; +} & BaseProps; export const AccordionPanel = ({ className, diff --git a/openhands-ui/components/button/Button.tsx b/openhands-ui/components/button/Button.tsx index e645e0e2e5..d48bab6bec 100644 --- a/openhands-ui/components/button/Button.tsx +++ b/openhands-ui/components/button/Button.tsx @@ -4,7 +4,11 @@ import { type PropsWithChildren, type ReactElement, } from "react"; -import type { ComponentVariant, HTMLProps } from "../../shared/types"; +import type { + BaseProps, + ComponentVariant, + HTMLProps, +} from "../../shared/types"; import { cn } from "../../shared/utils/cn"; import { buttonStyles, useAndApplyBoldTextWidth } from "./utils"; import { cloneIcon } from "../../shared/utils/clone-icon"; @@ -15,7 +19,7 @@ export type ButtonProps = Omit, "aria-disabled"> & { variant?: ComponentVariant; start?: ReactElement>; end?: ReactElement>; -}; +} & BaseProps; export const Button = ({ size = "small", @@ -24,6 +28,7 @@ export const Button = ({ children, start, end, + testId, ...props }: PropsWithChildren) => { const buttonClassNames = buttonStyles[variant]; @@ -35,6 +40,7 @@ export const Button = ({ diff --git a/openhands-ui/components/typography/BaseTypography.tsx b/openhands-ui/components/typography/BaseTypography.tsx index 71020970a0..baa94b349e 100644 --- a/openhands-ui/components/typography/BaseTypography.tsx +++ b/openhands-ui/components/typography/BaseTypography.tsx @@ -6,6 +6,7 @@ import { type FontWeight, } from "./utils"; import { cn } from "../../shared/utils/cn"; +import type { BaseProps } from "../../shared/types"; type SupportedReactNodes = "h6" | "h5" | "h4" | "h3" | "h2" | "h1" | "span"; @@ -13,7 +14,7 @@ export type BaseTypographyProps = React.HTMLAttributes & { fontSize?: FontSize; fontWeight?: FontWeight; as: SupportedReactNodes; -}; +} & BaseProps; export const BaseTypography = ({ fontSize, @@ -21,6 +22,7 @@ export const BaseTypography = ({ className, children, as, + testId, ...props }: PropsWithChildren) => { const Component = as; @@ -28,6 +30,7 @@ export const BaseTypography = ({ return ( = Omit< React.ComponentPropsWithoutRef, - "children" + "children" | "style" | "className" >; export type ComponentVariant = "primary" | "secondary" | "tertiary"; diff --git a/openhands-ui/shared/utils/clone-icon.ts b/openhands-ui/shared/utils/clone-icon.ts index 6c1478f4a1..14c78218ea 100644 --- a/openhands-ui/shared/utils/clone-icon.ts +++ b/openhands-ui/shared/utils/clone-icon.ts @@ -1,9 +1,9 @@ import { cloneElement, isValidElement, type ReactElement } from "react"; -import type { ComponentVariant, HTMLProps } from "../../shared/types"; +import type { BaseProps, HTMLProps } from "../../shared/types"; export const cloneIcon = ( - icon?: ReactElement>, - props?: HTMLProps<"svg"> + icon?: ReactElement & BaseProps>, + props?: HTMLProps<"svg"> & BaseProps ) => { if (!icon) { return null;