Midground1.1.0

Test report – Midground 1.1.0

All figures come from real runs on 26 September 2026 against the local Docker environment (WordPress 7.1.2, PHP 8.3, MariaDB 11, WooCommerce 11.1.2) and, for the minimum versions, a fresh WordPress 6.6 on PHP 8.1. Browsers: Chromium, Firefox and WebKit from Playwright 1.63. Nothing is estimated. Raw data is in tests/results/ (not versioned) and can be recreated with the commands in each section.

Summary #

AreaResultCommand
JavaScript unit tests12 / 12 passednpm test
PHP integration tests98 / 98 passed, 1,399 checksnpm run test:php
Browser tests, 5 projects327 passed, 0 failed, 3 skipped on purpose (101 + 12 + 101 + 101 + 12)npm run test:e2e
Accessibility (axe-core)no serious or critical violations on 8 showcase pages, every page of the six starter sites and the editor, in all browserspart of the browser tests
Clean install and life cycle45 / 45 (WordPress 7.1.2, PHP 8.3) and 46 / 46 (WordPress 6.6.2, PHP 8.1, with the PHP suite 98 / 98)bash tests/install/clean-install.sh
Performanceevery budget met for Midground's part; CLS at most 0.048, LCP on a throttled phone 1.31–1.70 snode tools/perf.mjs
Translations2,596 / 2,596 strings in Norwegian (Bokmål)bash tools/i18n.sh

1. JavaScript unit tests (tests/js) #

The motion engine (interpolation per channel, combining effects, transform order, strength scaling), CSS value validation and the style compiler against shared test data, number formatting identical to PHP, document operations (insert, move, remove, style inheritance, allowed children).

2. PHP integration tests (tests/php) #

They run inside the real WordPress through WP-CLI; a PHP warning from Midground code turns a test red. Services of other companies are answered by local stand-ins (see status). Covered:

3. Browser tests (tests/e2e) #

Playwright, one worker, in five projects: desktop-chromium, desktop-firefox and desktop-webkit (1440×900) run every test; mobile-chromium (Pixel 7) and mobile-webkit (iPhone 14) run the tests marked @mobile.

