Branding workspace

Zarządzaj assetami brandingu workspace (logo, favicon, nazwa marki, obraz Open Graph) i pobieraj je w aplikacji Next.js przez gateway cmssy.

14 lipca 2026

Przegląd

cmssy jest headless - Twoja aplikacja Next.js posiada całe stylowanie wizualne (kolory, typografia, dark mode) jako zwykły Tailwind/CSS w Twoim repozytorium. To, co cmssy przechowuje per workspace, to branding: nazwa marki i współdzielone assety, które pobierasz i aplikujesz w swojej stronie.


Branding workspace

Branding żyje w site config workspace. Pobierz go przez gateway własnym zapytaniem GraphQL - createCmssyClient(cmssy).query(...). Site config jest wystawiony pod public.siteConfig, a assety siedzą na jego pod-obiekcie branding:

import { createCmssyClient, type CmssyBranding } from "@cmssy/core";
import { cmssy } from "@/cmssy.config";

const SITE_CONFIG_QUERY = `query PublicSiteConfig($workspaceSlug: String!) {
  public {
    siteConfig(workspaceSlug: $workspaceSlug) {
      branding {
        brandName
        logoUrl
        faviconUrl
        ogImageUrl
      }
    }
  }
}`;

const data = await createCmssyClient(cmssy).query<{
  public: { siteConfig: { branding: CmssyBranding | null } };
}>(SITE_CONFIG_QUERY, { workspaceSlug: cmssy.workspaceSlug });

const branding = data.public.siteConfig.branding;
// CmssyBranding | null - brandName, logoUrl, faviconUrl, ogImageUrl (each nullable)
PoleCo toGdzie użyć
brandNameWyświetlana nazwa strony / marki.Tytuł strony, metadata, header
logoUrlURL assetu logo.Renderuj w headerze lub stopce
faviconUrlURL assetu favicon.Podłącz do icons w metadata
ogImageUrlDomyślny obraz Open Graph / do social share.Domyślny obraz OG dla stron bez własnego obrazu

Każde pole jest nullable - renderuj tylko to, co ustawione.

Używanie brandingu w Twojej aplikacji

Favicon:

import { createCmssyClient } from "@cmssy/core";
import { cmssy } from "@/cmssy.config";

const SITE_CONFIG_QUERY = `query PublicSiteConfig($workspaceSlug: String!) {
  public { siteConfig(workspaceSlug: $workspaceSlug) { branding { faviconUrl } } }
}`;

export async function generateMetadata() {
  const data = await createCmssyClient(cmssy).query<{
    public: { siteConfig: { branding: { faviconUrl: string | null } | null } };
  }>(SITE_CONFIG_QUERY, { workspaceSlug: cmssy.workspaceSlug });

  const faviconUrl = data.public.siteConfig.branding?.faviconUrl;
  return faviconUrl ? { icons: { icon: faviconUrl } } : {};
}

Logo w headerze:

import { createCmssyClient, type CmssyBranding } from "@cmssy/core";
import { cmssy } from "@/cmssy.config";

const SITE_CONFIG_QUERY = `query PublicSiteConfig($workspaceSlug: String!) {
  public { siteConfig(workspaceSlug: $workspaceSlug) { branding { brandName logoUrl } } }
}`;

export default async function Header() {
  const data = await createCmssyClient(cmssy).query<{
    public: { siteConfig: { branding: CmssyBranding | null } };
  }>(SITE_CONFIG_QUERY, { workspaceSlug: cmssy.workspaceSlug });

  const branding = data.public.siteConfig.branding;
  return (
    <header>
      {branding?.logoUrl && <img src={branding.logoUrl} alt={branding.brandName ?? ""} />}
      {branding?.brandName && <h1>{branding.brandName}</h1>}
    </header>
  );
}