diff --git a/app/components/PanoramaxImagePreview/index.tsx b/app/components/PanoramaxImagePreview/index.tsx new file mode 100644 index 00000000..1250c338 --- /dev/null +++ b/app/components/PanoramaxImagePreview/index.tsx @@ -0,0 +1,48 @@ +import '@panoramax/web-viewer/build/index.css'; +import '@panoramax/web-viewer'; + +import { useMemo } from 'react'; +import { + _cs, + isDefined, +} from '@togglecorp/fujs'; + +import styles from './styles.module.css'; + +interface Props { + className?: string; + imageId: string | undefined; + url?: string | undefined | null; +} + +const DEFAULT_ENDPOINT = 'https://api.panoramax.xyz/api'; + +function PanoramaxImagePreview({ className, imageId, url }: Props) { + const endpoint = useMemo(() => { + // NOTE: Workaround to use Metacatalog API for MapComplete Panoramax due to CORS issues. + if (!url) return DEFAULT_ENDPOINT; + return url.includes('mapcomplete') ? DEFAULT_ENDPOINT : `${url.replace(/\/+$/, '')}/api`; + }, [url]); + + const PanoramaxPhotoViewer = 'pnx-photo-viewer' as React.ElementType; + return ( +
+ {isDefined(imageId) && ( + + )} +
+ ); +} + +export default PanoramaxImagePreview; diff --git a/app/components/PanoramaxImagePreview/styles.module.css b/app/components/PanoramaxImagePreview/styles.module.css new file mode 100644 index 00000000..c9707bd4 --- /dev/null +++ b/app/components/PanoramaxImagePreview/styles.module.css @@ -0,0 +1,9 @@ +.panoramax-image-preview { + isolation: isolate; + height: 20rem; + + .viewer { + width: 100%; + height: 100%; + } +} diff --git a/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx b/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx index 404db765..f555aae0 100644 --- a/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx +++ b/app/components/domain/ProjectSpecificDetails/StreetDetails/index.tsx @@ -6,7 +6,10 @@ import CustomOptionPreview from '#components/domain/CustomOptionsPreview'; import ProjectAssetPreview from '#components/domain/ProjectAssetPreview'; import ListLayout from '#components/ListLayout'; import TextOutput from '#components/TextOutput'; -import { StreetProjectPropertyType } from '#generated/types/graphql'; +import { + StreetImageProviderNameEnum, + StreetProjectPropertyType, +} from '#generated/types/graphql'; interface Props { data: StreetProjectPropertyType | undefined; @@ -36,7 +39,7 @@ function StreetDetails(props: Props) { + + + {( + data.imageProvider?.name === StreetImageProviderNameEnum.PanoramaxCustom + && data.imageProvider?.url + ) && ( + + )} + ); diff --git a/app/components/domain/StreetImageProviderInput/index.tsx b/app/components/domain/StreetImageProviderInput/index.tsx new file mode 100644 index 00000000..14368cf6 --- /dev/null +++ b/app/components/domain/StreetImageProviderInput/index.tsx @@ -0,0 +1,101 @@ +import { + useCallback, + useContext, + useMemo, +} from 'react'; +import { + EntriesAsList, + getErrorObject, + LeafError, + ObjectError, +} from '@togglecorp/toggle-form'; + +import Container from '#components/Container'; +import ListLayout from '#components/ListLayout'; +import RadioInput from '#components/RadioInput'; +import TextInput from '#components/TextInput'; +import EnumsContext from '#contexts/EnumsContext'; +import { StreetImageProviderNameEnum } from '#generated/types/graphql'; + +import { PartialStreetImageProviderInputFields } from './schema'; + +interface Props { + value: PartialStreetImageProviderInputFields | undefined; + error: LeafError | ObjectError; + setFieldValue: ( + ...entries: EntriesAsList + ) => void; + disabled?: boolean; +} + +interface StreetProviderOption { + key: StreetImageProviderNameEnum; + label: string; +} + +function providerKeySelector(option: StreetProviderOption) { + return option.key; +} + +function providerLabelSelector(option: StreetProviderOption) { + return option.label; +} + +function StreetImageProviderInput(props: Props) { + const { + value, error: formError, setFieldValue, disabled, + } = props; + + const { streetImageProviderNameOptions } = useContext(EnumsContext); + const error = getErrorObject(formError); + + const providerOptions = useMemo(() => { + if (!streetImageProviderNameOptions || streetImageProviderNameOptions.length === 0) { + return []; + } + + return streetImageProviderNameOptions.map((option) => ({ + key: option.key as StreetImageProviderNameEnum, + label: option.label, + })); + }, [streetImageProviderNameOptions]); + + const handleChange = useCallback((newValue: StreetImageProviderNameEnum) => { + setFieldValue(newValue, 'name'); + if (newValue !== StreetImageProviderNameEnum.PanoramaxCustom) { + setFieldValue(undefined, 'url'); + } + }, [setFieldValue]); + + return ( + + + + + {value?.name === StreetImageProviderNameEnum.PanoramaxCustom && ( + + )} + + + ); +} + +export default StreetImageProviderInput; diff --git a/app/components/domain/StreetImageProviderInput/schema.ts b/app/components/domain/StreetImageProviderInput/schema.ts new file mode 100644 index 00000000..03a40b7b --- /dev/null +++ b/app/components/domain/StreetImageProviderInput/schema.ts @@ -0,0 +1,61 @@ +import { + addCondition, + ObjectSchema, + PartialForm, + requiredStringCondition, +} from '@togglecorp/toggle-form'; + +import { + StreetImageProviderInput, + StreetImageProviderNameEnum, +} from '#generated/types/graphql'; +import { DeepNonNullable } from '#utils/types'; + +export type PartialStreetImageProviderInputFields = PartialForm< + DeepNonNullable +>; + +type StreetImageProviderSchema = + ObjectSchema; + +type StreetImageProviderFields = + ReturnType; + +export const defaultStreetImageProviderValue: +PartialStreetImageProviderInputFields = { + name: StreetImageProviderNameEnum.Mapillary, +}; + +const streetImageProviderSchema: StreetImageProviderSchema = { + fields: (value): StreetImageProviderFields => { + const baseSchema: StreetImageProviderFields = { + name: { + required: true, + }, + url: {}, + }; + + return addCondition( + baseSchema, + value, + ['name'], + ['url'], + (): StreetImageProviderFields => { + if (value?.name === StreetImageProviderNameEnum.PanoramaxCustom) { + return { + url: { + required: true, + requiredValidation: requiredStringCondition, + }, + }; + } + + return { + url: { required: false }, + }; + }, + ); + }, +}; + +export default streetImageProviderSchema; diff --git a/app/components/domain/StreetScenarioPreview/index.tsx b/app/components/domain/StreetScenarioPreview/index.tsx index 65f268b2..c9817953 100644 --- a/app/components/domain/StreetScenarioPreview/index.tsx +++ b/app/components/domain/StreetScenarioPreview/index.tsx @@ -6,7 +6,12 @@ import { PreviewItem } from '#components/domain/TutorialPreviewScreenSelectInput import ListLayout from '#components/ListLayout'; import MapillaryImagePreview from '#components/MapillaryImagePreview'; import MobilePreview from '#components/MobilePreview'; -import { TutorialScenarioPageCreateInput } from '#generated/types/graphql'; +import PanoramaxImagePreview from '#components/PanoramaxImagePreview'; +import { + StreetImageProvider, + StreetImageProviderNameEnum, + TutorialScenarioPageCreateInput, +} from '#generated/types/graphql'; import { PartialCustomOptionInputFields } from '../CustomOptionInput/schema'; import CustomOptionPreview from '../CustomOptionsPreview'; @@ -19,6 +24,7 @@ interface Props { scenario: PartialForm | undefined; customOptions: PartialCustomOptionInputFields[] | undefined; preview: PreviewItem | undefined; + imageProvider: StreetImageProvider | null | undefined; } function StreetScenarioPreview(props: Props) { @@ -28,9 +34,14 @@ function StreetScenarioPreview(props: Props) { projectInstruction, customOptions, preview, + imageProvider, } = props; const imageId = scenario?.tasks?.[0].projectTypeSpecifics?.street?.mapillaryImageId; + const isPanoramaxProvider = [ + StreetImageProviderNameEnum.Panoramax, + StreetImageProviderNameEnum.PanoramaxCustom, + ].includes(imageProvider?.name as StreetImageProviderNameEnum); return ( - + {imageProvider?.name === StreetImageProviderNameEnum.Mapillary && ( + + )} + {isPanoramaxProvider && ( + + )} diff --git a/app/contexts/EnumsContext.ts b/app/contexts/EnumsContext.ts index b46213dd..6e8a980c 100644 --- a/app/contexts/EnumsContext.ts +++ b/app/contexts/EnumsContext.ts @@ -12,6 +12,7 @@ export interface EnumsContextProps { overlayLayerTypeOptions: AllEnumsQuery['enums']['OverlayLayerTypeEnum'], tutorialStatusOptions: AllEnumsQuery['enums']['TutorialStatusEnum'], firebasePushStatusOptions: AllEnumsQuery['enums']['FirebasePushStatusEnum'], + streetImageProviderNameOptions: AllEnumsQuery['enums']['StreetImageProviderNameEnum'], validateObjectSourceTypeMapping: Record< AllEnumsQuery['enums']['ValidateObjectSourceTypeEnum'][number]['key'], @@ -49,6 +50,10 @@ export interface EnumsContextProps { AllEnumsQuery['enums']['FirebasePushStatusEnum'][number]['key'], AllEnumsQuery['enums']['FirebasePushStatusEnum'][number] > | undefined; + streetImageProviderNameMapping: Record< + AllEnumsQuery['enums']['StreetImageProviderNameEnum'][number]['key'], + AllEnumsQuery['enums']['StreetImageProviderNameEnum'][number] + > | undefined; } export const defaultAllEnumsValue: EnumsContextProps = { @@ -61,6 +66,7 @@ export const defaultAllEnumsValue: EnumsContextProps = { overlayLayerTypeOptions: [], tutorialStatusOptions: [], firebasePushStatusOptions: [], + streetImageProviderNameOptions: [], validateObjectSourceTypeMapping: undefined, validateImageSourceTypeMapping: undefined, @@ -71,6 +77,7 @@ export const defaultAllEnumsValue: EnumsContextProps = { overlayLayerTypeMapping: undefined, tutorialStatusMapping: undefined, firebasePushStatusMapping: undefined, + streetImageProviderNameMapping: undefined, }; const EnumsContext = createContext(defaultAllEnumsValue); diff --git a/app/utils/query.ts b/app/utils/query.ts index 9a919eeb..a41ddf90 100644 --- a/app/utils/query.ts +++ b/app/utils/query.ts @@ -139,12 +139,16 @@ fragment ProjectTypeSpecificFields on CompareProjectPropertyTypeFindProjectPrope mapillaryImageFilters { creatorId endTime - isPano + panoOnly organizationId randomizeOrder samplingThreshold startTime } + imageProvider { + name + url + } } } `; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/index.tsx new file mode 100644 index 00000000..ab3e7886 --- /dev/null +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/index.tsx @@ -0,0 +1,115 @@ +import { + EntriesAsList, + getErrorObject, + LeafError, + ObjectError, +} from '@togglecorp/toggle-form'; + +import Checkbox from '#components/Checkbox'; +import Container from '#components/Container'; +import { PartialStreetImageProviderInputFields } from '#components/domain/StreetImageProviderInput/schema'; +import ListLayout from '#components/ListLayout'; +import NumberInput from '#components/NumberInput'; +import TextInput from '#components/TextInput'; +import { StreetImageProviderNameEnum } from '#generated/types/graphql'; + +import { PartialStreetImageFiltersInputFields } from './schema.ts'; + +interface Props { + value: PartialStreetImageFiltersInputFields | undefined | null; + error: LeafError | ObjectError; + setFieldValue: ( + ...entries: EntriesAsList + ) => void; + disabled?: boolean; + imageProvider?: PartialStreetImageProviderInputFields | undefined | null; +} + +function StreetImageFiltersInput(props: Props) { + const { + value, + error: formError, + setFieldValue, + disabled, + imageProvider, + } = props; + + const error = getErrorObject(formError); + + return ( + + + + + + {imageProvider?.name === StreetImageProviderNameEnum.Mapillary && ( + + )} + + + + + + ); +} + +export default StreetImageFiltersInput; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/schema.ts b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/schema.ts new file mode 100644 index 00000000..08033e7d --- /dev/null +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetImageFiltersInput/schema.ts @@ -0,0 +1,33 @@ +import { + ObjectSchema, + PartialForm, +} from '@togglecorp/toggle-form'; + +import { StreetImageFiltersInput } from '#generated/types/graphql'; +import { DeepNonNullable } from '#utils/types'; + +export type PartialStreetImageFiltersInputFields = PartialForm< + DeepNonNullable +>; + +type StreetImageFiltersFormSchema = ObjectSchema< + PartialStreetImageFiltersInputFields +>; + +export const defaultStreetImageFiltersInputFormValue: PartialStreetImageFiltersInputFields = { + randomizeOrder: false, +}; + +const streetImageFiltersFormSchema: StreetImageFiltersFormSchema = { + fields: (): ReturnType => ({ + panoOnly: {}, + creatorId: {}, + organizationId: {}, + startTime: {}, + endTime: {}, + randomizeOrder: {}, + samplingThreshold: {}, + }), +}; + +export default streetImageFiltersFormSchema; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx index 77389d06..e69de29b 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/index.tsx @@ -1,109 +0,0 @@ -import { - EntriesAsList, - getErrorObject, - LeafError, - ObjectError, -} from '@togglecorp/toggle-form'; - -import Checkbox from '#components/Checkbox'; -import Container from '#components/Container'; -import ListLayout from '#components/ListLayout'; -import NumberInput from '#components/NumberInput'; -import TextInput from '#components/TextInput'; - -import { PartialStreetMapillaryImageFiltersInputFields } from './schema'; - -interface Props { - value: PartialStreetMapillaryImageFiltersInputFields | undefined | null; - error: LeafError | ObjectError; - setFieldValue: ( - ...entries: EntriesAsList - ) => void; - disabled?: boolean; -} - -function StreetMapillaryImageFiltersInput(props: Props) { - const { - value, - error: formError, - setFieldValue, - disabled, - } = props; - - const error = getErrorObject(formError); - - return ( - - - - - - - - - - - - ); -} - -export default StreetMapillaryImageFiltersInput; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts deleted file mode 100644 index 4f68b54c..00000000 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/StreetMapillaryImageFiltersInput/schema.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { - ObjectSchema, - PartialForm, -} from '@togglecorp/toggle-form'; - -import { StreetMapillaryImageFiltersInput } from '#generated/types/graphql'; -import { DeepNonNullable } from '#utils/types'; - -export type PartialStreetMapillaryImageFiltersInputFields = PartialForm< - DeepNonNullable ->; - -type StreetMapillaryImageFiltersFormSchema = ObjectSchema< - PartialStreetMapillaryImageFiltersInputFields ->; - -// eslint-disable-next-line max-len -export const defaultStreetMapillaryImageFiltersInputFormValue: PartialStreetMapillaryImageFiltersInputFields = { - randomizeOrder: false, - isPano: false, -}; - -const streetMapillaryimageFiltersFormSchema: StreetMapillaryImageFiltersFormSchema = { - fields: (): ReturnType => ({ - isPano: {}, - creatorId: {}, - organizationId: {}, - startTime: {}, - endTime: {}, - randomizeOrder: {}, - samplingThreshold: {}, - }), -}; - -export default streetMapillaryimageFiltersFormSchema; diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx index 74066e9b..49d4536d 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/index.tsx @@ -16,16 +16,21 @@ import Container from '#components/Container'; import AssetInput from '#components/domain/AssetInput'; import CustomOptionInput from '#components/domain/CustomOptionInput'; import { PartialCustomOptionInputFields } from '#components/domain/CustomOptionInput/schema'; +import StreetImageProviderInput from '#components/domain/StreetImageProviderInput'; +import { + defaultStreetImageProviderValue, + PartialStreetImageProviderInputFields, +} from '#components/domain/StreetImageProviderInput/schema'; import ListLayout from '#components/ListLayout'; import NonFieldError from '#components/NonFieldError'; import { ProjectAssetInputTypeEnum } from '#generated/types/graphql'; import { - defaultStreetMapillaryImageFiltersInputFormValue, - PartialStreetMapillaryImageFiltersInputFields, -} from './StreetMapillaryImageFiltersInput/schema'; + defaultStreetImageFiltersInputFormValue, + PartialStreetImageFiltersInputFields, +} from './StreetImageFiltersInput/schema'; import { type PartialStreetSpecificFields } from './schema'; -import StreetMapillaryImageFiltersInput from './StreetMapillaryImageFiltersInput'; +import StreetImageFiltersInput from './StreetImageFiltersInput'; interface Props { projectId: string; @@ -68,10 +73,16 @@ function StreetProjectSpecifics(props: Props) { ); }, [setFieldValue]); - const setStreetMapillaryImageFiltersInputFieldValue = useFormObject<'mapillaryImageFilters', PartialStreetMapillaryImageFiltersInputFields>( + const setStreetImageFiltersInputFieldValue = useFormObject<'mapillaryImageFilters', PartialStreetImageFiltersInputFields>( 'mapillaryImageFilters' as const, setFieldValue, - defaultStreetMapillaryImageFiltersInputFormValue, + defaultStreetImageFiltersInputFormValue, + ); + + const setStreetImageProviderFieldValue = useFormObject<'imageProvider', PartialStreetImageProviderInputFields>( + 'imageProvider' as const, + setFieldValue, + defaultStreetImageProviderValue, ); return ( @@ -127,11 +138,18 @@ function StreetProjectSpecifics(props: Props) { hint="Upload your project area as GeoJSON File (max. 1MB). Make sure that you provide a single polygon geometry." /> - + ); diff --git a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/schema.ts b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/schema.ts index d7ad1b0e..ab67f03b 100644 --- a/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/schema.ts +++ b/app/views/EditProject/UpdateProjectForm/StreetProjectSpecifics/schema.ts @@ -4,6 +4,7 @@ import { } from '@togglecorp/toggle-form'; import customOptionSchema from '#components/domain/CustomOptionInput/schema'; +import streetImageProviderSchema, { defaultStreetImageProviderValue } from '#components/domain/StreetImageProviderInput/schema'; import { StreetProjectPropertyInput } from '#generated/types/graphql'; import { DeepNonNullable } from '#utils/types'; @@ -11,7 +12,7 @@ import { type PartialProjectUpdateInput, type UpdateProjectContext, } from '../schema'; -import streetMapillaryimageFiltersFormSchema, { defaultStreetMapillaryImageFiltersInputFormValue } from './StreetMapillaryImageFiltersInput/schema'; +import streetImageFiltersFormSchema, { defaultStreetImageFiltersInputFormValue } from './StreetImageFiltersInput/schema'; export type PartialStreetSpecificFields = PartialForm< DeepNonNullable, @@ -24,7 +25,8 @@ type StreetSpecificFormSchema = ObjectSchema< >; export const defaultStreetSpecificFormValue: PartialStreetSpecificFields = { - mapillaryImageFilters: defaultStreetMapillaryImageFiltersInputFormValue, + mapillaryImageFilters: defaultStreetImageFiltersInputFormValue, + imageProvider: defaultStreetImageProviderValue, }; const streetSpecificFormSchema: StreetSpecificFormSchema = { @@ -34,7 +36,8 @@ const streetSpecificFormSchema: StreetSpecificFormSchema = { member: () => customOptionSchema, }, aoiGeometry: {}, - mapillaryImageFilters: streetMapillaryimageFiltersFormSchema, + mapillaryImageFilters: streetImageFiltersFormSchema, + imageProvider: streetImageProviderSchema, }), }; diff --git a/app/views/EditProject/UpdateProjectForm/index.tsx b/app/views/EditProject/UpdateProjectForm/index.tsx index c3274323..92bd9a7e 100644 --- a/app/views/EditProject/UpdateProjectForm/index.tsx +++ b/app/views/EditProject/UpdateProjectForm/index.tsx @@ -165,8 +165,7 @@ function UpdateProjectForm(props: Props) { if (projectData.project.projectType === ProjectTypeEnum.Street) { return { ...defaultStreetSpecificFormValue, - // FIXME: use custom options from street project - customOptions: projectData.defaultValidateCustomOptions.map((customOption) => ({ + customOptions: projectData.defaultStreetCustomOptions.map((customOption) => ({ clientId: ulid(), ...customOption, })), diff --git a/app/views/EditProject/query.ts b/app/views/EditProject/query.ts index 4165fda6..ec0fad71 100644 --- a/app/views/EditProject/query.ts +++ b/app/views/EditProject/query.ts @@ -23,5 +23,12 @@ query ProjectDetails($id: ID!) { title value } + defaultStreetCustomOptions: defaultCustomOptions(projectType: STREET) { + description + icon + iconColor + title + value + } } `; diff --git a/app/views/EditTutorial/ScenarioPageInput/TaskInput/StreetPropertyInput/index.tsx b/app/views/EditTutorial/ScenarioPageInput/TaskInput/StreetPropertyInput/index.tsx index f1626ed0..78ba0079 100644 --- a/app/views/EditTutorial/ScenarioPageInput/TaskInput/StreetPropertyInput/index.tsx +++ b/app/views/EditTutorial/ScenarioPageInput/TaskInput/StreetPropertyInput/index.tsx @@ -35,7 +35,7 @@ function StreetPropertyInput(props: Props) { return (
)} diff --git a/app/views/RootLayout/index.tsx b/app/views/RootLayout/index.tsx index fcb41b93..cc2aaddf 100644 --- a/app/views/RootLayout/index.tsx +++ b/app/views/RootLayout/index.tsx @@ -107,6 +107,10 @@ query AllEnums { key label } + StreetImageProviderNameEnum { + key + label + } } } `; @@ -200,6 +204,7 @@ function RootLayout() { overlayLayerTypeOptions: allEnumsResponse?.enums.OverlayLayerTypeEnum ?? [], tutorialStatusOptions: allEnumsResponse?.enums.TutorialStatusEnum ?? [], firebasePushStatusOptions: allEnumsResponse?.enums.FirebasePushStatusEnum ?? [], + streetImageProviderNameOptions: allEnumsResponse?.enums.StreetImageProviderNameEnum ?? [], validateObjectSourceTypeMapping: listToMap( allEnumsResponse?.enums.ValidateObjectSourceTypeEnum, ({ key }) => key, @@ -236,6 +241,10 @@ function RootLayout() { allEnumsResponse?.enums.FirebasePushStatusEnum, ({ key }) => key, ), + streetImageProviderNameMapping: listToMap( + allEnumsResponse?.enums.StreetImageProviderNameEnum, + ({ key }) => key, + ), } satisfies EnumsContextProps), [allEnumsResponse]); return ( diff --git a/backend b/backend index c0282605..5a5553cd 160000 --- a/backend +++ b/backend @@ -1 +1 @@ -Subproject commit c028260535afd6a8fe1518d501e7536d1e6ac99e +Subproject commit 5a5553cd46e649b5cd0a62ece187c59073ef9547 diff --git a/package.json b/package.json index 9a211046..bece54b4 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ }, "dependencies": { "@mapbox/tilebelt": "^2.0.2", + "@panoramax/web-viewer": "^4.4.0", "@placemarkio/check-geojson": "^0.1.12", "@sentry/react": "^9.13.0", "@sentry/tracing": "^7.120.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ea588aa4..1f4ceafa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -19,6 +19,9 @@ importers: '@mapbox/tilebelt': specifier: ^2.0.2 version: 2.0.2 + '@panoramax/web-viewer': + specifier: ^4.4.0 + version: 4.4.0 '@placemarkio/check-geojson': specifier: ^0.1.12 version: 0.1.12 @@ -1298,6 +1301,25 @@ packages: '@firebase/webchannel-wrapper@1.0.4': resolution: {integrity: sha512-6m8+P+dE/RPl4OPzjTxcTbQ0rGeRyeTvAi9KwIffBVCiAMKrfXfLZaqD1F+m8t4B5/Q5aHsMozOgirkH1F5oMQ==} + '@fontsource/atkinson-hyperlegible-next@5.2.7': + resolution: {integrity: sha512-FDRsNkqauNRBRiTD3YF6FV8yOVFjkcBqUjwrv6KnooEIRjsTuePUnahPsLHApWNtp1riztVCOPnr9RMHUZU3TQ==} + + '@fortawesome/fontawesome-common-types@6.7.2': + resolution: {integrity: sha512-Zs+YeHUC5fkt7Mg1l6XTniei3k4bwG/yo3iFUtZWd/pMx9g3fdvkSK9E0FOC+++phXOka78uJcYb8JaFkW52Xg==} + engines: {node: '>=6'} + + '@fortawesome/fontawesome-svg-core@6.7.2': + resolution: {integrity: sha512-yxtOBWDrdi5DD5o1pmVdq3WMCvnobT0LU6R8RyyVXPvFRd2o79/0NCuQoCjNTeZz9EzA9xS3JxNWfv54RIHFEA==} + engines: {node: '>=6'} + + '@fortawesome/free-regular-svg-icons@6.7.2': + resolution: {integrity: sha512-7Z/ur0gvCMW8G93dXIQOkQqHo2M5HLhYrRVC0//fakJXxcF1VmMPsxnG6Ee8qEylA8b8Q3peQXWMNZ62lYF28g==} + engines: {node: '>=6'} + + '@fortawesome/free-solid-svg-icons@6.7.2': + resolution: {integrity: sha512-GsBrnOzU8uj0LECDfD5zomZJIjrPhIlWU82AHwa2s40FKH+kcxQaBvBo3Z4TxyZHIyX8XTDxsyA33/Vx9eFuQA==} + engines: {node: '>=6'} + '@graphql-codegen/add@5.0.3': resolution: {integrity: sha512-SxXPmramkth8XtBlAHu4H4jYcYXM/o3p01+psU+0NADQowA8jtYkK6MW5rV6T+CxkEaNZItfSmZRPgIuypcqnA==} peerDependencies: @@ -1616,6 +1638,9 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@istanbuljs/schema@0.1.3': resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} engines: {node: '>=8'} @@ -1648,6 +1673,12 @@ packages: '@keyv/serialize@1.0.3': resolution: {integrity: sha512-qnEovoOp5Np2JDGonIDL6Ayihw0RhnRh6vxPuHo4RDn1UOzwEo4AeIfpL6UGIrsceWrCMiVPgwRjbHu4vYFc3g==} + '@lit-labs/ssr-dom-shim@1.5.1': + resolution: {integrity: sha512-Aou5UdlSpr5whQe8AA/bZG0jMj96CoJIWbGfZ91qieWu5AWUMKw8VR/pAkQkJYvBNhmCcWnZlyyk5oze8JIqYA==} + + '@lit/reactive-element@2.1.2': + resolution: {integrity: sha512-pbCDiVMnne1lYUIaYNN5wrwQXDtHaYtg7YEFPeW+hws6U47WeFvISGUWekPGKWOP1ygrs0ef0o1VJMk1exos5A==} + '@mapbox/geojson-rewind@0.5.2': resolution: {integrity: sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==} hasBin: true @@ -1659,26 +1690,48 @@ packages: '@mapbox/point-geometry@0.1.0': resolution: {integrity: sha512-6j56HdLTwWGO0fJPlrZtdU/B13q8Uwmo18Ck2GnGgN9PCFyKTZ3UbXeEdRFh18i9XQ92eH2VdtpJHpBD3aripQ==} + '@mapbox/point-geometry@1.1.0': + resolution: {integrity: sha512-YGcBz1cg4ATXDCM/71L9xveh4dynfGmcLDqufR+nQQy3fKwsAZsWd/x4621/6uJaeB9mwOHE6hPeDgXz9uViUQ==} + '@mapbox/tilebelt@2.0.2': resolution: {integrity: sha512-pzFgrmsCUjOAAeYns1MKJ1dJICYdEC+sYwtWLdxO7iJwmDlepGrEXDqP9ejApO/YUVctA/SYKDS4Oc0mBNNLZw==} '@mapbox/tiny-sdf@2.0.6': resolution: {integrity: sha512-qMqa27TLw+ZQz5Jk+RcwZGH7BQf5G/TrutJhspsca/3SHwmgKQ1iq+d3Jxz5oysPVYTGP6aXxCo5Lk9Er6YBAA==} + '@mapbox/tiny-sdf@2.0.7': + resolution: {integrity: sha512-25gQLQMcpivjOSA40g3gO6qgiFPDpWRoMfd+G/GoppPIeP6JDaMMkMrEJnMZhKyyS6iKwVt5YKu02vCUyJM3Ug==} + '@mapbox/unitbezier@0.0.1': resolution: {integrity: sha512-nMkuDXFv60aBr9soUG5q+GvZYL+2KZHVvsqFCzqnkGEf46U2fvmytHaEVc1/YZbiLn8X+eR3QzX1+dwDO1lxlw==} '@mapbox/vector-tile@1.3.1': resolution: {integrity: sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==} + '@mapbox/vector-tile@2.0.4': + resolution: {integrity: sha512-AkOLcbgGTdXScosBWwmmD7cDlvOjkg/DetGva26pIRiZPdeJYjYKarIlb4uxVzi6bwHO6EWH82eZ5Nuv4T5DUg==} + '@mapbox/whoots-js@3.1.0': resolution: {integrity: sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==} engines: {node: '>=6.0.0'} + '@maplibre/geojson-vt@5.0.4': + resolution: {integrity: sha512-KGg9sma45S+stfH9vPCJk1J0lSDLWZgCT9Y8u8qWZJyjFlP8MNP1WGTxIMYJZjDvVT3PDn05kN1C95Sut1HpgQ==} + '@maplibre/maplibre-gl-style-spec@23.3.0': resolution: {integrity: sha512-IGJtuBbaGzOUgODdBRg66p8stnwj9iDXkgbYKoYcNiiQmaez5WVRfXm4b03MCDwmZyX93csbfHFWEJJYHnn5oA==} hasBin: true + '@maplibre/maplibre-gl-style-spec@24.4.1': + resolution: {integrity: sha512-UKhA4qv1h30XT768ccSv5NjNCX+dgfoq2qlLVmKejspPcSQTYD4SrVucgqegmYcKcmwf06wcNAa/kRd0NHWbUg==} + hasBin: true + + '@maplibre/mlt@1.1.6': + resolution: {integrity: sha512-rgtY3x65lrrfXycLf6/T22ZnjTg5WgIOsptOIoCaMZy4O4UAKTyZlYY0h6v8le721pTptF94U65yMDQkug+URw==} + + '@maplibre/vt-pbf@4.2.1': + resolution: {integrity: sha512-IxZBGq/+9cqf2qdWlFuQ+ZfoMhWpxDUGQZ/poPHOJBvwMUT1GuxLo6HgYTou+xxtsOsjfbcjI8PZaPCtmt97rA==} + '@napi-rs/wasm-runtime@0.2.9': resolution: {integrity: sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==} @@ -1698,6 +1751,32 @@ packages: resolution: {integrity: sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA==} engines: {node: '>=12.4.0'} + '@panoramax/web-viewer@4.4.0': + resolution: {integrity: sha512-6tgxINkdbb8rRC70sTMcyc5gjsVXjca+4EEa03F3ecPc5b36krnkmoEJqC5KIBa+CxIRuZ+UkTucVVG4AENHNA==} + + '@photo-sphere-viewer/core@5.14.1': + resolution: {integrity: sha512-qrwUudrX9YZms4c2shlY/H3jUP0oh9FyGEqIDr/95ulNZgKbhQ6C/i8zDQ4j8ooFR4+z5FDORQtGvLgPyX8VCA==} + + '@photo-sphere-viewer/equirectangular-tiles-adapter@5.14.1': + resolution: {integrity: sha512-QHd9y5cIFXAAZInbKbh+nUz5uzSRTiR8HYApm+ONlDu8JHAp410xNhB1vNm2Q1mVgg8IigQpD9Za5mPq10fESA==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/gallery-plugin@5.14.1': + resolution: {integrity: sha512-MzIB4Kc652yfdgPkh3xh/Kvu3XY84VkmshqZhXxa9UV4E2uNMop+vttkWeKogsaNSDT5/aEkMaFgwL/Bs/ZmRw==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/markers-plugin@5.14.1': + resolution: {integrity: sha512-tKMrVem19sZFVQwH6IlubEIucDD2EtwxzmWClHCEojM/+ajucuTDvO2N+I6HEqJClBcNsdHAUwA/zyY6MGOu2Q==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/virtual-tour-plugin@5.14.1': + resolution: {integrity: sha512-PRRQXoViKAg8g1TfagKJnvLMuuOXnGN9rvWOAs7W7J+knhcAuAenPFUax1Z5FgKli45mo21NspsPf1RV9lJHkQ==} + peerDependencies: + '@photo-sphere-viewer/core': 5.14.1 + '@placemarkio/check-geojson@0.1.12': resolution: {integrity: sha512-sSNPtPDVB0oKwImi4NYg1LVE2QSCIqs/jIRmu8U4fQVWdRjlGy+C/n7AbNO2FycE9rVWtz256f33aMGzvKC7gg==} engines: {node: '>=10'} @@ -2108,6 +2187,9 @@ packages: '@types/three@0.134.0': resolution: {integrity: sha512-4YB+99Rgqq27EjiYTItEoZtdjLnTh8W9LxowgpC9eWsjaQJIL4Kn/ZcUKAnW3gB/jS4hqGN8iqmid+RcUZDzpA==} + '@types/trusted-types@2.0.7': + resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} + '@types/virtual-dom@2.1.4': resolution: {integrity: sha512-Y7L/frVydXRd16MevczslJZQu+QWsrqZlj6ytk7mST3xen0fkx7Ollw31By/89A8Wq+nfNWm/IoTR1ac/0fRhA==} @@ -3246,6 +3328,9 @@ packages: earcut@3.0.1: resolution: {integrity: sha512-0l1/0gOjESMeQyYaK5IDiPNvFeu93Z/cO0TjZh9eZ1vyCtZnA7KMZ8rQggpsJHIbGSdrqYq9OhuveadOVHCshw==} + earcut@3.0.2: + resolution: {integrity: sha512-X7hshQbLyMJ/3RPhyObLARM2sNxxmRALLKx1+NVFFnQ9gKzmCrxm9+uLIAdBcvc8FNLpctqlQ2V6AE92Ol9UDQ==} + easy-table@1.2.0: resolution: {integrity: sha512-OFzVOv03YpvtcWGe5AayU5G2hgybsg3iqA6drU8UaoZyB9jLGMTrz9+asnLp/E+6qPh88yEI1gvyZFZ41dmgww==} @@ -3584,6 +3669,9 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + fflate@0.8.2: + resolution: {integrity: sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==} + figures@3.2.0: resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} engines: {node: '>=8'} @@ -3743,6 +3831,9 @@ packages: gl-matrix@3.4.3: resolution: {integrity: sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA==} + gl-matrix@3.4.4: + resolution: {integrity: sha512-latSnyDNt/8zYUB6VIJ6PCh2jBjJX6gnDsoCZ7LyW7GkqrD51EWwa9qCoGixj8YqBtETQK/xY7OmpTF8xz1DdQ==} + glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -3957,6 +4048,9 @@ packages: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} engines: {node: '>=16.17.0'} + iconify-icon@3.0.2: + resolution: {integrity: sha512-DYPAumiUeUeT/GHT8x2wrAVKn1FqZJqFH0Y5pBefapWRreV1BBvqBVMb0020YQ2njmbR59r/IathL2d2OrDrxA==} + iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -4457,6 +4551,15 @@ packages: enquirer: optional: true + lit-element@4.2.2: + resolution: {integrity: sha512-aFKhNToWxoyhkNDmWZwEva2SlQia+jfG0fjIWV//YeTaWrVnOxD89dPKfigCUspXFmjzOEUQpOkejH5Ly6sG0w==} + + lit-html@3.3.2: + resolution: {integrity: sha512-Qy9hU88zcmaxBXcc10ZpdK7cOLXvXpRoBxERdtqV9QOrfpMZZ6pSYP91LhpPtap3sFMUiL7Tw2RImbe0Al2/kw==} + + lit@3.3.2: + resolution: {integrity: sha512-NF9zbsP79l4ao2SNrH3NkfmFgN/hBYSQo90saIVI1o5GpjAdCPVstVzO1MrLOakHoEhYkrtRjPK6Ob521aoYWQ==} + local-pkg@0.5.1: resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==} engines: {node: '>=14'} @@ -4547,6 +4650,10 @@ packages: mapillary-js@4.1.2: resolution: {integrity: sha512-LYj6xbp/Y9wfBkr/prRwgJGb3+KwvzUri0yl5QEpMEH7oC1p52ErshWmPXysKefmm6JaFML4D7FJ89viwJ4T5g==} + maplibre-gl@5.19.0: + resolution: {integrity: sha512-REhYUN8gNP3HlcIZS6QU2uy8iovl31cXsrNDkCcqWSQbCkcpdYLczqDz5PVIwNH42UQNyvukjes/RoHPDrOUmQ==} + engines: {node: '>=16.14.0', npm: '>=8.1.0'} + maplibre-gl@5.5.0: resolution: {integrity: sha512-p8AOPuzzqn1ZA9gcXxKw0IED715we/2Owa/YUr6PANmgMvNMe/JG+V/C1hRra43Wm62Biz+Aa8AgbOLJimA8tA==} engines: {node: '>=16.14.0', npm: '>=8.1.0'} @@ -4928,6 +5035,10 @@ packages: resolution: {integrity: sha512-XDF38WCH3z5OV/OVa8GKUNtLAyneuzbCisx7QUCF8Q6Nutx0WnJrQe5O+kOtBlLfRNUws98Y58Lblp+NJG5T4Q==} hasBin: true + pbf@4.0.1: + resolution: {integrity: sha512-SuLdBvS42z33m8ejRbInMapQe8n0D3vN/Xd5fmWM3tufNgRQFBpaW2YVJxQZV4iPNqb0vEFvssMEo5w9c6BTIA==} + hasBin: true + performance-now@2.1.0: resolution: {integrity: sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==} @@ -4955,6 +5066,9 @@ packages: pkg-types@1.3.1: resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} + pmtiles@4.4.0: + resolution: {integrity: sha512-tCLI1C5134MR54i8izUWhse0QUtO/EC33n9yWp1N5dYLLvyc197U0fkF5gAJhq1TdWO9Tvl+9hgvFvM0fR27Zg==} + pn@1.1.0: resolution: {integrity: sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==} @@ -5174,6 +5288,9 @@ packages: potpack@2.0.0: resolution: {integrity: sha512-Q+/tYsFU9r7xoOJ+y/ZTtdVQwTWfzjbiXBDMM/JKUux3+QPP02iUuIoeBQ+Ot6oEDlC+/PGjB/5A3K7KKb7hcw==} + potpack@2.1.0: + resolution: {integrity: sha512-pcaShQc1Shq0y+E7GqJqvZj8DTthWV1KeHGdi0Z6IAin2Oi3JnLCOfwnCo84qc+HAp52wT9nK9H7FAJp5a44GQ==} + prelude-ls@1.1.2: resolution: {integrity: sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==} engines: {node: '>= 0.8.0'} @@ -5235,6 +5352,9 @@ packages: quansync@0.2.11: resolution: {integrity: sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==} + query-selector-shadow-dom@1.0.1: + resolution: {integrity: sha512-lT5yCqEBgfoMYpf3F2xQRK7zEr1rhIIZuceDK6+xRkJQ4NMbHTwXqk4NkwDwQMNqXgG9r9fyHnzwNVs6zV5KRw==} + queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} @@ -5849,6 +5969,9 @@ packages: three@0.134.0: resolution: {integrity: sha512-LbBerg7GaSPjYtTOnu41AMp7tV6efUNR3p4Wk5NzkSsNTBuA5mDGOfwwZL1jhhVMLx9V20HolIUo0+U3AXehbg==} + three@0.179.1: + resolution: {integrity: sha512-5y/elSIQbrvKOISxpwXCR4sQqHtGiOI+MKLc3SsBdDXA2hz3Mdp3X59aUp8DyybMa34aeBwbFTpdoLJaUDEWSw==} + through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -6251,6 +6374,7 @@ packages: whatwg-encoding@1.0.5: resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation whatwg-mimetype@2.3.0: resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} @@ -7649,6 +7773,22 @@ snapshots: '@firebase/webchannel-wrapper@1.0.4': {} + '@fontsource/atkinson-hyperlegible-next@5.2.7': {} + + '@fortawesome/fontawesome-common-types@6.7.2': {} + + '@fortawesome/fontawesome-svg-core@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + + '@fortawesome/free-regular-svg-icons@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + + '@fortawesome/free-solid-svg-icons@6.7.2': + dependencies: + '@fortawesome/fontawesome-common-types': 6.7.2 + '@graphql-codegen/add@5.0.3(graphql@16.10.0)': dependencies: '@graphql-codegen/plugin-helpers': 5.1.1(graphql@16.10.0) @@ -8188,6 +8328,8 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} + '@iconify/types@2.0.0': {} + '@istanbuljs/schema@0.1.3': {} '@jest/schemas@29.6.3': @@ -8217,6 +8359,12 @@ snapshots: dependencies: buffer: 6.0.3 + '@lit-labs/ssr-dom-shim@1.5.1': {} + + '@lit/reactive-element@2.1.2': + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@mapbox/geojson-rewind@0.5.2': dependencies: get-stream: 6.0.1 @@ -8226,18 +8374,30 @@ snapshots: '@mapbox/point-geometry@0.1.0': {} + '@mapbox/point-geometry@1.1.0': {} + '@mapbox/tilebelt@2.0.2': {} '@mapbox/tiny-sdf@2.0.6': {} + '@mapbox/tiny-sdf@2.0.7': {} + '@mapbox/unitbezier@0.0.1': {} '@mapbox/vector-tile@1.3.1': dependencies: '@mapbox/point-geometry': 0.1.0 + '@mapbox/vector-tile@2.0.4': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@types/geojson': 7946.0.16 + pbf: 4.0.1 + '@mapbox/whoots-js@3.1.0': {} + '@maplibre/geojson-vt@5.0.4': {} + '@maplibre/maplibre-gl-style-spec@23.3.0': dependencies: '@mapbox/jsonlint-lines-primitives': 2.0.2 @@ -8248,6 +8408,30 @@ snapshots: rw: 1.3.3 tinyqueue: 3.0.0 + '@maplibre/maplibre-gl-style-spec@24.4.1': + dependencies: + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/unitbezier': 0.0.1 + json-stringify-pretty-compact: 4.0.0 + minimist: 1.2.8 + quickselect: 3.0.0 + rw: 1.3.3 + tinyqueue: 3.0.0 + + '@maplibre/mlt@1.1.6': + dependencies: + '@mapbox/point-geometry': 1.1.0 + + '@maplibre/vt-pbf@4.2.1': + dependencies: + '@mapbox/point-geometry': 1.1.0 + '@mapbox/vector-tile': 2.0.4 + '@maplibre/geojson-vt': 5.0.4 + '@types/geojson': 7946.0.16 + '@types/supercluster': 7.1.3 + pbf: 4.0.1 + supercluster: 8.0.1 + '@napi-rs/wasm-runtime@0.2.9': dependencies: '@emnapi/core': 1.4.3 @@ -8269,6 +8453,46 @@ snapshots: '@nolyfill/is-core-module@1.0.39': {} + '@panoramax/web-viewer@4.4.0': + dependencies: + '@fontsource/atkinson-hyperlegible-next': 5.2.7 + '@fortawesome/fontawesome-svg-core': 6.7.2 + '@fortawesome/free-regular-svg-icons': 6.7.2 + '@fortawesome/free-solid-svg-icons': 6.7.2 + '@maplibre/vt-pbf': 4.2.1 + '@photo-sphere-viewer/core': 5.14.1 + '@photo-sphere-viewer/equirectangular-tiles-adapter': 5.14.1(@photo-sphere-viewer/core@5.14.1) + '@photo-sphere-viewer/gallery-plugin': 5.14.1(@photo-sphere-viewer/core@5.14.1) + '@photo-sphere-viewer/markers-plugin': 5.14.1(@photo-sphere-viewer/core@5.14.1) + '@photo-sphere-viewer/virtual-tour-plugin': 5.14.1(@photo-sphere-viewer/core@5.14.1) + geojson-vt: 4.0.2 + iconify-icon: 3.0.2 + json5: 2.2.3 + lit: 3.3.2 + maplibre-gl: 5.19.0 + pmtiles: 4.4.0 + query-selector-shadow-dom: 1.0.1 + + '@photo-sphere-viewer/core@5.14.1': + dependencies: + three: 0.179.1 + + '@photo-sphere-viewer/equirectangular-tiles-adapter@5.14.1(@photo-sphere-viewer/core@5.14.1)': + dependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/gallery-plugin@5.14.1(@photo-sphere-viewer/core@5.14.1)': + dependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/markers-plugin@5.14.1(@photo-sphere-viewer/core@5.14.1)': + dependencies: + '@photo-sphere-viewer/core': 5.14.1 + + '@photo-sphere-viewer/virtual-tour-plugin@5.14.1(@photo-sphere-viewer/core@5.14.1)': + dependencies: + '@photo-sphere-viewer/core': 5.14.1 + '@placemarkio/check-geojson@0.1.12': {} '@poppinss/cliui@6.4.3': @@ -8629,6 +8853,8 @@ snapshots: '@types/three@0.134.0': {} + '@types/trusted-types@2.0.7': {} + '@types/virtual-dom@2.1.4': {} '@types/ws@8.18.1': @@ -10180,6 +10406,8 @@ snapshots: earcut@3.0.1: {} + earcut@3.0.2: {} + easy-table@1.2.0: dependencies: ansi-regex: 5.0.1 @@ -10707,6 +10935,8 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + fflate@0.8.2: {} + figures@3.2.0: dependencies: escape-string-regexp: 1.0.5 @@ -10904,6 +11134,8 @@ snapshots: gl-matrix@3.4.3: {} + gl-matrix@3.4.4: {} + glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -11125,6 +11357,10 @@ snapshots: human-signals@5.0.0: {} + iconify-icon@3.0.2: + dependencies: + '@iconify/types': 2.0.0 + iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -11636,6 +11872,22 @@ snapshots: through: 2.3.8 wrap-ansi: 7.0.0 + lit-element@4.2.2: + dependencies: + '@lit-labs/ssr-dom-shim': 1.5.1 + '@lit/reactive-element': 2.1.2 + lit-html: 3.3.2 + + lit-html@3.3.2: + dependencies: + '@types/trusted-types': 2.0.7 + + lit@3.3.2: + dependencies: + '@lit/reactive-element': 2.1.2 + lit-element: 4.2.2 + lit-html: 3.3.2 + local-pkg@0.5.1: dependencies: mlly: 1.7.4 @@ -11754,6 +12006,31 @@ snapshots: three: 0.134.0 virtual-dom: 2.1.1 + maplibre-gl@5.19.0: + dependencies: + '@mapbox/geojson-rewind': 0.5.2 + '@mapbox/jsonlint-lines-primitives': 2.0.2 + '@mapbox/point-geometry': 1.1.0 + '@mapbox/tiny-sdf': 2.0.7 + '@mapbox/unitbezier': 0.0.1 + '@mapbox/vector-tile': 2.0.4 + '@mapbox/whoots-js': 3.1.0 + '@maplibre/geojson-vt': 5.0.4 + '@maplibre/maplibre-gl-style-spec': 24.4.1 + '@maplibre/mlt': 1.1.6 + '@maplibre/vt-pbf': 4.2.1 + '@types/geojson': 7946.0.16 + '@types/supercluster': 7.1.3 + earcut: 3.0.2 + gl-matrix: 3.4.4 + kdbush: 4.0.2 + murmurhash-js: 1.0.0 + pbf: 4.0.1 + potpack: 2.1.0 + quickselect: 3.0.0 + supercluster: 8.0.1 + tinyqueue: 3.0.0 + maplibre-gl@5.5.0: dependencies: '@mapbox/geojson-rewind': 0.5.2 @@ -12147,6 +12424,10 @@ snapshots: ieee754: 1.2.1 resolve-protobuf-schema: 2.1.0 + pbf@4.0.1: + dependencies: + resolve-protobuf-schema: 2.1.0 + performance-now@2.1.0: optional: true @@ -12168,6 +12449,10 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 + pmtiles@4.4.0: + dependencies: + fflate: 0.8.2 + pn@1.1.0: optional: true @@ -12442,6 +12727,8 @@ snapshots: potpack@2.0.0: {} + potpack@2.1.0: {} + prelude-ls@1.1.2: optional: true @@ -12504,6 +12791,8 @@ snapshots: quansync@0.2.11: {} + query-selector-shadow-dom@1.0.1: {} + queue-microtask@1.2.3: {} quickselect@2.0.0: {} @@ -13236,6 +13525,8 @@ snapshots: three@0.134.0: {} + three@0.179.1: {} + through@2.3.8: {} timeout-signal@2.0.0: {}