@oslokommune/punkt-react 16.26.3 → 17.0.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 (100) hide show
  1. package/CHANGELOG.md +111 -0
  2. package/dist/components/accordion/Accordion.d.ts +1 -0
  3. package/dist/components/alert/Alert.d.ts +9 -0
  4. package/dist/components/button/Button.d.ts +1 -1
  5. package/dist/components/combobox/types.d.ts +2 -0
  6. package/dist/components/datepicker/types.d.ts +3 -0
  7. package/dist/components/fileupload/FileUpload.d.ts +12 -2
  8. package/dist/components/footer/Footer.accessibility.test.d.ts +0 -0
  9. package/dist/components/footer/Footer.d.ts +12 -34
  10. package/dist/components/footer/Footer.test.d.ts +1 -0
  11. package/dist/components/footer/FooterGlobal.d.ts +23 -0
  12. package/dist/components/footerSimple/FooterSimple.d.ts +19 -16
  13. package/dist/components/footerSimple/FooterSimple.test.d.ts +1 -0
  14. package/dist/components/header/Header.d.ts +15 -3
  15. package/dist/components/header/HeaderGlobal.accessibility.test.d.ts +0 -0
  16. package/dist/components/header/HeaderGlobal.d.ts +2 -0
  17. package/dist/components/header/HeaderGlobal.test.d.ts +0 -0
  18. package/dist/components/header/HeaderService.accessibility.test.d.ts +0 -0
  19. package/dist/components/header/types.d.ts +30 -2
  20. package/dist/components/header-menu/HeaderMenu.d.ts +2 -4
  21. package/dist/components/index.d.ts +4 -0
  22. package/dist/components/inputwrapper/InputWrapper.d.ts +1 -0
  23. package/dist/components/searchinput/SearchInput.d.ts +1 -0
  24. package/dist/components/select/Select.d.ts +4 -7
  25. package/dist/components/textarea/Textarea.d.ts +2 -0
  26. package/dist/components/textinput/Textinput.d.ts +1 -0
  27. package/dist/components/timepicker/types.d.ts +3 -0
  28. package/dist/components/timepicker/useTimepickerState.d.ts +2 -0
  29. package/dist/punkt-react.cjs +1 -1
  30. package/dist/punkt-react.js +3191 -2727
  31. package/dist/shared-types/footer.d.ts +95 -0
  32. package/dist/shared-types/{header-menu.d.ts → header-footer.d.ts} +51 -4
  33. package/dist/shared-types/header.d.ts +1 -1
  34. package/dist/shared-types/index.d.ts +6 -4
  35. package/dist/shared-types/searchinput.d.ts +2 -0
  36. package/dist/shared-types/select.d.ts +3 -2
  37. package/dist/shared-types/size.d.ts +4 -0
  38. package/dist/shared-types/timepicker.d.ts +0 -6
  39. package/dist/shared-utils/datepicker-utils.d.ts +5 -4
  40. package/dist/shared-utils/fileupload/focus-trap.d.ts +4 -10
  41. package/dist/shared-utils/focus-trap/index.d.ts +22 -0
  42. package/dist/shared-utils/{header-menu → header-footer}/example-data.d.ts +5 -4
  43. package/dist/shared-utils/header-footer/external-domain.d.ts +26 -0
  44. package/dist/shared-utils/{header-menu → header-footer}/fetch-header-footer-data.d.ts +6 -2
  45. package/dist/shared-utils/{header-menu → header-footer}/index.d.ts +2 -1
  46. package/dist/shared-utils/{header-menu → header-footer}/select-megamenu.d.ts +1 -1
  47. package/dist/shared-utils/scroll-lock/index.d.ts +24 -0
  48. package/package.json +4 -4
  49. package/src/components/accordion/Accordion.test.tsx +51 -0
  50. package/src/components/accordion/Accordion.tsx +3 -3
  51. package/src/components/accordion/AccordionItem.tsx +7 -14
  52. package/src/components/alert/Alert.test.tsx +45 -9
  53. package/src/components/alert/Alert.tsx +13 -3
  54. package/src/components/button/Button.tsx +2 -2
  55. package/src/components/combobox/Combobox.core.test.tsx +14 -0
  56. package/src/components/combobox/Combobox.tsx +1 -0
  57. package/src/components/combobox/ComboboxInput.tsx +2 -0
  58. package/src/components/combobox/types.ts +2 -0
  59. package/src/components/combobox/useComboboxState.ts +2 -0
  60. package/src/components/consent/Consent.test.tsx +8 -14
  61. package/src/components/consent/Consent.tsx +9 -19
  62. package/src/components/datepicker/Datepicker.core.test.tsx +11 -0
  63. package/src/components/datepicker/Datepicker.tsx +4 -1
  64. package/src/components/datepicker/DatepickerInputs.tsx +16 -1
  65. package/src/components/datepicker/types.ts +3 -0
  66. package/src/components/datepicker/useDatepickerState.ts +17 -9
  67. package/src/components/fileupload/FileUpload.tsx +27 -9
  68. package/src/components/footer/Footer.accessibility.test.tsx +46 -0
  69. package/src/components/footer/Footer.test.tsx +192 -86
  70. package/src/components/footer/Footer.tsx +169 -159
  71. package/src/components/footer/FooterGlobal.tsx +181 -0
  72. package/src/components/footerSimple/FooterSimple.test.tsx +49 -46
  73. package/src/components/footerSimple/FooterSimple.tsx +117 -78
  74. package/src/components/header/Header.tsx +17 -4
  75. package/src/components/header/HeaderGlobal.accessibility.test.tsx +86 -0
  76. package/src/components/header/HeaderGlobal.test.tsx +254 -0
  77. package/src/components/header/HeaderGlobal.tsx +467 -0
  78. package/src/components/header/HeaderService.accessibility.test.tsx +70 -0
  79. package/src/components/header/HeaderService.test.tsx +29 -16
  80. package/src/components/header/HeaderService.tsx +24 -84
  81. package/src/components/header/types.ts +35 -0
  82. package/src/components/header-menu/HeaderMenu.test.tsx +16 -39
  83. package/src/components/header-menu/HeaderMenu.tsx +62 -70
  84. package/src/components/index.ts +4 -0
  85. package/src/components/inputwrapper/InputWrapper.tsx +6 -1
  86. package/src/components/modal/Modal.tsx +7 -11
  87. package/src/components/searchinput/SearchInput.test.tsx +10 -0
  88. package/src/components/searchinput/SearchInput.tsx +19 -7
  89. package/src/components/select/Select.test.tsx +18 -0
  90. package/src/components/select/Select.tsx +8 -4
  91. package/src/components/textarea/Textarea.test.tsx +10 -0
  92. package/src/components/textarea/Textarea.tsx +5 -1
  93. package/src/components/textinput/Textinput.test.tsx +28 -0
  94. package/src/components/textinput/Textinput.tsx +5 -2
  95. package/src/components/timepicker/Timepicker.test.tsx +10 -0
  96. package/src/components/timepicker/Timepicker.tsx +8 -7
  97. package/src/components/timepicker/types.ts +8 -5
  98. package/src/components/timepicker/useTimepickerState.ts +4 -0
  99. package/dist/shared-utils/modal-scroll-lock.d.ts +0 -10
  100. /package/dist/shared-utils/{header-menu → header-footer}/icon-map.d.ts +0 -0
