@oslokommune/punkt-elements 13.22.0 → 14.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.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,50 @@ og skriver commits ca etter [Conventional Commits](https://conventionalcommits.o
5
5
 
6
6
  ---
7
7
 
8
+ ## [14.0.0](https://github.com/oslokommune/punkt/compare/13.22.0...14.0.0) (2026-02-02)
9
+
10
+ ### ⚠ BREAKING CHANGES
11
+ * Header (Service) (#3192) Nå også som custom element!. BREAKING CHANGE: Fjernet 'logIn' event (kun 'logOut' støttes nå)
12
+ BREAKING CHANGE: Erstattet 'fixed' prop med 'position' (verdier: 'fixed' | 'relative', default: 'fixed')
13
+ BREAKING CHANGE: Erstattet 'scrollToHide' prop med 'scrollBehavior' (verdier: 'hide' | 'none', default: 'hide')
14
+ BREAKING CHANGE: Erstattet 'showLogOutButton' med 'logOutButtonPlacement' (verdier: 'userMenu' | 'header' | 'both' | 'none', default: 'none')
15
+ BREAKING CHANGE: Fjernet 'showMenuButton' prop
16
+ BREAKING CHANGE: Fjernet 'user.shortname' fra user-objektet
17
+ BREAKING CHANGE: Fjernet 'representing.shortname' fra representing-objektet
18
+ BREAKING CHANGE: Endret 'userMenu.items.target' type fra 'string' til 'string | function'
19
+ BREAKING CHANGE: Utdatert 'userMenuFooter' og 'userOptions' props (bruk 'userMenu' i stedet)
20
+ BREAKING CHANGE: Fjernet default verdi for 'logoLink' (var `https://www.oslo.kommune.no/`)
21
+
22
+ NYE FEATURES:
23
+ - Lagt til søkefunksjonalitet med props: 'showSearch', 'searchPlaceholder', 'searchValue'
24
+ - Nye events: 'onSearch' og 'onSearchChange' for søkeinteraksjon
25
+ - Nye events: 'logoClick' og 'serviceClick' for klikkhåndtering
26
+ - Nye React-props: 'logoClick' og 'serviceClick' callbacks
27
+ - Lagt til 'serviceLink' prop for tjenestenavnlenke
28
+ - Lagt til 'hideLogo' prop for å skjule Oslo-logoen
29
+ - Lagt til 'compact' prop for kompakt header-høyde
30
+ - Lagt til 'mobileBreakpoint' prop (default: 768px) for mobil-layout
31
+ - Lagt til 'tabletBreakpoint' prop (default: 1280px) for tablet-layout
32
+ - Lagt til 'openedMenu' prop for å kontrollere hvilken meny som er åpen ved oppstart
33
+
34
+ FUNKSJONELLE ENDRINGER:
35
+ - Alle events har nå 'attribute' felt for custom element-støtte
36
+ - Forbedret type-dokumentasjon for 'user.lastLoggedIn' (string | Date)
37
+ - Forbedret type-dokumentasjon for 'representing.orgNumber' (string | number)
38
+
39
+
40
+ ### Features
41
+ Ingen
42
+
43
+ ### Bug Fixes
44
+ Ingen
45
+
46
+ ### Chores
47
+ Ingen
48
+
49
+ ---
50
+
51
+
8
52
  ## [13.22.0](https://github.com/oslokommune/punkt/compare/13.21.0...13.22.0) (2026-01-30)
9
53
 
10
54
  ### ⚠ BREAKING CHANGES
@@ -0,0 +1 @@
1
+ export { }
package/dist/index.d.ts CHANGED
@@ -11,8 +11,14 @@ declare type Booleanish = boolean | 'true' | 'false';
11
11
 
12
12
  declare type Booleanish_2 = boolean | 'true' | 'false';
13
13
 
14
+ /**
15
+ * Booleanish type that accepts boolean or string "true"/"false"
16
+ * This allows attributes to be set as strings in HTML
17
+ */
14
18
  declare type Booleanish_3 = boolean | 'true' | 'false';
15
19
 
20
+ declare type Booleanish_4 = boolean | 'true' | 'false';
21
+
16
22
  /**
17
23
  * We define all props as optional. Native HTML attributes are optional by default,
18
24
  * but the TS definition require either null or value. This way we can support showing a value as optional
@@ -207,6 +213,95 @@ export declare interface IPktConsent {
207
213
  triggerText?: string | null;
208
214
  }
209
215
 
216
+ /**
217
+ * Interface for the Header component props
218
+ */
219
+ export declare interface IPktHeader {
220
+ /** Hide the Oslo logo */
221
+ hideLogo?: Booleanish_3;
222
+ /** Logo link URL */
223
+ logoLink?: string;
224
+ /** Service name displayed in the header */
225
+ serviceName?: string;
226
+ /** Service link URL */
227
+ serviceLink?: string;
228
+ /** Use compact header height */
229
+ compact?: Booleanish_3;
230
+ /** Header position. 'fixed' fixes to top of viewport, 'relative' follows document flow. Default: 'fixed' */
231
+ position?: THeaderPosition;
232
+ /** Scroll behavior. 'hide' hides header on scroll down, 'none' keeps it visible. Default: 'hide' */
233
+ scrollBehavior?: THeaderScrollBehavior;
234
+ /** User object for logged-in user */
235
+ user?: IPktHeaderUser;
236
+ /** User menu items */
237
+ userMenu?: IPktHeaderUserMenuItem[];
238
+ /** Representation object */
239
+ representing?: IPktHeaderRepresenting;
240
+ /** Allow user to change representation */
241
+ canChangeRepresentation?: Booleanish_3;
242
+ /** Logout button placement */
243
+ logOutButtonPlacement?: TPktHeaderLogOutButtonPlacement;
244
+ /** Whether there's a logout handler attached (required for logout button to show) */
245
+ hasLogOut?: Booleanish_3;
246
+ /** Show search field */
247
+ showSearch?: Booleanish_3;
248
+ /** Search field placeholder */
249
+ searchPlaceholder?: string;
250
+ /** Controlled search value */
251
+ searchValue?: string;
252
+ /** Custom breakpoint for responsive behavior in pixels. Default: 1024 */
253
+ mobileBreakpoint?: number;
254
+ /** Custom breakpoint for tablet responsive behavior in pixels. Default: 1280 */
255
+ tabletBreakpoint?: number;
256
+ /** Which menu is initially open */
257
+ openedMenu?: TPktHeaderMenu;
258
+ }
259
+
260
+ /**
261
+ * Representation object containing information about the organization/entity being represented
262
+ */
263
+ export declare interface IPktHeaderRepresenting {
264
+ /** Name of the organization or entity */
265
+ name: string;
266
+ /** Short name or initials (deprecated) */
267
+ shortname?: string;
268
+ /** Organization number */
269
+ orgNumber?: string | number;
270
+ }
271
+
272
+ /**
273
+ * User object containing information about the logged-in user
274
+ */
275
+ export declare interface IPktHeaderUser {
276
+ /** Full name of the user */
277
+ name: string;
278
+ /** Short name or initials (deprecated) */
279
+ shortname?: string;
280
+ /** Last login timestamp (ISO string or Date) */
281
+ lastLoggedIn?: Date | string;
282
+ }
283
+
284
+ declare interface IPktHeaderUserMenu {
285
+ user: IPktHeaderUser;
286
+ formattedLastLoggedIn?: string;
287
+ representing?: IPktHeaderRepresenting;
288
+ userMenu?: IPktHeaderUserMenuItem[];
289
+ canChangeRepresentation?: Booleanish_3;
290
+ logoutOnClick?: Booleanish_3;
291
+ }
292
+
293
+ /**
294
+ * Menu item in the user menu
295
+ */
296
+ export declare interface IPktHeaderUserMenuItem {
297
+ /** Icon name to display */
298
+ iconName?: PktIconName;
299
+ /** Text for the menu item */
300
+ title: string;
301
+ /** Link URL or click handler function */
302
+ target: string | (() => void);
303
+ }
304
+
210
305
  export declare interface IPktHeading {
211
306
  size?: TPktHeadingSize;
212
307
  level?: TPktHeadingLevel;
@@ -899,6 +994,149 @@ declare class PktElement<T = {}> extends PktShadowElement<T> {
899
994
  createRenderRoot(): this;
900
995
  }
901
996
 
997
+ /**
998
+ * PktHeader - Main header component for Oslo kommune services
999
+ *
1000
+ * This component provides a complete header solution with:
1001
+ * - Logo and service name
1002
+ * - User menu with login/logout functionality
1003
+ * - Search functionality
1004
+ * - Responsive mobile menu
1005
+ * - Fixed positioning with scroll-to-hide
1006
+ *
1007
+ * TODO: Add `type` prop to switch between `service` and `global` header types
1008
+ */
1009
+ export declare class PktHeader extends PktElement<IPktHeader> implements IPktHeader {
1010
+ defaultSlot: Ref<HTMLElement>;
1011
+ slotController: PktSlotController;
1012
+ serviceName?: string;
1013
+ serviceLink?: string;
1014
+ logoLink?: string;
1015
+ searchPlaceholder: string;
1016
+ searchValue: string;
1017
+ mobileBreakpoint: number;
1018
+ tabletBreakpoint: number;
1019
+ openedMenu: TPktHeaderMenu;
1020
+ logOutButtonPlacement: TPktHeaderLogOutButtonPlacement;
1021
+ position: THeaderPosition;
1022
+ scrollBehavior: THeaderScrollBehavior;
1023
+ hideLogo: Booleanish_3;
1024
+ compact: Booleanish_3;
1025
+ showSearch: Booleanish_3;
1026
+ canChangeRepresentation: Booleanish_3;
1027
+ hasLogOut: Booleanish_3;
1028
+ user?: IPktHeaderUser;
1029
+ userMenu?: IPktHeaderUserMenuItem[];
1030
+ representing?: IPktHeaderRepresenting;
1031
+ userMenuFooter?: IPktHeaderUserMenuItem[];
1032
+ userOptions?: IPktHeaderUserMenuItem[];
1033
+ constructor();
1034
+ firstUpdated(changedProperties: PropertyValues): void;
1035
+ private emitDeprecationWarnings;
1036
+ /**
1037
+ * Convert deprecated props to new props
1038
+ */
1039
+ private get effectiveUserMenu();
1040
+ render(): TemplateResult<1>;
1041
+ }
1042
+
1043
+ export declare class PktHeaderService extends PktElement<IPktHeader> implements IPktHeader {
1044
+ serviceName?: string;
1045
+ serviceLink?: string;
1046
+ logoLink?: string;
1047
+ searchPlaceholder: string;
1048
+ searchValue: string;
1049
+ mobileBreakpoint: number;
1050
+ tabletBreakpoint: number;
1051
+ openedMenu: TPktHeaderMenu;
1052
+ logOutButtonPlacement: TPktHeaderLogOutButtonPlacement;
1053
+ position: THeaderPosition;
1054
+ scrollBehavior: THeaderScrollBehavior;
1055
+ hideLogo: Booleanish_3;
1056
+ compact: Booleanish_3;
1057
+ showSearch: Booleanish_3;
1058
+ canChangeRepresentation: Booleanish_3;
1059
+ hasLogOut: Booleanish_3;
1060
+ user?: IPktHeaderUser;
1061
+ userMenu?: IPktHeaderUserMenuItem[];
1062
+ representing?: IPktHeaderRepresenting;
1063
+ private isMobile;
1064
+ private isTablet;
1065
+ private openMenu;
1066
+ private isHidden;
1067
+ private componentWidth;
1068
+ private hasSlotContent;
1069
+ private alignSlotRight;
1070
+ private alignSearchRight;
1071
+ defaultSlot: Ref<HTMLElement>;
1072
+ slotController: PktSlotController;
1073
+ private headerRef;
1074
+ private userContainerRef;
1075
+ private slotContainerRef;
1076
+ private searchContainerRef;
1077
+ private slotContentRef;
1078
+ private searchMenuRef;
1079
+ private resizeObserver?;
1080
+ private lastScrollPosition;
1081
+ private savedScrollY;
1082
+ private lastFocusedElement;
1083
+ private shouldRestoreFocus;
1084
+ constructor();
1085
+ updateSlots(filledSlots: Set<string | null | undefined>): void;
1086
+ connectedCallback(): void;
1087
+ disconnectedCallback(): void;
1088
+ firstUpdated(): void;
1089
+ updated(changedProperties: PropertyValues): void;
1090
+ private setupResizeObserver;
1091
+ private updateIsMobile;
1092
+ private updateIsTablet;
1093
+ private updateScrollLock;
1094
+ private lockScroll;
1095
+ private unlockScroll;
1096
+ private setupScrollListener;
1097
+ private handleScroll;
1098
+ private handleClickOutside;
1099
+ private handleFocusOut;
1100
+ private handleEscapeKey;
1101
+ private restoreFocus;
1102
+ private checkDropdownAlignment;
1103
+ private handleMenuToggle;
1104
+ private handleLogoClick;
1105
+ private handleServiceClick;
1106
+ private handleLogout;
1107
+ private handleSearch;
1108
+ private handleSearchChange;
1109
+ private handleSearchInputChange;
1110
+ private handleSearchKeyDown;
1111
+ private get formattedLastLoggedIn();
1112
+ private get isFixed();
1113
+ private get shouldHideOnScroll();
1114
+ private get showLogoutInHeader();
1115
+ private get showLogoutInUserMenu();
1116
+ private renderLogo;
1117
+ private renderServiceName;
1118
+ private renderSlotContainer;
1119
+ private renderSearch;
1120
+ private renderUserButton;
1121
+ private renderHeader;
1122
+ render(): TemplateResult<1>;
1123
+ }
1124
+
1125
+ export declare class PktHeaderUserMenu extends PktElement<IPktHeaderUserMenu> implements IPktHeaderUserMenu {
1126
+ user: IPktHeaderUser;
1127
+ formattedLastLoggedIn?: string;
1128
+ representing?: IPktHeaderRepresenting;
1129
+ userMenu?: IPktHeaderUserMenuItem[];
1130
+ canChangeRepresentation: Booleanish_3;
1131
+ logoutOnClick: Booleanish_3;
1132
+ private handleChangeRepresentation;
1133
+ private handleLogout;
1134
+ private handleMenuItemClick;
1135
+ private renderLinkOrButton;
1136
+ private renderLinkSection;
1137
+ render(): TemplateResult<1>;
1138
+ }
1139
+
902
1140
  export declare class PktHeading extends PktShadowElement<IPktHeading> implements IPktHeading {
903
1141
  size: TPktHeadingSize | undefined;
904
1142
  level: TPktHeadingLevel;
@@ -1026,7 +1264,7 @@ export declare class PktInputWrapper extends PktElement<Props_6> {
1026
1264
  ariaDescribedby: string | undefined;
1027
1265
  hasFieldset: boolean;
1028
1266
  role: string | null;
1029
- useWrapper: Booleanish_3;
1267
+ useWrapper: Booleanish_4;
1030
1268
  protected updated(changedProperties: PropertyValues): void;
1031
1269
  render(): TemplateResult<1>;
1032
1270
  private toggleDropdown;
@@ -1460,6 +1698,16 @@ declare type TCounterPosition = 'top' | 'bottom';
1460
1698
 
1461
1699
  declare type TDay = `${number}${number}`;
1462
1700
 
1701
+ /**
1702
+ * Position options for header
1703
+ */
1704
+ declare type THeaderPosition = 'fixed' | 'relative';
1705
+
1706
+ /**
1707
+ * Scroll behavior options for header
1708
+ */
1709
+ declare type THeaderScrollBehavior = 'hide' | 'none';
1710
+
1463
1711
  declare type TISODate = `${TYear}-${TMonth}-${TDay}`;
1464
1712
 
1465
1713
  declare type TLayout = 'vertical' | 'horizontal';
@@ -1488,6 +1736,16 @@ export declare type TPktButtonVariant = 'label-only' | 'icon-left' | 'icon-right
1488
1736
 
1489
1737
  export declare type TPktComboboxTagPlacement = 'inside' | 'outside';
1490
1738
 
1739
+ /**
1740
+ * Type for logout button placement
1741
+ */
1742
+ export declare type TPktHeaderLogOutButtonPlacement = 'userMenu' | 'header' | 'both' | 'none';
1743
+
1744
+ /**
1745
+ * Type for which menu is currently open
1746
+ */
1747
+ export declare type TPktHeaderMenu = 'none' | 'slot' | 'search' | 'user';
1748
+
1491
1749
  export declare type TPktHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;
1492
1750
 
1493
1751
  export declare type TPktHeadingSize = 'xsmall' | 'small' | 'medium' | 'large' | 'xlarge';