feat(cases): mídia no topo, títulos de busca curtos e CreativeWork
Case com mídia ao lado do título e play acessível; problema de cada cliente reescrito com base nos dados; serviços relacionados em 2 cards; FAQ antes do próximo passo e bloco 'Onde já apliquei isso'; Apolo citada em IoT e arquitetura. metaTitle até 43 caracteres e descrições até 155 com teste; JSON-LD CreativeWork; imagens de compartilhamento abaixo de 100 KB; 404 e robots corrigidos; server-only nos módulos com node:.
This commit is contained in:
1 parent
c9a0b80656
commit
e80f73d075
52 files changed
+2593
-439
No files matched your search
+17
-5
@@ -1,4 +1,5 @@
|
||||
import { existsSync, readFileSync } from "node:fs";
|
||||
import "server-only";
|
||||
import { readFileSync, statSync } from "node:fs";
|
||||
import { join } from "node:path";
|
||||
import { getOgImagePath, PROJECT_VIDEO_IDS } from "./project-showcase";
|
||||
|
||||
@@ -8,13 +9,24 @@ const brandMark = `data:image/png;base64,${readFileSync(
|
||||
|
||||
export const OG_SIZE = { width: 1200, height: 630 } as const;
|
||||
export const OG_CONTENT_TYPE = "image/png";
|
||||
export const OG_PHOTO_CONTENT_TYPE = "image/jpeg";
|
||||
|
||||
/** Capa 1200x630 gravada da página do projeto (public/videos/<id>/og.jpg), como data URI; `undefined` se não existir. */
|
||||
export function readProjectOgBackground(id: string): string | undefined {
|
||||
/** Teto de uma imagem de compartilhamento: quem recebe o link baixa a imagem a cada prévia, então ela precisa ser leve. */
|
||||
export const OG_IMAGE_MAX_BYTES = 150_000;
|
||||
|
||||
/**
|
||||
* Capa 1200x630 gravada da página do projeto (public/videos/<id>/og.jpg), usada como está na imagem de compartilhamento.
|
||||
* `undefined` se não existir ou se pesar o teto ou mais: nesse caso quem chama gera o cartão simples, sem imagem de fundo.
|
||||
*/
|
||||
export function readProjectOgImage(id: string): Buffer | undefined {
|
||||
if (!PROJECT_VIDEO_IDS.includes(id)) return undefined;
|
||||
const path = join(process.cwd(), "public", getOgImagePath(id));
|
||||
if (!existsSync(path)) return undefined;
|
||||
return `data:image/jpeg;base64,${readFileSync(path).toString("base64")}`;
|
||||
try {
|
||||
if (statSync(path).size >= OG_IMAGE_MAX_BYTES) return undefined;
|
||||
return readFileSync(path);
|
||||
} catch {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
export function OgCard({
|
||||
|
||||
Reference in new issue
Block a user