Documentation Abizvo Sites themes Liquid, the theme check and the premium standard — written from the code that enforces them

Premium theme standards

A theme sold on the Abizvo Marketplace is installed on paying customers' websites and updated on their drafts automatically. The bar below is the one the platform's own paid themes are held to — by ThemeChecker, by MarketplaceThemesTests and QuireThemeTests in the repository, and by the marketplace review — and it is written here so a seller can hold their own theme to it before submitting. Where a figure is quoted, it is the figure the code enforces.

1. The check passes with no error — and, at release, no warning

The theme check (ThemeChecker.Check) must report zero errors, or the release and the submission are refused. A paid theme also clears every warning: a section without presets, a locale key with no text, an image over 800 KB, a link opening a new tab without rel="noopener" — each is something a reviewer will ask about. The review scores a submission from its findings (a blocking finding costs 25 points, each warning 2, capped at 30), so a warning-free theme is a clean review.

2. Every look renders every template, in both modes and both languages

For every style preset in config/presets.json and every template the theme ships, a render in public mode and in editor mode must produce no render error — no render.section-failed, no missing asset, no missing translation — with:

  • exactly one <h1> on the page;
  • the skip link to #MainContent;
  • the Powered by Abizvo line present (the platform places it; a theme that breaks the body so the marker is missing fails);
  • the home page rendering in French (fr.json complete for every key the theme uses).

MarketplaceThemesTests.Every_look_renders_every_template is the test; run tools/ThemePreview for each look with --fr to see it yourself.

3. A complete package

A paid theme ships at least: 10 sections, 6 theme blocks with at least one accepting nested blocks, 3 style presets, the templates home, page, 404, contact, gallery, portfolio and page.project, locales/en.default.json and locales/fr.json, documentation/README.md, and a screenshots/ folder. Every template's default buttons follow the site's own pages (action:booking, page: links), never a hard-coded address.

