adds new trail page

This commit is contained in:
Christian Beutel
2024-01-29 00:41:54 +01:00
parent b302ccded0
commit 2d4c673060
28 changed files with 783 additions and 115 deletions

View File

@@ -0,0 +1,56 @@
<script lang="ts">
import { createEventDispatcher } from "svelte";
export let items: { text: string; value: any }[] = [];
const dispatch = createEventDispatcher();
let isOpen = false;
function toggleMenu() {
isOpen = !isOpen;
}
function closeMenu() {
isOpen = false;
}
function handleItemClick(item: { text: string, value: any }) {
dispatch("change", item);
closeMenu();
}
</script>
<svelte:window on:mouseup={() => (isOpen = false)} />
<div class="dropdown relative">
<button
class="hover:bg-gray-100 w-8 h-8 rounded-full"
on:click={toggleMenu}
>
<i class="fa fa-ellipsis-vertical"></i>
</button>
{#if isOpen}
<ul
class="menu absolute bg-white border rounded-l-xl rounded-b-xl shadow-md z-10 right-0 overflow-hidden"
class:none={isOpen}
>
{#each items as item}
<!-- svelte-ignore a11y-no-noninteractive-element-interactions -->
<!-- svelte-ignore a11y-no-noninteractive-tabindex -->
<li
class="menu-item p-4 cursor-pointer hover:bg-gray-100 focus:bg-gray-200 transition-colors"
tabindex="0"
on:mouseup={() => handleItemClick(item)}
on:keydown={() => handleItemClick(item)}
>
{item.text}
</li>
{/each}
</ul>
{/if}
</div>
<style>
</style>

View File

@@ -0,0 +1,52 @@
<script lang="ts">
export let id: string;
export let title: string;
export function openModal() {
(document.getElementById(id) as HTMLDialogElement).showModal();
}
export function closeModal() {
(document.getElementById(id) as HTMLDialogElement).close();
}
</script>
<slot {openModal} />
<dialog
{id}
tabindex="-1"
aria-hidden="true"
class="relative w-full max-w-2xl max-h-full rounded-xl"
>
<!-- Modal content -->
<div class="relative bg-white shadow dark:bg-gray-700">
<!-- Modal header -->
<div
class="flex items-center justify-between p-4 md:p-5 border-b rounded-t dark:border-gray-600"
>
<h3 class="text-xl font-semibold text-gray-900 dark:text-white">
{title}
</h3>
<button
type="button"
class="text-gray-400 bg-transparent hover:bg-gray-200 hover:text-gray-900 rounded-lg text-sm w-8 h-8 ms-auto inline-flex justify-center items-center dark:hover:bg-gray-600 dark:hover:text-white"
on:click={closeModal}
>
<i class="fa fa-close"></i>
<span class="sr-only">Close modal</span>
</button>
</div>
<!-- Modal body -->
<div class="p-4 md:p-5 space-y-4">
<slot name="content" />
</div>
<!-- Modal footer -->
<div
class="p-4 md:p-5 border-t border-gray-200 rounded-b dark:border-gray-600"
>
<slot name="footer" {closeModal} />
</div>
</div>
</dialog>
<style>
</style>

View File

@@ -0,0 +1,21 @@
<script lang="ts">
export let value: any;
export let items: { text: string; value: any }[] = [];
export let label: string = "";
</script>
<div>
{#if label.length}
<p class="text-sm font-medium pb-1">
{label}
</p>
{/if}
<select
class="bg-gray-50 h-10 w-full px-4 border-r-8 border-transparent outline outline-1 outline-gray-200 rounded-md focus:outline-primary transition-colors"
bind:value
>
{#each items as item}
<option value={item.value}>{item.text}</option>
{/each}
</select>
</div>

View File

@@ -0,0 +1,33 @@
<script lang="ts">
export let value: string | number = "";
export let placeholder: string = "";
export let label: string = "";
export let error: string = "";
export let icon: string = "";
</script>
<div>
{#if label.length}
<p class="text-sm font-medium pb-1">
{label}
</p>
{/if}
<div class="flex items-center gap-2">
{#if icon.length > 0}
<i class="fa fa-{icon}"></i>
{/if}
<input
class="bg-gray-50 border rounded-md p-3 transition-colors focus:border-primary focus:outline-none focus:ring-0 w-full"
class:border-red-400={error.length > 0}
class:bg-red-50={error.length > 0}
type="text"
bind:value
on:change
{placeholder}
/>
</div>
<span class="textfield-error text-xs text-red-400">
{error}
</span>
</div>

View File

@@ -0,0 +1,27 @@
<script lang="ts">
export let value: string | number = "";
export let placeholder: string = "";
export let rows: number = 3;
export let label: string = "";
export let error: string = "";
</script>
<div>
{#if label.length}
<p class="text-sm font-medium mb-1">
{label}
</p>
{/if}
<textarea
class="bg-gray-50 border rounded-md p-3 resize-none transition-colors focus:border-primary focus:outline-none focus:ring-0 w-full"
{rows}
{placeholder}
class:border-red-400={error.length > 0}
class:bg-red-50={error.length > 0}
bind:value
on:change
/>
<span class="textfield-error text-xs text-red-400">
{error}
</span>
</div>