@statsbygg/layout 0.1.17 → 0.1.18

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/README.md CHANGED
@@ -267,7 +267,7 @@ npm run lint
267
267
  ## Dependencies
268
268
 
269
269
  This package includes:
270
- - `@digdir/designsystemet-react` ^1.5.1
270
+ - `@digdir/designsystemet-react` 1.9.0
271
271
  - `@statsbygg/design-tokens` ^0.2.0
272
272
  - `clsx` ^2.0.0
273
273
  - `zustand` ^5.0.4
@@ -1,9 +1,17 @@
1
1
  .footer {
2
2
  background-color: var(--ds-color-accent-base-active);
3
- color: var(--ds-color-neutral-base-contrast-default);
3
+ color: var(--ds-color-background-tinted);
4
4
  padding: var(--ds-size-12) var(--ds-size-8) var(--ds-size-12) var(--ds-size-8);
5
5
  }
6
6
 
7
+ .footer a,
8
+ .footer a:hover,
9
+ .footer a:active,
10
+ .footer a:focus,
11
+ .footer a:visited {
12
+ color: var(--ds-color-background-tinted);
13
+ }
14
+
7
15
  .footerContent {
8
16
  font-family: var(--ds-font-family);
9
17
  display: grid;
@@ -43,7 +51,6 @@
43
51
  }
44
52
 
45
53
  .sectionHeading {
46
- color: var(--ds-color-base-contrast-default);
47
54
  font-family: "IBM Plex Sans";
48
55
  font-size: var(--ds-font-size-4);
49
56
  font-style: normal;
@@ -71,15 +78,13 @@
71
78
  gap: var(--ds-size-1);
72
79
  }
73
80
 
81
+ .footerList li {
82
+ margin-top: 0;
83
+ }
84
+
74
85
  .footerSection a {
75
- color: var(--ds-color-neutral-base-contrast-default);
76
86
  text-decoration: none;
77
87
  font-size: var(--ds-font-size-3);
78
- transition: opacity 0.2s;
79
- }
80
-
81
- .footerSection a:hover {
82
- opacity: 0.8;
83
88
  }
84
89
 
