Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: storefront fixes #2844

Merged
merged 7 commits into from
Nov 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading