Before you start

SportPulse is a block theme for sports sites, and it ships eight complete starter sites: a tipster service, a sports newsroom, a football club, an esports organisation, a sports academy and a bookmaker-review publication, plus light-palette twins of the tipster service and the newsroom. You pick one, import it, and then replace its words and pictures with yours.

Ten minutes spent on this chapter saves an hour later. The two things that catch people out are both here: the plugin that travels beside the theme, and the fact that a demo import replaces the content on the site it runs on.

What you downloaded

Your purchase is a single file, sportpulse_main.zip. Unzip it. Inside:

File or folder What it is
sportpulse.zip The theme — the one you upload in Appearance
sportpulse-child.zip The optional child theme, for editing theme files
plugins/anps_theme_plugin.zip The Anps Theme Plugin — required
documentation/index.html This manual, which works offline
licensing/ The GPL text and the split-licence statement
README.txt The same contents list, in one screen

The same manual is published at docs.themes.anpsthemes.com/sportpulse/, which is the copy to read before you buy and the one that is updated with each release. The copy in your download is the one that works with no connection.

Do not upload sportpulse_main.zip to WordPress. It is the wrapper, not the theme, and WordPress will reject it with "The package could not be installed". Unzip it on your computer first and upload sportpulse.zip.

The plugin is deliberately not inside the theme zip. Envato's Theme Check rejects any .zip file shipped inside a theme, so the plugin travels beside it in the download and you upload it once, by hand or with the button the theme offers you. See Installing.

What your site needs

Everything below is ordinary shared hosting. The numbers matter most during a demo import, which moves several hundred posts and copies every image the demo uses into your media library in one run.

What Needs to be Why
WordPress 6.7 or newer, tested up to 6.9 The block templates and the Site Editor the theme is built on
PHP 8.1 or newer The theme and plugin are written for it
Memory limit 256M Resizing a full-width hero image is the high-water mark of an import
Upload and post size 32M each The plugin zip is about 23M on its own — see the note below — plus the demo content file and your own media
Max execution time 300 seconds An import runs for minutes; it is raised automatically where your host allows it
PHP XML, dom and libxml Required Without them the demo content file cannot be read at all
Outbound HTTP, cURL Recommended Installing a Google Font, newsletter delivery, the Turnstile spam check, and letting WordPress install a plugin for you. A demo import does not use it — the demo's images ship inside the plugin and are copied from disk
Image editing, GD or Imagick Required Thumbnails and crops are generated from every image
Uploads folder Writable The demo's media is saved into it
mbstring and zip Recommended Accented text and plugin uploads
Permalinks Any setting except Plain Otherwise every post and fixture URL reads ?p=123
HTTPS Recommended Forms, logins and anything you sell

You do not have to check any of this by hand. Once the theme and plugin are active, Appearance → Theme Options → System requirements prints your server's real values against the ones above, grouped into four tables, with a Copy all as text button. If you have to open a ticket with your host or with us, paste that instead of describing it.

The System requirements tab lists your server's real values beside the ones the theme needs.

Anything that would actually break is marked as needing a fix; the rest is listed because support will ask for it. The Demo import screen repeats only the failing rows, immediately above the demo cards.

How the theme, plugin and demos fit together

Three parts, and it is worth knowing which does what before you customise anything.

SportPulse, the theme, is the design layer: the block templates, the header and footer parts, the type scale, the palettes and the per-demo CSS. It is what an update replaces, which is why your own edits belong in the child theme or in Custom CSS.

Anps Theme Plugin carries the working parts: all the SportPulse blocks, the Theme Options screen, the sports content types — fixtures, predictions, players, bookmakers and the rest — and the demo importer. It is required. With the theme active and the plugin missing, you get a plain site and a notice telling you so.

The demo packs live inside that plugin. Each one is a real site that a designer built and exported: pages, media, menus, content, settings and a colour and font layer. Importing a pack reproduces that site here.

The plugin is not optional. Blocks, settings, content types and the demo importer are all in it. Install it before you do anything else.

How to read this manual

Read Installing and The eight demos now, then Importing a demo — in that order, because an import replaces content and you want to choose once.

After that the manual is reference, not a course. Go to the chapter for the job in front of you:

Admin paths are written as arrow chains, like Appearance → Theme Options → Theme styles. Anything in code type is a slug, a setting key or a file path — something you type or search for, not something you translate.

Installing

Two zips, in this order: the theme, then the plugin. Ten minutes on a normal host. On almost every host nothing here needs FTP, and nothing here is irreversible — the irreversible step is the demo import, and that comes later.

Install the theme

  1. Go to Appearance → Themes → Add New → Upload Theme.
  2. Choose sportpulse.zip from your unzipped download.
  3. Click Install Now, then Activate.

Upload the right zip. sportpulse.zip, not sportpulse_main.zip. The _main file is the wrapper around the whole download; WordPress answers "The package could not be installed" if you hand it that one. If your host refuses the upload on size, it is the upload_max_filesize row in What your site needs.

On activation you land on Appearance → Theme Options, on the Demo import tab. That is deliberate; see What happens next.

Install the Anps Theme Plugin

The theme cannot work alone, and it says so. Every admin screen shows a notice: SportPulse needs the Anps Theme Plugin for its blocks, demos and settings. It is in your download, in the plugins folder. — with an Upload plugins/anps_theme_plugin.zip button that opens the upload screen for you.

  1. Click that button, or go to Plugins → Add New → Upload Plugin.
  2. Choose plugins/anps_theme_plugin.zip from your unzipped download.
  3. Click Install Now, then Activate.

The plugin zip is about 23M. It carries the eight demo packs — every page, product, fixture and photograph of all eight starter sites — which is why it is far larger than the theme. Most hosts accept it. A host still capped at the old 2M or 8M default will refuse the upload with The uploaded file exceeds the upload_max_filesize directive, and that is a limit on the upload, not a problem with the file.

Three ways past it, in the order worth trying:

  1. Raise the limit. upload_max_filesize and post_max_size to 32M. Many hosts expose both in their control panel; otherwise ask support to set them. You want this anyway — the requirements table asks for 32M for the demo import too.
  2. Upload by FTP or your host's file manager. Unzip plugins/anps_theme_plugin.zip on your computer, then upload the resulting anps_theme_plugin folder into wp-content/plugins/ so you end up with wp-content/plugins/anps_theme_plugin/anps_theme_plugin.php. Activate it under Plugins. No size limit applies to FTP.
  3. Use WP-CLI, if your host offers it: wp plugin install /path/to/anps_theme_plugin.zip --activate.

You do this once. The plugin travels as its own zip beside the theme because a WordPress theme may not carry plugin files inside itself — it is not something that went missing from the theme zip.

If the plugin is already on the site but switched off, the notice changes to a single Activate Anps Theme Plugin button, and one click is the whole job.

In Plugins the entry is called Anps Theme Plugin. That is its real name; there is no separate "SportPulse" plugin to look for.

Without it, the theme renders base templates and nothing else. Specifically, you lose:

Missing without the plugin What that means
All SportPulse blocks Demo pages show empty gaps; the inserter has no SportPulse category
Theme Options No colours, fonts, header, footer or business settings screen
The demo importer No way to install any of the eight starter sites
The sports content types No Fixtures, Predictions, Players, Bookmakers, Programmes and so on

One plugin per ANPS theme, and it must be this one. If you have used another ANPS theme on this site, its plugin is still installed and it will not register SportPulse's blocks. The notice names the theme the installed plugin was built for and offers Upload the right plugin; upload plugins/anps_theme_plugin.zip from the SportPulse download and it replaces the other one. Do not run two of them.

A version notice works the same way: if the plugin is older than the theme needs, you are told which version to update to. See Licence, updates and support.

The child theme

sportpulse-child.zip is optional, and most sites never need it. Install it only if you intend to edit theme files — a template, a template part, or PHP in functions.php. Colours, fonts, menus, Custom CSS and everything on the Theme Options screen are stored in the database, survive an update on their own, and are not a reason to use a child theme.

If you do want it:

  1. Install sportpulse-child.zip the same way as the theme.
  2. Activate SportPulse Child — instead of SportPulse, not as well as. Only one theme is ever active.
  3. Leave SportPulse itself installed. The child theme is only the files you changed; everything else still comes from the parent, and deleting the parent breaks the site.

Switching to the child theme keeps your settings and content. It does re-run the one-time redirect described in What happens next, unless a demo is already imported.

Install WooCommerce

WooCommerce is not required by the theme, and six of the eight demos do not use it. Install it if either of these is true:

Install it from Plugins → Add New → Search plugins, search for WooCommerce, then Install Now and Activate. Do it before importing a demo, so the products land in the same pass as the pages. If you install it afterwards, re-import the demo.

WooCommerce's own setup wizard asks for your country, currency and shipping. Answer it; the demo overwrites the currency and unit settings when it imports, so it is worth finishing the wizard first and letting the demo have the last word. What the theme adds on top — catalogue columns, showcase mode — is in Shop and products.

Check it worked

Four quick checks, in the admin:

If a requirement is flagged, fix it before importing a demo, not after — a half-finished import is much more work than a raised memory limit. Your host does this; the Copy all as text button gives them the exact list.

What happens next

Right after you activate the theme, it sends you once to Appearance → Theme Options → Demo import. Once only, and never again on a site that has already imported a demo.

That is the whole of the first-run behaviour. There is no setup wizard and no activation questionnaire: every block, setting and demo is available the moment the plugin is active. Updates and support are a separate matter, and they depend on where you bought the theme — see Licence, updates and support.

So the next decision is which starter site you want. Read The eight demos, then Importing a demo.

The eight demos

Eight starter sites ship with the theme. Six of them are different sites, with their own pages, their own content types and their own look; the other two, Tipster Light and News Light, are those two demos in a light palette rather than new sites. Choosing carefully is worth the ten minutes, because a site holds one demo at a time: see One demo per site.

Which demo is for you

Demo What it is for Needs WooCommerce Elementor version
Tipster Selling verified predictions on a public record No Yes
Tipster Light The Tipster site in a light palette No Yes
E-gaming An esports organisation, with a store Yes Yes
News A sports newsroom with live coverage No Yes
News Light The News site in a light palette No Yes
Team A club's official site, with a store Yes Yes
Betting Bookmaker reviews and affiliate offers No Yes
Academy A coaching academy taking trials No Yes

Every pack ships an Elementor build as well as a block build — the two light packs use their parent demo's — so no demo locks you out of Elementor and none of them requires it. With Elementor active the importer picks that build for you and the card says so — see Importing a demo.

WooCommerce is only needed by Team and E-gaming, the two packs that ship products. The other six sell nothing and never mention a cart, though you can add a shop to any of them later.

Each pack also pins a look: its palette, fonts and section CSS, and in some cases the shop and post skins as well. Where a pack leaves a slot on Automatic, that slot follows whichever demo is active, which is what you want unless you are deliberately mixing two demos' styling. That is done afterwards, in Style pickers: automatic or a demo name.

Tipster: verified predictions

Verified sports predictions — every pick time-stamped, every record public.

A tipster and analysis service that sells access to picks. The site is built around a claim you can check: every prediction records the selection, the odds at publication, the stake and the profit, and every analyst carries a public record. An access term on each prediction — free, premium or private — is what separates the tiers.

It imports 11 pages, and behind them Predictions, Fixtures, Competitions, Reviews and People, the analysts, each with a profile carrying their subscription price, cadence and markets. It sells no products: the paid tier is a price on the analyst, not a checkout. It pins the Tipster look for the site, the news pages and single posts, runs its news pages with a sidebar on the right, and points every call-to-action button at /pricing/ until you change that in Business info.

The Tipster demo front page.

Tipster Light: Tipster in a light palette

The same tipster service on light paper — same pages, same content, different colours.

Not a second site: the same 11 pages as Tipster, the same predictions, fixtures, competitions, reviews and analysts, the same layouts and the same words. What changes is the colour layer — light grounds and dark text in place of the dark chrome. Picking between the two is only a matter of which card you import.

It carries no content of its own; the import reads Tipster's pages, images and records and dresses them in the light palette, so everything said about Tipster above applies here too. Its style pickers name Tipster rather than sitting on Automatic, because the light pack runs on Tipster's stylesheet, fonts and templates with the light palette on top. There is no live preview site for it yet, so its card carries no Preview button.

E-gaming: an esports organisation

Polaris Esports — four divisions, players and creators, a match centre with live and results, competitions, a newsroom, the club store and match alerts.

The largest demo by block count and the most modular. An organisation with several game divisions rather than one squad, so the roster is split by division and the people are both competitors and streamers.

It imports 24 pages and the widest spread of content types: Divisions, Players, Creators, Streams & VODs, Fixtures, Competitions, Clubs, Sponsors and Team. Players carry an esports profile — real name, season statistics, channels, career history, achievements and equipment — beside the football-style panels. It is the second pack that sells products, apparel and gear, so WooCommerce belongs on the site before you import.

It pins the E-gaming look for the site, the news pages, single posts, the shop and the product page. Its action link points at /watch/, the match centre.

The E-gaming demo front page.

News: a sports newsroom

Independent sports journalism — results, analysis and the money behind both.

A publication, not a club site, and the busiest of them editorially: a scores board, section fronts, live blogs, a transfer centre, a video hub, a newsletter and ad slots for sponsors.

It imports 15 pages, more posts than any other pack — the articles are the site — and a deep data model: Fixtures, Competitions, Clubs, Standings, Transfers, Live updates, Newsletter issues, Ad slots and a Team of staff writers. It sells no products.

This is the one demo that leaves every style picker on Automatic, including the site preset. That is deliberate — a news site is meant to be re-skinned, so pick any preset on Theme styles and the newsroom layout wears it. Its news pages use a sidebar on the right and its action link points at /newsletters/.

The News demo front page.

News Light: News in a light palette

The same newsroom on light paper — same pages, same articles, different colours.

The News demo in a light palette: the same 15 pages, the same posts and the same data model, down to the live updates and the ad slots. Only the colours differ, so the choice between the two cards is a choice of palette, not of site.

It ships no content of its own — the import reads News's pages, images and records — so everything above applies here as well. Unlike News, which leaves every style picker on Automatic, this pack names News in them, because it runs on the newsroom's stylesheet, fonts and templates and puts the light palette over them. There is no live preview site for it yet, so its card carries no Preview button.

Team: a football club

A football club's official site — fixtures, table, squad, tickets, membership and the club store.

Built for the fictional Meridian FC: next match and last result, the league table, the squad with per-competition season figures, ticket and membership pages, sponsors, and a shop selling kit and accessories.

It imports 26 pages — ticketing, membership and store pages included — and Players, Fixtures, Competitions, Clubs, Standings, Sponsors and Team. It is one of the two packs that sells products, so install WooCommerce before importing it or the store arrives empty. It is also the one demo whose admin menu is not filtered, so every sports content type in the theme is listed while it is active.

It pins the Team look everywhere it can: site, news pages, single posts and — unusually — the shop and single product too, so the store reads as part of the club rather than a generic catalogue. Its news pages run full width. Its action link points at /tickets/.

The Team demo front page.

Betting: bookmaker reviews

A bookmaker-review affiliate site — reviewed sportsbooks, a compare table, offers, guides, editorial predictions, sport-by-sport coverage and a responsible-gambling hub.

An affiliate publication for the fictional Oddsmark. It earns from outbound links, so it is built around comparison: a filterable table of bookmakers, a compare screen, signup offers, and a library of guides organised by topic and by level.

It imports 28 pages and Bookmakers, Offers, Guides, Predictions, Fixtures, Competitions and People for the editorial team. Best-for tags on a bookmaker are the filter chips you see on the home table, the compare page and the reviews. It sells no products. It pins the Betting look for the site, the news pages and single posts, runs its news pages full width, and points its action link at /compare-bookmakers/.

This demo ships a responsible-gambling hub for a reason. If you launch a gambling-affiliate site, the age statement, the licence disclosure and the help links are usually a legal requirement in your market, not decoration. Keep those pages and put your own regulator details in them.

The Betting demo front page.

When you have chosen, go to Importing a demo, and read its first two sections before you click anything.

Academy: a sports academy

Programmes, coaches, fees and term dates, holiday camps, a trial booking and the academy news.

Built for a fictional tennis academy, Rowan Hall, and the most easily repurposed of them — a swimming club, a football academy or a single coach's business all fit the same structure. The site's job is to fill sessions, so everything points at the trial enquiry.

It imports 19 pages and three content types: Programmes, Coaches and Camps, the last carrying its own dates and days. It sells no products — fees are published on the page and the enquiry form does the converting, so there is no checkout to configure and no gateway to set up.

It pins the Academy look for the site, the news pages and single posts, and leaves the shop and product styles on Automatic: install WooCommerce to sell club kit and the shop simply follows the academy palette. Its news pages run full width and its action link points at /book-a-trial/.

The Academy demo front page.

Importing a demo

An import turns an empty install into the demo you picked: pages, images, menus, sports data, settings, colours and fonts. It takes a few minutes and it is the fastest way to a finished site. It is also the one destructive thing in this theme, so read the first two sections before you click Import.

The Demo import screen

Go to Appearance → Theme Options → Demo import. It is the first entry in the left rail, above the Design group, and its lead reads Set up the whole site in one click.

The Demo import tab shows one card per demo, with the active one marked.

One card per demo, each with its thumbnail, title and pitch; the demo you are already running is marked Active demo. Above the cards, always, is the warning Importing a demo removes and replaces the content on this site. Take it literally — see What an import writes.

Above that, and only when there is something to say, sits a second panel: Your hosting may not have enough capacity to import a demo, followed by the settings that are too low, each with your value and the recommended one. It stays hidden while everything passes, because a panel that is always green teaches you to skim past the one time it is not. If it appears, stop: a failing row means the import can halt part-way and leave the site half-built. Send the list to your host — it is the same data as Appearance → Theme Options → System requirements, which has a Copy all as text button. Fixing a memory limit takes your host minutes; repairing a half-imported site takes you hours.

One demo per site

An import is a full replace, not a merge, and a site holds exactly one demo at a time. You cannot run the club demo's fixtures page beside the betting demo's compare table.

That is not a licensing limit, it is how WordPress works. Templates, template parts, options and Global Styles all resolve site-wide by slug: there is one single template, one header part, one palette, one anps_demo_style. None can be scoped to "the pages from demo four", so an import clears every demo's objects rather than only its own — otherwise the last import's templates fight the new one's.

Nothing about an import can be undone. There is no rollback and no half-imported state worth keeping. On a site with content you care about, take a full backup — database and uploads — first. If you only want to look at a demo, import it on a staging site or a fresh install.

If you want eight sites, use eight installs. To mix looks rather than content, use the style pickers.

Import, Re-import and Preview

Import demo installs that pack. The browser asks you to confirm first — This will DELETE all pages, posts, products and menus on this site and replace them with the demo — and only then does anything happen.

Re-import is the same button on the demo that is already active. Use it after breaking something beyond repair. It is just as destructive as a first import: your edits to the demo's pages go too. Re-importing does not duplicate your media library — an image the previous import already brought in is reused rather than copied again.

Preview opens that demo's live preview site in a new tab, and appears only on packs that ship a preview address. It changes nothing here.

A demo that needs a plugin will say so

Team and E-gaming build a shop, so they need WooCommerce. If it is not active, those two cards carry the notice This demo cannot be imported yet and their import button is dead — nothing is deleted and nothing is written. Install and activate WooCommerce on the Plugins screen, reload the Theme Options page, and the card unblocks itself.

Activate it before you import, not after. There is no "import now, add the shop later" path: without WooCommerce the products and the cart, checkout and account pages cannot be created at all, so the importer refuses the pack rather than building you a club site with an empty shop and dead Buy links.

If the pack ships an Elementor build and Elementor is active, the card also shows an Elementor version marker. That is what you will get: the importer loads the Elementor build instead of the block build, automatically, with no setting to choose. Pages, settings, products and colours are identical either way — only the editor differs. To get the block version, deactivate Elementor first, and see Building pages with Elementor.

Once you confirm, a dialog headed Importing the demo takes over the screen. It cannot be dismissed, on purpose: from the first step onwards there is nothing to return to. It names each phase as it runs — clearing the old content, applying the settings and colours, reading the content, reconnecting it, building the menus. Leave the tab open. A second import started while one is running is refused, and nothing is changed.

What the result actually tells you

A clean run reads Demo imported. Your site now matches the demo. — and that sentence now appears only when everything really did arrive.

If anything fell short you get The demo did not import completely, followed by the counts: 412 of 480 pages, posts and menu items arrived, and, when the pack ships images, 96 of 120 images arrived. Anything the importer could not read is listed under What did not import. The screen then tells you a retry is safe, because a re-import starts over from a clean site — and if it stops in the same place every time, the host limits on the System tab are the usual cause: an import that needs more memory or more time than the server currently allows.

Separately, a Worth a look notice can appear whether or not the import was complete. Those are things the demo could not finish setting up — a menu that matched no menu location, no page to use as your home page, permalinks left on Plain. None of them stopped the import; each is worth two minutes.

The item counts cover pages, posts, sports records and menu items. Images are counted on their own line because a re-import deliberately leaves your media library in place.

What an import writes

Written Detail
Pages The demo's pages, and its front page is set as your home page
Posts The demo's articles, with their categories and tags
Products From Team and E-gaming only, which is why those two need WooCommerce active before you import
Media Every image the demo uses, copied into your media library from the files that ship inside the plugin
Menus Rebuilt from scratch and assigned to the theme's menu locations
Sports content Fixtures, players, predictions, bookmakers and the rest, for that demo
Theme options Site title and tagline, styles, layout, business info, action link, currency and units
Global Styles The demo's colour and font layer, written where the Site Editor reads it

Two quieter passes matter. Relations between records — a prediction's fixture and analyst, a fixture's clubs, a table row's club — are reconnected after the content lands, because the numbers in an export point at the designer's database, not yours. And the demo's kickoff times are shifted onto your site's clock, so a fixture list reads as upcoming, not as last year.

What survives an import

Left alone: your users, with roles and passwords untouched; your media library, where the demo's images are added beside your own; other plugins and their settings, none of which are deactivated; and WooCommerce's own pages — shop, cart, checkout, my account, terms, refunds — along with the privacy policy page, because each is wired to an option and deleting it would break a feature no demo replaces.

Deleted and rebuilt: every page, post, product and product variation, product categories and tags, every navigation menu, any template or template part a previous demo installed, and every SportPulse record — fixtures, players, predictions, guides, programmes. So an import is safe on a fresh install, safe on a site you have only been styling, and never safe on a live site carrying your own content.

After the import

  1. Look at the front end, then at Settings → Reading. The importer sets the demo's home page as your front page; change it there if you want another one.
  2. Check the menus. They are rebuilt and assigned, but if you had your own locations in mind, set them in Appearance → Menus — see Menus.
  3. Put in your own business details. Appearance → Theme Options → Business info holds the name, phone, email, address, opening hours and the action link every call-to-action button uses. Until you change them, your site says it is Meridian FC or Oddsmark.
  4. Replace the demo's words and pictures. Work through the pages in Building pages and the records behind them in Sports content and data.

Treat the demo's photography as placeholder content: it is there to make the layout read correctly, and what your purchase covers is set out in licensing/README_License.txt in your download. Replace the images before you launch — Performance and going live has the pre-launch list.

Starting empty instead

