Skip to content

Commit

Permalink
Merge branch 'develop' into task/DES-474-translate-docs
Browse files Browse the repository at this point in the history
# Conflicts:
#	documentation/storybook.md
  • Loading branch information
VincentSmedinga committed Jan 26, 2024
2 parents eafed52 + d346cdf commit 9ad12d5
Show file tree
Hide file tree
Showing 59 changed files with 1,027 additions and 853 deletions.
4 changes: 3 additions & 1 deletion documentation/storybook.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,11 @@ We write our documentation in Dutch.

## Best practices for controls

1. Use radio buttons rather than a dropdown for props with 5 options or less.
1. For props offering five options or less, use radio buttons rather than a select.
This makes it easier to compare the options.
It saves the user a click to select each option and shows everything up front.
2. Don’t use inline radios.
Their options appear rather small, making them difficult to target with a pointing device.

More to follow.

Expand Down
10 changes: 10 additions & 0 deletions packages/css/src/components/badge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Badge

A prominently coloured box containing 1 or 2 words.
Guides the user in taking a specific action or describes its surrounding content.

## Design

The badge can contain a short text or a number.
The default background colour is dark green.
Suggestions on when to use the other colours will follow soon.
58 changes: 58 additions & 0 deletions packages/css/src/components/badge/badge.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/**
* @license EUPL-1.2+
* Copyright (c) 2024 Gemeente Amsterdam
*/

.amsterdam-badge {
display: inline-block;
font-family: var(--amsterdam-badge-font-family);
font-size: var(--amsterdam-badge-spacious-font-size);
font-weight: var(--amsterdam-badge-font-weight);
line-height: var(--amsterdam-badge-spacious-line-height);
padding-inline: var(--amsterdam-badge-padding-inline);

.amsterdam-theme--compact & {
font-size: var(--amsterdam-badge-compact-font-size);
line-height: var(--amsterdam-badge-compact-line-height);
}
}

.amsterdam-badge--blue {
background-color: var(--amsterdam-badge-blue-background-color);
color: var(--amsterdam-badge-blue-color);
}

.amsterdam-badge--dark-blue {
background-color: var(--amsterdam-badge-dark-blue-background-color);
color: var(--amsterdam-badge-dark-blue-color);
}

.amsterdam-badge--dark-green {
background-color: var(--amsterdam-badge-dark-green-background-color);
color: var(--amsterdam-badge-dark-green-color);
}

.amsterdam-badge--green {
background-color: var(--amsterdam-badge-green-background-color);
color: var(--amsterdam-badge-green-color);
}

.amsterdam-badge--magenta {
background-color: var(--amsterdam-badge-magenta-background-color);
color: var(--amsterdam-badge-magenta-color);
}

.amsterdam-badge--orange {
background-color: var(--amsterdam-badge-orange-background-color);
color: var(--amsterdam-badge-orange-color);
}

.amsterdam-badge--purple {
background-color: var(--amsterdam-badge-purple-background-color);
color: var(--amsterdam-badge-purple-color);
}

.amsterdam-badge--yellow {
background-color: var(--amsterdam-badge-yellow-background-color);
color: var(--amsterdam-badge-yellow-color);
}
1 change: 1 addition & 0 deletions packages/css/src/components/index.scss
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
*/

/* Append here */
@import "./badge/badge";
@import "./table/table";
@import "./mega-menu/mega-menu";
@import "./icon-button/icon-button";
Expand Down
1 change: 1 addition & 0 deletions packages/react/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
"react-dom": "18.2.0",
"rollup": "4.9.4",
"rollup-plugin-delete": "2.0.0",
"rollup-plugin-dts": "6.1.0",
"rollup-plugin-filesize": "10.0.0",
"rollup-plugin-node-externals": "6.1.2",
"rollup-plugin-node-polyfills": "0.2.1",
Expand Down
15 changes: 14 additions & 1 deletion packages/react/rollup.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@ import nodeExternal from 'rollup-plugin-node-externals'
import nodePolyfills from 'rollup-plugin-node-polyfills'
import peerDepsExternal from 'rollup-plugin-peer-deps-external'
import typescript from 'rollup-plugin-typescript2'
import dts from 'rollup-plugin-dts'
import del from 'rollup-plugin-delete'

const packageJson = JSON.parse(readFileSync('./package.json', 'utf8'))

