@statsbygg/layout 0.1.10 → 0.1.12

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/dist/index.d.ts CHANGED
@@ -11,6 +11,10 @@ type RootLayoutProps = {
11
11
  declare function RootLayout({ children, zone, className, }: RootLayoutProps): react_jsx_runtime.JSX.Element;
12
12
 
13
13
  type Theme = 'light' | 'dark' | 'system';
14
+ type BreadcrumbItem = {
15
+ label: string;
16
+ href: string;
17
+ };
14
18
  type GlobalState = {
15
19
  user?: {
16
20
  id: string;
@@ -19,11 +23,15 @@ type GlobalState = {
19
23
  theme: Theme;
20
24
  locale: string;
21
25
  isMenuOpen: boolean;
26
+ zone: string | null;
27
+ breadcrumbs: BreadcrumbItem[] | null;
22
28
  setUser: (user: GlobalState['user']) => void;
23
29
  setTheme: (theme: Theme) => void;
24
30
  setLocale: (locale: string) => void;
25
31
  setIsMenuOpen: (isOpen: boolean) => void;
26
32
  toggleMenu: () => void;
33
+ setZone: (zone: string) => void;
34
+ setBreadcrumbs: (breadcrumbs: BreadcrumbItem[] | null) => void;
27
35
  initialize: () => void | Promise<void>;
28
36
  };
29
37
  declare const useGlobalStore: zustand.UseBoundStore<Omit<zustand.StoreApi<GlobalState>, "setState" | "persist"> & {
@@ -40,4 +48,6 @@ declare const useGlobalStore: zustand.UseBoundStore<Omit<zustand.StoreApi<Global
40
48
  };
41
49
  }>;
42
50
 
43
- export { type GlobalState, RootLayout, type RootLayoutProps, useGlobalStore };
51
+ declare function useBreadcrumbs(breadcrumbs: BreadcrumbItem[]): void;
52
+
53
+ export { type GlobalState, RootLayout, type RootLayoutProps, useBreadcrumbs, useGlobalStore };
package/dist/index.js CHANGED
@@ -151,38 +151,11 @@ function getZoneFromPathname(pathname) {
151
151
  if (pathname.startsWith("/lokaler")) return "lokaler";
152
152
  return "sbno";
153
153
  }
154
-
155
- // src/components/Breadcrumbs/Breadcrumbs.tsx
156
- import { jsx } from "react/jsx-runtime";
157
- function SbBreadcrumbs({ className, zone }) {
158
- const pathname = usePathname();
159
- const isDev = process.env.NODE_ENV === "development";
160
- const prodUrl = "https://www.statsbygg.no";
154
+ function getZonePrefixBreadcrumbs(zone) {
161
155
  const zoneRoot = getZoneRoot(zone);
162
- const fullPath = isDev && zoneRoot !== "/" && !pathname.startsWith(zoneRoot) ? `${zoneRoot}${pathname}` : pathname;
163
- const breadcrumbs = getBreadcrumbs(zone, fullPath);
164
- if (breadcrumbs.length <= 1) {
165
- return null;
166
- }
167
- return /* @__PURE__ */ jsx(Breadcrumbs, { "aria-label": "Du er her:", className: clsx(styles.breadcrumbs, className), children: /* @__PURE__ */ jsx(Breadcrumbs.List, { children: breadcrumbs.map((crumb, index) => {
168
- const isLast = index === breadcrumbs.length - 1;
169
- const href = transformHrefForZone(crumb.href, zone, { isDev, prodUrl });
170
- return /* @__PURE__ */ jsx(Breadcrumbs.Item, { children: /* @__PURE__ */ jsx(
171
- Breadcrumbs.Link,
172
- {
173
- href,
174
- "aria-current": isLast ? "page" : void 0,
175
- className: isLast ? styles.currentLink : styles.link,
176
- children: crumb.label
177
- }
178
- ) }, crumb.href);
179
- }) }) });
156
+ return getBreadcrumbs(zone, zoneRoot);
180
157
  }
181
158
 
182
- // src/components/MenuButton/MenuButton.tsx
183
- import { Button } from "@digdir/designsystemet-react";
184
- import { Menu, X } from "lucide-react";
185
-
186
159
  // src/store/globalState.ts
187
160
  import { create } from "zustand";
188
161
  import { persist, createJSONStorage } from "zustand/middleware";
@@ -192,6 +165,8 @@ var creator = (set, get) => ({
192
165
  theme: "light",
193
166
  locale: "no",
194
167
  isMenuOpen: false,
168
+ zone: null,
169
+ breadcrumbs: null,
195
170
  setUser: (user) => set({ user }),
196
171
  setTheme: (theme) => {
197
172
  set({ theme: ALLOW_DARK_THEME ? theme : "light" });
@@ -202,6 +177,8 @@ var creator = (set, get) => ({
202
177
  setLocale: (locale) => set({ locale }),
203
178
  setIsMenuOpen: (isMenuOpen) => set({ isMenuOpen }),
204
179
  toggleMenu: () => set((state) => ({ isMenuOpen: !state.isMenuOpen })),
180
+ setZone: (zone) => set({ zone }),
181
+ setBreadcrumbs: (breadcrumbs) => set({ breadcrumbs }),
205
182
  initialize: () => {
206
183
  if (typeof document !== "undefined" && ALLOW_DARK_THEME) {
207
184
  document.documentElement.setAttribute("data-color-scheme", get().theme);
@@ -216,11 +193,78 @@ var useGlobalStore = create()(
216
193
  user: state.user,
217
194
  theme: ALLOW_DARK_THEME ? state.theme : "light",
218
195
  locale: state.locale
219
- // Don't persist menu state
220
196
  })
221
197
  })
222
198
  );
223
199
 
200
+ // src/locales/translations.ts
201
+ var translations = {
202
+ no: {
203
+ "common.menu": "Meny",
204
+ "common.close": "Lukk",
205
+ "common.search": "S\xF8k",
206
+ "common.searchLabel": "S\xF8k",
207
+ "common.youAreHere": "Du er her:",
208
+ "common.skipLink": "Hopp til hovedinnhold",
209
+ "common.home": "Hjem",
210
+ "footer.content": "Statsbygg Footer",
211
+ "menu.helpTitle": "Hva kan vi hjelpe deg med?",
212
+ "menu.mainMenuLabel": "Hovedmeny",
213
+ "menu.closeMenu": "Lukk meny",
214
+ "menu.openMenu": "\xC5pne meny"
215
+ }
216
+ };
217
+
218
+ // src/hooks/use-layout-translation.ts
219
+ function useLayoutTranslation() {
220
+ const locale = useGlobalStore((state) => state.locale);
221
+ const languageMap = translations[locale] || translations.no;
222
+ function t(key) {
223
+ return languageMap[key] || key;
224
+ }
225
+ return { t, locale };
226
+ }
227
+
228
+ // src/components/Breadcrumbs/Breadcrumbs.tsx
229
+ import { jsx } from "react/jsx-runtime";
230
+ function SbBreadcrumbs({ className, zone }) {
231
+ const pathname = usePathname();
232
+ const manualBreadcrumbs = useGlobalStore((state) => state.breadcrumbs);
233
+ const isDev = process.env.NODE_ENV === "development";
234
+ const prodUrl = "https://www.statsbygg.no";
235
+ const zoneRoot = getZoneRoot(zone);
236
+ const { t } = useLayoutTranslation();
237
+ const fullPath = isDev && zoneRoot !== "/" && !pathname.startsWith(zoneRoot) ? `${zoneRoot}${pathname}` : pathname;
238
+ const breadcrumbs = manualBreadcrumbs != null ? manualBreadcrumbs : getBreadcrumbs(zone, fullPath);
239
+ if (breadcrumbs.length <= 1) {
240
+ return null;
241
+ }
242
+ return /* @__PURE__ */ jsx(
243
+ Breadcrumbs,
244
+ {
245
+ "aria-label": t("common.youAreHere"),
246
+ className: clsx(styles.breadcrumbs, className),
247
+ children: /* @__PURE__ */ jsx(Breadcrumbs.List, { children: breadcrumbs.map((crumb, index) => {
248
+ const isLast = index === breadcrumbs.length - 1;
249
+ const href = manualBreadcrumbs ? crumb.href : transformHrefForZone(crumb.href, zone, { isDev, prodUrl });
250
+ return /* @__PURE__ */ jsx(Breadcrumbs.Item, { children: /* @__PURE__ */ jsx(
251
+ Breadcrumbs.Link,
252
+ {
253
+ href,
254
+ "aria-current": isLast ? "page" : void 0,
255
+ className: isLast ? styles.currentLink : styles.link,
256
+ children: crumb.label
257
+ }
258
+ ) }, crumb.href);
259
+ }) })
260
+ }
261
+ );
262
+ }
263
+
264
+ // src/components/MenuButton/MenuButton.tsx
265
+ import { Button } from "@digdir/designsystemet-react";
266
+ import { Menu, X } from "lucide-react";
267
+
224
268
  // src/components/NavigationMenu/NavigationMenu.tsx
225
269
  import { useState, useEffect, useRef } from "react";
226
270
  import { Heading, Search } from "@digdir/designsystemet-react";
@@ -421,6 +465,7 @@ function NavigationMenu({ zone }) {
421
465
  const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);
422
466
  const setIsMenuOpen = useGlobalStore((state) => state.setIsMenuOpen);
423
467
  const searchInputRef = useRef(null);
468
+ const { t } = useLayoutTranslation();
424
469
  useEffect(() => {
425
470
  if (!isMenuOpen) return;
426
471
  const handleEscape = (event) => {
@@ -444,58 +489,95 @@ function NavigationMenu({ zone }) {
444
489
  }
445
490
  return /* @__PURE__ */ jsxs2(Fragment, { children: [
446
491
  isMenuOpen && /* @__PURE__ */ jsx3("div", { className: styles3.backdrop, onClick: handleBackdropClick }),
447
- /* @__PURE__ */ jsx3("div", { className: `${styles3.menuOverlay} ${!isMenuOpen ? styles3.hidden : ""}`, children: /* @__PURE__ */ jsxs2("div", { className: styles3.container, children: [
448
- /* @__PURE__ */ jsxs2("div", { className: styles3.searchSection, children: [
449
- /* @__PURE__ */ jsx3(Heading, { level: 1, children: "Hva kan vi hjelpe deg med?" }),
450
- /* @__PURE__ */ jsxs2(Search, { children: [
492
+ /* @__PURE__ */ jsx3(
493
+ "div",
494
+ {
495
+ className: `${styles3.menuOverlay} ${!isMenuOpen ? styles3.hidden : ""}`,
496
+ children: /* @__PURE__ */ jsxs2("div", { className: styles3.container, children: [
497
+ /* @__PURE__ */ jsxs2("div", { className: styles3.searchSection, children: [
498
+ /* @__PURE__ */ jsx3(Heading, { level: 1, children: t("menu.helpTitle") }),
499
+ /* @__PURE__ */ jsxs2(Search, { children: [
500
+ /* @__PURE__ */ jsx3(
501
+ Search.Input,
502
+ {
503
+ "aria-label": t("common.search"),
504
+ ref: searchInputRef,
505
+ value: searchValue,
506
+ onChange: (e) => setSearchValue(e.target.value),
507
+ placeholder: t("common.search"),
508
+ className: styles3.searchField
509
+ }
510
+ ),
511
+ /* @__PURE__ */ jsx3(Search.Clear, {})
512
+ ] })
513
+ ] }),
451
514
  /* @__PURE__ */ jsx3(
452
- Search.Input,
515
+ "nav",
453
516
  {
454
- "aria-label": "S\xF8k",
455
- ref: searchInputRef,
456
- value: searchValue,
457
- onChange: (e) => setSearchValue(e.target.value),
458
- placeholder: "S\xF8k",
459
- className: styles3.searchField
517
+ className: styles3.menuSections,
518
+ "aria-label": t("menu.mainMenuLabel"),
519
+ children: NAVIGATION_MENU.map(
520
+ (section, sectionIndex) => {
521
+ var _a;
522
+ return /* @__PURE__ */ jsxs2(
523
+ "section",
524
+ {
525
+ className: styles3.section,
526
+ style: { animationDelay: `${0.15 + sectionIndex * 0.06}s` },
527
+ children: [
528
+ section.layout !== "subsections" && /* @__PURE__ */ jsx3(Heading, { level: 2, className: styles3.sectionHeader, children: section.title }),
529
+ section.layout === "subsections" && section.subsections ? /* @__PURE__ */ jsx3("div", { className: styles3.subsectionsGrid, children: section.subsections.map(
530
+ (subsection, subsectionIndex) => /* @__PURE__ */ jsxs2(
531
+ "div",
532
+ {
533
+ className: styles3.subsection,
534
+ children: [
535
+ /* @__PURE__ */ jsx3(
536
+ Heading,
537
+ {
538
+ level: 2,
539
+ className: styles3.subsectionHeader,
540
+ children: subsection.title
541
+ }
542
+ ),
543
+ /* @__PURE__ */ jsx3("div", { className: styles3.subsectionItems, children: subsection.items.map((item, itemIndex) => /* @__PURE__ */ jsx3(
544
+ NavigationMenuItem,
545
+ {
546
+ item,
547
+ animationDelay: 150 + sectionIndex * 60 + subsectionIndex * 40 + itemIndex * 25,
548
+ compact: true
549
+ },
550
+ itemIndex
551
+ )) })
552
+ ]
553
+ },
554
+ subsectionIndex
555
+ )
556
+ ) }) : /* @__PURE__ */ jsx3(
557
+ "div",
558
+ {
559
+ className: sectionIndex === 2 ? styles3.itemsGridThreeCol : styles3.itemsGrid,
560
+ children: (_a = section.items) == null ? void 0 : _a.map((item, itemIndex) => /* @__PURE__ */ jsx3(
561
+ NavigationMenuItem,
562
+ {
563
+ item,
564
+ animationDelay: 150 + sectionIndex * 60 + itemIndex * 25
565
+ },
566
+ itemIndex
567
+ ))
568
+ }
569
+ )
570
+ ]
571
+ },
572
+ sectionIndex
573
+ );
574
+ }
575
+ )
460
576
  }
461
- ),
462
- /* @__PURE__ */ jsx3(Search.Clear, {})
577
+ )
463
578
  ] })
464
- ] }),
465
- /* @__PURE__ */ jsx3("nav", { className: styles3.menuSections, "aria-label": "Hovedmeny", children: NAVIGATION_MENU.map((section, sectionIndex) => {
466
- var _a;
467
- return /* @__PURE__ */ jsxs2(
468
- "section",
469
- {
470
- className: styles3.section,
471
- style: { animationDelay: `${0.15 + sectionIndex * 0.06}s` },
472
- children: [
473
- section.layout !== "subsections" && /* @__PURE__ */ jsx3(Heading, { level: 2, className: styles3.sectionHeader, children: section.title }),
474
- section.layout === "subsections" && section.subsections ? /* @__PURE__ */ jsx3("div", { className: styles3.subsectionsGrid, children: section.subsections.map((subsection, subsectionIndex) => /* @__PURE__ */ jsxs2("div", { className: styles3.subsection, children: [
475
- /* @__PURE__ */ jsx3(Heading, { level: 2, className: styles3.subsectionHeader, children: subsection.title }),
476
- /* @__PURE__ */ jsx3("div", { className: styles3.subsectionItems, children: subsection.items.map((item, itemIndex) => /* @__PURE__ */ jsx3(
477
- NavigationMenuItem,
478
- {
479
- item,
480
- animationDelay: 150 + sectionIndex * 60 + subsectionIndex * 40 + itemIndex * 25,
481
- compact: true
482
- },
483
- itemIndex
484
- )) })
485
- ] }, subsectionIndex)) }) : /* @__PURE__ */ jsx3("div", { className: sectionIndex === 2 ? styles3.itemsGridThreeCol : styles3.itemsGrid, children: (_a = section.items) == null ? void 0 : _a.map((item, itemIndex) => /* @__PURE__ */ jsx3(
486
- NavigationMenuItem,
487
- {
488
- item,
489
- animationDelay: 150 + sectionIndex * 60 + itemIndex * 25
490
- },
491
- itemIndex
492
- )) })
493
- ]
494
- },
495
- sectionIndex
496
- );
497
- }) })
498
- ] }) })
579
+ }
580
+ )
499
581
  ] });
500
582
  }
501
583
 
@@ -504,6 +586,7 @@ import { Fragment as Fragment2, jsx as jsx4, jsxs as jsxs3 } from "react/jsx-run
504
586
  function MenuButton({ zone }) {
505
587
  const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);
506
588
  const toggleMenu = useGlobalStore((state) => state.toggleMenu);
589
+ const { t } = useLayoutTranslation();
507
590
  return /* @__PURE__ */ jsxs3(Fragment2, { children: [
508
591
  /* @__PURE__ */ jsxs3(
509
592
  Button,
@@ -511,10 +594,10 @@ function MenuButton({ zone }) {
511
594
  variant: "primary",
512
595
  onClick: toggleMenu,
513
596
  "aria-expanded": isMenuOpen,
514
- "aria-label": isMenuOpen ? "Lukk meny" : "\xC5pne meny",
597
+ "aria-label": isMenuOpen ? t("menu.closeMenu") : t("menu.openMenu"),
515
598
  children: [
516
599
  isMenuOpen ? /* @__PURE__ */ jsx4(X, { size: 20, "aria-hidden": "true" }) : /* @__PURE__ */ jsx4(Menu, { size: 20, "aria-hidden": "true" }),
517
- isMenuOpen ? "Lukk" : "Meny"
600
+ isMenuOpen ? t("common.close") : t("common.menu")
518
601
  ]
519
602
  }
520
603
  ),
@@ -531,6 +614,7 @@ function GlobalHeader({ className, zone }) {
531
614
  const setIsMenuOpen = useGlobalStore((state) => state.setIsMenuOpen);
532
615
  const setTheme = useGlobalStore((state) => state.setTheme);
533
616
  const theme = useGlobalStore((state) => state.theme);
617
+ const { t } = useLayoutTranslation();
534
618
  function toggleDarkMode() {
535
619
  setTheme(theme === "dark" ? "light" : "dark");
536
620
  }
@@ -546,10 +630,10 @@ function GlobalHeader({ className, zone }) {
546
630
  variant: "secondary",
547
631
  onClick: () => setIsMenuOpen(true),
548
632
  className: styles4.searchButton,
549
- "aria-label": "S\xF8k",
633
+ "aria-label": t("common.search"),
550
634
  children: [
551
635
  /* @__PURE__ */ jsx5(Search2, { size: 20, "aria-hidden": "true" }),
552
- "S\xF8k"
636
+ t("common.search")
553
637
  ]
554
638
  }
555
639
  )
@@ -567,7 +651,8 @@ import clsx3 from "clsx";
567
651
  import styles5 from "./GlobalFooter.module.css";
568
652
  import { jsx as jsx6 } from "react/jsx-runtime";
569
653
  function GlobalFooter({ className }) {
570
- 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" }) }) }) });
654
+ const { t } = useLayoutTranslation();
655
+ 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: t("footer.content") }) }) }) });
571
656
  }
572
657
 
573
658
  // src/components/RootLayout/RootLayout.tsx
@@ -580,7 +665,12 @@ function RootLayout({
580
665
  className
581
666
  }) {
582
667
  const initialize = useGlobalStore((state) => state.initialize);
668
+ const setZone = useGlobalStore((state) => state.setZone);
583
669
  const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);
670
+ const { t } = useLayoutTranslation();
671
+ useEffect2(() => {
672
+ setZone(zone);
673
+ }, [zone, setZone]);
584
674
  useEffect2(() => {
585
675
  try {
586
676
  const maybe = initialize();
@@ -594,14 +684,36 @@ function RootLayout({
594
684
  }
595
685
  }, [initialize]);
596
686
  return /* @__PURE__ */ jsxs5("div", { className: clsx4(styles6.root, isMenuOpen && styles6.menuOpen, className), "data-zone": zone, children: [
597
- /* @__PURE__ */ jsx7(SkipLink, { className: styles6.skipLink, href: "#main-content", children: "Hopp til hovedinnhold" }),
687
+ /* @__PURE__ */ jsx7(SkipLink, { className: styles6.skipLink, href: "#main-content", children: t("common.skipLink") }),
598
688
  /* @__PURE__ */ jsx7(GlobalHeader, { zone }),
599
689
  /* @__PURE__ */ jsx7("main", { id: "main-content", tabIndex: -1, className: styles6.main, children }),
600
690
  /* @__PURE__ */ jsx7(GlobalFooter, {})
601
691
  ] });
602
692
  }
693
+
694
+ // src/hooks/use-breadcrumbs.ts
695
+ import { useEffect as useEffect3, useRef as useRef2 } from "react";
696
+ function useBreadcrumbs(breadcrumbs) {
697
+ const setBreadcrumbs = useGlobalStore((state) => state.setBreadcrumbs);
698
+ const zone = useGlobalStore((state) => state.zone);
699
+ const breadcrumbsStringified = JSON.stringify(breadcrumbs);
700
+ const hasSetBreadcrumbs = useRef2(false);
701
+ useEffect3(() => {
702
+ if (!zone || hasSetBreadcrumbs.current) return;
703
+ const zonePrefixBreadcrumbs = getZonePrefixBreadcrumbs(zone);
704
+ const parsedBreadcrumbs = JSON.parse(breadcrumbsStringified);
705
+ const fullBreadcrumbs = [...zonePrefixBreadcrumbs, ...parsedBreadcrumbs];
706
+ setBreadcrumbs(fullBreadcrumbs);
707
+ hasSetBreadcrumbs.current = true;
708
+ return () => {
709
+ setBreadcrumbs(null);
710
+ hasSetBreadcrumbs.current = false;
711
+ };
712
+ }, [zone, breadcrumbsStringified, setBreadcrumbs]);
713
+ }
603
714
  export {
604
715
  RootLayout,
716
+ useBreadcrumbs,
605
717
  useGlobalStore
606
718
  };
607
719
  //# sourceMappingURL=index.js.map
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/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 const isMenuOpen = useGlobalStore((state) => state.isMenuOpen); \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, isMenuOpen && styles.menuOpen, className)} data-zone={zone}>\n <SkipLink className={styles.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 { Button, Link } 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 { 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 \n // function for toggling darkmode lightmode with zustand store\n function toggleDarkMode() {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }\n\n\n return (\n <header className={clsx(styles.header, isMenuOpen && styles.menuOpen, className)}>\n <div className={styles.headerContainer}>\n <div className={styles.topBarContainer}>\n <Link href=\"https://www.statsbygg.no\">\n <img src={'https://dok.statsbygg.no/wp-content/uploads/2025/11/Statsbygg_logo.svg'} 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\nuseEffect(() => {\n if (!isMenuOpen) return;\n\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 return () => {\n document.removeEventListener('keydown', handleEscape);\n };\n}, [setIsMenuOpen, isMenuOpen]);\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: '/for-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"]}
1
+ {"version":3,"sources":["../src/components/RootLayout/RootLayout.tsx","../src/components/GlobalHeader/GlobalHeader.tsx","../src/components/Breadcrumbs/Breadcrumbs.tsx","../src/routes.ts","../src/store/globalState.ts","../src/locales/translations.ts","../src/hooks/use-layout-translation.ts","../src/components/MenuButton/MenuButton.tsx","../src/components/NavigationMenu/NavigationMenu.tsx","../src/navigationMenu.ts","../src/components/NavigationMenuItem/NavigationMenuItem.tsx","../src/components/GlobalFooter/GlobalFooter.tsx","../src/hooks/use-breadcrumbs.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';\nimport { SkipLink } from '@digdir/designsystemet-react';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\n\nexport function RootLayout({\n children,\n zone, \n className,\n}: RootLayoutProps) {\n const initialize = useGlobalStore((state) => state.initialize);\n const setZone = useGlobalStore((state) => state.setZone);\n const isMenuOpen = useGlobalStore((state) => state.isMenuOpen); \n const {t } = useLayoutTranslation();\n\n useEffect(() => {\n setZone(zone);\n }, [zone, setZone]);\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 return (\n <div className={clsx(styles.root, isMenuOpen && styles.menuOpen, className)} data-zone={zone}>\n <SkipLink className={styles.skipLink} href='#main-content'>{t(\"common.skipLink\")}</SkipLink>\n <GlobalHeader zone={zone}/>\n <main id=\"main-content\" tabIndex={-1} className={styles.main}>{children}</main>\n <GlobalFooter />\n </div>\n );\n}","'use client';\n\nimport { Button, Link } 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 { ALLOW_DARK_THEME, useGlobalStore } from '@/store/globalState';\nimport { Search } from 'lucide-react';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\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 const { t } = useLayoutTranslation();\n \n // function for toggling darkmode lightmode with zustand store\n function toggleDarkMode() {\n setTheme(theme === 'dark' ? 'light' : 'dark');\n }\n\n\n return (\n <header className={clsx(styles.header, isMenuOpen && styles.menuOpen, className)}>\n <div className={styles.headerContainer}>\n <div className={styles.topBarContainer}>\n <Link href=\"https://www.statsbygg.no\">\n <img src={'https://dok.statsbygg.no/wp-content/uploads/2025/11/Statsbygg_logo.svg'} 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={t(\"common.search\")}\n >\n <Search size={20} aria-hidden=\"true\" />\n {t(\"common.search\")}\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\";\nimport { useGlobalStore } from \"@/store/globalState\";\nimport { useLayoutTranslation } from \"@/hooks/use-layout-translation\";\n\nexport function SbBreadcrumbs({ className, zone }: BreadcrumbsProps) {\n const pathname = usePathname();\n const manualBreadcrumbs = useGlobalStore((state) => state.breadcrumbs);\n const isDev = process.env.NODE_ENV === \"development\";\n const prodUrl = \"https://www.statsbygg.no\";\n const zoneRoot = getZoneRoot(zone);\n const { t } = useLayoutTranslation();\n\n const fullPath =\n isDev && zoneRoot !== \"/\" && !pathname.startsWith(zoneRoot)\n ? `${zoneRoot}${pathname}`\n : pathname;\n\n const breadcrumbs = manualBreadcrumbs ?? getBreadcrumbs(zone, fullPath);\n\n if (breadcrumbs.length <= 1) {\n return null;\n }\n\n return (\n <Breadcrumbs\n aria-label={t(\"common.youAreHere\")}\n className={clsx(styles.breadcrumbs, className)}\n >\n <Breadcrumbs.List>\n {breadcrumbs.map((crumb, index) => {\n const isLast = index === breadcrumbs.length - 1;\n const href = manualBreadcrumbs\n ? crumb.href\n : 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}\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}\n\nexport function getZonePrefixBreadcrumbs(zone: string): Array<{ label: string; href: string }> {\n const zoneRoot = getZoneRoot(zone);\n return getBreadcrumbs(zone, zoneRoot);\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 BreadcrumbItem = {\n label: string;\n href: string;\n};\n\nexport type GlobalState = {\n user?: { id: string; name?: string } | null;\n theme: Theme;\n locale: string;\n isMenuOpen: boolean;\n zone: string | null;\n breadcrumbs: BreadcrumbItem[] | null;\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 setZone: (zone: string) => void;\n setBreadcrumbs: (breadcrumbs: BreadcrumbItem[] | null) => 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 zone: null,\n breadcrumbs: null,\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 setZone: (zone) => set({ zone }),\n setBreadcrumbs: (breadcrumbs) => set({ breadcrumbs }),\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 }),\n })\n);","export const translations = {\n no: {\n 'common.menu': 'Meny',\n 'common.close': 'Lukk',\n 'common.search': 'Søk',\n 'common.searchLabel': 'Søk',\n 'common.youAreHere': 'Du er her:',\n 'common.skipLink': 'Hopp til hovedinnhold',\n 'common.home': 'Hjem',\n 'footer.content': 'Statsbygg Footer',\n 'menu.helpTitle': 'Hva kan vi hjelpe deg med?',\n 'menu.mainMenuLabel': 'Hovedmeny',\n 'menu.closeMenu': 'Lukk meny',\n 'menu.openMenu': 'Åpne meny',\n }\n};\n\nexport type TranslationKey = keyof typeof translations.no;","import { TranslationKey, translations } from '@/locales/translations';\nimport { useGlobalStore } from '@/store/globalState';\n\nexport function useLayoutTranslation() {\n const locale = useGlobalStore((state) => state.locale) as keyof typeof translations;\n \n const languageMap = translations[locale] || translations.no;\n\n function t(key: TranslationKey): string {\n return languageMap[key] || key;\n }\n\n return { t, locale };\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\";\nimport { useLayoutTranslation } from \"@/hooks/use-layout-translation\";\n\nexport function MenuButton({ zone }: MenuButtonProps) {\n const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);\n const toggleMenu = useGlobalStore((state) => state.toggleMenu);\n const { t } = useLayoutTranslation();\n\n return (\n <>\n <Button\n variant=\"primary\"\n onClick={toggleMenu}\n aria-expanded={isMenuOpen}\n aria-label={isMenuOpen ? t(\"menu.closeMenu\") : t(\"menu.openMenu\")}\n >\n {isMenuOpen ? (\n <X size={20} aria-hidden=\"true\" />\n ) : (\n <Menu size={20} aria-hidden=\"true\" />\n )}\n {isMenuOpen ? t(\"common.close\") : t(\"common.menu\")}\n </Button>\n <NavigationMenu zone={zone} />\n </>\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\";\nimport { useLayoutTranslation } from \"@/hooks/use-layout-translation\";\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 const { t } = useLayoutTranslation();\n\n useEffect(() => {\n if (!isMenuOpen) return;\n\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 return () => {\n document.removeEventListener(\"keydown\", handleEscape);\n };\n }, [setIsMenuOpen, isMenuOpen]);\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 && (\n <div className={styles.backdrop} onClick={handleBackdropClick} />\n )}\n <div\n className={`${styles.menuOverlay} ${!isMenuOpen ? styles.hidden : \"\"}`}\n >\n <div className={styles.container}>\n <div className={styles.searchSection}>\n <Heading level={1}>{t(\"menu.helpTitle\")}</Heading>\n <Search>\n <Search.Input\n aria-label={t(\"common.search\")}\n ref={searchInputRef}\n value={searchValue}\n onChange={(e) => setSearchValue(e.target.value)}\n placeholder={t(\"common.search\")}\n className={styles.searchField}\n />\n <Search.Clear />\n </Search>\n </div>\n\n <nav\n className={styles.menuSections}\n aria-label={t(\"menu.mainMenuLabel\")}\n >\n {NAVIGATION_MENU.map(\n (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(\n (subsection, subsectionIndex) => (\n <div\n key={subsectionIndex}\n className={styles.subsection}\n >\n <Heading\n level={2}\n className={styles.subsectionHeader}\n >\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={\n 150 +\n sectionIndex * 60 +\n subsectionIndex * 40 +\n itemIndex * 25\n }\n compact\n />\n ))}\n </div>\n </div>\n )\n )}\n </div>\n ) : (\n <div\n className={\n sectionIndex === 2\n ? styles.itemsGridThreeCol\n : styles.itemsGrid\n }\n >\n {section.items?.map((item, itemIndex) => (\n <NavigationMenuItem\n key={itemIndex}\n item={item}\n animationDelay={\n 150 + sectionIndex * 60 + itemIndex * 25\n }\n />\n ))}\n </div>\n )}\n </section>\n )\n )}\n </nav>\n </div>\n </div>\n </>\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: '/for-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';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\n\nexport function GlobalFooter({ className }: GlobalFooterProps) {\n const { t } = useLayoutTranslation();\n\n return (\n <footer className={clsx(styles.footer, className)}>\n <div className={styles.container}>\n <div className={styles.content}>\n <Paragraph>\n {t('footer.content')}\n </Paragraph>\n\n\n </div>\n </div>\n </footer>\n );\n}","import { useEffect, useRef } from 'react';\nimport { useGlobalStore, BreadcrumbItem } from '../store/globalState';\nimport { getZonePrefixBreadcrumbs } from '../routes';\n\nexport function useBreadcrumbs(breadcrumbs: BreadcrumbItem[]): void {\n const setBreadcrumbs = useGlobalStore((state) => state.setBreadcrumbs);\n const zone = useGlobalStore((state) => state.zone);\n const breadcrumbsStringified = JSON.stringify(breadcrumbs);\n const hasSetBreadcrumbs = useRef(false);\n\n useEffect(() => {\n if (!zone || hasSetBreadcrumbs.current) return;\n\n const zonePrefixBreadcrumbs = getZonePrefixBreadcrumbs(zone);\n const parsedBreadcrumbs = JSON.parse(breadcrumbsStringified) as BreadcrumbItem[];\n const fullBreadcrumbs = [...zonePrefixBreadcrumbs, ...parsedBreadcrumbs];\n \n setBreadcrumbs(fullBreadcrumbs);\n hasSetBreadcrumbs.current = true;\n\n return () => {\n setBreadcrumbs(null);\n hasSetBreadcrumbs.current = false;\n };\n }, [zone, breadcrumbsStringified, setBreadcrumbs]);\n}"],"mappings":"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","names":["useEffect","clsx","Button","Link","clsx","_a","styles","jsx","styles","jsx","jsxs","styles","Fragment","jsx","jsxs","styles","Search","Fragment","jsx","jsxs","clsx","styles","Link","Button","Search","clsx","styles","jsx","clsx","styles","styles","jsx","jsxs","useEffect","clsx","styles","useEffect","useRef","useRef","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statsbygg/layout",
3
- "version": "0.1.10",
3
+ "version": "0.1.12",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },