Compare commits

...

16 Commits

Author SHA1 Message Date
Keith Solomon
994107305b 🐞 fix: Update build script
All checks were successful
Sync TODOs with Issues / sync_todos (push) Successful in 6s
2026-03-07 20:39:09 -06:00
Keith Solomon
514dc490b5 🐞 fix: Update build script
All checks were successful
Sync TODOs with Issues / sync_todos (push) Successful in 6s
2026-03-07 20:29:32 -06:00
Keith Solomon
f4782bc9cd 🔵 other: Formatting updates
All checks were successful
Sync TODOs with Issues / sync_todos (push) Successful in 6s
2026-03-07 19:59:15 -06:00
Keith Solomon
361f57424c 🐞 fix: Update npm stack for bootstrap install
All checks were successful
Sync TODOs with Issues / sync_todos (push) Successful in 6s
2026-03-07 18:54:30 -06:00
Keith Solomon
5b7fed2cb8 🐞 fix: Revert admin UI style overrides, typography updates (#9)
All checks were successful
Sync TODOs with Issues / sync_todos (push) Successful in 8s
2026-03-04 08:55:15 -06:00
Aarish
3ef6385935 Remove wp_print_styles action from wp_head (#5)
Removed the remove_action hook for wp_print_styles in lib/hooks.php. Previously, this hook was preventing stylesheets from loading in the <head> and forcing them to load in the footer. This caused a significant Flash of Unstyled Content (FOUC) where the raw HTML would render before styles were applied.
2026-03-04 08:51:55 -06:00
Keith Solomon
a90272f0af 🐞 fix: Alignment fix 2026-02-24 12:19:03 -06:00
Keith Solomon
57129db550 feature: Update font sizes 2026-02-24 12:18:12 -06:00
Keith Solomon
a420cc430e Merge pull request #6 from Vincent-Design-Inc/fix/wp-script-module-args
Update script enqueueing for WordPress version 6.9
2026-02-20 08:25:31 -06:00
Keith Solomon
45fe3b1cf0 Merge branch 'main' into fix/wp-script-module-args 2026-02-20 08:24:35 -06:00
Keith Solomon
c07436c1f6 🐞 fix: Remove bogus parameters that were causing critical errors, remove unneeded version checks 2026-02-20 08:21:00 -06:00
Keith Solomon
8ef9e0c759 Merge pull request #7 from Vincent-Design-Inc/bugfix/footer-menu-guard
Refactor footer navigation retrieval logic
2026-02-19 14:12:23 -06:00
Keith Solomon
179754d6d0 🐞 fix: Cleaned up phpcs errors 2026-02-19 14:10:59 -06:00
Keith Solomon
7d24009fae 🐞 fix: Get rid of parameters causing critical errors in script calls 2026-02-18 11:57:40 -06:00
willpalahnuk
dc33dea120 Refactor footer navigation retrieval logic
Prevent:

Warning: Undefined array key "footer_navigation" in /Users/will/Local Sites/banffs-indigenous-experiences-map/app/public/wp-content/themes/Banff/footer.php on line 19

Warning: Undefined property: WP_Error::$term_id in /Users/will/Local Sites/banffs-indigenous-experiences-map/app/public/wp-content/themes/Banff/footer.php on line 20
2026-01-30 18:00:56 -06:00
willpalahnuk
bc9cf9bcdb Update script enqueueing for WordPress version 6.9
Backwards compatible for earlier versions, changes can be simplified if we only ever need to consider 6.9+
2026-01-30 17:57:59 -06:00
11 changed files with 218 additions and 185 deletions

10
.vscode/settings.json vendored
View File

@@ -3,6 +3,14 @@
"tree.indentGuidesStroke": "#3d92ec",
"activityBar.background": "#213309",
"titleBar.activeBackground": "#2E470C",
"titleBar.activeForeground": "#F6FCEE"
"titleBar.activeForeground": "#F6FCEE",
"titleBar.inactiveBackground": "#213209",
"titleBar.inactiveForeground": "#F7FCEF",
"statusBar.background": "#213209",
"statusBar.foreground": "#F7FCEF",
"statusBar.debuggingBackground": "#213209",
"statusBar.debuggingForeground": "#F7FCEF",
"statusBar.noFolderBackground": "#213209",
"statusBar.noFolderForeground": "#F7FCEF"
}
}

