- +
{ + // Log the error to an error reporting service + console.error(error); + }, [error]); + + return ( +
+ +
+ ); +} diff --git a/src/app/[locale]/map/observation/[path]/details/[id]/layout.tsx b/src/app/[locale]/map/observation/[path]/details/[id]/layout.tsx new file mode 100644 index 0000000..2c491a1 --- /dev/null +++ b/src/app/[locale]/map/observation/[path]/details/[id]/layout.tsx @@ -0,0 +1,32 @@ +import { ReactNode } from 'react'; +import { getTranslations } from 'next-intl/server'; + +import { ScrollArea } from '@/components/ui/scroll-area'; + +type Props = { + children: ReactNode; +}; + +type GenerateMetaDataProps = { + params: { + path: string; + id: number; + }; +}; + +export const generateMetadata = async ({ + params: { path, id }, +}: GenerateMetaDataProps) => { + const t = await getTranslations('observation'); + return { + title: `${t('title')} ${id} - ${path}`, + }; +}; + +export default function ObservationDetailsLayout({ children }: Props) { + return ( + +
{children}
+
+ ); +} diff --git a/src/app/[locale]/map/observation/[path]/details/[id]/loading.tsx b/src/app/[locale]/map/observation/[path]/details/[id]/loading.tsx new file mode 100644 index 0000000..bc1ecf8 --- /dev/null +++ b/src/app/[locale]/map/observation/[path]/details/[id]/loading.tsx @@ -0,0 +1,14 @@ +import { useTranslations } from 'next-intl'; + +import { Icons } from '@/components/icons'; + +export default function Loading() { + const t = useTranslations(); + return ( + + ); +} diff --git a/src/app/[locale]/map/observation/[path]/details/[id]/not-found.tsx b/src/app/[locale]/map/observation/[path]/details/[id]/not-found.tsx new file mode 100644 index 0000000..a1a05b1 --- /dev/null +++ b/src/app/[locale]/map/observation/[path]/details/[id]/not-found.tsx @@ -0,0 +1,24 @@ +import Link from 'next/link'; +import { getTranslations } from 'next-intl/server'; + +import { Icons, propsForSVGPresentation } from '@/components/icons'; + +export default async function NotFound() { + const t = await getTranslations(); + return ( +
+
+
+

+ {t('site.notFound')} +

+ + {' '} + {t('details.closePage')} + +
+
+

{t('site.notFound-content')}

+
+ ); +} diff --git a/src/app/[locale]/map/observation/[path]/details/[id]/page.tsx b/src/app/[locale]/map/observation/[path]/details/[id]/page.tsx new file mode 100644 index 0000000..f955f96 --- /dev/null +++ b/src/app/[locale]/map/observation/[path]/details/[id]/page.tsx @@ -0,0 +1,19 @@ +import { notFound } from 'next/navigation'; +import { getObservationDetails } from '@/api/customObservations'; + +import ObservationDetailsPageUI from '@/components/observation.page'; + +type Props = { + params: { + path: string; + id: number; + }; +}; + +export default async function DetailsPage({ params: { path, id } }: Props) { + const content = await getObservationDetails(path, `${id}`); + if (content === null) { + notFound(); + } + return ; +} diff --git a/src/app/[locale]/map/observation/[path]/error.tsx b/src/app/[locale]/map/observation/[path]/error.tsx new file mode 100644 index 0000000..71bbf2b --- /dev/null +++ b/src/app/[locale]/map/observation/[path]/error.tsx @@ -0,0 +1,19 @@ +'use client'; + +// Error components must be Client Components +import { useEffect } from 'react'; + +import ErrorMessage from '@/components/error-message'; + +export default function Error({ error }: { error: Error }) { + useEffect(() => { + // Log the error to an error reporting service + console.error(error); + }, [error]); + + return ( +
+ +
+ ); +} diff --git a/src/app/[locale]/map/observation/[path]/layout.tsx b/src/app/[locale]/map/observation/[path]/layout.tsx index 8bb7cad..283a625 100644 --- a/src/app/[locale]/map/observation/[path]/layout.tsx +++ b/src/app/[locale]/map/observation/[path]/layout.tsx @@ -1,4 +1,5 @@ import { ReactNode } from 'react'; +import { DEFAULT_OBSERVATION_TYPES } from '@/constants'; import { getTranslations } from 'next-intl/server'; import { ScrollArea } from '@/components/ui/scroll-area'; @@ -16,15 +17,17 @@ export const generateMetadata = async ({ }: generateMetadataProps) => { const t = await getTranslations('observation'); - return { - title: `${t('title')} ${t(`${path}.label`)}`, - }; + if (DEFAULT_OBSERVATION_TYPES.includes(path)) { + return { + title: `${t('title')} ${t(`${path}.label`)}`, + }; + } else { + return { + title: `${t('title')} ${path}`, + }; + } }; export default function ObservationLayout({ children }: Props) { - return ( - -
{children}
-
- ); + return {children}; } diff --git a/src/app/[locale]/map/observation/[path]/page.tsx b/src/app/[locale]/map/observation/[path]/page.tsx index bdb710a..d7a1baf 100644 --- a/src/app/[locale]/map/observation/[path]/page.tsx +++ b/src/app/[locale]/map/observation/[path]/page.tsx @@ -1,11 +1,15 @@ +import { getObservation } from '@/api/customObservations'; import { getObservationJsonSchema, handleSubmitObservation, } from '@/api/observations'; +import { handleSubmitCustomObservation } from '@/api/postObservation'; +import { DEFAULT_OBSERVATION_TYPES } from '@/constants'; import { JSONSchema } from 'json-schema-yup-transformer/dist/schema'; import { getTranslations } from 'next-intl/server'; import ButtonClose from '@/components/button-close'; +import CustomObservationForm from '@/components/custom-observation-form'; import ObservationForm from '@/components/observation-form'; type Props = { @@ -16,25 +20,54 @@ type Props = { export default async function ObservationPage({ params: { path } }: Props) { const t = await getTranslations('observation'); - const jsonSchema = (await getObservationJsonSchema(path)) as JSONSchema; + let jsonSchema; + let observation; + + const isDefaultObservation = DEFAULT_OBSERVATION_TYPES.includes(path); + + if (isDefaultObservation) { + observation = {}; + jsonSchema = (await getObservationJsonSchema(path)) as JSONSchema; + } else { + observation = await getObservation(path); + jsonSchema = observation?.json_schema_form as JSONSchema; + } + + if (!isDefaultObservation && !observation) { + return null; + } return ( -
-
+
+

- {t(`${path}.label`)} + {isDefaultObservation ? t(`${path}.label`) : observation.label}

-

{t(`${path}.description`)}

+

+ {isDefaultObservation + ? t(`${path}.description`) + : observation.description} +

- + {isDefaultObservation ? ( + + ) : ( + + )}
); } diff --git a/src/app/[locale]/map/stations/[id]/error.tsx b/src/app/[locale]/map/stations/[id]/error.tsx new file mode 100644 index 0000000..71bbf2b --- /dev/null +++ b/src/app/[locale]/map/stations/[id]/error.tsx @@ -0,0 +1,19 @@ +'use client'; + +// Error components must be Client Components +import { useEffect } from 'react'; + +import ErrorMessage from '@/components/error-message'; + +export default function Error({ error }: { error: Error }) { + useEffect(() => { + // Log the error to an error reporting service + console.error(error); + }, [error]); + + return ( +
+ +
+ ); +} diff --git a/src/app/[locale]/map/stations/[id]/layout.tsx b/src/app/[locale]/map/stations/[id]/layout.tsx new file mode 100644 index 0000000..ce9e578 --- /dev/null +++ b/src/app/[locale]/map/stations/[id]/layout.tsx @@ -0,0 +1,38 @@ +import { ReactNode } from 'react'; +import { getDetails } from '@/api/details'; +import { getTranslations } from 'next-intl/server'; + +import { ScrollArea } from '@/components/ui/scroll-area'; + +type Props = { + children: ReactNode; +}; + +type GenerateMetaDataProps = { + params: { + details: string; + id: number; + }; +}; + +export const generateMetadata = async ({ + params: { id }, +}: GenerateMetaDataProps) => { + const t = await getTranslations('site'); + const content = await getDetails('stations', id); + if (content === null) { + return; + } + return { + title: `${content.label} - ${t('title')}`, + description: content.description, + }; +}; + +export default function StationsLayout({ children }: Props) { + return ( + +
{children}
+
+ ); +} diff --git a/src/app/[locale]/map/stations/[id]/loading.tsx b/src/app/[locale]/map/stations/[id]/loading.tsx new file mode 100644 index 0000000..bc1ecf8 --- /dev/null +++ b/src/app/[locale]/map/stations/[id]/loading.tsx @@ -0,0 +1,14 @@ +import { useTranslations } from 'next-intl'; + +import { Icons } from '@/components/icons'; + +export default function Loading() { + const t = useTranslations(); + return ( + + ); +} diff --git a/src/app/[locale]/map/stations/[id]/not-found.tsx b/src/app/[locale]/map/stations/[id]/not-found.tsx new file mode 100644 index 0000000..a1a05b1 --- /dev/null +++ b/src/app/[locale]/map/stations/[id]/not-found.tsx @@ -0,0 +1,24 @@ +import Link from 'next/link'; +import { getTranslations } from 'next-intl/server'; + +import { Icons, propsForSVGPresentation } from '@/components/icons'; + +export default async function NotFound() { + const t = await getTranslations(); + return ( +
+
+
+

+ {t('site.notFound')} +

+ + {' '} + {t('details.closePage')} + +
+
+

{t('site.notFound-content')}

+
+ ); +} diff --git a/src/app/[locale]/map/stations/[id]/page.tsx b/src/app/[locale]/map/stations/[id]/page.tsx new file mode 100644 index 0000000..81a8cdc --- /dev/null +++ b/src/app/[locale]/map/stations/[id]/page.tsx @@ -0,0 +1,28 @@ +import { notFound } from 'next/navigation'; +import { Observation, getObservation } from '@/api/customObservations'; +import { getStation } from '@/api/stations'; + +import StationPageUI from '@/components/station.page'; + +type Props = { + params: { + station: string; + id: number; + }; +}; + +export default async function StationsPage({ params: { id } }: Props) { + const content = await getStation(id); + if (content === null) { + notFound(); + } + const observationTypes = await Promise.all( + content.customContributionTypes?.map(id => getObservation(`${id}`)), + ); + return ( + + ); +} diff --git a/src/app/api/revalidate/[tag]/route.ts b/src/app/api/revalidate/[tag]/route.ts new file mode 100644 index 0000000..520ad3e --- /dev/null +++ b/src/app/api/revalidate/[tag]/route.ts @@ -0,0 +1,13 @@ +import { revalidateTag } from 'next/cache'; +import { NextRequest, NextResponse } from 'next/server'; + +export async function POST( + request: NextRequest, + { params }: { params: { tag: string } }, +) { + const tag = params.tag; + + revalidateTag(tag); + + return NextResponse.json({ revalidated: tag }); +} diff --git a/src/components/conditional-field.tsx b/src/components/conditional-field.tsx index 39cc04a..de669e2 100644 --- a/src/components/conditional-field.tsx +++ b/src/components/conditional-field.tsx @@ -24,5 +24,7 @@ export default function ConditionalField(props: Props) { }; }, [props.name, props.properties.type, register, unregister]); - return ; + return ( + + ); } diff --git a/src/components/custom-observation-form.tsx b/src/components/custom-observation-form.tsx new file mode 100644 index 0000000..3b601a7 --- /dev/null +++ b/src/components/custom-observation-form.tsx @@ -0,0 +1,220 @@ +'use client'; + +import React, { + FormEvent, + useCallback, + useEffect, + useMemo, + useState, +} from 'react'; +import { useRouter, useSearchParams } from 'next/navigation'; +import { Station, getStations } from '@/api/stations'; +import { useMapContext } from '@/context/map'; +import { + DataValidator, + EditorState, + ReactJSONForm, +} from '@bhch/react-json-form'; +import { useTranslations } from 'next-intl'; + +import { Icons, propsForSVGPresentation } from './icons'; +import { Button } from './ui/button'; + +const CustomObservationForm = ({ + schema, + id, + stations, + passwordProtected, + handleSubmitObservation, +}: { + id?: number; + schema: any; + stations?: number[]; + passwordProtected: boolean; + handleSubmitObservation: Function; +}) => { + const t = useTranslations('observation'); + const params = useSearchParams(); + const router = useRouter(); + const { observationCoordinates } = useMapContext(); + + const [isLoading, setLoading] = useState(false); + const [serverErrors, setServerErrors] = useState(false); + const [stationsDetails, setStationsDetails] = useState([]); + + const [editorState, setEditorState] = useState(() => + EditorState.create(schema, {}), + ); + + const [errorMap, setErrorMap] = useState({}); + + const [lng, lat] = observationCoordinates?.coordinates ?? []; + + useEffect(() => { + const fetchStations = async () => { + const details = await getStations(); + setStationsDetails(details); + }; + fetchStations(); + }, []); + + const handleSubmit = useCallback( + async (event: FormEvent) => { + event.preventDefault(); + const validator = new DataValidator(schema); + const validation = validator.validate(editorState.state.data); + const formData = new FormData(event.target as HTMLFormElement); + + const isValid = validation.isValid; + if (isValid && id) { + setLoading(true); + const contributedAt = new Date( + `${formData.get('contributed_at_date')} ${formData.get( + 'contributed_at_time', + )}`, + ); + const result = await handleSubmitObservation( + { + ...(formData.get('lat') && formData.get('lng') + ? { geom: `POINT(${formData.get('lng')} ${formData.get('lat')})` } + : {}), + ...(formData.get('station') + ? { station: formData.get('station') } + : {}), + ...(formData.get('observation-password') + ? { password: formData.get('observation-password') } + : {}), + contributed_at: contributedAt.toISOString(), + ...editorState.state.data, + }, + id, + formData, + ); + setLoading(false); + if (!result.error) { + router.push(`/map?${params.toString()}`); + } else { + console.error(result); + setServerErrors(result.message); + } + } else { + const errorMap = validation.errorMap; + setErrorMap(errorMap); + } + }, + [ + schema, + editorState.state.data, + id, + handleSubmitObservation, + router, + params, + ], + ); + + return ( +
+ {stations?.length && stations?.length > 0 ? ( +
+ + +
+ ) : ( + <> +
+
+ + +
+
+ +
+
+ + +
+
{t('coordinatesHelptext')}
+
+ + )} + {passwordProtected && ( +
+
+ + +
+
+ )} +
+
+ + +
+
+
+
+ + +
+
+ + +
+ {Array.from({ length: 5 }).map((_, index) => ( +
+
+ +
+ +
+ ))} +
+

{t('gdpr')}

+ + {Object.entries(serverErrors).map(([type, message]) => ( +
+ + {type}: {message} + +
+ ))} + + + + ); +}; + +export default CustomObservationForm; diff --git a/src/components/details.page.tsx b/src/components/details.page.tsx index 2111a09..0ed6e2d 100644 --- a/src/components/details.page.tsx +++ b/src/components/details.page.tsx @@ -1,5 +1,6 @@ import { Attachement } from '@/api/settings'; import { LatLngTuple } from 'leaflet'; +import { useTranslations } from 'next-intl'; import { convertAttachementsToImages } from '@/lib/utils'; @@ -7,6 +8,7 @@ import ButtonCenterView from './button-center-view'; import ButtonClose from './button-close'; import Carousel from './carousel'; import { MetadataList } from './metadata-list'; +import LinkAsButton from './ui/link-as-button'; type Props = { content: { @@ -16,6 +18,7 @@ type Props = { length?: number; descent?: number; flow?: string; + url?: string; geometryCenter?: { type: 'Point'; coordinates: [number, number]; @@ -31,9 +34,10 @@ type Props = { }; export default function DetailsPageUI({ content }: Props) { + const t = useTranslations('details'); return (
- {content.attachments.length > 0 && ( + {content?.attachments?.length > 0 && (
+ {content?.url && ( + + {t('link')} + + )}
); } diff --git a/src/components/map-filters.tsx b/src/components/map-filters.tsx index 5ec513d..c438034 100644 --- a/src/components/map-filters.tsx +++ b/src/components/map-filters.tsx @@ -1,3 +1,5 @@ +'use client'; + import { useCallback } from 'react'; import { useMapContext } from '@/context/map'; import { useTranslations } from 'next-intl'; @@ -26,14 +28,17 @@ export default function MapFilters() { if ( settings === null || - settings.layersTree.length === 0 || + settings?.layersTree?.length === 0 || layers === null ) { return (

{t('site.loading')}

- {Array.from({ length: 4 }, () => ( -
+ {Array.from({ length: 4 }, (_, index) => ( +
@@ -43,8 +48,8 @@ export default function MapFilters() { } const [grouped, [notGrouped]] = partition( - settings.layersTree, - layer => layer.label !== null, + settings?.layersTree, + layer => layer?.label !== null, ); const activatedLayers = layers @@ -53,13 +58,13 @@ export default function MapFilters() { return ( <> - {grouped.length !== 0 && ( + {grouped?.length !== 0 && ( `item-${index}`)} + defaultValue={grouped?.map((_, index) => `item-${index}`)} > - {grouped.map((group, index) => ( + {grouped?.map((group, index) => ( {group.label} @@ -94,9 +99,9 @@ export default function MapFilters() { ))} )} - {notGrouped.layers.length !== 0 && ( + {notGrouped?.layers.length !== 0 && (
    - {notGrouped.layers.map(layer => ( + {notGrouped?.layers.map(layer => (
  • ; +type Props = HTMLAttributes & { + observations: Observation[]; +}; -export function MapSidebar({ className, ...props }: Props) { +export function MapSidebar({ className, observations, ...props }: Props) { return (
    - +
    diff --git a/src/components/map.tsx b/src/components/map.tsx index c8f70c4..b422f1a 100644 --- a/src/components/map.tsx +++ b/src/components/map.tsx @@ -1,8 +1,9 @@ 'use client'; -import { useEffect } from 'react'; +import { useEffect, useState } from 'react'; import { useParams, usePathname, useSearchParams } from 'next/navigation'; import ResetViewControl from '@20tab/react-leaflet-resetview'; +import { getObservation } from '@/api/customObservations'; import { useMapContext } from '@/context/map'; import L, { LeafletEvent } from 'leaflet'; import { useTranslations } from 'next-intl'; @@ -21,9 +22,13 @@ import { ObservationMarker } from '@/components/map/observation-marker'; import 'leaflet/dist/leaflet.css'; import 'leaflet.locatecontrol'; import 'leaflet.locatecontrol/dist/L.Control.Locate.min.css'; +import { DEFAULT_OBSERVATION_TYPES } from '@/constants'; + import SearchMapBadge from './search-map-badge'; export default function SearchMap() { + const [hasObservationMarker, setHasObservationMarker] = useState(false); + const params = useParams(); const searchParams = useSearchParams(); useEffect(() => { @@ -35,6 +40,29 @@ export default function SearchMap() { const { settings, layers, setMap } = useMapContext(); const t = useTranslations('map'); + useEffect(() => { + const getObs = async (id: string) => { + const obs = await getObservation(id); + if (obs?.stations?.length === 0) setHasObservationMarker(true); + }; + + if (pathName.startsWith('/map/observation')) { + const observationType = pathName.match( + /\/map\/observation\/([^?/]+)/, + )?.[1]; + + if (!observationType) return; + + if (DEFAULT_OBSERVATION_TYPES.includes(observationType)) { + setHasObservationMarker(true); + } else { + getObs(observationType); + } + } else { + setHasObservationMarker(false); + } + }, [pathName]); + if (settings === null) { return null; } @@ -77,7 +105,7 @@ export default function SearchMap() { {baseLayers.map(({ id, label, ...layer }, index) => ( - + ))} @@ -93,7 +121,7 @@ export default function SearchMap() { - {pathName.startsWith('/map/observation') && } + {hasObservationMarker && } ); } diff --git a/src/components/map/geometry-tooltip.tsx b/src/components/map/geometry-tooltip.tsx index 3da9745..a98efea 100644 --- a/src/components/map/geometry-tooltip.tsx +++ b/src/components/map/geometry-tooltip.tsx @@ -12,11 +12,18 @@ export const GeometryTooltip = ({ properties: GeoJsonProperties; layer: Layer; }) => { - if (properties === null || (!properties.name && !properties.category)) { + if ( + properties === null || + (!properties.name && !properties.category && !properties.label) + ) { return null; } if (layer.type === undefined || !layer.url || !properties.id) { - return {properties.name ?? properties.category}; + return ( + + {properties.name ?? properties.category ?? properties.label} + + ); } return (

    - {properties.name ?? properties.category} + {properties.name ?? properties.category ?? properties.label}

    @@ -25,36 +34,27 @@ export function ObservationCTA() { {t('labelButton')}
      - - {t('damages.shortDescription')} - - - {t('fauna-flora.shortDescription')} - - - {t('quantity.shortDescription')} - - - {t('quality.shortDescription')} - - - {t('landscape.shortDescription')} - + {observations?.map(observation => ( + + {observation.description ?? ''} + + ))} + {observations?.length === 0 && + DEFAULT_OBSERVATION_TYPES.map(observation => ( + + {t(`${observation}.shortDescription`)} + + ))}
    diff --git a/src/components/observation.page.tsx b/src/components/observation.page.tsx new file mode 100644 index 0000000..0aabcae --- /dev/null +++ b/src/components/observation.page.tsx @@ -0,0 +1,71 @@ +import { ObservationDetails } from '@/api/customObservations'; +import { LatLngTuple } from 'leaflet'; +import { useTranslations } from 'next-intl'; + +import { convertAttachementsToImages } from '@/lib/utils'; + +import ButtonCenterView from './button-center-view'; +import ButtonClose from './button-close'; +import Carousel from './carousel'; + +type Props = { + content: ObservationDetails; +}; + +export default function ObservationDetailsPageUI({ content }: Props) { + const t = useTranslations('observation'); + + const date = new Date(content.contributedAt); + + return ( +
    + {content.attachments && content.attachments?.length > 0 && ( +
    + +
    + )} +
    +

    + {t('title')} {content.id} - {content.label} +

    +
    + {content.geometry && ( + + )} + +
    +
    + +
    {content.description}
    +
    + {`${t( + 'contributedAt', + )}:`} + + {date.toLocaleString()} + +
    +
      + {content.values + .filter(value => value.label) + .map(value => ( +
    • + + {value.label}: + + + {value.value} + +
    • + ))} +
    +
    + ); +} diff --git a/src/components/station-contribution-list.tsx b/src/components/station-contribution-list.tsx new file mode 100644 index 0000000..21f82bc --- /dev/null +++ b/src/components/station-contribution-list.tsx @@ -0,0 +1,68 @@ +'use client'; + +import Link from 'next/link'; +import { useSearchParams } from 'next/navigation'; +import { Observation } from '@/api/customObservations'; +import { StationObservation, StationObservations } from '@/api/stations'; +import { useTranslations } from 'next-intl'; + +import { cn } from '@/lib/utils'; + +import { Icons } from './icons'; + +const getObservationLabel = ( + observation: StationObservation, + observationTypes: Observation[], +) => { + const date = new Date(observation.contributedAt); + const type = observationTypes.find(e => e.id === observation.customType); + return { + title: `${observation.id} - ${type?.label}`, + subtitle: date.toLocaleString(), + }; +}; + +export const StationContributionList = ({ + observations, + types, +}: { + observations: StationObservations; + types: Observation[]; +}) => { + const params = useSearchParams(); + const t = useTranslations('details'); + if (observations?.length <= 0) return null; + + return ( + <> +

    {t('observations')} :

    +
      + {observations.map(observation => ( +
    • + + + + {getObservationLabel(observation, types).title} + + + {getObservationLabel(observation, types).subtitle} + + + + +
    • + ))} +
    + + ); +}; diff --git a/src/components/station-contribution-types-list.tsx b/src/components/station-contribution-types-list.tsx new file mode 100644 index 0000000..1506b3f --- /dev/null +++ b/src/components/station-contribution-types-list.tsx @@ -0,0 +1,53 @@ +'use client'; + +import Link from 'next/link'; +import { useSearchParams } from 'next/navigation'; +import { Observation } from '@/api/customObservations'; +import { useTranslations } from 'next-intl'; + +import { cn } from '@/lib/utils'; + +import { Icons } from './icons'; + +export const StationContributionTypesList = ({ + types, + ids, + station, +}: { + types: Observation[]; + ids: number[]; + station: number; +}) => { + const params = useSearchParams(); + const t = useTranslations('details'); + if (types?.length <= 0) return null; + + return ( + <> +

    {t('observationTypes')} :

    +
      + {ids.map(id => ( +
    • + type.id === id)?.label} + > + + + {types.find(type => type.id === id)?.label} + + + {types.find(type => type.id === id)?.description ?? ''} + + + + +
    • + ))} +
    + + ); +}; diff --git a/src/components/station.page.tsx b/src/components/station.page.tsx new file mode 100644 index 0000000..9992c88 --- /dev/null +++ b/src/components/station.page.tsx @@ -0,0 +1,61 @@ +import { Observation } from '@/api/customObservations'; +import { Station } from '@/api/stations'; +import { LatLngTuple } from 'leaflet'; +import { useTranslations } from 'next-intl'; + +import ButtonCenterView from './button-center-view'; +import ButtonClose from './button-close'; +import { StationContributionList } from './station-contribution-list'; +import { StationContributionTypesList } from './station-contribution-types-list'; +import LinkAsButton from './ui/link-as-button'; + +type Props = { + content: Station; + observationTypes: Observation[]; +}; + +export default function StationPageUI({ content, observationTypes }: Props) { + const observations = content.observations ?? []; + const t = useTranslations('details'); + return ( +
    +
    +

    + {content.label} +

    +
    + {content.geometry && ( + + )} + +
    +
    + +
    + {content.description.split('\n').map(e => ( +

    {e}

    + ))} + {content?.url && ( + + {t('link')} + + )} +
    + + +
    + ); +} diff --git a/src/constants.ts b/src/constants.ts new file mode 100644 index 0000000..d2763ee --- /dev/null +++ b/src/constants.ts @@ -0,0 +1,7 @@ +export const DEFAULT_OBSERVATION_TYPES = [ + 'damages', + 'fauna-flora', + 'quantity', + 'quality', + 'landscape', +]; diff --git a/src/styles/globals.css b/src/styles/globals.css index 4c461a1..53f1113 100644 --- a/src/styles/globals.css +++ b/src/styles/globals.css @@ -77,7 +77,7 @@ body { @apply bg-background text-foreground; - font-feature-settings: "rlig" 1, "calt" 1; + font-feature-settings: 'rlig' 1, 'calt' 1; } } @@ -98,7 +98,7 @@ body .leaflet-container a.leaflet-popup-close-button { display: none; } -.tns-horizontal.tns-subpixel>.tns-item { +.tns-horizontal.tns-subpixel > .tns-item { vertical-align: middle !important; } @@ -133,9 +133,13 @@ just hide all tooltips that aren't the last one display: none; } - .skeleton-animation { - background: linear-gradient(90deg, hsl(var(--muted-foreground)) 0%, hsl(var(--foreground)) 50%, hsl(var(--muted-foreground)) 100%); + background: linear-gradient( + 90deg, + hsl(var(--muted-foreground)) 0%, + hsl(var(--foreground)) 50%, + hsl(var(--muted-foreground)) 100% + ); background-size: 300% 100%; opacity: 0.2; animation: skeletonator 4s ease infinite; @@ -234,3 +238,73 @@ just hide all tooltips that aren't the last one .is-WYSIWYG .image figcaption { @apply text-sm mt-1 text-center; } + +/* JSON React Form */ + +.rjf-input-group > input, +.rjf-input-group > textarea, +.rjf-input-group > select { + background-color: hsl(var(--input)); + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 0.75rem; + padding-right: 0.75rem; + border-radius: calc(var(--radius) - 2px); + margin-top: 0.25rem; +} +.rjf-input-group > input::file-selector-button { + background: transparent; + border-width: 0; + font-size: 0.875rem; + font-weight: 500; +} +.rjf-input-group { + display: flex; + flex-direction: column; +} +.rjf-form-row label { + line-height: 1; + font-weight: 500; + font-size: 0.875rem; + color: hsl(var(--foreground)); +} +.rjf-form-row { + margin-top: 2rem; + margin-bottom: 2rem; +} +.rjf-help-text { + color: hsl(var(--muted-foreground)); + font-size: 0.875rem; + line-height: 1.25rem; + margin-top: 0.25rem; +} +.rjf-required::after { + content: '*'; + margin-left: 0.25em; +} + +.rjf-check-input { + display: flex; + flex-direction: column; +} + +.rjf-radio-option { + font-weight: 400 !important; + font-size: 1rem !important; +} + +.rjf-radio-option:not(:last-of-type) { + margin-bottom: 0.25rem; +} + +.rjf-check-input > label:first-child { + margin-bottom: 0.75rem; +} + +.rjf-error-text { + font-weight: 500; + font-size: 0.875rem; + line-height: 1.25rem; + margin-top: 0.25rem; + color: hsl(var(--destructive)); +} diff --git a/translations/fr.json b/translations/fr.json index 02ee7c0..89d0808 100644 --- a/translations/fr.json +++ b/translations/fr.json @@ -7,7 +7,10 @@ "km": "km", "kilometers": "kilomètres", "m": "m", - "meters": "mètres" + "meters": "mètres", + "observationTypes": "Types d'observations", + "observations": "Observations", + "link": "Voir le site associé" }, "home": { "title": "Sentinelle des rivières : j'observe, je protège", @@ -25,8 +28,15 @@ "coordinatesHelptext": "Indiquez la position de l'observation sur la carte", "submit": "Soumettre votre observation", "title": "Observation", + "password": "Mot de passe", + "contributedAt": "Observé le", + "station": "Station", "labelButton": "Ajouter une observation", "photoLabel": "Photo", + "lng": "Longitude", + "lat": "Latitude", + "date": "Date de l'observation", + "time": "Heure de l'observation", "quality": { "label": "Qualité", "description": "Apportez des observations sur les propriétés des cours d'eau (pollution, température, développement algal, etc.)", diff --git a/yarn.lock b/yarn.lock index 5d4044e..89e460e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -27,13 +27,13 @@ dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" - integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== +"@babel/code-frame@^7.23.5", "@babel/code-frame@^7.24.1": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.2.tgz#718b4b19841809a58b29b68cde80bc5e1aa6d9ae" + integrity sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ== dependencies: - "@babel/highlight" "^7.23.4" - chalk "^2.4.2" + "@babel/highlight" "^7.24.2" + picocolors "^1.0.0" "@babel/compat-data@^7.21.4": version "7.21.4" @@ -71,14 +71,14 @@ "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/generator@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.5.tgz#17d0a1ea6b62f351d281350a5f80b87a810c4755" - integrity sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA== +"@babel/generator@^7.24.1": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.4.tgz#1fc55532b88adf952025d5d2d1e71f946cb1c498" + integrity sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw== dependencies: - "@babel/types" "^7.23.5" - "@jridgewell/gen-mapping" "^0.3.2" - "@jridgewell/trace-mapping" "^0.3.17" + "@babel/types" "^7.24.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" jsesc "^2.5.1" "@babel/helper-compilation-targets@^7.21.4": @@ -165,9 +165,9 @@ integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== "@babel/helper-string-parser@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83" - integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz#f99c36d3593db9540705d0739a1f10b5e20c696e" + integrity sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ== "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" @@ -202,24 +202,25 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.23.4": - version "7.23.4" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b" - integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A== +"@babel/highlight@^7.24.2": + version "7.24.2" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.2.tgz#3f539503efc83d3c59080a10e6634306e0370d26" + integrity sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA== dependencies: "@babel/helper-validator-identifier" "^7.22.20" chalk "^2.4.2" js-tokens "^4.0.0" + picocolors "^1.0.0" "@babel/parser@^7.17.7", "@babel/parser@^7.20.7", "@babel/parser@^7.21.4": version "7.21.4" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz" integrity sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw== -"@babel/parser@^7.22.15", "@babel/parser@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.5.tgz#37dee97c4752af148e1d38c34b856b2507660563" - integrity sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ== +"@babel/parser@^7.24.0", "@babel/parser@^7.24.1": + version "7.24.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.4.tgz#234487a110d89ad5a3ed4a8a566c36b9453e8c88" + integrity sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg== "@babel/runtime@^7.13.10", "@babel/runtime@^7.20.7": version "7.21.0" @@ -230,7 +231,7 @@ "@babel/runtime@^7.15.4": version "7.22.3" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.22.3.tgz#0a7fce51d43adbf0f7b517a71f4c3aaca92ebcbb" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz" integrity sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ== dependencies: regenerator-runtime "^0.13.11" @@ -252,28 +253,28 @@ "@babel/types" "^7.20.7" "@babel/template@^7.22.15": - version "7.22.15" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.0.tgz#c6a524aa93a4a05d66aaf31654258fae69d87d50" + integrity sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA== dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.24.0" + "@babel/types" "^7.24.0" "@babel/traverse@^7.17.3", "@babel/traverse@^7.21.0", "@babel/traverse@^7.21.2", "@babel/traverse@^7.21.4": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.5.tgz#f546bf9aba9ef2b042c0e00d245990c15508e7ec" - integrity sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w== + version "7.24.1" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.1.tgz#d65c36ac9dd17282175d1e4a3c49d5b7988f530c" + integrity sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ== dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.5" + "@babel/code-frame" "^7.24.1" + "@babel/generator" "^7.24.1" "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.5" - "@babel/types" "^7.23.5" - debug "^4.1.0" + "@babel/parser" "^7.24.1" + "@babel/types" "^7.24.0" + debug "^4.3.1" globals "^11.1.0" "@babel/types@^7.17.0", "@babel/types@^7.18.6", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.21.0", "@babel/types@^7.21.2", "@babel/types@^7.21.4": @@ -285,15 +286,20 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" -"@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.5": - version "7.23.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.5.tgz#48d730a00c95109fa4393352705954d74fb5b602" - integrity sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w== +"@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.24.0": + version "7.24.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.0.tgz#3b951f435a92e7333eba05b7566fd297960ea1bf" + integrity sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w== dependencies: "@babel/helper-string-parser" "^7.23.4" "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@bhch/react-json-form@^2.14.1": + version "2.14.1" + resolved "https://registry.yarnpkg.com/@bhch/react-json-form/-/react-json-form-2.14.1.tgz#05bcdd21990831a31841c703e9edda730a9f14e1" + integrity sha512-ymGp9y+1e7QAlhweyJDnmq3QJL2cug4h5pmtZZwv7Y3fMORFwPEgqUYKN4WYGHWHqy2DgAOLk97Hoc4ufOTV5w== + "@eslint-community/eslint-utils@^4.2.0": version "4.4.0" resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" @@ -459,22 +465,41 @@ "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz#dcce6aff74bdf6dad1a95802b69b04a2fcb1fb36" + integrity sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@3.1.0": version "3.1.0" resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + "@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + "@jridgewell/sourcemap-codec@1.4.14": version "1.4.14" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== -"@jridgewell/sourcemap-codec@^1.4.10": +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": version "1.4.15" resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== @@ -487,9 +512,17 @@ "@jridgewell/resolve-uri" "3.1.0" "@jridgewell/sourcemap-codec" "1.4.14" +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@next/env@13.5.4": version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/env/-/env-13.5.4.tgz#777c3af16de2cf2f611b6c8126910062d13d222c" + resolved "https://registry.npmjs.org/@next/env/-/env-13.5.4.tgz" integrity sha512-LGegJkMvRNw90WWphGJ3RMHMVplYcOfRWf2Be3td3sUa+1AaxmsYyANsA+znrGCBjXJNi4XAQlSoEfUxs/4kIQ== "@next/eslint-plugin-next@13.3.0": @@ -501,7 +534,7 @@ "@next/swc-darwin-arm64@13.5.4": version "13.5.4" - resolved "https://registry.yarnpkg.com/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz#241957774fef3f876dc714cfc0ca6f00f561737e" + resolved "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-13.5.4.tgz" integrity sha512-Df8SHuXgF1p+aonBMcDPEsaahNo2TCwuie7VXED4FVyECvdXfRT9unapm54NssV9tF3OQFKBFOdlje4T43VO0w== "@next/swc-darwin-x64@13.5.4": @@ -1082,7 +1115,7 @@ "@swc/helpers@0.5.2": version "0.5.2" - resolved "https://registry.yarnpkg.com/@swc/helpers/-/helpers-0.5.2.tgz#85ea0c76450b61ad7d10a37050289eded783c27d" + resolved "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.2.tgz" integrity sha512-E4KcWTpoLHqwPHLxidpOqQbcrZVgi0rsmmZXUle1jXmJfuIf/UWpczUJ7MZZ5tlxytgJXyp0w4PGkkeLiuIdZw== dependencies: tslib "^2.4.0" @@ -1113,7 +1146,7 @@ "@types/lodash@^4.14.175": version "4.14.195" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.195.tgz#bafc975b252eb6cea78882ce8a7b6bf22a6de632" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== "@types/node@^18.15.12": @@ -1368,7 +1401,7 @@ axobject-query@^3.1.1: b4a@^1.6.4: version "1.6.4" - resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.4.tgz#ef1c1422cae5ce6535ec191baeed7567443f36c9" + resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.4.tgz" integrity sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw== balanced-match@^1.0.0: @@ -1378,7 +1411,7 @@ balanced-match@^1.0.0: base64-js@^1.3.1: version "1.5.1" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== binary-extensions@^2.0.0: @@ -1388,7 +1421,7 @@ binary-extensions@^2.0.0: bl@^4.0.3: version "4.1.0" - resolved "https://registry.yarnpkg.com/bl/-/bl-4.1.0.tgz#451535264182bec2fbbc83a62ab98cf11d9f7b3a" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== dependencies: buffer "^5.5.0" @@ -1429,7 +1462,7 @@ browserslist@^4.21.3, browserslist@^4.21.5: buffer@^5.5.0: version "5.7.1" - resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== dependencies: base64-js "^1.3.1" @@ -1499,7 +1532,7 @@ chokidar@^3.5.3: chownr@^1.1.1: version "1.1.4" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== class-variance-authority@^0.5.2: @@ -1543,7 +1576,7 @@ color-name@^1.0.0, color-name@~1.1.4: color-string@^1.9.0: version "1.9.1" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" @@ -1551,7 +1584,7 @@ color-string@^1.9.0: color@^4.2.3: version "4.2.3" - resolved "https://registry.yarnpkg.com/color/-/color-4.2.3.tgz#d781ecb5e57224ee43ea9627560107c0e0c6463a" + resolved "https://registry.npmjs.org/color/-/color-4.2.3.tgz" integrity sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A== dependencies: color-convert "^2.0.1" @@ -1596,6 +1629,11 @@ damerau-levenshtein@^1.0.8: resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== +data-uri-to-buffer@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + debug@^3.2.7: version "3.2.7" resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" @@ -1603,7 +1641,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.4" resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== @@ -1612,7 +1650,7 @@ debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: decompress-response@^6.0.0: version "6.0.0" - resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc" + resolved "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz" integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ== dependencies: mimic-response "^3.1.0" @@ -1642,7 +1680,7 @@ deep-equal@^2.0.5: deep-extend@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== deep-is@^0.1.3: @@ -1665,7 +1703,7 @@ define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: detect-libc@^2.0.0, detect-libc@^2.0.2: version "2.0.2" - resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d" + resolved "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz" integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw== detect-node-es@^1.1.0: @@ -1726,7 +1764,7 @@ emoji-regex@^9.2.2: end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.4" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0" + resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== dependencies: once "^1.4.0" @@ -1929,7 +1967,7 @@ eslint-plugin-jsx-a11y@^6.5.1: eslint-plugin-prettier@^4.2.1: version "4.2.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" @@ -2060,9 +2098,14 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== +exenv@^1.2.0: + version "1.2.2" + resolved "https://registry.yarnpkg.com/exenv/-/exenv-1.2.2.tgz#2ae78e85d9894158670b03d47bec1f03bd91bb9d" + integrity sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw== + expand-template@^2.0.3: version "2.0.3" - resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c" + resolved "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz" integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg== fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: @@ -2072,12 +2115,12 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: fast-diff@^1.1.2: version "1.3.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-fifo@^1.1.0, fast-fifo@^1.2.0: version "1.3.2" - resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + resolved "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz" integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== fast-glob@^3.2.11, fast-glob@^3.2.5, fast-glob@^3.2.9: @@ -2119,6 +2162,14 @@ fastq@^1.6.0: dependencies: reusify "^1.0.4" +fetch-blob@^3.1.2, fetch-blob@^3.1.4: + version "3.2.0" + resolved "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz" + integrity sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ== + dependencies: + node-domexception "^1.0.0" + web-streams-polyfill "^3.0.3" + file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" @@ -2169,6 +2220,13 @@ foreground-child@^3.1.0: cross-spawn "^7.0.0" signal-exit "^4.0.1" +formdata-polyfill@^4.0.10: + version "4.0.10" + resolved "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz" + integrity sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g== + dependencies: + fetch-blob "^3.1.2" + fraction.js@^4.2.0: version "4.2.0" resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" @@ -2176,7 +2234,7 @@ fraction.js@^4.2.0: fs-constants@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== fs.realpath@^1.0.0: @@ -2186,7 +2244,7 @@ fs.realpath@^1.0.0: fsevents@~2.3.2: version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== function-bind@^1.1.1: @@ -2253,7 +2311,7 @@ get-tsconfig@^4.5.0: github-from-package@0.0.0: version "0.0.0" - resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== glob-parent@^5.1.2, glob-parent@~5.1.2: @@ -2272,7 +2330,7 @@ glob-parent@^6.0.2: glob-to-regexp@^0.4.1: version "0.4.1" - resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + resolved "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== glob@7.1.7: @@ -2434,7 +2492,7 @@ hasown@^2.0.0: ieee754@^1.1.13: version "1.2.1" - resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== ignore@^5.2.0: @@ -2470,7 +2528,7 @@ inherits@2, inherits@^2.0.3, inherits@^2.0.4: ini@~1.3.0: version "1.3.8" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: @@ -2523,7 +2581,7 @@ is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: is-arrayish@^0.3.1: version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz" integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== is-bigint@^1.0.1: @@ -2770,7 +2828,7 @@ json-schema-traverse@^0.4.1: json-schema-yup-transformer@2.0.0-beta.0: version "2.0.0-beta.0" - resolved "https://registry.yarnpkg.com/json-schema-yup-transformer/-/json-schema-yup-transformer-2.0.0-beta.0.tgz#6b20097a24e4c84640852bdc1ab78acc346263f3" + resolved "https://registry.npmjs.org/json-schema-yup-transformer/-/json-schema-yup-transformer-2.0.0-beta.0.tgz" integrity sha512-LGm3Fl2jZ/oXMr6nNXfF7cAYuslj+sX+/2olkiSmKYz1Oji+OcQOpHEEoVti5QiXyS4vFmb6xZbkKTjfNds+LA== dependencies: is-relative-url "3.0.0" @@ -2857,7 +2915,7 @@ locate-path@^6.0.0: lodash-es@^4.17.21: version "4.17.21" - resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== lodash.clone@^4.5.0: @@ -2926,7 +2984,7 @@ micromatch@^4.0.4, micromatch@^4.0.5: mimic-response@^3.1.0: version "3.1.0" - resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9" + resolved "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz" integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ== minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: @@ -2955,7 +3013,7 @@ minimist@^1.2.0, minimist@^1.2.3, minimist@^1.2.6: mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3: version "0.5.3" - resolved "https://registry.yarnpkg.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== ms@2.1.2: @@ -2979,7 +3037,7 @@ mz@^2.7.0: nanoclone@^0.2.1: version "0.2.1" - resolved "https://registry.yarnpkg.com/nanoclone/-/nanoclone-0.2.1.tgz#dd4090f8f1a110d26bb32c49ed2f5b9235209ed4" + resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== nanoid@^3.3.6: @@ -2989,7 +3047,7 @@ nanoid@^3.3.6: napi-build-utils@^1.0.1: version "1.0.2" - resolved "https://registry.yarnpkg.com/napi-build-utils/-/napi-build-utils-1.0.2.tgz#b1fddc0b2c46e380a0b7a76f984dd47c41a13806" + resolved "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz" integrity sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg== natural-compare@^1.4.0: @@ -3019,7 +3077,7 @@ next-themes@^0.2.1: next@^13.5.4: version "13.5.4" - resolved "https://registry.yarnpkg.com/next/-/next-13.5.4.tgz#7e6a93c9c2b9a2c78bf6906a6c5cc73ae02d5b4d" + resolved "https://registry.npmjs.org/next/-/next-13.5.4.tgz" integrity sha512-+93un5S779gho8y9ASQhb/bTkQF17FNQOtXLKAj3lsNgltEcF0C5PMLLncDmH+8X1EnJH1kbqAERa29nRXqhjA== dependencies: "@next/env" "13.5.4" @@ -3042,16 +3100,30 @@ next@^13.5.4: node-abi@^3.3.0: version "3.50.0" - resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.50.0.tgz#bbee6943c8812d20e241539854d7b8003404d917" + resolved "https://registry.npmjs.org/node-abi/-/node-abi-3.50.0.tgz" integrity sha512-2Gxu7Eq7vnBIRfYSmqPruEllMM14FjOQFJSoqdGWthVn+tmwEXzmdPpya6cvvwf0uZA3F5N1fMFr9mijZBplFA== dependencies: semver "^7.3.5" node-addon-api@^6.1.0: version "6.1.0" - resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-6.1.0.tgz#ac8470034e58e67d0c6f1204a18ae6995d9c0d76" + resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz" integrity sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA== +node-domexception@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz" + integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== + +node-fetch@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz" + integrity sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA== + dependencies: + data-uri-to-buffer "^4.0.0" + fetch-blob "^3.1.4" + formdata-polyfill "^4.0.10" + node-releases@^2.0.8: version "2.0.10" resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz" @@ -3288,7 +3360,7 @@ postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0: postcss@8.4.31: version "8.4.31" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.31.tgz#92b451050a9f914da6755af352bdc0192508656d" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz" integrity sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ== dependencies: nanoid "^3.3.6" @@ -3306,7 +3378,7 @@ postcss@^8.4.23, postcss@^8.4.4: prebuild-install@^7.1.1: version "7.1.1" - resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-7.1.1.tgz#de97d5b34a70a0c81334fd24641f2a1702352e45" + resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz" integrity sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw== dependencies: detect-libc "^2.0.0" @@ -3329,7 +3401,7 @@ prelude-ls@^1.2.1: prettier-linter-helpers@^1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== dependencies: fast-diff "^1.1.2" @@ -3339,7 +3411,7 @@ prettier@^2.8.7: resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz" integrity sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw== -prop-types@^15.8.1: +prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -3355,7 +3427,7 @@ property-expr@^2.0.4, property-expr@^2.0.5: pump@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== dependencies: end-of-stream "^1.1.0" @@ -3373,12 +3445,12 @@ queue-microtask@^1.2.2: queue-tick@^1.0.1: version "1.0.1" - resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + resolved "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz" integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== rc@^1.2.7: version "1.2.8" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" + resolved "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== dependencies: deep-extend "^0.6.0" @@ -3411,6 +3483,21 @@ react-leaflet@^4.2.1: dependencies: "@react-leaflet/core" "^2.1.0" +react-lifecycles-compat@^3.0.0: + version "3.0.4" + resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362" + integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA== + +react-modal@^3.16.1: + version "3.16.1" + resolved "https://registry.yarnpkg.com/react-modal/-/react-modal-3.16.1.tgz#34018528fc206561b1a5467fc3beeaddafb39b2b" + integrity sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg== + dependencies: + exenv "^1.2.0" + prop-types "^15.7.2" + react-lifecycles-compat "^3.0.0" + warning "^4.0.3" + react-remove-scroll-bar@^2.3.3: version "2.3.4" resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz" @@ -3455,7 +3542,7 @@ read-cache@^1.0.0: readable-stream@^3.1.1, readable-stream@^3.4.0: version "3.6.2" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" @@ -3541,7 +3628,7 @@ run-parallel@^1.1.9: safe-buffer@^5.0.1, safe-buffer@~5.2.0: version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== safe-regex-test@^1.0.0: @@ -3567,7 +3654,7 @@ semver@^6.3.0: semver@^7.3.5, semver@^7.5.4: version "7.5.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" @@ -3586,7 +3673,7 @@ server-only@0.0.1: sharp@^0.32.6: version "0.32.6" - resolved "https://registry.yarnpkg.com/sharp/-/sharp-0.32.6.tgz#6ad30c0b7cd910df65d5f355f774aa4fce45732a" + resolved "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz" integrity sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w== dependencies: color "^4.2.3" @@ -3626,12 +3713,12 @@ signal-exit@^4.0.1: simple-concat@^1.0.0: version "1.0.1" - resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f" + resolved "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz" integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q== simple-get@^4.0.0, simple-get@^4.0.1: version "4.0.1" - resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543" + resolved "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz" integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA== dependencies: decompress-response "^6.0.0" @@ -3640,7 +3727,7 @@ simple-get@^4.0.0, simple-get@^4.0.1: simple-swizzle@^0.2.2: version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" + resolved "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz" integrity sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg== dependencies: is-arrayish "^0.3.1" @@ -3679,7 +3766,7 @@ streamsearch@^1.1.0: streamx@^2.15.0: version "2.15.1" - resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.15.1.tgz#396ad286d8bc3eeef8f5cea3f029e81237c024c6" + resolved "https://registry.npmjs.org/streamx/-/streamx-2.15.1.tgz" integrity sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA== dependencies: fast-fifo "^1.1.0" @@ -3747,7 +3834,7 @@ string.prototype.trimstart@^1.0.6: string_decoder@^1.1.1: version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== dependencies: safe-buffer "~5.2.0" @@ -3794,7 +3881,7 @@ strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: strip-json-comments@~2.0.1: version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== styled-jsx@5.1.1: @@ -3891,7 +3978,7 @@ tapable@^2.2.0: tar-fs@^2.0.0: version "2.1.1" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== dependencies: chownr "^1.1.1" @@ -3901,7 +3988,7 @@ tar-fs@^2.0.0: tar-fs@^3.0.4: version "3.0.4" - resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.4.tgz#a21dc60a2d5d9f55e0089ccd78124f1d3771dbbf" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz" integrity sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w== dependencies: mkdirp-classic "^0.5.2" @@ -3910,7 +3997,7 @@ tar-fs@^3.0.4: tar-stream@^2.1.4: version "2.2.0" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-2.2.0.tgz#acad84c284136b060dc3faa64474aa9aebd77287" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== dependencies: bl "^4.0.3" @@ -3921,7 +4008,7 @@ tar-stream@^2.1.4: tar-stream@^3.1.5: version "3.1.6" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.6.tgz#6520607b55a06f4a2e2e04db360ba7d338cc5bab" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.6.tgz" integrity sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg== dependencies: b4a "^1.6.4" @@ -3962,7 +4049,7 @@ tiny-glob@^0.2.9: tiny-slider@^2.9.4: version "2.9.4" - resolved "https://registry.yarnpkg.com/tiny-slider/-/tiny-slider-2.9.4.tgz#dd5cbf3065f1688ade8383ea6342aefcba22ccc4" + resolved "https://registry.npmjs.org/tiny-slider/-/tiny-slider-2.9.4.tgz" integrity sha512-LAs2kldWcY+BqCKw4kxd4CMx2RhWrHyEePEsymlOIISTlOVkjfK40sSD7ay73eKXBLg/UkluAZpcfCstimHXew== to-fast-properties@^2.0.0: @@ -4016,7 +4103,7 @@ tsutils@^3.21.0: tunnel-agent@^0.6.0: version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" + resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz" integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w== dependencies: safe-buffer "^5.0.1" @@ -4110,14 +4197,26 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2: resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== +warning@^4.0.3: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchpack@2.4.0: version "2.4.0" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" +web-streams-polyfill@^3.0.3: + version "3.3.3" + resolved "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz" + integrity sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw== + which-boxed-primitive@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" @@ -4208,7 +4307,7 @@ yocto-queue@^0.1.0: yup@^0.32.11: version "0.32.11" - resolved "https://registry.yarnpkg.com/yup/-/yup-0.32.11.tgz#d67fb83eefa4698607982e63f7ca4c5ed3cf18c5" + resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== dependencies: "@babel/runtime" "^7.15.4"