mirror of
https://github.com/OpenHands/OpenHands.git
synced 2026-03-22 13:47:19 +08:00
feat: redesign information request form with two-column layout
- Add wave.svg icon for form header - Redesign form with side-by-side layout: form fields left, info card right - Show different content based on request type (SaaS vs Self-hosted) - Different titles, subtitles, and message placeholders per type - Use Card component for info card section - Submit navigates to home page (/) - Back returns to card selection view - Update i18n translations for all form labels and placeholders Co-authored-by: openhands <openhands@all-hands.dev>
This commit is contained in:
@@ -1,10 +1,87 @@
|
||||
import { useState } from "react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { useNavigate } from "react-router";
|
||||
import { I18nKey } from "#/i18n/declaration";
|
||||
import { BrandButton } from "#/components/features/settings/brand-button";
|
||||
import { Card } from "#/ui/card";
|
||||
import { Text } from "#/ui/typography";
|
||||
import CloudIcon from "#/icons/cloud.svg?react";
|
||||
import StackedIcon from "#/icons/stacked.svg?react";
|
||||
import WaveIcon from "#/icons/wave.svg?react";
|
||||
|
||||
export type RequestType = "saas" | "self-hosted";
|
||||
|
||||
interface FormInputProps {
|
||||
id: string;
|
||||
label: string;
|
||||
value: string;
|
||||
placeholder: string;
|
||||
type?: "text" | "email";
|
||||
onChange: (value: string) => void;
|
||||
}
|
||||
|
||||
function FormInput({
|
||||
id,
|
||||
label,
|
||||
value,
|
||||
placeholder,
|
||||
type = "text",
|
||||
onChange,
|
||||
}: FormInputProps) {
|
||||
return (
|
||||
<div className="flex flex-col gap-1.5 w-full">
|
||||
<label
|
||||
htmlFor={id}
|
||||
className="text-sm font-medium text-white cursor-pointer"
|
||||
>
|
||||
{label}
|
||||
</label>
|
||||
<input
|
||||
id={id}
|
||||
type={type}
|
||||
value={value}
|
||||
onChange={(e) => onChange(e.target.value)}
|
||||
placeholder={placeholder}
|
||||
className="w-full rounded-md border border-[#3a3a3a] bg-transparent px-4 py-2.5 text-sm text-white placeholder:text-neutral-500 focus:border-white focus:outline-none transition-colors"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
interface FormTextareaProps {
|
||||
id: string;
|
||||
label: string;
|
||||
value: string;
|
||||
placeholder: string;
|
||||
onChange: (value: string) => void;
|
||||
}
|
||||
|
||||
function FormTextarea({
|
||||
id,
|
||||
label,
|
||||
value,
|
||||
placeholder,
|
||||
onChange,
|
||||
}: FormTextareaProps) {
|
||||
return (
|
||||
<div className="flex flex-col gap-1.5 w-full">
|
||||
<label
|
||||
htmlFor={id}
|
||||
className="text-sm font-medium text-white cursor-pointer"
|
||||
>
|
||||
{label}
|
||||
</label>
|
||||
<textarea
|
||||
id={id}
|
||||
value={value}
|
||||
onChange={(e) => onChange(e.target.value)}
|
||||
placeholder={placeholder}
|
||||
rows={4}
|
||||
className="w-full rounded-md border border-[#3a3a3a] bg-transparent px-4 py-2.5 text-sm text-white placeholder:text-neutral-500 focus:border-white focus:outline-none transition-colors resize-none"
|
||||
/>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
interface InformationRequestFormProps {
|
||||
requestType: RequestType;
|
||||
onBack: () => void;
|
||||
@@ -15,125 +92,136 @@ export function InformationRequestForm({
|
||||
onBack,
|
||||
}: InformationRequestFormProps) {
|
||||
const { t } = useTranslation();
|
||||
const navigate = useNavigate();
|
||||
const [formData, setFormData] = useState({
|
||||
name: "",
|
||||
email: "",
|
||||
company: "",
|
||||
email: "",
|
||||
message: "",
|
||||
});
|
||||
|
||||
const handleInputChange = (
|
||||
e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>,
|
||||
) => {
|
||||
const { name, value } = e.target;
|
||||
setFormData((prev) => ({ ...prev, [name]: value }));
|
||||
};
|
||||
|
||||
const handleSubmit = (e: React.FormEvent) => {
|
||||
e.preventDefault();
|
||||
// TODO: Implement form submission
|
||||
console.log("Form submitted:", { requestType, ...formData });
|
||||
navigate("/");
|
||||
};
|
||||
|
||||
const title =
|
||||
requestType === "saas"
|
||||
? t(I18nKey.ENTERPRISE$SAAS_TITLE)
|
||||
: t(I18nKey.ENTERPRISE$SELF_HOSTED_TITLE);
|
||||
const isSaas = requestType === "saas";
|
||||
|
||||
const title = isSaas
|
||||
? t(I18nKey.ENTERPRISE$FORM_SAAS_TITLE)
|
||||
: t(I18nKey.ENTERPRISE$FORM_SELF_HOSTED_TITLE);
|
||||
|
||||
const subtitle = isSaas
|
||||
? t(I18nKey.ENTERPRISE$FORM_SAAS_SUBTITLE)
|
||||
: t(I18nKey.ENTERPRISE$FORM_SELF_HOSTED_SUBTITLE);
|
||||
|
||||
const cardTitle = isSaas
|
||||
? t(I18nKey.ENTERPRISE$SAAS_TITLE)
|
||||
: t(I18nKey.ENTERPRISE$SELF_HOSTED_TITLE);
|
||||
|
||||
const cardDescription = isSaas
|
||||
? t(I18nKey.ENTERPRISE$SAAS_DESCRIPTION)
|
||||
: t(I18nKey.ENTERPRISE$SELF_HOSTED_DESCRIPTION);
|
||||
|
||||
const messagePlaceholder = isSaas
|
||||
? t(I18nKey.ENTERPRISE$FORM_MESSAGE_SAAS_PLACEHOLDER)
|
||||
: t(I18nKey.ENTERPRISE$FORM_MESSAGE_SELF_HOSTED_PLACEHOLDER);
|
||||
|
||||
return (
|
||||
<div
|
||||
data-testid="information-request-form"
|
||||
className="w-full max-w-md flex flex-col gap-6"
|
||||
className="w-full max-w-4xl flex flex-col items-center gap-8"
|
||||
>
|
||||
<div className="text-center">
|
||||
<h2 className="text-xl font-semibold text-white">{title}</h2>
|
||||
<p className="text-[#8C8C8C] mt-2">
|
||||
{t(I18nKey.ENTERPRISE$FORM_SUBTITLE)}
|
||||
</p>
|
||||
{/* Header */}
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<WaveIcon className="w-12 h-12" />
|
||||
<div className="text-center flex flex-col gap-2">
|
||||
<h1 className="text-2xl font-bold text-white">{title}</h1>
|
||||
<Text className="text-[#8C8C8C]">{subtitle}</Text>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form onSubmit={handleSubmit} className="flex flex-col gap-4">
|
||||
<div className="flex flex-col gap-2">
|
||||
<label htmlFor="name" className="text-sm text-white">
|
||||
{t(I18nKey.ENTERPRISE$FORM_NAME_LABEL)}
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
{/* Content: Form + Card */}
|
||||
<div className="w-full flex flex-col md:flex-row gap-6">
|
||||
{/* Form */}
|
||||
<form
|
||||
onSubmit={handleSubmit}
|
||||
className="flex-1 flex flex-col gap-4 max-w-lg"
|
||||
>
|
||||
<FormInput
|
||||
id="name"
|
||||
name="name"
|
||||
label={t(I18nKey.ENTERPRISE$FORM_NAME_LABEL)}
|
||||
value={formData.name}
|
||||
onChange={handleInputChange}
|
||||
required
|
||||
className="px-4 py-2.5 bg-[#0D0D0D] border border-[#242424] rounded-sm text-white placeholder-[#8C8C8C] focus:outline-none focus:border-[#404040]"
|
||||
placeholder={t(I18nKey.ENTERPRISE$FORM_NAME_PLACEHOLDER)}
|
||||
onChange={(value) =>
|
||||
setFormData((prev) => ({ ...prev, name: value }))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-2">
|
||||
<label htmlFor="email" className="text-sm text-white">
|
||||
{t(I18nKey.ENTERPRISE$FORM_EMAIL_LABEL)}
|
||||
</label>
|
||||
<input
|
||||
type="email"
|
||||
id="email"
|
||||
name="email"
|
||||
value={formData.email}
|
||||
onChange={handleInputChange}
|
||||
required
|
||||
className="px-4 py-2.5 bg-[#0D0D0D] border border-[#242424] rounded-sm text-white placeholder-[#8C8C8C] focus:outline-none focus:border-[#404040]"
|
||||
placeholder={t(I18nKey.ENTERPRISE$FORM_EMAIL_PLACEHOLDER)}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-2">
|
||||
<label htmlFor="company" className="text-sm text-white">
|
||||
{t(I18nKey.ENTERPRISE$FORM_COMPANY_LABEL)}
|
||||
</label>
|
||||
<input
|
||||
type="text"
|
||||
<FormInput
|
||||
id="company"
|
||||
name="company"
|
||||
label={t(I18nKey.ENTERPRISE$FORM_COMPANY_LABEL)}
|
||||
value={formData.company}
|
||||
onChange={handleInputChange}
|
||||
required
|
||||
className="px-4 py-2.5 bg-[#0D0D0D] border border-[#242424] rounded-sm text-white placeholder-[#8C8C8C] focus:outline-none focus:border-[#404040]"
|
||||
placeholder={t(I18nKey.ENTERPRISE$FORM_COMPANY_PLACEHOLDER)}
|
||||
onChange={(value) =>
|
||||
setFormData((prev) => ({ ...prev, company: value }))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-2">
|
||||
<label htmlFor="message" className="text-sm text-white">
|
||||
{t(I18nKey.ENTERPRISE$FORM_MESSAGE_LABEL)}
|
||||
</label>
|
||||
<textarea
|
||||
<FormInput
|
||||
id="email"
|
||||
label={t(I18nKey.ENTERPRISE$FORM_EMAIL_LABEL)}
|
||||
type="email"
|
||||
value={formData.email}
|
||||
placeholder={t(I18nKey.ENTERPRISE$FORM_EMAIL_PLACEHOLDER)}
|
||||
onChange={(value) =>
|
||||
setFormData((prev) => ({ ...prev, email: value }))
|
||||
}
|
||||
/>
|
||||
|
||||
<FormTextarea
|
||||
id="message"
|
||||
name="message"
|
||||
label={t(I18nKey.ENTERPRISE$FORM_MESSAGE_LABEL)}
|
||||
value={formData.message}
|
||||
onChange={handleInputChange}
|
||||
rows={4}
|
||||
className="px-4 py-2.5 bg-[#0D0D0D] border border-[#242424] rounded-sm text-white placeholder-[#8C8C8C] focus:outline-none focus:border-[#404040] resize-none"
|
||||
placeholder={t(I18nKey.ENTERPRISE$FORM_MESSAGE_PLACEHOLDER)}
|
||||
placeholder={messagePlaceholder}
|
||||
onChange={(value) =>
|
||||
setFormData((prev) => ({ ...prev, message: value }))
|
||||
}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div className="flex flex-col gap-3 mt-4">
|
||||
<BrandButton
|
||||
type="submit"
|
||||
variant="primary"
|
||||
className="w-full px-6 py-2.5"
|
||||
>
|
||||
{t(I18nKey.ENTERPRISE$FORM_SUBMIT)}
|
||||
</BrandButton>
|
||||
<BrandButton
|
||||
type="button"
|
||||
variant="secondary"
|
||||
onClick={onBack}
|
||||
className="w-full px-6 py-2.5 bg-[#050505] text-white border border-[#242424] hover:bg-white hover:text-black"
|
||||
>
|
||||
{t(I18nKey.COMMON$BACK)}
|
||||
</BrandButton>
|
||||
</div>
|
||||
</form>
|
||||
{/* Buttons */}
|
||||
<div className="flex gap-4 mt-4">
|
||||
<button
|
||||
type="button"
|
||||
onClick={onBack}
|
||||
className="flex-1 px-6 py-2.5 text-sm rounded-sm bg-transparent text-white border border-[#3a3a3a] hover:bg-[#1a1a1a] transition-colors"
|
||||
>
|
||||
{t(I18nKey.COMMON$BACK)}
|
||||
</button>
|
||||
<button
|
||||
type="submit"
|
||||
className="flex-1 px-6 py-2.5 text-sm rounded-sm bg-white text-black border border-white hover:bg-gray-100 transition-colors"
|
||||
>
|
||||
{t(I18nKey.ENTERPRISE$FORM_SUBMIT)}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
{/* Info Card */}
|
||||
<Card theme="dark" className="flex-1 flex-col p-6 gap-4 max-w-sm">
|
||||
<div className="w-10 h-10">
|
||||
{isSaas ? (
|
||||
<CloudIcon className="w-10 h-10" />
|
||||
) : (
|
||||
<StackedIcon className="w-10 h-10" />
|
||||
)}
|
||||
</div>
|
||||
<h3 className="text-lg font-semibold text-white">{cardTitle}</h3>
|
||||
<Text className="text-[#8C8C8C]">{cardDescription}</Text>
|
||||
</Card>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1204,7 +1204,10 @@ export enum I18nKey {
|
||||
ENTERPRISE$SELF_HOSTED_FEATURE_DATA_CONTROL = "ENTERPRISE$SELF_HOSTED_FEATURE_DATA_CONTROL",
|
||||
ENTERPRISE$SELF_HOSTED_FEATURE_COMPLIANCE = "ENTERPRISE$SELF_HOSTED_FEATURE_COMPLIANCE",
|
||||
ENTERPRISE$SELF_HOSTED_FEATURE_SUPPORT = "ENTERPRISE$SELF_HOSTED_FEATURE_SUPPORT",
|
||||
ENTERPRISE$FORM_SUBTITLE = "ENTERPRISE$FORM_SUBTITLE",
|
||||
ENTERPRISE$FORM_SAAS_TITLE = "ENTERPRISE$FORM_SAAS_TITLE",
|
||||
ENTERPRISE$FORM_SAAS_SUBTITLE = "ENTERPRISE$FORM_SAAS_SUBTITLE",
|
||||
ENTERPRISE$FORM_SELF_HOSTED_TITLE = "ENTERPRISE$FORM_SELF_HOSTED_TITLE",
|
||||
ENTERPRISE$FORM_SELF_HOSTED_SUBTITLE = "ENTERPRISE$FORM_SELF_HOSTED_SUBTITLE",
|
||||
ENTERPRISE$FORM_NAME_LABEL = "ENTERPRISE$FORM_NAME_LABEL",
|
||||
ENTERPRISE$FORM_NAME_PLACEHOLDER = "ENTERPRISE$FORM_NAME_PLACEHOLDER",
|
||||
ENTERPRISE$FORM_EMAIL_LABEL = "ENTERPRISE$FORM_EMAIL_LABEL",
|
||||
@@ -1212,7 +1215,8 @@ export enum I18nKey {
|
||||
ENTERPRISE$FORM_COMPANY_LABEL = "ENTERPRISE$FORM_COMPANY_LABEL",
|
||||
ENTERPRISE$FORM_COMPANY_PLACEHOLDER = "ENTERPRISE$FORM_COMPANY_PLACEHOLDER",
|
||||
ENTERPRISE$FORM_MESSAGE_LABEL = "ENTERPRISE$FORM_MESSAGE_LABEL",
|
||||
ENTERPRISE$FORM_MESSAGE_PLACEHOLDER = "ENTERPRISE$FORM_MESSAGE_PLACEHOLDER",
|
||||
ENTERPRISE$FORM_MESSAGE_SAAS_PLACEHOLDER = "ENTERPRISE$FORM_MESSAGE_SAAS_PLACEHOLDER",
|
||||
ENTERPRISE$FORM_MESSAGE_SELF_HOSTED_PLACEHOLDER = "ENTERPRISE$FORM_MESSAGE_SELF_HOSTED_PLACEHOLDER",
|
||||
ENTERPRISE$FORM_SUBMIT = "ENTERPRISE$FORM_SUBMIT",
|
||||
COMMON$BACK = "COMMON$BACK",
|
||||
}
|
||||
|
||||
@@ -20473,22 +20473,73 @@
|
||||
"tr": "Özel destek seçenekleri",
|
||||
"uk": "Виділені варіанти підтримки"
|
||||
},
|
||||
"ENTERPRISE$FORM_SUBTITLE": {
|
||||
"en": "Fill out the form below and we'll get back to you shortly.",
|
||||
"ja": "以下のフォームにご記入ください。すぐにご連絡いたします。",
|
||||
"zh-CN": "请填写以下表格,我们会尽快与您联系。",
|
||||
"zh-TW": "請填寫以下表格,我們會盡快與您聯繫。",
|
||||
"ko-KR": "아래 양식을 작성해 주시면 곧 연락드리겠습니다.",
|
||||
"no": "Fyll ut skjemaet nedenfor, så tar vi kontakt snart.",
|
||||
"ar": "املأ النموذج أدناه وسنتواصل معك قريبًا.",
|
||||
"de": "Füllen Sie das Formular aus und wir melden uns in Kürze.",
|
||||
"fr": "Remplissez le formulaire ci-dessous et nous vous recontacterons rapidement.",
|
||||
"it": "Compila il modulo qui sotto e ti ricontatteremo presto.",
|
||||
"pt": "Preencha o formulário abaixo e entraremos em contato em breve.",
|
||||
"es": "Complete el formulario a continuación y nos pondremos en contacto pronto.",
|
||||
"ca": "Ompliu el formulari a continuació i us contactarem aviat.",
|
||||
"tr": "Aşağıdaki formu doldurun, en kısa sürede size geri döneceğiz.",
|
||||
"uk": "Заповніть форму нижче, і ми зв'яжемося з вами найближчим часом."
|
||||
"ENTERPRISE$FORM_SAAS_TITLE": {
|
||||
"en": "Learn more about Enterprise SaaS",
|
||||
"ja": "Enterprise SaaSについて詳しく",
|
||||
"zh-CN": "了解更多企业SaaS",
|
||||
"zh-TW": "了解更多企業SaaS",
|
||||
"ko-KR": "Enterprise SaaS 자세히 알아보기",
|
||||
"no": "Lær mer om Enterprise SaaS",
|
||||
"ar": "تعرف على المزيد حول Enterprise SaaS",
|
||||
"de": "Erfahren Sie mehr über Enterprise SaaS",
|
||||
"fr": "En savoir plus sur Enterprise SaaS",
|
||||
"it": "Scopri di più su Enterprise SaaS",
|
||||
"pt": "Saiba mais sobre Enterprise SaaS",
|
||||
"es": "Conozca más sobre Enterprise SaaS",
|
||||
"ca": "Més informació sobre Enterprise SaaS",
|
||||
"tr": "Enterprise SaaS hakkında daha fazla bilgi edinin",
|
||||
"uk": "Дізнайтеся більше про Enterprise SaaS"
|
||||
},
|
||||
"ENTERPRISE$FORM_SAAS_SUBTITLE": {
|
||||
"en": "Tell us about your team and we'll help you get started.",
|
||||
"ja": "チームについて教えてください。開始をお手伝いします。",
|
||||
"zh-CN": "告诉我们您的团队情况,我们将帮助您开始使用。",
|
||||
"zh-TW": "告訴我們您的團隊情況,我們將幫助您開始使用。",
|
||||
"ko-KR": "팀에 대해 알려주시면 시작을 도와드리겠습니다.",
|
||||
"no": "Fortell oss om teamet ditt, så hjelper vi deg i gang.",
|
||||
"ar": "أخبرنا عن فريقك وسنساعدك على البدء.",
|
||||
"de": "Erzählen Sie uns von Ihrem Team und wir helfen Ihnen beim Einstieg.",
|
||||
"fr": "Parlez-nous de votre équipe et nous vous aiderons à démarrer.",
|
||||
"it": "Raccontaci del tuo team e ti aiuteremo a iniziare.",
|
||||
"pt": "Conte-nos sobre sua equipe e ajudaremos você a começar.",
|
||||
"es": "Cuéntenos sobre su equipo y le ayudaremos a comenzar.",
|
||||
"ca": "Expliqueu-nos sobre el vostre equip i us ajudarem a començar.",
|
||||
"tr": "Bize ekibinizden bahsedin, başlamanıza yardımcı olalım.",
|
||||
"uk": "Розкажіть нам про свою команду, і ми допоможемо вам почати."
|
||||
},
|
||||
"ENTERPRISE$FORM_SELF_HOSTED_TITLE": {
|
||||
"en": "Learn more about Self-hosted",
|
||||
"ja": "セルフホストについて詳しく",
|
||||
"zh-CN": "了解更多自托管",
|
||||
"zh-TW": "了解更多自託管",
|
||||
"ko-KR": "셀프 호스팅 자세히 알아보기",
|
||||
"no": "Lær mer om selvhostet",
|
||||
"ar": "تعرف على المزيد حول الاستضافة الذاتية",
|
||||
"de": "Erfahren Sie mehr über Self-hosted",
|
||||
"fr": "En savoir plus sur l'auto-hébergement",
|
||||
"it": "Scopri di più su Self-hosted",
|
||||
"pt": "Saiba mais sobre auto-hospedagem",
|
||||
"es": "Conozca más sobre auto-alojamiento",
|
||||
"ca": "Més informació sobre auto-allotjament",
|
||||
"tr": "Self-hosted hakkında daha fazla bilgi edinin",
|
||||
"uk": "Дізнайтеся більше про самостійний хостинг"
|
||||
},
|
||||
"ENTERPRISE$FORM_SELF_HOSTED_SUBTITLE": {
|
||||
"en": "Tell us about your needs and we'll be in touch.",
|
||||
"ja": "ご要望をお聞かせください。ご連絡いたします。",
|
||||
"zh-CN": "告诉我们您的需求,我们会与您联系。",
|
||||
"zh-TW": "告訴我們您的需求,我們會與您聯繫。",
|
||||
"ko-KR": "귀하의 요구 사항을 알려주시면 연락드리겠습니다.",
|
||||
"no": "Fortell oss om dine behov, så tar vi kontakt.",
|
||||
"ar": "أخبرنا عن احتياجاتك وسنتواصل معك.",
|
||||
"de": "Erzählen Sie uns von Ihren Anforderungen und wir melden uns.",
|
||||
"fr": "Parlez-nous de vos besoins et nous vous contacterons.",
|
||||
"it": "Raccontaci le tue esigenze e ti contatteremo.",
|
||||
"pt": "Conte-nos sobre suas necessidades e entraremos em contato.",
|
||||
"es": "Cuéntenos sobre sus necesidades y nos pondremos en contacto.",
|
||||
"ca": "Expliqueu-nos les vostres necessitats i us contactarem.",
|
||||
"tr": "Bize ihtiyaçlarınızı anlatın, sizinle iletişime geçeceğiz.",
|
||||
"uk": "Розкажіть нам про ваші потреби, і ми зв'яжемося з вами."
|
||||
},
|
||||
"ENTERPRISE$FORM_NAME_LABEL": {
|
||||
"en": "Name",
|
||||
@@ -20508,123 +20559,140 @@
|
||||
"uk": "Ім'я"
|
||||
},
|
||||
"ENTERPRISE$FORM_NAME_PLACEHOLDER": {
|
||||
"en": "Enter your name",
|
||||
"ja": "名前を入力してください",
|
||||
"zh-CN": "请输入您的姓名",
|
||||
"zh-TW": "請輸入您的姓名",
|
||||
"ko-KR": "이름을 입력하세요",
|
||||
"no": "Skriv inn navnet ditt",
|
||||
"ar": "أدخل اسمك",
|
||||
"de": "Geben Sie Ihren Namen ein",
|
||||
"fr": "Entrez votre nom",
|
||||
"it": "Inserisci il tuo nome",
|
||||
"pt": "Digite seu nome",
|
||||
"es": "Ingrese su nombre",
|
||||
"ca": "Introduïu el vostre nom",
|
||||
"tr": "Adınızı girin",
|
||||
"uk": "Введіть своє ім'я"
|
||||
"en": "Your name",
|
||||
"ja": "あなたの名前",
|
||||
"zh-CN": "您的姓名",
|
||||
"zh-TW": "您的姓名",
|
||||
"ko-KR": "이름",
|
||||
"no": "Ditt navn",
|
||||
"ar": "اسمك",
|
||||
"de": "Ihr Name",
|
||||
"fr": "Votre nom",
|
||||
"it": "Il tuo nome",
|
||||
"pt": "Seu nome",
|
||||
"es": "Su nombre",
|
||||
"ca": "El vostre nom",
|
||||
"tr": "Adınız",
|
||||
"uk": "Ваше ім'я"
|
||||
},
|
||||
"ENTERPRISE$FORM_EMAIL_LABEL": {
|
||||
"en": "Work Email",
|
||||
"ja": "仕事用メールアドレス",
|
||||
"zh-CN": "工作邮箱",
|
||||
"zh-TW": "工作電子郵件",
|
||||
"ko-KR": "업무용 이메일",
|
||||
"no": "Jobb-e-post",
|
||||
"ar": "البريد الإلكتروني للعمل",
|
||||
"de": "Geschäftliche E-Mail",
|
||||
"fr": "E-mail professionnel",
|
||||
"it": "Email di lavoro",
|
||||
"pt": "E-mail corporativo",
|
||||
"es": "Correo electrónico de trabajo",
|
||||
"ca": "Correu electrònic de treball",
|
||||
"tr": "İş E-postası",
|
||||
"uk": "Робоча електронна пошта"
|
||||
"en": "Email address",
|
||||
"ja": "メールアドレス",
|
||||
"zh-CN": "电子邮件地址",
|
||||
"zh-TW": "電子郵件地址",
|
||||
"ko-KR": "이메일 주소",
|
||||
"no": "E-postadresse",
|
||||
"ar": "عنوان البريد الإلكتروني",
|
||||
"de": "E-Mail-Adresse",
|
||||
"fr": "Adresse e-mail",
|
||||
"it": "Indirizzo email",
|
||||
"pt": "Endereço de e-mail",
|
||||
"es": "Dirección de correo electrónico",
|
||||
"ca": "Adreça de correu electrònic",
|
||||
"tr": "E-posta adresi",
|
||||
"uk": "Електронна адреса"
|
||||
},
|
||||
"ENTERPRISE$FORM_EMAIL_PLACEHOLDER": {
|
||||
"en": "you@company.com",
|
||||
"ja": "you@company.com",
|
||||
"zh-CN": "you@company.com",
|
||||
"zh-TW": "you@company.com",
|
||||
"ko-KR": "you@company.com",
|
||||
"no": "you@company.com",
|
||||
"ar": "you@company.com",
|
||||
"de": "you@company.com",
|
||||
"fr": "vous@entreprise.com",
|
||||
"it": "tu@azienda.com",
|
||||
"pt": "voce@empresa.com",
|
||||
"es": "tu@empresa.com",
|
||||
"ca": "tu@empresa.com",
|
||||
"tr": "sen@sirket.com",
|
||||
"uk": "ви@компанія.com"
|
||||
"en": "name@company.com",
|
||||
"ja": "name@company.com",
|
||||
"zh-CN": "name@company.com",
|
||||
"zh-TW": "name@company.com",
|
||||
"ko-KR": "name@company.com",
|
||||
"no": "name@company.com",
|
||||
"ar": "name@company.com",
|
||||
"de": "name@company.com",
|
||||
"fr": "nom@entreprise.com",
|
||||
"it": "nome@azienda.com",
|
||||
"pt": "nome@empresa.com",
|
||||
"es": "nombre@empresa.com",
|
||||
"ca": "nom@empresa.com",
|
||||
"tr": "isim@sirket.com",
|
||||
"uk": "ім'я@компанія.com"
|
||||
},
|
||||
"ENTERPRISE$FORM_COMPANY_LABEL": {
|
||||
"en": "Company",
|
||||
"en": "Company name",
|
||||
"ja": "会社名",
|
||||
"zh-CN": "公司",
|
||||
"zh-TW": "公司",
|
||||
"ko-KR": "회사",
|
||||
"no": "Selskap",
|
||||
"ar": "الشركة",
|
||||
"de": "Unternehmen",
|
||||
"fr": "Entreprise",
|
||||
"it": "Azienda",
|
||||
"pt": "Empresa",
|
||||
"es": "Empresa",
|
||||
"ca": "Empresa",
|
||||
"tr": "Şirket",
|
||||
"uk": "Компанія"
|
||||
"zh-CN": "公司名称",
|
||||
"zh-TW": "公司名稱",
|
||||
"ko-KR": "회사명",
|
||||
"no": "Selskapsnavn",
|
||||
"ar": "اسم الشركة",
|
||||
"de": "Firmenname",
|
||||
"fr": "Nom de l'entreprise",
|
||||
"it": "Nome azienda",
|
||||
"pt": "Nome da empresa",
|
||||
"es": "Nombre de la empresa",
|
||||
"ca": "Nom de l'empresa",
|
||||
"tr": "Şirket adı",
|
||||
"uk": "Назва компанії"
|
||||
},
|
||||
"ENTERPRISE$FORM_COMPANY_PLACEHOLDER": {
|
||||
"en": "Enter your company name",
|
||||
"ja": "会社名を入力してください",
|
||||
"zh-CN": "请输入您的公司名称",
|
||||
"zh-TW": "請輸入您的公司名稱",
|
||||
"ko-KR": "회사명을 입력하세요",
|
||||
"no": "Skriv inn selskapets navn",
|
||||
"ar": "أدخل اسم شركتك",
|
||||
"de": "Geben Sie Ihren Firmennamen ein",
|
||||
"fr": "Entrez le nom de votre entreprise",
|
||||
"it": "Inserisci il nome della tua azienda",
|
||||
"pt": "Digite o nome da sua empresa",
|
||||
"es": "Ingrese el nombre de su empresa",
|
||||
"ca": "Introduïu el nom de la vostra empresa",
|
||||
"tr": "Şirket adınızı girin",
|
||||
"uk": "Введіть назву вашої компанії"
|
||||
"en": "Your company",
|
||||
"ja": "あなたの会社",
|
||||
"zh-CN": "您的公司",
|
||||
"zh-TW": "您的公司",
|
||||
"ko-KR": "회사명",
|
||||
"no": "Ditt selskap",
|
||||
"ar": "شركتك",
|
||||
"de": "Ihr Unternehmen",
|
||||
"fr": "Votre entreprise",
|
||||
"it": "La tua azienda",
|
||||
"pt": "Sua empresa",
|
||||
"es": "Su empresa",
|
||||
"ca": "La vostra empresa",
|
||||
"tr": "Şirketiniz",
|
||||
"uk": "Ваша компанія"
|
||||
},
|
||||
"ENTERPRISE$FORM_MESSAGE_LABEL": {
|
||||
"en": "Message (optional)",
|
||||
"ja": "メッセージ(任意)",
|
||||
"zh-CN": "留言(可选)",
|
||||
"zh-TW": "留言(可選)",
|
||||
"ko-KR": "메시지 (선택사항)",
|
||||
"no": "Melding (valgfritt)",
|
||||
"ar": "الرسالة (اختياري)",
|
||||
"de": "Nachricht (optional)",
|
||||
"fr": "Message (facultatif)",
|
||||
"it": "Messaggio (opzionale)",
|
||||
"pt": "Mensagem (opcional)",
|
||||
"es": "Mensaje (opcional)",
|
||||
"ca": "Missatge (opcional)",
|
||||
"tr": "Mesaj (isteğe bağlı)",
|
||||
"uk": "Повідомлення (необов'язково)"
|
||||
"en": "Custom message",
|
||||
"ja": "カスタムメッセージ",
|
||||
"zh-CN": "自定义消息",
|
||||
"zh-TW": "自訂訊息",
|
||||
"ko-KR": "맞춤 메시지",
|
||||
"no": "Tilpasset melding",
|
||||
"ar": "رسالة مخصصة",
|
||||
"de": "Benutzerdefinierte Nachricht",
|
||||
"fr": "Message personnalisé",
|
||||
"it": "Messaggio personalizzato",
|
||||
"pt": "Mensagem personalizada",
|
||||
"es": "Mensaje personalizado",
|
||||
"ca": "Missatge personalitzat",
|
||||
"tr": "Özel mesaj",
|
||||
"uk": "Користувацьке повідомлення"
|
||||
},
|
||||
"ENTERPRISE$FORM_MESSAGE_PLACEHOLDER": {
|
||||
"en": "Tell us about your needs...",
|
||||
"ja": "ご要望をお聞かせください...",
|
||||
"zh-CN": "告诉我们您的需求...",
|
||||
"zh-TW": "告訴我們您的需求...",
|
||||
"ko-KR": "귀하의 요구 사항을 알려주세요...",
|
||||
"no": "Fortell oss om dine behov...",
|
||||
"ar": "أخبرنا عن احتياجاتك...",
|
||||
"de": "Erzählen Sie uns von Ihren Anforderungen...",
|
||||
"fr": "Parlez-nous de vos besoins...",
|
||||
"it": "Raccontaci le tue esigenze...",
|
||||
"pt": "Conte-nos sobre suas necessidades...",
|
||||
"es": "Cuéntenos sobre sus necesidades...",
|
||||
"ca": "Expliqueu-nos les vostres necessitats...",
|
||||
"tr": "Bize ihtiyaçlarınızı anlatın...",
|
||||
"uk": "Розкажіть нам про ваші потреби..."
|
||||
"ENTERPRISE$FORM_MESSAGE_SAAS_PLACEHOLDER": {
|
||||
"en": "Tell us about your team and use case...",
|
||||
"ja": "チームと使用目的について教えてください...",
|
||||
"zh-CN": "告诉我们您的团队和用例...",
|
||||
"zh-TW": "告訴我們您的團隊和用例...",
|
||||
"ko-KR": "팀과 사용 사례에 대해 알려주세요...",
|
||||
"no": "Fortell oss om teamet ditt og brukstilfelle...",
|
||||
"ar": "أخبرنا عن فريقك وحالة الاستخدام...",
|
||||
"de": "Erzählen Sie uns von Ihrem Team und Anwendungsfall...",
|
||||
"fr": "Parlez-nous de votre équipe et cas d'utilisation...",
|
||||
"it": "Raccontaci del tuo team e caso d'uso...",
|
||||
"pt": "Conte-nos sobre sua equipe e caso de uso...",
|
||||
"es": "Cuéntenos sobre su equipo y caso de uso...",
|
||||
"ca": "Expliqueu-nos sobre el vostre equip i cas d'ús...",
|
||||
"tr": "Bize ekibiniz ve kullanım durumunuz hakkında bilgi verin...",
|
||||
"uk": "Розкажіть нам про свою команду та варіант використання..."
|
||||
},
|
||||
"ENTERPRISE$FORM_MESSAGE_SELF_HOSTED_PLACEHOLDER": {
|
||||
"en": "Tell us about your deployment needs...",
|
||||
"ja": "デプロイメントのニーズについて教えてください...",
|
||||
"zh-CN": "告诉我们您的部署需求...",
|
||||
"zh-TW": "告訴我們您的部署需求...",
|
||||
"ko-KR": "배포 요구 사항에 대해 알려주세요...",
|
||||
"no": "Fortell oss om dine distribusjonsbehov...",
|
||||
"ar": "أخبرنا عن احتياجات النشر الخاصة بك...",
|
||||
"de": "Erzählen Sie uns von Ihren Bereitstellungsanforderungen...",
|
||||
"fr": "Parlez-nous de vos besoins de déploiement...",
|
||||
"it": "Raccontaci le tue esigenze di distribuzione...",
|
||||
"pt": "Conte-nos sobre suas necessidades de implantação...",
|
||||
"es": "Cuéntenos sobre sus necesidades de implementación...",
|
||||
"ca": "Expliqueu-nos les vostres necessitats de desplegament...",
|
||||
"tr": "Bize dağıtım ihtiyaçlarınızı anlatın...",
|
||||
"uk": "Розкажіть нам про ваші потреби у розгортанні..."
|
||||
},
|
||||
"ENTERPRISE$FORM_SUBMIT": {
|
||||
"en": "Submit",
|
||||
|
||||
18
frontend/src/icons/wave.svg
Normal file
18
frontend/src/icons/wave.svg
Normal file
@@ -0,0 +1,18 @@
|
||||
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<!-- Left waving hand -->
|
||||
<g transform="translate(0, 4)">
|
||||
<path d="M16 8C16 6.89543 15.1046 6 14 6C12.8954 6 12 6.89543 12 8V20" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M12 12C12 10.8954 11.1046 10 10 10C8.89543 10 8 10.8954 8 12V22" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M8 14C8 12.8954 7.10457 12 6 12C4.89543 12 4 12.8954 4 14V24C4 30.6274 9.37258 36 16 36C20.4183 36 24 32.4183 24 28V20" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M20 10C20 8.89543 19.1046 8 18 8C16.8954 8 16 8.89543 16 10V20" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M24 14C24 12.8954 23.1046 12 22 12C20.8954 12 20 12.8954 20 14V20" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
</g>
|
||||
<!-- Right waving hand -->
|
||||
<g transform="translate(24, 0)">
|
||||
<path d="M8 8C8 6.89543 8.89543 6 10 6C11.1046 6 12 6.89543 12 8V20" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M12 12C12 10.8954 12.8954 10 14 10C15.1046 10 16 10.8954 16 12V22" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M16 14C16 12.8954 16.8954 12 18 12C19.1046 12 20 12.8954 20 14V24C20 30.6274 14.6274 36 8 36C3.58172 36 0 32.4183 0 28V20" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M4 10C4 8.89543 4.89543 8 6 8C7.10457 8 8 8.89543 8 10V20" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
<path d="M0 14C0 12.8954 0.895431 12 2 12C3.10457 12 4 12.8954 4 14V20" stroke="white" stroke-width="2" stroke-linecap="round"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -103,7 +103,6 @@ export default function InformationRequest() {
|
||||
data-testid="information-request-page"
|
||||
className="w-full max-w-4xl flex flex-col items-center gap-8 p-6"
|
||||
>
|
||||
<OpenHandsLogoWhite width={55} height={55} />
|
||||
<InformationRequestForm
|
||||
requestType={selectedRequestType}
|
||||
onBack={handleFormBack}
|
||||
|
||||
Reference in New Issue
Block a user