Expand Down Expand Up @@ -46,7 +48,7 @@ export default [
include: /node_modules/,
}),
nodePolyfills(),
typescript({ includeDependencies: false }),
typescript({ includeDependencies: false, useTsconfigDeclarationDir: true }),
babel({
presets: ['@babel/preset-react'],
babelHelpers: 'runtime',
Expand All @@ -58,4 +60,15 @@ export default [
filesize(),
],
},
{
input: './dist/dts/index.d.ts',
output: [{ file: 'dist/index.d.ts', format: 'es' }],
plugins: [
dts(),
del({
targets: 'dist/dts',
hook: 'buildEnd',
}),
],
},
]
67 changes: 67 additions & 0 deletions packages/react/src/Badge/Badge.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import { render } from '@testing-library/react'
import { createRef } from 'react'
import { Badge, badgeColors } from './Badge'
import '@testing-library/jest-dom'

describe('Badge', () => {
it('renders', () => {
const { container } = render(<Badge label="test" />)

const component = container.querySelector(':only-child')

expect(component).toBeInTheDocument()
expect(component).toBeVisible()
})

it('renders a design system BEM class name', () => {
const { container } = render(<Badge label="test" />)

const component = container.querySelector(':only-child')

expect(component).toHaveClass('amsterdam-badge')
})

it('renders an additional class name', () => {
const { container } = render(<Badge label="test" className="extra" />)

const component = container.querySelector(':only-child')

expect(component).toHaveClass('amsterdam-badge extra')
})

it('supports ForwardRef in React', () => {
const ref = createRef<HTMLElement>()

const { container } = render(<Badge label="test" ref={ref} />)

const component = container.querySelector(':only-child')

expect(ref.current).toBe(component)
})

it('renders with a number label', () => {
const { container } = render(<Badge label={1} />)

const component = container.querySelector(':only-child')

expect(component).toHaveTextContent('1')
})

it('renders with default color', () => {
const { container } = render(<Badge label="test" />)

const component = container.querySelector(':only-child')

expect(component).toHaveClass('amsterdam-badge--dark-green')
})

badgeColors.map((color) =>
it(`renders with ${color} color`, () => {
const { container } = render(<Badge label="test" color={color} />)

const component = container.querySelector(':only-child')

expect(component).toHaveClass(`amsterdam-badge--${color}`)
}),
)
})
36 changes: 36 additions & 0 deletions packages/react/src/Badge/Badge.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/**
* @license EUPL-1.2+
* Copyright (c) 2024 Gemeente Amsterdam
*/

import clsx from 'clsx'
import { forwardRef } from 'react'
import type { ForwardedRef, HTMLAttributes } from 'react'

export const badgeColors = [
'blue',
'dark-blue',
'dark-green',
'green',
'magenta',
'orange',
'purple',
'yellow',
] as const

type BadgeColor = (typeof badgeColors)[number]

export type BadgeProps = {
color?: BadgeColor
label: string | number
} & HTMLAttributes<HTMLElement>

export const Badge = forwardRef(
({ label, className, color = 'dark-green', ...restProps }: BadgeProps, ref: ForwardedRef<HTMLElement>) => (
<span {...restProps} ref={ref} className={clsx('amsterdam-badge', `amsterdam-badge--${color}`, className)}>
{label}
</span>
),
)

Badge.displayName = 'Badge'
3 changes: 3 additions & 0 deletions packages/react/src/Badge/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# React Badge component

[Badge documentation](../../../css/src/badge/README.md)
2 changes: 2 additions & 0 deletions packages/react/src/Badge/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
export { Badge } from './Badge'
export type { BadgeProps } from './Badge'
19 changes: 19 additions & 0 deletions packages/react/src/Breadcrumb/Breadcrumb.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,25 @@ import { Breadcrumb } from './Breadcrumb'
import '@testing-library/jest-dom'

