Files
web/packages/design-system/lib/components/Icons/MaterialIcon/index.tsx
Joakim Jäderberg d284e82828 Merged in chore/fix-tests (pull request #3430)
Chore/fix tests

* chore: Upgrade nextjs@16.1.1

* chore: upgrade next@16.1.1

* upgrade underlying types

* merge

* Fix broken tests

* bump @swc/plugin-formatjs to latest version

* bump sentry

* transpile "import-in-the-middle" & "require-in-the-middle"

* revert next@16.1.1 upgrade

* revert transpilation addition

* .
2026-01-13 13:48:06 +00:00

71 lines
1.6 KiB
TypeScript

import { HTMLAttributes } from "react"
import { MaterialIconName, materialIcons } from "./generated"
import { VariantProps } from "class-variance-authority"
import { iconVariants } from "../variants"
import styles from "./index.module.css"
export interface MaterialIconProps
extends
Omit<HTMLAttributes<HTMLOrSVGElement>, "color" | "id">,
VariantProps<typeof iconVariants> {
icon: MaterialIconName
size?: number
styleName?: "outlined" | "rounded" | "sharp"
isFilled?: boolean
}
export type MaterialIconSetIconProps = Omit<MaterialIconProps, "icon">
export function MaterialIcon({
icon,
size = 24,
styleName = "outlined",
color = "CurrentColor",
isFilled,
...props
}: MaterialIconProps) {
const iconStyles = materialIcons[icon]
if (!iconStyles) {
console.warn(`Icon "${icon}" not found in registry`)
return null
}
const styleVariants = iconStyles[styleName]
if (!styleVariants) {
console.warn(`Icon "${icon}" does not have style "${styleName}"`)
return null
}
const IconComponent = isFilled ? styleVariants.filled : styleVariants.outlined
if (!IconComponent) {
console.warn(
`Icon "${icon}" does not have ${
isFilled ? "filled" : "outlined"
} variant for style "${styleName}"`
)
return null
}
const iconClassName = iconVariants({ color })
return (
<span
data-testid="MaterialIcon"
data-icon-name={icon}
className={`${styles.iconWrapper}`}
{...props}
>
<IconComponent
width={size}
height={size}
className={iconClassName}
aria-hidden
focusable={false}
/>
</span>
)
}