You do not have to import anything. Activate the theme and the plugin, skip this screen, and you still have a working block theme: every SportPulse block is in the inserter, Theme Options works, and the base templates render your pages with a plain header and footer. Choose this if you are building to your own design, or migrating a site that already has content. You get no demo pages, no sample data and no pinned look — every style picker stays on Automatic, which with no demo active means the theme's own defaults, and the admin menu lists every sports content type because nothing is filtering it. Start at Building pages.

Switching demos later

Importing a second demo is the same operation: open the screen, click Import on the other card, confirm. Everything in What an import writes and What survives an import applies again, so the first demo's pages, menus and records go, and your work on them with them.

One thing looks alarming and is not: the admin menu changes. Seven of the eight demos show only the content types they use, so moving from the news demo to the academy demo makes Clubs, Standings and Transfers disappear. Only the menu is hidden — the type is still registered, and the menu returns for as long as anything of that type exists, including a draft, so a club you add by hand on an academy site brings it back. People, Locations, Team and Messages are never hidden, and the Team demo filters nothing at all. What a switch really deletes is the previous demo's records, pages and menus, and that is the import rather than the menu.

Theme Options, tab by tab

Everything the theme lets you set outside the editor lives on one screen: Appearance → Theme Options. You need the edit_theme_options capability — an administrator has it, an editor does not. The screen is part of the Anps Theme Plugin, so if it is missing, the plugin is inactive.

Each field on this screen is one setting saved on its own, and each one says what it does under its label. This chapter is the long version: what the tab is for, and every field with its values and its default.

How this screen is organised

A rail on the left lists the tabs. Demo import leads on its own, above the rest, because on a fresh site it is the first thing to do — it is covered in Importing a demo. A build without the importer says so instead of offering it.

The remaining nine tabs are grouped:

Group Tabs
Design Theme styles, Header, Footer, Site layout
Content Blog, WooCommerce
Business Business info
System Advanced, System requirements

The WooCommerce tab appears only while WooCommerce is active; with no shop plugin there is nothing behind those fields, so the tab is hidden rather than shown broken.

Each tab saves on its own. Fields you have changed but not saved are held until you press the tab's save button, so switching tabs mid-edit is not a good idea.

Theme styles

Colours and fonts for the whole site. These are written to the Site Editor's own styles, not to a private table, so Appearance → Editor → Styles shows the same values and the editor canvas matches the front end.

Preset picks a whole demo's look at once — its colours, fonts, section CSS and its header, footer and shop. It is the blunt instrument, and it is the one most people want. Automatic — follow the imported demo is the default and keeps you in step with the demo you imported; see Style pickers: automatic or a demo name. The named entries are the theme's own style variations, so a demo may offer more than one (a light and a wire treatment of the news look, for instance). Applying a preset overwrites the six colours below it.

Six colour pickers follow, in the order most people think about them: Page background, Text, Primary, Secondary, Accent and Buttons / CTA. Every pattern in the theme references the colour slug and never a raw hex, so changing one here recolours every button, link and accent that uses it, site-wide, in one save. The rest of the palette is derived and rides along with the preset.

Keep contrast readable. Page background against Text is the pair that decides whether your site can be read at all. The screen measures your choices as you make them — under each picker it names the tightest pairing that colour is involved in and its ratio, and warns you when one falls below the minimum the theme is checked against. It never blocks the save, so the decision is still yours: check it on a phone in daylight before you ship a dark background with mid-grey text. Accessibility explains what is measured and what is not.

Fonts offers Heading font and Body font, each a list of what the site already has. Add a Google Font… fetches a family and installs it for you; Upload a font… hands you to the Site Editor's font library for a file you own. Once installed, a face appears in both lists.

Type scale exposes only the four sizes worth setting per site: Hero / H1, Section heading (H2), Sub-heading (H3) and Body text. Sizes are in pixels, 12 to 200; leave one blank to keep the theme default, which is fluid and scales with the viewport. Everything else in the type system follows these four. More on the whole system in Colours, fonts and spacing.

The Theme styles tab, with the preset picker above the six brand colours.

The strip at the top of every page. The menu inside it is not here — it is in Appearance → Menus, described in Menus.

Header layout re-lays out the header site-wide. Three shapes, not demo names: Standard — logo left, actions right (the default), Centered — logo and nav stacked, Minimal — logo and nav only. A demo pack sets this too, so importing one may change it.

Top bar style is a style picker: it chooses which demo's top bar to show without touching the rest of the site. Default Automatic — follow the demo.

Three logo slots: Main logo, Sticky logo and Mobile logo. Main is the master switch — leave it empty and the site title is used as the logo, and the other two do nothing. Set it, and the sticky logo swaps in once the page scrolls and the header pins, while the mobile logo is used on small screens. Both fall back to the main logo when empty. All three are media-library images, so they keep their srcset and survive a domain change.

Three switches under Header elements, all off by default:

Switch On means
Disable sticky header The header scrolls away with the page instead of pinning
Disable top bar The strip above the header is removed site-wide
Disable search icon The search form leaves the header; search elsewhere is unaffected

The Header tab, showing the layout cards, the logo slots and the three switches.

What sits in the footer is content, edited in Appearance → Editor → Patterns; this tab sets its shape. See Header, top bar and footer.

Footer columns is 2 columns, 3 columns or 4 columns, default 4 columns. It stacks to one column on phones.

Copyright text is the line at the very bottom, default © {year} {site}. {year} and {site} are replaced with the current year and your site title, so the year stays right without anyone editing it.

Sticky mobile bar gates the Call / action / Directions bar pinned to the bottom of a phone screen. Three values:

Value Behaviour
Automatic — follow the demo Shown only on demos designed around the bar, so an import never adds one to a site that was not built for it
Always show Shown on every page
Never show Not rendered at all

Automatic is the default, and none of the eight SportPulse demos opts in — so if you want the bar, choose Always show. Its contents come from the data you already have: a slot with nothing behind it — no phone number, no address — is left out rather than rendered dead.

The Footer tab, with footer columns, copyright text and the mobile bar setting.

Site layout

Content width (px) is the maximum width of the constrained content column: 600 to 1920 in steps of 10, default 1200. It applies to the whole site and to the editor, so what you build is the width you get.

It does not affect sections with a full-width background — those still bleed edge to edge, and only the content inside them is capped. It is also not a page-by-page setting: one number, whole site. A demo pack sets it to match its design.

The Site layout tab and its single content-width field.

Blog

Styles the news page and your posts. Which page lists your posts is core's setting, in Settings → Reading → Posts page; without one, the fields here have nothing to style. Writing and organising posts is News and the blog.

Posts per row is 2 per row, 3 per row or 4 per row, default 3. It collapses to two and then one on smaller screens, and a single Post grid block can override it from its own sidebar.

Sidebar adds a column beside the news page and your posts holding search, categories, recent posts and tags:

Value Result
No sidebar (full width) Content only — the default
On the right Sidebar after the content
On the left Sidebar before the content

On phones the sidebar always sits under the content. What is in it is edited in Appearance → Editor → Patterns → Blog sidebar.

News page style and Single post style are both style pickers, and they are deliberately independent: you can pair one demo's article styling with your own news page. The list one covers the post list and the category, tag, author and date archives; the other covers one open post.

The Blog tab, with the post-list controls and the two style pickers.

WooCommerce

The shop grid and how much of it is for sale. Payments, shipping, tax, emails and accounts all stay in WooCommerce → Settings — this theme adds no second copy of them.

Products per row (1 to 6) and Rows per page (1 to 12) are WooCommerce's own catalogue settings, surfaced here because they decide how the shop grid reads. Products per page is the two multiplied, and the card shows you that number as you change them.

Showcase mode — nothing can be purchased turns the whole store into a catalogue: prices still show, but Add to cart, the cart and checkout are removed. It is the "enquire, don't buy" storefront, and it is off by default. Product editing lives in Shop and products.

The WooCommerce tab, with the shop grid fields and showcase mode.

Business info

Typed once here, then read by the header, the footer, the contact page, the map, "Open now" and your structured data. Nothing on this tab is required, and each empty field simply removes what depends on it.

Contact holds Business name, Phone, Email and Address. Phone becomes tel: links wherever the theme shows a number. Address is one free-text block, written the way it appears on your door; it feeds the map, the Directions button in the mobile bar and your structured data, and without it the map has nothing to point at.

Opening hours is a seven-day grid, Monday first, with up to six open–close ranges a day — enough for a split shift and an overnight tail. A day with no ranges is closed: there is no separate closed flag to contradict the times. The hours drive "Open now" wherever the theme shows it, and are published as structured data.

Primary action link under Call to action is where every call-to-action button in the theme points — the one in the header, the one in the mobile bar, and the one in each pattern.

An empty action link removes the buttons. Leave Primary action link blank and those buttons are not rendered at all. A button that goes nowhere is worse than no button, so the theme omits it rather than pointing it at your home page.

Search engines has Business type (for Google), which sets @type on the LocalBusiness node in your structured data — LocalBusiness by default, with Organization, SportsActivityLocation, Store and others in the list. Let an SEO plugin own structured data hands the whole job to Yoast or Rank Math and adds no nodes of its own; see SEO and structured data.

Newsletter decides what happens after a signup. Every signup — newsletter forms and Follow buttons — always lands in the site's own Messages inbox; Where signups go adds a destination on top of that:

Where signups go Also does this
The Messages inbox only Nothing leaves your site — the default
Also post to a form URL (any provider) Posts the address to Form URL
Also add to a Mailchimp audience (API) Adds the address through Mailchimp's API

For the URL route, Email field name is what that provider's form calls its email field — EMAIL for Mailchimp and Brevo, fields[email] for MailerLite, email_address for ConvertKit — and Extra form fields takes one name=value per line, where {email}, {tags} and {name} are filled in for you. For the API route you need a Mailchimp API key (Account → Extras → API keys) and a Mailchimp audience ID (Audience → Settings → Audience name and defaults); Double opt-in — new members must confirm by email is a switch on the same card. The forms themselves are in Forms, contact and newsletter.

Spam protection takes a Turnstile site key and a Turnstile secret key from Cloudflare Turnstile, which is free. Both keys or neither: with one of the two filled in, the protection cannot run. It guards the built-in contact form.

The Business info tab, with contact details, opening hours and the newsletter card.

Advanced

Custom CSS is added to every page of the site, and survives theme updates because it is a setting rather than an edited file. Reference the theme's own tokens so your CSS follows preset and colour changes instead of freezing a value:

.my-band {
	background: var(--wp--preset--color--primary);
	max-width: var(--wp--style--global--content-size);
}

Backup sits below it. Export settings downloads every anps_ setting on this screen as a file; Import settings from a file reads one back. Imported values go through the same validation as typing them in, so a file cannot write something the screen could not. Two things do not travel, on purpose:

Because every key carries the shared anps_ prefix, a backup is portable between ANPS themes: your business info, hours and logos move with you, and keys the new theme does not have are dropped.

The Advanced tab, with the Custom CSS box and the Backup card.

System requirements

What this host provides against what SportPulse needs, in four tables: Server, PHP extensions, WordPress and SportPulse. Each row shows the value found, the value wanted, and a verdict — OK, Check or Fix. A Fix row is something the import or the theme will genuinely struggle with; a Check row is a recommendation.

Copy all as text puts the whole report on your clipboard as plain text. Paste it into a support ticket and the conversation starts with facts instead of guesses. See also Performance and going live.

The System requirements tab, with the four grouped tables and Copy all as text.

Style pickers: automatic or a demo name

Nine settings across this screen ask the same question — which demo's look should this one thing wear — and they all offer the same values: Automatic — follow the demo first, then one entry per demo the theme ships a stylesheet for. The list is derived at run time from those stylesheets rather than written down anywhere, so it is always exactly what your copy of the theme can actually render.

Automatic is the default for all nine and means "whatever demo I imported". Naming a demo instead mixes that one demo's look into that one slot and leaves everything else alone.

Picker Where it is What it restyles
Preset Theme styles Everything: colours, fonts, section CSS, header, footer and shop
Top bar style Header The strip above the header
Header style — The header strip
Footer style — The footer
News page style Blog The post list and the category, tag, author and date archives
Single post style Blog One open post
Shop style — The shop and category pages
Product style — A single product page
Location style — A single location page

The four with a control on this screen are the ones a buyer changes. The other five are set by the demo pack you imported, and stay in step with it through Automatic unless a developer writes them directly. The top bar, header and footer swap a template part; the rest swap a whole template.

A demo that ships no variant changes nothing. These pickers only take effect where the demo you named actually ships a file for that slot. If it does not, the shared version renders and the page looks exactly as it did. That is not a bug — it is the fallback working.

Sidebar on the Blog tab is not one of these. It is a plain three-value setting and has nothing to do with demos.

Write-only secrets

Two fields on this screen are stored write-only: the Turnstile secret key and the Mailchimp API key. Both are shared secrets that would be a liability in a settings file or an API response, so the theme never reads them back.

Write it down somewhere else. A saved secret is masked and never shown again, is absent from Export settings, and cannot be recovered from the database through this screen. If you lose it, generate or copy a fresh key from Cloudflare or Mailchimp and type it in again. That is the only route back.

Everything else on the screen reads back normally, which is why a backup is useful in the first place — see Advanced.

Menus

SportPulse uses classic WordPress menus rather than menus embedded in a template. You build them in Appearance → Menus — the screen every WordPress user already knows — and assign each one to a location the theme publishes. Nothing about a menu lives inside the header, so re-saving or resetting the header can never orphan your navigation.

Importing a demo builds its menus for you and assigns them, so the first thing most people do here is rename an item or add a page.

Build the menu

  1. Go to Appearance → Menus.
  2. Pick a menu from Select a menu to edit, or click create a new menu, name it and press Create Menu.
  3. Add items from the panels on the left — Pages, Posts, Custom Links, Categories, and one panel per sports content type. Those panels list every type the plugin registers, not only the ones your demo uses, because the types stay registered whichever demo is active. Under Screen Options you can hide the panels you never touch.
  4. Drag an item slightly right to nest it under the one above; that is what makes a dropdown.
  5. Tick a location under Menu Settings → Display location, then press Save Menu.

A menu can sit in more than one location, and a location holds one menu.

Only two levels are rendered. The header draws top-level items and their children. Nest an item three deep and it is dropped silently — it will not appear anywhere on the site. Flatten the structure or link the deepest pages from the page body instead.

The Appearance to Menus screen, with a menu assigned to the Primary header location.

Seven locations are registered. The header uses one; the rest are the footer's link columns and the utility strip above the header. Each column is a separate menu, which is what lets you retitle and reorder them independently.

Location Where it renders
Primary (header) The main navigation in the header
Top bar — Utility The thin strip above the header, for links such as fixtures, tickets or the store
Footer — Portal First footer link column
Footer — Company Second footer link column
Footer — Legal The legal column — privacy, terms, responsible gambling
Footer — Topics A generic extra column, used by the demos with five footer columns
Footer — Guides The second generic extra column

You do not need to fill all seven. A location with no menu assigned renders nothing, so the demos that use three footer columns simply leave Topics and Guides empty.

The footer's fourth column is the brand block — logo, tagline, social links. That is content, not a menu, and it is edited as a template part; see Header, top bar and footer.

The current page

The item matching the page you are on is highlighted automatically, and so is its parent when you are on a child page. WordPress writes the class itself, so this works whether the item was added as a page, a post, a category or a custom link — you do not have to mark anything.

If the highlight looks wrong, the usual cause is a Custom Link pointing at a URL that differs from the real permalink, such as one with a missing trailing slash or a stale ?page_id=. Add the item from the Pages panel instead of typing the address and the match becomes exact.

Long dropdowns become a mega menu

A top-level item with six or more children stops being a narrow dropdown and opens as a full-width panel laid out in columns. It is the case a guide section or a long list of sports needs, and it happens by itself — there is no setting for it in Theme Options.

Two demos use it — Tipster and News — and so do their light twins, which run their parent's header. Team, E-gaming, Academy and Betting pin their dropdowns to the ordinary narrow panel on purpose, because their headers are designed around a compact menu. On those four, a sixth child stays in the list.

To decide it yourself per item, use the item's CSS Classes field:

Class Effect
anps-mega Forces the full-width panel, however few children the item has
anps-no-mega Keeps the narrow dropdown, however many children it has

The CSS Classes field is hidden until you switch it on: open Screen Options at the top right of Appearance → Menus and tick CSS Classes. The class goes on the top-level item, not on a child.

The menu on phones

Below the header's breakpoint the menu collapses behind a burger button. Tapping it opens the panel; tapping again closes it. Submenus are not dropdowns there — every child list is already open and indented, so a visitor scrolls one list instead of hunting for tap targets. That is also why the mega-menu rule is a desktop-only affair: on a phone a long list reads the same either way.

The burger and the panel are part of the menu itself, so they follow whichever demo's header you are showing.

The menu open in the phone drawer, with submenus expanded as indented lists.

If the header shows no menu

Nothing is assigned to Primary (header). When you are logged in as an administrator the header shows a link reading Assign a menu to this location (Appearance → Menus) in place of the navigation; visitors see nothing at all, which is why this is easy to miss after a manual setup.

Work through these in order:

  1. Open Appearance → Menus and check that a menu exists at all — a fresh site with no demo imported has none.
  2. Check Menu Settings → Display location on that menu and tick Primary (header).
  3. Press Save Menu. Assigning a location without saving changes nothing.
  4. If a footer column shows a heading with nothing under it, the same fix applies to that column's location from the table above.

If the header is missing entirely rather than just its menu, the problem is the header part or the top bar switch, not the menu — see Header, top bar and footer. If a whole demo's navigation vanished after switching demos, the menus of the demo you left are still in Appearance → Menus; reassign the one you want.

Building pages

Every page in the demos is a stack of bands. A band is one block that draws a whole strip of the page — a hero, a row of figures, a card grid, a table, a price list, a form — and everything that band shows is one of its own settings. There is no page-builder layer underneath: these are ordinary WordPress pages made of blocks, edited in the block editor you already use for a post. Elementor is offered as an alternative, not as the foundation — see Building pages with Elementor.

The block editor with a demo page open and one band selected.

How a demo page is built

Open Pages, pick a page and edit it. In the list view, at the top left of the editor, you will see six to a dozen blocks, one per band, in the order they appear on screen. A band is not a group of columns you have to rebuild — it is one block that already knows how to lay itself out on a phone and on a desktop.

Bands render on the server, so the canvas shows the real thing rather than an approximation, and a band has no editable text on the canvas: click it and every field appears in the settings sidebar on the right.

Editing what the demo imported

Work down the sidebar panels of the band you selected. Each panel is a group of plain fields — text, a number, a toggle, a drop-down, an image picker, a link, or a repeating list of rows. Save the page and the front end matches.

Edit the demo page rather than starting a blank one: it already has the right bands, in the right order, at the right widths. Delete a band you do not want instead of emptying it, and duplicate one to repeat a pattern further down.

An import replaces pages, it does not merge them. If you edit the demo pages and then re-import the same demo, your edits are gone. Read What an import writes first.

Adding a band to a page

Use the inserter — the + button — and type the name of the block. Sport Pulse blocks are grouped under Theme, with a handful of the generic ones under Design and Widgets, so searching by name is quicker than browsing.

Stay inside your demo's own family, described below. Mixing one demo's bands into another's page works — no block is ever unregistered — but the two were styled for different palettes and typefaces, so the join will show.

The block families

The plugin registers a shared set of blocks every demo uses, plus one family per demo, named by prefix.

Family What it covers
Shared, no prefix Page furniture, business data, commerce, content lists, sports bands
tipster- The tipster workspace bar, its rail and the featured pick
news- Scores board, section heads, live blog, transfer centre, video hub
team- Page heads, next match, league table, player grid, ticket list
egaming- Hero, division cards, match list, roster, watch page
academy- Hero, programme cards, coach cards, fees, enquiry form
betting- Home hero, bookmaker table, offer cards, guides, review bands

You never need the full list to build a page. The demo already used the blocks it needs, and the inserter search finds the rest by name. When you do meet a band you do not recognise, Block reference names every one of them, family by family, with the description the editor shows — it is generated from the plugin itself, so it is never out of date.

The blocks you will edit most

The page hero, or page head

The masthead of a page: kicker, headline, an accented phrase inside the headline, lede, buttons, and optionally a photograph, breadcrumbs, trust chips and a row of figures. The shared page-hero also has a Text comes from setting, so on a single item or an archive it can take its title and lede from the post or the term instead of from what you typed.

Demo Hero block
Tipster page-hero
News news-window-hero, and news-section-head on section archives
Team team-page-head
E-gaming egaming-hero on the home page, egaming-page-head elsewhere
Academy academy-hero and academy-page-hero
Betting betting-home-hero and betting-page-hero

The section head

team-section-head, news-section-head, egaming-section-head, academy-section-head and betting-section-head draw the small title block that introduces a band: kicker, two-tone heading, intro, and on the right either a button or a line of small print. The tipster demo has no separate section head, because every shared band carries its own Kicker, Heading, Accented phrase, Lede and action link fields.

The post grid, forms and the newsletter card

post-grid is the card grid used for the news list, for a latest-stories band on any page and for related articles under an article; its settings are covered in The post grid, option by option.

form is the shared contact form — heading, name, email, topic chips, extra fields you define, a message and a consent line — and academy-enquiry, egaming-enquiry, egaming-contact, news-contact and betting-contact-form are the demo-styled equivalents. newsletter-card is the single-field signup card used in sidebars and footers. Where submissions go is in Forms, contact and newsletter.

The rest of the daily handful

Block What it is for Key controls
stat-band A row of big numbers Style (inline, cards, bordered), Columns, Show icons, and per stat a Source of either Typed by hand or Counted from this site
faq Questions and answers as an accordion Question and Answer rows, Columns, Layout, Open the first answer, Add to FAQ schema
pricing Plan cards with a monthly or annual switch Per plan Name, Tagline, both prices, Features, Button label and URL, Highlight this plan; plus Currency symbol and Columns
people-grid A roster band drawn from People How many, Role, Order, Card shape, Narrowest card, Show the role line, Show a short bio
data-table A real table that scrolls sideways Where the rows come from (Typed here or A live dataset), Columns, Rows, Header row, First cell names the row, Striped rows, and what to do when there are no rows

stat-band and data-table deserve a second look: both can print what you typed or read the site's own content, which is how a figure stays true after you publish another twenty predictions.

The controls inside a block

Four control types repeat across every band. Learn them once.

A repeater is a list of rows — stats, questions, plans, table rows. Each row is numbered, with arrows to move it up or down and a bin to delete it, and an Add button underneath. Row order is display order.

A media control stores two things for one image: the attachment id and its URL. That is deliberate — the page can print the URL directly while still knowing which library item it came from, so alternative text and image sizes keep working. Use Select image, Replace and Remove.

A link control is a single URL field. Paste a full address for an external link or a site path such as /tickets/ for an internal one. A band with an empty link usually hides its button rather than rendering a dead one.

A term drop-down lists a taxonomy's terms with an "All" option first — that is how you point a grid at one category or one role.

Everything a band shows on screen is one of these values. No heading, figure, button label or photograph is hardcoded in the theme, which is why you can turn a demo page into your own page without touching a template.

Patterns you can drop in

Patterns are ready-made arrangements of blocks, in the inserter's Patterns tab, grouped into categories the theme registers under its own name: Hero, Services, Pricing, Calls to action, Contact, Reviews and trust, and Shop. Insert one and it becomes plain blocks in your page, with no link back to the pattern — edit it freely.

The parts that surround every page — top bar, header, footer, blog sidebar and sticky mobile bar — are template parts, edited from the Site Editor's Patterns screen. That is Header, top bar and footer.

