import { css, html } from "lit";
import { property } from "lit/decorators.js";
import { BaseElement } from "../../core/base-element.ts";
import { consume } from "@lit/context";
import {
applyThemeToElement,
type CTTheme,
defaultTheme,
themeContext,
} from "../theme-context.ts";
/**
* CTHeading – Theme-compliant heading that replaces h1–h6.
*
* @element ct-heading
*
* @attr {number} level - Heading level (1–6). Default: 3.
* @attr {boolean} noMargin - Remove default bottom margin.
*
* @slot - Heading content
*/
export class CTHeading extends BaseElement {
static override properties = {
level: { type: Number, reflect: true },
noMargin: { type: Boolean, reflect: true, attribute: "no-margin" },
};
@consume({ context: themeContext, subscribe: true })
@property({ attribute: false })
declare theme?: CTTheme;
declare level: number;
declare noMargin: boolean;
constructor() {
super();
this.level = 3;
this.noMargin = false;
}
static override styles = [
BaseElement.baseStyles,
css`
:host {
display: block;
color: var(--ct-theme-color-text, #111827);
font-family: var(--ct-theme-font-family, inherit);
}
.heading {
margin: 0 0 var(--ct-spacing-2, 0.5rem) 0;
}
:host([no-margin]) .heading {
margin: 0;
}
/* Level styles using workspace variables */
.h1 {
font-size: var(--ct-font-size-4xl, 2.25rem);
line-height: var(--ct-line-height-tight, 1.25);
font-weight: var(--ct-font-weight-bold, 700);
}
.h2 {
font-size: var(--ct-font-size-3xl, 1.875rem);
line-height: var(--ct-line-height-snug, 1.375);
font-weight: var(--ct-font-weight-semibold, 600);
}
.h3 {
font-size: var(--ct-font-size-2xl, 1.5rem);
line-height: var(--ct-line-height-normal, 1.5);
font-weight: var(--ct-font-weight-semibold, 600);
}
.h4 {
font-size: var(--ct-font-size-xl, 1.25rem);
line-height: var(--ct-line-height-normal, 1.5);
font-weight: var(--ct-font-weight-medium, 500);
}
.h5 {
font-size: var(--ct-font-size-lg, 1.125rem);
line-height: var(--ct-line-height-normal, 1.5);
font-weight: var(--ct-font-weight-normal, 400);
}
.h6 {
font-size: var(--ct-font-size-base, 1rem);
line-height: var(--ct-line-height-normal, 1.5);
font-weight: var(--ct-font-weight-normal, 400);
color: var(--ct-theme-color-text-muted, #6b7280);
}
`,
];
override firstUpdated() {
applyThemeToElement(this, this.theme ?? defaultTheme);
}
override updated(changed: Map) {
if (changed.has("theme")) {
applyThemeToElement(this, this.theme ?? defaultTheme);
}
}
private _cls(): string {
const lvl = Math.min(6, Math.max(1, Number(this.level) || 3));
return `h${lvl}`;
}
override render() {
const level = Math.min(6, Math.max(1, Number(this.level) || 3));
return html`
`;
}
}
if (!customElements.get("ct-heading")) {
customElements.define("ct-heading", CTHeading);
}