ui/cards: create a card frame component

This commit is contained in:
Adorian Doran 2026-02-22 19:25:30 +02:00
parent dfb5322b1a
commit ad2df957c7
2 changed files with 37 additions and 11 deletions

View File

@ -1,4 +1,4 @@
:where(.tn-card) {
:where(.tn-card, .tn-card-frame) {
--card-border-radius: 8px;
--card-padding-block: 8px;
--card-padding-inline: 16px;
@ -6,6 +6,22 @@
--card-nested-section-indent: 30px;
}
.tn-card-frame,
.tn-card-section {
padding: var(--card-padding-block) var(--card-padding-inline);
border: 1px solid var(--card-border-color, var(--main-border-color));
background: var(--card-background-color);
&.tn-card-highlight-on-hover:hover {
background-color: var(--card-background-hover-color);
transition: background-color .2s ease-out;
}
}
.tn-card-frame {
border-radius: var(--card-border-radius);
}
.tn-card-heading {
margin-bottom: 10px;
font-size: .75rem;
@ -20,10 +36,6 @@
gap: var(--card-section-gap);
.tn-card-section {
padding: var(--card-padding-block) var(--card-padding-inline);
border: 1px solid var(--card-border-color, var(--main-border-color));
background: var(--card-background-color);
&:first-of-type {
border-top-left-radius: var(--card-border-radius);
border-top-right-radius: var(--card-border-radius);
@ -38,10 +50,5 @@
padding-left: calc(var(--card-padding-inline) + var(--card-nested-section-indent) * var(--tn-card-section-nesting-level));
background-color: color-mix(in srgb, var(--card-background-color) calc(100% / (var(--tn-card-section-nesting-level) + 1)) , transparent);
}
&.tn-card-section-highlight-on-hover:hover {
background-color: var(--card-background-hover-color);
transition: background-color .2s ease-out;
}
}
}

View File

@ -4,6 +4,25 @@ import { JSX } from "preact";
import { useContext } from "preact/hooks";
import clsx from "clsx";
// #region Card Frame
export interface CardFrameProps {
className?: string;
highlightOnHover?: boolean;
children: ComponentChildren;
}
export function CardFrame(props: CardFrameProps) {
return <div className={clsx("tn-card-frame", props.className, {
"tn-card-highlight-on-hover": props.highlightOnHover
})}>
{props.children}
</div>;
}
// #endregion
// #region Card
export interface CardProps {
@ -45,7 +64,7 @@ export function CardSection(props: {children: ComponentChildren} & CardSectionPr
return <>
<section className={clsx("tn-card-section", props.className, {
"tn-card-section-nested": nestingLevel > 0,
"tn-card-section-highlight-on-hover": props.highlightOnHover || props.onAction
"tn-card-highlight-on-hover": props.highlightOnHover || props.onAction
})}
style={{"--tn-card-section-nesting-level": (nestingLevel) ? nestingLevel : null}}
onClick={props.onAction}>