Skip to content

Commit

Permalink
feat(landing): carousel of preview boards (#1639)
Browse files Browse the repository at this point in the history
* feat(landing): add carousel of preview-boards

* feat(landing): update preview boards

* style(landing): add light and dark themes to previewboards

* style(landing): add fade animation to tavla carousel

* style(landing): make previewboards wider in mobile-view

* chore(landing): add posthog to carousel buttons

* fix(landing): change arrow icons to be buttons and remove unneccessary divs

* fix(landing): keyboard navigation and voiceover of preview boards

* chore(landing): add aria-label to button group
  • Loading branch information
SelmaBergstrand authored Sep 17, 2024
1 parent 59658f1 commit 23eea24
Show file tree
Hide file tree
Showing 3 changed files with 217 additions and 101 deletions.
104 changes: 101 additions & 3 deletions tavla/app/(admin)/components/Preview/index.tsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,119 @@
'use client'

import { IconButton } from '@entur/button'
import { LeftArrowIcon, RightArrowIcon } from '@entur/icons'
import { Board } from 'Board/scenarios/Board'
import { usePostHog } from 'posthog-js/react'
import { useEffect, useState } from 'react'
import { TBoard } from 'types/settings'

const CarouselIndicators = ({
boards,
activeIndex,
onClick,
}: {
boards: TBoard[]
activeIndex: number
onClick: (index: number) => void
}) => {
return (
<div
className="flex flex-row md:space-x-3 space-x-5 justify-center mt-4"
aria-label="Knapper for å bytte mellom avgangstavler"
>
{boards.map((_, index) => (
<button
key={index}
className={`md:w-5 md:h-5 w-6 h-6 rounded-full bottom-5 ${
index === activeIndex ? 'bg-blue' : 'bg-tertiary'
}`}
onClick={() => onClick(index)}
/>
))}
</div>
)
}

function Preview({ boards }: { boards: TBoard[] }) {
const [boardIndex, setBoardIndex] = useState(0)
const [fade, setFade] = useState(true)
const posthog = usePostHog()

useEffect(() => {
const interval = setInterval(() => {
setBoardIndex((boardIndex + 1) % boards.length)
}, 10000)
setFade(false)
setTimeout(() => {
setBoardIndex((boardIndex + 1) % boards.length)
setFade(true)
}, 500)
}, 4500)
return () => clearInterval(interval)
}, [boardIndex, boards])

const nextSlide = () => {
posthog.capture('CAROUSEL_ARROW_BTN')
setBoardIndex((prevIndex) =>
prevIndex === boards.length - 1 ? 0 : prevIndex + 1,
)
}
const prevSlide = () => {
posthog.capture('CAROUSEL_ARROW_BTN')
setBoardIndex((prevIndex) =>
prevIndex === 0 ? boards.length - 1 : prevIndex - 1,
)
}

const goToSlide = (index: number) => {
posthog.capture('CAROUSEL_INDICATOR_BTNS')
setBoardIndex(index)
}

