{"version":3,"sources":["../../../src/react/Highlight.tsx"],"sourcesContent":["import { memo, Fragment, type FC, type CSSProperties } from \"react\";\nimport type { HighlightRanges } from \"../vanilla/types\";\n\ntype Style = CSSProperties;\n\ntype HighlightProps = {\n\ttext: string;\n\tranges: HighlightRanges | null;\n\tstyle?: Style;\n\tclassName?: string;\n};\n\nconst fullSelection: HighlightRanges = [[0, Number.MAX_VALUE]];\nconst defaultStyle: Style = { backgroundColor: \"rgba(245,220,0,.25)\" };\n\nconst TextHighlighter: React.FC<HighlightProps> = ({\n\ttext,\n\tranges,\n\tstyle,\n\tclassName,\n}) => {\n\tif (!ranges || ranges.length === 0) {\n\t\treturn <>{text}</>;\n\t}\n\n\tlet lastHighlightedIndex = 0;\n\tconst nodes: Array<React.ReactNode> = [];\n\n\tfor (const range of ranges) {\n\t\tconst [start, end] = range;\n\n\t\tif (start < lastHighlightedIndex || end < start) {\n\t\t\tconsole.warn(\n\t\t\t\t`Broken range in <Highlight>: ${start}-${end}, last: ${lastHighlightedIndex}`,\n\t\t\t);\n\t\t\treturn null;\n\t\t}\n\n\t\tif (start > lastHighlightedIndex) {\n\t\t\tnodes.push(\n\t\t\t\t<Fragment key={`t${lastHighlightedIndex}-${start}`}>\n\t\t\t\t\t{text.slice(lastHighlightedIndex, start)}\n\t\t\t\t</Fragment>,\n\t\t\t);\n\t\t}\n\n\t\tnodes.push(\n\t\t\t<span\n\t\t\t\tstyle={style ?? defaultStyle}\n\t\t\t\tclassName={className}\n\t\t\t\tkey={`${start}-${end}`}\n\t\t\t>\n\t\t\t\t{text.slice(start, end + 1)}\n\t\t\t</span>,\n\t\t);\n\n\t\tlastHighlightedIndex = end + 1;\n\t}\n\n\tif (text.length > lastHighlightedIndex) {\n\t\tnodes.push(\n\t\t\t<Fragment key=\"last\">{text.slice(lastHighlightedIndex)}</Fragment>,\n\t\t);\n\t}\n\n\treturn <>{nodes}</>;\n};\n\ninterface HighlightExport extends FC<HighlightProps> {\n\tFullSelection: typeof fullSelection;\n}\n\n/**\n * A React component that highlights text based on the provided props.\n *\n * This component is memoized for performance optimization and includes an additional\n * static property `FullSelection` for handling full text selection functionality.\n *\n * @component\n * @template HighlightProps - The props type for the `TextHighlighter` component.\n *\n * @property {FC<HighlightProps>} Highlight - The main text highlighter component.\n * @property {typeof fullSelection} FullSelection - A static property for full text selection.\n *\n * @example\n * ```tsx\n * import { Highlight } from './Highlight';\n *\n * const App = () => (\n *   <Highlight text=\"Hello, World!\" ranges={[[0, 4]]} />\n * );\n * ```\n */\nexport const Highlight: HighlightExport = Object.assign(\n\tmemo(TextHighlighter) as FC<HighlightProps>,\n\t{\n\t\tFullSelection: fullSelection,\n\t},\n);\n\nexport function createHighlightComponent(\n\tcustomStyle: Style,\n\tcustomClassName: string,\n): HighlightExport {\n\tconst HighlightComponent: React.FC<HighlightProps> = ({\n\t\tstyle,\n\t\tclassName,\n\t\t...props\n\t}) => (\n\t\t<TextHighlighter\n\t\t\t{...props}\n\t\t\tstyle={style ?? customStyle}\n\t\t\tclassName={className ?? customClassName}\n\t\t/>\n\t);\n\n\tObject.assign(HighlightComponent, { FullSelection: fullSelection });\n\n\treturn HighlightComponent as unknown as HighlightExport;\n}\n"],"mappings":";AAAA,SAAS,MAAM,gBAA6C;AAsBnD,qBAAAA,WAAA;AAVT,IAAM,gBAAiC,CAAC,CAAC,GAAG,OAAO,SAAS,CAAC;AAC7D,IAAM,eAAsB,EAAE,iBAAiB,sBAAsB;AAErE,IAAM,kBAA4C,CAAC;AAAA,EAClD;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD,MAAM;AACL,MAAI,CAAC,UAAU,OAAO,WAAW,GAAG;AACnC,WAAO,oBAAAA,WAAA,EAAG,gBAAK;AAAA,EAChB;AAEA,MAAI,uBAAuB;AAC3B,QAAM,QAAgC,CAAC;AAEvC,aAAW,SAAS,QAAQ;AAC3B,UAAM,CAAC,OAAO,GAAG,IAAI;AAErB,QAAI,QAAQ,wBAAwB,MAAM,OAAO;AAChD,cAAQ;AAAA,QACP,gCAAgC,KAAK,IAAI,GAAG,WAAW,oBAAoB;AAAA,MAC5E;AACA,aAAO;AAAA,IACR;AAEA,QAAI,QAAQ,sBAAsB;AACjC,YAAM;AAAA,QACL,oBAAC,YACC,eAAK,MAAM,sBAAsB,KAAK,KADzB,IAAI,oBAAoB,IAAI,KAAK,EAEhD;AAAA,MACD;AAAA,IACD;AAEA,UAAM;AAAA,MACL;AAAA,QAAC;AAAA;AAAA,UACA,OAAO,SAAS;AAAA,UAChB;AAAA,UAGC,eAAK,MAAM,OAAO,MAAM,CAAC;AAAA;AAAA,QAFrB,GAAG,KAAK,IAAI,GAAG;AAAA,MAGrB;AAAA,IACD;AAEA,2BAAuB,MAAM;AAAA,EAC9B;AAEA,MAAI,KAAK,SAAS,sBAAsB;AACvC,UAAM;AAAA,MACL,oBAAC,YAAqB,eAAK,MAAM,oBAAoB,KAAvC,MAAyC;AAAA,IACxD;AAAA,EACD;AAEA,SAAO,oBAAAA,WAAA,EAAG,iBAAM;AACjB;AA2BO,IAAM,YAA6B,OAAO;AAAA,EAChD,KAAK,eAAe;AAAA,EACpB;AAAA,IACC,eAAe;AAAA,EAChB;AACD;AAEO,SAAS,yBACf,aACA,iBACkB;AAClB,QAAM,qBAA+C,CAAC;AAAA,IACrD;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACJ,MACC;AAAA,IAAC;AAAA;AAAA,MACC,GAAG;AAAA,MACJ,OAAO,SAAS;AAAA,MAChB,WAAW,aAAa;AAAA;AAAA,EACzB;AAGD,SAAO,OAAO,oBAAoB,EAAE,eAAe,cAAc,CAAC;AAElE,SAAO;AACR;","names":["Fragment"]}