FileTestChromiumPixel 7FirefoxWebKitiPhone 14
01-vertical-slicebuild, move, style, animate, publish and reloadpassed–passedpassed–
02-library-motioninsert a page layout from the library, publish, and scroll-driven motion runspassed–passedpassed–
02-library-motionreduced motion: no transforms, scene unpinned, content visiblepassed–passedpassed–
02-library-motionpinned scene on a phone and a tablet: acts replace each other without overlappingpassed–passedpassed–
03-editorlayers: tree, keyboard moves and nesting, rename, hide, lock, dragpassed–passedpassed–
03-editorundo/redo, duplicate, copy/paste, delete with undo, save and reloadpassed–passedpassed–
03-editorautosave keeps unsaved work and offers to restore itpassed–passedpassed–
03-editorresponsive overrides per devicepassed–passedpassed–
03-editorglobal design values update the canvas and are savedpassed–passedpassed–
03-editorcomponents: save as component, local override, publishpassed–passedpassed–
03-editorrevisions can be loaded back into the editorpassed–passedpassed–
03-editora failed save keeps the work and can be retriedpassed–passedpassed–
03-editorelements and library are searchable (also by Norwegian keywords)passed–passedpassed–
04-templatessingle-post template: create, preview with real content, conditions, priority and exclusionspassed–passedpassed–
04-templatesspecificity beats priority; equal templates are resolved by date and reportedpassed–passedpassed–
04-templates404 and search templates render on the frontend with real resultspassed–passedpassed–
05-importblock content: report, preview, publish, then restore the originalpassed–passedpassed–
05-importclassic content can be kept as one blockpassed–passedpassed–
05-importchanges made in another editor are detected and can be importedpassed–passedpassed–
06-woocommerceshop, product templates, cart and checkout with a simple and a variable productpassedpassedpassedpassedpassed
07-securitysubscriber › cannot open the editor or use any Midground endpointpassed–passedpassed–
07-securityauthor › can build their own post, not others' pages, templates or site designpassed–passedpassed–
07-securityauthor › hostile content is cleaned before it is stored and renderedpassed–passedpassed–
07-securityadministrator › invalid documents are repaired or rejected, never stored as-ispassed–passedpassed–
07-securityadministrator › 3D model uploads are validatedpassed–passedpassed–
08-fallbacks3D model loads and renders with WebGLpassed–passedpassed–
08-fallbackswithout WebGL the poster and a note are shownpassed–passedpassed–
08-fallbacksa model that fails to load falls back to the posterpassed–passedpassed–
08-fallbackswithout JavaScript › all content is readable and the model poster is shownpassed–passedpassed–
08-fallbackswhen the motion runtime fails to load, content stays visiblepassed–passedpassed–
08-fallbacksphone: scroll motion runs, 3D or poster shows, nothing overflowspassedpassedpassedpassedpassed
09-lifecycledeactivating the builder leaves the content in placepassed–passedpassed–
09-lifecycleanother theme shows the same Midground contentpassed–passedpassed–
09-lifecycleturning WooCommerce off does not break pages with shop elementspassed–passedpassed–
10-mobile-editorbuild a small page on a phone without drag and dropskippedpassedskippedskippedpassed
11-accessibilityno serious WCAG violations: /passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /myr/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /journal/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /shop/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /product/myr-pendel/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /cart/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /?s=lampepassedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /finnes-ikke/passedpassedpassedpassedpassed
11-accessibilityeditor › the editor interface has no serious violationspassed–passedpassed–
11-accessibilitythe site works with the keyboard alonepassed–passedpassed–
12-norwegianeditor in Norwegian › labels, notices and element names are Norwegianpassed–passedpassed–
12-norwegianthe site in Norwegianpassed–passedpassed–
13-richtextsettings panel: format text, color it, and turn a paragraph into a Heading elementpassed–passedpassed–
13-richtextHTML view: headings typed as HTML are split into Heading elementspassed–passedpassed–
13-richtexton the page: floating toolbar formats text and makes headingspassed–passedpassed–
14-handlesresize and spacing handles write per-device stylespassed–passedpassed–
15-site-panelsdesign panel content fits the panel width (en_US)passed–passedpassed–
15-site-panelsdesign panel content fits the panel width (nb_NO)passed–passedpassed–
15-site-panelsheader and footer are easy to reach › click the header on the page, edit it, and go back to the pagepassed–passedpassed–
15-site-panelsheader and footer are easy to reach › menu items open the header and footer; the toolbar on the site links to thempassed–passedpassed–
15-site-panelsheader and footer are easy to reach › first run creates a header and footer; a demo import replaces them if untouchedpassed–passedpassed–
16-background-videobackground video › a file plays muted on screen, under the overlay; YouTube waits for consentpassed–passedpassed–
16-background-videobackground video › "Not now" keeps YouTube away; consent handled elsewhere loads it without askingpassed–passedpassed–
16-background-videobackground video › reduced motion and phones set to "poster" download no videopassed–passedpassed–
16-background-videobackground video › set up in the editor from Style → Backgroundpassed–passedpassed–
17-fontsfonts › add a font, use it for headings, served from this sitepassed–passedpassed–
17-fontsfonts › a font in use cannot be removed until another is chosenpassed–passedpassed–
18-iconboxesicon boxes › add a group, change its style and one boxpassed–passedpassed–
18-iconboxesicon boxes › numbers count up on the site, and just show with reduced motionpassed–passedpassed–
19-reviewsreviews: summary, cards, carousel and featuredpassed–passedpassed–
20-sliderslider › add a slider with three slides and publishpassed–passedpassed–
20-sliderslider › arrows, dots, autoplay and pause on the sitepassed–passedpassed–
20-sliderslider › no automatic change with reduced motionpassed–passedpassed–
21-countdown-marqueecountdowns: to a date, after the end, and per visitorpassed–passedpassed–
21-countdown-marqueelogo band moves, pauses, and stays calm with reduced motionpassed–passedpassed–
22-popup-announcementpopup: after a delay once, from links always, and it closespassed–passedpassed–
22-popup-announcementannouncement bar: closing is remembered without a flashpassed–passedpassed–
22-popup-announcementin the editor the popup sits in the page with its link addresspassed–passedpassed–
23-mapmap › find an address in the editorpassed–passedpassed–
23-mapmap › on the site: nothing from the map service until the visitor askspassed–passedpassed–
23-mapmap › Google Maps with the owner’s own keypassed–passedpassed–
24-forms-bookingforms and booking › pick a form in the editor; styled like the site; the static copy keeps the shortcodepassed–passedpassed–
24-forms-bookingforms and booking › booking: in a window, on the page, in a new tab, or from a booking pluginpassed–passedpassed–
25-reveal-hovertext reveal: words and letters appear, whole text for screen readerspassed–passedpassed–
25-reveal-hovertext reveal is plain text with reduced motionpassed–passedpassed–
25-reveal-hoverhover: lifts while hovered and settles backpassed–passedpassed–
25-reveal-hovermoving text band slides with scrolling and never shows a gappassed–passedpassed–
25-reveal-hoverpage transitions are an opt-in design value, off with reduced motionpassed–passedpassed–
26-seosearch and sharing settings reach the pagepassed–passedpassed–
26-seowith an SEO plugin active Midground outputs nothing and says sopassed–passedpassed–
27-client-modeclient mode › the editor offers content onlypassed–passedpassed–
27-client-modeclient mode › the server keeps layout and styles whatever is sentpassed–passedpassed–
28-export-importexport a page and import it againpassed–passedpassed–
29-woo-leanpages without shop content load no WooCommerce scripts; shop pages dopassed–passedpassed–
30-assistantAI assistant › no AI button while it is offpassed–passedpassed–
30-assistantAI assistant › improve and shorten a text, accepting only when chosenpassed–passedpassed–
31-starter-sitesimport a starter site from the admin, then remove itpassed–passedpassed–
31-starter-sitesno serious WCAG violations: agencypassed–passedpassed–
31-starter-sitesno serious WCAG violations: restaurantpassed–passedpassed–
31-starter-sitesno serious WCAG violations: shoppassed–passedpassed–
31-starter-sitesno serious WCAG violations: localpassed–passedpassed–
31-starter-sitesno serious WCAG violations: experiencepassed–passedpassed–
31-starter-sitesno serious WCAG violations: saaspassed–passedpassed–
32-help-tourthe tour starts once, can be stepped through with the keyboard and taken againpassedpassedpassedpassedpassed
32-help-tourthe Help menu opens the keyboard shortcutspassed–passedpassed–
33-headera sticky header stays at the top of the screenpassed–passedpassed–
33-headerheader over the first section: see-through on the hero, solid after scrollingpassed–passedpassed–

