Files
twenty/packages/twenty-website/src/ui/TextareaField.tsx
T
Rashad Karanouh ccbd3b6c46 Client brief wizard — /partners/brief (#22291)
## Brief — website (Release ① of the brief + glowup rollout)

Public client-brief wizard at `/partners/brief`, plus the marketplace
entry points (match-me card, brief prompt/link, brief CTAs across
partner surfaces).

**Backend already shipped:** the `submit-client-brief` logic function
merged in #22290 (v1.2.0) and is live in prod, so this PR is
**website-only** and needs no app deploy.

Rebased onto current `main` (was ~341 commits behind); lint + format
pass locally, typecheck/tests via CI.

### Release sequence (do not break)
1. **① Brief website — THIS PR.** Independent; backend already live in
prod. → merge → website deploy.
2. **② Glowup app → prod** (#22470). Rebase onto `main` (SDK 2.21),
apply deterministic-id handling, bump 1.2.10 → 1.3.0, `deploy` +
`install` on `partner-twenty-com`, set new app variables, refresh
partners-doc. **This is the gate for ③.**
3. **③ Glowup website** (#22471) — only **after ② is LIVE on prod** (it
reads the new partner links / services / case-study objects). → merge →
website deploy.
4. Reconcile #22637 (partners-traffic-web) with ③ — both touch
`partners-marketplace/*`.

Draft — do not merge until vetted.
2026-07-17 17:13:16 +00:00

43 lines
956 B
TypeScript

'use client';
import { styled } from '@linaria/react';
import { fieldControlClassName } from './field-control-style';
// A multi-line text control sharing the typed-control look, but growing from a
// min-height rather than the fixed single-line control height.
const Textarea = styled.textarea`
height: auto;
min-height: clamp(80px, 18vh, 185px);
resize: vertical;
`;
export function TextareaField({
ariaLabel,
invalid = false,
name,
onValueChange,
placeholder,
value,
}: {
ariaLabel: string;
invalid?: boolean;
name: string;
onValueChange: (value: string) => void;
placeholder?: string;
value: string;
}) {
return (
<Textarea
aria-invalid={invalid ? true : undefined}
aria-label={ariaLabel}
autoComplete="off"
className={fieldControlClassName}
name={name}
onChange={(event) => onValueChange(event.target.value)}
placeholder={placeholder}
value={value}
/>
);
}