@particle-academy/react-fancy 5.67.0 → 5.69.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +63 -0
- package/dist/ContentRenderer.types-RO_l7_6N.d.cts +137 -0
- package/dist/ContentRenderer.types-RO_l7_6N.d.ts +137 -0
- package/dist/{PastedFilesInput-Bt3KSTVN.d.ts → PastedFilesInput-BT5y95sb.d.ts} +2 -1
- package/dist/{PastedFilesInput-CUQeOeOA.d.cts → PastedFilesInput-Cd4k6a38.d.cts} +2 -1
- package/dist/{chunk-U5LKNGHU.cjs → chunk-2PSHIUM7.cjs} +8 -8
- package/dist/{chunk-U5LKNGHU.cjs.map → chunk-2PSHIUM7.cjs.map} +1 -1
- package/dist/{chunk-QSGAFKK2.js → chunk-4UEIMGHZ.js} +3 -3
- package/dist/{chunk-QSGAFKK2.js.map → chunk-4UEIMGHZ.js.map} +1 -1
- package/dist/{chunk-YIKXJWO4.js → chunk-4WIPWJYD.js} +5 -4
- package/dist/chunk-4WIPWJYD.js.map +1 -0
- package/dist/{chunk-7FYRFNPX.cjs → chunk-FPFQBYKJ.cjs} +9 -9
- package/dist/{chunk-7FYRFNPX.cjs.map → chunk-FPFQBYKJ.cjs.map} +1 -1
- package/dist/{chunk-23AVEYUP.js → chunk-HRZDEZSE.js} +24 -19
- package/dist/chunk-HRZDEZSE.js.map +1 -0
- package/dist/{chunk-SAG6DHQK.cjs → chunk-ISNS4GAW.cjs} +29 -24
- package/dist/chunk-ISNS4GAW.cjs.map +1 -0
- package/dist/{chunk-6CAXLP7D.cjs → chunk-J5TFVYYM.cjs} +6 -6
- package/dist/{chunk-6CAXLP7D.cjs.map → chunk-J5TFVYYM.cjs.map} +1 -1
- package/dist/{chunk-E5UU666U.cjs → chunk-KGJ2ORY6.cjs} +148 -56
- package/dist/chunk-KGJ2ORY6.cjs.map +1 -0
- package/dist/{chunk-HEY4SMS2.js → chunk-LLVYCACC.js} +10 -4
- package/dist/chunk-LLVYCACC.js.map +1 -0
- package/dist/{chunk-4S5DFN5N.cjs → chunk-O4KZYGGC.cjs} +17 -11
- package/dist/chunk-O4KZYGGC.cjs.map +1 -0
- package/dist/{chunk-DCAD2JPP.js → chunk-U4PWNLOH.js} +3 -3
- package/dist/{chunk-DCAD2JPP.js.map → chunk-U4PWNLOH.js.map} +1 -1
- package/dist/{chunk-B4LVQ4QI.js → chunk-YEGFOMJB.js} +3 -3
- package/dist/{chunk-B4LVQ4QI.js.map → chunk-YEGFOMJB.js.map} +1 -1
- package/dist/{chunk-HFK5SBNM.cjs → chunk-YJETQ76J.cjs} +5 -4
- package/dist/chunk-YJETQ76J.cjs.map +1 -0
- package/dist/{chunk-FXOT4P4P.js → chunk-Z6RA37IC.js} +148 -56
- package/dist/chunk-Z6RA37IC.js.map +1 -0
- package/dist/composer.cjs +4 -4
- package/dist/composer.js +2 -2
- package/dist/content-renderer.cjs +4 -4
- package/dist/content-renderer.d.cts +3 -72
- package/dist/content-renderer.d.ts +3 -72
- package/dist/content-renderer.js +1 -1
- package/dist/editor.cjs +4 -4
- package/dist/editor.d.cts +19 -2
- package/dist/editor.d.ts +19 -2
- package/dist/editor.js +2 -2
- package/dist/{index-XR5t8bTq.d.ts → index-BQi_n6eS.d.ts} +21 -3
- package/dist/{index-DWtSViJ3.d.cts → index-n_4_OZK_.d.cts} +21 -3
- package/dist/index.cjs +38 -38
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +7 -7
- package/dist/input.cjs +3 -3
- package/dist/input.js +2 -2
- package/dist/inputs.cjs +3 -3
- package/dist/inputs.js +2 -2
- package/dist/json-editor.cjs +14 -14
- package/dist/json-editor.js +3 -3
- package/dist/paste-pills.cjs +14 -14
- package/dist/paste-pills.d.cts +1 -1
- package/dist/paste-pills.d.ts +1 -1
- package/dist/paste-pills.js +1 -1
- package/dist/prompt-input.cjs +5 -5
- package/dist/prompt-input.d.cts +1 -1
- package/dist/prompt-input.d.ts +1 -1
- package/dist/prompt-input.js +2 -2
- package/docs/ContentRenderer.md +63 -6
- package/docs/Editor.md +38 -0
- package/docs/PromptInput.md +3 -2
- package/package.json +1 -1
- package/dist/chunk-23AVEYUP.js.map +0 -1
- package/dist/chunk-4S5DFN5N.cjs.map +0 -1
- package/dist/chunk-E5UU666U.cjs.map +0 -1
- package/dist/chunk-FXOT4P4P.js.map +0 -1
- package/dist/chunk-HEY4SMS2.js.map +0 -1
- package/dist/chunk-HFK5SBNM.cjs.map +0 -1
- package/dist/chunk-SAG6DHQK.cjs.map +0 -1
- package/dist/chunk-YIKXJWO4.js.map +0 -1
- package/dist/extensions-DiByZIpD.d.cts +0 -61
- package/dist/extensions-DiByZIpD.d.ts +0 -61
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/hooks/use-adornment-width.ts","../src/components/inputs/Input/Input.tsx"],"names":["useState","useCallback","useEffect","forwardRef","useId","useFieldMode","useInlineEdit","useControllableState","useRef","useInlinePaste","useMemo","jsx","DisplayValue","InputWrapper","jsxs","Fragment","InlinePasteEditor","cn","inputBaseClasses","inputSizeClasses","dirtyClasses","errorClasses","PastedFilesInput","Field"],"mappings":"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","file":"chunk-6CAXLP7D.cjs","sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\n/**\n * Measure an inline adornment so the input can reserve exactly its width.\n *\n * ## Why this exists\n *\n * `leading` / `trailing` render ABSOLUTELY over the input, so they take no\n * space in flow and the input must be padded by hand to keep text clear of\n * them. That padding used to be a fixed `pl-9` / `pr-9` — 36px, sized for a\n * single icon. Any wider adornment ran straight under the value: `leading =\n * \"https://\"` is roughly 50px, so `https://` and `fancy.app` rendered on top of\n * one another.\n *\n * A fixed padding cannot be right for arbitrary content, and these props accept\n * arbitrary content — a currency code, a unit, a protocol, a short label. So\n * the width is measured rather than assumed.\n *\n * Returns `0` until measured (and on the server), which is the signal to keep\n * the old fixed padding as a fallback: an unmeasured render is then no worse\n * than it was before, rather than unpadded.\n *\n * `ResizeObserver` rather than a one-shot read, because the width changes after\n * first paint for reasons the first paint cannot see — a webfont swapping in,\n * the adornment's own content changing, a container query resizing the text.\n */\nexport function useAdornmentWidth(): [(node: HTMLElement | null) => void, number] {\n const [width, setWidth] = useState(0);\n const [node, setNode] = useState<HTMLElement | null>(null);\n\n const ref = useCallback((n: HTMLElement | null) => setNode(n), []);\n\n useEffect(() => {\n if (!node) {\n setWidth(0);\n\n return;\n }\n\n const read = () => setWidth(node.getBoundingClientRect().width);\n read();\n\n if (typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver(read);\n observer.observe(node);\n\n return () => observer.disconnect();\n }, [node]);\n\n return [ref, width];\n}\n","import { forwardRef, useId, useMemo, useRef } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { useControllableState } from \"../../../hooks/use-controllable-state\";\nimport { useAdornmentWidth } from \"../../../hooks/use-adornment-width\";\nimport { Field } from \"../Field\";\nimport { InputWrapper } from \"../InputWrapper\";\nimport {\n dirtyClasses,\n errorClasses,\n inputBaseClasses,\n inputSizeClasses,\n} from \"../inputs.utils\";\nimport { useFieldMode } from \"../mode/FieldMode.context\";\nimport { DisplayValue } from \"../mode/DisplayValue\";\nimport { useInlineEdit } from \"../mode/useInlineEdit\";\nimport {\n InlinePasteEditor,\n PastedFilesInput,\n useInlinePaste,\n type InlinePasteEditorHandle,\n} from \"../../PastePills\";\nimport type { InputProps } from \"./Input.types\";\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n type = \"text\",\n size = \"md\",\n dirty,\n error,\n label,\n labelHidden,\n description,\n required,\n disabled,\n className,\n id,\n leading,\n trailing,\n prefix,\n suffix,\n prefixPosition,\n suffixPosition,\n mode,\n onValueChange,\n onChange,\n reveal,\n revealed,\n onRevealedChange,\n revealLabel = \"Show password\",\n hideLabel = \"Hide password\",\n pasteThreshold,\n pasteImages = false,\n pasteFilesName,\n previewChars = 20,\n renderPastePreview,\n pasteClassNames,\n heldPastes,\n onHeldPastesChange,\n heldImages,\n onHeldImagesChange,\n ...props\n },\n ref,\n ) => {\n const autoId = useId();\n const inputId = id ?? autoId;\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n\n // Measured, not assumed: `leading`/`trailing` take arbitrary content, and a\n // fixed padding can only ever be right for one width. See\n // `useAdornmentWidth` for what went wrong with the fixed version.\n const [leadingRef, leadingWidth] = useAdornmentWidth();\n const [trailingRef, trailingWidth] = useAdornmentWidth();\n\n // Only meaningful on a password field: a reveal on an already-visible input\n // is a button that does nothing.\n const canReveal = reveal === true && type === \"password\";\n const [isRevealed, setRevealed] = useControllableState(revealed, false, onRevealedChange);\n const shown = canReveal && isRevealed;\n // The rendered type, NOT the declared one — `type` stays \"password\" so the\n // display-mode masking below and any caller reading props are unaffected.\n const renderedType = shown ? \"text\" : type;\n\n /*\n * Paste pills: the same core `Composer` and `PromptInput` use, so the three\n * cannot disagree about what a pill holds or what a send carries. Hooks run\n * whether or not it is on (Rules of Hooks); nothing is rendered unless asked.\n */\n const pasting = pasteThreshold !== undefined || pasteImages;\n const editorRef = useRef<InlinePasteEditorHandle>(null);\n const hiddenRef = useRef<HTMLInputElement | null>(null);\n const paste = useInlinePaste({\n pasteThreshold,\n pasteImages,\n previewChars,\n renderPastePreview,\n classNames: pasteClassNames,\n disabled: disabled === true,\n heldPastes,\n onHeldPastesChange,\n heldImages,\n onHeldImagesChange,\n editorRef,\n blockText: false,\n });\n const [pasteValue, setPasteValue] = useControllableState<string>(\n props.value === undefined ? undefined : String(props.value),\n props.defaultValue === undefined ? \"\" : String(props.defaultValue),\n onValueChange,\n );\n const filesName = pasteFilesName ?? (props.name ? `${props.name}_files[]` : undefined);\n const pastedFiles = useMemo(\n () => (pasteImages ? paste.imagesIn(pasteValue).map((i) => i.file) : []),\n [pasteImages, paste, pasteValue],\n );\n const labelId = `${inputId}-label`;\n\n const input = !showControl ? (\n <DisplayValue\n size={size}\n interactive={interactive}\n onActivate={enterEdit}\n leading={leading ?? prefix}\n trailing={trailing ?? suffix}\n >\n {type === \"password\" ? (props.value ? \"••••••\" : \"\") : (props.value as string | undefined)}\n </DisplayValue>\n ) : (\n <InputWrapper\n prefix={prefix}\n suffix={suffix}\n prefixPosition={prefixPosition}\n suffixPosition={suffixPosition}\n size={size}\n >\n <div data-react-fancy-input=\"\" className=\"relative flex items-center\">\n {leading && (\n <span\n ref={leadingRef}\n className=\"pointer-events-none absolute left-3 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\"\n >\n {leading}\n </span>\n )}\n {pasting ? (\n <>\n <div className=\"min-w-0 flex-1\">\n <InlinePasteEditor\n ref={editorRef}\n id={inputId}\n value={pasteValue}\n known={paste.known}\n onChange={(next) => {\n setPasteValue(next);\n paste.prune(next);\n }}\n // Enter in a text field submits its form; keep that.\n onSubmit={() => hiddenRef.current?.form?.requestSubmit()}\n multiline={false}\n onPaste={paste.decidePaste}\n onHostsChange={paste.onHostsChange}\n placeholder={props.placeholder ?? \"\"}\n disabled={disabled === true}\n ariaLabelledBy={label ? labelId : props[\"aria-labelledby\"]}\n ariaInvalid={Boolean(error)}\n placeholderClassName={cn(pastePlaceholderClasses[size], leading ? \"left-9\" : undefined)}\n style={{\n ...(leadingWidth ? { paddingLeft: leadingWidth + 20 } : null),\n ...(trailingWidth ? { paddingRight: trailingWidth + 20 } : null),\n }}\n className={cn(\n inputBaseClasses,\n inputSizeClasses[size],\n dirtyClasses(dirty),\n errorClasses(error),\n // One line, like the <input> it stands in for.\n \"min-h-0 max-h-none w-full overflow-x-auto overflow-y-hidden whitespace-nowrap break-normal\",\n leading && !leadingWidth && \"pl-9\",\n trailing && !trailingWidth && \"pr-9\",\n className,\n pasteClassNames?.input,\n )}\n />\n </div>\n {paste.portals}\n {/* What a native submit posts: the value with every pill expanded. */}\n <input\n ref={(el) => {\n hiddenRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n type=\"hidden\"\n name={props.name}\n form={props.form}\n value={paste.expand(pasteValue)}\n />\n {pasteImages && filesName && (\n <PastedFilesInput name={filesName} files={pastedFiles} form={props.form} />\n )}\n </>\n ) : (\n <input\n ref={ref}\n id={inputId}\n type={renderedType}\n disabled={disabled}\n required={required}\n className={cn(\n inputBaseClasses,\n inputSizeClasses[size],\n dirtyClasses(dirty),\n errorClasses(error),\n \"w-full\",\n // The fixed classes are the PRE-MEASURE fallback only. Once the\n // adornment is measured, the inline style below overrides them\n // with its real width -- a fixed 36px is correct for one icon and\n // wrong for anything wider, which is how `https://` came to\n // render on top of the value.\n leading && !leadingWidth && \"pl-9\",\n (trailing || canReveal) && !trailingWidth && \"pr-9\",\n className,\n )}\n style={{\n // 12px clears `left-3`/`right-3`; 8px is the gap to the text.\n ...(leadingWidth ? { paddingLeft: leadingWidth + 20 } : null),\n ...(trailingWidth ? { paddingRight: trailingWidth + 20 } : null),\n ...props.style,\n }}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n }}\n {...props}\n // Inline click-to-edit: focus on entering edit, return to the display\n // (and run the host's onBlur) when focus leaves.\n autoFocus={interactive || props.autoFocus}\n onBlur={(e) => {\n props.onBlur?.(e);\n if (interactive) exitEdit();\n }}\n />\n )}\n {canReveal ? (\n <button\n type=\"button\"\n // type=\"button\" is load-bearing: the default is \"submit\", so a\n // reveal inside a login form would submit it on every click.\n id={`${inputId}-reveal`}\n data-react-fancy-reveal=\"\"\n onClick={() => setRevealed((v) => !v)}\n disabled={disabled}\n aria-controls={inputId}\n aria-pressed={shown}\n aria-label={shown ? hideLabel : revealLabel}\n title={shown ? hideLabel : revealLabel}\n // Not focusable by tab: the field and the submit button are the\n // path through a login form, and a reveal in between is a stop\n // most people do not want. Still reachable by click and by\n // screen readers.\n tabIndex={-1}\n className=\"absolute right-2 inline-flex items-center justify-center rounded p-1 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] transition-colors hover:text-zinc-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50 dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))] dark:hover:text-zinc-300\"\n >\n {shown ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n ) : (\n trailing && (\n <span\n ref={trailingRef}\n className=\"pointer-events-none absolute right-3 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\"\n >\n {trailing}\n </span>\n )\n )}\n </div>\n </InputWrapper>\n );\n\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelId={pasting ? labelId : undefined}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={inputId}\n size={size}\n >\n {input}\n </Field>\n );\n }\n\n return input;\n },\n);\n\nInput.displayName = \"Input\";\n\n/** Where the placeholder sits over the paste editor, matching `inputSizeClasses`. */\nconst pastePlaceholderClasses = {\n xs: \"left-2 top-1 text-xs\",\n sm: \"left-2.5 top-1.5 text-sm\",\n md: \"left-3 top-2 text-sm\",\n lg: \"left-4 top-2.5 text-base\",\n xl: \"left-5 top-3 text-lg\",\n} as const;\n\n/**\n * Inline SVGs rather than the Icon component: Input is the most-installed\n * primitive in the kit, and routing it through the icon registry would make\n * every consumer's password field depend on an icon set being configured.\n */\nfunction EyeIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction EyeOffIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/hooks/use-adornment-width.ts","../src/components/inputs/Input/Input.tsx"],"names":["useState","useCallback","useEffect","forwardRef","useId","useFieldMode","useInlineEdit","useControllableState","useRef","useInlinePaste","useMemo","jsx","DisplayValue","InputWrapper","jsxs","Fragment","InlinePasteEditor","cn","inputBaseClasses","inputSizeClasses","dirtyClasses","errorClasses","PastedFilesInput","Field"],"mappings":"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","file":"chunk-J5TFVYYM.cjs","sourcesContent":["import { useCallback, useEffect, useState } from \"react\";\n\n/**\n * Measure an inline adornment so the input can reserve exactly its width.\n *\n * ## Why this exists\n *\n * `leading` / `trailing` render ABSOLUTELY over the input, so they take no\n * space in flow and the input must be padded by hand to keep text clear of\n * them. That padding used to be a fixed `pl-9` / `pr-9` — 36px, sized for a\n * single icon. Any wider adornment ran straight under the value: `leading =\n * \"https://\"` is roughly 50px, so `https://` and `fancy.app` rendered on top of\n * one another.\n *\n * A fixed padding cannot be right for arbitrary content, and these props accept\n * arbitrary content — a currency code, a unit, a protocol, a short label. So\n * the width is measured rather than assumed.\n *\n * Returns `0` until measured (and on the server), which is the signal to keep\n * the old fixed padding as a fallback: an unmeasured render is then no worse\n * than it was before, rather than unpadded.\n *\n * `ResizeObserver` rather than a one-shot read, because the width changes after\n * first paint for reasons the first paint cannot see — a webfont swapping in,\n * the adornment's own content changing, a container query resizing the text.\n */\nexport function useAdornmentWidth(): [(node: HTMLElement | null) => void, number] {\n const [width, setWidth] = useState(0);\n const [node, setNode] = useState<HTMLElement | null>(null);\n\n const ref = useCallback((n: HTMLElement | null) => setNode(n), []);\n\n useEffect(() => {\n if (!node) {\n setWidth(0);\n\n return;\n }\n\n const read = () => setWidth(node.getBoundingClientRect().width);\n read();\n\n if (typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver(read);\n observer.observe(node);\n\n return () => observer.disconnect();\n }, [node]);\n\n return [ref, width];\n}\n","import { forwardRef, useId, useMemo, useRef } from \"react\";\nimport { cn } from \"../../../utils/cn\";\nimport { useControllableState } from \"../../../hooks/use-controllable-state\";\nimport { useAdornmentWidth } from \"../../../hooks/use-adornment-width\";\nimport { Field } from \"../Field\";\nimport { InputWrapper } from \"../InputWrapper\";\nimport {\n dirtyClasses,\n errorClasses,\n inputBaseClasses,\n inputSizeClasses,\n} from \"../inputs.utils\";\nimport { useFieldMode } from \"../mode/FieldMode.context\";\nimport { DisplayValue } from \"../mode/DisplayValue\";\nimport { useInlineEdit } from \"../mode/useInlineEdit\";\nimport {\n InlinePasteEditor,\n PastedFilesInput,\n useInlinePaste,\n type InlinePasteEditorHandle,\n} from \"../../PastePills\";\nimport type { InputProps } from \"./Input.types\";\n\nexport const Input = forwardRef<HTMLInputElement, InputProps>(\n (\n {\n type = \"text\",\n size = \"md\",\n dirty,\n error,\n label,\n labelHidden,\n description,\n required,\n disabled,\n className,\n id,\n leading,\n trailing,\n prefix,\n suffix,\n prefixPosition,\n suffixPosition,\n mode,\n onValueChange,\n onChange,\n reveal,\n revealed,\n onRevealedChange,\n revealLabel = \"Show password\",\n hideLabel = \"Hide password\",\n pasteThreshold,\n pasteImages = false,\n pasteFilesName,\n previewChars = 20,\n renderPastePreview,\n pasteClassNames,\n heldPastes,\n onHeldPastesChange,\n heldImages,\n onHeldImagesChange,\n ...props\n },\n ref,\n ) => {\n const autoId = useId();\n const inputId = id ?? autoId;\n const resolvedMode = useFieldMode(mode);\n const { showControl, interactive, enterEdit, exitEdit } = useInlineEdit(resolvedMode, disabled);\n\n // Measured, not assumed: `leading`/`trailing` take arbitrary content, and a\n // fixed padding can only ever be right for one width. See\n // `useAdornmentWidth` for what went wrong with the fixed version.\n const [leadingRef, leadingWidth] = useAdornmentWidth();\n const [trailingRef, trailingWidth] = useAdornmentWidth();\n\n // Only meaningful on a password field: a reveal on an already-visible input\n // is a button that does nothing.\n const canReveal = reveal === true && type === \"password\";\n const [isRevealed, setRevealed] = useControllableState(revealed, false, onRevealedChange);\n const shown = canReveal && isRevealed;\n // The rendered type, NOT the declared one — `type` stays \"password\" so the\n // display-mode masking below and any caller reading props are unaffected.\n const renderedType = shown ? \"text\" : type;\n\n /*\n * Paste pills: the same core `Composer` and `PromptInput` use, so the three\n * cannot disagree about what a pill holds or what a send carries. Hooks run\n * whether or not it is on (Rules of Hooks); nothing is rendered unless asked.\n */\n const pasting = pasteThreshold !== undefined || pasteImages;\n const editorRef = useRef<InlinePasteEditorHandle>(null);\n const hiddenRef = useRef<HTMLInputElement | null>(null);\n const paste = useInlinePaste({\n pasteThreshold,\n pasteImages,\n previewChars,\n renderPastePreview,\n classNames: pasteClassNames,\n disabled: disabled === true,\n heldPastes,\n onHeldPastesChange,\n heldImages,\n onHeldImagesChange,\n editorRef,\n blockText: false,\n });\n const [pasteValue, setPasteValue] = useControllableState<string>(\n props.value === undefined ? undefined : String(props.value),\n props.defaultValue === undefined ? \"\" : String(props.defaultValue),\n onValueChange,\n );\n const filesName = pasteFilesName ?? (props.name ? `${props.name}_files[]` : undefined);\n const pastedFiles = useMemo(\n () => (pasteImages ? paste.imagesIn(pasteValue).map((i) => i.file) : []),\n [pasteImages, paste, pasteValue],\n );\n const labelId = `${inputId}-label`;\n\n const input = !showControl ? (\n <DisplayValue\n size={size}\n interactive={interactive}\n onActivate={enterEdit}\n leading={leading ?? prefix}\n trailing={trailing ?? suffix}\n >\n {type === \"password\" ? (props.value ? \"••••••\" : \"\") : (props.value as string | undefined)}\n </DisplayValue>\n ) : (\n <InputWrapper\n prefix={prefix}\n suffix={suffix}\n prefixPosition={prefixPosition}\n suffixPosition={suffixPosition}\n size={size}\n >\n <div data-react-fancy-input=\"\" className=\"relative flex items-center\">\n {leading && (\n <span\n ref={leadingRef}\n className=\"pointer-events-none absolute left-3 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\"\n >\n {leading}\n </span>\n )}\n {pasting ? (\n <>\n <div className=\"min-w-0 flex-1\">\n <InlinePasteEditor\n ref={editorRef}\n id={inputId}\n value={pasteValue}\n known={paste.known}\n onChange={(next) => {\n setPasteValue(next);\n paste.prune(next);\n }}\n // Enter in a text field submits its form; keep that.\n onSubmit={() => hiddenRef.current?.form?.requestSubmit()}\n multiline={false}\n onPaste={paste.decidePaste}\n onHostsChange={paste.onHostsChange}\n placeholder={props.placeholder ?? \"\"}\n disabled={disabled === true}\n ariaLabelledBy={label ? labelId : props[\"aria-labelledby\"]}\n ariaInvalid={Boolean(error)}\n placeholderClassName={cn(pastePlaceholderClasses[size], leading ? \"left-9\" : undefined)}\n style={{\n ...(leadingWidth ? { paddingLeft: leadingWidth + 20 } : null),\n ...(trailingWidth ? { paddingRight: trailingWidth + 20 } : null),\n }}\n className={cn(\n inputBaseClasses,\n inputSizeClasses[size],\n dirtyClasses(dirty),\n errorClasses(error),\n // One line, like the <input> it stands in for.\n \"min-h-0 max-h-none w-full overflow-x-auto overflow-y-hidden whitespace-nowrap break-normal\",\n leading && !leadingWidth && \"pl-9\",\n trailing && !trailingWidth && \"pr-9\",\n className,\n pasteClassNames?.input,\n )}\n />\n </div>\n {paste.portals}\n {/* What a native submit posts: the value with every pill expanded. */}\n <input\n ref={(el) => {\n hiddenRef.current = el;\n if (typeof ref === \"function\") ref(el);\n else if (ref) ref.current = el;\n }}\n type=\"hidden\"\n name={props.name}\n form={props.form}\n value={paste.expand(pasteValue)}\n />\n {pasteImages && filesName && (\n <PastedFilesInput name={filesName} files={pastedFiles} form={props.form} />\n )}\n </>\n ) : (\n <input\n ref={ref}\n id={inputId}\n type={renderedType}\n disabled={disabled}\n required={required}\n className={cn(\n inputBaseClasses,\n inputSizeClasses[size],\n dirtyClasses(dirty),\n errorClasses(error),\n \"w-full\",\n // The fixed classes are the PRE-MEASURE fallback only. Once the\n // adornment is measured, the inline style below overrides them\n // with its real width -- a fixed 36px is correct for one icon and\n // wrong for anything wider, which is how `https://` came to\n // render on top of the value.\n leading && !leadingWidth && \"pl-9\",\n (trailing || canReveal) && !trailingWidth && \"pr-9\",\n className,\n )}\n style={{\n // 12px clears `left-3`/`right-3`; 8px is the gap to the text.\n ...(leadingWidth ? { paddingLeft: leadingWidth + 20 } : null),\n ...(trailingWidth ? { paddingRight: trailingWidth + 20 } : null),\n ...props.style,\n }}\n onChange={(e) => {\n onChange?.(e);\n onValueChange?.(e.target.value);\n }}\n {...props}\n // Inline click-to-edit: focus on entering edit, return to the display\n // (and run the host's onBlur) when focus leaves.\n autoFocus={interactive || props.autoFocus}\n onBlur={(e) => {\n props.onBlur?.(e);\n if (interactive) exitEdit();\n }}\n />\n )}\n {canReveal ? (\n <button\n type=\"button\"\n // type=\"button\" is load-bearing: the default is \"submit\", so a\n // reveal inside a login form would submit it on every click.\n id={`${inputId}-reveal`}\n data-react-fancy-reveal=\"\"\n onClick={() => setRevealed((v) => !v)}\n disabled={disabled}\n aria-controls={inputId}\n aria-pressed={shown}\n aria-label={shown ? hideLabel : revealLabel}\n title={shown ? hideLabel : revealLabel}\n // Not focusable by tab: the field and the submit button are the\n // path through a login form, and a reveal in between is a stop\n // most people do not want. Still reachable by click and by\n // screen readers.\n tabIndex={-1}\n className=\"absolute right-2 inline-flex items-center justify-center rounded p-1 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] transition-colors hover:text-zinc-600 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500/40 disabled:cursor-not-allowed disabled:opacity-50 dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))] dark:hover:text-zinc-300\"\n >\n {shown ? <EyeOffIcon /> : <EyeIcon />}\n </button>\n ) : (\n trailing && (\n <span\n ref={trailingRef}\n className=\"pointer-events-none absolute right-3 text-[color:var(--fancy-text-faint,var(--color-zinc-400))] dark:text-[color:var(--fancy-text-faint-dark,var(--color-zinc-500))]\"\n >\n {trailing}\n </span>\n )\n )}\n </div>\n </InputWrapper>\n );\n\n if (label || error || description) {\n return (\n <Field\n label={label}\n labelId={pasting ? labelId : undefined}\n labelHidden={labelHidden}\n description={description}\n error={error}\n required={required}\n htmlFor={inputId}\n size={size}\n >\n {input}\n </Field>\n );\n }\n\n return input;\n },\n);\n\nInput.displayName = \"Input\";\n\n/** Where the placeholder sits over the paste editor, matching `inputSizeClasses`. */\nconst pastePlaceholderClasses = {\n xs: \"left-2 top-1 text-xs\",\n sm: \"left-2.5 top-1.5 text-sm\",\n md: \"left-3 top-2 text-sm\",\n lg: \"left-4 top-2.5 text-base\",\n xl: \"left-5 top-3 text-lg\",\n} as const;\n\n/**\n * Inline SVGs rather than the Icon component: Input is the most-installed\n * primitive in the kit, and routing it through the icon registry would make\n * every consumer's password field depend on an icon set being configured.\n */\nfunction EyeIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\" />\n <circle cx=\"12\" cy=\"12\" r=\"3\" />\n </svg>\n );\n}\n\nfunction EyeOffIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\" />\n <path d=\"M14.084 14.158a3 3 0 0 1-4.242-4.242\" />\n <path d=\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\" />\n <path d=\"m2 2 20 20\" />\n </svg>\n );\n}\n"]}
|
|
@@ -111,6 +111,19 @@ function markdownToRawHtml(markdown) {
|
|
|
111
111
|
function renderMarkdown(markdown, sanitize) {
|
|
112
112
|
return chunk3U7PUZLI_cjs.sanitizeHtml(markdownToRawHtml(markdown), sanitize);
|
|
113
113
|
}
|
|
114
|
+
|
|
115
|
+
// src/utils/visually-hidden.ts
|
|
116
|
+
var visuallyHidden = {
|
|
117
|
+
position: "absolute",
|
|
118
|
+
width: "1px",
|
|
119
|
+
height: "1px",
|
|
120
|
+
padding: 0,
|
|
121
|
+
margin: "-1px",
|
|
122
|
+
overflow: "hidden",
|
|
123
|
+
clip: "rect(0, 0, 0, 0)",
|
|
124
|
+
whiteSpace: "nowrap",
|
|
125
|
+
border: 0
|
|
126
|
+
};
|
|
114
127
|
var proseClasses = [
|
|
115
128
|
"[&_h1]:text-2xl [&_h1]:font-bold [&_h1]:mt-4 [&_h1]:mb-2",
|
|
116
129
|
"[&_h2]:text-xl [&_h2]:font-semibold [&_h2]:mt-3 [&_h2]:mb-2",
|
|
@@ -878,7 +891,7 @@ function maskInlineCode(line) {
|
|
|
878
891
|
function scan(src, names, trackFences) {
|
|
879
892
|
const tokens = [];
|
|
880
893
|
let openFenceStart = -1;
|
|
881
|
-
if (names.length === 0 && !trackFences) return { tokens, openFenceStart };
|
|
894
|
+
if (names.length === 0 && !trackFences) return { tokens, openFenceStart, openFence: null };
|
|
882
895
|
const tagRe = names.length ? new RegExp(`<(\\/?)(${names.map(escapeRegExp).join("|")})(?=[\\s>/])([^>]*)>`, "gi") : null;
|
|
883
896
|
let fence = null;
|
|
884
897
|
let pos = 0;
|
|
@@ -929,7 +942,39 @@ function scan(src, names, trackFences) {
|
|
|
929
942
|
if (nl < 0) break;
|
|
930
943
|
pos = lineEnd + 1;
|
|
931
944
|
}
|
|
932
|
-
return { tokens, openFenceStart };
|
|
945
|
+
return { tokens, openFenceStart, openFence: fence };
|
|
946
|
+
}
|
|
947
|
+
function partialTagAt(lastLine, names, markdown) {
|
|
948
|
+
if (!names.length) return -1;
|
|
949
|
+
const masked = markdown ? maskInlineCode(lastLine) : lastLine;
|
|
950
|
+
const lt = masked.lastIndexOf("<");
|
|
951
|
+
if (lt < 0) return -1;
|
|
952
|
+
const m = /^<(\/?)([A-Za-z][\w-]*)?([^>]*)$/.exec(masked.slice(lt));
|
|
953
|
+
if (!m) return -1;
|
|
954
|
+
const name = (m[2] ?? "").toLowerCase();
|
|
955
|
+
const rest = m[3];
|
|
956
|
+
let partial = false;
|
|
957
|
+
if (!name) partial = rest === "";
|
|
958
|
+
else if (names.includes(name)) partial = rest === "" || /^\s/.test(rest);
|
|
959
|
+
else partial = rest === "" && names.some((n) => n.startsWith(name));
|
|
960
|
+
return partial ? lt : -1;
|
|
961
|
+
}
|
|
962
|
+
function openTagsBefore(tokens, cut) {
|
|
963
|
+
const stack = [];
|
|
964
|
+
for (const t of tokens) {
|
|
965
|
+
if (t.start >= cut) break;
|
|
966
|
+
if (t.kind === "open") {
|
|
967
|
+
stack.push(t);
|
|
968
|
+
continue;
|
|
969
|
+
}
|
|
970
|
+
for (let k = stack.length - 1; k >= 0; k--) {
|
|
971
|
+
if (stack[k].name === t.name) {
|
|
972
|
+
stack.length = k;
|
|
973
|
+
break;
|
|
974
|
+
}
|
|
975
|
+
}
|
|
976
|
+
}
|
|
977
|
+
return stack;
|
|
933
978
|
}
|
|
934
979
|
function splitMarkdownBlocks(src, tags) {
|
|
935
980
|
const names = tags.map((t) => t.toLowerCase());
|
|
@@ -973,43 +1018,45 @@ function streamingCut(src, tags, markdown) {
|
|
|
973
1018
|
const { tokens, openFenceStart } = scan(src, names, markdown);
|
|
974
1019
|
let cut = src.length;
|
|
975
1020
|
if (openFenceStart >= 0) cut = Math.min(cut, openFenceStart);
|
|
976
|
-
const stack =
|
|
977
|
-
for (const t of tokens) {
|
|
978
|
-
if (t.start >= cut) break;
|
|
979
|
-
if (t.kind === "open") {
|
|
980
|
-
stack.push(t);
|
|
981
|
-
continue;
|
|
982
|
-
}
|
|
983
|
-
for (let k = stack.length - 1; k >= 0; k--) {
|
|
984
|
-
if (stack[k].name === t.name) {
|
|
985
|
-
stack.length = k;
|
|
986
|
-
break;
|
|
987
|
-
}
|
|
988
|
-
}
|
|
989
|
-
}
|
|
1021
|
+
const stack = openTagsBefore(tokens, cut);
|
|
990
1022
|
if (stack.length) cut = Math.min(cut, stack[0].start);
|
|
991
1023
|
const lastLineStart = src.lastIndexOf("\n", cut - 1) + 1;
|
|
992
1024
|
const lastLine = src.slice(lastLineStart, cut);
|
|
993
1025
|
if (markdown && /^ {0,3}(`{1,2}|~{1,2})$/.test(lastLine)) {
|
|
994
1026
|
return Math.min(cut, lastLineStart);
|
|
995
1027
|
}
|
|
996
|
-
|
|
997
|
-
|
|
998
|
-
|
|
999
|
-
|
|
1000
|
-
|
|
1001
|
-
|
|
1002
|
-
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1028
|
+
const lt = partialTagAt(lastLine, names, markdown);
|
|
1029
|
+
if (lt >= 0) cut = Math.min(cut, lastLineStart + lt);
|
|
1030
|
+
return cut;
|
|
1031
|
+
}
|
|
1032
|
+
function streamingProgressive(src, tags, markdown) {
|
|
1033
|
+
const names = tags.map((t) => t.toLowerCase());
|
|
1034
|
+
const { tokens, openFenceStart, openFence } = scan(src, names, markdown);
|
|
1035
|
+
let cut = src.length;
|
|
1036
|
+
let fence = openFenceStart >= 0 ? openFence : null;
|
|
1037
|
+
const lastLineStart = src.lastIndexOf("\n", cut - 1) + 1;
|
|
1038
|
+
const lastLine = src.slice(lastLineStart);
|
|
1039
|
+
if (fence) {
|
|
1040
|
+
if (openFenceStart === lastLineStart) {
|
|
1041
|
+
cut = openFenceStart;
|
|
1042
|
+
fence = null;
|
|
1043
|
+
} else {
|
|
1044
|
+
const m = /^ {0,3}(`+|~+)$/.exec(lastLine);
|
|
1045
|
+
if (m && m[1][0] === fence.char && m[1].length < fence.len) cut = lastLineStart;
|
|
1010
1046
|
}
|
|
1047
|
+
} else if (markdown && /^ {0,3}(`{1,2}|~{1,2})$/.test(lastLine)) {
|
|
1048
|
+
cut = lastLineStart;
|
|
1049
|
+
} else {
|
|
1050
|
+
const lt = partialTagAt(lastLine, names, markdown);
|
|
1051
|
+
if (lt >= 0) cut = lastLineStart + lt;
|
|
1011
1052
|
}
|
|
1012
|
-
|
|
1053
|
+
let out = src.slice(0, cut);
|
|
1054
|
+
if (fence) {
|
|
1055
|
+
out += (out.endsWith("\n") ? "" : "\n") + fence.char.repeat(fence.len) + "\n";
|
|
1056
|
+
}
|
|
1057
|
+
const stack = openTagsBefore(tokens, fence ? openFenceStart : cut);
|
|
1058
|
+
for (let k = stack.length - 1; k >= 0; k--) out += `</${stack[k].name}>`;
|
|
1059
|
+
return { source: out, openFence: fence !== null };
|
|
1013
1060
|
}
|
|
1014
1061
|
var FEEDBACK_MS = 2e3;
|
|
1015
1062
|
var WRITE_TIMEOUT_MS = 5e3;
|
|
@@ -1067,12 +1114,17 @@ function cellText(cell) {
|
|
|
1067
1114
|
for (const br of Array.from(clone.querySelectorAll("br"))) br.replaceWith(" ");
|
|
1068
1115
|
return (clone.textContent ?? "").replace(/[\t\r\n]+/g, " ").replace(/ {2,}/g, " ").trim();
|
|
1069
1116
|
}
|
|
1070
|
-
function HtmlChunk({
|
|
1117
|
+
function HtmlChunk({
|
|
1118
|
+
html,
|
|
1119
|
+
fromMarkdown,
|
|
1120
|
+
tail = false
|
|
1121
|
+
}) {
|
|
1071
1122
|
const ref = react.useRef(null);
|
|
1072
1123
|
const ctx = react.useContext(CopyContext);
|
|
1073
1124
|
const [targets, setTargets] = react.useState([]);
|
|
1074
1125
|
const code = ctx?.code ?? false;
|
|
1075
1126
|
const table = ctx?.table ?? false;
|
|
1127
|
+
const holdLastCode = tail && (ctx?.holdTailCode ?? false);
|
|
1076
1128
|
const inner = react.useMemo(() => ({ __html: html }), [html]);
|
|
1077
1129
|
react.useLayoutEffect(() => {
|
|
1078
1130
|
const root = ref.current;
|
|
@@ -1082,11 +1134,14 @@ function HtmlChunk({ html, fromMarkdown }) {
|
|
|
1082
1134
|
}
|
|
1083
1135
|
const found = [];
|
|
1084
1136
|
const selector = [code && "pre", table && "table"].filter(Boolean).join(",");
|
|
1137
|
+
const inProgress = holdLastCode ? Array.from(root.querySelectorAll("pre")).pop() : void 0;
|
|
1085
1138
|
for (const el of Array.from(root.querySelectorAll(selector))) {
|
|
1139
|
+
if (el === inProgress) continue;
|
|
1086
1140
|
const kind = el.tagName === "PRE" ? "code" : "table";
|
|
1087
1141
|
const wrapper = document.createElement("div");
|
|
1088
1142
|
wrapper.setAttribute("data-react-fancy-content-copy-block", kind);
|
|
1089
1143
|
wrapper.className = kind === "code" ? "group relative" : "group relative flex flex-col";
|
|
1144
|
+
wrapper.style.position = "relative";
|
|
1090
1145
|
const host = document.createElement("div");
|
|
1091
1146
|
host.setAttribute("data-react-fancy-content-copy-host", "");
|
|
1092
1147
|
host.className = kind === "code" ? "absolute right-2 top-2 z-10" : "flex justify-end";
|
|
@@ -1102,7 +1157,7 @@ function HtmlChunk({ html, fromMarkdown }) {
|
|
|
1102
1157
|
if (wrapper?.parentNode) wrapper.replaceWith(t.el);
|
|
1103
1158
|
}
|
|
1104
1159
|
};
|
|
1105
|
-
}, [html, code, table]);
|
|
1160
|
+
}, [html, code, table, holdLastCode]);
|
|
1106
1161
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
1107
1162
|
/* @__PURE__ */ jsxRuntime.jsx("div", { ref, dangerouslySetInnerHTML: inner }),
|
|
1108
1163
|
targets.map(
|
|
@@ -1172,7 +1227,11 @@ function useCopyPipeline({
|
|
|
1172
1227
|
);
|
|
1173
1228
|
}
|
|
1174
1229
|
var MAX_DEPTH = 8;
|
|
1175
|
-
function
|
|
1230
|
+
function lastIndexWith(items, renders) {
|
|
1231
|
+
for (let i = items.length - 1; i >= 0; i--) if (renders(items[i])) return i;
|
|
1232
|
+
return -1;
|
|
1233
|
+
}
|
|
1234
|
+
function ContentBody({ source, format, extensions, unsafe, depth = 0, tail = false }) {
|
|
1176
1235
|
const active = depth >= MAX_DEPTH ? [] : extensions;
|
|
1177
1236
|
const blocks = react.useMemo(() => {
|
|
1178
1237
|
if (format !== "markdown") return null;
|
|
@@ -1181,8 +1240,19 @@ function ContentBody({ source, format, extensions, unsafe, depth = 0 }) {
|
|
|
1181
1240
|
}, [source, format, active]);
|
|
1182
1241
|
if (!blocks) {
|
|
1183
1242
|
const html = unsafe ? source : chunk3U7PUZLI_cjs.sanitizeHtml(source);
|
|
1184
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1243
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1244
|
+
RenderedContent,
|
|
1245
|
+
{
|
|
1246
|
+
html,
|
|
1247
|
+
extensions: active,
|
|
1248
|
+
unsafe,
|
|
1249
|
+
fromMarkdown: false,
|
|
1250
|
+
depth,
|
|
1251
|
+
tail
|
|
1252
|
+
}
|
|
1253
|
+
);
|
|
1185
1254
|
}
|
|
1255
|
+
const last = tail ? lastIndexWith(blocks, (b) => b.type === "tag" || b.source.trim() !== "") : -1;
|
|
1186
1256
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: blocks.map((block, i) => {
|
|
1187
1257
|
if (block.type === "markdown") {
|
|
1188
1258
|
const raw = markdownToRawHtml(block.source);
|
|
@@ -1194,7 +1264,8 @@ function ContentBody({ source, format, extensions, unsafe, depth = 0 }) {
|
|
|
1194
1264
|
extensions: active,
|
|
1195
1265
|
unsafe,
|
|
1196
1266
|
fromMarkdown: true,
|
|
1197
|
-
depth
|
|
1267
|
+
depth,
|
|
1268
|
+
tail: i === last
|
|
1198
1269
|
},
|
|
1199
1270
|
i
|
|
1200
1271
|
);
|
|
@@ -1210,21 +1281,38 @@ function ContentBody({ source, format, extensions, unsafe, depth = 0 }) {
|
|
|
1210
1281
|
format: "markdown",
|
|
1211
1282
|
extensions: active,
|
|
1212
1283
|
unsafe,
|
|
1213
|
-
depth: depth + 1
|
|
1284
|
+
depth: depth + 1,
|
|
1285
|
+
tail: i === last
|
|
1214
1286
|
}
|
|
1215
1287
|
) }) }, i);
|
|
1216
1288
|
}) });
|
|
1217
1289
|
}
|
|
1218
|
-
function RenderedContent({
|
|
1290
|
+
function RenderedContent({
|
|
1291
|
+
html,
|
|
1292
|
+
extensions,
|
|
1293
|
+
unsafe,
|
|
1294
|
+
fromMarkdown,
|
|
1295
|
+
depth,
|
|
1296
|
+
tail = false
|
|
1297
|
+
}) {
|
|
1219
1298
|
const segments = react.useMemo(() => parseSegments(html, extensions), [html, extensions]);
|
|
1220
1299
|
const renderHtml = (content) => unsafe ? content : chunk3U7PUZLI_cjs.sanitizeHtml(content);
|
|
1221
1300
|
if (segments.length === 0) return null;
|
|
1222
1301
|
if (segments.length === 1 && segments[0].type === "html") {
|
|
1223
|
-
return /* @__PURE__ */ jsxRuntime.jsx(HtmlChunk, { html: renderHtml(segments[0].content), fromMarkdown });
|
|
1302
|
+
return /* @__PURE__ */ jsxRuntime.jsx(HtmlChunk, { html: renderHtml(segments[0].content), fromMarkdown, tail });
|
|
1224
1303
|
}
|
|
1304
|
+
const last = tail ? lastIndexWith(segments, (s) => s.type === "extension" || s.content.trim() !== "") : -1;
|
|
1225
1305
|
return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: segments.map((segment, i) => {
|
|
1226
1306
|
if (segment.type === "html") {
|
|
1227
|
-
return segment.content ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1307
|
+
return segment.content ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1308
|
+
HtmlChunk,
|
|
1309
|
+
{
|
|
1310
|
+
html: renderHtml(segment.content),
|
|
1311
|
+
fromMarkdown,
|
|
1312
|
+
tail: i === last
|
|
1313
|
+
},
|
|
1314
|
+
i
|
|
1315
|
+
) : null;
|
|
1228
1316
|
}
|
|
1229
1317
|
const ext = extensions.find((e) => e.tag.toLowerCase() === segment.tag);
|
|
1230
1318
|
if (!ext) return null;
|
|
@@ -1237,7 +1325,8 @@ function RenderedContent({ html, extensions, unsafe, fromMarkdown, depth }) {
|
|
|
1237
1325
|
format: "html",
|
|
1238
1326
|
extensions,
|
|
1239
1327
|
unsafe,
|
|
1240
|
-
depth: depth + 1
|
|
1328
|
+
depth: depth + 1,
|
|
1329
|
+
tail: i === last
|
|
1241
1330
|
}
|
|
1242
1331
|
) : void 0;
|
|
1243
1332
|
return /* @__PURE__ */ jsxRuntime.jsx(Wrapper, { "data-render-extension": segment.tag, children: /* @__PURE__ */ jsxRuntime.jsx(Component, { content: segment.content, attributes: segment.attributes, children }) }, i);
|
|
@@ -1263,15 +1352,14 @@ function ContentRenderer({
|
|
|
1263
1352
|
);
|
|
1264
1353
|
const safe = value ?? "";
|
|
1265
1354
|
const resolvedFormat = format === "auto" ? detectFormat(safe) : format;
|
|
1266
|
-
const
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
);
|
|
1273
|
-
|
|
1274
|
-
}, [safe, streaming, extensions, resolvedFormat]);
|
|
1355
|
+
const progressive = streaming === "progressive";
|
|
1356
|
+
const { source, openFence } = react.useMemo(() => {
|
|
1357
|
+
if (!streaming) return { source: safe, openFence: false };
|
|
1358
|
+
const tags = extensions.map((e) => e.tag);
|
|
1359
|
+
const markdown = resolvedFormat === "markdown";
|
|
1360
|
+
if (progressive) return streamingProgressive(safe, tags, markdown);
|
|
1361
|
+
return { source: safe.slice(0, streamingCut(safe, tags, markdown)), openFence: false };
|
|
1362
|
+
}, [safe, streaming, progressive, extensions, resolvedFormat]);
|
|
1275
1363
|
const codeOn = copyButtons === true || typeof copyButtons === "object" && copyButtons.code !== false;
|
|
1276
1364
|
const tableOn = copyButtons === true || typeof copyButtons === "object" && copyButtons.table !== false;
|
|
1277
1365
|
const copyOn = codeOn || tableOn;
|
|
@@ -1283,16 +1371,18 @@ function ContentRenderer({
|
|
|
1283
1371
|
}, []);
|
|
1284
1372
|
const copy = useCopyPipeline({ writer: clipboardWriter, onCopy, rootRef, announce });
|
|
1285
1373
|
const copyContext = react.useMemo(
|
|
1286
|
-
() => ({ code: codeOn, table: tableOn, copy }),
|
|
1287
|
-
[codeOn, tableOn, copy]
|
|
1374
|
+
() => ({ code: codeOn, table: tableOn, copy, holdTailCode: openFence }),
|
|
1375
|
+
[codeOn, tableOn, copy, openFence]
|
|
1288
1376
|
);
|
|
1377
|
+
const contain = copyOn && chunkZU5Q77OT_cjs.cn("relative", className).split(" ").includes("relative");
|
|
1289
1378
|
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1290
1379
|
"div",
|
|
1291
1380
|
{
|
|
1292
1381
|
ref: rootRef,
|
|
1293
1382
|
"data-react-fancy-content-renderer": "",
|
|
1294
1383
|
"data-streaming": streaming ? "true" : void 0,
|
|
1295
|
-
|
|
1384
|
+
"data-streaming-mode": progressive ? "progressive" : void 0,
|
|
1385
|
+
style: contain ? { lineHeight: lineSpacing, position: "relative" } : { lineHeight: lineSpacing },
|
|
1296
1386
|
className: chunkZU5Q77OT_cjs.cn("text-sm", proseClasses, className),
|
|
1297
1387
|
children: [
|
|
1298
1388
|
/* @__PURE__ */ jsxRuntime.jsx(CopyContext.Provider, { value: copyContext, children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1301,7 +1391,8 @@ function ContentRenderer({
|
|
|
1301
1391
|
source,
|
|
1302
1392
|
format: resolvedFormat,
|
|
1303
1393
|
extensions,
|
|
1304
|
-
unsafe
|
|
1394
|
+
unsafe,
|
|
1395
|
+
tail: true
|
|
1305
1396
|
}
|
|
1306
1397
|
) }),
|
|
1307
1398
|
copyOn && /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1312,6 +1403,7 @@ function ContentRenderer({
|
|
|
1312
1403
|
"aria-atomic": "true",
|
|
1313
1404
|
"data-react-fancy-content-renderer-live": "",
|
|
1314
1405
|
className: "sr-only",
|
|
1406
|
+
style: visuallyHidden,
|
|
1315
1407
|
children: announcement
|
|
1316
1408
|
}
|
|
1317
1409
|
)
|
|
@@ -1331,5 +1423,5 @@ exports.proseClasses = proseClasses;
|
|
|
1331
1423
|
exports.registerExtension = registerExtension;
|
|
1332
1424
|
exports.registerExtensions = registerExtensions;
|
|
1333
1425
|
exports.renderMarkdown = renderMarkdown;
|
|
1334
|
-
//# sourceMappingURL=chunk-
|
|
1335
|
-
//# sourceMappingURL=chunk-
|
|
1426
|
+
//# sourceMappingURL=chunk-KGJ2ORY6.cjs.map
|
|
1427
|
+
//# sourceMappingURL=chunk-KGJ2ORY6.cjs.map
|