{"version":3,"file":"typography.cjs","sources":["../../../src/components/typography.tsx"],"sourcesContent":["import React, { forwardRef, useCallback, useEffect, useState } from \"react\";\nimport type {\n    ElementType,\n    ForwardedRef,\n    HTMLAttributes,\n    ReactElement,\n    ReactNode,\n} from \"react\";\nimport { mergedCva } from \"../utils/components\";\nimport { Popover, type PopoverProps } from \"./popover\";\n\nconst rootStyles = mergedCva([\"cui-text-black dark:cui-text-white\"], {\n    variants: {\n        uppercase: {\n            true: [\"cui-uppercase\"],\n        },\n        truncate: {\n            true: [\n                \"cui-overflow-hidden\",\n                \"cui-whitespace-nowrap\",\n                \"cui-text-ellipsis\",\n            ],\n        },\n        cursorPointer: {\n            true: [\"cui-cursor-pointer\"],\n        },\n        variant: {\n            xs: [\"cui-font-normal\", \"cui-font-mono\", \"cui-text-xs\"],\n            sm: [\"cui-font-normal\", \"cui-font-mono\", \"cui-text-sm\"],\n            base: [\"cui-font-normal\", \"cui-font-mono\", \"cui-text-base\"],\n            lg: [\"cui-font-normal\", \"cui-font-mono\", \"cui-text-lg\"],\n            xl: [\"cui-font-normal\", \"cui-font-mono\", \"cui-text-xl\"],\n            h4: [\"cui-font-bold\", \"cui-font-sans\", \"cui-text-h4\"],\n            h3: [\"cui-font-bold\", \"cui-font-sans\", \"cui-text-h3\"],\n            h2: [\"cui-font-bold\", \"cui-font-sans\", \"cui-text-h2\"],\n            h1: [\"cui-font-bold\", \"cui-font-sans\", \"cui-text-h1\"],\n        },\n        weight: {\n            normal: [\"cui-font-normal\"],\n            medium: [\"cui-font-medium\"],\n            bold: [\"cui-font-bold\"],\n        },\n    },\n});\n\nexport type TypographyVariant =\n    | \"xs\"\n    | \"sm\"\n    | \"base\"\n    | \"lg\"\n    | \"xl\"\n    | \"h1\"\n    | \"h2\"\n    | \"h3\"\n    | \"h4\";\n\nexport interface BaseTypographyProps {\n    variant?: TypographyVariant;\n    weight?: \"normal\" | \"medium\" | \"bold\";\n    uppercase?: boolean;\n    truncate?: boolean;\n    className?: {\n        root?: string;\n        truncatedTextPopover?: PopoverProps[\"className\"];\n    };\n    children: ReactNode;\n}\n\nexport type HTMLElementFromVariant<V extends TypographyVariant> = V extends\n    | \"h4\"\n    | \"h3\"\n    | \"h2\"\n    | \"h1\"\n    ? HTMLHeadingElement\n    : HTMLParagraphElement;\n\nexport type TypographyProps<V extends TypographyVariant = TypographyVariant> =\n    Omit<HTMLAttributes<HTMLElementFromVariant<V>>, keyof BaseTypographyProps> &\n        BaseTypographyProps;\n\nconst COMPONENT_MAP: Record<TypographyVariant, ElementType> = {\n    xs: \"p\",\n    sm: \"p\",\n    base: \"p\",\n    lg: \"p\",\n    xl: \"p\",\n    h1: \"h1\",\n    h2: \"h2\",\n    h3: \"h3\",\n    h4: \"h4\",\n};\n\nconst Component = <V extends TypographyVariant>(\n    {\n        variant = \"base\",\n        weight,\n        uppercase,\n        truncate,\n        className,\n        children,\n        ...rest\n    }: TypographyProps<V>,\n    ref: ForwardedRef<HTMLElementFromVariant<V>>,\n): ReactElement => {\n    const [popoverOpen, setPopoverOpen] = useState(false);\n    const [shouldShowPopover, setShouldShowPopover] = useState(false);\n    const [rootEl, setRootEl] = useState<HTMLElement | null>(null);\n\n    useEffect(() => {\n        if (!truncate || !rootEl) {\n            setShouldShowPopover(false);\n            return;\n        }\n        const shouldShow = rootEl.offsetWidth < rootEl.scrollWidth;\n        if (!shouldShow) setPopoverOpen(false);\n        setShouldShowPopover(shouldShow);\n    }, [children, rootEl, truncate]);\n\n    const handleMouseEnter = useCallback(\n        (event: React.MouseEvent<HTMLElementFromVariant<V>, MouseEvent>) => {\n            if (truncate && shouldShowPopover) setPopoverOpen(true);\n            if (rest.onMouseEnter) rest.onMouseEnter(event);\n        },\n        [rest, shouldShowPopover, truncate],\n    );\n\n    const handleMouseLeave = useCallback(\n        (event: React.MouseEvent<HTMLElementFromVariant<V>, MouseEvent>) => {\n            if (truncate && shouldShowPopover) setPopoverOpen(false);\n            if (rest.onMouseLeave) rest.onMouseLeave(event);\n        },\n        [rest, shouldShowPopover, truncate],\n    );\n\n    const Root = COMPONENT_MAP[variant];\n\n    return (\n        <>\n            {truncate && (\n                <Popover\n                    open={popoverOpen}\n                    anchor={rootEl}\n                    className={{\n                        ...className?.truncatedTextPopover,\n                        root: `px-3 py-2 ${className?.truncatedTextPopover?.root}`,\n                    }}\n                >\n                    <Typography variant=\"sm\">{children}</Typography>\n                </Popover>\n            )}\n            <Root\n                className={rootStyles({\n                    variant,\n                    weight,\n                    uppercase,\n                    truncate,\n                    cursorPointer: shouldShowPopover,\n                    className: className?.root,\n                })}\n                {...rest}\n                onMouseEnter={handleMouseEnter}\n                onMouseLeave={handleMouseLeave}\n                ref={(element: HTMLElementFromVariant<V>) => {\n                    if (ref) {\n                        if (typeof ref === \"function\") ref(element);\n                        else ref.current = element;\n                    }\n                    setRootEl(element);\n                }}\n            >\n                {children}\n            </Root>\n        </>\n    );\n};\n\nexport const Typography = forwardRef(Component) as <\n    V extends TypographyVariant,\n>(\n    props: TypographyProps<V> & {\n        ref?: React.ForwardedRef<HTMLElementFromVariant<V>>;\n    },\n) => ReturnType<typeof Component>;\n"],"names":["mergedCva","useState","useEffect","useCallback","Popover","forwardRef"],"mappings":"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"}