@oslokommune/punkt-react 13.6.15 → 13.7.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.
Files changed (67) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/index.d.ts +38 -74
  3. package/dist/punkt-react.es.js +5358 -35971
  4. package/dist/punkt-react.umd.js +418 -548
  5. package/package.json +11 -15
  6. package/src/components/accordion/Accordion.test.tsx +1 -1
  7. package/src/components/accordion/Accordion.tsx +1 -1
  8. package/src/components/accordion/AccordionItem.tsx +6 -5
  9. package/src/components/alert/Alert.tsx +2 -1
  10. package/src/components/breadcrumbs/Breadcrumbs.test.tsx +16 -4
  11. package/src/components/breadcrumbs/Breadcrumbs.tsx +3 -2
  12. package/src/components/button/Button.tsx +3 -2
  13. package/src/components/checkbox/Checkbox.tsx +4 -3
  14. package/src/components/datepicker/Datepicker.test.tsx +393 -0
  15. package/src/components/footer/Footer.tsx +6 -5
  16. package/src/components/footerSimple/FooterSimple.tsx +4 -3
  17. package/src/components/icon/Icon.test.tsx +6 -19
  18. package/src/components/index.ts +0 -2
  19. package/src/components/input/Input.tsx +4 -3
  20. package/src/components/radio/RadioButton.tsx +3 -2
  21. package/src/components/searchinput/SearchInput.tsx +3 -3
  22. package/src/components/stepper/Stepper.tsx +6 -6
  23. package/src/components/table/Table.tsx +2 -1
  24. package/src/components/table/TableBody.tsx +2 -1
  25. package/src/components/table/TableData.tsx +2 -1
  26. package/src/components/table/TableDataCell.tsx +2 -1
  27. package/src/components/table/TableHeader.tsx +2 -1
  28. package/src/components/table/TableHeaderCell.tsx +2 -1
  29. package/src/components/table/TableRow.tsx +2 -1
  30. package/src/components/tag/Tag.tsx +2 -1
  31. package/src/components/preview/Preview.tsx +0 -274
  32. package/src/components/preview/PreviewCode.tsx +0 -118
  33. package/src/components/preview/PreviewPropEditor.tsx +0 -266
  34. package/src/components/preview/PreviewSpecs.tsx +0 -125
  35. package/src/components/preview/PreviewWithJson.tsx +0 -519
  36. package/src/components/preview/preview-types.ts +0 -42
  37. package/src/components/preview/preview-utils.ts +0 -226
  38. package/src/components/preview/previewJson/accordion.json +0 -84
  39. package/src/components/preview/previewJson/alert.json +0 -27
  40. package/src/components/preview/previewJson/backlink.json +0 -14
  41. package/src/components/preview/previewJson/breadcrumbs.json +0 -17
  42. package/src/components/preview/previewJson/button.json +0 -28
  43. package/src/components/preview/previewJson/card.json +0 -41
  44. package/src/components/preview/previewJson/checkbox.json +0 -21
  45. package/src/components/preview/previewJson/combobox.json +0 -24
  46. package/src/components/preview/previewJson/consent.json +0 -14
  47. package/src/components/preview/previewJson/datepicker.json +0 -14
  48. package/src/components/preview/previewJson/footer-simple.json +0 -17
  49. package/src/components/preview/previewJson/footer.json +0 -29
  50. package/src/components/preview/previewJson/header.json +0 -34
  51. package/src/components/preview/previewJson/icon.json +0 -13
  52. package/src/components/preview/previewJson/input-wrapper.json +0 -39
  53. package/src/components/preview/previewJson/link.json +0 -28
  54. package/src/components/preview/previewJson/linkcard.json +0 -30
  55. package/src/components/preview/previewJson/loader.json +0 -28
  56. package/src/components/preview/previewJson/messagebox.json +0 -28
  57. package/src/components/preview/previewJson/modal.json +0 -65
  58. package/src/components/preview/previewJson/progressbar.json +0 -16
  59. package/src/components/preview/previewJson/radiobutton.json +0 -21
  60. package/src/components/preview/previewJson/searchinput.json +0 -20
  61. package/src/components/preview/previewJson/select.json +0 -73
  62. package/src/components/preview/previewJson/steps.json +0 -72
  63. package/src/components/preview/previewJson/table.json +0 -130
  64. package/src/components/preview/previewJson/tabs.json +0 -33
  65. package/src/components/preview/previewJson/tag.json +0 -26
  66. package/src/components/preview/previewJson/textarea.json +0 -18
  67. package/src/components/preview/previewJson/textinput.json +0 -18