85
90
  .externalLink {
@@ -123,7 +128,6 @@
123
128
  .contactHeadingWide,
124
129
  .shortcutsHeadingWide {
125
130
  margin-top: 0;
126
- color: var(--ds-color-background-default);
127
131
  font-family: var(--ds-font-family);
128
132
  font-size: var(--ds-font-size-4);
129
133
  font-style: normal;
@@ -136,7 +140,6 @@
136
140
  .contactHeading {
137
141
  margin-top: 0;
138
142
  margin-bottom: var(--ds-size-2);
139
- color: var(--ds-color-background-default);
140
143
  font-family: var(--ds-font-family);
141
144
  font-size: var(--ds-font-size-4);
142
145
  font-style: normal;
@@ -149,7 +152,6 @@
149
152
  .contactSection a {
150
153
  font-size: 0.875rem;
151
154
  line-height: 1.6;
152
- color: var(--ds-color-neutral-base-contrast-default);
153
155
  text-decoration: none;
154
156
  margin: 0;
155
157
  }
@@ -179,7 +181,6 @@
179
181
  font-weight: bold;
180
182
  text-transform: uppercase;
181
183
  letter-spacing: 0.05em;
182
- color: var(--ds-color-neutral-base-contrast-default);
183
184
  text-align: right;
184
185
  margin: 0;
185
186
  }
package/dist/index.d.ts CHANGED
@@ -19,6 +19,17 @@ type AncestorChain = {
19
19
  declare function findAppRootWithAncestors(node: RouteNode, ancestors?: RouteNode[]): AncestorChain;
20
20
  declare function getBreadcrumbs(routes: RouteNode, pathname: string): BreadcrumbItem[];
21
21
 
22
+ type GlobalHeaderProps = {
23
+ className?: string;
24
+ routes: RouteNode;
25
+ appBasePath?: string;
26
+ pathname?: string;
27
+ };
28
+
29
+ declare function GlobalHeader({ className, routes, appBasePath, pathname }: GlobalHeaderProps & {
30
+ pathname?: string;
31
+ }): react_jsx_runtime.JSX.Element;
32
+
22
33
  type RootLayoutProps = {
23
34
  children: React.ReactNode;
24
35
  routes: RouteNode;
@@ -106,4 +117,4 @@ type MenuSection = {
106
117
  subsections?: MenuSubsection[];
107
118
  };
108
119
 
109
- export { type BreadcrumbItem, GlobalFooter, type GlobalFooterProps, type GlobalState, type MenuItem, type MenuSection, type MenuSubsection, RootLayout, type RootLayoutProps, type RouteNode, SmartLink, type SmartLinkProps, findAppRootWithAncestors, getBreadcrumbs, useBreadcrumbs, useGlobalStore };
120
+ export { type BreadcrumbItem, GlobalFooter, type GlobalFooterProps, GlobalHeader, type GlobalHeaderProps, type GlobalState, type MenuItem, type MenuSection, type MenuSubsection, RootLayout, type RootLayoutProps, type RouteNode, SmartLink, type SmartLinkProps, findAppRootWithAncestors, getBreadcrumbs, useBreadcrumbs, useGlobalStore };
package/dist/index.js CHANGED
@@ -1,10 +1,5 @@
1
1
  "use client";
2
2
 
3
- // src/components/RootLayout/RootLayout.tsx
4
- import { useEffect as useEffect2 } from "react";
5
- import clsx5 from "clsx";
6
- import { SkipLink } from "@digdir/designsystemet-react";
7
-
8
3
  // src/components/GlobalHeader/GlobalHeader.tsx
9
4
  import { Button as Button2, Link as Link3 } from "@digdir/designsystemet-react";
10
5
  import { Search as Search2 } from "lucide-react";
@@ -216,8 +211,8 @@ function BreadcrumbLink({
216
211
  // src/components/Breadcrumbs/Breadcrumbs.tsx
217
212
  import styles from "./Breadcrumbs.module.css";
218
213
  import { jsx as jsx2 } from "react/jsx-runtime";
219
- function SbBreadcrumbs({ className, routes, appBasePath }) {
220
- const pathname = usePathname();
214
+ function SbBreadcrumbs({ className, routes, appBasePath, pathname: propPathname }) {
215
+ const pathname = propPathname != null ? propPathname : usePathname();
221
216
  const manualBreadcrumbs = useGlobalStore((state) => state.breadcrumbs);
222
217
  const { t } = useLayoutTranslation();
223
218
  const breadcrumbs = useMemo(() => {
@@ -615,7 +610,7 @@ function MenuButton({ className, appBasePath }) {
615
610
  // src/components/GlobalHeader/GlobalHeader.tsx
616
611
  import styles4 from "./GlobalHeader.module.css";
617
612
  import { Fragment as Fragment3, jsx as jsx7, jsxs as jsxs4 } from "react/jsx-runtime";
618
- function GlobalHeader({ className, routes, appBasePath }) {
613
+ function GlobalHeader({ className, routes, appBasePath, pathname }) {
619
614
  const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);
620
615
  const setIsMenuOpen = useGlobalStore((state) => state.setIsMenuOpen);
621
616
  const setTheme = useGlobalStore((state) => state.setTheme);
@@ -654,10 +649,15 @@ function GlobalHeader({ className, routes, appBasePath }) {
654
649
  /* @__PURE__ */ jsx7(MenuButton, { appBasePath })
655
650
  ] })
656
651
  ] }),
657
- /* @__PURE__ */ jsx7(SbBreadcrumbs, { routes, appBasePath })
652
+ /* @__PURE__ */ jsx7(SbBreadcrumbs, { routes, appBasePath, pathname })
658
653
  ] }) });
659
654
  }
660
655
 
656
+ // src/components/RootLayout/RootLayout.tsx
657
+ import { useEffect as useEffect2 } from "react";
658
+ import clsx5 from "clsx";
659
+ import { SkipLink } from "@digdir/designsystemet-react";
660
+
661
661
  // src/components/GlobalFooter/GlobalFooter.tsx
662
662
  import { Link as Link4, Heading as Heading2, List as List2, Paragraph } from "@digdir/designsystemet-react";
663
663
  import { ExternalLink as ExternalLink2 } from "lucide-react";
@@ -724,23 +724,23 @@ function GlobalFooter({
724
724
  /* @__PURE__ */ jsxs5(List2.Unordered, { className: styles5.footerList, children: [
725
725
  /* @__PURE__ */ jsx8(List2.Item, { children: /* @__PURE__ */ jsxs5(Link4, { href: "#", className: styles5.socialLink, children: [
726
726
  "LinkedIn",
727
- /* @__PURE__ */ jsx8("img", { src: linkedin_default, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
727
+ /* @__PURE__ */ jsx8("img", { src: typeof linkedin_default === "string" ? linkedin_default : linkedin_default.src, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
728
728
  ] }) }),
729
729
  /* @__PURE__ */ jsx8(List2.Item, { children: /* @__PURE__ */ jsxs5(Link4, { href: "#", className: styles5.socialLink, children: [
730
730
  "Instagram",
731
- /* @__PURE__ */ jsx8("img", { src: instagram_default, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
731
+ /* @__PURE__ */ jsx8("img", { src: typeof instagram_default === "string" ? instagram_default : instagram_default.src, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
732
732
  ] }) }),
733
733
  /* @__PURE__ */ jsx8(List2.Item, { children: /* @__PURE__ */ jsxs5(Link4, { href: "#", className: styles5.socialLink, children: [
734
734
  "Facebook",
735
- /* @__PURE__ */ jsx8("img", { src: facebook_default, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
735
+ /* @__PURE__ */ jsx8("img", { src: typeof facebook_default === "string" ? facebook_default : facebook_default.src, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
736
736
  ] }) }),
737
737
  /* @__PURE__ */ jsx8(List2.Item, { children: /* @__PURE__ */ jsxs5(Link4, { href: "#", className: styles5.socialLink, children: [
738
738
  "YouTube",
739
- /* @__PURE__ */ jsx8("img", { src: youtube_default, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
739
+ /* @__PURE__ */ jsx8("img", { src: typeof youtube_default === "string" ? youtube_default : youtube_default.src, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
740
740
  ] }) }),
741
741
  /* @__PURE__ */ jsx8(List2.Item, { children: /* @__PURE__ */ jsxs5(Link4, { href: "#", className: styles5.socialLink, children: [
742
742
  "Vimeo",
743
- /* @__PURE__ */ jsx8("img", { src: vimeo_default, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
743
+ /* @__PURE__ */ jsx8("img", { src: typeof vimeo_default === "string" ? vimeo_default : vimeo_default.src, alt: "", className: styles5.socialIcon, "aria-hidden": "true" })
744
744
  ] }) })
745
745
  ] })
746
746
  ] }),
@@ -775,7 +775,7 @@ function GlobalFooter({
775
775
  "div",
776
776
  {
777
777
  className: styles5.logoSection,
778
- style: { backgroundImage: `url(${logoUrl})` },
778
+ style: { backgroundImage: `url(${typeof logoUrl === "string" ? logoUrl : logoUrl.src})` },
779
779
  role: "img",
780
780
  "aria-label": logoAlt || t("footer.tagline")
781
781
  }
@@ -815,6 +815,7 @@ function useBreadcrumbs(breadcrumbs) {
815
815
  }
816
816
  export {
817
817
  GlobalFooter,
818
+ GlobalHeader,
818
819
  RootLayout,
819
820
  SmartLink,
820
821
  findAppRootWithAncestors,
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/store/globalState.ts","../src/locales/translations.ts","../src/hooks/use-layout-translation.ts","../src/components/BreadcrumbLink/BreadcrumbLink.tsx","../src/components/MenuButton/MenuButton.tsx","../src/components/NavigationMenu/NavigationMenu.tsx","../src/navigationMenu.ts","../src/components/NavigationMenuItem/NavigationMenuItem.tsx","../src/components/SmartLink/SmartLink.tsx","../src/components/GlobalFooter/GlobalFooter.tsx","../src/hooks/use-breadcrumbs.ts"],"sourcesContent":["'use client';\n\nimport { useEffect } from 'react';\nimport clsx from 'clsx';\nimport { SkipLink } from '@digdir/designsystemet-react';\nimport { GlobalHeader } from '../GlobalHeader';\nimport { GlobalFooter } from '../GlobalFooter';\nimport { useGlobalStore } from '@/store/globalState';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport type { RootLayoutProps } from './RootLayout.types';\nimport styles from './RootLayout.module.css';\n\nexport function RootLayout({ children, routes, appBasePath, className }: RootLayoutProps) {\n const initialize = useGlobalStore((state) => state.initialize);\n const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);\n const { t } = useLayoutTranslation();\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n return (\n <div className={clsx(styles.root, isMenuOpen && styles.menuOpen, className)}>\n <SkipLink className={styles.skipLink} href=\"#main-content\">\n {t('common.skipLink')}\n </SkipLink>\n <GlobalHeader routes={routes} appBasePath={appBasePath} />\n <main id=\"main-content\" tabIndex={-1} className={styles.main}>\n {children}\n </main>\n <GlobalFooter />\n </div>\n );\n}","'use client';\n\nimport { Button, Link } from '@digdir/designsystemet-react';\nimport { Search } from 'lucide-react';\nimport clsx from 'clsx';\nimport { Breadcrumbs } from '../Breadcrumbs';\nimport { MenuButton } from '../MenuButton';\nimport { ALLOW_DARK_THEME, useGlobalStore } from '@/store/globalState';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport type { GlobalHeaderProps } from './GlobalHeader.types';\nimport styles from './GlobalHeader.module.css';\n\nexport function GlobalHeader({ className, routes, appBasePath }: 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 toggleDarkMode() {\n setTheme(theme === 'dark' ? 'light' : 'dark');\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\n src=\"https://dok.statsbygg.no/wp-content/uploads/2025/11/Statsbygg_logo.svg\"\n alt=\"Logo\"\n className={styles.logo}\n />\n </Link>\n <div className={styles.actionsContainer}>\n {!isMenuOpen && (\n <>\n {ALLOW_DARK_THEME && (\n <Button onClick={toggleDarkMode} className={styles.themeToggleButton}>\n {theme === 'dark' ? '☀️' : '🌙'}\n </Button>\n )}\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 )}\n <MenuButton appBasePath={appBasePath} />\n </div>\n </div>\n <Breadcrumbs routes={routes} appBasePath={appBasePath} />\n </div>\n </header>\n );\n}","'use client';\n\nimport { useMemo } from 'react';\nimport { usePathname } from 'next/navigation';\nimport { Breadcrumbs } from '@digdir/designsystemet-react';\nimport clsx from 'clsx';\nimport { getBreadcrumbs, findAppRootWithAncestors, BreadcrumbItem } from '@/routes';\nimport { useGlobalStore } from '@/store/globalState';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport { BreadcrumbLink } from '../BreadcrumbLink';\nimport type { BreadcrumbsProps } from './Breadcrumbs.types';\nimport styles from './Breadcrumbs.module.css';\n\nexport function SbBreadcrumbs({ className, routes, appBasePath }: BreadcrumbsProps) {\n const pathname = usePathname();\n const manualBreadcrumbs = useGlobalStore((state) => state.breadcrumbs);\n const { t } = useLayoutTranslation();\n\n const breadcrumbs = useMemo((): BreadcrumbItem[] => {\n if (manualBreadcrumbs) {\n const { externalAncestors } = findAppRootWithAncestors(routes);\n const baseBreadcrumbs = externalAncestors.map((node) => ({\n label: node.label,\n href: node.path,\n }));\n const manualHrefs = new Set(manualBreadcrumbs.map((b) => b.href));\n const uniqueBase = baseBreadcrumbs.filter((b) => !manualHrefs.has(b.href));\n return [...uniqueBase, ...manualBreadcrumbs];\n }\n return getBreadcrumbs(routes, pathname);\n }, [routes, pathname, manualBreadcrumbs]);\n\n if (breadcrumbs.length === 0) {\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\n return (\n <Breadcrumbs.Item key={`${crumb.href}-${index}`}>\n <BreadcrumbLink\n href={crumb.href}\n ariaCurrent={isLast ? 'page' : undefined}\n className={isLast ? styles.currentLink : styles.link}\n >\n {crumb.label}\n </BreadcrumbLink>\n </Breadcrumbs.Item>\n );\n })}\n </Breadcrumbs.List>\n </Breadcrumbs>\n );\n}","export type RouteNode = {\n path: string;\n label: string;\n children?: RouteNode[];\n};\n\nexport type BreadcrumbItem = {\n label: string;\n href: string;\n};\n\nfunction isExternalPath(path: string): boolean {\n return path.startsWith('http://') || path.startsWith('https://');\n}\n\nfunction normalizePath(path: string): string {\n if (path === '/') return '/';\n return path.replace(/\\/+$/, '');\n}\n\nfunction formatSegmentLabel(segment: string): string {\n try {\n const decoded = decodeURIComponent(segment).replace(/[-_]+/g, ' ').trim();\n return decoded ? decoded.charAt(0).toUpperCase() + decoded.slice(1) : segment;\n } catch {\n return segment;\n }\n}\n\ntype AncestorChain = {\n externalAncestors: RouteNode[];\n appRoot: RouteNode | null;\n};\n\nexport function findAppRootWithAncestors(node: RouteNode, ancestors: RouteNode[] = []): AncestorChain {\n if (!isExternalPath(node.path)) {\n return {\n externalAncestors: ancestors,\n appRoot: node,\n };\n }\n\n if (node.children) {\n for (const child of node.children) {\n const result = findAppRootWithAncestors(child, [...ancestors, node]);\n if (result.appRoot) return result;\n }\n }\n\n return { externalAncestors: ancestors, appRoot: null };\n}\n\ntype InternalMatch = {\n node: RouteNode;\n ancestors: RouteNode[];\n};\n\nfunction findInternalMatch(\n node: RouteNode,\n pathname: string,\n ancestors: RouteNode[] = []\n): InternalMatch | null {\n const nodePath = normalizePath(node.path);\n\n if (pathname === nodePath) {\n return { node, ancestors };\n }\n\n if (node.children) {\n for (const child of node.children) {\n if (isExternalPath(child.path)) continue;\n\n const result = findInternalMatch(child, pathname, [...ancestors, node]);\n if (result) return result;\n }\n }\n\n const pathPrefix = nodePath === '/' ? '/' : nodePath + '/';\n if (pathname.startsWith(pathPrefix) || pathname === nodePath) {\n return { node, ancestors };\n }\n\n return null;\n}\n\nexport function getBreadcrumbs(routes: RouteNode, pathname: string): BreadcrumbItem[] {\n const normalizedPathname = normalizePath(pathname);\n const { externalAncestors, appRoot } = findAppRootWithAncestors(routes);\n\n if (!appRoot) {\n return externalAncestors.map((node) => ({\n label: node.label,\n href: node.path,\n }));\n }\n\n const breadcrumbs: BreadcrumbItem[] = externalAncestors.map((node) => ({\n label: node.label,\n href: node.path,\n }));\n\n const internalMatch = findInternalMatch(appRoot, normalizedPathname);\n\n if (!internalMatch) {\n breadcrumbs.push({ label: appRoot.label, href: appRoot.path });\n return breadcrumbs;\n }\n\n for (const ancestor of internalMatch.ancestors) {\n breadcrumbs.push({\n label: ancestor.label,\n href: ancestor.path,\n });\n }\n\n breadcrumbs.push({\n label: internalMatch.node.label,\n href: internalMatch.node.path,\n });\n\n const matchedPath = normalizePath(internalMatch.node.path);\n if (normalizedPathname !== matchedPath) {\n const remainingPath = normalizedPathname.slice(\n matchedPath === '/' ? 1 : matchedPath.length + 1\n );\n const dynamicSegments = remainingPath.split('/').filter(Boolean);\n\n let accumulatedPath = matchedPath;\n for (const segment of dynamicSegments) {\n accumulatedPath = accumulatedPath === '/' ? `/${segment}` : `${accumulatedPath}/${segment}`;\n breadcrumbs.push({\n label: formatSegmentLabel(segment),\n href: accumulatedPath,\n });\n }\n }\n\n return breadcrumbs;\n}","import { create, StateCreator } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\nimport type { BreadcrumbItem } from '../routes';\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 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 setBreadcrumbs: (breadcrumbs: BreadcrumbItem[] | null) => void;\n initialize: () => 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 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 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.shortcuts': 'Snarveier',\n 'footer.news': 'Nyheter',\n 'footer.press': 'For pressen',\n 'footer.whistleblowing': 'Varsling',\n 'footer.privacy': 'Personvern og informasjonskapsler',\n 'footer.accessibility': 'Tilgjengelighet',\n 'footer.about': 'About Statsbygg / Statsbygg birra',\n 'footer.publications': 'Publikasjoner',\n 'footer.stateFacilities': 'Statens lokaler',\n 'footer.mmfmHelpdesk': 'MMFM – helpdesk',\n 'footer.simba': 'Simba – Statsbyggs BIM-sider',\n 'footer.stateRental': 'Statens innleie',\n 'footer.publicJournal': 'Søk innsyn via offentlig postjournal',\n 'footer.followUs': 'Følg oss',\n 'footer.contactUs': 'Kontakt oss',\n 'footer.phone': 'Telefon',\n 'footer.findEmployee': 'Finn en ansatt',\n 'footer.visitAddress': 'Besøksadresse',\n 'footer.postalAddress': 'Postadresse',\n 'footer.tagline': 'Bygg med mening',\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 Link from 'next/link';\nimport type { ReactNode } from 'react';\n\ntype BreadcrumbLinkProps = {\n href: string;\n className?: string;\n ariaCurrent?: 'page' | undefined;\n children: ReactNode;\n};\n\n/**\n * Renders breadcrumb links correctly:\n * - External URLs (http/https): standard anchor tag\n * - Internal paths: Next.js Link (handles basePath automatically)\n */\nexport function BreadcrumbLink({\n href,\n className,\n ariaCurrent,\n children,\n}: BreadcrumbLinkProps) {\n const isExternal = href.startsWith('http://') || href.startsWith('https://');\n\n if (isExternal) {\n return (\n <a href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </a>\n );\n }\n\n return (\n <Link href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </Link>\n );\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 { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport type { MenuButtonProps } from './MenuButton.types';\n\nexport function MenuButton({ className, appBasePath }: 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 className={className}\n >\n {isMenuOpen ? <X size={20} aria-hidden=\"true\" /> : <Menu size={20} aria-hidden=\"true\" />}\n {isMenuOpen ? t('common.close') : t('common.menu')}\n </Button>\n <NavigationMenu appBasePath={appBasePath} />\n </>\n );\n}","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { Heading, Search } from '@digdir/designsystemet-react';\nimport { NAVIGATION_MENU, MenuSection } from '../../navigationMenu';\nimport { NavigationMenuItem } from '../NavigationMenuItem/NavigationMenuItem';\nimport { useGlobalStore } from '../../store/globalState';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport type { NavigationMenuProps } from './NavigationMenu.types';\nimport styles from './NavigationMenu.module.css';\n\nexport function NavigationMenu({ className, appBasePath }: 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 const { t } = useLayoutTranslation();\n\n useEffect(() => {\n if (!isMenuOpen) return;\n\n function 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 return () => document.removeEventListener('keydown', handleEscape);\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 : ''} ${className ?? ''}`}>\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 className={styles.menuSections} aria-label={t('menu.mainMenuLabel')}>\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 {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={\n 150 + sectionIndex * 60 + subsectionIndex * 40 + itemIndex * 25\n }\n appBasePath={appBasePath}\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 appBasePath={appBasePath}\n />\n ))}\n </div>\n )}\n </section>\n ))}\n </nav>\n </div>\n </div>\n </>\n );\n}","export type MenuItem = {\n label: string;\n href: string;\n external?: boolean;\n children?: MenuItem[];\n};\n\nexport type MenuSubsection = {\n title: string;\n items: MenuItem[];\n};\n\nexport type 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: '/for-leietakere/leieveileder' },\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 ],\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];","'use client';\n\nimport { List } from '@digdir/designsystemet-react';\nimport { ExternalLink } from 'lucide-react';\nimport { usePathname } from 'next/navigation';\nimport clsx from 'clsx';\nimport { SmartLink } from '../SmartLink';\nimport type { MenuItem } from '../../navigationMenu';\nimport type { NavigationMenuItemProps } from './NavigationMenuItem.types';\nimport styles from './NavigationMenuItem.module.css';\n\nexport function NavigationMenuItem({\n item,\n animationDelay,\n compact = false,\n appBasePath,\n}: NavigationMenuItemProps) {\n const pathname = usePathname();\n\n const isActive = (href: string) => {\n if (href === '/') return pathname === '/';\n return pathname?.startsWith(href);\n };\n\n const isParentActive = isActive(item.href);\n\n if (compact) {\n return (\n <div\n className={styles.itemColumn}\n style={{ animationDelay: `${animationDelay}ms` }}\n >\n <SmartLink\n href={item.href}\n appBasePath={appBasePath}\n external={item.external}\n className={clsx(styles.compactLink, isParentActive && styles.active)}\n >\n {item.label}\n {item.external && <ExternalLink size={16} aria-hidden=\"true\" />}\n </SmartLink>\n </div>\n );\n }\n\n return (\n <div\n className={styles.itemColumn}\n style={{ animationDelay: `${animationDelay}ms` }}\n >\n <SmartLink\n href={item.href}\n appBasePath={appBasePath}\n external={item.external}\n className={clsx(styles.parentLink, isParentActive && styles.active)}\n >\n {item.label}\n {item.external && <ExternalLink size={20} aria-hidden=\"true\" />}\n </SmartLink>\n\n {item.children && item.children.length > 0 && (\n <List.Unordered className={styles.childItems}>\n {item.children.map((child: MenuItem, childIndex: number) => {\n const isChildActive = isActive(child.href);\n\n return (\n <List.Item\n key={childIndex}\n className={styles.childItem}\n style={{ animationDelay: `${animationDelay + 30 + childIndex * 15}ms` }}\n >\n <SmartLink\n href={child.href}\n appBasePath={appBasePath}\n external={child.external}\n className={clsx(styles.childLink, isChildActive && styles.active)}\n >\n {child.label}\n {child.external && <ExternalLink size={16} aria-hidden=\"true\" />}\n </SmartLink>\n </List.Item>\n );\n })}\n </List.Unordered>\n )}\n </div>\n );\n}","'use client';\n\nimport Link from 'next/link';\nimport { Link as DsLink } from '@digdir/designsystemet-react';\nimport type { SmartLinkProps } from './SmartLink.types';\n\n/**\n * Determines if a given href belongs to the current zone, another zone or should be external\n */\nexport function SmartLink({\n href,\n appBasePath,\n external = false,\n className,\n children,\n}: SmartLinkProps) {\n const isExternalUrl = href.startsWith('http://') || href.startsWith('https://');\n const isLocalRoute =\n appBasePath &&\n !isExternalUrl &&\n (href === appBasePath || href.startsWith(`${appBasePath}/`));\n\n if (isExternalUrl || external) {\n return (\n <DsLink\n href={href}\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </DsLink>\n );\n }\n\n if (isLocalRoute) {\n // Strip the basePath\n const localHref = href.replace(appBasePath, '') || '/';\n\n return (\n <Link href={localHref} className={className}>\n {children}\n </Link>\n );\n }\n\n // Cross-zone navigation: use standard anchor for full page load\n return (\n <DsLink href={href} className={className}>\n {children}\n </DsLink>\n );\n}","'use client';\n\nimport { Link, Heading, List, Paragraph } from '@digdir/designsystemet-react';\nimport { ExternalLink } from 'lucide-react';\nimport clsx from 'clsx';\nimport type { GlobalFooterProps } from './GlobalFooter.types';\nimport styles from './GlobalFooter.module.css';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport footerImage from '@/assets/images/footer.png';\nimport { linkedinIcon, instagramIcon, facebookIcon, youtubeIcon, vimeoIcon } from '@/assets/images/icons';\n\nexport function GlobalFooter({ \n className,\n logoUrl = footerImage,\n logoAlt\n}: GlobalFooterProps) {\n const { t } = useLayoutTranslation();\n\n return (\n <footer className={clsx(styles.footer, className)}>\n <div className={styles.footerContent}>\n <div className={clsx(styles.footerLeft, styles.shortcutsContainer)}>\n <div className={styles.shortcutsHeadingWide}>\n <Heading level={2} data-size=\"2xs\" className={styles.sectionHeading}>\n {t('footer.shortcuts')}\n </Heading>\n </div>\n <div className={styles.footerSection}>\n <List.Unordered className={styles.footerList}>\n <List.Item><Link href=\"#\">{t('footer.news')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.press')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.whistleblowing')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.privacy')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.accessibility')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.about')}</Link></List.Item>\n </List.Unordered>\n </div>\n <div className={styles.footerSection}>\n <List.Unordered className={styles.footerList}>\n <List.Item><Link href=\"#\">{t('footer.publications')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.stateFacilities')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.mmfmHelpdesk')}</Link></List.Item>\n <List.Item>\n <Link href=\"https://simba.statsbygg.no/\" className={styles.externalLink} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('footer.simba')}\n <ExternalLink size={14} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"https://statensinnleie.no\" className={styles.externalLink} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('footer.stateRental')}\n <ExternalLink size={14} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"https://einnsyn.no/sok?f=0279324b-adee-4116-ae84-3895f61c0db9\" className={styles.externalLink} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('footer.publicJournal')}\n <ExternalLink size={14} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n </List.Unordered>\n </div>\n </div>\n\n <div className={clsx(styles.footerSection, styles.socialLinks)}>\n <Heading level={2} data-size=\"2xs\" className={styles.sectionHeading}>\n {t('footer.followUs')}\n </Heading>\n <List.Unordered className={styles.footerList}>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n LinkedIn\n <img src={linkedinIcon} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n Instagram\n <img src={instagramIcon} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n Facebook\n <img src={facebookIcon} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n YouTube\n <img src={youtubeIcon} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n Vimeo\n <img src={vimeoIcon} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n </List.Unordered>\n </div>\n\n <div className={styles.footerLeftWide}>\n <div className={clsx(styles.footerSection, styles.contactSectionsContainer)}>\n <div className={styles.contactHeadingWide}>\n <Heading level={2} data-size=\"2xs\" className={styles.sectionHeading}>\n {t('footer.contactUs')}\n </Heading>\n </div>\n <div className={styles.contactSection}>\n <Paragraph data-size=\"sm\">\n <Link href=\"tel:22955000\">{t('footer.phone')}: 22 95 50 00</Link>\n </Paragraph>\n <Paragraph data-size=\"sm\">\n <Link href=\"mailto:postmottak@statsbygg.no\">postmottak@statsbygg.no</Link>\n </Paragraph>\n <Paragraph data-size=\"sm\">\n <Link href=\"#\">{t('footer.findEmployee')}</Link>\n </Paragraph>\n </div>\n\n <div className={styles.contactSection}>\n <Heading level={2} data-size=\"2xs\" className={styles.contactHeading}>\n {t('footer.visitAddress')}\n </Heading>\n <Paragraph data-size=\"sm\">\n Biskop Gunnerus' gate 6,<br />\n 0155 Oslo (Byporten)\n </Paragraph>\n </div>\n\n <div className={styles.contactSection}>\n <Heading level={2} data-size=\"2xs\" className={styles.contactHeading}>\n {t('footer.postalAddress')}\n </Heading>\n <Paragraph data-size=\"sm\">\n Postboks 232 Sentrum,<br />\n 0103 Oslo\n </Paragraph>\n </div>\n </div>\n </div>\n\n <div className={clsx(styles.footerSection, styles.socialLinks, styles.footerLogo)}>\n <div \n className={styles.logoSection}\n style={{ backgroundImage: `url(${logoUrl})` }}\n role=\"img\"\n aria-label={logoAlt || t('footer.tagline')}\n />\n </div>\n </div>\n </footer>\n );\n}","import { useEffect } from 'react';\nimport { useGlobalStore } from '../store/globalState';\nimport type { BreadcrumbItem } from '../routes';\n\n/**\n * Hook for manually setting breadcrumbs on dynamic routes.\n * Overrides automatic breadcrumb generation, preserving external ancestors.\n *\n * @param breadcrumbs - Array of breadcrumb items for the current dynamic route\n */\nexport function useBreadcrumbs(breadcrumbs: BreadcrumbItem[]): void {\n const setBreadcrumbs = useGlobalStore((state) => state.setBreadcrumbs);\n const serialized = JSON.stringify(breadcrumbs);\n\n useEffect(() => {\n setBreadcrumbs(JSON.parse(serialized));\n\n return () => {\n setBreadcrumbs(null);\n };\n }, [serialized, setBreadcrumbs]);\n}"],"mappings":";;;AAEA,SAAS,aAAAA,kBAAiB;AAC1B,OAAOC,WAAU;AACjB,SAAS,gBAAgB;;;ACFzB,SAAS,UAAAC,SAAQ,QAAAC,aAAY;AAC7B,SAAS,UAAAC,eAAc;AACvB,OAAOC,WAAU;;;ACFjB,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,OAAO,UAAU;;;ACMjB,SAAS,eAAe,MAAuB;AAC7C,SAAO,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU;AACjE;AAEA,SAAS,cAAc,MAAsB;AAC3C,MAAI,SAAS,IAAK,QAAO;AACzB,SAAO,KAAK,QAAQ,QAAQ,EAAE;AAChC;AAEA,SAAS,mBAAmB,SAAyB;AACnD,MAAI;AACF,UAAM,UAAU,mBAAmB,OAAO,EAAE,QAAQ,UAAU,GAAG,EAAE,KAAK;AACxE,WAAO,UAAU,QAAQ,OAAO,CAAC,EAAE,YAAY,IAAI,QAAQ,MAAM,CAAC,IAAI;AAAA,EACxE,SAAQ;AACN,WAAO;AAAA,EACT;AACF;AAOO,SAAS,yBAAyB,MAAiB,YAAyB,CAAC,GAAkB;AACpG,MAAI,CAAC,eAAe,KAAK,IAAI,GAAG;AAC9B,WAAO;AAAA,MACL,mBAAmB;AAAA,MACnB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,MAAI,KAAK,UAAU;AACjB,eAAW,SAAS,KAAK,UAAU;AACjC,YAAM,SAAS,yBAAyB,OAAO,CAAC,GAAG,WAAW,IAAI,CAAC;AACnE,UAAI,OAAO,QAAS,QAAO;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO,EAAE,mBAAmB,WAAW,SAAS,KAAK;AACvD;AAOA,SAAS,kBACP,MACA,UACA,YAAyB,CAAC,GACJ;AACtB,QAAM,WAAW,cAAc,KAAK,IAAI;AAExC,MAAI,aAAa,UAAU;AACzB,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,MAAI,KAAK,UAAU;AACjB,eAAW,SAAS,KAAK,UAAU;AACjC,UAAI,eAAe,MAAM,IAAI,EAAG;AAEhC,YAAM,SAAS,kBAAkB,OAAO,UAAU,CAAC,GAAG,WAAW,IAAI,CAAC;AACtE,UAAI,OAAQ,QAAO;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,aAAa,aAAa,MAAM,MAAM,WAAW;AACvD,MAAI,SAAS,WAAW,UAAU,KAAK,aAAa,UAAU;AAC5D,WAAO,EAAE,MAAM,UAAU;AAAA,EAC3B;AAEA,SAAO;AACT;AAEO,SAAS,eAAe,QAAmB,UAAoC;AACpF,QAAM,qBAAqB,cAAc,QAAQ;AACjD,QAAM,EAAE,mBAAmB,QAAQ,IAAI,yBAAyB,MAAM;AAEtE,MAAI,CAAC,SAAS;AACZ,WAAO,kBAAkB,IAAI,CAAC,UAAU;AAAA,MACtC,OAAO,KAAK;AAAA,MACZ,MAAM,KAAK;AAAA,IACb,EAAE;AAAA,EACJ;AAEA,QAAM,cAAgC,kBAAkB,IAAI,CAAC,UAAU;AAAA,IACrE,OAAO,KAAK;AAAA,IACZ,MAAM,KAAK;AAAA,EACb,EAAE;AAEF,QAAM,gBAAgB,kBAAkB,SAAS,kBAAkB;AAEnE,MAAI,CAAC,eAAe;AAClB,gBAAY,KAAK,EAAE,OAAO,QAAQ,OAAO,MAAM,QAAQ,KAAK,CAAC;AAC7D,WAAO;AAAA,EACT;AAEA,aAAW,YAAY,cAAc,WAAW;AAC9C,gBAAY,KAAK;AAAA,MACf,OAAO,SAAS;AAAA,MAChB,MAAM,SAAS;AAAA,IACjB,CAAC;AAAA,EACH;AAEA,cAAY,KAAK;AAAA,IACf,OAAO,cAAc,KAAK;AAAA,IAC1B,MAAM,cAAc,KAAK;AAAA,EAC3B,CAAC;AAED,QAAM,cAAc,cAAc,cAAc,KAAK,IAAI;AACzD,MAAI,uBAAuB,aAAa;AACtC,UAAM,gBAAgB,mBAAmB;AAAA,MACvC,gBAAgB,MAAM,IAAI,YAAY,SAAS;AAAA,IACjD;AACA,UAAM,kBAAkB,cAAc,MAAM,GAAG,EAAE,OAAO,OAAO;AAE/D,QAAI,kBAAkB;AACtB,eAAW,WAAW,iBAAiB;AACrC,wBAAkB,oBAAoB,MAAM,IAAI,OAAO,KAAK,GAAG,eAAe,IAAI,OAAO;AACzF,kBAAY,KAAK;AAAA,QACf,OAAO,mBAAmB,OAAO;AAAA,QACjC,MAAM;AAAA,MACR,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC1IA,SAAS,cAA4B;AACrC,SAAS,SAAS,yBAAyB;AAKpC,IAAM,mBAAmB;AAiBhC,IAAM,UAAqE,CAAC,KAAK,SAAS;AAAA,EACxF,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,SAAS,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC;AAAA,EAC/B,UAAU,CAAC,UAAU;AACnB,QAAI,EAAE,OAAO,mBAAmB,QAAQ,QAAQ,CAAC;AACjD,QAAI,OAAO,aAAa,eAAe,kBAAkB;AACvD,eAAS,gBAAgB,aAAa,qBAAqB,KAAK;AAAA,IAClE;AAAA,EACF;AAAA,EACA,WAAW,CAAC,WAAW,IAAI,EAAE,OAAO,CAAC;AAAA,EACrC,eAAe,CAAC,eAAe,IAAI,EAAE,WAAW,CAAC;AAAA,EACjD,YAAY,MAAM,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,MAAM,WAAW,EAAE;AAAA,EACpE,gBAAgB,CAAC,gBAAgB,IAAI,EAAE,YAAY,CAAC;AAAA,EACpD,YAAY,MAAM;AAChB,QAAI,OAAO,aAAa,eAAe,kBAAkB;AACvD,eAAS,gBAAgB,aAAa,qBAAqB,IAAI,EAAE,KAAK;AAAA,IACxE;AAAA,EACF;AACF;AAEO,IAAM,iBAAiB,OAAoB;AAAA,EAChD,QAAQ,SAAS;AAAA,IACf,MAAM;AAAA,IACN,SAAS,kBAAkB,MAAM,YAAY;AAAA,IAC7C,YAAY,CAAC,WAAW;AAAA,MACtB,MAAM,MAAM;AAAA,MACZ,OAAO,mBAAmB,MAAM,QAAQ;AAAA,MACxC,QAAQ,MAAM;AAAA,IAChB;AAAA,EACF,CAAC;AACH;;;ACzDO,IAAM,eAAe;AAAA,EAC1B,IAAI;AAAA,IACF,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,iBAAiB;AAAA,IACjB,sBAAsB;AAAA,IACtB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,eAAe;AAAA,IACf,gBAAgB;AAAA,IAChB,yBAAyB;AAAA,IACzB,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,0BAA0B;AAAA,IAC1B,uBAAuB;AAAA,IACvB,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,wBAAwB;AAAA,IACxB,mBAAmB;AAAA,IACnB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,uBAAuB;AAAA,IACvB,uBAAuB;AAAA,IACvB,wBAAwB;AAAA,IACxB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,sBAAsB;AAAA,IACtB,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,EACnB;AACF;;;AC/BO,SAAS,uBAAuB;AACrC,QAAM,SAAS,eAAe,CAAC,UAAU,MAAM,MAAM;AAErD,QAAM,cAAc,aAAa,MAAM,KAAK,aAAa;AAEzD,WAAS,EAAE,KAA6B;AACtC,WAAO,YAAY,GAAG,KAAK;AAAA,EAC7B;AAEA,SAAO,EAAE,GAAG,OAAO;AACrB;;;ACXA,OAAO,UAAU;AAyBX;AAVC,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,aAAa,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU;AAE3E,MAAI,YAAY;AACd,WACE,oBAAC,OAAE,MAAY,WAAsB,gBAAc,aAChD,UACH;AAAA,EAEJ;AAEA,SACE,oBAAC,QAAK,MAAY,WAAsB,gBAAc,aACnD,UACH;AAEJ;;;AL3BA,OAAO,YAAY;AAoCL,gBAAAC,YAAA;AAlCP,SAAS,cAAc,EAAE,WAAW,QAAQ,YAAY,GAAqB;AAClF,QAAM,WAAW,YAAY;AAC7B,QAAM,oBAAoB,eAAe,CAAC,UAAU,MAAM,WAAW;AACrE,QAAM,EAAE,EAAE,IAAI,qBAAqB;AAEnC,QAAM,cAAc,QAAQ,MAAwB;AAClD,QAAI,mBAAmB;AACrB,YAAM,EAAE,kBAAkB,IAAI,yBAAyB,MAAM;AAC7D,YAAM,kBAAkB,kBAAkB,IAAI,CAAC,UAAU;AAAA,QACvD,OAAO,KAAK;AAAA,QACZ,MAAM,KAAK;AAAA,MACb,EAAE;AACF,YAAM,cAAc,IAAI,IAAI,kBAAkB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAChE,YAAM,aAAa,gBAAgB,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,EAAE,IAAI,CAAC;AACzE,aAAO,CAAC,GAAG,YAAY,GAAG,iBAAiB;AAAA,IAC7C;AACA,WAAO,eAAe,QAAQ,QAAQ;AAAA,EACxC,GAAG,CAAC,QAAQ,UAAU,iBAAiB,CAAC;AAExC,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO;AAAA,EACT;AAEA,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,cAAY,EAAE,mBAAmB;AAAA,MACjC,WAAW,KAAK,OAAO,aAAa,SAAS;AAAA,MAE7C,0BAAAA,KAAC,YAAY,MAAZ,EACE,sBAAY,IAAI,CAAC,OAAO,UAAU;AACjC,cAAM,SAAS,UAAU,YAAY,SAAS;AAE9C,eACE,gBAAAA,KAAC,YAAY,MAAZ,EACC,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,MAAM;AAAA,YACZ,aAAa,SAAS,SAAS;AAAA,YAC/B,WAAW,SAAS,OAAO,cAAc,OAAO;AAAA,YAE/C,gBAAM;AAAA;AAAA,QACT,KAPqB,GAAG,MAAM,IAAI,IAAI,KAAK,EAQ7C;AAAA,MAEJ,CAAC,GACH;AAAA;AAAA,EACF;AAEJ;;;AM1DA,SAAS,cAAc;AACvB,SAAS,MAAM,SAAS;;;ACDxB,SAAS,UAAU,WAAW,cAAc;AAC5C,SAAS,SAAS,cAAc;;;ACgBzB,IAAM,kBAAiC;AAAA,EAC5C;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,UACR,EAAE,OAAO,aAAa,MAAM,qBAAqB;AAAA,UACjD,EAAE,OAAO,uBAAuB,MAAM,+BAA+B;AAAA,UACrE,EAAE,OAAO,sBAAsB,MAAM,8BAA8B;AAAA,UACnE,EAAE,OAAO,4BAA4B,MAAM,sBAAsB;AAAA,UACjE,EAAE,OAAO,cAAc,MAAM,sBAAsB;AAAA,QACrD;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,UACR,EAAE,OAAO,gBAAgB,MAAM,+BAA+B;AAAA,QAChE;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,UACR,EAAE,OAAO,gBAAa,MAAM,2BAA2B;AAAA,UACvD,EAAE,OAAO,OAAO,MAAM,qBAAqB;AAAA,UAC3C,EAAE,OAAO,YAAY,MAAM,0BAA0B;AAAA,QACvD;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,UACR,EAAE,OAAO,qBAAqB,MAAM,8BAA8B;AAAA,UAClE,EAAE,OAAO,sBAAmB,MAAM,0BAA0B;AAAA,UAC5D,EAAE,OAAO,yBAAsB,MAAM,+BAA+B;AAAA,UACpE,EAAE,OAAO,qBAAqB,MAAM,8BAA8B;AAAA,UAClE,EAAE,OAAO,6BAA0B,MAAM,oCAAoC;AAAA,QAC/E;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,aAAa;AAAA,MACX;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,UACL,EAAE,OAAO,gBAAgB,MAAM,gBAAgB;AAAA,UAC/C,EAAE,OAAO,kBAAkB,MAAM,kBAAkB;AAAA,UACnD,EAAE,OAAO,mBAAmB,MAAM,mBAAmB;AAAA,UACrD,EAAE,OAAO,mBAAmB,MAAM,mBAAmB;AAAA,UACrD,EAAE,OAAO,mBAAmB,MAAM,mBAAmB;AAAA,QACvD;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,UACL,EAAE,OAAO,eAAe,MAAM,WAAW;AAAA,UACzC,EAAE,OAAO,gBAAa,MAAM,aAAa;AAAA,UACzC,EAAE,OAAO,eAAe,MAAM,eAAe;AAAA,UAC7C,EAAE,OAAO,YAAY,MAAM,YAAY;AAAA,QACzC;AAAA,MACF;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,OAAO;AAAA,UACL,EAAE,OAAO,WAAW,MAAM,WAAW;AAAA,UACrC,EAAE,OAAO,oBAAoB,MAAM,oBAAoB;AAAA,UACvD,EAAE,OAAO,cAAc,MAAM,cAAc;AAAA,QAC7C;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,OAAO;AAAA,MACL;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,MACA;AAAA,QACE,OAAO;AAAA,QACP,MAAM;AAAA,QACN,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AACF;;;AC9HA,SAAS,YAAY;AACrB,SAAS,oBAAoB;AAC7B,SAAS,eAAAC,oBAAmB;AAC5B,OAAOC,WAAU;;;ACHjB,OAAOC,WAAU;AACjB,SAAS,QAAQ,cAAc;AAqBzB,gBAAAC,YAAA;AAfC,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,gBAAgB,KAAK,WAAW,SAAS,KAAK,KAAK,WAAW,UAAU;AAC9E,QAAM,eACJ,eACA,CAAC,kBACA,SAAS,eAAe,KAAK,WAAW,GAAG,WAAW,GAAG;AAE5D,MAAI,iBAAiB,UAAU;AAC7B,WACE,gBAAAA;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,QAAO;AAAA,QACP,KAAI;AAAA,QAEH;AAAA;AAAA,IACH;AAAA,EAEJ;AAEA,MAAI,cAAc;AAEhB,UAAM,YAAY,KAAK,QAAQ,aAAa,EAAE,KAAK;AAEnD,WACE,gBAAAA,KAACD,OAAA,EAAK,MAAM,WAAW,WACpB,UACH;AAAA,EAEJ;AAGA,SACE,gBAAAC,KAAC,UAAO,MAAY,WACjB,UACH;AAEJ;;;AD3CA,OAAOC,aAAY;AAuBX,SAOoB,OAAAC,MAPpB;AArBD,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAA4B;AAC1B,QAAM,WAAWC,aAAY;AAE7B,QAAM,WAAW,CAAC,SAAiB;AACjC,QAAI,SAAS,IAAK,QAAO,aAAa;AACtC,WAAO,qCAAU,WAAW;AAAA,EAC9B;AAEA,QAAM,iBAAiB,SAAS,KAAK,IAAI;AAEzC,MAAI,SAAS;AACX,WACE,gBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,WAAWD,QAAO;AAAA,QAClB,OAAO,EAAE,gBAAgB,GAAG,cAAc,KAAK;AAAA,QAE/C;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX;AAAA,YACA,UAAU,KAAK;AAAA,YACf,WAAWG,MAAKH,QAAO,aAAa,kBAAkBA,QAAO,MAAM;AAAA,YAElE;AAAA,mBAAK;AAAA,cACL,KAAK,YAAY,gBAAAC,KAAC,gBAAa,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,QAC/D;AAAA;AAAA,IACF;AAAA,EAEJ;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAWD,QAAO;AAAA,MAClB,OAAO,EAAE,gBAAgB,GAAG,cAAc,KAAK;AAAA,MAE/C;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX;AAAA,YACA,UAAU,KAAK;AAAA,YACf,WAAWG,MAAKH,QAAO,YAAY,kBAAkBA,QAAO,MAAM;AAAA,YAEjE;AAAA,mBAAK;AAAA,cACL,KAAK,YAAY,gBAAAC,KAAC,gBAAa,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,QAC/D;AAAA,QAEC,KAAK,YAAY,KAAK,SAAS,SAAS,KACvC,gBAAAA,KAAC,KAAK,WAAL,EAAe,WAAWD,QAAO,YAC/B,eAAK,SAAS,IAAI,CAAC,OAAiB,eAAuB;AAC1D,gBAAM,gBAAgB,SAAS,MAAM,IAAI;AAEzC,iBACE,gBAAAC;AAAA,YAAC,KAAK;AAAA,YAAL;AAAA,cAEC,WAAWD,QAAO;AAAA,cAClB,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,KAAK,aAAa,EAAE,KAAK;AAAA,cAEtE;AAAA,gBAAC;AAAA;AAAA,kBACC,MAAM,MAAM;AAAA,kBACZ;AAAA,kBACA,UAAU,MAAM;AAAA,kBAChB,WAAWG,MAAKH,QAAO,WAAW,iBAAiBA,QAAO,MAAM;AAAA,kBAE/D;AAAA,0BAAM;AAAA,oBACN,MAAM,YAAY,gBAAAC,KAAC,gBAAa,MAAM,IAAI,eAAY,QAAO;AAAA;AAAA;AAAA,cAChE;AAAA;AAAA,YAZK;AAAA,UAaP;AAAA,QAEJ,CAAC,GACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AF9EA,OAAOG,aAAY;AAiCf,mBACiB,OAAAC,MAKT,QAAAC,aANR;AA/BG,SAAS,eAAe,EAAE,WAAW,YAAY,GAAwB;AAC9E,QAAM,CAAC,aAAa,cAAc,IAAI,SAAS,EAAE;AACjD,QAAM,aAAa,eAAe,CAAC,UAAU,MAAM,UAAU;AAC7D,QAAM,gBAAgB,eAAe,CAAC,UAAU,MAAM,aAAa;AACnE,QAAM,iBAAiB,OAAyB,IAAI;AACpD,QAAM,EAAE,EAAE,IAAI,qBAAqB;AAEnC,YAAU,MAAM;AACd,QAAI,CAAC,WAAY;AAEjB,aAAS,aAAa,OAAsB;AAC1C,UAAI,MAAM,QAAQ,UAAU;AAC1B,sBAAc,KAAK;AAAA,MACrB;AAAA,IACF;AAEA,eAAW,MAAM;AA3BrB;AA4BM,2BAAe,YAAf,mBAAwB;AAAA,IAC1B,GAAG,GAAG;AAEN,aAAS,iBAAiB,WAAW,YAAY;AACjD,WAAO,MAAM,SAAS,oBAAoB,WAAW,YAAY;AAAA,EACnE,GAAG,CAAC,eAAe,UAAU,CAAC;AAE9B,WAAS,oBAAoB,GAAqC;AAChE,QAAI,EAAE,WAAW,EAAE,eAAe;AAChC,oBAAc,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,SACE,gBAAAA,MAAA,YACG;AAAA,kBAAc,gBAAAD,KAAC,SAAI,WAAWD,QAAO,UAAU,SAAS,qBAAqB;AAAA,IAC9E,gBAAAC,KAAC,SAAI,WAAW,GAAGD,QAAO,WAAW,IAAI,CAAC,aAAaA,QAAO,SAAS,EAAE,IAAI,gCAAa,EAAE,IAC1F,0BAAAE,MAAC,SAAI,WAAWF,QAAO,WACrB;AAAA,sBAAAE,MAAC,SAAI,WAAWF,QAAO,eACrB;AAAA,wBAAAC,KAAC,WAAQ,OAAO,GAAI,YAAE,gBAAgB,GAAE;AAAA,QACxC,gBAAAC,MAAC,UACC;AAAA,0BAAAD;AAAA,YAAC,OAAO;AAAA,YAAP;AAAA,cACC,cAAY,EAAE,eAAe;AAAA,cAC7B,KAAK;AAAA,cACL,OAAO;AAAA,cACP,UAAU,CAAC,MAAM,eAAe,EAAE,OAAO,KAAK;AAAA,cAC9C,aAAa,EAAE,eAAe;AAAA,cAC9B,WAAWD,QAAO;AAAA;AAAA,UACpB;AAAA,UACA,gBAAAC,KAAC,OAAO,OAAP,EAAa;AAAA,WAChB;AAAA,SACF;AAAA,MAEA,gBAAAA,KAAC,SAAI,WAAWD,QAAO,cAAc,cAAY,EAAE,oBAAoB,GACpE,0BAAgB,IAAI,CAAC,SAAsB,iBAAsB;AA9D9E;AA+Dc,+BAAAE;AAAA,UAAC;AAAA;AAAA,YAEC,WAAWF,QAAO;AAAA,YAClB,OAAO,EAAE,gBAAgB,GAAG,OAAO,eAAe,IAAI,IAAI;AAAA,YAEzD;AAAA,sBAAQ,WAAW,iBAClB,gBAAAC,KAAC,WAAQ,OAAO,GAAG,WAAWD,QAAO,eAClC,kBAAQ,OACX;AAAA,cAGD,QAAQ,WAAW,iBAAiB,QAAQ,cAC3C,gBAAAC,KAAC,SAAI,WAAWD,QAAO,iBACpB,kBAAQ,YAAY,IAAI,CAAC,YAAY,oBACpC,gBAAAE,MAAC,SAA0B,WAAWF,QAAO,YAC3C;AAAA,gCAAAC,KAAC,WAAQ,OAAO,GAAG,WAAWD,QAAO,kBAClC,qBAAW,OACd;AAAA,gBACA,gBAAAC,KAAC,SAAI,WAAWD,QAAO,iBACpB,qBAAW,MAAM,IAAI,CAAC,MAAM,cAC3B,gBAAAC;AAAA,kBAAC;AAAA;AAAA,oBAEC;AAAA,oBACA,gBACE,MAAM,eAAe,KAAK,kBAAkB,KAAK,YAAY;AAAA,oBAE/D;AAAA,oBACA,SAAO;AAAA;AAAA,kBANF;AAAA,gBAOP,CACD,GACH;AAAA,mBAhBQ,eAiBV,CACD,GACH,IAEA,gBAAAA,KAAC,SAAI,WAAW,iBAAiB,IAAID,QAAO,oBAAoBA,QAAO,WACpE,wBAAQ,UAAR,mBAAe,IAAI,CAAC,MAAM,cACzB,gBAAAC;AAAA,gBAAC;AAAA;AAAA,kBAEC;AAAA,kBACA,gBAAgB,MAAM,eAAe,KAAK,YAAY;AAAA,kBACtD;AAAA;AAAA,gBAHK;AAAA,cAIP,IAEJ;AAAA;AAAA;AAAA,UA3CG;AAAA,QA6CP;AAAA,OACD,GACH;AAAA,OACF,GACF;AAAA,KACF;AAEJ;;;ADrGI,qBAAAE,WAQkB,OAAAC,MAPhB,QAAAC,aADF;AANG,SAAS,WAAW,EAAE,WAAW,YAAY,GAAoB;AACtE,QAAM,aAAa,eAAe,CAAC,UAAU,MAAM,UAAU;AAC7D,QAAM,aAAa,eAAe,CAAC,UAAU,MAAM,UAAU;AAC7D,QAAM,EAAE,EAAE,IAAI,qBAAqB;AAEnC,SACE,gBAAAA,MAAAF,WAAA,EACE;AAAA,oBAAAE;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,SAAS;AAAA,QACT,iBAAe;AAAA,QACf,cAAY,aAAa,EAAE,gBAAgB,IAAI,EAAE,eAAe;AAAA,QAChE;AAAA,QAEC;AAAA,uBAAa,gBAAAD,KAAC,KAAE,MAAM,IAAI,eAAY,QAAO,IAAK,gBAAAA,KAAC,QAAK,MAAM,IAAI,eAAY,QAAO;AAAA,UACrF,aAAa,EAAE,cAAc,IAAI,EAAE,aAAa;AAAA;AAAA;AAAA,IACnD;AAAA,IACA,gBAAAA,KAAC,kBAAe,aAA0B;AAAA,KAC5C;AAEJ;;;APnBA,OAAOE,aAAY;AAkBP,SAQE,YAAAC,WARF,OAAAC,MAcI,QAAAC,aAdJ;AAhBL,SAAS,aAAa,EAAE,WAAW,QAAQ,YAAY,GAAsB;AAClF,QAAM,aAAa,eAAe,CAAC,UAAU,MAAM,UAAU;AAC7D,QAAM,gBAAgB,eAAe,CAAC,UAAU,MAAM,aAAa;AACnE,QAAM,WAAW,eAAe,CAAC,UAAU,MAAM,QAAQ;AACzD,QAAM,QAAQ,eAAe,CAAC,UAAU,MAAM,KAAK;AACnD,QAAM,EAAE,EAAE,IAAI,qBAAqB;AAEnC,WAAS,iBAAiB;AACxB,aAAS,UAAU,SAAS,UAAU,MAAM;AAAA,EAC9C;AAEA,SACE,gBAAAD,KAAC,YAAO,WAAWE,MAAKJ,QAAO,QAAQ,cAAcA,QAAO,UAAU,SAAS,GAC7E,0BAAAG,MAAC,SAAI,WAAWH,QAAO,iBACrB;AAAA,oBAAAG,MAAC,SAAI,WAAWH,QAAO,iBACrB;AAAA,sBAAAE,KAACG,OAAA,EAAK,MAAK,4BACT,0BAAAH;AAAA,QAAC;AAAA;AAAA,UACC,KAAI;AAAA,UACJ,KAAI;AAAA,UACJ,WAAWF,QAAO;AAAA;AAAA,MACpB,GACF;AAAA,MACA,gBAAAG,MAAC,SAAI,WAAWH,QAAO,kBACpB;AAAA,SAAC,cACA,gBAAAG,MAAAF,WAAA,EACG;AAAA,8BACC,gBAAAC,KAACI,SAAA,EAAO,SAAS,gBAAgB,WAAWN,QAAO,mBAChD,oBAAU,SAAS,iBAAO,aAC7B;AAAA,UAEF,gBAAAG;AAAA,YAACG;AAAA,YAAA;AAAA,cACC,SAAQ;AAAA,cACR,SAAS,MAAM,cAAc,IAAI;AAAA,cACjC,WAAWN,QAAO;AAAA,cAClB,cAAY,EAAE,eAAe;AAAA,cAE7B;AAAA,gCAAAE,KAACK,SAAA,EAAO,MAAM,IAAI,eAAY,QAAO;AAAA,gBACpC,EAAE,eAAe;AAAA;AAAA;AAAA,UACpB;AAAA,WACF;AAAA,QAEF,gBAAAL,KAAC,cAAW,aAA0B;AAAA,SACxC;AAAA,OACF;AAAA,IACA,gBAAAA,KAAC,iBAAY,QAAgB,aAA0B;AAAA,KACzD,GACF;AAEJ;;;AY1DA,SAAS,QAAAM,OAAM,WAAAC,UAAS,QAAAC,OAAM,iBAAiB;AAC/C,SAAS,gBAAAC,qBAAoB;AAC7B,OAAOC,WAAU;AAEjB,OAAOC,aAAY;A;;;;;;;;;;;;;;;;;;;;AAiBL,gBAAAC,MAKF,QAAAC,aALE;AAZP,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,UAAU;AAAA,EACV;AACF,GAAsB;AACpB,QAAM,EAAE,EAAE,IAAI,qBAAqB;AAEnC,SACE,gBAAAD,KAAC,YAAO,WAAWE,MAAKC,QAAO,QAAQ,SAAS,GAC9C,0BAAAF,MAAC,SAAI,WAAWE,QAAO,eACrB;AAAA,oBAAAF,MAAC,SAAI,WAAWC,MAAKC,QAAO,YAAYA,QAAO,kBAAkB,GAC/D;AAAA,sBAAAH,KAAC,SAAI,WAAWG,QAAO,sBACnB,0BAAAH,KAACI,UAAA,EAAQ,OAAO,GAAG,aAAU,OAAM,WAAWD,QAAO,gBAClD,YAAE,kBAAkB,GACvB,GACJ;AAAA,MACA,gBAAAH,KAAC,SAAI,WAAWG,QAAO,eACrB,0BAAAF,MAACI,MAAK,WAAL,EAAe,WAAWF,QAAO,YAChC;AAAA,wBAAAH,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,aAAa,GAAE,GAAO;AAAA,QACnD,gBAAAN,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,cAAc,GAAE,GAAO;AAAA,QACpD,gBAAAN,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,uBAAuB,GAAE,GAAO;AAAA,QAC7D,gBAAAN,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,gBAAgB,GAAE,GAAO;AAAA,QACtD,gBAAAN,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,sBAAsB,GAAE,GAAO;AAAA,QAC5D,gBAAAN,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,cAAc,GAAE,GAAO;AAAA,SACtD,GACF;AAAA,MACA,gBAAAN,KAAC,SAAI,WAAWG,QAAO,eACrB,0BAAAF,MAACI,MAAK,WAAL,EAAe,WAAWF,QAAO,YAChC;AAAA,wBAAAH,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,qBAAqB,GAAE,GAAO;AAAA,QAC3D,gBAAAN,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,wBAAwB,GAAE,GAAO;AAAA,QAC9D,gBAAAN,KAACK,MAAK,MAAL,EAAU,0BAAAL,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,qBAAqB,GAAE,GAAO;AAAA,QAC3D,gBAAAN,KAACK,MAAK,MAAL,EACC,0BAAAJ,MAACK,OAAA,EAAK,MAAK,+BAA8B,WAAWH,QAAO,cAAc,QAAO,UAAS,KAAI,uBAC1F;AAAA,YAAE,cAAc;AAAA,UACjB,gBAAAH,KAACO,eAAA,EAAa,MAAM,IAAI,eAAY,QAAO;AAAA,WAC7C,GACF;AAAA,QACA,gBAAAP,KAACK,MAAK,MAAL,EACC,0BAAAJ,MAACK,OAAA,EAAK,MAAK,6BAA4B,WAAWH,QAAO,cAAc,QAAO,UAAS,KAAI,uBACxF;AAAA,YAAE,oBAAoB;AAAA,UACvB,gBAAAH,KAACO,eAAA,EAAa,MAAM,IAAI,eAAY,QAAO;AAAA,WAC7C,GACF;AAAA,QACA,gBAAAP,KAACK,MAAK,MAAL,EACC,0BAAAJ,MAACK,OAAA,EAAK,MAAK,iEAAgE,WAAWH,QAAO,cAAc,QAAO,UAAS,KAAI,uBAC5H;AAAA,YAAE,sBAAsB;AAAA,UACzB,gBAAAH,KAACO,eAAA,EAAa,MAAM,IAAI,eAAY,QAAO;AAAA,WAC7C,GACF;AAAA,SACF,GACF;AAAA,OACF;AAAA,IAEA,gBAAAN,MAAC,SAAI,WAAWC,MAAKC,QAAO,eAAeA,QAAO,WAAW,GAC3D;AAAA,sBAAAH,KAACI,UAAA,EAAQ,OAAO,GAAG,aAAU,OAAM,WAAWD,QAAO,gBAClD,YAAE,iBAAiB,GACtB;AAAA,MACA,gBAAAF,MAACI,MAAK,WAAL,EAAe,WAAWF,QAAO,YAChC;AAAA,wBAAAH,KAACK,MAAK,MAAL,EACC,0BAAAJ,MAACK,OAAA,EAAK,MAAK,KAAI,WAAWH,QAAO,YAAY;AAAA;AAAA,UAE3C,gBAAAH,KAAC,SAAI,KAAK,kBAAc,KAAI,IAAG,WAAWG,QAAO,YAAY,eAAY,QAAO;AAAA,WAClF,GACF;AAAA,QACA,gBAAAH,KAACK,MAAK,MAAL,EACC,0BAAAJ,MAACK,OAAA,EAAK,MAAK,KAAI,WAAWH,QAAO,YAAY;AAAA;AAAA,UAE3C,gBAAAH,KAAC,SAAI,KAAK,mBAAe,KAAI,IAAG,WAAWG,QAAO,YAAY,eAAY,QAAO;AAAA,WACnF,GACF;AAAA,QACA,gBAAAH,KAACK,MAAK,MAAL,EACC,0BAAAJ,MAACK,OAAA,EAAK,MAAK,KAAI,WAAWH,QAAO,YAAY;AAAA;AAAA,UAE3C,gBAAAH,KAAC,SAAI,KAAK,kBAAc,KAAI,IAAG,WAAWG,QAAO,YAAY,eAAY,QAAO;AAAA,WAClF,GACF;AAAA,QACA,gBAAAH,KAACK,MAAK,MAAL,EACC,0BAAAJ,MAACK,OAAA,EAAK,MAAK,KAAI,WAAWH,QAAO,YAAY;AAAA;AAAA,UAE3C,gBAAAH,KAAC,SAAI,KAAK,iBAAa,KAAI,IAAG,WAAWG,QAAO,YAAY,eAAY,QAAO;AAAA,WACjF,GACF;AAAA,QACA,gBAAAH,KAACK,MAAK,MAAL,EACC,0BAAAJ,MAACK,OAAA,EAAK,MAAK,KAAI,WAAWH,QAAO,YAAY;AAAA;AAAA,UAE3C,gBAAAH,KAAC,SAAI,KAAK,eAAW,KAAI,IAAG,WAAWG,QAAO,YAAY,eAAY,QAAO;AAAA,WAC/E,GACF;AAAA,SACF;AAAA,OACF;AAAA,IAEA,gBAAAH,KAAC,SAAI,WAAWG,QAAO,gBACrB,0BAAAF,MAAC,SAAI,WAAWC,MAAKC,QAAO,eAAeA,QAAO,wBAAwB,GACxE;AAAA,sBAAAH,KAAC,SAAI,WAAWG,QAAO,oBACrB,0BAAAH,KAACI,UAAA,EAAQ,OAAO,GAAG,aAAU,OAAM,WAAWD,QAAO,gBAClD,YAAE,kBAAkB,GACvB,GACF;AAAA,MACA,gBAAAF,MAAC,SAAI,WAAWE,QAAO,gBACrB;AAAA,wBAAAH,KAAC,aAAU,aAAU,MACnB,0BAAAC,MAACK,OAAA,EAAK,MAAK,gBAAgB;AAAA,YAAE,cAAc;AAAA,UAAE;AAAA,WAAa,GAC5D;AAAA,QACA,gBAAAN,KAAC,aAAU,aAAU,MACnB,0BAAAA,KAACM,OAAA,EAAK,MAAK,kCAAiC,qCAAuB,GACrE;AAAA,QACA,gBAAAN,KAAC,aAAU,aAAU,MACnB,0BAAAA,KAACM,OAAA,EAAK,MAAK,KAAK,YAAE,qBAAqB,GAAE,GAC3C;AAAA,SACF;AAAA,MAEA,gBAAAL,MAAC,SAAI,WAAWE,QAAO,gBACrB;AAAA,wBAAAH,KAACI,UAAA,EAAQ,OAAO,GAAG,aAAU,OAAM,WAAWD,QAAO,gBAClD,YAAE,qBAAqB,GAC1B;AAAA,QACA,gBAAAF,MAAC,aAAU,aAAU,MAAK;AAAA;AAAA,UACA,gBAAAD,KAAC,QAAG;AAAA,UAAE;AAAA,WAEhC;AAAA,SACF;AAAA,MAEA,gBAAAC,MAAC,SAAI,WAAWE,QAAO,gBACrB;AAAA,wBAAAH,KAACI,UAAA,EAAQ,OAAO,GAAG,aAAU,OAAM,WAAWD,QAAO,gBAClD,YAAE,sBAAsB,GAC3B;AAAA,QACA,gBAAAF,MAAC,aAAU,aAAU,MAAK;AAAA;AAAA,UACH,gBAAAD,KAAC,QAAG;AAAA,UAAE;AAAA,WAE7B;AAAA,SACF;AAAA,OACF,GACF;AAAA,IAEA,gBAAAA,KAAC,SAAI,WAAWE,MAAKC,QAAO,eAAeA,QAAO,aAAaA,QAAO,UAAU,GAC9E,0BAAAH;AAAA,MAAC;AAAA;AAAA,QACC,WAAWG,QAAO;AAAA,QAClB,OAAO,EAAE,iBAAiB,OAAO,OAAO,IAAI;AAAA,QAC5C,MAAK;AAAA,QACL,cAAY,WAAW,EAAE,gBAAgB;AAAA;AAAA,IAC3C,GACF;AAAA,KACF,GACF;AAEJ;;;AbhJA,OAAOK,aAAY;AAYf,SACE,OAAAC,MADF,QAAAC,aAAA;AAVG,SAAS,WAAW,EAAE,UAAU,QAAQ,aAAa,UAAU,GAAoB;AACxF,QAAM,aAAa,eAAe,CAAC,UAAU,MAAM,UAAU;AAC7D,QAAM,aAAa,eAAe,CAAC,UAAU,MAAM,UAAU;AAC7D,QAAM,EAAE,EAAE,IAAI,qBAAqB;AAEnC,EAAAC,WAAU,MAAM;AACd,eAAW;AAAA,EACb,GAAG,CAAC,UAAU,CAAC;AAEf,SACE,gBAAAD,MAAC,SAAI,WAAWE,MAAKJ,QAAO,MAAM,cAAcA,QAAO,UAAU,SAAS,GACxE;AAAA,oBAAAC,KAAC,YAAS,WAAWD,QAAO,UAAU,MAAK,iBACxC,YAAE,iBAAiB,GACtB;AAAA,IACA,gBAAAC,KAAC,gBAAa,QAAgB,aAA0B;AAAA,IACxD,gBAAAA,KAAC,UAAK,IAAG,gBAAe,UAAU,IAAI,WAAWD,QAAO,MACrD,UACH;AAAA,IACA,gBAAAC,KAAC,gBAAa;AAAA,KAChB;AAEJ;;;AcjCA,SAAS,aAAAI,kBAAiB;AAUnB,SAAS,eAAe,aAAqC;AAClE,QAAM,iBAAiB,eAAe,CAAC,UAAU,MAAM,cAAc;AACrE,QAAM,aAAa,KAAK,UAAU,WAAW;AAE7C,EAAAC,WAAU,MAAM;AACd,mBAAe,KAAK,MAAM,UAAU,CAAC;AAErC,WAAO,MAAM;AACX,qBAAe,IAAI;AAAA,IACrB;AAAA,EACF,GAAG,CAAC,YAAY,cAAc,CAAC;AACjC;","names":["useEffect","clsx","Button","Link","Search","clsx","jsx","usePathname","clsx","Link","jsx","styles","jsx","usePathname","clsx","styles","jsx","jsxs","Fragment","jsx","jsxs","styles","Fragment","jsx","jsxs","clsx","Link","Button","Search","Link","Heading","List","ExternalLink","clsx","styles","jsx","jsxs","clsx","styles","Heading","List","Link","ExternalLink","styles","jsx","jsxs","useEffect","clsx","useEffect","useEffect"]}
1
+ {"version":3,"sources":["../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/BreadcrumbLink/BreadcrumbLink.tsx","../src/components/MenuButton/MenuButton.tsx","../src/components/NavigationMenu/NavigationMenu.tsx","../src/navigationMenu.ts","../src/components/NavigationMenuItem/NavigationMenuItem.tsx","../src/components/SmartLink/SmartLink.tsx","../src/components/RootLayout/RootLayout.tsx","../src/components/GlobalFooter/GlobalFooter.tsx","../src/hooks/use-breadcrumbs.ts"],"sourcesContent":["'use client';\n\nimport { Button, Link } from '@digdir/designsystemet-react';\nimport { Search } from 'lucide-react';\nimport clsx from 'clsx';\nimport { Breadcrumbs } from '../Breadcrumbs';\nimport { MenuButton } from '../MenuButton';\nimport { ALLOW_DARK_THEME, useGlobalStore } from '@/store/globalState';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport type { GlobalHeaderProps } from './GlobalHeader.types';\nimport styles from './GlobalHeader.module.css';\n\nexport function GlobalHeader({ className, routes, appBasePath, pathname }: GlobalHeaderProps & { pathname?: string }) {\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 toggleDarkMode() {\n setTheme(theme === 'dark' ? 'light' : 'dark');\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\n src=\"https://dok.statsbygg.no/wp-content/uploads/2025/11/Statsbygg_logo.svg\"\n alt=\"Logo\"\n className={styles.logo}\n />\n </Link>\n <div className={styles.actionsContainer}>\n {!isMenuOpen && (\n <>\n {ALLOW_DARK_THEME && (\n <Button onClick={toggleDarkMode} className={styles.themeToggleButton}>\n {theme === 'dark' ? '☀️' : '🌙'}\n </Button>\n )}\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 )}\n <MenuButton appBasePath={appBasePath} />\n </div>\n </div>\n <Breadcrumbs routes={routes} appBasePath={appBasePath} pathname={pathname} />\n </div>\n </header>\n );\n}","'use client';\n\nimport { useMemo } from 'react';\nimport { usePathname } from 'next/navigation';\nimport { Breadcrumbs } from '@digdir/designsystemet-react';\nimport clsx from 'clsx';\nimport { getBreadcrumbs, findAppRootWithAncestors, BreadcrumbItem } from '@/routes';\nimport { useGlobalStore } from '@/store/globalState';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport { BreadcrumbLink } from '../BreadcrumbLink';\nimport type { BreadcrumbsProps } from './Breadcrumbs.types';\nimport styles from './Breadcrumbs.module.css';\n\nexport function SbBreadcrumbs({ className, routes, appBasePath, pathname: propPathname }: BreadcrumbsProps) {\n const pathname = propPathname ?? usePathname();\n const manualBreadcrumbs = useGlobalStore((state) => state.breadcrumbs);\n const { t } = useLayoutTranslation();\n\n const breadcrumbs = useMemo((): BreadcrumbItem[] => {\n if (manualBreadcrumbs) {\n const { externalAncestors } = findAppRootWithAncestors(routes);\n const baseBreadcrumbs = externalAncestors.map((node) => ({\n label: node.label,\n href: node.path,\n }));\n const manualHrefs = new Set(manualBreadcrumbs.map((b) => b.href));\n const uniqueBase = baseBreadcrumbs.filter((b) => !manualHrefs.has(b.href));\n return [...uniqueBase, ...manualBreadcrumbs];\n }\n return getBreadcrumbs(routes, pathname);\n }, [routes, pathname, manualBreadcrumbs]);\n\n if (breadcrumbs.length === 0) {\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\n return (\n <Breadcrumbs.Item key={`${crumb.href}-${index}`}>\n <BreadcrumbLink\n href={crumb.href}\n ariaCurrent={isLast ? 'page' : undefined}\n className={isLast ? styles.currentLink : styles.link}\n >\n {crumb.label}\n </BreadcrumbLink>\n </Breadcrumbs.Item>\n );\n })}\n </Breadcrumbs.List>\n </Breadcrumbs>\n );\n}","export type RouteNode = {\n path: string;\n label: string;\n children?: RouteNode[];\n};\n\nexport type BreadcrumbItem = {\n label: string;\n href: string;\n};\n\nfunction isExternalPath(path: string): boolean {\n return path.startsWith('http://') || path.startsWith('https://');\n}\n\nfunction normalizePath(path: string): string {\n if (path === '/') return '/';\n return path.replace(/\\/+$/, '');\n}\n\nfunction formatSegmentLabel(segment: string): string {\n try {\n const decoded = decodeURIComponent(segment).replace(/[-_]+/g, ' ').trim();\n return decoded ? decoded.charAt(0).toUpperCase() + decoded.slice(1) : segment;\n } catch {\n return segment;\n }\n}\n\ntype AncestorChain = {\n externalAncestors: RouteNode[];\n appRoot: RouteNode | null;\n};\n\nexport function findAppRootWithAncestors(node: RouteNode, ancestors: RouteNode[] = []): AncestorChain {\n if (!isExternalPath(node.path)) {\n return {\n externalAncestors: ancestors,\n appRoot: node,\n };\n }\n\n if (node.children) {\n for (const child of node.children) {\n const result = findAppRootWithAncestors(child, [...ancestors, node]);\n if (result.appRoot) return result;\n }\n }\n\n return { externalAncestors: ancestors, appRoot: null };\n}\n\ntype InternalMatch = {\n node: RouteNode;\n ancestors: RouteNode[];\n};\n\nfunction findInternalMatch(\n node: RouteNode,\n pathname: string,\n ancestors: RouteNode[] = []\n): InternalMatch | null {\n const nodePath = normalizePath(node.path);\n\n if (pathname === nodePath) {\n return { node, ancestors };\n }\n\n if (node.children) {\n for (const child of node.children) {\n if (isExternalPath(child.path)) continue;\n\n const result = findInternalMatch(child, pathname, [...ancestors, node]);\n if (result) return result;\n }\n }\n\n const pathPrefix = nodePath === '/' ? '/' : nodePath + '/';\n if (pathname.startsWith(pathPrefix) || pathname === nodePath) {\n return { node, ancestors };\n }\n\n return null;\n}\n\nexport function getBreadcrumbs(routes: RouteNode, pathname: string): BreadcrumbItem[] {\n const normalizedPathname = normalizePath(pathname);\n const { externalAncestors, appRoot } = findAppRootWithAncestors(routes);\n\n if (!appRoot) {\n return externalAncestors.map((node) => ({\n label: node.label,\n href: node.path,\n }));\n }\n\n const breadcrumbs: BreadcrumbItem[] = externalAncestors.map((node) => ({\n label: node.label,\n href: node.path,\n }));\n\n const internalMatch = findInternalMatch(appRoot, normalizedPathname);\n\n if (!internalMatch) {\n breadcrumbs.push({ label: appRoot.label, href: appRoot.path });\n return breadcrumbs;\n }\n\n for (const ancestor of internalMatch.ancestors) {\n breadcrumbs.push({\n label: ancestor.label,\n href: ancestor.path,\n });\n }\n\n breadcrumbs.push({\n label: internalMatch.node.label,\n href: internalMatch.node.path,\n });\n\n const matchedPath = normalizePath(internalMatch.node.path);\n if (normalizedPathname !== matchedPath) {\n const remainingPath = normalizedPathname.slice(\n matchedPath === '/' ? 1 : matchedPath.length + 1\n );\n const dynamicSegments = remainingPath.split('/').filter(Boolean);\n\n let accumulatedPath = matchedPath;\n for (const segment of dynamicSegments) {\n accumulatedPath = accumulatedPath === '/' ? `/${segment}` : `${accumulatedPath}/${segment}`;\n breadcrumbs.push({\n label: formatSegmentLabel(segment),\n href: accumulatedPath,\n });\n }\n }\n\n return breadcrumbs;\n}","import { create, StateCreator } from 'zustand';\nimport { persist, createJSONStorage } from 'zustand/middleware';\nimport type { BreadcrumbItem } from '../routes';\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 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 setBreadcrumbs: (breadcrumbs: BreadcrumbItem[] | null) => void;\n initialize: () => 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 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 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.shortcuts': 'Snarveier',\n 'footer.news': 'Nyheter',\n 'footer.press': 'For pressen',\n 'footer.whistleblowing': 'Varsling',\n 'footer.privacy': 'Personvern og informasjonskapsler',\n 'footer.accessibility': 'Tilgjengelighet',\n 'footer.about': 'About Statsbygg / Statsbygg birra',\n 'footer.publications': 'Publikasjoner',\n 'footer.stateFacilities': 'Statens lokaler',\n 'footer.mmfmHelpdesk': 'MMFM – helpdesk',\n 'footer.simba': 'Simba – Statsbyggs BIM-sider',\n 'footer.stateRental': 'Statens innleie',\n 'footer.publicJournal': 'Søk innsyn via offentlig postjournal',\n 'footer.followUs': 'Følg oss',\n 'footer.contactUs': 'Kontakt oss',\n 'footer.phone': 'Telefon',\n 'footer.findEmployee': 'Finn en ansatt',\n 'footer.visitAddress': 'Besøksadresse',\n 'footer.postalAddress': 'Postadresse',\n 'footer.tagline': 'Bygg med mening',\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 Link from 'next/link';\nimport type { ReactNode } from 'react';\n\ntype BreadcrumbLinkProps = {\n href: string;\n className?: string;\n ariaCurrent?: 'page' | undefined;\n children: ReactNode;\n};\n\n/**\n * Renders breadcrumb links correctly:\n * - External URLs (http/https): standard anchor tag\n * - Internal paths: Next.js Link (handles basePath automatically)\n */\nexport function BreadcrumbLink({\n href,\n className,\n ariaCurrent,\n children,\n}: BreadcrumbLinkProps) {\n const isExternal = href.startsWith('http://') || href.startsWith('https://');\n\n if (isExternal) {\n return (\n <a href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </a>\n );\n }\n\n return (\n <Link href={href} className={className} aria-current={ariaCurrent}>\n {children}\n </Link>\n );\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 { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport type { MenuButtonProps } from './MenuButton.types';\n\nexport function MenuButton({ className, appBasePath }: 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 className={className}\n >\n {isMenuOpen ? <X size={20} aria-hidden=\"true\" /> : <Menu size={20} aria-hidden=\"true\" />}\n {isMenuOpen ? t('common.close') : t('common.menu')}\n </Button>\n <NavigationMenu appBasePath={appBasePath} />\n </>\n );\n}","'use client';\n\nimport { useState, useEffect, useRef } from 'react';\nimport { Heading, Search } from '@digdir/designsystemet-react';\nimport { NAVIGATION_MENU, MenuSection } from '../../navigationMenu';\nimport { NavigationMenuItem } from '../NavigationMenuItem/NavigationMenuItem';\nimport { useGlobalStore } from '../../store/globalState';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport type { NavigationMenuProps } from './NavigationMenu.types';\nimport styles from './NavigationMenu.module.css';\n\nexport function NavigationMenu({ className, appBasePath }: 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 const { t } = useLayoutTranslation();\n\n useEffect(() => {\n if (!isMenuOpen) return;\n\n function 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 return () => document.removeEventListener('keydown', handleEscape);\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 : ''} ${className ?? ''}`}>\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 className={styles.menuSections} aria-label={t('menu.mainMenuLabel')}>\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 {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={\n 150 + sectionIndex * 60 + subsectionIndex * 40 + itemIndex * 25\n }\n appBasePath={appBasePath}\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 appBasePath={appBasePath}\n />\n ))}\n </div>\n )}\n </section>\n ))}\n </nav>\n </div>\n </div>\n </>\n );\n}","export type MenuItem = {\n label: string;\n href: string;\n external?: boolean;\n children?: MenuItem[];\n};\n\nexport type MenuSubsection = {\n title: string;\n items: MenuItem[];\n};\n\nexport type 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: '/for-leietakere/leieveileder' },\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 ],\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];","'use client';\n\nimport { List } from '@digdir/designsystemet-react';\nimport { ExternalLink } from 'lucide-react';\nimport { usePathname } from 'next/navigation';\nimport clsx from 'clsx';\nimport { SmartLink } from '../SmartLink';\nimport type { MenuItem } from '../../navigationMenu';\nimport type { NavigationMenuItemProps } from './NavigationMenuItem.types';\nimport styles from './NavigationMenuItem.module.css';\n\nexport function NavigationMenuItem({\n item,\n animationDelay,\n compact = false,\n appBasePath,\n}: NavigationMenuItemProps) {\n const pathname = usePathname();\n\n const isActive = (href: string) => {\n if (href === '/') return pathname === '/';\n return pathname?.startsWith(href);\n };\n\n const isParentActive = isActive(item.href);\n\n if (compact) {\n return (\n <div\n className={styles.itemColumn}\n style={{ animationDelay: `${animationDelay}ms` }}\n >\n <SmartLink\n href={item.href}\n appBasePath={appBasePath}\n external={item.external}\n className={clsx(styles.compactLink, isParentActive && styles.active)}\n >\n {item.label}\n {item.external && <ExternalLink size={16} aria-hidden=\"true\" />}\n </SmartLink>\n </div>\n );\n }\n\n return (\n <div\n className={styles.itemColumn}\n style={{ animationDelay: `${animationDelay}ms` }}\n >\n <SmartLink\n href={item.href}\n appBasePath={appBasePath}\n external={item.external}\n className={clsx(styles.parentLink, isParentActive && styles.active)}\n >\n {item.label}\n {item.external && <ExternalLink size={20} aria-hidden=\"true\" />}\n </SmartLink>\n\n {item.children && item.children.length > 0 && (\n <List.Unordered className={styles.childItems}>\n {item.children.map((child: MenuItem, childIndex: number) => {\n const isChildActive = isActive(child.href);\n\n return (\n <List.Item\n key={childIndex}\n className={styles.childItem}\n style={{ animationDelay: `${animationDelay + 30 + childIndex * 15}ms` }}\n >\n <SmartLink\n href={child.href}\n appBasePath={appBasePath}\n external={child.external}\n className={clsx(styles.childLink, isChildActive && styles.active)}\n >\n {child.label}\n {child.external && <ExternalLink size={16} aria-hidden=\"true\" />}\n </SmartLink>\n </List.Item>\n );\n })}\n </List.Unordered>\n )}\n </div>\n );\n}","'use client';\n\nimport Link from 'next/link';\nimport { Link as DsLink } from '@digdir/designsystemet-react';\nimport type { SmartLinkProps } from './SmartLink.types';\n\n/**\n * Determines if a given href belongs to the current zone, another zone or should be external\n */\nexport function SmartLink({\n href,\n appBasePath,\n external = false,\n className,\n children,\n}: SmartLinkProps) {\n const isExternalUrl = href.startsWith('http://') || href.startsWith('https://');\n const isLocalRoute =\n appBasePath &&\n !isExternalUrl &&\n (href === appBasePath || href.startsWith(`${appBasePath}/`));\n\n if (isExternalUrl || external) {\n return (\n <DsLink\n href={href}\n className={className}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n {children}\n </DsLink>\n );\n }\n\n if (isLocalRoute) {\n // Strip the basePath\n const localHref = href.replace(appBasePath, '') || '/';\n\n return (\n <Link href={localHref} className={className}>\n {children}\n </Link>\n );\n }\n\n // Cross-zone navigation: use standard anchor for full page load\n return (\n <DsLink href={href} className={className}>\n {children}\n </DsLink>\n );\n}","'use client';\n\nimport { useEffect } from 'react';\nimport clsx from 'clsx';\nimport { SkipLink } from '@digdir/designsystemet-react';\nimport { GlobalHeader } from '../GlobalHeader';\nimport { GlobalFooter } from '../GlobalFooter';\nimport { useGlobalStore } from '@/store/globalState';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport type { RootLayoutProps } from './RootLayout.types';\nimport styles from './RootLayout.module.css';\n\nexport function RootLayout({ children, routes, appBasePath, className }: RootLayoutProps) {\n const initialize = useGlobalStore((state) => state.initialize);\n const isMenuOpen = useGlobalStore((state) => state.isMenuOpen);\n const { t } = useLayoutTranslation();\n\n useEffect(() => {\n initialize();\n }, [initialize]);\n\n return (\n <div className={clsx(styles.root, isMenuOpen && styles.menuOpen, className)}>\n <SkipLink className={styles.skipLink} href=\"#main-content\">\n {t('common.skipLink')}\n </SkipLink>\n <GlobalHeader routes={routes} appBasePath={appBasePath} />\n <main id=\"main-content\" tabIndex={-1} className={styles.main}>\n {children}\n </main>\n <GlobalFooter />\n </div>\n );\n}","'use client';\n\nimport { Link, Heading, List, Paragraph } from '@digdir/designsystemet-react';\nimport { ExternalLink } from 'lucide-react';\nimport clsx from 'clsx';\nimport type { GlobalFooterProps } from './GlobalFooter.types';\nimport styles from './GlobalFooter.module.css';\nimport { useLayoutTranslation } from '@/hooks/use-layout-translation';\nimport footerImage from '@/assets/images/footer.png';\nimport { linkedinIcon, instagramIcon, facebookIcon, youtubeIcon, vimeoIcon } from '@/assets/images/icons';\n\nexport function GlobalFooter({ \n className,\n logoUrl = footerImage,\n logoAlt\n}: GlobalFooterProps) {\n const { t } = useLayoutTranslation();\n\n return (\n <footer className={clsx(styles.footer, className)}>\n <div className={styles.footerContent}>\n <div className={clsx(styles.footerLeft, styles.shortcutsContainer)}>\n <div className={styles.shortcutsHeadingWide}>\n <Heading level={2} data-size=\"2xs\" className={styles.sectionHeading}>\n {t('footer.shortcuts')}\n </Heading>\n </div>\n <div className={styles.footerSection}>\n <List.Unordered className={styles.footerList}>\n <List.Item><Link href=\"#\">{t('footer.news')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.press')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.whistleblowing')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.privacy')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.accessibility')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.about')}</Link></List.Item>\n </List.Unordered>\n </div>\n <div className={styles.footerSection}>\n <List.Unordered className={styles.footerList}>\n <List.Item><Link href=\"#\">{t('footer.publications')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.stateFacilities')}</Link></List.Item>\n <List.Item><Link href=\"#\">{t('footer.mmfmHelpdesk')}</Link></List.Item>\n <List.Item>\n <Link href=\"https://simba.statsbygg.no/\" className={styles.externalLink} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('footer.simba')}\n <ExternalLink size={14} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"https://statensinnleie.no\" className={styles.externalLink} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('footer.stateRental')}\n <ExternalLink size={14} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"https://einnsyn.no/sok?f=0279324b-adee-4116-ae84-3895f61c0db9\" className={styles.externalLink} target=\"_blank\" rel=\"noopener noreferrer\">\n {t('footer.publicJournal')}\n <ExternalLink size={14} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n </List.Unordered>\n </div>\n </div>\n\n <div className={clsx(styles.footerSection, styles.socialLinks)}>\n <Heading level={2} data-size=\"2xs\" className={styles.sectionHeading}>\n {t('footer.followUs')}\n </Heading>\n <List.Unordered className={styles.footerList}>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n LinkedIn\n {/*\n To support image src resolution in sandbox, dev, and storybook\n */}\n <img src={typeof linkedinIcon === 'string' ? linkedinIcon : (linkedinIcon as any).src} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n Instagram\n <img src={typeof instagramIcon === 'string' ? instagramIcon : (instagramIcon as any).src} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n Facebook\n <img src={typeof facebookIcon === 'string' ? facebookIcon : (facebookIcon as any).src} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n YouTube\n <img src={typeof youtubeIcon === 'string' ? youtubeIcon : (youtubeIcon as any).src} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n <List.Item>\n <Link href=\"#\" className={styles.socialLink}>\n Vimeo\n <img src={typeof vimeoIcon === 'string' ? vimeoIcon : (vimeoIcon as any).src} alt=\"\" className={styles.socialIcon} aria-hidden=\"true\" />\n </Link>\n </List.Item>\n </List.Unordered>\n </div>\n\n <div className={styles.footerLeftWide}>\n <div className={clsx(styles.footerSection, styles.contactSectionsContainer)}>\n <div className={styles.contactHeadingWide}>\n <Heading level={2} data-size=\"2xs\" className={styles.sectionHeading}>\n {t('footer.contactUs')}\n </Heading>\n </div>\n <div className={styles.contactSection}>\n <Paragraph data-size=\"sm\">\n <Link href=\"tel:22955000\">{t('footer.phone')}: 22 95 50 00</Link>\n </Paragraph>\n <Paragraph data-size=\"sm\">\n <Link href=\"mailto:postmottak@statsbygg.no\">postmottak@statsbygg.no</Link>\n </Paragraph>\n <Paragraph data-size=\"sm\">\n <Link href=\"#\">{t('footer.findEmployee')}</Link>\n </Paragraph>\n </div>\n\n <div className={styles.contactSection}>\n <Heading level={2} data-size=\"2xs\" className={styles.contactHeading}>\n {t('footer.visitAddress')}\n </Heading>\n <Paragraph data-size=\"sm\">\n Biskop Gunnerus' gate 6,<br />\n 0155 Oslo (Byporten)\n </Paragraph>\n </div>\n\n <div className={styles.contactSection}>\n <Heading level={2} data-size=\"2xs\" className={styles.contactHeading}>\n {t('footer.postalAddress')}\n </Heading>\n <Paragraph data-size=\"sm\">\n Postboks 232 Sentrum,<br />\n 0103 Oslo\n </Paragraph>\n </div>\n </div>\n </div>\n\n <div className={clsx(styles.footerSection, styles.socialLinks, styles.footerLogo)}>\n <div \n className={styles.logoSection}\n // To support image src resolution in sandbox, dev, and storybook\n style={{ backgroundImage: `url(${typeof logoUrl === 'string' ? logoUrl : (logoUrl as any).src})` }}\n role=\"img\"\n aria-label={logoAlt || t('footer.tagline')}\n />\n </div>\n </div>\n </footer>\n );\n}","import { useEffect } from 'react';\nimport { useGlobalStore } from '../store/globalState';\nimport type { BreadcrumbItem } from '../routes';\n\n/**\n * Hook for manually setting breadcrumbs on dynamic routes.\n * Overrides automatic breadcrumb generation, preserving external ancestors.\n *\n * @param breadcrumbs - Array of breadcrumb items for the current dynamic route\n */\nexport function useBreadcrumbs(breadcrumbs: BreadcrumbItem[]): void {\n const setBreadcrumbs = useGlobalStore((state) => state.setBreadcrumbs);\n const serialized = JSON.stringify(breadcrumbs);\n\n useEffect(() => {\n setBreadcrumbs(JSON.parse(serialized));\n\n return () => {\n setBreadcrumbs(null);\n };\n }, [serialized, setBreadcrumbs]);\n}"],"mappings":"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","names":["Button","Link","Search","clsx","jsx","usePathname","clsx","Link","jsx","styles","jsx","usePathname","clsx","styles","jsx","jsxs","Fragment","jsx","jsxs","styles","Fragment","jsx","jsxs","clsx","Link","Button","Search","useEffect","clsx","Link","Heading","List","ExternalLink","clsx","styles","jsx","jsxs","clsx","styles","Heading","List","Link","ExternalLink","styles","jsx","jsxs","useEffect","clsx","useEffect","useEffect"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@statsbygg/layout",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -35,7 +35,7 @@
35
35
  "@statsbygg/design-tokens": "0.4.1"
36
36
  },
37
37
  "dependencies": {
38
- "@digdir/designsystemet-react": "^1.9.0",
38
+ "@digdir/designsystemet-react": "1.9.0",
39
39
  "clsx": "^2.0.0",
40
40
  "lucide-react": "^0.514.0"
41
41
  },