@statsbygg/layout 0.1.17 → 0.1.19
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 +1 -1
- package/dist/Breadcrumbs.module.css +0 -2
- package/dist/GlobalFooter.module.css +13 -12
- package/dist/GlobalHeader.module.css +127 -12
- package/dist/MenuButton.module.css +6 -0
- package/dist/NavigationMenu.module.css +64 -36
- package/dist/NavigationMenuItem.module.css +13 -5
- package/dist/assets/images/arrowRight.png +0 -0
- package/dist/index.d.ts +16 -2
- package/dist/index.js +189 -212
- package/dist/index.js.map +1 -1
- package/package.json +3 -3
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":"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","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 { useEffect, useRef } from 'react';\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 searchInputRef = useGlobalStore((state) => state.searchInputRef);\n const setTheme = useGlobalStore((state) => state.setTheme);\n const theme = useGlobalStore((state) => state.theme);\n const { t } = useLayoutTranslation();\n const lastScrollY = useRef(0);\n const isHiddenRef = useRef(false);\n const topBarRef = useRef<HTMLDivElement>(null);\n const topBarFixedWrapperRef = useRef<HTMLDivElement>(null);\n const isMenuOpenRef = useRef(isMenuOpen);\n\n useEffect(() => {\n isMenuOpenRef.current = isMenuOpen;\n\n if (isMenuOpen && topBarRef.current) {\n // Position header at current scroll position when menu opens to keep it visible\n topBarRef.current.style.top = `${window.scrollY}px`;\n isHiddenRef.current = false;\n }\n }, [isMenuOpen]);\n\n useEffect(() => {\n const headerContainer = topBarRef.current;\n\n if (!headerContainer) {\n return;\n }\n\n const handleScroll = () => {\n if (isMenuOpenRef.current) {\n return;\n }\n\n const currentScrollY = window.scrollY;\n //scroll direction (positive = down, negative = up)\n const delta = currentScrollY - lastScrollY.current;\n const headerContainerHeight = headerContainer.offsetHeight;\n //current top position of the header\n const currentTop = Number.parseFloat(headerContainer.style.top || '0');\n //header positioned just above viewport\n const hiddenTop = `${currentScrollY - headerContainerHeight}px`;\n\n // Scrolling up\n if (delta < 0) {\n // Only move the header down if we've scrolled above its current top position\n // This keeps the header frozen while scrolling up past it, and only\n // starts following the viewport again once scroll reaches the header's top edge\n if (currentScrollY < currentTop) {\n headerContainer.style.top = `${currentScrollY}px`;\n topBarFixedWrapperRef.current?.classList.add(styles.topBarFixed);\n }\n // Show the fixed top bar by appending the topBarFixed class\n \n lastScrollY.current = currentScrollY;\n return;\n }\n\n // Scrolling down: if we've scrolled past the header's bottom edge (top + height),\n // reposition it so it sits just above the visible area (scrollY - height)\n if (currentScrollY > currentTop + headerContainerHeight) {\n // Hide the fixed top bar when scrolling down\n topBarFixedWrapperRef.current?.classList.remove(styles.topBarFixed);\n headerContainer.style.top = hiddenTop;\n lastScrollY.current = currentScrollY;\n } else {\n // Still within the header's current bounds — no repositioning needed\n if (currentTop + headerContainerHeight < currentScrollY) {\n lastScrollY.current = currentScrollY;\n return;\n }\n }\n };\n\n lastScrollY.current = window.scrollY;\n window.addEventListener('scroll', handleScroll, { passive: true });\n\n return () => {\n window.removeEventListener('scroll', handleScroll);\n };\n }, []);\n\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 ref={topBarRef} className={styles.headerContainer}>\n <div ref={topBarFixedWrapperRef} className={styles.topBarFixedWrapper}>\n <div className={styles.topBarContainer}>\n <div className={styles.topBarInner}>\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 && 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); setTimeout(() => searchInputRef?.current?.focus(), 100); }}\n className={styles.searchButton}\n aria-label={t('common.search')}\n >\n <Search size={20} aria-hidden=\"true\" />\n <span className={styles.searchButtonLabel}>{t('common.search')}</span>\n </Button>\n <MenuButton appBasePath={appBasePath} />\n </div>\n </div>\n </div>\n <Breadcrumbs routes={routes} appBasePath={appBasePath} pathname={pathname} className={styles.headerBreadcrumbs}/>\n </div>\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 { RefObject } from 'react';\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 searchInputRef: RefObject<HTMLInputElement | null> | null;\n setSearchInputRef: (ref: RefObject<HTMLInputElement | null> | null) => void;\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 searchInputRef: null,\n setSearchInputRef: (searchInputRef) => set({ searchInputRef }),\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': 'Søk i nettstedet',\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';\nimport styles from './MenuButton.module.css';\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 <span className={styles.menuButtonLabel}>{isMenuOpen ? t('common.close') : t('common.menu')}</span>\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 setSearchInputRef = useGlobalStore((state) => state.setSearchInputRef);\n const searchInputRef = useRef<HTMLInputElement>(null);\n const { t } = useLayoutTranslation();\n\n useEffect(() => {\n setSearchInputRef(searchInputRef);\n return () => setSearchInputRef(null);\n }, [setSearchInputRef]);\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 <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.hideTitle && (\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\n <div className={styles.searchSection}>\n <Heading level={1} data-size=\"2xs\" className={styles.helpTitle}>{t('menu.helpTitle')}</Heading>\n <Search className={styles.searchField}>\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 />\n <Search.Clear />\n <Search.Button>{t('common.search')}</Search.Button>\n </Search>\n </div>\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 hideTitle?: boolean;\n layout?: 'columns' | 'subsections';\n items?: MenuItem[];\n subsections?: MenuSubsection[];\n};\n\nexport const NAVIGATION_MENU: MenuSection[] = [\n {\n title: 'Informasjon om statsbygg',\n hideTitle: true,\n items: [\n { label: 'Byggeprosjekter', href: '/artikler-om-bygg' },\n { label: 'Eiendommer', href: '/statlige-eiendommer' },\n { label: 'Rådgivning', href: '/statistikk' },\n { label: 'For leverandører', href: '/om-statsbygg' },\n { label: 'Innsikt', href: '/ledig-for-fremleie' },\n { label: 'Om oss', href: '/om-statsbygg' },\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';\nimport { arrowRightIcon } from '@/assets/images/icons';\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 <img src={arrowRightIcon as string} alt=\"\" aria-hidden=\"true\" className={styles.arrowIcon} />\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","useEffect","useRef","jsx","usePathname","clsx","Link","jsx","styles","jsx","usePathname","styles","clsx","styles","jsx","jsxs","styles","Fragment","jsx","jsxs","styles","jsx","jsxs","useRef","useEffect","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.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public"
|
|
6
6
|
},
|
|
@@ -32,10 +32,10 @@
|
|
|
32
32
|
"react": ">=18.0.0",
|
|
33
33
|
"react-dom": ">=18.0.0",
|
|
34
34
|
"zustand": "^5.0.4",
|
|
35
|
-
"@statsbygg/design-tokens": "0.4.
|
|
35
|
+
"@statsbygg/design-tokens": "^0.4.2"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@digdir/designsystemet-react": "
|
|
38
|
+
"@digdir/designsystemet-react": "1.12.1",
|
|
39
39
|
"clsx": "^2.0.0",
|
|
40
40
|
"lucide-react": "^0.514.0"
|
|
41
41
|
},
|