⌇ Seamble

The same guide AI assistants read through Seamble's MCP server. View as Markdown

Runtime

Why the starter looks like this

The live file runs strict, inside a block, deferred. A preview adds the draft to <head> later, at the top level, not strict. seamble.com runs the live file in a mount with data-demo and no Squarespace page. The IIFE, "use strict", the readyState check, the :not([data-sb-state]) guard (the script can run twice on one page) and try/catch per mount make all of these behave the same. Code outside that shape can work in a preview and break live, or the reverse.

Find mounts by id

Warning no-mount: the JS never mentions data-seamble-id or the component id. The mount is the only element that is reliably yours; a class, name or position breaks when two components of one kind share a page.

One classic script

Warning module-syntax: the JS has import or export statements. They, a top-level return, TypeScript and JSX are syntax errors, which stop the whole live file, Seamble's loader included: the component vanishes, the page stops reporting to Seamble, and its preview links stop loading. A syntax error in a draft only breaks the draft.

Render into the mount

Warning document-write: the JS calls document.write. The script runs after the page is parsed, where document.write is ignored during load and replaces the whole page afterwards.

Settings

Constants in the JS are the settings: you change them, and the owner never re-pastes.

Use a data-* attribute on the mount only when two mounts of one component need different values. The owner has to type it into the Code Block, so always fall back to the constant:

const end = new Date(el.dataset.date || DATE); // <div data-seamble-id="…" data-date="…">

Read any children the owner put in the mount before replacing them.

Libraries

Write it yourself when you can. Otherwise load a UMD build, pinned to an exact version, with integrity, once per page, and show a fallback if it fails:

function loadScript(src, integrity) {
  const all = (window.__sbScripts ||= {});
  return (all[src] ||= new Promise((ok, fail) => {
    const s = Object.assign(document.createElement("script"), { src, onload: ok });
    if (integrity) Object.assign(s, { integrity, crossOrigin: "anonymous" });
    s.onerror = () => fail(new Error(`could not load ${src}`));
    document.head.append(s);
  }));
}