Skip to content

Commit

Permalink
chore: storefront fixes (#2844)
Browse files Browse the repository at this point in the history
This PR ports over changes and fixes from #2830
resolves #2840
resolves #2816

New codeblock styling is approved by @Thunear
  • Loading branch information
Barsnes authored Nov 28, 2024
1 parent 99aa669 commit e9aaa40
Show file tree
Hide file tree
Showing 17 changed files with 105 additions and 79 deletions.
2 changes: 1 addition & 1 deletion apps/_components/src/ClipboardButton/ClipboardButton.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export const ClipboardButton = ({
title={title}
icon={!text}
variant='tertiary'
color='neutral'
data-color='neutral'
data-size='sm'
>
<ClipboardIcon fontSize={'1.4rem'} />
Expand Down
11 changes: 10 additions & 1 deletion apps/_components/src/CodeSnippet/CodeSnippet.module.css
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,16 @@
}

.codeSnippet > pre {
padding-right: var(--ds-spacing-11) !important;
padding-right: var(--ds-spacing-18) !important;
background-color: var(--ds-color-neutral-background-subtle) !important;
}

.codeSnippet > pre > code {
padding: 0;
}

.codeSnippet > pre > code span:empty {
display: none;
}

.copyButton {
Expand Down
18 changes: 9 additions & 9 deletions apps/_components/src/CodeSnippet/CodeSnippet.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@ import * as prettierCSS from 'prettier/plugins/postcss.js';
import * as prettierTypescript from 'prettier/plugins/typescript.js';
import { format } from 'prettier/standalone.js';
import { useEffect, useState } from 'react';
import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter';
import { nightOwl } from 'react-syntax-highlighter/dist/esm/styles/prism';
import SyntaxHighlighter from 'react-syntax-highlighter';
import { stackoverflowDark } from 'react-syntax-highlighter/dist/esm/styles/hljs';

import classes from './CodeSnippet.module.css';

Expand All @@ -27,15 +27,13 @@ const plugins = [
];

type CodeSnippetProps = {
language?: 'css' | 'html' | 'ts' | 'markdown' | 'json';
syntax?: string;
language?: 'css' | 'html' | 'ts' | 'markdown' | 'json' | 'shell' | 'tsx';
children: string;
} & React.HTMLAttributes<HTMLDivElement>;

const CodeSnippet = ({
language = 'markdown',
className,
syntax = 'js',
children,
...rest
}: CodeSnippetProps) => {
Expand All @@ -49,7 +47,8 @@ const CodeSnippet = ({
) {
try {
const formatted = await format(children, {
parser: language === 'ts' ? 'babel-ts' : language,
parser:
language === 'ts' || language === 'tsx' ? 'babel-ts' : language,
plugins,
});
setSnippet(formatted);
Expand All @@ -76,6 +75,7 @@ const CodeSnippet = ({
<div
className={cl(classes.codeSnippet, className)}
data-color-scheme='dark'
suppressHydrationWarning
{...rest}
>
{snippet && (
Expand All @@ -87,15 +87,15 @@ const CodeSnippet = ({
className={classes.copyButton}
aria-label='Kopier'
icon
color='neutral'
data-color='neutral'
data-size='sm'
>
<FilesIcon fontSize='1.5rem' />
</Button>
</Tooltip>
<SyntaxHighlighter
style={nightOwl}
language={syntax}
style={stackoverflowDark}
language={language}
customStyle={{
fontSize: '15px',
margin: 0,
Expand Down
9 changes: 7 additions & 2 deletions apps/_components/src/Footer/Footer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ const LinkList = (links: LinkListItemProps[]) => {
<ul className={classes.links}>
{links.map((item, index) => (
<li key={index}>
<Link href={item.url} color='neutral' className={classes.link}>
<Link href={item.url} data-color='neutral' className={classes.link}>
{item.prefix}
{item.text}
</Link>
Expand Down Expand Up @@ -64,7 +64,12 @@ export const Footer = forwardRef<HTMLElement, FooterProps>(function Footer(
<Mattilsynet />
<Udir className={classes.udir} />
</div>
<Button asChild variant='secondary' color='neutral' data-size='sm'>
<Button
asChild
variant='secondary'
data-color='neutral'
data-size='sm'
>
<NextLink
href='mailto:[email protected]'
className={classes.button}
Expand Down
4 changes: 2 additions & 2 deletions apps/_components/src/Header/Header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@ const Header = ({
<Button
variant='tertiary'
icon={true}
color='neutral'
data-color='neutral'
aria-expanded={open}
aria-label='Meny'
className={cl(classes.toggle, 'ds-focus')}
Expand Down Expand Up @@ -207,7 +207,7 @@ const Header = ({
aria-label={`Bytt til ${theme === 'light' ? 'mørk' : 'lys'} modus`}
variant='tertiary'
icon={true}
color='neutral'
data-color='neutral'
onClick={() => {
handleThemeChange(theme === 'light' ? 'dark' : 'light');
}}
Expand Down
2 changes: 1 addition & 1 deletion apps/_components/src/logos/Udir.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export function Udir(rest: UdirProps) {
>
<title>Utdanningsdirektoratet logo</title>
<defs>
<style>
<style suppressHydrationWarning>
{`
.cls-1 {
fill: #fdfeff;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ function PostLayout({
</MdxContent>
</main>
</Container>
<style>
<style suppressHydrationWarning>
{`
header {
[data-color-scheme='dark'] &,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ Fargesystemet består av globale farger som refererer til hva fargen er (eks. re
### Navnestruktur

Et semantisk fargenavn er bygget opp av 3 ledd: <br/>
_farge - stryke - vekt_ <br/>
_farge - styrke - vekt_ <br/>

- Background: Som regel bakgrunnen på hele siden (HTML body).
- Surface: Bakgrunnsfargen til en ting. Eks. et panel, en knapp, en seksjon, etc.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,8 @@ export default ({ children }) => (
Nokre gonger må du kanskje byte ut ein komponent med ein anna, for eksempel `Button` skulle vore ein `Link`.
Det er her `asChild` kjem inn i biletet.

<CodeSnippet language='ts' data-unstyled>
{`
import { Button, Link } from '@digdir/designsystemet-react';
<CodeSnippet language='tsx' data-unstyled>
{` import { Button, Link } from '@digdir/designsystemet-react';
<Button asChild>
<Link href='https://www.digdir.no'>Lenke til digdir.no</Link>
Expand All @@ -39,9 +38,8 @@ Dette skjer ved hjelp av Radix sin `Slot`-komponent. <sup>1</sup>
`Slot` mergar sine props ned på komponenten som ligg som underordna element. I tilfellet over vert `Button` sine props lagt til på `Link`-komponenten, og ein `a`-tagg vert rendra ut.
Når du brukar `asChild` kan du ikkje ha meir enn eit underordna element, men du kan ha så mange du vil inne i det elementet.

<CodeSnippet language='ts'>
{`
<>
<CodeSnippet language='tsx'>
{` <>
/* Dette kaster ein error */
<Button asChild>
<Icon />
Expand All @@ -55,7 +53,6 @@ Når du brukar `asChild` kan du ikkje ha meir enn eit underordna element, men du
Din lenke
</Link>
</Button>
</>
`}
</CodeSnippet>
Expand All @@ -65,15 +62,13 @@ Når du brukar `asChild` kan du ikkje ha meir enn eit underordna element, men du
Vi har tidlegare brukt ein `as` prop for å rendre som andre element. Men når du brukar denne, får du ikkje typesafety eller korrekte typar iht. elementet du har endret til med `as`.
`Slot` ordnar dette ved at du legg til alle props på det underordna elementet av komponenten, og dermed får typesafety.

<CodeSnippet language='ts'>
{`
<Button asChild>
<CodeSnippet language='tsx'>
{` <Button asChild>
<Link href='https://www.digdir.no' onClick={() => {}}>
<Icon />
Di lenke
</Link>
</Button>
`}
</Button>`}
</CodeSnippet>

Alt av klassenavn, aria-attributt og andre props som `Button` har, vil bli lagt til på `Link`-komponenten.
Expand All @@ -87,9 +82,8 @@ Dette betyr at dersom du stoppar eit event på din komponent, vil eventet på `S

Dersom ein av event handlerane er avhengig av `event.defaultPrevented`, så må du passe på at rekkefølgja er rett. <sup>2</sup>

<CodeSnippet language='ts'>
{`
<Button
<CodeSnippet language='tsx'>
{` <Button
asChild
onClick={(event) => {
if (!event.defaultPrevented)
Expand All @@ -109,20 +103,21 @@ Ynskjer du å bruke ein eigen komponent må du passe på å spre alle props, og

Komponentane dine vil då sjå slik ut:

<CodeSnippet language='ts'>
<CodeSnippet language='tsx'>
{`// uten props og ref
const MinKnapp = () => <button />
const MinKnapp = () => <button />
// med props
const MinKnapp = (props) => <button {...props} />
// med props og ref
const MinKnapp = React.forwardRef((props, forwardedRef) => (
<button
{...props}
ref={forwardedRef}
/>
<button
{...props}
ref={forwardedRef}
/>
))`}
</CodeSnippet>

Expand Down
2 changes: 1 addition & 1 deletion apps/storefront/app/komponenter/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ export default function page() {
{sortedData.map((component) => (
<ComponentCard key={component.title} {...component} />
))}
<style>
<style suppressHydrationWarning>
{`
body {
background-color: var(--ds-color-neutral-background-subtle);
Expand Down
58 changes: 28 additions & 30 deletions apps/storefront/app/monstre/feilmeldinger/page.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -185,38 +185,36 @@ Her må vi gjøre det så tydelig som mulig for brukeren at flere felt påvirker
I dette eksempelet har vi en gruppe med felt, der brukeren ikke nødvendigvis har alle opplysningene, men må fylle ut minst ett felt.

<Details
color='neutral'
data-color='neutral'
>
<DetailsItem>
<DetailsSummary>Eksempel på feilmelding som gjelder flere felt</DetailsSummary>
<DetailsContent
style={{
paddingTop: '0px',
paddingBottom: '0px',
maxWidth: '780px'
}}>
Videoen under viser at brukeren forsøker å gå videre uten å ha fyllt ut minst ett felt, som er påkrevd. Alle feltene i gruppen blir da røde og en feilmelding vises i bunnen.
<video
controls
autoplay
width='100%'
loop
>
<source
src='/img/error-message-group-error.mp4'
type='video/mp4'
/>
</video>

Hadde det vært bare en feil i gruppen, ville feilmeldingen vist på vanlig måte under kun et av feltene, uten at hele gruppen ble rød.

<Image
src='/img/errormessage-co-22b.png'
alt='Skjermbilde av skjema med en gruppe av felter. Brukeren har fylt ut minst ett felt, men har en feil i utfyllingen. Feilmeldingen vises da på vanlig måte under det aktuelle feltet. '
boxShadow={false}
<DetailsSummary>Eksempel på feilmelding som gjelder flere felt</DetailsSummary>
<DetailsContent
style={{
paddingTop: '0px',
paddingBottom: '0px',
maxWidth: '780px'
}}>
Videoen under viser at brukeren forsøker å gå videre uten å ha fyllt ut minst ett felt, som er påkrevd. Alle feltene i gruppen blir da røde og en feilmelding vises i bunnen.
<video
controls
autoplay
width='100%'
loop
>
<source
src='/img/error-message-group-error.mp4'
type='video/mp4'
/>
</DetailsContent>
</DetailsItem>
</video>

Hadde det vært bare en feil i gruppen, ville feilmeldingen vist på vanlig måte under kun et av feltene, uten at hele gruppen ble rød.

<Image
src='/img/errormessage-co-22b.png'
alt='Skjermbilde av skjema med en gruppe av felter. Brukeren har fylt ut minst ett felt, men har en feil i utfyllingen. Feilmeldingen vises da på vanlig måte under det aktuelle feltet. '
boxShadow={false}
/>
</DetailsContent>
</Details>

## Kode
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@

& svg {
margin: 0;
fill: var(--ds-color-neutral-text-default);
}
}

Expand Down
2 changes: 1 addition & 1 deletion apps/storefront/components/SidebarMenu/SidebarMenu.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ const SidebarMenu = ({ routerPath }: SidebarMenuProps) => {
<Button
className={classes.toggleBtn}
data-size='md'
color='neutral'
data-color='neutral'
variant='secondary'
onClick={() => setShowMenu(!showMenu)}
aria-expanded={showMenu}
Expand Down
29 changes: 23 additions & 6 deletions apps/storefront/components/Tokens/TokenList/TokenList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,9 +54,6 @@ const TokensTable = ({ tokens }: TokenTableProps) => {
{tokens.map(([, tokens]) => {
return tokens.map((token) => {
const value = token.$value as string;
const pxSize = /\b\d+px\b/.test(value)
? value
: `${parseFloat(value) * 16}px`;
const isBorderRadius = token.path.includes('border-radius');

return (
Expand All @@ -69,12 +66,14 @@ const TokensTable = ({ tokens }: TokenTableProps) => {
/>
</Table.Cell>
<Table.Cell>{token.$value}</Table.Cell>
<Table.Cell>{pxSize}</Table.Cell>
<Table.Cell>
<ComputedValue value={value} />
</Table.Cell>
<Table.Cell>
{isBorderRadius ? (
<TokenBorderRadius value={pxSize} />
<TokenBorderRadius value={value} />
) : (
<TokenSize value={pxSize} />
<TokenSize value={value} />
)}
</Table.Cell>
</Table.Row>
Expand All @@ -86,6 +85,24 @@ const TokensTable = ({ tokens }: TokenTableProps) => {
);
};

const ComputedValue = ({ value }: { value: string }) => {
const [computedValue, setComputedValue] = useState<string>('');

useEffect(() => {
if (!document) return;

const elm = document.createElement('div');
elm.style.cssText = `width: ${value}; height: ${value};`;
document.body.appendChild(elm);
const computedValue = getComputedStyle(elm).width;
document.body.removeChild(elm);

setComputedValue(computedValue);
}, [value]);

return <>{computedValue}</>;
};

type TokenCardsProps = {
tokens: [string, Token[]][];
cols?: number;
Expand Down
Loading

0 comments on commit e9aaa40

Please sign in to comment.