View File

@@ -8,17 +8,17 @@ const start = performance.now();
// Tailwind to CSS
try {
// Ensure the output directory exists
if (!fs.existsSync(distDir)) {
fs.mkdirSync(distDir, { recursive: true });
}
// Ensure the output directory exists
if (!fs.existsSync(distDir)) {
fs.mkdirSync(distDir, { recursive: true });
}
// Compile Tailwind
tailwindToCSS();
// Compile Tailwind
tailwindToCSS();
const end = performance.now();
const runtime = (end - start).toFixed(3);
console.log(`Production build successfully run in ${runtime}ms`);
const end = performance.now();
const runtime = (end - start).toFixed(3);
console.log(`Production build successfully run in ${runtime}ms`);
} catch (error) {
console.error("Error processing CSS files:", error);
console.error("Error processing CSS files:", error);
}

View File

@@ -14,12 +14,12 @@ const cwd = path.resolve("..");
// Compile Tailwind
module.exports.tailwindToCSS = debounce(() => {
try {
require("child_process").execSync(
`npx @tailwindcss/cli -i styles/theme.css -o static/dist/theme.css`,
{ stdio: "inherit" }
);
} catch (error) {
console.log(`Error compiling Tailwind to CSS:`, error);
}
try {
require("child_process").execSync(
`./node_modules/.bin/tailwindcss -i styles/theme.css -o static/dist/theme.css`,
{ stdio: "inherit" }
);
} catch (error) {
console.log(`Error compiling Tailwind to CSS:`, error);
}
}, 50);

View File

@@ -10,39 +10,39 @@ const cwd = path.resolve("../");
// Initialize BrowserSync
browserSync.init({
proxy: process.env.LOCALHOST_URL,
port: process.env.BROWSERSYNC_PORT,
cors: true,
cwd: cwd,
logLevel: `warn`,
minify: false,
open: false,
ui: false,
ghostMode: false,
reloadOnRestart: true,
notify: false,
watch: true,
proxy: process.env.LOCALHOST_URL,
port: process.env.BROWSERSYNC_PORT,
cors: true,
cwd: cwd,
logLevel: `warn`,
minify: false,
open: false,
ui: false,
ghostMode: false,
reloadOnRestart: true,
notify: false,
watch: true,
});
// Reload JS during development
browserSync.watch(`static/js/*.js`, (event, file) => {
if (event !== "change") return;
if (event !== "change") return;
const start = performance.now();
try {
browserSync.stream();
const end = performance.now();
const runtime = (end - start).toFixed(3);
console.log(`JS re-injected successfully in ${runtime}ms`);
} catch (error) {
console.log("Error compiling JS:", error);
}
const start = performance.now();
try {
browserSync.stream();
const end = performance.now();
const runtime = (end - start).toFixed(3);
console.log(`JS re-injected successfully in ${runtime}ms`);
} catch (error) {
console.log("Error compiling JS:", error);
}
});
// Compile tailwind to css and reload on changes
browserSync.watch(["**/*.css", "**/*.php"], (event, file) => {
if (event !== "change") return;
if (event !== "change") return;
tailwindToCSS();
browserSync.reload();
tailwindToCSS();
browserSync.reload();
});

View File

