Revert "fix(SW-2101): do not apply underline to Material icons inside Link and Button"

This reverts commit 35f9c3aab5.
This commit is contained in:
Michael Zetterberg
2025-04-02 10:29:43 +02:00
parent b6db9757d8
commit be04600863
7 changed files with 8 additions and 78 deletions

View File

@@ -278,10 +278,7 @@ a.default {
.baseText:focus, .baseText:focus,
.baseText:hover { .baseText:hover {
color: var(--Base-Button-Text-On-Fill-Hover); color: var(--Base-Button-Text-On-Fill-Hover);
text-decoration: underline;
& span:not(:global(.material-symbols)) {
text-decoration: underline;
}
} }
.baseText:disabled { .baseText:disabled {
@@ -300,6 +297,7 @@ a.default {
.icon.baseText:focus svg *, .icon.baseText:focus svg *,
.icon.baseText:hover svg * { .icon.baseText:hover svg * {
fill: var(--Base-Button-Text-On-Fill-Hover); fill: var(--Base-Button-Text-On-Fill-Hover);
text-decoration: underline;
} }
.icon.baseText:disabled svg, .icon.baseText:disabled svg,

View File

@@ -1,29 +1,14 @@
"use client" "use client"
import { Slot } from "@radix-ui/react-slot" import { Slot } from "@radix-ui/react-slot"
import { Children, type ReactNode } from "react"
import { Button as ButtonRAC } from "react-aria-components" import { Button as ButtonRAC } from "react-aria-components"
import { buttonVariants } from "./variants" import { buttonVariants } from "./variants"
import type { ButtonProps } from "./button" import type { ButtonProps } from "./button"
// We wrap all text nodes to avoid having consumers manually wrap text nodes in spans.
// This is so that we can better support underline on buttons as Material Symbols
// are implemented as a font and therefore gets underline. Icons inside buttons
// should not get an underline.
function wrapTextNodes(children: ReactNode): ReactNode {
return Children.map(children, (child) => {
if (typeof child === "string") {
return <span>{child}</span>
}
return child
})
}
export default function Button(props: ButtonProps) { export default function Button(props: ButtonProps) {
const { const {
children,
className, className,
clean, clean,
intent, intent,
@@ -46,17 +31,9 @@ export default function Button(props: ButtonProps) {
variant, variant,
}) })
const wrappedChildren =
typeof children === "function" ? children : wrapTextNodes(children)
if (restProps.asChild) { if (restProps.asChild) {
const { asChild, ...slotProps } = restProps const { asChild, ...slotProps } = restProps
return ( return <Slot className={classNames} {...slotProps} />
<Slot className={classNames} {...slotProps}>
{/* @ts-expect-error: Incorrect types for Slot */}
{wrappedChildren}
</Slot>
)
} }
const { asChild, onClick, disabled, ...racProps } = restProps const { asChild, onClick, disabled, ...racProps } = restProps
@@ -66,8 +43,6 @@ export default function Button(props: ButtonProps) {
isDisabled={disabled} isDisabled={disabled}
onPress={onClick} onPress={onClick}
{...racProps} {...racProps}
> />
{wrappedChildren}
</ButtonRAC>
) )
} }

View File

@@ -1,7 +1,7 @@
"use client" "use client"
import NextLink from "next/link" import NextLink from "next/link"
import { usePathname, useSearchParams } from "next/navigation" import { usePathname, useSearchParams } from "next/navigation"
import { Children, type ReactNode, useCallback, useMemo } from "react" import { useCallback, useMemo } from "react"
import { useCheckIfExternalLink } from "@/hooks/useCheckIfExternalLink" import { useCheckIfExternalLink } from "@/hooks/useCheckIfExternalLink"
import { trackClick } from "@/utils/tracking" import { trackClick } from "@/utils/tracking"
@@ -10,21 +10,7 @@ import { linkVariants } from "./variants"
import type { LinkProps } from "./link" import type { LinkProps } from "./link"
// We wrap all text nodes to avoid having consumers manually wrap text nodes in spans.
// This is so that we can better support underline on links as Material Symbols
// are implemented as a font and therefore gets underline. Icons inside links
// should not get an underline.
function wrapTextNodes(children: ReactNode): ReactNode {
return Children.map(children, (child) => {
if (typeof child === "string") {
return <span>{child}</span>
}
return child
})
}
export default function Link({ export default function Link({
children,
active, active,
className, className,
color, color,
@@ -110,9 +96,6 @@ export default function Link({
className: classNames, className: classNames,
} }
const wrappedChildren =
typeof children === "function" ? children : wrapTextNodes(children)
return isExternal ? ( return isExternal ? (
<a <a
{...linkProps} {...linkProps}
@@ -122,9 +105,7 @@ export default function Link({
onClick(e) onClick(e)
} }
}} }}
> />
{wrappedChildren}
</a>
) : ( ) : (
<NextLink <NextLink
scroll={scroll} scroll={scroll}
@@ -140,8 +121,6 @@ export default function Link({
id={trackingId} id={trackingId}
{...props} {...props}
{...linkProps} {...linkProps}
> />
{wrappedChildren}
</NextLink>
) )
} }

View File

@@ -43,10 +43,7 @@
font-weight: var(--typography-Body-Underline-fontWeight); font-weight: var(--typography-Body-Underline-fontWeight);
letter-spacing: var(--typography-Body-Underline-letterSpacing); letter-spacing: var(--typography-Body-Underline-letterSpacing);
line-height: var(--typography-Body-Underline-lineHeight); line-height: var(--typography-Body-Underline-lineHeight);
text-decoration: underline;
& span:not(:global(.material-symbols)) {
text-decoration: underline;
}
} }
.myPageMobileDropdown { .myPageMobileDropdown {

View File

@@ -2,8 +2,6 @@ import { withThemeByClassName } from '@storybook/addon-themes'
import type { Preview, ReactRenderer } from '@storybook/react' import type { Preview, ReactRenderer } from '@storybook/react'
import 'react-material-symbols/rounded'
import '../lib/style.css' import '../lib/style.css'
import '../lib/fonts.css' import '../lib/fonts.css'

View File

@@ -5,7 +5,6 @@ import { fn } from '@storybook/test'
import { Button } from './Button' import { Button } from './Button'
import { config as buttonConfig } from './variants' import { config as buttonConfig } from './variants'
import { config as typographyConfig } from '../Typography/variants' import { config as typographyConfig } from '../Typography/variants'
import { MaterialIcon } from '../Icons'
const meta: Meta<typeof Button> = { const meta: Meta<typeof Button> = {
title: 'Components/Button', title: 'Components/Button',
@@ -150,15 +149,3 @@ export const TextSmall: Story = {
size: 'Small', size: 'Small',
}, },
} }
export const TextWithIcon: Story = {
args: {
...TextDefault.args,
children: (
<>
<MaterialIcon icon="add" color="CurrentColor" />
<span>Add room</span>
</>
),
},
}

View File

@@ -82,10 +82,6 @@
padding: var(--Space-x15) 0; padding: var(--Space-x15) 0;
} }
.variant-text:hover span:not(:global(.material-symbols)) {
text-decoration: underline;
}
.variant-icon { .variant-icon {
background-color: transparent; background-color: transparent;
border-color: transparent; border-color: transparent;