diff --git a/.eslintrc.js b/.eslintrc.js
index 2fb8cda9..ce37830e 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -32,5 +32,11 @@ module.exports = {
'import/no-extraneous-dependencies': 'off', // fixme revisit and refactor files when there's time to spare
'react/react-in-jsx-scope': 'off',
'react/jsx-one-expression-per-line': 'warn',
+ 'no-restricted-imports': ['error', {
+ paths: [{
+ name: 'react-i18next',
+ message: 'Please import useTranslation from next-i18next.',
+ }],
+ }],
},
}
diff --git a/__tests__/components/Footer/Footer.test.tsx b/__tests__/components/Footer/Footer.test.tsx
deleted file mode 100644
index ab4ff964..00000000
--- a/__tests__/components/Footer/Footer.test.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { render, screen } from '@testing-library/react'
-import Footer from '../../../components/Footer/Footer'
-
-describe('Footer component', () => {
- it('should render without crashing', () => {
- render(
- ,
- )
- expect(screen.getByText('Med stöd från')).toBeInTheDocument()
- expect(screen.getByText('Partners')).toBeInTheDocument()
- })
-
- it('should display the newsletter subscription', () => {
- render(
- ,
- )
- // Assuming you add data-testid="newsletter-subscribe" to your NewsletterSubscribe component
- const newsletterElement = screen.getByText('Vill du få nyheter om Klimatkollen?')
- expect(newsletterElement).toBeInTheDocument()
- })
-
- it('should display partners', () => {
- render(
- ,
- )
- expect(screen.getByAltText('Postkodstiftelsen logo')).toBeInTheDocument()
- })
-
- it('should display tagline', () => {
- render(
- ,
- )
- expect(screen.getByText('Klimatkollen är en medborgarplattform som tillgängliggör klimatdata')).toBeInTheDocument()
- })
-
- it('should display the copyright text', () => {
- render(
- ,
- )
- expect(screen.getByText(/CC BY-SA/)).toBeInTheDocument()
- })
-
- it('should display logo', () => {
- render(
- ,
- )
- expect(screen.getByAltText('Klimatkollen logo')).toBeInTheDocument()
- })
-
- it('should display SoMe links', () => {
- render(
- ,
- )
- expect(screen.getByText('Maila oss')).toBeInTheDocument()
- expect(screen.getByAltText('Linkedin logo')).toBeInTheDocument()
- })
-})
diff --git a/__tests__/components/Footer/FooterNewsletterForm.test.tsx b/__tests__/components/Footer/FooterNewsletterForm.test.tsx
deleted file mode 100644
index 95c12e14..00000000
--- a/__tests__/components/Footer/FooterNewsletterForm.test.tsx
+++ /dev/null
@@ -1,38 +0,0 @@
-import { render, screen, fireEvent } from '@testing-library/react'
-import NewsletterForm from '../../../components/Footer/FooterNewsletterForm'
-
-describe('NewsletterForm component', () => {
- const mockOnValidated = vi.fn()
-
- beforeEach(() => {
- render(
- ,
- )
- })
-
- it('should render without crashing', () => {
- const header = screen.getByText('Vill du få nyheter om Klimatkollen?')
- expect(header).toBeInTheDocument()
- })
-
- it('should display a placeholder text in email input', () => {
- const emailInput = screen.getByPlaceholderText('Ange mailadress')
- expect(emailInput).toBeInTheDocument()
- })
-
- it('should update email value on input change', () => {
- const emailInput = screen.getByPlaceholderText('Ange mailadress') as HTMLInputElement
- fireEvent.change(emailInput, { target: { value: 'test@example.com' } })
- expect(emailInput.value).toBe('test@example.com')
- })
-
- it('should call onValidated when form is submitted', () => {
- const emailInput = screen.getByPlaceholderText('Ange mailadress') as HTMLInputElement
- const form = screen.getByPlaceholderText('Ange mailadress')
-
- fireEvent.change(emailInput, { target: { value: 'test@example.com' } })
- fireEvent.submit(form)
-
- expect(mockOnValidated).toHaveBeenCalledWith({ EMAIL: 'test@example.com' })
- })
-})
diff --git a/__tests__/components/Footer/FooterNewsletterSubscribe.test.tsx b/__tests__/components/Footer/FooterNewsletterSubscribe.test.tsx
deleted file mode 100644
index 3dab1696..00000000
--- a/__tests__/components/Footer/FooterNewsletterSubscribe.test.tsx
+++ /dev/null
@@ -1,22 +0,0 @@
-import React from 'react'
-import { render, screen } from '@testing-library/react'
-import NewsletterSubscribe from '../../../components/Footer/FooterNewsletterSubscribe'
-
-// Mock NewsletterForm
-vi.mock('../FooterNewsletterForm', () => ({ default: () =>
}))
-
-describe('NewsletterSubscribe component', () => {
- // FIXME this test needs to be updated, not working atm
- // it('should throw an error if the Mailchimp URL is undefined', () => {
- // // Setup environment variable to undefined
- // process.env.NEXT_PUBLIC_MAILCHIMP_URL = undefined
- // expect(() => render()).toThrow('Must have a mailchimp URL')
- // })
-
- it('should render without error if Mailchimp URL is set', () => {
- render()
-
- const newsletterForm = screen.getByText('Vill du få nyheter om Klimatkollen?')
- expect(newsletterForm).toBeInTheDocument()
- })
-})
diff --git a/__tests__/components/Footer/FooterPartners.test.tsx b/__tests__/components/Footer/FooterPartners.test.tsx
deleted file mode 100644
index de3c84fd..00000000
--- a/__tests__/components/Footer/FooterPartners.test.tsx
+++ /dev/null
@@ -1,31 +0,0 @@
-import React from 'react'
-import { render, screen } from '@testing-library/react'
-import Partners from '../../../components/Footer/FooterPartners'
-
-describe('Partners component', () => {
- beforeEach(() => {
- render()
- })
-
- it('should render all partner links', () => {
- const links = screen.getAllByRole('link')
- expect(links.length).toBe(4)
-
- // Checking partner URL
- expect(links[0]).toHaveAttribute('href', 'https://www.climateview.global/')
- expect(links[1]).toHaveAttribute('href', 'https://researchersdesk.se/')
- expect(links[2]).toHaveAttribute('href', 'https://www.klimatklubben.se/')
- expect(links[3]).toHaveAttribute('href', 'https://exponentialroadmap.org/')
- })
-
- it('should render all partner images with correct alt text', () => {
- const images = screen.getAllByRole('img')
- expect(images.length).toBe(4)
-
- // Checking image alt text
- expect(images[0]).toHaveAttribute('alt', 'ClimateView logo')
- expect(images[1]).toHaveAttribute('alt', 'Researchers desk logo')
- expect(images[2]).toHaveAttribute('alt', 'Klimatklubben logo')
- expect(images[3]).toHaveAttribute('alt', 'Exponential Roadmap logo')
- })
-})
diff --git a/__tests__/components/Footer/FooterSocialLinks.test.tsx b/__tests__/components/Footer/FooterSocialLinks.test.tsx
deleted file mode 100644
index e17e29a4..00000000
--- a/__tests__/components/Footer/FooterSocialLinks.test.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import React from 'react'
-import { render, screen } from '@testing-library/react'
-import SocialList from '../../../components/Footer/FooterSocialLinks'
-
-describe('SocialList component', () => {
- beforeEach(() => {
- render()
- })
-
- it('should render the email social list item', () => {
- const emailIcon = screen.getByAltText('Email icon')
- const emailLink = screen.getByText('Maila oss')
- expect(emailIcon).toBeInTheDocument()
- expect(emailLink).toHaveAttribute('href', 'mailto:hej@klimatkollen.se')
- })
-
- it('should render the Twitter social list item', () => {
- const twitterIcon = screen.getByAltText('X (Twitter) logo')
- const twitterLink = screen.getByText('X (Twitter)')
- expect(twitterIcon).toBeInTheDocument()
- expect(twitterLink).toHaveAttribute('href', 'https://twitter.com/klimatkollen')
- })
-
- it('should render the LinkedIn social list item', () => {
- const linkedInIcon = screen.getByAltText('Linkedin logo')
- const linkedInLink = screen.getByText('LinkedIn')
- expect(linkedInIcon).toBeInTheDocument()
- expect(linkedInLink).toHaveAttribute('href', 'https://www.linkedin.com/company/klimatkollen/')
- })
-
- it('should render the GitHub social list item', () => {
- const gitHubIcon = screen.getByAltText('GitHub logo')
- const gitHubLink = screen.getByText('GitHub')
- expect(gitHubIcon).toBeInTheDocument()
- expect(gitHubLink).toHaveAttribute('href', 'https://github.com/Klimatbyran/klimatkollen')
- })
-})
diff --git a/__tests__/index.test.tsx b/__tests__/index.test.tsx
index 1a0f15bd..729817d6 100644
--- a/__tests__/index.test.tsx
+++ b/__tests__/index.test.tsx
@@ -1,5 +1,4 @@
import { fireEvent, render, screen } from '@testing-library/react'
-import '@testing-library/jest-dom'
import Home from '../pages/index'
vi.mock('../public/icons/info.svg', () => ({ default: () => 'svg' }))
@@ -22,6 +21,12 @@ vi.mock('next/router', () => ({
}),
}))
+vi.mock('next-i18next', () => ({
+ useTranslation: vi.fn(() => ({
+ t: (str: string) => str,
+ })),
+}))
+
describe('Home Page', () => {
// Mock data for municipalities
const mockMunicipalities = [
@@ -65,6 +70,8 @@ describe('Home Page', () => {
TotalConsumptionEmission: 0,
ElectricVehiclePerChargePoints: 0,
Name: 'Sollentuna',
+ ProcurementScore: 0,
+ ProcurementLink: '',
},
]
@@ -73,24 +80,24 @@ describe('Home Page', () => {
})
it('renders without crashing', () => {
- expect(screen.getByText(/Hur går det med?/)).toBeInTheDocument()
+ expect(screen.getByText(/startPage:questionTitle/)).toBeInTheDocument()
})
it('changes view mode when toggle button is clicked', () => {
- const toggleButton = screen.getByText('Listvy')
+ const toggleButton = screen.getByText('startPage:toggleView.list')
fireEvent.click(toggleButton)
- expect(screen.getByText('Kartvy')).toBeInTheDocument()
+ expect(screen.getByText('startPage:toggleView.map')).toBeInTheDocument()
})
it('handles dataset change', () => {
- const newDataset = 'Klimatplanerna'
+ const newDataset = 'common:datasets.plans.name'
const radioButton = screen.getByLabelText(newDataset)
fireEvent.click(radioButton)
expect(screen.getByText(newDataset)).toBeInTheDocument()
})
it('renders the dropdown component', () => {
- const dropdownInput = screen.getByPlaceholderText(/hur går det i din kommun?/i)
+ const dropdownInput = screen.getByPlaceholderText(/startPage:yourMunicipality/i)
expect(dropdownInput).toBeInTheDocument()
})
})
diff --git a/__tests__/utils/generateMunipacitySitemap.test.ts b/__tests__/utils/generateMunipacitySitemap.test.ts
index 7a3352f8..8dd2f8f5 100644
--- a/__tests__/utils/generateMunipacitySitemap.test.ts
+++ b/__tests__/utils/generateMunipacitySitemap.test.ts
@@ -1,3 +1,4 @@
+import { TFunction } from 'next-i18next'
import {
generateMunipacitySitemapData,
generateSitemap,
@@ -5,6 +6,9 @@ import {
import { Municipality } from '../../utils/types'
const municipalities = [{ Name: 'Stockholm' }, { Name: 'Göteborg' }] as Municipality[]
+
+const t = vi.fn((str) => str) as unknown as TFunction
+
describe('generateSitemap', () => {
it('should generate valid municipality sitemap data', () => {
const siteMap = generateMunipacitySitemapData({ municipalities })
@@ -28,7 +32,7 @@ describe('generateSitemap', () => {
it('should generate a valid sitemap XML string', () => {
const siteMap = generateMunipacitySitemapData({ municipalities })
- const sitemapXml = generateSitemap(siteMap)
+ const sitemapXml = generateSitemap(siteMap, t)
expect(() => new DOMParser().parseFromString(sitemapXml, 'text/xml')).not.toThrow()
})
})
diff --git a/components/ComparisonTable.tsx b/components/ComparisonTable.tsx
index ccde2b11..4b347015 100644
--- a/components/ComparisonTable.tsx
+++ b/components/ComparisonTable.tsx
@@ -127,11 +127,13 @@ function ComparisonTable({ data, columns }: TableProps) {
return (
- {table.getHeaderGroups().map((headerGroup) => (
-
- {headerGroup.headers.map((header, index) => renderHeader(header, index))}
-
- ))}
+
+ {table.getHeaderGroups().map((headerGroup) => (
+
+ {headerGroup.headers.map((header, index) => renderHeader(header, index))}
+
+ ))}
+
{table.getRowModel().rows.map((row) => (
handleRowClick(row)}>
diff --git a/components/DropDown.tsx b/components/DropDown.tsx
index 5d09330b..25666b19 100644
--- a/components/DropDown.tsx
+++ b/components/DropDown.tsx
@@ -1,6 +1,8 @@
import { useState, useRef, useEffect } from 'react'
import styled from 'styled-components'
import { useRouter } from 'next/router'
+import { useTranslation } from 'next-i18next'
+
import ArrowDown from '../public/icons/arrow-down.svg'
import { devices } from '../utils/devices'
@@ -83,7 +85,6 @@ const ErrorText = styled.div`
type Props = {
municipalitiesName: Array
placeholder: string
- className: string
}
export function getSortedMunicipalities(municipalitiesName: Array) {
@@ -113,7 +114,7 @@ export function search(query: string, municipalitiesName: Array) {
})
}
-function DropDown({ municipalitiesName, placeholder, className }: Props) {
+function DropDown({ municipalitiesName, placeholder }: Props) {
const sortedMunicipalities = getSortedMunicipalities(municipalitiesName)
const [showDropDown, setShowDropDown] = useState(false)
const [selectedMunicipality, setSelectedMunicipality] = useState('')
@@ -122,6 +123,7 @@ function DropDown({ municipalitiesName, placeholder, className }: Props) {
const ref = useRef(null)
const router = useRouter()
+ const { t } = useTranslation()
useEffect(() => {
const checkIfClickedOutside = (e: MouseEvent) => {
@@ -192,13 +194,13 @@ function DropDown({ municipalitiesName, placeholder, className }: Props) {
value={selectedMunicipality}
/>
setShowDropDown((current) => !current)}>
-
+
{showDropDown && (
-
+
{municipalities.map((name) => (
- onMunicipalityClick(name)}>
+ onMunicipalityClick(name)} key={name}>
{name}
))}
diff --git a/components/FactSection.tsx b/components/FactSection.tsx
index 0647583d..00e3b271 100644
--- a/components/FactSection.tsx
+++ b/components/FactSection.tsx
@@ -4,6 +4,7 @@ import { useState } from 'react'
import { H3, ParagraphBold } from './Typography'
import Icon from '../public/icons/add_light_white.svg'
import IconGreen from '../public/icons/remove_light_white.svg'
+import Markdown from './Markdown'
const Row = styled.summary`
display: flex;
@@ -40,6 +41,10 @@ const InfoSection = styled.div`
text-decoration: underline;
cursor: pointer;
}
+
+ & p:first-of-type {
+ margin-top: 0;
+ }
`
const StyledIcon = styled.div`
@@ -53,7 +58,7 @@ const StyledIcon = styled.div`
type Props = {
heading: string
data: string
- info?: JSX.Element | string
+ info?: string
}
function FactSection({ heading, data, info }: Props) {
@@ -75,7 +80,7 @@ function FactSection({ heading, data, info }: Props) {
)}
- {info}
+ {info}
)
diff --git a/components/Footer/Footer.tsx b/components/Footer/Footer.tsx
index 1c3c4c36..00cee23c 100644
--- a/components/Footer/Footer.tsx
+++ b/components/Footer/Footer.tsx
@@ -1,4 +1,5 @@
import styled from 'styled-components'
+import { useTranslation } from 'next-i18next'
import { H5, Paragraph } from '../Typography'
import { devices } from '../../utils/devices'
import NewsletterSubscribe from './FooterNewsletterSubscribe'
@@ -82,14 +83,16 @@ const SocialLinksContainer = styled.div`
`
function Footer() {
+ const { t } = useTranslation(['common'])
+
return (
<>
- Med stöd från
+ {t('footer.supportedBy')}
- Partners
+ {t('footer.partners')}
@@ -97,28 +100,28 @@ function Footer() {
- Klimatkollen är en medborgarplattform som tillgängliggör klimatdata
+ {t('footer.tagline')}
- CC BY-SA -
- {' '}
+ {t('footer.creative-commons.abbreviation')}
+ {' - '}
- Attribution-ShareAlike 4.0 International license
+ {t('footer.creative-commons.license')}
- Klimatkollen är utvecklad med
+ {t('footer.developedWith')}
{' '}
- öppen källkod
+ {t('footer.open-source')}
diff --git a/components/Footer/FooterNewsletterForm.tsx b/components/Footer/FooterNewsletterForm.tsx
index 40164d67..898e6c81 100644
--- a/components/Footer/FooterNewsletterForm.tsx
+++ b/components/Footer/FooterNewsletterForm.tsx
@@ -1,5 +1,6 @@
import { useState, FC, useEffect } from 'react'
import styled from 'styled-components'
+import { useTranslation } from 'next-i18next'
import { EmailFormFields } from 'react-mailchimp-subscribe'
import { H5, Paragraph } from '../Typography'
import { devices } from '../../utils/devices'
@@ -102,6 +103,7 @@ const NewsletterForm: FC = ({ status, onValidated }) => {
const [error, setError] = useState('')
const [email, setEmail] = useState('')
const [showThanks, setThanks] = useState(false)
+ const { t } = useTranslation()
useEffect(() => {
if (status === 'success' || status === 'error') {
@@ -129,24 +131,23 @@ const NewsletterForm: FC = ({ status, onValidated }) => {
return (
- Vill du få nyheter om Klimatkollen?
+ {t('footer.signup-form.title')}
- Med vårt nyhetsbrev får du uppdateringar om hur det går med utsläppen och
- omställningen direkt i din mejl.
+ {t('footer.signup-form.info')}
{showThanks ? (
- Tack för ditt intresse!
+ {t('footer.signup-form.thanks')}
) : (
<>
setEmail(event.target.value)}
type="email"
- placeholder="Ange mailadress"
+ placeholder={t('footer.signup-form.placeholder')}
value={email}
required
disabled={showThanks}
diff --git a/components/Footer/FooterSocialLinks.tsx b/components/Footer/FooterSocialLinks.tsx
index cca96c33..693aa5fb 100644
--- a/components/Footer/FooterSocialLinks.tsx
+++ b/components/Footer/FooterSocialLinks.tsx
@@ -1,4 +1,5 @@
import styled from 'styled-components'
+import { useTranslation } from 'next-i18next'
import { devices } from '../../utils/devices'
const ContactList = styled.ul`
@@ -50,13 +51,14 @@ export function SocialListItem({
}
function SocialList() {
+ const { t } = useTranslation()
return (
getSetup([historical, approximated, trend, budget]),
[historical, approximated, trend, budget],
@@ -96,7 +98,7 @@ function Graph({
return (
- Tusen ton CO₂
+ {t('municipality:graphYAxisTitle')}
@@ -153,13 +155,13 @@ function Header() {
setMenuOpen(!menuOpen)}>
-
+
{menuOpen && (
setMenuOpen(false)}>
-
+
diff --git a/components/InfoModal.tsx b/components/InfoModal.tsx
index 6d4cf474..45af89f9 100644
--- a/components/InfoModal.tsx
+++ b/components/InfoModal.tsx
@@ -5,6 +5,7 @@ import {
useMemo,
} from 'react'
import styled from 'styled-components'
+import { useTranslation } from 'next-i18next'
import Close from '../public/icons/close.svg'
import { Paragraph } from './Typography'
@@ -15,11 +16,12 @@ const Modal = styled.div<{ scrollY: number }>`
background-color: rgba(0, 0, 0, 0.5);
width: 100vw;
height: 100vh;
- z-index: 0;
- top: ${({ scrollY }) => `calc(50% + ${scrollY}px)`};
- left: 50%;
- transform: translate(-50%, -50%);
- position: absolute;
+ z-index: 10;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ position: fixed;
& div:nth-of-type(1) {
position: fixed;
@@ -35,7 +37,7 @@ const Modal = styled.div<{ scrollY: number }>`
flex-direction: column;
background: ${({ theme }) => theme.black};
color: ${({ theme }) => theme.offWhite};
- z-index: 10;
+ z-index: 20;
border-radius: 16px;
box-shadow: 0 5px 20px 0 rgba(0, 0, 0, 0.04);
@@ -64,6 +66,7 @@ function InfoModal({ text, close, scrollY }: Props) {
const focusableElementsRef = useRef(undefined)
+ const { t } = useTranslation()
const handleTab = useCallback((evt: KeyboardEvent) => {
const total = focusableElementsRef.current?.length || 0
const focusedElementIndex = focusableElementsRef.current?.indexOf(evt.target as HTMLElement) || -1
@@ -111,10 +114,10 @@ function InfoModal({ text, close, scrollY }: Props) {
}, [activeElement, handleKeydown])
return (
-
+
-
+
{text}
diff --git a/components/Layout.tsx b/components/Layout.tsx
index 6502fd3a..71a6e5bd 100644
--- a/components/Layout.tsx
+++ b/components/Layout.tsx
@@ -9,7 +9,7 @@ const Main = styled.main`
flex-direction: column;
margin: 80px auto 32px auto;
- @media only screen and ${devices.tablet} {
+ @media only screen and (${devices.tablet}) {
margin: 96px auto 32px auto;
}
`
diff --git a/components/Map/MapLabels.tsx b/components/Map/MapLabels.tsx
index 71943fa2..9b25ac1c 100644
--- a/components/Map/MapLabels.tsx
+++ b/components/Map/MapLabels.tsx
@@ -86,9 +86,9 @@ function MapLabels({ labels, rotations }: MapLabelsProps) {
return (
- {labels.map((label, i) => (
+ {Array.isArray(labels) ? labels.map((label, i) => (
- ))}
+ )) : labels}
)
}
diff --git a/components/Markdown.tsx b/components/Markdown.tsx
new file mode 100644
index 00000000..30225d34
--- /dev/null
+++ b/components/Markdown.tsx
@@ -0,0 +1,43 @@
+import ReactMarkdown, { Components, Options } from 'react-markdown'
+import rehypeExternalLinks from 'rehype-external-links'
+import styled from 'styled-components'
+import Link from 'next/link'
+
+import {
+ H1, H2, H3, Paragraph, ParagraphBold, ParagraphItalic,
+} from './Typography'
+import { ListItem, OrderedList, UnorderedList } from './shared'
+
+const optionsForRehypeExternalLinks = { rel: ['noreferrer'], target: '_blank' }
+
+const defaultComponents: Partial = {
+ p: styled(Paragraph)`
+ &:last-child {
+ margin-bottom: 0;
+ }
+ `,
+ // Workaround to inherit styles and just change the HTML element
+ strong: styled(ParagraphBold).attrs({ as: 'strong' })``,
+ em: styled(ParagraphItalic).attrs({ as: 'em' })``,
+ a: Link as Components['a'],
+ h1: H1,
+ h2: H2,
+ h3: H3,
+ ol: OrderedList,
+ ul: UnorderedList,
+ li: ListItem,
+}
+
+function Markdown({ children, className, components }: Readonly) {
+ return (
+
+ {children}
+
+ )
+}
+
+export default Markdown
diff --git a/components/Municipality/Municipality.tsx b/components/Municipality/Municipality.tsx
index 62886aa6..7439819c 100644
--- a/components/Municipality/Municipality.tsx
+++ b/components/Municipality/Municipality.tsx
@@ -1,6 +1,5 @@
-/* eslint-disable react-hooks/exhaustive-deps */
-/* eslint-disable @typescript-eslint/ban-ts-comment */
import styled from 'styled-components'
+import { useTranslation } from 'next-i18next'
import { H1NoPad, ParagraphBold } from '../Typography'
import BackArrow from '../BackArrow'
@@ -16,7 +15,6 @@ import Scorecard from './MunicipalityScorecard'
const StyledContainer = styled.div`
display: flex;
flex-direction: column;
- align-items center;
gap: 1.5rem;
margin-bottom: 48px;
`
@@ -72,6 +70,8 @@ function Municipality(props: Props) {
municipalitiesName,
} = props
+ const { t } = useTranslation()
+
return (
<>
@@ -82,7 +82,7 @@ function Municipality(props: Props) {
{coatOfArmsImage && (
)}
@@ -109,11 +109,10 @@ function Municipality(props: Props) {
/>
- Hur ser det ut i andra kommuner?
+ {t('municipality:otherMunicipalities')}
diff --git a/components/Municipality/MunicipalityEmissionGraph.tsx b/components/Municipality/MunicipalityEmissionGraph.tsx
index b2d9e9c0..bb3db69d 100644
--- a/components/Municipality/MunicipalityEmissionGraph.tsx
+++ b/components/Municipality/MunicipalityEmissionGraph.tsx
@@ -1,11 +1,10 @@
-/* eslint-disable implicit-arrow-linebreak */
/* eslint-disable no-console */
-/* eslint-disable @typescript-eslint/no-unused-vars */
-/* eslint-disable no-restricted-globals */
/* eslint-disable max-len */
import styled from 'styled-components'
import { useMemo, useState } from 'react'
import { useRouter } from 'next/router'
+import { useTranslation } from 'next-i18next'
+
import Graph from '../Graph'
import { H2, Paragraph } from '../Typography'
import InfoModal from '../InfoModal'
@@ -60,24 +59,26 @@ type IssuesProps = {
onPreviousStep: (() => void) | undefined
}
+function range(start: number, end: number) {
+ return Array.from({ length: end - start }, (_, i) => i + start)
+}
+
+const adjustablePeriods = range(2020, 2051).map((i) => [i, i + 1])
+
function MunicipalityEmissionGraph({
municipality,
chart: step,
onNextStep,
onPreviousStep,
}: IssuesProps) {
+ const { t } = useTranslation()
const [isOpen, setIsOpen] = useState(false)
const router = useRouter()
const q = router.query['g[]']
- const range = (start: number, end: number) =>
- Array.from({ length: end - start }, (_, i) => i + start)
-
- const adjustablePeriods = range(2020, 2051).map((i) => [i, i + 1])
-
const defaultPeriods = useMemo(
() => adjustablePeriods.map((f) => ({ start: f[0], end: f[1], change: 1 })),
- [adjustablePeriods],
+ [],
)
// Load mandate change values from ?g[] parameter in URL
@@ -104,36 +105,40 @@ function MunicipalityEmissionGraph({
}))
})
- type ShareTextFn = (name: string) => string
+ const lastYearWithData = municipality.HistoricalEmission.EmissionPerYear[municipality.HistoricalEmission.EmissionPerYear.length - 1]?.Year
+ const lastYearWithApproximatedData = municipality.ApproximatedHistoricalEmission.EmissionPerYear[municipality.ApproximatedHistoricalEmission.EmissionPerYear.length - 1]?.Year
+ const firstYearWithBudget = municipality.Budget.BudgetPerYear[0]?.Year
+
+ const hasApproximatedData = lastYearWithApproximatedData != null
const CHARTS: {
[index: number]: {
text: string
buttonText: string
body: string
- shareText: ShareTextFn
+ info: string
}
} = {
0: {
- text: 'Historiska utsläpp',
- buttonText: 'Historiskt',
- body: 'Koldioxidutsläpp i kommunen sedan 1990. 2022–2024 är baserat på prognos.',
- shareText: (_name) =>
- 'Se historiska utsläpp tills idag, vilken minskning som krävs för att klara Parisavtalet och utsläppen framåt med nuvarande trend.',
+ text: t('municipality:graphs.historical.text'),
+ buttonText: t('municipality:graphs.historical.buttonText'),
+ body: t('municipality:graphs.historical.body'),
+ info: hasApproximatedData
+ ? t('municipality:graphs.historical.infoApproximated', { lastYearWithData, lastYearWithApproximatedData })
+ : t('municipality:graphs.historical.info', { lastYearWithData }),
},
1: {
- text: 'Om vi fortsätter som idag',
- buttonText: 'Trend',
- body: 'Utsläppen de kommande åren baserat på nuvarande trend.',
- shareText: (_name) =>
- 'Se historiska utsläpp tills idag, vilken minskning som krävs för att klara Parisavtalet och utsläppen framåt med nuvarande trend.',
+ text: t('municipality:graphs.trend.text'),
+ buttonText: t('municipality:graphs.trend.buttonText'),
+ body: t('municipality:graphs.trend.body'),
+ info: `${t('municipality:graphs.trend.info')}${
+ hasApproximatedData ? '' : ` ${t('municipality:graphs.trend.infoDifference')}`}`,
},
2: {
- text: 'För att nå Parisavtalet',
- buttonText: 'Parisavtalet',
- body: 'Så mycket skulle utsläppen behöva minska för att vara i linje med 1,5-gradersmålet.',
- shareText: (_name) =>
- 'Se historiska utsläpp tills idag, vilken minskning som krävs för att klara Parisavtalet och utsläppen framåt med nuvarande trend.',
+ text: t('municipality:graphs.paris.text'),
+ buttonText: t('municipality:graphs.paris.buttonText'),
+ body: t('municipality:graphs.paris.body'),
+ info: t('municipality:graphs.paris.info', { firstYearWithBudget }),
},
}
@@ -142,7 +147,7 @@ function MunicipalityEmissionGraph({
throw new Error('Render a sort of 500 page I guess')
}
- const { text, shareText, body } = stepConfig
+ const { text, body } = stepConfig
const baseUrl = process.env.NEXT_PUBLIC_BASE_URL
let shareUrl = `${baseUrl}${router.asPath}`
if (step === 3) {
@@ -151,35 +156,27 @@ function MunicipalityEmissionGraph({
}
const toggleModal = () => {
- // eslint-disable-next-line no-shadow
- const { body } = document
if (!isOpen) {
- body.style.overflow = 'hidden'
+ document.body.style.overflow = 'hidden'
setIsOpen(true)
} else {
- body.style.overflow = ''
+ document.body.style.overflow = ''
setIsOpen(false)
}
}
- const lastYearWithData = municipality.HistoricalEmission.EmissionPerYear[municipality.HistoricalEmission.EmissionPerYear.length - 1]?.Year
- const lastYearWithApproximatedData = municipality.ApproximatedHistoricalEmission.EmissionPerYear[municipality.ApproximatedHistoricalEmission.EmissionPerYear.length - 1]?.Year
- const firstYearWithBudget = municipality.Budget.BudgetPerYear[0]?.Year
-
- const hasApproximatedData = lastYearWithApproximatedData != null
-
return (
<>
{text}
{body}
-
+
@@ -209,33 +206,12 @@ function MunicipalityEmissionGraph({
)}
- {step === 0 && isOpen && (
-
- )}
- {step === 1 && isOpen && (
-
- )}
- {step === 2 && isOpen && (
+
+ {isOpen && (
)}
>
diff --git a/components/Municipality/MunicipalityEmissionNumbers.tsx b/components/Municipality/MunicipalityEmissionNumbers.tsx
index 924c23ec..0062e6e8 100644
--- a/components/Municipality/MunicipalityEmissionNumbers.tsx
+++ b/components/Municipality/MunicipalityEmissionNumbers.tsx
@@ -1,5 +1,6 @@
-/* eslint-disable react/jsx-one-expression-per-line */
import styled from 'styled-components'
+import { useTranslation } from 'next-i18next'
+
import { H4 } from '../Typography'
import { Municipality as TMunicipality } from '../../utils/types'
import { colorTheme } from '../../Theme'
@@ -44,6 +45,7 @@ type EmissionsProps = {
}
function MunicipalityEmissionNumbers({ municipality, step }: EmissionsProps) {
+ const { t } = useTranslation()
let totalHistorical = municipality.HistoricalEmission.EmissionPerYear.reduce(
(total, year) => total + year.CO2Equivalent,
0,
@@ -65,24 +67,24 @@ function MunicipalityEmissionNumbers({ municipality, step }: EmissionsProps) {
return (
- Utsläppen i siffror (tusen ton CO₂)
+ {t('municipality:emissionNumbers.title')}
- Historiskt 1990-{historicalEndsYear}: {totalHistorical.toFixed(1)}
+ {t('municipality:emissionNumbers.historical', { historicalEndsYear, totalHistorical: totalHistorical.toFixed(1) })}
0 ? colorTheme.red : colorTheme.darkRed} />
0 ? colorTheme.offWhite : colorTheme.grey}>
- Trend {trendStartsYear}-2050: {totalTrend.toFixed(1)}
+ {t('municipality:emissionNumbers.trend', { trendStartsYear, totalTrend: totalTrend.toFixed(1) })}
1 ? colorTheme.lightGreen : colorTheme.midGreen} />
1 ? colorTheme.offWhite : colorTheme.grey}>
- Koldioxidbudget {budgetStartsYear}-2050: {totalBudget.toFixed(1)}
+ {t('municipality:emissionNumbers.co2budget', { budgetStartsYear, totalBudget: totalBudget.toFixed(1) })}
diff --git a/components/Municipality/MunicipalityScorecard.tsx b/components/Municipality/MunicipalityScorecard.tsx
index e43e3831..6c0d4420 100644
--- a/components/Municipality/MunicipalityScorecard.tsx
+++ b/components/Municipality/MunicipalityScorecard.tsx
@@ -1,12 +1,14 @@
import styled, { css } from 'styled-components'
-import Link from 'next/link'
+import { useTranslation } from 'next-i18next'
+
import ScorecardSection from './ScorecardSection'
import { ClimatePlan } from '../../utils/types'
-import { H4, H5, ParagraphItalic } from '../Typography'
+import { H4, H5 } from '../Typography'
import Icon from '../../public/icons/boxedArrow.svg'
import PlanIcon from '../../public/icons/climatePlan.svg'
import FactSection from '../FactSection'
import { climatePlanMissing } from '../../utils/datasetDefinitions'
+import Markdown from '../Markdown'
const StyledDiv = styled.div`
display: flex;
@@ -100,12 +102,12 @@ const Square = styled.div`
border-radius: 4px;
`
-const CommentContainer = styled.div`
- margin-top: 8px;
-`
+const CementClarification = styled.div`
+ margin: 0;
-const Comment = styled.span`
- font-weight: bold;
+ & * {
+ margin: 0
+ }
`
type Props = {
@@ -129,11 +131,11 @@ function Scorecard({
politicalRule,
climatePlan,
}: Props) {
+ const { t } = useTranslation()
const climatePlanYearFormatted = climatePlan.YearAdapted !== climatePlanMissing
- ? `Antagen ${climatePlan.YearAdapted}`
+ ? t('municipality:facts.climatePlan.adaptedYear', { year: climatePlan.YearAdapted })
: climatePlan.YearAdapted
- const rankFormatted = `${rank} av 290`
- const politicalRuleFormatted = politicalRule ? politicalRule.join(', ') : 'Data saknas'
+ const politicalRuleFormatted = politicalRule ? politicalRule.join(', ') : t('common:dataMissing')
const handleButtonClick = () => {
if (climatePlan.Link !== climatePlanMissing) {
@@ -144,22 +146,20 @@ function Scorecard({
return (
- Fakta om
- {' '}
- {name}
+ {t('municipality:facts.title', { name })}
- Klimatplan
+ {t('municipality:facts.climatePlan.title')}
- Öppna
+ {t('common:actions.open')}
@@ -169,111 +169,51 @@ function Scorecard({
- Avser nu gällande klimathandlingsplan eller motsvarande. Inte
- klimatanpassningsplaner, utsläppsbudgetar, klimatlöften, miljöpolicies eller
- liknande. Klicka
- {' '}
-
- här
-
- {' '}
- för att redigera informationen.
-
- Kommentar:
- {' '}
- {climatePlan.Comment}
-
- >
- )}
+ info={t('municipality:facts.climatePlan.info', { comment: climatePlan.Comment })}
/>
{rank && (
- Rankning av Sveriges 290 kommuner baserat på genomsnittlig årlig procentuell
- förändring av koldioxidutsläppen sedan Parisavtalet 2015.
- >
- )}
+ heading={t('municipality:facts.rank.title')}
+ data={t('municipality:facts.rank.rank', { rank })}
+ info={t('municipality:facts.rank.info')}
/>
)}
{['Gotland', 'Skövde', 'Mörbylånga'].includes(name) && (
-
- Utsläpp från cementproduktion exkluderad, i enlighet med IPCC:s koldioxidbudget,
- läs mer
- {' '}
- här
-
+
+
+ {t('municipality:facts.cementExcluded')}
+
+
)}
{budget && (
- Mängden koldioxid kvar att släppa ut för att klara Parisavtalets
- 1,5-gradersmål, läs mer om koldioxidbudgetar
- {' '}
-
- här
-
- .
- >
- )}
+ heading={t('municipality:facts.co2budget.title')}
+ data={t('municipality:tonnes', { amount: formatter.format(Math.round(budget)) })}
+ info={t('municipality:facts.co2budget.info')}
/>
)}
{budgetRunsOut && (
- Datum då kommunens koldioxidbudget tar slut om utsläppen fortsätter enligt
- nuvarande trend.
- >
- )}
+ info={t('municipality:facts.budgetRunsOut.info')}
/>
)}
- Årlig procentuell utsläppsminskning som krävs för att kommunen inte ska
- överskrida sin koldioxidbudget.
- >
- )}
+ heading={t('municipality:facts.emissionReduction.title')}
+ data={t('municipality:facts.emissionReduction.percent', { percent: neededEmissionChangePercent.toFixed(1) })}
+ info={t('municipality:facts.emissionReduction.info')}
/>
{politicalRule && (
- Uppgift om politiskt styre är hämtad från
- {' '}
-
- Sveriges Kommuner och Regioner (SKR)
-
- . Data uppdaterad mars 2023.
- >
- )}
+ info={t('municipality:facts.politicalRule.info')}
/>
)}
diff --git a/components/Municipality/MunicipalitySolutions.tsx b/components/Municipality/MunicipalitySolutions.tsx
index 3fb3416e..f7a37dea 100644
--- a/components/Municipality/MunicipalitySolutions.tsx
+++ b/components/Municipality/MunicipalitySolutions.tsx
@@ -1,4 +1,6 @@
import styled from 'styled-components'
+import { useTranslation } from 'next-i18next'
+
import { H2, H5, Paragraph } from '../Typography'
import FactSection from '../FactSection'
import { Municipality } from '../../utils/types'
@@ -29,7 +31,7 @@ type SolutionSectionProps = {
title: string
heading: string
data: string
- info: string | JSX.Element
+ info: string
}
function SolutionSection({
@@ -51,60 +53,50 @@ type SolutionsProps = {
}
function MunicipalitySolutions({ municipality }: SolutionsProps) {
+ const { t } = useTranslation()
return (
<>
- Omställning
+ {t('municipality:solutions.title')}
- Här visas nyckeltal för hur det går med klimatomställningen i kommunerna.
+ {t('municipality:solutions.description')}
}
- title="Hushållens konsumtionsutsläpp"
- heading="CO₂e per person och år"
- data={`${municipality.TotalConsumptionEmission.toFixed(1)} ton`}
- info={'Hushållens konsumtionsutsläpp (CO₂e) i ton per invånare år 2019. '
- + 'År 2050 ska utsläppen vara högst 1 ton per person och år för att ligga i linje med Parisavtalet.'}
+ title={t('municipality:solutions.household.title')}
+ heading={t('municipality:solutions.household.heading')}
+ data={t('municipality:tonnes', { amount: municipality.TotalConsumptionEmission.toFixed(1) })}
+ info={t('municipality:solutions.household.info')}
/>
}
- title="Klimatkrav i upphandlingar"
- heading="Ställer kommunen klimatkrav i sina upphandlingar?"
- data={requirementsInProcurement(municipality.ProcurementScore)}
- info={(
- <>
- Kommuner som ställer klimatkrav vid offentliga upphandlingar.
- “Ja” innebär principbeslut och underlag som tillstyrker.
- “Kanske” innebär ja-svar i enkätundersökning eller via mejl, men utan underlag som tillstyrker.
- {' '}
-
- Mejla oss
-
- {' '}
- för att redigera informationen.
- >
- )}
+ title={t('municipality:solutions.procurement.title')}
+ heading={t('municipality:solutions.procurement.heading')}
+ data={requirementsInProcurement(municipality.ProcurementScore, t)}
+ info={t('municipality:solutions.procurement.info')}
/>
}
- title="Elbilarna"
- heading="Förändringstakt andel laddbara bilar"
- data={`${(municipality.ElectricCarChangePercent * 100).toFixed(1)} procentenheter`}
- info="Ökningstakten för andelen nyregistrerade laddbara bilar sedan Parisavtalet
- 2015 i procentenheter per år. Högre är bättre."
+ title={t('municipality:solutions.electricCars.title')}
+ heading={t('municipality:solutions.electricCars.heading')}
+ data={t('municipality:percentagePoints', { num: (municipality.ElectricCarChangePercent * 100).toFixed(1) })}
+ info={t('municipality:solutions.electricCars.info')}
+
/>
}
- title="Laddarna"
- heading="Antal elbilar per laddare"
- data={`${municipality.ElectricVehiclePerChargePoints < 1e10 ? municipality.ElectricVehiclePerChargePoints.toFixed(1) : 'Laddare saknas'}`}
- info="Antal registrerade laddbara bilar per offentliga laddpunkter år 2023. EU rekommenderar max 10 bilar per laddare."
+ title={t('municipality:solutions.chargers.title')}
+ heading={t('municipality:solutions.chargers.heading')}
+ data={`${municipality.ElectricVehiclePerChargePoints < 1e10
+ ? municipality.ElectricVehiclePerChargePoints.toFixed(1)
+ : t('common:datasets.missingChargers')}`}
+ info={t('municipality:solutions.chargers.info')}
/>
}
- title="Cyklarna"
- heading="Antal meter cykelväg per invånare"
- data={`${municipality.BicycleMetrePerCapita.toFixed(1)} meter`}
- info="Antal meter cykelväg per invånare år 2022 totalt för alla väghållare (statlig, kommunal, enskild). Högre är generellt bättre."
+ title={t('municipality:solutions.bikes.title')}
+ heading={t('municipality:solutions.bikes.heading')}
+ data={t('municipality:solutions.bikes.meters', { meters: municipality.BicycleMetrePerCapita.toFixed(1) })}
+ info={t('municipality:solutions.bikes.info')}
/>
>
)
diff --git a/components/Municipality/ScorecardSection.tsx b/components/Municipality/ScorecardSection.tsx
index 87f52f99..b3a2d227 100644
--- a/components/Municipality/ScorecardSection.tsx
+++ b/components/Municipality/ScorecardSection.tsx
@@ -1,21 +1,24 @@
import styled from 'styled-components'
import { useState } from 'react'
+import Markdown from '../Markdown'
import Icon from '../../public/icons/add_light_green.svg'
import IconGreen from '../../public/icons/remove_light_green.svg'
import { Paragraph } from '../Typography'
import { devices } from '../../utils/devices'
-const BorderContainer = styled.div`
+const BorderContainer = styled.details`
padding: 8px 0;
border-bottom: 1px solid ${({ theme }) => theme.midGreen};
`
-const Row = styled.div`
+const Row = styled.summary`
display: flex;
flex-direction: row;
justify-content: space-between;
align-items: center;
+ gap: 4px;
+ cursor: pointer;
`
const InfoParagraph = styled(Paragraph)`
@@ -51,32 +54,32 @@ const StyledIcon = styled.div`
type Props = {
heading: string
data: string
- info?: string | JSX.Element | string
+ info?: string
}
function ScorecardSection({ heading, data, info }: Props) {
const [toggle, setToggle] = useState(false)
+ const onToggle = () => setToggle(!toggle)
+
return (
-
+
{heading}
{data}
{info && (
- setToggle(!toggle)}>
+
{toggle ? : }
)}
-
- {toggle ? (
-
- {info}
-
- ) : null}
-
+ {toggle ? (
+
+ {info}
+
+ ) : null}
)
}
diff --git a/components/Navigation.tsx b/components/Navigation.tsx
deleted file mode 100644
index 35e07f6e..00000000
--- a/components/Navigation.tsx
+++ /dev/null
@@ -1,69 +0,0 @@
-import Link from 'next/link'
-import styled from 'styled-components'
-import ArrowRightWhite from '../public/icons/arrow-right-white.svg'
-
-const Nav = styled.nav`
- margin-top: 28px;
- margin-bottom: 42px;
-`
-
-const NavList = styled.ul`
- list-style-type: none;
- display: flex;
- align-items: left;
- flex-wrap: wrap;
- border-top: 1px solid white;
- border-bottom: 1px solid white;
- flex-direction: column;
- justify-content: center;
-`
-
-const NavItem = styled.li`
- padding-top: 16px;
- padding-bottom: 16px;
- display: flex;
- align-items: center;
- justify-content: space-between;
- &:not(:first-child) {
- border-top: 1px solid white;
- }
-`
-
-const StyledLinkWrapper = styled.div`
- display: flex;
- align-items: center;
- justify-content: space-between;
- width: 100%;
- cursor: pointer;
-`
-
-const StyledLink = styled.a`
- text-decoration: none;
- font-weight: bold;
-`
-
-const menuItems = [
- { path: '/kallor-och-metod', label: 'Källor och metod' },
- { path: '/om-oss', label: 'Om oss' },
-]
-
-function Navigation() {
- return (
-
- )
-}
-
-export default Navigation
diff --git a/components/RadioButtonMenu.tsx b/components/RadioButtonMenu.tsx
index c91b1c1d..6be51977 100644
--- a/components/RadioButtonMenu.tsx
+++ b/components/RadioButtonMenu.tsx
@@ -1,7 +1,6 @@
import { Fragment } from 'react'
import styled from 'styled-components'
-import { dataDescriptions } from '../utils/datasetDefinitions'
-import { SelectedData } from '../utils/types'
+import { DataDescriptions, DatasetKey } from '../utils/types'
import { devices } from '../utils/devices'
const RadioContainer = styled.div`
@@ -47,26 +46,26 @@ const RadioInput = styled.input`
}
`
-const datasetKeys = Object.keys(dataDescriptions)
-
type MenuProps = {
- selectedData: SelectedData
- handleDataChange: (newData: SelectedData) => void
+ selectedData: DatasetKey
+ handleDataChange: (newData: DatasetKey) => void
+ dataDescriptions: DataDescriptions
}
-function RadioButtonMenu({ selectedData, handleDataChange }: MenuProps) {
+function RadioButtonMenu({ selectedData, handleDataChange, dataDescriptions }: MenuProps) {
+ const datasetKeys = Object.keys(dataDescriptions) as DatasetKey[]
return (
- {datasetKeys.map((option) => (
-
+ {datasetKeys.map((key) => (
+
handleDataChange(option)}
+ id={key}
+ value={key}
+ checked={selectedData === key}
+ onChange={() => handleDataChange(key)}
/>
- {option}
+ {dataDescriptions[key].name}
))}
diff --git a/components/Range.tsx b/components/Range.tsx
deleted file mode 100644
index da3a0da7..00000000
--- a/components/Range.tsx
+++ /dev/null
@@ -1,34 +0,0 @@
-/* eslint-disable react/prop-types */
-/* eslint-disable @typescript-eslint/ban-ts-comment */
-// @ts-nocheck
-import { useState } from 'react'
-import styled from 'styled-components'
-
-const Input = styled.input`
- transform-origin: 75px 75px;
- transform: rotate(-90deg);
-`
-
-export default function Range({ data, index, setData }) {
- const [value, setValue] = useState(0)
-
- const onInputChange = (event) => {
- const newValue = parseFloat(event.target.value)
- setValue(newValue)
- // update following data points as well
- const newData = [...data]
- newData[index] = { ...newData[index], change: newValue }
- setData(newData)
- }
-
- return (
-
- )
-}
diff --git a/components/ToggleSection.tsx b/components/ToggleSection.tsx
index b9237a09..f8113ab8 100644
--- a/components/ToggleSection.tsx
+++ b/components/ToggleSection.tsx
@@ -4,6 +4,7 @@ import styled from 'styled-components'
import { H5 } from './Typography'
import ArrowSvg from '../public/icons/arrow-down-round.svg'
import { colorTheme } from '../Theme'
+import Markdown from './Markdown'
const TextSection = styled.details`
display: flex;
@@ -49,7 +50,7 @@ const InfoSection = styled.div`
type Props = {
header: string
- text: JSX.Element
+ text: JSX.Element | string
}
function ToggleSection({ header, text }: Props) {
@@ -62,7 +63,7 @@ function ToggleSection({ header, text }: Props) {
- {text}
+ {typeof text === 'string' ? {text} : text}
)
diff --git a/components/shared.tsx b/components/shared.tsx
index 7e90344d..e629e0f5 100644
--- a/components/shared.tsx
+++ b/components/shared.tsx
@@ -50,15 +50,6 @@ export const ListItem = styled.li`
margin: 8px;
`
-export const LoadingContainer = styled.div`
- position: absolute;
- top: 50%;
- left: 50%;
- transform: translate(-50%, -50%);
- color: grey;
- font-size: 10px;
-`
-
export const Grid = styled.div`
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
@@ -78,7 +69,8 @@ export const GridItem = styled.div`
& > b {
clear: both;
- margin-bottom: 8px;
+ margin: 8px 0;
+ font-weight: 700;
}
`
diff --git a/next-i18next.config.js b/next-i18next.config.js
new file mode 100644
index 00000000..bdbadd44
--- /dev/null
+++ b/next-i18next.config.js
@@ -0,0 +1,14 @@
+const path = require('path')
+
+const DEV = process.env.NODE_ENV === 'development'
+
+/** @type {import('next-i18next').UserConfig} */
+module.exports = {
+ i18n: {
+ defaultLocale: 'sv',
+ locales: ['sv'],
+ },
+ localePath: path.resolve('./public/locales'),
+ // Allow reloading translations without restarting the dev server.
+ reloadOnPrerender: DEV,
+}
diff --git a/next.config.js b/next.config.js
index bc68eda6..cea97c26 100644
--- a/next.config.js
+++ b/next.config.js
@@ -1,4 +1,4 @@
-/** @type {require('next').NextConfig} */
+const { i18n } = require('./next-i18next.config')
// eslint-disable-next-line @typescript-eslint/no-var-requires
const withBundleAnalyzer = require('@next/bundle-analyzer')({
@@ -17,12 +17,7 @@ module.exports = withBundleAnalyzer({
},
reactStrictMode: true,
-
- // i18n configuration
- i18n: {
- locales: ['sv'],
- defaultLocale: 'sv',
- },
+ i18n,
// Redirects configuration
async redirects() {
diff --git a/package-lock.json b/package-lock.json
index 8b9783e3..eb58e567 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -7,6 +7,7 @@
"name": "klimatkollen",
"dependencies": {
"@danmarshall/deckgl-typings": "^4.9.13",
+ "@emotion/is-prop-valid": "^1.2.2",
"@tanstack/react-table": "^8.11.8",
"@types/styled-components": "^5.1.34",
"@types/wikidata-sdk": "^6.1.0",
@@ -15,14 +16,20 @@
"babel-plugin-styled-components": "^2.1.4",
"chart.js": "^4.4.1",
"deck.gl": "^9.0.6",
+ "i18next": "^23.10.1",
+ "i18next-fs-backend": "^2.3.1",
"jsdom": "^24.0.0",
"md5": "^2.3.0",
"next": "14.1.0",
+ "next-i18next": "^15.2.0",
"nextjs-progressbar": "^0.0.16",
"react": "18.2.0",
"react-chartjs-2": "^5.2.0",
"react-cookie-consent": "^9.0.0",
+ "react-i18next": "^14.1.0",
"react-mailchimp-subscribe": "^2.1.3",
+ "react-markdown": "^9.0.1",
+ "rehype-external-links": "^3.0.0",
"styled-components": "^6.1.8",
"vite": "^5.0.12"
},
@@ -1891,12 +1898,11 @@
"dev": true
},
"node_modules/@babel/runtime": {
- "version": "7.15.4",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.4.tgz",
- "integrity": "sha512-99catp6bHCaxr4sJ/DbTGgHS4+Rs2RVd2g7iOap6SLGPDknRK9ztKNsE/Fg6QhSeh1FGE5f6gHGQmvvn3I3xhw==",
- "dev": true,
+ "version": "7.24.1",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz",
+ "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==",
"dependencies": {
- "regenerator-runtime": "^0.13.4"
+ "regenerator-runtime": "^0.14.0"
},
"engines": {
"node": ">=6.9.0"
@@ -1981,9 +1987,9 @@
}
},
"node_modules/@deck.gl/aggregation-layers": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.6.tgz",
- "integrity": "sha512-MYOg005XLMHA2pYCvI+6KSAxyFiCS/M5FRkOITDkzhZsRsBY2nsb38lXgX+fDupn8JiYFz6nj37GVpudapxa2g==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/aggregation-layers/-/aggregation-layers-9.0.8.tgz",
+ "integrity": "sha512-vZXswsClk7Ty5M0EBk5FIccEbt0uEheq2NxVZJxKo+8dlFP/lt/BYrRJsnmxIhaiuSVIfmzi0O9lJyeec44POg==",
"dependencies": {
"@luma.gl/constants": "^9.0.9",
"@luma.gl/shadertools": "^9.0.9",
@@ -1998,15 +2004,15 @@
}
},
"node_modules/@deck.gl/carto": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.6.tgz",
- "integrity": "sha512-+sKoz75AwS58LJ64QRov4ZDHQMqJ/8aIYQ9cfb4Yo+lkje8ihUK0xeVEBLnYZPsbGYBRV//qXTuyPp6rxjWjbA==",
- "dependencies": {
- "@loaders.gl/gis": "^4.1.4",
- "@loaders.gl/loader-utils": "^4.1.4",
- "@loaders.gl/mvt": "^4.1.4",
- "@loaders.gl/schema": "^4.1.4",
- "@loaders.gl/tiles": "^4.1.4",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/carto/-/carto-9.0.8.tgz",
+ "integrity": "sha512-/NU9IxtY3CCMkTL/LjBLGMnNpZT7NNYWa7VGWalKGJAB8/+6/dWanee2UmFv5TyxVeevlXvwQI1yDrygTwYFng==",
+ "dependencies": {
+ "@loaders.gl/gis": "^4.2.0",
+ "@loaders.gl/loader-utils": "^4.2.0",
+ "@loaders.gl/mvt": "^4.2.0",
+ "@loaders.gl/schema": "^4.2.0",
+ "@loaders.gl/tiles": "^4.2.0",
"@luma.gl/constants": "^9.0.9",
"@math.gl/web-mercator": "^4.0.0",
"@types/d3-array": "^3.0.2",
@@ -2029,17 +2035,17 @@
"@deck.gl/extensions": "^9.0.0",
"@deck.gl/geo-layers": "^9.0.0",
"@deck.gl/layers": "^9.0.0",
- "@loaders.gl/core": "^4.1.0",
+ "@loaders.gl/core": "^4.2.0",
"@luma.gl/core": "^9.0.0"
}
},
"node_modules/@deck.gl/core": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.6.tgz",
- "integrity": "sha512-fVuAG7LfEjhSLbxzovGzQ6q6ARmLKooEJtMORWOOQE3TvI3Yt9PnRNlldLzdD5xXFcG5QSdiNH7C1Y7xnoh2EA==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/core/-/core-9.0.8.tgz",
+ "integrity": "sha512-lZyU+Pdy3aSqikvfoGIpfNpZKP7+qdSxV4z1pOQOI9jRVjNpbLW4VzMqnFYVM43XsHDuqr57MKHnZRYS7Z9fzQ==",
"dependencies": {
- "@loaders.gl/core": "^4.1.4",
- "@loaders.gl/images": "^4.1.4",
+ "@loaders.gl/core": "^4.2.0",
+ "@loaders.gl/images": "^4.2.0",
"@luma.gl/constants": "^9.0.9",
"@luma.gl/core": "^9.0.9",
"@luma.gl/engine": "^9.0.9",
@@ -2057,9 +2063,9 @@
}
},
"node_modules/@deck.gl/extensions": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.6.tgz",
- "integrity": "sha512-3V+TdjahbU7+dltsDTnFpn6v3NjG4In77F4Jwio9fXCFfXwpwij98tmCq6TAGS9Xgp0Aj04BFnriAnO/Cddv4w==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/extensions/-/extensions-9.0.8.tgz",
+ "integrity": "sha512-NLzrHsjZrs+zvRetVDOEPAM01sS5h/+cBb9RV7UhoUuWsfziPJ3JpK5yRPGFCo4TZqdZ/BdORMpVYp48GciLxg==",
"dependencies": {
"@luma.gl/constants": "^9.0.9",
"@luma.gl/shadertools": "^9.0.9",
@@ -2072,18 +2078,18 @@
}
},
"node_modules/@deck.gl/geo-layers": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.6.tgz",
- "integrity": "sha512-O6s7w77M9sSJ8/+M0e/kLUr9u1TVNDJMqHGECrY99fVbVfTZSQbSoMVA7DMmfw+/aaa4g4emcJoRkHMf96BMHg==",
- "dependencies": {
- "@loaders.gl/3d-tiles": "^4.1.4",
- "@loaders.gl/gis": "^4.1.4",
- "@loaders.gl/loader-utils": "^4.1.4",
- "@loaders.gl/mvt": "^4.1.4",
- "@loaders.gl/schema": "^4.1.4",
- "@loaders.gl/terrain": "^4.1.4",
- "@loaders.gl/tiles": "^4.1.4",
- "@loaders.gl/wms": "^4.1.4",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/geo-layers/-/geo-layers-9.0.8.tgz",
+ "integrity": "sha512-Df1cNKepmxruAJC3z+U/QCwkcsVqLFE5HWvcW/eM8cUb0OXa8MMUStYcErIluc2+82RX9QSiDyNtIEZdtn1J+g==",
+ "dependencies": {
+ "@loaders.gl/3d-tiles": "^4.2.0",
+ "@loaders.gl/gis": "^4.2.0",
+ "@loaders.gl/loader-utils": "^4.2.0",
+ "@loaders.gl/mvt": "^4.2.0",
+ "@loaders.gl/schema": "^4.2.0",
+ "@loaders.gl/terrain": "^4.2.0",
+ "@loaders.gl/tiles": "^4.2.0",
+ "@loaders.gl/wms": "^4.2.0",
"@luma.gl/gltf": "^9.0.9",
"@luma.gl/shadertools": "^9.0.9",
"@math.gl/core": "^4.0.0",
@@ -2098,15 +2104,15 @@
"@deck.gl/extensions": "^9.0.0",
"@deck.gl/layers": "^9.0.0",
"@deck.gl/mesh-layers": "^9.0.0",
- "@loaders.gl/core": "^4.1.0",
+ "@loaders.gl/core": "^4.2.0",
"@luma.gl/core": "^9.0.0",
"@luma.gl/engine": "^9.0.0"
}
},
"node_modules/@deck.gl/google-maps": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.6.tgz",
- "integrity": "sha512-MteXz7LxoFFzbb5N27K6eE2kescMRxAPMuiQsclmIKrXzagFyf1kbdj5kwdRYGeNmlJTKoXpbfyMS3ARsteUCw==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/google-maps/-/google-maps-9.0.8.tgz",
+ "integrity": "sha512-w8L/Zaie1HeGbso5p0t9lJec+EEmhr3j1UdFWH+4RxNjLcQ6Pegv98ZEPQmvb9KwF44XrZXfrbEbaE8QPszyGA==",
"dependencies": {
"@luma.gl/constants": "^9.0.9",
"@math.gl/core": "^4.0.0",
@@ -2118,9 +2124,9 @@
}
},
"node_modules/@deck.gl/json": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.6.tgz",
- "integrity": "sha512-9Bw/WQCEaE2PT7AT8dKnWqubyZB4Rt5w2N/D67L8CfSVKkcP1YK4e1mYEbz/zmii9+6kY1tRwSpmJg27mAyVWQ==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/json/-/json-9.0.8.tgz",
+ "integrity": "sha512-JZ8eXfWycnEwE0X5NiWx5bsV42bSMu/U8MPim5kQW1U7SFDPED7JVXSW5B6tSlLIqHXuWR/a0KyLeW0OG7EQHQ==",
"dependencies": {
"expression-eval": "^5.0.0"
},
@@ -2129,12 +2135,12 @@
}
},
"node_modules/@deck.gl/layers": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.6.tgz",
- "integrity": "sha512-gQ88CIkCxzFiTbSk2p12NT9ZRIOmPO5etqOeDriJONXM4O45yycrmnqcF4Ey2wY2vMYD7zRqWa7eQ0zrxojP1A==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/layers/-/layers-9.0.8.tgz",
+ "integrity": "sha512-HFxVTHiJKM4UCaxRJGJtBWNd4/xEOHaD76eR7W7caviRjnWQn2iTC+ViDM+ElY2AtxbGIDcbF7tA/UdpAuPXLA==",
"dependencies": {
- "@loaders.gl/images": "^4.1.4",
- "@loaders.gl/schema": "^4.1.4",
+ "@loaders.gl/images": "^4.2.0",
+ "@loaders.gl/schema": "^4.2.0",
"@mapbox/tiny-sdf": "^2.0.5",
"@math.gl/core": "^4.0.0",
"@math.gl/polygon": "^4.0.0",
@@ -2143,15 +2149,15 @@
},
"peerDependencies": {
"@deck.gl/core": "^9.0.0",
- "@loaders.gl/core": "^4.1.0",
+ "@loaders.gl/core": "^4.2.0",
"@luma.gl/core": "^9.0.0",
"@luma.gl/engine": "^9.0.0"
}
},
"node_modules/@deck.gl/mapbox": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.6.tgz",
- "integrity": "sha512-RHLHx0uKCGd6t7L0uyH231A2omOLi70ByfqqZKbpzbwEdk64T2ZLtZFDfcSSTf1x2D6LYm0eQL36yeZkZarLFg==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/mapbox/-/mapbox-9.0.8.tgz",
+ "integrity": "sha512-lKatwT449QVOUwbNDLViP7pTYjt0CLazyKCldmvvl/te1jHiSRRmVq8UqPP0L7KtML0dyfbI8uAigTqq8oiyHA==",
"dependencies": {
"@luma.gl/constants": "^9.0.9",
"@math.gl/web-mercator": "^4.0.0"
@@ -2162,11 +2168,11 @@
}
},
"node_modules/@deck.gl/mesh-layers": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.6.tgz",
- "integrity": "sha512-F+7HEC5JONOIP6wMvwI6nUzs2Ksp3P4L+Wcy9SQnxKtMWBEnCu6eVaeJ2ZUYMMFNDhRe/fKOViBCn09mLwvsPw==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/mesh-layers/-/mesh-layers-9.0.8.tgz",
+ "integrity": "sha512-rs1U90BpccMxViTIYzG4B7VpwfdbDQhbvv7lQvkVVDuvrEhIMkSPTkvqCV6R50cV8ZAm9wq5lD45GXmK2fQJjg==",
"dependencies": {
- "@loaders.gl/gltf": "^4.1.4",
+ "@loaders.gl/gltf": "^4.2.0",
"@luma.gl/gltf": "^9.0.9",
"@luma.gl/shadertools": "^9.0.9"
},
@@ -2177,9 +2183,9 @@
}
},
"node_modules/@deck.gl/react": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.6.tgz",
- "integrity": "sha512-vFCsMNzydLE/UwVGOB9lA9a/R21dapSq6V2zX/k0N5gsgqD+9xBLPu8Mh5icYVj303i3yn3E276a818vmP3p4A==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/react/-/react-9.0.8.tgz",
+ "integrity": "sha512-yQkObg8g2yl3QsL0HnRMRKiK78Q256MwVJERqpkjWJgOaSw6Pafhvd+yJXuj73+na1owasXOTLwohQGOVHM6ZQ==",
"peerDependencies": {
"@deck.gl/core": "^9.0.0",
"react": ">=16.3.0",
@@ -2187,9 +2193,9 @@
}
},
"node_modules/@deck.gl/widgets": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.6.tgz",
- "integrity": "sha512-0F8WgXdI1gMeK+ZdB7mZEDHLuZYVUnKOZpaGyY4L2HNFMe3KI1uH5d6725zuPS8gYg3Rt39RkbkC+gtEyudhkg==",
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/@deck.gl/widgets/-/widgets-9.0.8.tgz",
+ "integrity": "sha512-29o6pjyaj7YK05y7aor2rEb7ARkmz8/1QC7NRKBWZgBIVcHmPmKdl8pWLDIsyE0zxyMBdME8phCNwlXRvsVqlg==",
"dependencies": {
"preact": "^10.17.0"
},
@@ -2207,9 +2213,9 @@
}
},
"node_modules/@emotion/is-prop-valid": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
- "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz",
+ "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==",
"dependencies": {
"@emotion/memoize": "^0.8.1"
}
@@ -2224,250 +2230,10 @@
"resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz",
"integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw=="
},
- "node_modules/@esbuild/aix-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz",
- "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "aix"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz",
- "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz",
- "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/android-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz",
- "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "android"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz",
- "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/darwin-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz",
- "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz",
- "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/freebsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz",
- "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "freebsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz",
- "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz",
- "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz",
- "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-loong64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz",
- "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==",
- "cpu": [
- "loong64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-mips64el": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz",
- "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==",
- "cpu": [
- "mips64el"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-ppc64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz",
- "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==",
- "cpu": [
- "ppc64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-riscv64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz",
- "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==",
- "cpu": [
- "riscv64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/linux-s390x": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz",
- "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==",
- "cpu": [
- "s390x"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/@esbuild/linux-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz",
- "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.9.tgz",
+ "integrity": "sha512-JUjpystGFFmNrEHQnIVG8hKwvA2DN5o7RqiO1CVX8EN/F/gkCjkUMgVn6hzScpwnJtl2mPR6I9XV1oW8k9O+0A==",
"cpu": [
"x64"
],
@@ -2479,96 +2245,6 @@
"node": ">=12"
}
},
- "node_modules/@esbuild/netbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz",
- "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "netbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/openbsd-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz",
- "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "openbsd"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/sunos-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz",
- "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "sunos"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-arm64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz",
- "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-ia32": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz",
- "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/@esbuild/win32-x64": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz",
- "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/@eslint-community/eslint-utils": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
@@ -3070,14 +2746,14 @@
}
},
"node_modules/@luma.gl/constants": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.9.tgz",
- "integrity": "sha512-o8NgH4F//e2wVWyZoYmaoopoTejDEITBP78fJtU2ivmCW1viCvByUawEXISPzsekHosDYo9q1/XFjmusXZa3fQ=="
+ "version": "9.0.11",
+ "resolved": "https://registry.npmjs.org/@luma.gl/constants/-/constants-9.0.11.tgz",
+ "integrity": "sha512-LRsGHzjz6j035HA2OeAuOwwkrk7ymc5SFfHGKn+G96IRRtqWZ/G5aCVRT/Wlako/cvAKfG7yTrhe0aL2o36KUw=="
},
"node_modules/@luma.gl/core": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.9.tgz",
- "integrity": "sha512-G0N4+bSWLU6gt3grgzF5xf+vMnfYaryHFLDkAeZV5kJ2helnfzUsjwUKCEYk36V2vygu7TEXlByYgwestB7+Ew==",
+ "version": "9.0.11",
+ "resolved": "https://registry.npmjs.org/@luma.gl/core/-/core-9.0.11.tgz",
+ "integrity": "sha512-oSK/z4tkLlM7wZw5LLxJDr7zcpZHIcg71NBmMgcDx2IEisJth4bPT7GA1vs6r5Snxc+CUiXvdnggeS40ZKLV3A==",
"dependencies": {
"@math.gl/types": "^4.0.0",
"@probe.gl/env": "^4.0.2",
@@ -3087,11 +2763,11 @@
}
},
"node_modules/@luma.gl/engine": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.9.tgz",
- "integrity": "sha512-4qW4OCYaGZJ/iGqerAtnP8FzcNtnXvv+aShLkE4ay2D4zdOIML5kZSLslmU/ByZ3FR606k0c5AjTBOgZ77lkiQ==",
+ "version": "9.0.11",
+ "resolved": "https://registry.npmjs.org/@luma.gl/engine/-/engine-9.0.11.tgz",
+ "integrity": "sha512-YDbEBt1ach55TnngYTH0+aIsLQEhKUtMpvOpGaoZ4PPGlRPHhxVRBZQctNGY0CqvgFsI/VGMDSSYmBsrJ8w7GQ==",
"dependencies": {
- "@luma.gl/shadertools": "9.0.9",
+ "@luma.gl/shadertools": "9.0.11",
"@math.gl/core": "^4.0.0",
"@probe.gl/log": "^4.0.2",
"@probe.gl/stats": "^4.0.2"
@@ -3101,12 +2777,12 @@
}
},
"node_modules/@luma.gl/gltf": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.9.tgz",
- "integrity": "sha512-QuV4gbxIZ8qGOmZsf9DGvavogQUyplpDVAs38eczBBqIKCGFq2d+mOIQMmn1SWFF0RjicjyjnQ2KAFWgdy2jIQ==",
+ "version": "9.0.11",
+ "resolved": "https://registry.npmjs.org/@luma.gl/gltf/-/gltf-9.0.11.tgz",
+ "integrity": "sha512-3Y/iyNblYR6JZKihm8XLoAAehB3MYL0dujbmUUuAtyOn9WJMngtMHIMjw75DSpse7mIqhJLRZph76nR9FaxpGQ==",
"dependencies": {
- "@loaders.gl/textures": "^4.1.0",
- "@luma.gl/shadertools": "9.0.9",
+ "@loaders.gl/textures": "^4.2.0",
+ "@luma.gl/shadertools": "9.0.11",
"@math.gl/core": "^4.0.0"
},
"peerDependencies": {
@@ -3115,9 +2791,9 @@
}
},
"node_modules/@luma.gl/shadertools": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.9.tgz",
- "integrity": "sha512-99wfDMtkIeWziAf96UrqXteJi4uBFvMN0TdU8TvTv0V6BJRjd1xZVWnF9Xx2D+DPH9Mmn4q/hQH0NJ0sQlYeHw==",
+ "version": "9.0.11",
+ "resolved": "https://registry.npmjs.org/@luma.gl/shadertools/-/shadertools-9.0.11.tgz",
+ "integrity": "sha512-MSSmvyQ+hwCEHlw6z5O2bHNQJt4y6RHRaegMDaYPt8z9r4Pzphlzyrl1n+HxKWVfOj2mV/vvyPTJtwY90iBHIA==",
"dependencies": {
"@math.gl/core": "^4.0.0",
"@math.gl/types": "^4.0.0"
@@ -3127,11 +2803,11 @@
}
},
"node_modules/@luma.gl/webgl": {
- "version": "9.0.9",
- "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.9.tgz",
- "integrity": "sha512-dP91Md5u6OnK3PFt0h1uqcxWh3T/COBHyZ5OcAirRUB1laFdzhdXUWbtuvLgpF6b7o0MsaEUcXaAbYf+e7lEzA==",
+ "version": "9.0.11",
+ "resolved": "https://registry.npmjs.org/@luma.gl/webgl/-/webgl-9.0.11.tgz",
+ "integrity": "sha512-mWgUzsqjOtdZBKLex0taeRpwwp7ZovHrNhoUccAsNG9WerY3VHGRp1Rx4fn6qIG1QCsyyFEl1c8zlrnzK7axrQ==",
"dependencies": {
- "@luma.gl/constants": "9.0.9",
+ "@luma.gl/constants": "9.0.11",
"@probe.gl/env": "^4.0.2"
},
"peerDependencies": {
@@ -3230,67 +2906,7 @@
"resolved": "https://registry.npmjs.org/@next/env/-/env-14.1.0.tgz",
"integrity": "sha512-Py8zIo+02ht82brwwhTg36iogzFqGLPXlRGKQw5s+qP/kMNc4MAyDeEwBKDijk6zTIbegEgu8Qy7C1LboslQAw=="
},
- "node_modules/@next/swc-darwin-arm64": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz",
- "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-darwin-x64": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz",
- "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-gnu": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz",
- "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-arm64-musl": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz",
- "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-linux-x64-gnu": {
+ "node_modules/@next/swc-linux-x64-gnu": {
"version": "14.1.0",
"resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-14.1.0.tgz",
"integrity": "sha512-zJ2pnoFYB1F4vmEVlb/eSe+VH679zT1VdXlZKX+pE66grOgjmKJHKacf82g/sWE4MQ4Rk2FMBCRnX+l6/TVYzQ==",
@@ -3320,51 +2936,6 @@
"node": ">= 10"
}
},
- "node_modules/@next/swc-win32-arm64-msvc": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz",
- "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-ia32-msvc": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz",
- "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/@next/swc-win32-x64-msvc": {
- "version": "14.1.0",
- "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz",
- "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ],
- "engines": {
- "node": ">= 10"
- }
- },
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
"version": "5.1.1-v1",
"resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
@@ -3433,130 +3004,10 @@
"resolved": "https://registry.npmjs.org/@probe.gl/stats/-/stats-4.0.9.tgz",
"integrity": "sha512-Q9Xt/sJUQaMsbjRKjOscv2t7wXIymTrOEJ4a3da4FTCn7bkKvcdxdyFAQySCrtPxE+YZ5I5lXpWPgv9BwmpE1g=="
},
- "node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz",
- "integrity": "sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-android-arm64": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz",
- "integrity": "sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "android"
- ]
- },
- "node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz",
- "integrity": "sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz",
- "integrity": "sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "darwin"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz",
- "integrity": "sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==",
- "cpu": [
- "arm"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz",
- "integrity": "sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz",
- "integrity": "sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-powerpc64le-gnu": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz",
- "integrity": "sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==",
- "cpu": [
- "ppc64le"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz",
- "integrity": "sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==",
- "cpu": [
- "riscv64"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
- "node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz",
- "integrity": "sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==",
- "cpu": [
- "s390x"
- ],
- "optional": true,
- "os": [
- "linux"
- ]
- },
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz",
- "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.0.tgz",
+ "integrity": "sha512-m6pkSwcZZD2LCFHZX/zW2aLIISyzWLU3hrLLzQKMI12+OLEzgruTovAxY5sCZJkipklaZqPy/2bEEBNjp+Y7xg==",
"cpu": [
"x64"
],
@@ -3566,9 +3017,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz",
- "integrity": "sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==",
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.9.0.tgz",
+ "integrity": "sha512-VFAC1RDRSbU3iOF98X42KaVicAfKf0m0OvIu8dbnqhTe26Kh6Ym9JrDulz7Hbk7/9zGc41JkV02g+p3BivOdAg==",
"cpu": [
"x64"
],
@@ -3577,42 +3028,6 @@
"linux"
]
},
- "node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz",
- "integrity": "sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==",
- "cpu": [
- "arm64"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz",
- "integrity": "sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==",
- "cpu": [
- "ia32"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
- "node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz",
- "integrity": "sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==",
- "cpu": [
- "x64"
- ],
- "optional": true,
- "os": [
- "win32"
- ]
- },
"node_modules/@sinclair/typebox": {
"version": "0.27.8",
"resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
@@ -4305,11 +3720,27 @@
"resolved": "https://registry.npmjs.org/@types/d3-time/-/d3-time-2.1.4.tgz",
"integrity": "sha512-BTfLsxTeo7yFxI/haOOf1ZwJ6xKgQLT9dCp+EcmQv87Gox6X+oKl4mLKfO6fnWm3P22+A6DknMNEZany8ql2Rw=="
},
+ "node_modules/@types/debug": {
+ "version": "4.1.12",
+ "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz",
+ "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==",
+ "dependencies": {
+ "@types/ms": "*"
+ }
+ },
"node_modules/@types/estree": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
"integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw=="
},
+ "node_modules/@types/estree-jsx": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz",
+ "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==",
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
"node_modules/@types/geojson": {
"version": "7946.0.14",
"resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz",
@@ -4325,10 +3756,18 @@
"resolved": "https://registry.npmjs.org/@types/hammerjs/-/hammerjs-2.0.41.tgz",
"integrity": "sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA=="
},
+ "node_modules/@types/hast": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz",
+ "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
"node_modules/@types/hoist-non-react-statics": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
- "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==",
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.5.tgz",
+ "integrity": "sha512-SbcrWzkKBw2cdwRTwQAswfpB9g9LJWfjtUeW/jvNwbhC8cpmmNYVePa+ncbUe0rGTQ7G3Ff6mYUN2VMfLVr+Sg==",
"dependencies": {
"@types/react": "*",
"hoist-non-react-statics": "^3.3.0"
@@ -4352,6 +3791,19 @@
"integrity": "sha512-/i42wjYNgE6wf0j2bcTX6kuowmdL/6PE4IVitMpm2eYKBUuYCprdcWVK+xEF0gcV6ufMCRhtxmReGfc6hIK7Jw==",
"dev": true
},
+ "node_modules/@types/mdast": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz",
+ "integrity": "sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==",
+ "dependencies": {
+ "@types/unist": "*"
+ }
+ },
+ "node_modules/@types/ms": {
+ "version": "0.7.34",
+ "resolved": "https://registry.npmjs.org/@types/ms/-/ms-0.7.34.tgz",
+ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g=="
+ },
"node_modules/@types/node": {
"version": "20.11.16",
"resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.16.tgz",
@@ -4434,6 +3886,11 @@
"resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.0.tgz",
"integrity": "sha512-n4sx2bqL0mW1tvDf/loQ+aMX7GQD3lc3fkCMC55VFNDu/vBOabO+LTIeXKM14xK0ppk5TUGcWRjiSpIlUpghKw=="
},
+ "node_modules/@types/unist": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz",
+ "integrity": "sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ=="
+ },
"node_modules/@types/wikidata-sdk": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/@types/wikidata-sdk/-/wikidata-sdk-6.1.0.tgz",
@@ -5116,9 +4573,9 @@
}
},
"node_modules/@typescript-eslint/utils/node_modules/semver": {
- "version": "7.6.0",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz",
- "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==",
+ "version": "7.5.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz",
+ "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==",
"dev": true,
"dependencies": {
"lru-cache": "^6.0.0"
@@ -5150,8 +4607,7 @@
"node_modules/@ungap/structured-clone": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
- "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
- "dev": true
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
},
"node_modules/@vitejs/plugin-react": {
"version": "4.2.1",
@@ -5681,6 +5137,15 @@
"styled-components": ">= 2"
}
},
+ "node_modules/bail": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz",
+ "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -5872,6 +5337,15 @@
"colorbrewer": "1.0.0"
}
},
+ "node_modules/ccount": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
+ "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/chai": {
"version": "4.4.1",
"resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz",
@@ -5903,6 +5377,42 @@
"node": ">=4"
}
},
+ "node_modules/character-entities": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
+ "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-html4": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
+ "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-entities-legacy": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
+ "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/character-reference-invalid": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
+ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/charenc": {
"version": "0.0.2",
"resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz",
@@ -5968,9 +5478,18 @@
"node": ">= 0.8"
}
},
- "node_modules/commander": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "node_modules/comma-separated-tokens": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz",
+ "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
"integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
"dev": true,
"engines": {
@@ -6001,6 +5520,16 @@
"node": ">=0.10.0"
}
},
+ "node_modules/core-js": {
+ "version": "3.36.1",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.36.1.tgz",
+ "integrity": "sha512-BTvUrwxVBezj5SZ3f10ImnX2oRByMxql3EimVqMysepbC9EeMUOpLwdy6Eoili2x6E4kf+ZUB5k/+Jv55alPfA==",
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
"node_modules/core-js-compat": {
"version": "3.30.2",
"resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz",
@@ -6309,22 +5838,34 @@
"integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA=="
},
"node_modules/deck.gl": {
- "version": "9.0.6",
- "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.6.tgz",
- "integrity": "sha512-9zKzFUe8cuvUYAuqlY0mpJGiDxZ+pdtEam72Bn1+OV5hJa3SGHVE57ozxdTII8nVoe6UZcadNDG3HmXAapL8hg==",
- "dependencies": {
- "@deck.gl/aggregation-layers": "9.0.6",
- "@deck.gl/carto": "9.0.6",
- "@deck.gl/core": "9.0.6",
- "@deck.gl/extensions": "9.0.6",
- "@deck.gl/geo-layers": "9.0.6",
- "@deck.gl/google-maps": "9.0.6",
- "@deck.gl/json": "9.0.6",
- "@deck.gl/layers": "9.0.6",
- "@deck.gl/mapbox": "9.0.6",
- "@deck.gl/mesh-layers": "9.0.6",
- "@deck.gl/react": "9.0.6",
- "@deck.gl/widgets": "9.0.6"
+ "version": "9.0.8",
+ "resolved": "https://registry.npmjs.org/deck.gl/-/deck.gl-9.0.8.tgz",
+ "integrity": "sha512-tl1r08hKtcD4jRCz38uHfbanvgjdVCZ8stxOHlprYZHSuz79qB2Go+dsQhNcT2HfBvDIChSknZKjrMylcNgRig==",
+ "dependencies": {
+ "@deck.gl/aggregation-layers": "9.0.8",
+ "@deck.gl/carto": "9.0.8",
+ "@deck.gl/core": "9.0.8",
+ "@deck.gl/extensions": "9.0.8",
+ "@deck.gl/geo-layers": "9.0.8",
+ "@deck.gl/google-maps": "9.0.8",
+ "@deck.gl/json": "9.0.8",
+ "@deck.gl/layers": "9.0.8",
+ "@deck.gl/mapbox": "9.0.8",
+ "@deck.gl/mesh-layers": "9.0.8",
+ "@deck.gl/react": "9.0.8",
+ "@deck.gl/widgets": "9.0.8"
+ }
+ },
+ "node_modules/decode-named-character-reference": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.0.2.tgz",
+ "integrity": "sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==",
+ "dependencies": {
+ "character-entities": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
}
},
"node_modules/deep-eql": {
@@ -6443,11 +5984,22 @@
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
"integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
- "dev": true,
"engines": {
"node": ">=6"
}
},
+ "node_modules/devlop": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
+ "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
+ "dependencies": {
+ "dequal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/diff-sequences": {
"version": "29.6.3",
"resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
@@ -6747,9 +6299,9 @@
}
},
"node_modules/esbuild": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz",
- "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==",
+ "version": "0.19.9",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.9.tgz",
+ "integrity": "sha512-U9CHtKSy+EpPsEBa+/A2gMs/h3ylBC0H0KSqIg7tpztHerLi6nrrcoUJAkNCEPumx8yJ+Byic4BVwHgRbN0TBg==",
"hasInstallScript": true,
"bin": {
"esbuild": "bin/esbuild"
@@ -6758,29 +6310,28 @@
"node": ">=12"
},
"optionalDependencies": {
- "@esbuild/aix-ppc64": "0.20.2",
- "@esbuild/android-arm": "0.20.2",
- "@esbuild/android-arm64": "0.20.2",
- "@esbuild/android-x64": "0.20.2",
- "@esbuild/darwin-arm64": "0.20.2",
- "@esbuild/darwin-x64": "0.20.2",
- "@esbuild/freebsd-arm64": "0.20.2",
- "@esbuild/freebsd-x64": "0.20.2",
- "@esbuild/linux-arm": "0.20.2",
- "@esbuild/linux-arm64": "0.20.2",
- "@esbuild/linux-ia32": "0.20.2",
- "@esbuild/linux-loong64": "0.20.2",
- "@esbuild/linux-mips64el": "0.20.2",
- "@esbuild/linux-ppc64": "0.20.2",
- "@esbuild/linux-riscv64": "0.20.2",
- "@esbuild/linux-s390x": "0.20.2",
- "@esbuild/linux-x64": "0.20.2",
- "@esbuild/netbsd-x64": "0.20.2",
- "@esbuild/openbsd-x64": "0.20.2",
- "@esbuild/sunos-x64": "0.20.2",
- "@esbuild/win32-arm64": "0.20.2",
- "@esbuild/win32-ia32": "0.20.2",
- "@esbuild/win32-x64": "0.20.2"
+ "@esbuild/android-arm": "0.19.9",
+ "@esbuild/android-arm64": "0.19.9",
+ "@esbuild/android-x64": "0.19.9",
+ "@esbuild/darwin-arm64": "0.19.9",
+ "@esbuild/darwin-x64": "0.19.9",
+ "@esbuild/freebsd-arm64": "0.19.9",
+ "@esbuild/freebsd-x64": "0.19.9",
+ "@esbuild/linux-arm": "0.19.9",
+ "@esbuild/linux-arm64": "0.19.9",
+ "@esbuild/linux-ia32": "0.19.9",
+ "@esbuild/linux-loong64": "0.19.9",
+ "@esbuild/linux-mips64el": "0.19.9",
+ "@esbuild/linux-ppc64": "0.19.9",
+ "@esbuild/linux-riscv64": "0.19.9",
+ "@esbuild/linux-s390x": "0.19.9",
+ "@esbuild/linux-x64": "0.19.9",
+ "@esbuild/netbsd-x64": "0.19.9",
+ "@esbuild/openbsd-x64": "0.19.9",
+ "@esbuild/sunos-x64": "0.19.9",
+ "@esbuild/win32-arm64": "0.19.9",
+ "@esbuild/win32-ia32": "0.19.9",
+ "@esbuild/win32-x64": "0.19.9"
}
},
"node_modules/escalade": {
@@ -7052,24 +6603,6 @@
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8"
}
},
- "node_modules/eslint-plugin-jsx-a11y/node_modules/@babel/runtime": {
- "version": "7.23.2",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz",
- "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==",
- "dev": true,
- "dependencies": {
- "regenerator-runtime": "^0.14.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/eslint-plugin-jsx-a11y/node_modules/regenerator-runtime": {
- "version": "0.14.0",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz",
- "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==",
- "dev": true
- },
"node_modules/eslint-plugin-react": {
"version": "7.33.2",
"resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz",
@@ -7435,6 +6968,15 @@
"node": ">=4.0"
}
},
+ "node_modules/estree-util-is-identifier-name": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz",
+ "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/estree-walker": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz",
@@ -7485,6 +7027,11 @@
"jsep": "^0.3.0"
}
},
+ "node_modules/extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
+ },
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
@@ -7598,9 +7145,9 @@
"dev": true
},
"node_modules/follow-redirects": {
- "version": "1.15.6",
- "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz",
- "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "version": "1.15.5",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz",
+ "integrity": "sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==",
"funding": [
{
"type": "individual",
@@ -7657,19 +7204,6 @@
"integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
"dev": true
},
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "hasInstallScript": true,
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
"node_modules/function-bind": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
@@ -7994,6 +7528,56 @@
"node": ">= 0.4"
}
},
+ "node_modules/hast-util-is-element": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-is-element/-/hast-util-is-element-3.0.0.tgz",
+ "integrity": "sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-to-jsx-runtime": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.0.tgz",
+ "integrity": "sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==",
+ "dependencies": {
+ "@types/estree": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/unist": "^3.0.0",
+ "comma-separated-tokens": "^2.0.0",
+ "devlop": "^1.0.0",
+ "estree-util-is-identifier-name": "^3.0.0",
+ "hast-util-whitespace": "^3.0.0",
+ "mdast-util-mdx-expression": "^2.0.0",
+ "mdast-util-mdx-jsx": "^3.0.0",
+ "mdast-util-mdxjs-esm": "^2.0.0",
+ "property-information": "^6.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "style-to-object": "^1.0.0",
+ "unist-util-position": "^5.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/hast-util-whitespace": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz",
+ "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==",
+ "dependencies": {
+ "@types/hast": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/hoist-non-react-statics": {
"version": "3.3.2",
"resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
@@ -8024,6 +7608,23 @@
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
"dev": true
},
+ "node_modules/html-parse-stringify": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz",
+ "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==",
+ "dependencies": {
+ "void-elements": "3.1.0"
+ }
+ },
+ "node_modules/html-url-attributes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.0.tgz",
+ "integrity": "sha512-/sXbVCWayk6GDVg3ctOX6nxaVj7So40FcFAnWlWGNAB1LpYKcV5Cd10APjPjW80O7zYW2MsjBV4zZ7IZO5fVow==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/http-proxy-agent": {
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz",
@@ -8099,6 +7700,33 @@
"node": ">=16.17.0"
}
},
+ "node_modules/i18next": {
+ "version": "23.10.1",
+ "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.10.1.tgz",
+ "integrity": "sha512-NDiIzFbcs3O9PXpfhkjyf7WdqFn5Vq6mhzhtkXzj51aOcNuPNcTwuYNuXCpHsanZGHlHKL35G7huoFeVic1hng==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ }
+ ],
+ "dependencies": {
+ "@babel/runtime": "^7.23.2"
+ }
+ },
+ "node_modules/i18next-fs-backend": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/i18next-fs-backend/-/i18next-fs-backend-2.3.1.tgz",
+ "integrity": "sha512-tvfXskmG/9o+TJ5Fxu54sSO5OkY6d+uMn+K6JiUGLJrwxAVfer+8V3nU8jq3ts9Pe5lXJv4b1N7foIjJ8Iy2Gg=="
+ },
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
@@ -8204,6 +7832,11 @@
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
},
+ "node_modules/inline-style-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.3.tgz",
+ "integrity": "sha512-qlD8YNDqyTKTyuITrDOffsl6Tdhv+UC4hcdAVuQsK4IMQ99nSgd1MIA/Q+jQYoh9r3hVUXhYh7urSRmXPkW04g=="
+ },
"node_modules/internal-slot": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz",
@@ -8226,6 +7859,39 @@
"node": ">=12"
}
},
+ "node_modules/is-absolute-url": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-4.0.1.tgz",
+ "integrity": "sha512-/51/TKE88Lmm7Gc4/8btclNXWS+g50wXhYJq8HWIBAGUBnoAdRu1aXeh364t/O7wXDAcTJDP8PNuNKWUDWie+A==",
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-alphabetical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
+ "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/is-alphanumerical": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
+ "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
+ "dependencies": {
+ "is-alphabetical": "^2.0.0",
+ "is-decimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-arguments": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz",
@@ -8349,6 +8015,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/is-decimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
+ "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-error": {
"version": "2.2.2",
"resolved": "https://registry.npmjs.org/is-error/-/is-error-2.2.2.tgz",
@@ -8402,6 +8077,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/is-hexadecimal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
+ "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/is-map": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz",
@@ -8456,6 +8140,17 @@
"node": ">=8"
}
},
+ "node_modules/is-plain-obj": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz",
+ "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/is-plain-object": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
@@ -8900,6 +8595,15 @@
"node": ">=0.6"
}
},
+ "node_modules/longest-streak": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
+ "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/loose-envify": {
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
@@ -8989,6 +8693,151 @@
"is-buffer": "~1.1.6"
}
},
+ "node_modules/mdast-util-from-markdown": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.0.tgz",
+ "integrity": "sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark": "^4.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-expression": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.0.tgz",
+ "integrity": "sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdx-jsx": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.1.2.tgz",
+ "integrity": "sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "ccount": "^2.0.0",
+ "devlop": "^1.1.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0",
+ "parse-entities": "^4.0.0",
+ "stringify-entities": "^4.0.0",
+ "unist-util-remove-position": "^5.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-mdxjs-esm": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz",
+ "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==",
+ "dependencies": {
+ "@types/estree-jsx": "^1.0.0",
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "devlop": "^1.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "mdast-util-to-markdown": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-phrasing": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
+ "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-hast": {
+ "version": "13.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.1.0.tgz",
+ "integrity": "sha512-/e2l/6+OdGp/FB+ctrJ9Avz71AN/GRH3oi/3KAx/kMnoUsD6q0woXlDT8lLEeViVKE7oZxE7RXzvO3T8kF2/sA==",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "trim-lines": "^3.0.0",
+ "unist-util-position": "^5.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-markdown": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.0.tgz",
+ "integrity": "sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "@types/unist": "^3.0.0",
+ "longest-streak": "^3.0.0",
+ "mdast-util-phrasing": "^4.0.0",
+ "mdast-util-to-string": "^4.0.0",
+ "micromark-util-decode-string": "^2.0.0",
+ "unist-util-visit": "^5.0.0",
+ "zwitch": "^2.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/mdast-util-to-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
+ "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
+ "dependencies": {
+ "@types/mdast": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/mdn-data": {
"version": "2.0.30",
"resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
@@ -9010,6 +8859,448 @@
"node": ">= 8"
}
},
+ "node_modules/micromark": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.0.tgz",
+ "integrity": "sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "@types/debug": "^4.0.0",
+ "debug": "^4.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-core-commonmark": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-combine-extensions": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-sanitize-uri": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-core-commonmark": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.0.tgz",
+ "integrity": "sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "devlop": "^1.0.0",
+ "micromark-factory-destination": "^2.0.0",
+ "micromark-factory-label": "^2.0.0",
+ "micromark-factory-space": "^2.0.0",
+ "micromark-factory-title": "^2.0.0",
+ "micromark-factory-whitespace": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-classify-character": "^2.0.0",
+ "micromark-util-html-tag-name": "^2.0.0",
+ "micromark-util-normalize-identifier": "^2.0.0",
+ "micromark-util-resolve-all": "^2.0.0",
+ "micromark-util-subtokenize": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-destination": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.0.tgz",
+ "integrity": "sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-label": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.0.tgz",
+ "integrity": "sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-space": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.0.tgz",
+ "integrity": "sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-title": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.0.tgz",
+ "integrity": "sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-factory-whitespace": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.0.tgz",
+ "integrity": "sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-factory-space": "^2.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-character": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.0.tgz",
+ "integrity": "sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-chunked": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.0.tgz",
+ "integrity": "sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-classify-character": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.0.tgz",
+ "integrity": "sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-combine-extensions": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.0.tgz",
+ "integrity": "sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-numeric-character-reference": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.1.tgz",
+ "integrity": "sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-decode-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.0.tgz",
+ "integrity": "sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "decode-named-character-reference": "^1.0.0",
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-decode-numeric-character-reference": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-encode": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.0.tgz",
+ "integrity": "sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ]
+ },
+ "node_modules/micromark-util-html-tag-name": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.0.tgz",
+ "integrity": "sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ]
+ },
+ "node_modules/micromark-util-normalize-identifier": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.0.tgz",
+ "integrity": "sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-resolve-all": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.0.tgz",
+ "integrity": "sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-sanitize-uri": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.0.tgz",
+ "integrity": "sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "micromark-util-character": "^2.0.0",
+ "micromark-util-encode": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-subtokenize": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.0.0.tgz",
+ "integrity": "sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ],
+ "dependencies": {
+ "devlop": "^1.0.0",
+ "micromark-util-chunked": "^2.0.0",
+ "micromark-util-symbol": "^2.0.0",
+ "micromark-util-types": "^2.0.0"
+ }
+ },
+ "node_modules/micromark-util-symbol": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.0.tgz",
+ "integrity": "sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ]
+ },
+ "node_modules/micromark-util-types": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.0.tgz",
+ "integrity": "sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==",
+ "funding": [
+ {
+ "type": "GitHub Sponsors",
+ "url": "https://github.com/sponsors/unifiedjs"
+ },
+ {
+ "type": "OpenCollective",
+ "url": "https://opencollective.com/unified"
+ }
+ ]
+ },
+ "node_modules/micromark/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/micromark/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+ },
"node_modules/micromatch": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
@@ -9206,6 +9497,41 @@
}
}
},
+ "node_modules/next-i18next": {
+ "version": "15.2.0",
+ "resolved": "https://registry.npmjs.org/next-i18next/-/next-i18next-15.2.0.tgz",
+ "integrity": "sha512-Rl5yZ4oGffsB0AjRykZ5PzNQ2M6am54MaMayldGmH/UKZisrIxk2SKEPJvaHhKlWe1qgdNi2FkodwK8sEjfEmg==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://locize.com/i18next.html"
+ },
+ {
+ "type": "individual",
+ "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project"
+ },
+ {
+ "type": "individual",
+ "url": "https://locize.com"
+ }
+ ],
+ "dependencies": {
+ "@babel/runtime": "^7.23.2",
+ "@types/hoist-non-react-statics": "^3.3.4",
+ "core-js": "^3",
+ "hoist-non-react-statics": "^3.3.2",
+ "i18next-fs-backend": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "i18next": ">= 23.7.13",
+ "next": ">= 12.0.0",
+ "react": ">= 17.0.2",
+ "react-i18next": ">= 13.5.0"
+ }
+ },
"node_modules/nextjs-progressbar": {
"version": "0.0.16",
"resolved": "https://registry.npmjs.org/nextjs-progressbar/-/nextjs-progressbar-0.0.16.tgz",
@@ -9505,6 +9831,30 @@
"node": ">=6"
}
},
+ "node_modules/parse-entities": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz",
+ "integrity": "sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==",
+ "dependencies": {
+ "@types/unist": "^2.0.0",
+ "character-entities": "^2.0.0",
+ "character-entities-legacy": "^3.0.0",
+ "character-reference-invalid": "^2.0.0",
+ "decode-named-character-reference": "^1.0.0",
+ "is-alphanumerical": "^2.0.0",
+ "is-decimal": "^2.0.0",
+ "is-hexadecimal": "^2.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/parse-entities/node_modules/@types/unist": {
+ "version": "2.0.10",
+ "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.10.tgz",
+ "integrity": "sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA=="
+ },
"node_modules/parse-json": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
@@ -9741,6 +10091,15 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
},
+ "node_modules/property-information": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz",
+ "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/protocol-buffers-schema": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
@@ -9847,6 +10206,27 @@
"react": "^18.2.0"
}
},
+ "node_modules/react-i18next": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.0.tgz",
+ "integrity": "sha512-3KwX6LHpbvGQ+sBEntjV4sYW3Zovjjl3fpoHbUwSgFHf0uRBcbeCBLR5al6ikncI5+W0EFb71QXZmfop+J6NrQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "html-parse-stringify": "^3.0.1"
+ },
+ "peerDependencies": {
+ "i18next": ">= 23.2.3",
+ "react": ">= 16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "react-dom": {
+ "optional": true
+ },
+ "react-native": {
+ "optional": true
+ }
+ }
+ },
"node_modules/react-is": {
"version": "17.0.2",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
@@ -9866,6 +10246,31 @@
"react": ">=15"
}
},
+ "node_modules/react-markdown": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-9.0.1.tgz",
+ "integrity": "sha512-186Gw/vF1uRkydbsOIkcGXw7aHq0sZOCRFFjGrr7b9+nVZg4UfA4enXCaxm4fUzecU38sWfrNDitGhshuU7rdg==",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "devlop": "^1.0.0",
+ "hast-util-to-jsx-runtime": "^2.0.0",
+ "html-url-attributes": "^3.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "remark-parse": "^11.0.0",
+ "remark-rehype": "^11.0.0",
+ "unified": "^11.0.0",
+ "unist-util-visit": "^5.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ },
+ "peerDependencies": {
+ "@types/react": ">=18",
+ "react": ">=18"
+ }
+ },
"node_modules/readable-stream": {
"version": "2.3.8",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
@@ -9932,10 +10337,9 @@
}
},
"node_modules/regenerator-runtime": {
- "version": "0.13.4",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz",
- "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g==",
- "dev": true
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"node_modules/regenerator-transform": {
"version": "0.15.1",
@@ -10001,6 +10405,54 @@
"jsesc": "bin/jsesc"
}
},
+ "node_modules/rehype-external-links": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/rehype-external-links/-/rehype-external-links-3.0.0.tgz",
+ "integrity": "sha512-yp+e5N9V3C6bwBeAC4n796kc86M4gJCdlVhiMTxIrJG5UHDMh+PJANf9heqORJbt1nrCbDwIlAZKjANIaVBbvw==",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@ungap/structured-clone": "^1.0.0",
+ "hast-util-is-element": "^3.0.0",
+ "is-absolute-url": "^4.0.0",
+ "space-separated-tokens": "^2.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-parse": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz",
+ "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==",
+ "dependencies": {
+ "@types/mdast": "^4.0.0",
+ "mdast-util-from-markdown": "^2.0.0",
+ "micromark-util-types": "^2.0.0",
+ "unified": "^11.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/remark-rehype": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.0.tgz",
+ "integrity": "sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==",
+ "dependencies": {
+ "@types/hast": "^3.0.0",
+ "@types/mdast": "^4.0.0",
+ "mdast-util-to-hast": "^13.0.0",
+ "unified": "^11.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
@@ -10066,12 +10518,9 @@
}
},
"node_modules/rollup": {
- "version": "4.14.1",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.1.tgz",
- "integrity": "sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==",
- "dependencies": {
- "@types/estree": "1.0.5"
- },
+ "version": "4.9.0",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.9.0.tgz",
+ "integrity": "sha512-bUHW/9N21z64gw8s6tP4c88P382Bq/L5uZDowHlHx6s/QWpjJXivIAbEw6LZthgSvlEizZBfLC4OAvWe7aoF7A==",
"bin": {
"rollup": "dist/bin/rollup"
},
@@ -10080,21 +10529,19 @@
"npm": ">=8.0.0"
},
"optionalDependencies": {
- "@rollup/rollup-android-arm-eabi": "4.14.1",
- "@rollup/rollup-android-arm64": "4.14.1",
- "@rollup/rollup-darwin-arm64": "4.14.1",
- "@rollup/rollup-darwin-x64": "4.14.1",
- "@rollup/rollup-linux-arm-gnueabihf": "4.14.1",
- "@rollup/rollup-linux-arm64-gnu": "4.14.1",
- "@rollup/rollup-linux-arm64-musl": "4.14.1",
- "@rollup/rollup-linux-powerpc64le-gnu": "4.14.1",
- "@rollup/rollup-linux-riscv64-gnu": "4.14.1",
- "@rollup/rollup-linux-s390x-gnu": "4.14.1",
- "@rollup/rollup-linux-x64-gnu": "4.14.1",
- "@rollup/rollup-linux-x64-musl": "4.14.1",
- "@rollup/rollup-win32-arm64-msvc": "4.14.1",
- "@rollup/rollup-win32-ia32-msvc": "4.14.1",
- "@rollup/rollup-win32-x64-msvc": "4.14.1",
+ "@rollup/rollup-android-arm-eabi": "4.9.0",
+ "@rollup/rollup-android-arm64": "4.9.0",
+ "@rollup/rollup-darwin-arm64": "4.9.0",
+ "@rollup/rollup-darwin-x64": "4.9.0",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.9.0",
+ "@rollup/rollup-linux-arm64-gnu": "4.9.0",
+ "@rollup/rollup-linux-arm64-musl": "4.9.0",
+ "@rollup/rollup-linux-riscv64-gnu": "4.9.0",
+ "@rollup/rollup-linux-x64-gnu": "4.9.0",
+ "@rollup/rollup-linux-x64-musl": "4.9.0",
+ "@rollup/rollup-win32-arm64-msvc": "4.9.0",
+ "@rollup/rollup-win32-ia32-msvc": "4.9.0",
+ "@rollup/rollup-win32-x64-msvc": "4.9.0",
"fsevents": "~2.3.2"
}
},
@@ -10324,13 +10771,22 @@
"integrity": "sha512-YIK6I2lsH072UE0aOFxxY1dPDCS43I5ktqHpeAsuLNYWkE5pGxRGWfDM4/vSUfNzXjC1Ivzt3qx31PCLmc9yqg=="
},
"node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+ "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
"engines": {
"node": ">=0.10.0"
}
},
+ "node_modules/space-separated-tokens": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz",
+ "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/sprintf-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
@@ -10440,6 +10896,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/stringify-entities": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
+ "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
+ "dependencies": {
+ "character-entities-html4": "^2.0.0",
+ "character-entities-legacy": "^3.0.0"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/strip-ansi": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
@@ -10514,6 +10983,14 @@
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA=="
},
+ "node_modules/style-to-object": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.6.tgz",
+ "integrity": "sha512-khxq+Qm3xEyZfKd/y9L3oIWQimxuc4STrQKtQn8aSDRHb8mFgpukgX1hdzfrMEW6JCjyJ8p89x+IUMVnCBI1PA==",
+ "dependencies": {
+ "inline-style-parser": "0.2.3"
+ }
+ },
"node_modules/styled-components": {
"version": "6.1.8",
"resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.8.tgz",
@@ -10541,6 +11018,14 @@
"react-dom": ">= 16.8.0"
}
},
+ "node_modules/styled-components/node_modules/@emotion/is-prop-valid": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",
+ "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==",
+ "dependencies": {
+ "@emotion/memoize": "^0.8.1"
+ }
+ },
"node_modules/styled-components/node_modules/tslib": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz",
@@ -10746,6 +11231,24 @@
"node": ">=18"
}
},
+ "node_modules/trim-lines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz",
+ "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/trough": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz",
+ "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
"node_modules/ts-api-utils": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz",
@@ -10980,6 +11483,100 @@
"node": ">=4"
}
},
+ "node_modules/unified": {
+ "version": "11.0.4",
+ "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.4.tgz",
+ "integrity": "sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "bail": "^2.0.0",
+ "devlop": "^1.0.0",
+ "extend": "^3.0.0",
+ "is-plain-obj": "^4.0.0",
+ "trough": "^2.0.0",
+ "vfile": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-is": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz",
+ "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz",
+ "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-remove-position": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-5.0.0.tgz",
+ "integrity": "sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-visit": "^5.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-stringify-position": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
+ "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
+ "dependencies": {
+ "@types/unist": "^3.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz",
+ "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0",
+ "unist-util-visit-parents": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/unist-util-visit-parents": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz",
+ "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-is": "^6.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/universalify": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
@@ -11040,14 +11637,41 @@
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
},
+ "node_modules/vfile": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.1.tgz",
+ "integrity": "sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0",
+ "vfile-message": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
+ "node_modules/vfile-message": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz",
+ "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==",
+ "dependencies": {
+ "@types/unist": "^3.0.0",
+ "unist-util-stringify-position": "^4.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/unified"
+ }
+ },
"node_modules/vite": {
- "version": "5.2.8",
- "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz",
- "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==",
+ "version": "5.0.12",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.0.12.tgz",
+ "integrity": "sha512-4hsnEkG3q0N4Tzf1+t6NdN9dg/L3BM+q8SWgbSPnJvrgH2kgdyzfVJwbR1ic69/4uMJJ/3dqDZZE5/WwqW8U1w==",
"dependencies": {
- "esbuild": "^0.20.1",
- "postcss": "^8.4.38",
- "rollup": "^4.13.0"
+ "esbuild": "^0.19.3",
+ "postcss": "^8.4.32",
+ "rollup": "^4.2.0"
},
"bin": {
"vite": "bin/vite.js"
@@ -11140,9 +11764,9 @@
"dev": true
},
"node_modules/vite/node_modules/postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
+ "version": "8.4.32",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz",
+ "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==",
"funding": [
{
"type": "opencollective",
@@ -11160,7 +11784,7 @@
"dependencies": {
"nanoid": "^3.3.7",
"picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
+ "source-map-js": "^1.0.2"
},
"engines": {
"node": "^10 || ^12 || >=14"
@@ -11255,6 +11879,14 @@
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
+ "node_modules/void-elements": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz",
+ "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/w3c-xmlserializer": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz",
@@ -11550,6 +12182,120 @@
"resolved": "https://registry.npmjs.org/zstd-codec/-/zstd-codec-0.1.4.tgz",
"integrity": "sha512-KYnWoFWgGtWyQEKNnUcb3u8ZtKO8dn5d8u+oGpxPlopqsPyv60U8suDyfk7Z7UtAO6Sk5i1aVcAs9RbaB1n36A==",
"optional": true
+ },
+ "node_modules/zwitch": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
+ "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/@next/swc-darwin-arm64": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-14.1.0.tgz",
+ "integrity": "sha512-nUDn7TOGcIeyQni6lZHfzNoo9S0euXnu0jhsbMOmMJUBfgsnESdjN97kM7cBqQxZa8L/bM9om/S5/1dzCrW6wQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-darwin-x64": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-14.1.0.tgz",
+ "integrity": "sha512-1jgudN5haWxiAl3O1ljUS2GfupPmcftu2RYJqZiMJmmbBT5M1XDffjUtRUzP4W3cBHsrvkfOFdQ71hAreNQP6g==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-gnu": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-14.1.0.tgz",
+ "integrity": "sha512-RHo7Tcj+jllXUbK7xk2NyIDod3YcCPDZxj1WLIYxd709BQ7WuRYl3OWUNG+WUfqeQBds6kvZYlc42NJJTNi4tQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-linux-arm64-musl": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-14.1.0.tgz",
+ "integrity": "sha512-v6kP8sHYxjO8RwHmWMJSq7VZP2nYCkRVQ0qolh2l6xroe9QjbgV8siTbduED4u0hlk0+tjS6/Tuy4n5XCp+l6g==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-arm64-msvc": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-14.1.0.tgz",
+ "integrity": "sha512-o1N5TsYc8f/HpGt39OUQpQ9AKIGApd3QLueu7hXk//2xq5Z9OxmV6sQfNp8C7qYmiOlHYODOGqNNa0e9jvchGQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-ia32-msvc": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-ia32-msvc/-/swc-win32-ia32-msvc-14.1.0.tgz",
+ "integrity": "sha512-XXIuB1DBRCFwNO6EEzCTMHT5pauwaSj4SWs7CYnME57eaReAKBXCnkUE80p/pAZcewm7hs+vGvNqDPacEXHVkw==",
+ "cpu": [
+ "ia32"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@next/swc-win32-x64-msvc": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-14.1.0.tgz",
+ "integrity": "sha512-9WEbVRRAqJ3YFVqEZIxUqkiO8l1nool1LmNxygr5HWF8AcSYsEpneUDhmjUVJEzO2A04+oPtZdombzzPPkTtgg==",
+ "cpu": [
+ "x64"
+ ],
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10"
+ }
}
}
}
diff --git a/package.json b/package.json
index 6a46c186..3a163f33 100644
--- a/package.json
+++ b/package.json
@@ -11,6 +11,7 @@
},
"dependencies": {
"@danmarshall/deckgl-typings": "^4.9.13",
+ "@emotion/is-prop-valid": "^1.2.2",
"@tanstack/react-table": "^8.11.8",
"@types/styled-components": "^5.1.34",
"@types/wikidata-sdk": "^6.1.0",
@@ -19,14 +20,20 @@
"babel-plugin-styled-components": "^2.1.4",
"chart.js": "^4.4.1",
"deck.gl": "^9.0.6",
+ "i18next": "^23.10.1",
+ "i18next-fs-backend": "^2.3.1",
"jsdom": "^24.0.0",
"md5": "^2.3.0",
"next": "14.1.0",
+ "next-i18next": "^15.2.0",
"nextjs-progressbar": "^0.0.16",
"react": "18.2.0",
"react-chartjs-2": "^5.2.0",
"react-cookie-consent": "^9.0.0",
+ "react-i18next": "^14.1.0",
"react-mailchimp-subscribe": "^2.1.3",
+ "react-markdown": "^9.0.1",
+ "rehype-external-links": "^3.0.0",
"styled-components": "^6.1.8",
"vite": "^5.0.12"
},
diff --git a/pages/404.tsx b/pages/404.tsx
index 0c62be58..c42af2ed 100644
--- a/pages/404.tsx
+++ b/pages/404.tsx
@@ -1,5 +1,8 @@
import router from 'next/router'
import styled from 'styled-components'
+import { useTranslation } from 'next-i18next'
+import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
+import { GetStaticProps } from 'next'
import { H1 } from '../components/Typography'
const Wrapper = styled.div`
@@ -29,12 +32,20 @@ function FourOhFour() {
router.push('/')
}
+ const { t } = useTranslation()
+
return (
- 404 - Sidan hittades inte
-
+ {t('common:errors.notFound')}
+
)
}
+export const getStaticProps: GetStaticProps = async ({ locale }) => ({
+ props: {
+ ...await serverSideTranslations(locale as string, ['common']),
+ },
+})
+
export default FourOhFour
diff --git a/pages/[dataset]/[dataView]/index.tsx b/pages/[dataset]/[dataView]/index.tsx
index 00409ab5..1478eb6a 100644
--- a/pages/[dataset]/[dataView]/index.tsx
+++ b/pages/[dataset]/[dataView]/index.tsx
@@ -3,9 +3,11 @@ import { ParsedUrlQuery } from 'querystring'
import { Municipality as TMunicipality } from '../../../utils/types'
import StartPage from '../..'
import { ClimateDataService } from '../../../utils/climateDataService'
-import { isValidDataset, isValidDataView, normalizeString } from '../../../utils/shared'
+import { isValidDataView, normalizeString } from '../../../utils/shared'
import Layout from '../../../components/Layout'
import Footer from '../../../components/Footer/Footer'
+import { getDataDescriptions } from '../../../utils/datasetDefinitions'
+import { getServerSideI18n } from '../../../utils/getServerSideI18n'
interface Params extends ParsedUrlQuery {
dataset: string
@@ -14,9 +16,13 @@ interface Params extends ParsedUrlQuery {
const cache = new Map()
-export const getServerSideProps: GetServerSideProps = async ({ params, res }) => {
+export const getServerSideProps: GetServerSideProps = async ({
+ params, res, locale,
+}) => {
const dataset = (params as Params).dataset as string
const dataView = (params as Params).dataView as string
+ const { t, _nextI18Next } = await getServerSideI18n(locale as string, ['common', 'startPage'])
+ const { isValidDataset } = getDataDescriptions(locale as string, t)
const normalizedDataset = normalizeString(dataset)
const normalizedDataView = normalizeString(dataView)
@@ -48,6 +54,7 @@ export const getServerSideProps: GetServerSideProps = async ({ params, res }) =>
props: {
municipalities,
normalizedDataset,
+ _nextI18Next,
},
}
diff --git a/pages/[dataset]/index.tsx b/pages/[dataset]/index.tsx
index 3738d46a..9c085dea 100644
--- a/pages/[dataset]/index.tsx
+++ b/pages/[dataset]/index.tsx
@@ -1,15 +1,19 @@
import { GetServerSideProps } from 'next'
import { ParsedUrlQuery } from 'querystring'
-import { defaultDataView } from '../../utils/datasetDefinitions'
-import { isValidDataset, normalizeString } from '../../utils/shared'
+
+import { defaultDataView, getDataDescriptions } from '../../utils/datasetDefinitions'
+import { normalizeString } from '../../utils/shared'
+import { getServerSideI18n } from '../../utils/getServerSideI18n'
interface Params extends ParsedUrlQuery {
id: string
}
-export const getServerSideProps: GetServerSideProps = async ({ params }) => {
+export const getServerSideProps: GetServerSideProps = async ({ params, locale }) => {
const dataset = (params as Params).dataset as string
const normalizedDataset = normalizeString(dataset)
+ const { t } = await getServerSideI18n(locale as string, ['common'])
+ const { isValidDataset } = getDataDescriptions(locale as string, t)
if (!isValidDataset(normalizedDataset)) {
return {
diff --git a/pages/_app.tsx b/pages/_app.tsx
index 0fc5c456..f9d7e942 100644
--- a/pages/_app.tsx
+++ b/pages/_app.tsx
@@ -3,11 +3,16 @@ import type { AppProps } from 'next/app'
import Head from 'next/head'
import Script from 'next/script'
import CookieConsent from 'react-cookie-consent'
-import { NextPage } from 'next'
+import { GetStaticProps, NextPage } from 'next'
import { ReactElement, ReactNode } from 'react'
+import { appWithTranslation, useTranslation } from 'next-i18next'
+import { serverSideTranslations } from 'next-i18next/serverSideTranslations'
+import { StyleSheetManager } from 'styled-components'
+import isPropValid from '@emotion/is-prop-valid'
import '../styles/globals.css'
import Theme, { colorTheme } from '../Theme'
+import nextI18nextConfig from '../next-i18next.config'
type NextPageWithLayout = NextPage & {
getLayout?: (page: ReactElement) => ReactNode
@@ -19,8 +24,10 @@ type AppPropsWithLayout = AppProps & {
function MyApp({ Component, pageProps }: AppPropsWithLayout) {
const getLayout = Component.getLayout ?? ((page) => page)
+ const { t } = useTranslation()
+
return (
- <>
+