@oslokommune/punkt-react 16.18.0 → 16.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/dist/{dialog-polyfill.esm-B7W3teD0-CHMBcS-s.js → dialog-polyfill.esm-0dVT8G1o-Cf1Ux-Z9.js} +1 -1
- package/dist/index.d.ts +17 -5
- package/dist/punkt-react.es.js +293 -268
- package/dist/punkt-react.umd.js +24 -24
- package/package.json +3 -3
- package/src/components/heading/Heading.test.tsx +28 -28
- package/src/components/heading/Heading.tsx +65 -17
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oslokommune/punkt-react",
|
|
3
|
-
"version": "16.
|
|
3
|
+
"version": "16.19.0",
|
|
4
4
|
"description": "React komponentbibliotek til Punkt, et designsystem laget av Oslo Origo",
|
|
5
5
|
"homepage": "https://punkt.oslo.kommune.no",
|
|
6
6
|
"author": "Team Designsystem, Oslo Origo",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@lit-labs/ssr-dom-shim": "^1.2.1",
|
|
41
41
|
"@lit/react": "^1.0.7",
|
|
42
|
-
"@oslokommune/punkt-elements": "^16.
|
|
42
|
+
"@oslokommune/punkt-elements": "^16.19.0",
|
|
43
43
|
"classnames": "^2.5.1",
|
|
44
44
|
"prettier": "^3.3.3",
|
|
45
45
|
"react-hook-form": "^7.53.0"
|
|
@@ -109,5 +109,5 @@
|
|
|
109
109
|
"url": "https://github.com/oslokommune/punkt/issues"
|
|
110
110
|
},
|
|
111
111
|
"license": "MIT",
|
|
112
|
-
"gitHead": "
|
|
112
|
+
"gitHead": "e90194e9a4c25a6b7a5370c05889e262b4e6cfb0"
|
|
113
113
|
}
|
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
import '@testing-library/jest-dom'
|
|
2
2
|
|
|
3
|
-
import { render
|
|
3
|
+
import { render } from '@testing-library/react'
|
|
4
4
|
import { axe, toHaveNoViolations } from 'jest-axe'
|
|
5
|
-
import { createRef } from 'react'
|
|
6
5
|
|
|
7
6
|
import { PktHeading } from './Heading'
|
|
8
7
|
|
|
9
8
|
expect.extend(toHaveNoViolations)
|
|
10
9
|
|
|
11
10
|
describe('PktHeading', () => {
|
|
12
|
-
test('renders without errors',
|
|
13
|
-
render(<PktHeading />)
|
|
14
|
-
|
|
11
|
+
test('renders without errors', () => {
|
|
12
|
+
const { container } = render(<PktHeading />)
|
|
13
|
+
expect(container.querySelector('h2')).toBeInTheDocument()
|
|
15
14
|
})
|
|
16
15
|
|
|
17
|
-
test('renders with different levels',
|
|
16
|
+
test('renders with different levels', () => {
|
|
18
17
|
const { container } = render(
|
|
19
18
|
<>
|
|
20
19
|
<PktHeading level={1}>Heading 1</PktHeading>
|
|
@@ -22,39 +21,41 @@ describe('PktHeading', () => {
|
|
|
22
21
|
<PktHeading level={3}>Heading 3</PktHeading>
|
|
23
22
|
</>,
|
|
24
23
|
)
|
|
25
|
-
await window.customElements.whenDefined('pkt-heading')
|
|
26
24
|
|
|
27
|
-
|
|
28
|
-
expect(
|
|
29
|
-
expect(
|
|
30
|
-
expect(headings[2]).toHaveAttribute('aria-level', '3')
|
|
25
|
+
expect(container.querySelector('h1')).toHaveTextContent('Heading 1')
|
|
26
|
+
expect(container.querySelector('h2')).toHaveTextContent('Heading 2')
|
|
27
|
+
expect(container.querySelector('h3')).toHaveTextContent('Heading 3')
|
|
31
28
|
})
|
|
32
29
|
|
|
33
|
-
test('
|
|
34
|
-
const
|
|
30
|
+
test('applies default size class based on level', () => {
|
|
31
|
+
const { container } = render(<PktHeading level={1}>Heading</PktHeading>)
|
|
32
|
+
expect(container.querySelector('h1')).toHaveClass('pkt-heading--xlarge')
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
test('renders with explicit size', () => {
|
|
35
36
|
const { container } = render(<PktHeading size="xlarge">Large Heading</PktHeading>)
|
|
36
|
-
|
|
37
|
+
const heading = container.querySelector('h2')
|
|
38
|
+
expect(heading).toHaveClass('pkt-heading--xlarge')
|
|
39
|
+
})
|
|
37
40
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
expect(
|
|
41
|
+
test('renders with explicit weight', () => {
|
|
42
|
+
const { container } = render(<PktHeading weight="bold">Bold Heading</PktHeading>)
|
|
43
|
+
expect(container.querySelector('h2')).toHaveClass('pkt-heading--fw-bold')
|
|
41
44
|
})
|
|
42
45
|
|
|
43
|
-
test('renders with visually hidden prop',
|
|
46
|
+
test('renders with visually hidden prop', () => {
|
|
44
47
|
const { container } = render(<PktHeading visuallyHidden>Hidden Heading</PktHeading>)
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const headingElement = container.querySelector('pkt-heading')
|
|
48
|
-
expect(headingElement).toHaveClass('pkt-sr-only')
|
|
49
|
-
expect(headingElement).toHaveAttribute('visuallyHidden')
|
|
48
|
+
expect(container.querySelector('h2')).toHaveClass('pkt-sr-only')
|
|
50
49
|
})
|
|
51
50
|
|
|
52
|
-
test('renders with align
|
|
51
|
+
test('renders with align prop', () => {
|
|
53
52
|
const { container } = render(<PktHeading align="center">Center Heading</PktHeading>)
|
|
54
|
-
|
|
53
|
+
expect(container.querySelector('h2')).toHaveClass('pkt-heading--center')
|
|
54
|
+
})
|
|
55
55
|
|
|
56
|
-
|
|
57
|
-
|
|
56
|
+
test('always carries the pkt-heading base class', () => {
|
|
57
|
+
const { container } = render(<PktHeading>Heading</PktHeading>)
|
|
58
|
+
expect(container.querySelector('h2')).toHaveClass('pkt-heading')
|
|
58
59
|
})
|
|
59
60
|
|
|
60
61
|
describe('accessibility', () => {
|
|
@@ -64,7 +65,6 @@ describe('PktHeading', () => {
|
|
|
64
65
|
Accessible Heading
|
|
65
66
|
</PktHeading>,
|
|
66
67
|
)
|
|
67
|
-
await window.customElements.whenDefined('pkt-heading')
|
|
68
68
|
const results = await axe(container)
|
|
69
69
|
expect(results).toHaveNoViolations()
|
|
70
70
|
})
|
|
@@ -1,29 +1,77 @@
|
|
|
1
1
|
'use client'
|
|
2
2
|
|
|
3
|
-
import
|
|
4
|
-
import {
|
|
5
|
-
|
|
6
|
-
import React, { FC, forwardRef, ForwardRefExoticComponent, type LegacyRef, type ReactNode } from 'react'
|
|
3
|
+
import classNames from 'classnames'
|
|
4
|
+
import { forwardRef, HTMLAttributes, ReactNode } from 'react'
|
|
5
|
+
import type { THeadingLevel, THeadingSize, THeadingWeight } from 'shared-types'
|
|
7
6
|
|
|
8
|
-
|
|
7
|
+
export type TPktHeadingLevel = THeadingLevel
|
|
8
|
+
export type TPktHeadingSize = THeadingSize
|
|
9
|
+
export type TPktHeadingWeight = THeadingWeight
|
|
9
10
|
|
|
10
|
-
export interface IPktHeading extends
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
export interface IPktHeading extends HTMLAttributes<HTMLHeadingElement> {
|
|
12
|
+
size?: TPktHeadingSize
|
|
13
|
+
level?: TPktHeadingLevel
|
|
14
|
+
weight?: TPktHeadingWeight
|
|
15
|
+
visuallyHidden?: boolean
|
|
16
|
+
align?: 'start' | 'center' | 'end'
|
|
17
|
+
children?: ReactNode
|
|
13
18
|
}
|
|
14
19
|
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
const defaultSizeForLevel = (level: TPktHeadingLevel): TPktHeadingSize => {
|
|
21
|
+
switch (level) {
|
|
22
|
+
case 1:
|
|
23
|
+
return 'xlarge'
|
|
24
|
+
case 2:
|
|
25
|
+
return 'large'
|
|
26
|
+
case 3:
|
|
27
|
+
return 'medium'
|
|
28
|
+
case 4:
|
|
29
|
+
return 'small'
|
|
30
|
+
case 5:
|
|
31
|
+
case 6:
|
|
32
|
+
return 'xsmall'
|
|
33
|
+
default:
|
|
34
|
+
return 'medium'
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const defaultWeightForLevel = (level: TPktHeadingLevel): TPktHeadingWeight => {
|
|
39
|
+
switch (level) {
|
|
40
|
+
case 1:
|
|
41
|
+
case 2:
|
|
42
|
+
return 'regular'
|
|
43
|
+
case 3:
|
|
44
|
+
case 4:
|
|
45
|
+
case 5:
|
|
46
|
+
case 6:
|
|
47
|
+
return 'medium'
|
|
48
|
+
default:
|
|
49
|
+
return 'medium'
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export const PktHeading = forwardRef<HTMLHeadingElement, IPktHeading>(function PktHeading(
|
|
54
|
+
{ level = 2, size, weight, visuallyHidden, align, className, children, ...rest },
|
|
55
|
+
ref,
|
|
56
|
+
) {
|
|
57
|
+
const effectiveSize = size ?? defaultSizeForLevel(level)
|
|
58
|
+
const effectiveWeight = weight ?? defaultWeightForLevel(level)
|
|
59
|
+
|
|
60
|
+
const classes = classNames(
|
|
61
|
+
'pkt-heading',
|
|
62
|
+
`pkt-heading--${effectiveSize}`,
|
|
63
|
+
`pkt-heading--fw-${effectiveWeight}`,
|
|
64
|
+
align && `pkt-heading--${align}`,
|
|
65
|
+
visuallyHidden && 'pkt-sr-only',
|
|
66
|
+
className,
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
const Tag = `h${level}` as 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6'
|
|
21
70
|
|
|
22
|
-
export const PktHeading: FC<IPktHeading> = forwardRef(({ children, ...props }: IPktHeading, ref) => {
|
|
23
71
|
return (
|
|
24
|
-
<
|
|
72
|
+
<Tag {...rest} ref={ref} className={classes} data-testid="pkt-heading">
|
|
25
73
|
{children}
|
|
26
|
-
</
|
|
74
|
+
</Tag>
|
|
27
75
|
)
|
|
28
76
|
})
|
|
29
77
|
|