ccbd3b6c46
## 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.
43 lines
956 B
TypeScript
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}
|
|
/>
|
|
);
|
|
}
|