Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
ee994a1
feat: info menu
jona159 May 4, 2026
64aa69f
feat: add topbar button variant for coherent styling
jona159 May 4, 2026
b8e8768
feat: use osem logo with text for home button
jona159 May 4, 2026
5f3b642
feat: info menu component with informational links
jona159 May 4, 2026
80293a1
feat: translations
jona159 May 4, 2026
bd076c7
feat: add method to get total count of measurements
jona159 May 4, 2026
547d029
feat: download label
jona159 May 4, 2026
2d5e4eb
feat: topbar component, show devices and measurement stats
jona159 May 4, 2026
0018345
feat: format
jona159 May 4, 2026
bbd2552
refactor: download component
jona159 May 4, 2026
6fa1d32
feat: adjust info component
jona159 May 4, 2026
c391a21
feat: adjust menu component
jona159 May 4, 2026
3aaa261
feat: add settings component for header, minor things
jona159 May 4, 2026
4b8d4af
Merge branch 'dev' into feat/reorganize-toplevel-navigation
jona159 May 4, 2026
589665f
fix: after conflict
jona159 May 4, 2026
db30406
fix: pass user from loader
jona159 May 4, 2026
7ad4908
fix: rm unnecessary stuff
jona159 May 4, 2026
e165f30
feat: show logo and stats together
jona159 May 4, 2026
98d6fee
feat: add language dialog for the future
jona159 May 4, 2026
3f2063f
feat: show current language on hover only
jona159 May 4, 2026
f58a169
fix: dont show settings menu for now
jona159 May 4, 2026
528a2b9
fix: rm translation
jona159 May 4, 2026
913cd75
fix: rm useless mailbox icon, readd menu
jona159 May 4, 2026
9ed3f4e
fix: show donwload option also when not logged in
jona159 May 5, 2026
22fb5aa
feat: zoom to initial view state on home click
jona159 May 5, 2026
ae889bf
fix: rm unnecessary div
jona159 May 5, 2026
dc04511
fix: download
jona159 May 5, 2026
f8b9535
Merge branch 'dev' into feat/reorganize-toplevel-navigation
scheidtdav May 5, 2026
b8e51a4
feat: make map landing page, mv current to about (#907)
jona159 May 6, 2026
6f197b6
build(deps): bump @directus/sdk from 21.2.2 to 21.3.0 (#924)
dependabot[bot] May 6, 2026
79aab27
build(deps-dev): bump @react-router/dev from 7.14.2 to 7.15.0 (#925)
dependabot[bot] May 6, 2026
4900140
feat: differentiate pill shape buttons in topbar
jona159 May 6, 2026
f9eb00d
feat: shared style for topbar elements
jona159 May 6, 2026
fb4fe72
feat: button sizes
jona159 May 6, 2026
fa2dc87
feat: wrap in tooltip provider
jona159 May 6, 2026
248be2b
feat: visually align topbar elements
jona159 May 6, 2026
4ab3716
feat: translations
jona159 May 6, 2026
2324026
fix: rm unused
jona159 May 6, 2026
1dc4abd
Merge branch 'dev' into feat/reorganize-toplevel-navigation
jona159 May 6, 2026
6c151a3
Merge branch 'dev' into feat/reorganize-toplevel-navigation
scheidtdav May 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
736 changes: 409 additions & 327 deletions app/components/header/download.tsx

Large diffs are not rendered by default.

91 changes: 72 additions & 19 deletions app/components/header/home/index.tsx
Original file line number Diff line number Diff line change
@@ -1,22 +1,75 @@
import { Link } from 'react-router'
import { useTranslation } from 'react-i18next'
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '~/components/ui/tooltip'
import { topbarSurface } from '~/components/map/topbar-styles'
import { cn } from '~/lib/utils'

interface HomeProps {
deviceCount?: number
measurementCount?: number
onHomeClick?: () => void
}

export default function Home({
deviceCount = 0,
measurementCount = 0,
onHomeClick,
}: HomeProps) {
const { t } = useTranslation('menu')

export default function Home() {
return (
<div>
<div className="pointer-events-auto h-10 w-10">
<Link to="/">
<button
type="button"
className="h-10 w-10 rounded-full border border-gray-100 bg-white text-black shadow-xl hover:bg-gray-100"
>
<img
src="/img/logo.png"
alt="openSenseMapLogo"
className="mx-auto h-7 w-7"
/>
</button>
</Link>
</div>
</div>
<Tooltip>
<TooltipTrigger asChild>
<button
type="button"
onClick={onHomeClick}
aria-label={t('returnToGlobeView')}
className={cn(
topbarSurface({ shape: 'pill' }),
`
pointer-events-auto
flex items-center gap-3
px-3 pr-4
cursor-pointer
focus-visible:ring-2
focus-visible:ring-slate-950
focus-visible:ring-offset-2
focus-visible:outline-hidden
`,
)}
>
<img
src="/img/openSenseMap.png"
alt="openSenseMapLogo"
className="h-7 w-auto shrink-0"
/>

{deviceCount > 0 && (
<section className="flex flex-col text-left text-sm leading-tight">
<p>
<span className="font-semibold text-green-700">
{deviceCount}{' '}
</span>
<span>{t('devices')}</span>
</p>

<p>
<span className="font-semibold text-green-700">
{measurementCount}{' '}
</span>
<span>{t('measurements')}</span>
</p>
</section>
)}
</button>
</TooltipTrigger>

<TooltipContent side="bottom">
<p>{t('returnToGlobeView')}</p>
</TooltipContent>
</Tooltip>
)
}
}
13 changes: 1 addition & 12 deletions app/components/header/index.tsx
Original file line number Diff line number Diff line change
@@ -1,29 +1,18 @@
import LanguageSelector from '../landing/header/language-selector'
import Download from './download'
import Home from './home'
import Menu from './menu'
import NavBar from './nav-bar'
// import { useLoaderData } from "@remix-run/react";
// import Notification from "./notification";
// import type { loader } from "~/routes/explore.$deviceId._index";

interface HeaderProps {
devices: any
}

export default function Header(props: HeaderProps) {
// const data = useLoaderData<typeof loader>();
return (
<div className="items-top pointer-events-none fixed z-10 flex h-14 w-full justify-between gap-4 p-2">
<Home />
<NavBar devices={props.devices} />
<div className="flex gap-2">
<div className="pointer-events-auto flex h-10 w-16 items-center justify-center rounded-full bg-white shadow-md">
<LanguageSelector />
</div>
<Download devices={props.devices} />
{/* {data?.user?.email ? <Notification /> : null} */}
<Menu />
<Menu devices={props.devices}/>
</div>
</div>
)
Expand Down
109 changes: 109 additions & 0 deletions app/components/header/info/index.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,109 @@
import {
Globe,
FileLock2,
Coins,
ExternalLink,
ScrollText,
MessagesSquare,
InfoIcon,
} from 'lucide-react'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import { Link, useNavigation } from 'react-router'
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuTrigger,
} from '@/components/ui/dropdown-menu'
import { useRootRouteLoaderData } from '~/root'
import { Button } from '~/components/ui/button'

export default function Info() {
const { ENV } = useRootRouteLoaderData()
const [open, setOpen] = useState(false)
const navigation = useNavigation()

const { t } = useTranslation('menu')

return (
<DropdownMenu open={open} onOpenChange={setOpen} modal={false}>
<DropdownMenuTrigger asChild>
<div className="pointer-events-auto box-border h-10 w-10">
<Button variant="topbar" size="topbarIcon">
<InfoIcon />
</Button>
</div>
</DropdownMenuTrigger>
<DropdownMenuContent
className="w-56 dark:bg-zinc-800 dark:text-zinc-200 dark:opacity-95"
align="end"
forceMount
>
<div
className={
navigation.state === 'loading' ? 'pointer-events-none' : ''
}
>
<DropdownMenuGroup>
<Link to={ENV.COMMUNITY_URL} target="_blank">
<DropdownMenuItem className="cursor-pointer">
<MessagesSquare className="mr-2 h-5 w-5" />
<span>{t('community_label')}</span>
<ExternalLink className="ml-auto h-4 w-4 text-gray-300" />
</DropdownMenuItem>
</Link>
<Link to="https://docs.opensensemap.org/" target="_blank">
<DropdownMenuItem className="cursor-pointer">
<Globe className="mr-2 h-5 w-5" />
<span>{t('api_docs_label')}</span>
<ExternalLink className="ml-auto h-4 w-4 text-gray-300" />
</DropdownMenuItem>
</Link>
</DropdownMenuGroup>
<DropdownMenuSeparator />
<DropdownMenuGroup>
<Link to={'/privacy'}>
<DropdownMenuItem className="cursor-pointer">
<FileLock2 className="mr-2 h-5 w-5" />
<span>{t('data_protection_label')}</span>
</DropdownMenuItem>
</Link>
</DropdownMenuGroup>
<DropdownMenuGroup>
<Link to={'/terms'} target="_blank">
<DropdownMenuItem
onSelect={(e) => e.preventDefault()}
className="cursor-pointer"
>
<ScrollText className="mr-2 inline h-5 w-5" />
<span> {t('tos')}</span>
</DropdownMenuItem>
</Link>
</DropdownMenuGroup>
<DropdownMenuSeparator />

<DropdownMenuGroup>
<Link
to={
'https://www.betterplace.org/de/projects/89947-opensensemap-org-die-freie-karte-fuer-umweltdaten'
}
target="_blank"
>
<DropdownMenuItem
onSelect={(e) => e.preventDefault()}
className="cursor-pointer"
>
<Coins className="mr-2 inline h-5 w-5" />
<span> {t('donate_label')}</span>
<ExternalLink className="ml-auto h-4 w-4 text-gray-300" />
</DropdownMenuItem>
</Link>
</DropdownMenuGroup>
</div>
</DropdownMenuContent>
</DropdownMenu>
)
}
Loading
Loading