Page templates

A page's template decides what surrounds its content. Pick one in the editor sidebar under Page → Template.

Template Use it for
Default Ordinary pages: header, content, footer
No title A page whose first band already carries the title
Landing (no header or footer) A standalone landing or campaign page
Elementor (full-width content) Any page built with Elementor
Elementor landing (no header or footer) An Elementor page with no site chrome
Tipster dashboard The tipster demo's signed-in workspace

An Elementor page must use one of the two Elementor templates, or its full-width bands stay trapped inside the constrained content wrapper.

Setting your front page

Importing a demo points Settings → Reading at the pack's own pages: the page slugged home becomes the static front page, and the demo's news index becomes the posts page. To change either, return to Settings → Reading, choose A static page and pick both there. Never delete the page you set as the posts page — the news archive has nowhere to render without it.

Full-width and constrained bands

Content is constrained to 1200 pixels by default; change that in Appearance → Theme Options → Site layout, described under Site layout. Individual bands can escape it: select a band, open the toolbar alignment button and choose Wide width or Full width. A full-width band runs its background to both edges of the window while keeping its text on the same measure as the rest of the page. A few heroes — the academy and betting page heroes among them — are full width only, because a boxed hero with a photograph bleeding off one side is not a layout anyone wants.

Sports content and data

Beyond pages and posts, the plugin registers the sports records the demos are built on: fixtures, competitions, clubs, players, predictions, programmes, bookmakers and the rest. You edit them on ordinary WordPress edit screens, and the blocks on your pages read them. Nothing on a match page, a squad list or a comparison table is typed into the page itself.

The admin list screen for one of the sports content types.

Why the admin menu changes per demo

The admin menu depends on the demo you imported: a betting site has no use for a Divisions screen, so it does not get one. The important half of that sentence is the half you cannot see — every content type is always registered. Only the menu is hidden. Nothing is unregistered, nothing is deleted and no meta is dropped, so switching demos never orphans content.

Rule Effect
The active demo declares the type Its menu shows
The type already holds at least one post Its menu shows anyway
Neither is true The menu is hidden, the content and the type remain

People, Locations, Team and Messages sit outside the gate entirely and appear under every demo.

Two cases surprise people. The Team demo declares no list of its own, and an unrecognised demo — including a fresh install with nothing imported yet — is treated the same way, so on both you get roughly twenty sports menus at once, Bookmakers, Guides, Offers, Programmes and Camps included, none of which a club site uses. And on a site that has held more than one demo the menu is the union of everything that still has content, not a picture of the demo you imported last.

Shared content types

Two people-shaped types coexist, and they are not alternatives.

Screen What it holds Panels
People The sports roster: analysts, players in a directory, coaches, presenters, filed under the Roles taxonomy Profile — Subscription price, Cadence, Markets, Joined, Followers, Verified, WordPress user ID; Byline — Credited to
Team The newsroom staff list: a name, a portrait and a job title Newsroom — Section, Based in, Here since (year), Beats, Series (video team), User account

On a person, the subscription price is not decoration: it is what places them in the Pro or Free tier, and an Access tier term is derived from it automatically. On a team member, User account is the WordPress user whose byline this is — leave it empty and the person gets no story count and no profile link. The News, Team and E-gaming packs arrive with Team filled in. Neither a team member nor a message has a page of its own, so never link to one; the staff bands render those records in place.

Three taxonomies are shared across the model rather than owned by one type:

Taxonomy Attached to
Sports Posts, predictions, fixtures, competitions, people, clubs, transfers, and products when WooCommerce is active
Seasons Fixtures, competitions and people
Flags Posts, predictions and fixtures — curation flags such as featured or breaking

The post-side additions — the Feature and Video panels, Formats, Video kinds and Shows — belong to the blog and are covered in News and the blog.

Locations

Locations is your address book: the stadium, the academy site, the office. Each one has a Location details panel with Address, Phone, Email, Latitude and Longitude, an Order pickup point tick, a Getting here note and Opening hours, one open and close time per day. Leave a day blank to mark it closed.

Fill the coordinates in if you want a map that lands on the right building rather than in the middle of the postcode. Address, phone and hours are also what the contact page and the structured data publish — see SEO and structured data.

Fixtures, competitions and clubs

Used by the tipster, news, team, e-gaming and betting demos.

A fixture list on the front end of the club demo.

Screen What it holds Panels and taxonomies
Fixtures One match Fixture — Competition, Round or stage, Kickoff, Venue, Home and Away side, scores, formations, Clock, Half-time score, Attendance, Referee; plus Player of the match, Head to head, Team form, Team news, Timeline, Match statistics and Line-ups. Taxonomy: Fixture states
Competitions A league or tournament Competition — Short code, Country or region. Taxonomy: Seasons
Clubs A club, with its crest as the featured image Club — Short name, Code, Colour, Ink on that colour, Recent form, This is our club

Fixtures point at a competition rather than naming one, which is what lets a competition page list its own matches and table. The seven optional match panels are repeating lists of rows, so a full match report is data entry rather than page building. Tick "This is our club" on your own side: bands use it to decide which way round to draw a scoreline.

Predictions and analysts

The tipster demo's whole product, and the betting demo's editorial tips.

Screen What it holds Panels and taxonomies
Predictions One analyst's pick on one fixture Pick — Fixture, Analyst, Selection, Odds at publication, Stake, Profit, Settled at, Minimum price, Confidence, Edge, Settlement terms, Recommended book, Price history; Bookmaker prices — a row per book. Taxonomies: Access, Results, Pick states, Markets
Reviews A subscriber testimonial about one analyst None; the quote is the post content and the analyst is picked

A prediction is a ledger entry: published with a timestamp and settled once, because the public record is the thing being sold. Yield, hit rate and profit on a profile are all derived from these rows, so keep Stake and Profit honest.

Access is the paywall, and it is enforced on the server. A locked pick's selection and analysis never reach the page at all, so nothing can be revealed by disabling styles or reading the source.

Players, divisions and creators

The e-gaming demo's roster, plus the club demo's squad.

A match page from the e-gaming demo.

Screen What it holds Panels
Players A squad member Player — Squad number, Position group, Nationality, Date of birth, Height, Preferred foot, Joined, Signed from, Contract until, Shirt in the store; This season — a per-competition table of apps, minutes, goals and cards; Career — clubs with years, apps and goals
Divisions One e-gaming team inside the organisation Division — Short tag, Accent colour, Region, Headline, record lines; Figures, socials and honours — stats, channels, competitions in progress, achievements
Creators The content side of the roster Channel — Real name, Kind, Main platform and handle, Followers, Live now, Schedule line, Nationality; Profile figures — stats, platforms, weekly schedule, equipment
Sponsors A commercial partner Partnership — Tier, Category, Partner since, Agreement runs to, Rights, Website, Button label
Streams and VODs A broadcast, live, scheduled or finished Stream — who, platform and URL, watching and started for a live stream, match and offset from kick-off for a scheduled one, length, views and date line for a recording

Programmes, coaches and camps

The academy demo. Almost all of its front end comes from these three types, so their panels are long by design — the pages are assembled from the records rather than from typed copy.

The programmes page from the academy demo.

Screen What it holds Panels
Programmes A coaching programme Programme — Short name, Age tag, Badge, card text and points, Age range, Standard required, Training each week, Starting price, What is included, call to action, hero facts; then Who it is for and Weekly schedule; Coaching, Physical, Matches and Beyond the court; Term dates and Fees; Coaches, Facilities, FAQs and Next step
Coaches A member of the coaching staff Coach — Role, Group, Accreditation, Programmes line, Email, Site user ID; Profile page — philosophy quote, qualifications, coaching history, playing record, specialisms
Camps A holiday camp Camp — Dates, Days, Ages, Ability groups, half-day, full-day and full-week prices, Places left, Capacity; Camp page — ability groups, daily schedule, coaching team, what is included, what to bring, prices

Programmes and camps both reference coaches by picking them, so a coach's portrait and role appear on a programme page without being retyped there.

Bookmakers, offers and guides

The betting demo.

The bookmaker comparison table from the betting demo.

Screen What it holds Panels and taxonomies
Bookmakers A reviewed sportsbook Bookmaker — Mark letter, Brand colour, Rating, Best for, Welcome offer, Minimum deposit, Sports carried, Payment methods, Average margin, Withdrawal time, Features, Established, Reviewed on, Affiliate URL; Scores and Verdict — six weighted scores, what you liked and did not, short verdict; three override panels for the offer, markets, odds, live, app, payments, support and FAQ sections. Taxonomy: Best-for tags
Offers One promotion Offer — Bookmaker, Minimum deposit, Minimum odds, Wagering, Expiry, Value score, Our view, Promo code, existing-customer variants. Taxonomy: Offer types
Guides The editorial library Guide — Starred, Updated, Reading time, Figure caption, Key takeaways. Taxonomies: Guide topics, Guide levels

The override panels exist so one bookmaker can contradict the guide's defaults without a bespoke page. Fill them only where the truth differs; an empty override falls back to the shared copy. Best-for tags are the filter chips on the comparison table, so keep them few and meaningful.

Transfers, standings and live updates

The news demo's data desk.

Screen What it holds Panels and taxonomies
Transfers One deal Deal — Player, Position, Age, From club, To club, Fee as printed, Fee value, Deal type, Source, Reliability, Verdict. Taxonomy: Transfer statuses
Standings One table row per club Table row — Club, Competition, Position and the full home and away split
Live updates One entry in a live blog Where it goes — Live blog post, Fixture, Time label, Order, Pinned, Embed URL. Taxonomy: Update tags
Ad slots A sponsored slot Advertiser — Sponsor, Link, Button. Taxonomy: Ad formats
Newsletter issues One sent issue Issue — Number, Lead line, Sent. Taxonomy: Series

Enter standings as home and away rows only: the league table block adds the columns up, so you never type a total and a corrected result never leaves a stale one behind.

Repeater fields on an edit screen

Most panels above contain at least one repeating list — line-ups, term dates, fee options, price rows, channels, achievements. A repeater on an edit screen behaves exactly like one in a block: numbered rows, arrows to move a row up or down, a bin to delete it, and an Add button underneath. Row order is display order.

A content type edit screen with its meta panels open.

Delete a row you do not need rather than blanking it. Most bands skip an empty row, and a band with no rows at all hides itself instead of printing an empty shell.

Relations are picked, not typed

Records point at each other. A prediction points at a fixture and at an analyst; a fixture points at a competition; an offer points at a bookmaker; a transfer points at two clubs; a live update points at a live blog post or a fixture.

Every one of those is a picker, not a text field — you choose an existing record from a list. Two consequences follow. Rename a competition and every fixture, table and page that mentions it updates, because they reference the record and not its name. And create the thing you will point at first: the competition before the fixture, the fixture before the prediction, the bookmaker before its offers. The other order means going back to finish the link.

News and the blog

Posts are still posts. What the theme adds is a set of skins for them, a sidebar you can switch on, a card grid with real options, and a handful of extra panels for the story types a sports site publishes — a video, an interview, a live blog. Everything here works with plain WordPress posts, so a site that only ever writes articles can ignore the extras entirely.

The news archive

The news archive is your posts page: the page you nominate under Settings → Reading. Importing a demo sets it for you — the pack's own index, named News, All stories, Advice or Journal depending on the demo. The page's own content is irrelevant on that route; the archive is drawn by a template.

Two settings control what it lists:

Setting Where
How many posts per page Settings → Reading
How many cards per row Appearance → Theme Options → Blog

Category, tag, author, search and not-found archives are drawn from the same family of templates and follow the same skin, so styling the news list styles all of them at once.

Do not delete the posts page. With no page nominated, WordPress has nowhere to render the archive and your news list disappears from the menu while every post stays published.

The single post

An article is rendered by the theme's post template, or by the demo variant of it when the active skin ships one. The variants differ in shape, not only in colour: the news article page adds a byline block and a share rail, the club and academy pages lead with their own hero, and the betting article carries the review furniture. Underneath, the content is your post content, so the block editor behaves exactly as it does on a page.

An article page from the news demo.

Related posts under an article are a post-grid band inside the template with its source set to Related, not something you add per post.

The two skins, and why they are separate

Appearance → Theme Options → Blog offers two independent pickers:

Picker What it skins
News page style The posts page, category, tag, author, search and 404 archives, and the sports content pages such as fixtures, players, programmes, bookmakers and guides
Single post style The article page only

They are separate on purpose. A newsroom-style archive in front of magazine-style articles is a legitimate combination, and so is the reverse.

Both offer Automatic plus one entry per demo the theme ships. Automatic follows the demo you imported; naming a demo mixes that demo's look into that one slot. The mechanics, and the other seven pickers that behave the same way, are in Style pickers: automatic or a demo name.

Only demos that ship a differently shaped article page have a variant; the rest fall back to the shared template, so choosing one of those changes the colours and the section styling rather than the layout.

Choosing a sidebar for the news pages

The same tab holds Sidebar, with three values: No sidebar (full width), On the right, and On the left. It is a fixed choice, not one of the style pickers, and it defaults to no sidebar. The imported demos differ — the tipster and news packs put it on the right; the team, academy and betting packs run full width.

What goes in the sidebar is the Blog sidebar template part, edited in the Site Editor exactly like the header and footer — see Where to edit each part. The news demo's version is worth opening as a reference: a standings table, a contents list, a small post grid, an ad slot and a newsletter card. Add or remove blocks there and every news page follows.

News categories and tags

Categories and tags are the ordinary WordPress ones, edited under Posts → Categories and Posts → Tags, and every demo's section navigation is built from categories. Two habits keep the front end tidy: give a category a description, because the archive masthead prints it, and set a featured image on your lead stories, because the card grid falls back to a plain card without one.

Posts also carry the shared Sports and Flags taxonomies described in Sports content and data. Flags are curation markers — featured, breaking, pick of the day — and the card grid can print them as badges.

Features, videos and shows

The plugin adds two panels and three taxonomies to posts, for the story types a sports newsroom publishes. Use them when they apply and ignore them otherwise.

Addition What it holds
Feature panel Interviewee, Their role, Story year — the long-read and interview furniture
Video panel Video URL, Length as printed, Length in seconds, Views as printed, Counted views, Presenter, Episode, Stream, Stream starts, Live status line
Formats What kind of article this is: video, guide, long read
Video kinds Highlights, analysis, explainer, feature — the filters on a watch page
Shows The series a video episode belongs to

Formats has public archives; Video kinds deliberately does not, because the watch page filters on it and a public archive would hijack that URL. A post with a Video URL and a video kind is what a video hub band lists — you do not create a separate video post type.

The post grid, option by option

post-grid is the block behind the archive list, the related band and every "latest stories" strip. Its sidebar has four panels.

Posts shown. Source is the important one:

Source Behaviour
This page's posts (blog and archives) Lists whatever the page is already showing, and paginates. Use it in archive templates
Latest posts Runs its own query, so the band can sit on any page. Adds How many, Category, Order by and Order
Related to this post The current post's own terms, with an optional Relate through taxonomy

Layout. Grid, Lead story plus side stack, or Numbered list without images. The lead layout adds Cards beside the lead — zero gives the lead the full width — and a Lead column ratio such as 1.7fr 1fr; anything the lead and its stack do not use falls into a grid underneath, so no post is ever hidden. Otherwise you get Posts per row, where 0 follows the site-wide setting on the Blog tab, and Narrowest card, which is the width below which a row drops to fewer columns rather than squeezing.

Heading. Eyebrow, Heading, Link label and Link URL — the band's own title row, so you rarely need a separate heading block above it.

Card. Toggles for Featured image, Category, Flags, Date, Author, Read time and Excerpt. Date can print as a date or as an age such as "2h ago". Author can take its byline from the WordPress author or from the linked person, falling back to the WordPress author when no person is attached, and can show a portrait beside the name. Excerpt has a word count, and the Read more label and the Text when there are no posts are yours to write.

Reading time and pagination

Read time is counted from the post's own words every time the page renders, so it is never stale. The Reading speed slider sets the words per minute used, at 200 by default; raise it for a technical audience that skims, lower it for long-form. Guides in the betting demo are the exception — they carry a Reading time field you set by hand, because an editor's estimate beats a word count on a reference article.

Pagination applies when the source is the page's own posts, and has three values:

Value Behaviour
Page numbers The usual numbered links
Load more A button that appends the next page in place
None No pagination; the grid shows one page and stops

Load more is a real link to page two underneath, so it works before the script loads and a search engine can follow it. When it is on you can also set the button label and a progress line that counts what is shown against the total.

How the news demo front page differs from a plain blog

On a plain blog the front page is the archive: a masthead and a grid of cards, and nothing else to maintain.

The news demo front page: the masthead, the scores board and the first
section front.

The news demo separates the two. Its front page is a static page built from bands — a scores board, a lead post grid, a live blog band, a video hub, an ad slot and a newsletter card — while the archive lives on a second page, All stories, which lists every post in date order. That split is what lets the front page lead on a live match while the archive stays complete and chronological.

To copy the arrangement on your own site: build a page out of bands as described in Building pages, create a second, empty page for the archive, then set the first as your front page and the second as your posts page under Settings → Reading. Nothing else is required — the archive page needs no content, because the template draws it.

Shop and products

SportPulse does not need WooCommerce. The theme, the plugin and six of the eight demos work with no shop plugin installed, and nothing in the theme asserts a minimum WooCommerce version. Install it only if you sell something.

When you need WooCommerce

Two demos ship products, and they are the two that need WooCommerce: Team (the Meridian FC club store — kit and accessories) and E-gaming (the Polaris store — apparel and gear). Tipster, Tipster Light, News, News Light, Academy and Betting ship none, so on those six the shop is absent until you build one — which you can, on any of the eight, because the theme's shared shop and product templates render for every demo.

Set up WooCommerce

Install and activate WooCommerce the usual way — see Install WooCommerce — then run WooCommerce's own setup: store address, currency, tax, shipping, payments. It creates the Shop, Cart, Checkout and My account pages, and SportPulse replaces none of that. It skins what WooCommerce builds.

Activate WooCommerce before you import the Team or E-gaming demo. The pack's products need the product post type to exist at import time. If you imported first, activate WooCommerce and re-import from Importing a demo.

What the theme skins

Three separate things. The shop archive is a whole template the theme ships in place of WooCommerce's own — hero band, toolbar, filter column, grid — and the product page is another: gallery, buy column and the sections beneath. Cart, checkout and My account stay WooCommerce's own pages, with a bridge stylesheet that maps Woo's buttons, notices, prices, ratings and form fields onto the active palette. It changes colour, border and radius only, never layout, so a WooCommerce update that reshapes a component keeps working and only its skin is ours.

The shop and the product page have their own style pickers, separate from the rest of the site — see Style pickers: automatic or a demo name. The two store packs pin both to themselves; the other six leave both on Automatic. Only those two demos ship a designed shop and product page, so any other value falls back to the theme's shared pair rather than failing.

The Meridian FC club store archive with its filter column and product grid.

Add a product

Products → Add new, exactly as WooCommerce documents it. The theme's layouts read Woo's own fields, so there is nothing to type twice:

What you fill in Where it shows
Title Card, buy box, breadcrumb, page title
Long description The description tab under the product
Short description The blurb in the buy column
Regular and sale price Card and buy box; the sale price takes the accent
Product image and gallery Card thumbnail and the product gallery
Product categories Filter column, category tiles, breadcrumb
Stock status and quantity The stock line, the stepper's ceiling, and Only 2 left once the count reaches Woo's own low-stock amount
Attributes and variations One control row per attribute in the shared buy box — Size × Colour draws a size row and a colour row, and the combination picks the variation

Reviews are Woo's own, under Products → Reviews, and the page shows the real ones with their real average. Nothing there is hardcoded copy: every panel renders what you typed, or disappears.

SportPulse details on a product

The product editor's Product data box gains a SportPulse details tab holding the copy the shared product page shows beyond Woo's own fields:

Field What it does
Detail tab 1 — title Names the second description tab; empty means "Fabric & care"
Detail tab 1 — text Fills that tab; empty means no tab
Detail tab 2 — title Names the third description tab; empty means "Fit & sizing"
Detail tab 2 — text Fills that tab; empty means no tab
Highlights One per line, becomes the checklist card
Badge The small chip over the image on cards, such as New
Show price as from Prints "from £39" instead of "£39"
Size run Comma-separated sizes the buy box offers at one price — S,M,L,XL,XXL. Empty means one size
Sizes sold out Sizes from the run above that are gone: shown, struck through, unclickable
Printing fee Offers a printed name and number and charges this on the cart line. Empty offers no printing; 0 offers it free
Printing — title Names the add-on; empty means "Printed name and number"
Printing — note One line under the title, such as "Up to 14 characters"

The two detail tabs are titled by you because one theme sells shirts, mouse mats and coaching courses, and no fixed pair of headings is right for all three. Type "Fabric & care" and "Fit & sizing" on a kit product, "In the box" and "Specification" on a peripheral, "What is included" and "Who it is for" on a course. Leave a title empty and the shipped default is used; leave the text empty and the tab does not appear at all.

Badge and the from-price switch are read on every shop card, so they work under any shop skin. The description tabs and the checklist are read by the shared product page only — the Team and E-gaming product pages have their own designed sections, so leave the detail tabs and Highlights empty on a club-store product.

The size run and the printed name and number

This is the sports-shop selling that used to be reachable only by running the Team demo, and it now works on any product under any skin. Fill in Size run and the buy box offers those sizes; fill in Printing fee and it offers a printed name and number under them.

Neither is a variation, on purpose. One shirt in five sizes with a £12 print is ONE product: as variations it is forty products carrying one price between them, and the print is a fee rather than a price. The chosen size and the printed name and number ride the cart line as item data, the fee is added to that line, and both are copied onto the order — so the picking list says "Home Shirt · M · ROONEY 10" without a single extra product.

Use variations where the sizes genuinely differ in price or stock (an XXL that costs more, a colour that is sold out on its own), and the size run where they do not. Leave Size run empty on a variable product: its sizes are already a control row of their own.

The buy box

The buy column is a block, not a Woo shortcode, and there are three: one shared, one per store demo.

The panels under the buy column — delivery and returns, fabric and care, sizing — are content on the block, so edit them in Appearance → Editor.

A club store product page with the buy column, size pills and printing add-on.

When something is sold out

A sold-out product page is an email address you have not asked for yet, so there is a block for it: Back-in-Stock Alert. Drop it in the product template (or on any page, naming a product in the sidebar) and it takes an address on a product that cannot be bought — and renders nothing at all while the product is in stock, so it can sit in the template permanently.

The address lands in Messages with the product's name, link and SKU, like every other form on the site, and it is spam-guarded by the same honeypot, fill timer, rate limit and optional Turnstile check the contact form uses. It is not a newsletter signup: nothing captured here is passed to a mailing-list provider, whatever Theme Options → Contact is set to.

Product categories and the category tiles

Categories are WooCommerce's own, under Products → Categories; give each one a thumbnail there. The Category tiles block builds its band from the real category list — name, thumbnail and the count Woo already maintains — and drops any category with nothing in it, so a renamed or added category appears with no editing. A category page has its own template, so it gives a shopper the same grid as the full shop.

Showcase mode and the shop grid

Appearance → Theme Options → WooCommerce holds both. Under Selling mode, Showcase mode — nothing can be purchased turns the store into a catalogue: prices still show, but Add to cart, the Store API's add-item route and the mini cart all read the same flag, so nothing is left that could quietly add an item. Use it for a range you take orders for by phone, a partner range you only display, or a store you are still pricing; switching it off makes everything buyable again and changes nothing about the products.

