2023-02-03 22:28:11 +01:00
|
|
|
<script lang="ts">
|
2024-09-05 02:25:03 +02:00
|
|
|
import { ImmutableStore, Store } from "../../Logic/UIEventSource"
|
|
|
|
import { OsmConnection } from "../../Logic/Osm/OsmConnection"
|
2024-10-17 04:06:03 +02:00
|
|
|
import type { MinimalThemeInformation } from "../../Models/ThemeConfig/ThemeConfig"
|
2023-06-14 15:07:03 +02:00
|
|
|
import Tr from "../Base/Tr.svelte"
|
2023-07-28 01:02:31 +02:00
|
|
|
import Translations from "../i18n/Translations"
|
2024-06-19 01:56:19 +02:00
|
|
|
import Marker from "../Map/Marker.svelte"
|
2023-02-03 22:28:11 +01:00
|
|
|
|
2024-10-17 04:06:03 +02:00
|
|
|
export let theme: MinimalThemeInformation & {isOfficial?: boolean}
|
2024-09-05 02:25:03 +02:00
|
|
|
let isCustom: boolean = theme.id.startsWith("https://") || theme.id.startsWith("http://")
|
2023-06-15 05:03:52 +02:00
|
|
|
export let state: { layoutToUse?: { id: string }; osmConnection: OsmConnection }
|
2023-10-30 13:44:27 +01:00
|
|
|
|
2024-07-27 12:59:38 +02:00
|
|
|
$: title = Translations.T(
|
2023-06-14 15:07:03 +02:00
|
|
|
theme.title,
|
|
|
|
!isCustom && !theme.mustHaveLanguage ? "themes:" + theme.id + ".title" : undefined
|
|
|
|
)
|
2024-07-27 12:59:38 +02:00
|
|
|
$: description = Translations.T(theme.shortDescription)
|
2023-02-03 22:28:11 +01:00
|
|
|
|
2023-06-14 15:07:03 +02:00
|
|
|
function createUrl(
|
|
|
|
layout: { id: string; definition?: string },
|
|
|
|
isCustom: boolean,
|
|
|
|
state?: { layoutToUse?: { id } }
|
|
|
|
): Store<string> {
|
|
|
|
if (layout === undefined) {
|
|
|
|
return undefined
|
|
|
|
}
|
|
|
|
if (layout.id === undefined) {
|
|
|
|
console.error("ID is undefined for layout", layout)
|
|
|
|
return undefined
|
|
|
|
}
|
2023-02-03 22:28:11 +01:00
|
|
|
|
2023-06-14 15:07:03 +02:00
|
|
|
if (layout.id === state?.layoutToUse?.id) {
|
|
|
|
return undefined
|
|
|
|
}
|
2023-02-03 22:28:11 +01:00
|
|
|
|
2023-06-14 15:07:03 +02:00
|
|
|
let path = window.location.pathname
|
|
|
|
// Path starts with a '/' and contains everything, e.g. '/dir/dir/page.html'
|
|
|
|
path = path.substr(0, path.lastIndexOf("/"))
|
|
|
|
// Path will now contain '/dir/dir', or empty string in case of nothing
|
|
|
|
if (path === "") {
|
|
|
|
path = "."
|
|
|
|
}
|
2023-02-03 22:28:11 +01:00
|
|
|
|
2023-06-14 15:07:03 +02:00
|
|
|
let linkPrefix = `${path}/${layout.id.toLowerCase()}.html?`
|
|
|
|
if (
|
|
|
|
location.hostname === "localhost" ||
|
|
|
|
location.hostname === "127.0.0.1" ||
|
|
|
|
location.port === "1234"
|
|
|
|
) {
|
|
|
|
// Redirect to 'theme.html?layout=* instead of 'layout.html'. This is probably a debug run, where the routing does not work
|
|
|
|
linkPrefix = `${path}/theme.html?layout=${layout.id}&`
|
|
|
|
}
|
2023-05-11 02:17:41 +02:00
|
|
|
|
2023-06-14 15:07:03 +02:00
|
|
|
if (isCustom) {
|
|
|
|
linkPrefix = `${path}/theme.html?userlayout=${layout.id}&`
|
|
|
|
}
|
2023-02-03 22:28:11 +01:00
|
|
|
|
2023-06-14 15:07:03 +02:00
|
|
|
let hash = ""
|
|
|
|
if (layout.definition !== undefined) {
|
|
|
|
hash = "#" + btoa(JSON.stringify(layout.definition))
|
2023-02-03 22:28:11 +01:00
|
|
|
}
|
|
|
|
|
2023-06-14 15:07:03 +02:00
|
|
|
return new ImmutableStore<string>(`${linkPrefix}${hash}`)
|
|
|
|
}
|
|
|
|
|
|
|
|
let href = createUrl(theme, isCustom, state)
|
2023-02-03 22:28:11 +01:00
|
|
|
</script>
|
|
|
|
|
2024-07-09 13:42:08 +02:00
|
|
|
<a class="low-interaction my-1 flex w-full items-center text-ellipsis rounded p-1" href={$href}>
|
2024-06-26 12:03:35 +02:00
|
|
|
<Marker icons={theme.icon} size="block h-8 w-8 sm:h-11 sm:w-11 m-1 sm:mx-2 md:mx-4 shrink-0" />
|
2024-06-19 01:56:19 +02:00
|
|
|
|
2024-06-20 04:21:29 +02:00
|
|
|
<span class="flex flex-col overflow-hidden text-ellipsis text-xl font-bold">
|
2024-06-26 12:03:35 +02:00
|
|
|
<Tr cls="" t={title} />
|
2024-06-20 04:21:29 +02:00
|
|
|
<Tr cls="subtle text-base" t={description} />
|
2024-09-05 02:25:03 +02:00
|
|
|
<slot/>
|
2024-04-13 02:40:21 +02:00
|
|
|
</span>
|
|
|
|
</a>
|