Skip to content

Builder Preview (iframe & postMessage)

Academy Visual Builder iframe önizlemesi: builder-preview ve builder-preview-auth route’ları, SAMEORIGIN güvenliği ve parent↔iframe mesaj protokolü.

Visual Builder, canlı vitrini DOM içinde değil ayrı bir iframe route üzerinden gösterir. Böylece önizleme bundle’ı gerçek storefront’a yakın CSS/font davranışı kullanır; editör chrome’u iframe dışında kalır.


RouteDosyaAmaç
/:lang/builder-previewapp/routes/$lang.builder-preview.tsxVitrin blokları (anasayfa + sayfa birleşik önizleme)
/:lang/builder-preview-authapp/routes/$lang.builder-preview-auth.tsxLogin/register auth tasarım önizlemesi

Kayıt: app/routes.ts (lang layout altında)

Güvenlik başlıkları (builder-preview.tsx):

export function headers() {
return {
"X-Frame-Options": "SAMEORIGIN",
"Cache-Control": "no-store",
};
}

Ana uygulama root’ta X-Frame-Options: DENY olabilir; önizleme route’u iframe embed için SAMEORIGIN döner.


Kaynak: source: "coursio-builder". Origin kontrolü: window.location.origin.

typeAçıklama
BUILDER_PREVIEW_UPDATEpayload: blocks, academyName, courses, theme, pages[]
BUILDER_PREVIEW_NAVIGATEpath: mantıksal storefront yolu (/, /p/hakkimizda) — sol panelden sayfa değişince
BUILDER_PREVIEW_HIGHLIGHTblockId: seçili blok vurgusu
BUILDER_AUTH_PREVIEW_UPDATEAuth sekmesi: page, login, register, theme, logoUrl, primaryColor

Kaynak: source: "coursio-builder-preview".

typeAçıklama
BUILDER_PREVIEW_READYiframe yüklendi; parent tam payload gönderir
BUILDER_AUTH_PREVIEW_READYAuth önizleme hazır
BUILDER_BLOCK_SELECTÖnizmede bloğa tıklandı → parent inspector’ı açar
BUILDER_PREVIEW_PATH_CHANGENavbar/footer link tıklandı → path (/, /p/slug)

Parent, BUILDER_PREVIEW_PATH_CHANGE alınca bilinen slug’lar için navigate(/instructor/academy/builder?pageId=…) yapar; /courses, /login gibi sistem path’lerinde yalnızca iframe mantıksal URL güncellenir.


NavbarBlock ve FooterBlock isPreviewMode iken native navigation’ı engeller; onPreviewNavigate(url) ile mantıksal path parent’a iletilir.

Dosyalar:

  • app/components/academy/blocks/NavbarBlock.tsxonPreviewNavigate prop
  • app/components/academy/blocks/FooterBlock.tsx — aynı prop
  • $lang.builder-preview.tsxstripPathPrefix(), activePath state, handlePreviewNavigate

Önizleme scope’unda data-active-path attribute ile aktif mantıksal path izlenebilir.


Dosya: app/routes/instructor.academy.builder.tsx

  • previewIframeRef + postPreviewUpdate() / postPreviewAuthUpdate()
  • currentActivePath: sayfa düzenleniyorsa /p/ + slug, aksi halde /
  • handlePreviewPathChange — iframe → builder sayfa senkronu
  • intent=create-page — yeni academy_pages kaydı (Sayfalar sekmesi modal)