The one skipped test on the desktop projects is the phone editor test, which runs on the phones. In total 327 passed, 0 failed, 3 skipped on purpose.

4. Accessibility #

axe-core 4.13 with the WCAG 2.0/2.1 level A and AA rules, at rest (reduced motion, so animations are not measured half-way):

FileTestChromiumPixel 7FirefoxWebKitiPhone 14
11-accessibilityno serious WCAG violations: /passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /myr/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /journal/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /shop/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /product/myr-pendel/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /cart/passedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /?s=lampepassedpassedpassedpassedpassed
11-accessibilityno serious WCAG violations: /finnes-ikke/passedpassedpassedpassedpassed
11-accessibilityeditor › the editor interface has no serious violationspassed–passedpassed–
11-accessibilitythe site works with the keyboard alonepassed–passedpassed–
31-starter-sitesno serious WCAG violations: agencypassed–passedpassed–
31-starter-sitesno serious WCAG violations: restaurantpassed–passedpassed–
31-starter-sitesno serious WCAG violations: shoppassed–passedpassed–
31-starter-sitesno serious WCAG violations: localpassed–passedpassed–
31-starter-sitesno serious WCAG violations: experiencepassed–passedpassed–
31-starter-sitesno serious WCAG violations: saaspassed–passedpassed–