Above it, Products per row (1–6) and Rows per page (1–12) are Woo's own catalogue options, surfaced here so you do not have to go looking. Products per page is the two multiplied — four across by four down is sixteen before pagination.

The WooCommerce tab, with the shop grid and selling mode settings.

Shop extras that ship as blocks

These extras are blocks, not settings, so each one is switched on by being present in a template: add or delete it in Appearance → Editor.

Extra Where it is placed
Instant search The toolbar on the shared shop template
Quick view Each card in the shared shop grid
Wishlist button Each card in the shared shop grid
Wishlist drawer The header part, beside the mini cart
Shop banner The shop hero, from the Shop page's featured image

Instant search covers products only and answers as you type instead of reloading. Quick view fetches the live price and image when it opens, so it cannot show a stale price. The wishlist lives in the visitor's own browser, so it needs no account and is per device. The two store demos use their own store grids, so they ship without quick view and the wishlist heart.

The sticky bar on a shop

The bar across the bottom on phones resolves each slot from real data and drops any slot with nowhere to go: Call from the Business info phone number, Directions from the address, the primary action from the Primary action link, and Cart once WooCommerce is active. Its on/off setting is The sticky mobile bar; the phone and address it reads are in Business info.

Before you take a real payment

Everything above is presentation; the money is WooCommerce's. Walk this list on the real site, not on the demo.

  1. Showcase mode is off — with it on, nobody can buy anything.
  2. Payments are live, not in test mode, under WooCommerce → Settings → Payments, and tax, shipping and the store address are yours.
  3. The demo's copy is gone. The packs ship fictional stock and European delivery lines, some written into the product template.
  4. HTTPS is on and permalinks are not Plain, both flagged on System requirements, and order emails arrive.
  5. The shop is fast enough — see Performance and going live.

A test order is the only real check. Every setting above can look right and still fail on a gateway nobody switched out of sandbox. Buy something from your own shop before you tell anyone it is open.

Forms, contact and newsletter

Every form in SportPulse is a real HTML form. It posts, it redirects, and it works with JavaScript switched off — there is no third-party form service, no API key to buy and nothing to embed. That also means there is one place a submission lands and one set of anti-spam checks in front of it, which is what the rest of this chapter is about.

The form blocks

The shared block is Form. Drop it on any page and it draws one card: a kicker and a heading, name beside phone, an email field, a row of topic chips, any extra fields you declare, the message box, an optional consent line and the send button. The block sidebar edits all of it — the header copy, the topic chips and their label, your own extra fields, every label and placeholder, the consent line and its link, the button text, and the message that replaces the form once it is sent.

An extra field has a label, a key and a type — text, email, url, tel, number or select. Its answer is appended to the message as a labelled line, so it reaches the inbox and the notification email with no extra configuration. That is why the tipster application and the contact desk are one block drawn twice with different extra fields, rather than two blocks that drift apart.

Each demo also ships its own enquiry or contact block so the form matches the page it sits on: the academy's trial enquiry, the e-gaming enquiry and contact forms, the betting site's contact form and the newsroom's tip form. They are designed shells over the same machinery. Two are worth knowing individually — the newsroom form can be sent anonymously, which files the message under "Anonymous" and marks it so you do not record the sender, and the academy enquiry asks the extra questions a parent expects.

The shop has one of its own: Back-in-Stock Alert, which asks a visitor for nothing but an email address on a product that has sold out and stores it with the product's name, link and SKU. It runs the same guards and lands in the same inbox as everything else here, and it is never treated as a newsletter signup — see When something is sold out.

Where a submission goes

Two places, always, and in this order:

  1. Messages. A read-only screen in the admin menu. Every submission is stored there as a private record with the sender's name, email, phone, the topic and the page it came from. There is no Add New button: these are records of what a visitor sent, not content to write.
  2. An email, to the address in Appearance → Theme Options → Business info. With no address there it falls back to the WordPress admin email. The subject is your site name plus "New message", the reply-to is the sender, and the body repeats every field plus a link to the record.

Storing happens first on purpose. If mail delivery fails you still have the message; if the store fails, the email says so in as many words. So a missing notification with the row present in Messages is a mail problem on the host, not a broken form — see Troubleshooting.

Every form runs the same guards first: the WordPress nonce, a hidden honeypot field, a minimum fill time of three seconds, a rate limit of five submissions an hour per connection per form, and then Turnstile. A submission that trips one of them comes back to the page saying which, and nothing is stored.

The contact page

The contact page's own details are not typed on the page. They come from Appearance → Theme Options → Business info, which is filled in once and then read by the header, the footer, the contact page, the map, the "Open now" line and your structured data:

On the page Field it reads
The business name Business name
The phone number, as a tel link Phone
The email address Email
The postal address Address
Opening hours and Open now Opening hours
Every call-to-action button Primary action link

Opening hours are Monday first, up to six ranges a day, and an empty day means closed. They drive the "Open now" state and are published as structured data — see SEO and structured data.

Leave the Primary action link empty and every call-to-action button in the theme is not rendered at all, rather than pointing nowhere.

The contact page with its details, form and map.

The map and the Directions button

The map block builds its embed from the Address field, so there is no map key to buy and nothing to paste. Without an address there is nothing to point at, and the block says so instead of showing an empty grey square.

The embed is behind a click. Until a visitor asks for it the page contains no map element at all — not a hidden one, not one with an empty source — because a Google embed hands over the visitor's IP address the moment it resolves.

The Directions button is never gated: it is an ordinary link to the map service, so it works with no JavaScript, needs no consent, and still works for a visitor who declines the embed. It is also the second slot on the sticky mobile bar.

The Business info tab, with the contact details, opening hours and newsletter settings.

Spam protection with Turnstile

Cloudflare Turnstile is free, optional and off until you configure it. Get a site key and a secret key from your Cloudflare dashboard and paste them into Business info, under Spam protection.

Both keys, or neither. The widget renders when a site key is present, and submissions are verified only when the secret is present too. So a site key on its own shows visitors a check that is never verified, and a secret on its own verifies a token no visitor can produce. Either way you get no protection. Clearing the site key is the documented off switch.

What a visitor sees is a small Cloudflare check above the send button. The script is not loaded with the page; it is fetched the first time someone interacts with the form, so a page that merely contains a form does not report its readers to a third party. Turnstile cannot produce a token without JavaScript, so the block prints a line telling a scripting-off visitor why the form will refuse them. If Cloudflare itself is unreachable the submission is allowed through: an outage is evidence of nothing, and the four cheaper guards have already run.

The newsletter card

The Newsletter card block is one email field, a heading, a sentence, an optional fine-print line and a button. It posts to the same place every other form does, with the same guards, and it works with scripting off.

Two settings matter beyond the copy. List ID names the letter being joined: it becomes the "From" column in the inbox, so two cards are told apart without opening a row, and it travels to your provider as a tag. Consent text prints your own wording above the button and is stored with the signup, which is the record you want if anyone asks. Follow buttons — on a section masthead, an author page or a match — are signups too, filed under what they follow.

Newsletter destinations

Under Newsletter in Business info, Where signups go has three values. Every signup lands in Messages whichever you pick; a provider is an addition, never a replacement.

Setting What happens
The Messages inbox only Nothing leaves your site; this is the default
Also post to a form URL The address is posted to any provider's form
Also add to a Mailchimp audience The address is added through the API

For a form URL, paste the action of your provider's own signup form and tell the theme what that form calls its email field — EMAIL for Mailchimp and Brevo, fields[email] for MailerLite, email_address for ConvertKit. Anything else the form needs goes in Extra form fields, one name=value per line; {email}, {tags} and {name} are filled in, so tags={tags} hands over the list that was joined. Nearly every provider has a hosted form, so this route fits almost all of them.

For Mailchimp, paste an API key and the audience ID from Audience → Settings → Audience name and defaults. The key must keep its data-centre suffix — the -us21 on the end — because that is how the theme finds the right API host. Double opt-in is on by default and adds the member as pending, so Mailchimp sends its own confirmation; turn it off only if you are certain you may.

Either way the outcome is written back onto the message and shown in the inbox: sent, rejected with its status code, or not forwarded with the reason.

Keys you cannot read back

The Turnstile secret key and the Mailchimp API key are stored write-only. They are never returned to the settings screen, so both fields look empty after saving even though the values are working, and neither appears in an exported settings file. Re-entering the key is the only way to change it — see Write-only secrets. Keep them wherever you keep your other credentials; the site will not give them back.

Colours, fonts and spacing

SportPulse has one design system and every block obeys it. Change a colour in one place and the whole site follows — buttons, links, badges, tables, charts, the WooCommerce notices, all of it. This chapter is where each dial is.

How the colour system works

The theme defines a palette of named slots, not a list of colours. Every pattern, block and stylesheet in the theme and the plugin references the slot by name — never a raw hex value — so a slot is a promise: whatever is in primary is what every primary thing on the site is.

There are around twenty slots, most of them structural or derived and riding along with the palette:

Slot Used for
base, paper, surface Page and card backgrounds
contrast, muted, border Body text, secondary text, hairlines
primary, secondary, accent The three brand hues
cta Buttons and calls to action
success, error, warning Status fills, including Woo notices
live The live badge on matches and streams

Each of those has an on- partner — on-primary, on-accent, on-cta — which is the text colour that sits on top of it. That pairing is what keeps a recoloured button legible, so if you change a fill, check its partner.

Because nothing hardcodes a value, this system is also why you should never paste a hex code into custom CSS when a token will do.

Change the palette

Appearance → Theme Options → Theme styles, in the Colours card. Six pickers are exposed, in the order you think about them: Page background, Text, Primary, Secondary, Accent and Buttons / CTA. Those are the brand decisions; the rest of the palette follows.

The card says Saved to Site Editor styles, and it means it literally: these values are written to the site's global styles, the same entity Appearance → Editor → Styles edits. So the editor previews exactly what the front end renders.

The Theme styles tab, with the preset picker, the colour pickers and the type scale.

Watch the contrast line under each picker. As you change a colour the screen measures every pairing that colour takes part in and tells you the tightest one — either a grey readout ("Closest pair: … 4.62:1 — the minimum is 4.5:1") or a warning naming the pair that fell below it. It never stops you saving; the judgement stays yours. A pale accent on a white page fails at small sizes even though it looks fine in the picker, and the on- partner colour is what carries the text over it. See Accessibility.

The style variations

Above the pickers is Preset. Its default is Automatic — follow the imported demo, and below that it lists every style variation the theme ships by name — the six demo palettes, including two alternative tipster palettes, a light and a wire newsroom palette, and a dark variation called Dusk.

Picking one applies the whole look: colours, fonts, the section CSS and the header, footer and shop skins. It is the fastest way to wear one demo's appearance on a site built from another's content.

A preset is a full replace. Applying one discards individual colour and font tweaks you made afterwards, which is why the screen asks before it does it. Pick the preset first, then adjust.

Three more variations are section styles rather than site styles: Section — Alt, Section — CTA and Section — Inverted. They are not in the preset picker because they apply to one band: select a group or a SportPulse section block in the editor and pick the style there, and that band alone flips.

Fonts and the four font roles

The theme uses four font roles, and every heading, paragraph, table and figure in it is assigned to one of them:

Role Where it is used
Heading Headings, section heads, display type
Body Body copy, labels, buttons
Data Tables, odds, code-like values
Numerals Scores, counters, stat figures

Out of the box all four are system stacks — the fonts already on the reader's device — which is why the theme paints instantly and ships no font files it does not need.

In Fonts on the same tab you pick the heading and body faces from whatever is installed. Add a Google Font… browses the whole Google catalogue and installs the family onto your own server, so your visitors never contact Google, the font needs no cookie banner and it costs no third-party request. Upload a font… opens the Site Editor's Font Library, where you add your own licensed files; once installed, the family appears in these dropdowns. Either way the font is self-hosted — nothing in Sport Pulse fetches type from a third party at page load.

Type sizes

The Type scale card exposes the only four sizes worth setting per site: Hero / H1, Section heading (H2), Sub-heading (H3) and Body text. Everything else in the theme is derived from them.

Leave a field blank and the theme's own fluid size applies, scaling between a phone and a desktop on its own. Type a number and that size is used across the whole site at every width, so only override a step you need pinned.

The content width

Appearance → Theme Options → Site layout sets Content width (px) — 600 to 1920, default 1200. It caps the page's content column everywhere, including inside the editor, so what you build is what you see.

Sections with a full-width background still stretch edge to edge; only their inner content is capped. That is the difference between a wide site and a wide band.

The Site layout tab and the content width setting.

Spacing and the section rhythm

Spacing is a scale, not free numbers. The theme ships seven steps and every block's padding and gap controls offer exactly those:

Step Size
XS 0.25rem
S 0.5rem
M 1rem
L 1.5rem
XL Fluid, roughly 2 to 3rem
Section Fluid, roughly 3 to 5.5rem
Hero Fluid, roughly 4.5 to 7.5rem

The last three are fluid: they shrink on a phone and open up on a desktop with no media query. Section is the one that creates the rhythm between bands, and the demos use it everywhere — which is why their pages read as designed. Give a band you add Section padding rather than a typed value and it will match the ones the demo built.

Custom CSS, and where to put it

Small, additive tweaks go in Appearance → Theme Options → Advanced, in Custom CSS. It is printed on every page of the site, it survives theme updates, and it travels in an exported settings file.

Write it against the tokens rather than raw values, so your CSS follows a palette change instead of fighting it:

/* A heavier shop hero title, still on the theme's own palette. */
.anps-shop-hero__title {
	font-family: var(--wp--preset--font-family--heading);
	color: var(--wp--preset--color--primary);
	letter-spacing: -0.02em;
}

The Advanced tab, with the Custom CSS box and the settings backup.

Use the child theme instead when you are doing more than tweaking: changing a template, replacing a template part, overriding a whole stylesheet or adding PHP. The child theme ships in the same download; install it, activate it in place of the parent, and leave the parent installed. Nothing you put in a child theme is touched by a SportPulse update.

The demo skins are stylesheets

Each demo's look is a stylesheet the theme ships — one file per demo, built from the theme's own sources into assets/dist/demo-<slug>.css — and the style pickers decide which one loads. Those files are theme files.

Never edit the theme's own files. A SportPulse update overwrites assets/dist/ wholesale, and a hand-edited demo stylesheet disappears with it, silently, at the worst possible moment. Put the change in Custom CSS if it is a rule or two, or in the child theme if it is more. Both outlive every update.

If a change fights the demo skin instead of extending it, that usually means the wrong skin is selected — check Style pickers: automatic or a demo name before you write CSS to undo it.

Building pages with Elementor

SportPulse builds its pages out of blocks, in the WordPress editor. If you prefer Elementor, you can build the same pages there instead: the theme ships an Elementor widget for almost every content band, and each of the eight demos ships an Elementor version of its pages.

Elementor is optional. Nothing in this chapter loads unless Elementor is active — with the plugin absent, the theme and its demos behave exactly as the rest of this manual describes.

What Elementor covers here

Elementor owns page content only. The header, the top bar, the footer and the sticky mobile bar stay WordPress template parts, edited in the Site Editor, because Theme Options drives them — see Header, top bar and footer. Colours, fonts, type sizes, business info, opening hours, structured data and the shop are still set in Theme Options, tab by tab whichever editor you build pages in.

So Elementor replaces one thing: how you lay out and edit the middle of a page.

Elementor Free is enough

There is no Elementor Pro dependency. Every control the widgets use — text, media, repeaters, colour pickers, responsive dimensions — is in the free edition. Free shows some of its own upgrade prompts inside the editor; that is Elementor's chrome, not a missing feature of the theme.

To keep the first run clean, the theme skips Elementor's onboarding wizard and its usage-tracking notice, and it switches Elementor's own default colours and fonts off, so Elementor's native widgets inherit your palette and typefaces instead of fighting them. If you want Elementor's untouched behaviour, a developer can turn all of that off with the anps_elementor_clean_ui filter — one of the hooks listed in Extending the theme.

The widgets, one per block

SportPulse registers 187 widgets — one for each content block that has an Elementor equivalent. They sit in a single group in the Elementor inserter, called Theme Sections, and each one is named after the block it renders: the Elementor widget for the team-league-table block is the same league table you would insert in the block editor.

The Theme Sections group in the Elementor inserter, with the theme's section widgets listed.

That is not a lookalike. A widget builds the block's own field values and calls the block's own renderer, so the markup, the CSS and the front-end behaviour are the same in both editors. It also means a fix to a block reaches your Elementor pages with no extra work.

Importing a demo with Elementor active

Activate Elementor before you import. All eight demos ship an Elementor build of their pages — the two light packs use their parent demo's — and the importer picks it automatically when Elementor is active; with Elementor off, the same import writes block pages. The demo card on Appearance → Theme Options → Demo import marks the pack as having an Elementor version, and the screen tells you Elementor was detected.

The Demo import tab, with a card for each of the eight demos.

Everything else about the import is unchanged — it is still one demo per site and still a full replace. Read Importing a demo first.

Activating Elementor afterwards does not convert anything. An import that already ran wrote block pages, and they stay block pages. To get the Elementor build, activate Elementor and then re-import the demo — which replaces your content again.

Editing a SportPulse widget

Drop a widget on the page and its Content tab is the block's own field list: the headings, the text, the links, the repeater rows, the images. A band that reads live data — fixtures, predictions, players, products — exposes the query (how many, which category, what order) and never a copy of the data, so it keeps showing what your site actually holds.

Two controls are worth knowing:

Control Where What it does
Section style Content tab Default, alt, invert or CTA — the same section rhythm the block variations use
Band padding Style tab, Band spacing Responsive top and bottom padding for the band

Band padding is deliberately empty by default, so the demo's own responsive spacing stands until you override it. Colour controls are full Elementor colour pickers, seeded with your palette so they follow Colours, fonts and spacing until you pick something specific.

Elementor page template

An Elementor page must use the Elementor page template. Open the page in the WordPress editor sidebar, or Elementor's own page settings, and set Template to Elementor (full-width content). There is also Elementor landing (no header or footer) for a page with no chrome at all.

This is not cosmetic. The No title template constrains the content column, and an Elementor container cannot break out of it the way a block band can. On the wrong template, every full-width band on the page is trapped in a narrow strip with the page background showing down both sides. The demo's Elementor pages are already set correctly; a page you create yourself is not.

Block pages keep No title. Do not move them to the Elementor template.

Blocks with no widget

Some blocks are deliberately absent from Elementor, because they are site furniture rather than page content: crests and wordmarks, cart and account links, the search field, the match and article heads that belong to a single template. Those live in templates and parts, and you edit them in the Site Editor.

Long legal documents are the other exception. The privacy, terms and cookie pages stay block content even in an Elementor demo — their nested structure does not survive a page builder's repeater, and a page with block content renders perfectly well beside Elementor pages.

Mixing block pages and Elementor pages

You can, page by page. The choice is per page: a page with Elementor data is rendered by Elementor, and every other page is rendered by its blocks. Both read the same Theme Options, the same palette and the same demo stylesheet, so they match visually. Only remember the template rule above — Elementor pages on the Elementor template, block pages on No title.

One thing that surprises people: the moment you press Edit with Elementor, Elementor owns that page. Its blocks are still in the database, but the block editor's canvas is hidden for that page while Elementor is active, and the editor shows Elementor's own switch instead. Use Back to WordPress Editor in Elementor's panel to hand the page back. So open a block page in Elementor only when you mean to convert it.

Turning Elementor off

Deactivate Elementor and the widgets and the Elementor page template stop being offered. What happens to a page depends on how it was built:

Nothing else changes: your options, colours, menus, posts, products and sports data are untouched, because none of them were ever Elementor's to hold.

If a page looks wrong after any of this, start with Troubleshooting.

SEO and structured data

Structured data is the machine-readable copy of a page: the same facts a visitor reads, written so Google, Bing and AI assistants do not have to guess. Sport Pulse publishes it from data you have already entered, so there is nothing to maintain twice.

The theme handles the parts that come from your own settings. Titles, per-page meta descriptions and sitemaps belong to WordPress or to an SEO plugin — see Titles, meta descriptions and sitemaps below.

What the theme publishes, and from where

Unless an SEO plugin is already publishing one, every page carries one JSON-LD graph. What goes into it depends on the page:

Node On which pages Built from
Your business or organisation Every page Business info: name, phone, email, address, opening hours
A branch A single location page That location's own address, phone, hours and map position
A match A fixture page Kick-off, the two sides, the venue, the competition, and the ticket status if you set one
A club A club page The club's name, crest, short name and code, its sport and its colour
A player A player page Position, date of birth, birthplace, nationality, and the club your site is about
A competition A competition page Its name, and the span of the fixtures filed under it
A breadcrumb trail Fixture and player pages Home › competition › match, and home › club › player
Frequently asked questions Pages with an FAQ block The questions and answers in the block
Products Product and shop pages WooCommerce, not the theme

That is the whole list, and the omissions are deliberate. The theme publishes no article or video markup, and it never attaches a star rating to your business — ratings belong on products, where WooCommerce owns them. Breadcrumbs are published only where a page genuinely sits under something; if you want a trail on every page, an SEO plugin adds one without conflicting with any of the above.

An FAQ block only contributes questions when its schema option is on, so a question-and-answer band used purely for layout does not claim to be an FAQ.

Matches, clubs and players in search results

A fixture page is published as a sports event: when it kicks off, who is playing, where, which competition it belongs to, and that tickets are on sale when you have said so. That is the entry Google can show as an event rather than as one more blue link, and it is the part of your SEO a general-purpose theme cannot produce for you.

Three fields on the fixture decide how complete that entry is:

Everything else follows one rule: a field you have not filled in is left out, never published blank and never guessed. A postponed match says postponed. A match that has been played carries no ticket offer, whatever its sale status still says. Ticket prices are not published at all — the ticket figures on a fixture are free text with a currency symbol in them, and a price read wrongly by a machine is worse than no price.

A club page is published as a team: name, crest, short name and three-letter code, sport and club colour. Only a short name and code you have actually entered are published as alternatives; the theme will not pass off the abbreviation it invents for crowded table cells as the club's real code.

A player page is published as a person in that squad — position, date of birth, birthplace, nationality — and as a member of the club you ticked This is our club on. Without that tick there is no club to belong to, and the connection is left out rather than assumed.

A competition page is published as an event spanning its own fixtures, from the earliest kick-off to the latest, so a league page carries real dates without you entering a season twice. A competition with no dated fixture publishes nothing.

A developer can send ticket offers to a ticketing provider instead of the match page with the anps_schema_ticket_url filter.

The Business info hand-off

One screen feeds all of it: Appearance → Theme Options → Business info. Fill it in once and the same values reach the contact page, the footer, the map, the "open now" state and the structured data together.

Field What it feeds
Business name The name search engines show for the organisation
Phone and email Contact details in the graph, and the contact page
Address The postal address, and the locality used in summaries
Opening hours Opening-hours specifications day by day, and the open-now state on the front end
Business type Which schema.org type your organisation is published as

Business type is the field most people skip. It decides whether you are described as an organisation, a shop, a local business or a professional service, and Google treats those differently. Pick the closest match once. Full details of the screen are in Business info.

An empty field is simply left out rather than published blank, so partial information is safe — but incomplete information is a weaker listing.

With an SEO plugin installed

Two plugins publishing structured data on one page produce two competing graphs, which is worse than either alone. SportPulse never lets that happen. It recognises Yoast SEO, Rank Math, SEOPress, All in One SEO, The SEO Framework and Slim SEO, and it also notices any other plugin that has taken over your page titles.

