Skip to content

App Components

Vue reusable components

AccountButton

Header trigger that shows the current user name, notifications,

Props

Name Type Default Required
menuIsClosed Boolean true No
isLogged Boolean false No
userName String null No
ariaLabel String null No

Examples

<AccountButton
  :menu-is-closed="true"
  :is-logged="true"
  user-name="John Doe"
  aria-label="Toggle menu"
  @triggerToggleMenu="handleMenuToggle"
/>

Source: AccountButton.vue


App

Root application shell coordinating auth checks and layout visibility.


Source: App.vue


Burger

Mobile navigation drawer listing shortcuts, actions, and account links.

Examples

<Burger
  @triggerClose="handleClose"
/>

Source: Burger.vue


CalendarFilter

Date range selector used inside the sequences filters modal.

Props

Name Type Default Required
type String No
rangeSelected Object { start: null, end: null, type: '' } No

Examples

<CalendarFilter
  type="date-range"
  :range-selected="{ start: null, end: null, type: '' }"
  @triggerDate="handleDateRange"
  @triggerCloseModal="handleClose"
/>

Source: CalendarFilter.vue


Card

Presentational card showing an illustration, title, and short

Props

Name Type Default Required
title String null No
description String null No
imgSrc String null No
imgAlt String null No

Examples

<Card
  title="Showcase your sequence"
  description="Upload your photos and share them with the community."
  img-src="illustrations/share.svg"
  img-alt="Share your pictures"
/>

Source: Card.vue


CompleteUpload

Displays contextual information about an upload set and lets

Props

Name Type Default Required
uploadSets Object {} Yes

Emits

Event Value Type
triggerComplete UploadSetCreatedInterface

Examples

<CompleteUpload
  :upload-sets="currentUploadSet"
  @triggerComplete="handleUploadSetCompletion"
/>

Source: CompleteUpload.vue


DateInterval

Displays the time interval between the first and last capture

Examples

<DateInterval
  :first-date="new Date('2024-01-01T10:00:00')"
  :last-date="new Date('2024-01-01T14:30:00')"
/>

Source: DateInterval.vue


EditText

Component for displaying and editing text inline.

Props

Name Type Default Required
defaultText String null No
isLoading Boolean false No
isLoaded Boolean false No
formTitle String null No

Emits

Event Value Type
triggerNewText string | null

Examples

<EditText
  :default-text="'My title'"
  :is-loading="false"
  :is-loaded="true"
  form-title="Form title"
  @triggerNewText="handleTextChange"
/>

Source: EditText.vue


FolderList

Displays the folders currently being uploaded along with their

Props

Name Type Default Required
pictures Array [] No
currentFolder String null No

Examples

<FolderList
  :pictures="folders"
  :current-folder="currentFolderName"
/>

Source: FolderList.vue


HeaderApp

Main navigation component of the application.

Examples

<HeaderApp />

Source: HeaderApp.vue


HeaderOpen

Desktop dropdown menu showing authenticated shortcuts,

Props

Name Type Default Required
menuIsClosed Boolean true No
userName String No

Examples

<HeaderOpen
  :menu-is-closed="false"
  user-name="John Doe"
  @triggerClose="handleClose"
/>

Source: HeaderOpen.vue


ImageItem

Component for displaying an image item in a sequence.

Props

Name Type Default Required
disabled Boolean false No
created String null No
href String null No
hrefHd String null No
imageId String null No
selectedOnMap Boolean false No
canEdit Boolean false No
seqVisibility String No
visibility String No
status String No

Emits

Event Value Type
trigger void

Examples

<ImageItem
  :disabled="false"
  created="2024-01-01"
  href="/path/to/image.jpg"
  href-hd="/path/to/image-hd.jpg"
  image-id="123"
  :selected-on-map="false"
  :is-sequence-owner="true"
  visibility="anyone"
  seq-visibility="anyone"
  status="ready"
  @trigger="handleImageClick"
>
  <template #checkbox>
    <input type="checkbox" />
  </template>
</ImageItem>

Source: ImageItem.vue


ImageThumb

Displays a compact thumbnail with hover preview for sequence

Props

Name Type Default Required
count Number 0 No
href String No

Examples

<ImageThumb
  :count="5"
  href="/path/to/thumbnail.jpg"
