@danrubinmoto/crm-federated-engine
v0.2.0
Published
Klientský balíček pro satelitní domény Dan Rubin Moto — SWR federace obsahu z CRM, Carbon Performance patička, JSON-LD, anti-duplication guard.
Maintainers
Readme
@danrubinmoto/crm-federated-engine
Klientský balíček pro satelitní domény ekosystému Dan Rubín. Načte
konfiguraci a ceníky z centrálního CRM endpointu
GET https://crm-danrubinmoto.lovable.app/api/public/services?site={domain},
drží 24h SWR cache v localStorage, injektuje JSON-LD (Organization +
Person + Course[]) a vykreslí patičku v tématu Carbon Performance
podle footer_variant:
PREMIUM_CORE— minimalistický podpis, luxusní typografieCOMPETITIVE_ATTACK— bento tabulka „skupinová motoškola vs 1 : 1 koučink"DESTINATION_ESCAPE— zážitkový blok Málaga / Andalusie
Instalace
bun add @danrubinmoto/crm-federated-enginePřipoj CSS jednou v rootu satelitu (obsahuje Carbon tokeny a Tailwind utility používané komponentou):
import "@danrubinmoto/crm-federated-engine/style.css";Použití
import {
CrmFederatedEngine,
type FederatedPayload,
} from "@danrubinmoto/crm-federated-engine";
import { toast } from "sonner";
const STATIC_FALLBACK: FederatedPayload = {
site: {
id: "static",
name: "individualnimotoskola.cz",
url: "individualnimotoskola.cz",
default_locale: "cs",
currency: "CZK",
footer_variant: "PREMIUM_CORE",
interlink_targets: [
{
target_domain: "danrubin.cz",
anchor_text: "osobní trénink motocyklů od Dana Rubína",
},
],
protected_content_hashes: [],
},
locale: "cs",
count: 0,
services: [],
seo_schema: null,
};
export function SiteFooter() {
return (
<CrmFederatedEngine
site="individualnimotoskola.cz"
staticFallback={STATIC_FALLBACK}
onNetworkFallback={(reason) =>
toast.warning(
reason === "timeout"
? "CRM neodpovídá do 4,5 s — používám lokální data."
: reason === "network"
? "Výpadek sítě — používám lokální data."
: "Neplatná odpověď CRM — používám lokální data.",
)
}
/>
);
}Chování
| Stav | source | Poznámka |
| --- | --- | --- |
| Úspěšný fetch | network | Payload validován Zod schématem. |
| Fetch selhal / timeout, cache existuje | cache | Prezentuje se poslední známý payload (i po TTL). |
| Fetch selhal, cache neexistuje | fallback | Neměnný staticFallback z props. |
- Timeout:
AbortController4500 ms (přepistimeoutMs). - Cache:
localStorage["crm_federation_cache"], TTL 24 h (přepisttlMs/cacheKey). - Dev guard: v
NODE_ENV=developmenthashuje textový obsahmaina při shodě sprotected_content_hashesz payloadu injektuje<link rel="canonical" href="https://danrubin.cz">. - Brand voice lint: v dev módu loguje výskyt korporátního plurálu („nabízíme", „poskytujeme", „od nás", „naše motoškola", „jsme profesionál").
- Tap-targety: všechny odkazy patičky mají
min-h-11 min-w-11pro ovládání bříškem prstu v motorkářské rukavici (Z Fold 7 vnější displej).
Odkazy
- Spec:
docs/specs/archive/009-crm-federated-cross-domain-engine.md - Admin konfigurace:
https://app.danrubinmoto.com/settings/sites
