Tema geliştirme — bir mağazaya skin yazmak
> Third-party marketplace listing does not exist yet (M11). Today a theme you author installs store-private (vendor local.); FULL kits (your own TSX element implementations) wait for the P2 sealed runtime. Everything below works now, for designers and agents alike.
A Mozaik theme is three things (the Element Contract): an element kit, variables, and page skeletons. A SKIN theme ships no code — it is CSS + variables (+ presets + composites + packaged fonts) over a first-party parent kit (extends), so it is complete on day one: anything you don't style keeps the parent's look. Content never lives in a theme; switching is lossless by construction.
The loop
mozaik open st_… # the store as a project
mozaik theme create acme.nordic --from vitrin
# → theme/theme.json theme/skin.css theme/variables.json (+ theme/fonts/*.woff2)
mozaik theme check # server-side: grammar, sizes, element coverage
mozaik theme push # installs it store-private (Ajan token → proposal)
mozaik theme preview # switches the workspace draft to it + preview URL
mozaik theme sink # the /_mz/kit style guide wearing your skin
The CSS grammar
All theme CSS targets the DOM anatomy with attribute selectors only — classes are never a contract:
[data-mz-el="button"] { border-radius: 999px; letter-spacing: .04em; }
[data-mz-section="header@1"] [data-mz-slot="nav"] [data-mz-part="link"] { text-transform: uppercase; }
[data-mz-el="product-card"]:hover [data-mz-el="image"] { transform: scale(1.03); }
No classes/ids/bare tags (except the Prose descendant allowlist), no !important, no url() (a packaged font or a /_mz/a/ asset is the exception), breakpoints 480/768/1024 only, tokens from the registry (--mz-* core, --mzt-* theme variables). The full rule set with TR messages: mozaik theme check — the same gate a marketplace submission will face. The consent banner and the legal identity block are cascade-pinned; a theme cannot hide or unbalance them.
Variables, presets, fonts
theme/variables.json declares owner-editable knobs (≤40, typed, TR labels) emitted as --mzt-*; presets (Varyasyon) are named value sets the owner applies without losing other edits. Packaged fonts go under theme/fonts/*.woff2, are declared in the manifest (source: "pack", license required) and become immutable platform assets — the platform emits the @font-face; your CSS just uses the family name.
Composites (kit-trees)
Sections beyond the platform set are kit-trees — JSON element trees rendered through the active kit (reference). Stores keep their own under design/composites/ (type c.<name>@1); extensions contribute blocks into storefront zones the same way. No code, no CSS, works in every theme.
For agents
Everything above is command-shaped: theme.push and theme.switch on an Ajan token land as proposal items with the Geçiş raporu as the consent block — the owner approves in Öneriler. The Dev MCP serves schema_get kind=kit-contract|theme and theme_check offline of any store. Machine-readable schemas: /schemas/kit-contract.json, /schemas/theme.schema.json.