const currentBoard = boards[boardIndex] ?? undefined
if (!currentBoard) return null
return <Board board={currentBoard} style={{ display: 'flex' }} />
return (
<div className="xl:w-1/2 h-[50vh] overflow-hidden rounded-2xl py-10 w-full">
<div className="flex flex-row h-[40vh]">
<div className="my-auto hidden md:block ml-2">
<IconButton
onClick={prevSlide}
aria-label="Vis forrige tavle"
>
<LeftArrowIcon />
</IconButton>
</div>
<div
className="w-full mx-auto"
data-theme={currentBoard.theme ?? 'dark'}
>
<div
aria-label="Eksempel på avgangstavler"
className={`w-full h-full transform transition-all duration-500 ease-in-out p-2 ${
fade ? 'opacity-100' : 'opacity-0'
}`}
>
<Board
aria-hidden
board={currentBoard}
style={{ display: 'flex' }}
/>
</div>
</div>
<div className="my-auto hidden md:block mr-2">
<IconButton
onClick={nextSlide}
aria-label="Vis neste tavle"
>
<RightArrowIcon />
</IconButton>
</div>
</div>

<CarouselIndicators
boards={boards}
activeIndex={boardIndex}
onClick={goToSlide}
/>
</div>
)
}
export { Preview }
150 changes: 70 additions & 80 deletions tavla/app/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -51,90 +51,80 @@ async function Landing() {
</div>
</div>
</div>
<div className="flex flex-col justify-center pb-10">
<div className="flex flex-col mx-auto items-center justify-start py-4 container overflow-hidden">
<div className="flex flex-col items-center justify-start gap-4 py-4 w-full">
<div
className="xl:w-1/2 h-[40vh] overflow-hidden rounded-2xl py-10 w-full"
data-theme="dark"
>
<Preview boards={previewBoards} />
</div>

<div className="xl:w-1/2">
<Heading2>Kort om Tavla</Heading2>
<UnorderedList className="space-y-3 flex flex-col gap-1 pl-6">
<ListItem>
Du kan lage avgangstavler fra alle
stoppesteder, holdeplasser, knutepunkter,
fergekaier mm. i hele Norge. Dette gjelder
for alle typer offentlig transport,
inkludert ferger, hurtigbåter og fly.
</ListItem>
<ListItem>
Det er helt gratis å implementere og bruke
Tavla.
</ListItem>
<ListItem>
Tavla kan vises på ulike typer skjermer og
er tilpasset flere operativsystem og
oppløsninger.
</ListItem>
</UnorderedList>
<Paragraph className="pt-50 italic">
Tavla sin kildekode er tilgjengelig for alle på{' '}
<EnturLink href="https://github.com/entur/tavla">
GitHub
</EnturLink>
. Dette gjør at du kan følge utviklingen av
produktet direkte og foreslå forbedringer selv.
</Paragraph>
<div className="flex flex-col mx-auto items-center justify-start py-4 container overflow-hidden pb-10">
<div className="flex flex-col items-center justify-start gap-4 py-4 w-full">
<Preview boards={previewBoards} />

<Heading3>Enkelt å tilpasse og samarbeide</Heading3>
<div className="xl:w-1/2">
<Heading2>Kort om Tavla</Heading2>
<UnorderedList className="space-y-3 flex flex-col gap-1 pl-6">
<ListItem>
Du kan lage avgangstavler fra alle stoppesteder,
holdeplasser, knutepunkter, fergekaier mm. i
hele Norge. Dette gjelder for alle typer
offentlig transport, inkludert ferger,
hurtigbåter og fly.
</ListItem>
<ListItem>
Det er helt gratis å implementere og bruke
Tavla.
</ListItem>
<ListItem>
Tavla kan vises på ulike typer skjermer og er
tilpasset flere operativsystem og oppløsninger.
</ListItem>
</UnorderedList>
<Paragraph className="pt-50 italic">
Tavla sin kildekode er tilgjengelig for alle på{' '}
<EnturLink href="https://github.com/entur/tavla">
GitHub
</EnturLink>
. Dette gjør at du kan følge utviklingen av
produktet direkte og foreslå forbedringer selv.
</Paragraph>

<UnorderedList className="space-y-3 flex flex-col gap-1 pl-6">
<ListItem>
Tilpass tekststørrelse, fargetema, logo og
hvilken informasjon som skal vises, slik at
tavlen(e) passer til dine omgivelser og dine
besøkende sine behov.
</ListItem>
<ListItem>
Velg om du vil vise hele kollektivtilbudet
fra et stoppested, eller kun vise spesifikke
linjer, stoppesteder eller fremkomstmidler.
</ListItem>
<ListItem>
Opprett organisasjoner (mapper) for å samle
tavler og gi andre tilgang til å
administrere dem. Her kan du også velge
standardinnstillinger som vil gjelde alle
tavler i organisasjonen.
</ListItem>
</UnorderedList>
<Heading3>Enkelt å tilpasse og samarbeide</Heading3>

<Heading2 className="pt-8">
Eksempler på bruk
</Heading2>
<Heading3>Hoteller</Heading3>
<Paragraph>
Plasser Tavla i resepsjonsområdet slik at
gjester kan se sanntidsinformasjon om avganger
fra stoppesteder i nærheten.
</Paragraph>
<Heading3>Arbeidsplasser</Heading3>
<Paragraph>
Vis Tavla på informasjonspunkter eller skjermer
ved inngangen slik at besøkende enkelt kan
planlegge hjemreisen.
</Paragraph>
<Heading3>Kjøpesentre</Heading3>
<Paragraph>
Sett opp Tavla på sentrale steder slik at kunder
alltid har oppdatert informasjon om offentlig
transport.
</Paragraph>
</div>
<UnorderedList className="space-y-3 flex flex-col gap-1 pl-6">
<ListItem>
Tilpass tekststørrelse, fargetema, logo og
hvilken informasjon som skal vises, slik at
tavlen(e) passer til dine omgivelser og dine
besøkende sine behov.
</ListItem>
<ListItem>
Velg om du vil vise hele kollektivtilbudet fra
et stoppested, eller kun vise spesifikke linjer,
stoppesteder eller fremkomstmidler.
</ListItem>
<ListItem>
Opprett organisasjoner (mapper) for å samle
tavler og gi andre tilgang til å administrere
dem. Her kan du også velge standardinnstillinger
som vil gjelde alle tavler i organisasjonen.
</ListItem>
</UnorderedList>

<Heading2 className="pt-8">Eksempler på bruk</Heading2>
<Heading3>Hoteller</Heading3>
<Paragraph>
Plasser Tavla i resepsjonsområdet slik at gjester
kan se sanntidsinformasjon om avganger fra
stoppesteder i nærheten.
</Paragraph>
<Heading3>Arbeidsplasser</Heading3>
<Paragraph>
Vis Tavla på informasjonspunkter eller skjermer ved
inngangen slik at besøkende enkelt kan planlegge
hjemreisen.
</Paragraph>
<Heading3>Kjøpesentre</Heading3>
<Paragraph>
Sett opp Tavla på sentrale steder slik at kunder
alltid har oppdatert informasjon om offentlig
transport.
</Paragraph>
</div>
</div>
</div>
Expand Down
64 changes: 46 additions & 18 deletions tavla/src/Shared/utils/previewBoards.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,20 @@ export const previewBoards: TBoard[] = [
meta: {
fontSize: 'medium',
},
theme: 'dark',
tiles: [
{
columns: ['line', 'destination', 'time', 'realtime'],
placeId: 'NSR:StopPlace:58260',
name: 'Dalsbergstien',
columns: [
'line',
'destination',
'time',
'realtime',
'platform',
],
placeId: 'NSR:StopPlace:61291',
name: 'Stavanger stasjon, Stavanger',
type: 'stop_place',
uuid: 'uoO6yA-S0ztol4auy_QSv',
uuid: '1s9E_8qW_e2-cWii94rl4',
},
],
},
Expand All @@ -25,10 +32,17 @@ export const previewBoards: TBoard[] = [
tiles: [
{
columns: ['line', 'destination', 'time', 'realtime'],
placeId: 'NSR:StopPlace:58366',
name: 'Jernbanetorget',
placeId: 'NSR:StopPlace:58382',
name: 'Aker brygge, Oslo',
type: 'stop_place',
uuid: 'uoO6yA-S0ztol4auy_QSv',
uuid: 'lqfe6yE6hStaM8yWbfmb2',
whitelistedLines: [
'RUT:Line:3701',
'RUT:Line:3702',
'RUT:Line:3810',
'RUT:Line:3820',
'RUT:Line:3821',
],
},
],
},
Expand All @@ -37,20 +51,34 @@ export const previewBoards: TBoard[] = [
meta: {
fontSize: 'medium',
},
theme: 'light',
tiles: [
{
columns: [
'line',
'destination',
'time',
'realtime',
'arrivalTime',
],
placeId: 'NSR:StopPlace:58767',
name: 'Festøya ferjekai, Ørsta',
columns: ['line', 'destination', 'time', 'realtime'],
placeId: 'NSR:StopPlace:58856',
name: 'Lysaker stasjon, Bærum',
type: 'stop_place',
uuid: 'WPLoeygP7d173RifiQDvd',
walkingDistance: {
distance: 868,
visible: true,
},
},
],
},
{
id: 'aLr7VN03RDThtjYYfd9v',
meta: {
fontSize: 'medium',
},
theme: 'light',
tiles: [
{
columns: ['line', 'destination', 'time', 'realtime'],
placeId: 'NSR:StopPlace:59261',
name: 'Trondheim lufthavn, Stjørdal',
type: 'stop_place',
uuid: 'syD_TXEoo5x3R8ar2gB_V',
whitelistedLines: ['MOR:Line:1049', 'MOR:Line:1069'],
uuid: 'iELiaTnG7uxRM6aN2Ba9A',
},
],
},
Expand Down

0 comments on commit 23eea24

Please sign in to comment.