Files
frontend/src/components/ha-markdown.ts
2025-10-27 13:40:04 +02:00

108 lines
2.4 KiB
TypeScript

import { css, html, LitElement, nothing, type CSSResultGroup } from "lit";
import { customElement, property } from "lit/decorators";
import "./ha-markdown-element";
@customElement("ha-markdown")
export class HaMarkdown extends LitElement {
@property() public content?;
@property({ attribute: "allow-svg", type: Boolean }) public allowSvg = false;
@property({ attribute: "allow-data-url", type: Boolean })
public allowDataUrl = false;
@property({ type: Boolean }) public breaks = false;
@property({ type: Boolean, attribute: "lazy-images" }) public lazyImages =
false;
@property({ type: Boolean }) public cache = false;
protected render() {
if (!this.content) {
return nothing;
}
return html`<ha-markdown-element
.content=${this.content}
.allowSvg=${this.allowSvg}
.allowDataUrl=${this.allowDataUrl}
.breaks=${this.breaks}
.lazyImages=${this.lazyImages}
.cache=${this.cache}
></ha-markdown-element>`;
}
static styles = css`
:host {
display: block;
}
ha-markdown-element {
-ms-user-select: text;
-webkit-user-select: text;
-moz-user-select: text;
}
ha-markdown-element > *:first-child {
margin-top: 0;
}
ha-markdown-element > *:last-child {
margin-bottom: 0;
}
ha-alert {
display: block;
margin: var(--ha-space-1) 0;
}
a {
color: var(--primary-color);
}
img {
max-width: 100%;
}
code,
pre {
background-color: var(--markdown-code-background-color, none);
border-radius: var(--ha-border-radius-sm);
}
svg {
background-color: var(--markdown-svg-background-color, none);
color: var(--markdown-svg-color, none);
}
code {
font-size: var(--ha-font-size-s);
padding: 0.2em 0.4em;
}
pre code {
padding: 0;
}
pre {
padding: var(--ha-space-4);
overflow: auto;
line-height: var(--ha-line-height-condensed);
font-family: var(--ha-font-family-code);
}
h1,
h2,
h3,
h4,
h5,
h6 {
line-height: initial;
}
h2 {
font-size: var(--ha-font-size-xl);
font-weight: var(--ha-font-weight-bold);
}
hr {
border-color: var(--divider-color);
border-bottom: none;
margin: var(--ha-space-4) 0;
}
` as CSSResultGroup;
}
declare global {
interface HTMLElementTagNameMap {
"ha-markdown": HaMarkdown;
}
}