diff --git a/apps/scandic-web/components/TempDesignSystem/Button/button.module.css b/apps/scandic-web/components/TempDesignSystem/Button/button.module.css
index 291e14f31..2b9df3319 100644
--- a/apps/scandic-web/components/TempDesignSystem/Button/button.module.css
+++ b/apps/scandic-web/components/TempDesignSystem/Button/button.module.css
@@ -278,7 +278,10 @@ a.default {
.baseText:focus,
.baseText:hover {
color: var(--Base-Button-Text-On-Fill-Hover);
- text-decoration: underline;
+
+ & span:not(:global(.material-symbols)) {
+ text-decoration: underline;
+ }
}
.baseText:disabled {
@@ -297,7 +300,6 @@ a.default {
.icon.baseText:focus svg *,
.icon.baseText:hover svg * {
fill: var(--Base-Button-Text-On-Fill-Hover);
- text-decoration: underline;
}
.icon.baseText:disabled svg,
diff --git a/apps/scandic-web/components/TempDesignSystem/Button/index.tsx b/apps/scandic-web/components/TempDesignSystem/Button/index.tsx
index 83e3ebe99..88f20ec16 100644
--- a/apps/scandic-web/components/TempDesignSystem/Button/index.tsx
+++ b/apps/scandic-web/components/TempDesignSystem/Button/index.tsx
@@ -1,14 +1,29 @@
"use client"
import { Slot } from "@radix-ui/react-slot"
+import { Children, type ReactNode } from "react"
import { Button as ButtonRAC } from "react-aria-components"
import { buttonVariants } from "./variants"
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 {child}
+ }
+ return child
+ })
+}
+
export default function Button(props: ButtonProps) {
const {
+ children,
className,
clean,
intent,
@@ -31,9 +46,17 @@ export default function Button(props: ButtonProps) {
variant,
})
+ const wrappedChildren =
+ typeof children === "function" ? children : wrapTextNodes(children)
+
if (restProps.asChild) {
const { asChild, ...slotProps } = restProps
- return
+ return (
+
+ {/* @ts-expect-error: Incorrect types for Slot */}
+ {wrappedChildren}
+
+ )
}
const { asChild, onClick, disabled, ...racProps } = restProps
@@ -43,6 +66,8 @@ export default function Button(props: ButtonProps) {
isDisabled={disabled}
onPress={onClick}
{...racProps}
- />
+ >
+ {wrappedChildren}
+
)
}
diff --git a/apps/scandic-web/components/TempDesignSystem/Link/index.tsx b/apps/scandic-web/components/TempDesignSystem/Link/index.tsx
index 931b4594c..76fd06814 100644
--- a/apps/scandic-web/components/TempDesignSystem/Link/index.tsx
+++ b/apps/scandic-web/components/TempDesignSystem/Link/index.tsx
@@ -1,7 +1,7 @@
"use client"
import NextLink from "next/link"
import { usePathname, useSearchParams } from "next/navigation"
-import { useCallback, useMemo } from "react"
+import { Children, type ReactNode, useCallback, useMemo } from "react"
import { useCheckIfExternalLink } from "@/hooks/useCheckIfExternalLink"
import { trackClick } from "@/utils/tracking"
@@ -10,7 +10,21 @@ import { linkVariants } from "./variants"
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 {child}
+ }
+ return child
+ })
+}
+
export default function Link({
+ children,
active,
className,
color,
@@ -96,6 +110,9 @@ export default function Link({
className: classNames,
}
+ const wrappedChildren =
+ typeof children === "function" ? children : wrapTextNodes(children)
+
return isExternal ? (
+ >
+ {wrappedChildren}
+
) : (
+ >
+ {wrappedChildren}
+
)
}
diff --git a/apps/scandic-web/components/TempDesignSystem/Link/link.module.css b/apps/scandic-web/components/TempDesignSystem/Link/link.module.css
index 10ce6991d..fa8f8607a 100644
--- a/apps/scandic-web/components/TempDesignSystem/Link/link.module.css
+++ b/apps/scandic-web/components/TempDesignSystem/Link/link.module.css
@@ -43,7 +43,10 @@
font-weight: var(--typography-Body-Underline-fontWeight);
letter-spacing: var(--typography-Body-Underline-letterSpacing);
line-height: var(--typography-Body-Underline-lineHeight);
- text-decoration: underline;
+
+ & span:not(:global(.material-symbols)) {
+ text-decoration: underline;
+ }
}
.myPageMobileDropdown {
diff --git a/packages/design-system/.storybook/preview.tsx b/packages/design-system/.storybook/preview.tsx
index 1869fabcb..04e495227 100644
--- a/packages/design-system/.storybook/preview.tsx
+++ b/packages/design-system/.storybook/preview.tsx
@@ -2,6 +2,8 @@ import { withThemeByClassName } from '@storybook/addon-themes'
import type { Preview, ReactRenderer } from '@storybook/react'
+import 'react-material-symbols/rounded'
+
import '../lib/style.css'
import '../lib/fonts.css'
diff --git a/packages/design-system/lib/components/Button/Button.stories.tsx b/packages/design-system/lib/components/Button/Button.stories.tsx
index 5ce8d78c2..41fc059f1 100644
--- a/packages/design-system/lib/components/Button/Button.stories.tsx
+++ b/packages/design-system/lib/components/Button/Button.stories.tsx
@@ -5,6 +5,7 @@ import { fn } from '@storybook/test'
import { Button } from './Button'
import { config as buttonConfig } from './variants'
import { config as typographyConfig } from '../Typography/variants'
+import { MaterialIcon } from '../Icons'
const meta: Meta = {
title: 'Components/Button',
@@ -149,3 +150,15 @@ export const TextSmall: Story = {
size: 'Small',
},
}
+
+export const TextWithIcon: Story = {
+ args: {
+ ...TextDefault.args,
+ children: (
+ <>
+
+ Add room
+ >
+ ),
+ },
+}
diff --git a/packages/design-system/lib/components/Button/button.module.css b/packages/design-system/lib/components/Button/button.module.css
index cdd1ef50e..926c4bbdc 100644
--- a/packages/design-system/lib/components/Button/button.module.css
+++ b/packages/design-system/lib/components/Button/button.module.css
@@ -82,6 +82,10 @@
padding: var(--Space-x15) 0;
}
+.variant-text:hover span:not(:global(.material-symbols)) {
+ text-decoration: underline;
+}
+
.variant-icon {
background-color: transparent;
border-color: transparent;