"passed" means no serious or critical violation. Each starter site row checks every page of that site (4, 3, 4, 4, 3 and 2 pages); those checks run on the desktop projects.

Also: a keyboard test (skip link, visible focus, every focused element visible, no focus trap), the editor tour (focus kept in the tour card, Escape closes, arrow keys step through), popups as real dialogs, reduced motion (no transforms, pinned scenes released), content readable without JavaScript, without WebGL and when the runtime fails. Not done: a manual test with a screen reader (see status).

5. Clean install and life cycle (tests/install/clean-install.sh) #

A new WordPress (its own database) on port 8089 with the packages from dist/:

  1. Install and activate the theme and plugin from the ZIP files; activation creates no content.
  2. First visit to the admin: a header and a footer are created once.
  3. Build a page: heading, text, effect and CSS show; the revision has the document.
  4. Update (reinstall over an older version number): the upgrade routine runs, the static copies are refreshed in the background, content is intact.
  5. Deactivate: heading and text still show, the theme's fallback styles load, no PHP errors.
  6. Uninstall (default): page, document, template and settings are kept; the plugin files go.
  7. Reinstall: the document can be edited again.
  8. Uninstall with "delete on uninstall": templates and settings are deleted, the page is kept and still readable.
  9. The Skumring showcase without WooCommerce: import and removal work, no shop is created.
  10. A starter site (Brightwater Plumbing): its front page, header and colours take over; removing it puts the earlier colours back.
EnvironmentResult
WordPress 7.1.2, PHP 8.3.33 (latest)45 / 45 checks passed
WordPress 6.6.2, PHP 8.1.30 (web) and 8.1.34 (WP-CLI) – the minimum versions46 / 46 checks passed, including the whole PHP integration suite on these versions: 98 / 98 tests, 1,386 checks (without WooCommerce, whose current version needs a newer WordPress)

All 100 PHP files of the theme and plugins also pass php -l on PHP 8.1.30.

The latest-version install was run three times on the final packages: twice 45 / 45, and once 44 / 45 – the check that reads the starter site's front page straight after the import did not find its heading in one run. It passed in the other two runs and on the minimum versions, and the cause was not found; it is noted here rather than hidden.

Commands:

python tools/package.py
bash tests/install/clean-install.sh
MG_WP_IMAGE=wordpress:6.6-php8.1-apache MG_CLI_IMAGE=wordpress:cli-php8.1 MG_PHP_TESTS=1 bash tests/install/clean-install.sh

6. Performance (tools/perf.mjs) #

Cold cache, median of 3 runs. Phone: Pixel 7, 4× CPU slowdown and a "Slow 4G"-like network (150 ms RTT, 1.6 Mbit/s). Desktop: 1440×900 without throttling. Measured locally; not Lighthouse.

PageDeviceTTFBFCPLCPCLSTBTRequestsJS MidgroundJS WordPress/WooCommerceCSSFontsImages
Business page /Phone (throttled)209 ms980 ms1.40 s0.0010 ms1312.5 KB7.5 KB17.3 KB151.1 KB104.9 KB
Business page /Desktop269 ms332 ms332 ms00 ms1412.5 KB7.5 KB17.3 KB151.1 KB92.2 KB
3D + parallax page /myr/Phone (throttled)213 ms1.67 s1.70 s00 ms2812.5 KB52.5 KB34.6 KB151.1 KB86.8 KB
3D + parallax page /myr/Desktop195 ms280 ms280 ms00 ms3512.5 KB52.5 KB34.6 KB151.1 KB166.4 KB
Shop /shop/Phone (throttled)218 ms1.64 s1.64 s00 ms2412.5 KB52.5 KB34.6 KB151.1 KB82.5 KB
Shop /shop/Desktop183 ms244 ms244 ms00 ms2412.5 KB52.5 KB34.6 KB151.1 KB48.8 KB
Product /product/myr-pendel/Phone (throttled)290 ms1.66 s1.66 s0.0480 ms3912.5 KB95.3 KB38.2 KB151.1 KB137.5 KB
Product /product/myr-pendel/Desktop202 ms276 ms276 ms00 ms4012.5 KB95.3 KB38.2 KB151.1 KB128.7 KB
Starter site Ember & Oak /Phone (throttled)217 ms1.02 s1.31 s0.0030 ms1312.5 KB7.5 KB17.3 KB151.1 KB127.1 KB
Starter site Ember & Oak /Desktop180 ms264 ms264 ms00 ms1712.5 KB7.5 KB17.3 KB151.1 KB190.3 KB
Starter site Loopwise /Phone (throttled)200 ms1.01 s1.66 s0.00316 ms1712.5 KB7.5 KB17.3 KB57.5 KB150.1 KB
Starter site Loopwise /Desktop223 ms280 ms280 ms00 ms1712.5 KB7.5 KB17.3 KB57.5 KB99.1 KB

