--- // Example code from the `html` prop or the rendered slot; copy button uses data-clipboard-text. import Icon from '@ui/Icon.astro'; import { beautifyHtml, highlightCode, removeHref } from '@shared/lib/code-example'; interface Props { /** raw HTML of the example; when absent — the slot is rendered */ html?: string; /** code shown in the panel instead of html */ code?: string; raw?: boolean; overflow?: string; bg?: string; class?: string; height?: string; column?: boolean; centered?: boolean; vertical?: boolean; columnFullWidth?: boolean; hideCode?: boolean; codeOnly?: boolean; } const { html: htmlProp, code, raw, overflow = 'auto', bg, class: className, height, column, centered, vertical, columnFullWidth, hideCode, codeOnly, } = Astro.props; // Strip empty lines from the example HTML. let html = (htmlProp ?? (await Astro.slots.render('default'))).replace(/^\s*[\r\n]/gm, ''); // JSX reserializes the slot markup: empty SVG elements get explicit closing // tags, and apostrophes in text are escaped. We restore the source form so the // code in the panel looks like hand-written HTML. html = html .replace(/<(path|circle|line|polyline|polygon|rect|ellipse)([^>]*?)\s*><\/\1>/g, '<$1$2 />') .replace(/'/g, "'"); const exampleClasses = [ 'example fs-base border rounded my-5', !raw && 'd-flex flex-wrap justify-content-center', `overflow-${overflow}`, 'position-relative', bg ? `bg-${bg}` : 'bg-pattern-rectangles', className, ] const innerClasses = [ 'p-6 w-full', column && 'd-flex gap-3 flex-column', !column && centered && `d-flex flex-fill flex-wrap gap-2 justify-content-center${vertical ? ' align-items-center flex-column' : ' justify-content-center'}`, columnFullWidth && 'd-flex flex-fill flex-column gap-2', ] const highlighted = hideCode ? '' : await highlightCode(beautifyHtml(code ?? html), 'html'); --- { !codeOnly && (
{ raw ? ( ) : (
) }
) } { !hideCode && (
) }