UNPKG

@vectara/vectara-ui

Version:

Vectara's design system, codified as a React and Sass component library

55 lines (54 loc) 3.57 kB
var __rest = (this && this.__rest) || function (s, e) { var t = {}; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0) t[p] = s[p]; if (s != null && typeof Object.getOwnPropertySymbols === "function") for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) { if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i])) t[p[i]] = s[p[i]]; } return t; }; import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime"; import { useEffect, useState } from "react"; import Prism from "prismjs"; import "prismjs/themes/prism.css"; import "prismjs/components/prism-json"; import "prismjs/components/prism-javascript"; import "prismjs/components/prism-typescript"; import "prismjs/components/prism-bash"; import "prismjs/components/prism-jsx"; import "prismjs/components/prism-tsx"; import classNames from "classnames"; import { BiClipboard, BiFullscreen, BiX } from "react-icons/bi"; import { VuiIconButton } from "../button/IconButton"; import { VuiIcon } from "../icon/Icon"; import { VuiFlexContainer } from "../flex/FlexContainer"; import { FocusOn } from "react-focus-on"; import { VuiPortal } from "../portal/Portal"; // PrismJS clears highlighting when language-none is set. export const VuiCode = (_a) => { var { onCopy, isFullscreenEnabled = true, language = "none", fullHeight, children = "" } = _a, rest = __rest(_a, ["onCopy", "isFullscreenEnabled", "language", "fullHeight", "children"]); const [isFullscreen, setIsFullscreen] = useState(false); useEffect(() => { Prism.highlightAll(); }, [children, language, isFullscreen]); const containerClasses = classNames("vuiCodeContainer", { "vuiCodeContainer--fullHeight": fullHeight }); const classes = classNames("vuiCode", `language-${language}`, { "vuiCode--fullHeight": fullHeight }); const testId = rest["data-testid"]; const actions = (_jsxs(VuiFlexContainer, Object.assign({ className: "vuiCodeActions", spacing: "xxs" }, { children: [isFullscreenEnabled && (_jsx(VuiIconButton, { color: "neutral", size: "xs", icon: _jsx(VuiIcon, { children: _jsx(BiFullscreen, {}) }), "aria-label": "Full screen", onClick: () => { setIsFullscreen(!isFullscreen); } })), _jsx(VuiIconButton, { color: "neutral", size: "xs", icon: _jsx(VuiIcon, { children: _jsx(BiClipboard, {}) }), "aria-label": "Copy to clipboard", onClick: () => { navigator.clipboard.writeText(children); if (onCopy) onCopy(); } })] }))); const code = (_jsx("pre", Object.assign({ className: "vuiCodePre" }, { children: _jsx("code", Object.assign({ className: classes }, { children: children })) }))); return (_jsxs("div", Object.assign({ className: containerClasses }, rest, { children: [code, actions, testId && (_jsx("div", Object.assign({ "data-testid": `${testId}-hidden`, hidden: true }, { children: children }))), _jsx(VuiPortal, { children: isFullscreen && (_jsx(FocusOn, Object.assign({ onEscapeKey: () => { setIsFullscreen(false); } }, { children: _jsxs("div", Object.assign({ className: "vuiCodeFullscreen" }, { children: [_jsx(VuiIconButton, { className: "vuiCodeFullscreen__closeButton", color: "neutral", size: "m", icon: _jsx(VuiIcon, { children: _jsx(BiX, {}) }), "aria-label": "Exit fullscreen code", onClick: () => setIsFullscreen(false) }), code] })) }))) })] }))); };