describe('Breadcrumb', () => {
it('renders', () => {
render(<Breadcrumb />)
const component = screen.getByRole('navigation')
expect(component).toBeInTheDocument()
expect(component).toBeVisible()
})

it('renders a design system BEM class name', () => {
render(<Breadcrumb />)
const component = screen.getByRole('navigation')
expect(component).toHaveClass('amsterdam-breadcrumb')
})

it('renders an additional class name', () => {
render(<Breadcrumb className="extra" />)
const component = screen.getByRole('navigation')
expect(component).toHaveClass('amsterdam-breadcrumb extra')
})

it('renders Breadcrumb component with children', () => {
const breadcrumbItems = [
{ label: 'Item 1', href: '/item-1' },
Expand Down
30 changes: 8 additions & 22 deletions packages/react/src/Breadcrumb/Breadcrumb.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,40 +3,26 @@
* Copyright (c) 2023 Gemeente Amsterdam
*/

import { clsx } from 'clsx'
import { forwardRef } from 'react'
import type { ForwardedRef, ForwardRefExoticComponent, HTMLAttributes, PropsWithChildren, RefAttributes } from 'react'
import { BreadcrumbItem } from './BreadcrumbItem'

export type BreadcrumbProps = PropsWithChildren<HTMLAttributes<HTMLElement>>

interface BreadcrumbComponent extends ForwardRefExoticComponent<BreadcrumbProps & RefAttributes<HTMLElement>> {
Item: typeof BreadcrumbItem
}

export const Breadcrumb = forwardRef(({ children, ...restProps }: BreadcrumbProps, ref: ForwardedRef<HTMLElement>) => {
return (
<nav {...restProps} className="amsterdam-breadcrumb" ref={ref}>
export const Breadcrumb = forwardRef(
({ children, className, ...restProps }: BreadcrumbProps, ref: ForwardedRef<HTMLElement>) => (
<nav {...restProps} className={clsx('amsterdam-breadcrumb', className)} ref={ref}>
<ol className="amsterdam-breadcrumb__list">{children}</ol>
</nav>
)
}) as BreadcrumbComponent
),
) as BreadcrumbComponent

Breadcrumb.displayName = 'Breadcrumb'

export interface BreadcrumbItemProps extends PropsWithChildren<HTMLAttributes<HTMLLIElement>> {
href: string
}

const BreadcrumbItem = forwardRef(
({ children, href, ...restProps }: BreadcrumbItemProps, ref: ForwardedRef<HTMLLIElement>) => {
return (
<li {...restProps} className="amsterdam-breadcrumb__item" ref={ref}>
<a className="amsterdam-breadcrumb__link" href={href}>
{children}
</a>
</li>
)
},
)

BreadcrumbItem.displayName = 'BreadcrumbItem'
Breadcrumb.Item = BreadcrumbItem
Breadcrumb.Item.displayName = 'Breadcrumb.Item'
41 changes: 41 additions & 0 deletions packages/react/src/Breadcrumb/BreadcrumbItem.test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
import { render, screen } from '@testing-library/react'
import { createRef } from 'react'
import { BreadcrumbItem } from './BreadcrumbItem'
import '@testing-library/jest-dom'

describe('BreadcrumbItem', () => {
it('renders', () => {
render(<BreadcrumbItem href="/" />)
const component = screen.getByRole('listitem')
expect(component).toBeInTheDocument()
expect(component).toBeVisible()
})

it('renders a design system BEM class name', () => {
render(<BreadcrumbItem href="/" />)
const item = screen.getByRole('listitem')
expect(item).toHaveClass('amsterdam-breadcrumb__item')

const link = screen.getByRole('link')
expect(link).toHaveClass('amsterdam-breadcrumb__link')
})

it('renders an additional class name', () => {
render(<BreadcrumbItem href="/" className="extra" />)
const component = screen.getByRole('listitem')
expect(component).toHaveClass('amsterdam-breadcrumb__item extra')
})

it('renders the href attribute', () => {
render(<BreadcrumbItem href="/" />)
const component = screen.getByRole('link')
expect(component).toHaveAttribute('href', '/')
})

it('supports ForwardRef in React', () => {
const ref = createRef<HTMLLIElement>()
render(<BreadcrumbItem href="/" ref={ref} />)
const component = screen.getByRole('listitem')
expect(ref.current).toBe(component)
})
})
24 changes: 24 additions & 0 deletions packages/react/src/Breadcrumb/BreadcrumbItem.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
/**
* @license EUPL-1.2+
* Copyright (c) 2023 Gemeente Amsterdam
*/

import { clsx } from 'clsx'
import { forwardRef } from 'react'
import type { ForwardedRef, HTMLAttributes, PropsWithChildren } from 'react'

export interface BreadcrumbItemProps extends PropsWithChildren<HTMLAttributes<HTMLLIElement>> {
href: string
}

export const BreadcrumbItem = forwardRef(
({ children, className, href, ...restProps }: BreadcrumbItemProps, ref: ForwardedRef<HTMLLIElement>) => (
<li {...restProps} className={clsx('amsterdam-breadcrumb__item', className)} ref={ref}>
<a className="amsterdam-breadcrumb__link" href={href}>
{children}
</a>
</li>
),
)

BreadcrumbItem.displayName = 'BreadcrumbItem'
3 changes: 2 additions & 1 deletion packages/react/src/Breadcrumb/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export { Breadcrumb } from './Breadcrumb'
export type { BreadcrumbProps, BreadcrumbItemProps } from './Breadcrumb'
export type { BreadcrumbProps } from './Breadcrumb'
export type { BreadcrumbItemProps } from './BreadcrumbItem'
Loading

0 comments on commit 9ad12d5

Please sign in to comment.