Your SEO plugin What the theme publishes
Yoast SEO or Rank Math Nothing of its own. Your business, your branches, your matches, clubs, players and competitions and your FAQs are added to the plugin's graph and linked to whatever business node it already publishes, so the page carries one connected graph.
SEOPress, All in One SEO, The SEO Framework, Slim SEO, or any other plugin that owns your titles Your FAQs only. These plugins offer no way to add to their graph, and none of them read the theme's FAQ blocks, so the questions and answers are published on their own and the rest of the graph — the sports nodes included — is left to the plugin. Enter your business details there as well.
None The full graph described above: your business, your branches, your sports pages and your FAQs.

If Yoast or Rank Math is installed but has not been set up — Rank Math publishes nothing until its wizard is finished, for instance — the theme notices that nothing was emitted and falls back to its own graph, so a half-configured plugin never leaves a page with no structured data at all.

Handing structured data to an SEO plugin

If you would rather your SEO plugin owned every node, including the business and the opening hours, switch Let an SEO plugin own structured data on in Business info. The theme then publishes no JSON-LD and no FAQ nodes at all, and you enter your business details again in the plugin.

Only turn this on if you have actually configured the plugin. With the switch on and the plugin unconfigured, the page ends up with no structured data from anyone — the fallback described above is deliberately skipped.

Locations in search results

A location's own page publishes that branch as a business in its own right — its address, its phone number, its hours, its map position — and links it to the organisation from Business info as the parent. That is the shape Google expects from a business with more than one address, and it is why a branch page can rank for its own town.

Add and edit branches as described in Locations. Two things matter for search: fill in the address and the hours, and give each branch a page of its own rather than listing them all on one.

AI assistants and the llms.txt file

Your site also serves a short plain-text profile at yoursite.com/llms.txt. It is the same idea as robots.txt, but for assistants such as ChatGPT and Perplexity: your business name, a one-line summary, your key pages, your products and your contact details, so an assistant answering a question about you reads your own data instead of inferring it.

It is generated on request from the same settings as everything else, so there is no file to edit and nothing to regenerate. It is served as plain text and marked not to be indexed, and it stays short on purpose — a crawler wants a map, not your whole catalogue. Keeping Business info accurate is the entire maintenance task. A developer can switch it off with the anps_llms_txt_enabled filter — see Search results, structured data and AI.

Titles, meta descriptions and sitemaps

So an SEO plugin is optional. Install one when you want to write per-page titles and descriptions by hand, or want article markup and a breadcrumb trail on every page; skip it and the site is still complete.

Search checks before you launch

Do these once, in this order:

  1. Fill in Business info completely, including the business type and the opening hours.
  2. Rewrite the demo copy on your home page and your main landing pages. The structured data and /llms.txt repeat what you write, so demo text becomes a demo claim about your business.
  3. Open yoursite.com/llms.txt and read it. If a line is wrong, the setting behind it is wrong.
  4. Test one page of each kind — home, a fixture, a club, a location, a page with an FAQ, a product if you sell — in Google's Rich Results Test.
  5. Check that Settings → Reading does not still discourage search engines.

The rest of going live is in Performance and going live.

Performance and going live

A fast site is mostly a matter of what you add after the theme. SportPulse ships lean and stays out of the way; the two things that reliably slow a WordPress site down are oversized images and too many plugins, and both are yours to control.

This chapter is the last thing to read before you make the site public.

What the theme already does

You do not need to configure any of this. It is how the theme is built.

What is left to you

Do this Why it matters
Upload images near the size they display, and use WebP The single biggest cause of a slow page; WordPress makes the smaller variants for you but never a smaller original
Install one page-cache plugin Serves a built page instead of building it per visitor
Use a CDN if your host offers one Moves images and stylesheets closer to the visitor
Keep the plugin list short Most plugins add their own CSS and JavaScript to every page, including pages that do not use them
Stay on a current PHP version PHP 8.1 is the floor; newer is faster

Two habits are worth more than any setting: crop a photograph before you upload it, and remove a plugin you stopped using instead of deactivating it.

One warning about that cache plugin. Page caching is safe and worth having. The JavaScript settings next to it — delay, combine, aggregate, lazy-load JavaScript — switch off every interactive band on the site without reporting anything. Enter the exclusions in Caching and optimisation plugins before you turn any of them on.

How to check a page honestly

A measurement you cannot repeat is not a measurement. If you test a page, test it like this:

  1. Test the live site over HTTPS, not a local copy and not a staging site on shared hosting.
  2. Test logged out. As an administrator you load the admin bar and editor assets that no visitor ever sees.
  3. Run it twice and use the second run. The first request builds the page and warms the caches.
  4. Test a real page with your content, on mobile as well as desktop.
  5. Change one thing at a time. If a number moves after you install a plugin, that plugin moved it.

Google's PageSpeed Insights and Lighthouse in Chrome both work. Read the opportunities, not just the score — "properly size images" is the one you can usually act on.

The launch checklist

Work through this in order. Every step is something a buyer has shipped without at least once.

  1. Permalinks. Settings → Permalinks — anything except Plain. Plain permalinks break clean URLs and the search-engine visibility of everything.
  2. HTTPS. Site address and WordPress address both https://, with a valid certificate.
  3. Requirements. Open Appearance → Theme Options → System requirements and clear everything marked Fix. Use Copy all as text if you need to send it to your host.
  4. Business info. Name, phone, email, address and opening hours filled in — they feed the contact page, the footer and your structured data.
  5. Menus. Check every menu location the demo used, and click through the header and footer on a phone as well as a desktop.
  6. Home page. Settings → Reading points at the page you mean, and the posts page is the one you mean.
  7. Contact form. Send a real message from the front end. It should appear under Messages and arrive by email. If it is stored but never arrives, the problem is email delivery, not the form.
  8. A real purchase, if you sell. Place an order with live payment credentials, then refund it. Check the order email, the tax and the shipping total.
  9. Search-engine visibility. Settings → Reading — the box that discourages search engines must be off. This is the single most common launch mistake.
  10. Demo images. Replace them, as below.
  11. Read your own pages. Demo copy names fictional clubs, players and prices. Anything you leave is a claim about your business.

The System requirements tab, with each check marked OK, Check or Fix.

Replace the demo images

The photographs in the demos are licensed for the demo, not for your site. They are there so an empty site looks finished while you work, and they must come off before you launch — every hero, every card and every gallery.

This is a licence obligation, not a suggestion. Read Licence, updates and support before you decide to keep one. Replacing an image is the same as replacing any other: open the block or the widget, pick your own file, delete the demo attachment from Media when nothing uses it.

Fictional names go with them. Meridian FC, Polaris Esports, Rowan Hall and Oddsmark are invented, and so are their fixtures, prices and records.

If something looks wrong once the site is live, Troubleshooting covers the symptoms this theme can actually produce.

Licence, updates and support

SportPulse is one product bought through two routes, and the route decides only how updates reach you. Everything the theme does is the same either way.

What the licence covers

The download contains a licensing/ folder with two files, and together they describe a split licence:

Part of the product Licence File
PHP code and the HTML it generates GNU General Public Licence GPL.txt
CSS, JavaScript, images and the design The licence you purchased README_License.txt

In practice: you may modify and reuse the code, and the design and assets are licensed for the site you bought the licence for. One licence, one production site. A staging or development copy of that same site is not a second site.

Nothing in the theme is switched off by a licence check. An unlicensed installation keeps every feature it has, including the demo importer and every block — what a licence adds is automatic updates and support.

If you bought an ANPS Club licence

Open Appearance → ANPS Club Licence, paste your key and activate. The screen then reports the licence as active, and this site gets automatic updates and support.

If the screen says the key is valid but for a different theme, or that it cannot verify the licence, do not re-purchase — the message tells you which of the two it is, and both are settled by support.

If you bought on ThemeForest

Your purchase is complete and permanent; there is no key to enter. Updates are manual:

  1. Download the new version from your ThemeForest downloads page.
  2. Unzip it and take sportpulse.zip and plugins/anps_theme_plugin.zip.
  3. Upload the theme at Appearance → Themes → Add New → Upload Theme and choose to replace the current version when WordPress offers.
  4. Upload the plugin at Plugins → Add New → Upload Plugin, the same way.

That is the whole procedure, and it is the same procedure as the first install — see Installing. An ANPS Club licence is the alternative if you would rather updates arrived in the dashboard; it is offered on the licence screen.

Keeping the theme and plugin in step

The theme and the Anps Theme Plugin are released together and expect each other's version. Update both at the same time, from the same download.

If the plugin is older than the theme needs, the theme says so with a notice: SportPulse needs Anps Theme Plugin (version) or newer; (version) is installed. Update the plugin. Nothing is broken at that point, but a block added in the newer release will not be registered until you update.

The reverse also matters: a plugin newer than the theme is not a supported combination either. One download, both zips, every time.

Before you update

An update replaces theme and plugin files. It does not touch your database, but "does not touch" is not the same as "cannot go wrong", so:

  1. Read changelog.txt. It sits in the root of the download, newest release first, and it is where anything you have to act on is written down.
  2. Back up the database and wp-content. Your host almost certainly has a one-click backup; take one.
  3. Export your settings. Appearance → Theme Options → Advanced has Export settings, which writes a small file you can import again. It is the fastest way back to a working configuration.
  4. Note your secrets. The Turnstile secret and the Mailchimp API key are stored write-only and are deliberately absent from that export — see Write-only secrets. Keep them where you can find them.
  5. Update on staging first if the site earns money.

The Advanced tab, with Custom CSS and the settings export and import buttons.

What an update never touches

An update replaces the theme's and plugin's own files, and nothing else. It leaves alone:

The one thing an update does overwrite is a file you edited inside the parent theme. That edit is gone, silently, with no way back. Put custom code in the child theme, and custom CSS in Theme Options → Advanced → Custom CSS, and an update is a non-event.

Demo photography is licensed for the demo

The photographs that arrive with a demo are licensed for use in the demo. They are not licensed for your live site, and neither are the fictional clubs, players, sponsors or prices they illustrate. Replace them before you launch — there is a checklist in Performance and going live.

The same applies to the theme's demo content in general: it exists so an empty site looks finished while you build, not to be published as your own.

Getting support

Support runs through ANPS Club at club.anpsthemes.com for licensed sites, and through the item's support channel where you bought it if you bought on ThemeForest.

Include this in the first message and you will usually get an answer rather than a question:

Include Where to find it
Theme and plugin versions Appearance → Themes, and Plugins
WordPress and PHP versions Appearance → Theme Options → System requirements
The requirements report The same tab, via Copy all as text
Which demo you imported Appearance → Theme Options → Demo import
The exact URL of a broken page Your browser's address bar
What you expected, and what happened In your own words, one sentence each

Check Troubleshooting first. Most of what reaches support is in there, with the fix.

Troubleshooting

Each section below is one symptom: what you see, why it happens, and what to do about it. They are ordered roughly by when in a build you meet them.

Two symptoms live in their own chapters and are not repeated here: a header with no navigation is answered by If the header shows no menu, and Elementor's own rules are in Building pages with Elementor.

Blocks are missing from the block inserter

None of the theme's sections are offered — no hero, no section head, no fixture board — in the editor or the Site Editor.

Every block lives in the Anps Theme Plugin, so this means the plugin is not running. The admin notice tells you which of four cases it is:

Install steps in full are in Installing.

Theme Options is not under Appearance

The menu item is simply absent. The settings screen ships in the plugin, so the first cause is the same as above. If the plugin is active, the cause is your user: the screen needs the capability an administrator has, so an editor or a shop manager never sees it. On multisite, check you are on the site rather than in the network admin.

The demo import will not start because of a requirement

The Demo import tab lists red requirements above the demo cards and importing gets nowhere. Those are the checks an import cannot proceed without — PHP memory, upload and post size, execution time, the DOM and XML extensions, an image library, and a writable uploads folder. They are your host's settings, not the theme's.

Open Appearance → Theme Options → System requirements, use Copy all as text and send that to your host, asking for the failing values to be raised. The tab is described in System requirements.

The demo import stops part-way or times out

The progress modal stalls, or the page errors with some pages imported and some missing. An import writes hundreds of posts and copies every demo image into your Media library, so it is the longest single request your site will ever serve; a host that caps execution time interrupts it.

Do not leave it half-done — run Re-import on the same demo. An import replaces rather than merges, so a second run repairs a partial first one. Keep the browser tab open while it works. If it fails at the same point twice, ask your host to raise the PHP time limit.

Demo images are broken or missing after an import

Pages and text arrived; images are empty frames.

The demo's photography ships inside the plugin and is copied from disk, so nothing is downloaded and your server's internet access is never the cause. What fails is the step after the copy — saving the file and generating its crops — and the System requirements tab names which one:

Fix whichever the tab reports, then Re-import. Importing again is the only way to bring in the media it missed.

A page looks unstyled after changing a style picker

You picked a demo name in a style picker and now that part of the site renders plain: no section colours, no band spacing, default type.

The pickers choose which demo's look is used for one slot — header, footer, shop, single post, and so on — and a demo only supplies a variant for the slots it actually ships. Point a slot at a demo that has no variant for it and the neutral base version renders instead. That is the plain look.

Set the picker back to Automatic, which always follows the demo you imported, then change one slot at a time. See Style pickers: automatic or a demo name.

Pages exist, but the header, the footer or both show nothing, or a partial list. An import writes the demo's menus and assigns them, but a menu can be left unassigned when the site already held menus of the same name, and a page you delete later leaves a gap in whichever menu pointed at it.

Open Appearance → Menus, check a menu is assigned to every location the demo uses, and remove items pointing at pages that no longer exist. Menus render two levels deep, so a third-level item never appears. See Menus.

Admin menus I do not recognise, or one that vanished

Either you see around twenty sports menus you have no use for, or a menu you were using — Predictions, Bookmakers, Programmes — has left the sidebar. Both are the same mechanism: a sports post type's admin menu is shown or hidden according to the demo you imported. Each of the five filtered demos shows its own types; the Team demo and a site with no demo imported show everything, because an unrecognised demo hides nothing. On top of that, a type that still holds posts keeps its menu whichever demo is active — so one menu the current demo does not use is normal on a site that has had other content through it.

The admin sidebar on a site running the E-gaming demo: its own eight content
types, plus People, Locations, Team and Messages, which are always
present.

A hidden menu is never lost content. The post types are always registered — only the menu is hidden — and a type that still holds posts keeps its menu whatever the demo. Nothing is deleted by switching demos, and re-importing the demo that used a type brings its menu back.

People, Locations, Team and Messages sit outside this entirely and are always present.

The sticky mobile bar shows when it should not

A bar is pinned to the bottom of the screen on phones and you do not want it, or you want one and there is none. It is a three-state setting whose default is to follow the demo, so a demo designed around the bar switches it on for you.

Go to Appearance → Theme Options → Footer → Mobile bar and set Sticky mobile bar to Never show or Always show rather than Automatic. The bar itself is described in The sticky mobile bar.

A new Google Font does not load

You added a font through Theme styles → Add a Google Font… and either the list never appeared or the site still shows the old typeface.

Fonts install onto your server rather than link to Google's, so two things can fail. If the catalogue will not load, your server cannot reach the internet: installing a font is one of the few things here that genuinely needs outbound HTTP, and the System requirements tab shows it as Outbound HTTP (cURL): Blocked. If the install failed, the font directory under wp-content is not writable; the error says so.

If the font installed and nothing changed, you have not selected it yet: pick it as the Heading font or Body font in Theme styles, save, and clear any page cache. Browsers cache fonts hard, so confirm in a private window.

The shop looks wrong, or nothing can be bought

Product pages render oddly, the shop page is a bare list, or Add to cart is nowhere. Three causes, in the order worth checking:

  1. WooCommerce is not active. The theme does not require it, so the shop templates only apply once it is. Only the Team and E-gaming demos ship products at all.
  2. Showcase mode is on. It removes every price and purchase button by design — that is how a catalogue-only site is built. Turn it off in WooCommerce.
  3. The shop style picker points at a demo with no shop of its own. Set it back to Automatic, as above.

The rest of the shop is in Shop and products.

The contact form does not send

Either the visitor is rejected, or the form submits and no email arrives. Those are unrelated causes, and one check separates them: every submission is saved on the site under Messages first, then emailed to the address in Business info, falling back to the WordPress admin email.

The newsletter form does not subscribe

Someone signs up and never reaches your list. The form has three destinations and only does what the setting says, so check Business info → Newsletter → Where signups go:

If double opt-in is on, a subscriber stays unconfirmed until they click Mailchimp's email. That is not a failure, and it is the setting most often mistaken for one.

An Elementor page's bands are trapped in a narrow column

Full-width sections sit in a centred column with the page background down both sides, and it looks correct inside the Elementor editor. The page is on the wrong template: an Elementor container cannot break out of a constrained content column the way a block band can.

Set Template to Elementor (full-width content) on that page. The demo's Elementor pages already are; a page you created is not.

A fixture, prediction or match page looks thin

A single fixture, prediction, player or programme page renders with a title and little else, while the demo's own pages look full. Those pages are built from the fields in the editor panels, and a band with no data renders nothing rather than a placeholder — correct on a live site, and bare on a half-filled one.

Open the entry and fill in its panel: a fixture needs its competition, kickoff time, venue and both sides; a prediction needs its fixture, analyst, selection and odds. See Sports content and data.

Images are missing after moving the site

You moved to a new domain, or from staging to live, and images are gone while pages and settings survived. Attachment URLs are stored in the database with the old domain, and the files themselves live outside it.

  1. Copy wp-content/uploads across in full — a database export contains no images.
  2. Search and replace the old site URL with the new one across the database, with a tool that handles serialised data.
  3. If images appear at the wrong sizes, regenerate the intermediate sizes.

Do this before re-importing anything: an import replaces content and will not repair a move.

A calculator, search box, tab strip or map does nothing

A band renders correctly but will not respond: the earnings calculator never recalculates, the instant search never narrows the list, the mobile menu button will not open, the before/after handle will not drag, the live blog and the scores never refresh, or the map's consent button does nothing at all. Usually several of them at once, on the live site, while everything works for you as an administrator.

That is one setting, not several bugs. An optimisation plugin is delaying, combining or lazy-loading JavaScript, which breaks the module loading every interactive band depends on. Many of those plugins skip their own optimisation for logged-in users, which is why you cannot see it.

Test it logged out in a private window, with the plugin's JavaScript optimisation switched off and its cache cleared. If the bands come back, add the exclusions from Caching and optimisation plugins and turn the feature on again.

Accessibility

Many buyers — clubs with public funding, schools, anyone selling to a public body — have to publish an accessibility statement about their own website. This chapter exists so you can write one honestly: it says what the theme does for you, what it cannot do for you, and what is simply not there yet.

This is a description of the theme, not a certificate. Nothing here is a claim of conformance to WCAG or to any national regulation. Accessibility is a property of a published site — your colours, your copy, your images, your plugins — and no theme can hand you it. What a theme can do is not get in your way, and give you a defensible starting point.

What the theme does for you

These are built in. There is no setting to switch them on.

A visible keyboard focus indicator. Links, buttons, form fields (input, select, textarea), expanding summary elements and anything given an explicit tabindex draw a two-pixel outline in the current text colour, offset from the element so it stays visible against a filled button. It is drawn on :focus-visible, which means keyboard users get it and mouse users do not see a ring left behind after a click. It is never removed.

Contrast checked on the palettes we ship. The colour pairings the design depends on — body text on the page, muted text on the page, text on cards and panels, text on primary and CTA fills, text on inverted bands — are declared as a contract and measured on every build, against the base palette and all nine style variations. Text pairings are held to a 4.5:1 minimum, larger and non-text pairings to the ratios their role requires. A palette that drops a pair below its floor fails the build rather than shipping.

And your own colours are measured too. In Appearance → Theme Options → Theme styles, each of the six editable colours carries a contrast line underneath it, updated as you drag the picker: the tightest pairing that colour takes part in, with its measured ratio and the minimum that pairing is held to, or a warning naming any pairing that fell below it. The arithmetic is the same as the build gate's, so the numbers agree. It never stops you saving — the screen tells you what you are choosing and leaves the choice with you.

Reduced motion is honoured. Every animation in the theme is either written inside a prefers-reduced-motion: no-preference query or switched off under prefers-reduced-motion: reduce. A visitor whose operating system asks for less motion gets the static state of the same component — a live badge that does not pulse, a counter that does not count up — not a broken one.

Landmarks and real controls. Every page template wraps its content in a <main> element, the header and footer parts are <header> and <footer>, and menus render inside a <nav> with an accessible name, so screen-reader users can jump between the regions of a page. Controls in the interactive bands are real <button> and <a> elements rather than clickable <div>s, so they sit in the tab order and respond to Enter and Space without the theme having to reimplement what a browser already does.

Three bands go further than that, and it is worth knowing which:

Icon-only controls carry text. A control whose label is only an icon — a close button, a carousel arrow, a share button — ships hidden text for screen readers alongside the icon, and decorative icons are hidden from them.

Results that change without a reload are announced. The bands whose content updates in place — instant search, the scores board, quick view, the product buy box and the earnings calculator — write their result into a live region, so a screen reader hears that the number or the list changed.

No third party loads before you ask. The map is behind a consent gate and the spam-protection widget loads on first interaction, so a visitor using assistive technology is not handed an unannounced third-party widget on page load. This is a privacy decision that happens to help here too.

What stays your responsibility

Everything in this list is content, and content is where accessibility is usually won or lost.

Yours Why the theme cannot do it
The colours you choose The screen measures the declared pairings and warns you, but the decision — and anything you paste into custom CSS, where nothing is measured — stays yours
Alternative text on your images The theme prints the alt text stored on the media item. If the Media library entry is blank, the image ships with no description. Fill it in when you upload
Heading order in your copy A band gives you a heading field; whether your page runs H1 → H2 → H3 or skips two levels is what you type
Link and button text "Read more" three times on one page is three identical links. Name the destination
Captions and transcripts For video and audio you embed, including the demo video bands
Embedded third-party media A YouTube or Twitch player, a social embed, an odds widget or an iframe from a provider brings its own markup and its own defects, and neither the theme nor you can change them
Plugins you add A form, a cookie banner, a chat bubble or a slider from a plugin is that plugin's markup
Your own testing With a keyboard only, and with a screen reader if you can. Ten minutes of tabbing through your real pages finds more than any automated check

What is not there yet

Being straight about the gaps is the point of this chapter.

Accessibility fixes ship in theme updates like anything else; keeping the theme and plugin current is part of keeping a site accessible. See Keeping the theme and plugin in step.

Writing your own statement

If you have to publish a statement, describe your site rather than the theme. A workable shape:

  1. Scope. Which site, and when you last reviewed it.
  2. What you have done. You can point at the facts above: a visible focus indicator, contrast-checked palettes at a 4.5:1 floor for text, reduced motion honoured, landmark regions, live regions on the bands that update in place.
  3. Known problems. The gaps above that apply to you, plus anything your own testing found, plus third-party embeds you cannot fix.
  4. How to report a problem. A real email address that a person reads.
  5. What you will do about it. A review interval you will actually keep.

Do not copy a conformance level into that statement on the strength of this chapter. If you need one stated, commission an audit of your published site.

If a band is unusable by keyboard on your live site

