@oslokommune/punkt-react 12.26.2 → 12.27.1

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oslokommune/punkt-react",
3
- "version": "12.26.2",
3
+ "version": "12.27.1",
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",
@@ -38,7 +38,7 @@
38
38
  "dependencies": {
39
39
  "@lit-labs/ssr-dom-shim": "^1.2.1",
40
40
  "@lit/react": "^1.0.5",
41
- "@oslokommune/punkt-elements": "^12.26.2",
41
+ "@oslokommune/punkt-elements": "^12.27.1",
42
42
  "angular-html-parser": "^6.0.2",
43
43
  "html-format": "^1.1.7",
44
44
  "prettier": "^3.3.3",
@@ -47,8 +47,8 @@
47
47
  "react-syntax-highlighter": "^15.5.0"
48
48
  },
49
49
  "devDependencies": {
50
- "@oslokommune/punkt-assets": "^12.23.0",
51
- "@oslokommune/punkt-css": "^12.26.0",
50
+ "@oslokommune/punkt-assets": "^12.27.1",
51
+ "@oslokommune/punkt-css": "^12.27.1",
52
52
  "@testing-library/jest-dom": "^6.5.0",
53
53
  "@testing-library/react": "^16.0.1",
54
54
  "@testing-library/user-event": "^14.5.2",
@@ -111,5 +111,5 @@
111
111
  "url": "https://github.com/oslokommune/punkt/issues"
112
112
  },
113
113
  "license": "MIT",
114
- "gitHead": "40edb9d3d4eab9308ced03492923de706deff59d"
114
+ "gitHead": "0b2f47770a00b04fc9f29d1e4fcb5e87800c8e54"
115
115
  }
@@ -5,6 +5,10 @@ import React, {
5
5
  FocusEventHandler,
6
6
  ReactNode,
7
7
  InputHTMLAttributes,
8
+ FC,
9
+ ReactElement,
10
+ ForwardedRef,
11
+ forwardRef,
8
12
  } from 'react'
9
13
  import { createComponent, EventName } from '@lit/react'
10
14
  import { PktDatepicker as PktEl } from '@oslokommune/punkt-elements'
@@ -46,7 +50,7 @@ export interface IPktDatepicker extends InputHTMLAttributes<HTMLInputElement> {
46
50
  skipForwardTestid?: boolean
47
51
  }
48
52
 
