diff --git a/app/component/AppBarHsl.js b/app/component/AppBarHsl.js index 83d48c7b07..3516735bae 100644 --- a/app/component/AppBarHsl.js +++ b/app/component/AppBarHsl.js @@ -3,8 +3,7 @@ import PropTypes from 'prop-types'; import React, { useState, useEffect, useRef } from 'react'; import { matchShape } from 'found'; import { Helmet } from 'react-helmet'; -import SiteHeader from '@hsl-fi/site-header'; -import { useIntl } from 'react-intl'; +import { SiteHeader, UserMenu, QuickSearch } from '@hsl-fi/site-header'; import { favouriteShape, configShape } from '../util/shapes'; import { clearOldSearches, clearFutureRoutes } from '../util/storeUtils'; import { getJson } from '../util/xhrPromise'; @@ -18,7 +17,6 @@ const clearStorages = context => { const notificationAPI = '/api/user/notifications'; const AppBarHsl = ({ lang, user, favourites }, context) => { - const intl = useIntl(); const { config, match } = context; const { location } = match; @@ -27,15 +25,102 @@ const AppBarHsl = ({ lang, user, favourites }, context) => { post: `${notificationAPI}?language=${lang}`, }; - const [banners, setBanners] = useState([]); + const [searchQuery, setSearchQuery] = useState(''); + const [searchLoading, setSearchLoading] = useState(false); + const [searchError, setSearchError] = useState(false); + const [searchHits, setSearchHits] = useState([]); + const [searchHitsCount, setSearchHitsCount] = useState(0); + const [userNotifications, setUserNotifications] = useState({ + unreadCount: 0, + loading: false, + error: null, + notifications: [], + refetch: () => {}, + onOpen: () => {}, + }); useEffect(() => { - if (config.URL.BANNERS && process.env.NODE_ENV !== 'test') { - getJson(`${config.URL.BANNERS}&language=${lang}`) - .then(data => setBanners(data)) - .catch(() => setBanners([])); + if (!user.sub) { + return undefined; } - }, [lang]); + + const markAsRead = () => { + fetch(notificationApiUrls.post, { + method: 'POST', + headers: { 'content-type': 'application/json' }, + }) + .then(() => { + setUserNotifications(prev => ({ ...prev, unreadCount: 0 })); + }) + .catch(() => {}); + }; + + const fetchNotifications = () => { + setUserNotifications(prev => ({ ...prev, loading: true, error: null })); + getJson(notificationApiUrls.get) + .then(data => { + setUserNotifications({ + unreadCount: data?.unreadCount || 0, + loading: false, + error: null, + notifications: (data?.notifications || []).map(n => ({ + ...n, + link: n.link || {}, + })), + refetch: fetchNotifications, + onOpen: markAsRead, + }); + }) + .catch(err => { + setUserNotifications(prev => ({ + ...prev, + loading: false, + error: err, + })); + }); + }; + + fetchNotifications(); + const interval = setInterval(fetchNotifications, 60000); + return () => clearInterval(interval); + }, [user.sub, lang]); + + useEffect(() => { + if (!searchQuery || !config.URL.HSL_FI_SUGGESTIONS) { + setSearchHits([]); + setSearchHitsCount(0); + return undefined; + } + + const timer = setTimeout(() => { + setSearchLoading(true); + setSearchError(false); + getJson( + `${ + config.URL.HSL_FI_SUGGESTIONS + }?language=${lang}&take=5&query=${encodeURIComponent(searchQuery)}`, + ) + .then(data => { + const hits = (data?.hits || []).map(h => ({ + id: h.id, + title: h.title, + type: h.type, + link: { href: h.url }, + })); + setSearchHits(hits); + setSearchHitsCount( + data?.totalHits != null ? data.totalHits : hits.length, + ); + setSearchLoading(false); + }) + .catch(() => { + setSearchError(true); + setSearchLoading(false); + }); + }, 300); + + return () => clearTimeout(timer); + }, [searchQuery, lang]); useEffect(() => { if (config.URL.FONTCOUNTER && process.env.NODE_ENV === 'production') { @@ -45,70 +130,63 @@ const AppBarHsl = ({ lang, user, favourites }, context) => { } }, []); - const languages = [ - { - name: 'fi', - url: `/fi${location.pathname}${location.search}`, + const languages = { + fi: { + href: `/fi${location.pathname}${location.search}`, }, - { - name: 'sv', - url: `/sv${location.pathname}${location.search}`, + sv: { + href: `/sv${location.pathname}${location.search}`, }, - { - name: 'en', - url: `/en${location.pathname}${location.search}`, + en: { + href: `/en${location.pathname}${location.search}`, }, - ]; + }; const { given_name, family_name } = user; - const initials = - given_name && family_name - ? given_name.charAt(0) + family_name.charAt(0) - : ''; // Authenticated user's initials, will be shown next to Person-icon. - const url = encodeURI(location.pathname); const params = location.search && location.search.substring(1); + const travelersAccountLink = config.URL.TRAVELERS_ACCOUNT + ? { href: config.URL.TRAVELERS_ACCOUNT } + : undefined; + const myStopsAndRoutesLink = config.favouriteLink + ? { href: config.favouriteLink[lang] || config.favouriteLink.fi } + : undefined; const userMenu = - config.allowLogin && (user.sub || user.notLogged) - ? { - userMenu: { - isLoading: false, // When fetching for login-information, `isLoading`-property can be set to true. Spinner will be shown. - isAuthenticated: !!user.sub, // If user is authenticated, set `isAuthenticated`-property to true. - isSelected: false, - loginUrl: `/login?url=${url}&${params}`, // Url that user will be redirect to when Person-icon is pressed and user is not logged in. - initials, - menuItems: [ - { - name: intl.formatMessage({ - id: 'userinfo', - defaultMessage: 'My information', - }), - url: `${config.URL.ROOTLINK}/omat-tiedot`, - onClick: () => {}, - }, - { - name: intl.formatMessage({ - id: 'logout', - defaultMessage: 'Logout', - }), - url: '/logout', - onClick: () => clearStorages(context), - }, - ], - }, - } - : {}; - - const siteHeaderRef = useRef(null); + config.allowLogin && (user.sub || user.notLogged) ? ( + clearStorages(context) }} + name={{ givenName: given_name, familyName: family_name }} + userNotifications={userNotifications} + travelersAccountLink={travelersAccountLink} + myStopsAndRoutesLink={myStopsAndRoutesLink} + /> + ) : null; + + const search = config.URL.HSL_FI_SUGGESTIONS ? ( + setSearchQuery(e.target.value)} + hitsCount={searchHitsCount} + hits={searchHits} + lang={lang} + /> + ) : null; + const notificationTime = useRef(0); useEffect(() => { const now = Date.now(); // refresh only once per 5 seconds if (now - notificationTime.current > 5000) { - // Refetch notifications - siteHeaderRef.current?.fetchNotifications(); + userNotifications.refetch(); notificationTime.current = now; } }, [favourites]); @@ -126,17 +204,14 @@ const AppBarHsl = ({ lang, user, favourites }, context) => { /> )} - {!config.hideHeader && ( )} diff --git a/app/configurations/config.hsl.js b/app/configurations/config.hsl.js index 606048a2d3..b08cf8f1e2 100644 --- a/app/configurations/config.hsl.js +++ b/app/configurations/config.hsl.js @@ -17,6 +17,8 @@ const BANNER_URL = process.env.CONTENT_DOMAIN const SUGGESTION_URL = process.env.CONTENT_DOMAIN ? `${process.env.CONTENT_DOMAIN}/api/v1/search/suggestions` : 'https://content.hsl.fi/api/v1/search/suggestions'; // old url +const travelersAccountUrl = process.env.TRAVELERS_ACCOUNT_URL; +const staticAssetsUrl = process.env.STATIC_ASSETS_URL; const virtualMonitorBaseUrl = IS_DEV ? 'https://dev-hslmonitori.digitransit.fi' @@ -67,6 +69,8 @@ export default { FONT: 'https://www.hsl.fi/fonts/784131/6C5FB8083F348CFBB.css', FONTCOUNTER: 'https://cloud.typography.com/6364294/7432412/css/fonts.css', ROOTLINK: rootLink, + TRAVELERS_ACCOUNT: travelersAccountUrl, + STATIC_ASSETS: staticAssetsUrl, BANNERS: BANNER_URL, HSL_FI_SUGGESTIONS: SUGGESTION_URL, EMBEDDED_SEARCH_GENERATION: '/reittiopas-elementti', diff --git a/package.json b/package.json index d603d07546..a0f423765a 100644 --- a/package.json +++ b/package.json @@ -140,7 +140,7 @@ "@hsl-fi/modal": " ^0.3.2", "@hsl-fi/sass": " 1.0.0", "@hsl-fi/shimmer": "0.1.2", - "@hsl-fi/site-header": "4.5.2", + "@hsl-fi/site-header": "6.4.0", "@mapbox/sphericalmercator": "1.1.0", "@mapbox/vector-tile": "1.3.1", "axios": "1.15.0", diff --git a/server/server.js b/server/server.js index 1e0ec787c7..b8dd5efb8f 100644 --- a/server/server.js +++ b/server/server.js @@ -123,6 +123,17 @@ function setUpMiddleware() { // proxy for dev-bundle app.use('/proxy/', proxy(`http://localhost:${hotloadPort}/`)); } + // Proxy static assets to avoid CORS issues when fetching from the browser + // TODO this is a hacky solution, contact site-header admins to update site-header cors settings. + const staticAssetsBaseUrl = process.env.STATIC_ASSETS_URL; + if (staticAssetsBaseUrl) { + app.use( + '/static-assets', + proxy(staticAssetsBaseUrl, { + proxyReqPathResolver: req => req.url, + }), + ); + } } function onError(err, req, res) { diff --git a/test/unit/helpers/babel-register.js b/test/unit/helpers/babel-register.js index 2bd7c1b294..c076f1ca5c 100644 --- a/test/unit/helpers/babel-register.js +++ b/test/unit/helpers/babel-register.js @@ -1,3 +1,4 @@ +/* eslint-disable no-underscore-dangle */ require('@babel/register')({ // This will override `node_modules` ignoring - you can alternatively pass // an array of strings to be explicitly matched or a regex / glob @@ -5,3 +6,37 @@ require('@babel/register')({ /node_modules\/(?!react-leaflet|@babel\/runtime\/helpers\/esm|lodash-es|@digitransit-util|@digitransit-component)/, ], }); + +// Prevent Node.js from trying to parse CSS files as JavaScript +require.extensions['.css'] = () => {}; + +// Stub out @hsl-fi packages that are ESM-only — they can't be require()'d by +// Node's CJS loader (ERR_REQUIRE_ESM). Unit tests don't need the real +// implementations; stubs are sufficient for shallow rendering. +const Module = require('module'); + +const originalLoad = Module._load; +Module._load = function hslFiStub(...args) { + const [request] = args; + if (request.startsWith('@hsl-fi/')) { + return new Proxy( + function StubComponent() { + return null; + }, + { + get(target, prop) { + if (prop === '__esModule') { + return true; + } + if (prop === 'default') { + return target; + } + return function StubComponent() { + return null; + }; + }, + }, + ); + } + return originalLoad.apply(this, args); +}; diff --git a/webpack.config.babel.js b/webpack.config.babel.js index 3bb53d7cac..78bb48215f 100644 --- a/webpack.config.babel.js +++ b/webpack.config.babel.js @@ -271,6 +271,17 @@ module.exports = { }, { test: /\.css$/, + include: /node_modules\/@hsl-fi/, + sideEffects: true, + use: [ + isDevelopment ? 'style-loader' : MiniCssExtractPlugin.loader, + 'css-loader', + 'postcss-loader', + ], + }, + { + test: /\.css$/, + exclude: /node_modules\/@hsl-fi/, use: [ isDevelopment ? 'style-loader' : MiniCssExtractPlugin.loader, 'css-loader', diff --git a/yarn.lock b/yarn.lock index ce975909e4..8b17a37602 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1729,6 +1729,15 @@ __metadata: languageName: node linkType: hard +"@babel/runtime-corejs3@npm:^7.24.4": + version: 7.29.2 + resolution: "@babel/runtime-corejs3@npm:7.29.2" + dependencies: + core-js-pure: "npm:^3.48.0" + checksum: 10/0907bbc8a520b1fa961b8e6bcfc0832a83c23ded8644520ebd4e4e9b2acfdf5d67ae41d231c5a063766a5762ba32c2643aa19ed4b9fb6b7577b88628de2f3fbd + languageName: node + linkType: hard + "@babel/runtime-corejs3@npm:^7.6.2": version: 7.29.0 resolution: "@babel/runtime-corejs3@npm:7.29.0" @@ -2690,6 +2699,44 @@ __metadata: languageName: node linkType: hard +"@floating-ui/core@npm:^1.7.5": + version: 1.7.5 + resolution: "@floating-ui/core@npm:1.7.5" + dependencies: + "@floating-ui/utils": "npm:^0.2.11" + checksum: 10/fecdc9b3ce93f02bf78a6114b93730a4cb9fa8234c62f9a949016186297a039c9f9cd3c5c81ff74b93ebddf0b32048c4af7a528afe7904b75423ed2e7491b888 + languageName: node + linkType: hard + +"@floating-ui/dom@npm:^1.7.6": + version: 1.7.6 + resolution: "@floating-ui/dom@npm:1.7.6" + dependencies: + "@floating-ui/core": "npm:^1.7.5" + "@floating-ui/utils": "npm:^0.2.11" + checksum: 10/84dff2ffdf85c8b92d7edafc543c55869abbeaeb3007fa983159467e050153b507a0f5fe8e84f88c3f28c35a82de9df9c20a6eef5560cbba3afae19141444ff2 + languageName: node + linkType: hard + +"@floating-ui/react-dom@npm:^2.0.0": + version: 2.1.8 + resolution: "@floating-ui/react-dom@npm:2.1.8" + dependencies: + "@floating-ui/dom": "npm:^1.7.6" + peerDependencies: + react: ">=16.8.0" + react-dom: ">=16.8.0" + checksum: 10/39c3e3e5538a111a3eadf1b9ca486d7dc17c7eb24b83a0ea9b4c189fa7dbe5abe01357388d8cf6a4badb2d3fec2b1090e10529537bde91acbcfe19b0a8d10f90 + languageName: node + linkType: hard + +"@floating-ui/utils@npm:^0.2.11": + version: 0.2.11 + resolution: "@floating-ui/utils@npm:0.2.11" + checksum: 10/72150138ba1c274d757a1da85233202fa9fdfd2272ec1fb0883eb0ffdf138863af81573049ed2c20b98adb4b7ae2236065541ce14037fe328955089831a678d5 + languageName: node + linkType: hard + "@formatjs/intl-displaynames@npm:^1.2.0": version: 1.2.10 resolution: "@formatjs/intl-displaynames@npm:1.2.10" @@ -3063,6 +3110,18 @@ __metadata: languageName: node linkType: hard +"@hsl-fi/accessibility@npm:^1.4.4": + version: 1.4.4 + resolution: "@hsl-fi/accessibility@npm:1.4.4" + dependencies: + "@hsl-fi/i18n": "npm:^1.5.1" + peerDependencies: + "@hsl-fi/design-tokens": ^1.24.0 + react: ">=16" + checksum: 10/855b9206557626f7d02f04fbef7621217592d6caf3101d9fd4a28628ec96d80cfcd6194ffa12856e506cbd4ff67994b07237a381b2e016c3e54a38b9a7583a62 + languageName: node + linkType: hard + "@hsl-fi/animated-spinner@npm:^0.3.0": version: 0.3.0 resolution: "@hsl-fi/animated-spinner@npm:0.3.0" @@ -3112,7 +3171,7 @@ __metadata: languageName: node linkType: hard -"@hsl-fi/container-spinner@npm:0.3.2, @hsl-fi/container-spinner@npm:^0.3.2": +"@hsl-fi/container-spinner@npm:0.3.2": version: 0.3.2 resolution: "@hsl-fi/container-spinner@npm:0.3.2" dependencies: @@ -3168,17 +3227,6 @@ __metadata: languageName: node linkType: hard -"@hsl-fi/error-view@npm:^0.1.3": - version: 0.1.3 - resolution: "@hsl-fi/error-view@npm:0.1.3" - dependencies: - "@hsl-fi/button": "npm:^1.2.4" - "@hsl-fi/container-spinner": "npm:^0.3.2" - "@hsl-fi/content-delivery-api-types": "npm:^1.0.1" - checksum: 10/95eb5ca1a775ff24110508450ec78f2c81cb32dbc77ec8b111348d0205877a221fb416c1ac75313cce3c7b6f2cd2d7ba73ffef1a70284a425975d554cfe82bad - languageName: node - linkType: hard - "@hsl-fi/fonts@npm:^1.2.1": version: 1.2.1 resolution: "@hsl-fi/fonts@npm:1.2.1" @@ -3188,6 +3236,32 @@ __metadata: languageName: node linkType: hard +"@hsl-fi/form@npm:^5.0.0": + version: 5.0.2 + resolution: "@hsl-fi/form@npm:5.0.2" + dependencies: + "@hsl-fi/accessibility": "npm:^1.4.4" + "@hsl-fi/animations": "npm:^1.11.0" + "@hsl-fi/hooks": "npm:^1.2.4" + "@hsl-fi/i18n": "npm:^1.5.1" + "@hsl-fi/icons": "npm:^2.3.0" + "@hsl-fi/sass": "npm:^1.0.0" + "@hsl-fi/utilities": "npm:^0.4.0" + "@radix-ui/react-dropdown-menu": "npm:^2.1.16" + "@radix-ui/react-select": "npm:^2.2.6" + classnames: "npm:^2.3.2" + react-animate-height: "npm:^3.2.2" + react-imask: "npm:^7.6.1" + react-phone-number-input: "npm:^3.4.5" + uuid: "npm:^13.0.0" + peerDependencies: + "@hsl-fi/design-tokens": ^1.20.0 + "@hsl-fi/layout-primitives": ^4.4.0 + react: ">=16" + checksum: 10/cbaa2a8358dd70450393fd5556b6ae5150cfb7ec71805d5c233d3e6125aee441738f34e6c82d58b3b7ff764f7e6ebb1f70422d4a0be818a1b618c3ae70313328 + languageName: node + linkType: hard + "@hsl-fi/hooks@npm:1.2.4, @hsl-fi/hooks@npm:^1.2.4": version: 1.2.4 resolution: "@hsl-fi/hooks@npm:1.2.4" @@ -3242,6 +3316,18 @@ __metadata: languageName: node linkType: hard +"@hsl-fi/icons@npm:^2.3.0": + version: 2.3.0 + resolution: "@hsl-fi/icons@npm:2.3.0" + dependencies: + classnames: "npm:^2.5.1" + peerDependencies: + "@hsl-fi/design-tokens": ^1.20.0 + react: ">=16" + checksum: 10/2c9ee727d22ddf3df65785b3ac5cae8c6cc71cb8c71583bd31029dc788117e77c7e02f64c592c22049d73e210377777680f75866e9665d1868f6f19cc9bef1eb + languageName: node + linkType: hard + "@hsl-fi/layout-primitives@npm:^4.8.1": version: 4.8.1 resolution: "@hsl-fi/layout-primitives@npm:4.8.1" @@ -3282,6 +3368,60 @@ __metadata: languageName: node linkType: hard +"@hsl-fi/navigation@npm:^3.0.0, @hsl-fi/navigation@npm:^3.1.0": + version: 3.1.0 + resolution: "@hsl-fi/navigation@npm:3.1.0" + dependencies: + "@hsl-fi/accessibility": "npm:^1.4.4" + "@hsl-fi/hooks": "npm:^1.2.4" + "@hsl-fi/i18n": "npm:^1.5.1" + "@hsl-fi/icons": "npm:^2.3.0" + classnames: "npm:^2.3.2" + uuid: "npm:^13.0.0" + peerDependencies: + "@hsl-fi/design-tokens": ^1.20.0 + "@hsl-fi/layout-primitives": ^4.4.0 + react: ">=16" + checksum: 10/300a1e3f4bca827a296d59c701bfa36ad5844ead08a15708726fed4ceb0f1666956775bf7973be8ece438d04c93e33031c66e28d6a620e6a3f9d93eadc7b839c + languageName: node + linkType: hard + +"@hsl-fi/notifications@npm:^4.0.4": + version: 4.0.5 + resolution: "@hsl-fi/notifications@npm:4.0.5" + dependencies: + "@hsl-fi/animations": "npm:^1.11.0" + "@hsl-fi/assets": "npm:^2.1.0" + "@hsl-fi/i18n": "npm:^1.5.1" + "@hsl-fi/icons": "npm:^2.3.0" + "@hsl-fi/navigation": "npm:^3.1.0" + "@radix-ui/react-accordion": "npm:^1.2.0" + classnames: "npm:^2.3.2" + peerDependencies: + "@hsl-fi/design-tokens": ^1.20.0 + "@hsl-fi/layout-primitives": ^4.4.0 + react: ">=16" + checksum: 10/39e001020af76d3f9da12db57436fbc191c0ec8c73ae6f43c81f1a4bdb4f94242b42e22661512757f966207506aa1417b200c68ef8467c3d570aff17a04edc19 + languageName: node + linkType: hard + +"@hsl-fi/overlays@npm:^3.0.0": + version: 3.0.1 + resolution: "@hsl-fi/overlays@npm:3.0.1" + dependencies: + "@hsl-fi/accessibility": "npm:^1.4.4" + "@hsl-fi/i18n": "npm:^1.5.1" + "@radix-ui/react-popover": "npm:^1.0.7" + "@radix-ui/react-tooltip": "npm:^1.1.2" + classnames: "npm:^2.3.2" + peerDependencies: + "@hsl-fi/design-tokens": ^1.20.0 + "@hsl-fi/layout-primitives": ^4.4.0 + react: ">=16" + checksum: 10/b93ad1d415d09714581b45745c699489ff0512d20fa6299b39973eb769951dfa9e1dea55647f7f7b503a58293f2118c0b8db86c447fbd19f44c1c92e4ebaef20 + languageName: node + linkType: hard + "@hsl-fi/sass@npm: 1.0.0, @hsl-fi/sass@npm:^1.0.0": version: 1.0.0 resolution: "@hsl-fi/sass@npm:1.0.0" @@ -3300,25 +3440,7 @@ __metadata: languageName: node linkType: hard -"@hsl-fi/screen-reader-only@npm:^1.0.0": - version: 1.0.0 - resolution: "@hsl-fi/screen-reader-only@npm:1.0.0" - checksum: 10/6f595b40242231ff691786392aa038be228fa48640b65eafa0094ecbc2da3b27246beabf2fea0eda2aeaddc2b2ae02764514ffadc8f861120061d13826a11fef - languageName: node - linkType: hard - -"@hsl-fi/search-input@npm:1.1.2": - version: 1.1.2 - resolution: "@hsl-fi/search-input@npm:1.1.2" - dependencies: - "@hsl-fi/icons": "npm:^1.0.6" - "@hsl-fi/text-input": "npm:^1.0.3" - "@hsl-fi/utilities": "npm:^0.3.2" - checksum: 10/aa74349bcf19c1f0051bffab343c2de39d0cf112683ebbefeee89030fef56d31b0575bfbe1f3233b8c224f299530c792439e27d5a58eb4e17ab18c45c5d84188 - languageName: node - linkType: hard - -"@hsl-fi/shimmer@npm:0.1.2, @hsl-fi/shimmer@npm:^0.1.0": +"@hsl-fi/shimmer@npm:0.1.2": version: 0.1.2 resolution: "@hsl-fi/shimmer@npm:0.1.2" dependencies: @@ -3327,89 +3449,29 @@ __metadata: languageName: node linkType: hard -"@hsl-fi/site-header@npm:4.5.2": - version: 4.5.2 - resolution: "@hsl-fi/site-header@npm:4.5.2" - dependencies: - "@hsl-fi/animated-spinner": "npm:^0.3.0" - "@hsl-fi/button": "npm:^1.2.4" - "@hsl-fi/container-spinner": "npm:^0.3.2" - "@hsl-fi/content-delivery-api-types": "npm:^1.0.1" - "@hsl-fi/error-view": "npm:^0.1.3" - "@hsl-fi/hooks": "npm:^1.2.4" - "@hsl-fi/hsl-link": "npm:^1.1.0" - "@hsl-fi/icons": "npm:^1.0.6" - "@hsl-fi/sass": "npm:^1.0.0" - "@hsl-fi/screen-reader-only": "npm:^1.0.0" - "@hsl-fi/search-input": "npm:1.1.2" - "@hsl-fi/shimmer": "npm:^0.1.0" - "@hsl-fi/text-input-error": "npm:^0.1.2" - "@hsl-fi/traffic-announcements": "npm:^1.1.2" - "@hsl-fi/utilities": "npm:0.3.2" - lodash: "npm:^4.17.21" - react-animate-height: "npm:^2.0.21" - checksum: 10/8ba415a28c9f3f1897422f520f601f8d1ff55096ef9a68a6bd24861b0210232949d27c53da545c394eef0d2cd9ab8f2d803d30aa94aaeee8dd2ccec73e5c67b5 - languageName: node - linkType: hard - -"@hsl-fi/text-input-error@npm:^0.1.2": - version: 0.1.2 - resolution: "@hsl-fi/text-input-error@npm:0.1.2" - dependencies: - "@hsl-fi/icons": "npm:^1.0.6" - "@hsl-fi/sass": "npm:^0.2.0" - "@hsl-fi/utilities": "npm:^0.3.2" - react-animate-height: "npm:^2.0.23" - checksum: 10/9c337612449d6bdf3f6e491c96f1326ef7423f5a0032971a5289f3ae3c0b707efe524a16adf5c2414ff2c62002c299eb5921b9d99c452178f71b3353a150bee6 - languageName: node - linkType: hard - -"@hsl-fi/text-input-field@npm:^1.1.1": - version: 1.1.1 - resolution: "@hsl-fi/text-input-field@npm:1.1.1" - dependencies: - "@hsl-fi/hooks": "npm:^1.2.4" - "@hsl-fi/icons": "npm:^1.0.6" - "@hsl-fi/utilities": "npm:^0.3.2" - checksum: 10/51f6b2a966e623813e19dfb51cfd5cd1c684dac3055183bd4f8ac4c6502bd54b1d09ddaa9726442d673d58a3bdc36f04292a87fd00cd5ad2ca29f5c41dfc9f86 - languageName: node - linkType: hard - -"@hsl-fi/text-input-label@npm:^1.0.0": - version: 1.0.1 - resolution: "@hsl-fi/text-input-label@npm:1.0.1" - dependencies: - "@hsl-fi/utilities": "npm:^0.3.2" - checksum: 10/01103b4e25730ebb0bf005a0e566686832e7f86d841893521b0b4277371a800d41297912756c9f97658259bbcd0b9db4f82ab3cbaa14181ade86e62bb4fdb6cd - languageName: node - linkType: hard - -"@hsl-fi/text-input@npm:^1.0.3": - version: 1.0.3 - resolution: "@hsl-fi/text-input@npm:1.0.3" - dependencies: - "@hsl-fi/text-input-error": "npm:^0.1.2" - "@hsl-fi/text-input-field": "npm:^1.1.1" - "@hsl-fi/text-input-label": "npm:^1.0.0" - "@hsl-fi/utilities": "npm:^0.3.2" - checksum: 10/f2e84a74da0c966b119a3db01c044ac1c704de13896ed80c3b78d2eb036fe20f173a657150335eb116466f05f44bd30c339366ab0144c472a4ec78e82da9b9cb - languageName: node - linkType: hard - -"@hsl-fi/traffic-announcements@npm:^1.1.2": - version: 1.1.2 - resolution: "@hsl-fi/traffic-announcements@npm:1.1.2" +"@hsl-fi/site-header@npm:6.4.0": + version: 6.4.0 + resolution: "@hsl-fi/site-header@npm:6.4.0" dependencies: - "@hsl-fi/button": "npm:^1.2.4" - "@hsl-fi/content-delivery-api-types": "npm:^1.0.1" - "@hsl-fi/icons": "npm:^1.0.6" - "@hsl-fi/sass": "npm:^0.2.0" - "@hsl-fi/utilities": "npm:^0.3.2" - checksum: 10/db07ecb7f96632816a105fefa2c8e6f59d71a4c71b644a26c9b825e93460463c1dae57206832ae5537587ce41de6e69ba5cf7f37735a530a93c0957bd5f32014 + "@hsl-fi/accessibility": "npm:^1.4.3" + "@hsl-fi/dialog": "npm:^3.1.0" + "@hsl-fi/form": "npm:^5.0.0" + "@hsl-fi/i18n": "npm:^1.5.1" + "@hsl-fi/icons": "npm:^2.2.4" + "@hsl-fi/loading-indicators": "npm:^2.0.0" + "@hsl-fi/navigation": "npm:^3.0.0" + "@hsl-fi/notifications": "npm:^4.0.4" + "@hsl-fi/overlays": "npm:^3.0.0" + classnames: "npm:^2.3.2" + peerDependencies: + "@hsl-fi/design-tokens": ^1.20.0 + "@hsl-fi/layout-primitives": ^4.4.0 + react: ">=16" + checksum: 10/5a19c0ff28d17609ef36533b4e89c129c5e42301c74337b660ebef81bb119eb80f5b64f583c1311cc0c98b45050e76e35e6413100b6e248cd0b1c2f0c45a7e70 languageName: node linkType: hard -"@hsl-fi/utilities@npm:*": +"@hsl-fi/utilities@npm:*, @hsl-fi/utilities@npm:^0.4.0": version: 0.4.0 resolution: "@hsl-fi/utilities@npm:0.4.0" dependencies: @@ -3420,7 +3482,7 @@ __metadata: languageName: node linkType: hard -"@hsl-fi/utilities@npm:0.3.2, @hsl-fi/utilities@npm:^0.3.2": +"@hsl-fi/utilities@npm:^0.3.2": version: 0.3.2 resolution: "@hsl-fi/utilities@npm:0.3.2" dependencies: @@ -5711,6 +5773,13 @@ __metadata: languageName: node linkType: hard +"@radix-ui/number@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/number@npm:1.1.1" + checksum: 10/58717faf3f7aa180fdfcde7083cae0bc06677cbd08fd2bed5a3f8820deeb6f514f7d475f1fbb61e1f9a16cb2e7daf1000b2c614b0de3520fccfc04e3576e4566 + languageName: node + linkType: hard + "@radix-ui/primitive@npm:1.1.3": version: 1.1.3 resolution: "@radix-ui/primitive@npm:1.1.3" @@ -5718,48 +5787,288 @@ __metadata: languageName: node linkType: hard -"@radix-ui/react-compose-refs@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-compose-refs@npm:1.1.2" +"@radix-ui/react-accordion@npm:^1.2.0": + version: 1.2.12 + resolution: "@radix-ui/react-accordion@npm:1.2.12" + dependencies: + "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-collapsible": "npm:1.1.12" + "@radix-ui/react-collection": "npm:1.1.7" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-direction": "npm:1.1.1" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/5cf644dcddd2d29ceba2e82043e574cb25745ad42ecdf47e8e212732fec012f8121f49c7fa8527deb28fbc37d3bd4fed2bbe61ed06a56c69c8aaad1ade6db43b + languageName: node + linkType: hard + +"@radix-ui/react-arrow@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-arrow@npm:1.1.7" + dependencies: + "@radix-ui/react-primitive": "npm:2.1.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/6cdf74f06090f8994cdf6d3935a44ea3ac309163a4f59c476482c4907e8e0775f224045030abf10fa4f9e1cb7743db034429249b9e59354988e247eeb0f4fdcf + languageName: node + linkType: hard + +"@radix-ui/react-collapsible@npm:1.1.12": + version: 1.1.12 + resolution: "@radix-ui/react-collapsible@npm:1.1.12" + dependencies: + "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-presence": "npm:1.1.5" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/13dfea611da7201b6db3dd83470ac644fbf3b17f0fe2214914cfe703493b97b4d66aca000fd84eda64ed1cfb8d356d7088e1bc5ae7f0aad52d723c5ac5d9381f + languageName: node + linkType: hard + +"@radix-ui/react-collection@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-collection@npm:1.1.7" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-slot": "npm:1.2.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/cd53e2a2be82be7bc4014164cac0b42948401a203e5d0294d3947a5193f1d56bd23eb60e878a98dba50d08283254e79c3b873de5f935276b849686a868d51dd5 + languageName: node + linkType: hard + +"@radix-ui/react-compose-refs@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-compose-refs@npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/9a91f0213014ffa40c5b8aae4debb993be5654217e504e35aa7422887eb2d114486d37e53c482d0fffb00cd44f51b5269fcdf397b280c71666fa11b7f32f165d + languageName: node + linkType: hard + +"@radix-ui/react-context@npm:1.1.2": + version: 1.1.2 + resolution: "@radix-ui/react-context@npm:1.1.2" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/156088367de42afa3c7e3acf5f0ba7cad6b359f3d17485585e80c2418434a6ed7cac2602eb73bca265d0091a1ad380f9405c069f103983e53497097ff35ba8f2 + languageName: node + linkType: hard + +"@radix-ui/react-dialog@npm:^1.0.5": + version: 1.1.15 + resolution: "@radix-ui/react-dialog@npm:1.1.15" + dependencies: + "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-dismissable-layer": "npm:1.1.11" + "@radix-ui/react-focus-guards": "npm:1.1.3" + "@radix-ui/react-focus-scope": "npm:1.1.7" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-portal": "npm:1.1.9" + "@radix-ui/react-presence": "npm:1.1.5" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-slot": "npm:1.2.3" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/90ad9ea36d927a05bcc2701b471c2965f6d5d4f446511cd471e62235fc674186997dea081f52e18cb17a1e593828d94da3848e68864fa3acebe29df9b068b240 + languageName: node + linkType: hard + +"@radix-ui/react-direction@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-direction@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/8cc330285f1d06829568042ca9aabd3295be4690ae93683033fc8632b5c4dfc60f5c1312f6e2cae27c196189c719de3cfbcf792ff74800f9ccae0ab4abc1bc92 + languageName: node + linkType: hard + +"@radix-ui/react-dismissable-layer@npm:1.1.11": + version: 1.1.11 + resolution: "@radix-ui/react-dismissable-layer@npm:1.1.11" + dependencies: + "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" + "@radix-ui/react-use-escape-keydown": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/c20772588423379dee47fbe1d45c238c45a3bbe612eaf64a86576bf81821975e256d92ac71f9151e91b94a73068656143a11da9a3e77de7564d2a9926468e37a + languageName: node + linkType: hard + +"@radix-ui/react-dropdown-menu@npm:^2.1.16": + version: 2.1.16 + resolution: "@radix-ui/react-dropdown-menu@npm:2.1.16" + dependencies: + "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-menu": "npm:2.1.16" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/da215196b5dde5619cdb424b1b5236159e4bb949974b7f4ffbf047d467c55116229a8f9cf07eae6457afefb4a2b07888bb30542f303045e05d90a4b072941ae2 + languageName: node + linkType: hard + +"@radix-ui/react-focus-guards@npm:1.1.3": + version: 1.1.3 + resolution: "@radix-ui/react-focus-guards@npm:1.1.3" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/b57878f6cf0ebc3e8d7c5c6bbaad44598daac19c921551ca541c104201048a9a902f3d69196e7a09995fd46e998c309aab64dc30fa184b3609d67d187a6a9c24 + languageName: node + linkType: hard + +"@radix-ui/react-focus-scope@npm:1.1.7": + version: 1.1.7 + resolution: "@radix-ui/react-focus-scope@npm:1.1.7" + dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10/9a91f0213014ffa40c5b8aae4debb993be5654217e504e35aa7422887eb2d114486d37e53c482d0fffb00cd44f51b5269fcdf397b280c71666fa11b7f32f165d + "@types/react-dom": + optional: true + checksum: 10/2a7cd00e39e01756999ebf0bdb3401d6a8efa489a7b19e6b629b40bad3022b7b1f616555ccb4b0505bc0ba53e13a1fb51be905db138b16ec39c4fe319fe701d3 languageName: node linkType: hard -"@radix-ui/react-context@npm:1.1.2": - version: 1.1.2 - resolution: "@radix-ui/react-context@npm:1.1.2" +"@radix-ui/react-id@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-id@npm:1.1.1" + dependencies: + "@radix-ui/react-use-layout-effect": "npm:1.1.1" peerDependencies: "@types/react": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10/156088367de42afa3c7e3acf5f0ba7cad6b359f3d17485585e80c2418434a6ed7cac2602eb73bca265d0091a1ad380f9405c069f103983e53497097ff35ba8f2 + checksum: 10/8d68e200778eb3038906870fc869b3d881f4a46715fb20cddd9c76cba42fdaaa4810a3365b6ec2daf0f185b9201fc99d009167f59c7921bc3a139722c2e976db languageName: node linkType: hard -"@radix-ui/react-dialog@npm:^1.0.5": - version: 1.1.15 - resolution: "@radix-ui/react-dialog@npm:1.1.15" +"@radix-ui/react-menu@npm:2.1.16": + version: 2.1.16 + resolution: "@radix-ui/react-menu@npm:2.1.16" dependencies: "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-collection": "npm:1.1.7" "@radix-ui/react-compose-refs": "npm:1.1.2" "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-direction": "npm:1.1.1" "@radix-ui/react-dismissable-layer": "npm:1.1.11" "@radix-ui/react-focus-guards": "npm:1.1.3" "@radix-ui/react-focus-scope": "npm:1.1.7" "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-popper": "npm:1.2.8" "@radix-ui/react-portal": "npm:1.1.9" "@radix-ui/react-presence": "npm:1.1.5" "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-roving-focus": "npm:1.1.11" "@radix-ui/react-slot": "npm:1.2.3" - "@radix-ui/react-use-controllable-state": "npm:1.2.2" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" aria-hidden: "npm:^1.2.4" react-remove-scroll: "npm:^2.6.3" peerDependencies: @@ -5772,19 +6081,29 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/90ad9ea36d927a05bcc2701b471c2965f6d5d4f446511cd471e62235fc674186997dea081f52e18cb17a1e593828d94da3848e68864fa3acebe29df9b068b240 + checksum: 10/2ffdfa08822c8c4ffc265d02d16c83d725114f9c0e9b510e73e431306dedddd507ef2861ccd67ec8c0d21cb24cd6401e42f16f3e65b30be627c7e22159151e40 languageName: node linkType: hard -"@radix-ui/react-dismissable-layer@npm:1.1.11": - version: 1.1.11 - resolution: "@radix-ui/react-dismissable-layer@npm:1.1.11" +"@radix-ui/react-popover@npm:^1.0.7": + version: 1.1.15 + resolution: "@radix-ui/react-popover@npm:1.1.15" dependencies: "@radix-ui/primitive": "npm:1.1.3" "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-dismissable-layer": "npm:1.1.11" + "@radix-ui/react-focus-guards": "npm:1.1.3" + "@radix-ui/react-focus-scope": "npm:1.1.7" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-popper": "npm:1.2.8" + "@radix-ui/react-portal": "npm:1.1.9" + "@radix-ui/react-presence": "npm:1.1.5" "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-callback-ref": "npm:1.1.1" - "@radix-ui/react-use-escape-keydown": "npm:1.1.1" + "@radix-ui/react-slot": "npm:1.2.3" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -5795,30 +6114,44 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/c20772588423379dee47fbe1d45c238c45a3bbe612eaf64a86576bf81821975e256d92ac71f9151e91b94a73068656143a11da9a3e77de7564d2a9926468e37a + checksum: 10/0ea7c8bb827e44d5c02b3f7193d9ac8085c71a01bf601b1afeb2bb0ec0124756e03db3471606e89e4d014e4de7c7066c8e2e9b81bb4b31ea321890ec33421f31 languageName: node linkType: hard -"@radix-ui/react-focus-guards@npm:1.1.3": - version: 1.1.3 - resolution: "@radix-ui/react-focus-guards@npm:1.1.3" +"@radix-ui/react-popper@npm:1.2.8": + version: 1.2.8 + resolution: "@radix-ui/react-popper@npm:1.2.8" + dependencies: + "@floating-ui/react-dom": "npm:^2.0.0" + "@radix-ui/react-arrow": "npm:1.1.7" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + "@radix-ui/react-use-rect": "npm:1.1.1" + "@radix-ui/react-use-size": "npm:1.1.1" + "@radix-ui/rect": "npm:1.1.1" peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10/b57878f6cf0ebc3e8d7c5c6bbaad44598daac19c921551ca541c104201048a9a902f3d69196e7a09995fd46e998c309aab64dc30fa184b3609d67d187a6a9c24 + "@types/react-dom": + optional: true + checksum: 10/01366054e1e63dd9394f77afb9da3367709478a5adf4436c080fc5bbe9456170192ff9d1425d9fae5b246e1ba95173848f84b6f2a06b21b47d966367ec7cb997 languageName: node linkType: hard -"@radix-ui/react-focus-scope@npm:1.1.7": - version: 1.1.7 - resolution: "@radix-ui/react-focus-scope@npm:1.1.7" +"@radix-ui/react-portal@npm:1.1.9": + version: 1.1.9 + resolution: "@radix-ui/react-portal@npm:1.1.9" dependencies: - "@radix-ui/react-compose-refs": "npm:1.1.2" "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-callback-ref": "npm:1.1.1" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -5829,31 +6162,35 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/2a7cd00e39e01756999ebf0bdb3401d6a8efa489a7b19e6b629b40bad3022b7b1f616555ccb4b0505bc0ba53e13a1fb51be905db138b16ec39c4fe319fe701d3 + checksum: 10/bd6be39bf021d5c917e2474ecba411e2625171f7ef96862b9af04bbd68833bb3662a7f1fbdeb5a7a237111b10e811e76d2cd03e957dadd6e668ef16541bfbd68 languageName: node linkType: hard -"@radix-ui/react-id@npm:1.1.1": - version: 1.1.1 - resolution: "@radix-ui/react-id@npm:1.1.1" +"@radix-ui/react-presence@npm:1.1.5": + version: 1.1.5 + resolution: "@radix-ui/react-presence@npm:1.1.5" dependencies: + "@radix-ui/react-compose-refs": "npm:1.1.2" "@radix-ui/react-use-layout-effect": "npm:1.1.1" peerDependencies: "@types/react": "*" + "@types/react-dom": "*" react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc peerDependenciesMeta: "@types/react": optional: true - checksum: 10/8d68e200778eb3038906870fc869b3d881f4a46715fb20cddd9c76cba42fdaaa4810a3365b6ec2daf0f185b9201fc99d009167f59c7921bc3a139722c2e976db + "@types/react-dom": + optional: true + checksum: 10/4cdb05844c18877efb4b9739b46b7e5850b81d7ede994e75b5d62e8153a43c6e16b3ff9e55ff716e20b74b99b9415a94e97fd636bcb8698d5bbf7ab7b8663f9b languageName: node linkType: hard -"@radix-ui/react-portal@npm:1.1.9": - version: 1.1.9 - resolution: "@radix-ui/react-portal@npm:1.1.9" +"@radix-ui/react-primitive@npm:2.1.3": + version: 2.1.3 + resolution: "@radix-ui/react-primitive@npm:2.1.3" dependencies: - "@radix-ui/react-primitive": "npm:2.1.3" - "@radix-ui/react-use-layout-effect": "npm:1.1.1" + "@radix-ui/react-slot": "npm:1.2.3" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -5864,16 +6201,23 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/bd6be39bf021d5c917e2474ecba411e2625171f7ef96862b9af04bbd68833bb3662a7f1fbdeb5a7a237111b10e811e76d2cd03e957dadd6e668ef16541bfbd68 + checksum: 10/1dbbf932a3527f4e62f210bb72944eff605c3e38c8d3275ed5a5c570c02820ab156169756a65ad9a638d2089a828a04a7903795377384e98c87d0ca456303253 languageName: node linkType: hard -"@radix-ui/react-presence@npm:1.1.5": - version: 1.1.5 - resolution: "@radix-ui/react-presence@npm:1.1.5" +"@radix-ui/react-roving-focus@npm:1.1.11": + version: 1.1.11 + resolution: "@radix-ui/react-roving-focus@npm:1.1.11" dependencies: + "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-collection": "npm:1.1.7" "@radix-ui/react-compose-refs": "npm:1.1.2" - "@radix-ui/react-use-layout-effect": "npm:1.1.1" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-direction": "npm:1.1.1" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -5884,15 +6228,35 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/4cdb05844c18877efb4b9739b46b7e5850b81d7ede994e75b5d62e8153a43c6e16b3ff9e55ff716e20b74b99b9415a94e97fd636bcb8698d5bbf7ab7b8663f9b + checksum: 10/0eddafa942332c95622ab8b53cce2fa25fd0dcaf4797218e9e6725da0734a81a438852cdcb3f588521018f68d38c6c5e50c64fda78c655f4e69dd45681ecc5e7 languageName: node linkType: hard -"@radix-ui/react-primitive@npm:2.1.3": - version: 2.1.3 - resolution: "@radix-ui/react-primitive@npm:2.1.3" +"@radix-ui/react-select@npm:^2.2.6": + version: 2.2.6 + resolution: "@radix-ui/react-select@npm:2.2.6" dependencies: + "@radix-ui/number": "npm:1.1.1" + "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-collection": "npm:1.1.7" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-direction": "npm:1.1.1" + "@radix-ui/react-dismissable-layer": "npm:1.1.11" + "@radix-ui/react-focus-guards": "npm:1.1.3" + "@radix-ui/react-focus-scope": "npm:1.1.7" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-popper": "npm:1.2.8" + "@radix-ui/react-portal": "npm:1.1.9" + "@radix-ui/react-primitive": "npm:2.1.3" "@radix-ui/react-slot": "npm:1.2.3" + "@radix-ui/react-use-callback-ref": "npm:1.1.1" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + "@radix-ui/react-use-previous": "npm:1.1.1" + "@radix-ui/react-visually-hidden": "npm:1.2.3" + aria-hidden: "npm:^1.2.4" + react-remove-scroll: "npm:^2.6.3" peerDependencies: "@types/react": "*" "@types/react-dom": "*" @@ -5903,7 +6267,7 @@ __metadata: optional: true "@types/react-dom": optional: true - checksum: 10/1dbbf932a3527f4e62f210bb72944eff605c3e38c8d3275ed5a5c570c02820ab156169756a65ad9a638d2089a828a04a7903795377384e98c87d0ca456303253 + checksum: 10/ef6df1a6411a965d30f8e14387058ece020469897ad2089d1e1019d8e37487e6b3c0f9683d7c6ec217698fa85fedd419738cab089a5ebc49a04405e63aac0bf0 languageName: node linkType: hard @@ -5922,6 +6286,36 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-tooltip@npm:^1.1.2": + version: 1.2.8 + resolution: "@radix-ui/react-tooltip@npm:1.2.8" + dependencies: + "@radix-ui/primitive": "npm:1.1.3" + "@radix-ui/react-compose-refs": "npm:1.1.2" + "@radix-ui/react-context": "npm:1.1.2" + "@radix-ui/react-dismissable-layer": "npm:1.1.11" + "@radix-ui/react-id": "npm:1.1.1" + "@radix-ui/react-popper": "npm:1.2.8" + "@radix-ui/react-portal": "npm:1.1.9" + "@radix-ui/react-presence": "npm:1.1.5" + "@radix-ui/react-primitive": "npm:2.1.3" + "@radix-ui/react-slot": "npm:1.2.3" + "@radix-ui/react-use-controllable-state": "npm:1.2.2" + "@radix-ui/react-visually-hidden": "npm:1.2.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/e31857628d998b69616b8994f9627d387ed7bfa453b94e3b18ad2c04de83caf5fcca0ef2f304b1d343e00f183e937d883247d81e386dcc76c7c7c268484bc47c + languageName: node + linkType: hard + "@radix-ui/react-use-callback-ref@npm:1.1.1": version: 1.1.1 resolution: "@radix-ui/react-use-callback-ref@npm:1.1.1" @@ -5994,6 +6388,75 @@ __metadata: languageName: node linkType: hard +"@radix-ui/react-use-previous@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-previous@npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/ea6ea13523a0561dda9b14b9d44e299484816a6762d7fb50b91b27b6aec89f78c85245b69d5a904750d43919dbb7ef6ce6d3823639346675aa3a5cb9de32d984 + languageName: node + linkType: hard + +"@radix-ui/react-use-rect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-rect@npm:1.1.1" + dependencies: + "@radix-ui/rect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/116461bebc49472f7497e66a9bd413541181b3d00c5e0aaeef45d790dc1fbd7c8dcea80b169ea273306228b9a3c2b70067e902d1fd5004b3057e3bbe35b9d55d + languageName: node + linkType: hard + +"@radix-ui/react-use-size@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/react-use-size@npm:1.1.1" + dependencies: + "@radix-ui/react-use-layout-effect": "npm:1.1.1" + peerDependencies: + "@types/react": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + checksum: 10/64e61f65feb67ffc80e1fc4a8d5e32480fb6d68475e2640377e021178dead101568cba5f936c9c33e6c142c7cf2fb5d76ad7b23ef80e556ba142d56cf306147b + languageName: node + linkType: hard + +"@radix-ui/react-visually-hidden@npm:1.2.3": + version: 1.2.3 + resolution: "@radix-ui/react-visually-hidden@npm:1.2.3" + dependencies: + "@radix-ui/react-primitive": "npm:2.1.3" + peerDependencies: + "@types/react": "*" + "@types/react-dom": "*" + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + "@types/react": + optional: true + "@types/react-dom": + optional: true + checksum: 10/42296bde1ddf4af4e7445e914c35d6bc8406d6ede49f0a959a553e75b3ed21da09fda80a81c48d8ec058ed8129ce7137499d02ee26f90f0d3eaa2417922d6509 + languageName: node + linkType: hard + +"@radix-ui/rect@npm:1.1.1": + version: 1.1.1 + resolution: "@radix-ui/rect@npm:1.1.1" + checksum: 10/b6c5eb787640775b53dd52fa47218a089f0a0d8220d3ebff079c0b754e1fb82d89b6bdf08a82fd0d59549bdeb52678c0cca091c302da49dcf74c3c989cb55678 + languageName: node + linkType: hard + "@repeaterjs/repeater@npm:3.0.4": version: 3.0.4 resolution: "@repeaterjs/repeater@npm:3.0.4" @@ -9687,7 +10150,7 @@ __metadata: languageName: node linkType: hard -"classnames@npm:2.5.1, classnames@npm:^2.2.5, classnames@npm:^2.2.6, classnames@npm:^2.3.2, classnames@npm:^2.5.1": +"classnames@npm:2.5.1, classnames@npm:^2.2.6, classnames@npm:^2.3.2, classnames@npm:^2.5.1": version: 2.5.1 resolution: "classnames@npm:2.5.1" checksum: 10/58eb394e8817021b153bb6e7d782cfb667e4ab390cb2e9dac2fc7c6b979d1cc2b2a733093955fc5c94aa79ef5c8c89f11ab77780894509be6afbb91dddd79d15 @@ -10849,6 +11312,13 @@ __metadata: languageName: node linkType: hard +"country-flag-icons@npm:^1.6.14": + version: 1.6.16 + resolution: "country-flag-icons@npm:1.6.16" + checksum: 10/786deb57fc5cf7f8e61b2acb2e438ebc2a89ce72839dd01b175cda6015b723b518faca0a837a9c2957ce417454f287dbef0ac0a718064165728c13885767c3fe + languageName: node + linkType: hard + "create-ecdh@npm:^4.0.4": version: 4.0.4 resolution: "create-ecdh@npm:4.0.4" @@ -11826,7 +12296,7 @@ __metadata: "@hsl-fi/modal": "npm: ^0.3.2" "@hsl-fi/sass": "npm: 1.0.0" "@hsl-fi/shimmer": "npm:0.1.2" - "@hsl-fi/site-header": "npm:4.5.2" + "@hsl-fi/site-header": "npm:6.4.0" "@lerna/batch-packages": "npm:3.16.0" "@lerna/filter-packages": "npm:3.18.0" "@lerna/project": "npm:3.21.0" @@ -16180,6 +16650,15 @@ __metadata: languageName: node linkType: hard +"imask@npm:^7.6.1": + version: 7.6.1 + resolution: "imask@npm:7.6.1" + dependencies: + "@babel/runtime-corejs3": "npm:^7.24.4" + checksum: 10/0c8746547ee06132ae35200418cf6ed209e8f5bc7f6ba184e7b9aaa3932f518ac36531033da7ac2ab8a8c826098eaca85825b884b846867973cd31211dc5fc65 + languageName: node + linkType: hard + "immediate@npm:~3.0.5": version: 3.0.6 resolution: "immediate@npm:3.0.6" @@ -16365,6 +16844,23 @@ __metadata: languageName: node linkType: hard +"input-format@npm:^0.3.14": + version: 0.3.14 + resolution: "input-format@npm:0.3.14" + dependencies: + prop-types: "npm:^15.8.1" + peerDependencies: + react: ">=18.1.0" + react-dom: ">=18.1.0" + peerDependenciesMeta: + react: + optional: true + react-dom: + optional: true + checksum: 10/2b6903599f59aefe1571fbde46c45663c8b9d170934c798f2d6c5bf07a2f578bc3c63a5f653d48eaefd414e9b1b8f16b497f2cd4e56d65dc65e4a86b4611ae02 + languageName: node + linkType: hard + "inquirer@npm:12.9.6": version: 12.9.6 resolution: "inquirer@npm:12.9.6" @@ -18699,6 +19195,13 @@ __metadata: languageName: node linkType: hard +"libphonenumber-js@npm:^1.12.37": + version: 1.12.42 + resolution: "libphonenumber-js@npm:1.12.42" + checksum: 10/11b4f46e2f6e9b6da59e6b60c02dcb0e9f473f78e161138188493f0d1161db33a1cc9ed4b0b4dca58b666b9683fcfd6e18f60184973212c37696090d2258c2e4 + languageName: node + linkType: hard + "lie@npm:~3.3.0": version: 3.3.0 resolution: "lie@npm:3.3.0" @@ -23647,7 +24150,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:15.8.1, prop-types@npm:^15.5.8, prop-types@npm:^15.6.0, prop-types@npm:^15.6.1, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:15.8.1, prop-types@npm:^15.5.8, prop-types@npm:^15.6.0, prop-types@npm:^15.6.2, prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -24053,20 +24556,7 @@ __metadata: languageName: node linkType: hard -"react-animate-height@npm:^2.0.21, react-animate-height@npm:^2.0.23": - version: 2.1.2 - resolution: "react-animate-height@npm:2.1.2" - dependencies: - classnames: "npm:^2.2.5" - prop-types: "npm:^15.6.1" - peerDependencies: - react: ">=15.6.2" - react-dom: ">=15.6.2" - checksum: 10/ca888e3ec2ec760044b03dff494464c11d05ad3945adadaa7286418d872d79dc021d806c68f96087821b37f20c8eec99556597cdf618cf9f80851e9f9ecb9c5a - languageName: node - linkType: hard - -"react-animate-height@npm:^3.2.3": +"react-animate-height@npm:^3.2.2, react-animate-height@npm:^3.2.3": version: 3.2.3 resolution: "react-animate-height@npm:3.2.3" peerDependencies: @@ -24149,6 +24639,18 @@ __metadata: languageName: node linkType: hard +"react-imask@npm:^7.6.1": + version: 7.6.1 + resolution: "react-imask@npm:7.6.1" + dependencies: + imask: "npm:^7.6.1" + prop-types: "npm:^15.8.1" + peerDependencies: + react: ">=0.14.0" + checksum: 10/429ada8d2ffe65688cff0358f245a19b6ec31b875fee7df6ca7179271aec9155e6836b5fcabab25fc6f421dcb282cceacff9043cb1a26761d147c0ecbdb50682 + languageName: node + linkType: hard + "react-input-autosize@npm:^3.0.0": version: 3.0.0 resolution: "react-input-autosize@npm:3.0.0" @@ -24248,6 +24750,22 @@ __metadata: languageName: node linkType: hard +"react-phone-number-input@npm:^3.4.5": + version: 3.4.16 + resolution: "react-phone-number-input@npm:3.4.16" + dependencies: + classnames: "npm:^2.5.1" + country-flag-icons: "npm:^1.6.14" + input-format: "npm:^0.3.14" + libphonenumber-js: "npm:^1.12.37" + prop-types: "npm:^15.8.1" + peerDependencies: + react: ">=16.8" + react-dom: ">=16.8" + checksum: 10/3e7d10525aa9680b476bad9496b5952e2d671bfa8faf9cb52a505845ac6178ce9d10efe6c81c22b4016b00a36303497283930cbbee52f059da587304249a1ca0 + languageName: node + linkType: hard + "react-redux@npm:^7.0.0": version: 7.2.9 resolution: "react-redux@npm:7.2.9" @@ -28988,6 +29506,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^13.0.0": + version: 13.0.1 + resolution: "uuid@npm:13.0.1" + bin: + uuid: dist-node/bin/uuid + checksum: 10/da190a58eb699dfde38013c9ae8e2469eb62cc6c0774bb7d58b818a4fd1f0b269f11465d5153f88cfcf21e8b8187f35e016b2b033a53a6e06a22103ccce7a5fe + languageName: node + linkType: hard + "uuid@npm:^3.3.2": version: 3.4.0 resolution: "uuid@npm:3.4.0"