Check this before you report it: an optimisation plugin that delays, combines or lazy-loads JavaScript disables the interactive bands outright, which looks exactly like an accessibility defect. Tabs stop switching, a search box stops narrowing anything, a modal never opens. See Caching and optimisation plugins for the exclusions those plugins need, and re-test with the plugin's JavaScript optimisation off before concluding anything about the theme.

Caching and optimisation plugins

Install a page-cache plugin. It is the single best thing you can do for speed, and Performance and going live recommends it.

But one family of settings in those same plugins will quietly switch off every interactive band on your site: delaying, combining or lazy-loading JavaScript. This chapter names the settings and the exact exclusions to enter, because the failure is silent — nothing errors on screen, the band simply sits there doing nothing.

Read this before you report a broken calculator, search box, tab strip or map.

Why the interactive bands are fragile

The theme's front-end JavaScript is modern ES modules, loaded through WordPress's own module system: 80 of the 290 blocks ship one, and each imports WordPress's Interactivity runtime by name — @wordpress/interactivity, not a file path. WordPress prints an import map in the page that turns that name into a real URL, and the browser reads the map before it runs any module.

That is a good arrangement — nothing is bundled twice, and a page with no interactive band loads no script at all. It has one weakness: it depends on the page's script tags surviving intact.

An optimisation plugin that delays JavaScript rewrites <script type="module"> into something the browser does not treat as a module — WP Rocket, for example, replaces the type attribute with text/rocketlazyloadscript and restores it on first interaction. A module that is no longer a module never consults the import map, so its import of a bare name fails. Combining or aggregating scripts breaks it a second way: several modules concatenated into one file lose their own module scope, and the import map may end up after the code that needs it.

Neither failure is reported anywhere a site owner would look. The band renders its HTML from the server, so the page looks finished — it just does not respond.

What breaks, and what it looks like

Every one of these is the same root cause:

Band Symptom
earnings-calculator, academy-fees, team-price-table Figures never recalculate; the monthly/annual switch does nothing
instant-search, team-search-results, academy-search, egaming-search Search boxes never narrow the list; results stay as the page was built
news-live-blog, news-scores-board, team-fixture-list, team-league-table The feed and the scores never refresh, and the date and competition tabs are dead
before-after The comparison handle will not drag
map-directions The consent gate never accepts — the map cannot load at all, because loading it is the script's job
quick-view, wishlist-drawer, product-buybox The modal never opens, the drawer never slides, variations do not switch
classic-menu on phones The mobile menu button does not open the panel
toc, news-reading-progress, team-next-match No active heading, no progress bar, a countdown frozen at its server-rendered value

If several of these die at once, it is not several bugs. It is one setting.

The exclusion list

Paste these into the exclusion box of whichever optimisation feature you have enabled — delay, defer, combine, minify, lazy-load, "unused JavaScript". Most plugins match on a substring, so paths are enough and no wildcards are needed.

/wp-includes/js/dist/script-modules/
/wp-includes/js/dist/interactivity
/wp-content/plugins/anps_theme_plugin/blocks/
/wp-content/plugins/anps_theme_plugin/assets/load-more.min.js
importmap

What each line is:

Nothing above needs the theme folder: the theme itself ships no front-end JavaScript. All of it belongs to the ANPS Theme Plugin.

Plugin by plugin

Names as they appear in each plugin's own screens.

Plugin Setting to exclude from Where the exclusions go
WP Rocket File Optimization → Delay JavaScript execution — the one that breaks everything. Also Load JavaScript deferred and, if your version offers it, combining The Excluded JavaScript Files box under Delay JavaScript execution, and the exclusion box under Load JavaScript deferred
LiteSpeed Cache Page Optimization → JS Settings: JS Combine (turn it off — it is the worst offender), JS Delay, Load JS Deferred Page Optimization → Tuning: JS Excludes and JS Deferred/Delayed Excludes. Leave the paths out of JS Delayed Includes
Perfmatters Assets → JavaScript: Delay JavaScript, and Defer JavaScript if you enable it Each has its own exclusion textarea directly under it
Autoptimize JavaScript Options: Aggregate JS-files, and Also aggregate inline JS Exclude scripts from Autoptimize
W3 Total Cache Performance → Minify: JS minify and combine Never minify the following JS files
SG Optimizer Frontend → JavaScript: Combine JavaScript Files, Defer Render-blocking JS, Load JavaScript Asynchronously The exclusion list attached to each of those toggles
Cloudflare Speed → Optimization → Rocket Loader No exclusion list — leave Rocket Loader off unless you have re-tested the interactive bands with it on

Two general rules that outlive any of these version numbers:

  1. "Delay until interaction" is never safe here. Modules are already deferred by the browser; delaying them buys almost nothing and breaks them completely.
  2. Adding defer is fine, combining is not. A feature that only adds a defer attribute changes nothing for a module. A feature that merges files or rewrites the type attribute is the one to exclude.

What is safe, and worth keeping

Do not switch your cache plugin off after reading this. These features are fine, and several are genuinely worth having:

Treat "Remove unused CSS" as something to test rather than to trust. The theme already loads a stylesheet only on pages that render that block, so there is little unused CSS left to find, and a tool that decides what is unused by looking at the page before anyone clicks can strip the styles a drawer, modal or open accordion needs. If you enable it, open a page with a drawer, a quick view and an accordion and use them.

Checking that the exclusions worked

You cannot judge this while logged in as an administrator — several plugins skip their own optimisation for logged-in users, so everything works for you and nothing works for your visitors.

  1. Open a page with an interactive band in a private window, logged out.
  2. Use the band. Filter something, drag the handle, switch the tab.
  3. If it does nothing, open the browser console (F12). A message about failing to resolve a module specifier — usually naming @wordpress/interactivity — is this problem, confirmed.
  4. View the page source and search for importmap. If it is not there, or its type attribute has been renamed to something with "lazyload" or "rocket" in it, the plugin rewrote it.
  5. Clear the plugin's cache after every change. You are otherwise testing the page it built before you changed the setting.

If the band works with the optimisation feature switched off entirely and fails with it on plus the exclusions above, the plugin is matching those paths differently — send us the plugin, its version and the setting, and we will tell you the pattern it wants.

Extending the theme

Sooner or later something has to behave slightly differently: a sport that does not award three points for a win, a ticket link that has to point at your ticketing provider, a permalink that should read /player/ rather than /person/. The theme has a set of filters for exactly these moments.

Use them. Do not edit the theme or the plugin. An update replaces both, and your change goes with it. A filter written in a child theme survives every update, and every filter listed here is part of the theme's public surface — we keep them working.

This chapter is for someone comfortable writing a few lines of PHP, or briefing a developer who is.

Where the code goes

Two safe places, in order of preference:

  1. The child theme's functions.php. The child theme ships in the download; The child theme covers installing it. This is the right home for anything site-specific.
  2. A small plugin of your own, or a code-snippets plugin, if the change must survive switching themes.

A filter is a function that receives a value and returns a value. The shape is always the same:

add_filter(
	'anps_standing_win_points',
	static function ( int $points, int $standing_id ): int {
		return 2; // This league awards two points for a win.
	},
	10,
	2
);

Three things go wrong most often, so they are worth stating once:

Names are prefixed anps_ for the plugin's filters and sportpulse_ for the two the theme provides on its own. That is not cosmetic: the sportpulse_ ones are in the theme so they still work with the plugin deactivated.

Sports data, tables and fixtures

The filters buyers reach for most, because sports rules are not universal.

Filter and arguments Default Why you would use it
anps_standing_win_points( int $points, int $standing_id ) 3 A league that awards two points for a win, or four with a bonus system. The derived table recalculates from it
anps_standing_tiebreaks( array $chain, int $competition_id ) [ 'pts', 'gd', 'gf', 'name' ] Rank on head-to-head before goal difference. A string is one of the built-in rules — pts, gd, gf, ga, w, p, name — and anything else is called as fn( array $a, array $b, int $competition ): int, which is where your own rule goes
anps_standing_fixture_result( ?array $goals, int $fixture_id, string $home, string $away ) The two numeric score fields as [ 'home' => int, 'away' => int ], or null A sport whose score is not two numbers — sets, frames, legs. Parse the raw strings into the two figures the table adds up, or return null to keep a fixture out of the table entirely
anps_fixture_live_duration( int $seconds, int $fixture, string $sport_slug ) A per-sport table, falling back to two and a half hours A cricket match runs for days and a sprint final for seconds. This is how long a fixture stays live before it is marked finished
anps_ics_duration( int $seconds, int $post_id ) Two hours How long a fixture blocks out in a visitor's calendar when they subscribe to your fixture list
anps_can_view_pick( bool $open, int $post_id, string $tier ) Open unless the pick's access tier is premium or private; editors always see it Wire premium predictions to your membership plugin's entitlement check. This is the only gate — blocks ask it and render a locked state, so nothing leaks
anps_competition_region_code( string $code, string $region, int $competition_id ) A three-letter code from a built-in map, else the first three letters of the region Print ENG where the theme derived PRE, or a code your audience recognises
anps_sport_object_types( array $types ) Posts, predictions, fixtures, competitions, people, clubs, transfers, and products when WooCommerce is active Put the sport taxonomy on a post type of your own
anps_format_object_types( array $types ) [ 'post' ] Let the article-format taxonomy apply to a custom post type as well
anps_person_rewrite_base( string $base ) 'person' /player/lena-hart/ instead of /person/lena-hart/, without a second post type. Re-save permalinks afterwards
anps_show_post_type_menu( bool $show, string $type, string $demo ) Shown when the active demo declares it, or when it holds content You import the team demo but also keep predictions. This is the override that puts the hidden admin menu back
anps_table_datasets( array $datasets ) Four resolvers: fixture_h2h, fixture_team_news, prediction_books, person_by_competition Register your own dataset — slug to callable — and the data-table block offers it under A live dataset
anps_stat_sources( array $sources ) The built-in counters, including the per-analyst figures Add a figure of your own to the stat-band block's Counted from this site list. Each callback returns a display-ready string
anps_facet_defaults( array $defaults, string $post_type ) [] — nothing pre-selected Open an archive on a narrower view than everything: taxonomy name to a comma-separated list of term slugs. It applies to the board, its counts and its pagination together
anps_facet_query_vars( array $map, string $post_type ) Every taxonomy registered on the post type, by name and by query var Filter a board on a taxonomy under a different URL argument
anps_facet_sorts( array $sorts, string $post_type ) The sort vocabularies the prediction board and the leaderboard own Add a sort order — key to WP_Query arguments — and it appears in the filter bar's menu as well as being honoured by the query

Shop and services

Filter and arguments Default Why you would use it
anps_is_service_product( bool $is_service, int $product_id ) false — the base theme has no service concept Mark bookable products as services so they are not treated as retail stock. Called on every purchasability check, so cache rather than query per call
anps_product_kind_taxonomy( string $taxonomy ) '' Name the taxonomy you store the retail/service distinction in, so category counts can be narrowed to one kind
anps_service_product_ids( array $ids ) [] Publish your bookable services as a list — the AI summary file builds its Services heading from this
anps_catalog_only( bool $catalog_only ) The Catalog mode option Force a catalogue-only shop from code, for a build where nothing is ever purchasable
anps_load_commerce_styles( bool $needed ) Whether the page renders any commerce markup Force WooCommerce's stylesheets back on for a page whose commerce output the theme cannot see — a shortcode from another plugin, say
anps_buybox_low_stock_amount( int $floor, WC_Product $product ) WooCommerce's own low-stock amount, or 2 Say "only 5 left" at a different threshold, or per product
anps_product_base_template( string $base, array $templates ) 'single-product' You route some products to a second single template; name it here so the demo's variant sits in front of the right base

Buttons, maps and page chrome

Filter and arguments Default Why you would use it
anps_cta_url( string $url, array $attributes ) The block's own URL, else the Action URL option Deep-link every primary action into a booking engine. $attributes['context'] tells you which surface asked — action-cta, locations or sticky-bar
anps_directions_url( string $url, string $address ) A Google Maps directions deep link built from your business address Point Directions at Apple Maps, OpenStreetMap or your venue's own arrival page
anps_map_embed_url( string $url, string $address, int $zoom ) A Google Maps embed for your business address Swap the embedded map for another provider. The consent gate follows the filter — it names the host it finds in whatever you return, so the disclosure text stays truthful
anps_sticky_bar_hidden( bool $hidden ) Hidden on cart and checkout Suppress the sticky mobile bar on a landing page with its own call to action
anps_sticky_bar_demos( array $demo_slugs ) [] Your own demo's design includes the bar: add its slug and the bar's Automatic mode turns on for it
`anps_news_byline_avatar( string $html, WP_User int $author )` An initials avatar on the author hero and the author grid; empty on the article byline, which then draws initials. There is deliberately no Gravatar request
anps_demo_styles( array $slugs ) Every demo-*.css bundle found in the theme A build that enqueues a demo bundle from somewhere else. auto is added after the filter and cannot be removed
sportpulse_demo_bundle_aliases( array $aliases ) tipster-light → tipster, news-light → news Point a demo variant at another demo's compiled stylesheet. Lives in the theme, so it works with the plugin deactivated
sportpulse_article_post_types( array $types ) [ 'post', 'spx_guide' ] Give a long-form post type of yours the article skin — the same measure, typography and furniture as a post
sportpulse_localise_root_links( bool $localise, array $block ) true on a subdirectory install Stop the theme rewriting root-relative links under the site's directory for one block's output

Forms, spam protection and the newsletter

Filter and arguments Default Why you would use it
anps_form_client_ip( string $ip ) REMOTE_ADDR, and nothing else A site behind a reverse proxy or Cloudflare, where every visitor otherwise shares one rate-limit bucket. Returning a forwarded header is a deliberate decision to trust it — the theme will not do that for you. The address is hashed before it is stored either way
anps_form_rate_limit( int $limit ) 5 submissions per window, per address Raise it for a busy contact page, or lower it for a form under sustained abuse
anps_turnstile_keys( array $keys ) The keys from Theme Options, else the two constants Keep credentials in a secrets manager rather than the database. Return [ 'site_key' => …, 'secret' => … ]
anps_newsletter_bridge_payload( array $body, string $email, array $tags ) The fields the newsletter card posts, including your extra pairs Add the list id, source or custom field your email provider requires

Search results, structured data and AI

Filter and arguments Default Why you would use it
anps_meta_description( string $description, mixed $queried_object ) The page's own description, or '' when an SEO plugin owns the head Force a description onto a page the theme deliberately left alone, or return '' to suppress the theme's entirely. Applied after the stand-down, so there is nothing to unhook
anps_schema_ticket_url( string $url, int $fixture ) The fixture's own permalink Publish your ticketing provider's deep link in the fixture's structured data, so a search result's ticket link lands on the real basket
anps_business_types( array $types ) The schema.org types offered in Business info Publish as a type the list does not offer. Adding it here both offers it in Theme Options and accepts it on save
anps_business_type_labels( array $map ) Plain-English label per type Give the type you added a readable label, so the AI summary file names it properly instead of falling back to "Local business"
anps_llms_txt_enabled( bool $enabled ) true Turn the llms.txt file off without a settings row — see AI assistants and the llms.txt file

Elementor

Filter and arguments Default Why you would use it
anps_elementor_clean_ui( bool $clean ) true The theme skips Elementor's onboarding wizard and its opt-in prompts so a fresh install lands in a clean editor. Return false to leave Elementor's own admin experience exactly as it ships

What is not a filter

Some things people ask for are settings, not code:

If you need a hook that is not here, ask before you fork: a filter we add for you ships in the next update and keeps working. See Getting support.

Translating the site

Two different jobs share one word. Translating the theme means putting the handful of words the theme itself prints — "Read more", "Add to basket", a form's "Sending…" — into your language. Running a multilingual site means every page existing twice, in English and in Spanish, with a switcher between them. The first needs nothing but a .po file. The second needs a multilingual plugin, and the theme ships the configuration it asks for.

One language, not English

If your whole site is in one language and that language is not English, you do not need a multilingual plugin at all.

  1. Set Settings → General → Site Language to your language. WordPress downloads its own translation.
  2. If a translation of the theme's own words exists for that language, it is used automatically.
  3. If it does not, make one. The catalogue to translate is languages/sportpulse.pot in the theme and languages/anps_theme_plugin.pot in the plugin — two files, because the theme prints the words around your content and the plugin prints the words inside the blocks. Open either in Poedit, translate, and save the result as sportpulse-es_ES.po/.mo into wp-content/languages/themes/, and anps_theme_plugin-es_ES.po/.mo into wp-content/languages/plugins/.

Save them in wp-content/languages/, not inside the theme: files in the theme are replaced by the next update, files in wp-content/languages/ are not.

Your own content — the words you typed into a block, a fixture's venue, a product's description — is not in those catalogues and never will be. It is content, and you edit it directly.

Two or more languages, with WPML

The theme is built for WPML and ships the configuration file it reads: wpml-config.xml, in the theme folder and in the plugin folder. You do not have to do anything with that file. WPML finds it, and the moment it does, everything below is already set up the way it should be.

What you need installed: WPML Multilingual CMS, WPML String Translation (for the Theme Options texts) and, if you sell, WooCommerce Multilingual. Media translation is optional — see the note about images.

What the file tells WPML:

What How it is set up Why
Fixtures, competitions, people, predictions, bookmakers, programmes, coaches, camps, players, guides, offers, locations and every other sport record Translatable They are your content, and each one has its own page
Contact messages Not translatable They are what a visitor sent you; a second copy in another language is not a translation, it is a duplicate of someone's enquiry
Sports, seasons, roles, markets, flags, topics and the other tag-like lists Translatable The names show on the page, so a translator should be able to retype them
The three hidden lists the plugin maintains for itself Not translatable They are rebuilt from your records automatically. Editing them by hand, in any language, breaks the link between a prediction and its match
Every text field on a record — a bookmaker's pros and cons, a programme's fees table, a coach's quote Translatable, row by row The repeating tables are unpacked into their individual lines, so you translate "Fast withdrawals", not a wall of code
Scores, dates, odds, prices, coordinates, colours, ids and the like Copied A translated kick-off time or a translated hex colour is a bug. WPML keeps these in step across languages instead
Every block's own words — headings, kickers, button labels, empty-state text Translatable The bands keep their text in the block, not in the page body, which is exactly what the configuration file exists to tell WPML
Layout choices inside a block — which variant, which icon, how many columns Not offered They are settings that happen to be words. Translating "grid" would break the layout of the translated page
Theme Options: the business name, the address, the footer line and the main call-to-action link Translatable as admin texts WPML → String Translation is where you translate them
Theme Options: the logo, the membership product and the members page Copied, and converted Set them once in your main language; WPML points each language at its own translated logo, product and page
Author profile fields — job title, location, languages, the beats they cover Translatable These print in the byline, so they belong in the translation editor

Two practical notes:

After a demo import

Import the demo first, in your main language, then add the second language. An import writes several hundred records; doing it with two languages already active makes WPML queue a translation job for every one of them.

Other multilingual plugins

Polylang reads the same wpml-config.xml file, so most of the table above applies to it as well.

TranslatePress and similar front-end translators work differently — they translate the rendered page and need no configuration from the theme. They work here too; you will simply not see the fields listed above anywhere, because that plugin never looks at them.

Whichever you choose, run one. Two multilingual plugins on one site fight over the same URLs.

Right-to-left languages

Arabic, Hebrew, Persian and Urdu need nothing beyond setting the site language. Every layout in the theme is written in logical properties, so the whole design mirrors itself — including the demos' asymmetric bands, the fixture rails and the shop. There is no separate RTL stylesheet to enqueue and no setting to find.

Block reference

Every band in every demo page is a block, and this is the list of them. It is here for one question: what is this thing on the page I am editing, and what is it for?

This chapter is generated from the theme plugin itself each time the manual is built. Every name and every description below is the same text the block inserter shows you in the editor, read from the block's own definition — so the manual and the editor cannot drift apart, and a band added to a demo appears here without anybody retyping it.

How to look a block up

Click the band on the page. Its name appears in the block toolbar and in the editor's list view; the settings sidebar shows the same name at the top of the Block tab. That is the Name column below.

If you want the exact identifier — useful in a support message, or when you are reading a page's markup — open the block's options menu (the three dots) and choose Edit as HTML. You will see a comment naming the block, like <!-- wp:sportpulse/egaming-map-breakdown -->. Everything after the slash is the Block column below.

Reading it the other way round works too: pick a family, skim the descriptions, and insert the band you want by typing its name into the inserter. Chapter Building pages explains the families and the handful of blocks you will edit every day; this is the complete list behind it.

A few things worth knowing before you skim:

The plugin registers 290 blocks in the sportpulse/ namespace.

Family Blocks What it covers
Shared blocks 45 Used by every demo: page furniture, business data, commerce, content lists.
Tipster demo blocks 3 The tipster workspace: its bar, its rail and the featured pick.
News demo blocks 38 The newsroom: scores board, live blog, transfer centre, video hub.
Team demo blocks 51 The club site: page heads, next match, league table, squad, tickets, store.
E-gaming demo blocks 69 The esports organisation: divisions, matches, roster, watch pages, creators.
Academy demo blocks 43 The academy: programmes, coaches, stages, fees, enquiries.
Betting demo blocks 41 Oddsmark: bookmaker tables, offers, guides, reviews, responsible-gambling bands.

Shared blocks

45 blocks, with no prefix.