49
- export const PktDatepicker = createComponent({
53
+ export const LitComponent = createComponent({
50
54
  tagName: 'pkt-datepicker',
51
55
  elementClass: PktEl,
52
56
  react: React,
@@ -59,3 +63,17 @@ export const PktDatepicker = createComponent({
59
63
  onToggleHelpText: 'toggleHelpText' as EventName<CustomEvent>,
60
64
  },
61
65
  }) as ForwardRefExoticComponent<IPktDatepicker>
66
+
67
+ export const PktDatepicker: FC<IPktDatepicker> = forwardRef(
68
+ ({ helptext, ...props }: IPktDatepicker, ref: ForwardedRef<HTMLInputElement>): ReactElement => {
69
+ return (
70
+ <LitComponent ref={ref} {...props}>
71
+ <div className="pkt-contents" slot="helptext">
72
+ {helptext}
73
+ </div>
74
+ </LitComponent>
75
+ )
76
+ },
77
+ )
78
+
79
+ PktDatepicker.displayName = 'PktDatepicker'
@@ -0,0 +1,34 @@
1
+ import React, { ForwardRefExoticComponent, ReactNode, LegacyRef, FC, forwardRef, HTMLAttributes } from 'react'
2
+ import { PktHelptext as PktElHelptext } from '@oslokommune/punkt-elements'
3
+ import { createComponent, EventName } from '@lit/react'
4
+
5
+ export interface IPktHelptextProps extends HTMLAttributes<HTMLDivElement> {
6
+ helptext?: string | ReactNode | ReactNode[]
7
+ helptextDropdown?: string | ReactNode | ReactNode[]
8
+ helptextDropdownButton?: string
9
+ forId?: string
10
+ ref?: LegacyRef<HTMLDivElement>
11
+ onToggleHelpText?: (e: CustomEvent) => void
12
+ }
13
+
14
+ export const LitComponent = createComponent({
15
+ tagName: 'pkt-helptext',
16
+ elementClass: PktElHelptext,
17
+ react: React,
18
+ displayName: 'PktHelptext',
19
+ events: {
20
+ onToggleHelpText: 'toggleHelpText' as EventName<CustomEvent>,
21
+ },
22
+ }) as ForwardRefExoticComponent<IPktHelptextProps>
23
+
24
+ export const PktHelptext: FC<IPktHelptextProps> = forwardRef(
25
+ ({ children, ...props }, ref: LegacyRef<HTMLDivElement>) => {
26
+ return (
27
+ <LitComponent {...props} ref={ref}>
28
+ {children}
29
+ </LitComponent>
30
+ )
31
+ },
32
+ )
33
+
34
+ PktHelptext.displayName = 'PktHelptext'
@@ -10,6 +10,7 @@ export { PktDatepicker } from './datepicker/Datepicker'
10
10
  export { PktFooter } from './footer/Footer'
11
11
  export { PktFooterSimple } from './footerSimple/FooterSimple'
12
12
  export { PktHeader } from './header/Header'
13
+ export { PktHelptext } from './helptext/Helptext'
13
14
  export { PktIcon } from './icon/Icon'
14
15
  export { PktInput } from './input/Input'
15
16
  export { PktInputWrapper } from './inputwrapper/InputWrapper'
@@ -46,9 +46,12 @@ const LitComponent: ForwardRefExoticComponent<IPktInputWrapper> = createComponen
46
46
  })
47
47
 
48
48
  export const PktInputWrapper: FC<IPktInputWrapper> = forwardRef(
49
- ({ children, ...props }: IPktInputWrapper, ref: LegacyRef<PktEl>): ReactElement => {
49
+ ({ children, helptext, ...props }: IPktInputWrapper, ref: LegacyRef<PktEl>): ReactElement => {
50
50
  return (
51
51
  <LitComponent ref={ref} {...props}>
52
+ <div className="pkt-contents" slot="helptext">
53
+ {helptext}
54
+ </div>
52
55
  <div className="pkt-contents">{children}</div>
53
56
  </LitComponent>
54
57
  )
@@ -4,7 +4,7 @@ import { PktDatepicker } from '../datepicker/Datepicker'
4
4
  import { PktInputWrapper } from '../inputwrapper/InputWrapper'
5
5
  import { PktSelect } from '../select/Select'
6
6
  import { PktTextinput } from '../textinput/Textinput'
7
- import icons from '../../../../../apps/docs-astro/src/pages/json/icons.json'
7
+ import icons from '@oslokommune/punkt-assets/dist/icons/icons.json'
8
8
  import { PktButton } from '../button/Button'
9
9
 
10
10
  interface PropEditorProps {
@@ -10,8 +10,13 @@ expect.extend(toHaveNoViolations)
10
10
 
11
11
  describe('PktSelect', () => {
12
12
  test('renders select field with correct props', async () => {
13
- const { getByLabelText, container } = render(
14
- <PktSelect label="Input Label" id="inputId" ariaLabelledby="inputId" />,
13
+ const { container } = render(
14
+ <PktSelect
15
+ label="Input Label"
16
+ id="inputId"
17
+ ariaLabelledby="inputId"
18
+ options={[{ value: 'verdi', label: 'Verdi' }]}
19
+ />,
15
20
  )
16
21
  await window.customElements.whenDefined('pkt-select')
17
22
 
@@ -21,27 +26,40 @@ describe('PktSelect', () => {
21
26
  expect(select?.tagName).toBe('PKT-SELECT')
22
27
  expect(select?.id).toBe('inputId')
23
28
 
24
- await window.customElements.whenDefined('pkt-input-wrapper')
25
29
  const inputWrapper = container.querySelector('pkt-input-wrapper')
26
30
  expect(inputWrapper).toBeInTheDocument()
27
31
  expect(inputWrapper).toHaveAttribute('label', 'Input Label')
28
32
  })
29
33
 
30
34
  test('renders error message when hasError prop is true', async () => {
31
- const { getByText } = render(<PktSelect label="Input Label" id="inputId" hasError errorMessage="Input error" />)
32
- await window.customElements.whenDefined('pkt-input-wrapper')
35
+ const { getByText } = render(
36
+ <PktSelect
37
+ label="Input Label"
38
+ id="inputId"
39
+ hasError
40
+ errorMessage="Input error"
41
+ options={[{ value: 'verdi', label: 'Verdi' }]}
42
+ />,
43
+ )
44
+ await window.customElements.whenDefined('pkt-select')
33
45
 
34
46
  const errorMessage = getByText('Input error')
35
47
  expect(errorMessage).toBeInTheDocument()
36
- expect(errorMessage.closest('.pkt-alert')).toHaveAttribute('id', 'inputId-error')
48
+ expect(errorMessage.closest('.pkt-alert')).toHaveAttribute('id', 'inputId-input-error')
37
49
  })
38
50
 
39
51
  describe('PktSelect', () => {
40
52
  test('toggles helptext class', async () => {
41
53
  const { getByText, container } = render(
42
- <PktSelect label="Input Label" id="inputId" helptext="Help Text" helptextDropdown="Help Text" />,
54
+ <PktSelect
55
+ label="Input Label"
56
+ id="inputId"
57
+ helptext="Help Text"
58
+ helptextDropdown="Help Text"
59
+ options={[{ value: 'verdi', label: 'Verdi' }]}
60
+ />,
43
61
  )
44
- await window.customElements.whenDefined('pkt-input-wrapper')
62
+ await window.customElements.whenDefined('pkt-select')
45
63
 
46
64
  const expandButton = getByText('Les mer').closest('button') as HTMLButtonElement
47
65
  const helptextElement = container.querySelector('.pkt-inputwrapper__helptext-expandable-closed')
@@ -56,8 +74,10 @@ describe('PktSelect', () => {
56
74
 
57
75
  describe('accessibility', () => {
58
76
  it('renders with no wcag errors with axe', async () => {
59
- const { container } = render(<PktSelect label="Input Label" id="inputId" />)
60
- await window.customElements.whenDefined('pkt-input-wrapper')
77
+ const { container } = render(
78
+ <PktSelect label="Input Label" id="inputId" options={[{ value: 'verdi', label: 'Verdi' }]} />,
79
+ )
80
+ await window.customElements.whenDefined('pkt-select')
61
81
  const results = await axe(container)
62
82
  expect(results).toHaveNoViolations()
63
83
  })
@@ -5,6 +5,8 @@ import React, {
5
5
  ChangeEventHandler,
6
6
  FocusEventHandler,
7
7
  LegacyRef,
8
+ FC,
9
+ forwardRef,
8
10
  } from 'react'
9
11
  import { PktSelect as PktElSelect } from '@oslokommune/punkt-elements'
10
12
  import type { TSelectOption } from '@oslokommune/punkt-elements'
@@ -40,7 +42,7 @@ export interface IPktSelectProps extends SelectHTMLAttributes<HTMLSelectElement>
40
42
  onToggleHelpText?: (e: CustomEvent) => void
41
43
  }
42
44
 
43
- export const PktSelect = createComponent({
45
+ export const LitComponent = createComponent({
44
46
  tagName: 'pkt-select',
45
47
  elementClass: PktElSelect,
46
48
  react: React,
@@ -54,3 +56,21 @@ export const PktSelect = createComponent({
54
56
  onToggleHelpText: 'toggleHelpText' as EventName<CustomEvent>,
55
57
  },
56
58
  }) as ForwardRefExoticComponent<IPktSelectProps>
59
+
60
+ // Note:
61
+ // helptext slot needs to be before children because of how React reactivity works.
62
+ // Please do not change this.
63
+ export const PktSelect: FC<IPktSelectProps> = forwardRef(({ children, helptext, ...props }: IPktSelectProps, ref) => {
64
+ return (
65
+ <LitComponent ref={ref} {...props}>
66
+ {helptext && (
67
+ <div slot="helptext" className="pkt-contents">
68
+ {helptext}
69
+ </div>
70
+ )}
71
+ {children}
72
+ </LitComponent>
73
+ )
74
+ })
75
+
76
+ PktSelect.displayName = 'PktSelect'
@@ -5,6 +5,8 @@ import React, {
5
5
  FocusEventHandler,
6
6
  ReactNode,
7
7
  TextareaHTMLAttributes,
8
+ FC,
9
+ forwardRef,
8
10
  } from 'react'
9
11
  import { createComponent, EventName } from '@lit/react'
10
12
  import { PktTextarea as PktEl } from '@oslokommune/punkt-elements'
@@ -40,7 +42,7 @@ export interface IPktTextarea extends TextareaHTMLAttributes<HTMLTextAreaElement
40
42
  skipForwardTestid?: boolean
41
43
  }
42
44
 
43
- export const PktTextarea = createComponent({
45
+ export const LitComponent = createComponent({
44
46
  tagName: 'pkt-textarea',
45
47
  elementClass: PktEl,
46
48
  react: React,
@@ -54,3 +56,19 @@ export const PktTextarea = createComponent({
54
56
  onToggleHelpText: 'toggleHelpText' as EventName<CustomEvent>,
55
57
  },
56
58
  }) as ForwardRefExoticComponent<IPktTextarea>
59
+
60
+ export const PktTextarea: FC<IPktTextarea> = forwardRef(
61
+ ({ helptext, ...props }, ref: LegacyRef<HTMLTextAreaElement>) => {
62
+ return (
63
+ <LitComponent {...props} ref={ref}>
64
+ {helptext && (
65
+ <div slot="helptext" className="pkt-contents">
66
+ {helptext}
67
+ </div>
68
+ )}
69
+ </LitComponent>
70
+ )
71
+ },
72
+ )
73
+
74
+ PktTextarea.displayName = 'PktTextarea'
@@ -5,6 +5,8 @@ import React, {
5
5
  FocusEventHandler,
6
6
  ReactNode,
7
7
  InputHTMLAttributes,
8
+ FC,
9
+ forwardRef,
8
10
  } from 'react'
9
11
  import { createComponent, EventName } from '@lit/react'
10
12
  import { PktTextinput as PktEl } from '@oslokommune/punkt-elements'
@@ -43,7 +45,7 @@ export interface IPktTextinput extends InputHTMLAttributes<HTMLInputElement> {
43
45
  skipForwardTestid?: boolean
44
46
  }
45
47
 
46
- export const PktTextinput = createComponent({
48
+ export const LitComponent = createComponent({
47
49
  tagName: 'pkt-textinput',
48
50
  elementClass: PktEl,
49
51
  react: React,
@@ -57,3 +59,19 @@ export const PktTextinput = createComponent({
57
59
  onToggleHelpText: 'toggleHelpText' as EventName<CustomEvent>,
58
60
  },
59
61
  }) as ForwardRefExoticComponent<IPktTextinput>
62
+
63
+ export const PktTextinput: FC<IPktTextinput> = forwardRef(
64
+ ({ helptext, ...props }, ref: LegacyRef<HTMLInputElement>) => {
65
+ return (
66
+ <LitComponent {...props} ref={ref}>
67
+ {helptext && (
68
+ <div slot="helptext" className="pkt-contents">
69
+ {helptext}
70
+ </div>
71
+ )}
72
+ </LitComponent>
73
+ )
74
+ },
75
+ )
76
+
77
+ PktTextinput.displayName = 'PktTextinput'