Components & styles
This commit is contained in:
parent
04dba57520
commit
1ebcd9ca3b
|
@ -0,0 +1,66 @@
|
|||
<script lang="ts">
|
||||
import { login } from "./stores";
|
||||
import { getGraphs } from "../lib/api";
|
||||
|
||||
let graphsPromise: ReturnType<typeof getGraphs> = new Promise(() => {});
|
||||
$: if ($login !== undefined) {
|
||||
graphsPromise = getGraphs($login?.token);
|
||||
}
|
||||
</script>
|
||||
|
||||
<div id="list">
|
||||
{#await graphsPromise}
|
||||
<span class="item">
|
||||
<h2>Fetching profiles...</h2>
|
||||
</span>
|
||||
{:then graphs}
|
||||
{#each graphs as graph}
|
||||
<a class="item" href="./graph/{graph.graph}">
|
||||
<h2>{graph.data.name} <span>#{graph.graph}</span></h2>
|
||||
<h3>
|
||||
Value:
|
||||
{#each graph.data.value as key}
|
||||
<span>{key}</span>
|
||||
{/each}
|
||||
</h3>
|
||||
</a>
|
||||
{/each}
|
||||
<!-- svelte-ignore a11y-missing-content -->
|
||||
<a class="item add" href="google.com" />
|
||||
{:catch error}
|
||||
<span class="item">
|
||||
<h2 style="color: red">{error.message}</h2>
|
||||
</span>
|
||||
{/await}
|
||||
</div>
|
||||
|
||||
<style lang="scss">
|
||||
@use "../styles/GridList";
|
||||
a.item {
|
||||
text-decoration: none;
|
||||
color: hsl(30, 20%, 90%);
|
||||
font-size: 1.17em;
|
||||
&:hover {
|
||||
h2 {
|
||||
text-decoration: underline;
|
||||
}
|
||||
}
|
||||
}
|
||||
h2 span {
|
||||
color: hsl(30, 5%, 60%);
|
||||
font-weight: 100;
|
||||
font-size: 0.75em;
|
||||
}
|
||||
h3 span {
|
||||
font-weight: 400;
|
||||
}
|
||||
h3 span::after {
|
||||
content: " > ";
|
||||
font-size: 0.6em;
|
||||
color: hsl(30, 5%, 60%);
|
||||
vertical-align: middle;
|
||||
}
|
||||
h3 span:nth-last-child(1)::after {
|
||||
content: "";
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,79 @@
|
|||
<script lang="ts">
|
||||
export let segment: string | undefined;
|
||||
import { postLogout } from "../lib/api";
|
||||
import { login } from "./stores";
|
||||
</script>
|
||||
|
||||
<nav>
|
||||
<a href="/" class:active={segment === undefined || segment === "profile"}>
|
||||
<h3>Profiles</h3>
|
||||
</a>
|
||||
<span class="sep" />
|
||||
<a
|
||||
href="/graphs"
|
||||
class:active={segment === "graphs" || segment === "graph"}
|
||||
>
|
||||
<h3>Graphs</h3>
|
||||
</a>
|
||||
<span class="sep" />
|
||||
<div class="sep" />
|
||||
<span class="sep" />
|
||||
{#if $login === null || $login === undefined}
|
||||
<a href="/login" class:active={segment === "login"}>
|
||||
<h3>Login</h3>
|
||||
</a>
|
||||
{:else}
|
||||
<span>
|
||||
<h3>@{$login.username}</h3>
|
||||
</span>
|
||||
<span class="sep" />
|
||||
<a
|
||||
href="."
|
||||
on:click={async () => {
|
||||
await postLogout($login?.token || ""); // ! wasn't working for some reason
|
||||
login.set(null);
|
||||
}}
|
||||
>
|
||||
<h3>Logout</h3>
|
||||
</a>
|
||||
{/if}
|
||||
</nav>
|
||||
|
||||
<style lang="scss">
|
||||
nav {
|
||||
z-index: 1000;
|
||||
position: fixed;
|
||||
width: calc(100% - 1.5em);
|
||||
background-color: hsl(236, 10%, 20%);
|
||||
display: flex;
|
||||
border: 0.75em solid black;
|
||||
}
|
||||
|
||||
h3 {
|
||||
display: inline;
|
||||
text-decoration: inherit;
|
||||
}
|
||||
span,
|
||||
a {
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
padding: 1em;
|
||||
}
|
||||
a.active {
|
||||
color: hsl(111, 100%, 50%);
|
||||
}
|
||||
a:hover {
|
||||
text-decoration: solid underline;
|
||||
}
|
||||
.sep {
|
||||
padding: 0;
|
||||
background-color: black;
|
||||
}
|
||||
span.sep {
|
||||
width: 0.75em;
|
||||
}
|
||||
div.sep {
|
||||
flex: 1;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,29 @@
|
|||
import { writable } from "svelte/store";
|
||||
|
||||
function createLogin() {
|
||||
const { subscribe, set, update } = writable<
|
||||
| {
|
||||
username: string;
|
||||
token: string;
|
||||
}
|
||||
| undefined
|
||||
| null
|
||||
>(undefined);
|
||||
|
||||
return {
|
||||
subscribe,
|
||||
set,
|
||||
update,
|
||||
getValue: () =>
|
||||
new Promise(resolve => {
|
||||
const unsubscribe = subscribe(value => {
|
||||
if (value !== undefined) {
|
||||
unsubscribe();
|
||||
resolve(value);
|
||||
}
|
||||
});
|
||||
})
|
||||
};
|
||||
}
|
||||
|
||||
export const login = createLogin();
|
|
@ -0,0 +1,32 @@
|
|||
form {
|
||||
padding: 1em;
|
||||
background-color: hsl(236, 10%, 20%);
|
||||
p#status {
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
input {
|
||||
width: calc(100% - 1.5em);
|
||||
background: none;
|
||||
padding: 0.75em;
|
||||
margin-bottom: 1em;
|
||||
font-size: 1.17em;
|
||||
color: hsl(30, 20%, 90%);
|
||||
border: 2px solid black;
|
||||
border-right: 2px solid transparent;
|
||||
border-left: 2px solid transparent;
|
||||
&:focus,
|
||||
&:focus-visible {
|
||||
outline: none;
|
||||
border-color: black;
|
||||
}
|
||||
}
|
||||
input[type="submit"] {
|
||||
margin: 0;
|
||||
width: 100%;
|
||||
border-color: black;
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
background-color: hsl(236, 5%, 25%);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,41 @@
|
|||
div#list {
|
||||
display: grid;
|
||||
width: 100%;
|
||||
grid-template-columns: repeat(auto-fit, minmax(24em, 1fr));
|
||||
grid-auto-rows: 1fr;
|
||||
grid-auto-flow: dense;
|
||||
gap: 0.75em;
|
||||
}
|
||||
.item {
|
||||
padding: 1em;
|
||||
background-color: hsl(236, 10%, 20%);
|
||||
overflow-y: auto;
|
||||
&:hover {
|
||||
transform: scale(98%);
|
||||
z-index: inherit;
|
||||
}
|
||||
:nth-child(1) {
|
||||
margin-top: 0;
|
||||
}
|
||||
:nth-last-child(1) {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
.add {
|
||||
position: relative;
|
||||
display: block;
|
||||
&::before,
|
||||
&::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
width: min(12em, 30%);
|
||||
height: 0.3em;
|
||||
background-color: hsl(30, 20%, 90%);
|
||||
}
|
||||
&::before {
|
||||
transform: translate(-50%, -50%) rotateZ(90deg);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue