Cópia do starter ecomplus/store
tematizada para farmácia — medicamento isento de prescrição, cuidado
contínuo, higiene e dermocosmético, atendendo consumidor final.
Este nicho ainda não existe no site institucional. Não há marca em
src/config/brands.tsnem página em/segmentos/. O posicionamento foi proposto, não portado. Nome, logo e domínio são placeholders.
⚠️ Esta é uma demonstração de tema, não uma farmácia. Vender medicamento pela internet no Brasil depende de autorização sanitária, farmacêutico responsável técnico e das regras da Anvisa para comércio eletrônico — nada disso é resolvido por tema de loja. O que está aqui é a interface: a tarja visível, o item que não vai ao carrinho sem receita, o lugar do envio no fluxo. A parte regulatória é da operação. As duas extra-pages (/p/genericoe/p/receita) abrem dizendo isso. Manter.
Em nenhum outro nicho do conjunto o cliente chega procurando um produto e a resposta certa é outro produto. Ele digita o nome comercial que viu na receita, e a mesma substância na mesma dosagem existe com outros três rótulos e metade do preço.
É a única variante em que a vitrine ajuda o cliente a não comprar o que ele pediu — e é isso que constrói recompra numa farmácia: quem economizou uma vez volta.
O conjunto já tem quatro temas que lidam com especificação, e o risco de virar o quinto igual é real — foi o que aconteceu entre Bitola e Circuito. O corte:
| Pergunta do cliente | Especificação serve como | |
|---|---|---|
| Bitola (construção) | que peça serve? | filtro |
| Cardan (autopeças) | serve no meu carro? | compatibilidade |
| Circuito (eletro) | qual é mais barato? | ficha, com o preço de herói |
| Cadência (esporte) | qual é melhor pra mim? | comparação |
| Bula (farmácia) | é o mesmo, mais barato? | equivalência |
A Cadência compara produtos diferentes para escolher um; o que interessa lá é a linha que muda. A Bula compara produtos que são o mesmo para escolher o mais barato, e a única linha que muda é o preço. Comparador mostra diferença; equivalente mostra identidade — por isso a tabela repete as colunas de substância e dosagem em vez de escondê-las. A repetição é o argumento.
| Peça | O que muda |
|---|---|
sections/EquivalenteSection.astro |
Referência, genérico e similar na mesma tabela, com a economia calculada no build. |
components/ProductCard.vue |
Tarja como faixa no topo do card, antes da foto. |
components/ProductCard.vue |
Princípio ativo e dosagem acima do nome comercial — a inversão que define o tema. |
components/ProductCard.vue |
Item com tarja não vai ao carrinho pela vitrine: leva para a ficha. |
sections/BannersGridSection.astro |
Rótulo em faixa sólida embaixo da foto, não sobre ela. |
assets/style.css |
.ui-tarja, .ui-ativo, .ui-economia — os átomos do tema. |
assets/style.css |
font-size de raiz em 17px e botão sem caixa alta. |
tailwind.config.js |
Turquesa + azul-petróleo, raio 0.375rem, iconAliases corrigido. |
A faixa colorida da caixa de remédio é informação legal: vermelha é venda sob prescrição, preta é controlada. Um tema de farmácia que usa vermelho de marca ensina o cliente a ignorar a única cor da tela que ele precisava ler.
Por isso a paleta inteira é fria — turquesa e azul-petróleo — e vermelho só
existe em .ui-tarja. Se aparecer vermelho fora dela, é engano. Vale
inclusive para o logo: a faixa do wordmark é turquesa, não vermelha.
A escolha também é por eliminação: o conjunto já tem cinco variantes em verde (despensa, morada, ninho, prumo, cadência) e o verde-cruz clássico do nicho seria a sexta.
Como isso não vira a Cadência: as duas ficam na faixa turquesa/petróleo, e
o risco é real. O que separa não é o matiz, é o resto do sistema — lá o
secundário é volt e o hero grita, aqui o secundário é quase preto e o hero é o
mais calmo do conjunto; lá o título é Anton em caixa alta, aqui não há
display nenhuma e o corpo é o maior de todas as variantes.
Farmácia tem a base de clientes mais velha do e-commerce brasileiro, e o dado que decide a compra é justamente o de corpo pequeno: "500 mg" e "5 mg" diferem por um caractere.
Daí o font-size de raiz em 17px. Como a escala do Tailwind é em rem,
texto, espaçamento e área de toque crescem juntos — em vez de virar texto
grande espremido em botão pequeno. Botão também perdeu a caixa alta, que
apaga a silhueta da palavra.
Atkinson Hyperlegible carrega os dados críticos (.ui-ativo, .ui-tarja,
títulos): foi desenhada pelo Braille Institute para desambiguar caractere
parecido, que é exatamente o problema de ler dosagem. Ela não é a fonte de
corpo — em parágrafo longo as particularidades dela cansam. Corpo é
Source Sans 3.
As outras variantes põem o texto por cima da imagem, com gradiente. O contraste disso depende do que a foto tem naquele ponto, e é o primeiro lugar em que a legibilidade cai quando alguém troca a imagem pelo CMS. Neste tema essa conta não fecha, então o rótulo desce para uma faixa sólida.
| O quê | Onde | Como ligar |
|---|---|---|
| Tarja do card | ProductCard.vue |
specifications.tarja no produto |
| Princípio ativo e dosagem | ProductCard.vue |
specifications.principio_ativo, .dosagem |
| "Genérico a partir de R$ 8,90" | ProductCard.vue |
Menor preço do grupo de equivalentes |
| Grupos de equivalentes | EquivalenteSection.astro |
Agrupar por princípio ativo + dosagem, ordenar por preço |
Nas outras variantes o dado estático é uma spec: mostrar "Drop 10 mm" errado é feio. Aqui o dado estático é classificação legal, e mostrá-la errada é outra categoria de problema.
tarjaDoSku() deriva a faixa de um hash do SKU — uma em cada quatro sai com
tarja — só para que a demonstração mostre os dois fluxos na mesma vitrine.
Se todos os cards trouxessem a mesma faixa, a metade mais importante do tema
ficaria invisível no print e no clique.
Nenhuma loja real pode derivar tarja de qualquer coisa que não seja o
cadastro do produto. Em produção isso é
product.specifications?.tarja?.[0]?.value, e nada mais.
De propósito, e está escrito na nota de rodapé dela. Sugerir troca de marca é decisão do cliente quando o item é de venda livre; havendo receita, a troca é de quem prescreve. Manter.
npm i
npm run dev # http://localhost:3000
BUILD_OUTPUT=static npx cloudcommerce build --codebase ssr- Trocar
generalIconSetsquebrai-closeem silêncio. O pacote apelidai-closeparax-mark, que é nome do heroicons; no Phosphor o ícone éx. O conjunto do tema registra o atalho antes do heroicons, então saíai-ph-x-mark— utilitário que não casa some em silêncio no UnoCSS e o botão de fechar ficava invisível. Resolvido comiconAliases: { close: 'x' }. Conferir sempre no CSS construído:grep 'i-close{' functions/ssr/dist/client/_astro/*.css. - Ícone que não casa some em silêncio. Na dúvida, forma prefixada:
i-ph-<nome>. /s/<termo>não funciona no build estático — só/s/é pré-renderizado. Usar sempre/s?q=<termo>.- Botão dentro de
<a>navega ao clicar — a linha de compra fica fora doALink, e a moldura do card passou para a div que envolve os dois. - Atributo
hiddenperde para utilitário de display..ui-specaplicainline-flexe vence[hidden] { display: none }no desempate por ordem — por isso os painéis doEquivalenteSectionsão<div>sem classeui-*. cloudcommerce buildregenera ofirebase.json— buildar primeiro, escrever a config depois.- Trocar o PNG de um logo e rebuildar não troca a imagem servida — o Astro
reaproveita a entrada de cache. Rodar
demo-catalog/scripts/limpar-cache-imagens.sh bulaantes do build. customCode.cssdo CMS não funciona em nenhuma loja Cloud Commerce (Base.astrodo pacote usa<style>{customCode.css}</style>e o Astro não interpola expressão dentro de<style>). Por isso todo CSS vive emsrc/assets/style.csse as fontes são carregadas pelohtmlHeaddecontent/layout.json.