Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
30ed62c
Load the complete Font Awesome library when menus need it
puikinsh Oct 1, 2026
650a2fd
Sync the version and changelog to the released 2.6.11
puikinsh Oct 1, 2026
f8d8211
Restore the Font Awesome subset and load the complete set as one file
puikinsh Oct 1, 2026
b979bfe
Replace Grunt with npm scripts, pinned linters and GitHub Actions CI
puikinsh Oct 1, 2026
2913870
Apply the WordPress coding standard's automatic formatting
puikinsh Oct 1, 2026
3eb5c48
Remove the skip-link focus fix, which threw on every hash change
puikinsh Oct 1, 2026
6fcc9c5
Make the menu toggle and the slider work on jQuery 4
puikinsh Oct 1, 2026
b4619f6
Make the submenu toggle a real, labelled button and stop "#" items ju…
puikinsh Oct 1, 2026
07bc53c
Fix the password-protected post form and label the search forms
puikinsh Oct 1, 2026
8c014d8
Give each copy of the social menu its own id and a name
puikinsh Oct 1, 2026
cfb3012
Give every view one h1 and name the page landmarks
puikinsh Oct 1, 2026
30f5053
Show video posts in listings and fix empty links and the image template
puikinsh Oct 1, 2026
a837e82
Fix the theme's widgets: empty links, category names, counts, titles
puikinsh Oct 1, 2026
3b416e7
Fix two PHP 8 fatals and other output in the theme's helpers
puikinsh Oct 1, 2026
9efc5c9
Fix Customizer settings that disagreed with the site or saved badly
puikinsh Oct 1, 2026
d425a38
Fix the Customizer's switches, slider dependencies and link sections
puikinsh Oct 1, 2026
fa2691e
Fix wrong and unclear Customizer and layout box copy
puikinsh Oct 1, 2026
e4d547e
Fix the dropdown colours and the nested submenu arrow from 768px up
puikinsh Oct 1, 2026
54cbbff
Keep the sticky header below the admin bar and anchors below the header
puikinsh Oct 1, 2026
60db658
Style block widget titles, the comment form and the footer calendar
puikinsh Oct 1, 2026
e724c34
Meet WCAG AA contrast and name the slider and social links
puikinsh Oct 1, 2026
16ca06d
Add social icons for X, Bluesky, Threads, Mastodon and other networks
puikinsh Oct 1, 2026
4075a26
Count Title Attribute icons in the Font Awesome menu scan
puikinsh Oct 1, 2026
6e79e00
Fix the About page's plugin checks and remove its dead "actions" code
puikinsh Oct 1, 2026
9f140ef
Remove files nothing loads
puikinsh Oct 1, 2026
56b48d3
Give WooCommerce prices readable contrast
puikinsh Oct 1, 2026
be32843
Add theme.json and size and colour the block editor like the site
puikinsh Oct 1, 2026
9be7a67
Add block patterns and a Blocks page template
puikinsh Oct 1, 2026
f6e1103
Give the nav walker the theme's prefix, so a plugin's walker can't clash
puikinsh Oct 1, 2026
4acc516
Prefix the variables templates declare
puikinsh Oct 1, 2026
9fc8931
Stop treating 404s as shop pages, and bring functions.php to standard
puikinsh Oct 1, 2026
93d2bcc
Fix the coding standard findings that need a person
puikinsh Oct 1, 2026
93a8c3d
Hold every linter at zero
puikinsh Oct 1, 2026
bc2ed20
Regenerate languages/sparkling.pot
puikinsh Oct 1, 2026
2766b3d
Read the changelog without WP_Filesystem
puikinsh Oct 1, 2026
7d8d33c
Declare the bundled assets' versions and licences correctly
puikinsh Oct 1, 2026
56a539a
Document the architecture, tooling and gotchas in CLAUDE.md and readm…
puikinsh Oct 1, 2026
b9bdbab
Release 2.7.0
puikinsh Oct 1, 2026
92181d2
Fix slider and menu accessibility and prepare 2.7.1
puikinsh Oct 13, 2026
2c77e96
Fix regressions found during LocalWP 2.7.1 testing
puikinsh Oct 13, 2026
3762e74
Contain hidden slider floats without focus scrolling
puikinsh Oct 14, 2026
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
32 changes: 17 additions & 15 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
# Files that exist for the repository, not for the shipped theme. Without these,
# GitHub's "Download ZIP" (which is git archive) hands users the repo scaffolding.
/.gitattributes export-ignore
/.gitignore export-ignore
/.jscsrc export-ignore
/.jshintrc export-ignore
/.jshintignore export-ignore
/.standard.json export-ignore
/.travis.yml export-ignore
/.github/ export-ignore
/CLAUDE.md export-ignore
/README.md export-ignore
/Gruntfile.js export-ignore
*.map export-ignore
/package.json export-ignore
/phpcs.ruleset.xml export-ignore
/set_tags.sh export-ignore
# npm run build is deny-by-default too (tools/build-zip.mjs).
/.gitattributes export-ignore
/.gitignore export-ignore
/.github/ export-ignore
/.stylelintrc.json export-ignore
/CLAUDE.md export-ignore
/readme.md export-ignore
/eslint.config.mjs export-ignore
/tools/ export-ignore
/tests/ export-ignore
/package.json export-ignore
/package-lock.json export-ignore
/phpcs.xml.dist export-ignore
/composer.json export-ignore
/composer.lock export-ignore
/set_tags.sh export-ignore
*.map export-ignore
22 changes: 16 additions & 6 deletions .github/build-icon-subset.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#!/usr/bin/env python3
"""Build a Font Awesome subset for one theme: only the glyphs it renders."""
import re, sys, pathlib, subprocess, json
import re, sys, pathlib, subprocess, json, hashlib

theme_dir = pathlib.Path(sys.argv[1]); base = sys.argv[2]; prefix = sys.argv[3]
fa = theme_dir / base / 'css' / 'fontawesome'
Expand Down Expand Up @@ -55,6 +55,7 @@ def icon_map(path):

faces = {'fa-solid-900': used_solid, 'fa-brands-400': used_brands, 'fa-regular-400': used_regular}
report = {}
font_files = {}
for face, cps in faces.items():
src = webfonts / f'{face}.woff2'
if not src.exists() or not cps:
Expand All @@ -63,7 +64,16 @@ def icon_map(path):
dst = out / f'{face}.woff2'
subprocess.run([sys.executable, '-m', 'fontTools.subset', str(src), f'--unicodes={uni}',
'--flavor=woff2', f'--output-file={dst}'], check=True, capture_output=True)
report[face] = {'glyphs': len(cps), 'bytes': dst.stat().st_size, 'from': src.stat().st_size}
digest = hashlib.sha256(dst.read_bytes()).hexdigest()[:12]
name = f'{face}.{digest}.woff2'
hashed = out / name
dst.replace(hashed)
# A stylesheet version cannot invalidate a font cached at the same URL.
# Remove previous generated files after the new one has been written.
for previous in out.glob(f'{face}*.woff2'):
if previous != hashed: previous.unlink()
font_files[face] = name
report[face] = {'glyphs': len(cps), 'bytes': hashed.stat().st_size, 'from': src.stat().st_size}

# 3. the CSS: Font Awesome's own non-icon rules, the used icon definitions, subset @font-face
full = (fa / 'fontawesome.min.css').read_text()
Expand All @@ -75,7 +85,7 @@ def icon_map(path):
for c in sorted(cps):
if c in rev: defs.append(','.join(f'.fa-{n}' for n in sorted(rev[c])) + '{--fa:"\\%s"}' % c)
FACE = ('@font-face{font-family:"%s";font-style:normal;font-weight:%s;font-display:block;'
'src:url(%s.woff2) format("woff2")}')
'src:url(%s) format("woff2")}')

HEADER = re.match(r'/\*!.*?\*/', (fa / 'solid.min.css').read_text(), re.S).group(0)

Expand All @@ -97,13 +107,13 @@ def style_rules(sheet):
ff = []
if used_solid:
ff.append(style_rules('solid.min.css'))
ff.append(FACE % ('Font Awesome 7 Free', '900', 'fa-solid-900'))
ff.append(FACE % ('Font Awesome 7 Free', '900', font_files['fa-solid-900']))
if used_regular:
ff.append(style_rules('regular.min.css'))
ff.append(FACE % ('Font Awesome 7 Free', '400', 'fa-regular-400'))
ff.append(FACE % ('Font Awesome 7 Free', '400', font_files['fa-regular-400']))
if used_brands:
ff.append(style_rules('brands.min.css'))
ff.append(FACE % ('Font Awesome 7 Brands', '400', 'fa-brands-400'))
ff.append(FACE % ('Font Awesome 7 Brands', '400', font_files['fa-brands-400']))
banner = ("/*!\n * Font Awesome 7.3.1 subset for this theme, built by .github/build-icon-subset.py\n"
" * Contains only the glyphs the theme renders. Load the complete Font Awesome with:\n"
" * add_filter( '%s_full_fontawesome', '__return_true' );\n"
Expand Down
107 changes: 107 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,107 @@
name: CI

# Replaces the .travis.yml pipeline, which targeted PHP 5.4-7.1 and stopped
# running when Travis withdrew free OSS builds.

on:
push:
branches: [master]
pull_request:
branches: [master]

permissions:
contents: read

jobs:
php:
name: PHP ${{ matrix.php }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
# Floor is the theme's declared "Requires PHP"; ceiling is current stable.
php: ['7.4', '8.0', '8.1', '8.2', '8.3', '8.4', '8.5']
steps:
- uses: actions/checkout@v7

- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php }}
coverage: none

