import type { JSX } from "solid-js"; import { For, createSignal } from "solid-js"; import { Highlight } from "./Highlight"; import clsx from "clsx"; export function TrafficLightsIcon(props: JSX.IntrinsicElements["svg"]) { return ( ); } type SnippetTab = { name: string; codeLanguage: string; code: string; withLineNumbers?: boolean; children?: never; }; type CommonTab = { name: string; children: JSX.Element; codeLanguage?: never; code?: never; withLineNumbers?: never; }; type SnippetProps = { children?: JSX.Element; class?: string; snippets: (SnippetTab | CommonTab)[]; dark?: boolean; }; export function Snippet(props: SnippetProps) { let tabs: HTMLDivElement | undefined; let nav: HTMLDivElement | undefined; const [selectedTab, setSelectedTab] = createSignal( props.snippets[0], ); const isActive = (tab: SnippetTab | CommonTab) => { return selectedTab()?.name === tab.name; }; const selectTab = (name: string) => { const tab = props.snippets.find((tab) => tab.name === name); if (tab) setSelectedTab(tab); if (!tabs || !nav) return; const navWidth = nav.offsetWidth || 0; const tabsWidth = tabs.scrollWidth; if (tabsWidth > navWidth) { const tabElement: HTMLDivElement | null = tabs.querySelector( `div[data-tab="${name}"]`, ); if (!tabElement) return; const tabOffsetLeft = tabElement.offsetLeft; const tabWidth = tabElement.offsetWidth; const scrollLeft = Math.max( 0, tabOffsetLeft - navWidth / 2 + tabWidth / 2, ); nav.scrollTo({ left: scrollLeft, behavior: "smooth" }); } }; const canBeSelected = (tab: SnippetTab | CommonTab) => { return (tab.code || tab.children) !== undefined; }; return (
{(tab) => (
{tab.code && ( {tab.code} )} {!tab.code &&
{tab.children}
}
)}
); }