/** @jsxImportSource react */ import { useContext } from "react"; import { stripAnsi } from "#/ansi/strip.ts"; import { accessibilityContext } from "#/components/AccessibilityContext.ts"; import { Text } from "#/components/Text.tsx"; import type { Styles } from "#/styles.ts"; export type Props = { /** External text containing ANSI SGR styling or OSC 8 hyperlinks. */ readonly children: string; readonly wrap?: Styles["textWrap"]; readonly "aria-label"?: string; readonly "aria-hidden"?: boolean; }; /** * Renders explicitly trusted ANSI-styled output as structured terminal cells. * Ordinary `Text` continues to strip terminal control sequences. */ export function AnsiText({ children, wrap = "wrap", "aria-label": ariaLabel, "aria-hidden": ariaHidden = false, }: Props) { const { isScreenReaderEnabled } = useContext(accessibilityContext); if (isScreenReaderEnabled) { if (ariaHidden) return null; return {ariaLabel ?? stripAnsi(children)}; } return ( {children} ); }