diff --git a/.monorepo-source.json b/.monorepo-source.json index 6a35d60..f558cdc 100644 --- a/.monorepo-source.json +++ b/.monorepo-source.json @@ -1,7 +1,7 @@ { "productId": "funkycommerce-headless", "repository": "coded-letter/superfunky-theme", - "source": "coded-letter/coded-letter-monorepo@95339e345eae0577fd6ec2a8748b636e645d5150", + "source": "coded-letter/coded-letter-monorepo@d3df02900ae9d6ca232dad2f5098e430012f2418", "sourcePath": "workspace/backend/wordpress/themes/free/funkycommerce-headless", "installSlug": "funkycommerce-headless", "kind": "theme", diff --git a/functions.php b/functions.php index b7efd84..b49a5ab 100644 --- a/functions.php +++ b/functions.php @@ -9,7 +9,7 @@ exit; } -define( 'FUNKYCOMMERCE_HEADLESS_VERSION', '1.2.17' ); +define( 'FUNKYCOMMERCE_HEADLESS_VERSION', '1.2.18' ); /** * Whether Superfunky Pro is active and licensed. diff --git a/inc/control-center-schema.php b/inc/control-center-schema.php index edd9ce5..74056e2 100644 --- a/inc/control-center-schema.php +++ b/inc/control-center-schema.php @@ -435,7 +435,13 @@ function funkycommerce_control_center_sections() { 'title' => __( 'Footer', 'funkycommerce-headless' ), 'description' => __( 'Footer content, social profiles, and newsletter copy. Native WordPress menus own column assignments; layout alternatives remain in Layout Studio.', 'funkycommerce-headless' ), 'fields' => array( - 'copyright_text' => array( 'label' => __( 'Copyright text', 'funkycommerce-headless' ), 'type' => 'text', 'tier' => 'free' ), + 'copyright_text' => array( + 'label' => __( 'Copyright text', 'funkycommerce-headless' ), + 'type' => 'textarea', + 'tier' => 'free', + 'sanitize' => 'html', + 'description' => __( 'Basic HTML is allowed, including links.', 'funkycommerce-headless' ), + ), 'social_links' => array( 'label' => __( 'Social profiles', 'funkycommerce-headless' ), 'type' => 'social_links', 'tier' => 'free', 'default' => array(), 'description' => __( 'Free theme feature. Add any supported platform more than once; every profile opens in a new tab.', 'funkycommerce-headless' ) ), 'newsletter_heading' => array( 'label' => __( 'Newsletter heading', 'funkycommerce-headless' ), 'type' => 'text', 'tier' => 'free' ), 'newsletter_text' => array( 'label' => __( 'Newsletter supporting text', 'funkycommerce-headless' ), 'type' => 'textarea', 'tier' => 'free' ), diff --git a/inc/control-center.php b/inc/control-center.php index 2763492..89d82be 100644 --- a/inc/control-center.php +++ b/inc/control-center.php @@ -765,7 +765,7 @@ function funkycommerce_storefront_control_settings( $language = '' ) { 'newsletterText' => (string) ( $settings['newsletter_text'] ?? '' ), 'newsletterPrivacyLabel' => (string) ( $settings['newsletter_privacy_label'] ?? '' ), 'extraHtml' => (string) ( $settings['footer_extra_content'] ?? '' ), - 'copyrightText' => (string) ( $settings['copyright_text'] ?? '' ), + 'copyrightText' => wp_kses_post( (string) ( $settings['copyright_text'] ?? '' ) ), 'spotifyPlaylistUrl' => funkycommerce_normalize_spotify_playlist_url( $settings['spotify_playlist_url'] ?? '' ), 'spotifyPlaylistEmbedUrl' => funkycommerce_spotify_playlist_embed_url( $settings['spotify_playlist_url'] ?? '' ), 'spotifyPlayerTitle' => sanitize_text_field( (string) ( $settings['spotify_player_title'] ?? '' ) ), diff --git a/package-lock.json b/package-lock.json index bfd5157..a2c49a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "funkycommerce-headless-theme", - "version": "1.2.17", + "version": "1.2.18", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "funkycommerce-headless-theme", - "version": "1.2.17", + "version": "1.2.18", "devDependencies": { "autoprefixer": "^10.4.20", "esbuild": "^0.28.2", diff --git a/package.json b/package.json index b44b369..ce2bfcc 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "funkycommerce-headless-theme", "private": true, - "version": "1.2.17", + "version": "1.2.18", "description": "Tailwind/build tooling for the FunkyCommerce Headless WordPress theme's native frontend assets (block templates, template parts, loader, and Spotify slot).", "scripts": { "build:css": "tailwindcss -i ./assets/css/theme-source.css -o ./assets/dist/theme.css --minify", diff --git a/readme.txt b/readme.txt index 48d27fc..3fc5c30 100644 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Tags: headless, woocommerce, wpgraphql, full-site-editing Requires at least: 6.7 Tested up to: 6.8 Requires PHP: 7.4 -Stable tag: 1.2.17 +Stable tag: 1.2.18 License: GPL-2.0-or-later License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -15,6 +15,11 @@ Control Center, the theme also ships a complete native WordPress rendering path "Native frontend theme" below) with accessible header/footer/navigation templates and core front/home/singular/archive/search/404 routes styled to match the storefront. +== 1.2.18 highlights == + +* Allows safe HTML links in the free-theme footer copyright field. +* Sanitizes copyright markup in WordPress and again before storefront rendering. + == 1.2.17 highlights == * Publishes configured llms.txt documents reliably for static storefront deployments. diff --git a/style.css b/style.css index 66a39be..8cd51e7 100644 --- a/style.css +++ b/style.css @@ -7,7 +7,7 @@ Description: A minimal, content-first block theme for polished WordPress preview Requires at least: 6.7 Tested up to: 6.8 Requires PHP: 7.4 -Version: 1.2.17 +Version: 1.2.18 Update URI: https://github.com/coded-letter/superfunky-theme License: GPL-2.0-or-later License URI: https://www.gnu.org/licenses/gpl-2.0.html