From 8f382823adc1429a70fba07d26f96e9950a99689 Mon Sep 17 00:00:00 2001 From: Kuba Orlik Date: Sat, 1 Mar 2025 17:02:20 +0100 Subject: [PATCH] Hero component and button element --- src/back/elements/button.css | 21 ++++++++ src/back/elements/button.ts | 16 ++++++ src/back/global_styles/vars.css | 6 ++- src/back/jdd-components/hero/hero.css | 63 +++++++++++++++++++++++ src/back/jdd-components/hero/hero.jdd.tsx | 60 +++++++++++++++++++++ src/fonts.json | 2 +- src/main.css | 6 +-- 7 files changed, 168 insertions(+), 6 deletions(-) create mode 100644 src/back/elements/button.css create mode 100644 src/back/elements/button.ts create mode 100644 src/back/jdd-components/hero/hero.css create mode 100644 src/back/jdd-components/hero/hero.jdd.tsx diff --git a/src/back/elements/button.css b/src/back/elements/button.css new file mode 100644 index 0000000..90ea757 --- /dev/null +++ b/src/back/elements/button.css @@ -0,0 +1,21 @@ +.button { + padding: 8px 16px; + display: inline-block; + text-decoration: none; + margin: 4px; + cursor: pointer; + + &:hover { + filter: brightness(1.1); + } +} + +.button--color-accent1 { + background-color: var(--color-brand-accent); + color: var(--color-brand-text-on-accent); +} + +.button--color-accent2 { + background-color: var(--color-brand-accent2); + color: var(--color-brand-text-on-accent2); +} diff --git a/src/back/elements/button.ts b/src/back/elements/button.ts new file mode 100644 index 0000000..381b553 --- /dev/null +++ b/src/back/elements/button.ts @@ -0,0 +1,16 @@ +export const button_variants = ["accent1", "accent2"] as const; +type variant = (typeof button_variants)[number]; + +export function button({ + text, + href, + variant, +}: { + text: string; + href: string; + variant: variant; +}): JSX.Element { + return /* HTML */ ` + ${text} + `; +} diff --git a/src/back/global_styles/vars.css b/src/back/global_styles/vars.css index 169d1c5..968baaa 100644 --- a/src/back/global_styles/vars.css +++ b/src/back/global_styles/vars.css @@ -40,8 +40,10 @@ --container-width: 50rem; /* Fonts */ - --font-sans-serif: -apple-system, BlinkMacSystemFont, avenir next, avenir, segoe ui, - helvetica neue, Cantarell, Ubuntu, roboto, noto, helvetica, arial, sans-serif; + --font-sans-serif: "Atkinson Hyperlegible", -apple-system, BlinkMacSystemFont, + avenir next, avenir, segoe ui, helvetica neue, Cantarell, Ubuntu, roboto, noto, + helvetica, arial, sans-serif; + --font-slab-serif: "Zilla Slab", serif; --font-serif: Iowan Old Style, Apple Garamond, Baskerville, Times New Roman, Droid Serif, Times, Source Serif Pro, serif, Apple Color Emoji, Segoe UI Emoji, diff --git a/src/back/jdd-components/hero/hero.css b/src/back/jdd-components/hero/hero.css new file mode 100644 index 0000000..f3b37fc --- /dev/null +++ b/src/back/jdd-components/hero/hero.css @@ -0,0 +1,63 @@ +.hero { + padding: 16px; + text-align: center; + + h1 { + margin-top: 0; + font-size: 48px; + + &.hero__title--color-normal { + color: inherit; + } + + &.hero__title--color-accent1 { + color: var(--color-brand-accent); + } + + &.hero__title--color-accent2 { + color: var(--color-brand-accent2); + } + + @container (max-width: 420px) { + font-size: 32px; + } + } + + .hero__subtitle { + font-size: 32px; + + @container (max-width: 420px) { + font-size: 24px; + } + } + + h1, + .hero__subtitle { + text-wrap: balance; + } + + &.hero--color-text-fg-on-text-bg { + background-color: var(--color-brand-text-bg); + color: var(--color-brand-text-fg); + } + + &.hero--color-text-accent-on-text-bg { + background-color: var(--color-brand-text-bg); + color: var(--color-brand-text-accent); + } + + &.hero--color-text-accent2-on-text-bg { + background-color: var(--color-brand-text-bg); + color: var(--color-brand-text-accent2); + } + + &.hero--color-text-on-accent-on-accent { + background-color: var(--color-brand-accent); + color: var(--color-brand-text-on-accent); + } + + &.hero--color-text-on-accent2-on-accent2 { + background-color: var(--color-brand-accent2); + color: var(--color-brand-text-on-accent2); + } +} diff --git a/src/back/jdd-components/hero/hero.jdd.tsx b/src/back/jdd-components/hero/hero.jdd.tsx new file mode 100644 index 0000000..f86fb3a --- /dev/null +++ b/src/back/jdd-components/hero/hero.jdd.tsx @@ -0,0 +1,60 @@ +import { TempstreamJSX } from "tempstream"; +import type { + ComponentToHTMLArgs, + ExtractStructuredComponentArgumentsParsed, + JDDContext, +} from "@sealcode/jdd"; +import { Component, ComponentArguments } from "@sealcode/jdd"; +import { button, button_variants } from "src/back/elements/button.js"; + +const component_arguments = { + color: new ComponentArguments.Enum([ + "text-fg-on-text-bg", + "text-accent-on-text-bg", + "text-accent2-on-text-bg", + "text-on-accent-on-accent", + "text-on-accent2-on-accent2", + ]), + title: new ComponentArguments.ShortText(), + title_color: new ComponentArguments.Enum(["normal", "accent1", "accent2"] as const), + subtitle: new ComponentArguments.ShortText(), + content: new ComponentArguments.Markdown(), + buttons: new ComponentArguments.List( + new ComponentArguments.Structured({ + text: new ComponentArguments.ShortText(), + href: new ComponentArguments.ShortText(), + variant: new ComponentArguments.Enum(button_variants), + }) + ), +} as const; + +export class Hero extends Component { + getArguments() { + return component_arguments; + } + + getTitle( + _: JDDContext, + args: ExtractStructuredComponentArgumentsParsed + ) { + return args.title || null; + } + + async toHTML({ + args: { title, title_color, subtitle, content, color, buttons }, + classes, + jdd_context: { render_markdown, language }, + }: ComponentToHTMLArgs): Promise { + classes.push(`hero--color-${color}`); + return ( +
+

{title}

+ {subtitle} +
{render_markdown(language, content)}
+
+ {buttons.map((button_data) => button(button_data))} +
+
+ ); + } +} diff --git a/src/fonts.json b/src/fonts.json index f2121dd..9d70f9e 100644 --- a/src/fonts.json +++ b/src/fonts.json @@ -1,7 +1,7 @@ { "googleFonts": { "families": { - "Ubuntu": true, + "Atkinson Hyperlegible": true, "Libre Baskerville": true, "Ubuntu Mono": true, "Anton": true diff --git a/src/main.css b/src/main.css index 2575764..6616a52 100644 --- a/src/main.css +++ b/src/main.css @@ -1,8 +1,8 @@ html { background: var(--color-brand-canvas); - font-family: Ubuntu, -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", - "Segoe UI Emoji", "Segoe UI Symbol", "Lato", "Helvetica Neue", Helvetica, Arial, - sans-serif; + font-family: "Atkinson Hyperlegible", -apple-system, system-ui, BlinkMacSystemFont, + "Segoe UI", "Segoe UI Emoji", "Segoe UI Symbol", "Lato", "Helvetica Neue", + Helvetica, Arial, sans-serif; font-size: 14px; }