import styles from "./styles.module.css"; import { ColorEntry, ColorGroupProp, computeColor, ComputedColor, createComputedColorGroup, Prefix, } from "@goauthentik/docusaurus-theme/components/infima/shared.ts"; import { useColorMode } from "@docusaurus/theme-common"; import { useMemo, useState } from "react"; interface ColorSwatchProps extends ComputedColor { showVar?: boolean; } const ColorSwatch: React.FC = ({ cssVar, label, hex, contrastColor, showVar = true, }) => { const [copied, setCopied] = useState(false); const copyToClipboard = async (): Promise => { try { await navigator.clipboard.writeText(cssVar); setCopied(true); setTimeout(() => setCopied(false), 1500); } catch (err) { console.error("Failed to copy:", err); } }; return (
{label}
{showVar ?
{cssVar}
: null}
{hex || "—"}
{copied ?
Copied!
: null}
); }; export interface ColorGroupProps { group?: ColorGroupProp; } export const ColorGroup: React.FC = ({ group }) => { const { colorMode } = useColorMode(); if (!group) { throw new TypeError("Invalid color group name"); } const computed = useMemo(() => createComputedColorGroup(group, colorMode), [group, colorMode]); return (
{computed.colors.map((color) => ( ))}
); }; export interface PaletteGroupProps { entries?: Iterable; } export const PaletteGroup: React.FC = ({ entries }) => { const { colorMode } = useColorMode(); if (!entries) { throw new TypeError("Invalid utility color entries"); } const swatchProps: ColorSwatchProps[] = useMemo(() => { return Array.from(entries, ([label, partialCSSVar]) => { const cssVar = `${Prefix.Infima}${partialCSSVar}`; const { hex, contrastColor } = computeColor(cssVar); return { cssVar, label, hex, contrastColor, showVar: true, colorMode }; }); }, [entries, colorMode]); return (
{swatchProps.map((props) => ( ))}
); };