Block Name What it draws
action-cta Action CTA The theme's primary call to action. Points wherever Theme Options says, so one setting retargets every CTA in the theme. Renders nothing when there is no destination.
before-after Before & After A draggable before/after image comparison with corner tags and a caption.
blog-sidebar Blog sidebar The blog's side column, shown only when Theme Options → Blog turns it on. Its contents are the Blog sidebar template part.
business-info Business Info One field from the central business settings — the single source of truth for NAP consistency.
category-tiles Category Tiles A row of real product category tiles: the category's own image, its name and its live product count. Nothing to keep in sync — add a category and it appears.
chart-panel Profit chart An analyst's cumulative profit as a full-size area chart, with the headline figure, a zero line and a strip of supporting numbers. Every figure is read from the settled-pick ledger.
classic-menu Menu (Appearance → Menus) The menu assigned to a theme location under Appearance → Menus. Collapses to a drawer on small screens.
data-table Data table A real table — plan matrix, head-to-head, breakdown — in a shell that scrolls sideways and can be reached by keyboard. Type yes or no in a cell for a tick or a dash.
earnings-calculator Earnings calculator Two sliders — subscribers and monthly price — over a panel working out the gross, the platform's share and what the analyst keeps.
fact-list Fact list A titled card holding a flat list of facts — label and value rows, a ticked eligibility list, or titled notes with an address and small print.
faq FAQ Questions and answers as an accordion. Keyboard-operable and indexable with no JavaScript, and the pairs feed your FAQ schema.
filter-bar Filter bar Filter chips above a board, or a stacked rail beside one. Every chip is a real link with the query argument applied, so a filtered view has its own URL — and the counts are queried, never typed.
filter-clear Clear Filters Link A "Clear all" link that appears only when shop filters are active. Lives inside the Product Filters region so it re-renders as filters change.
fixture-board Fixture Board A rail card listing fixtures from a live query — the match, the competition or round under it, and the kickoff time or a live marker at the end.
fixture-header Fixture Header The masthead of a fixture — the two clubs as the page's heading, the kickoff, the competition path and a countdown. Every string is read from the fixture and the pick that points at it.
form Contact Form A heading, name, email, topic chips, any extra fields the page needs, a message and a consent line. Sends to the site's business email and stores every message under Messages.
form-strip Team form Recent form for the sides of a fixture — each team's last results as a run of dots, with the season numbers under them. Reads the fixture's own record, or rows typed by hand.
instant-search Instant Search As-you-type product search. Queries the WooCommerce Store API and presents results as an ARIA combobox listbox — keyboard navigable, screen-reader announced.
leaderboard Leaderboard Analysts ranked by their own record — as a card grid, a ranked table, a podium, a compact rail or one profile in full. Every figure is computed from published picks, so nothing here is typed by hand.
legal-doc Legal document Terms, privacy, refunds or responsible gambling. The contents list and the headings come from one list of sections, so they cannot drift apart.
locations Locations Your branches as cards — photo, address, open-now, a call to action and directions. Reads the Locations post type.
map-directions Map / Directions Consent-gated map of the business address, plus a Get directions deep link. Nothing is requested from the map provider until the visitor asks for it.
newsletter-card Newsletter card A gradient sidebar card — an icon, a heading, a sentence and one email field. Signups arrive under Messages with the topic "newsletter" and are emailed to the site's business address.
page-hero Page Hero The masthead: kicker, headline, lede, buttons and optional media — a wash behind the copy, or a real photograph in a plate beside or below it. On a single or an archive it can take its text from the post or term itself.
people-grid People Grid A team band — kicker, heading and lede over people as cards. Portrait or monogram, name, role and an optional bio. Filters by role, so one block renders a squad, a coaching staff or an analyst roster.
person-card Analyst card One analyst: avatar, verified name, specialism, their record from the ledger, recent form and a subscribe or profile button. Reads a chosen person, the one on this page, or the one behind this pick.
post-grid Post Grid The news card grid — the post list on the blog and archives, a latest-posts band anywhere, or the related posts under an article.
prediction-grid Prediction Grid Picks from a live query, as cards, rows, a results table or a ledger — sport and competition, badges, kickoff, the selection or its locked state, odds and the analyst. Never a manual copy of the ledger.
prediction-panel Prediction Panel One pick, at the size of an answer — the selection or its locked state, then odds, stake and kickoff, and who published it. Everything comes from the prediction itself, so there is nothing here to retype.
pricing Pricing plans Plan cards with an optional monthly/annual switch. The switch and the prices it changes are one block on purpose — split apart, moving the switch breaks every price.
product-buybox Product Buy Box The product buy-box: category·brand overline, title, rating, price, size-card variation picker, quantity, add-to-cart with price, stock line and trust row.
product-extras Product Extras The product-single lower sections: description tabs + benefits card and a review histogram — all from the current product.
product-restock-alert Back-in-Stock Alert Captures an email address against a sold-out product and lands it in Messages, spam-guarded. Renders nothing while the product is in stock.
promo-card Promo card One offer: a price, what it buys, and the button that takes it. Stacks as a card in a sidebar or opens into a wide split panel.
quick-view Quick View A button that opens an accessible modal previewing a product — image, price and a Store API add-to-cart — without a page load.
quote-grid Quote Grid Testimonial cards — a star rating with a text equivalent, a quote, and the member who gave it. Manual copy, so it says what you want it to say.
search-results Search Results Results across every content type the site has — predictions and analysts as well as posts — with a type filter.
shop-banner Shop Banner Image The shop archive's banner photo — the featured image of the page set as WooCommerce's Shop page. Renders nothing when that page has no featured image.
stat-band Stat Band A row of big numbers with labels. Each cell is typed by hand or computed from the site's own content.
step-list Step list A numbered how-it-works band, as a card grid, a connected timeline, or one wide panel with the steps beside a heading and a CTA. Numbering is positional, so deleting a step never leaves a gap.
sticky-action-bar Sticky Action Bar Mobile-fixed bar with up to three actions, wired to Business Info, the site call to action and the cart.
ticker Ticker The scrolling strip above the header — a lead cell over live scores, headlines or a promo line. Reads the fixtures you already maintain, or a list you type. A CSS marquee with a pause button, and it stops entirely for reduced motion.
toc Contents A contents rail built from the headings in the post it sits beside, highlighting the section the reader is in. Nothing to maintain — it follows the article.
wishlist-button Wishlist Button Heart toggle that adds the current product to a client-side wishlist.
wishlist-drawer Wishlist Drawer Header icon with a live count and a slide-out list of wishlisted products.

Tipster demo blocks

3 blocks, prefixed tipster-.

Block Name What it draws
tipster-featured-pick Pick of the day One prediction as a wide panel: a photograph on one side, the selection, the odds and the analyst on the other.
tipster-workspace-bar Tipster workspace bar The tipster demo's signed-in app bar: wordmark, workspace chip, publishing status, the compose action and the analyst's identity. Demo-prefixed — it names a workspace no other demo has.
tipster-workspace-rail Tipster workspace rail The tipster demo's sticky workspace column: the section links, a payout callout and the notice that published picks cannot be changed. Demo-prefixed — it names a workspace no other demo has.

News demo blocks

38 blocks, prefixed news-.

Block Name What it draws
news-ad-slot News Ad Slot A paid placement as a native card — sponsor, headline, copy and a call to action beside the creative — with the ADVERTISEMENT label, the PAID PARTNERSHIP mark and rel="sponsored" the renderer always emits. Draws nothing at all when no slot of the format is published.
news-archive-cards News Archive Cards Archive cards: the year a piece is about, large, over its photo, with the title and reading time.
news-author-hero News Author Hero An author's page head: portrait, role, name, where they are based, since when, languages, the bio, their beats, and the follow, handle and email buttons. Its stats part prints the four figures. Reads the author being viewed.
news-authors News Authors The newsroom: every author with a story, as a list beside a page or a grid on the team page. Role from the profile, initials or the site's avatar.
news-byline News Byline Who wrote the story, their job title, when it was published and how long it takes to read — as the hero byline line, or as the author card under the article.
news-competition-head News Competition Head A competition's page head: breadcrumb, sport, name and abbreviation, region, the match / played / teams / live figures, the next match and a follow button. Reads the competition being viewed; a featured image on it becomes the backdrop.
news-contact News Contact Desk The contact desk: route cards (who reads what, how fast) and one form that follows the picked route — heading, desk, reply time, address and prompt all switch — posting to the site's message store.
news-error-board News Error Board The not-found page's scoreboard: a venue line, two sides, the status code as the score, and a few status rows. Every word is an attribute.
news-feature-band News Feature Band A full-bleed band for one long-form video: its poster behind, kicker with the running time, the title with the last words in the accent colour, standfirst, Watch button and credit.
news-formats News Formats & Rates A rate card as an accordion: each format opens to its specs and the note on what is not for sale. One open at a time.
news-interviews News Interviews Interview cards: the piece’s photo with its pull quote over it, then the interviewee, their role and the reading time. The quote is the post excerpt; the interviewee is the Feature fields.
news-issue-chart News Issue Chart The chart of the day inside a newsletter issue: a label and a row of bars, one of them lit. Bar heights are typed as percentages.
news-live-blog News Live Blog A timeline of live updates — the full live-blog stack with its pinned summary, or the one-line transfer wire. Server-rendered, no polling.
news-magazine-head News Magazine Head The magazine masthead: kicker, a big title with an accent word, a description on the right, and an edition line — issue number, today, how many pieces are new this week and the average reading time, the last two counted.
news-match-centre News Match Centre A match's timeline, comparison stats or lineups, read from the fixture the page is about. The score header is fixture-header's job, not this block's.
news-media-chapters News Media Chapters Named chapters and a timed transcript that seek the video above them. Pairs with core/video, which keeps its own native controls.
news-newsletter-hub News Newsletter Hub The newsletters on offer, read from the series terms, or the back catalogue of sent issues. The sample issue itself is an issue's own content.
news-on-now News On Now The strip above the Watch page: what is streaming live and what is coming up, with the state computed from each stream's start time.
news-player-of-match News Player of the Match The player of the match card: photo, rating, name, position, five figures and the verdict. Read from the fixture's own Player of the match box.
news-reading-progress News Reading Progress How far through the story the reader is, and how long it takes: "38% · 22 min read". Sits in a reading header.
news-scoreboard News Scoreboard A match as a masthead: state, competition and round, crests, names, form, the score and the half-time line, then kickoff, venue, attendance and referee. Reads the fixture the page or the story is about.
news-scores-board News Scores Board Live scores from a fixture query — the full board grouped by competition, or the compact strip a news home page runs under its lead story.
news-scores-dates News Scores Dates A week of days centred on today, each a link to the board for that day; today carries its live count.
news-scores-head News Scores Head The scores page's masthead: how many matches are live, the title, the day's fixture count and update time, a search box that filters the board, and an auto-refresh switch.
news-search News Search Results The newsroom's search: the count line, type and sport facets, a sort, and result rows with the term lit. Reads the search query and its own type/sport/sort parameters.
news-section-head News Section Head The masthead of a section archive: kicker, the section's name and description, a follow button and live counts of this month's stories and the reporters behind them, over the newest story's photo.
news-section-nav News Section Nav The bar under a section masthead: the section's sub-topics as chips (its child categories, or its most-used tags) and the top-level sections as tabs.
news-series News Series One series of long reads: a cover card for the series and its chapters beside it, in order, with reading times — and the publishing date for a chapter still to come.
news-share News Share Rail The share rail beside a story: the device's own share sheet, email, copy link and print. No tracking scripts and no third-party buttons.
news-shows News Shows The newsroom’s own shows as cards: cover, latest episode number, description, presenter and episode length — from the Shows taxonomy.
news-sport-tiles News Sport Tiles The sports the site covers, as photo tiles: one per category, with the tile line and photo from the category's Tile fields (or its description and newest story) and a live count of the reporters on that beat.
news-standings News Standings A compact league table — position, team, played, goal difference, points — for one competition, or for the competition of the section being viewed.
news-team News Team One section of the newsroom — leadership, writers, the video desk or the contributors — from the Team members, each section in its own shape.
news-transfer-centre News Transfer Centre Transfers in three views — the done-deals table, the rumour mill with its reliability gauge, and a per-club spend tracker computed from the confirmed deals.
news-video-cues News Video Cues A video's chapters or transcript, read from its own body: a heading or paragraph that opens with a time ("02:14 The six-second window") is a cue. Click seeks a self-hosted video; the current cue lights as it plays.
news-video-hub News Video Hub Video posts as a grid, a horizontal rail or a live row. Queries posts by format, so a video is still an article with an author, a category and a URL.
news-video-player News Video Player The featured video with its title, standfirst and presenter, and an up-next rail of the newest clips beside it. Plays whatever the post’s Video URL points at.
news-window-hero News Window Hero The transfer window masthead: kicker, title, description, a live line with the time of the latest wire update, a deal-alerts button and a countdown to the moment the window shuts.

Team demo blocks

51 blocks, prefixed team-.

Block Name What it draws
team-404-stage Team 404 Stage The not-found stage: a ghosted 404 behind the headline, the search field, and the two ways back — the club home and the browser's own history.
team-account Team Account Dashboard The club store's account dashboard: the greeting, three figure tiles, the membership banner and the recent-orders table. It renders on the account dashboard only, and reads the signed-in supporter's name, tier and membership number from their profile.
team-article-figure Team Article Figure The story’s featured photo with the caption and photography credit typed in the post’s Story box.
team-article-head Team Article Head An article's head: the breadcrumb (news link and category), the title, the standfirst (the excerpt), and the byline row with the author's face, name, date, read time and share buttons. Reads the post being viewed.
team-author-card Team Author Card The card under an article: the author's face, name and a line about them. Reads the post being viewed; the name and line can be overridden.
team-availability-table Team Availability Table Upcoming fixtures as a table with a status chip per row: hospitality availability on home matches (date, kick-off, price category, from-price) or away travel (depart time, distance, coach and ticket prices, seats left). Every figure comes from the fixture's Hospitality & away travel panel.
team-buybox Team Buy Box The club store's buy box: name, price and member price, stock line, description, the size pills, the optional printing panel, the quantity stepper and an add-to-cart button carrying a live total. Sizes, sold-out sizes and the printing fee come from the product's Store panel.
team-cart-link Team Cart Link The store's header actions: an account link and a cart button carrying the number of items. Renders on the store, a product, the cart, the checkout and the account only — every other page keeps the header's own call to action.
team-category-chips Team Category Chips The news page's category row: an "all" chip with the total, one chip per category with its count, the queried category highlighted, and the article count on the right.
team-checklist Team Checklist A card of lines: a tick list in one or two columns, label-and-value rows (loyalty points), or title-and-text pairs (a ground guide). A heading, a small label on the right and a footnote.
team-competition-tabs Team Competition Tabs The sand strip of competition tabs under a page head. Every competition is a tab; the league's tab points at the league table page.
team-contact-cards Team Contact Cards Contact cards in four shapes: departments (icon, copy, a direct number, an inbox and opening hours), a compact list of other contacts, the club's postal address, or a row of link tiles.
team-crest Team Crest A club's crest as the lettered hexagon the Team demo draws: a chosen club's colour and initial, or your own letter and colour. Optionally the site's home link, for a header.
team-cup-path Team Cup Path A knockout competition round by round: the rounds set on the competition, each matched to our fixture in that round — played with score and report, next with time and tickets, pending with a note.
team-data-table Team Data Table A four-column card table: name, detail, value, note — parking, travel, availability.
team-fixture-list Team Fixture List Every fixture of the club flagged as ours, in two tabs (upcoming, results) grouped by month, with competition, month and venue filters. Rows: date, crest, opponent, venue, competition chip, time or score, and the action.
team-form-strip Team Form Strip Recent form badges, the season's numbers and the next fixtures as mini cards, for the club flagged as ours.
team-grid Team Grid The people on your Team screen, as cards — portrait or monogram, name and role.
team-history-cards Team History Cards The history page's three shapes: the trophy cabinet (a competition, how many times, the seasons and the runners-up), the record book (a title, what it refers to and the figure), and the hall of fame (a portrait, the years, the name and the one number they are remembered for).
team-identity Team Identity The club's identity: a crest card with the motto and what each element of the crest means, beside the story of the colours and a card per colour.
team-info-cards Team Info Cards Cards with an icon tile, a title and a line of copy, in five shapes: values (numbered, four across), transport (icon beside the title with a small print on the right), access (navy tile, three across), notes (title and copy, small), and pay (icon, title, line and a right-hand figure; one row highlighted).
team-league-table Team League Table A league table from the standings, with our club's row tinted. Blank competition = the league our club sits in.
team-legal-doc Team Legal Document The chrome around a policy: the list of the club's other documents, the sections of this one, a card pointing at a person, and the foot bar that prints it. The document list and the contents are read from the pages themselves, so neither is a list a buyer has to keep.
team-match-centre Team Match Centre The body of a match page. After the match: key events with the half-time and full-time lines, statistics bars, line-ups with formations and substitutes. Before it: form and season figures side by side, head to head, team news. The state follows the fixture, never a setting.
team-match-head Team Match Head A match page's masthead: competition and round, date and venue, both crests, and either the score with the scorers, referee, venue and attendance (after the match) or the kick-off with a countdown and gates-open time (before it). Reads the fixture being viewed.
team-match-rail Team Match Rail The article rail: on a match report, key events and match stats from the fixture; on every post, the next match card. Reads the post being viewed.
team-match-story Team Match Story The story filed under a match — the report after it, the preview before — as a photo card: category chip and headline on the photo, the standfirst, the opening paragraphs, the byline.
team-next-match Team Next Match The Team demo's front-page hero: the next fixture with both crests, league positions, kick-off, a live countdown and two buttons. Reads the club flagged as ours.
team-package-cards Team Package Cards Photo cards in two shapes: posters (chip on the photo, play mark, title and copy over the photo) and stands (photo band with title and status chip, copy, small print, an adult price and saving).
team-page-head Team Page Head The Team demo's page masthead: a navy band with a mono kicker, a two-tone title, a lede, and on the right either stat cells or the last match. Can read the queried competition.
team-partners Team Partners The club's commercial partners, from the sponsor records: a wordmark strip for the footer and the partner wall, or cards carrying the category, a line about the business and the year the agreement started.
team-plan-cards Team Plan Cards Plan or product cards: icon tile, name, a small line, the price and its period, a line of copy, a button. One can be featured in navy with a badge.
team-plan-compare Team Plan Compare A benefits matrix: one column per plan with its price, one row per benefit with a tick, a dash or a word in each cell.
team-player-grid Team Player Grid Player photo cards from the squad: number, position, name and this season's appearances and goals.
team-player-hero Team Player Hero A player page's masthead: back link, number and position chip, nationality · age · height, the two-tone name, four season figures, the shirt and highlights buttons, the portrait flush to the band and a ghost number behind it. Reads the player being viewed.
team-player-stats Team Player Stats One card of a player page: the by-competition table with totals, the shooting and duels card, the key facts, or the career rows. Reads the player being viewed.
team-price-table Team Price Table A price grid by stand: four price bands per row, two categories switched by chips (tickets) or one set with a per-match figure and saving where any price can be selected to compare (season cards).
team-promo Team Promo A promotional card: kicker, heading, a line of copy and a button, on a navy photo or on paper with a floating product shot.
team-schedule Team Schedule A card of times and what happens: the matchday timeline, with one row highlighted.
team-scoreline Team Scoreline The navy scoreline card on a match report: competition and matchday, date and kick-off, crests and names, the score and status, the scorers, venue · attendance · referee, and the match-centre link. Reads the fixture the post is filed under; renders nothing on other posts.
team-search-head Team Search Head The search page's masthead: the number of results and the query in the heading, the search field itself, and a row of popular searches.
team-search-results Team Search Results Everything the search found, as rows a reader can filter by type and re-sort — articles, players, fixtures, products and pages, each searched in its own right. The first row is the best match; the sidebar counts the types and offers related searches.
team-section-head Team Section Head The Team demo's section head: a claret dash kicker, a two-tone heading, an intro, and on the right either an outline button with an icon or a line of small print.
team-staff-grid Team Staff Grid Staff cards from the Staff post type: portrait, role, name, a line of biography, nationality and the year they joined.
team-stand-map Team Stand Map The ground as a schematic: a pitch with a stand on each side, the selected stand's card, and the capacity list with the total. Selecting a stand needs no page load.
team-stat-band Team Stat Band A white band of figures: value over a small-print label, six across.
team-steps Team Steps Numbered steps in three shapes: rows (number, title, line), cards (kicker, title, copy, step label at the foot) and tiles (number, title, kicker, copy). One card or tile can be highlighted.
team-store-grid Team Store Grid The club store: category chips, a sort control and the product cards — badge, name, price, the member price, the stock line and add to cart. Products, categories and stock come from WooCommerce; chips and sorting run in the page.
team-ticket-list Team Ticket List Upcoming home matches as ticket rows: date, crest, opponent, competition and kick-off, the sale status pill, the adult-from price and category, and Buy or Remind. Status, on-sale date and category come from each fixture's Tickets panel.
team-timeline Team Timeline Years and what happened: two columns of dates, or a single rail with era chips that filter it in the page.
team-top-scorer Team Top Scorer A photo card for one player with goals, assists and appearances. Blank player = the squad's top scorer.

E-gaming demo blocks

69 blocks, prefixed egaming-.

