Overview#
Summit is a bold, dark website for a conference, built as a WordPress block theme. The demo event is
Summit 2027, a fictional three-day design, engineering and AI conference in Copenhagen. The theme
has a home page with a live countdown, count-up stats and a taste of the programme, a speaker
directory with a track filter and pop-up profiles, speaker profile pages, a day-by-day schedule
visitors can star and save (with "On now" and "Up next" highlights during the event), a ticket page
with live totals, early-bird prices, a team discount and a demo checkout, a venue & travel page, a
sponsors page with an enquiry form and a 404 page. It is version 1.0.1 (see template.json and
style.css), works with WordPress 7.1 and PHP 7.4 or newer, and is the WordPress version of the HTML
template of the same name. See it live at
freeframe.dev/templates/summit.
Everything you see is made of core WordPress blocks arranged in block patterns, so you edit text,
links, buttons, lists and images in the block editor without touching code. Colours, the fonts and
font sizes are design tokens in theme.json: change them in Appearance > Editor > Styles and the
whole site follows. Speakers, sessions and ticket prices used by the scripts are data in
assets/js/data.js (see Conference data).
Quick start#
Requirements: WordPress 7.1 or newer and PHP 7.4 or newer. No plugins are needed.
- Download
summit.zipfrom freeframe.dev/templates/summit (the WordPress tab). - In your WordPress admin go to Appearance > Themes > Add New Theme > Upload Theme, choose the zip and click Install Now, then Activate. The theme is listed as Freeframe Summit.
- Go to Appearance > Summit setup and click Create the demo pages. This creates the pages below from the theme's page patterns, sets Home as the front page (Settings > Reading) and creates the header menu. Pages that already exist with the same slug are left alone, so it is safe to click it again.
- Set the site title to your event's name in Settings > General (the demo uses "Summit 2027"), then edit any page in Pages, and the header, footer and templates in Appearance > Editor.
You can also try the theme without installing anything: the Try it in WordPress button on freeframe.dev opens it in WordPress Playground (WordPress running in your browser) with the demo pages already set up.
To work on the theme's files locally you need Node.js 24 and pnpm; WordPress itself runs in WordPress Playground, so there is no PHP, web server or database to install:
pnpm install
pnpm dev # builds the CSS, then starts WordPress with the theme at http://127.0.0.1:9400pnpm dev signs you in as admin (password password) and creates the demo pages. The site is
rebuilt from scratch every time you start it; your edits to theme files are live, edits made in the
WordPress admin are not kept.
Pages#
Each page is a page pattern (in Patterns > Summit pages) made of section patterns. Every section is also offered on its own in the block inserter under Patterns > Summit.
| Page | Slug | Page pattern | Sections (pattern files in patterns/) |
|---|---|---|---|
| Home | / |
page-home.php |
home-hero (countdown), topics (ticker), highlights, speakers-teaser, stats (count-up numbers), day-teaser, partners, quote, venue-teaser, newsletter-cta |
| Speakers | /speakers/ |
page-speakers.php |
speakers-hero, speakers-grid (track filter and speakers), speaker-dialog |
| Amara Osei (speaker profile) | /speaker/ |
page-speaker.php |
speaker-profile, more-speakers |
| Schedule | /schedule/ |
page-schedule.php |
schedule-hero, schedule (day tabs, track filter, stars, My schedule) |
| Tickets | /tickets/ |
page-tickets.php |
tickets-hero, ticket-picker (tickets and order summary), checkout, order-confirmation, compare-passes, tickets-faq |
| Venue & travel | /venue/ |
page-venue.php |
venue-hero, getting-here (facts, map, travel), hotels, venue-accessibility |
| Sponsors | /sponsors/ |
page-sponsors.php |
sponsors-hero, sponsor-tiers, packages, sponsor-form |
| 404 | any missing URL | templates/404.html |
404 |
The speaker page shows the first speaker (Amara Osei) as blocks, so it works without JavaScript; with
?id= in the address the script shows another one (see Speaker pages). That is why
the page is named after her.
Posts use templates/single.html; the blog, archives and search results use templates/index.html,
templates/archive.html and templates/search.html.
Project structure#
freeframe-summit/
style.css theme header (name, version, requirements, license); no styles
theme.json design tokens: palette, gradient, fonts, font sizes, spacing, layout, button
functions.php loads the files in inc/
inc/setup.php stylesheet and scripts, editor styles, the "js" class script, script strings
and settings, pattern categories
inc/icons.php registers assets/icons/*.svg for the Icon block
inc/icon-labels.php the icons' names shown in the editor
inc/block-styles.php button block styles
inc/navigation.php current-page markers (aria-current) in the header
inc/site-setup.php Appearance > Summit setup: creates the demo pages and the menu
templates/ page.html (pages), page-with-title.html, single.html, index.html,
archive.html, search.html, 404.html
parts/ header.html and footer.html (they show the header and footer patterns)
patterns/ every section and page (PHP files with block markup)
assets/css/theme.css the compiled stylesheet (do not edit: built from src/)
assets/css/editor.css the same for the block editor (generated by src/editor-css.mjs)
assets/js/data.js the conference data: tracks, days, speakers, sessions, ticket prices
assets/js/main.js the site's JavaScript
assets/js/editor.js block editor tweaks
assets/icons/ SVG icons for the Icon block
assets/img/ speaker portraits (speakers/<id>.svg), favicon, social image
assets/fonts/ the Inter and Space Grotesk font files and their licenses (OFL.txt)
src/theme.css the Tailwind CSS source of assets/css/theme.css
src/icons.css icons drawn before or after text with CSS (generated)
src/editor-css.mjs writes assets/css/editor.css after each build
languages/ freeframe-summit.pot, the template for translations
blueprint.json WordPress Playground setup used by `pnpm dev`
screenshot.png the picture shown in Appearance > Themes
package.json the CSS build and the local WordPress (Node.js tooling)
readme.txt, README.md, DOCS.md, CHANGELOG.md, LICENSE.txtCustomising#
Brand and colours#
The colours are in theme.json (settings.color.palette) and in Appearance > Editor > Styles >
Colors > Palette:
| Colours | Used for |
|---|---|
| Base (night), Night 2, Panel | the page background and card and dialog backgrounds |
| Edge | borders |
| Contrast (ink), Haze | text and secondary text |
| Violet, Magenta, Flame | the brand gradient (buttons, gradient text, the call to action) and glows |
| Lime | the accent: eyebrows, focus rings, live highlights, toasts |
| Sky | "Up next" in the schedule |
| White, Black | plain colours for your own blocks |
The theme's stylesheet reads these colours from the palette, so changing Magenta in Styles changes
every gradient, glow and accent that uses it. The Summit gradient preset (Styles > Colors >
Gradients) is the same violet–magenta–flame gradient for your own blocks. A few things have their
colours written in: the venue illustration and map (Custom HTML), the speaker portraits, the track tag
colours (.tag-design… in src/theme.css) and the browser bar colour
(freeframe_summit_head_meta() in inc/setup.php).
Typography#
Headlines use Space Grotesk (the display, h-section and font-display classes; variable,
weights 500 to 700) and text uses Inter (variable, weights 400 to 800), bundled in
assets/fonts/ and declared in theme.json (settings.typography.fontFamilies), so no request goes
to Google. To use other fonts, install them in Appearance > Editor > Styles > Typography > Fonts
(the Font Library) and select them, or replace the fontFace entries in theme.json; the stylesheet
reads --wp--preset--font-family--space-grotesk and --wp--preset--font-family--inter, so rename
those slugs only together with src/theme.css.
Font sizes are the presets in theme.json (xs 0.75rem to 9xl 8rem, the Tailwind scale). The
stylesheet uses them too: changing Large in Styles changes every text-lg in the design.
Content#
Edit pages in Pages: click any text to change it, select a button to change its link, select an image and use Replace. Sections are groups; open List View (the stacked lines icon at the top left) to select a section, move it, duplicate it or delete it. To add a section from another page, use the block inserter (+) > Patterns > Summit.
Some content is in Custom HTML blocks, because blocks can't express it or a script drives it: edit those in the block's HTML view.
| Pattern | Custom HTML | What it is |
|---|---|---|
home-hero |
the countdown | see Countdown |
topics |
the topics ticker | a scrolling line of topics |
venue-teaser, getting-here |
the venue illustration, the map | SVG artwork with text and gradients; replace with an Image block |
speakers-grid |
the track filter, the count and the speaker cards | the cards are buttons that open the profile dialog |
speaker-dialog |
the profile dialog | filled in by the script |
schedule |
the day tabs, the track filter, the day panels and My schedule | see Schedule |
ticket-picker |
the ticket cards and the order summary | see Tickets |
checkout, order-confirmation |
the checkout form, the confirmation | hidden until the visitor checks out |
compare-passes |
the comparison table | a table that scrolls sideways on small screens |
newsletter-cta, sponsor-form |
the forms | see Forms |
header, footer |
the menu button; the toast | driven by assets/js/main.js |
A few blocks carry a class (Block settings > Advanced > Additional CSS class(es)) that the script or stylesheet reads:
revealfades a block in as it scrolls into view; a class such as[--d:80ms]delays it.ff-counton a statistic's number counts it up when it scrolls into view; write the final value (1,200or96%: the text after the digits is kept).link-cardon a group makes the whole group clickable: the first link inside it stretches over the group.ff-profileon the speaker page's profile group andff-more-speakerson the "More speakers" list: the script replaces their content for?id=(see Speaker pages).ff-ruleon the sponsor tier headings draws the line after the text.- The decorative glows and grid lines behind the page headers are empty Group blocks with the classes
blob(plusfloat-a/float-bfor the slow drift) andgrid-lines; delete or move them like any block.
Conference data#
Event content is split between assets/js/data.js (used by the scripts) and the blocks (what
visitors see first, and without JavaScript). Change both when you edit the programme. data.js
defines window.SUMMIT:
| Key | Contents |
|---|---|
tracks |
Track ids and labels: design, engineering, ai, leadership, general |
days |
{ "id": "wed", "date": "2027-04-14", "label": __("Wed 14 Apr"), "title": __("Workshop day") } |
speakers |
{ "id", "name", "role", "company", "city", "track", "bio", "twitter", "site" } |
sessions |
{ "id", "day", "start", "end", "title", "speakers": [ids], "track", "room", "level", "kind" } |
earlyBirdEnds |
When early-bird pricing ends, e.g. "2026-12-31T23:59:59+01:00" |
keepDemoCurrent |
true in the demo: once the edition is over, every date moves on a year (see Demo dates below). Set it to false when you enter your real dates |
teamDiscount |
{ "minTickets": 5, "percent": 15 } |
tickets |
Ticket ids, names and prices (price and early) |
__() translates the texts (see Translations): when you change or add one, add it to
freeframe_summit_script_strings() in inc/setup.php too if the site is translated.
| Content | Comes from |
|---|---|
| Speaker cards on the speakers and home pages | blocks / Custom HTML |
Speaker dialog, the speaker page for ?id=…, "More speakers" |
SUMMIT.speakers and SUMMIT.sessions |
The speaker page without ?id= |
blocks, for the first speaker in SUMMIT.speakers |
| Schedule sessions | the schedule's Custom HTML (<li data-session="…"> items) |
| Valid starred sessions, a speaker's talks | SUMMIT.sessions |
| Ticket prices, early-bird prices, early-bird end, team discount | SUMMIT.tickets, SUMMIT.earlyBirdEnds, SUMMIT.teamDiscount |
| Countdown target | data-countdown in the home page's countdown |
Adding a session means adding it to SUMMIT.sessions and a schedule item in the right day panel
of the schedule's Custom HTML, with the same id and timing attributes (copy a neighbouring session so
it keeps its star button and .live-badge):
<li class="session grid gap-4 p-5 sm:grid-cols-[8.5rem_1fr_auto] sm:p-6"
data-session="s36" data-track="ai" data-day="thu"
data-start="2027-04-15T16:00" data-end="2027-04-15T16:40">Adding a speaker means an entry in SUMMIT.speakers, a portrait at
assets/img/speakers/<id>.svg (the theme passes the URLs of these portraits to the script) and a card
in the speakers grid's Custom HTML (a list item with data-track and a button with
data-speaker="<id>"). Make changes to assets/js/ and assets/img/ in a child theme (see
Child themes) so a theme update doesn't overwrite them.
Time zone. Event times are written in Copenhagen summer time. eventTime() in
assets/js/main.js appends +02:00 to every time, and the schedule picks "today's" tab from the
event-local date (now() shifted by 2 * 3600 * 1000 ms). Change both offsets for an event
elsewhere.
Demo dates. The demo is written for 14–16 April 2027. While SUMMIT.keepDemoCurrent is true
and that edition is over (the event-local date is after the last of SUMMIT.days), the script moves
every date to the same week of the next year, by whole weeks so weekdays never change (Wed 14 April
2027 becomes Wed 12 April 2028), so the countdown, ticket prices, schedule and "live" state always
point at an upcoming conference. The year of the edition follows. It updates SUMMIT.days (dates and
labels, written in English), SUMMIT.earlyBirdEnds, the countdown target, every data-start and
data-end, and the text of these spans in the patterns: data-edition (dates "14–16 April 2027",
year, year-1, year+1, yy "’27", yy-plain "27"), data-date="2027-04-01" (with
data-date-format dmy, dm or dmon) and data-day-label="wed", plus the page title and
aria-labels that contain the year. Before the edition is over nothing is changed, so
?now=2027-04-15T10:45 still previews the live schedule. Set keepDemoCurrent to false in
assets/js/data.js once you enter your real dates. The "Early-bird tickets on sale" pill (class
ff-early-only) and the first sentence of the tickets intro (data-early-only) are removed once
early-bird pricing has ended, whatever the setting.
Images and artwork#
- Speaker portraits are SVG illustrations in
assets/img/speakers/<speaker-id>.svg(square), shown with Image blocks on the home and speaker pages and by the script in the dialog and on speaker pages for?id=. Replace them with square photos: in the blocks with Replace, and in the theme (child theme) folder with the same file names for the script. - Venue illustration and map are SVG artwork in Custom HTML blocks: replace them with an Image block (a photo of your venue, a map image) or an embedded map.
- Partner logos are Icon blocks with a paragraph; replace them with Image blocks to show real logos.
- Icons: icons are Icon blocks. Select one and pick another icon from the Summit collection
(the theme's icons) or WordPress's own. Icons inside buttons (the arrows) are drawn by CSS: the
class
icon-after-arrow-rightadds one; the available names are insrc/icons.css. - Logo: the header and footer show
assets/img/favicon.svgin an Image block next to the name ("Summit’27"). Edit both in Appearance > Editor > Patterns > Header (and Footer). - Social image:
assets/img/og-image.png(1200 × 630, sourceog-image.svg). WordPress doesn't output Open Graph tags by itself; see SEO and sharing. - Favicon:
assets/img/favicon.svgis used until you set a Site Icon in Settings > General.
Navigation, header and footer#
The header and footer are template parts (parts/header.html, parts/footer.html) showing the
header and footer patterns. Edit them in Appearance > Editor > Patterns > Header / Footer.
The header has two Navigation blocks showing the same menu: the desktop one and the full-screen one
in the mobile menu. Edit the menu once in Appearance > Editor > Navigation (the setup creates "Main
menu" with Home, Speakers, Schedule, Venue, Sponsors and Tickets). The Home and Tickets links have the
class ff-mobile-only (link settings > Advanced), so only the mobile menu shows them, as in the HTML
version. A Navigation block that doesn't point at a menu shows the most recently created one; to pin a
menu, select the Navigation block and choose it in the block settings, for both blocks.
WordPress marks the current page's link (aria-current="page"). The theme also marks the header's
"Get tickets" button on the tickets page (the button has the class ff-mark-current) and keeps
Speakers current on the speaker page (freeframe_summit_menu_parents() in inc/navigation.php).
The footer's link columns are List blocks: click a link to change it, press Enter to add one. The copyright line names the event's year, not the current one: edit it there.
Features#
Countdown#
The countdown on the home page (data-countdown="2027-04-14T09:00:00+02:00", Custom HTML) counts down
days, hours, minutes and seconds into its [data-unit] children, has role="timer", and stops at zero.
Speakers filter and pop-up profiles#
On the speakers page, buttons with data-filter (all or a track id) show the speakers whose list
item has a matching data-track and update the count. Clicking a speaker opens a native <dialog>
built from SUMMIT.speakers: portrait, role, bio and every session they appear in, and a link to their
page. Escape, the close button or a click outside closes it, and focus returns to the speaker.
Speaker pages#
The speaker page shows Amara Osei as blocks. With ?id=lukas-brandt (a speaker id from data.js, in
any letter case) the script replaces the profile group (ff-profile) with that speaker's portrait,
role, bio, links and session cards, laid out and revealed like the default, and changes the browser
tab title; unknown ids (?id=constructor) keep the default. "More
speakers" (ff-more-speakers) always shows four other speakers. Search engines that don't run
JavaScript only see the default speaker: duplicate the page per speaker if those pages matter for
search.
Schedule, tracks and My schedule#
The schedule has a tablist of days (including "My schedule", id mine) with Left/Right, Home and End
keys. The current tab, chosen by click or key, is kept in the URL hash (/schedule/#fri), and during the event the current day
(in event time) opens automatically. Track buttons show one track; breaks and socials stay visible so
each day still reads as a timeline, and an empty state appears when a day has nothing in that track.
Star buttons add sessions to My schedule, grouped by day, with a count and a toast (their label reads
"Add “…” to my schedule", or "Remove “…” from my schedule" once starred); stars are saved in
the browser (see Saved data).
Live schedule state#
Every minute the schedule marks the session that is on now ("● On now") and the next one within three
hours ("Up next"), and shows a live note. Preview it any time with ?now=:
/schedule/?now=2027-04-15T10:45. The same parameter also drives the countdown and early-bird
pricing.
Tickets and order summary#
Each ticket card (data-ticket="<id>", Custom HTML) has −/+ steppers (0–20 each). Until
SUMMIT.earlyBirdEnds the early price is used and the full price is shown struck through; afterwards
the early-bird labels are removed. The summary lists each line, the subtotal, the team discount (15%
from five tickets), a hint showing how many more tickets unlock it, and the total. Continue to
checkout opens the checkout form; after a valid demo order the confirmation shows the total and says
plainly that nothing was bought. Prices come from SUMMIT.tickets, matched to each card by its id; the
prices typed in the cards are only shown without JavaScript, so update them and the comparison table
too. A card whose id isn't in SUMMIT.tickets is hidden.
Scroll reveals, count-up stats and the mobile menu#
Blocks with reveal fade in when scrolled into view; ff-count numbers count up once. The gradient
blobs drift slowly. All motion stops with reduced motion. The menu button (data-menu-toggle) opens a
full-screen menu, moves focus to its first link, makes the header solid while open, updates
aria-expanded and its label, and closes with Escape. The mobile menu Group starts with the class
hidden; the script turns it into the hidden attribute it toggles.
Back to top#
A button appears after scrolling about one screen down; it scrolls to the top (instantly with
reduced motion), moves keyboard focus to the main content and lifts above toasts. It is created by
assets/js/main.js; to remove it, delete the "Back to top" part of that file and the .back-to-top
styles in src/theme.css, then run pnpm build.
Block styles#
In the block settings' Styles panel:
| Block | Styles |
|---|---|
| Button | Fill (default, the gradient), Ghost, Lime, Dark (on gradient) (WordPress's own Outline style is replaced by Ghost) |
Add the class is-large to a Button block for the large size.
Forms#
Form (data-form) |
Where | Fields |
|---|---|---|
checkout |
Tickets page (checkout pattern) |
first, last, email, company, country, payment (demo choice), terms |
sponsor |
Sponsors page (sponsor-form pattern) |
name, email, company, tier, message |
newsletter |
Home page (newsletter-cta pattern) |
email |
Forms marked data-validate check required fields, email format, minimum lengths and required
checkboxes. Errors appear next to each field, fields get aria-invalid, and the first problem is
focused. On success the form's [data-success] message is shown and a summit:submitted event fires
(the tickets page uses it for the confirmation). Nothing is sent anywhere until you connect the
forms.
Option 1: a form plugin#
For the sponsor and newsletter forms, install a form plugin (WPForms, Gravity Forms, Fluent Forms,
Contact Form 7, Jetpack Forms...) and replace the form's Custom HTML block with the plugin's block or
shortcode. Add the theme's classes where the plugin allows: field on fields, label on labels,
btn btn-primary on the submit button.
Option 2: a form service#
In the "forms" section of assets/js/main.js, find the comment "To send for real" and post the data
before showing success:
fetch('https://formspree.io/f/your-id', {
method: 'POST',
body: new FormData(form),
headers: { Accept: 'application/json' }
}).then(function (res) {
if (!res.ok) throw new Error('Request failed');
var success = $('[data-success]', form);
if (success) success.classList.remove('hidden');
form.reset();
document.dispatchEvent(new CustomEvent('summit:submitted', { detail: { form: form.dataset.form } }));
});Make script changes in a child theme (copy assets/js/main.js there and load it instead), or they are
overwritten when you update the theme.
For real ticket sales, don't collect payment details in this form. Use a ticketing or payment provider (Tito, Eventbrite, Stripe Checkout…): replace the checkout section with their embed, or send the selected quantities to their checkout from the Continue to checkout button. WooCommerce or an event plugin can also sell tickets in WordPress itself.
Saved data (localStorage)#
| Key | Shape | Purpose |
|---|---|---|
summit-2027-stars |
Array of session ids, e.g. ["s2", "s14"] |
Sessions starred for My schedule |
On load the stored value is checked: anything that isn't an array of known, unique session ids is
dropped and storage repaired. For a new edition, change STAR_KEY in assets/js/main.js (for example
summit-2028-stars) so old stars don't carry over.
SEO and sharing#
Page titles come from WordPress: the page title, an em dash and the site name (for example
"Schedule — Summit 2027"); the home page shows the site name and tagline (Settings > General). The
speaker page changes the browser tab title for ?id=. The theme doesn't output meta descriptions or
Open Graph tags; use an SEO plugin such as Yoast SEO, Rank Math or The SEO Framework, and give it
assets/img/og-image.png (or your own 1200 × 630 image) as the default social image. Add
Event structured data (name, dates, location, offers) so search engines
can show the event. WordPress already generates a sitemap at /wp-sitemap.xml.
Accessibility#
Built in: a skip link to the main content (added by WordPress, styled by the theme), labelled
landmarks, one h1 per page, visible lime focus rings, day tabs following the tabs pattern, filters
and stars with aria-pressed, a native speaker dialog with focus return, the countdown with
role="timer", track tags with text labels (not colour alone), toasts announced with aria-live, form
errors linked to their fields, and reduced-motion support for reveals, drifting gradients and
counters. The demo passes axe (WCAG 2.1 A and AA).
When you edit: keep gradient text large and on dark backgrounds for contrast, give images alt text (or mark them decorative where the speaker's name is already next to them), label every new form field and keep one Heading 1 per page.
Building and deploying#
You only need this if you change the theme's files. The stylesheet assets/css/theme.css is
compiled with Tailwind CSS from src/theme.css and the classes used in patterns/, parts/,
templates/, inc/ and assets/js/ (including the classes inside the HTML the script writes):
pnpm install
pnpm build # compile assets/css/theme.css and assets/css/editor.css
pnpm watch # recompile assets/css/theme.css on every change (run pnpm build before you commit)Run pnpm build after adding a utility class to a pattern or template, otherwise the class has no
style. Classes you type in the editor's Additional CSS class(es) field are only styled if the
stylesheet already contains them.
To deploy, zip the theme folder (named freeframe-summit, without node_modules/) and upload it
in Appearance > Themes, or copy the folder to wp-content/themes/ on your server.
Translations#
The theme is translation-ready with the text domain freeframe-summit. All text in patterns,
templates and PHP goes through WordPress's translation functions; the scripts' strings (speakers,
sessions, days, tracks, labels, form errors) are translated in PHP (freeframe_summit_script_strings()
in inc/setup.php). Create a translation with Loco Translate, or with WP-CLI and Poedit:
wp i18n make-pot wp-content/themes/freeframe-summit wp-content/themes/freeframe-summit/languages/freeframe-summit.potSave freeframe-summit-de_DE.mo (for example) in wp-content/languages/themes/ or in the theme's
languages/ folder. Page content created by Summit setup is copied into your pages in the site's
language at that moment; translate it in the editor like any other content.
Child themes#
Use a child theme for changes you want to keep when Summit is updated. Create
wp-content/themes/summit-child/style.css:
/*
Theme Name: Summit Child
Template: freeframe-summit
*/Templates, parts, patterns and theme.json in the child theme override the parent's files of the
same name. To change the conference data, copy assets/js/data.js to the child theme and load it
instead of the parent's:
add_action( 'wp_enqueue_scripts', function () {
wp_deregister_script( 'freeframe-summit-data' );
wp_register_script( 'freeframe-summit-data', get_stylesheet_directory_uri() . '/assets/js/data.js', array(), '1.0.0', array( 'in_footer' => true, 'strategy' => 'defer' ) );
wp_enqueue_script( 'freeframe-summit-data' );
}, 15 );The parent's stylesheet only contains the classes the parent uses: if your child theme's patterns
use new utility classes, compile a stylesheet for the child (copy package.json and
src/theme.css, point the @source lines at the child's folders) and enqueue it.
Troubleshooting#
- A starred session doesn't appear in My schedule. Its id must exist in
SUMMIT.sessionsand in a day panel of the schedule with the samedata-session. - "On now" highlights the wrong session.
data-start/data-endare event-local times; check the+02:00offset ineventTime()for your event's time zone. Test with?now=. - Ticket totals don't match the cards. Prices come from
SUMMIT.tickets; the cards' typed prices are only a no-JavaScript fallback. - A ticket card disappeared. Its
data-ticketid isn't inSUMMIT.tickets. - The speaker page shows Amara Osei instead of the speaker I linked. The
?id=value must be a speaker id inSUMMIT.speakers(with dashes; letter case doesn't matter). - The pages look unstyled or new classes do nothing. The stylesheet only contains classes it
found when it was built. Run
pnpm buildafter editing patterns, then reload. - "This block contains unexpected or invalid content". A pattern or page was edited by hand with markup that doesn't match the block. Click Attempt recovery, or re-insert the section from Patterns > Summit.
- The header menu shows other pages, or an old menu. A Navigation block without a chosen menu shows the most recent one. Select it and choose "Main menu" (or yours) in the block settings, in both the desktop and the mobile Navigation block.
- Summit setup says the pages exist, but they are empty. It never overwrites existing pages. Delete (and empty the trash of) the pages with those slugs, or open each page and insert its page pattern from Patterns > Summit pages.
- The forms don't send anything. They are demo forms; see Forms.
- The theme can't be installed on an older WordPress. Summit uses the Icon block's icon collections from WordPress 7.1; update WordPress first.
- A page shows the title twice or no title. Pages use a template without a title, because the page patterns start with their own heading. For a plain text page (privacy policy, code of conduct), choose the Page with title template in the page's settings.
License#
MIT, which is compatible with the GPL that WordPress requires (see LICENSE.txt in the theme
folder). Free for personal and commercial use. The illustrations, portraits and logos are included
under the same license. Inter and Space Grotesk are licensed under the SIL Open Font License 1.1
(assets/fonts/inter/OFL.txt, assets/fonts/space-grotesk/OFL.txt).