Heading with echo component

This commit is contained in:
Kuba Orlik 2025-02-16 17:59:06 +01:00
parent 2c167bacbc
commit 16516d3330
2 changed files with 97 additions and 0 deletions

View File

@ -0,0 +1,53 @@
.heading-with-echo {
position: relative;
--shadow-offset-y: 15px;
padding-top: calc(var(--shadow-offset-y) * 3);
padding-bottom: calc(var(--shadow-offset-y));
&.heading-with-echo--blur {
backdrop-filter: blur(5px);
}
& > * {
width: 100%;
text-align: center;
text-wrap: balance;
color: var(--color-brand-text-fg);
font-size: 40px;
margin: 0;
}
.fancy-heading__main {
z-index: 1;
position: relative;
/* https://owumaro.github.io/text-stroke-generator/ */
text-shadow: var(--color-brand-canvas) 1px 0px 0px,
var(--color-brand-canvas) 0.540302px 0.841471px 0px,
var(--color-brand-canvas) -0.416147px 0.909297px 0px,
var(--color-brand-canvas) -0.989993px 0.14112px 0px,
var(--color-brand-canvas) -0.653644px -0.756803px 0px,
var(--color-brand-canvas) 0.283662px -0.958924px 0px,
var(--color-brand-canvas) 0.96017px -0.279416px 0px;
}
.fancy-heading__shadow1,
.fancy-heading__shadow2 {
position: absolute;
top: 20px;
color: transparent;
-webkit-text-stroke-color: var(--color-brand-text-fg);
-webkit-text-stroke-width: 1px;
user-select: none;
}
.fancy-heading__shadow1 {
top: calc(var(--shadow-offset-y) * 1);
}
.fancy-heading__shadow2 {
top: calc(var(--shadow-offset-y) * 2);
}
}

View File

@ -0,0 +1,44 @@
import { TempstreamJSX } from "tempstream";
import type { ComponentToHTMLArgs } from "@sealcode/jdd";
import { Component, ComponentArguments } from "@sealcode/jdd";
const component_arguments = {
title: new ComponentArguments.ShortText(),
level: new ComponentArguments.Enum(["1", "2", "3", "4", "5", "6"]).setExampleValues([
"2",
]),
blur_backdrop: new ComponentArguments.Enum(["true", "false"]),
font_family: new ComponentArguments.Enum([
"industrial",
"sans-serif",
"serif",
"slab-serif",
"headings",
]),
} as const;
export class HeadingWithEcho extends Component<typeof component_arguments> {
getArguments() {
return component_arguments;
}
async toHTML({
args: { title, level, font_family, blur_backdrop },
classes,
}: ComponentToHTMLArgs<typeof component_arguments>): Promise<string> {
return (
<div
class={[
"heading-with-echo",
...classes,
{ "heading-with-echo--blur": blur_backdrop == "true" },
]}
style={`font-family: var(--font-${font_family});`}
>
{`<h${level} class="fancy-heading__shadow1">${title}</h${level}>`}
{`<h${level} class="fancy-heading__shadow2">${title}</h${level}>`}
{`<h${level} class="fancy-heading__main">${title}</h${level}>`}
</div>
);
}
}