Block Name What it draws
egaming-404-hero Egaming 404 Hero The not-found stage (design 93): the headline, a search field, two ways back, and the next match with its countdown.
egaming-account Egaming Account Head The My Account greeting and log-out (design 88), above WooCommerce's own account screen.
egaming-alert-divisions Egaming Alert Divisions Choose your rosters (design 89): a button per division with a tick, then the channels — email, browser push, calendar feed. The divisions are the Division records; the notes and channels are manual.
egaming-alert-signup Egaming Alert Signup The alerts signup (design 89): an ink band — kicker, heading, a paragraph, the selection as chips, the privacy note — beside the form: email, time zone, two options, subscribe. Posts to the theme's message store.
egaming-alert-types Egaming Alert Types The kinds of alert (design 89): a card each with a switch, the icon, the name, a sentence and an example. The switches feed the signup's selection. Manual rows.
egaming-article-facts Egaming Article Facts The article's rail (design 80): the facts card (label / value rows from the post's Facts panel) and the next-match card — the match the story is filed under, else the next match of the story's game. Reads the post being viewed.
egaming-article-head Egaming Article Head The article masthead (design 80): the back link, the section tag in the game's colour, the headline, the standfirst (the excerpt), the author with their title, the date and the reading time, and the share buttons. Reads the post being viewed.
egaming-buybox Egaming Buy Box The product page's buy column (design 88): category, name, rating, price and stock, the blurb, size pills, quantity and add to cart, then the facts.
egaming-channels Egaming Channels The org's official channels (design 83): a card per platform with its handle and what it carries.
egaming-community Egaming Community A kicker over cards of a figure and a sentence, then a card with a note and two buttons (design 84's community column). Manual copy.
egaming-comp-cards Egaming Competition Cards Every competition as a card (design 77), grouped as current, upcoming and completed with a section head each; a game and a year select narrow them in the page. Reads the Competition records.
egaming-comp-hero Egaming Competition Hero The competition masthead (design 78): the back link, the game and state tags, the organiser, the H1, the introduction (the first paragraph), the facts (placement · dates · prize pool · field · venue) and the broadcast channels. Reads the competition being viewed.
egaming-comp-progress Egaming Competition Progress A division's competitions in progress (design 72): name, stage, the note in violet and a gradient progress bar — from the division's own rows.
egaming-comp-table Egaming Competition Table How the competition stands (design 78): the group table and the playoff bracket behind a pair of buttons, under their own section head. Reads the competition being viewed.
egaming-contact Egaming Contact The desks (design 90): a card per desk — icon, reply time, name, what it is for, the address — and, in the well below, the selected desk's form beside who reads it, the office and the privacy note. Manual desks; posts to the theme's message store.
egaming-creator-cards Egaming Creator Cards Creators as compact cards: the ringed portrait, handle, role, followers and platform. Reads the Creator records.
egaming-creator-grid Egaming Creator Grid The creator directory (design 81): category chips and a live-only toggle over cards — the face with the category and LIVE / OFFLINE, the handle, the real name, the main platform with its followers, what is on now or the channel note, the hours, and Watch or Profile. Reads the Creator records.
egaming-creator-hero Egaming Creator Hero The creator masthead (design 82): back link, the portrait with a LIVE pill, the category tag and the kind line, the handle as the H1, the real name, the tagline, the figures and the platform chips with follower counts. Reads the creator being viewed.
egaming-creator-live Egaming Creator Live A creator's live card and weekly schedule (design 82): the stream's scene with the LIVE ON pill, the title, started · watching, Watch and Follow, the next scheduled slot; beside it the week, day by day. Reads the creator being viewed.
egaming-division-cards Egaming Division Cards The divisions as cards (photo with the game name, roster and captain, the record line, the next match), as a compact list (since · players · now), or as photo tiles.
egaming-division-hero Egaming Division Hero The division masthead (design 72): the tag chip, region and founding year, the game as the H1, the headline in the game's gradient, the introduction, the channels and the four figures — all from the division being viewed.
egaming-enquiry Egaming Enquiry The partnership enquiry (design 87): an ink band with the pitch — kicker, heading, a paragraph, label / value facts — beside a form of name, company, work email, the kind of partnership and a message. Posts to the theme's message store.
egaming-fact-rows Egaming Fact Rows Label and value rows (design 92): a legal entity, a register number, a retention period.
egaming-faq-cards Egaming FAQ Cards Questions and answers as cards (design 89). Manual rows.
egaming-gallery Egaming Gallery An ink band of photos in a mosaic (design 85): the kicker, the heading, the count line, and eight photos placed on a four-column grid. Each photo carries its own crop focus and zoom, and opens in the band's own lightbox. Manual photos.
egaming-hero Egaming Hero The home masthead: a four-photo Ken Burns stage under the veil, the live pill and a kicker, an outlined line over a gradient line, the lede, two buttons, the next-match glass card with a countdown, a row of figures and the slide dots. The card reads the next headline match; the countdown is a small module.
egaming-historic-rosters Egaming Historic Rosters Lineups that won things (design 86): a card per roster — the photo with the game tag, the name and the years, the players as chips and a note. Manual rows.
egaming-honour-cards Egaming Honour Cards Trophies and podiums as four cards with a trophy or medal tile (competition — result, game · year) and an "all trophies" link, or as the compact list a division or player page shows.
egaming-honours-table Egaming Honours Table The record (design 86): every honour of every division as a table — year, game, competition with its result, roster, prize — with a game select, a year select and a trophies-only toggle. Reads the divisions' honours.
egaming-leader-cards Egaming Leader Cards The people who run the org (design 84): a card per Staff record in the group — the photo, the name, the role and a line of biography.
egaming-legal-doc Egaming Legal Document The chrome around a policy (design 92): the masthead with its last-updated line, the sidebar (this page's sections, every legal page, cookie settings) and the foot that points at a desk. Every page carrying this block is a legal page.
egaming-link-cards Egaming Link Cards A row of destination cards (designs 91 and 93): an icon, a title and a line, each a link.
egaming-live-pill Egaming Live Pill The live indicator: a pulsing dot with a count of the streams marked live ("1 MATCH LIVE"), or a chip naming the featured live stream. Renders nothing when nothing is live.
egaming-live-strip Egaming Live Strip Two cards: what is live now (the featured live stream and the match it follows — placement, points, viewers, WATCH) and the last result (RECAP →). Both read the records; nothing here is typed.
egaming-location Egaming Location Where the house is (design 85): the address card with its rows and two buttons, and beside it the photo card with a note. Manual copy.
egaming-map-breakdown Egaming Map Breakdown A match's maps (design 76): # · mode & map · our score · their score · standout, winners tinted — or a lobby's games: game · placement · eliminations · points with the total row. Reads the match being viewed.
egaming-match-list Egaming Match List Matches from the fixture records in five shapes: the home table of the next seven days, the match centre with its tabs and filters, the season calendar by month, a division's last results, and a competition's schedule and results.
egaming-match-recap Egaming Match Recap One part of a match page (design 76): the recap (the match body with the full-report button) or the key moments with the VOD & highlights links. Reads the match being viewed.
egaming-milestones Egaming Milestones The org's milestones (designs 84, 86): year, title and a sentence — as a timeline list or as a row of cards, the last one in the accent. Manual rows.
egaming-news-chips Egaming News Chips The newsroom's section chips (design 79): All news, then the categories as links, the one being viewed lit; on the right the count of stories in the view. Reads the main query.
egaming-next-stream Egaming Next & Stream Two cards: the next match (or a player's season figures, or a competition's status and progress) beside the live or next stream. Reads the match, stream, player and competition records for the page being viewed.
egaming-page-head Egaming Page Head The ink masthead every e-gaming page opens with: a photo at low opacity under the veil and two glows, a kicker, the H1 with optional outlined and gradient phrases, the lede, a row of figures, two buttons and a back link.
egaming-partner-strip Egaming Partner Strip The band of partner marks above the footer: six equal cards — the logo or the sponsor's SVG mark, the name, the tier — read from the Sponsor records.
egaming-partner-tiers Egaming Partner Tiers The partners, one band each (design 87): the photo with the mark and the name, the tier tag, since · through, the name, what they do, what they give, and their quote. Reads the Sponsor records above the regional tier.
egaming-player-hero Egaming Player Hero The player masthead (design 74): back link, the portrait with the number, the game and CAPTAIN chips, the role, the handle as the H1, the real name, the tagline, the facts (nationality · age · division · joined · based) and the channels with their follower counts. Reads the player being viewed.
egaming-player-panel Egaming Player Panel One part of a player or creator page: the biography with the career history (74), the equipment card, a creator's platforms (82), a creator's weekly schedule, or the "also a player?" note. Reads the player or creator being viewed.
egaming-prematch Egaming Prematch The pre-match state of a match page (design 76): what is at stake, how both sides arrive (our form from the sibling matches, the opponent's from the match's own rows) and every previous meeting — or, as the rail part, what to watch. Prints nothing once the match is played. Reads the match being viewed.
egaming-prize-bars Egaming Prize Bars Prize winnings by season as bars with the total (design 86), and beside them the trophies by division, counted from each division's honours. Manual bars.
egaming-prize-chart Egaming Prize Chart Prize winnings by season (design 77): a row per year with the competitions entered, the titles won and the total awarded, summed from the Competition records.
egaming-promo Egaming Promo A call to action: the ink card with a photo (the jersey drop), or the full-width photo band (open trials, the creator programme).
egaming-room Egaming Room One room of the house (design 85): the photo with its floor tag, the number, the heading, the lead, a paragraph and the specs — the photo on the left or the right. Manual copy.
egaming-roster Egaming Roster Players as cards (design 72: the portrait, the number, CAPTAIN, the handle, the role, nation · age · since, the card stat), as the filterable archive (73: game chips, role and status selects, the count), as compact avatar rows (78), or as the who-played table of a match (76). Also the staff rows under a division's roster.
egaming-scoreboard Egaming Scoreboard The match masthead (design 76): the game tag, competition · stage, the two sides with the score or the lobby placement, the note, the facts (date · format · venue · stage · notes) and the VOD buttons; above it the switch row — back link and the other featured matches. Reads the match being viewed.
egaming-search Egaming Search Results Everything the search found (design 91) — divisions, players, creators, matches, competitions, news and products — as rows a reader filters by type. One query per type, since core's search ranks posts and pages only.
egaming-search-head Egaming Search Head The search page's masthead (design 91): the query in the heading, the field with a clear link, suggested searches and the result count.
egaming-section-head Egaming Section Head The e-gaming demo's band opener: a dash kicker in mono, a heading whose second phrase is set in the violet–pink gradient, an intro line, and on the right an outline button with an icon or a line of small print.
egaming-staff-grid Egaming Staff Grid Coaches, analysts and managers from the Staff records (design 73): the portrait, the name, the role, and the divisions · nation · since line; chips narrow the cards by kind in the page.
egaming-store-bar Egaming Store Bar The store strip above the shop, cart, checkout and account pages (design 88): Shop, Cart with its count, My account. The current view lights from WooCommerce's own conditionals.
egaming-store-grid Egaming Store Grid The store's products (design 88): category chips, a sort control, the count, the cards and the shipping note. Products, prices, ratings and the badge tag are WooCommerce's.
egaming-story Egaming Story A section head, paragraphs, and beside them a photo card with a caption and a link (design 84) or a kicker with label / text rows (85). Manual copy.
egaming-stream-cards Egaming Stream Cards Streams as cards (design 83): what is live now (the scene, the game, the viewers, the platform, the title, who · started, Watch) or what is coming up (the type, when, Remind). Reads the Stream records.
egaming-subnav Egaming Sub-nav The strip under the header: a label, a row of links, and small print on the right. Four shapes — the store's (shop, cart with its count, account), the legal documents, the rooms of a page (anchors), the divisions (links, or filter chips that narrow the cards below).
egaming-supplier-cards Egaming Supplier Cards The official suppliers (design 87): a card per Sponsor record in the regional tier — the name and what they supply.
egaming-team-cards Egaming Team Cards Every division as a wide card (design 71): the photo with the tag, the game and the founding year; roster, captain, coach and competition; the description; the latest result and the next match; the player avatars; DIVISION PAGE and ALL PLAYERS. Reads the Division, Player, Staff and match records, and narrows to the sub-nav's filter chips in the page.
egaming-ticker Egaming Ticker The gradient marquee under the hero: short mono lines separated by stars, scrolling without end.
egaming-value-cards Egaming Value Cards Numbered cards of a title and a sentence (design 84's values). Manual rows.
egaming-vod-grid Egaming VOD Grid Videos on demand (designs 82, 83): the section head, then platform chips (a creator's page) or content-type chips with a game select (the Watch library), the count, and the cards — the scene with a play mark, the length, the platform, the highlights tag, the title, who · date · views. Reads the Stream records marked VOD.
egaming-watch-hero Egaming Watch Hero The Watch page's stage (design 83): the main live broadcast — LIVE NOW ON pill, title, sub · who, the game tag, started · watching, Watch now and Latest highlights — or, with nothing live, the next broadcast with a countdown, Set a reminder and Watch the latest VOD. Reads the Stream records.
egaming-wordmark Egaming Wordmark The org's wordmark the e-gaming demo draws: an eight-point star in the accent colour beside the site title over the tagline. Optionally the site's home link, for a header or footer.

Academy demo blocks

43 blocks, prefixed academy-.

Block Name What it draws
academy-author-box Academy Author Box The article's author card (design 114): portrait, role, biography and a link to the coach's profile when the author is on the staff.
academy-camp-cards Academy Camp Cards The upcoming camps (design 104), read from the Camp records: photo with an availability pill, dates, name, ages and days, level chips, note, the three prices, a places bar and a button.
academy-camp-panel Academy Camp Panel One part of a camp page (design 105), read from the Camp record being viewed: the ability groups, what's included, what to bring, or the booking rail (availability, prices, phone).
academy-cards Academy Cards The academy's card grid in its many looks: an icon in a gold square or a green circle, a serif number, a step, a value, a dark card on green, a strand with its check list, a person with an avatar, a linked route, a stat, a quote.
academy-checklist Academy Checklist A kicker, a heading and a list (design 106): ticked rows in one card, or a stack of icon cards — what to bring, how parents attend.
academy-closer Academy Closer The green closing card: a photo behind a green veil, a dash kicker, a serif heading, a line of copy and two buttons — or its siblings: stacked buttons with a note, three visit cells, a newsletter form, or a plain well card with a gold border.
academy-coach-cards Academy Coach Cards The coaches, from the Coach records: the home cards, the people cards with accreditation, the compact cards, the camp team and the leadership cards.
academy-coach-panel Academy Coach Panel One part of a coach's profile (design 100), read from the Coach record being viewed: the philosophy quote, the qualification cards, the coaching and playing backgrounds, or the specialism cards with the programmes coached.
academy-date-cards Academy Date Cards Stacked date cards: a calendar icon in a gold disc, a serif title with the dates on the right, a note, and an optional link.
academy-day-schedule Academy Day Schedule A day at camp (designs 104 and 105): a card of timed rows — time in serif gold, a title and a line — one row highlighted. Rows typed here, or read from the Camp record being viewed.
academy-director Academy Director The academy's director band (design 99): a portrait beside the coach's name, accreditation, tenure, biography and facts, with a profile button. Reads a Coach record.
academy-enquiry Academy Enquiry The request forms: the home trial request beside its contact lines, the trial booking with its preferred-time chips, the contact enquiry with its subject, the camp booking with its place type and days. Every form lands in Messages.
academy-facilities Academy Facilities The facilities: the home photo card beside a list of six, the three courts in alternating bands with their specs, the four support buildings as photo cards.
academy-faq Academy FAQ The accordion: a sticky serif title beside numbered questions with a gold chevron disc (split), or category chips with counts over the questions (filtered). Questions are typed, or read from the programme being viewed.
academy-feature Academy Feature A split feature: a photo (with an optional caption card) beside a dash kicker, a serif heading with an italic phrase, paragraphs, a numbered or check list and buttons — or the photo under the text.
academy-fees Academy Fees The fees page: the fee table per programme with its filter chips (from the Programme records), the three term cards, and the holiday camps table (from the Camp records).
academy-gallery Academy Gallery The grounds gallery (design 101): one large photo with its caption beside a grid of thumbnails; a thumbnail swaps the photo. Every photo is rendered, so the page is complete without the script.
academy-hero Academy Hero The home hero: a photo behind the deep-green veil, a dash kicker, a serif title with an italic phrase, a lede, two buttons and a row of figures over a hairline.
academy-ink-split Academy Ink Split The two-column grid on a deep-green band: a dash kicker, a serif heading with an italic phrase, copy, three figure cells and buttons on the left; on the right stat cards, numbered rows, dot rows or keyed rows.
academy-legal-doc Academy Legal Document A legal document (design 111): a sticky contents rail beside numbered sections — paragraphs, a card of term-and-text rows, a link — with a question link under the contents.
academy-list Academy List A list of check, chevron or minus lines, each with an optional title and text — plain, or framed as a card with dividers.
academy-map Academy Map The site map (design 108): a schematic drawn in CSS — a lane, a road, the grounds and a pin — over a footer with the address and two map links. No map service is loaded.
academy-news-hero Academy News Hero The news page's featured story (design 113): the sticky post, else the newest — its category, date and reading time, title, excerpt, a button and the author — over the story's own photo behind the green veil.
academy-news-nav Academy News Nav The archive head (design 113): a kicker and heading with the article count on the right, then the category chips with their counts — links to the archives, the current one filled.
academy-note-strip Academy Note Strip One line in a framed strip (designs 103 and 108): an icon, a sentence and a link on the right.
academy-page-hero Academy Page Hero The deep-green page hero: breadcrumb, dash kicker, serif title with an italic phrase, lede, two buttons, and a row of figures, facts or attached cells over a photo behind a green veil. On a programme, camp or coach page it can read the record; a coach gets the portrait beside the copy.
academy-post-hero Academy Post Hero An article's masthead (design 114): breadcrumb, category pill, title, excerpt and the author with the date and reading time over the veil, then the featured photo overlapping the band with its caption.
academy-post-nav Academy Post Nav Previous and next article (design 114) as two cards with the category and title.
academy-post-rail Academy Post Rail The article's rail (design 114): share buttons and the post's tags under "Filed under".
academy-programme-cards Academy Programme Cards The programmes, from the Programme records: the home cards, the compare table, the alternating detail bands, the compact cards and the other programmes.
academy-programme-panel Academy Programme Panel One section of the programme page, read from the programme being viewed: who it is for, the weekly schedule, the coaching structure, the physical work, the match programme, beyond the court, term dates and fees, or the facilities used.
academy-prose Academy Prose A reading split (design 103): a kicker and heading in a narrow left column, paragraphs on the right with a gold-ruled pull quote after the first.
academy-quote-card Academy Quote Card A testimonial card: a large serif quote mark, the quote, and the person with a round photo.
academy-records Academy Records The results record (design 102): category chips with counts over a grid of result cards — a portrait or the player's initials, the result in serif green, the date, a note. The chips filter in view.js; every card is rendered.
academy-rows Academy Rows The academy's card table: a head row and up to four columns, or label-and-text pairs, with each column styled bold, serif, green, gold, muted or right-aligned.
academy-search Academy Search The search page (design 115): the query in the masthead with the form and suggested searches, then the results across pages, articles, coaches, programmes and camps — typed rows with the match highlighted, type chips with counts that filter in view.js, and an empty state.
academy-section-head Academy Section Head The academy's band opener: a dash kicker, a serif heading whose accent phrase is italic green, an intro, and on the right an outline button with an icon or a line of small print.
academy-side-card Academy Side Card The small rail card: a kicker, a serif title or figure, a line of text, rows of label and value or links, a progress bar and a button — light, or dark on green.
academy-stages Academy Stages The development stages: a list of stage tabs beside the chosen stage's card (what we coach, leaving the stage), or a strip of stage cells with a coloured top bar.
academy-stories Academy Stories The alumni stories (design 102): a photo beside a person's name, role, a serif quote in green, a paragraph and a link, sides alternating.
academy-subnav Academy Subnav The sticky strip under the header: anchor links along a page with a row of switch chips on the right, or a labelled row of sibling chips with a link — the programmes, the coach profiles, the legal documents.
academy-timeline Academy Timeline A timeline (designs 107 and 103): dated cards alternating either side of a centre line, the last one in gold — or each in its stage colour, with an age beside the year and a milestone line under the text — and an optional note strip below.
academy-wordmark Academy Wordmark The academy's mark — a circle-and-waves emblem beside the site title over the tagline — linked home. dark for the green footer.

Betting demo blocks

41 blocks, prefixed betting-.

Block Name What it draws
betting-author-box Betting Author Box The article's author card (designs 122, 124): a 66px portrait, WRITTEN BY, the name, "role · n published", the bio and "All work by {name}". Reads the queried post's author, or a named user.
betting-author-hero Betting Author Hero The author page's dark masthead: the portrait, the writer's name, their role and start year, the lede, the expertise pills, a mail button and the four stat tiles — all read from the user's profile.
betting-author-panel Betting Author Panel The author page's panels: the background copy beside the scored categories and declared interests, the filterable list of everything the writer has published, the other bylines, or the byline-standards call-out.
betting-book-cards Betting Book Cards Bookmaker cards from the records: the review archive with its chips, sort and view toggle, the review of the month, the category winners, the alternatives, the ranked pick, the costly rankings, the latest reviews and the sidebar card.
betting-book-table Betting Book Table The bookmaker table in six looks: the home filter table, the compare table with its sidebar and score panels, a ranked list, a sport list, the recent-reviews rows and the head-to-head card.
betting-callout Betting Callout An article aside (design 122): a 3px left rule, an icon and an uppercase title over one paragraph. Three tones — note (navy on the well), tip (green on the green tint), warn (rust on the rust tint).
betting-cards Betting Cards The icon-card grid in fourteen looks: icon, green, rust, numbered, dark, dark-numbered, link, sport-tile, big-number, tool, glossary, criteria, category, chips.
betting-contact-form Betting Contact Form The contact page's "Writing to {desk}" card — name, email, desk, subject, message — posting to Messages, with the desk cards bound to the select; or the two rail cards beside it (what to include, score changes) with a button.
betting-dark-band Betting Dark Band The navy-deep band: amber kicker, heading with an amber word, text, buttons or a link, and the items as cards, weight tiles, a learning path, numbered rules, a calendar, price movements or contact cards.
betting-data-table Betting Data Table The card table an article carries (design 122): a well head row, hairline rows that lift on hover, and per-column styles — bold, display figure, plain, wrapped note, or a green / rust flag. Scrolls sideways below its minimum width.
betting-faq Betting FAQ The accordion: a sticky kicker, two-line heading and text beside numbered questions with a chevron disc. Questions are typed or read from the bookmaker being viewed; the first is open.
betting-feature Betting Feature The split section: kicker, heading with a green word, paragraphs, a pull quote and buttons beside a 4/3 photo, a numbered step card, the worked weighted-score table, the company details or the funding disclosure card.
betting-guide-list Betting Guide List The guides archive (design 121): a level filter over topic groups, each a navy icon tile, a heading with its guide count and a card of rows — starred guide first, then level pill, read time and arrow. Reads the Guide records; the hero's search box filters it live.
betting-home-hero Betting Home Hero The home page's opening band: kicker, display heading, lede, three icon facts and the top three bookmakers as cards.
betting-legal-doc Betting Legal Document One of the five legal documents: the dark document header, the sticky contents rail, the sections themselves with the template note, or the other documents' cards.
betting-match-header Betting Match Header The prediction page's dark photo header: breadcrumb, competition and stage pills, the fixture, date · time · venue, the live kick-off countdown, and the Our pick card with the best price. Reads the prediction being viewed.
betting-match-panel Betting Match Panel One panel of a prediction's analysis, read from the prediction being viewed: recent form, head to head, team news, key numbers, or the alternative-markets table.
betting-news-lead Betting News Lead The News page's masthead (design 127 S2): the featured story as a full-height photo card beside a stack of smaller ones. Reads the "lead" and "sub" flags on the posts, or simply the newest.
betting-odds-rail Betting Odds Rail The prediction page's sticky rails: the odds comparison for the pick's market, the update log, and the share row. Reads the prediction being viewed.
betting-offer-cards Betting Offer Cards Bookmaker offers from the Offer records: the Bonuses cards with type chips, sort pills, value badge, spec well, our view and code; the home promo cards; a sport's offers; the recurring existing-customer table.
betting-offer-rail Betting Offer Rail The review single's sticky rail: the bookmaker's logo, rating, welcome offer, four measured facts, the affiliate button, and the weighted score breakdown.
betting-page-hero Betting Page Hero The navy-deep hero: photo under the veil, breadcrumb (auto from the page tree), amber kicker, H1 with an amber word, lede, search form, buttons; on the right the 2×2 stats, a glass card (best offer · best for the sport · help now) or the top-three bookmakers.
betting-people Betting People The people cards read from users: the editorial team cards with expertise and stats, the compact byline cards, or the selectable contact desks.
betting-photo-banner Betting Photo Banner The full-width photo card under a navy veil: amber kicker, heading, text, a meta row and a green button.
betting-pick-cards Betting Pick Cards Predictions from the records: the filterable card grid, four home cards, sport rows, the Pick of the week split card, related photo cards, and the published record table.
betting-post-hero Betting Post Hero The article's masthead (design 122): breadcrumb, category and level pills, the H1, the standfirst, the byline with the date, the reading time and "Updated", then the 21/9 featured photo pulled up over the band. Reads the queried guide or post.
betting-post-panel Betting Post Panel The pieces around an article (design 122), each reading the queried guide or post: key takeaways, the tag pills, the share rail, previous / next, and the three related photo cards.
betting-quote Betting Quote A pull quote inside an article (design 122): an amber left rule, the quotation at 20–26px display weight, and the attribution beneath it.
betting-review-hero Betting Review Hero The review single's dark opening: breadcrumb, the bookmaker's logo tile, its name, the best-for pill, the tested-for line, the intro and the score box.
betting-review-panel Betting Review Panel One section of a bookmaker review, read off the bookmaker being viewed: verdict, welcome offer, sports and markets, odds, how we tested, live betting, app, payments, support, licensing, safer betting, FAQ or the closing CTA.
betting-rg-callout Betting RG Callout The outlined responsible-gambling box: navy pill, optional heading, text and a navy button. Layouts: default, split (with tool tiles), strip, broken, standards, contributors (numbered rows).
betting-rg-coverage Betting RG Coverage Which safer-gambling controls each bookmaker offers: every rated operator as a row, one tick column per tool, read live from the records.
betting-rows Betting Rows The card table: a well head row and up to five styled columns. Layouts: table, list (link rows with an arrow), numbered, revenue (bars), worked (with a total row), timeline.
betting-search Betting Search Results The search results: "N results for the query", the bookmakers it matches, the destination pages, then the matching guides, predictions and stories — with the design's empty state.
betting-section-head Betting Section Head The band opener: bar kicker, display heading with its navy-2 accent word, intro, and an outline button or a link on the right. %s = the queried thing's title.
betting-social Betting Social The footer's row of 34px social squares: a lucide icon, a label read out, a link.
betting-sport-cards Betting Sport Cards The sports hub: six major-sport cards from the sport terms plus the design's copy, or the sortable coverage table of every sport.
betting-sport-panel Betting Sport Panel The single-sport page's hero (the glass "Best for" card) and its Market · Margin table with the competitions covered.
betting-steps Betting Steps A worked example inside an article (design 122): a numbered list whose markers are 26px navy discs, each row a bold lead-in and a sentence.
betting-subnav Betting Subnav The sticky strip under the header: sibling pills with a label and a link or note (switch), scroll-spied anchor tabs with a Visit button (anchors), or the reading-progress bar (progress).
betting-wordmark Betting Wordmark The circle-and-diamond mark beside "Oddsmark" over "BOOKMAKER REVIEWS", linked home. dark for the navy footer.