@@ -1,266 +0,0 @@
1
- 'use client'
2
-
3
- import { FC } from 'react'
4
- import { PktCheckbox } from '../checkbox/Checkbox'
5
- import { PktDatepicker } from '../datepicker/Datepicker'
6
- import icons from '@oslokommune/punkt-assets/dist/icons/icons.json'
7
- import { PktButton } from '../button/Button'
8
- import { PktAccordion } from '../accordion/Accordion'
9
- import { PktAccordionItem } from '../accordion/AccordionItem'
10
- import { PktTextinput } from '../textinput/Textinput'
11
- import { IPropEditorProps } from './preview-types'
12
- import { PktTag } from '../tag/Tag'
13
- import { PktSelect } from '../select/Select'
14
- import { PktTextarea } from '../textarea/Textarea'
15
-
16
- export const PktPreviewPropEditor: FC<IPropEditorProps> = ({ propKey, spec, props, hideKey, handleChange }) => {
17
- const editorTypes = {
18
- BOOLEAN: 'boolean',
19
- ICON: 'icon',
20
- ARRAY: 'array',
21
- OBJECT: 'object',
22
- DATE: 'ISOdatestring',
23
- NUMBER: 'number',
24
- LONGSTRING: 'longstring',
25
- STRING: 'string',
26
- }
27
-
28
- // Boolean
29
- if (spec.type === editorTypes.BOOLEAN) {
30
- // Support both boolean and { value, displayAsFalse }
31
- const raw = props[propKey]
32
- const checked = typeof raw === 'object' && raw !== null && 'value' in raw ? raw.value : !!raw
33
- return (
34
- <PktCheckbox
35
- id={propKey}
36
- label={spec.name || propKey}
37
- tagText={hideKey ? undefined : propKey}
38
- requiredTag={spec.required}
39
- type="checkbox"
40
- checked={checked}
41
- onChange={(e) => {
42
- handleChange(
43
- propKey,
44
- spec.displayAsFalse ? { value: e.target.checked, displayAsFalse: true } : e.target.checked,
45
- )
46
- }}
47
- labelPosition="right"
48
- isSwitch
49
- />
50
- )
51
- }
52
-
53
- // Icon (dropdown)
54
- if (spec.type === editorTypes.ICON) {
55
- const value = props[propKey] || ''
56
- return (
57
- <PktSelect
58
- label={spec.name || propKey}
59
- id={propKey}
60
- tagText={hideKey ? undefined : propKey}
61
- value={value}
62
- onChange={(e) => {
63
- handleChange(propKey, e.target.value)
64
- }}
65
- requiredTag={spec.required}
66
- >
67
- <option value=""></option>
68
- {(icons as { id: string }[]).map((icon) => (
69
- <option key={icon.id} value={icon.id}>
70
- {icon.id}
71
- </option>
72
- ))}
73
- </PktSelect>
74
- )
75
- }
76
-
77
- // Date
78
- if (spec.type === editorTypes.DATE) {
79
- const value = props[propKey] || ''
80
- return (
81
- <div>
82
- <PktDatepicker
83
- id={propKey}
84
- label={spec.name || propKey}
85
- value={value}
86
- multiple={!!(spec.variant === 'multiple')}
87
- maxlength={999}
88
- tagText={propKey}
89
- onChange={(e) => {
90
- handleChange(propKey, (e.target as HTMLInputElement).value)
91
- }}
92
- requiredTag={spec.required}
93
- />
94
- </div>
95
- )
96
- }
97
-
98
- // Enum (array of values)
99
- if (Array.isArray(spec) || Array.isArray(spec.type) || Array.isArray(spec.values)) {
100
- const arr = Array.isArray(spec) ? [...spec] : spec.values ? [...spec.values] : [...spec.type]
101
- const value = props[propKey] || ''
102
- return (
103
- <PktSelect
104
- label={spec.name || propKey}
105
- id={propKey}
106
- value={value}
107
- onChange={(e) => handleChange(propKey, e.currentTarget.value)}
108
- required={spec.required}
109
- requiredTag={spec.required}
110
- tagText={hideKey ? undefined : propKey}
111
- >
112
- <option value=""></option>
113
- {arr.map((option: string) => (
114
- <option key={option} value={option}>
115
- {option}
116
- </option>
117
- ))}
118
- </PktSelect>
119
- )
120
- }
121
-
122
- // Number
123
- if (spec.type === editorTypes.NUMBER) {
124
- const value = props[propKey] ?? ''
125
- return (
126
- <PktTextinput
127
- label={spec.name || propKey}
128
- id={propKey}
129
- requiredTag={spec.required}
130
- required={spec.required}
131
- tagText={hideKey ? undefined : propKey}
132
- type="number"
133
- value={value}
134
- onChange={(e) => {
135
- handleChange(propKey, parseFloat(e.currentTarget.value))
136
- }}
137
- />
138
- )
139
- }
140
-
141
- // Object
142
- if (spec.type === editorTypes.OBJECT) {
143
- const value = props[propKey] ? { ...props[propKey] } : {}
144
- return (
145
- <div>
146
- <h2 className="pkt-inputwrapper__label">
147
- {spec.name || propKey} <PktTag skin="gray">{propKey}</PktTag>
148
- </h2>
149
- <fieldset className="pkt-preview__object-editor">
150
- {Object.entries(spec.properties).map(([key, childSpec]) => (
151
- <PktPreviewPropEditor
152
- key={key}
153
- propKey={key}
154
- props={value}
155
- spec={childSpec}
156
- hideKey={hideKey}
157
- handleChange={(childKey, childValue) => {
158
- handleChange(propKey, { ...value, [childKey]: childValue })
159
- }}
160
- />
161
- ))}
162
- </fieldset>
163
- </div>
164
- )
165
- }
166
-
167
- // Array of objects
168
- if (spec.type === editorTypes.ARRAY && spec.items.type === editorTypes.OBJECT) {
169
- const value = Array.isArray(props[propKey]) ? [...props[propKey]] : []
170
- const addObjectToArray = () => {
171
- handleChange(propKey, [...value, {}])
172
- }
173
- const removeObjectFromArray = (index: number) => {
174
- handleChange(
175
- propKey,
176
- value.filter((_, i) => i !== index),
177
- )
178
- }
179
- const handleArrayChange = (index: number, childKey: string, childValue: any) => {
180
- const newArr = value.map((item, i) => (i === index ? { ...item, [childKey]: childValue } : item))
181
- handleChange(propKey, newArr)
182
- }
183
- return (
184
- <div>
185
- <h2 className="pkt-inputwrapper__label">
186
- {spec.name || propKey} {hideKey ? '' : <PktTag skin="gray">{propKey}</PktTag>}
187
- </h2>
188
- <PktAccordion skin="outlined" compact>
189
- {value.map((item: any, index: number) => (
190
- <div key={index}>
191
- <PktAccordionItem
192
- id={`array-item-${index}`}
193
- title={`${spec.items.name || propKey || `Item`} ${index + 1}`}
194
- >
195
- <div className="pkt-preview__array-item">
196
- {Object.entries(spec.items.properties).map(([key, childSpec]) => (
197
- <PktPreviewPropEditor
198
- key={key}
199
- propKey={key}
200
- props={item}
201
- spec={childSpec}
202
- hideKey={hideKey}
203
- handleChange={(childKey, childValue) => handleArrayChange(index, childKey, childValue)}
204
- />
205
- ))}
206
- <div className="pkt-preview__remove-object">
207
- <PktButton
208
- onClick={() => {
209
- confirm('Er du sikker på at du vil fjerne dette elementet?') && removeObjectFromArray(index)
210
- }}
211
- size="small"
212
- skin="tertiary"
213
- variant="icon-only"
214
- iconName="trash-can"
215
- >
216
- Fjern denne
217
- </PktButton>
218
- </div>
219
- </div>
220
- </PktAccordionItem>
221
- </div>
222
- ))}
223
- </PktAccordion>
224
- <div className="pkt-preview__add-object">
225
- <PktButton onClick={addObjectToArray} size="small" skin="tertiary" variant="icon-left" iconName="plus-circle">
226
- Legg til {spec.items.name || propKey || 'element'}
227
- </PktButton>
228
- </div>
229
- </div>
230
- )
231
- }
232
-
233
- if (spec.type === editorTypes.LONGSTRING) {
234
- // Long string input
235
- const value = props[propKey] || ''
236
- return (
237
- <PktTextarea
238
- tagText={hideKey ? undefined : propKey}
239
- id={propKey}
240
- label={spec.name || propKey}
241
- value={value}
242
- onChange={(e) => {
243
- handleChange(propKey, e.currentTarget.value)
244
- }}
245
- required={spec.required}
246
- requiredTag={spec.required}
247
- />
248
- )
249
- }
250
-
251
- // Default: string
252
- const value = props[propKey] ?? ''
253
- return (
254
- <PktTextinput
255
- label={spec.name || propKey}
256
- tagText={hideKey ? undefined : propKey}
257
- id={propKey}
258
- required={spec.required}
259
- requiredTag={spec.required}
260
- value={value}
261
- onChange={(e) => {
262
- handleChange(propKey, e.currentTarget.value)
263
- }}
264
- />
265
- )
266
- }
@@ -1,125 +0,0 @@
1
- 'use client'
2
-
3
- import React from 'react'
4
- import { PktTable } from '../table/Table'
5
- import { PktTableHeader } from '../table/TableHeader'
6
- import { PktTableBody } from '../table/TableBody'
7
- import { PktTableRow } from '../table/TableRow'
8
- import { PktTableHeaderCell } from '../table/TableHeaderCell'
9
- import { PktTableDataCell } from '../table/TableDataCell'
10
- import { ISpecObject } from './preview-types'
11
-
12
- export const PktPreviewSpecs: React.FC<{ specs: ISpecObject }> = ({ specs }) => {
13
- const formatType = (type: string | string[] | number | number[]) => {
14
- if (Array.isArray(type)) {
15
- return type.join(' \n')
16
- }
17
- return type
18
- }
19
-
20
- const formatValue = (value: any) => {
21
- if (typeof value === 'boolean') {
22
- return value ? 'true' : 'false'
23
- }
24
- return value
25
- }
26
-
27
- return (
28
- <>
29
- <h2>Egenskaper</h2>
30
- <PktTable compact>
31
- <PktTableHeader>
32
- <PktTableRow>
33
- <PktTableHeaderCell>Prop</PktTableHeaderCell>
34
- <PktTableHeaderCell>Navn</PktTableHeaderCell>
35
- <PktTableHeaderCell>Beskrivelse</PktTableHeaderCell>
36
- <PktTableHeaderCell>Type</PktTableHeaderCell>
37
- <PktTableHeaderCell>Standardverdi</PktTableHeaderCell>
38
- </PktTableRow>
39
- </PktTableHeader>
40
- <PktTableBody>
41
- {Object.entries(specs.props || {}).map(([key, value]) => (
42
- <PktTableRow key={key}>
43
- <PktTableDataCell dataLabel="Prop">
44
- <pre>{key}</pre>
45
- </PktTableDataCell>
46
- <PktTableDataCell dataLabel="Navn">{(!Array.isArray(value) && value.name) || key}</PktTableDataCell>
47
- {Array.isArray(value) ? (
48
- <>
49
- <PktTableDataCell dataLabel="Beskrivelse"></PktTableDataCell>
50
- <PktTableDataCell dataLabel="Type">
51
- <pre>{value.join('\n')}</pre>
52
- </PktTableDataCell>
53
- </>
54
- ) : (
55
- <>
56
- <PktTableDataCell dataLabel="Beskrivelse">
57
- <span dangerouslySetInnerHTML={{ __html: value.description || '' }}></span>
58
- </PktTableDataCell>
59
- <PktTableDataCell dataLabel="Type">
60
- <pre>{value.type && formatType(value.type)}</pre>
61
- </PktTableDataCell>
62
- <PktTableDataCell dataLabel="Standardverdi">
63
- <pre>{formatValue(value.default)}</pre>
64
- </PktTableDataCell>
65
- </>
66
- )}
67
- </PktTableRow>
68
- ))}
69
- </PktTableBody>
70
- </PktTable>
71
- {specs.events && (
72
- <>
73
- <h2>Hendelser / handlinger</h2>
74
- <PktTable compact>
75
- <PktTableHeader>
76
- <PktTableRow>
77
- <PktTableHeaderCell>Event</PktTableHeaderCell>
78
- <PktTableHeaderCell>Beskrivelse</PktTableHeaderCell>
79
- <PktTableHeaderCell>Type</PktTableHeaderCell>
80
- </PktTableRow>
81
- </PktTableHeader>
82
- <PktTableBody>
83
- {Object.entries(specs.events || {}).map(([key, value]) => (
84
- <PktTableRow key={key}>
85
- <PktTableDataCell dataLabel="Event">
86
- <pre>{key}</pre>
87
- </PktTableDataCell>
88
- <PktTableDataCell dataLabel="Beskrivelse">
89
- <span dangerouslySetInnerHTML={{ __html: value.description || '' }}></span>
90
- </PktTableDataCell>
91
- <PktTableDataCell dataLabel="Type">{value.type}</PktTableDataCell>
92
- </PktTableRow>
93
- ))}
94
- </PktTableBody>
95
- </PktTable>
96
- </>
97
- )}
98
- {specs.slots && (
99
- <>
100
- <h2>Innhold</h2>
101
- <PktTable compact>
102
- <PktTableHeader>
103
- <PktTableRow>
104
- <PktTableHeaderCell>Slot</PktTableHeaderCell>
105
- <PktTableHeaderCell>Beskrivelse</PktTableHeaderCell>
106
- </PktTableRow>
107
- </PktTableHeader>
108
- <PktTableBody>
109
- {Object.entries(specs.slots || {}).map(([key, value]) => (
110
- <PktTableRow key={key}>
111
- <PktTableDataCell dataLabel="Slot">
112
- <pre>{key}</pre>
113
- </PktTableDataCell>
114
- <PktTableDataCell dataLabel="Beskrivelse">
115
- <span dangerouslySetInnerHTML={{ __html: value.description || '' }}></span>
116
- </PktTableDataCell>
117
- </PktTableRow>
118
- ))}
119
- </PktTableBody>
120
- </PktTable>
121
- </>
122
- )}
123
- </>
124
- )
125
- }