Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
1,287 changes: 637 additions & 650 deletions app/components/device-detail/device-detail-box.tsx

Large diffs are not rendered by default.

6 changes: 3 additions & 3 deletions app/components/header/menu/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -97,15 +97,15 @@ export default function Menu() {
<Link to="/explore">
<DropdownMenuItem className="cursor-pointer">
<Compass className="mr-2 h-5 w-5" />
<span>{t("explore_label")}</span>
<span>{"Explore"}</span>
</DropdownMenuItem>
</Link>
)}
{!(matches[1].pathname === "/profile") && (
<Link to="/profile/me">
<DropdownMenuItem className="cursor-pointer">
<User2 className="mr-2 h-5 w-5" />
{t("profile_label")}
Profile
</DropdownMenuItem>
</Link>
)}
Expand All @@ -114,7 +114,7 @@ export default function Menu() {
<Link to="/settings/profile">
<DropdownMenuItem className=" cursor-pointer">
<Settings className="mr-2 h-5 w-5" />
<span>{t("settings_label")}</span>
<span>{"Settings"}</span>
</DropdownMenuItem>
<DropdownMenuSeparator />
</Link>
Expand Down
202 changes: 98 additions & 104 deletions app/components/landing/footer.tsx
Original file line number Diff line number Diff line change
@@ -1,106 +1,100 @@
import { useTranslation } from 'react-i18next'

export default function Footer() {
const { t } = useTranslation('footer')
return (
<footer
id="footer"
className="w-full bg-white px-4 text-gray-300 dark:bg-black dark:text-gray-100 sm:p-6 lg:text-lg"
>
<hr className="my-6 border-gray-300 dark:border-gray-100 sm:mx-auto lg:my-8" />
<div className="mx-auto w-full max-w-screen-xl p-4 md:flex md:items-center md:justify-between">
<span className="text-sm text-gray-500 dark:text-gray-400 sm:text-center">
© 2025{' '}
<a href="https://opensenselab.org/" className="hover:underline">
openSenseLab
</a>
. {t('rightsReserved')}
</span>
<ul className="mt-3 flex flex-wrap items-center text-sm font-medium text-gray-500 dark:text-gray-400 sm:mt-0">
<li>
<a
href="/imprint"
target="_blank"
rel="noopener noreferrer"
className="px-2 hover:text-light-green dark:hover:text-green-200 md:px-8"
>
{t('imprint')}
</a>
</li>
<li>
<a
href="/privacy"
target="_blank"
rel="noopener noreferrer"
className="px-2 hover:text-light-green dark:hover:text-green-200 md:px-8"
>
{t('dataProtection')}
</a>
</li>
<li>
<a
href="https://www.instagram.com/opensenselab/"
target="_blank"
rel="noopener noreferrer"
className="px-2 hover:text-light-green dark:hover:text-green-200 md:px-8"
>
<svg
className="h-10 w-10"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fillRule="evenodd"
d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z"
clipRule="evenodd"
/>
</svg>
<span className="sr-only">{t('instagram')}</span>
</a>
</li>
<li>
<a
href="https://twitter.com/openSenseLab"
target="_blank"
rel="noopener noreferrer"
className="px-2 hover:text-light-green dark:hover:text-green-200 md:px-8"
>
<svg
className="h-10 w-10"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" />
</svg>
<span className="sr-only">{t('twitter')}</span>
</a>
</li>
<li>
<a
href="https://github.com/opensensemap"
target="_blank"
rel="noopener noreferrer"
className="px-2 hover:text-light-green dark:hover:text-green-200 md:px-8"
>
<svg
className="h-10 w-10"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fillRule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clipRule="evenodd"
/>
</svg>
<span className="sr-only">{t('github')}</span>
</a>
</li>
</ul>
</div>
</footer>
)
return (
<footer id="footer" className="w-full bg-white px-4 text-gray-300 dark:bg-black dark:text-gray-100 sm:p-6 lg:text-lg">
<hr className="my-6 border-gray-300 dark:border-gray-100 sm:mx-auto lg:my-8" />
<div className="mx-auto w-full max-w-screen-xl p-4 md:flex md:items-center md:justify-between">
<span className="text-sm text-gray-500 dark:text-gray-400 sm:text-center">
© 2023{" "}
<a href="https://flowbite.com/" className="hover:underline">
openSenseLab
</a>
. All Rights Reserved.
</span>
<ul className="mt-3 flex flex-wrap items-center text-sm font-medium text-gray-500 dark:text-gray-400 sm:mt-0">
<li>
<a
href="/imprint"
target="_blank"
rel="noopener noreferrer"
className="dark:hover:text-green-200 px-2 hover:text-light-green md:px-8"
>
Impressum
</a>
</li>
<li>
<a
href="/privacy"
target="_blank"
rel="noopener noreferrer"
className="dark:hover:text-green-200 px-2 hover:text-light-green md:px-8"
>
Datenschutz
</a>
</li>
<li>
<a
href="https://www.instagram.com/opensenselab/"
target="_blank"
rel="noopener noreferrer"
className="dark:hover:text-green-200 px-2 hover:text-light-green md:px-8"
>
<svg
className="h-10 w-10"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fillRule="evenodd"
d="M12.315 2c2.43 0 2.784.013 3.808.06 1.064.049 1.791.218 2.427.465a4.902 4.902 0 011.772 1.153 4.902 4.902 0 011.153 1.772c.247.636.416 1.363.465 2.427.048 1.067.06 1.407.06 4.123v.08c0 2.643-.012 2.987-.06 4.043-.049 1.064-.218 1.791-.465 2.427a4.902 4.902 0 01-1.153 1.772 4.902 4.902 0 01-1.772 1.153c-.636.247-1.363.416-2.427.465-1.067.048-1.407.06-4.123.06h-.08c-2.643 0-2.987-.012-4.043-.06-1.064-.049-1.791-.218-2.427-.465a4.902 4.902 0 01-1.772-1.153 4.902 4.902 0 01-1.153-1.772c-.247-.636-.416-1.363-.465-2.427-.047-1.024-.06-1.379-.06-3.808v-.63c0-2.43.013-2.784.06-3.808.049-1.064.218-1.791.465-2.427a4.902 4.902 0 011.153-1.772A4.902 4.902 0 015.45 2.525c.636-.247 1.363-.416 2.427-.465C8.901 2.013 9.256 2 11.685 2h.63zm-.081 1.802h-.468c-2.456 0-2.784.011-3.807.058-.975.045-1.504.207-1.857.344-.467.182-.8.398-1.15.748-.35.35-.566.683-.748 1.15-.137.353-.3.882-.344 1.857-.047 1.023-.058 1.351-.058 3.807v.468c0 2.456.011 2.784.058 3.807.045.975.207 1.504.344 1.857.182.466.399.8.748 1.15.35.35.683.566 1.15.748.353.137.882.3 1.857.344 1.054.048 1.37.058 4.041.058h.08c2.597 0 2.917-.01 3.96-.058.976-.045 1.505-.207 1.858-.344.466-.182.8-.398 1.15-.748.35-.35.566-.683.748-1.15.137-.353.3-.882.344-1.857.048-1.055.058-1.37.058-4.041v-.08c0-2.597-.01-2.917-.058-3.96-.045-.976-.207-1.505-.344-1.858a3.097 3.097 0 00-.748-1.15 3.098 3.098 0 00-1.15-.748c-.353-.137-.882-.3-1.857-.344-1.023-.047-1.351-.058-3.807-.058zM12 6.865a5.135 5.135 0 110 10.27 5.135 5.135 0 010-10.27zm0 1.802a3.333 3.333 0 100 6.666 3.333 3.333 0 000-6.666zm5.338-3.205a1.2 1.2 0 110 2.4 1.2 1.2 0 010-2.4z"
clipRule="evenodd"
/>
</svg>
<span className="sr-only">Instagram page</span>
</a>
</li>
<li>
<a
href="https://twitter.com/openSenseLab"
target="_blank"
rel="noopener noreferrer"
className="dark:hover:text-green-200 px-2 hover:text-light-green md:px-8"
>
<svg
className="h-10 w-10"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path d="M8.29 20.251c7.547 0 11.675-6.253 11.675-11.675 0-.178 0-.355-.012-.53A8.348 8.348 0 0022 5.92a8.19 8.19 0 01-2.357.646 4.118 4.118 0 001.804-2.27 8.224 8.224 0 01-2.605.996 4.107 4.107 0 00-6.993 3.743 11.65 11.65 0 01-8.457-4.287 4.106 4.106 0 001.27 5.477A4.072 4.072 0 012.8 9.713v.052a4.105 4.105 0 003.292 4.022 4.095 4.095 0 01-1.853.07 4.108 4.108 0 003.834 2.85A8.233 8.233 0 012 18.407a11.616 11.616 0 006.29 1.84" />
</svg>
<span className="sr-only">Twitter page</span>
</a>
</li>
<li>
<a
href="https://github.com/opensensemap"
target="_blank"
rel="noopener noreferrer"
className="dark:hover:text-green-200 px-2 hover:text-light-green md:px-8"
>
<svg
className="h-10 w-10"
fill="currentColor"
viewBox="0 0 24 24"
aria-hidden="true"
>
<path
fillRule="evenodd"
d="M12 2C6.477 2 2 6.484 2 12.017c0 4.425 2.865 8.18 6.839 9.504.5.092.682-.217.682-.483 0-.237-.008-.868-.013-1.703-2.782.605-3.369-1.343-3.369-1.343-.454-1.158-1.11-1.466-1.11-1.466-.908-.62.069-.608.069-.608 1.003.07 1.531 1.032 1.531 1.032.892 1.53 2.341 1.088 2.91.832.092-.647.35-1.088.636-1.338-2.22-.253-4.555-1.113-4.555-4.951 0-1.093.39-1.988 1.029-2.688-.103-.253-.446-1.272.098-2.65 0 0 .84-.27 2.75 1.026A9.564 9.564 0 0112 6.844c.85.004 1.705.115 2.504.337 1.909-1.296 2.747-1.027 2.747-1.027.546 1.379.202 2.398.1 2.651.64.7 1.028 1.595 1.028 2.688 0 3.848-2.339 4.695-4.566 4.943.359.309.678.92.678 1.855 0 1.338-.012 2.419-.012 2.747 0 .268.18.58.688.482A10.019 10.019 0 0022 12.017C22 6.484 17.522 2 12 2z"
clipRule="evenodd"
/>
</svg>
<span className="sr-only">GitHub account</span>
</a>
</li>
</ul>
</div>
</footer>
);
}
7 changes: 2 additions & 5 deletions app/components/landing/header/header.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import { useState } from "react";
import { Link } from "react-router";
// import { ModeToggle } from "../../mode-toggle";
import LanguageSelector from "./language-selector";
import { useTranslation } from "react-i18next";

const links = [
{
Expand Down Expand Up @@ -34,8 +33,6 @@ const links = [
export default function Header() {
const [openMenu, setOpenMenu] = useState(false);

const { t } = useTranslation("header");

return (
<nav
id="header"
Expand Down Expand Up @@ -66,7 +63,7 @@ export default function Header() {
to={item.link}
className="dark:md:hover:text-green-200 block rounded py-2 pl-3 pr-4 md:p-0 md:font-thin md:hover:text-light-green"
>
{t(item.name)}
{item.name}
</Link>
</li>
);
Expand Down Expand Up @@ -118,7 +115,7 @@ export default function Header() {
className="dark:hover:text-green-200 block px-4 py-2 text-sm text-gray-700 hover:text-light-green"
role="menuitem"
>
{t(item.name)}
{item.name}
</Link>
))}
</div>
Expand Down
15 changes: 7 additions & 8 deletions app/components/landing/sections/connect.tsx
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
import { BookA, Wrench } from "lucide-react";
import { useTranslation } from "react-i18next";

export default function Connect() {
const { t } = useTranslation('connect')
return (
<section
id="connect"
className="h-full flex justify-center items-center gap-20 py-20"
>
<div id="left" className="w-1/2 flex flex-col gap-10">
<div id="title" className="text-2xl font-semibold">
{t("title")}
Connect any device
<div id="description" className="text-lg font-medium">
{t("description")}
We support preconfigured devices by some vendors but you can always
registered your custom hardware and sensor setup.
</div>
</div>
<img src="/connection.svg" alt="" className="w-1/2 h-1/2" />
Expand All @@ -27,7 +26,7 @@ export default function Connect() {
className="flex items-center gap-3"
>
<BookA className="h-4 w-4 mr-2" />
{t("senseBox")}
senseBox
</a>
</div>
<div className="flex flex-col border-2 rounded-sm px-4 py-2 text-lg">
Expand All @@ -38,7 +37,7 @@ export default function Connect() {
className="flex items-center gap-3"
>
<BookA className="h-4 w-4 mr-2" />
{t("hackAIR")}
hackAIR
</a>
</div>
<div className="flex flex-col border-2 rounded-sm px-4 py-2 text-lg">
Expand All @@ -49,7 +48,7 @@ export default function Connect() {
className="flex items-center gap-3"
>
<BookA className="h-4 w-4 mr-2" />
{t("Sensor.Community")}
Sensor.Community
</a>
</div>
<div className="flex border-2 rounded-sm px-4 py-2 text-lg">
Expand All @@ -60,7 +59,7 @@ export default function Connect() {
className="flex items-center gap-3"
>
<Wrench className="h-4 w-4 mr-2" />
{t("Custom")}
Custom
</a>
</div>
</div>
Expand Down
21 changes: 10 additions & 11 deletions app/components/landing/sections/features.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,19 @@ import {
Terminal,
Trash,
} from "lucide-react";
import { useTranslation } from "react-i18next";

export default function Features() {
const { t } = useTranslation('features')
return (
<section
id="features"
className="flex justify-between gap-10"
>
<div id="left" className="w-1/2 flex flex-col gap-10">
<div id="title" className="text-2xl font-semibold">
{t("features")}
Features
<div id="description" className="text-lg font-medium">
{t("description")}
The openSenseMap platform has a lot to offer that makes
discoverability and sharing of environmental and sensor data easy.
</div>
</div>
<img src="/features.svg" alt="" className="w-1/2 h-1/2" />
Expand All @@ -30,43 +29,43 @@ export default function Features() {
<div className="flex flex-col border-2 rounded-sm px-4 py-2 text-lg">
<div className="flex items-center gap-3">
<GitFork className="h-4 w-4 mr-2" />
{t("dataAggregation")}
Data aggregation
</div>
</div>
<div className="flex flex-col border-2 rounded-sm px-4 py-2 text-lg">
<div className="flex items-center gap-3">
<Trash className="h-4 w-4 mr-2" />
{t("noDataRetention")}
No data retention
</div>
</div>
<div className="flex flex-col border-2 rounded-sm px-4 py-2 text-lg">
<div className="flex items-center gap-3">
<Copyleft className="h-4 w-4 mr-2" />
{t("dataPublished")}
Data published as ODbL
</div>
</div>
<div className="flex border-2 rounded-sm px-4 py-2 text-lg">
<div className="flex items-center gap-3">
<Telescope className="h-4 w-4 mr-2" />
{t("discoverDevices")}
Discover devices
</div>
</div>
<div className="flex border-2 rounded-sm px-4 py-2 text-lg">
<div className="flex items-center gap-3">
<Scale className="h-4 w-4 mr-2" />
{t("compareDevices")}
Compare devices
</div>
</div>
<div className="flex border-2 rounded-sm px-4 py-2 text-lg">
<div className="flex items-center gap-3">
<Download className="h-4 w-4 mr-2" />
{t("downloadOptions")}
Download options
</div>
</div>
<div className="flex border-2 rounded-sm px-4 py-2 text-lg">
<div className="flex items-center gap-3">
<Terminal className="h-4 w-4 mr-2" />
{t("httpRestApi")}
HTTP REST API
</div>
</div>
</div>
Expand Down
Loading
Loading