Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,21 @@

All notable changes to the Nynaeve theme will be documented in this file.

## [4.1.0] - 2026-10-05

### Added

- `imagewize/cta` `woocommerce` variant: a third button, **Run the Free Store Checkup**, linking to `/woocommerce-checkup/`. It sends visitors and internal link value from every WooCommerce post to the free checkup tool. The checkup tool had stored only 9 scans in 90 days, 5 of them internal test runs. The button is appended **last** on purpose. The block uses `templateLock: "contentOnly"`, and Gutenberg re-syncs placed instances to the template by position (`use-inner-block-template-sync.js`). Inserted mid-list, the new button would make an existing post show the services link twice when opened in the editor. Placed last, an old post gains the checkup button the next time it is opened and saved.
- The `woocommerce-de` variant is unchanged, because the checkup's on-page report is English only.

### Technical

- Added `@imwz/wp-pattern-sentinel` as a dev dependency, plus `npm run test:patterns`. It round-trips the fixtures in `tests/sentinel/` through the local editor (`imagewize.test`, Trellis credentials) and reports block-validation errors or content drift. The first fixture, `cta-woocommerce.html`, is the WooCommerce CTA as serialized in posts. `.html` fixtures need Sentinel 1.2.0 or later.

### Notes

- **Existing posts don't change on the frontend** until their stored markup is migrated: a static block's saved HTML is what renders. Append the button to placed `is-variant-woocommerce` instances on production with a scripted update (a database export first). Opening and saving a post in the editor also works, one post at a time.

## [4.0.1] - 2026-09-03

### Technical
Expand Down
115 changes: 115 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 3 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,11 @@
"translate:update": "for file in ./resources/lang/*.po; do wp i18n update-po ./resources/lang/nynaeve.pot $file; done",
"translate:compile": "npm run translate:mo && npm run translate:js",
"translate:js": "wp i18n make-json ./resources/lang --pretty-print",
"translate:mo": "wp i18n make-mo ./resources/lang ./resources/lang"
"translate:mo": "wp i18n make-mo ./resources/lang ./resources/lang",
"test:patterns": "sentinel --trellis --trellis-dir=../imagewize.com/trellis --site=imagewize.com tests/sentinel/"
},
"devDependencies": {
"@imwz/wp-pattern-sentinel": "^1.2.0",
"@roots/vite-plugin": "^2.0.2",
"@tailwindcss/vite": "^4.0.9",
"@wordpress/icons": "^10.9.0",
Expand Down
5 changes: 4 additions & 1 deletion readme.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Contributors: jasperfrumau
Requires at least: 6.6
Tested up to: 6.9
Requires PHP: 8.3
Stable tag: 4.0.1
Stable tag: 4.1.0
License: MIT License
License URI: https://opensource.org/licenses/MIT

Expand All @@ -24,6 +24,9 @@ Export the database first and verify each dry-run count before dropping --dry-ru

== Changelog ==

= 4.1.0 - 10/05/26 =
* FEATURE: The WooCommerce CTA variant gains a third button, Run the Free Store Checkup, linking to /woocommerce-checkup/. It is appended last so existing posts re-sync cleanly when opened in the editor. Already-published posts need their stored markup updated to show it on the frontend.

= 4.0.1 - 09/03/26 =
* TECHNICAL: npm dependencies updated - tailwindcss and @tailwindcss/vite 4.3.1 to 4.3.3, laravel-vite-plugin 3.1.0 to 3.2.0, vite 8.0.16 to 8.2.2, plus transitive dependency bumps. No code changes.

Expand Down
2 changes: 1 addition & 1 deletion resources/js/blocks/cta/block.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"$schema": "https://schemas.wp.org/trunk/block.json",
"apiVersion": 3,
"name": "imagewize/cta",
"version": "1.0.0",
"version": "1.1.0",
"title": "CTA",
"category": "nynaeve/cta",
"icon": "megaphone",
Expand Down
6 changes: 5 additions & 1 deletion resources/js/blocks/cta/templates.js
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
/**
* Build an InnerBlocks template from a variant's copy.
*
* The first button is the filled call, the second the outline one. Variants
* The first button is the filled call, every later one outline. Variants
* that lead with a different call (performance-partnership) express that by
* ordering `buttons`, not by changing the structure.
*/
Expand Down Expand Up @@ -155,6 +155,10 @@ export const VARIANTS = {
buttons: [
['Get a Quote', '/contact/?service=woocommerce'],
['View WooCommerce Services', '/services/woocommerce/'],
// Must stay last: contentOnly re-syncs placed instances to this
// template by position, so a button inserted mid-list would shift
// existing ones and duplicate the services link on open.
['Run the Free Store Checkup', '/woocommerce-checkup/'],
],
}),
},
Expand Down
2 changes: 1 addition & 1 deletion style.css
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
Theme Name: Nynaeve
Theme URI: https://imagewize.com
Description: Modern WordPress theme built on Sage 11 with reusable custom blocks using WordPress native tools and the Roots.io stack.
Version: 4.0.1
Version: 4.1.0
Author: Jasper Frumau
Author URI: https://magewize.com
Text Domain: nynaeve
Expand Down
48 changes: 48 additions & 0 deletions tests/sentinel/cta-woocommerce.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
<!-- Sentinel fixture: imagewize/cta "woocommerce" variant, serialized as stored in post_content (from post 13755, plus the 4.1.0 checkup button). -->
<!-- wp:imagewize/cta {"variant":"woocommerce"} -->
<div class="wp-block-imagewize-cta is-variant-woocommerce" style="margin-top:0;margin-bottom:0"><!-- wp:spacer {"height":"32px"} -->
<div style="height:32px" aria-hidden="true" class="wp-block-spacer"></div>
<!-- /wp:spacer -->