/>

Source: ImageThumb.vue


InformationCard

Component for displaying an information card with an icon, title, text content,

Props

Name Type Default Required
text String null No
look String No

Examples

<InformationCard
  text="This is an information message"
  look="blue"
>
  <template #title>
    <h3>Information Title</h3>
  </template>
  <template #button>
    <Button text="Action" />
  </template>
  <template #cross>
    <button @click="close">×</button>
  </template>
</InformationCard>

Source: InformationCard.vue


Input

Reusable input component supporting text and number types.

Props

Name Type Default Required
type String 'text' No
min String No
max String No
maxlength String No
text \[String null No
placeholder \[String No

Emits

Event Value Type
input string

Examples

<Input
  type="text"
  :text="initialValue"
  placeholder="Enter text"
  maxlength="50"
  @input="handleInput"
/>
<Input
  type="number"
  :text="0"
  min="0"
  max="100"
  placeholder="Enter number"
  @input="handleNumberInput"
/>

Source: Input.vue


InputCheckbox

Custom checkbox component supporting checked, unchecked, and indeterminate states.

Props

Name Type Default Required
name String null No
label String No
isChecked Boolean false No
isIndeterminate Boolean false No

Emits

Event Value Type
trigger CheckboxInterface

Examples

<InputCheckbox
  name="my-checkbox"
  label="Check this option"
  :is-checked="false"
  :is-indeterminate="false"
  @trigger="handleCheckboxChange"
/>

Source: InputCheckbox.vue


InputRadio

Custom radio button component with support for icons, labels, and hidden styling.

Props

Name Type Default Required
disabled Boolean false No
isHidden Boolean false No
name String null No
icon String null No
id String No
label String No
value String null No
hasSameValues Boolean false No

Emits

Event Value Type
trigger string

Examples

<InputRadio
  id="option1"
  name="options"
  label="Option 1"
  icon="bi bi-circle"
  :value="selectedValue"
  :disabled="false"
  :is-hidden="false"
  :has-same-values="false"
  @trigger="handleRadioChange"
/>

Source: InputRadio.vue


InputSwitch

Toggle switch component with support for increase/decrease labels and icons.

Props

Name Type Default Required
isChecked Boolean false No
look String No

Emits

Event Value Type
trigger { isChecked: boolean }

Examples

<InputSwitch
  :is-checked="false"
  look=""
  @trigger="handleSwitchChange"
/>
<InputSwitch
  :is-checked="true"
  look="rounded"
  @trigger="handleSwitchChange"
/>

Source: InputSwitch.vue


InputUpload

File upload component supporting drag-and-drop, file selection, and folder upload.

Props

Name Type Default Required
isLogged Boolean false No
disabled Boolean false No
text String null No
textPictureType String null No
textSecondPart String null No
look String No

Emits

Event Value Type
trigger FolderInterface\[\] | File\[\] | FileList
triggerCancel void
triggerDrop void

Examples

<InputUpload
  :is-logged="true"
  :disabled="false"
  text="Drop files here"
  look="yellow"
  @trigger="handleFiles"
  @triggerCancel="handleCancel"
  @triggerDrop="handleDrop"
/>

Source: InputUpload.vue


Wrapper layout for legal pages. Displays an optional summary

Props

Name Type Default Required
htmlContent String No

Examples

<Legal
  html-content="<p>Legal content here</p>"
>
  <template #summary>
    <Summary />
  </template>
</Legal>

Source: Legal.vue


License

Component for displaying license information with an icon, translated text, and a link.

Props

Name Type Default Required
url String null No
text String null No

Examples

<License
  url="https://creativecommons.org/licenses/by/4.0/"
  text="CC BY 4.0"
>
  <i class="bi bi-cc-circle"></i>
</License>

Source: License.vue


Loader

Animated loading spinner component with configurable size and color.

Props

Name Type Default Required
text String null No
look String 'sm' No
color String 'blue' No
isLoaded Boolean true No

Examples

<Loader
  look="md"
  color="blue"
  :is-loaded="false"
/>
<Loader
  look="sm"
  color="white"
  :is-loaded="true"
/>

Source: Loader.vue


LoaderPicturesDetails

Displays a compact counter showing the number of pictures already

Props

Name Type Default Required
look String No
text String null No
picturesCount Number null No
pictures Number null No

Examples

<LoaderPicturesDetails
  look="xsm"
  text="Pictures processed"
  :pictures="42"
  :pictures-count="120"
/>

Source: LoaderPicturesDetails.vue


LoginRegisterButton

Dual-call-to-action button redirecting users to the auth portal.

Examples

<LoginRegisterButton />

Source: LoginRegisterButton.vue


Bootstrap modal component with title and body slot.

Props

Name Type Default Required
title String No

Examples

<Modal
  ref="modalRef"
  title="Modal Title"
>
  <template #body>
    <p>Modal content goes here</p>
  </template>
</Modal>
// In script:
const modalRef = ref()
modalRef.value?.show() // or modalRef.value?.close()

Source: Modal.vue


MyTokens

Component for managing user API tokens and default visibility settings.

Examples

<MyTokens />

Source: MyTokens.vue


NotificationDetails

Notification details component

Examples

<NotificationDetails />

Source: NotificationDetails.vue


Notifications

Lightweight badge displaying the number of notifications on an account

Props

Name Type Default Required
notifications Object null No

Examples

<Notifications :notifications="notificationsStore.someNotification" />/>

Source: Notifications.vue


Pagination

Pagination button component for navigating through paginated content.

Props

Name Type Default Required
href String null No

Emits

Event Value Type
trigger string

Examples

<Pagination
  href="/api/items?page=2"
  :self-link="{ href: '/api/items?page=1' }"
  type="right"
  @trigger="handlePagination"
/>

Source: Pagination.vue


PanelOrientationManagement

Control panel that lets contributors fine-tune the orientation

Props

Name Type Default Required
roadDegrees Number 0 No
seqBruteDeg Number 0 No
isLoading Boolean false No

Emits

Event Value Type
triggerAngle number
triggerMovingAngle number

Examples

<PanelOrientationManagement
  :road-degrees="150"
  :seq-brute-deg="145"
  :is-loading="false"
  @triggerAngle="handleAngleChange"
  @triggerMovingAngle="handleMovingAngle"
/>

Source: PanelOrientationManagement.vue


PanelPhotosManagement

Management panel for displaying and managing sequence pictures.

Props

Name Type Default Required
pictures Array [] No
picturesToDelete Array [] No

Emits

Event Value Type
triggerInputCheck CheckboxInterface
triggerInputCheckItem string
triggerGoToNextPage string
triggerSelectImageAndMove PicturesInterface
triggerPatchOrDeleteCollectionItems string

Examples

<PanelPhotosManagement
  :pictures="photoList"
  :pictures-to-delete="selectedIds"
  :sequence="currentSequence"
  :pagination-links="links"
  :is-sequence-owner="true"
  @triggerInputCheck="handleBulkSelection"
  @triggerPatchOrDeleteCollectionItems="handleDelete"
/>

Source: PanelPhotosManagement.vue


PanelSortManagement

Sorting form for sequence pictures allowing users to pick the

Props

Name Type Default Required
sequenceSorted String null No

Emits

Event Value Type
triggerSort string

Examples

<PanelSortManagement
  :sequence-sorted="'+gpsdate'"
  @triggerSort="handleSort"
/>

Source: PanelSortManagement.vue


ParamsPanel

Collapsible advanced upload settings letting contributors tweak

Props

Name Type Default Required
isEditionMode Boolean false No
angleResponse Number 0 No

Emits

Event Value Type
triggerParams UploadParamsInterface
triggerMovingAngle number
triggerUpdateUploadSets UploadSetCreatedInterface

Examples

<ParamsPanel
  :is-edition-mode="false"
  :angle-response="angle"
  @triggerParams="handleParams"
  @triggerMovingAngle="previewAngle"
  @triggerUpdateUploadSets="refreshUploadSet"
/>

Source: ParamsPanel.vue


PictureItem

Displays an uploaded picture row in the upload summary. Shows the

Props

Name Type Default Required
name String No
text String No
look String 'default' No

Examples

<PictureItem
  name="IMG_001.jpg"
  text="Uploaded successfully"
  look="success"
>
  <Button look="link--blue-dark" text="View" />
</PictureItem>

Source: PictureItem.vue


ProgressBar

Visualizes upload progress including errors. Displays a green

Props

Name Type Default Required
percentage Number 0 No
errorPercentage Number 0 No
itemsBroken Number 0 No
itemsRejected Number 0 No

Examples

<ProgressBar
  :percentage="75"
  :error-percentage="15"
  :items-broken="2"
  :items-rejected="1"
/>

Source: ProgressBar.vue


SequenceSection

Displays the list of sequences created from the current upload

Props

Name Type Default Required
listDisplayed Boolean false No
uploadSets Object null No
newSeqTitle String No
isLoading Boolean false No
isLoaded Boolean false No

Examples

<SequenceSection
  :list-displayed="hasSequences"
  :upload-sets="currentUploadSet"
  :new-seq-title="pendingTitle"
  :is-loading="isSaving"
  :is-loaded="hasLoaded"
/>

Source: SequenceSection.vue


SequenceStatus

Component for displaying sequence status or visibility with icon and translated text.

Props

Name Type Default Required
status String null No
isSquare Boolean true No

Examples

<SequenceStatus
  status="waiting-for-process"
  :is-square="true"
/>
<SequenceStatus
  status="anyone"
  :is-square="false"
/>

Source: SequenceStatus.vue


Summary

Fetches and displays the localized end-user license summary.

Examples

<Summary />

Source: Summary.vue


TabPanel

Tab panel component for switching between different views (photos, orientation, sort).

Props

Name Type Default Required
picturesCount Number 0 No
panelSelected String No
isLoading Boolean false No
canEditOrientation Boolean false No
canEditSort Boolean false No

Examples

<TabPanel
  :pictures-count="10"
  panel-selected="photos"
  :is-loading="false"
  :is-sequence-owner="true"
  @trigger="handleTabChange"
/>

Source: TabPanel.vue


TagsLabel

Presents a label with an optional tooltip shown on hover, used

Props

Name Type Default Required
label String null No
description String null No

Examples

<TagsLabel
  label="Duplication"
  description="Avoid uploading duplicated pictures"
/>

Source: TagsLabel.vue


TagsPanel

Wrapper around the `` custom element that

Wrapper around the `` custom element that

Props

Name Type Default Required
semanticsEditor Array [] No
isEditionMode Boolean false No
uploadSetId String No

Emits

Event Value Type
triggerSemantics { semantics: TagInterface\[\] }
triggerUpdateUploadSets UploadSetCreatedInterface

Examples

<TagsPanel
  :semantics-editor="currentSemantics"
  :is-edition-mode="true"
  upload-set-id="123"
  @triggerSemantics="handleSemantics"
  @triggerUpdateUploadSets="refreshUploadSet"
/>

Source: TagsPanel.vue


Terminal

Terminal-style component for displaying installation and upload commands.

Props

Name Type Default Required
textUpload String No
textInstall String No

Examples

<Terminal
  text-install="pip install panoramax"
  text-upload="panoramax upload ./images"
/>

Source: Terminal.vue


TransportPanel

Provides quick transport-mode selectors (walk, bike, car, other)

Emits

Event Value Type
triggerSemantics { transport: TagInterface }

Examples

<TransportPanel
  :selected-transport="currentTransport"
  @triggerSemantics="handleTransportChange"
/>

Source: TransportPanel.vue


TreatmentBlock

Displays textual progress states and renders the shared

Props

Name Type Default Required
uploadSets Object null No
percentage Number 0 No
errorPercentage Number 0 No
progressClasse String No

Examples

<TreatmentBlock
  :upload-sets="currentUploadSet"
  :percentage="75"
  :error-percentage="10"
  progress-classe="text-blue"
>
  <template #subtitle>
    <h3>Processing status</h3>
  </template>
</TreatmentBlock>

Source: TreatmentBlock.vue


TripleSelectButton

Component for selecting visibility level (anyone, logged-only, owner-only) for images.

Props

Name Type Default Required
imagesFullSelected Array [] No
possibleVisibilities Array [] No
canEditVisibility Boolean false No

Emits

Event Value Type
triggerVisibility string

Examples

<TripleSelectButton
  :images-full-selected="selectedImages"
  :possible-visibilities="['anyone', 'logged-only', 'owner-only']"
  @triggerVisibility="handleVisibilityChange"
/>

Source: TripleSelectButton.vue


Tutorial

Displays static tutorial images guiding Android users through

Examples

<Tutorial />

Source: Tutorial.vue


UploadError

Summary card grouping upload errors or warnings. Displays a

Props

Name Type Default Required
count Number 0 No
severity String null No
pictures Array [] No

Examples

<UploadError
  severity="error"
  :count="5"
  :pictures="errorList"
/>

Source: UploadError.vue


UploadErrorBlock

Accordion showing grouped upload errors for a specific reason.

Props

Name Type Default Required
errors Array [] No
isOpen Boolean false No

Examples

<UploadErrorBlock :errors="errorGroup" />

Source: UploadErrorBlock.vue


UploadErrorMessage

Displays a simple error banner with an icon and message for the

Props

Name Type Default Required
uploadError String null No

Examples

<UploadErrorMessage upload-error="An unexpected error occurred." />

Source: UploadErrorMessage.vue


UploadingBlock

High-level block orchestrating the upload progress UI:

Examples

<UploadingBlock />

Source: UploadingBlock.vue


UploadingImg

Static illustration component showing a person graphic with a rotating loader animation.

Examples

<UploadingImg />

Source: UploadingImg.vue


UploadLoader

Displays the upload progress spinner, success/error states,

Props

Name Type Default Required
loadPercentage String '0%' No
isLoaded Boolean false No
isLoading Boolean false No
uploadedSequence Object null No
picturesCount Number null No
picturesCountErr Number null No
picturesTotalCount Number null No
otherFilesCount Number null No
uploadError String null No

Examples

<UploadLoader
  :load-percentage="'75%'"
  :is-loading="true"
  :uploaded-sequence="sequence"
  :pictures-count="120"
/>

Source: UploadLoader.vue


UploadSetBlocks

Lists unfinished upload sets so contributors can resume or delete

Examples

<UploadSetBlocks />

Source: UploadSetBlocks.vue


UploadSummary

Displays detailed information about a single upload set, including

Props

Name Type Default Required
uploadSets Object null No
isLoading Boolean false No

Examples

<UploadSummary
  :upload-sets="currentUploadSet"
  :is-loading="isLoading"
  @triggerComplete="handleComplete"
  @triggerResetUpload="startNewUpload"
/>

Source: UploadSummary.vue


VisibilityBlock

Radio button group that lets contributors choose the visibility

Props

Name Type Default Required
visibility String null No
possibleVisibilities Array [] No
description String null No
ownerOnlyDescription String null No
loggedOnlyDescription String null No
anyoneDescription String null No

Emits

Event Value Type
triggerVisibility string

Examples

<VisibilityBlock
  visibility="anyone"
  :possible-visibilities="['anyone', 'logged-only', 'owner-only']"
  description="Choose visibility level"
  @triggerVisibility="handleVisibilityChange"
/>

Source: VisibilityBlock.vue


WebsiteViewer

Multi-purpose Panoramax container component that can render the viewer, editor, or coverage map.

Props

Name Type Default Required
id String 'viewer' No
viewerType String 'viewer' No
picId String null No
seqId String null No
userId \[String null No

Emits

Event Value Type
triggerPicId { seqId: string; metadatas?: string }
triggerPicIdAndRedirect string
triggerReady HTMLElement?
triggerPicIdAndSelect string

Examples

<WebsiteViewer
  id="viewer-1"
  viewer-type="viewer"
  :params="{ map: {} }"
  @triggerPicId="handlePicSelection"
  @triggerReady="handleViewerReady"
/>
<WebsiteViewer
  id="editor-1"
  viewer-type="editor"
  seq-id="123"
  pic-id="456"
  :params="{ raster: {} }"
  @triggerReady="handleEditorReady"
/>

Source: WebsiteViewer.vue


WidgetOrientation

Interactive widget allowing users to rotate the capture

Props

Name Type Default Required
roadDegrees Number 0 No
seqBruteDeg Number 0 No
indexCar Number 1 No

Emits

Event Value Type
triggerAngle number
triggerMovingAngle number

Examples

<WidgetOrientation
  :road-degrees="150"
  :seq-brute-deg="orientation"
  :index-car="3"
  @triggerAngle="handleAngleChange"
  @triggerMovingAngle="handleMovingAngle"
/>

Source: WidgetOrientation.vue