add styling to button

Signed-off-by: Tobias Erbshäußer <tobias@tesoft.dev>
This commit is contained in:
2026-05-24 09:30:57 +02:00
parent 8211c78287
commit 5364555bc8
4 changed files with 117 additions and 10 deletions
+54 -3
View File
@@ -1,11 +1,62 @@
<template id="tesoft-button-template"> <template id="tesoft-button-template">
<style> <style>
@import "/src/styles/default.css"; @import "/src/styles/default.css";
:host {
display: block;
}
button, a {
align-content: center;
background-color: transparent;
border-radius: var(--button-border-radius);
border-style: none;
color: var(--light-gray);
display: grid;
font-weight: 600;
height: 100%;
justify-content: center;
padding: var(--medium-padding);
text-decoration: none;
width: 100%;
}
:host([selected]) button, :host([selected]) a {
background-color: var(--light-gray);
color: var(--gray);
font-weight: 800;
}
button:focus, a:focus {
outline-color: var(--gold);
outline-offset: 0.2rem;
outline-style: solid;
}
button:hover, a:hover {
background-color: var(--gold) !important;
color: var(--gray);
cursor: pointer;
}
::slotted(svg) {
fill: var(--light-gray);
}
:host([selected]) ::slotted(svg) {
fill: var(--gray);
}
button:hover ::slotted(svg), a:hover ::slotted(svg) {
fill: var(--gray);
}
</style> </style>
<button> <div>
<slot></slot> <button part="children">
</button> <slot></slot>
</button>
</div>
</template> </template>
<script src="/src/components/button.ts" type="module"></script> <script src="/src/components/button.ts" type="module"></script>
+46
View File
@@ -1,6 +1,10 @@
import {TesoftComponent} from "../scripts/main.ts"; import {TesoftComponent} from "../scripts/main.ts";
export class TesoftButton extends TesoftComponent { export class TesoftButton extends TesoftComponent {
static observedAttributes = ["href", "selected"];
private readonly rootDiv: HTMLDivElement;
constructor() { constructor() {
super(); super();
@@ -9,6 +13,48 @@ export class TesoftButton extends TesoftComponent {
const shadowRoot = this.attachShadow({mode: "open"}); const shadowRoot = this.attachShadow({mode: "open"});
shadowRoot.appendChild(templateContent.cloneNode(true)); shadowRoot.appendChild(templateContent.cloneNode(true));
this.rootDiv = shadowRoot.querySelector<HTMLDivElement>("div")!;
}
// noinspection JSUnusedGlobalSymbols
attributeChangedCallback(name: string, _oldValue: string | null, newValue: string | null) {
if (name === "href") {
this.rootDiv.innerHTML = "";
let linkOrButton: HTMLElement;
if (newValue) {
linkOrButton = document.createElement("a");
(linkOrButton as HTMLAnchorElement).href = newValue;
} else {
linkOrButton = document.createElement("button");
}
linkOrButton.part = "children";
this.rootDiv.appendChild(linkOrButton);
const slot = document.createElement("slot");
linkOrButton.appendChild(slot);
}
}
get href(): string | null {
return this.getAttribute("href");
}
set href(value: string | null) {
if (value) {
this.setAttribute("href", value);
} else {
this.removeAttribute("href");
}
}
set selected(value: string | null) {
if (value === null) {
this.removeAttribute("selected");
} else {
this.setAttribute("selected", "");
}
} }
} }
+15 -5
View File
@@ -1,8 +1,13 @@
:root { :root {
--dark-gray: #222831; --dark-gray: #222831;
--gray: #393E46;
--gold: #FFD369; --gold: #FFD369;
--gray: #393E46;
--light-gray: #EEEEEE; --light-gray: #EEEEEE;
--small-padding: 0.6rem;
--medium-padding: 0.8rem;
--large-padding: 1.2rem;
--button-border-radius: 0.5rem;
} }
html { html {
@@ -12,12 +17,11 @@ html {
* { * {
box-sizing: border-box; box-sizing: border-box;
font-family: "Adwaita Sans", sans-serif;
font-size: 1.4rem;
line-height: 2.1rem;
margin: 0; margin: 0;
padding: 0; padding: 0;
font-family: "Adwaita Sans", sans-serif;
line-height: 2.1rem;
font-size: 1.4rem;
} }
*::after { *::after {
@@ -39,3 +43,9 @@ html {
a { a {
color: var(--gold); color: var(--gold);
} }
a:focus {
outline-color: var(--gold);
outline-offset: 0.2rem;
outline-style: solid;
}
+2 -2
View File
@@ -1,11 +1,11 @@
@import "default.css"; @import "default.css";
@font-face { @font-face {
font-display: swap;
font-family: "Adwaita Sans"; font-family: "Adwaita Sans";
font-stretch: 100%;
font-style: normal; font-style: normal;
font-weight: 300 800; font-weight: 300 800;
font-stretch: 100%;
font-display: swap;
src: url(/public/assets/AdwaitaSans-Regular.woff2) format('woff2'); src: url(/public/assets/AdwaitaSans-Regular.woff2) format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
} }