<!-- wp:group {"style":{"spacing":{"padding":{"top":"1.5rem","bottom":"1.5rem","left":"1.5rem","right":"1.5rem"}},"border":{"left":{"color":"#10b981","width":"4px"}}},"backgroundColor":"tertiary"} -->
<div class="wp-block-group has-tertiary-background-color has-background" style="border-left-color:#10b981;border-left-width:4px;padding-top:1.5rem;padding-right:1.5rem;padding-bottom:1.5rem;padding-left:1.5rem"><!-- wp:heading {"level":3,"style":{"typography":{"fontWeight":"600","lineHeight":"1.3"}}} -->
<h3 class="wp-block-heading" style="font-weight:600;line-height:1.3">Need a WooCommerce Developer for Your Store?</h3>
<!-- /wp:heading -->

<!-- wp:paragraph {"style":{"typography":{"lineHeight":"1.7"}}} -->
<p style="line-height:1.7">We build and optimize WooCommerce stores for SMEs — from custom checkout flows and payment integrations to performance tuning and ongoing maintenance. Fixed-price quotes available.</p>
<!-- /wp:paragraph -->

<!-- wp:list {"className":"wp-block-list"} -->
<ul class="wp-block-list"><!-- wp:list-item -->
<li>Custom checkout and cart optimization</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Payment gateway integration (Stripe, Mollie, PayPal)</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>WooCommerce performance and speed optimization</li>
<!-- /wp:list-item -->

<!-- wp:list-item -->
<li>Ongoing store maintenance and support</li>
<!-- /wp:list-item --></ul>
<!-- /wp:list -->

<!-- wp:buttons {"layout":{"type":"flex","flexWrap":"wrap"}} -->
<div class="wp-block-buttons"><!-- wp:button {"backgroundColor":"primary","textColor":"base","style":{"border":{"radius":"8px"}}} -->
<div class="wp-block-button"><a class="wp-block-button__link has-base-color has-primary-background-color has-text-color has-background wp-element-button" href="/contact/?service=woocommerce" style="border-radius:8px">Get a Quote</a></div>
<!-- /wp:button -->

<!-- wp:button {"className":"is-style-outline","style":{"border":{"radius":"8px"}}} -->
<div class="wp-block-button is-style-outline"><a class="wp-block-button__link wp-element-button" href="/services/woocommerce/" style="border-radius:8px">View WooCommerce Services</a></div>
<!-- /wp:button -->

<!-- wp:button {"className":"is-style-outline","style":{"border":{"radius":"8px"}}} -->
<div class="wp-block-button is-style-outline"><a class="wp-block-button__link wp-element-button" href="/woocommerce-checkup/" style="border-radius:8px">Run the Free Store Checkup</a></div>
<!-- /wp:button --></div>
<!-- /wp:buttons --></div>
<!-- /wp:group --></div>
<!-- /wp:imagewize/cta -->
Loading