@statsbygg/layout 0.0.16 → 0.1.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.
@@ -1,6 +1,7 @@
1
1
  .header {
2
2
  background-color: var(--ds-color-accent-surface-tinted);
3
3
  border-bottom: 1px solid var(--ds-color-neutral-border-subtle);
4
+ position: sticky;
4
5
  top: 0;
5
6
  z-index: 100;
6
7
  }
@@ -34,23 +35,27 @@
34
35
  min-height: inherit;
35
36
  }
36
37
 
37
- .searchInput {
38
- min-width: 12.5rem;
39
- display: flex;
38
+ .searchButton {
39
+ display: inline-flex;
40
40
  align-items: center;
41
+ gap: var(--ds-spacing-2, 0.5rem);
42
+ }
43
+
44
+ .themeToggleButton {
45
+ background: transparent;
41
46
  }
42
47
 
43
48
  @media (max-width: 768px) {
44
- .container {
49
+ .headerContainer {
45
50
  padding: 0 var(--ds-spacing-4);
46
51
  }
47
52
 
48
- .topBar {
53
+ .topBarContainer {
49
54
  flex-wrap: wrap;
50
55
  padding: var(--ds-spacing-4) 0;
51
56
  }
52
57
 
53
- .actions {
58
+ .actionsContainer {
54
59
  order: 3;
55
60
  width: 100%;
56
61
  flex-direction: column;
@@ -61,9 +66,4 @@
61
66
  width: 100%;
62
67
  min-width: auto;
63
68
  }
64
-
65
- .menuButton {
66
- width: 100%;
67
- justify-content: center;
68
- }
69
69
  }
@@ -1,41 +0,0 @@
1
- .userInfo {
2
- display: flex;
3
- flex-direction: column;
4
- gap: var(--ds-spacing-1);
5
- padding: var(--ds-spacing-2) var(--ds-spacing-3);
6
- }
7
-
8
- .userName {
9
- font-size: var(--ds-font-size-sm);
10
- font-weight: var(--ds-font-weight-medium);
11
- color: var(--ds-color-neutral-text-default);
12
- }
13
-
14
- .userEmail {
15
- font-size: var(--ds-font-size-xs);
16
- color: var(--ds-color-neutral-text-subtle);
17
- }
18
-
19
- .menuButton {
20
- background-color: var(--ds-color-neutral-base-default);
21
- }
22
-
23
- .devContainer {
24
- display: flex;
25
- gap: var(--ds-spacing-4);
26
- padding: var(--ds-spacing-2);
27
- }
28
-
29
- .zoneSection {
30
- flex: 1;
31
- min-width: 12rem;
32
- }
33
-
34
- .zoneTitle {
35
- font-weight: 600;
36
- padding: var(--ds-spacing-2);
37
- color: var(--ds-color-neutral-text-default);
38
- border-bottom: 1px solid var(--ds-color-neutral-border-subtle);
39
- margin-bottom: var(--ds-spacing-2);
40
- text-transform: capitalize;
41
- }
@@ -0,0 +1,224 @@
1
+ .menuOverlay {
2
+ position: fixed;
3
+ top: 5rem;
4
+ left: 0;
5
+ right: 0;
6
+ margin: 0 auto;
7
+ bottom: auto;
8
+ background-color: var(--ds-color-accent-surface-tinted);
9
+ z-index: 99;
10
+ overflow-y: auto;
11
+ transform-origin: top right;
12
+ border-radius: 0;
13
+ max-width: 90rem;
14
+ opacity: 1;
15
+ transform: scale(1);
16
+ transition: opacity 0.3s ease-in-out, transform 0.3s ease-in-out;
17
+ }
18
+
19
+ .menuOverlay.hidden {
20
+ opacity: 0;
21
+ transform: scale(0.95);
22
+ pointer-events: none;
23
+ }
24
+
25
+
26
+ .container {
27
+ margin: 0 auto;
28
+ padding: var(--ds-size-18) var(--ds-size-8);
29
+ display: flex;
30
+ flex-direction: column;
31
+ gap: var(--ds-size-18);
32
+ }
33
+
34
+ .searchSection {
35
+ display: flex;
36
+ flex-direction: column;
37
+ align-items: flex-start;
38
+ gap: var(--ds-size-8);
39
+ opacity: 0;
40
+ animation: fadeInScale 0.35s ease-out 0.1s forwards;
41
+
42
+ & h1 {
43
+ font-size: var(--ds-font-size-7);
44
+ font-weight: 500;
45
+ font-family: Arial, Helvetica, sans-serif;
46
+ line-height: 130%;
47
+ letter-spacing: -0.00469rem;
48
+ }
49
+ }
50
+
51
+ .searchField {
52
+ max-width: 32rem;
53
+ width: 100%;
54
+ }
55
+
56
+ .menuSections {
57
+ display: flex;
58
+ flex-direction: column;
59
+ gap: var(--ds-size-12);
60
+ }
61
+
62
+ .section {
63
+ display: flex;
64
+ flex-direction: column;
65
+ gap: var(--ds-size-5);
66
+ opacity: 0;
67
+ animation: fadeInSlideUp 0.35s ease-out forwards;
68
+ }
69
+
70
+
71
+ .sectionHeader {
72
+ display: flex;
73
+ flex-direction: column;
74
+ gap: var(--ds-size-3);
75
+ color: var(--ds-color-neutral-text-subtle);
76
+ padding-bottom: var(--ds-size-2);
77
+ border-bottom: 1px solid var(--ds-color-border-subtle);
78
+ font-weight: 600;
79
+ font-family: Arial, Helvetica, sans-serif;
80
+ font-size: var(--ds-font-size-4);
81
+ }
82
+
83
+ .itemsGrid {
84
+ display: flex;
85
+ gap: var(--ds-size-8);
86
+ flex-wrap: wrap;
87
+ }
88
+
89
+ .itemsGridThreeCol {
90
+ display: grid;
91
+ grid-template-columns: repeat(3, 1fr);
92
+ gap: var(--ds-size-4);
93
+ }
94
+
95
+ .subsectionsGrid {
96
+ display: flex;
97
+ gap: var(--ds-size-8);
98
+ flex-wrap: wrap;
99
+ align-items: flex-start;
100
+ }
101
+
102
+ .subsection {
103
+ flex: 1 1 0;
104
+ display: flex;
105
+ flex-direction: column;
106
+ gap: var(--ds-size-4);
107
+ }
108
+
109
+ .subsectionHeader {
110
+ display: flex;
111
+ flex-direction: column;
112
+ gap: var(--ds-size-2);
113
+ padding-bottom: var(--ds-size-2);
114
+ border-bottom: 1px solid var(--ds-color-border-subtle);
115
+ color: var(--ds-color-neutral-text-subtle);
116
+ font-weight: 600;
117
+ font-family: Arial, Helvetica, sans-serif;
118
+ font-size: var(--ds-font-size-4);
119
+ }
120
+
121
+ .subsectionItems {
122
+ display: flex;
123
+ flex-direction: column;
124
+ gap: var(--ds-size-3);
125
+ }
126
+
127
+ @media (max-width: 768px) {
128
+ .subsectionsGrid {
129
+ flex-direction: column;
130
+ gap: 2rem;
131
+ }
132
+
133
+ .subsection {
134
+ min-width: 100%;
135
+ }
136
+ }
137
+
138
+ .backdrop {
139
+ position: fixed;
140
+ top: 5rem;
141
+
142
+ left: 0;
143
+ right: 0;
144
+ bottom: 0;
145
+ background: rgba(0, 0, 0, 0.4);
146
+ z-index: 98;
147
+ cursor: pointer;
148
+ }
149
+
150
+ @keyframes fadeInScale {
151
+ from {
152
+ opacity: 0;
153
+ transform: scale(0.9);
154
+ }
155
+
156
+ to {
157
+ opacity: 1;
158
+ transform: scale(1);
159
+ }
160
+ }
161
+
162
+ @keyframes fadeInSlideUp {
163
+ from {
164
+ opacity: 0;
165
+ transform: translateY(1.5rem);
166
+ }
167
+
168
+ to {
169
+ opacity: 1;
170
+ transform: translateY(0);
171
+ }
172
+ }
173
+
174
+ @keyframes fadeInSlideRight {
175
+ from {
176
+ opacity: 0;
177
+ transform: translateX(-1rem);
178
+ }
179
+
180
+ to {
181
+ opacity: 1;
182
+ transform: translateX(0);
183
+ }
184
+ }
185
+
186
+ @keyframes fadeIn {
187
+ from {
188
+ opacity: 0;
189
+ }
190
+
191
+ to {
192
+ opacity: 1;
193
+ }
194
+ }
195
+
196
+ @media (max-width: 1024px) {
197
+ .container {
198
+ padding: 2.5rem 3.75rem 3.5rem;
199
+ }
200
+ }
201
+
202
+ @media (max-width: 768px) {
203
+ .menuOverlay {
204
+ top: 4rem;
205
+ }
206
+
207
+ .container {
208
+ padding: 2rem 1.5rem 3rem;
209
+ gap: 2.5rem;
210
+ }
211
+
212
+ .searchSection {
213
+ gap: 1.25rem;
214
+ }
215
+
216
+ .menuSections {
217
+ gap: 2.5rem;
218
+ }
219
+
220
+ .itemsGrid {
221
+ flex-direction: column;
222
+ gap: 1.5rem;
223
+ }
224
+ }
@@ -0,0 +1,98 @@
1
+ .itemColumn {
2
+ flex: 1 1 0;
3
+ min-width: 15.625rem;
4
+ display: flex;
5
+ flex-direction: column;
6
+ gap: var(--ds-size-4);
7
+ opacity: 0;
8
+ animation: fadeInSlideRight 0.25s ease-out forwards;
9
+ }
10
+
11
+ .parentLink {
12
+ color: var(--ds-color-text-subtle);
13
+ font-size: var(--ds-font-size-5);
14
+ line-height: var(--ds-line-height-sm);
15
+ text-decoration: underline;
16
+ display: inline-flex;
17
+ align-items: center;
18
+ gap: var(--ds-size-2);
19
+ line-height: 150%;
20
+ letter-spacing: 0.00656rem;
21
+ text-underline-offset: 6px;
22
+ }
23
+
24
+ .childItems {
25
+ list-style: none;
26
+ margin: 0;
27
+ padding: 0 0 0 var(--ds-size-2);
28
+ display: flex;
29
+ flex-direction: column;
30
+ gap: var(--ds-size-4);
31
+ }
32
+
33
+ .childItem {
34
+ margin: 0;
35
+ padding: 0;
36
+ opacity: 0;
37
+ animation: fadeIn 0.2s ease-out forwards;
38
+ }
39
+
40
+ .childLink {
41
+ color: var(--ds-color-text-subtle);
42
+ line-height: var(--ds-line-height-md);
43
+ text-decoration: underline;
44
+ display: inline-flex;
45
+ align-items: center;
46
+ gap: var(--ds-size-2);
47
+ letter-spacing: 0.005rem;
48
+ text-underline-offset: 4px;
49
+ }
50
+
51
+ .childLink:hover {
52
+ color: var(--ds-color-accent-text-default);
53
+ text-decoration: underline;
54
+ }
55
+
56
+ .compactLink {
57
+ color: var(--ds-color-accent-text-subtle);
58
+ font-size: var(--ds-font-size-4);
59
+ font-weight: var(--ds-font-weight-regular);
60
+ line-height: var(--ds-line-height-md);
61
+ text-decoration: underline;
62
+ display: inline-flex;
63
+ align-items: center;
64
+ gap: var(--ds-size-2);
65
+ transition: color 0.2s ease;
66
+ }
67
+
68
+ .compactLink:hover {
69
+ color: var(--ds-color-accent-text-default);
70
+ }
71
+
72
+ @keyframes fadeIn {
73
+ from {
74
+ opacity: 0;
75
+ }
76
+
77
+ to {
78
+ opacity: 1;
79
+ }
80
+ }
81
+
82
+ @keyframes fadeInSlideRight {
83
+ from {
84
+ opacity: 0;
85
+ transform: translateX(-1rem);
86
+ }
87
+
88
+ to {
89
+ opacity: 1;
90
+ transform: translateX(0);
91
+ }
92
+ }
93
+
94
+ @media (max-width: 768px) {
95
+ .itemColumn {
96
+ min-width: 100%;
97
+ }
98
+ }
@@ -2,6 +2,7 @@
2
2
  display: flex;
3
3
  flex-direction: column;
4
4
  min-height: 100vh;
5
+ color-scheme: light !important;
5
6
  }
6
7
 
7
8
  .main {
package/dist/index.d.ts CHANGED
@@ -18,9 +18,12 @@ type GlobalState = {
18
18
  } | null;
19
19
  theme: Theme;
20
20
  locale: string;
21
+ isMenuOpen: boolean;
21
22
  setUser: (user: GlobalState['user']) => void;
22
23
  setTheme: (theme: Theme) => void;
23
24
  setLocale: (locale: string) => void;
25
+ setIsMenuOpen: (isOpen: boolean) => void;
26
+ toggleMenu: () => void;
24
27
  initialize: () => void | Promise<void>;
25
28
  };
26
29
  declare const useGlobalStore: zustand.UseBoundStore<Omit<zustand.StoreApi<GlobalState>, "setState" | "persist"> & {
package/dist/index.js CHANGED
@@ -1,12 +1,11 @@
1
1
  "use client";
2
2
 
3
3
  // src/components/RootLayout/RootLayout.tsx
4
- import { useEffect } from "react";
4
+ import { useEffect as useEffect2 } from "react";
5
5
  import clsx4 from "clsx";
6
6
 
7
7
  // src/components/GlobalHeader/GlobalHeader.tsx
8
- import { useState } from "react";
9
- import { Link as Link2, Textfield } from "@digdir/designsystemet-react";
8
+ import { Button as Button2, Link as Link2 } from "@digdir/designsystemet-react";
10
9
  import clsx2 from "clsx";
11
10
 
12
11
  // src/components/Breadcrumbs/Breadcrumbs.tsx
@@ -96,15 +95,6 @@ function findBestMatch(zone, pathname) {
96
95
  return r.path === ((_a2 = ZONE_TREES[zone]) == null ? void 0 : _a2.path);
97
96
  });
98
97
  }
99
- function getZoneMenuRoutes(zone) {
100
- var _a;
101
- const root = ZONE_TREES[zone];
102
- const children = (_a = root == null ? void 0 : root.children) != null ? _a : [];
103
- return children.map((c) => ({ zone, path: c.path, label: c.label }));
104
- }
105
- function getAllZones() {
106
- return Object.keys(ZONE_TREES);
107
- }
108
98
  function getZoneRoot(zone) {
109
99
  var _a;
110
100
  return ((_a = ZONE_TREES[zone]) == null ? void 0 : _a.path) || "/";
@@ -190,90 +180,30 @@ function SbBreadcrumbs({ className, zone }) {
190
180
  }
191
181
 
192
182
  // src/components/MenuButton/MenuButton.tsx
193
- import Link from "next/link";
194
- import { Dropdown } from "@digdir/designsystemet-react";
195
- import { Menu } from "lucide-react";
196
- import styles2 from "./MenuButton.module.css";
197
- import { jsx as jsx2, jsxs } from "react/jsx-runtime";
198
- function MenuButton({ zone }) {
199
- const isDev = process.env.NODE_ENV === "development";
200
- const prodUrl = "https://www.statsbygg.no";
201
- const allZones = getAllZones();
202
- return /* @__PURE__ */ jsxs(Dropdown.TriggerContext, { children: [
203
- /* @__PURE__ */ jsxs(Dropdown.Trigger, { asChild: true, className: styles2.menuButton, children: [
204
- /* @__PURE__ */ jsx2(Menu, { size: 20, "aria-hidden": true }),
205
- "Meny"
206
- ] }),
207
- /* @__PURE__ */ jsx2(Dropdown, { children: isDev ? /* @__PURE__ */ jsx2("div", { className: styles2.devContainer, children: allZones.map((z) => {
208
- const routes = getZoneMenuRoutes(z);
209
- return /* @__PURE__ */ jsxs("div", { className: styles2.zoneSection, children: [
210
- /* @__PURE__ */ jsx2("div", { className: styles2.zoneTitle, children: z }),
211
- /* @__PURE__ */ jsx2(Dropdown.List, { children: routes.map((r) => /* @__PURE__ */ jsx2(Dropdown.Item, { children: /* @__PURE__ */ jsx2(Link, { href: transformHrefForZone(r.path, zone, { isDev, prodUrl }), children: r.label }) }, `${r.zone}:${r.path}`)) })
212
- ] }, z);
213
- }) }) : /* @__PURE__ */ jsx2(Dropdown.List, { children: getZoneMenuRoutes(zone).map((r) => /* @__PURE__ */ jsx2(Dropdown.Item, { children: /* @__PURE__ */ jsx2(Link, { href: transformHrefForZone(r.path, zone, { isDev, prodUrl }), children: r.label }) }, `${r.zone}:${r.path}`)) }) })
214
- ] });
215
- }
216
-
217
- // src/components/GlobalHeader/GlobalHeader.tsx
218
- import styles3 from "./GlobalHeader.module.css";
219
-
220
- // src/logo.svg
221
- var logo_default = 'data:image/svg+xml,<?xml version="1.0" encoding="UTF-8"?>%0A<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 75.1 14.9">%0A <!-- Generator: Adobe Illustrator 29.8.2, SVG Export Plug-In . SVG Version: 2.1.1 Build 3) -->%0A <defs>%0A <style>%0A .st0 {%0A fill: %23131819;%0A }%0A </style>%0A </defs>%0A <path class="st0" d="M16.6,11.4c-1.2-.5-1.8-1.1-1.8-2s.3-1.2.7-1.5c.5-.4,1.1-.5,1.8-.5s1.1.1,2.1.4v1.6h-.6c0-.4,0-.7-.2-1-.3-.4-.8-.5-1.2-.5-1,0-1.5.5-1.5,1.1s.3.8,1.5,1.4c1.4.6,2.4,1,2.4,2.3s-1.2,2.2-2.5,2.2-1,0-1.8-.3c-.4-.1-.5-.2-.5-.2v-2.1h.6c0,.8,0,2,1.7,2s1.6-.5,1.6-1.2-.3-.9-1.5-1.5l-.5-.2h-.3Z"/>%0A <path class="st0" d="M41.6,11.4c-1.2-.5-1.8-1.1-1.8-2s.3-1.2.7-1.5c.5-.4,1.1-.5,1.8-.5s1.1.1,2.1.4v1.6h-.6c0-.4,0-.7-.2-1-.3-.4-.8-.5-1.2-.5-1,0-1.5.5-1.5,1.1s.3.8,1.5,1.4c1.4.6,2.4,1,2.4,2.3s-1.2,2.2-2.5,2.2-1,0-1.8-.3c-.4-.1-.5-.2-.5-.2v-2.1h.6c0,.8,0,2,1.7,2s1.6-.5,1.6-1.2-.3-.9-1.5-1.5l-.5-.2h-.3Z"/>%0A <path class="st0" d="M22.7,8h-1.4c-.5.1-.6.6-.7,1.2h-.4v-1.8h6.2v1.8h-.4c0-.9-.3-1.1-.7-1.2h-1.4v5.6c0,.7.3.7.7.7h.4v.3h-3.2v-.3h.4c.4,0,.7,0,.7-.7v-5.6h-.2Z"/>%0A <path class="st0" d="M35.3,8h-1.4c-.5.1-.6.6-.7,1.2h-.4v-1.8h6.2v1.8h-.4c0-.9-.3-1.1-.7-1.2h-1.4v5.6c0,.7.3.7.7.7h.4v.3h-3.2v-.3h.4c.4,0,.7,0,.7-.7v-5.6h-.2Z"/>%0A <path class="st0" d="M30.6,12h-2.5l-.7,1.8v.3c0,.3.5.3.9.3v.3h-2.4v-.3c.5,0,.7,0,1-.7l2.6-6.1h.7l2.6,6.6c0,.1,0,.2.7.2v.3h-2.9v-.3c.8,0,1.1,0,.8-.7l-.6-1.7h-.2ZM30.5,11.5l-1.1-2.7-1.1,2.7s2.2,0,2.2,0Z"/>%0A <path class="st0" d="M46.6,8.8c0-.7,0-.9-.5-.9h-.3v-.3h3.3c.5,0,.9,0,1.3.2.7.4.8,1.2.8,1.4,0,.4,0,.7-.4,1.1-.4.4-.8.6-1.1.7.3,0,.9.2,1.4.5.4.3.7.9.7,1.4s-.3,1.2-.8,1.5c-.5.4-1.2.3-1.5.3h-3.7v-.3c.7,0,.9,0,.9-.8v-4.8h-.1ZM47.7,10.7h1.7c.3-.1.7-.4.7-1.3s0-.9-.4-1.1c-.3-.3-.8-.3-.9-.3h-.8q-.2,0-.2.5v2.2h0ZM47.7,13.7c0,.3,0,.4.2.5.2,0,1,.1,1.2.1.3,0,.6,0,.9-.2.6-.4.6-1.1.6-1.2,0-.3,0-.7-.4-1.1s-.9-.7-2.5-.6v2.6h0Z"/>%0A <path class="st0" d="M54.9,11.5l-2-3c-.3-.5-.4-.6-1.1-.6v-.3h3.1v.3h-.4c-.2,0-.4,0-.4.2s0,0,0,.2l1.7,2.7,1.4-2.1c.3-.4.4-.5.4-.8s0-.2-.8-.2v-.3h2.2v.3c-.4,0-.6,0-.8.4l-2.4,3.3v2.1c0,.2,0,.6.3.7h.7v.3h-3.3v-.3h.4c.4,0,.7,0,.7-.7v-2.2h.2Z"/>%0A <path class="st0" d="M63.7,11.2h3v.3c-.7,0-.7.1-.7.6v2.1c-.3,0-.5.1-.7.2-1.1.3-1.6.4-2.3.4-2.5,0-3.9-1.7-3.9-3.9s.6-2.3,1.3-2.8c.8-.7,1.8-.8,2.5-.8s.9,0,1.7.2q.8.1,1.3.2v2h-.5c0-.4,0-.8-.5-1.2-.5-.4-1.2-.6-1.8-.6-1.8,0-2.7,1.3-2.7,2.9s.3,1.9.7,2.4c.7,1,1.7,1.1,2.3,1.1s.6,0,1-.1c.5-.2.5-.3.5-.8v-1.1c0-.6,0-.7-.8-.7h-.3v-.4h0Z"/>%0A <path class="st0" d="M72.1,11.2h3v.3c-.7,0-.7.1-.7.6v2.1c-.3,0-.5.1-.7.2-1.1.3-1.6.4-2.3.4-2.5,0-3.9-1.7-3.9-3.9s.6-2.3,1.3-2.8c.8-.7,1.8-.8,2.5-.8s.9,0,1.7.2q.8.1,1.3.2v2h-.5c0-.4,0-.8-.5-1.2-.5-.4-1.2-.6-1.8-.6-1.8,0-2.7,1.3-2.7,2.9s.3,1.9.7,2.4c.7,1,1.7,1.1,2.3,1.1s.6,0,1-.1c.5-.2.5-.3.5-.8v-1.1c0-.6,0-.7-.8-.7h-.3v-.4h0Z"/>%0A <g>%0A <g>%0A <polygon class="st0" points="0 9.9 .7 10.6 9.7 10.6 10.4 9.9 5.2 7.3 0 9.9"/>%0A <rect class="st0" x=".7" y="11.4" width="9" height=".6"/>%0A <rect class="st0" x=".7" y="12.7" width="9" height=".6"/>%0A <rect class="st0" x=".7" y="14.1" width="9" height=".6"/>%0A </g>%0A <path class="st0" d="M8.1,3.1c-.3,0-.7,0-.9.2-.1-.1-.3-.2-.6-.2s-.8.2-.9.2h-.2s.5-.2.5-.8-.7-.8-.7-.8v-.9h.5v-.3h-.5v-.5h-.3v.5h-.5v.3h.5v.9s-.7,0-.7.8.5.8.5.8h-.2c-.1,0-.5-.2-.9-.2s-.5.1-.6.2c-.2-.1-.6-.2-.9-.2-.5,0-1.1.4-1,.9,0,.5.5,2.3.5,2.3h6.9s.4-1.8.5-2.3c0-.5-.5-.9-1-.9ZM3.2,5.2s-.2.5-.8.5-.9-.4-.9-.7h.1s.2.2.4.2.3-.1.3-.3-.1-.3-.2-.3c-.2,0-.3.2-.4.2,0,0-.2,0-.1-.1,0,0,.3-.2.3-.4s-.2-.3-.3-.3c0-.2.2-.6.8-.6s.8.1.8.1v.5s-.2,0-.2.3.2.4.2.4h0q0,.1-.1,0s-.2-.2-.3-.2-.2.1-.2.3.1.3.2.3.3-.2.3-.2h.1v.2h0ZM5,5.2s-.3.5-.8.5-.8-.5-.8-.5v-.2h.1s.2.2.3.2.2-.1.2-.3-.1-.3-.2-.3-.2.1-.3.2h-.1c0-.1.2-.3.2-.5s-.2-.3-.2-.3v-.4c0-.2.2-.2.4-.2s.9,0,1.1.1v.5s-.2,0-.2.3.2.4.2.4h0q0,.1-.1,0s-.2-.2-.3-.2-.2.1-.2.3.1.3.2.3.3-.2.3-.2h.1v.2h0ZM7,5.2s-.3.5-.8.5-.8-.5-.8-.5v-.2h.1s.2.2.3.2.2-.1.2-.3-.1-.3-.2-.3-.2.1-.3.2h-.1c0-.1.2-.3.2-.5s-.2-.3-.2-.3v-.5c.2,0,.9-.1,1.1-.1s.4,0,.4.2v.4s-.2,0-.2.3.2.4.2.4h0q0,.1-.1,0s-.2-.2-.3-.2-.2.1-.2.3.1.3.2.3.3-.2.3-.2h.1v.2h0ZM8.8,4.7s0,.1-.1.1c0,0-.2-.2-.4-.2s-.2.2-.2.3.2.3.3.3.3-.2.4-.2h.1c0,.3-.3.7-.9.7s-.8-.5-.8-.5v-.2h.1s.2.2.3.2.2-.1.2-.3-.1-.3-.2-.3-.2.1-.3.2h-.1c0-.1.2-.3.2-.5s-.2-.3-.2-.3v-.5s0-.1.8-.1.8.4.8.6c-.1,0-.3,0-.3.3s.2.3.3.4ZM8.3,4.5c-.1,0-.2.1-.2.3s.2.3.3.3"/>%0A </g>%0A</svg>';
222
-
223
- // src/components/GlobalHeader/GlobalHeader.tsx
224
- import { jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
225
- function GlobalHeader({ className, zone }) {
226
- const [searchValue, setSearchValue] = useState("");
227
- return /* @__PURE__ */ jsx3("header", { className: clsx2(styles3.header, className), children: /* @__PURE__ */ jsxs2("div", { className: styles3.headerContainer, children: [
228
- /* @__PURE__ */ jsxs2("div", { className: styles3.topBarContainer, children: [
229
- /* @__PURE__ */ jsx3(Link2, { href: "https://www.statsbygg.no", children: /* @__PURE__ */ jsx3("img", { src: logo_default, alt: "Logo", className: styles3.logo }) }),
230
- /* @__PURE__ */ jsxs2("div", { className: styles3.actionsContainer, children: [
231
- /* @__PURE__ */ jsx3(
232
- Textfield,
233
- {
234
- value: searchValue,
235
- onChange: (e) => setSearchValue(e.target.value),
236
- placeholder: "S\xF8k...",
237
- className: styles3.searchInput,
238
- "aria-label": "S\xF8k"
239
- }
240
- ),
241
- /* @__PURE__ */ jsx3(MenuButton, { zone })
242
- ] })
243
- ] }),
244
- /* @__PURE__ */ jsx3(SbBreadcrumbs, { zone })
245
- ] }) });
246
- }
247
-
248
- // src/components/GlobalFooter/GlobalFooter.tsx
249
- import { Paragraph } from "@digdir/designsystemet-react";
250
- import clsx3 from "clsx";
251
- import styles4 from "./GlobalFooter.module.css";
252
- import { jsx as jsx4 } from "react/jsx-runtime";
253
- function GlobalFooter({ className }) {
254
- return /* @__PURE__ */ jsx4("footer", { className: clsx3(styles4.footer, className), children: /* @__PURE__ */ jsx4("div", { className: styles4.container, children: /* @__PURE__ */ jsx4("div", { className: styles4.content, children: /* @__PURE__ */ jsx4(Paragraph, { children: "Statsbygg Footer" }) }) }) });
255
- }
256
-
257
- // src/components/RootLayout/RootLayout.tsx
258
- import styles5 from "./RootLayout.module.css";
183
+ import { Button } from "@digdir/designsystemet-react";
184
+ import { Menu, X } from "lucide-react";
259
185
 
260
186
  // src/store/globalState.ts
261
187
  import { create } from "zustand";
262
188
  import { persist, createJSONStorage } from "zustand/middleware";
189
+ var ALLOW_DARK_THEME = false;
263
190
  var creator = (set, get) => ({
264
191
  user: null,
265
192
  theme: "light",
266
193
  locale: "no",
194
+ isMenuOpen: false,
267
195
  setUser: (user) => set({ user }),
268
196
  setTheme: (theme) => {
269
- set({ theme });
270
- if (typeof document !== "undefined") {
197
+ set({ theme: ALLOW_DARK_THEME ? theme : "light" });
198
+ if (typeof document !== "undefined" && ALLOW_DARK_THEME) {
271
199
  document.documentElement.setAttribute("data-color-scheme", theme);
272
200
  }
273
201
  },
274
202
  setLocale: (locale) => set({ locale }),
203
+ setIsMenuOpen: (isMenuOpen) => set({ isMenuOpen }),
204
+ toggleMenu: () => set((state) => ({ isMenuOpen: !state.isMenuOpen })),
275
205
  initialize: () => {
276
- if (typeof document !== "undefined") {
206
+ if (typeof document !== "undefined" && ALLOW_DARK_THEME) {
277
207
  document.documentElement.setAttribute("data-color-scheme", get().theme);
278
208
  }
279
209
  }
@@ -281,19 +211,382 @@ var creator = (set, get) => ({
281
211
  var useGlobalStore = create()(
282
212
  persist(creator, {
283
213
  name: "statsbygg-global-state",
284
- storage: createJSONStorage(() => localStorage)
214
+ storage: createJSONStorage(() => localStorage),
215
+ partialize: (state) => ({
216
+ user: state.user,
217
+ theme: ALLOW_DARK_THEME ? state.theme : "light",
218
+ locale: state.locale
219
+ // Don't persist menu state
220
+ })
285
221
  })
286
222
  );
287
223
 
224
+ // src/components/NavigationMenu/NavigationMenu.tsx
225
+ import { useState, useEffect, useRef } from "react";
226
+ import { Heading, Search } from "@digdir/designsystemet-react";
227
+
228
+ // src/navigationMenu.ts
229
+ var NAVIGATION_MENU = [
230
+ {
231
+ title: "V\xE5re tjenester",
232
+ layout: "columns",
233
+ items: [
234
+ {
235
+ label: "Statens eide og leide lokaler",
236
+ href: "/lokaler",
237
+ children: [
238
+ { label: "Lokalbruk", href: "/lokaler/lokalbruk" },
239
+ { label: "Statlige eiendommer", href: "/lokaler/statlige-eiendommer" },
240
+ { label: "Ledig for fremleie", href: "/lokaler/ledig-for-fremleie" },
241
+ { label: "Statistikk for lokalbruk", href: "/lokaler/statistikk" },
242
+ { label: "Veiledning", href: "/lokaler/veiledning" }
243
+ ]
244
+ },
245
+ {
246
+ label: "For leietakere",
247
+ href: "/leietakere",
248
+ children: [
249
+ { label: "Leieveileder", href: "/leietakere/leieveileder" },
250
+ { label: "Lenke til underside", href: "/leietakere/lenke1" },
251
+ { label: "Lenke til underside", href: "/leietakere/lenke2" }
252
+ ]
253
+ },
254
+ {
255
+ label: "For byggebransjen",
256
+ href: "/byggebransjen",
257
+ children: [
258
+ { label: "V\xE5re krav", href: "/byggebransjen/vare-krav" },
259
+ { label: "BIM", href: "/byggebransjen/bim" },
260
+ { label: "ByggBoks", href: "/byggebransjen/byggboks" },
261
+ { label: "Lenke til underside", href: "/byggebransjen/lenke" }
262
+ ]
263
+ },
264
+ {
265
+ label: "Karriere",
266
+ href: "/karriere",
267
+ children: [
268
+ { label: "Ledige stillinger", href: "/karriere/ledige-stillinger" },
269
+ { label: "\xC5 jobbe hos oss", href: "/karriere/jobbe-hos-oss" },
270
+ { label: "M\xF8t en statsbygger", href: "/karriere/mot-en-statsbygger" },
271
+ { label: "Summer internship", href: "/karriere/summer-internship" },
272
+ { label: "Studenter og l\xE6rlinger", href: "/karriere/studenter-og-laerlinger" }
273
+ ]
274
+ }
275
+ ]
276
+ },
277
+ {
278
+ title: "Informasjon om statsbygg",
279
+ layout: "subsections",
280
+ subsections: [
281
+ {
282
+ title: "Informasjon om statsbygg",
283
+ items: [
284
+ { label: "Om Statsbygg", href: "/om-statsbygg" },
285
+ { label: "Samfunnsansvar", href: "/samfunnsansvar" },
286
+ { label: "Tilgjengelighet", href: "/tilgjengelighet" },
287
+ { label: "About Statsbygg", href: "/about-statsbygg" },
288
+ { label: "Statsbygg birra", href: "/statsbygg-birra" }
289
+ ]
290
+ },
291
+ {
292
+ title: "Kontakt oss",
293
+ items: [
294
+ { label: "Kontakt oss", href: "/kontakt" },
295
+ { label: "Ansatts\xF8k", href: "/ansattsok" },
296
+ { label: "For pressen", href: "/for-pressen" },
297
+ { label: "Varsling", href: "/varsling" }
298
+ ]
299
+ },
300
+ {
301
+ title: "Arkiv",
302
+ items: [
303
+ { label: "Nyheter", href: "/nyheter" },
304
+ { label: "Artikler om bygg", href: "/artikler-om-bygg" },
305
+ { label: "Dokumenter", href: "/dokumenter" }
306
+ ]
307
+ }
308
+ ]
309
+ },
310
+ {
311
+ title: "Eksterne lenker",
312
+ layout: "columns",
313
+ items: [
314
+ {
315
+ label: "Statens lokaler",
316
+ href: "https://statensinnleie.no",
317
+ external: true
318
+ },
319
+ {
320
+ label: "Statens innleie",
321
+ href: "https://statensinnleie.no",
322
+ external: true
323
+ },
324
+ {
325
+ label: "MainManager FM",
326
+ href: "https://mainmanager.no",
327
+ external: true
328
+ },
329
+ {
330
+ label: "Offentlig postjournal",
331
+ href: "https://postjournal.no",
332
+ external: true
333
+ },
334
+ {
335
+ label: "SIMBA (BIM)",
336
+ href: "https://bim.statsbygg.no",
337
+ external: true
338
+ }
339
+ ]
340
+ }
341
+ ];
342
+
343
+ // src/components/NavigationMenuItem/NavigationMenuItem.tsx
344
+ import { Link, List } from "@digdir/designsystemet-react";
345
+ import { ExternalLink } from "lucide-react";
346
+ import styles2 from "./NavigationMenuItem.module.css";
347
+ import { jsx as jsx2, jsxs } from "react/jsx-runtime";
348
+ function NavigationMenuItem({ item, animationDelay, compact = false }) {
349
+ if (compact) {
350
+ return /* @__PURE__ */ jsx2(
351
+ "div",
352
+ {
353
+ className: styles2.itemColumn,
354
+ style: { animationDelay: `${animationDelay}ms` },
355
+ children: /* @__PURE__ */ jsxs(
356
+ Link,
357
+ {
358
+ href: item.href,
359
+ className: styles2.compactLink,
360
+ target: item.external ? "_blank" : void 0,
361
+ rel: item.external ? "noopener noreferrer" : void 0,
362
+ children: [
363
+ item.label,
364
+ item.external && /* @__PURE__ */ jsx2(ExternalLink, { size: 16, "aria-hidden": "true" })
365
+ ]
366
+ }
367
+ )
368
+ }
369
+ );
370
+ }
371
+ return /* @__PURE__ */ jsxs(
372
+ "div",
373
+ {
374
+ className: styles2.itemColumn,
375
+ style: { animationDelay: `${animationDelay}ms` },
376
+ children: [
377
+ /* @__PURE__ */ jsxs(
378
+ Link,
379
+ {
380
+ href: item.href,
381
+ className: styles2.parentLink,
382
+ target: item.external ? "_blank" : void 0,
383
+ rel: item.external ? "noopener noreferrer" : void 0,
384
+ children: [
385
+ item.label,
386
+ item.external && /* @__PURE__ */ jsx2(ExternalLink, { size: 20, "aria-hidden": "true" })
387
+ ]
388
+ }
389
+ ),
390
+ item.children && item.children.length > 0 && /* @__PURE__ */ jsx2(List.Unordered, { className: styles2.childItems, children: item.children.map((child, childIndex) => /* @__PURE__ */ jsx2(
391
+ List.Item,
392
+ {
393
+ className: styles2.childItem,
394
+ style: { animationDelay: `${animationDelay + 30 + childIndex * 15}ms` },
395
+ children: /* @__PURE__ */ jsxs(
396
+ Link,
397
+ {
398
+ href: child.href,
399
+ className: styles2.childLink,
400
+ target: child.external ? "_blank" : void 0,
401
+ rel: child.external ? "noopener noreferrer" : void 0,
402
+ children: [
403
+ child.label,
404
+ child.external && /* @__PURE__ */ jsx2(ExternalLink, { size: 20, "aria-hidden": "true" })
405
+ ]
406
+ }
407
+ )
408
+ },
409
+ childIndex
410
+ )) })
411
+ ]
412
+ }
413
+ );
414
+ }
415
+
416
+ // src/components/NavigationMenu/NavigationMenu.tsx
417
+ import styles3 from "./NavigationMenu.module.css";
418
+ import { Fragment, jsx as jsx3, jsxs as jsxs2 } from "react/jsx-runtime";
419
+ function NavigationMenu({ zone }) {
420
+ const [searchValue, setSearchValue] = useState("");
421
+ const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);
422
+ const setIsMenuOpen = useGlobalStore((state) => state.setIsMenuOpen);
423
+ const searchInputRef = useRef(null);
424
+ useEffect(() => {
425
+ const handleEscape = (event) => {
426
+ if (event.key === "Escape") {
427
+ setIsMenuOpen(false);
428
+ }
429
+ };
430
+ setTimeout(() => {
431
+ var _a;
432
+ (_a = searchInputRef.current) == null ? void 0 : _a.focus();
433
+ }, 100);
434
+ document.addEventListener("keydown", handleEscape);
435
+ document.body.style.overflow = "hidden";
436
+ return () => {
437
+ document.removeEventListener("keydown", handleEscape);
438
+ document.body.style.overflow = "";
439
+ };
440
+ }, [setIsMenuOpen]);
441
+ function handleBackdropClick(e) {
442
+ if (e.target === e.currentTarget) {
443
+ setIsMenuOpen(false);
444
+ }
445
+ }
446
+ return /* @__PURE__ */ jsxs2(Fragment, { children: [
447
+ isMenuOpen && /* @__PURE__ */ jsx3("div", { className: styles3.backdrop, onClick: handleBackdropClick }),
448
+ /* @__PURE__ */ jsx3("div", { className: `${styles3.menuOverlay} ${!isMenuOpen ? styles3.hidden : ""}`, children: /* @__PURE__ */ jsxs2("div", { className: styles3.container, children: [
449
+ /* @__PURE__ */ jsxs2("div", { className: styles3.searchSection, children: [
450
+ /* @__PURE__ */ jsx3(Heading, { level: 1, children: "Hva kan vi hjelpe deg med?" }),
451
+ /* @__PURE__ */ jsxs2(Search, { children: [
452
+ /* @__PURE__ */ jsx3(
453
+ Search.Input,
454
+ {
455
+ "aria-label": "S\xF8k",
456
+ ref: searchInputRef,
457
+ value: searchValue,
458
+ onChange: (e) => setSearchValue(e.target.value),
459
+ placeholder: "S\xF8k",
460
+ className: styles3.searchField
461
+ }
462
+ ),
463
+ /* @__PURE__ */ jsx3(Search.Clear, {})
464
+ ] })
465
+ ] }),
466
+ /* @__PURE__ */ jsx3("nav", { className: styles3.menuSections, "aria-label": "Hovedmeny", children: NAVIGATION_MENU.map((section, sectionIndex) => {
467
+ var _a;
468
+ return /* @__PURE__ */ jsxs2(
469
+ "section",
470
+ {
471
+ className: styles3.section,
472
+ style: { animationDelay: `${0.15 + sectionIndex * 0.06}s` },
473
+ children: [
474
+ section.layout !== "subsections" && /* @__PURE__ */ jsx3(Heading, { level: 2, className: styles3.sectionHeader, children: section.title }),
475
+ section.layout === "subsections" && section.subsections ? /* @__PURE__ */ jsx3("div", { className: styles3.subsectionsGrid, children: section.subsections.map((subsection, subsectionIndex) => /* @__PURE__ */ jsxs2("div", { className: styles3.subsection, children: [
476
+ /* @__PURE__ */ jsx3(Heading, { level: 2, className: styles3.subsectionHeader, children: subsection.title }),
477
+ /* @__PURE__ */ jsx3("div", { className: styles3.subsectionItems, children: subsection.items.map((item, itemIndex) => /* @__PURE__ */ jsx3(
478
+ NavigationMenuItem,
479
+ {
480
+ item,
481
+ animationDelay: 150 + sectionIndex * 60 + subsectionIndex * 40 + itemIndex * 25,
482
+ compact: true
483
+ },
484
+ itemIndex
485
+ )) })
486
+ ] }, subsectionIndex)) }) : /* @__PURE__ */ jsx3("div", { className: sectionIndex === 2 ? styles3.itemsGridThreeCol : styles3.itemsGrid, children: (_a = section.items) == null ? void 0 : _a.map((item, itemIndex) => /* @__PURE__ */ jsx3(
487
+ NavigationMenuItem,
488
+ {
489
+ item,
490
+ animationDelay: 150 + sectionIndex * 60 + itemIndex * 25
491
+ },
492
+ itemIndex
493
+ )) })
494
+ ]
495
+ },
496
+ sectionIndex
497
+ );
498
+ }) })
499
+ ] }) })
500
+ ] });
501
+ }
502
+
503
+ // src/components/MenuButton/MenuButton.tsx
504
+ import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-runtime";
505
+ function MenuButton({ zone }) {
506
+ const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);
507
+ const toggleMenu = useGlobalStore((state) => state.toggleMenu);
508
+ return /* @__PURE__ */ jsxs3(Fragment2, { children: [
509
+ /* @__PURE__ */ jsxs3(
510
+ Button,
511
+ {
512
+ variant: "primary",
513
+ onClick: toggleMenu,
514
+ "aria-expanded": isMenuOpen,
515
+ "aria-label": isMenuOpen ? "Lukk meny" : "\xC5pne meny",
516
+ children: [
517
+ isMenuOpen ? /* @__PURE__ */ jsx4(X, { size: 20, "aria-hidden": "true" }) : /* @__PURE__ */ jsx4(Menu, { size: 20, "aria-hidden": "true" }),
518
+ isMenuOpen ? "Lukk" : "Meny"
519
+ ]
520
+ }
521
+ ),
522
+ /* @__PURE__ */ jsx4(NavigationMenu, { zone })
523
+ ] });
524
+ }
525
+
526
+ // src/components/GlobalHeader/GlobalHeader.tsx
527
+ import styles4 from "./GlobalHeader.module.css";
528
+
529
+ // src/logo.svg
530
+ var logo_default = 'data:image/svg+xml,<?xml version="1.0" encoding="UTF-8"?>%0A<svg id="Layer_1" xmlns="http://www.w3.org/2000/svg" version="1.1" viewBox="0 0 75.1 14.9">%0A <!-- Generator: Adobe Illustrator 29.8.2, SVG Export Plug-In . SVG Version: 2.1.1 Build 3) -->%0A <defs>%0A <style>%0A .st0 {%0A fill: %23131819;%0A }%0A </style>%0A </defs>%0A <path class="st0" d="M16.6,11.4c-1.2-.5-1.8-1.1-1.8-2s.3-1.2.7-1.5c.5-.4,1.1-.5,1.8-.5s1.1.1,2.1.4v1.6h-.6c0-.4,0-.7-.2-1-.3-.4-.8-.5-1.2-.5-1,0-1.5.5-1.5,1.1s.3.8,1.5,1.4c1.4.6,2.4,1,2.4,2.3s-1.2,2.2-2.5,2.2-1,0-1.8-.3c-.4-.1-.5-.2-.5-.2v-2.1h.6c0,.8,0,2,1.7,2s1.6-.5,1.6-1.2-.3-.9-1.5-1.5l-.5-.2h-.3Z"/>%0A <path class="st0" d="M41.6,11.4c-1.2-.5-1.8-1.1-1.8-2s.3-1.2.7-1.5c.5-.4,1.1-.5,1.8-.5s1.1.1,2.1.4v1.6h-.6c0-.4,0-.7-.2-1-.3-.4-.8-.5-1.2-.5-1,0-1.5.5-1.5,1.1s.3.8,1.5,1.4c1.4.6,2.4,1,2.4,2.3s-1.2,2.2-2.5,2.2-1,0-1.8-.3c-.4-.1-.5-.2-.5-.2v-2.1h.6c0,.8,0,2,1.7,2s1.6-.5,1.6-1.2-.3-.9-1.5-1.5l-.5-.2h-.3Z"/>%0A <path class="st0" d="M22.7,8h-1.4c-.5.1-.6.6-.7,1.2h-.4v-1.8h6.2v1.8h-.4c0-.9-.3-1.1-.7-1.2h-1.4v5.6c0,.7.3.7.7.7h.4v.3h-3.2v-.3h.4c.4,0,.7,0,.7-.7v-5.6h-.2Z"/>%0A <path class="st0" d="M35.3,8h-1.4c-.5.1-.6.6-.7,1.2h-.4v-1.8h6.2v1.8h-.4c0-.9-.3-1.1-.7-1.2h-1.4v5.6c0,.7.3.7.7.7h.4v.3h-3.2v-.3h.4c.4,0,.7,0,.7-.7v-5.6h-.2Z"/>%0A <path class="st0" d="M30.6,12h-2.5l-.7,1.8v.3c0,.3.5.3.9.3v.3h-2.4v-.3c.5,0,.7,0,1-.7l2.6-6.1h.7l2.6,6.6c0,.1,0,.2.7.2v.3h-2.9v-.3c.8,0,1.1,0,.8-.7l-.6-1.7h-.2ZM30.5,11.5l-1.1-2.7-1.1,2.7s2.2,0,2.2,0Z"/>%0A <path class="st0" d="M46.6,8.8c0-.7,0-.9-.5-.9h-.3v-.3h3.3c.5,0,.9,0,1.3.2.7.4.8,1.2.8,1.4,0,.4,0,.7-.4,1.1-.4.4-.8.6-1.1.7.3,0,.9.2,1.4.5.4.3.7.9.7,1.4s-.3,1.2-.8,1.5c-.5.4-1.2.3-1.5.3h-3.7v-.3c.7,0,.9,0,.9-.8v-4.8h-.1ZM47.7,10.7h1.7c.3-.1.7-.4.7-1.3s0-.9-.4-1.1c-.3-.3-.8-.3-.9-.3h-.8q-.2,0-.2.5v2.2h0ZM47.7,13.7c0,.3,0,.4.2.5.2,0,1,.1,1.2.1.3,0,.6,0,.9-.2.6-.4.6-1.1.6-1.2,0-.3,0-.7-.4-1.1s-.9-.7-2.5-.6v2.6h0Z"/>%0A <path class="st0" d="M54.9,11.5l-2-3c-.3-.5-.4-.6-1.1-.6v-.3h3.1v.3h-.4c-.2,0-.4,0-.4.2s0,0,0,.2l1.7,2.7,1.4-2.1c.3-.4.4-.5.4-.8s0-.2-.8-.2v-.3h2.2v.3c-.4,0-.6,0-.8.4l-2.4,3.3v2.1c0,.2,0,.6.3.7h.7v.3h-3.3v-.3h.4c.4,0,.7,0,.7-.7v-2.2h.2Z"/>%0A <path class="st0" d="M63.7,11.2h3v.3c-.7,0-.7.1-.7.6v2.1c-.3,0-.5.1-.7.2-1.1.3-1.6.4-2.3.4-2.5,0-3.9-1.7-3.9-3.9s.6-2.3,1.3-2.8c.8-.7,1.8-.8,2.5-.8s.9,0,1.7.2q.8.1,1.3.2v2h-.5c0-.4,0-.8-.5-1.2-.5-.4-1.2-.6-1.8-.6-1.8,0-2.7,1.3-2.7,2.9s.3,1.9.7,2.4c.7,1,1.7,1.1,2.3,1.1s.6,0,1-.1c.5-.2.5-.3.5-.8v-1.1c0-.6,0-.7-.8-.7h-.3v-.4h0Z"/>%0A <path class="st0" d="M72.1,11.2h3v.3c-.7,0-.7.1-.7.6v2.1c-.3,0-.5.1-.7.2-1.1.3-1.6.4-2.3.4-2.5,0-3.9-1.7-3.9-3.9s.6-2.3,1.3-2.8c.8-.7,1.8-.8,2.5-.8s.9,0,1.7.2q.8.1,1.3.2v2h-.5c0-.4,0-.8-.5-1.2-.5-.4-1.2-.6-1.8-.6-1.8,0-2.7,1.3-2.7,2.9s.3,1.9.7,2.4c.7,1,1.7,1.1,2.3,1.1s.6,0,1-.1c.5-.2.5-.3.5-.8v-1.1c0-.6,0-.7-.8-.7h-.3v-.4h0Z"/>%0A <g>%0A <g>%0A <polygon class="st0" points="0 9.9 .7 10.6 9.7 10.6 10.4 9.9 5.2 7.3 0 9.9"/>%0A <rect class="st0" x=".7" y="11.4" width="9" height=".6"/>%0A <rect class="st0" x=".7" y="12.7" width="9" height=".6"/>%0A <rect class="st0" x=".7" y="14.1" width="9" height=".6"/>%0A </g>%0A <path class="st0" d="M8.1,3.1c-.3,0-.7,0-.9.2-.1-.1-.3-.2-.6-.2s-.8.2-.9.2h-.2s.5-.2.5-.8-.7-.8-.7-.8v-.9h.5v-.3h-.5v-.5h-.3v.5h-.5v.3h.5v.9s-.7,0-.7.8.5.8.5.8h-.2c-.1,0-.5-.2-.9-.2s-.5.1-.6.2c-.2-.1-.6-.2-.9-.2-.5,0-1.1.4-1,.9,0,.5.5,2.3.5,2.3h6.9s.4-1.8.5-2.3c0-.5-.5-.9-1-.9ZM3.2,5.2s-.2.5-.8.5-.9-.4-.9-.7h.1s.2.2.4.2.3-.1.3-.3-.1-.3-.2-.3c-.2,0-.3.2-.4.2,0,0-.2,0-.1-.1,0,0,.3-.2.3-.4s-.2-.3-.3-.3c0-.2.2-.6.8-.6s.8.1.8.1v.5s-.2,0-.2.3.2.4.2.4h0q0,.1-.1,0s-.2-.2-.3-.2-.2.1-.2.3.1.3.2.3.3-.2.3-.2h.1v.2h0ZM5,5.2s-.3.5-.8.5-.8-.5-.8-.5v-.2h.1s.2.2.3.2.2-.1.2-.3-.1-.3-.2-.3-.2.1-.3.2h-.1c0-.1.2-.3.2-.5s-.2-.3-.2-.3v-.4c0-.2.2-.2.4-.2s.9,0,1.1.1v.5s-.2,0-.2.3.2.4.2.4h0q0,.1-.1,0s-.2-.2-.3-.2-.2.1-.2.3.1.3.2.3.3-.2.3-.2h.1v.2h0ZM7,5.2s-.3.5-.8.5-.8-.5-.8-.5v-.2h.1s.2.2.3.2.2-.1.2-.3-.1-.3-.2-.3-.2.1-.3.2h-.1c0-.1.2-.3.2-.5s-.2-.3-.2-.3v-.5c.2,0,.9-.1,1.1-.1s.4,0,.4.2v.4s-.2,0-.2.3.2.4.2.4h0q0,.1-.1,0s-.2-.2-.3-.2-.2.1-.2.3.1.3.2.3.3-.2.3-.2h.1v.2h0ZM8.8,4.7s0,.1-.1.1c0,0-.2-.2-.4-.2s-.2.2-.2.3.2.3.3.3.3-.2.4-.2h.1c0,.3-.3.7-.9.7s-.8-.5-.8-.5v-.2h.1s.2.2.3.2.2-.1.2-.3-.1-.3-.2-.3-.2.1-.3.2h-.1c0-.1.2-.3.2-.5s-.2-.3-.2-.3v-.5s0-.1.8-.1.8.4.8.6c-.1,0-.3,0-.3.3s.2.3.3.4ZM8.3,4.5c-.1,0-.2.1-.2.3s.2.3.3.3"/>%0A </g>%0A</svg>';
531
+
532
+ // src/components/GlobalHeader/GlobalHeader.tsx
533
+ import { Search as Search2 } from "lucide-react";
534
+ import { Fragment as Fragment3, jsx as jsx5, jsxs as jsxs4 } from "react/jsx-runtime";
535
+ function GlobalHeader({ className, zone }) {
536
+ const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);
537
+ const setIsMenuOpen = useGlobalStore((state) => state.setIsMenuOpen);
538
+ const setTheme = useGlobalStore((state) => state.setTheme);
539
+ const theme = useGlobalStore((state) => state.theme);
540
+ function toggleDarkMode() {
541
+ setTheme(theme === "dark" ? "light" : "dark");
542
+ }
543
+ return /* @__PURE__ */ jsx5("header", { className: clsx2(styles4.header, className), children: /* @__PURE__ */ jsxs4("div", { className: styles4.headerContainer, children: [
544
+ /* @__PURE__ */ jsxs4("div", { className: styles4.topBarContainer, children: [
545
+ /* @__PURE__ */ jsx5(Link2, { href: "https://www.statsbygg.no", children: /* @__PURE__ */ jsx5("img", { src: logo_default, alt: "Logo", className: styles4.logo }) }),
546
+ /* @__PURE__ */ jsxs4("div", { className: styles4.actionsContainer, children: [
547
+ !isMenuOpen && /* @__PURE__ */ jsxs4(Fragment3, { children: [
548
+ ALLOW_DARK_THEME && /* @__PURE__ */ jsx5(Button2, { onClick: toggleDarkMode, className: styles4.themeToggleButton, children: theme === "dark" ? "\u2600\uFE0F" : "\u{1F319}" }),
549
+ /* @__PURE__ */ jsxs4(
550
+ Button2,
551
+ {
552
+ variant: "secondary",
553
+ onClick: () => setIsMenuOpen(true),
554
+ className: styles4.searchButton,
555
+ "aria-label": "S\xF8k",
556
+ children: [
557
+ /* @__PURE__ */ jsx5(Search2, { size: 20, "aria-hidden": "true" }),
558
+ "S\xF8k"
559
+ ]
560
+ }
561
+ )
562
+ ] }),
563
+ /* @__PURE__ */ jsx5(MenuButton, { zone })
564
+ ] })
565
+ ] }),
566
+ /* @__PURE__ */ jsx5(SbBreadcrumbs, { zone })
567
+ ] }) });
568
+ }
569
+
570
+ // src/components/GlobalFooter/GlobalFooter.tsx
571
+ import { Paragraph } from "@digdir/designsystemet-react";
572
+ import clsx3 from "clsx";
573
+ import styles5 from "./GlobalFooter.module.css";
574
+ import { jsx as jsx6 } from "react/jsx-runtime";
575
+ function GlobalFooter({ className }) {
576
+ return /* @__PURE__ */ jsx6("footer", { className: clsx3(styles5.footer, className), children: /* @__PURE__ */ jsx6("div", { className: styles5.container, children: /* @__PURE__ */ jsx6("div", { className: styles5.content, children: /* @__PURE__ */ jsx6(Paragraph, { children: "Statsbygg Footer" }) }) }) });
577
+ }
578
+
288
579
  // src/components/RootLayout/RootLayout.tsx
289
- import { jsx as jsx5, jsxs as jsxs3 } from "react/jsx-runtime";
580
+ import styles6 from "./RootLayout.module.css";
581
+ import { SkipLink } from "@digdir/designsystemet-react";
582
+ import { jsx as jsx7, jsxs as jsxs5 } from "react/jsx-runtime";
290
583
  function RootLayout({
291
584
  children,
292
585
  zone,
293
586
  className
294
587
  }) {
295
588
  const initialize = useGlobalStore((state) => state.initialize);
296
- useEffect(() => {
589
+ useEffect2(() => {
297
590
  try {
298
591
  const maybe = initialize();
299
592
  if (maybe && typeof maybe.then === "function") {
@@ -305,10 +598,11 @@ function RootLayout({
305
598
  console.error("Failed to initialize global state:", error);
306
599
  }
307
600
  }, [initialize]);
308
- return /* @__PURE__ */ jsxs3("div", { className: clsx4(styles5.root, className), "data-zone": zone, children: [
309
- /* @__PURE__ */ jsx5(GlobalHeader, { zone }),
310
- /* @__PURE__ */ jsx5("main", { className: styles5.main, children }),
311
- /* @__PURE__ */ jsx5(GlobalFooter, {})
601
+ return /* @__PURE__ */ jsxs5("div", { className: clsx4(styles6.root, className), "data-zone": zone, children: [
602
+ /* @__PURE__ */ jsx7(SkipLink, { href: "#main-content", children: "Hopp til hovedinnhold" }),
603
+ /* @__PURE__ */ jsx7(GlobalHeader, { zone }),
604
+ /* @__PURE__ */ jsx7("main", { id: "main-content", tabIndex: -1, className: styles6.main, children }),
605
+ /* @__PURE__ */ jsx7(GlobalFooter, {})
312
606
  ] });
313
607
  }
314
608
  export {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/components/RootLayout/RootLayout.tsx","../src/components/GlobalHeader/GlobalHeader.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/routes.ts","../src/components/MenuButton/MenuButton.tsx","../src/components/GlobalFooter/GlobalFooter.tsx","../src/store/globalState.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport clsx from 'clsx';\nimport { GlobalHeader } from '../GlobalHeader';\nimport { GlobalFooter } from '../GlobalFooter';\nimport type { RootLayoutProps } from './RootLayout.types';\nimport styles from './RootLayout.module.css';\nimport { useGlobalStore } from '@/store/globalState';\n\nexport function RootLayout({\n children,\n zone, \n className,\n}: RootLayoutProps) {\n const initialize = useGlobalStore((state) => state.initialize);\n\n useEffect(() => {\n try {\n const maybe = initialize();\n if (maybe && typeof (maybe as Promise<void>).then === 'function') {\n (maybe as Promise<void>).catch((error) => {\n console.error('Failed to initialize global state:', error);\n });\n }\n } catch (error) {\n console.error('Failed to initialize global state:', error);\n }\n }, [initialize]);\n\n\n return (\n <div className={clsx(styles.root, className)} data-zone={zone}>\n <GlobalHeader zone={zone}/>\n <main className={styles.main}>{children}</main>\n <GlobalFooter />\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { Link, Textfield } from '@digdir/designsystemet-react';\nimport clsx from 'clsx';\nimport { Breadcrumbs } from '../Breadcrumbs';\nimport { MenuButton } from '../MenuButton';\nimport type { GlobalHeaderProps } from './GlobalHeader.types';\nimport styles from './GlobalHeader.module.css';\nimport logo from '../../logo.svg'; \n\nexport function GlobalHeader({ className, zone }: GlobalHeaderProps) {\n const [searchValue, setSearchValue] = useState('');\n\n return (\n <header className={clsx(styles.header, className)}>\n <div className={styles.headerContainer}>\n <div className={styles.topBarContainer}>\n <Link href=\"https://www.statsbygg.no\">\n <img src={logo} alt=\"Logo\" className={styles.logo} />\n </Link>\n <div className={styles.actionsContainer}>\n <Textfield\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder=\"Søk...\"\n className={styles.searchInput}\n aria-label=\"Søk\"\n />\n <MenuButton zone={zone}/>\n </div>\n </div>\n <Breadcrumbs zone={zone} />\n </div>\n </header>\n );\n}","'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { Breadcrumbs } from '@digdir/designsystemet-react';\nimport clsx from 'clsx';\nimport type { BreadcrumbsProps } from './Breadcrumbs.types';\nimport styles from './Breadcrumbs.module.css';\nimport { getBreadcrumbs, getZoneRoot, transformHrefForZone } from '@/routes';\n\nexport function SbBreadcrumbs({ className, zone }: BreadcrumbsProps) {\n const pathname = usePathname();\n const isDev = process.env.NODE_ENV === 'development';\n const prodUrl = 'https://www.statsbygg.no';\n const zoneRoot = getZoneRoot(zone);\n \n const fullPath = isDev && zoneRoot !== '/' && !pathname.startsWith(zoneRoot)\n ? `${zoneRoot}${pathname}`\n : pathname;\n \n const breadcrumbs = getBreadcrumbs(zone, fullPath);\n\n if (breadcrumbs.length <= 1) {\n return null;\n }\n\n\n return (\n <Breadcrumbs aria-label=\"Du er her:\" className={clsx(styles.breadcrumbs, className)}>\n <Breadcrumbs.List>\n {breadcrumbs.map((crumb, index) => {\n const isLast = index === breadcrumbs.length - 1;\n const href = transformHrefForZone(crumb.href, zone, { isDev, prodUrl });\n \n return (\n <Breadcrumbs.Item key={crumb.href}>\n <Breadcrumbs.Link\n href={href}\n aria-current={isLast ? 'page' : undefined}\n className={isLast ? styles.currentLink : styles.link}\n >\n {crumb.label}\n </Breadcrumbs.Link>\n </Breadcrumbs.Item>\n );\n })}\n </Breadcrumbs.List>\n </Breadcrumbs>\n );\n}","export type RouteNodeInput =\n | { segment: string; label: string; children?: RouteNodeInput[] }\n | { path: string; label: string; children?: RouteNodeInput[] };\n\nexport type RouteNode = {\n path: string;\n label: string;\n children?: RouteNode[];\n};\n\nexport type RouteDefinition = {\n path: string;\n label: string;\n zone: string;\n};\n\nconst ZONE_TREES_INPUT: Record<string, RouteNodeInput> = {\n sbno: {\n segment: '',// primary root route, no breadcrumb\n label: 'Hjem',\n children: [\n { segment: 'nyheter', label: 'Nyheter' },\n ],\n },\n lokaler: {\n segment: 'lokaler',\n label: 'Statens eide og leide lokaler',\n children: [\n {\n segment: 'lokalbruk', label: 'Lokalbruk'\n },\n { segment: 'veiledning', label: 'Veiledning' },\n { segment: 'statlige-eiendommer', label: 'Statlige eiendommer' },\n { segment: 'ledig-for-fremleie', label: 'Ledig for fremleie' },\n { segment: 'statistikk', label: 'Statistikk' },\n ],\n },\n};\n\n\ntype Key = `${string}:${string}`; // `${zone}:${absolutePath}`\n\nconst ROUTES_INDEX: Record<string, RouteDefinition[]> = {};\nconst PARENT_INDEX = new Map<Key, Key | null>(); // child -> parent\nconst ZONE_TREES: Record<string, RouteNode> = {}; // normalized absolute trees\n\nfunction isSegmentNode(n: RouteNodeInput): n is Extract<RouteNodeInput, { segment: string }> {\n return (n as any).segment !== undefined && (n as any).path === undefined;\n}\nfunction isPathNode(n: RouteNodeInput): n is Extract<RouteNodeInput, { path: string }> {\n return (n as any).path !== undefined;\n}\n\nfunction joinPath(base: string, seg: string): string {\n if (!base) return seg ? `/${seg}` : '/';\n return seg ? `${base.replace(/\\/+$/, '')}/${seg.replace(/^\\/+/, '')}` : base || '/';\n}\n\nfunction normalizeToAbsolute(node: RouteNodeInput, base = ''): RouteNode {\n const path = isSegmentNode(node)\n ? joinPath(base, node.segment)\n : isPathNode(node)\n ? (node.path === '' ? '/' : node.path)\n : '/';\n\n const children = (node.children ?? []).map((c) => normalizeToAbsolute(c, path));\n return { path, label: (node as any).label, children: children.length ? children : undefined };\n}\n\n(function buildAll() {\n // Normalize each zone tree to absolute paths\n Object.keys(ZONE_TREES_INPUT).forEach((zone) => {\n ZONE_TREES[zone] = normalizeToAbsolute(ZONE_TREES_INPUT[zone]);\n });\n\n // Build flat indexes + parent relationships\n function walk(zone: string, node: RouteNode, parentKey: Key | null) {\n const def: RouteDefinition = { zone, path: node.path, label: node.label };\n const key: Key = `${zone}:${node.path}`;\n ROUTES_INDEX[zone].push(def);\n PARENT_INDEX.set(key, parentKey);\n for (const child of node.children ?? []) {\n walk(zone, child, key);\n }\n }\n\n (Object.keys(ZONE_TREES) as string[]).forEach((zone) => {\n ROUTES_INDEX[zone] = [];\n walk(zone, ZONE_TREES[zone], null);\n });\n})();\n\n\nfunction findBestMatch(zone: string, pathname: string): RouteDefinition | undefined {\n const list = ROUTES_INDEX[zone] ?? [];\n let best: RouteDefinition | undefined;\n\n for (const r of list) {\n if (pathname === r.path) {\n best = r; // exact wins\n break;\n }\n if (pathname.startsWith(r.path.endsWith('/') ? r.path : r.path + '/')) {\n if (!best || r.path.length > best.path.length) best = r;\n }\n }\n // fallback: zone root\n return best ?? list.find((r) => r.path === ZONE_TREES[zone]?.path);\n}\n\nexport function getZoneRoutes(zone: string): RouteDefinition[] {\n return ROUTES_INDEX[zone] ?? [];\n}\n\n// Top-level links for a zone’s menu (children of the zone root)\nexport function getZoneMenuRoutes(zone: string): RouteDefinition[] {\n const root = ZONE_TREES[zone];\n const children = root?.children ?? [];\n return children.map((c) => ({ zone, path: c.path, label: c.label }));\n}\n\nexport function getAllZones(): string[] {\n return Object.keys(ZONE_TREES);\n}\n\nexport function getZoneRoot(zone: string): string {\n return ZONE_TREES[zone]?.path || '/';\n}\n\n// prettify dynamic slug labels\nfunction labelFromSlug(slug: string): string {\n try {\n const s = decodeURIComponent(slug).replace(/[-_]+/g, ' ').trim();\n return s ? s.charAt(0).toUpperCase() + s.slice(1) : slug;\n } catch {\n return slug;\n }\n}\n\nexport function getBreadcrumbs(\n zone: string,\n pathname: string\n): Array<{ label: string; href: string }> {\n\n const normalizedPathname = pathname === '/' ? pathname : pathname.replace(/\\/+$/, '');\n\n // sbno root has no crumbs\n if (zone === 'sbno' && normalizedPathname === '/') return [];\n\n const match = findBestMatch(zone, normalizedPathname);\n if (!match) return [];\n\n const chain: RouteDefinition[] = [];\n let key: Key | undefined = `${zone}:${match.path}`;\n while (key) {\n const parentKey = PARENT_INDEX.get(key);\n const [z, p] = key.split(':') as [string, string];\n const def = (ROUTES_INDEX[z] ?? []).find((r) => r.path === p);\n if (def) chain.unshift(def);\n key = parentKey ?? undefined;\n }\n\n const homeRoute = (ROUTES_INDEX.sbno ?? []).find((r) => r.path === '/');\n if (\n homeRoute &&\n !(chain.length === 1 && chain[0].zone === 'sbno' && chain[0].path === '/') &&\n (chain.length === 0 || chain[0].path !== homeRoute.path)\n ) {\n chain.unshift(homeRoute);\n }\n\n // If the pathname is deeper than the best static match, add a dynamic tail\n const last = chain[chain.length - 1];\n if (last && normalizedPathname !== last.path && normalizedPathname.startsWith(last.path.endsWith('/') ? last.path : last.path + '/')) {\n const segments = normalizedPathname.split('/').filter(Boolean);\n const tail = segments[segments.length - 1];\n chain.push({ zone, path: normalizedPathname, label: labelFromSlug(tail) });\n }\n\n return chain.map((r) => ({ label: r.label, href: r.path }));\n}\n\nexport function transformHrefForZone(\n targetPath: string,\n currentZone: string,\n options: {\n isDev: boolean;\n prodUrl?: string;\n }\n): string {\n const { isDev, prodUrl } = options;\n\n const targetZone = getZoneFromPathname(targetPath);\n const isCrossZone = targetZone !== currentZone;\n\n if (isCrossZone && isDev && prodUrl) {\n return `${prodUrl}${targetPath}`;\n }\n\n const currentZoneRoot = getZoneRoot(currentZone);\n if (!isCrossZone && isDev && currentZoneRoot !== '/') {\n return targetPath.replace(currentZoneRoot, '') || '/';\n }\n\n return targetPath;\n}\n\nexport function getZoneFromPathname(pathname: string): string {\n if (pathname.startsWith('/lokaler')) return 'lokaler';\n return 'sbno';\n}","'use client';\n\nimport Link from 'next/link';\nimport { Dropdown } from '@digdir/designsystemet-react';\nimport { Menu } from 'lucide-react';\nimport { getZoneMenuRoutes, getAllZones, transformHrefForZone } from '@/routes';\nimport type { MenuButtonProps } from './MenuButton.types';\nimport styles from './MenuButton.module.css';\n\nexport function MenuButton({ zone }: MenuButtonProps) {\n const isDev = process.env.NODE_ENV === 'development';\n // TODO: Temporary here. Should come from env or something\n const prodUrl = 'https://www.statsbygg.no';\n const allZones = getAllZones();\n\n return (\n <Dropdown.TriggerContext>\n <Dropdown.Trigger asChild className={styles.menuButton}>\n <Menu size={20} aria-hidden />\n Meny\n </Dropdown.Trigger>\n <Dropdown>\n {isDev ? (\n <div className={styles.devContainer}>\n {allZones.map((z) => {\n const routes = getZoneMenuRoutes(z);\n return (\n <div key={z} className={styles.zoneSection}>\n <div className={styles.zoneTitle}>{z}</div>\n <Dropdown.List>\n {routes.map((r) => (\n <Dropdown.Item key={`${r.zone}:${r.path}`}>\n <Link href={transformHrefForZone(r.path, zone, { isDev, prodUrl })}>\n {r.label}\n </Link>\n </Dropdown.Item>\n ))}\n </Dropdown.List>\n </div>\n );\n })}\n </div>\n ) : (\n <Dropdown.List>\n {getZoneMenuRoutes(zone).map((r) => (\n <Dropdown.Item key={`${r.zone}:${r.path}`}>\n <Link href={transformHrefForZone(r.path, zone, { isDev, prodUrl })}>\n {r.label}\n </Link>\n </Dropdown.Item>\n ))}\n </Dropdown.List>\n )}\n </Dropdown>\n </Dropdown.TriggerContext>\n );\n}","'use client';\n\nimport { Paragraph } from '@digdir/designsystemet-react';\nimport clsx from 'clsx';\nimport type { GlobalFooterProps } from './GlobalFooter.types';\nimport styles from './GlobalFooter.module.css';\n\nexport function GlobalFooter({ className }: GlobalFooterProps) {\n\n return (\n <footer className={clsx(styles.footer, className)}>\n <div className={styles.container}>\n <div className={styles.content}>\n <Paragraph>\n Statsbygg Footer\n </Paragraph>\n\n\n </div>\n </div>\n </footer>\n );\n}","import { create, StateCreator } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\n\nexport type Theme = 'light' | 'dark' | 'system';\n\nexport type GlobalState = {\n user?: { id: string; name?: string } | null;\n theme: Theme;\n locale: string;\n setUser: (user: GlobalState['user']) => void;\n setTheme: (theme: Theme) => void;\n setLocale: (locale: string) => void;\n initialize: () => void | Promise<void>;\n};\n\nconst creator: StateCreator<GlobalState, [['zustand/persist', unknown]]> = (set, get) => ({\n user: null,\n theme: 'light',\n locale: 'no',\n setUser: (user) => set({ user }),\n setTheme: (theme) => {\n set({ theme });\n if (typeof document !== 'undefined') {\n document.documentElement.setAttribute('data-color-scheme', theme);\n }\n },\n setLocale: (locale) => set({ locale }),\n initialize: () => {\n if (typeof document !== 'undefined') {\n document.documentElement.setAttribute('data-color-scheme', get().theme);\n }\n },\n});\n\nexport const useGlobalStore = create<GlobalState>()(\n persist(creator, {\n name: 'statsbygg-global-state',\n storage: createJSONStorage(() => localStorage),\n })\n);\n"],"mappings":"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","names":["clsx","Link","clsx","_a","styles","jsx","styles","jsx","jsxs","clsx","styles","Link","clsx","styles","jsx","styles","jsx","jsxs","clsx","styles"]}
1
+ {"version":3,"sources":["../src/components/RootLayout/RootLayout.tsx","../src/components/GlobalHeader/GlobalHeader.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/routes.ts","../src/components/MenuButton/MenuButton.tsx","../src/store/globalState.ts","../src/components/NavigationMenu/NavigationMenu.tsx","../src/navigationMenu.ts","../src/components/NavigationMenuItem/NavigationMenuItem.tsx","../src/components/GlobalFooter/GlobalFooter.tsx"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport clsx from 'clsx';\nimport { GlobalHeader } from '../GlobalHeader';\nimport { GlobalFooter } from '../GlobalFooter';\nimport type { RootLayoutProps } from './RootLayout.types';\nimport styles from './RootLayout.module.css';\nimport { useGlobalStore } from '@/store/globalState';\nimport { SkipLink } from '@digdir/designsystemet-react';\n\nexport function RootLayout({\n children,\n zone, \n className,\n}: RootLayoutProps) {\n const initialize = useGlobalStore((state) => state.initialize);\n\n useEffect(() => {\n try {\n const maybe = initialize();\n if (maybe && typeof (maybe as Promise<void>).then === 'function') {\n (maybe as Promise<void>).catch((error) => {\n console.error('Failed to initialize global state:', error);\n });\n }\n } catch (error) {\n console.error('Failed to initialize global state:', error);\n }\n }, [initialize]);\n\n\n return (\n <div className={clsx(styles.root, className)} data-zone={zone}>\n <SkipLink href='#main-content'>Hopp til hovedinnhold</SkipLink>\n <GlobalHeader zone={zone}/>\n <main id=\"main-content\" tabIndex={-1} className={styles.main}>{children}</main>\n <GlobalFooter />\n </div>\n );\n}\n","'use client';\n\nimport { useState } from 'react';\nimport { Button, Link, Textfield } from '@digdir/designsystemet-react';\nimport clsx from 'clsx';\nimport { Breadcrumbs } from '../Breadcrumbs';\nimport { MenuButton } from '../MenuButton';\nimport type { GlobalHeaderProps } from './GlobalHeader.types';\nimport styles from './GlobalHeader.module.css';\nimport logo from '../../logo.svg';\nimport { ALLOW_DARK_THEME, useGlobalStore } from '@/store/globalState';\nimport { Search } from 'lucide-react';\n\nexport function GlobalHeader({ className, zone }: GlobalHeaderProps) {\n const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);\n const setIsMenuOpen = useGlobalStore((state) => state.setIsMenuOpen);\n const setTheme = useGlobalStore((state) => state.setTheme);\n const theme = useGlobalStore((state) => state.theme);\n // function for toggling darkmode lightmode with zustand store\n\n function toggleDarkMode() {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }\n\n\n return (\n <header className={clsx(styles.header, className)}>\n <div className={styles.headerContainer}>\n <div className={styles.topBarContainer}>\n <Link href=\"https://www.statsbygg.no\">\n <img src={logo} alt=\"Logo\" className={styles.logo} />\n </Link>\n <div className={styles.actionsContainer}>\n {!isMenuOpen && (\n <>\n {ALLOW_DARK_THEME && <Button onClick={toggleDarkMode} className={styles.themeToggleButton}>\n {theme === 'dark' ? '☀️' : '🌙'}\n </Button>}\n <Button\n variant=\"secondary\"\n onClick={() => setIsMenuOpen(true)}\n className={styles.searchButton}\n aria-label=\"Søk\"\n >\n <Search size={20} aria-hidden=\"true\" />\n Søk\n </Button></>\n )}\n <MenuButton zone={zone} />\n </div>\n </div>\n <Breadcrumbs zone={zone} />\n </div>\n </header>\n );\n}","'use client';\n\nimport { usePathname } from 'next/navigation';\nimport { Breadcrumbs } from '@digdir/designsystemet-react';\nimport clsx from 'clsx';\nimport type { BreadcrumbsProps } from './Breadcrumbs.types';\nimport styles from './Breadcrumbs.module.css';\nimport { getBreadcrumbs, getZoneRoot, transformHrefForZone } from '@/routes';\n\nexport function SbBreadcrumbs({ className, zone }: BreadcrumbsProps) {\n const pathname = usePathname();\n const isDev = process.env.NODE_ENV === 'development';\n const prodUrl = 'https://www.statsbygg.no';\n const zoneRoot = getZoneRoot(zone);\n \n const fullPath = isDev && zoneRoot !== '/' && !pathname.startsWith(zoneRoot)\n ? `${zoneRoot}${pathname}`\n : pathname;\n \n const breadcrumbs = getBreadcrumbs(zone, fullPath);\n\n if (breadcrumbs.length <= 1) {\n return null;\n }\n\n\n return (\n <Breadcrumbs aria-label=\"Du er her:\" className={clsx(styles.breadcrumbs, className)}>\n <Breadcrumbs.List>\n {breadcrumbs.map((crumb, index) => {\n const isLast = index === breadcrumbs.length - 1;\n const href = transformHrefForZone(crumb.href, zone, { isDev, prodUrl });\n \n return (\n <Breadcrumbs.Item key={crumb.href}>\n <Breadcrumbs.Link\n href={href}\n aria-current={isLast ? 'page' : undefined}\n className={isLast ? styles.currentLink : styles.link}\n >\n {crumb.label}\n </Breadcrumbs.Link>\n </Breadcrumbs.Item>\n );\n })}\n </Breadcrumbs.List>\n </Breadcrumbs>\n );\n}","export type RouteNodeInput =\n | { segment: string; label: string; children?: RouteNodeInput[] }\n | { path: string; label: string; children?: RouteNodeInput[] };\n\nexport type RouteNode = {\n path: string;\n label: string;\n children?: RouteNode[];\n};\n\nexport type RouteDefinition = {\n path: string;\n label: string;\n zone: string;\n};\n\nconst ZONE_TREES_INPUT: Record<string, RouteNodeInput> = {\n sbno: {\n segment: '',// primary root route, no breadcrumb\n label: 'Hjem',\n children: [\n { segment: 'nyheter', label: 'Nyheter' },\n ],\n },\n lokaler: {\n segment: 'lokaler',\n label: 'Statens eide og leide lokaler',\n children: [\n {\n segment: 'lokalbruk', label: 'Lokalbruk'\n },\n { segment: 'veiledning', label: 'Veiledning' },\n { segment: 'statlige-eiendommer', label: 'Statlige eiendommer' },\n { segment: 'ledig-for-fremleie', label: 'Ledig for fremleie' },\n { segment: 'statistikk', label: 'Statistikk' },\n ],\n },\n};\n\n\ntype Key = `${string}:${string}`; // `${zone}:${absolutePath}`\n\nconst ROUTES_INDEX: Record<string, RouteDefinition[]> = {};\nconst PARENT_INDEX = new Map<Key, Key | null>(); // child -> parent\nconst ZONE_TREES: Record<string, RouteNode> = {}; // normalized absolute trees\n\nfunction isSegmentNode(n: RouteNodeInput): n is Extract<RouteNodeInput, { segment: string }> {\n return (n as any).segment !== undefined && (n as any).path === undefined;\n}\nfunction isPathNode(n: RouteNodeInput): n is Extract<RouteNodeInput, { path: string }> {\n return (n as any).path !== undefined;\n}\n\nfunction joinPath(base: string, seg: string): string {\n if (!base) return seg ? `/${seg}` : '/';\n return seg ? `${base.replace(/\\/+$/, '')}/${seg.replace(/^\\/+/, '')}` : base || '/';\n}\n\nfunction normalizeToAbsolute(node: RouteNodeInput, base = ''): RouteNode {\n const path = isSegmentNode(node)\n ? joinPath(base, node.segment)\n : isPathNode(node)\n ? (node.path === '' ? '/' : node.path)\n : '/';\n\n const children = (node.children ?? []).map((c) => normalizeToAbsolute(c, path));\n return { path, label: (node as any).label, children: children.length ? children : undefined };\n}\n\n(function buildAll() {\n // Normalize each zone tree to absolute paths\n Object.keys(ZONE_TREES_INPUT).forEach((zone) => {\n ZONE_TREES[zone] = normalizeToAbsolute(ZONE_TREES_INPUT[zone]);\n });\n\n // Build flat indexes + parent relationships\n function walk(zone: string, node: RouteNode, parentKey: Key | null) {\n const def: RouteDefinition = { zone, path: node.path, label: node.label };\n const key: Key = `${zone}:${node.path}`;\n ROUTES_INDEX[zone].push(def);\n PARENT_INDEX.set(key, parentKey);\n for (const child of node.children ?? []) {\n walk(zone, child, key);\n }\n }\n\n (Object.keys(ZONE_TREES) as string[]).forEach((zone) => {\n ROUTES_INDEX[zone] = [];\n walk(zone, ZONE_TREES[zone], null);\n });\n})();\n\n\nfunction findBestMatch(zone: string, pathname: string): RouteDefinition | undefined {\n const list = ROUTES_INDEX[zone] ?? [];\n let best: RouteDefinition | undefined;\n\n for (const r of list) {\n if (pathname === r.path) {\n best = r; // exact wins\n break;\n }\n if (pathname.startsWith(r.path.endsWith('/') ? r.path : r.path + '/')) {\n if (!best || r.path.length > best.path.length) best = r;\n }\n }\n // fallback: zone root\n return best ?? list.find((r) => r.path === ZONE_TREES[zone]?.path);\n}\n\nexport function getZoneRoutes(zone: string): RouteDefinition[] {\n return ROUTES_INDEX[zone] ?? [];\n}\n\n// Top-level links for a zone’s menu (children of the zone root)\nexport function getZoneMenuRoutes(zone: string): RouteDefinition[] {\n const root = ZONE_TREES[zone];\n const children = root?.children ?? [];\n return children.map((c) => ({ zone, path: c.path, label: c.label }));\n}\n\nexport function getAllZones(): string[] {\n return Object.keys(ZONE_TREES);\n}\n\nexport function getZoneRoot(zone: string): string {\n return ZONE_TREES[zone]?.path || '/';\n}\n\n// prettify dynamic slug labels\nfunction labelFromSlug(slug: string): string {\n try {\n const s = decodeURIComponent(slug).replace(/[-_]+/g, ' ').trim();\n return s ? s.charAt(0).toUpperCase() + s.slice(1) : slug;\n } catch {\n return slug;\n }\n}\n\nexport function getBreadcrumbs(\n zone: string,\n pathname: string\n): Array<{ label: string; href: string }> {\n\n const normalizedPathname = pathname === '/' ? pathname : pathname.replace(/\\/+$/, '');\n\n // sbno root has no crumbs\n if (zone === 'sbno' && normalizedPathname === '/') return [];\n\n const match = findBestMatch(zone, normalizedPathname);\n if (!match) return [];\n\n const chain: RouteDefinition[] = [];\n let key: Key | undefined = `${zone}:${match.path}`;\n while (key) {\n const parentKey = PARENT_INDEX.get(key);\n const [z, p] = key.split(':') as [string, string];\n const def = (ROUTES_INDEX[z] ?? []).find((r) => r.path === p);\n if (def) chain.unshift(def);\n key = parentKey ?? undefined;\n }\n\n const homeRoute = (ROUTES_INDEX.sbno ?? []).find((r) => r.path === '/');\n if (\n homeRoute &&\n !(chain.length === 1 && chain[0].zone === 'sbno' && chain[0].path === '/') &&\n (chain.length === 0 || chain[0].path !== homeRoute.path)\n ) {\n chain.unshift(homeRoute);\n }\n\n // If the pathname is deeper than the best static match, add a dynamic tail\n const last = chain[chain.length - 1];\n if (last && normalizedPathname !== last.path && normalizedPathname.startsWith(last.path.endsWith('/') ? last.path : last.path + '/')) {\n const segments = normalizedPathname.split('/').filter(Boolean);\n const tail = segments[segments.length - 1];\n chain.push({ zone, path: normalizedPathname, label: labelFromSlug(tail) });\n }\n\n return chain.map((r) => ({ label: r.label, href: r.path }));\n}\n\nexport function transformHrefForZone(\n targetPath: string,\n currentZone: string,\n options: {\n isDev: boolean;\n prodUrl?: string;\n }\n): string {\n const { isDev, prodUrl } = options;\n\n const targetZone = getZoneFromPathname(targetPath);\n const isCrossZone = targetZone !== currentZone;\n\n if (isCrossZone && isDev && prodUrl) {\n return `${prodUrl}${targetPath}`;\n }\n\n const currentZoneRoot = getZoneRoot(currentZone);\n if (!isCrossZone && isDev && currentZoneRoot !== '/') {\n return targetPath.replace(currentZoneRoot, '') || '/';\n }\n\n return targetPath;\n}\n\nexport function getZoneFromPathname(pathname: string): string {\n if (pathname.startsWith('/lokaler')) return 'lokaler';\n return 'sbno';\n}","'use client';\n\nimport { Button } from '@digdir/designsystemet-react';\nimport { Menu, X } from 'lucide-react';\nimport { useGlobalStore } from '@/store/globalState';\nimport { NavigationMenu } from '../NavigationMenu';\nimport type { MenuButtonProps } from './MenuButton.types';\n\nexport function MenuButton({ zone }: MenuButtonProps) {\n const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);\n const toggleMenu = useGlobalStore((state) => state.toggleMenu);\n\n return (\n <>\n <Button\n variant='primary'\n onClick={toggleMenu}\n aria-expanded={isMenuOpen}\n aria-label={isMenuOpen ? 'Lukk meny' : 'Åpne meny'}\n >\n {isMenuOpen ? <X size={20} aria-hidden=\"true\" /> : <Menu size={20} aria-hidden=\"true\" />}\n {isMenuOpen ? 'Lukk' : 'Meny'}\n </Button>\n <NavigationMenu zone={zone} />\n </>\n );\n}","import { create, StateCreator } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\n\nexport type Theme = 'light' | 'dark' | 'system';\n\nexport const ALLOW_DARK_THEME = false;\n\nexport type GlobalState = {\n user?: { id: string; name?: string } | null;\n theme: Theme;\n locale: string;\n isMenuOpen: boolean;\n setUser: (user: GlobalState['user']) => void;\n setTheme: (theme: Theme) => void;\n setLocale: (locale: string) => void;\n setIsMenuOpen: (isOpen: boolean) => void;\n toggleMenu: () => void;\n initialize: () => void | Promise<void>;\n};\n\nconst creator: StateCreator<GlobalState, [['zustand/persist', unknown]]> = (set, get) => ({\n user: null,\n theme: 'light',\n locale: 'no',\n isMenuOpen: false,\n setUser: (user) => set({ user }),\n setTheme: (theme) => {\n set({ theme: ALLOW_DARK_THEME ? theme : 'light' });\n if (typeof document !== 'undefined' && ALLOW_DARK_THEME) {\n document.documentElement.setAttribute('data-color-scheme', theme);\n }\n },\n setLocale: (locale) => set({ locale }),\n setIsMenuOpen: (isMenuOpen) => set({ isMenuOpen }),\n toggleMenu: () => set((state) => ({ isMenuOpen: !state.isMenuOpen })),\n initialize: () => {\n if (typeof document !== 'undefined'&& ALLOW_DARK_THEME) {\n document.documentElement.setAttribute('data-color-scheme', get().theme);\n }\n },\n});\n\nexport const useGlobalStore = create<GlobalState>()(\n persist(creator, {\n name: 'statsbygg-global-state',\n storage: createJSONStorage(() => localStorage),\n partialize: (state) => ({\n user: state.user,\n theme: ALLOW_DARK_THEME ? state.theme : 'light',\n locale: state.locale,\n // Don't persist menu state\n }),\n })\n);","'use client';\nimport { useState, useEffect, useRef } from 'react';\nimport { Heading, Search, Textfield } from '@digdir/designsystemet-react';\nimport { NAVIGATION_MENU } from '../../navigationMenu';\nimport { NavigationMenuItem } from '../NavigationMenuItem/NavigationMenuItem';\nimport { useGlobalStore } from '../../store/globalState';\nimport styles from './NavigationMenu.module.css';\nimport { MenuSection, NavigationMenuProps } from './NavigationMenu.types';\n\nexport function NavigationMenu({ zone }: NavigationMenuProps) {\n const [searchValue, setSearchValue] = useState('');\n const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);\n const setIsMenuOpen = useGlobalStore((state) => state.setIsMenuOpen);\n const searchInputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n const handleEscape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n setIsMenuOpen(false);\n }\n };\n\n setTimeout(() => {\n searchInputRef.current?.focus();\n }, 100);\n\n document.addEventListener('keydown', handleEscape);\n\n // Prevent body scroll when menu is open\n // TODO: Fix this DOM manipulation\n document.body.style.overflow = 'hidden';\n\n return () => {\n document.removeEventListener('keydown', handleEscape);\n // TODO: Fix this DOM manipulation\n document.body.style.overflow = '';\n };\n }, [setIsMenuOpen]);\n\n function handleBackdropClick(e: React.MouseEvent<HTMLDivElement>) {\n if (e.target === e.currentTarget) {\n setIsMenuOpen(false);\n }\n }\n\n return (\n <>\n {isMenuOpen && <div className={styles.backdrop} onClick={handleBackdropClick} />}\n <div className={`${styles.menuOverlay} ${!isMenuOpen ? styles.hidden : ''}`}>\n <div className={styles.container}>\n <div className={styles.searchSection}>\n <Heading level={1}>\n Hva kan vi hjelpe deg med?\n </Heading>\n <Search>\n <Search.Input aria-label='Søk' ref={searchInputRef}\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder=\"Søk\"\n className={styles.searchField}\n />\n <Search.Clear />\n </Search>\n </div>\n\n <nav className={styles.menuSections} aria-label=\"Hovedmeny\">\n {NAVIGATION_MENU.map((section: MenuSection, sectionIndex: number) => (\n <section\n key={sectionIndex}\n className={styles.section}\n style={{ animationDelay: `${0.15 + (sectionIndex * 0.06)}s` }}\n >\n {/* Only show section header for non-subsection layouts */}\n {section.layout !== 'subsections' && (\n <Heading level={2} className={styles.sectionHeader}>\n {section.title}\n </Heading>\n )}\n\n {section.layout === 'subsections' && section.subsections ? (\n <div className={styles.subsectionsGrid}>\n {section.subsections.map((subsection, subsectionIndex) => (\n <div key={subsectionIndex} className={styles.subsection}>\n <Heading level={2} className={styles.subsectionHeader}>\n {subsection.title}\n </Heading>\n <div className={styles.subsectionItems}>\n {subsection.items.map((item, itemIndex) => (\n <NavigationMenuItem\n key={itemIndex}\n item={item}\n animationDelay={(150 + (sectionIndex * 60)) + (subsectionIndex * 40) + (itemIndex * 25)}\n compact\n />\n ))}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className={sectionIndex === 2 ? styles.itemsGridThreeCol : styles.itemsGrid}>\n {section.items?.map((item, itemIndex) => (\n <NavigationMenuItem\n key={itemIndex}\n item={item}\n animationDelay={(150 + (sectionIndex * 60)) + (itemIndex * 25)}\n />\n ))}\n </div>\n )}\n </section>\n ))}\n </nav>\n </div>\n </div>\n </>\n );\n}","export interface MenuItem {\n label: string;\n href: string;\n external?: boolean;\n children?: MenuItem[];\n}\n\nexport interface MenuSubsection {\n title: string;\n items: MenuItem[];\n}\n\nexport interface MenuSection {\n title: string;\n layout?: 'columns' | 'subsections';\n items?: MenuItem[];\n subsections?: MenuSubsection[];\n}\n\nexport const NAVIGATION_MENU: MenuSection[] = [\n {\n title: 'Våre tjenester',\n layout: 'columns',\n items: [\n {\n label: 'Statens eide og leide lokaler',\n href: '/lokaler',\n children: [\n { label: 'Lokalbruk', href: '/lokaler/lokalbruk' },\n { label: 'Statlige eiendommer', href: '/lokaler/statlige-eiendommer' },\n { label: 'Ledig for fremleie', href: '/lokaler/ledig-for-fremleie' },\n { label: 'Statistikk for lokalbruk', href: '/lokaler/statistikk' },\n { label: 'Veiledning', href: '/lokaler/veiledning' },\n ],\n },\n {\n label: 'For leietakere',\n href: '/leietakere',\n children: [\n { label: 'Leieveileder', href: '/leietakere/leieveileder' },\n { label: 'Lenke til underside', href: '/leietakere/lenke1' },\n { label: 'Lenke til underside', href: '/leietakere/lenke2' },\n ],\n },\n {\n label: 'For byggebransjen',\n href: '/byggebransjen',\n children: [\n { label: 'Våre krav', href: '/byggebransjen/vare-krav' },\n { label: 'BIM', href: '/byggebransjen/bim' },\n { label: 'ByggBoks', href: '/byggebransjen/byggboks' },\n { label: 'Lenke til underside', href: '/byggebransjen/lenke' },\n ],\n },\n {\n label: 'Karriere',\n href: '/karriere',\n children: [\n { label: 'Ledige stillinger', href: '/karriere/ledige-stillinger' },\n { label: 'Å jobbe hos oss', href: '/karriere/jobbe-hos-oss' },\n { label: 'Møt en statsbygger', href: '/karriere/mot-en-statsbygger' },\n { label: 'Summer internship', href: '/karriere/summer-internship' },\n { label: 'Studenter og lærlinger', href: '/karriere/studenter-og-laerlinger' },\n ],\n },\n ],\n },\n {\n title: 'Informasjon om statsbygg',\n layout: 'subsections',\n subsections: [\n {\n title: 'Informasjon om statsbygg',\n items: [\n { label: 'Om Statsbygg', href: '/om-statsbygg' },\n { label: 'Samfunnsansvar', href: '/samfunnsansvar' },\n { label: 'Tilgjengelighet', href: '/tilgjengelighet' },\n { label: 'About Statsbygg', href: '/about-statsbygg' },\n { label: 'Statsbygg birra', href: '/statsbygg-birra' },\n ],\n },\n {\n title: 'Kontakt oss',\n items: [\n { label: 'Kontakt oss', href: '/kontakt' },\n { label: 'Ansattsøk', href: '/ansattsok' },\n { label: 'For pressen', href: '/for-pressen' },\n { label: 'Varsling', href: '/varsling' },\n ],\n },\n {\n title: 'Arkiv',\n items: [\n { label: 'Nyheter', href: '/nyheter' },\n { label: 'Artikler om bygg', href: '/artikler-om-bygg' },\n { label: 'Dokumenter', href: '/dokumenter' },\n ],\n },\n ],\n },\n {\n title: 'Eksterne lenker',\n layout: 'columns',\n items: [\n {\n label: 'Statens lokaler',\n href: 'https://statensinnleie.no',\n external: true,\n },\n {\n label: 'Statens innleie',\n href: 'https://statensinnleie.no',\n external: true,\n },\n {\n label: 'MainManager FM',\n href: 'https://mainmanager.no',\n external: true,\n },\n {\n label: 'Offentlig postjournal',\n href: 'https://postjournal.no',\n external: true,\n },\n {\n label: 'SIMBA (BIM)',\n href: 'https://bim.statsbygg.no',\n external: true,\n },\n ],\n },\n];","import { Link, List } from '@digdir/designsystemet-react';\nimport { ExternalLink } from 'lucide-react';\nimport { MenuItem } from '../../navigationMenu';\nimport styles from './NavigationMenuItem.module.css';\nimport { NavigationMenuItemProps } from './NavigationMenuItem.types';\n\nexport function NavigationMenuItem({ item, animationDelay, compact = false }: NavigationMenuItemProps) {\n if (compact) {\n return (\n <div\n className={styles.itemColumn}\n style={{ animationDelay: `${animationDelay}ms` }}\n >\n <Link\n href={item.href}\n className={styles.compactLink}\n target={item.external ? '_blank' : undefined}\n rel={item.external ? 'noopener noreferrer' : undefined}\n >\n {item.label}\n {item.external && (\n <ExternalLink size={16} aria-hidden=\"true\" />\n )}\n </Link>\n </div>\n );\n }\n\n return (\n <div\n className={styles.itemColumn}\n style={{ animationDelay: `${animationDelay}ms` }}\n >\n <Link\n href={item.href}\n className={styles.parentLink}\n target={item.external ? '_blank' : undefined}\n rel={item.external ? 'noopener noreferrer' : undefined}\n >\n {item.label}\n {item.external && (\n <ExternalLink size={20} aria-hidden=\"true\" />\n )}\n </Link>\n\n {item.children && item.children.length > 0 && (\n <List.Unordered className={styles.childItems}>\n {item.children.map((child, childIndex) => (\n <List.Item\n key={childIndex}\n className={styles.childItem}\n style={{ animationDelay: `${animationDelay + 30 + (childIndex * 15)}ms` }}\n >\n <Link\n href={child.href}\n className={styles.childLink}\n target={child.external ? '_blank' : undefined}\n rel={child.external ? 'noopener noreferrer' : undefined}\n >\n {child.label}\n {child.external && (\n <ExternalLink size={20} aria-hidden=\"true\" />\n )}\n </Link>\n </List.Item>\n ))}\n </List.Unordered>\n )}\n </div>\n );\n}","'use client';\n\nimport { Paragraph } from '@digdir/designsystemet-react';\nimport clsx from 'clsx';\nimport type { GlobalFooterProps } from './GlobalFooter.types';\nimport styles from './GlobalFooter.module.css';\n\nexport function GlobalFooter({ className }: GlobalFooterProps) {\n\n return (\n <footer className={clsx(styles.footer, className)}>\n <div className={styles.container}>\n <div className={styles.content}>\n <Paragraph>\n Statsbygg Footer\n </Paragraph>\n\n\n </div>\n </div>\n </footer>\n );\n}"],"mappings":"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","names":["useEffect","clsx","Button","Link","clsx","_a","styles","jsx","styles","jsx","jsxs","Fragment","jsx","jsxs","styles","Search","Fragment","jsx","jsxs","clsx","styles","Link","Button","clsx","styles","jsx","styles","jsx","jsxs","useEffect","clsx","styles"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statsbygg/layout",
3
- "version": "0.0.16",
3
+ "version": "0.1.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -35,7 +35,7 @@
35
35
  "@statsbygg/design-tokens": "^0.3.0"
36
36
  },
37
37
  "dependencies": {
38
- "@digdir/designsystemet-react": "^1.5.1",
38
+ "@digdir/designsystemet-react": "^1.7.0",
39
39
  "clsx": "^2.0.0",
40
40
  "lucide-react": "^0.514.0"
41
41
  },