package/CHANGELOG.md CHANGED
@@ -5,6 +5,117 @@ og skriver commits ca etter [Conventional Commits](https://conventionalcommits.o
5
5
 
6
6
  ---
7
7
 
8
+ ## [17.0.0](https://github.com/oslokommune/punkt/compare/16.26.7...17.0.0) (2026-07-10)
9
+
10
+ ### ⚠ BREAKING CHANGES
11
+ * Punkt 17 – Ny global header og footer, kompakte skjemaelementer (#3553). BREAKING CHANGE: Ny global header og footer, kompakte skjemaelementer. Se changelog.
12
+
13
+ # Punkt 17
14
+
15
+ OBS! Dette er en major-versjon og selv om vi har forsøkt å unngå de største breaking changes, så anbefaler vi ikke at dere oppdaterer blindt. Se gjennom løsningen og pass på at alt fungerer som forventet etter oppdatering!
16
+
17
+ ## Ny global header
18
+
19
+ ```html
20
+ <pkt-header type="global"></pkt-header>
21
+ ```
22
+
23
+ ```jsx
24
+ <PktHeader type="global" />
25
+ ```
26
+
27
+ - Henter innhold fra Oslo kommunes felles CDN. Husk å justere CSP deretter! Dersom det ikke er mulig å hente data fra ekstern CDN, bruk header med type “service”.
28
+ - Bruk på alle løsninger som ikke krever custom header, og alle løsninger som har en naturlig inngang fra Oslo kommunes åpne nettsider.
29
+ - Global header har et betraktelig smalere mulighetsrom for justeringer, og anbefales brukt som den er. Innlogget bruker og representasjon fungerer likt som den andre header-varianten. Det er ikke mulig å legge inn annet innhold i denne headeren.
30
+
31
+ ## Ny footer
32
+
33
+ ```html
34
+ <pkt-footer></pkt-footer>
35
+ <pkt-footer-simple></pkt-footer-simple>
36
+ ```
37
+
38
+ ```jsx
39
+ <PktFooter />
40
+ <PktFooterSimple />
41
+ ```
42
+
43
+ - Footer er endelig tilgjengelig i Punkt Elements.
44
+ - Henter innhold fra Oslo kommunes felles CDN. Husk å justere CSP deretter! Dersom det ikke er mulig å hente data fra ekstern CDN, bruk attributten `skipGlobal` (React)/`skip-global` (Elements).
45
+ - Innstillinger for informasjonskapsler (cookie-banner-link) fungerer likt som før, så sørg for at `includeConsent`/`include-consent` er satt om dere bruker cookies.
46
+ - Custom innhold havner nå i en sekundær footer som stables oppå den globale footeren. Så om dere tidligere har lagt lenker og tekst i footer, vil dette nå dukke opp _over_ den blå globale footeren.
47
+ - I custom innhold er nå `columnOne` og `columnTwo` deprecated, og vi anbefaler at dere istedenfor sender inn disse som en array av objekter i `columns`.
48
+ - `socialLinks`, `personvernOgInfoLink` og `tilgjengelighetLink` er deprecated og vil fjernes i senere major-versjon. Disse kommer nå fra Oslo kommunes felles data.
49
+ - Lenker med `external: true` får nå toppdomenet i parentes etter lenketeksten (f.eks. «Munchmuseet (munch.no)») i stedet for eksternt lenkeikon.
50
+ - Footer-CSSen er skrevet om. Bruker dere ren CSS (uten komponentene), eller har egne overrides mot footer-klasser, må dere gå gjennom markup/selektorer på nytt — se «Endringer fra versjon 16 til versjon 17» på footer-dokumentasjonssiden. Farger styres nå med CSS-variablene `--pkt-footer-bg`, `--pkt-footer-fg` og `--pkt-footer-link-hover`.
51
+
52
+ ## Kompakte skjemaelementer
53
+
54
+ Alle skjemakomponenter har fått attributten `input-size` (Elements) / propen `inputSize` (React) med verdiene `medium` (standard), `small` og `xsmall`:
55
+
56
+ ```html
57
+ <pkt-textinput label="Etikett" input-size="small"></pkt-textinput>
58
+ ```
59
+
60
+ ```jsx
61
+ <PktTextinput label="Etikett" inputSize="small" />
62
+ ```
63
+
64
+ - Gjelder Textinput, Textarea, Select, Combobox, SearchInput, Datepicker og Timepicker.
65
+ - Størrelsene er `medium` = 48px felthøyde med 18px tekst (som før — ingen endring om dere ikke setter noe), `small` = 42px med 16px tekst og `xsmall` = 36px med 14px tekst.
66
+ - Hele feltet skalerer: ledetekst, hjelpetekst, ikoner, prefix/suffix og feilmeldinger følger størrelsen automatisk via input-wrapperen.
67
+ - Alle skjemakomponentene i samme størrelse har lik høyde og matcher horisontalt, også på tvers av React og Elements.
68
+
69
+ ## Andre endringer
70
+
71
+ - Button i Elements har fått et betydelig UU-løft, samt litt endring i padding så den stemmer overens med Figma-varianten.
72
+ - Button har fått ny størrelse `xsmall` (36px). Samtidig er `small` justert mot Figma: 16px tekst og mer padding — small-knapper blir noe _bredere_ enn før (gamle `small` tilsvarer omtrent nye `xsmall` i bredde).
73
+ - I arbeidet med ny header fikk accordion en ny variant `plus-minus`.
74
+ - Alert sin attributt `compact` er nå deprecated, og erstattes med `size="small"`. Alert har fått `size` med `medium`/`small`/`xsmall`; settes både `compact` og `size`, vinner `size`. Small/xsmall-alerts har også fått justert padding og ikonstørrelse mot Figma.
75
+ - ARIA-attributter (`aria-haspopup`, `aria-expanded`, `aria-controls`) satt på `<pkt-button>` flyttes nå automatisk til den indre `<button>`-en, slik at skjermlesere får dem der de hører hjemme. Consent-triggerne har fått `aria-haspopup="dialog"`.
76
+ - React Select: den udokumenterte `options`-propen er fjernet fra typene — den var aldri implementert. Bruk `<option>`-elementer som children.
77
+ - Dokumentasjonen har fått et eget CSP-avsnitt under «Kom i gang», og CSP-seksjoner på header-, footer- og consent-sidene, for dere som bruker komponentene som henter data fra `cdn.web.oslo.kommune.no`.
78
+
79
+ ## Breaking changes:
80
+
81
+ - **Footer:** Custom innhold rendres nå i et sekundært bånd over den nye globale footeren, og footer-markupen/CSS-klassene er skrevet om — egne CSS-overrides mot footer må oppdateres.
82
+ - **Footer:** Lenker med `external: true` viser toppdomene i parentes i stedet for eksternt lenkeikon.
83
+ - **Footer:** Flere deprecated properties.
84
+ - **Alert:** `compact` er deprecated.
85
+ - **React Select:** `options`-propen er fjernet fra typene (var aldri implementert) — bruk `<option>`-children.
86
+ - **CSP:** Global header, footer og consent krever at `cdn.web.oslo.kommune.no` er åpnet i CSP — se dokumentasjonen.
87
+
88
+
89
+ ### Features
90
+ Ingen
91
+
92
+ ### Bug Fixes
93
+ Ingen
94
+
95
+ ### Chores
96
+ Ingen
97
+
98
+ ---
99
+
100
+
101
+ ## [16.27.0](https://github.com/oslokommune/punkt/compare/16.26.4...16.27.0) (2026-07-03)
102
+
103
+ ### ⚠ BREAKING CHANGES
104
+ Ingen
105
+
106
+ ### Features
107
+ Ingen
108
+
109
+ ### Bug Fixes
110
+ * pass through wrapper props in FileUpload (#3540).
111
+
112
+
113
+ ### Chores
114
+ Ingen
115
+
116
+ ---
117
+
118
+
8
119
  ## [16.25.3](https://github.com/oslokommune/punkt/compare/16.25.2...16.25.3) (2026-06-18)
9
120
 
10
121
  ### ⚠ BREAKING CHANGES
@@ -17,5 +17,6 @@ export interface IPktAccordion {
17
17
  }
18
18
  export declare const useAccordionContext: () => {
19
19
  name?: string;
20
+ skin?: TPktAccordionSkin;
20
21
  };
21
22
  export declare const PktAccordion: import('react').ForwardRefExoticComponent<IPktAccordion & import('react').RefAttributes<HTMLDivElement>>;
@@ -6,8 +6,17 @@ export interface IPktAlert extends Omit<HTMLAttributes<HTMLDivElement>, 'title'>
6
6
  title?: ReactNode;
7
7
  date?: string;
8
8
  ariaLive?: TAriaLive;
9
+ /**
10
+ * @deprecated Bruk size i stedet. Uten eksplisitt size gir compact størrelsen 'small'.
11
+ */
9
12
  compact?: boolean;
10
13
  role?: TAlertRole;
14
+ /**
15
+ * Størrelse på varslingen.
16
+ *
17
+ * @default medium
18
+ */
19
+ size?: 'medium' | 'small' | 'xsmall';
11
20
  onClose?: (e: CustomEvent) => void;
12
21
  }
13
22
  export type { TAlertSkin };
@@ -10,7 +10,7 @@ export interface IPktButton extends ButtonHTMLAttributes<HTMLButtonElement> {
10
10
  iconPath?: string;
11
11
  secondIconPath?: string;
12
12
  mode?: 'light' | 'dark';
13
- size?: 'small' | 'medium' | 'large';
13
+ size?: 'xsmall' | 'small' | 'medium' | 'large';
14
14
  fullWidth?: boolean;
15
15
  fullWidthOnMobile?: boolean;
16
16
  color?: 'blue' | 'blue-outline' | 'green' | 'green-outline' | 'green-dark' | 'green-dark-outline' | 'beige-light' | 'beige-dark-outline' | 'yellow' | 'yellow-outline' | 'red' | 'red-outline';
@@ -31,6 +31,7 @@ export interface IPktCombobox {
31
31
  optionalText?: string;
32
32
  tagText?: string;
33
33
  useWrapper?: boolean;
34
+ inputSize?: 'small' | 'medium' | 'xsmall';
34
35
  onChange?: ChangeEventHandler<HTMLInputElement>;
35
36
  onValueChange?: (values: string[]) => void;
36
37
  className?: string;
@@ -76,6 +77,7 @@ export interface IComboboxState {
76
77
  requiredText?: string;
77
78
  tagText?: string;
78
79
  useWrapper: boolean;
80
+ inputSize: 'small' | 'medium' | 'xsmall';
79
81
  name?: string;
80
82
  className?: string;
81
83
  hasCounter: boolean;
@@ -1,5 +1,6 @@
1
1
  import { ChangeEvent, InputHTMLAttributes, ReactNode } from 'react';
2
2
  import { IDatepickerStrings } from '../../shared-types/datepicker';
3
+ import { TPktInputSize } from '../../shared-types/size';
3
4
  export interface IPktDatepicker extends Omit<InputHTMLAttributes<HTMLInputElement>, 'value' | 'onChange'> {
4
5
  id: string;
5
6
  label: string;
@@ -18,6 +19,7 @@ export interface IPktDatepicker extends Omit<InputHTMLAttributes<HTMLInputElemen
18
19
  calendarOpen?: boolean;
19
20
  timezone?: string;
20
21
  fullwidth?: boolean;
22
+ inputSize?: TPktInputSize;
21
23
  hasFieldset?: boolean;
22
24
  inline?: boolean;
23
25
  helptext?: string | ReactNode;
@@ -57,6 +59,7 @@ export interface IDatepickerState {
57
59
  name?: string;
58
60
  placeholder?: string;
59
61
  fullwidth: boolean;
62
+ inputSize: TPktInputSize;
60
63
  hasFieldset: boolean;
61
64
  inline: boolean;
62
65
  helptext?: string | ReactNode;
@@ -60,10 +60,20 @@ interface IBaseFileUploadProps extends Omit<InputHTMLAttributes<HTMLInputElement
60
60
  label?: string;
61
61
  /** Help text under the label. */
62
62
  helptext?: string | ReactNode;
63
- /** Show "Valgfritt" tag in wrapper. */
63
+ /** Expandable help text (dropdown). */
64
+ helptextDropdown?: string | ReactNode;
65
+ /** Button label for expandable help text. */
66
+ helptextDropdownButton?: string;
67
+ /** Shows an "optional" tag. */
64
68
  optionalTag?: boolean;
65
- /** Show "Må fylles ut" tag in wrapper. */
69
+ /** Label text for the optional tag. */
70
+ optionalText?: string;
71
+ /** Shows a "required" tag. */
66
72
  requiredTag?: boolean;
73
+ /** Label text for the required tag. */
74
+ requiredText?: string;
75
+ /** Extra tag next to the label. */
76
+ tagText?: string | null;
67
77
  /** Marks the upload as required. Native validation is used in `form`; submit validation in `custom`. */
68
78
  required?: boolean;
69
79
  /** Enable image preview modal (only applies to thumbnail renderer). */
@@ -1,36 +1,14 @@
1
1
  import { FC, HTMLAttributes } from 'react';
2
- interface Link {
3
- href: string;
4
- text: string;
5
- external?: boolean;
6
- openInNewTab?: boolean;
7
- }
8
- interface Column {
9
- title: string;
10
- links?: Link[];
11
- text?: string;
12
- }
13
- interface SocialLink {
14
- href: string;
15
- iconName?: string;
16
- language?: string;
17
- openInNewTab?: boolean;
18
- }
19
- export interface IPktFooter extends HTMLAttributes<HTMLDivElement> {
20
- columnOne: Column;
21
- columnTwo: Column;
22
- socialLinks?: SocialLink[];
23
- personvernOgInfoLink?: string;
24
- tilgjengelighetLink?: string;
25
- openLinksInNewTab?: boolean;
26
- includeConsent?: boolean;
27
- hotjarId?: string | null;
28
- googleAnalyticsId?: string | null;
29
- devMode?: boolean;
30
- cookieDomain?: string | null;
31
- cookieSecure?: string | null;
32
- cookieExpiryDays?: string | null;
33
- onToggleConsent?: (e: CustomEvent) => void;
34
- }
2
+ import { IPktFooterProps } from '../../shared-types';
3
+ import { TFooterConsentConfig } from './FooterGlobal';
4
+ export interface IPktFooter extends IPktFooterProps<string>, TFooterConsentConfig, Omit<HTMLAttributes<HTMLElement>, 'children'> {
5
+ /** Kalles når henting fra endepunktet feiler (den globale footeren skjules stille). */
6
+ onDataError?: (error: Error) => void;
7
+ }
8
+ /**
9
+ * PktFooter — footer med valgfritt custom innhold (grått sekundær-bånd)
10
+ * stablet oppå den globale (blå) footeren. Uten custom innhold rendres kun
11
+ * den globale. Den globale henter innhold fra Oslo kommunes felles
12
+ * header/footer-endepunkt (samme som PktHeader type="global").
13
+ */
35
14
  export declare const PktFooter: FC<IPktFooter>;
36
- export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ import { FC } from 'react';
2
+ import { IHeaderFooter, THeaderFooterApi, THeaderMenuLocale } from '../../shared-types';
3
+ import { IPktConsent } from '../consent/Consent';
4
+ export type TFooterConsentConfig = Pick<IPktConsent, 'hotjarId' | 'googleAnalyticsId' | 'devMode' | 'cookieDomain' | 'cookieSecure' | 'cookieExpiryDays' | 'onToggleConsent'>;
5
+ interface IUseGlobalFooterDataOptions {
6
+ data?: THeaderFooterApi<string>;
7
+ dataUrl?: string;
8
+ locale?: THeaderMenuLocale;
9
+ skipGlobal?: boolean;
10
+ onDataError?: (error: Error) => void;
11
+ }
12
+ export declare function useGlobalFooterData({ data, dataUrl, locale, skipGlobal, onDataError, }: IUseGlobalFooterDataOptions): IHeaderFooter | undefined;
13
+ interface IFooterGlobalProps {
14
+ footer: IHeaderFooter;
15
+ includeConsent?: boolean;
16
+ consent?: TFooterConsentConfig;
17
+ }
18
+ /**
19
+ * The global (blue) footer band, fed by the shared header/footer payload.
20
+ * Internal — rendered by PktFooter / PktFooterSimple, not exported.
21
+ */
22
+ export declare const FooterGlobal: FC<IFooterGlobalProps>;
23
+ export {};
@@ -1,21 +1,24 @@
1
1
  import { FC, HTMLAttributes } from 'react';
2
- export interface IPktFooterSimple extends HTMLAttributes<HTMLDivElement> {
3
- links?: Array<{
4
- href: string;
5
- text: string;
6
- external?: boolean;
7
- openInNewTab?: boolean;
8
- }>;
2
+ import { IPktFooterSimpleProps } from '../../shared-types';
3
+ import { TFooterConsentConfig } from '../footer/FooterGlobal';
4
+ export interface IPktFooterSimple extends IPktFooterSimpleProps<string>, TFooterConsentConfig, Omit<HTMLAttributes<HTMLElement>, 'children'> {
5
+ onDataError?: (error: Error) => void;
6
+ /**
7
+ * @deprecated The privacy link now comes from the global footer's payload.
8
+ * Only rendered (in the secondary footer) when explicitly set to a
9
+ * non-default value.
10
+ */
9
11
  personvernOgInfoLink?: string;
12
+ /**
13
+ * @deprecated The accessibility link now comes from the global footer's
14
+ * payload. Only rendered (in the secondary footer) when explicitly set
15
+ * to a non-default value.
16
+ */
10
17
  tilgjengelighetLink?: string;
11
- openLinksInNewTab?: boolean;
12
- includeConsent?: boolean;
13
- hotjarId?: string | null;
14
- googleAnalyticsId?: string | null;
15
- devMode?: boolean;
16
- cookieDomain?: string | null;
17
- cookieSecure?: string | null;
18
- cookieExpiryDays?: string | null;
19
- onToggleConsent?: (e: CustomEvent) => void;
20
18
  }
19
+ /**
20
+ * PktFooterSimple — kompakt footer: en sentrert rad med pil-lenker i det
21
+ * grå sekundær-båndet, stablet oppå den globale (blå) footeren. Uten
22
+ * `links` rendres kun den globale footeren.
23
+ */
21
24
  export declare const PktFooterSimple: FC<IPktFooterSimple>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,16 @@
1
- import { IPktHeader } from './types';
1
+ import { IPktHeader, IPktHeaderGlobal } from './types';
2
2
  export * from './types';
3
+ /**
4
+ * Props for `<PktHeader>`. The `type` prop selects the variant:
5
+ * the default `service` header (a single service's header) or the
6
+ * `global` (kommune-wide) header driven by the shared header/footer
7
+ * payload.
8
+ */
9
+ export type IPktHeaderProps = (IPktHeader & {
10
+ type?: 'service';
11
+ }) | (IPktHeaderGlobal & {
12
+ type: 'global';
13
+ });
3
14
  /**
4
15
  * PktHeader - Main header component for Oslo kommune services
5
16
  *
@@ -10,6 +21,7 @@ export * from './types';
10
21
  * - Responsive mobile menu
11
22
  * - Fixed positioning with scroll-to-hide
12
23
  *
13
- * TODO: Add `type` prop to switch between `service` and `global` header types
24
+ * The `type` prop switches between the `service` header (default) and
25
+ * the `global` (kommune-wide) header.
14
26
  */
15
- export declare const PktHeader: import('react').ForwardRefExoticComponent<IPktHeader & import('react').RefAttributes<HTMLDivElement>>;
27
+ export declare const PktHeader: import('react').ForwardRefExoticComponent<IPktHeaderProps & import('react').RefAttributes<HTMLElement>>;
@@ -0,0 +1,2 @@
1
+ import { IPktHeaderGlobal } from './types';
2
+ export declare const PktHeaderGlobal: import('react').ForwardRefExoticComponent<IPktHeaderGlobal & import('react').RefAttributes<HTMLElement>>;
File without changes
@@ -1,6 +1,8 @@
1
1
  import { MouseEvent, ReactNode } from 'react';
2
- import { THeaderMenu, THeaderPosition, THeaderScrollBehavior, TLogOutButtonPlacement, TSlotMenuVariant } from '../../shared-types';
3
- export type { THeaderMenu, THeaderPosition, THeaderScrollBehavior, TLogOutButtonPlacement, TSlotMenuVariant, };
2
+ import { THeaderMenu, THeaderPosition, THeaderScrollBehavior, TLogOutButtonPlacement, TSlotMenuVariant, THeaderFooterApi, THeaderMenuLocale, IPktHeaderGlobal as ISharedPktHeaderGlobal } from '../../shared-types';
3
+ export type { THeaderMenu, THeaderPosition, THeaderScrollBehavior, TLogOutButtonPlacement, TSlotMenuVariant, THeaderFooterApi, THeaderMenuLocale, };
4
+ /** Which header variant `<PktHeader>` renders. */
5
+ export type THeaderType = 'service' | 'global';
4
6
  /** User object for header components */
5
7
  export interface User {
6
8
  name: string;
@@ -90,4 +92,30 @@ export interface IPktHeader {
90
92
  slotMenuVariant?: TSlotMenuVariant;
91
93
  /** Text for the slot menu button in tablet/mobile mode. Default: 'Meny' */
92
94
  slotMenuText?: string;
95
+ /** Which header variant to render. Default: 'service' */
96
+ type?: THeaderType;
97
+ }
98
+ /**
99
+ * Props for the global (kommune-wide) Header component.
100
+ *
101
+ * Extends the framework-agnostic {@link ISharedPktHeaderGlobal} base
102
+ * (in shared-types) with React-specific callbacks and DOM props.
103
+ */
104
+ export interface IPktHeaderGlobal extends ISharedPktHeaderGlobal {
105
+ /** Additional CSS class name(s) to apply to the header */
106
+ className?: string;
107
+ /** Set dark mode on the header */
108
+ 'data-mode'?: 'dark';
109
+ /** Callback when the logo is clicked */
110
+ logoClick?: (event: MouseEvent) => void;
111
+ /** Callback when the user submits search. When set, navigation is left to the consumer */
112
+ onSearch?: (query: string) => void;
113
+ /** Callback when the user clicks "Endre organisasjon" */
114
+ changeRepresentation?: () => void;
115
+ /** Callback when the user clicks logout */
116
+ logOut?: () => void;
117
+ /** Fired when the payload has been fetched (or `data` was supplied) */
118
+ onDataLoaded?: (data: THeaderFooterApi) => void;
119
+ /** Fired when the fetch fails */
120
+ onDataError?: (error: Error) => void;
93
121
  }
@@ -8,8 +8,6 @@ export interface IPktHeaderMenu extends Omit<HTMLAttributes<HTMLElement>, 'onErr
8
8
  onDataLoaded?: (data: THeaderFooterApi) => void;
9
9
  /** Fired when the fetch fails. */
10
10
  onDataError?: (error: Error) => void;
11
- /** Optional id of the toggle button that controls this menu. */
12
- ariaLabelledBy?: string;
13
11
  }
14
12
  /**
15
13
  * `<PktHeaderMenu>` — global mega menu for Oslo kommune.
@@ -17,10 +15,10 @@ export interface IPktHeaderMenu extends Omit<HTMLAttributes<HTMLElement>, 'onErr
17
15
  * Fetches the live header/footer payload on mount and renders the
18
16
  * `megamenu` slice for the current locale. Mirrors `pkt-header-menu`
19
17
  * (Punkt Elements) — both implementations share types and data
20
- * helpers from `shared-utils/header-menu`.
18
+ * helpers from `shared-utils/header-footer`.
21
19
  *
22
20
  * This component is purely presentational with respect to focus/scroll-lock;
23
21
  * the parent header is expected to control `open` and own focus
24
22
  * management.
25
23
  */
26
- export declare const PktHeaderMenu: ({ dataUrl, data, locale, open, mobileBreakpoint, ariaLabelledBy, className, onDataLoaded, onDataError, ref, ...rest }: IPktHeaderMenu) => import("react").JSX.Element;
24
+ export declare const PktHeaderMenu: ({ dataUrl, data, locale, open, mobileBreakpoint, className, onDataLoaded, onDataError, ref, ...rest }: IPktHeaderMenu) => import("react").JSX.Element;
@@ -13,8 +13,11 @@ export { PktDatepicker } from './datepicker/Datepicker';
13
13
  export { PktFileUpload } from './fileupload/FileUpload';
14
14
  export { ItemRenderers } from './fileupload/QueueDisplay';
15
15
  export { PktFooter } from './footer/Footer';
16
+ export type { IPktFooter } from './footer/Footer';
16
17
  export { PktFooterSimple } from './footerSimple/FooterSimple';
18
+ export type { IPktFooterSimple } from './footerSimple/FooterSimple';
17
19
  export { PktHeader } from './header/Header';
20
+ export { PktHeaderGlobal } from './header/HeaderGlobal';
18
21
  export { PktHeaderMenu } from './header-menu/HeaderMenu';
19
22
  export { PktHeaderService } from './header/HeaderService';
20
23
  export { PktHeading } from './heading/Heading';
@@ -32,6 +35,7 @@ export { PktRadioButton } from './radio/RadioButton';
32
35
  export { PktSearchInput } from './searchinput/SearchInput';
33
36
  export type { PktSearchInputSuggestion } from './searchinput/SearchInput';
34
37
  export { PktSelect } from './select/Select';
38
+ export type { IPktSelectOption, TSelectOption } from './select/Select';
35
39
  export { PktStep } from './stepper/Step';
36
40
  export { PktStepper } from './stepper/Stepper';
37
41
  export { PktTable } from './table/Table';
@@ -24,5 +24,6 @@ export interface IPktInputWrapper extends RefAttributes<HTMLElement> {
24
24
  hasFieldset?: boolean;
25
25
  role?: string;
26
26
  counterPosition?: 'top' | 'bottom';
27
+ size?: 'small' | 'medium' | 'xsmall';
27
28
  }
28
29
  export declare const PktInputWrapper: import('react').ForwardRefExoticComponent<Omit<IPktInputWrapper, "ref"> & RefAttributes<HTMLDivElement>>;
@@ -11,6 +11,7 @@ export type PktSearchInputSuggestion = Omit<IPktSearchInputSuggestion, 'title' |
11
11
  };
12
12
  interface ISearch extends HTMLProps<HTMLInputElement> {
13
13
  appearance?: 'local' | 'local-with-button' | 'global';
14
+ inputSize?: 'small' | 'medium' | 'xsmall';
14
15
  disabled?: boolean;
15
16
  fullwidth?: boolean;
16
17
  id: string;
@@ -1,6 +1,5 @@
1
1
  import { ReactNode, SelectHTMLAttributes } from 'react';
2
- import { TSelectOption } from '../../shared-types';
3
- export type { TSelectOption };
2
+ export type { IPktSelectOption, TSelectOption } from '../../shared-types/select';
4
3
  export interface IPktSelectProps extends SelectHTMLAttributes<HTMLSelectElement> {
5
4
  ariaDescribedby?: string;
6
5
  ariaLabelledby?: string;
@@ -21,10 +20,8 @@ export interface IPktSelectProps extends SelectHTMLAttributes<HTMLSelectElement>
21
20
  requiredTag?: boolean;
22
21
  requiredText?: string;
23
22
  tagText?: string | null;
24
- options?: Array<{
25
- value: string;
26
- label: string;
27
- disabled?: boolean;
28
- }>;
23
+ inputSize?: 'small' | 'medium' | 'xsmall';
24
+ /** @deprecated Var aldri implementert — bruk children med `<option>`-elementer. */
25
+ options?: never;
29
26
  }
30
27
  export declare const PktSelect: import('react').ForwardRefExoticComponent<IPktSelectProps & import('react').RefAttributes<HTMLSelectElement>>;
@@ -1,4 +1,5 @@
1
1
  import { ChangeEventHandler, ReactNode, TextareaHTMLAttributes } from 'react';
2
+ import { TPktInputSize } from '../../shared-types/size';
2
3
  export interface IPktTextarea extends TextareaHTMLAttributes<HTMLTextAreaElement> {
3
4
  id: string;
4
5
  ariaDescribedby?: string;
@@ -30,6 +31,7 @@ export interface IPktTextarea extends TextareaHTMLAttributes<HTMLTextAreaElement
30
31
  readOnly?: boolean;
31
32
  required?: boolean;
32
33
  skipForwardTestid?: boolean;
34
+ inputSize?: TPktInputSize;
33
35
  onChange?: ChangeEventHandler<HTMLTextAreaElement>;
34
36
  }
35
37
  export declare const PktTextarea: import('react').ForwardRefExoticComponent<IPktTextarea & import('react').RefAttributes<HTMLTextAreaElement>>;
@@ -40,5 +40,6 @@ export interface IPktTextinput extends InputHTMLAttributes<HTMLInputElement> {
40
40
  dataTestid?: string;
41
41
  onChange?: ChangeEventHandler<HTMLInputElement>;
42
42
  skipForwardTestid?: boolean;
43
+ inputSize?: 'small' | 'medium' | 'xsmall';
43
44
  }
44
45
  export declare const PktTextinput: import('react').ForwardRefExoticComponent<IPktTextinput & import('react').RefAttributes<HTMLInputElement>>;
@@ -1,4 +1,5 @@
1
1
  import { ChangeEvent, FocusEvent, InputHTMLAttributes, ReactNode } from 'react';
2
+ import { TPktInputSize } from '../../shared-types/size';
2
3
  import { ITimepickerStrings } from '../../shared-types/timepicker';
3
4
  /**
4
5
  * Props for {@link PktTimepicker}: a React time picker with `HH:MM`, aligned with Elements `pkt-timepicker`.
@@ -78,4 +79,6 @@ export interface IPktTimepicker extends Omit<InputHTMLAttributes<HTMLInputElemen
78
79
  onBlur?: (e: FocusEvent<Element>) => void;
79
80
  /** Extra class names on the root (`pkt-timepicker`). */
80
81
  className?: string;
82
+ /** Size of the Timepicker component. */
83
+ inputSize?: TPktInputSize;
81
84
  }
@@ -1,9 +1,11 @@
1
1
  import { KeyboardEvent } from 'react';
2
2
  import { IPktTimepicker } from './types';
3
+ import { TPktInputSize } from '../../shared-types/size';
3
4
  export declare function useTimepickerState(props: IPktTimepicker, ref: React.ForwardedRef<HTMLDivElement>): {
4
5
  id: string;
5
6
  containerRef: import('react').RefObject<HTMLDivElement | null>;
6
7
  outerClasses: string;
8
+ inputSize: TPktInputSize;
7
9
  strings: import('../../../../../shared-types').ITimepickerStrings;
8
10
  label: string;
9
11
  disabled: boolean;