- name: Syntax check every PHP file
run: |
find -L . -name '*.php' -not -path './node_modules/*' -not -path './vendor/*' -print0 \
| xargs -0 -n1 -P4 php -d error_reporting=E_ALL -l \
| (! grep -v '^No syntax errors')

phpcs:
name: WordPress coding standards
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- uses: shivammathur/setup-php@v2
with:
php-version: '8.3'
coverage: none
tools: cs2pr

# The versions in composer.lock, so CI and `composer lint` agree.
- name: Install PHPCS, WordPress Coding Standards and PHPCompatibilityWP
run: composer install --no-interaction --no-progress

# phpcs.xml.dist: WordPress-Extra, the sparkling prefix and text domain,
# and PHP 7.4+ compatibility. Any error or warning fails the job.
- name: PHPCS
run: vendor/bin/phpcs -q --report=checkstyle | cs2pr

js-css:
name: Lint JS + CSS + i18n
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v7

- uses: actions/setup-node@v7
with:
node-version: '22'
cache: npm

- run: npm ci

- name: ESLint
run: npm run lint:js

- name: Stylelint
run: npm run lint:css

- name: Text domain check
run: npm run i18n:check

- name: Frontend and release regression tests
run: npm test

build:
name: Build theme archive
runs-on: ubuntu-latest
needs: [php, phpcs, js-css]
steps:
- uses: actions/checkout@v7

- uses: actions/setup-node@v7
with:
node-version: '22'
cache: npm

- run: npm ci

# `npm run build` runs the text domain check via prebuild.
- name: Build
run: npm run build

- uses: actions/upload-artifact@v7
with:
name: sparkling-theme
path: sparkling.zip
if-no-files-found: error
26 changes: 21 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,23 @@
node_modules/*
.idea/*
sparkling.zip
.gitignore
# Dependencies. Anchored: unanchored, "vendor/" also matched assets/js/vendor/,
# which is how the theme's own Bootstrap and FlexSlider scripts once went
# untracked and every git-based build shipped without them.
/node_modules/
/vendor/

# macOS
# Build output
/build/
/sparkling.zip

# Editors / OS
.idea/
.vscode/
.DS_Store
*.swp

# Generated
.sass-cache/
*.map
.phpcs-cache

# package-lock.json and composer.lock are committed so `npm ci` and
# `composer install` reproduce the exact toolchain that was tested.
9 changes: 0 additions & 9 deletions .jscsrc

This file was deleted.

1 change: 0 additions & 1 deletion .jshintignore

This file was deleted.

22 changes: 0 additions & 22 deletions .jshintrc

This file was deleted.

1 change: 0 additions & 1 deletion .standard.json

This file was deleted.

73 changes: 73 additions & 0 deletions .stylelintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
{
"extends": "stylelint-config-standard",
"ignoreFiles": [
"node_modules/**",
"vendor/**",
"build/**",
"**/*.min.css",
"assets/css/bootstrap.css",
"assets/css/flexslider.css",
"assets/css/academicons.css",
"assets/css/google-fonts.css",
"assets/css/fontawesome/**",
"assets/js/**"
],
"rules": {
"no-descending-specificity": null,
"font-family-no-missing-generic-family-keyword": null,
"declaration-block-no-redundant-longhand-properties": null,
"shorthand-property-no-redundant-values": null,
"selector-class-pattern": null,
"selector-id-pattern": null,
"keyframes-name-pattern": null,
"custom-property-pattern": null,
"number-max-precision": null,
"comment-empty-line-before": null,
"rule-empty-line-before": null,
"at-rule-empty-line-before": null,
"declaration-empty-line-before": null,
"comment-whitespace-inside": null,
"alpha-value-notation": null,
"color-function-notation": null,
"color-function-alias-notation": null,
"hue-degree-notation": null,
"value-keyword-case": null,
"media-feature-range-notation": null,
"length-zero-no-unit": null,
"selector-not-notation": null,
"selector-pseudo-element-colon-notation": null,
"property-no-vendor-prefix": null,
"value-no-vendor-prefix": null,
"at-rule-no-vendor-prefix": null,
"selector-no-vendor-prefix": null,
"declaration-property-value-no-unknown": null,
"property-no-deprecated": null,
"no-duplicate-selectors": [
true,
{
"severity": "warning"
}
],
"block-no-empty": [
true,
{
"severity": "warning"
}
],
"declaration-block-no-duplicate-properties": [
true,
{
"ignore": [
"consecutive-duplicates-with-different-values"
],
"severity": "warning"
}
],
"font-family-no-duplicate-names": [
true,
{
"severity": "warning"
}
]
}
}
Loading
Loading