@@ -15,9 +15,10 @@ $copyright_text = getFieldValue( 'footer.copyright_text' ) ? getFieldValue( 'foo
$copyright = str_replace( '%Y', gmdate( 'Y' ), $copyright_text );
$locations = get_nav_menu_locations();
$footerMenu = get_term( $locations['footer_navigation'], 'nav_menu' );
$footerNav = wp_get_nav_menu_items( $footerMenu->term_id );
$locations = get_nav_menu_locations();
$footerNav = ! empty( $locations['footer_navigation'] )
? ( wp_get_nav_menu_items( (int) $locations['footer_navigation'] ) ? wp_get_nav_menu_items( (int) $locations['footer_navigation'] ) : array() )
: array();
?>
</main>

View File

@@ -23,6 +23,7 @@ class Enqueue {
public function __construct() {
add_action( 'wp_enqueue_scripts', array( $this, 'enqFEAssets' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqBEAssets' ) );
add_action( 'enqueue_block_editor_assets', array( $this, 'enqEditorAssets' ) );
}
/**
@@ -52,8 +53,8 @@ class Enqueue {
if ( file_exists( $theme_dir . $js_path ) ) {
$version = filemtime( $theme_dir . $js_path );
wp_enqueue_script( 'jquery' ); // Needed by downstream scripts; modules can't depend on classic scripts.
wp_enqueue_script_module( 'basicwp-theme', $theme_uri . $js_path, array(), $version, true );
wp_enqueue_script_module( 'basicwp-button', $theme_uri . '/static/js/components/button.js', array( 'basicwp-theme' ), $version, true );
wp_enqueue_script_module( 'basicwp-theme', $theme_uri . $js_path, array(), $version );
wp_enqueue_script_module( 'basicwp-button', $theme_uri . '/static/js/components/button.js', array( 'basicwp-theme' ), $version );
}
}
@@ -64,15 +65,6 @@ class Enqueue {
$theme_dir = get_stylesheet_directory();
$theme_uri = get_stylesheet_directory_uri();
/**
* Editor CSS
*/
$editor_css_path = '/styles/backend/editor.css';
if ( file_exists( $theme_dir . $editor_css_path ) ) {
$version = filemtime( $theme_dir . $editor_css_path );
wp_enqueue_style( 'basicwp-editor', $theme_uri . $editor_css_path, array(), $version );
}
$font_ver = gmdate( 'U' );
wp_enqueue_style( 'raleway', 'https://fonts.googleapis.com/css2?family=Raleway:wght@100..900&display=swap', false, $font_ver );
@@ -92,10 +84,28 @@ class Enqueue {
if ( file_exists( $theme_dir . $admin_js_path ) ) {
$version = filemtime( $theme_dir . $admin_js_path );
wp_enqueue_script( 'jquery' ); // Needed by downstream scripts; modules can't depend on classic scripts.
wp_enqueue_script_module( 'basicwp-admin', $theme_uri . $admin_js_path, array(), $version, true );
wp_enqueue_script_module( 'basicwp-button', $theme_uri . '/static/js/components/button.js', array( 'basicwp-admin' ), $version, true );
wp_enqueue_script_module( 'basicwp-admin', $theme_uri . $admin_js_path, array(), $version );
wp_enqueue_script_module( 'basicwp-button', $theme_uri . '/static/js/components/button.js', array( 'basicwp-admin' ), $version );
}
}
/**
* Enqueue block editor CSS (scoped to editor to avoid leaking into wp-admin UI).
*/
public function enqEditorAssets() {
$theme_dir = get_stylesheet_directory();
$theme_uri = get_stylesheet_directory_uri();
$editor_css_path = '/styles/backend/editor.css';
$font_ver = gmdate( 'U' );
wp_enqueue_style( 'raleway', 'https://fonts.googleapis.com/css2?family=Raleway:wght@100..900&display=swap', false, $font_ver );
if ( file_exists( $theme_dir . $editor_css_path ) ) {
$version = filemtime( $theme_dir . $editor_css_path );
wp_enqueue_style( 'basicwp-editor', $theme_uri . $editor_css_path, array(), $version );
}
}
}
// Initialize the Enqueue class.

View File

@@ -155,7 +155,6 @@ function init() {
wp_dequeue_style( 'core-block-styles' ); // Core block styles.
remove_action( 'wp_enqueue_scripts', 'wp_enqueue_global_styles', 1 );
remove_action( 'wp_enqueue_scripts', 'wp_enqueue_classic_theme_styles', 1 );
remove_action( 'wp_head', 'wp_print_styles', 8 );
remove_action( 'wp_head', 'wp_print_head_scripts', 9 );
remove_action( 'wp_head', 'wp_generator' ); // WordPress version.
remove_action( 'wp_head', 'rsd_link' ); // RSD link.

View File

@@ -1,42 +1,42 @@
{
"name": "vdi-starter-v5",
"version": "5.0",
"description": "VDI-Starter-v5 is a minimal WordPress theme designed as a starting point for custom theme development. It focuses on modern development approaches with a lean architecture that avoids the overhead of theme frameworks.",
"scripts": {
"start": "npm run watch",
"watch": "node bin/.watch.js",
"build": "npx @tailwindcss/cli -i ./styles/theme.css -o ./static/dist/theme.css --optimize"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Vincent-Design-Inc/VDI-Starter-v5.git"
},
"keywords": [
"wordpress",
"minimal",
"basic",
"custom",
"theme"
],
"author": "Keith Solomon <keith@vincentdesign.ca>",
"license": "MIT",
"bugs": {
"url": "https://github.com/Vincent-Design-Inc/VDI-Starter-v5/issues"
},
"homepage": "https://github.com/Vincent-Design-Inc/VDI-Starter-v5#readme",
"devDependencies": {
"@axe-core/playwright": "^4.10.1",
"@playwright/test": "^1.52.0",
"@types/node": "^22.15.2",
"browser-sync": "^3.0.3",
"dotenv": "^16.4.7"
},
"dependencies": {
"@tailwindcss/cli": "^4.0.13",
"@tailwindcss/typography": "^0.5.16",
"glob": "^10.3.10",
"lodash": "^4.17.21",
"lodash.debounce": "^4.0.8",
"tailwindcss": "^4.0.13"
}
"name": "vdi-starter-v5",
"version": "5.0",
"description": "VDI-Starter-v5 is a minimal WordPress theme designed as a starting point for custom theme development. It focuses on modern development approaches with a lean architecture that avoids the overhead of theme frameworks.",
"scripts": {
"start": "npm run watch",
"watch": "node bin/.watch.js",
"build": "./node_modules/.bin/tailwindcss -i ./styles/theme.css -o ./static/dist/theme.css --optimize"
},
"repository": {
"type": "git",
"url": "git+https://github.com/Vincent-Design-Inc/VDI-Starter-v5.git"
},
"keywords": [
"wordpress",
"minimal",
"basic",
"custom",
"theme"
],
"author": "Keith Solomon <keith@vincentdesign.ca>",
"license": "MIT",
"bugs": {
"url": "https://github.com/Vincent-Design-Inc/VDI-Starter-v5/issues"
},
"homepage": "https://github.com/Vincent-Design-Inc/VDI-Starter-v5#readme",
"devDependencies": {
"@axe-core/playwright": "^4.10.1",
"@playwright/test": "^1.52.0",
"@types/node": "^22.15.2",
"browser-sync": "^3.0.3",
"dotenv": "^16.4.7"
},
"dependencies": {
"tailwindcss": "^4.0.13",
"@tailwindcss/cli": "^4.0.13",
"@tailwindcss/typography": "^0.5.16",
"glob": "^10.3.10",
"lodash": "^4.17.21",
"lodash.debounce": "^4.0.8"
}
}

View File

@@ -1,16 +1,2 @@
/* Theme admin styles */
/* Light admin styles; avoid overriding core wp-admin UI */
@import "../../static/dist/theme.css";
body {
font-family: 'Raleway', sans-serif;
#wpwrap {
@layer utilities {
table.fixed { table-layout: fixed; position: static; }
}
}
}
#wpbody ul, ol, ul li, ol li { list-style-type: none; }
#adminmenu li ul, li ol { margin: 0; }

View File

@@ -2,9 +2,18 @@
@import "../../static/dist/theme.css";
body { font-family: 'Raleway', sans-serif; }
body {
font-family: var(--font-sans);
h1, h2, h3,
h4, h5, h6 {
font-family: var(--font-headings);
font-weight: 700;
margin: 0 0 1rem;
}
}
.wp-block-buttons .block-editor-block-list__layout {
display: flex;
gap: 1rem;
display: flex;
gap: 1rem;
}

View File

@@ -19,6 +19,24 @@
* text-60px: 30px-80px, default: 60px
* text-70px: 30px-76px, default: 70px
* text-75px: 32px-80px, default: 75px
*
* Font sizes at standard viewport widths:
* | 360px | 640px | 768px | 1024px | 1280px | 1440px | 1920px
* |-------|-------|-------|--------|--------|--------|-------
* text-14px | 12.00 | 12.36 | 12.52 | 12.85 | 13.18 | 13.38 | 14.00
* text-16px | 14.00 | 14.36 | 14.52 | 14.85 | 15.18 | 15.38 | 16.00
* text-18px | 14.00 | 14.72 | 15.05 | 15.70 | 16.36 | 16.77 | 18.00
* text-20px | 16.00 | 16.72 | 17.05 | 17.70 | 18.36 | 18.77 | 20.00
* text-22px | 17.60 | 18.36 | 18.75 | 19.47 | 20.19 | 20.65 | 22.00
* text-25px | 18.00 | 19.26 | 19.83 | 20.98 | 22.13 | 22.85 | 25.00
* text-30px | 18.96 | 20.89 | 21.85 | 23.66 | 25.47 | 26.60 | 30.00
* text-35px | 20.00 | 22.69 | 23.92 | 26.38 | 28.85 | 30.38 | 35.00
* text-38px | 22.40 | 24.85 | 26.48 | 29.04 | 31.60 | 33.20 | 38.00
* text-40px | 24.00 | 26.87 | 28.18 | 30.81 | 33.44 | 35.08 | 40.00
* text-45px | 25.60 | 29.22 | 30.67 | 33.86 | 37.04 | 39.03 | 45.00
* text-50px | 27.20 | 31.58 | 33.16 | 36.90 | 40.65 | 42.98 | 50.00
* text-70px | 30.40 | 37.01 | 40.76 | 47.26 | 53.75 | 57.82 | 70.00
* text-75px | 32.00 | 39.46 | 43.25 | 50.30 | 57.36 | 61.77 | 75.00
*/
@theme {
@@ -26,20 +44,20 @@
--line-height: 1.6;
--text-base: 1rem;
--text-14px: clamp(0.75rem, 0.7292vw, 1.7rem);
--text-16px: clamp(0.875rem, 0.8333vw, 1.8rem);
--text-18px: clamp(0.875rem, 0.9375vw, 1.9rem);
--text-20px: clamp(1rem, 1.0417vw, 2rem);
--text-22px: clamp(1.1rem, 1.15vw, 2.1rem);
--text-25px: clamp(1.125rem, 1.3021vw, 2.2rem);
--text-30px: clamp(1.185rem, 1.5625vw, 2.35rem);
--text-35px: clamp(1.25rem, 1.8229vw, 2.5rem);
--text-38px: clamp(1.4rem, 1.9791vw, 3rem);
--text-40px: clamp(1.5rem, 2.0834vw, 3.5rem);
--text-45px: clamp(1.6rem, 2.3438vw, 4rem);
--text-50px: clamp(1.7rem, 2.6042vw, 4.5rem);
--text-70px: clamp(1.9rem, 3.6458vw, 4.8rem);
--text-75px: clamp(2rem, 3.9063vw, 5rem);
--text-14px: clamp(0.75rem, calc(0.7212rem + 0.1282vw), 0.875rem);
--text-16px: clamp(0.875rem, calc(0.8462rem + 0.1282vw), 1rem);
--text-18px: clamp(0.875rem, calc(0.8173rem + 0.2564vw), 1.125rem);
--text-20px: clamp(1rem, calc(0.9423rem + 0.2564vw), 1.25rem);
--text-22px: clamp(1.1rem, calc(1.0365rem + 0.2821vw), 1.375rem);
--text-25px: clamp(1.125rem, calc(1.024rem + 0.4487vw), 1.5625rem);
--text-30px: clamp(1.185rem, calc(1.0258rem + 0.7077vw), 1.875rem);
--text-35px: clamp(1.25rem, calc(1.0337rem + 0.9615vw), 2.1875rem);
--text-38px: clamp(1.4rem, calc(1.175rem + 1vw), 2.375rem);
--text-40px: clamp(1.5rem, calc(1.2692rem + 1.0256vw), 2.5rem);
--text-45px: clamp(1.6rem, calc(1.3202rem + 1.2436vw), 2.8125rem);
--text-50px: clamp(1.7rem, calc(1.3712rem + 1.4615vw), 3.125rem);
--text-70px: clamp(1.9rem, calc(1.3288rem + 2.5385vw), 4.375rem);
--text-75px: clamp(2rem, calc(1.3798rem + 2.7564vw), 4.6875rem);
--h1: calc(var(--text-base) * 2.25);
--h2: calc(var(--text-base) * 1.75);
@@ -50,74 +68,76 @@
}
body {
background-color: white;
color: black;
font-family: var(--font-sans);
font-size: var(--text-base);
line-height: var(--line-height);
background-color: white;
color: black;
font-family: var(--font-sans);
font-size: var(--text-base);
line-height: var(--line-height);
}
::selection { background: var(--color-warning); }
@layer components {
h1, h2, h3,
h4, h5, h6 {
font-weight: 700;
margin: 0 0 1rem;
}
h1, h2, h3,
h4, h5, h6 {
font-family: var(--font-headings);
font-weight: 700;
margin: 0 0 1rem;
}
h1, .h1 {
font-size: var(--h1);
line-height: 1.2;
}
h1, .h1 {
font-size: var(--h1);
line-height: 1.2;
}
h2, .h2 {
font-size: var(--h2);
line-height: 1.3;
}
h2, .h2 {
font-size: var(--h2);
line-height: 1.3;
}
h3, .h3 {
font-size: var(--h3);
line-height: 1.4;
}
h3, .h3 {
font-size: var(--h3);
line-height: 1.4;
}
h4, .h4 {
font-size: var(--h4);
line-height: 1.5;
}
h4, .h4 {
font-size: var(--h4);
line-height: 1.5;
}
h5, .h5 { font-size: var(--h5); }
h5, .h5 { font-size: var(--h5); }
h6, .h6 { font-size: var(--h6); }
h6, .h6 { font-size: var(--h6); }
}
a, .link {
color: var(--color-bodylinks);
text-decoration: none;
transition: color 200ms;
cursor: pointer;
color: var(--color-bodylinks);
text-decoration: none;
transition: color 200ms;
cursor: pointer;
&:hover { color: var(--color-primary); }
&:hover { color: var(--color-primary); }
}
h1 a, .h1 a,
h2 a, .h2 a,
h3 a, .h3 a {
color: inherit;
text-decoration: underline;
color: inherit;
text-decoration: underline;
}
p {
margin-top: 0;
margin-bottom: 1rem;
margin-top: 0;
margin-bottom: 1rem;
}
li ul, li ol { margin: 0 1rem; }
ul { list-style-type: disc; }
ol { list-style-type: decimal; }
li ul, li ol { margin: 0 1rem; }
ol ol { list-style: lower-alpha; }
ol ol ol { list-style: lower-roman; }
@@ -128,27 +148,27 @@ pre, code,
samp, style { font-family: monospace; }
pre {
font-size: 0.875rem;
overflow: auto;
padding: 1.5rem;
font-size: 0.875rem;
overflow: auto;
padding: 1.5rem;
}
pre code {
background-color: inherit;
border-radius: 0;
color: inherit;
padding: 0;
background-color: inherit;
border-radius: 0;
color: inherit;
padding: 0;
}
code {
@apply bg-black/30 px-[3px] py-[2px] font-mono text-black text-xs rounded-sm;
@apply bg-black/30 px-[3px] py-0.5 font-mono text-black text-xs rounded-sm;
}
hr {
background-color: black;
border: none;
display: block;
height: 1px;
margin: 1rem 0;
width: 100%;
background-color: black;
border: none;
display: block;
height: 1px;
margin: 1rem 0;
width: 100%;
}