KB = compressed transfer (gzip) measured in the network layer. "JS Midground" is the runtime; on the 3D page the 3D viewer (166.1 KB, three.js) and the model (213.4 KB, GLB) load only when the model comes near the screen – not with the page. The two starter site rows are measured on their own after importing each starter site (design included, fonts not copied from Google, so the bundled fonts stand in) into the same installation. Motion runtime per scroll frame (desktop, every effect active): business page 11 elements, median 0 ms, 95th percentile 0.1 ms, max 0.2 ms; 3D page 12 elements, median 0 ms, 95th percentile 0.1 ms, max 0.3 ms; Loopwise 4 elements, max 0.4 ms.

Against the budgets in the plan:

Budget (from the plan)Simple pageHeavy 3D pageMeasuredStatus
JS before interaction (gzip), Midground≤ 20 KB≤ 30 KB12.5 KB on every page (1.0: 6.8 KB; the new elements are in the same runtime)met
JS from WordPress/WooCommerce––7.5 KB on pages without shop content (1.0: 52.5 KB – WooCommerce's scripts are now left out there); 52.5 KB on shop pages, 95.3 KB on the product page (jQuery, cart, gallery)outside Midground's control
3D module (gzip, on demand)0≤ 200 KB0 on the simple page, 166.1 KB on the 3D pagemet
CSS (gzip)≤ 30 KB≤ 35 KB17.3 KB on pages without shop content (1.0: 29.9 KB); 34.6 KB on the 3D page and the shop, 38.2 KB on the product page. Midground's and the theme's share is 17.1 KB everywhere; the rest is WooCommerce (16.7 KB, plus 2.9 KB for its image zoom on product pages)met for Midground's part
Fonts≤ 2 variable woff2same2 files, 151.1 KB (the bundled fonts); Loopwise uses one of them, 57.5 KBmet
GLB per model–≤ 1.5 MB (aim ≤ 600 KB)213.4 KBmet
CLS< 0.05< 0.05at most 0.003 on normal pages; 0.048 on the product page on a phonemet
LCP (phone, local)< 2.5 s< 3.0 s1.31–1.70 smet
Runtime per scroll frame (desktop)< 2 ms< 4 msmax 0.4 msmet

7. Translations #

All 2,596 / 2,596 strings are translated to Norwegian (Bokmål): 1,846 for the builder, the theme and the showcase from before, plus 750 new ones – the editor tour and Help menu, the Starter sites screen and the content of the six starter sites (bash tools/i18n.sh). The user guide exists in English and Norwegian. The Norwegian editor and site are checked by 12-norwegian.

8. What was found and fixed during testing #

Found by the tests and fixed before delivery:

Tests that were changed because a browser behaves differently (not because of a fault): Safari's Tab key skips links unless the visitor turns that on, so the keyboard test focuses the skip link directly in WebKit; mobile WebKit in the tests has no mouse wheel; four tests now wait for a save, a preview or the right settings panel instead of racing it.

Firefox under the test machine's app sandbox had to be started from its real installation folder (PLAYWRIGHT_BROWSERS_PATH); this is about the test machine, not the product.

9. Not tested and known limits #

See status: real devices and Safari on macOS/iOS, a manual screen reader test, multisite, other WooCommerce product types and payment methods, measurements over a real network, and the features that were verified only with stand-ins for other companies' services.