smart-components
Components

SmartParaphraseArea

Multi-line textarea variant of SmartParaphraseBox.

Textarea variant of SmartParaphraseBox. Built-in sparkle button rewrites in place; autoResize grows to fit; streaming supported.

Preview

import { useState } from 'react';import { SmartProvider, SmartParaphraseArea } from '@extedcoud/smart-components';import { createMockClient } from '@extedcoud/smart-components/adapters/mock';const client = createMockClient({complete: async (req) => 'Thank you for getting back to me. I will look into this and respond tomorrow.',});export function Example() {const [value, setValue] = useState(  'thx for getting back to me, lemme check on this and circle back tmrw',);return (  <SmartProvider client={client}>    <SmartParaphraseArea      value={value}      onChange={setValue}      autoResize      rows={3}      instruction="Rewrite in a polished, professional tone."    />  </SmartProvider>);}

Styled example

A composer-card chrome with a floating circular sparkle button and a footer status row.

Polish your reply✦ AI polish
14 wordsAuto-accepts when the rewrite is ready.
'use client';import { useState } from 'react';import { SmartProvider, SmartParaphraseArea } from '@extedcoud/smart-components';import { makeRewriteMock } from '@/lib/mock-client';const client = makeRewriteMock();export default function SmartParaphraseAreaStylized() {  const [value, setValue] = useState(    'thx for getting back to me, lemme check on this and circle back tmrw',  );  return (    <SmartProvider client={client}>      <div className="w-full max-w-xl">        <div className="overflow-hidden rounded-2xl border border-fd-border bg-fd-card shadow-sm">          <div className="flex items-center justify-between border-b border-fd-border bg-fd-secondary/40 px-4 py-2 text-xs text-fd-muted-foreground">            <span className="font-medium">Polish your reply</span>            <span className="rounded-full bg-violet-500/10 px-2 py-0.5 text-[10px] font-medium uppercase tracking-wider text-violet-600 dark:text-violet-300">              ✦ AI polish            </span>          </div>          <SmartParaphraseArea            value={value}            onChange={setValue}            autoResize            rows={3}            instruction="Rewrite this text in a polished, professional tone. Keep the same meaning."            wrapperClassName="relative block"            className="w-full resize-none bg-transparent px-4 py-3 pr-14 text-base text-fd-foreground outline-none"            style={{ fontSize: 16 }}            buttonClassName="absolute bottom-3 right-3 inline-flex h-11 min-h-[44px] w-11 items-center justify-center rounded-full bg-gradient-to-br from-fuchsia-500 to-violet-500 text-white shadow-lg shadow-violet-500/30 transition hover:scale-105 disabled:opacity-50"            buttonAriaLabel="Polish to professional tone"          />          <div className="flex items-center justify-between border-t border-fd-border bg-fd-secondary/30 px-4 py-2 text-[11px] text-fd-muted-foreground">            <span>{value.split(/\s+/).filter(Boolean).length} words</span>            <span>Auto-accepts when the rewrite is ready.</span>          </div>        </div>      </div>    </SmartProvider>  );}

Props

PropTypeDefaultDescription
value*stringControlled textarea value.
onChange*(value: string) => voidCalled on user input and when a rewrite is accepted.
contextstringOptional context string included in the prompt.
instructionstringDefault rewrite instruction.
streambooleanfalseUse the streaming capability for faster first paint.
maxTokensnumber512Max tokens for the rewrite call.
temperaturenumber0.4Sampling temperature.
disableAIbooleanfalseHide the button and no-op imperative rewrite().
autoResizebooleanfalseAuto-grow the textarea to fit content.
iconReactNodeCustom icon for the button. Defaults to a built-in sparkle SVG.
buttonAriaLabelstring'Paraphrase'Accessible label for the button.
buttonClassNamestringClass name applied to the button.
buttonStyleCSSPropertiesInline style applied to the button.
renderButton(args: ParaphraseButtonRenderArgs) => ReactNodeFull custom render for the button.
wrapperClassNamestringClass name applied to the outer wrapper.
onRewriteStart() => voidCalled when a rewrite starts.
onRewriteAccept(rewrite: string) => voidCalled when a rewrite is accepted.
onRewriteError(error: Error) => voidCalled when a rewrite errors.
...restTextareaHTMLAttributes<HTMLTextAreaElement>All native textarea props minus value, onChange, defaultValue.