4. Accessibility and contrast

  • One H1 per page, a skip link, landmarks (header, main, footer; the platform's Powered-by line is an aside so the page keeps one contentinfo).
  • Every text colour on every ground of every look at 4.5:1: text, supporting text and the accent on the background and on any panel or surface colour; button text on the button; text on the accent field. Quire's sweep is the model — it is what found a caption at 4.03:1 and a panel at 4.19:1 that no single-pair check would have.
  • A control's boundary at 3:1 against its ground: a form field underlined in a divider colour at 1.4:1 fails; draw it in the supporting text colour.
  • Reduced motion honoured: every entrance and effect the platform plays already is; a theme's own CSS animations sit under prefers-reduced-motion: no-preference.
  • No content hidden until scripted: the motion runtime applies its start state only after it has run, and a theme's own CSS must never leave an element at opacity: 0 for a script to reveal.
  • No box sized in viewport units where a reader who enlarged their type would be trapped; a measure set in ch follows them.
  • outline: none only beside a :focus-visible style; no positive tabindex; image_tag for every picture so the owner's alt text is written; rel="noopener" and a note on every new-tab link.
  • Language on <html lang="{{ site.language }}">.

5. Performance

Tighter than the check's budget: under 60 KB of CSS, no JavaScript at all, the whole package under 5 MB, between 1 and 16 sample photographs each at most 250,000 bytes (WebP), every picture through image_tag with an honest sizes and one loading: 'eager' above the fold. The check's own warnings (150 KB CSS, 800 KB images, 60 assets) are a long way above this.

6. No theme JavaScript — unless reviewed

A paid theme ships no script: the platform supplies motion (animation_attributes) and interactions (effect_attributes), and everything else is CSS. A marketplace theme that does carry script is read as a syntax tree by ThemeJsAnalyzer and by a person; once approved, a reviewed marketplace theme's script runs on its buyers' sites, on the site's own origin only, exactly as the platform's own themes' does. A developer's unreleased theme never runs its script. Every page must work with the script absent, because script_tag renders nothing outside the site's own host.

7. Honest, coherent sample content

The sample content is one coherent business — a studio, a trade, a practice — written so a buyer sees a finished site rather than a form to fill in:

  • No invented figures, testimonials or client names presented as real. A quote with no attribution never reaches a published page.
  • No richtext default written as HTML — the tags render as words.
  • Sample photographs generated or licensed to one art direction, labelled as samples (the official themes use a sample-caption snippet that disappears once the owner uploads their own), and no legible generated lettering — every printed page, sign or screen in a generated picture is out of focus or at an angle, because generated lettering is always wrong.
  • Every sample picture's provenance in documentation/IMAGES.md: the prompt or the licence, per file.
  • Every text default reads as the theme's own voice, in both languages.

8. Documentation and support

  • documentation/README.md names every section and block, what each setting does, which fonts stand in for which, and what the theme deliberately does not do.
  • documentation/IMAGES.md for the photographs; documentation/SAMPLES.json if the theme's gallery samples are to preview.
  • The listing's documentation needs a page titled Support (address /support) saying how to reach you, how quickly you reply and what is in scope — a submission is blocked without it (LIST_SUPPORT_DOCS_MISSING), and the public docs show it last.
  • The seller profile states a support email, a response-time commitment in business days (1–30) and a support policy — blocked without them (LIST_SELLER_SUPPORT_MISSING) — and the listing carries a support policy of 20–2,000 characters saying what is covered and for how long (LIST_SUPPORT_POLICY_MISSING).
  • A ticket a buyer opens about the theme is routed to the seller: the seller's portal queue, a notification to every team member with the support permission, and an email to the support address with the requester in Reply-To. The stated response time is what the buyer is told before they pay.

9. Listing media

  • A hero image of at least 1600×900, set as the primary image.
  • At least three desktop screenshots (1440×900 captures of the home, a listing and a detail page).
  • At least one phone screenshot — a 390×844 viewport at 2× (780×1688), never a full-page capture: derivatives fit a square box, so a 390×3000 capture renders its large copy 208 pixels wide.
  • Alt text on every image (a warning otherwise).
  • Media is counted by kind for the checklist and shown from the listing's gallery — upload under the right kind and place each in the gallery, or a listing with seven images shows one.
  • A live demo: an ordinary Abizvo site running the theme, published, linked from the listing as See it live. The theme's own page on abizvo.site shows the button only when a published site exists at the theme's key.

Screenshots come from tools/ThemePreview served one look per port as its own root; the asset paths are root-relative.

10. Versioning

version in abizvo-theme.json is major.minor.patch. A release is immutable; one version per product ever; a new release must carry a higher version, and the manifest's version must equal the draft's. Every site's copy moves to the newest released version in its draft, automatically, after a restore point, with a note of every setting the new version dropped — so a version that renames a setting id loses the owner's value for it. Prefer adding a setting to renaming one; state what changed in the release's changelog.

11. Price and the seven-day lock

  • A theme is priced C$20–C$300 in C$5 steps, or free (2,000–30,000 minor units, step 500; AllowFree). Listings are in CAD or USD.
  • The price can change once every seven days. The clock starts when a revision with a different price goes live; a change inside the window is refused at save, at submit and at publication. A platform admin can grant one override with a written reason.
  • An offer applies only once the price has stood seven days — raise-then-discount is the trick the rule exists to stop. An offer never touches the listing's price and never takes a paid listing below the category's lowest price.

12. The licence

A buyer downloads their own copy: the release ZIP re-made with LICENSE-ABIZVO.txt and a signed abizvo-license.json at its root, a licence comment in the layout, and a fingerprint across the text files that traces a copy found elsewhere to its purchase. The licence type is abizvo-organization: the buyer's organization installs the theme on its own sites through the entitlement, and nobody else's. Nothing in a theme checks anything or phones home — attribution, not prevention.

13. The review

The automated review runs the theme check over the uploaded ZIP as the category's artifact validation — an error blocks, a warning flags — and blocks a key that already belongs to another theme or product (THEME_KEY_TAKEN). There is no demo store to inspect. The listing is verified (§8, §9, the words' lengths — title 3–80, tagline up to 140, short description 40–300, long description 200–20,000 — the price rule and currency), then a reviewer reads the flagged findings and the theme itself. An approved release is imported as a marketplace theme owned by its product, and buyers' organizations install it from then on.

14. Support obligations after the sale

The response time stated on the seller profile is a commitment made before the buyer pays. A theme update that drops settings is announced in its changelog. A release is immutable and the previous release stays current until the next is published, so a buyer is never left on a version that vanished.