Files
portifolio-evandrodevbr/app/components/contact-subject.ts
T
Evandro Fonseca Junior 9e2d65a926 fix(home): oferta leva ao formulário, ofertas logo depois da vitrine
O botão das ofertas rola até o contato com o tipo marcado e não quebra mais as âncoras; ofertas com o que você recebe e primeiro passo, logo depois da vitrine; bloco de IA fora da home; cartão largo da SEV no hero do celular; separador da faixa de clientes só entre itens; favicon de 13 para 1,8 KB; pré-carregamento só no hover e nunca de /#... fora da home; X do menu e cabeçalho opaco; WhatsApp com "o case"; /ia com 3 passos e modelo de relatório ilustrativo; Sobre alinhado ao currículo; CSP Report-Only com os domínios do Ads.
2026-10-14 19:14:47 -03:00

47 lines
2.0 KiB
TypeScript

/**
* Tipos de projeto do formulário de contato (Contact.tsx) e o jeito de as ofertas da home escolherem um deles.
* Uma oferta abre o formulário com o tipo já marcado de dois jeitos: o endereço `/?tipo=<tipo>#contact` (vale ao
* chegar de outra página ou em um link copiado) e o evento CONTACT_KIND_EVENT (vale na própria home, onde o
* gerenciador de âncoras rola até o formulário sem recarregar a página, e ContactOfferLink deixa o endereço como `/#contact`).
* O tipo vai na busca, antes do `#`: um `/#contact?tipo=...` faria o fragmento virar "contact?tipo=...",
* que não é o id de nenhum elemento, e a página não rolaria até o formulário.
*/
/** Primeiro e padrão: quem chega sem saber o que pedir não é empurrado para um tipo. */
export const DEFAULT_CONTACT_SUBJECT = "Ainda preciso definir";
export const CONTACT_SUBJECT_OPTIONS = [
DEFAULT_CONTACT_SUBJECT,
"Site para empresa",
"Sistemas web sob medida",
"Aplicativos",
"Integrações e automações",
"Evolução de um sistema existente",
"Revisão ou diagnóstico de sistema",
] as const;
/** Tipo que uma oferta pede -> opção do formulário. */
export const CONTACT_KINDS = {
site: "Site para empresa",
sistema: "Sistemas web sob medida",
revisao: "Revisão ou diagnóstico de sistema",
} as const satisfies Record<string, (typeof CONTACT_SUBJECT_OPTIONS)[number]>;
export type ContactKind = keyof typeof CONTACT_KINDS;
/** Parâmetro de busca do endereço: `/?tipo=site#contact`. */
export const CONTACT_KIND_PARAM = "tipo";
/** Evento da janela com o tipo escolhido em `detail`. */
export const CONTACT_KIND_EVENT = "contact:kind";
/** Opção do formulário para um tipo; `undefined` para um tipo desconhecido (inclusive nomes herdados, como "constructor"). */
export function contactSubjectForKind(kind: string | null | undefined) {
return kind && Object.hasOwn(CONTACT_KINDS, kind)
? CONTACT_KINDS[kind as ContactKind]
: undefined;
}
export function contactKindHref(kind: ContactKind) {
return `/?${CONTACT_KIND_PARAM}=${kind}#contact`;
}