diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 0669470..cb05c78 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -1,23 +1,5 @@ { - "permissions": { - "allow": [ - "Bash(mkdir -p \"C:/Users/ksolo/Projects/Work Projects/VDI-Starter-v5/.understand-anything/intermediate\")", - "Bash(mkdir -p \"C:/Users/ksolo/Projects/Work Projects/VDI-Starter-v5/.understand-anything/tmp\")", - "Bash(grep -v \"knowledge-graph.json$\")", - "Bash(npm --version)", - "Bash(npm install *)", - "Bash(pnpm --version)", - "Read(//c/Users/ksolo/.claude/plugins/cache/understand-anything/understand-anything/2.5.0/**)", - "Bash(pnpm install *)", - "Bash(pnpm --filter @understand-anything/core build)", - "Bash(node -e ' *)", - "Bash(node *)", - "Bash(python \"C:/Users/ksolo/.claude/plugins/cache/understand-anything/understand-anything/2.5.0/skills/understand/merge-batch-graphs.py\" \"C:/Users/ksolo/Projects/Work Projects/VDI-Starter-v5\")", - "Bash([ -d \"$PLUGIN_ROOT/packages/dashboard\" ])", - "Bash(GRAPH_DIR=\"C:/Users/ksolo/Projects/Work Projects/VDI-Starter-v5\" npx vite --host 127.0.0.1)", - "Bash(git add *)", - "Bash(git commit -m ' *)", - "Bash(git checkout *)" - ] - } + "env": { + "OTEL_RESOURCE_ATTRIBUTES": "project.name=SoloFrame-Evo,project_name=SoloFrame-Evo,env=WordPress,service.namespace=development,tool=claude-code" + } } diff --git a/.github/workflows/wpengine.yml b/.github/workflows/wpengine.yml index 2608f59..6963ed7 100644 --- a/.github/workflows/wpengine.yml +++ b/.github/workflows/wpengine.yml @@ -59,6 +59,6 @@ jobs: uses: wpengine/github-action-wpe-site-deploy@v3 with: WPE_SSHG_KEY_PRIVATE: ${{ secrets.WPE_SSHG_KEY_PRIVATE }} - WPE_ENV: vdiv5 + WPE_ENV: FLAGS: '-azvr --inplace --delete --exclude=".*"' - REMOTE_PATH: "wp-content/themes/vdi-v5" + REMOTE_PATH: "wp-content/themes/" diff --git a/.understand-anything/.understandignore b/.understand-anything/.understandignore deleted file mode 100644 index 53030a9..0000000 --- a/.understand-anything/.understandignore +++ /dev/null @@ -1,32 +0,0 @@ -# .understandignore — patterns for files/dirs to exclude from analysis -# Syntax: same as .gitignore (globs, # comments, ! negation, trailing / for dirs) -# Lines below are suggestions — uncomment to activate. -# Use ! prefix to force-include something excluded by defaults. -# -# Built-in defaults (always excluded unless negated): -# node_modules/, .git/, dist/, build/, obj/, *.lock, *.min.js, etc. -# -# --- From .gitignore (uncomment to exclude) --- - -# *~ -# .DS_Store -# static/dist/ -# .env -# bak/ -# testimonials.class.php -# resource-filter/ -# phpcs-results.txt -# /test-results/ -# /playwright-report/ -# /blob-report/ -# /playwright/.cache/ - -# --- Detected directories (uncomment to exclude) --- - -# tests/ - -# --- Test file patterns (uncomment to exclude) --- - -# *.test.* -# *.spec.* -# *.snap diff --git a/.understand-anything/fingerprints.json b/.understand-anything/fingerprints.json deleted file mode 100644 index 6e3c2f5..0000000 --- a/.understand-anything/fingerprints.json +++ /dev/null @@ -1,712 +0,0 @@ -{ - ".env.example": { - "size": 58, - "mtime": 1777825781884.629, - "hash": "9c87082bd45460db86334fd3acea3b44" - }, - ".github/workflows/phpcs.yml": { - "size": 1020, - "mtime": 1777825781886.1328, - "hash": "955988d8d00a489b15aa88a88aae21a4" - }, - ".github/workflows/todos.yml": { - "size": 527, - "mtime": 1777825781886.1328, - "hash": "6fda48c7bbdadcf8e1acccd906f229ee" - }, - ".github/workflows/wpengine.yml": { - "size": 1931, - "mtime": 1777825781886.1328, - "hash": "87dfd255f35b4b499aa94d9e42bc7091" - }, - ".phpcs.xml": { - "size": 2478, - "mtime": 1777825781887.1445, - "hash": "04d7057ecdc57cca79bef5866b5189d2" - }, - "404.php": { - "size": 1507, - "mtime": 1777825781888.1372, - "hash": "8ab93a649e112fe2768b988cd655d0ae" - }, - "README.md": { - "size": 18416, - "mtime": 1777825781888.1372, - "hash": "4f6f07adeb2af3edf17d013eb304f481" - }, - "acf/group_5f7f85a2a3e13.json": { - "size": 6396, - "mtime": 1777825781889.1365, - "hash": "2a88ba2db688528090946d956e2b56ef" - }, - "acf/group_5fd3e006e5da5.json": { - "size": 15908, - "mtime": 1777825781889.1365, - "hash": "a1fc1fb34007909b16644e81cba4ef81" - }, - "acf/group_600f5a9e242c3.json": { - "size": 10147, - "mtime": 1777825781889.1365, - "hash": "5008ba179d87feeb1248e18d6e6ba260" - }, - "acf/group_60106ed700da3.json": { - "size": 7160, - "mtime": 1777825781890.65, - "hash": "9e3e91ae651bed941daf8707ec7a9fa7" - }, - "acf/group_60bfb84ae973c.json": { - "size": 5506, - "mtime": 1777825781890.65, - "hash": "0053d6b09c043521cc434eb2a3473011" - }, - "acf/group_60bfdb328901d.json": { - "size": 3036, - "mtime": 1777825781890.65, - "hash": "6a8f66b681bcd266d8c1ab54ef98e2ab" - }, - "acf/group_6261bc658dd80.json": { - "size": 12859, - "mtime": 1777825781891.6606, - "hash": "5d28ff3cf8dfc2e277147d6d8438aa00" - }, - "acf/group_645e51f721207.json": { - "size": 4156, - "mtime": 1777825781891.6606, - "hash": "f7b6adbd69a0f366caa44332434b6dd9" - }, - "acf/group_645e7cf448e66.json": { - "size": 12304, - "mtime": 1777825781891.6606, - "hash": "08d883e93358825224d87c531f364244" - }, - "bin/.build.js": { - "size": 648, - "mtime": 1777825781892.6602, - "hash": "ff47325f676fff321b2d745eb0ce607b" - }, - "bin/.utils.js": { - "size": 637, - "mtime": 1777825781892.6602, - "hash": "fbf52725e6516a6177d366d227bd72f4" - }, - "bin/.watch.js": { - "size": 1202, - "mtime": 1777825781893.6606, - "hash": "5167fae70eb7e1ed06210194f4769f1a" - }, - "composer.json": { - "size": 873, - "mtime": 1777825781893.6606, - "hash": "231db8fffc6fcb14cb591ec8c12c9c02" - }, - "content/basic-wp-test-content.xml": { - "size": 791437, - "mtime": 1777825781897.214, - "hash": "39f05bef4706c4ab5dbeb8ea3145654c" - }, - "footer.php": { - "size": 4240, - "mtime": 1777825781897.214, - "hash": "50fc9d771ef337378105785b21dc6fe3" - }, - "front-page.php": { - "size": 351, - "mtime": 1777825781897.214, - "hash": "85b76eebf72977bdd039ed3f15bc2593" - }, - "functions.php": { - "size": 1074, - "mtime": 1777825781898.2146, - "hash": "3c137712c6f7498749c913ea81c46b79" - }, - "header.php": { - "size": 1695, - "mtime": 1777825781898.2146, - "hash": "2e3526258a06b3d1d4f4c6432bcb13c2" - }, - "index.php": { - "size": 3695, - "mtime": 1777825781898.2146, - "hash": "433ba96ca2ecb0e280915a01d27ac190" - }, - "lib/activation.php": { - "size": 7278, - "mtime": 1777825781899.7202, - "hash": "a57c588d45ad1b89e29b8bb489db43eb" - }, - "lib/class-acf.php": { - "size": 1361, - "mtime": 1777825781900.2366, - "hash": "449906c43d7b6c3c3b3a09475e7d725e" - }, - "lib/class-breadcrumbs.php": { - "size": 14272, - "mtime": 1777825781900.2366, - "hash": "4de39580babb14c094ca4c56768e7bab" - }, - "lib/class-enqueue.php": { - "size": 4076, - "mtime": 1777825781901.2432, - "hash": "45fac2122b6afa64b814b170dcb2b30d" - }, - "lib/class-menuitems.php": { - "size": 4658, - "mtime": 1777825781901.2432, - "hash": "fd0c0e87ddfcfa68ec59e0f15b50a69a" - }, - "lib/class-resources.php": { - "size": 3910, - "mtime": 1777825781902.1833, - "hash": "32a8fe6eec6dd9eb29af7e367893b0de" - }, - "lib/extras.php": { - "size": 6860, - "mtime": 1777825781902.1833, - "hash": "7adc58c4c81579ac00ca69c5d04e7fac" - }, - "lib/helpers.php": { - "size": 6680, - "mtime": 1777825781903.1887, - "hash": "60d1207517fb0da64403cf1b7dbb6539" - }, - "lib/hooks.php": { - "size": 7439, - "mtime": 1777825781903.1887, - "hash": "0f3de261772dc2bf2b5953b2c28b4005" - }, - "lib/search-features.php": { - "size": 3183, - "mtime": 1777825781903.7036, - "hash": "6440cdd4de9075dc69324f9cf7930b6f" - }, - "lib/show-template.php": { - "size": 4595, - "mtime": 1777825781904.219, - "hash": "ecb952d6c204358a73936af2c033d83a" - }, - "package.json": { - "size": 1362, - "mtime": 1777825781905.6797, - "hash": "a4e1eac2cfb9895612d80bc21e1939e6" - }, - "page.php": { - "size": 778, - "mtime": 1777825781905.6797, - "hash": "6a3fc28312789659b55abc7a32ded8c0" - }, - "playwright.config.js": { - "size": 2327, - "mtime": 1777825781905.6797, - "hash": "7bf73735c56c1d2927d6a160f7aaf7fb" - }, - "search.php": { - "size": 3850, - "mtime": 1777825781907.687, - "hash": "9e4ae80991d630321ac71ef0cb1d6694" - }, - "sidebar-page.php": { - "size": 244, - "mtime": 1777825781907.687, - "hash": "b0373affab0db0d85986f96517639c25" - }, - "sidebar.php": { - "size": 168, - "mtime": 1777825781907.687, - "hash": "360467fe7477f49e98e472f3dc4f6955" - }, - "single.php": { - "size": 2146, - "mtime": 1777825781908.6858, - "hash": "965c3dee07716fafd73989c903238578" - }, - "static/js/admin.js": { - "size": 237, - "mtime": 1777825781910.7087, - "hash": "13ca21b03b0f87a97b393c976fd7e1d4" - }, - "static/js/components/backToTop.js": { - "size": 1081, - "mtime": 1777825781910.7087, - "hash": "f158c4c1059fef386165dae93ce3f7b0" - }, - "static/js/components/button.js": { - "size": 2888, - "mtime": 1777825781911.7075, - "hash": "34c562742779794ffd99385654924054" - }, - "static/js/modules/GetHeaderHeight.js": { - "size": 370, - "mtime": 1777825781911.7075, - "hash": "04e6ab8db754c70f77dfd3c6a9c55946" - }, - "static/js/modules/Navigation.js": { - "size": 18649, - "mtime": 1777825781911.7075, - "hash": "1347fd5408738f67d5599c86b17c7d01" - }, - "static/js/modules/TagExternalLinks.js": { - "size": 1459, - "mtime": 1777825781911.7075, - "hash": "8f87f5354de0f983a912fda1ecf690dd" - }, - "static/js/theme.js": { - "size": 2365, - "mtime": 1777825781913.213, - "hash": "2e6a048774813e1bb6b203e1b3d2e4ca" - }, - "style.css": { - "size": 178, - "mtime": 1777825781913.213, - "hash": "2e92dcc1e52546309822b60a46423698" - }, - "styles/backend/admin.css": { - "size": 63, - "mtime": 1777825781914.2341, - "hash": "01d28aa008b74cf5218535f7c12c46ee" - }, - "styles/backend/editor.css": { - "size": 1467, - "mtime": 1777825781914.2341, - "hash": "5299a07817c81cb4bad10bd194d4415c" - }, - "styles/base/break-out.css": { - "size": 621, - "mtime": 1777825781915.3032, - "hash": "a37de9ae25ff01581f1480117ec09556" - }, - "styles/base/colors.css": { - "size": 2163, - "mtime": 1777825781915.3032, - "hash": "95de198691c4f6cb41b0873917229493" - }, - "styles/base/forms.css": { - "size": 2008, - "mtime": 1777825781915.3032, - "hash": "107aab79fea61c090f8cd48e4f00448d" - }, - "styles/base/global.css": { - "size": 1918, - "mtime": 1777825781916.2947, - "hash": "ae8df6bfce807baa3475f3956cb028fc" - }, - "styles/base/index.css": { - "size": 205, - "mtime": 1777825781916.2947, - "hash": "ac5dde7d13978b751ff8f42bfb3773f6" - }, - "styles/base/misc.css": { - "size": 34, - "mtime": 1777825781916.2947, - "hash": "47e77d13ea40808d5dbe4c6ef32d126b" - }, - "styles/base/prose.css": { - "size": 1911, - "mtime": 1777825781916.2947, - "hash": "3efddc6366c6c4fbcd6144875fb6117f" - }, - "styles/base/skip-link.css": { - "size": 528, - "mtime": 1777825781917.295, - "hash": "809617c7a5f61b31e6d9e0eae13b4179" - }, - "styles/base/typography.css": { - "size": 5219, - "mtime": 1777825781917.295, - "hash": "4fe5505c437c471f557ad5be946dad3c" - }, - "styles/blocks/buttons.css": { - "size": 6260, - "mtime": 1777825781918.432, - "hash": "f4cba12a016e9e30fa7a24a5b7715c56" - }, - "styles/blocks/core.css": { - "size": 103, - "mtime": 1777825781918.432, - "hash": "6bcbd78bf19a67b54627546b33c5d5cd" - }, - "styles/blocks/index.css": { - "size": 77, - "mtime": 1777825781918.432, - "hash": "56028790f82e8ccc98c912536aa774f2" - }, - "styles/components/breadcrumbs.css": { - "size": 215, - "mtime": 1777825781919.433, - "hash": "5fabf70478264c3865676e9f67cbb9fc" - }, - "styles/components/index.css": { - "size": 205, - "mtime": 1777825781919.433, - "hash": "a1261bd940ead1cbcdde91c4170dc2c6" - }, - "styles/components/pagination.css": { - "size": 1039, - "mtime": 1777825781920.4336, - "hash": "2ae9c16d59f4cab33a99df3065d61670" - }, - "styles/components/post-list.css": { - "size": 598, - "mtime": 1777825781920.4336, - "hash": "f7f37b20749734761de3be0d6be2e282" - }, - "styles/components/sidebar.css": { - "size": 505, - "mtime": 1777825781920.4336, - "hash": "b12c0335ba1e3fac4b3787675d8a6212" - }, - "styles/components/site-footer.css": { - "size": 825, - "mtime": 1777825781921.4446, - "hash": "9c1d4b76f87f60cff9efa3f4b3735836" - }, - "styles/components/site-header.css": { - "size": 369, - "mtime": 1777825781921.4446, - "hash": "9133b9bf75dab0c1cfc3c7cb367f867a" - }, - "styles/fonts/lineicons.css": { - "size": 45564, - "mtime": 1777825781930.8862, - "hash": "e452d71b3ef8171cf944cd98e08fdc34" - }, - "styles/navigation/index.css": { - "size": 1109, - "mtime": 1777825781931.898, - "hash": "28ddb2adae05fc7e68a3e60b2b1665e5" - }, - "styles/navigation/nav-aux.css": { - "size": 893, - "mtime": 1777825781932.8987, - "hash": "ea8dcd8a588e5df2b1a45158ad661a47" - }, - "styles/navigation/nav-footer.css": { - "size": 2117, - "mtime": 1777825781933.9001, - "hash": "8c7b0110320476f715805d325f08840a" - }, - "styles/navigation/nav-functional.css": { - "size": 2272, - "mtime": 1777825781933.9001, - "hash": "afe257894f4d65a67e39ce2973cd2706" - }, - "styles/navigation/nav-main-default.css": { - "size": 1638, - "mtime": 1777825781933.9001, - "hash": "96cf7a64c5f0e9bfe812f17a68f9b805" - }, - "styles/navigation/nav-main-mega.css": { - "size": 2880, - "mtime": 1777825781935.4058, - "hash": "aa1d27e4635d8376be5c3a18d832df73" - }, - "styles/navigation/nav-mobile-accordion.css": { - "size": 1368, - "mtime": 1777825781935.4058, - "hash": "761cfa36b712e142edac8b8fc877fd8d" - }, - "styles/navigation/nav-mobile-sliding.css": { - "size": 3700, - "mtime": 1777825781936.4126, - "hash": "82fac7165c53b9cf670b96f29de109ac" - }, - "styles/theme.css": { - "size": 519, - "mtime": 1777825781936.4126, - "hash": "95ea2ebd0ca96908f9091594935e0344" - }, - "tests/site-a11y.spec.js": { - "size": 2066, - "mtime": 1777825781937.4146, - "hash": "4f080be14808e2da3d5b0cb220dba1f2" - }, - "theme.json": { - "size": 6054, - "mtime": 1777825781937.4146, - "hash": "2a0fbef9becf6301f529a6153b688f6f" - }, - "views/blocks/accordion/accordion.css": { - "size": 1528, - "mtime": 1777825781938.4128, - "hash": "56f033d708d93ad79c41c2c74c4132d2" - }, - "views/blocks/accordion/accordion.php": { - "size": 1585, - "mtime": 1777825781938.4128, - "hash": "71463047c491068471355e5cb638ba6c" - }, - "views/blocks/accordion/block.json": { - "size": 536, - "mtime": 1777825781939.9185, - "hash": "7a1add0f62b40208b5c4b80bcfabe92d" - }, - "views/blocks/boilerplate/block.json": { - "size": 595, - "mtime": 1777825781940.9243, - "hash": "6b87816fdbd0bdfd69c9fcbbd69247d8" - }, - "views/blocks/boilerplate/boilerplate.css": { - "size": 0, - "mtime": 1777825781940.9243, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/boilerplate/boilerplate.php": { - "size": 511, - "mtime": 1777825781941.8308, - "hash": "1a95084b5da0e23e9be4245c510e52e2" - }, - "views/blocks/button/block.json": { - "size": 453, - "mtime": 1777825781941.8308, - "hash": "cd5d1611c7cc5de7d6e295693f3fa372" - }, - "views/blocks/button/button.php": { - "size": 1492, - "mtime": 1777825781942.8354, - "hash": "84e2ddbc1ff1d2ddbcc38984adfa6df1" - }, - "views/blocks/buttons/block.json": { - "size": 481, - "mtime": 1777825781942.8354, - "hash": "94cf5b9d7bf6a47efa9da9a29041dadd" - }, - "views/blocks/buttons/buttons.php": { - "size": 506, - "mtime": 1777825781942.8354, - "hash": "de91ee9a77d5a81f8db4b919b43b5f0d" - }, - "views/blocks/contact-info/block.json": { - "size": 636, - "mtime": 1777825781944.3481, - "hash": "2229315da64e61c2b793eae04e74710d" - }, - "views/blocks/contact-info/contact-info.css": { - "size": 0, - "mtime": 1777825781944.3481, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/contact-info/contact-info.php": { - "size": 1605, - "mtime": 1777825781945.8645, - "hash": "0356348ae30b343a109fae42e2c0b533" - }, - "views/blocks/grid-cell/block.json": { - "size": 520, - "mtime": 1777825781946.87, - "hash": "125ff116a0ea042fbfb5639104f42df4" - }, - "views/blocks/grid-cell/grid-cell.css": { - "size": 0, - "mtime": 1777825781946.87, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/grid-cell/grid-cell.php": { - "size": 1020, - "mtime": 1777825781946.87, - "hash": "dcc8c272645da336a4090034e6963794" - }, - "views/blocks/grid/block.json": { - "size": 513, - "mtime": 1777825781946.87, - "hash": "754d826d448aace6e2a5ff83a9bc4e8e" - }, - "views/blocks/grid/grid.css": { - "size": 0, - "mtime": 1777825781948.7903, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/grid/grid.php": { - "size": 1139, - "mtime": 1777825781948.7903, - "hash": "c6d1d48d35dd122b21eff6fb1c64d06e" - }, - "views/blocks/homepage-hero/block.json": { - "size": 541, - "mtime": 1777825781949.7954, - "hash": "6129c6269cc9d03d0bbbfbc89a508712" - }, - "views/blocks/homepage-hero/homepage-hero.css": { - "size": 0, - "mtime": 1777825781949.7954, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/homepage-hero/homepage-hero.php": { - "size": 1926, - "mtime": 1777825781950.797, - "hash": "ab4084346343efab9c7ea8b039543194" - }, - "views/blocks/media-text-innerblocks/block.json": { - "size": 669, - "mtime": 1777825781950.797, - "hash": "9bd57859917b5ecabf25dca938de0468" - }, - "views/blocks/media-text-innerblocks/media-text-innerblocks.css": { - "size": 0, - "mtime": 1777825781951.796, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/media-text-innerblocks/media-text-innerblocks.php": { - "size": 1848, - "mtime": 1777825781951.796, - "hash": "657cfdbb55232c469a910021fe09892b" - }, - "views/blocks/media-text/block.json": { - "size": 611, - "mtime": 1777825781951.796, - "hash": "3393eda2493e5f58ee720a0582c99f5c" - }, - "views/blocks/media-text/media-text.css": { - "size": 0, - "mtime": 1777825781951.796, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/media-text/media-text.php": { - "size": 3574, - "mtime": 1777825781953.3013, - "hash": "f90e05790f9213186f4bdd1bdfe0b96f" - }, - "views/blocks/page-children/block.json": { - "size": 606, - "mtime": 1777825781953.3013, - "hash": "188a5891ee40fd21ad29718370aedabf" - }, - "views/blocks/page-children/page-children.css": { - "size": 0, - "mtime": 1777825781954.3088, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/page-children/page-children.php": { - "size": 5987, - "mtime": 1777825781954.3088, - "hash": "fe92977dce68904fb4bc06c54ff3e446" - }, - "views/blocks/section/block.json": { - "size": 485, - "mtime": 1777825781954.3088, - "hash": "73a372aac3416824d5ef23db34d091bf" - }, - "views/blocks/section/section.css": { - "size": 0, - "mtime": 1777825781954.3088, - "hash": "d41d8cd98f00b204e9800998ecf8427e" - }, - "views/blocks/section/section.php": { - "size": 2095, - "mtime": 1777825781955.8137, - "hash": "6e4504fd83601eb01a1f3eb873156d2f" - }, - "views/components/menu-items/has-children.php": { - "size": 2813, - "mtime": 1777825781955.8137, - "hash": "1a8aa09cd21c8db30d1463a6250dc3b6" - }, - "views/components/menu-items/index.php": { - "size": 935, - "mtime": 1777825781956.8318, - "hash": "526811dd0098d380edcebfcef1621e32" - }, - "views/components/menu-items/single.php": { - "size": 1021, - "mtime": 1777825781956.8318, - "hash": "64be46dbd08d637d19a322e860ed8ea1" - }, - "views/components/nav-aux.php": { - "size": 1043, - "mtime": 1777825781956.8318, - "hash": "0ed85cb990d7b3ae31c730723a4d6e74" - }, - "views/components/nav-main.php": { - "size": 548, - "mtime": 1777825781957.8252, - "hash": "7a9fe22a0083b29d18f2dbc32077e64e" - }, - "views/components/nav-main__toggle.php": { - "size": 1499, - "mtime": 1777825781958.3442, - "hash": "52bdc7efc28113c2352436618c2708f3" - }, - "views/forms/search.php": { - "size": 1561, - "mtime": 1777825781958.3442, - "hash": "556adef0c6550114a3ddd7d5c5cfc39a" - }, - "views/icons/facebook.php": { - "size": 31, - "mtime": 1777825781959.3416, - "hash": "aab70d132f1217d1518620198545fd51" - }, - "views/icons/heart.php": { - "size": 481, - "mtime": 1777825781959.3416, - "hash": "a072424d8c330d8b39966d1a53b23c69" - }, - "views/icons/instagram.php": { - "size": 32, - "mtime": 1777825781959.3416, - "hash": "419d4db42de56eb157b95c95e41b9652" - }, - "views/icons/linkedin.php": { - "size": 31, - "mtime": 1777825781960.341, - "hash": "331b0e87d54b8463cfa8f23552823b8f" - }, - "views/icons/menu.php": { - "size": 46, - "mtime": 1777825781960.341, - "hash": "ea55de11ec126433429a0c2ee4cfa165" - }, - "views/icons/pinterest.php": { - "size": 32, - "mtime": 1777825781960.341, - "hash": "c7e3c2d8d92d5c3874bbd759bfc1b650" - }, - "views/icons/search.php": { - "size": 592, - "mtime": 1777825781961.3496, - "hash": "e1dd2e58f826f18f93685d20f45fdcd9" - }, - "views/icons/shop.php": { - "size": 27, - "mtime": 1777825781961.3496, - "hash": "760cac61de143a536417225f2aefbf42" - }, - "views/icons/shopping-basket.php": { - "size": 803, - "mtime": 1777825781961.3496, - "hash": "5d65124138a3401017a894524361a06b" - }, - "views/icons/twitter-.php": { - "size": 30, - "mtime": 1777825781962.3413, - "hash": "6c7604c7c0a3f98479668136cf4c7c8a" - }, - "views/icons/twitter.php": { - "size": 24, - "mtime": 1777825781962.3413, - "hash": "c5aa48dfdbc559246297e2efc64659ca" - }, - "views/icons/user.php": { - "size": 580, - "mtime": 1777825781962.3413, - "hash": "e0d22c3cde5a1b62db6fbd390cca62d2" - }, - "views/icons/youtube.php": { - "size": 30, - "mtime": 1777825781962.3413, - "hash": "4b470494537d81f6b16874a639d957fd" - }, - "views/partials/page-hero.php": { - "size": 1582, - "mtime": 1777825781963.5125, - "hash": "e58b6957a66d7e8ff200390630110abb" - }, - "views/partials/social-media.php": { - "size": 1378, - "mtime": 1777825781963.5125, - "hash": "e9e66dfe0edd982394ca30bdcc5cc93e" - }, - "whitelist.php": { - "size": 4636, - "mtime": 1777825781964.5107, - "hash": "ffaf553fec77c8899fed05522dc2102c" - } -} \ No newline at end of file diff --git a/.understand-anything/knowledge-graph.json b/.understand-anything/knowledge-graph.json deleted file mode 100644 index dc70641..0000000 --- a/.understand-anything/knowledge-graph.json +++ /dev/null @@ -1,3955 +0,0 @@ -{ - "version": "1.0.0", - "project": { - "name": "vdi-starter-v5", - "languages": [ - "config", - "css", - "javascript", - "json", - "markdown", - "php", - "xml", - "yaml" - ], - "frameworks": [ - "WordPress", - "Tailwind CSS", - "GitHub Actions", - "Playwright" - ], - "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.", - "analyzedAt": "2026-05-03T17:54:59.903Z", - "gitCommitHash": "7a578c67c0c0eec7abbe4ad40a01db0e4c67aeb7" - }, - "nodes": [ - { - "id": "file:functions.php", - "type": "file", - "name": "functions.php", - "filePath": "functions.php", - "summary": "Theme bootstrap file that loads all lib/ modules via glob and registers ACF custom Gutenberg blocks on the init hook.", - "tags": [ - "entry-point", - "bootstrap", - "acf", - "block-registration" - ], - "complexity": "simple" - }, - { - "id": "file:header.php", - "type": "file", - "name": "header.php", - "filePath": "header.php", - "summary": "Theme header template rendering the HTML head, skip link, auxiliary and main navigation, and conditional page hero section.", - "tags": [ - "template", - "navigation", - "component", - "layout" - ], - "complexity": "moderate" - }, - { - "id": "file:footer.php", - "type": "file", - "name": "footer.php", - "filePath": "footer.php", - "summary": "Theme footer template with logo, description, social media links, three footer widget areas, footer navigation, and copyright bar.", - "tags": [ - "template", - "navigation", - "component", - "layout" - ], - "complexity": "moderate" - }, - { - "id": "file:front-page.php", - "type": "file", - "name": "front-page.php", - "filePath": "front-page.php", - "summary": "Static front page template that renders the WordPress loop content within a container, used when the homepage is set to a static page.", - "tags": [ - "template", - "page", - "entry-point" - ], - "complexity": "simple" - }, - { - "id": "file:index.php", - "type": "file", - "name": "index.php", - "filePath": "index.php", - "summary": "Blog posts listing template displaying a responsive grid of post cards with thumbnails, categories, excerpts, and pagination, with optional sidebar.", - "tags": [ - "template", - "blog", - "archive", - "loop" - ], - "complexity": "moderate" - }, - { - "id": "file:page.php", - "type": "file", - "name": "page.php", - "filePath": "page.php", - "summary": "Single page template rendering page content with the WordPress loop and an optional sidebar controlled by the hasSidebar filter.", - "tags": [ - "template", - "page", - "loop" - ], - "complexity": "simple" - }, - { - "id": "file:search.php", - "type": "file", - "name": "search.php", - "filePath": "search.php", - "summary": "Search results template displaying matching posts in a responsive card grid with categories, bylines, pagination, and optional sidebar.", - "tags": [ - "template", - "search", - "archive", - "loop" - ], - "complexity": "moderate" - }, - { - "id": "file:single.php", - "type": "file", - "name": "single.php", - "filePath": "single.php", - "summary": "Single post template rendering the post title, metadata (date, author, categories, tags), and content with an optional sidebar.", - "tags": [ - "template", - "single-post", - "loop" - ], - "complexity": "moderate" - }, - { - "id": "file:404.php", - "type": "file", - "name": "404.php", - "filePath": "404.php", - "summary": "Error 404 page template showing a not-found message with a search form and quick navigation links to home, posts, and contact.", - "tags": [ - "template", - "error-page", - "search" - ], - "complexity": "simple" - }, - { - "id": "file:sidebar.php", - "type": "file", - "name": "sidebar.php", - "filePath": "sidebar.php", - "summary": "Primary sidebar template rendering the sidebar-primary widget area within an aside element.", - "tags": [ - "template", - "sidebar", - "widget" - ], - "complexity": "simple" - }, - { - "id": "file:sidebar-page.php", - "type": "file", - "name": "sidebar-page.php", - "filePath": "sidebar-page.php", - "summary": "Page-specific sidebar template rendering the sidebar-page widget area with a heading.", - "tags": [ - "template", - "sidebar", - "widget" - ], - "complexity": "simple" - }, - { - "id": "file:whitelist.php", - "type": "file", - "name": "whitelist.php", - "filePath": "whitelist.php", - "summary": "Tailwind CSS class whitelist file listing utility classes (grids, buttons, gaps, col-spans) that must be included in the editor stylesheet because they do not appear in the theme source code.", - "tags": [ - "utility", - "configuration", - "tailwind", - "build-system" - ], - "complexity": "moderate", - "languageNotes": "Tailwind scans source files for class names to include in CSS output; this file ensures editor-only classes are not purged." - }, - { - "id": "file:lib/activation.php", - "type": "file", - "name": "activation.php", - "filePath": "lib/activation.php", - "summary": "Theme activation handler that creates default pages (Home, News, 404, Contact), configures reading settings, removes sample content, and installs/activates a predefined list of plugins including ACF Pro and Gravity Forms.", - "tags": [ - "entry-point", - "setup", - "plugin-management", - "configuration" - ], - "complexity": "complex", - "languageNotes": "Uses a custom Silent_Upgrader_Skin class to suppress WordPress upgrader UI output during automated plugin installation." - }, - { - "id": "file:lib/class-acf.php", - "type": "file", - "name": "class-acf.php", - "filePath": "lib/class-acf.php", - "summary": "ACF support class that configures JSON load and save paths for Advanced Custom Fields field groups, pointing them to the theme's /acf directory.", - "tags": [ - "service", - "acf", - "data-model" - ], - "complexity": "simple" - }, - { - "id": "file:lib/class-breadcrumbs.php", - "type": "file", - "name": "class-breadcrumbs.php", - "filePath": "lib/class-breadcrumbs.php", - "summary": "Breadcrumb navigation generator and renderer that builds context-aware breadcrumb trails for all WordPress page types (posts, pages, archives, taxonomies, search, 404) with Schema.org structured data markup.", - "tags": [ - "service", - "navigation", - "seo", - "component" - ], - "complexity": "complex", - "languageNotes": "All methods are static; the class is used as a namespace-like container. Schema.org BreadcrumbList JSON-LD is injected alongside the HTML nav." - }, - { - "id": "file:lib/class-enqueue.php", - "type": "file", - "name": "class-enqueue.php", - "filePath": "lib/class-enqueue.php", - "summary": "Script and style enqueueing class managing frontend (theme.css, theme.js, button.js), admin (admin.css, admin.js), and block editor (editor.css) assets with cache-busting via filemtime.", - "tags": [ - "service", - "asset-management", - "enqueue" - ], - "complexity": "moderate", - "languageNotes": "Uses wp_enqueue_script_module for JS modules with dependency declarations, and filemtime for automatic cache-busting on each asset." - }, - { - "id": "file:lib/class-menuitems.php", - "type": "file", - "name": "class-menuitems.php", - "filePath": "lib/class-menuitems.php", - "summary": "Navigation menu items management class that resolves WordPress nav menu locations into top-level and nested items, providing callable properties for template rendering.", - "tags": [ - "service", - "navigation", - "menu" - ], - "complexity": "moderate", - "languageNotes": "Uses PHP callable properties ($this->hasChildren, $this->nestedNavItems) assigned as closures in the constructor, enabling template-friendly invocation." - }, - { - "id": "file:lib/class-resources.php", - "type": "file", - "name": "class-resources.php", - "filePath": "lib/class-resources.php", - "summary": "Registers the Resources custom post type and resource_type hierarchical taxonomy, with custom permalink structure that includes the taxonomy term slug.", - "tags": [ - "service", - "data-model", - "custom-post-type" - ], - "complexity": "moderate", - "languageNotes": "The postTypeLink filter rewrites resource URLs to /resources/{term-slug}/{post-name} for SEO-friendly hierarchical URLs." - }, - { - "id": "file:lib/extras.php", - "type": "file", - "name": "extras.php", - "filePath": "lib/extras.php", - "summary": "Miscellaneous theme extras: sidebar visibility filter, child page retrieval, Owner role creation, contextual page titles, iframe/embed wrapping, and an ACF field group for the per-page sidebar toggle.", - "tags": [ - "utility", - "filter", - "roles", - "acf" - ], - "complexity": "complex" - }, - { - "id": "file:lib/helpers.php", - "type": "file", - "name": "helpers.php", - "filePath": "lib/helpers.php", - "summary": "Theme helper functions providing ACF dot-notation field access, block wrapper attributes, an ACF Global Fields options page, admin menu reordering, custom block categories, embed HTML escaping, multi-needle string search, custom excerpts, and a console.log bridge.", - "tags": [ - "utility", - "helper", - "acf", - "admin" - ], - "complexity": "complex" - }, - { - "id": "file:lib/hooks.php", - "type": "file", - "name": "hooks.php", - "filePath": "lib/hooks.php", - "summary": "WordPress hooks configuration: Google Fonts preconnect, nav menu registration, five widget areas, basic SEO title filter, excerpt customization, comprehensive WP head cleanup, theme support declarations, SVG upload support, and outgoing email sender override.", - "tags": [ - "hook", - "configuration", - "cleanup", - "setup" - ], - "complexity": "complex", - "languageNotes": "The init() function performs aggressive WordPress cleanup by removing emoji scripts, block library styles, generator tags, and REST API discovery links." - }, - { - "id": "file:lib/search-features.php", - "type": "file", - "name": "search-features.php", - "filePath": "lib/search-features.php", - "summary": "Enhanced search functionality that extends WordPress default search to also match posts by tag and category names, deduplicates combined results, and sorts by recency.", - "tags": [ - "service", - "search", - "query" - ], - "complexity": "moderate", - "languageNotes": "Temporarily removes its own posts_results filter during the secondary WP_Query to avoid infinite recursion, then restores it." - }, - { - "id": "file:lib/show-template.php", - "type": "file", - "name": "show-template.php", - "filePath": "lib/show-template.php", - "summary": "Debug utility class that detects the active WordPress template via template_redirect and outputs it as an HTML comment in the footer, with logic to detect template overrides.", - "tags": [ - "utility", - "debugging", - "template" - ], - "complexity": "moderate", - "languageNotes": "Uses debug_backtrace() to compare the chosen template against the actually rendered template, detecting plugin template overrides." - }, - { - "id": "file:style.css", - "type": "file", - "name": "style.css", - "filePath": "style.css", - "summary": "WordPress theme stylesheet header declaring the VDI Starter v5 theme identity, version 5.0, author, and text domain.", - "tags": [ - "configuration", - "theme-metadata", - "entry-point" - ], - "complexity": "simple" - }, - { - "id": "config:theme.json", - "type": "config", - "name": "theme.json", - "filePath": "theme.json", - "summary": "WordPress block editor theme configuration (v3 schema) defining layout sizes, a 12-color CSS variable palette, custom font family and 15 font size presets, spacing units, and global typography/link styles.", - "tags": [ - "configuration", - "theme-settings", - "block-editor", - "design-system" - ], - "complexity": "moderate", - "languageNotes": "Uses CSS custom properties (var(--color-primary), var(--text-base)) as palette values, bridging the Tailwind config and the block editor." - }, - { - "id": "function:functions.php:regACFBlocks", - "type": "function", - "name": "regACFBlocks", - "filePath": "functions.php", - "lineRange": [ - 26, - 36 - ], - "summary": "Registers ACF custom Gutenberg blocks by scanning the views/blocks directory and calling register_block_type for each block folder.", - "tags": [ - "block-registration", - "acf", - "utility" - ], - "complexity": "simple" - }, - { - "id": "class:lib/class-acf.php:ACF", - "type": "class", - "name": "ACF", - "filePath": "lib/class-acf.php", - "lineRange": [ - 19, - 55 - ], - "summary": "ACF JSON path handler that redirects ACF field group load and save operations to the theme's /acf directory for version-controlled field group storage.", - "tags": [ - "service", - "acf", - "data-persistence" - ], - "complexity": "simple" - }, - { - "id": "class:lib/class-breadcrumbs.php:Breadcrumbs", - "type": "class", - "name": "Breadcrumbs", - "filePath": "lib/class-breadcrumbs.php", - "lineRange": [ - 14, - 396 - ], - "summary": "Static breadcrumb generator that builds hierarchical navigation trails for all WordPress content types and renders them with Schema.org JSON-LD structured data.", - "tags": [ - "service", - "navigation", - "seo", - "component" - ], - "complexity": "complex" - }, - { - "id": "class:lib/class-enqueue.php:Enqueue", - "type": "class", - "name": "Enqueue", - "filePath": "lib/class-enqueue.php", - "lineRange": [ - 19, - 109 - ], - "summary": "Asset enqueueing class that registers and loads frontend, admin, and editor CSS/JS with versioned cache-busting and JS module dependencies.", - "tags": [ - "service", - "asset-management", - "enqueue" - ], - "complexity": "moderate" - }, - { - "id": "class:lib/class-menuitems.php:MenuItems", - "type": "class", - "name": "MenuItems", - "filePath": "lib/class-menuitems.php", - "lineRange": [ - 19, - 185 - ], - "summary": "Navigation menu resolver that loads WordPress nav menu items by location, separates top-level from nested items, and provides callable properties for use in templates.", - "tags": [ - "service", - "navigation", - "menu" - ], - "complexity": "moderate" - }, - { - "id": "class:lib/class-resources.php:Resources", - "type": "class", - "name": "Resources", - "filePath": "lib/class-resources.php", - "lineRange": [ - 18, - 127 - ], - "summary": "Registers the Resources custom post type and resource_type taxonomy with a custom permalink structure including the taxonomy term slug.", - "tags": [ - "service", - "data-model", - "custom-post-type" - ], - "complexity": "moderate" - }, - { - "id": "class:lib/show-template.php:ShowTemplate", - "type": "class", - "name": "ShowTemplate", - "filePath": "lib/show-template.php", - "lineRange": [ - 20, - 172 - ], - "summary": "Debug utility class that determines the active WordPress template and outputs it as an HTML comment in the footer, detecting plugin-based template overrides via backtrace analysis.", - "tags": [ - "utility", - "debugging", - "template" - ], - "complexity": "moderate" - }, - { - "id": "function:lib/extras.php:getChildrenPages", - "type": "function", - "name": "getChildrenPages", - "filePath": "lib/extras.php", - "lineRange": [ - 15, - 29 - ], - "summary": "Retrieves child pages of the current page sorted by menu order, with URLs appended to each page object.", - "tags": [ - "utility", - "page", - "navigation" - ], - "complexity": "simple" - }, - { - "id": "function:lib/extras.php:createOwnerRole", - "type": "function", - "name": "createOwnerRole", - "filePath": "lib/extras.php", - "lineRange": [ - 105, - 136 - ], - "summary": "Creates a custom Owner role with Administrator capabilities minus plugin/theme/core management permissions, registered on the init hook.", - "tags": [ - "utility", - "roles", - "security" - ], - "complexity": "moderate" - }, - { - "id": "function:lib/extras.php:getTheTitle", - "type": "function", - "name": "getTheTitle", - "filePath": "lib/extras.php", - "lineRange": [ - 147, - 167 - ], - "summary": "Returns a context-aware page title for blog index, archives, search results, 404, and singular pages.", - "tags": [ - "utility", - "title", - "template" - ], - "complexity": "simple" - }, - { - "id": "function:lib/extras.php:divWrapper", - "type": "function", - "name": "divWrapper", - "filePath": "lib/extras.php", - "lineRange": [ - 179, - 193 - ], - "summary": "Content filter that wraps iframe and embed elements in a div with class 'embed' for responsive styling, applied via the_content filter.", - "tags": [ - "utility", - "filter", - "content" - ], - "complexity": "simple" - }, - { - "id": "function:lib/helpers.php:getFieldValue", - "type": "function", - "name": "getFieldValue", - "filePath": "lib/helpers.php", - "lineRange": [ - 23, - 32 - ], - "summary": "Retrieves nested ACF option field values using dot-notation path syntax (e.g., 'header.header_logo.url'), used throughout templates for global field access.", - "tags": [ - "utility", - "acf", - "helper" - ], - "complexity": "simple" - }, - { - "id": "function:lib/helpers.php:blockWrapperAttributes", - "type": "function", - "name": "blockWrapperAttributes", - "filePath": "lib/helpers.php", - "lineRange": [ - 42, - 52 - ], - "summary": "Returns block wrapper attributes for both editor preview and frontend contexts, handling the difference in attribute generation.", - "tags": [ - "utility", - "block", - "acf" - ], - "complexity": "simple" - }, - { - "id": "function:lib/helpers.php:customMenuOrder", - "type": "function", - "name": "customMenuOrder", - "filePath": "lib/helpers.php", - "lineRange": [ - 83, - 113 - ], - "summary": "Reorders the WordPress admin menu to prioritize Global Fields, ACF, and content types above settings and appearance items.", - "tags": [ - "utility", - "admin", - "configuration" - ], - "complexity": "moderate" - }, - { - "id": "function:lib/helpers.php:blockCategories", - "type": "function", - "name": "blockCategories", - "filePath": "lib/helpers.php", - "lineRange": [ - 123, - 132 - ], - "summary": "Adds a custom VDI Blocks category to the top of the Gutenberg block inserter for organizing theme-specific blocks.", - "tags": [ - "utility", - "block", - "configuration" - ], - "complexity": "simple" - }, - { - "id": "function:lib/helpers.php:escEmbeds", - "type": "function", - "name": "escEmbeds", - "filePath": "lib/helpers.php", - "lineRange": [ - 142, - 165 - ], - "summary": "Returns an array of allowed HTML tags and attributes for safely escaping iframe, figure, and div embed content.", - "tags": [ - "utility", - "security", - "escaping" - ], - "complexity": "simple" - }, - { - "id": "function:lib/helpers.php:strposArray", - "type": "function", - "name": "strposArray", - "filePath": "lib/helpers.php", - "lineRange": [ - 175, - 189 - ], - "summary": "Finds the position of the first occurrence of any needle from an array within a haystack string, used by customExcerpt for sentence boundary detection.", - "tags": [ - "utility", - "string", - "search" - ], - "complexity": "simple" - }, - { - "id": "function:lib/helpers.php:customExcerpt", - "type": "function", - "name": "customExcerpt", - "filePath": "lib/helpers.php", - "lineRange": [ - 200, - 209 - ], - "summary": "Generates a custom excerpt that truncates at the nearest sentence boundary rather than mid-word, used in the blog post card listings.", - "tags": [ - "utility", - "content", - "excerpt" - ], - "complexity": "simple" - }, - { - "id": "function:lib/hooks.php:init", - "type": "function", - "name": "init", - "filePath": "lib/hooks.php", - "lineRange": [ - 143, - 190 - ], - "summary": "Aggressive WordPress cleanup function that removes emoji scripts, block library styles, generator tags, and REST API links while adding theme support for thumbnails, HTML5, wide alignment, and responsive embeds.", - "tags": [ - "hook", - "cleanup", - "theme-support" - ], - "complexity": "moderate" - }, - { - "id": "function:lib/search-features.php:searchResultFilter", - "type": "function", - "name": "searchResultFilter", - "filePath": "lib/search-features.php", - "lineRange": [ - 77, - 120 - ], - "summary": "Posts results filter that augments WordPress search by querying posts matching the search term in tags and categories, deduplicating and sorting the combined results.", - "tags": [ - "service", - "search", - "filter" - ], - "complexity": "moderate" - }, - { - "id": "function:lib/search-features.php:dedupe", - "type": "function", - "name": "dedupe", - "filePath": "lib/search-features.php", - "lineRange": [ - 55, - 67 - ], - "summary": "Removes duplicate WP_Post objects from a combined post array based on a specified object property key.", - "tags": [ - "utility", - "search", - "deduplication" - ], - "complexity": "simple" - }, - { - "id": "function:lib/search-features.php:postSort", - "type": "function", - "name": "postSort", - "filePath": "lib/search-features.php", - "lineRange": [ - 34, - 45 - ], - "summary": "Returns a comparison function for sorting WP_Post objects in reverse chronological order with title as a secondary sort key.", - "tags": [ - "utility", - "search", - "sorting" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/accordion/accordion.php", - "type": "file", - "name": "accordion.php", - "filePath": "views/blocks/accordion/accordion.php", - "summary": "PHP template for the Accordion ACF block that renders a collapsible details/summary list with ACF field data for open state, grouping, and item titles/content.", - "tags": [ - "component", - "api-handler", - "wordpress-block", - "acf" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/accordion/accordion.css", - "type": "file", - "name": "accordion.css", - "filePath": "views/blocks/accordion/accordion.css", - "summary": "CSS styles for the Accordion block using native details/summary elements with CSS custom properties, max-height transitions, and open-state styling for collapsible sections.", - "tags": [ - "component", - "styling", - "css-nesting" - ], - "complexity": "moderate" - }, - { - "id": "config:views/blocks/accordion/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/accordion/block.json", - "summary": "ACF block registration config for the Accordion block, declaring it as acf/accordion with preview mode, enqueueing accordion.css, and enabling alignment, color, and JSX support.", - "tags": [ - "configuration", - "wordpress-block", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/boilerplate/boilerplate.php", - "type": "file", - "name": "boilerplate.php", - "filePath": "views/blocks/boilerplate/boilerplate.php", - "summary": "Starter PHP template for creating new ACF blocks, providing the minimal required structure with blockWrapperAttributes and a section wrapper.", - "tags": [ - "utility", - "wordpress-block", - "template", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/boilerplate/boilerplate.css", - "type": "file", - "name": "boilerplate.css", - "filePath": "views/blocks/boilerplate/boilerplate.css", - "summary": "Empty placeholder CSS file for the Boilerplate block template, intended to be populated when creating new blocks.", - "tags": [ - "component", - "styling", - "placeholder" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/boilerplate/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/boilerplate/block.json", - "summary": "ACF block registration config for the Boilerplate starter block, declaring it as acf/boilerplate with preview mode and limited support (no HTML rendering, no JSX).", - "tags": [ - "configuration", - "wordpress-block", - "acf", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/button/button.php", - "type": "file", - "name": "button.php", - "filePath": "views/blocks/button/button.php", - "summary": "PHP template for the Button ACF block that retrieves ACF fields (element type, link, color, variant, size, width, aria label) and renders an x-button web component with all styling attributes.", - "tags": [ - "component", - "api-handler", - "wordpress-block", - "acf" - ], - "complexity": "moderate" - }, - { - "id": "config:views/blocks/button/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/button/block.json", - "summary": "ACF block registration config for the Button block, declaring it as acf/button with preview mode, restricted to be a child of acf/buttons only.", - "tags": [ - "configuration", - "wordpress-block", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/buttons/buttons.php", - "type": "file", - "name": "buttons.php", - "filePath": "views/blocks/buttons/buttons.php", - "summary": "PHP template for the Buttons container ACF block that renders a flex wrapper with InnerBlocks for nesting individual Button blocks.", - "tags": [ - "component", - "api-handler", - "wordpress-block", - "acf" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/buttons/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/buttons/block.json", - "summary": "ACF block registration config for the Buttons container block, declaring it as acf/buttons and restricting allowed inner blocks to acf/button only.", - "tags": [ - "configuration", - "wordpress-block", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/contact-info/contact-info.php", - "type": "file", - "name": "contact-info.php", - "filePath": "views/blocks/contact-info/contact-info.php", - "summary": "PHP template for the Contact Info ACF block that displays mailing address, email, and phone from ACF global option fields alongside an InnerBlocks area for a contact form.", - "tags": [ - "component", - "api-handler", - "wordpress-block", - "acf" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/contact-info/contact-info.css", - "type": "file", - "name": "contact-info.css", - "filePath": "views/blocks/contact-info/contact-info.css", - "summary": "Empty placeholder CSS file for the Contact Info block, with styles intended to be added as needed.", - "tags": [ - "component", - "styling", - "placeholder" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/contact-info/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/contact-info/block.json", - "summary": "ACF block registration config for the Contact Info block, declaring it as acf/contact-info with preview mode, enqueueing contact-info.css, and enabling JSX inner blocks.", - "tags": [ - "configuration", - "wordpress-block", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/grid/grid.php", - "type": "file", - "name": "grid.php", - "filePath": "views/blocks/grid/grid.php", - "summary": "PHP template for the Grid ACF block that reads column count, responsive breakpoints, and gap settings from ACF fields to build dynamic Tailwind CSS grid classes, wrapping InnerBlocks for grid-cell children.", - "tags": [ - "component", - "api-handler", - "wordpress-block", - "acf", - "layout" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/grid/grid.css", - "type": "file", - "name": "grid.css", - "filePath": "views/blocks/grid/grid.css", - "summary": "Empty placeholder CSS file for the Grid block, with layout handled via Tailwind utility classes generated dynamically in grid.php.", - "tags": [ - "component", - "styling", - "placeholder" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/grid/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/grid/block.json", - "summary": "ACF block registration config for the Grid block, declaring it as acf/grid with preview mode, enqueueing grid.css, and restricting inner blocks to acf/grid-cell only.", - "tags": [ - "configuration", - "wordpress-block", - "acf", - "layout" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/grid-cell/grid-cell.php", - "type": "file", - "name": "grid-cell.php", - "filePath": "views/blocks/grid-cell/grid-cell.php", - "summary": "PHP template for the Grid Cell ACF block that reads column span and responsive breakpoint span settings from ACF fields, composing dynamic Tailwind col-span classes with InnerBlocks for cell content.", - "tags": [ - "component", - "api-handler", - "wordpress-block", - "acf", - "layout" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/grid-cell/grid-cell.css", - "type": "file", - "name": "grid-cell.css", - "filePath": "views/blocks/grid-cell/grid-cell.css", - "summary": "Empty placeholder CSS file for the Grid Cell block, with layout handled via Tailwind utility classes generated dynamically in grid-cell.php.", - "tags": [ - "component", - "styling", - "placeholder" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/grid-cell/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/grid-cell/block.json", - "summary": "ACF block registration config for the Grid Cell block, declaring it as acf/grid-cell with preview mode, enqueueing grid-cell.css, and restricting it as a child of acf/grid only.", - "tags": [ - "configuration", - "wordpress-block", - "acf", - "layout" - ], - "complexity": "simple" - }, - { - "id": "config:acf/group_5f7f85a2a3e13.json", - "type": "config", - "name": "group_5f7f85a2a3e13.json", - "filePath": "acf/group_5f7f85a2a3e13.json", - "summary": "ACF field group configuration for the Button block, defining fields for element type (a/button), link, color, variant, size, width, and ARIA label, scoped to the acf/button block.", - "tags": [ - "configuration", - "acf", - "wordpress-block", - "field-group" - ], - "complexity": "moderate" - }, - { - "id": "config:acf/group_5fd3e006e5da5.json", - "type": "config", - "name": "group_5fd3e006e5da5.json", - "filePath": "acf/group_5fd3e006e5da5.json", - "summary": "ACF field group configuration for Global Fields options page, defining contact info (email, phone, fax, address, hours), social media URLs, header logo, footer settings (logo, description, copyright, credit), and admin 404 page reference.", - "tags": [ - "configuration", - "acf", - "field-group", - "global-settings" - ], - "complexity": "complex" - }, - { - "id": "config:acf/group_600f5a9e242c3.json", - "type": "config", - "name": "group_600f5a9e242c3.json", - "filePath": "acf/group_600f5a9e242c3.json", - "summary": "ACF field group configuration for the Grid block, defining responsive column counts (with breakpoint checkboxes), and gap X/Y selectors using Tailwind scale values, scoped to acf/grid.", - "tags": [ - "configuration", - "acf", - "wordpress-block", - "field-group", - "layout" - ], - "complexity": "complex" - }, - { - "id": "config:acf/group_60106ed700da3.json", - "type": "config", - "name": "group_60106ed700da3.json", - "filePath": "acf/group_60106ed700da3.json", - "summary": "ACF field group configuration for the Grid Cell block, defining default and responsive breakpoint column span ranges (1-12) with conditional visibility, scoped to acf/grid-cell.", - "tags": [ - "configuration", - "acf", - "wordpress-block", - "field-group", - "layout" - ], - "complexity": "moderate" - }, - { - "id": "config:acf/group_60bfb84ae973c.json", - "type": "config", - "name": "group_60bfb84ae973c.json", - "filePath": "acf/group_60bfb84ae973c.json", - "summary": "ACF field group configuration for Page Heading, defining hero style, background color, dark mode toggle, heading text, intro textarea, and a repeater for call-to-action links, scoped to pages and posts.", - "tags": [ - "configuration", - "acf", - "field-group", - "page-template" - ], - "complexity": "moderate" - }, - { - "id": "config:acf/group_60bfdb328901d.json", - "type": "config", - "name": "group_60bfdb328901d.json", - "filePath": "acf/group_60bfdb328901d.json", - "summary": "ACF field group configuration for the Homepage Hero block, defining heading text, WYSIWYG intro content, and a repeater for call-to-action links, scoped to the acf/homepage-hero block.", - "tags": [ - "configuration", - "acf", - "wordpress-block", - "field-group" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/homepage-hero/homepage-hero.php", - "type": "file", - "name": "homepage-hero.php", - "filePath": "views/blocks/homepage-hero/homepage-hero.php", - "summary": "ACF block template rendering the homepage hero section with a heading, intro text, and calls-to-action buttons using Tailwind CSS utility classes.", - "tags": [ - "component", - "api-handler", - "block-template", - "acf" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/homepage-hero/homepage-hero.css", - "type": "file", - "name": "homepage-hero.css", - "filePath": "views/blocks/homepage-hero/homepage-hero.css", - "summary": "Empty placeholder stylesheet for the Homepage Hero ACF block, referenced by block.json for block-scoped styles.", - "tags": [ - "markup", - "block-template", - "stylesheet" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/homepage-hero/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/homepage-hero/block.json", - "summary": "WordPress block registration config for the Homepage Hero ACF block, defining its title, category, keywords, render template, and editor supports.", - "tags": [ - "configuration", - "block-template", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/media-text/media-text.php", - "type": "file", - "name": "media-text.php", - "filePath": "views/blocks/media-text/media-text.php", - "summary": "ACF block template for a two-column media-with-text layout supporting image or video alongside heading, subheading, content, and call-to-action buttons.", - "tags": [ - "component", - "api-handler", - "block-template", - "acf" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/media-text/media-text.css", - "type": "file", - "name": "media-text.css", - "filePath": "views/blocks/media-text/media-text.css", - "summary": "Empty placeholder stylesheet for the Media With Text ACF block, referenced by block.json for block-scoped styles.", - "tags": [ - "markup", - "block-template", - "stylesheet" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/media-text/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/media-text/block.json", - "summary": "WordPress block registration config for the Media With Text ACF block, defining its title, category, keywords, render template, and editor supports.", - "tags": [ - "configuration", - "block-template", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/media-text-innerblocks/media-text-innerblocks.php", - "type": "file", - "name": "media-text-innerblocks.php", - "filePath": "views/blocks/media-text-innerblocks/media-text-innerblocks.php", - "summary": "ACF block template for a two-column media-with-text layout using WordPress InnerBlocks for the content column, supporting image/video on one side and editable inner blocks on the other.", - "tags": [ - "component", - "api-handler", - "block-template", - "acf" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/media-text-innerblocks/media-text-innerblocks.css", - "type": "file", - "name": "media-text-innerblocks.css", - "filePath": "views/blocks/media-text-innerblocks/media-text-innerblocks.css", - "summary": "Empty placeholder stylesheet for the Media Text InnerBlocks ACF block, referenced by block.json for block-scoped styles.", - "tags": [ - "markup", - "block-template", - "stylesheet" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/media-text-innerblocks/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/media-text-innerblocks/block.json", - "summary": "WordPress block registration config for the Media Text InnerBlocks variant ACF block, defining its title, category, keywords, render template, and editor supports.", - "tags": [ - "configuration", - "block-template", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/page-children/page-children.php", - "type": "file", - "name": "page-children.php", - "filePath": "views/blocks/page-children/page-children.php", - "summary": "ACF block template that dynamically queries and displays child pages of the current page as a card grid, including featured images, titles, and grandchild page listings.", - "tags": [ - "component", - "data-model", - "block-template", - "acf" - ], - "complexity": "complex" - }, - { - "id": "file:views/blocks/page-children/page-children.css", - "type": "file", - "name": "page-children.css", - "filePath": "views/blocks/page-children/page-children.css", - "summary": "Empty placeholder stylesheet for the Page Children ACF block, referenced by block.json for block-scoped styles.", - "tags": [ - "markup", - "block-template", - "stylesheet" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/page-children/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/page-children/block.json", - "summary": "WordPress block registration config for the Page Children ACF block, defining its title, category, render template, and restricted editor supports (no align, anchor, or color).", - "tags": [ - "configuration", - "block-template", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/blocks/section/section.php", - "type": "file", - "name": "section.php", - "filePath": "views/blocks/section/section.php", - "summary": "ACF block template for a configurable section wrapper with background color/image, overlay, font color, and content width options, using InnerBlocks for nested content.", - "tags": [ - "component", - "api-handler", - "block-template", - "acf" - ], - "complexity": "moderate" - }, - { - "id": "file:views/blocks/section/section.css", - "type": "file", - "name": "section.css", - "filePath": "views/blocks/section/section.css", - "summary": "Empty placeholder stylesheet for the Section ACF block, referenced by block.json for block-scoped styles.", - "tags": [ - "markup", - "block-template", - "stylesheet" - ], - "complexity": "simple" - }, - { - "id": "config:views/blocks/section/block.json", - "type": "config", - "name": "block.json", - "filePath": "views/blocks/section/block.json", - "summary": "WordPress block registration config for the Section ACF block, defining its title, category, keywords, render template, and editor supports.", - "tags": [ - "configuration", - "block-template", - "acf" - ], - "complexity": "simple" - }, - { - "id": "file:views/components/nav-aux.php", - "type": "file", - "name": "nav-aux.php", - "filePath": "views/components/nav-aux.php", - "summary": "Auxiliary navigation component rendering the top-bar menu with social media links and a search form, using the MenuItems class for menu rendering.", - "tags": [ - "component", - "navigation", - "event-handler" - ], - "complexity": "simple" - }, - { - "id": "file:views/components/nav-main.php", - "type": "file", - "name": "nav-main.php", - "filePath": "views/components/nav-main.php", - "summary": "Main navigation component that renders the primary menu with a mobile toggle button, using the MenuItems class for recursive menu rendering.", - "tags": [ - "component", - "navigation", - "event-handler" - ], - "complexity": "simple" - }, - { - "id": "file:views/components/nav-main__toggle.php", - "type": "file", - "name": "nav-main__toggle.php", - "filePath": "views/components/nav-main__toggle.php", - "summary": "Mobile navigation toggle button component rendering either a custom ACF icon or default hamburger/close SVG icons for the main menu.", - "tags": [ - "component", - "navigation", - "event-handler" - ], - "complexity": "simple" - }, - { - "id": "file:views/components/menu-items/has-children.php", - "type": "file", - "name": "has-children.php", - "filePath": "views/components/menu-items/has-children.php", - "summary": "Menu item template for navigation items with child pages, rendering a toggle button and nested submenu list supporting up to three levels of depth.", - "tags": [ - "component", - "navigation", - "event-handler" - ], - "complexity": "moderate" - }, - { - "id": "file:views/components/menu-items/index.php", - "type": "file", - "name": "index.php", - "filePath": "views/components/menu-items/index.php", - "summary": "Outer menu list template that iterates top-level navigation items, delegating to has-children or single templates based on whether items have sub-items, and includes a mobile search form.", - "tags": [ - "component", - "navigation", - "entry-point" - ], - "complexity": "simple" - }, - { - "id": "file:views/components/menu-items/single.php", - "type": "file", - "name": "single.php", - "filePath": "views/components/menu-items/single.php", - "summary": "Menu item template for simple navigation items without children, rendering a single link with current-page detection and class generation.", - "tags": [ - "component", - "navigation" - ], - "complexity": "simple" - }, - { - "id": "file:views/forms/search.php", - "type": "file", - "name": "search.php", - "filePath": "views/forms/search.php", - "summary": "Global search form component rendering a search input with an SVG icon and submit button, using WordPress home_url and get_search_query template tags.", - "tags": [ - "component", - "form", - "search" - ], - "complexity": "simple" - }, - { - "id": "file:views/partials/page-hero.php", - "type": "file", - "name": "page-hero.php", - "filePath": "views/partials/page-hero.php", - "summary": "Page hero partial displaying a heading and intro text with dark-mode support and breadcrumbs, used as a reusable banner component across page templates.", - "tags": [ - "component", - "partial", - "page-layout" - ], - "complexity": "moderate" - }, - { - "id": "file:views/partials/social-media.php", - "type": "file", - "name": "social-media.php", - "filePath": "views/partials/social-media.php", - "summary": "Social media links partial that dynamically renders icon links for configured social platforms (Facebook, Twitter, Pinterest, Instagram, YouTube, LinkedIn) from ACF options fields.", - "tags": [ - "component", - "partial", - "navigation" - ], - "complexity": "simple" - }, - { - "id": "config:acf/group_6261bc658dd80.json", - "type": "config", - "name": "group_6261bc658dd80.json", - "filePath": "acf/group_6261bc658dd80.json", - "summary": "ACF field group configuration for the Section block, defining background color, background image, overlay, font color, content width, and dark mode fields used in the section block template.", - "tags": [ - "configuration", - "acf", - "block-template" - ], - "complexity": "complex", - "languageNotes": "WordPress ACF field group JSON with accordion, color_picker, true_false, image, and range field types." - }, - { - "id": "config:acf/group_645e51f721207.json", - "type": "config", - "name": "group_645e51f721207.json", - "filePath": "acf/group_645e51f721207.json", - "summary": "ACF field group configuration for the Accordion Block, defining fields for first-item-open toggle, group name, and repeater-based accordion items.", - "tags": [ - "configuration", - "acf", - "block-template" - ], - "complexity": "moderate" - }, - { - "id": "config:acf/group_645e7cf448e66.json", - "type": "config", - "name": "group_645e7cf448e66.json", - "filePath": "acf/group_645e7cf448e66.json", - "summary": "ACF field group configuration for the Media With Text Block, defining background color, dark mode, media position, video/image, heading, subheading, content, and calls-to-action fields.", - "tags": [ - "configuration", - "acf", - "block-template" - ], - "complexity": "complex", - "languageNotes": "WordPress ACF field group JSON with color_picker, true_false, select, oembed, image, text, wysiwyg, and repeater (with link sub-fields) field types." - }, - { - "id": "file:views/icons/facebook.php", - "type": "file", - "name": "facebook.php", - "filePath": "views/icons/facebook.php", - "summary": "Icon partial template rendering the Facebook icon using a Lineicons icon-font class reference.", - "tags": [ - "component", - "icon", - "social", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/icons/heart.php", - "type": "file", - "name": "heart.php", - "filePath": "views/icons/heart.php", - "summary": "Icon partial template rendering an inline SVG heart icon with stroke-based path drawing.", - "tags": [ - "component", - "icon", - "svg", - "template" - ], - "complexity": "simple", - "languageNotes": "Uses inline SVG with currentColor stroke for theme-aware icon coloring." - }, - { - "id": "file:views/icons/instagram.php", - "type": "file", - "name": "instagram.php", - "filePath": "views/icons/instagram.php", - "summary": "Icon partial template rendering the Instagram icon using a Lineicons icon-font class reference.", - "tags": [ - "component", - "icon", - "social", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/icons/linkedin.php", - "type": "file", - "name": "linkedin.php", - "filePath": "views/icons/linkedin.php", - "summary": "Icon partial template rendering the LinkedIn icon using a Lineicons icon-font class reference.", - "tags": [ - "component", - "icon", - "social", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/icons/menu.php", - "type": "file", - "name": "menu.php", - "filePath": "views/icons/menu.php", - "summary": "Icon partial template rendering a hamburger menu icon using the Font Awesome bars icon class.", - "tags": [ - "component", - "icon", - "navigation", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/icons/pinterest.php", - "type": "file", - "name": "pinterest.php", - "filePath": "views/icons/pinterest.php", - "summary": "Icon partial template rendering the Pinterest icon using a Lineicons icon-font class reference.", - "tags": [ - "component", - "icon", - "social", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/icons/search.php", - "type": "file", - "name": "search.php", - "filePath": "views/icons/search.php", - "summary": "Icon partial template rendering an inline SVG search icon with a circle and diagonal line magnifying glass.", - "tags": [ - "component", - "icon", - "svg", - "search" - ], - "complexity": "simple", - "languageNotes": "Uses inline SVG with currentColor stroke for theme-aware icon coloring." - }, - { - "id": "file:views/icons/shop.php", - "type": "file", - "name": "shop.php", - "filePath": "views/icons/shop.php", - "summary": "Icon partial template rendering the shop/storefront icon using a Lineicons icon-font class reference.", - "tags": [ - "component", - "icon", - "ecommerce", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/icons/shopping-basket.php", - "type": "file", - "name": "shopping-basket.php", - "filePath": "views/icons/shopping-basket.php", - "summary": "Icon partial template rendering an inline SVG shopping basket icon with basket body, handle, and items arc paths.", - "tags": [ - "component", - "icon", - "svg", - "ecommerce" - ], - "complexity": "simple", - "languageNotes": "Uses inline SVG with currentColor stroke for theme-aware icon coloring." - }, - { - "id": "file:views/icons/twitter-.php", - "type": "file", - "name": "twitter-.php", - "filePath": "views/icons/twitter-.php", - "summary": "Icon partial template rendering the X (formerly Twitter) rebrand icon using an icon-x class reference.", - "tags": [ - "component", - "icon", - "social", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/icons/twitter.php", - "type": "file", - "name": "twitter.php", - "filePath": "views/icons/twitter.php", - "summary": "Icon partial template rendering the classic Twitter bird icon using a Lineicons icon-twitter class reference.", - "tags": [ - "component", - "icon", - "social", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:views/icons/user.php", - "type": "file", - "name": "user.php", - "filePath": "views/icons/user.php", - "summary": "Icon partial template rendering an inline SVG user icon with a circular head and body arc path.", - "tags": [ - "component", - "icon", - "svg", - "user" - ], - "complexity": "simple", - "languageNotes": "Uses inline SVG with currentColor stroke for theme-aware icon coloring." - }, - { - "id": "file:views/icons/youtube.php", - "type": "file", - "name": "youtube.php", - "filePath": "views/icons/youtube.php", - "summary": "Icon partial template rendering the YouTube icon using a Lineicons icon-font class reference.", - "tags": [ - "component", - "icon", - "social", - "template" - ], - "complexity": "simple" - }, - { - "id": "file:styles/base/break-out.css", - "type": "file", - "name": "break-out.css", - "filePath": "styles/base/break-out.css", - "summary": "Defines break-out utility classes using Tailwind @utility and @theme directives, allowing elements to extend beyond their container to full viewport width.", - "tags": [ - "utility", - "layout", - "css", - "tailwind" - ], - "complexity": "simple", - "languageNotes": "Uses Tailwind CSS v4 @utility directive to register custom utilities with scrollbar-width compensation." - }, - { - "id": "file:styles/base/colors.css", - "type": "file", - "name": "colors.css", - "filePath": "styles/base/colors.css", - "summary": "Defines the theme color palette using oklch color space with primary/secondary scales, semantic feedback colors, and link color variables.", - "tags": [ - "configuration", - "design-tokens", - "css", - "tailwind" - ], - "complexity": "simple", - "languageNotes": "Uses oklch color space and CSS color-mix() for automatic shade generation (100-900 scales) from base primary/secondary colors." - }, - { - "id": "file:styles/base/forms.css", - "type": "file", - "name": "forms.css", - "filePath": "styles/base/forms.css", - "summary": "Styles form inputs, Gravity Forms wrappers, and the WordPress search block using Tailwind @apply directives with focus-visible states.", - "tags": [ - "form-styling", - "gravity-forms", - "wordpress", - "css" - ], - "complexity": "moderate" - }, - { - "id": "file:styles/base/global.css", - "type": "file", - "name": "global.css", - "filePath": "styles/base/global.css", - "summary": "Core layout and spacing styles defining breakpoints, container widths, section spacing, WordPress alignment classes, and responsive embed wrappers.", - "tags": [ - "layout", - "configuration", - "css", - "tailwind" - ], - "complexity": "moderate", - "languageNotes": "Defines custom Tailwind breakpoints (xxs through 2xl) using @theme and uses clamp() for responsive container padding." - }, - { - "id": "file:styles/base/index.css", - "type": "file", - "name": "index.css", - "filePath": "styles/base/index.css", - "summary": "Barrel stylesheet that imports all base CSS partials (global, colors, prose, typography, skip-link, misc, forms) in load order.", - "tags": [ - "barrel", - "entry-point", - "css", - "imports" - ], - "complexity": "simple" - }, - { - "id": "file:styles/base/misc.css", - "type": "file", - "name": "misc.css", - "filePath": "styles/base/misc.css", - "summary": "Placeholder file for miscellaneous extra styles, currently containing only a comment.", - "tags": [ - "placeholder", - "css", - "utility" - ], - "complexity": "simple" - }, - { - "id": "file:styles/base/prose.css", - "type": "file", - "name": "prose.css", - "filePath": "styles/base/prose.css", - "summary": "Configures Tailwind Typography plugin prose color tokens using the theme's primary and secondary color variables for both normal and inverted modes.", - "tags": [ - "typography", - "configuration", - "design-tokens", - "tailwind" - ], - "complexity": "simple", - "languageNotes": "Maps all --tw-prose-* custom properties to theme color variables, ensuring the Tailwind Typography plugin matches the theme palette." - }, - { - "id": "file:styles/base/skip-link.css", - "type": "file", - "name": "skip-link.css", - "filePath": "styles/base/skip-link.css", - "summary": "Accessibility skip-link styling that hides the link off-screen until focused, then reveals it as a high-visibility yellow bar at the top of the viewport.", - "tags": [ - "accessibility", - "a11y", - "css", - "navigation" - ], - "complexity": "simple" - }, - { - "id": "file:styles/base/typography.css", - "type": "file", - "name": "typography.css", - "filePath": "styles/base/typography.css", - "summary": "Comprehensive fluid typography system defining a 14-size clamp-based scale from 14px to 75px, heading sizes, font family variables, and base element styling for headings, links, lists, code, and horizontal rules.", - "tags": [ - "typography", - "design-tokens", - "css", - "fluid-type" - ], - "complexity": "moderate", - "languageNotes": "Uses CSS clamp() for each text size to create a fluid scale that interpolates between minimum and maximum pixel values, with a detailed viewport-width reference table in comments." - }, - { - "id": "file:styles/backend/admin.css", - "type": "file", - "name": "admin.css", - "filePath": "styles/backend/admin.css", - "summary": "Placeholder file for light WordPress admin panel styles, currently containing only a comment to avoid overriding core wp-admin UI.", - "tags": [ - "placeholder", - "wordpress", - "admin", - "css" - ], - "complexity": "simple" - }, - { - "id": "file:styles/backend/editor.css", - "type": "file", - "name": "editor.css", - "filePath": "styles/backend/editor.css", - "summary": "WordPress Gutenberg editor styles that mirror the frontend layout, applying consistent max-widths, gutter padding, and break-out utility alignment within the block editor.", - "tags": [ - "wordpress", - "gutenberg", - "editor", - "css" - ], - "complexity": "moderate", - "languageNotes": "Imports the compiled theme.css and then overrides layout constraints with editor-specific gutter variables using clamp() for responsive padding." - }, - { - "id": "file:styles/theme.css", - "type": "file", - "name": "theme.css", - "filePath": "styles/theme.css", - "summary": "Main theme CSS entry point that loads Tailwind, all base styles, navigation, icon fonts, break-out utilities, components, blocks, and the typography plugin.", - "tags": [ - "entry-point", - "css", - "tailwind", - "configuration" - ], - "complexity": "simple" - }, - { - "id": "file:styles/components/breadcrumbs.css", - "type": "file", - "name": "breadcrumbs.css", - "filePath": "styles/components/breadcrumbs.css", - "summary": "Styles for the breadcrumb navigation element using oklch color values with hover color-mix transitions.", - "tags": [ - "component", - "navigation", - "styling" - ], - "complexity": "simple" - }, - { - "id": "file:styles/components/index.css", - "type": "file", - "name": "index.css", - "filePath": "styles/components/index.css", - "summary": "Barrel file that aggregates all theme component stylesheets via CSS @import directives for site-header, breadcrumbs, post-list, sidebar, pagination, and site-footer.", - "tags": [ - "barrel", - "component", - "styling" - ], - "complexity": "simple" - }, - { - "id": "file:styles/components/pagination.css", - "type": "file", - "name": "pagination.css", - "filePath": "styles/components/pagination.css", - "summary": "Styles for post index pagination including page numbers, prev/next links, and current page highlighting with responsive visibility toggling.", - "tags": [ - "component", - "pagination", - "styling" - ], - "complexity": "simple" - }, - { - "id": "file:styles/components/post-list.css", - "type": "file", - "name": "post-list.css", - "filePath": "styles/components/post-list.css", - "summary": "Placeholder stylesheet for blog/post index listing with commented-out BEM-style selectors for future customization.", - "tags": [ - "component", - "layout", - "styling" - ], - "complexity": "simple" - }, - { - "id": "file:styles/components/sidebar.css", - "type": "file", - "name": "sidebar.css", - "filePath": "styles/components/sidebar.css", - "summary": "Styles for the sidebar widget area including widget containers, titles, and nested list styling with a left border accent.", - "tags": [ - "component", - "sidebar", - "widget" - ], - "complexity": "simple" - }, - { - "id": "file:styles/components/site-footer.css", - "type": "file", - "name": "site-footer.css", - "filePath": "styles/components/site-footer.css", - "summary": "Styles for the site footer including footer column layouts, widget areas, footer menu links, and copyright section with hover transitions.", - "tags": [ - "component", - "footer", - "styling" - ], - "complexity": "moderate" - }, - { - "id": "file:styles/components/site-header.css", - "type": "file", - "name": "site-header.css", - "filePath": "styles/components/site-header.css", - "summary": "Styles for the site header auxiliary navigation container including link hover effects and global search input styling.", - "tags": [ - "component", - "header", - "styling" - ], - "complexity": "simple" - }, - { - "id": "file:styles/blocks/buttons.css", - "type": "file", - "name": "buttons.css", - "filePath": "styles/blocks/buttons.css", - "summary": "Comprehensive button styling system with CSS custom properties for variants (outline, secondary, light, white, black), sizes (small, medium, large), widths, and a back-to-top button component using Tailwind @theme directive.", - "tags": [ - "component", - "buttons", - "styling" - ], - "complexity": "moderate", - "languageNotes": "Uses Tailwind CSS v4 @theme directive to define custom CSS properties for the button system, with data-attribute-driven variants." - }, - { - "id": "file:styles/blocks/core.css", - "type": "file", - "name": "core.css", - "filePath": "styles/blocks/core.css", - "summary": "Minimal core block style for full-width alignment using viewport-width calculations to break out of container constraints.", - "tags": [ - "block", - "layout", - "styling" - ], - "complexity": "simple" - }, - { - "id": "file:styles/blocks/index.css", - "type": "file", - "name": "index.css", - "filePath": "styles/blocks/index.css", - "summary": "Barrel file that aggregates block stylesheets via CSS @import for buttons and core alignment styles.", - "tags": [ - "barrel", - "block", - "styling" - ], - "complexity": "simple" - }, - { - "id": "file:styles/navigation/index.css", - "type": "file", - "name": "index.css", - "filePath": "styles/navigation/index.css", - "summary": "Barrel file that aggregates navigation stylesheets via CSS @import, with commented-out alternatives for choosing between default vs mega menu and accordion vs sliding mobile navigation styles.", - "tags": [ - "barrel", - "navigation", - "styling" - ], - "complexity": "simple", - "languageNotes": "Uses commented @import lines to allow theme developers to swap between navigation style alternatives (dropdown vs mega menu, accordion vs sliding mobile)." - }, - { - "id": "file:styles/navigation/nav-aux.css", - "type": "file", - "name": "nav-aux.css", - "filePath": "styles/navigation/nav-aux.css", - "summary": "Styles for the auxiliary navigation bar with flexible wrapping layout, toggle button styling, and desktop-specific overrides for wider spacing.", - "tags": [ - "navigation", - "auxiliary", - "styling" - ], - "complexity": "simple" - }, - { - "id": "file:styles/navigation/nav-footer.css", - "type": "file", - "name": "nav-footer.css", - "filePath": "styles/navigation/nav-footer.css", - "summary": "Footer navigation styles with responsive breakpoints for desktop vertical lists and mobile collapsible sections with toggle and submenu styling.", - "tags": [ - "navigation", - "footer", - "responsive" - ], - "complexity": "moderate" - }, - { - "id": "file:styles/navigation/nav-functional.css", - "type": "file", - "name": "nav-functional.css", - "filePath": "styles/navigation/nav-functional.css", - "summary": "Core functional navigation styles for the menu-vdi system including submenu toggling, aria-expanded state handling, and responsive mobile/desktop layout shifts with hamburger toggle behavior.", - "tags": [ - "navigation", - "functional", - "responsive" - ], - "complexity": "moderate" - }, - { - "id": "file:styles/navigation/nav-main-default.css", - "type": "file", - "name": "nav-main-default.css", - "filePath": "styles/navigation/nav-main-default.css", - "summary": "Desktop-only main navigation styles with standard dropdown submenus, bold top-level links, and shadowed dropdown panels for the default navigation variant.", - "tags": [ - "navigation", - "desktop", - "dropdown" - ], - "complexity": "moderate" - }, - { - "id": "file:styles/navigation/nav-main-mega.css", - "type": "file", - "name": "nav-main-mega.css", - "filePath": "styles/navigation/nav-main-mega.css", - "summary": "Mega menu navigation styles with multi-column dropdown panels for desktop and mobile, using CSS :has() selector for grandchild detection and horizontal layout expansion.", - "tags": [ - "navigation", - "mega-menu", - "desktop" - ], - "complexity": "moderate", - "languageNotes": "Uses CSS :has() pseudo-class for detecting grandchild elements to trigger mega menu layout, a modern CSS feature with progressive enhancement." - }, - { - "id": "file:styles/navigation/nav-mobile-accordion.css", - "type": "file", - "name": "nav-mobile-accordion.css", - "filePath": "styles/navigation/nav-mobile-accordion.css", - "summary": "Mobile accordion-style navigation with full-height slide-down menu, toggle-controlled visibility via aria-expanded, and vertically stacked submenu items.", - "tags": [ - "navigation", - "mobile", - "accordion" - ], - "complexity": "moderate" - }, - { - "id": "file:styles/navigation/nav-mobile-sliding.css", - "type": "file", - "name": "nav-mobile-sliding.css", - "filePath": "styles/navigation/nav-mobile-sliding.css", - "summary": "Mobile sliding viewport navigation with level-to-level transitions, back buttons, level indicators, and nested item indentation where users slide between menu depth levels.", - "tags": [ - "navigation", - "mobile", - "sliding" - ], - "complexity": "moderate" - }, - { - "id": "file:styles/fonts/lineicons.css", - "type": "file", - "name": "lineicons.css", - "filePath": "styles/fonts/lineicons.css", - "summary": "Lineicons icon font definition with @font-face declarations, base icon class selectors, circular icon styling, spin/rotate/flip transforms, and 600+ individual icon glyph mappings using Unicode content values.", - "tags": [ - "fonts", - "icons", - "styling" - ], - "complexity": "complex" - }, - { - "id": "config:package.json", - "type": "config", - "name": "package.json", - "filePath": "package.json", - "summary": "Node.js project configuration defining the VDI-Starter-v5 WordPress theme with Tailwind CSS v4 build pipeline, BrowserSync watch mode, and Playwright accessibility testing dependencies.", - "tags": [ - "configuration", - "build-system", - "npm" - ], - "complexity": "simple" - }, - { - "id": "config:composer.json", - "type": "config", - "name": "composer.json", - "filePath": "composer.json", - "summary": "PHP Composer configuration for the WordPress theme with PHP_CodeSniffer and WordPress Coding Standards as dev dependencies, plus lint and fix scripts.", - "tags": [ - "configuration", - "php", - "linting" - ], - "complexity": "simple" - }, - { - "id": "config:.phpcs.xml", - "type": "config", - "name": ".phpcs.xml", - "filePath": ".phpcs.xml", - "summary": "PHP_CodeSniffer ruleset based on WordPress coding standards with targeted exclusions for naming conventions, indentation, commenting, and Yoda conditions to suit the theme's development style.", - "tags": [ - "configuration", - "linting", - "coding-standards" - ], - "complexity": "moderate" - }, - { - "id": "config:.env.example", - "type": "config", - "name": ".env.example", - "filePath": ".env.example", - "summary": "Environment variable template providing the local development URL and BrowserSync port configuration for the watch workflow.", - "tags": [ - "configuration", - "development", - "environment" - ], - "complexity": "simple" - }, - { - "id": "document:README.md", - "type": "document", - "name": "README.md", - "filePath": "README.md", - "summary": "Comprehensive project documentation covering VDI-Starter-v5 features, directory structure, core files, installation, development workflows, build commands, and coding standards for the WordPress theme.", - "tags": [ - "documentation", - "entry-point", - "overview" - ], - "complexity": "moderate" - }, - { - "id": "file:bin/.build.js", - "type": "file", - "name": ".build.js", - "filePath": "bin/.build.js", - "summary": "Production build script that compiles Tailwind CSS to the static/dist output directory, ensuring the directory exists before compilation.", - "tags": [ - "build-system", - "utility", - "css-compilation" - ], - "complexity": "simple" - }, - { - "id": "file:bin/.utils.js", - "type": "file", - "name": ".utils.js", - "filePath": "bin/.utils.js", - "summary": "Shared build utilities exporting a debounced Tailwind-to-CSS compilation function used by both the build and watch scripts.", - "tags": [ - "utility", - "build-system", - "shared-utilities" - ], - "complexity": "simple" - }, - { - "id": "file:bin/.watch.js", - "type": "file", - "name": ".watch.js", - "filePath": "bin/.watch.js", - "summary": "Development watch script using BrowserSync to proxy a local WordPress site, auto-reloading JS changes and recompiling Tailwind CSS on PHP/CSS file changes.", - "tags": [ - "utility", - "development", - "hot-reload" - ], - "complexity": "moderate" - }, - { - "id": "file:static/js/admin.js", - "type": "file", - "name": "admin.js", - "filePath": "static/js/admin.js", - "summary": "WordPress admin JavaScript entry point that registers the ButtonComponent custom element on DOM ready.", - "tags": [ - "entry-point", - "admin", - "component" - ], - "complexity": "simple" - }, - { - "id": "function:static/js/admin.js:app", - "type": "function", - "name": "app", - "filePath": "static/js/admin.js", - "lineRange": [ - 6, - 8 - ], - "summary": "Initializes the ButtonComponent custom element for the WordPress admin context.", - "tags": [ - "component", - "initialization" - ], - "complexity": "simple" - }, - { - "id": "file:static/js/theme.js", - "type": "file", - "name": "theme.js", - "filePath": "static/js/theme.js", - "summary": "Main frontend theme entry point that imports all components and modules, patches passive event listeners, and initializes navigation, external link tagging, header height, and back-to-top button on DOMContentLoaded.", - "tags": [ - "entry-point", - "initialization", - "component" - ], - "complexity": "moderate", - "languageNotes": "Includes an inline polyfill that patches EventTarget.prototype.addEventListener to default scroll/touch events to passive:true for better scrolling performance." - }, - { - "id": "file:static/js/components/backToTop.js", - "type": "file", - "name": "backToTop.js", - "filePath": "static/js/components/backToTop.js", - "summary": "Custom element providing a back-to-top button that appears on upward scroll after scrolling past 300px, with smooth scroll-to-top on click.", - "tags": [ - "component", - "ui", - "accessibility" - ], - "complexity": "simple" - }, - { - "id": "class:static/js/components/backToTop.js:BackToTopButton", - "type": "class", - "name": "BackToTopButton", - "filePath": "static/js/components/backToTop.js", - "lineRange": [ - 2, - 27 - ], - "summary": "Web Component that renders a back-to-top button, tracking scroll direction to show the button only when scrolling up past 300px.", - "tags": [ - "component", - "ui", - "scroll" - ], - "complexity": "simple" - }, - { - "id": "function:static/js/components/backToTop.js:registerBackToTopButton", - "type": "function", - "name": "registerBackToTopButton", - "filePath": "static/js/components/backToTop.js", - "lineRange": [ - 29, - 33 - ], - "summary": "Registers the BackToTopButton custom element with the browser's CustomElementRegistry if not already defined.", - "tags": [ - "component", - "registration" - ], - "complexity": "simple" - }, - { - "id": "file:static/js/components/button.js", - "type": "file", - "name": "button.js", - "filePath": "static/js/components/button.js", - "summary": "Web Component for rendering customizable buttons with configurable attributes for element type, URL, target, title, ARIA label, color, variant, size, and width, updating reactively on attribute changes.", - "tags": [ - "component", - "ui", - "accessibility" - ], - "complexity": "moderate" - }, - { - "id": "class:static/js/components/button.js:ButtonComponent", - "type": "class", - "name": "ButtonComponent", - "filePath": "static/js/components/button.js", - "lineRange": [ - 1, - 95 - ], - "summary": "HTMLElement subclass that renders a configurable button/link element, reacting to observed attribute changes by re-rendering the button's classes, attributes, and content.", - "tags": [ - "component", - "ui", - "reactive" - ], - "complexity": "moderate" - }, - { - "id": "function:static/js/components/button.js:registerButtonComponent", - "type": "function", - "name": "registerButtonComponent", - "filePath": "static/js/components/button.js", - "lineRange": [ - 97, - 99 - ], - "summary": "Registers the ButtonComponent custom element with the browser's CustomElementRegistry.", - "tags": [ - "component", - "registration" - ], - "complexity": "simple" - }, - { - "id": "file:static/js/modules/GetHeaderHeight.js", - "type": "file", - "name": "GetHeaderHeight.js", - "filePath": "static/js/modules/GetHeaderHeight.js", - "summary": "Measures the main navigation header height and sets a CSS custom property (--hgtHeader) on the document root for use in layout calculations.", - "tags": [ - "utility", - "layout", - "css-variables" - ], - "complexity": "simple" - }, - { - "id": "function:static/js/modules/GetHeaderHeight.js:getHeaderHeight", - "type": "function", - "name": "getHeaderHeight", - "filePath": "static/js/modules/GetHeaderHeight.js", - "lineRange": [ - 7, - 10 - ], - "summary": "Reads the header navigation element's bounding rect height and applies it as a CSS custom property on the root element.", - "tags": [ - "utility", - "layout", - "css-variables" - ], - "complexity": "simple" - }, - { - "id": "file:static/js/modules/Navigation.js", - "type": "file", - "name": "Navigation.js", - "filePath": "static/js/modules/Navigation.js", - "summary": "Comprehensive navigation module handling mobile menu toggling, desktop dropdown menus, keyboard accessibility (escape key, focus management), and a sliding viewport pattern for multi-level mobile navigation with animation.", - "tags": [ - "service", - "navigation", - "accessibility", - "mobile" - ], - "complexity": "complex" - }, - { - "id": "class:static/js/modules/Navigation.js:Navigation", - "type": "class", - "name": "Navigation", - "filePath": "static/js/modules/Navigation.js", - "lineRange": [ - 16, - 574 - ], - "summary": "Main navigation controller class managing mobile menu toggle, desktop dropdown behavior, ARIA expanded states, blur/escape-key dismissal, and a sliding viewport system for multi-level mobile navigation with back-button and animation support.", - "tags": [ - "navigation", - "accessibility", - "mobile", - "event-handler" - ], - "complexity": "complex" - }, - { - "id": "file:static/js/modules/TagExternalLinks.js", - "type": "file", - "name": "TagExternalLinks.js", - "filePath": "static/js/modules/TagExternalLinks.js", - "summary": "Utility function that identifies external anchor links and enhances them with accessibility attributes, target=_blank, rel=noopener noreferrer, and a custom CSS class for visual styling.", - "tags": [ - "utility", - "accessibility", - "security" - ], - "complexity": "simple" - }, - { - "id": "function:static/js/modules/TagExternalLinks.js:tagExternalLinks", - "type": "function", - "name": "tagExternalLinks", - "filePath": "static/js/modules/TagExternalLinks.js", - "lineRange": [ - 19, - 37 - ], - "summary": "Scans all anchor elements for external hosts and applies ARIA labels, target, rel, and CSS class attributes for security and accessibility.", - "tags": [ - "utility", - "accessibility", - "security" - ], - "complexity": "simple" - }, - { - "id": "file:tests/site-a11y.spec.js", - "type": "file", - "name": "site-a11y.spec.js", - "filePath": "tests/site-a11y.spec.js", - "summary": "Playwright accessibility test suite using Axe-core to scan the homepage, blog index, and 404 page for WCAG 2.x and 2.2 violations across levels A and AA.", - "tags": [ - "test", - "accessibility", - "a11y" - ], - "complexity": "moderate" - }, - { - "id": "file:playwright.config.js", - "type": "file", - "name": "playwright.config.js", - "filePath": "playwright.config.js", - "summary": "Playwright test configuration defining test directory, parallel execution, CI-specific retry/worker settings, Chromium-only browser project, and HTML reporter.", - "tags": [ - "configuration", - "testing", - "test-runner" - ], - "complexity": "moderate" - }, - { - "id": "pipeline:.github/workflows/phpcs.yml", - "type": "pipeline", - "name": "phpcs.yml", - "filePath": ".github/workflows/phpcs.yml", - "summary": "GitHub Actions workflow that runs PHP CodeSniffer checks on pull requests using PHP 8.2, installing Composer dependencies and reporting violations as PR annotations via cs2pr.", - "tags": [ - "ci-cd", - "code-quality", - "php" - ], - "complexity": "simple" - }, - { - "id": "pipeline:.github/workflows/todos.yml", - "type": "pipeline", - "name": "todos.yml", - "filePath": ".github/workflows/todos.yml", - "summary": "GitHub Actions workflow that syncs code TODO comments with GitHub Issues on push (excluding markdown files), using the TODO-Sync action.", - "tags": [ - "ci-cd", - "automation", - "task-management" - ], - "complexity": "simple" - }, - { - "id": "pipeline:.github/workflows/wpengine.yml", - "type": "pipeline", - "name": "wpengine.yml", - "filePath": ".github/workflows/wpengine.yml", - "summary": "GitHub Actions workflow for deploying the theme to WP Engine, installing Composer and npm dependencies, running the build task, and rsyncing the production artifact to the WP Engine server.", - "tags": [ - "ci-cd", - "deployment", - "infrastructure" - ], - "complexity": "moderate" - }, - { - "id": "config:content/basic-wp-test-content.xml", - "type": "config", - "name": "basic-wp-test-content.xml", - "filePath": "content/basic-wp-test-content.xml", - "summary": "WordPress WXR export file containing test content (posts, pages, comments, categories) for seeding a local development environment with realistic data.", - "tags": [ - "configuration", - "test-data", - "wordpress" - ], - "complexity": "complex" - } - ], - "edges": [ - { - "source": "file:functions.php", - "target": "function:functions.php:regACFBlocks", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:functions.php", - "target": "function:functions.php:regACFBlocks", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:header.php", - "target": "file:views/components/nav-aux.php", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:header.php", - "target": "file:views/components/nav-main.php", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:header.php", - "target": "file:views/partials/page-hero.php", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:footer.php", - "target": "file:views/partials/social-media.php", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:lib/class-acf.php", - "target": "class:lib/class-acf.php:ACF", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/class-acf.php", - "target": "class:lib/class-acf.php:ACF", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/class-breadcrumbs.php", - "target": "class:lib/class-breadcrumbs.php:Breadcrumbs", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/class-breadcrumbs.php", - "target": "class:lib/class-breadcrumbs.php:Breadcrumbs", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/class-enqueue.php", - "target": "class:lib/class-enqueue.php:Enqueue", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/class-enqueue.php", - "target": "class:lib/class-enqueue.php:Enqueue", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/class-menuitems.php", - "target": "class:lib/class-menuitems.php:MenuItems", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/class-menuitems.php", - "target": "class:lib/class-menuitems.php:MenuItems", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/class-resources.php", - "target": "class:lib/class-resources.php:Resources", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/class-resources.php", - "target": "class:lib/class-resources.php:Resources", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/show-template.php", - "target": "class:lib/show-template.php:ShowTemplate", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/show-template.php", - "target": "class:lib/show-template.php:ShowTemplate", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/extras.php", - "target": "function:lib/extras.php:getChildrenPages", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/extras.php", - "target": "function:lib/extras.php:createOwnerRole", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/extras.php", - "target": "function:lib/extras.php:getTheTitle", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/extras.php", - "target": "function:lib/extras.php:divWrapper", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:getFieldValue", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:blockWrapperAttributes", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:customMenuOrder", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:blockCategories", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:escEmbeds", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:strposArray", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:customExcerpt", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:getFieldValue", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:blockWrapperAttributes", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/helpers.php", - "target": "function:lib/helpers.php:customExcerpt", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:lib/hooks.php", - "target": "function:lib/hooks.php:init", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/search-features.php", - "target": "function:lib/search-features.php:searchResultFilter", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/search-features.php", - "target": "function:lib/search-features.php:dedupe", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/search-features.php", - "target": "function:lib/search-features.php:postSort", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:lib/search-features.php", - "target": "function:lib/search-features.php:searchResultFilter", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "function:lib/search-features.php:searchResultFilter", - "target": "function:lib/search-features.php:dedupe", - "type": "calls", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "function:lib/search-features.php:searchResultFilter", - "target": "function:lib/search-features.php:postSort", - "type": "calls", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "function:lib/helpers.php:customExcerpt", - "target": "function:lib/helpers.php:strposArray", - "type": "calls", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:functions.php", - "target": "file:lib/activation.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/class-acf.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/class-breadcrumbs.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/class-enqueue.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/class-menuitems.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/class-resources.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/extras.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/helpers.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/hooks.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/search-features.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:functions.php", - "target": "file:lib/show-template.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:header.php", - "target": "file:lib/helpers.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:footer.php", - "target": "file:lib/helpers.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:search.php", - "target": "file:lib/search-features.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:theme.json", - "target": "file:style.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:theme.json", - "target": "file:functions.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:style.css", - "target": "file:functions.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/accordion/block.json", - "target": "file:views/blocks/accordion/accordion.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/accordion/block.json", - "target": "file:views/blocks/accordion/accordion.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/boilerplate/block.json", - "target": "file:views/blocks/boilerplate/boilerplate.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/boilerplate/block.json", - "target": "file:views/blocks/boilerplate/boilerplate.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/button/block.json", - "target": "file:views/blocks/button/button.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/buttons/block.json", - "target": "file:views/blocks/buttons/buttons.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/contact-info/block.json", - "target": "file:views/blocks/contact-info/contact-info.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/contact-info/block.json", - "target": "file:views/blocks/contact-info/contact-info.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/grid/block.json", - "target": "file:views/blocks/grid/grid.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/grid/block.json", - "target": "file:views/blocks/grid/grid.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/grid-cell/block.json", - "target": "file:views/blocks/grid-cell/grid-cell.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/grid-cell/block.json", - "target": "file:views/blocks/grid-cell/grid-cell.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/buttons/buttons.php", - "target": "file:views/blocks/button/button.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/grid/grid.php", - "target": "file:views/blocks/grid-cell/grid-cell.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/contact-info/contact-info.php", - "target": "config:acf/group_5fd3e006e5da5.json", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/button/button.php", - "target": "config:acf/group_5f7f85a2a3e13.json", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/grid/grid.php", - "target": "config:acf/group_600f5a9e242c3.json", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/grid-cell/grid-cell.php", - "target": "config:acf/group_60106ed700da3.json", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:acf/group_5f7f85a2a3e13.json", - "target": "config:views/blocks/button/block.json", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:acf/group_600f5a9e242c3.json", - "target": "config:views/blocks/grid/block.json", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:acf/group_60106ed700da3.json", - "target": "config:views/blocks/grid-cell/block.json", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:acf/group_60bfdb328901d.json", - "target": "config:acf/group_60bfb84ae973c.json", - "type": "related", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "file:views/blocks/accordion/accordion.php", - "target": "config:acf/group_5fd3e006e5da5.json", - "type": "related", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "file:views/blocks/homepage-hero/homepage-hero.php", - "target": "file:views/blocks/homepage-hero/homepage-hero.css", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/homepage-hero/block.json", - "target": "file:views/blocks/homepage-hero/homepage-hero.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/homepage-hero/block.json", - "target": "file:views/blocks/homepage-hero/homepage-hero.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/media-text/media-text.php", - "target": "file:views/blocks/media-text/media-text.css", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/media-text/block.json", - "target": "file:views/blocks/media-text/media-text.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/media-text/block.json", - "target": "file:views/blocks/media-text/media-text.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/media-text-innerblocks/media-text-innerblocks.php", - "target": "file:views/blocks/media-text-innerblocks/media-text-innerblocks.css", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/media-text-innerblocks/block.json", - "target": "file:views/blocks/media-text-innerblocks/media-text-innerblocks.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/media-text-innerblocks/block.json", - "target": "file:views/blocks/media-text-innerblocks/media-text-innerblocks.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/page-children/page-children.php", - "target": "file:views/blocks/page-children/page-children.css", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/page-children/block.json", - "target": "file:views/blocks/page-children/page-children.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/page-children/block.json", - "target": "file:views/blocks/page-children/page-children.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/blocks/section/section.php", - "target": "file:views/blocks/section/section.css", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/section/block.json", - "target": "file:views/blocks/section/section.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:views/blocks/section/block.json", - "target": "file:views/blocks/section/section.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/components/nav-aux.php", - "target": "file:views/partials/social-media.php", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:views/components/nav-aux.php", - "target": "file:views/forms/search.php", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:views/components/nav-main.php", - "target": "file:views/components/nav-main__toggle.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/components/menu-items/index.php", - "target": "file:views/forms/search.php", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:views/components/menu-items/index.php", - "target": "file:views/components/menu-items/has-children.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:views/components/menu-items/index.php", - "target": "file:views/components/menu-items/single.php", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:acf/group_6261bc658dd80.json", - "target": "file:views/blocks/section/section.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:acf/group_645e7cf448e66.json", - "target": "file:views/blocks/media-text/media-text.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:acf/group_645e7cf448e66.json", - "target": "file:views/blocks/media-text-innerblocks/media-text-innerblocks.php", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:styles/base/index.css", - "target": "file:styles/base/global.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/base/index.css", - "target": "file:styles/base/colors.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/base/index.css", - "target": "file:styles/base/prose.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/base/index.css", - "target": "file:styles/base/typography.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/base/index.css", - "target": "file:styles/base/skip-link.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/base/index.css", - "target": "file:styles/base/misc.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/base/index.css", - "target": "file:styles/base/forms.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/base/index.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/base/break-out.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/navigation/index.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/fonts/lineicons.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/components/index.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/blocks/index.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/components/index.css", - "target": "file:styles/components/site-header.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/components/index.css", - "target": "file:styles/components/breadcrumbs.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/components/index.css", - "target": "file:styles/components/post-list.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/components/index.css", - "target": "file:styles/components/sidebar.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/components/index.css", - "target": "file:styles/components/pagination.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/components/index.css", - "target": "file:styles/components/site-footer.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/blocks/index.css", - "target": "file:styles/blocks/buttons.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/blocks/index.css", - "target": "file:styles/blocks/core.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/navigation/index.css", - "target": "file:styles/navigation/nav-functional.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/navigation/index.css", - "target": "file:styles/navigation/nav-aux.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/navigation/index.css", - "target": "file:styles/navigation/nav-main-default.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/navigation/index.css", - "target": "file:styles/navigation/nav-mobile-sliding.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/navigation/index.css", - "target": "file:styles/navigation/nav-footer.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "config:package.json", - "target": "file:styles/blocks/buttons.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:package.json", - "target": "file:styles/fonts/lineicons.css", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:composer.json", - "target": "config:.phpcs.xml", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "config:.phpcs.xml", - "target": "config:composer.json", - "type": "related", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "config:.env.example", - "target": "config:package.json", - "type": "configures", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "document:README.md", - "target": "file:styles/components/index.css", - "type": "documents", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "document:README.md", - "target": "file:styles/blocks/index.css", - "type": "documents", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "document:README.md", - "target": "file:styles/navigation/index.css", - "type": "documents", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "document:README.md", - "target": "file:styles/fonts/lineicons.css", - "type": "documents", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "document:README.md", - "target": "config:package.json", - "type": "documents", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "document:README.md", - "target": "config:composer.json", - "type": "documents", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "file:static/js/admin.js", - "target": "file:static/js/components/button.js", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:static/js/admin.js", - "target": "function:static/js/admin.js:app", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:static/js/theme.js", - "target": "file:static/js/components/button.js", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:static/js/theme.js", - "target": "file:static/js/components/backToTop.js", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:static/js/theme.js", - "target": "file:static/js/modules/GetHeaderHeight.js", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:static/js/theme.js", - "target": "file:static/js/modules/TagExternalLinks.js", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:static/js/theme.js", - "target": "file:static/js/modules/Navigation.js", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:static/js/components/backToTop.js", - "target": "class:static/js/components/backToTop.js:BackToTopButton", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:static/js/components/backToTop.js", - "target": "function:static/js/components/backToTop.js:registerBackToTopButton", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:static/js/components/backToTop.js", - "target": "function:static/js/components/backToTop.js:registerBackToTopButton", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:static/js/components/button.js", - "target": "class:static/js/components/button.js:ButtonComponent", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:static/js/components/button.js", - "target": "function:static/js/components/button.js:registerButtonComponent", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:static/js/components/button.js", - "target": "function:static/js/components/button.js:registerButtonComponent", - "type": "exports", - "direction": "forward", - "weight": 0.8 - }, - { - "source": "file:static/js/modules/GetHeaderHeight.js", - "target": "function:static/js/modules/GetHeaderHeight.js:getHeaderHeight", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:static/js/modules/Navigation.js", - "target": "class:static/js/modules/Navigation.js:Navigation", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:static/js/modules/TagExternalLinks.js", - "target": "function:static/js/modules/TagExternalLinks.js:tagExternalLinks", - "type": "contains", - "direction": "forward", - "weight": 1 - }, - { - "source": "file:bin/.build.js", - "target": "file:bin/.utils.js", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:bin/.watch.js", - "target": "file:bin/.utils.js", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "file:tests/site-a11y.spec.js", - "target": "file:playwright.config.js", - "type": "depends_on", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "pipeline:.github/workflows/wpengine.yml", - "target": "file:bin/.build.js", - "type": "triggers", - "direction": "forward", - "weight": 0.6 - }, - { - "source": "pipeline:.github/workflows/phpcs.yml", - "type": "triggers", - "target": "pipeline:.github/workflows/wpengine.yml", - "direction": "forward", - "weight": 0.5 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/navigation/index.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/fonts/lineicons.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/components/index.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - }, - { - "source": "file:styles/theme.css", - "target": "file:styles/blocks/index.css", - "type": "imports", - "direction": "forward", - "weight": 0.7 - } - ], - "layers": [ - { - "id": "layer:entry", - "name": "Entry", - "description": "Theme bootstrap and WordPress entry points that initialize the theme and declare its identity to WordPress", - "nodeIds": [ - "file:functions.php", - "file:style.css" - ] - }, - { - "id": "layer:ui", - "name": "UI Templates and Components", - "description": "WordPress template hierarchy files, Gutenberg blocks (with their PHP templates, CSS, and block.json manifests), reusable components, navigation partials, forms, and SVG icons that render the front-end presentation layer", - "nodeIds": [ - "file:header.php", - "file:footer.php", - "file:front-page.php", - "file:index.php", - "file:page.php", - "file:search.php", - "file:single.php", - "file:404.php", - "file:sidebar.php", - "file:sidebar-page.php", - "file:views/blocks/accordion/accordion.php", - "file:views/blocks/accordion/accordion.css", - "config:views/blocks/accordion/block.json", - "file:views/blocks/boilerplate/boilerplate.php", - "file:views/blocks/boilerplate/boilerplate.css", - "config:views/blocks/boilerplate/block.json", - "file:views/blocks/button/button.php", - "config:views/blocks/button/block.json", - "file:views/blocks/buttons/buttons.php", - "config:views/blocks/buttons/block.json", - "file:views/blocks/contact-info/contact-info.php", - "file:views/blocks/contact-info/contact-info.css", - "config:views/blocks/contact-info/block.json", - "file:views/blocks/grid/grid.php", - "file:views/blocks/grid/grid.css", - "config:views/blocks/grid/block.json", - "file:views/blocks/grid-cell/grid-cell.php", - "file:views/blocks/grid-cell/grid-cell.css", - "config:views/blocks/grid-cell/block.json", - "file:views/blocks/homepage-hero/homepage-hero.php", - "file:views/blocks/homepage-hero/homepage-hero.css", - "config:views/blocks/homepage-hero/block.json", - "file:views/blocks/media-text/media-text.php", - "file:views/blocks/media-text/media-text.css", - "config:views/blocks/media-text/block.json", - "file:views/blocks/media-text-innerblocks/media-text-innerblocks.php", - "file:views/blocks/media-text-innerblocks/media-text-innerblocks.css", - "config:views/blocks/media-text-innerblocks/block.json", - "file:views/blocks/page-children/page-children.php", - "file:views/blocks/page-children/page-children.css", - "config:views/blocks/page-children/block.json", - "file:views/blocks/section/section.php", - "file:views/blocks/section/section.css", - "config:views/blocks/section/block.json", - "file:views/components/nav-aux.php", - "file:views/components/nav-main.php", - "file:views/components/nav-main__toggle.php", - "file:views/components/menu-items/has-children.php", - "file:views/components/menu-items/index.php", - "file:views/components/menu-items/single.php", - "file:views/forms/search.php", - "file:views/partials/page-hero.php", - "file:views/partials/social-media.php", - "file:views/icons/facebook.php", - "file:views/icons/heart.php", - "file:views/icons/instagram.php", - "file:views/icons/linkedin.php", - "file:views/icons/menu.php", - "file:views/icons/pinterest.php", - "file:views/icons/search.php", - "file:views/icons/shop.php", - "file:views/icons/shopping-basket.php", - "file:views/icons/twitter-.php", - "file:views/icons/twitter.php", - "file:views/icons/user.php", - "file:views/icons/youtube.php" - ] - }, - { - "id": "layer:service", - "name": "Service Layer", - "description": "Theme service classes and utility functions providing core functionality: asset enqueueing, navigation menus, breadcrumbs, ACF configuration, custom post types, search features, WordPress hooks, and helper functions", - "nodeIds": [ - "file:lib/activation.php", - "file:lib/class-acf.php", - "file:lib/class-breadcrumbs.php", - "file:lib/class-enqueue.php", - "file:lib/class-menuitems.php", - "file:lib/class-resources.php", - "file:lib/extras.php", - "file:lib/helpers.php", - "file:lib/hooks.php", - "file:lib/search-features.php", - "file:lib/show-template.php" - ] - }, - { - "id": "layer:styling", - "name": "Styling", - "description": "CSS stylesheets organized into base reset/typography, component-specific styles, block styles, navigation styles, backend/editor styles, and the main theme.css entry point that composes them all via Tailwind CSS directives", - "nodeIds": [ - "file:styles/base/break-out.css", - "file:styles/base/colors.css", - "file:styles/base/forms.css", - "file:styles/base/global.css", - "file:styles/base/index.css", - "file:styles/base/misc.css", - "file:styles/base/prose.css", - "file:styles/base/skip-link.css", - "file:styles/base/typography.css", - "file:styles/backend/admin.css", - "file:styles/backend/editor.css", - "file:styles/theme.css", - "file:styles/components/breadcrumbs.css", - "file:styles/components/index.css", - "file:styles/components/pagination.css", - "file:styles/components/post-list.css", - "file:styles/components/sidebar.css", - "file:styles/components/site-footer.css", - "file:styles/components/site-header.css", - "file:styles/blocks/buttons.css", - "file:styles/blocks/core.css", - "file:styles/blocks/index.css", - "file:styles/navigation/index.css", - "file:styles/navigation/nav-aux.css", - "file:styles/navigation/nav-footer.css", - "file:styles/navigation/nav-functional.css", - "file:styles/navigation/nav-main-default.css", - "file:styles/navigation/nav-main-mega.css", - "file:styles/navigation/nav-mobile-accordion.css", - "file:styles/navigation/nav-mobile-sliding.css", - "file:styles/fonts/lineicons.css" - ] - }, - { - "id": "layer:client-scripts", - "name": "Client Scripts", - "description": "Frontend JavaScript modules including the theme entry point, navigation toggle, header height detection, external link tagging, back-to-top button, and admin editor scripts", - "nodeIds": [ - "file:static/js/admin.js", - "file:static/js/theme.js", - "file:static/js/components/backToTop.js", - "file:static/js/components/button.js", - "file:static/js/modules/GetHeaderHeight.js", - "file:static/js/modules/Navigation.js", - "file:static/js/modules/TagExternalLinks.js" - ] - }, - { - "id": "layer:data", - "name": "Data Layer", - "description": "ACF field group JSON schemas that define custom data structures for Gutenberg blocks, enabling version-controlled field group configuration for Advanced Custom Fields", - "nodeIds": [ - "config:acf/group_5f7f85a2a3e13.json", - "config:acf/group_5fd3e006e5da5.json", - "config:acf/group_600f5a9e242c3.json", - "config:acf/group_60106ed700da3.json", - "config:acf/group_60bfb84ae973c.json", - "config:acf/group_60bfdb328901d.json", - "config:acf/group_6261bc658dd80.json", - "config:acf/group_645e51f721207.json", - "config:acf/group_645e7cf448e66.json" - ] - }, - { - "id": "layer:infrastructure", - "name": "Infrastructure", - "description": "Build and development tooling, CI/CD pipelines, project configuration, test infrastructure, content fixtures, and documentation that support the development and deployment workflow", - "nodeIds": [ - "file:bin/.build.js", - "file:bin/.utils.js", - "file:bin/.watch.js", - "pipeline:.github/workflows/phpcs.yml", - "pipeline:.github/workflows/todos.yml", - "pipeline:.github/workflows/wpengine.yml", - "config:package.json", - "config:composer.json", - "config:.phpcs.xml", - "config:.env.example", - "config:theme.json", - "config:content/basic-wp-test-content.xml", - "file:whitelist.php", - "file:playwright.config.js", - "file:tests/site-a11y.spec.js", - "document:README.md" - ] - } - ], - "tour": [ - { - "order": 1, - "title": "Project Overview", - "description": "Start by reading the README to understand VDI-Starter-v5's purpose: a minimal WordPress theme starter built for custom theme development using Tailwind CSS and ACF blocks. The README outlines the directory structure, core files, development workflows, and coding standards -- providing the map for the rest of this tour.", - "nodeIds": [ - "document:README.md" - ] - }, - { - "order": 2, - "title": "Theme Bootstrap", - "description": "The functions.php file is the theme's entry point and central hub -- it loads every lib/ module via glob and registers ACF custom Gutenberg blocks on the WordPress init hook. Understanding this file reveals how the entire theme wires together, since every service class and utility is pulled in from here. style.css declares the theme's identity to WordPress.", - "nodeIds": [ - "file:functions.php", - "file:style.css" - ] - }, - { - "order": 3, - "title": "Service Layer Core", - "description": "The lib/ directory contains the theme's service classes that provide foundational functionality. class-enqueue.php manages all frontend and admin asset loading with cache-busting, class-menuitems.php resolves WordPress nav menus into renderable item trees, class-breadcrumbs.php generates context-aware breadcrumb trails with Schema.org markup, and class-acf.php configures ACF JSON load/save paths. These classes are the engine the rest of the theme depends on.", - "nodeIds": [ - "file:lib/class-enqueue.php", - "file:lib/class-menuitems.php", - "file:lib/class-breadcrumbs.php", - "file:lib/class-acf.php" - ] - }, - { - "order": 4, - "title": "Hooks and Helpers", - "description": "Building on the service classes, hooks.php wires theme features into WordPress via action and filter hooks -- registering menus, widget areas, SEO title filters, and a comprehensive WP head cleanup. Meanwhile helpers.php provides the utility functions used throughout templates, including ACF dot-notation field access, block wrapper attributes, and custom excerpts. Together these files form the glue between WordPress APIs and the theme's presentation layer.", - "nodeIds": [ - "file:lib/hooks.php", - "file:lib/helpers.php" - ] - }, - { - "order": 5, - "title": "Template Hierarchy", - "description": "WordPress uses a template hierarchy to decide which PHP file renders each URL. The theme's templates follow this convention: header.php and footer.php frame every page, front-page.php handles the homepage, index.php renders blog listings, single.php displays individual posts, page.php renders static pages, and search.php shows search results. Each template composes the service layer from Steps 3-4 with reusable components.", - "nodeIds": [ - "file:header.php", - "file:footer.php", - "file:front-page.php", - "file:index.php", - "file:single.php" - ] - }, - { - "order": 6, - "title": "Navigation Components", - "description": "The navigation system is built from composable partials: nav-aux.php renders the auxiliary top-bar menu with social links and search, nav-main.php renders the primary menu with a mobile toggle, and the menu-items/ directory provides recursive templates for rendering navigation items at multiple depths. The MenuItems class from Step 3 feeds structured data into these templates.", - "nodeIds": [ - "file:views/components/nav-aux.php", - "file:views/components/nav-main.php", - "file:views/components/menu-items/index.php", - "file:views/components/menu-items/has-children.php", - "file:views/components/menu-items/single.php" - ] - }, - { - "order": 7, - "title": "ACF Block Architecture", - "description": "The theme's content blocks follow a consistent pattern: each block has a block.json manifest (registration config), a PHP template (rendering logic), and a CSS file (scoped styles). The Section block wraps content with background and layout options, the Grid and Grid-Cell blocks provide responsive column layouts, and the Button/Buttons blocks create styled call-to-action elements. This pattern -- manifest plus template plus styles -- is the blueprint for creating new blocks.", - "nodeIds": [ - "file:views/blocks/section/section.php", - "config:views/blocks/section/block.json", - "file:views/blocks/grid/grid.php", - "config:views/blocks/grid/block.json", - "file:views/blocks/button/button.php" - ] - }, - { - "order": 8, - "title": "ACF Field Definitions", - "description": "Each ACF block is backed by a JSON field group in the acf/ directory that defines the editor UI for content editors. The Global Fields options page (group_5fd3e006e5da5) provides site-wide contact info, social media, and footer settings, while block-specific groups like the Section fields (group_6261bc658dd80) and Grid fields (group_600f5a9e242c3) define per-block editing interfaces. These JSON schemas are version controlled alongside the block templates.", - "nodeIds": [ - "config:acf/group_5fd3e006e5da5.json", - "config:acf/group_6261bc658dd80.json", - "config:acf/group_600f5a9e242c3.json" - ] - }, - { - "order": 9, - "title": "CSS Architecture", - "description": "The styling system is organized as a layered cascade: theme.css imports base styles (typography, colors, forms), navigation styles (functional, default, sliding, accordion), component styles (header, footer, breadcrumbs, pagination), and block styles (buttons, core alignment). The base/index.css barrel file loads all foundational partials in order, while theme.json configures the WordPress block editor's color palette, font families, and spacing units.", - "nodeIds": [ - "file:styles/theme.css", - "file:styles/base/index.css", - "file:styles/base/typography.css", - "file:styles/base/colors.css", - "config:theme.json" - ] - }, - { - "order": 10, - "title": "Client-Side JavaScript", - "description": "The frontend JavaScript entry point (theme.js) imports and initializes all interactive modules: Navigation.js handles mobile menu toggling with keyboard accessibility and a sliding viewport pattern, GetHeaderHeight.js sets a CSS custom property for sticky header offset, TagExternalLinks.js enhances external links with accessibility attributes, and backToTop.js provides a scroll-aware button component. The ButtonComponent web element is registered for both frontend and admin contexts.", - "nodeIds": [ - "file:static/js/theme.js", - "file:static/js/modules/Navigation.js", - "file:static/js/components/backToTop.js", - "file:static/js/components/button.js" - ] - }, - { - "order": 11, - "title": "Project Configuration", - "description": "The build pipeline is defined in package.json with Tailwind CSS v4 compilation, BrowserSync watch mode, and Playwright testing. The .env.example provides local development URL and BrowserSync port settings, while composer.json configures PHP_CodeSniffer with WordPress coding standards. Together these files establish the development workflow from local editing through CSS compilation to deployment.", - "nodeIds": [ - "config:package.json", - "config:composer.json", - "config:.env.example" - ] - }, - { - "order": 12, - "title": "CI/CD and Deployment", - "description": "GitHub Actions pipelines automate quality and deployment: phpcs.yml runs PHP CodeSniffer checks on pull requests, wpengine.yml builds the theme (installing Composer and npm dependencies, running the Tailwind build) and deploys the artifact to WP Engine via rsync, and todos.yml syncs code TODO comments to GitHub Issues. The build scripts in bin/ handle Tailwind compilation and BrowserSync watching.", - "nodeIds": [ - "pipeline:.github/workflows/wpengine.yml", - "pipeline:.github/workflows/phpcs.yml", - "file:bin/.build.js", - "file:bin/.watch.js" - ] - } - ] -} \ No newline at end of file diff --git a/.understand-anything/meta.json b/.understand-anything/meta.json deleted file mode 100644 index f5a2232..0000000 --- a/.understand-anything/meta.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "lastAnalyzedAt": "2026-05-03T17:58:02.312Z", - "gitCommitHash": "7a578c67c0c0eec7abbe4ad40a01db0e4c67aeb7", - "version": "1.0.0", - "analyzedFiles": 142 -} \ No newline at end of file diff --git a/404.php b/404.php index cca68d1..8270a8f 100644 --- a/404.php +++ b/404.php @@ -2,11 +2,11 @@ /** * Page Not Found * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; get_header(); ?> diff --git a/README.md b/README.md index f479a47..bc55a0a 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,13 @@ -# VDI WordPress Theme Starter v5 +# SoloFrame Evo -VDI WordPress Theme 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. +SoloFrame Evo 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. -Repo: [https://github.com/Vincent-Design-Inc/VDI-Starter-v5](https://github.com/Vincent-Design-Inc/VDI-Starter-v5) -AC Bug/Issue Tracking: [https://next-app.activecollab.com/119590/projects/4553?modal=Task-98192-4553](https://next-app.activecollab.com/119590/projects/4553?modal=Task-98192-4553) +Repo: [https://github.com/ksolomon/SoloFrame-Evo](https://github.com/ksolomon/SoloFrame-Evo) ## Key Features - Tailwind CSS v4 (CSS-first configuration, no `tailwind.config.js`) -- Namespaced PHP (`BasicWP` namespace) for isolation +- Namespaced PHP (`SoloFrameEvo` namespace) for isolation - Built-in support for ACF blocks with auto-registration - Fast development workflow with BrowserSync live reload - WordPress 6.5+ script modules for modern JS loading @@ -17,7 +16,7 @@ AC Bug/Issue Tracking: [https://next-app.activecollab.com/119590/projects/4553?m ## Documentation | Guide | Description | -|-------|-------------| +| ------- | ------------- | | [Getting Started](docs/getting-started.md) | Setup from zero, local WordPress, environment config, troubleshooting | | [Architecture](docs/architecture.md) | Bootstrap flow, layers, namespace conventions, hooks, enqueue system, theme.json | | [Creating Blocks](docs/creating-blocks.md) | Step-by-step ACF block creation tutorial with examples | @@ -25,26 +24,26 @@ AC Bug/Issue Tracking: [https://next-app.activecollab.com/119590/projects/4553?m ## Project Structure -``` -VDI-Starter-v5/ -├── acf/ # ACF field group JSON definitions +```plain +SoloFrame-Evo/ +├── acf/ # ACF/SCF field group JSON definitions ├── bin/ # Build scripts (.build.js, .watch.js, .utils.js) ├── content/ # Sample page and post content for testing -├── docs/ # Documentation guides +├── docs/ # Documentation guides ├── lib/ # PHP library files │ ├── activation.php # Theme activation handler (plugins, pages, settings) -│ ├── class-acf.php # ACF integration (JSON sync paths) +│ ├── class-acf.php # ACF/SCF integration (JSON sync paths) │ ├── class-breadcrumbs.php # Breadcrumb generation with Schema.org markup │ ├── class-enqueue.php # Assets enqueuing (CSS, JS, fonts) │ ├── class-menuitems.php # Navigation menu builder -│ ├── class-resources.php # Custom Resources post type +│ ├── class-resources.php # Custom Resources post type │ ├── extras.php # Sidebar, page header, Owner role, embed wrapper │ ├── helpers.php # Utility functions and globals ($theme, $views) │ ├── hooks.php # WordPress hooks, filters, and cleanup │ ├── search-features.php # Enhanced search functionality │ └── show-template.php # Debug: shows active template in HTML comment ├── static/ -│ ├── dist/ # Compiled assets (theme.css) +│ ├── dist/ # Compiled assets (theme.css) │ └── js/ # JavaScript files │ ├── components/ # JS custom elements (button, backToTop) │ ├── modules/ # JS theme modules (Navigation, GetHeaderHeight, TagExternalLinks) @@ -58,10 +57,10 @@ VDI-Starter-v5/ │ ├── fonts/ # Icon font styles (Lineicons) │ ├── navigation/ # Navigation styles (default, mega, accordion, sliding) │ └── theme.css # Main CSS entry point (Tailwind + imports) -├── tests/ # Automated Playwright tests +├── tests/ # Automated Playwright tests │ └── site-a11y.spec.js # Site Accessibility tests -├── views/ # Template views -│ ├── blocks/ # Custom ACF blocks (accordion, button, grid, section, etc.) +├── views/ # Template views +│ ├── blocks/ # Custom ACF/SCF blocks (accordion, button, grid, section, etc.) │ ├── icons/ # SVG icon templates │ ├── forms/ # Form templates (search) │ └── partials/ # Reusable template parts (page-hero, social-media) @@ -86,18 +85,18 @@ VDI-Starter-v5/ The project uses several naming conventions. Here's how they relate: | Convention | Value | Where Used | -|-----------|-------|-----------| -| PHP namespace | `BasicWP` | All PHP files | -| Text domain | `basicwp` | WordPress translations | -| Block category | `vdi-blocks` | Groups blocks in the editor | -| Script module IDs | `basicwp-theme`, `basicwp-button`, `basicwp-admin` | JS module registration | -| WP Engine folder | `vdi-v5` | Deployment target | -| Theme directory | `VDI-Starter-v5` | Git repo name | +| ----------- | ------- | ----------- | +| PHP namespace | `SoloFrameEvo` | All PHP files | +| Text domain | `sf-evo` | WordPress translations | +| Block category | `sf-blocks` | Groups blocks in the editor | +| Script module IDs | `sf-evo-theme`, `sf-evo-button`, `sf-evo-admin` | JS module registration | +| WP Engine folder | `>` | Deployment target | +| Theme directory | `SoloFrame-Evo` | Git repo name | ## Included Blocks | Block | Purpose | -|-------|---------| +| ------- | --------- | | Accordion | Collapsible content sections | | Buttons | Container for Button blocks | | Button | Configurable button element (`` custom element) | @@ -124,7 +123,7 @@ The project uses several naming conventions. Here's how they relate: ``` 4. Copy `.env.example` to `.env` and set: - - `LOCALHOST_URL`: Your local development URL (e.g., `http://localhost:1000`) + - `LOCALHOST_URL`: Your local development URL (e.g., `http://site-dev.local`) - `BROWSERSYNC_PORT`: Port for BrowserSync (default: `5000`) 5. Run the initial build: diff --git a/docs/architecture.md b/docs/architecture.md index e7dcf07..409c4a3 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,44 +1,61 @@ # Architecture -A deep dive into how VDI-Starter-v5 is organized, how it boots, and the conventions it uses. +A deep dive into how SoloFrame Evo is organized, how it boots, and the conventions it uses. ## Table of Contents -- [Bootstrap Flow](#bootstrap-flow) -- [Architectural Layers](#architectural-layers) -- [Namespace Conventions](#namespace-conventions) -- [Global Variables](#global-variables) -- [WordPress Hooks Cleanup](#wordpress-hooks-cleanup) -- [Enqueue System](#enqueue-system) -- [theme.json Design System](#themjson-design-system) +- [Architecture](#architecture) + - [Table of Contents](#table-of-contents) + - [Bootstrap Flow](#bootstrap-flow) + - [Architectural Layers](#architectural-layers) + - [1. Entry Layer](#1-entry-layer) + - [2. Service Layer](#2-service-layer) + - [3. UI Templates and Components](#3-ui-templates-and-components) + - [4. Styling](#4-styling) + - [5. Client Scripts](#5-client-scripts) + - [6. Data Layer](#6-data-layer) + - [7. Infrastructure](#7-infrastructure) + - [Namespace Conventions](#namespace-conventions) + - [Global Variables](#global-variables) + - [WordPress Hooks Cleanup](#wordpress-hooks-cleanup) + - [Enqueue System](#enqueue-system) + - [Frontend (`enqFEAssets()`)](#frontend-enqfeassets) + - [Admin (`enqBEAssets()`)](#admin-enqbeassets) + - [Block Editor (`enqEditorAssets()`)](#block-editor-enqeditorassets) + - [theme.json Design System](#themejson-design-system) + - [Colors](#colors) + - [Typography](#typography) + - [Layout](#layout) + - [Spacing](#spacing) + - [Global Styles](#global-styles) ## Bootstrap Flow -When WordPress loads a theme, it starts with `style.css` (for theme metadata) and `functions.php` (for logic). Here's exactly what happens in VDI-Starter-v5: +When WordPress loads a theme, it starts with `style.css` (for theme metadata) and `functions.php` (for logic). Here's exactly what happens in SoloFrame Evo: -``` +```plain WordPress loads the theme │ ├─ style.css → Theme declaration (name, description, version) │ └─ functions.php → Entry point │ - ├─ namespace BasicWP + ├─ namespace SoloFrameEvo │ - ├─ glob(__DIR__ . '/lib/*.php') → Autoloads every PHP file in lib/ - │ ├─ activation.php → Theme activation handler (runs once) - │ ├─ class-acf.php → ACF JSON sync paths - │ ├─ class-breadcrumbs.php → Breadcrumb generation - │ ├─ class-enqueue.php → Asset loading (CSS, JS, fonts) - │ ├─ class-menuitems.php → Nav menu rendering - │ ├─ class-resources.php → Custom post type - │ ├─ extras.php → Sidebar, page header, Owner role, etc. - │ ├─ helpers.php → Utility functions, globals, ACF options page - │ ├─ hooks.php → WordPress hooks, cleanup, SVG support - │ ├─ search-features.php → Enhanced search - │ └─ show-template.php → Debug template path display + ├─ glob(__DIR__ . '/lib/*.php') → Autoloads every PHP file in lib/ + │ ├─ activation.php → Theme activation handler (runs once) + │ ├─ class-acf.php → ACF JSON sync paths + │ ├─ class-breadcrumbs.php → Breadcrumb generation + │ ├─ class-enqueue.php → Asset loading (CSS, JS, fonts) + │ ├─ class-menuitems.php → Nav menu rendering + │ ├─ class-resources.php → Custom post type + │ ├─ extras.php → Sidebar, page header, Owner role, etc. + │ ├─ helpers.php → Utility functions, globals, ACF options page + │ ├─ hooks.php → WordPress hooks, cleanup, SVG support + │ ├─ search-features.php → Enhanced search + │ └─ show-template.php → Debug template path display │ - └─ regACFBlocks() → Registers ACF blocks (init hook, priority 5) + └─ regACFBlocks() → Registers ACF blocks (init hook, priority 5) └─ Scans views/blocks/*/block.json (skips 'boilerplate') ``` @@ -55,7 +72,7 @@ The theme is organized into seven distinct layers, each with a clear responsibil The two files WordPress needs to recognize the theme: | File | Purpose | -|------|---------| +| ------ | --------- | | `functions.php` | Autoloads `lib/*.php`, registers ACF blocks on `init` | | `style.css` | Theme declaration — name, description, version, author | @@ -66,7 +83,7 @@ The two files WordPress needs to recognize the theme: PHP classes and utility functions in `lib/` that provide core functionality: | File | Class/Function | Purpose | -|------|---------------|---------| +| ------ | --------------- | --------- | | `class-enqueue.php` | `Enqueue` | Loads all frontend CSS, JS, and fonts with cache-busting | | `class-menuitems.php` | `MenuItems` | Resolves WordPress nav menus into renderable item trees | | `class-breadcrumbs.php` | `Breadcrumbs` | Context-aware breadcrumb trails with Schema.org markup | @@ -86,7 +103,7 @@ WordPress template hierarchy files, ACF blocks, reusable components, and icons: **Template Hierarchy:** | File | WordPress Template For | -|------|----------------------| +| ------ | ---------------------- | | `front-page.php` | The front page | | `index.php` | Blog posts listing (fallback for all) | | `single.php` | Individual posts | @@ -103,7 +120,7 @@ WordPress template hierarchy files, ACF blocks, reusable components, and icons: Each block follows a consistent three-file pattern: `block.json` (registration) + `{name}.php` (template) + `{name}.css` (styles). | Block | Purpose | -|-------|---------| +| ------- | --------- | | `accordion` | Collapsible content sections | | `boilerplate` | Starting template for new blocks (not registered) | | `button` | Single configurable button element | @@ -120,7 +137,7 @@ Each block follows a consistent three-file pattern: `block.json` (registration) **Components (in `views/components/`):** | Component | Purpose | -|-----------|---------| +| ----------- | --------- | | `nav-aux.php` | Auxiliary navigation bar (social links + search) | | `nav-main.php` | Primary navigation menu | | `nav-main__toggle.php` | Mobile menu toggle button | @@ -129,7 +146,7 @@ Each block follows a consistent three-file pattern: `block.json` (registration) **Partials (in `views/partials/`):** | Partial | Purpose | -|---------|---------| +| --------- | --------- | | `page-hero.php` | Page hero section | | `social-media.php` | Social media links | @@ -141,38 +158,38 @@ SVG icon partials for Facebook, Instagram, LinkedIn, Pinterest, Twitter, YouTube CSS is organized as a layered cascade, managed through Tailwind CSS v4: -``` -styles/theme.css ← Entry point (imports everything below) -├── @import "tailwindcss" ← Tailwind CSS v4 base -├── @import "./base/index.css" ← Base styles barrel file -│ ├── break-out.css ← Container break-out utilities -│ ├── colors.css ← Color custom properties -│ ├── forms.css ← Form element styles -│ ├── global.css ← Global resets and base styles -│ ├── misc.css ← Miscellaneous utilities -│ ├── prose.css ← Prose/typography styles -│ ├── skip-link.css ← Accessibility skip link -│ └── typography.css ← Typography scale and fonts -├── @import "./navigation/index.css" ← Navigation barrel file -│ ├── nav-aux.css ← Auxiliary nav -│ ├── nav-footer.css ← Footer nav -│ ├── nav-functional.css ← Functional nav styles -│ ├── nav-main-default.css ← Default main nav -│ ├── nav-main-mega.css ← Mega menu nav -│ ├── nav-mobile-accordion.css ← Accordion mobile nav -│ └── nav-mobile-sliding.css ← Sliding mobile nav -├── @import "./fonts/lineicons.css" ← Icon font (600+ glyphs) -├── @import "./base/break-out.css" ← Break-out utilities (loaded after nav) -├── @import "./components/index.css" ← Components barrel file -│ ├── breadcrumbs.css ← Breadcrumbs -│ ├── pagination.css ← Pagination -│ ├── post-list.css ← Post listings -│ ├── sidebar.css ← Sidebar -│ ├── site-footer.css ← Footer -│ └── site-header.css ← Header -└── @import "./blocks/index.css" ← Block styles barrel file - ├── buttons.css ← Button styles with CSS custom properties - └── core.css ← Core block overrides +```plain +styles/theme.css ← Entry point (imports everything below) +├── @import "tailwindcss" ← Tailwind CSS v4 base +├── @import "./base/index.css" ← Base styles barrel file +│ ├── break-out.css ← Container break-out utilities +│ ├── colors.css ← Color custom properties +│ ├── forms.css ← Form element styles +│ ├── global.css ← Global resets and base styles +│ ├── misc.css ← Miscellaneous utilities +│ ├── prose.css ← Prose/typography styles +│ ├── skip-link.css ← Accessibility skip link +│ └── typography.css ← Typography scale and fonts +├── @import "./navigation/index.css" ← Navigation barrel file +│ ├── nav-aux.css ← Auxiliary nav +│ ├── nav-footer.css ← Footer nav +│ ├── nav-functional.css ← Functional nav styles +│ ├── nav-main-default.css ← Default main nav +│ ├── nav-main-mega.css ← Mega menu nav +│ ├── nav-mobile-accordion.css ← Accordion mobile nav +│ └── nav-mobile-sliding.css ← Sliding mobile nav +├── @import "./fonts/lineicons.css" ← Icon font (600+ glyphs) +├── @import "./base/break-out.css" ← Break-out utilities (loaded after nav) +├── @import "./components/index.css" ← Components barrel file +│ ├── breadcrumbs.css ← Breadcrumbs +│ ├── pagination.css ← Pagination +│ ├── post-list.css ← Post listings +│ ├── sidebar.css ← Sidebar +│ ├── site-footer.css ← Footer +│ └── site-header.css ← Header +└── @import "./blocks/index.css" ← Block styles barrel file + ├── buttons.css ← Button styles with CSS custom properties + └── core.css ← Core block overrides ``` **Why this structure?** The barrel files (`index.css`) make it easy to add or remove stylesheets without modifying `theme.css`. Navigation styles are grouped because you typically only use one variant (default vs mega menu, accordion vs sliding mobile). Block-specific CSS lives alongside each block in `views/blocks/` and is auto-loaded by WordPress when the block renders. @@ -183,19 +200,19 @@ styles/theme.css ← Entry point (imports everything below) JavaScript modules loaded via WordPress's `wp_enqueue_script_module()` API (requires WordPress 6.5+): -``` +```plain static/js/theme.js (entry point for frontend) -├── Navigation.js → Mobile menu, sliding viewport, keyboard nav -├── backToTop.js → BackToTopButton custom element -├── button.js → ButtonComponent custom element () -├── GetHeaderHeight.js → Sets --header-height CSS variable +├── Navigation.js → Mobile menu, sliding viewport, keyboard nav +├── backToTop.js → BackToTopButton custom element +├── button.js → ButtonComponent custom element () +├── GetHeaderHeight.js → Sets --header-height CSS variable └── TagExternalLinks.js → Adds target="_blank" rel="noopener" to external links static/js/admin.js (entry point for editor) -└── button.js → ButtonComponent for editor context +└── button.js → ButtonComponent for editor context ``` -**How script modules work:** WordPress's `wp_enqueue_script_module()` creates proper ES module dependencies. The `Enqueue` class registers `basicwp-theme` (theme.js) as a root module, and `basicwp-button` (button.js) declares a dependency on it. This means button.js won't load until theme.js has loaded — no more manual script ordering. +**How script modules work:** WordPress's `wp_enqueue_script_module()` creates proper ES module dependencies. The `Enqueue` class registers `sf-evo-theme` (theme.js) as a root module, and `sf-evo-button` (button.js) declares a dependency on it. This means button.js won't load until theme.js has loaded — no more manual script ordering. **Passive event listener polyfill:** `theme.js` includes a polyfill that makes scroll, touch, and mouse event listeners passive by default. This improves scrolling performance without requiring `addEventListener(..., { passive: true })` on every listener. @@ -203,10 +220,10 @@ static/js/admin.js (entry point for editor) ### 6. Data Layer -ACF field group JSON files in the `acf/` directory: +SCF/ACF field group JSON files in the `acf/` directory: | File | Block/Feature | -|------|-------------| +| ------ | ------------- | | `group_5f7f85a2a3e13.json` | Accordion block fields | | `group_5fd3e006e5da5.json` | Global Fields (site-wide contact, social, footer settings) | | `group_600f5a9e242c3.json` | Grid block fields | @@ -218,6 +235,7 @@ ACF field group JSON files in the `acf/` directory: | `group_645e7cf448e66.json` | Contact Info block fields | **Why JSON sync?** The `ACF` class in `class-acf.php` sets custom save/load paths so that field groups created in the WordPress admin are automatically saved as JSON files. This means: + - Field group configurations are version-controlled in Git - Field groups survive database resets - Multiple environments stay in sync @@ -228,7 +246,7 @@ ACF field group JSON files in the `acf/` directory: Build, CI/CD, and configuration files that support development and deployment: | File | Purpose | -|------|---------| +| ------ | --------- | | `bin/.build.js` | Production build script — compiles Tailwind CSS with `--optimize` | | `bin/.watch.js` | Development server — BrowserSync with live reload | | `bin/.utils.js` | Shared utilities for build scripts (`tailwindToCSS`, debounce) | @@ -248,15 +266,13 @@ Build, CI/CD, and configuration files that support development and deployment: The project uses several naming conventions that can be confusing at first: | Convention | Value | Where Used | -|-----------|-------|-----------| -| PHP namespace | `BasicWP` | All PHP files use `namespace BasicWP;` | -| Text domain | `basicwp` | WordPress translation functions (`__()` , `_e()`) | -| Block category | `vdi-blocks` | Groups custom blocks in the editor (defined in `helpers.php::blockCategories()`) | -| Script module IDs | `basicwp-theme`, `basicwp-button`, `basicwp-admin` | JavaScript module registration in `class-enqueue.php` | -| WP Engine folder | `vdi-v5` | Deployment target in `.github/workflows/wpengine.yml` | -| Git repo name | `VDI-Starter-v5` | The repository and theme directory name | - -**The story:** "VDI" is Vincent Design Inc., the agency. "BasicWP" was the original internal code name. "vdi-blocks" and "vdi-v5" are deployment-facing names that align with the client's branding. They all refer to the same theme — just used in different contexts. +| ----------- | ------- | ----------- | +| PHP namespace | `SoloFrameEvo` | All PHP files use `namespace SoloFrameEvo;` | +| Text domain | `sf-evo` | WordPress translation functions (`__()` , `_e()`) | +| Block category | `sf-blocks` | Groups custom blocks in the editor (defined in `helpers.php::blockCategories()`) | +| Script module IDs | `sf-evo-theme`, `sf-evo-button`, `sf-evo-admin` | JavaScript module registration in `class-enqueue.php` | +| WP Engine folder | `soloframe-evo` | Deployment target in `.github/workflows/wpengine.yml` | +| Git repo name | `SoloFrame-Evo` | The repository and theme directory name | ## Global Variables @@ -264,13 +280,14 @@ Two global variables are defined in `helpers.php`: ```php global $theme, $views; -$theme = get_template_directory(); // e.g., /var/www/wp-content/themes/VDI-Starter-v5 -$views = $theme . '/views'; // e.g., /var/www/wp-content/themes/VDI-Starter-v5/views +$theme = get_template_directory(); // e.g., /var/www/wp-content/themes/SoloFrame Evo +$views = $theme . '/views'; // e.g., /var/www/wp-content/themes/SoloFrame Evo/views ``` **`$theme`** — Absolute path to the theme directory. Used when including files that need the full server path. **`$views`** — Absolute path to the views directory. Used by `MenuItems::render()` to include navigation templates: + ```php include $views . '/components/menu-items/index.php'; ``` @@ -284,7 +301,7 @@ The `init()` function in `hooks.php` runs on every page load at priority 1. It p **What gets removed:** | What | Why | -|------|-----| +| ------ | ----- | | Emoji detection scripts & styles | Most sites don't use WordPress emojis; they add ~10KB to every page | | `wp-block-library` styles | Theme provides its own block styles; core defaults add ~100KB | | `global-styles` & `core-block-styles` | Theme overrides these via `theme.json` and custom CSS | @@ -304,7 +321,7 @@ The `init()` function in `hooks.php` runs on every page load at priority 1. It p **What gets added:** | Feature | Why | -|---------|-----| +| --------- | ----- | | `post-thumbnails` | Featured image support | | `title-tag` | WordPress manages `` tag | | `html5` (caption, comment-form, comment-list, gallery, search-form, script, style) | Modern HTML5 markup | @@ -323,32 +340,32 @@ The `Enqueue` class (in `class-enqueue.php`) manages all asset loading: ### Frontend (`enqFEAssets()`) | Asset | Method | Notes | -|-------|--------|-------| +| ------- | -------- | ------- | | `static/dist/theme.css` | `wp_enqueue_style()` | Compiled Tailwind CSS, cache-busted with `filemtime()` | | Raleway font | `wp_enqueue_style()` | Google Fonts with `preconnect` hint | -| `basicwp-theme` (theme.js) | `wp_enqueue_script_module()` | Frontend entry point | -| `basicwp-button` (button.js) | `wp_enqueue_script_module()` | Depends on `basicwp-theme` | +| `sf-evo-theme` (theme.js) | `wp_enqueue_script_module()` | Frontend entry point | +| `sf-evo-button` (button.js) | `wp_enqueue_script_module()` | Depends on `sf-evo-theme` | | jQuery | `wp_enqueue_script()` | Needed by downstream scripts; modules can't depend on classic scripts | ### Admin (`enqBEAssets()`) | Asset | Method | Notes | -|-------|--------|-------| +| ------- | -------- | ------- | | Raleway font | `wp_enqueue_style()` | Same Google Fonts | | `styles/backend/admin.css` | `wp_enqueue_style()` | Admin-specific overrides | -| `basicwp-admin` (admin.js) | `wp_enqueue_script_module()` | Admin entry point | -| `basicwp-button` (button.js) | `wp_enqueue_script_module()` | Depends on `basicwp-admin` | +| `sf-evo-admin` (admin.js) | `wp_enqueue_script_module()` | Admin entry point | +| `sf-evo-button` (button.js) | `wp_enqueue_script_module()` | Depends on `sf-evo-admin` | ### Block Editor (`enqEditorAssets()`) | Asset | Method | Notes | -|-------|--------|-------| +| ------- | -------- | ------- | | Raleway font | `wp_enqueue_style()` | Same Google Fonts | | `styles/backend/editor.css` | `wp_enqueue_style()` | Editor-specific styles, scoped to block editor | **Cache busting:** All enqueued files use `filemtime()` as the version number. This means the browser cache is automatically busted whenever a file changes — no manual version bumps needed. -**Script modules:** The theme uses `wp_enqueue_script_module()` (WordPress 6.5+) instead of traditional `wp_enqueue_script()` for frontend and admin JavaScript. This creates proper ES module dependencies where `basicwp-button` won't load until `basicwp-theme` has loaded. +**Script modules:** The theme uses `wp_enqueue_script_module()` (WordPress 6.5+) instead of traditional `wp_enqueue_script()` for frontend and admin JavaScript. This creates proper ES module dependencies where `sf-evo-button` won't load until `sf-evo-theme` has loaded. ## theme.json Design System @@ -359,7 +376,7 @@ The `theme.json` file (WordPress block editor v3 schema) defines the design syst Colors are defined as CSS custom properties and mapped to WordPress editor slugs: | Editor Slug | CSS Variable | Purpose | -|------------|-------------|---------| +| ------------ | ------------- | --------- | | `black` | `#000` | Pure black | | `white` | `#fff` | Pure white | | `theme-bg` | `var(--color-background)` | Page background | @@ -380,7 +397,7 @@ The actual color values for the CSS variables are defined in `styles/base/colors One font family (`var(--font-sans)`) and 15 size presets: | Slug | Variable | Typical Use | -|------|----------|-------------| +| ------ | ---------- | ------------- | | `base` | `var(--text-base)` | Body text | | `text-14px` | `var(--text-14px)` | Small text | | `text-16px` | `var(--text-16px)` | Standard text | @@ -400,7 +417,7 @@ One font family (`var(--font-sans)`) and 15 size presets: ### Layout | Property | Value | Meaning | -|----------|-------|---------| +| ---------- | ------- | --------- | | `contentSize` | `100%` | Default content width (full-width by default) | | `wideSize` | `1536px` | Wide-alignment max width | @@ -411,11 +428,11 @@ Available units: `px`, `em`, `rem`, `vh`, `vw`, `%` ### Global Styles | Property | Value | -|----------|-------| +| ---------- | ------- | | Background | `var(--wp--preset--color--background)` | | Text color | `var(--wp--preset--color--text)` | | Link color | `var(--wp--preset--color--theme-bodylinks)` | | Font family | `var(--wp--preset--font-family--theme-sans)` | | Line height | `1.5` | -**Why `theme.json` matters:** Changes to this file immediately affect the block editor UI — colors appear in the palette, font sizes in the typography controls, and spacing in the spacing panel. This is the single source of truth for the design system, and CSS custom properties cascade from here into the frontend styles. \ No newline at end of file +**Why `theme.json` matters:** Changes to this file immediately affect the block editor UI — colors appear in the palette, font sizes in the typography controls, and spacing in the spacing panel. This is the single source of truth for the design system, and CSS custom properties cascade from here into the frontend styles. diff --git a/docs/creating-blocks.md b/docs/creating-blocks.md index bbd2b65..d910fb8 100644 --- a/docs/creating-blocks.md +++ b/docs/creating-blocks.md @@ -1,40 +1,55 @@ -# Creating Blocks in VDI-Starter-v5 +# Creating Blocks in SoloFrame Evo ## Table of Contents -- [Overview](#overview) -- [How Block Registration Works](#how-block-registration-works) -- [Block Anatomy: The Three-File Pattern](#block-anatomy-the-three-file-pattern) - - [block.json -- The Registration Manifest](#blockjson----the-registration-manifest) - - [The PHP Template -- Rendering the Block](#the-php-template----rendering-the-block) - - [The CSS File -- Scoped Styles](#the-css-file----scoped-styles) -- [Helper Functions](#helper-functions) - - [blockWrapperAttributes()](#blockwrapperattributes) - - [getFieldValue()](#getfieldvalue) - - [escEmbeds()](#escembeds) -- [ACF Field Groups](#acf-field-groups) -- [Parent-Child Block Patterns (InnerBlocks)](#parent-child-block-patterns-innerblocks) -- [Tailwind CSS in Blocks](#tailwind-css-in-blocks) -- [Step-by-Step: Creating a New Block](#step-by-step-creating-a-new-block) - - [1. Create the Block Directory](#1-create-the-block-directory) - - [2. Create block.json](#2-create-blockjson) - - [3. Create the PHP Template](#3-create-the-php-template) - - [4. Create the CSS File](#4-create-the-css-file) - - [5. Create ACF Field Groups in WordPress Admin](#5-create-acf-field-groups-in-wordpress-admin) - - [6. Build and Verify](#6-build-and-verify) -- [Real-World Examples from This Theme](#real-world-examples-from-this-theme) - - [Simple Block: Homepage Hero](#simple-block-homepage-hero) - - [Parent Block with InnerBlocks: Section](#parent-block-with-innerblocks-section) - - [Restricted Parent Block: Buttons](#restricted-parent-block-buttons) - - [Dynamic Parent Block: Grid](#dynamic-parent-block-grid) - - [Block Using Global Fields: Contact Info](#block-using-global-fields-contact-info) -- [Common Pitfalls and Best Practices](#common-pitfalls-and-best-practices) +- [Creating Blocks in SoloFrame Evo](#creating-blocks-in-soloframe-evo) + - [Table of Contents](#table-of-contents) + - [Overview](#overview) + - [How Block Registration Works](#how-block-registration-works) + - [Block Anatomy: The Three-File Pattern](#block-anatomy-the-three-file-pattern) + - [block.json -- The Registration Manifest](#blockjson----the-registration-manifest) + - [The PHP Template -- Rendering the Block](#the-php-template----rendering-the-block) + - [The CSS File -- Scoped Styles](#the-css-file----scoped-styles) + - [Helper Functions](#helper-functions) + - [blockWrapperAttributes()](#blockwrapperattributes) + - [getFieldValue()](#getfieldvalue) + - [escEmbeds()](#escembeds) + - [SCF/ACF Field Groups](#scfacf-field-groups) + - [Creating a Field Group](#creating-a-field-group) + - [JSON Sync](#json-sync) + - [Parent-Child Block Patterns (InnerBlocks)](#parent-child-block-patterns-innerblocks) + - [Basic InnerBlocks](#basic-innerblocks) + - [Restricted InnerBlocks](#restricted-innerblocks) + - [Enabling InnerBlocks in block.json](#enabling-innerblocks-in-blockjson) + - [Adding Classes to InnerBlocks](#adding-classes-to-innerblocks) + - [Tailwind CSS in Blocks](#tailwind-css-in-blocks) + - [How Tailwind is Set Up](#how-tailwind-is-set-up) + - [Using Tailwind Classes in Blocks](#using-tailwind-classes-in-blocks) + - [Whitelisting Editor-Only Classes](#whitelisting-editor-only-classes) + - [Block-Specific CSS Files](#block-specific-css-files) + - [Step-by-Step: Creating a New Block](#step-by-step-creating-a-new-block) + - [1. Create the Block Directory](#1-create-the-block-directory) + - [2. Create block.json](#2-create-blockjson) + - [3. Create the PHP Template](#3-create-the-php-template) + - [4. Create the CSS File](#4-create-the-css-file) + - [5. Create SCF/ACF Field Groups in WordPress Admin](#5-create-scfacf-field-groups-in-wordpress-admin) + - [6. Build and Verify](#6-build-and-verify) + - [Real-World Examples from This Theme](#real-world-examples-from-this-theme) + - [Simple Block: Homepage Hero](#simple-block-homepage-hero) + - [Parent Block with InnerBlocks: Section](#parent-block-with-innerblocks-section) + - [Restricted Parent Block: Buttons](#restricted-parent-block-buttons) + - [Dynamic Parent Block: Grid](#dynamic-parent-block-grid) + - [Block Using Global Fields: Contact Info](#block-using-global-fields-contact-info) + - [Common Pitfalls and Best Practices](#common-pitfalls-and-best-practices) + - [Do](#do) + - [Do Not](#do-not) + - [Debugging Tips](#debugging-tips) --- ## Overview -VDI-Starter-v5 uses Advanced Custom Fields (ACF) blocks to build page content. ACF blocks are a type of WordPress Gutenberg block where the editing interface comes from ACF field groups and the rendering is handled by a PHP template (instead of React). This approach lets you build rich, structured content blocks using familiar PHP templating and Tailwind CSS, without writing JavaScript. +SoloFrame Evo uses Secure Custom Fields (SCF) or Advanced Custom Fields (ACF) blocks to build page content. SCF/ACF blocks are a type of WordPress Gutenberg block where the editing interface comes from SCF/ACF field groups and the rendering is handled by a PHP template (instead of React). This approach lets you build rich, structured content blocks using familiar PHP templating and Tailwind CSS, without writing JavaScript. Every block in this theme follows the same three-file pattern inside `views/blocks/{block-name}/`, and new blocks are automatically discovered and registered -- no manual registration required. @@ -74,9 +89,9 @@ Here is what happens: ## Block Anatomy: The Three-File Pattern -Every ACF block in this theme consists of exactly three files inside `views/blocks/{block-name}/`: +Every SCF/ACF block in this theme consists of exactly three files inside `views/blocks/{block-name}/`: -``` +```plain views/blocks/ boilerplate/ <-- Template for creating new blocks (not registered) block.json @@ -97,15 +112,15 @@ The naming convention is consistent: the directory name, the PHP file, and the C ### block.json -- The Registration Manifest -The `block.json` file tells WordPress and ACF everything they need to know about the block. Here is the boilerplate version: +The `block.json` file tells WordPress and SCF/ACF everything they need to know about the block. Here is the boilerplate version: ```json { "name": "acf/boilerplate", "title": "Block Boilerplate", - "description": "Boilerplate code to create ACF blocks.", + "description": "Boilerplate code to create SCF/ACF blocks.", "style": ["file:./boilerplate.css"], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "block-default", "keywords": ["boilerplate"], "acf": { @@ -127,13 +142,13 @@ The `block.json` file tells WordPress and ACF everything they need to know about **Field-by-field explanation:** | Field | Purpose | -|---|---| +| --- | --- | | `name` | The unique block identifier. **Must be prefixed with `acf/`** for ACF blocks. This becomes the machine name WordPress uses internally (e.g., `acf/testimonial`). | | `title` | The human-readable name shown in the block editor inserter (e.g., "Testimonial"). | | `description` | A short description shown in the block editor to help editors understand what the block does. | | `style` | An array of CSS files to load when this block renders. Use the `file:./` prefix for block-relative paths. WordPress only loads these stylesheets when the block is actually present on the page. | -| `category` | Determines which section of the inserter the block appears under. **Always use `vdi-blocks`** in this theme -- this is the custom category registered in `helpers.php` that groups all theme blocks together under "VDI Custom Blocks". | -| `icon` | A Dashicon name (without the `dashicons-` prefix) shown next to the block in the inserter. Browse available icons at https://developer.wordpress.org/resource/dashicons/. | +| `category` | Determines which section of the inserter the block appears under. **Always use `sf-blocks`** in this theme -- this is the custom category registered in `helpers.php` that groups all theme blocks together under "VDI Custom Blocks". | +| `icon` | A Dashicon name (without the `dashicons-` prefix) shown next to the block in the inserter. Browse available icons at [DashIcons](https://developer.wordpress.org/resource/dashicons/). | | `keywords` | Additional search terms that help editors find the block in the inserter. For example, a "Testimonial" block might include `["testimonial", "quote", "review"]`. | | `acf.mode` | Controls how the block appears in the editor. `preview` shows the rendered block output; `edit` shows the ACF field inputs directly. Most blocks use `preview`. | | `acf.renderTemplate` | The PHP file that renders the block on the frontend and in preview mode. This filename must match the actual file in the directory. | @@ -150,10 +165,10 @@ The `block.json` file tells WordPress and ACF everything they need to know about ```json { "name": "acf/buttons", - "title": "Buttons (VDI)", + "title": "Buttons", "description": "A button or group of buttons.", "allowedBlocks": ["acf/button"], - "category": "vdi-blocks", + "category": "sf-blocks", ... } ``` @@ -169,10 +184,10 @@ The PHP template is responsible for outputting the block's HTML. Every template * * This is the template for building your own custom blocks. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; $classes = 'boilerplate'; @@ -190,7 +205,7 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview ); **Key elements explained:** -1. **`namespace BasicWP;`** -- Every block template must declare this namespace. It gives you access to the theme's helper functions (`blockWrapperAttributes`, `getFieldValue`, etc.) without needing fully-qualified class names. +1. **`namespace SoloFrameEvo;`** -- Every block template must declare this namespace. It gives you access to the theme's helper functions (`blockWrapperAttributes`, `getFieldValue`, etc.) without needing fully-qualified class names. 2. **`$is_preview`** -- This is a WordPress global variable that is `true` when the block is being rendered inside the block editor, and `false` on the frontend. You can use it to conditionally show editor-only content or adjust markup for the editor. @@ -214,7 +229,7 @@ The CSS filename must match the block slug and be referenced in `block.json` usi "style": ["file:./testimonial.css"] ``` -You can use Tailwind utility classes directly in your PHP templates (e.g., `class="flex gap-4 p-6"`), and they will work as long as the Tailwind build process can detect them. For complex or block-specific styles that are not expressible as utility classes, write them in the block's CSS file using the BEM-like naming convention: +You can use Tailwind utility classes directly in your PHP templates (e.g., `class="flex gap-4 p-6"`), and they will work as long as the Tailwind build process can detect them. For complex or block-specific styles that are not expressible as utility classes, write them in the block's CSS file. You can also use Tailwind's `@apply` directive in these CSS files to compose utility classes into reusable styles: ```css /* testimonial.css */ @@ -238,7 +253,7 @@ The file can be empty initially and filled in as needed. ## Helper Functions -The theme provides several helper functions in `lib/helpers.php`, all under the `BasicWP` namespace. Because every block template declares `namespace BasicWP;`, you can call these functions directly without any prefix. +The theme provides several helper functions in `lib/helpers.php`, all under the `SoloFrameEvo` namespace. Because every block template declares `namespace SoloFrameEvo;`, you can call these functions directly without any prefix. ### blockWrapperAttributes() @@ -249,12 +264,14 @@ function blockWrapperAttributes( $classes, $is_preview ) **Purpose:** Generates the HTML attributes string for a block's root element, handling the difference between the editor and the frontend. **Parameters:** + - `$classes` (string) -- A space-separated list of CSS class names to apply to the block wrapper. - `$is_preview` (bool) -- Whether the block is being rendered in the editor. Always pass the global `$is_preview` variable. **Returns:** A string of HTML attributes ready to echo inside an HTML tag. **How it works:** + - When `$is_preview` is `true` (in the editor), it returns `class="my-class"`. This is a simplified output that avoids rendering issues caused by WordPress's `get_block_wrapper_attributes()` in the editor context. - When `$is_preview` is `false` (on the frontend), it calls WordPress's `get_block_wrapper_attributes()` with your classes merged in, producing the full set of attributes including alignment classes, anchor IDs, custom class names from the editor, and more. @@ -280,6 +297,7 @@ function getFieldValue( $field_path ) **Purpose:** Retrieves nested values from ACF option fields (Global Fields) using dot notation. **Parameters:** + - `$field_path` (string) -- A dot-notated path to the value. For example, `'contact_info.phone'` retrieves the `phone` subfield from the `contact_info` options page field. **Returns:** The value at the specified path, or an empty string if the path does not exist. @@ -314,7 +332,7 @@ echo wp_kses( $video_embed_html, escEmbeds() ); --- -## ACF Field Groups +## SCF/ACF Field Groups After creating your block's three files, you need to create an ACF field group in the WordPress admin. This defines the fields that editors fill in when editing the block. @@ -331,12 +349,12 @@ After creating your block's three files, you need to create an ACF field group i - **Repeater** -- Repeatable groups of fields (for lists, slides, etc.) - **Link** -- URL + title + target picker - **WYSIWYG** -- Rich text editor -4. Set the **location rule** to: **Block > is equal to > [Your Block Name]**. This tells ACF to show these fields when editing your block. +4. Set the **location rule** to: **Block > is equal to > [Your Block Name]**. This tells SCF/ACF to show these fields when editing your block. 5. Click **Save** or **Publish**. ### JSON Sync -The theme's `ACF` class (in `lib/class-acf.php`) configures custom save and load paths for ACF JSON: +The theme's `ACF` class (in `lib/class-acf.php`) configures custom save and load paths for SCF/ACF JSON: ```php class ACF { @@ -359,6 +377,7 @@ class ACF { ``` This means: + - When you save a field group in the admin, ACF writes a JSON file to the `acf/` directory in the theme root. - When ACF loads field groups, it reads from the same `acf/` directory. - These JSON files are version-controlled, so field group configurations travel with the codebase and sync across environments. @@ -369,7 +388,7 @@ This means: ## Parent-Child Block Patterns (InnerBlocks) -Some blocks act as containers that hold other blocks. WordPress provides `<InnerBlocks />` for this purpose, and ACF blocks can use it too. +Some blocks act as containers that hold other blocks. WordPress provides `<InnerBlocks />` for this purpose, and SCF/ACF blocks can use it too. ### Basic InnerBlocks @@ -506,7 +525,7 @@ To prevent this, add editor-only classes to `whitelist.php`. This file contains <!-- ... more classes ... --> ``` -The whitelist is primarily used for grid and layout classes that the Grid block applies dynamically through ACF field values (since those class names are generated at runtime, not hardcoded in templates). +The whitelist is primarily used for grid and layout classes that the Grid block applies dynamically through SCF/ACF field values (since those class names are generated at runtime, not hardcoded in templates). ### Block-Specific CSS Files @@ -524,7 +543,7 @@ This walkthrough demonstrates creating a "Testimonial" block from scratch. Create a new folder under `views/blocks/` using a lowercase, hyphenated slug: -``` +```plain views/blocks/testimonial/ ``` @@ -538,9 +557,9 @@ Create `views/blocks/testimonial/block.json`: { "name": "acf/testimonial", "title": "Testimonial", - "description": "A customer testimonial with quote, name, and role.", + "description": "A customer testimonial with quote, name, image, and role.", "style": ["file:./testimonial.css"], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "format-quote", "keywords": ["testimonial", "quote", "review"], "acf": { @@ -560,8 +579,9 @@ Create `views/blocks/testimonial/block.json`: ``` **Checklist for `block.json`:** + - `name` starts with `acf/` -- `category` is set to `vdi-blocks` +- `category` is set to `sf-blocks` - `style` references the CSS file with the `file:./` prefix - `acf.renderTemplate` matches the PHP filename exactly - `supports.html` is `false` (ACF blocks should not support HTML editing) @@ -578,10 +598,10 @@ Create `views/blocks/testimonial/testimonial.php`: * * A customer testimonial with quote, name, and role. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; $classes = 'testimonial'; $wrapper = blockWrapperAttributes( $classes, $is_preview ); @@ -618,14 +638,14 @@ $image = get_field( 'image' ); ``` **Checklist for the PHP template:** -- Always start with `namespace BasicWP;` + +- Always start with `namespace SoloFrameEvo;` - Always call `blockWrapperAttributes( $classes, $is_preview )` and assign it to `$wrapper` - Always echo `$wrapper` inside the root element with `wp_kses_post()` - Use `get_field()` to retrieve ACF field values - Use `getFieldValue()` for nested option fields - Escape all output: `wp_kses_post()` for HTML content, `esc_html()` for plain text, `esc_url()` for URLs, `esc_attr()` for HTML attributes - Use semantic HTML elements (`<section>`, `<blockquote>`, `<cite>`, etc.) -- Follow BEM-like naming for CSS classes: `.block`, `.block__element`, `.block__element--modifier` ### 4. Create the CSS File @@ -665,7 +685,7 @@ Create `views/blocks/testimonial/testimonial.css`. It can start empty or with ba If you are using Tailwind utility classes in the PHP template, you may not need much custom CSS. The file still needs to exist and be referenced in `block.json` so WordPress can load it. -### 5. Create ACF Field Groups in WordPress Admin +### 5. Create SCF/ACF Field Groups in WordPress Admin 1. Log in to the WordPress admin dashboard. 2. Go to **Custom Fields > Add New**. @@ -673,7 +693,7 @@ If you are using Tailwind utility classes in the PHP template, you may not need 4. Add the following fields: | Field Label | Field Name | Field Type | Notes | - |---|---|---|---| + | --- | --- | --- | --- | | Quote | `quote` | Textarea | The testimonial text | | Name | `name` | Text | The customer's name | | Role | `role` | Text | The customer's role or title (optional) | @@ -695,7 +715,7 @@ npm run build Then verify the block appears in the editor: 1. Edit a page in the WordPress block editor. -2. Open the inserter and look under **VDI Custom Blocks**. +2. Open the inserter and look under **SoloFrame Custom Blocks**. 3. You should see "Testimonial" with the quote icon. 4. Insert the block and fill in the fields. 5. Save and preview the page on the frontend to confirm rendering works correctly. @@ -709,7 +729,8 @@ Then verify the block appears in the editor: The Homepage Hero is a straightforward block that retrieves ACF fields and renders them with Tailwind classes. It does not use InnerBlocks. **Key patterns:** -- Retrieves multiple ACF fields with `get_field()` + +- Retrieves multiple SCF/ACF fields with `get_field()` - Conditionally renders sections only when fields have values (`! empty( $heading )`) - Uses Tailwind classes extensively for layout and styling - Handles editor vs. frontend differences for link URLs @@ -740,9 +761,10 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview ); ### Parent Block with InnerBlocks: Section -The Section block is a container that wraps its child blocks with optional background styling. It demonstrates conditional rendering based on ACF fields. +The Section block is a container that wraps its child blocks with optional background styling. It demonstrates conditional rendering based on SCF/ACF fields. **Key patterns:** + - Builds CSS class strings dynamically based on field values - Builds inline `style` strings from field values - Conditionally renders an overlay div @@ -801,6 +823,7 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview ); The Buttons block is a container that only allows Button blocks as children. It enforces this restriction through both `block.json` and the template. **Key patterns:** + - Uses `allowedBlocks` in `block.json` to restrict children to `acf/button` - Sets `"jsx": true` in `supports` to enable InnerBlocks - Passes Tailwind classes to InnerBlocks via the `className` prop @@ -835,6 +858,7 @@ Note: The Buttons block uses `esc_attr()` instead of `wp_kses_post()` for the wr The Grid block builds CSS classes dynamically from ACF field values (columns, breakpoints, gaps). This is a case where runtime-generated class names need to be whitelisted. **Key patterns:** + - Dynamically constructs Tailwind class names from field values (e.g., `'grid-cols-' . get_field( 'columns' )`) - Uses `$block['anchor']` and `$block['className']` for editor-set attributes - These dynamic class names are added to `whitelist.php` so Tailwind includes them in the build @@ -873,27 +897,27 @@ Because the class names like `grid-cols-3` and `md:grid-cols-4` are generated at The Contact Info block demonstrates how to access ACF options page data (Global Fields) using `getFieldValue()`. **Key patterns:** -- Uses `get_field( 'contact_info', 'option' )` to retrieve the options page field group, then accesses sub-fields with array syntax -- Alternatively, could use `getFieldValue( 'contact_info.phone' )` for the same result + +- Uses `getFieldValue( 'contact_info.phone' )` to retrieve the options page field group, then accesses sub-fields with array syntax - Combines static content from Global Fields with dynamic InnerBlocks content (a contact form) ```php -namespace BasicWP; +namespace SoloFrameEvo; $classes = 'contact-info'; $wrapper = blockWrapperAttributes( $classes, $is_preview ); ?> -<section <?php echo esc_attr( $wrapper ); ?>> +<section <?php echo wp_kses_post( $wrapper ); ?>> <div class="flex flex-col lg:flex-row"> <div class="w-full lg:w-1/2 p-6"> <h2 class="text-2xl font-bold mb-4">Contact Information</h2> - <p><?php echo wp_kses_post( get_field( 'contact_info', 'option' )['address'] ); ?></p> - <p><a href="mailto:<?php echo esc_html( get_field( 'contact_info', 'option' )['email'] ); ?>"> - <?php echo esc_html( get_field( 'contact_info', 'option' )['email'] ); ?> + <p><?php echo wp_kses_post( getFieldValue( 'contact_info.address' ) ); ?></p> + <p><a href="mailto:<?php echo esc_html( getFieldValue( 'contact_info.email' ) ); ?>"> + <?php echo esc_html( getFieldValue( 'contact_info.email' ) ); ?> </a></p> - <p><a href="tel:<?php echo esc_html( get_field( 'contact_info', 'option' )['phone'] ); ?>"> - <?php echo esc_html( get_field( 'contact_info', 'option' )['phone'] ); ?> + <p><a href="tel:<?php echo esc_html( getFieldValue( 'contact_info.phone' ) ); ?>"> + <?php echo esc_html( getFieldValue( 'contact_info.phone' ) ); ?> </a></p> </div> @@ -910,12 +934,12 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview ); ### Do -- **Always use `namespace BasicWP;`** at the top of every block PHP template. Without it, helper functions like `blockWrapperAttributes()` and `getFieldValue()` will not be available. +- **Always use `namespace SoloFrameEvo;`** at the top of every block PHP template. Without it, helper functions like `blockWrapperAttributes()` and `getFieldValue()` will not be available. - **Always use `blockWrapperAttributes()`** for the root element's attributes. Never call `get_block_wrapper_attributes()` directly. - **Always escape output.** Use `wp_kses_post()` for HTML content, `esc_html()` for plain text, `esc_url()` for URLs, and `esc_attr()` for HTML attribute values. -- **Always set `category` to `vdi-blocks`** in `block.json` so your block appears under "VDI Custom Blocks" in the editor. +- **Always set `category` to `sf-blocks`** in `block.json` so your block appears under "VDI Custom Blocks" in the editor. - **Always prefix `name` with `acf/`** in `block.json` (e.g., `"acf/testimonial"`, not just `"testimonial"`). -- **Always set `supports.html` to `false`** in `block.json` for ACF blocks. ACF blocks use PHP templates, not HTML editing. +- **Always set `supports.html` to `false`** in `block.json` for SCF/ACF blocks. SCF/ACF blocks use PHP templates, not HTML editing. - **Always set `supports.jsx` to `true`** if your block uses `<InnerBlocks />`. Without this, the InnerBlocks area will not render. - **Commit ACF JSON files** from the `acf/` directory to version control after creating field groups. - **Use semantic HTML elements** as block wrappers (`<section>`, `<article>`, `<aside>`, `<nav>`, etc.) instead of generic `<div>` elements where appropriate. @@ -929,7 +953,7 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview ); - **Do not forget to create the CSS file** referenced in `block.json`. Even if the file is empty, WordPress needs it to exist. If the file is missing, WordPress may throw an error when loading the block. - **Do not use `'option'` directly with `get_field()` for nested values without null checking.** Prefer `getFieldValue()` which handles missing values gracefully. - **Do not set `supports.multiple` to `false`** unless the block truly must be unique per page (like a homepage hero). Most blocks should allow multiple instances. -- **Do not hardcode editor-only Tailwind classes in PHP templates** without adding them to `whitelist.php`. If a class only appears in the editor's UI (like grid column classes set via ACF fields), Tailwind will not include it in the build. +- **Do not hardcode editor-only Tailwind classes in PHP templates** without adding them to `whitelist.php`. If a class only appears in the editor's UI (like grid column classes set via SCF/ACF fields), Tailwind will not include it in the build. - **Do not use the `style` attribute on the block's root element alongside `blockWrapperAttributes()` for background colors** unless the block specifically needs it. WordPress's built-in color supports (enabled via `supports.color`) handle this automatically. ### Debugging Tips @@ -938,4 +962,4 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview ); - If ACF fields do not show up when editing a block, verify the field group's location rule is set to "Block is equal to [Your Block Name]". - If styles are not loading, confirm the `style` array in `block.json` uses the `file:./` prefix and the CSS filename matches exactly. - If Tailwind classes are not applying on the frontend, run `npm run build` and check that the classes are either in your templates or in `whitelist.php`. -- If InnerBlocks are not rendering, confirm `"jsx": true` is set in the block's `supports` configuration. \ No newline at end of file +- If InnerBlocks are not rendering, confirm `"jsx": true` is set in the block's `supports` configuration. diff --git a/docs/getting-started.md b/docs/getting-started.md index b10fb93..76d3db5 100644 --- a/docs/getting-started.md +++ b/docs/getting-started.md @@ -1,6 +1,6 @@ -# Getting Started with VDI-Starter-v5 +# Getting Started with SoloFrame Evo -This guide walks you through setting up a local development environment for the VDI-Starter-v5 WordPress theme from scratch. It covers prerequisites, installation, configuration, and common development workflows. +This guide walks you through setting up a local development environment for the SoloFrame Evo WordPress theme from scratch. It covers prerequisites, installation, configuration, and common development workflows. --- @@ -15,7 +15,7 @@ This guide walks you through setting up a local development environment for the 7. [Activating the Theme](#activating-the-theme) 8. [Development Workflow](#development-workflow) 9. [Project Architecture](#project-architecture) -10. [Creating Custom ACF Blocks](#creating-custom-acf-blocks) +10. [Creating Custom SCF/ACF Blocks](#creating-custom-scfacf-blocks) 11. [Testing](#testing) 12. [Code Quality](#code-quality) 13. [Troubleshooting](#troubleshooting) @@ -24,7 +24,7 @@ This guide walks you through setting up a local development environment for the ## Overview -VDI-Starter-v5 is a minimal WordPress theme designed as a starting point for custom theme development. It uses a modern stack: +SoloFrame Evo is a minimal WordPress theme designed as a starting point for custom theme development. It uses a modern stack: - **Tailwind CSS v4** for utility-first styling, compiled via the Tailwind CLI - **ACF Pro** for custom field management and block registration @@ -41,14 +41,14 @@ The theme intentionally avoids heavyweight frameworks. Every PHP file in `lib/` Before you begin, make sure the following tools are installed on your machine. -| Tool | Minimum Version | Why It Is Needed | -|-------------|-----------------|------------------------------------------------------------------------------------------------------| -| Node.js | 22+ | Tailwind CSS v4 CLI requires a modern Node runtime. Older versions will fail during `npm run build`. | -| npm | Latest (bundled with Node) | Package management for JavaScript dependencies and build scripts. | -| PHP | 8.0+ | WordPress core requirement and theme compatibility. | -| Composer | 2.x | Installs PHP_CodeSniffer with WordPress coding standards for linting. | -| WordPress | 6.5+ | The theme uses `wp_enqueue_script_module()`, which was introduced in WordPress 6.5. | -| ACF Pro | Latest | All custom blocks depend on ACF Pro. Blocks will not register without it. | +| Tool | Minimum Version | Why It Is Needed | +| ------------- | -------------------------- | ---------------------------------------------------------------------------------------------------- | +| Node.js | 22+ | Tailwind CSS v4 CLI requires a modern Node runtime. Older versions will fail during `npm run build`. | +| npm | Latest (bundled with Node) | Package management for JavaScript dependencies and build scripts. | +| PHP | 8.0+ | WordPress core requirement and theme compatibility. | +| Composer | 2.x | Installs PHP_CodeSniffer with WordPress coding standards for linting. | +| WordPress | 6.5+ | The theme uses `wp_enqueue_script_module()`, which was introduced in WordPress 6.5. | +| ACF Pro | Latest | All custom blocks depend on ACF Pro. Blocks will not register without it. | ### Checking Your Versions @@ -96,36 +96,36 @@ Docker gives you the most control and works on any operating system, but it requ 1. Install [Docker Desktop](https://www.docker.com/products/docker-desktop/). 2. Use the official `wordpress` Docker image with a custom theme mount. A minimal `docker-compose.yml` might look like: -```yaml -version: '3.8' -services: - db: - image: mysql:8.0 - environment: - MYSQL_ROOT_PASSWORD: wordpress - MYSQL_DATABASE: wordpress - MYSQL_USER: wordpress - MYSQL_PASSWORD: wordpress - volumes: - - db_data:/var/lib/mysql + ```yaml + version: '3.8' + services: + db: + image: mysql:8.0 + environment: + MYSQL_ROOT_PASSWORD: wordpress + MYSQL_DATABASE: wordpress + MYSQL_USER: wordpress + MYSQL_PASSWORD: wordpress + volumes: + - db_data:/var/lib/mysql - wordpress: - image: wordpress:latest - ports: - - "8080:80" - environment: - WORDPRESS_DB_HOST: db:3306 - WORDPRESS_DB_USER: wordpress - WORDPRESS_DB_PASSWORD: wordpress - WORDPRESS_DB_NAME: wordpress - volumes: - - ./themes/vdi-starter-v5:/var/www/html/wp-content/themes/vdi-starter-v5 - depends_on: - - db + wordpress: + image: wordpress:latest + ports: + - "8080:80" + environment: + WORDPRESS_DB_HOST: db:3306 + WORDPRESS_DB_USER: wordpress + WORDPRESS_DB_PASSWORD: wordpress + WORDPRESS_DB_NAME: wordpress + volumes: + - ./themes/SoloFrame-Evo:/var/www/html/wp-content/themes/SoloFrame-Evo + depends_on: + - db -volumes: - db_data: -``` + volumes: + db_data: + ``` 3. Run `docker compose up -d` and visit `http://localhost:8080` to complete the WordPress installation wizard. @@ -136,29 +136,17 @@ volumes: ### Step 1: Clone the Repository ```bash -git clone https://github.com/Vincent-Design-Inc/VDI-Starter-v5.git -cd VDI-Starter-v5 +git clone https://github.com/ksolomon/SoloFrame-Evo.git +cd SoloFrame-Evo ``` If you are contributing to an existing project, clone it into your local WordPress `wp-content/themes/` directory so WordPress can detect it: ```bash cd /path/to/your/local-wp-site/wp-content/themes/ -git clone https://github.com/Vincent-Design-Inc/VDI-Starter-v5.git +git clone https://github.com/ksolomon/SoloFrame-Evo.git ``` -If you cloned it elsewhere, you can symlink it into the themes directory: - -```bash -# macOS/Linux -ln -s /path/to/VDI-Starter-v5 /path/to/wp-content/themes/vdi-starter-v5 - -# Windows (run in an elevated Command Prompt) -mklink /D "C:\path\to\wp-content\themes\vdi-starter-v5" "C:\path\to\VDI-Starter-v5" -``` - -Using a symlink means your local edits are immediately reflected in WordPress without copying files. - ### Step 2: Install PHP Dependencies ```bash @@ -173,9 +161,9 @@ This installs PHP_CodeSniffer and the WordPress Coding Standards (WPCS) ruleset. npm install ``` -This installs the frontend build toolchain: Tailwind CSS v4 and its CLI, BrowserSync, Playwright, dotenv, and other utilities. Tailwind v4 uses the `@tailwindcss/cli` package directly (no `tailwind.config.js` file is needed -- configuration lives in `styles/theme.css`). +This installs the frontend build toolchain: Tailwind CSS v4 and its CLI, BrowserSync, Playwright, dotenv, and other utilities. Tailwind v4 uses the `@tailwindcss/cli` package directly. No `tailwind.config.js` file is needed -- configuration lives in `styles/theme.css`. -### Step 4: Configure Environment Variables +## Environment Configuration Copy the example environment file and edit it: @@ -185,16 +173,16 @@ cp .env.example .env Open `.env` and set the two variables: -| Variable | Description | Example Value | -|-------------------|-----------------------------------------------------------------------------------------------|------------------------------| -| `LOCALHOST_URL` | The full URL of your local WordPress site, including the scheme (`http` or `https`) | `https://vdi-starter.local` | -| `BROWSERSYNC_PORT`| The port BrowserSync should listen on. Defaults to `5000` if not set. | `5000` | +| Variable | Description | Example Value | +| ------------------- | ----------------------------------------------------------------------------------- | ------------------------------ | +| `LOCALHOST_URL` | The full URL of your local WordPress site, including the scheme (`http` or `https`) | `https://soloframe-evo.local` | +| `BROWSERSYNC_PORT` | The port BrowserSync should listen on. Defaults to `5000` if not set. | `5000` | The `LOCALHOST_URL` must match exactly what your local WordPress environment responds to. If you are using Local by Flywheel with SSL enabled, include `https://`. If you are using Docker on port 8080, use `http://localhost:8080`. BrowserSync proxies this URL and injects a live-reload script, so any change you make to PHP templates, CSS, or JS files will automatically refresh the browser. -### Step 5: Build Assets for the First Time +## Building Assets Before activating the theme, compile the Tailwind CSS so the theme has its stylesheet: @@ -204,7 +192,7 @@ npm run build This runs: -``` +```bash npx @tailwindcss/cli -i ./styles/theme.css -o ./static/dist/theme.css --optimize ``` @@ -227,15 +215,11 @@ Log into your local WordPress admin dashboard and navigate to **Appearance > The > - **Creates 4 default pages:** Home, News, Page Not Found (Error 404), and Contact Us. > - **Sets WordPress to use a static front page:** Home becomes the front page, News becomes the posts page. This overrides any existing "Reading Settings". > - **Deletes the default "Hello World" post** (ID 1) and the **sample page** (ID 2). These are trashed permanently (`wp_delete_post` with `$force_delete = true`). -> - **Installs 7 plugins** from external URLs and selectively activates them: -> 1. **ACF Pro** -- installed and activated (from `https://docs.vincentdevelopment.ca/files/advanced-custom-fields-pro.zip`) -> 2. **Gravity Forms** -- installed and activated (from `https://docs.vincentdevelopment.ca/files/gravity-forms.zip`) -> 3. **UpdraftPlus** -- installed, NOT activated (from WordPress.org) -> 4. **Simple History** -- installed and activated (from WordPress.org) -> 5. **The SEO Framework** -- installed and activated (from WordPress.org) -> 6. **Better Search Replace** -- installed and activated (from WordPress.org) -> 7. **Google Site Kit** -- installed, NOT activated (from WordPress.org) -> - **Creates an "Owner" role** (administrator capabilities minus plugin/theme management). +> - **Installs 4 plugins** from external URLs and selectively activates them: +> 1. **Secure Custom Fields** -- installed and activated (from WordPress.org) +> 2. **Simple History** -- installed and activated (from WordPress.org) +> 3. **The SEO Framework** -- installed and activated (from WordPress.org) +> 4. **Better Search Replace** -- installed and activated (from WordPress.org) > - **Writes an installation log** to `wp-content/mu-plugin-install.log`. > > **Do NOT activate this theme on an existing production site without reviewing `lib/activation.php` first.** The activation routine is designed for fresh installs and will modify pages, settings, and plugin state without confirmation. @@ -271,7 +255,7 @@ This runs `bin/.watch.js`, which starts BrowserSync and watches for file changes When you edit a `.js` file in `static/js/`, BrowserSync injects the updated script without a full page reload (hot injection). -The dev server is accessible at the `LOCALHOST_URL` you configured, proxied through the `BROWSERSYNC_PORT`. For example, if your `.env` has `LOCALHOST_URL=https://vdi-starter.local` and `BROWSERSYNC_PORT=5000`, your dev URL is `https://vdi-starter.local` with BrowserSync overlay on port 5000. +The dev server is accessible at the `LOCALHOST_URL` you configured, proxied through the `BROWSERSYNC_PORT`. For example, if your `.env` has `LOCALHOST_URL=http://soloframe-evo.local` and `BROWSERSYNC_PORT=5000`, your dev URL is `http://soloframe-evo.local` with BrowserSync overlay on port 5000. ### Building for Production @@ -291,27 +275,27 @@ This compiles Tailwind CSS with `--optimize` enabled, which minifies the output Understanding the directory layout helps you know where to find things and where to put new files. -``` -VDI-Starter-v5/ -├── acf/ # ACF Pro field group JSON (auto-synced) +```plain +SoloFrame-Evo/ +├── acf/ # SCF/ACF Pro field group JSON (auto-synced) │ └── group_*.json # One file per field group ├── bin/ │ ├── .watch.js # BrowserSync dev server script -│ └── .utils.js # Shared build utilities (Tailwind compilation) +│ └── .utils.js # Shared build utilities (Tailwind compilation) ├── content/ │ └── basic-wp-test-content.xml # Sample content for testing ├── docs/ # Documentation (this guide lives here) ├── lib/ # PHP utility classes (auto-loaded) │ ├── activation.php # Theme activation routine (pages, plugins, settings) -│ ├── class-acf.php # ACF JSON load/save path configuration +│ ├── class-acf.php # SCF/ACF JSON load/save path configuration │ ├── class-breadcrumbs.php # Breadcrumb navigation helper │ ├── class-enqueue.php # Frontend/backend/editor asset enqueueing -│ ├── class-menuitems.php # Custom menu item handling +│ ├── class-menuitems.php # Custom menu item handling │ ├── class-resources.php # Resource management -│ ├── extras.php # Miscellaneous helper functions +│ ├── extras.php # Miscellaneous helper functions │ ├── helpers.php # Template helper functions │ ├── hooks.php # Theme hooks (menus, sidebars, cleanup, SVG uploads) -│ ├── search-features.php # Enhanced search functionality +│ ├── search-features.php # Enhanced search functionality │ └── show-template.php # Template debugging (shows which template is loaded) ├── static/ │ ├── dist/ @@ -350,7 +334,7 @@ VDI-Starter-v5/ │ ├── page-children/ │ └── section/ ├── tests/ -│ └── site-a11y.spec.js # Playwright accessibility tests +│ └── site-a11y.spec.js # Playwright accessibility tests ├── .env.example # Environment variable template ├── composer.json # PHP dependencies (PHPCS + WPCS) ├── functions.php # Theme bootstrap (loads all lib/*.php files, registers ACF blocks) @@ -373,7 +357,7 @@ foreach ( glob( __DIR__ . '/lib/*.php' ) as $filename ) { This means adding a new file to `lib/` automatically includes it. No manual `require` statements are needed. However, be aware that files are loaded in alphabetical order. If one file depends on something defined in another, you may need to rename files with numeric prefixes to control load order. -### How ACF Blocks Are Registered +### How SCF/ACF Blocks Are Registered The `regACFBlocks()` function in `functions.php` scans the `views/blocks/` directory at runtime: @@ -398,21 +382,21 @@ Each subdirectory that contains a `block.json` file is registered as a Gutenberg The Tailwind entry point is `styles/theme.css`. It imports sub-stylesheets using CSS `@import` directives: ```css -@import "tailwindcss"; /* Tailwind v4 framework */ -@import "./base/index.css"; /* Base styles */ -@import "./navigation/index.css";/* Navigation styles */ -@import "./fonts/lineicons.css"; /* Icon font */ -@import "./base/break-out.css"; /* Break-out utility */ -@import "./components/index.css";/* Component styles */ -@import "./blocks/index.css"; /* Block-specific styles */ -@plugin "@tailwindcss/typography"; /* Typography plugin */ +@import "tailwindcss"; /* Tailwind v4 framework */ +@import "./base/index.css"; /* Base styles */ +@import "./navigation/index.css"; /* Navigation styles */ +@import "./fonts/lineicons.css"; /* Icon font */ +@import "./base/break-out.css"; /* Break-out utility */ +@import "./components/index.css"; /* Component styles */ +@import "./blocks/index.css"; /* Block-specific styles */ +@plugin "@tailwindcss/typography"; /* Tailwind Typography plugin */ ``` When you create a new block or component, add its styles to the appropriate subdirectory and make sure it is imported through the corresponding `index.css` file. --- -## Creating Custom ACF Blocks +## Creating Custom SCF/ACF Blocks To create a new ACF block, use the `boilerplate` directory as a starting point: @@ -424,7 +408,7 @@ To create a new ACF block, use the `boilerplate` directory as a starting point: 2. Edit `views/blocks/my-block/block.json`: - Change `"name"` to `"acf/my-block"` - - Change `"title"` to a human-readable name like `"My Block (VDI)"` + - Change `"title"` to a human-readable name like `"My Block"` - Update `"description"`, `"icon"`, and `"keywords"` as appropriate - If this block should only be nested inside another block, add a `"parent"` array (see `button/block.json` for an example) @@ -432,7 +416,7 @@ To create a new ACF block, use the `boilerplate` directory as a starting point: 4. If the block needs ACF field groups, create them in the WordPress admin under **Custom Fields > Field Groups** and associate them with the block. ACF will save the field group JSON to the `acf/` directory, which you should commit to version control. -5. Add block-specific styles in `styles/blocks/` and import them through `styles/blocks/index.css`. +5. Add block-specific styles in `my-block.css`. The block will be automatically discovered and registered on the next page load because `regACFBlocks()` scans the directory on every `init` hook. @@ -502,12 +486,13 @@ The compilation pipeline is: `styles/theme.css` (entry point with `@import` dire **Symptom:** The block inserter in the Gutenberg editor does not show custom blocks like "Homepage Hero" or "Section". -**Solution:** ACF Pro must be installed and activated. Blocks are registered by scanning `views/blocks/*/block.json` on the `init` hook. Without ACF Pro, `register_block_type()` still runs, but ACF blocks require the ACF plugin to provide field data and rendering. +**Solution:** SCF (installed by default on theme activation) or ACF Pro must be installed and activated. Blocks are registered by scanning `views/blocks/*/block.json` on the `init` hook. Without SCF/ACF Pro, `register_block_type()` still runs, but blocks require the SCF/ACF plugin to provide field data and rendering. Also check that: + - The block directory contains a valid `block.json` file. - The block directory is not named `boilerplate` (this is excluded by design). -- ACF Pro is activated (not just installed). +- SCF/ACF Pro is activated (not just installed). ### Menus Are Not Rendering @@ -566,24 +551,24 @@ Check `wp-content/mu-plugin-install.log` for detailed error messages. Each plugi ## Quick Reference -| Command | Purpose | -|---------------------|--------------------------------------------------------------------| -| `npm run start` | Start BrowserSync dev server with live reload (alias for `watch`) | -| `npm run watch` | Start BrowserSync dev server with live reload | -| `npm run build` | Compile Tailwind CSS for production (minified, optimized) | -| `composer lint` | Run PHP_CodeSniffer against WordPress coding standards | -| `composer fix` | Auto-fix PHP_CodeSniffer violations | -| `npx playwright test` | Run Playwright end-to-end tests | +| Command | Purpose | +| --------------------- | -------------------------------------------------------------------- | +| `npm run start` | Start BrowserSync dev server with live reload (alias for `watch`) | +| `npm run watch` | Start BrowserSync dev server with live reload | +| `npm run build` | Compile Tailwind CSS for production (minified, optimized) | +| `composer lint` | Run PHP_CodeSniffer against WordPress coding standards | +| `composer fix` | Auto-fix PHP_CodeSniffer violations | +| `npx playwright test` | Run Playwright end-to-end tests | -| File | Purpose | -|-----------------------------------|------------------------------------------------------| -| `.env` | Local environment config (`LOCALHOST_URL`, `BROWSERSYNC_PORT`) | -| `styles/theme.css` | Tailwind CSS entry point (edit this to add imports) | -| `static/dist/theme.css` | Compiled CSS output (generated, do not edit manually)| -| `views/blocks/*/block.json` | ACF block registration files | -| `lib/activation.php` | Theme activation routine (creates pages, installs plugins) | -| `lib/class-enqueue.php` | Frontend/backend/editor asset loading | -| `lib/hooks.php` | Menu registration, sidebars, theme support, cleanup | -| `functions.php` | Theme bootstrap (auto-loads all `lib/*.php` files) | -| `theme.json` | WordPress theme configuration (colors, typography, layout) | -| `acf/group_*.json` | ACF field group definitions (version-controlled) | \ No newline at end of file +| File | Purpose | +| ----------------------------------- | -------------------------------------------------------------- | +| `.env` | Local environment config (`LOCALHOST_URL`, `BROWSERSYNC_PORT`) | +| `styles/theme.css` | Tailwind CSS entry point (edit this to add imports) | +| `static/dist/theme.css` | Compiled CSS output (generated, do not edit manually) | +| `views/blocks/*/block.json` | ACF block registration files | +| `lib/activation.php` | Theme activation routine (creates pages, installs plugins) | +| `lib/class-enqueue.php` | Frontend/backend/editor asset loading | +| `lib/hooks.php` | Menu registration, sidebars, theme support, cleanup | +| `functions.php` | Theme bootstrap (auto-loads all `lib/*.php` files) | +| `theme.json` | WordPress theme configuration (colors, typography, layout) | +| `acf/group_*.json` | ACF field group definitions (version-controlled) | diff --git a/docs/reference.md b/docs/reference.md index ef3f8fc..5932dc4 100644 --- a/docs/reference.md +++ b/docs/reference.md @@ -1,46 +1,56 @@ -# VDI-Starter-v5 Theme Reference +# SoloFrame Evo Theme Reference -> Quick-lookup reference for the VDI-Starter-v5 WordPress theme. Covers hooks, filters, design tokens, CSS architecture, JS modules, helper functions, class APIs, CLI commands, deployment, and testing. +> Quick-lookup reference for the SoloFrame Evo WordPress theme. Covers hooks, filters, design tokens, CSS architecture, JS modules, helper functions, class APIs, CLI commands, deployment, and testing. --- ## Table of Contents -- [Hooks and Filters](#hooks-and-filters) - - [hooks.php (BasicWP Namespace)](#hooksphp-basicwp-namespace) - - [extras.php](#extrasphp) - - [helpers.php](#helpersphp) - - [class-enqueue.php](#class-enqueuephp) - - [class-breadcrumbs.php](#class-breadcrumbsphp) - - [class-resources.php](#class-resourcesphp) -- [theme.json Design Tokens](#themejson-design-tokens) - - [Colors](#colors) - - [Font Sizes](#font-sizes) - - [Font Family](#font-family) - - [Layout](#layout) - - [Spacing Units](#spacing-units) -- [CSS Architecture](#css-architecture) - - [Import Order](#import-order) - - [Adding a New Stylesheet](#adding-a-new-stylesheet) -- [JS Module Dependency Graph](#js-module-dependency-graph) - - [Script Module IDs](#script-module-ids) -- [Navigation Class API](#navigation-class-api) -- [Helper Functions](#helper-functions) -- [Class Reference](#class-reference) -- [CLI Commands](#cli-commands) -- [Deployment (GitHub Actions)](#deployment-github-actions) -- [Testing](#testing) +- [SoloFrame Evo Theme Reference](#soloframe-evo-theme-reference) + - [Table of Contents](#table-of-contents) + - [Hooks and Filters](#hooks-and-filters) + - [hooks.php (SoloFrameEvo Namespace)](#hooksphp-soloframeevo-namespace) + - [extras.php](#extrasphp) + - [helpers.php](#helpersphp) + - [class-enqueue.php](#class-enqueuephp) + - [class-breadcrumbs.php](#class-breadcrumbsphp) + - [class-resources.php](#class-resourcesphp) + - [theme.json Design Tokens](#themejson-design-tokens) + - [Colors](#colors) + - [Font Sizes](#font-sizes) + - [Font Family](#font-family) + - [Layout](#layout) + - [Spacing Units](#spacing-units) + - [CSS Architecture](#css-architecture) + - [Import Order](#import-order) + - [Adding a New Stylesheet](#adding-a-new-stylesheet) + - [JS Module Dependency Graph](#js-module-dependency-graph) + - [Script Module IDs](#script-module-ids) + - [Navigation Class API](#navigation-class-api) + - [Constructor](#constructor) + - [Methods](#methods) + - [Helper Functions](#helper-functions) + - [Class Reference](#class-reference) + - [Breadcrumbs Method Details](#breadcrumbs-method-details) + - [CLI Commands](#cli-commands) + - [Deployment (GitHub Actions)](#deployment-github-actions) + - [Deployment Steps](#deployment-steps) + - [rsync Flags](#rsync-flags) + - [Testing](#testing) + - [Accessibility Tests](#accessibility-tests) + - [PHP Linting](#php-linting) + - [Playwright Configuration](#playwright-configuration) --- ## Hooks and Filters -### hooks.php (BasicWP Namespace) +### hooks.php (SoloFrameEvo Namespace) -All hooks in this file live under the `BasicWP` namespace. +All hooks in this file live under the `SoloFrameEvo` namespace. | Hook | Type | Priority | Args | Description | -|------|------|----------|------|-------------| +| ------ | ------ | ---------- | ------ | ------------- | | `wp_head` | Action | 0 | — | Adds Google Fonts `<link rel="preconnect">` tags | | `register_nav_menus()` | Direct call | — | — | Registers three menus: `main_navigation`, `aux_navigation`, `footer_navigation` | | `widgets_init` | Action | — | — | Registers four sidebars: `sidebar-primary`, `sidebar-page`, `footer-1`, `footer-2`, `footer-3` | @@ -57,6 +67,7 @@ All hooks in this file live under the `BasicWP` namespace. **The `init` (priority 1) hook performs aggressive cleanup:** Removes: + - Emoji detection and styles (`remove_action` on `wp_head`) - Block library styles (`wp-block-library`) - Global styles (`global-styles`) @@ -67,6 +78,7 @@ Removes: - WLW manifest link (`wlwmanifest_link`) Adds theme supports: + - `post-thumbnails` - `title-tag` - `html5` (search-form, comment-form, comment-list, gallery, caption, style, script) @@ -80,7 +92,7 @@ Adds theme supports: ### extras.php | Hook / Filter | Type | Description | -|---------------|------|-------------| +| --------------- | ------ | ------------- | | `hasSidebar` | Filter | Controls sidebar display based on an ACF true/false field on the current page | | `body_class` | Filter | Appends `has-sidebar` class to `<body>` when a sidebar is present | | `the_content` | Filter | `divWrapper()` wraps `<iframe>` and embed elements in `<div class="embed">` | @@ -94,10 +106,10 @@ Adds theme supports: ### helpers.php | Hook / Filter | Type | Priority | Args | Description | -|---------------|------|----------|------|-------------| +| --------------- | ------ | ---------- | ------ | ------------- | | `custom_menu_order` | Filter | 10 | 1 | Enables custom admin menu ordering | | `menu_order` | Filter | 10 | 1 | Defines the custom admin menu order | -| `block_categories_all` | Filter | 10 | — | Adds the `vdi-blocks` category to the block editor | +| `block_categories_all` | Filter | 10 | — | Adds the `sf-blocks` category to the block editor | | `init` | Action | — | — | Registers the ACF "Global Fields" options page | --- @@ -105,7 +117,7 @@ Adds theme supports: ### class-enqueue.php | Hook | Type | Method | Description | -|------|------|--------|-------------| +| ------ | ------ | -------- | ------------- | | `wp_enqueue_scripts` | Action | `enqFEAssets()` | Loads frontend CSS and JS | | `admin_enqueue_scripts` | Action | `enqBEAssets()` | Loads admin CSS and JS | | `enqueue_block_editor_assets` | Action | `enqEditorAssets()` | Loads block editor CSS | @@ -117,7 +129,7 @@ Adds theme supports: The `Breadcrumbs` class generates Schema.org-compatible breadcrumb markup. Context-specific methods: | Method | Context | -|--------|---------| +| -------- | --------- | | `getHomeBreadcrumb()` | Site front page | | `getBlogPostsIndexBreadcrumb()` | Blog posts index | | `getSinglePostBreadcrumbs()` | Single post | @@ -134,7 +146,7 @@ The `Breadcrumbs` class generates Schema.org-compatible breadcrumb markup. Conte ### class-resources.php | Hook | Type | Description | -|------|------|-------------| +| ------ | ------ | ------------- | | `init` | Action | Registers the `resources` custom post type | | `post_type_link` | Filter | Customizes resource permalinks to `/resources/{term-slug}/{post-name}` | @@ -149,7 +161,7 @@ The `resources` CPT uses a URL rewrite pattern that incorporates the first taxon All theme colors map to CSS custom properties. Use the CSS variable in your stylesheets or reference the slug in the block editor. | Slug | CSS Variable | Name | Value | -|------|-------------|------|-------| +| ------ | ------------- | ------ | ------- | | `black` | — | Black | `#000` | | `white` | — | White | `#fff` | | `theme-bg` | `var(--color-background)` | Theme Background | Dynamic | @@ -187,7 +199,7 @@ The dynamic colors (`theme-*`) resolve to CSS custom properties that can be over ### Font Sizes | Slug | CSS Variable | Name | -|------|-------------|------| +| ------ | ------------- | ------ | | `base` | `var(--text-base)` | Base | | `text-14px` | `var(--text-14px)` | Text 14px | | `text-16px` | `var(--text-16px)` | Text 16px | @@ -223,7 +235,7 @@ The dynamic colors (`theme-*`) resolve to CSS custom properties that can be over ### Font Family | Slug | CSS Variable | Name | -|------|-------------|------| +| ------ | ------------- | ------ | | `theme-sans` | `var(--font-sans)` | Theme Sans | ```css @@ -237,7 +249,7 @@ body { ### Layout | Setting | Value | -|---------|-------| +| --------- | ------- | | `contentSize` | `100%` | | `wideSize` | `1536px` | @@ -259,7 +271,7 @@ The entry point is `styles/theme.css`. All imports use the CSS `@import` syntax ### Import Order -``` +```plain styles/theme.css | +-- @import "tailwindcss" # Tailwind CSS v4 base @@ -325,12 +337,12 @@ Example -- adding a new `cards.css` component: ## JS Module Dependency Graph -``` +```plain theme.js (entry point) -├── Navigation.js # Mobile menu, sliding viewport, keyboard nav +├── Navigation.js # Mobile menu, sliding viewport, keyboard nav ├── backToTop.js # BackToTopButton custom element ├── button.js # ButtonComponent custom element, registerButtonComponent -├── GetHeaderHeight.js # Sets --header-height CSS variable +├── GetHeaderHeight.js # Sets --header-height CSS variable └── TagExternalLinks.js # Adds target="_blank" rel="noopener" to external links admin.js @@ -342,16 +354,16 @@ admin.js WordPress registers these script modules via `wp_register_script_module()`: | Module ID | Source | Dependencies | -|-----------|--------|--------------| -| `basicwp-theme` | `theme.js` | None | -| `basicwp-button` | `button.js` | `basicwp-theme` | -| `basicwp-admin` | `admin.js` | `basicwp-button` | +| ----------- | -------- | -------------- | +| `sf-evo-theme` | `theme.js` | None | +| `sf-evo-button` | `button.js` | `sf-evo-theme` | +| `sf-evo-admin` | `admin.js` | `sf-evo-button` | **Loading in a template:** ```php -wp_enqueue_script_module('basicwp-theme'); -wp_enqueue_script_module('basicwp-button'); +wp_enqueue_script_module('sf-evo-theme'); +wp_enqueue_script_module('sf-evo-button'); ``` --- @@ -371,7 +383,7 @@ const nav = new Navigation(toggleId, menuSelector); ### Methods | Method | Description | -|--------|-------------| +| -------- | ------------- | | `desktopMenuDropdowns()` | Enables dropdown menus for desktop navigation | | `mobileMenuToggle()` | Toggles the mobile hamburger menu open/closed | | `initializeSlidingViewport()` | Sets up the sliding mobile menu structure | @@ -400,11 +412,11 @@ nav.initializeSlidingViewport(); ## Helper Functions | Function | File | Signature | Description | -|----------|------|-----------|-------------| +| ---------- | ------ | ----------- | ------------- | | `getFieldValue` | helpers.php | `getFieldValue($field_path)` | Retrieves nested ACF values using dot notation. E.g., `getFieldValue('contact_info.phone')` resolves `get_field('contact_info', 'option')['phone']`. Uses `'option'` for Global Fields. | | `blockWrapperAttributes` | helpers.php | `blockWrapperAttributes($classes, $is_preview)` | Returns block wrapper attributes. In preview mode returns `class="..."`; on frontend returns `get_block_wrapper_attributes()`. | | `customMenuOrder` | helpers.php | `customMenuOrder($menu_ord)` | Customizes WordPress admin menu order. | -| `blockCategories` | helpers.php | `blockCategories($categories)` | Adds the `vdi-blocks` category to the block editor. | +| `blockCategories` | helpers.php | `blockCategories($categories)` | Adds the `sf-blocks` category to the block editor. | | `consoleLog` | helpers.php | `consoleLog($data)` | Outputs data to the browser console via `<script>console.log()</script>`. | | `customExcerpt` | helpers.php | `customExcerpt($text, $number_of_words, $more)` | Generates custom excerpts that end at sentence boundaries instead of mid-sentence. | | `escEmbeds` | helpers.php | `escEmbeds()` | Returns an allowed HTML array for iframe/embed content (used with `wp_kses`). | @@ -435,7 +447,7 @@ $excerpt = customExcerpt(get_the_content(), 30, '...'); ## Class Reference | Class | File | Key Methods | Description | -|-------|------|-------------|-------------| +| ------- | ------ | ------------- | ------------- | | `Enqueue` | `class-enqueue.php` | `enqFEAssets()`, `enqBEAssets()`, `enqEditorAssets()` | Manages all asset loading: frontend, admin, and editor | | `ACF` | `class-acf.php` | `saveJson($path)`, `loadJson($paths)` | Sets ACF JSON save/load paths for field group synchronization | | `Breadcrumbs` | `class-breadcrumbs.php` | `generate()`, `render()`, plus per-context methods (see below) | Generates Schema.org-compatible breadcrumb markup | @@ -446,7 +458,7 @@ $excerpt = customExcerpt(get_the_content(), 30, '...'); ### Breadcrumbs Method Details | Method | Returns | Description | -|--------|---------|-------------| +| -------- | --------- | ------------- | | `generate()` | `array` | Builds breadcrumb data array for the current context | | `render()` | `string` | Outputs breadcrumb HTML with Schema.org markup | | `getHomeBreadcrumb()` | `array` | Breadcrumb for the front page | @@ -472,7 +484,7 @@ echo $breadcrumbs->render(); ## CLI Commands | Command | Description | -|---------|-------------| +| --------- | ------------- | | `npm run build` | Compiles Tailwind CSS v4 from `styles/theme.css` to `static/dist/theme.css` with `--optimize` | | `npm run start` | Starts BrowserSync dev server with live reloading (alias for `npm run watch`) | | `npm run watch` | Runs `.watch.js` -- BrowserSync with CSS injection on changes | @@ -488,11 +500,11 @@ echo $breadcrumbs->render(); The deployment workflow is defined in `.github/workflows/wpengine.yml`. | Setting | Value | -|---------|-------| +| --------- | ------- | | Trigger | `workflow_dispatch` (manual). Push to `main` trigger is commented out. | | Skip condition | Commits containing `#skipGA` in the message are skipped | -| Target path | `wp-content/themes/vdi-v5` | -| WP Engine environment | `vdiv5` | +| Target path | `wp-content/themes/ soloframe-evo` | +| WP Engine environment | `soloframe-evo` | | SSH key secret | `WPE_SSHG_KEY_PRIVATE` | ### Deployment Steps @@ -506,12 +518,12 @@ The deployment workflow is defined in `.github/workflows/wpengine.yml`. ### rsync Flags -``` +```plain -azvr --inplace --delete --exclude=".*" ``` | Flag | Meaning | -|------|---------| +| ------ | --------- | | `-a` | Archive mode (preserve permissions, timestamps, etc.) | | `-z` | Compress during transfer | | `-v` | Verbose output | @@ -554,4 +566,4 @@ Auto-fixes PHPCS violations where possible. ### Playwright Configuration -The Playwright config (`playwright.config.js`) is currently set to run on **Chromium only**. Firefox and WebKit browsers are commented out but available for enabling. \ No newline at end of file +The Playwright config (`playwright.config.js`) is currently set to run on **Chromium only**. Firefox and WebKit browsers are commented out but available for enabling. diff --git a/docs/superpowers/specs/2026-05-03-onboarding-docs-design.md b/docs/superpowers/specs/2026-05-03-onboarding-docs-design.md deleted file mode 100644 index 5c3568b..0000000 --- a/docs/superpowers/specs/2026-05-03-onboarding-docs-design.md +++ /dev/null @@ -1,130 +0,0 @@ -# Onboarding Documentation Design - -## Goal - -Write thorough documentation that enables a new developer (team member or external contributor) to set up, understand, and work with the VDI-Starter-v5 WordPress theme with minimal hand-holding. - -## Audience - -Both internal team members and external contributors, served with layered docs — quick-start up top, deep dives below. - -## Approach - -Keep the existing README.md as a project overview (trimmed of deep-dive content that moves to `docs/`). Add a `docs/` directory with four focused guides. The README links to each guide. - -## Doc Structure - -``` -docs/ -├── getting-started.md # Setup from zero, local WP, env config, first build -├── architecture.md # Bootstrap flow, layers, conventions, namespacing, globals -├── creating-blocks.md # Step-by-step ACF block creation with block.json, fields, CSS -└── reference.md # Hooks/filters, theme.json tokens, CSS architecture, JS modules, deployment -``` - -Plus updates to README.md: trim deep-dive content, add Documentation section with links, fix known discrepancies. - -## Writing Style - -Detailed and explanatory — include context and rationale ("why"), not just "what" and "how". Short paragraphs with code examples and tables where appropriate. Designed to be read end-to-end by a newcomer, but also scannable for quick lookup. - -## Guide Contents - -### 1. getting-started.md - -**Purpose:** Get a developer from zero to a running local environment. - -- Prerequisites (Node 22+, pnpm/npm, PHP 8+, Composer, Local by Flywheel or equivalent) -- Local WordPress setup options (Local by Flywheel, DevKinsta, Docker) with pros/cons -- Clone, install, build, run steps (npm install, composer install, npm run build, npm run start/watch) -- .env configuration (LOCALHOST_URL, BROWSERSYNC_PORT) -- BrowserSync behavior (what triggers reload, which port, how to configure) -- What happens on theme activation — **important warning**: - - Plugin auto-installation (7 plugins downloaded from URLs) - - Default page creation (Home, News, 404, Contact Us) - - WordPress reading settings configuration - - Owner role creation - - Warning: do not activate on existing sites without reviewing `lib/activation.php` -- Troubleshooting common issues: - - CSS not compiling → run `npm run build` - - Blocks not appearing → ACF Pro must be active - - Menu not rendering → must assign menu to location in WP admin - - JavaScript not loading → check script module support (WP 6.5+) - -### 2. architecture.md - -**Purpose:** Explain how the theme is organized and how it boots. - -- Bootstrap flow: `functions.php` → glob autoload of `lib/*.php` → `init` hook → class instantiation -- The 7 architectural layers (from knowledge graph): - 1. **Entry** — `functions.php` and `style.css` (theme declaration) - 2. **Service Layer** — PHP classes in `lib/` (Enqueue, MenuItems, Breadcrumbs, ACF, Resources) - 3. **UI Templates** — WordPress template hierarchy, ACF blocks, components, partials, icons - 4. **Styling** — Layered CSS with Tailwind v4 (base → components → blocks → navigation) - 5. **Client Scripts** — JS modules (Navigation, BackToTop, Button, GetHeaderHeight, TagExternalLinks) - 6. **Data Layer** — ACF field group JSON schemas in `acf/` - 7. **Infrastructure** — Build scripts, CI/CD pipelines, project configs, tests -- Namespace conventions: - - PHP namespace: `BasicWP` - - Text domain: `basicwp` - - Block category: `vdi-blocks` - - WP Engine folder: `vdi-v5` - - Explain the relationship between these naming choices -- Global variables: `$views` (path to views/ directory) and `$theme` (theme directory path) -- WordPress hooks cleanup in `hooks.php`: what gets removed (emojis, block library styles, REST links, XML-RPC) and why — performance and security rationale -- Enqueue system: `wp_enqueue_script_module()` for JS (dependency graph: theme → button, backToTop, Navigation, etc.) vs traditional `wp_enqueue_script` for admin -- theme.json design system: color palette (12 colors via CSS custom properties), font sizes (15 presets), spacing, layout - -### 3. creating-blocks.md - -**Purpose:** Teach a developer how to create a new ACF block from scratch. - -- Anatomy of a block: `block.json` (registration) + PHP template (rendering) + CSS file (scoped styles) -- Step-by-step tutorial creating a new "Testimonial" block: - 1. Create directory `views/blocks/testimonial/` - 2. Create `block.json` with required fields (name, title, description, category, icon, supports) - 3. Create `testimonial.php` template using `blockWrapperAttributes()` and `getFieldValue()` - 4. Create `testimonial.css` for block-specific styles - 5. Create ACF field group in WP admin → exported to `acf/` as JSON -- How blocks are auto-registered: `regACFBlocks()` in `functions.php` scans `views/blocks/*/block.json` -- Helper functions: `blockWrapperAttributes()` for class/id passthrough, `getFieldValue()` for dot-notation ACF access -- Parent-child block patterns: buttons→button, grid→grid-cell (using `allowed_blocks` or `InnerBlocks`) -- Tailwind in blocks: how the whitelist system works (`whitelist.php`), how to add editor-only classes -- Block CSS loading: each block's CSS file is auto-enqueued by the block registration - -### 4. reference.md - -**Purpose:** Complete API and configuration reference for quick lookup. - -- **Hooks and Filters** — Complete table of all `add_action`/`add_filter` calls from `hooks.php`, `extras.php`, `search-features.php`, and class files, with priority, callback, and purpose -- **theme.json Design Tokens** — Color palette (12 colors with CSS variable names), font sizes (15 presets with rem values), spacing scale, layout sizes -- **CSS Architecture** — Import tree from `theme.css`, explanation of each layer (base, components, blocks, navigation), how to add new stylesheets -- **JS Module Dependency Graph** — Visual/text tree showing `theme.js` → Navigation, BackToTop, Button, GetHeaderHeight, TagExternalLinks; `admin.js` → Button -- **Navigation Class API** — Methods for the sliding viewport feature (initializeSlidingViewport, navigateToLevel, navigateBack, etc.), configuration options -- **Helper Functions** — `getFieldValue()`, `blockWrapperAttributes()`, `customMenuOrder()`, `blockCategories()`, `consoleLog()`, `customExcerpt()`, `escEmbeds()` -- **Class Reference** — Enqueue (enqFEAssets, enqBEAssets, enqEditorAssets), ACF (saveJson, loadJson), Breadcrumbs (generate, render, and per-page-type methods), MenuItems (render), Resources (CPT + permalink rewrite), ShowTemplate (debug template path) -- **CLI Commands** — `npm run build`, `npm run start`/`npm run watch`, `composer lint`, `composer fix`, Playwright test commands -- **Deployment Workflow** — GitHub Actions `wpengine.yml` pipeline: install deps → build Tailwind → rsync to WP Engine -- **Testing** — Playwright a11y test setup and commands, PHPCS configuration and usage - -## README.md Changes - -- Trim: Remove the detailed function-level API docs (they move to `reference.md`) -- Trim: Remove the detailed project structure tree (keep a shorter version, point to `architecture.md` for the full picture) -- Add: "Documentation" section with links to all four guides -- Fix: Wrong CSS paths (`views/styles/` → `styles/`) -- Fix: Missing `contact-info` block from the block list -- Fix: Deployment filename typo (`wpengine,yml` → `wpengine.yml`) -- Fix: Note that `class-enqueue.php` also has `enqEditorAssets()` -- Add: Mention `backToTop.js` custom element (missing from current README) -- Add: Clarify namespace conventions (BasicWP, basicwp, vdi-blocks, vdi-v5) - -## Implementation Plan - -This is a documentation-only change — no code modifications. Implementation consists of: - -1. Create `docs/` directory with 4 markdown files -2. Update `README.md` with trimmed content and links -3. Fix known discrepancies in README - -Estimated scope: ~4 documentation files of ~200-400 lines each, plus README edits. \ No newline at end of file diff --git a/footer.php b/footer.php index 4ce59d1..dedeed0 100644 --- a/footer.php +++ b/footer.php @@ -2,11 +2,11 @@ /** * Theme footer template * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; $footerLogo = getFieldValue( 'footer.footer_logo.url' ) ? getFieldValue( 'footer.footer_logo.url' ) : ''; $footerDesc = getFieldValue( 'footer.footer_description' ) ? getFieldValue( 'footer.footer_description' ) : ''; diff --git a/front-page.php b/front-page.php index 10b0719..b1ee790 100644 --- a/front-page.php +++ b/front-page.php @@ -2,10 +2,10 @@ /** * Front Page Template * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; get_header(); ?> diff --git a/functions.php b/functions.php index 59e3d91..a3d09f1 100644 --- a/functions.php +++ b/functions.php @@ -1,15 +1,15 @@ <?php /** - * Functions file for the BasicWP theme. + * Functions file for the SoloFrameEvo theme. * * This file initializes the theme by including necessary dependencies * and loading additional function files. * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; // Load functions. foreach ( glob( __DIR__ . '/lib/*.php' ) as $filename ) { diff --git a/header.php b/header.php index c5c079f..eddc5f9 100644 --- a/header.php +++ b/header.php @@ -2,11 +2,11 @@ /** * Theme header template * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; global $views; diff --git a/index.php b/index.php index 108af7f..b4ac28c 100644 --- a/index.php +++ b/index.php @@ -2,11 +2,11 @@ /** * Blog posts list * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; // Determine classes based on sidebar presence if ( hasSidebar() ) { diff --git a/lib/activation.php b/lib/activation.php index 94d4e5d..7fe6a5c 100644 --- a/lib/activation.php +++ b/lib/activation.php @@ -18,11 +18,11 @@ if ( isset( $_GET['activated'] ) && is_admin() ) { * Sample nested structure * * 'Parent Page' => array( - * 'Subpage 1' => array( - * 'Sub-subpage 1', - * 'Sub-subpage 2' + * 'Child page 1' => array( + * 'Grandchild page 1', + * 'Grandchild page 2' * ), - * 'Subpage 2.2' => array() + * 'Child page 2' => array() * ), */ ); @@ -105,17 +105,9 @@ if ( isset( $_GET['activated'] ) && is_admin() ) { $muPlugins = array( array( - 'url' => 'https://docs.vincentdevelopment.ca/files/advanced-custom-fields-pro.zip', + 'url' => 'https://downloads.wordpress.org/plugin/secure-custom-fields.6.9.3.zip', 'active' => true, ), - array( - 'url' => 'https://docs.vincentdevelopment.ca/files/gravity-forms.zip', - 'active' => true, - ), - array( - 'url' => 'https://updraftplus.com/wp-content/uploads/updraftplus.zip', - 'active' => false, - ), array( 'url' => 'https://downloads.wordpress.org/plugin/simple-history.5.11.0.zip', 'active' => true, @@ -128,10 +120,6 @@ if ( isset( $_GET['activated'] ) && is_admin() ) { 'url' => 'https://downloads.wordpress.org/plugin/better-search-replace.1.4.10.zip', 'active' => true, ), - array( - 'url' => 'https://downloads.wordpress.org/plugin/google-site-kit.1.153.0.zip', - 'active' => false, - ), ); // Custom log file diff --git a/lib/class-acf.php b/lib/class-acf.php index 65116db..c672cd7 100644 --- a/lib/class-acf.php +++ b/lib/class-acf.php @@ -2,11 +2,11 @@ /** * ACF (Advanced Custom Fields) support class & functions * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; /** * Class ACF diff --git a/lib/class-breadcrumbs.php b/lib/class-breadcrumbs.php index c89c699..605da1b 100644 --- a/lib/class-breadcrumbs.php +++ b/lib/class-breadcrumbs.php @@ -1,5 +1,5 @@ <?php -namespace BasicWP; +namespace SoloFrameEvo; /** * Class Breadcrumbs diff --git a/lib/class-enqueue.php b/lib/class-enqueue.php index 2058a8a..228488d 100644 --- a/lib/class-enqueue.php +++ b/lib/class-enqueue.php @@ -1,12 +1,12 @@ <?php /** - * BasicWP Theme Enqueue Class + * SoloFrameEvo Theme Enqueue Class * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; /** * Class Enqueue @@ -39,7 +39,7 @@ class Enqueue { $css_path = '/static/dist/theme.css'; if ( file_exists( $theme_dir . $css_path ) ) { $version = filemtime( $theme_dir . $css_path ); - wp_enqueue_style( 'basicwp-theme', $theme_uri . $css_path, array(), $version ); + wp_enqueue_style( 'sf-evo-theme', $theme_uri . $css_path, array(), $version ); } $font_ver = gmdate( 'U' ); @@ -53,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 ); - wp_enqueue_script_module( 'basicwp-button', $theme_uri . '/static/js/components/button.js', array( 'basicwp-theme' ), $version ); + wp_enqueue_script_module( 'sf-evo-theme', $theme_uri . $js_path, array(), $version ); + wp_enqueue_script_module( 'sf-evo-button', $theme_uri . '/static/js/components/button.js', array( 'sf-evo-theme' ), $version ); } } @@ -74,7 +74,7 @@ class Enqueue { $admin_css_path = '/styles/backend/admin.css'; if ( file_exists( $theme_dir . $admin_css_path ) ) { $version = filemtime( $theme_dir . $admin_css_path ); - wp_enqueue_style( 'basicwp-admin', $theme_uri . $admin_css_path, array(), $version ); + wp_enqueue_style( 'sf-evo-admin', $theme_uri . $admin_css_path, array(), $version ); } /** @@ -84,8 +84,8 @@ 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 ); - wp_enqueue_script_module( 'basicwp-button', $theme_uri . '/static/js/components/button.js', array( 'basicwp-admin' ), $version ); + wp_enqueue_script_module( 'sf-evo-admin', $theme_uri . $admin_js_path, array(), $version ); + wp_enqueue_script_module( 'sf-evo-button', $theme_uri . '/static/js/components/button.js', array( 'sf-evo-admin' ), $version ); } } @@ -103,7 +103,7 @@ class Enqueue { 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 ); + wp_enqueue_style( 'sf-evo-editor', $theme_uri . $editor_css_path, array(), $version ); } } } diff --git a/lib/class-menuitems.php b/lib/class-menuitems.php index b00d06e..4d6a4de 100644 --- a/lib/class-menuitems.php +++ b/lib/class-menuitems.php @@ -1,12 +1,12 @@ <?php /** - * BasicWP MenuItems Class + * SoloFrameEvo MenuItems Class * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; /** * Class MenuItems diff --git a/lib/class-resources.php b/lib/class-resources.php index 12e58ac..9f4fbcf 100644 --- a/lib/class-resources.php +++ b/lib/class-resources.php @@ -2,11 +2,11 @@ /** * Resources custom post type & taxonomies * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; /** * Class Resources diff --git a/lib/extras.php b/lib/extras.php index 3142418..0eb5f1f 100644 --- a/lib/extras.php +++ b/lib/extras.php @@ -2,11 +2,11 @@ /** * Filters. etc * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; /** Get child pages of the current page, sorted by menu order. * @@ -154,7 +154,7 @@ function getTheTitle() { } elseif ( is_search() ) { $title = sprintf( /* translators: %s is replaced with the search query */ - __( 'Search Results for "%s"', 'basicwp' ), + __( 'Search Results for "%s"', 'sf-evo' ), get_search_query() ); } elseif ( is_404() ) { diff --git a/lib/helpers.php b/lib/helpers.php index be9223f..f5ec02e 100644 --- a/lib/helpers.php +++ b/lib/helpers.php @@ -1,12 +1,12 @@ <?php /** - * BasicWP Theme Helpers + * SoloFrameEvo Theme Helpers * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; // Define global variables for theme and views folder paths. global $theme, $views; @@ -122,8 +122,8 @@ add_filter( 'menu_order', __NAMESPACE__ . '\\customMenuOrder', 10, 1 ); */ function blockCategories( $categories ) { $vdi_cat = array( - 'slug' => 'vdi-blocks', - 'title' => 'VDI Custom Blocks', + 'slug' => 'sf-blocks', + 'title' => 'SoloFrame Custom Blocks', 'icon' => 'dashicons-admin-customizer', ); diff --git a/lib/hooks.php b/lib/hooks.php index 511b186..d80998d 100644 --- a/lib/hooks.php +++ b/lib/hooks.php @@ -1,12 +1,12 @@ <?php /** - * BasicWP Theme Hooks + * SoloFrameEvo Theme Hooks * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; /** * Add preconnect for Google fonts to head diff --git a/lib/search-features.php b/lib/search-features.php index a8257af..6896f64 100644 --- a/lib/search-features.php +++ b/lib/search-features.php @@ -1,12 +1,12 @@ <?php /** - * Search features for BasicWP theme. + * Search features for SoloFrameEvo theme. * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; /** * Modifies the WordPress query object for page search functionality. diff --git a/lib/show-template.php b/lib/show-template.php index 3ab3e9a..198501b 100644 --- a/lib/show-template.php +++ b/lib/show-template.php @@ -2,11 +2,11 @@ /** * Add a comment to show which template is being used on the current page. * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; /** * Class ShowTemplate @@ -14,7 +14,7 @@ namespace BasicWP; * Displays the active WordPress template in the footer for debugging purposes. * Determines which template WordPress has chosen to use and outputs it as an HTML comment. * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ class ShowTemplate { diff --git a/package-lock.json b/package-lock.json index ec0ced1..3596065 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { - "name": "vdi-starter-v5", + "name": "soloframe-evo", "version": "5.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "vdi-starter-v5", + "name": "soloframe-evo", "version": "5.0", "license": "MIT", "dependencies": { diff --git a/package.json b/package.json index 6f4fad8..b99c737 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { - "name": "vdi-starter-v5", + "name": "soloframe-evo", "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.", + "description": "SoloFrame Evo 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", @@ -9,7 +9,7 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/Vincent-Design-Inc/VDI-Starter-v5.git" + "url": "git+https://github.com/ksolomon/SoloFrame Evo.git" }, "keywords": [ "wordpress", @@ -21,9 +21,9 @@ "author": "Keith Solomon <keith@vincentdesign.ca>", "license": "MIT", "bugs": { - "url": "https://github.com/Vincent-Design-Inc/VDI-Starter-v5/issues" + "url": "https://github.com/ksolomon/SoloFrame Evo/issues" }, - "homepage": "https://github.com/Vincent-Design-Inc/VDI-Starter-v5#readme", + "homepage": "https://github.com/ksolomon/SoloFrame Evo#readme", "devDependencies": { "@axe-core/playwright": "^4.10.1", "@playwright/test": "^1.52.0", diff --git a/page.php b/page.php index 317f494..d6b27be 100644 --- a/page.php +++ b/page.php @@ -2,11 +2,11 @@ /** * Single Pages * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; get_header(); diff --git a/search.php b/search.php index 8499e37..b290395 100644 --- a/search.php +++ b/search.php @@ -2,11 +2,11 @@ /** * Blog search template * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; // Determine classes based on sidebar presence if ( hasSidebar() ) { diff --git a/sidebar-page.php b/sidebar-page.php index ac23f09..342f23a 100644 --- a/sidebar-page.php +++ b/sidebar-page.php @@ -2,14 +2,14 @@ /** * Page Sidebar * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; ?> <aside class="sidebar sidebar-page"> - <h2><?php esc_html_e( 'Page Sidebar', 'basicwp' ); ?></h2> + <h2><?php esc_html_e( 'Page Sidebar', 'sf-evo' ); ?></h2> <?php dynamic_sidebar( 'sidebar-page' ); ?> </aside> diff --git a/sidebar.php b/sidebar.php index b777db8..8344614 100644 --- a/sidebar.php +++ b/sidebar.php @@ -2,10 +2,10 @@ /** * Sidebar * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; ?> diff --git a/single.php b/single.php index 673c44b..8af3270 100644 --- a/single.php +++ b/single.php @@ -2,11 +2,11 @@ /** * Single Posts * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; get_header(); diff --git a/style.css b/style.css index a09198e..aa1ce98 100644 --- a/style.css +++ b/style.css @@ -3,5 +3,5 @@ * Description: Custom WordPress theme starter for VDI Projects * Version: 5.0 * Author: Vincent Design Inc. - * Text Domain: basicwp + * Text Domain: sf-evo */ diff --git a/views/blocks/accordion/accordion.php b/views/blocks/accordion/accordion.php index 99788c6..84856df 100644 --- a/views/blocks/accordion/accordion.php +++ b/views/blocks/accordion/accordion.php @@ -4,10 +4,10 @@ * * This is the template that renders the Accordion block. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; $open = get_field( 'open' ); $group = get_field( 'group_items' ); diff --git a/views/blocks/boilerplate/block.json b/views/blocks/boilerplate/block.json index af32025..b31837a 100644 --- a/views/blocks/boilerplate/block.json +++ b/views/blocks/boilerplate/block.json @@ -5,7 +5,7 @@ "style": [ "file:./boilerplate.css" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "block-default", "keywords": [ "boilerplate" diff --git a/views/blocks/boilerplate/boilerplate.php b/views/blocks/boilerplate/boilerplate.php index fc0ec89..3b46509 100644 --- a/views/blocks/boilerplate/boilerplate.php +++ b/views/blocks/boilerplate/boilerplate.php @@ -4,10 +4,10 @@ * * This is the template for building your own custom blocks. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; $classes = 'boilerplate'; diff --git a/views/blocks/button/block.json b/views/blocks/button/block.json index 73e4641..982ce5c 100644 --- a/views/blocks/button/block.json +++ b/views/blocks/button/block.json @@ -1,8 +1,8 @@ { "name": "acf/button", - "title": "Button (VDI)", + "title": "Button (SFE)", "description": "A button.", - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "button", "keywords": [ "button" diff --git a/views/blocks/button/button.php b/views/blocks/button/button.php index ddb24b7..bd8c353 100644 --- a/views/blocks/button/button.php +++ b/views/blocks/button/button.php @@ -2,10 +2,10 @@ /** * Button block * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; // Retrieve ACF fields $element = get_field( 'element' ) ? get_field( 'element' ) : 'a'; diff --git a/views/blocks/buttons/block.json b/views/blocks/buttons/block.json index 321ca5f..e393670 100644 --- a/views/blocks/buttons/block.json +++ b/views/blocks/buttons/block.json @@ -1,9 +1,9 @@ { "name": "acf/buttons", - "title": "Buttons (VDI)", + "title": "Buttons (SFE)", "description": "A button or group of buttons.", "allowedBlocks": [ "acf/button" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "button", "keywords": [ "buttons" diff --git a/views/blocks/buttons/buttons.php b/views/blocks/buttons/buttons.php index 28bb5ba..9519e9e 100644 --- a/views/blocks/buttons/buttons.php +++ b/views/blocks/buttons/buttons.php @@ -4,10 +4,10 @@ * * This is the template that renders the Buttons block. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; $ibClasses = 'flex flex-wrap gap-4 w-full justify-center sm:justify-start'; diff --git a/views/blocks/contact-info/block.json b/views/blocks/contact-info/block.json index 427509c..960046f 100644 --- a/views/blocks/contact-info/block.json +++ b/views/blocks/contact-info/block.json @@ -5,7 +5,7 @@ "style": [ "file:./contact-info.css" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "feedback", "keywords": [ "contact info", diff --git a/views/blocks/contact-info/contact-info.php b/views/blocks/contact-info/contact-info.php index c2e9a39..cb945ee 100644 --- a/views/blocks/contact-info/contact-info.php +++ b/views/blocks/contact-info/contact-info.php @@ -4,10 +4,10 @@ * * Display contact information from global fields with icons and optional form. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; $classes = 'contact-info'; $wrapper = blockWrapperAttributes( $classes, $is_preview ); @@ -19,13 +19,13 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview ); <h2 class="text-2xl font-bold mb-4">Contact Information</h2> <div class="not-prose text-black my-4"> - <h3 class="mb-0"><?php echo esc_html__( 'Mailing Address', 'basicwp' ); ?></h3> + <h3 class="mb-0"><?php echo esc_html__( 'Mailing Address', 'sf-evo' ); ?></h3> <p class="my-0.5"><?php echo wp_kses_post( get_field( 'contact_info', 'option' )['address'] ); ?></p> - <h3 class="mb-0"><?php echo esc_html__( 'Email', 'basicwp' ); ?></h3> + <h3 class="mb-0"><?php echo esc_html__( 'Email', 'sf-evo' ); ?></h3> <p class="my-0.5"><a class="hover:opacity-80 transition-colors duration-100" href="mailto:<?php echo esc_html( get_field( 'contact_info', 'option' )['email'] ); ?>"><?php echo esc_html( get_field( 'contact_info', 'option' )['email'] ); ?></a></p> - <h3 class="mb-0"><?php echo esc_html__( 'Phone', 'basicwp' ); ?></h3> + <h3 class="mb-0"><?php echo esc_html__( 'Phone', 'sf-evo' ); ?></h3> <p class="my-0.5"><a class="hover:opacity-80 transition-colors duration-100" href="tel:<?php echo esc_html( get_field( 'contact_info', 'option' )['phone'] ); ?>"><?php echo esc_html( get_field( 'contact_info', 'option' )['phone'] ); ?></a></p> </div> </div> diff --git a/views/blocks/grid-cell/block.json b/views/blocks/grid-cell/block.json index 5f03d21..9588cb7 100644 --- a/views/blocks/grid-cell/block.json +++ b/views/blocks/grid-cell/block.json @@ -1,11 +1,11 @@ { "name": "acf/grid-cell", - "title": "Grid Cell (VDI)", + "title": "Grid Cell (SFE)", "description": "Custom grid cell block.", "style": [ "file:./grid-cell.css" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "grid-view", "keywords": [ "grid" diff --git a/views/blocks/grid-cell/grid-cell.php b/views/blocks/grid-cell/grid-cell.php index 6050b47..d88d303 100644 --- a/views/blocks/grid-cell/grid-cell.php +++ b/views/blocks/grid-cell/grid-cell.php @@ -4,10 +4,10 @@ * * This is the template that displays the Grid Cell block. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; // Initialize variables $className = ! empty( $block['className'] ) ? $block['className'] : ''; diff --git a/views/blocks/grid/block.json b/views/blocks/grid/block.json index b668335..d015344 100644 --- a/views/blocks/grid/block.json +++ b/views/blocks/grid/block.json @@ -1,12 +1,12 @@ { "name": "acf/grid", - "title": "Grid Block (VDI)", + "title": "Grid Block (SFE)", "description": "Custom grid block.", "style": [ "file:./grid.css" ], "allowedBlocks": [ "acf/grid-cell" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "grid-view", "keywords": [ "grid" diff --git a/views/blocks/grid/grid.php b/views/blocks/grid/grid.php index 4c0cef5..a81ed1c 100644 --- a/views/blocks/grid/grid.php +++ b/views/blocks/grid/grid.php @@ -4,10 +4,10 @@ * * This is the template that displays the grid block. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; $allowedBlocks = array( 'acf/grid-cell' ); $default_blocks = array( diff --git a/views/blocks/homepage-hero/block.json b/views/blocks/homepage-hero/block.json index a2760e2..980e022 100644 --- a/views/blocks/homepage-hero/block.json +++ b/views/blocks/homepage-hero/block.json @@ -5,7 +5,7 @@ "style": [ "file:./homepage-hero.css" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "block-default", "keywords": [ "homepage-hero", diff --git a/views/blocks/homepage-hero/homepage-hero.php b/views/blocks/homepage-hero/homepage-hero.php index 3cad658..0594ec6 100644 --- a/views/blocks/homepage-hero/homepage-hero.php +++ b/views/blocks/homepage-hero/homepage-hero.php @@ -2,10 +2,10 @@ /** * Block Name: Homepage Hero * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; // Retrieve ACF fields $heading = get_field( 'heading' ); diff --git a/views/blocks/media-text-innerblocks/block.json b/views/blocks/media-text-innerblocks/block.json index 9ad422f..a9934c5 100644 --- a/views/blocks/media-text-innerblocks/block.json +++ b/views/blocks/media-text-innerblocks/block.json @@ -5,7 +5,7 @@ "style": [ "file:./media-text-innerblocks.css" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "screenoptions", "keywords": [ "media", diff --git a/views/blocks/media-text-innerblocks/media-text-innerblocks.php b/views/blocks/media-text-innerblocks/media-text-innerblocks.php index 4c56f05..d9daf5c 100644 --- a/views/blocks/media-text-innerblocks/media-text-innerblocks.php +++ b/views/blocks/media-text-innerblocks/media-text-innerblocks.php @@ -4,10 +4,10 @@ * * This is the template that displays the media text inner blocks. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; // Retrieve ACF fields $bgColor = get_field( 'background_color' ) ? get_field( 'background_color' ) : '#c5c5c5'; diff --git a/views/blocks/media-text/block.json b/views/blocks/media-text/block.json index 13d7cfe..b23eead 100644 --- a/views/blocks/media-text/block.json +++ b/views/blocks/media-text/block.json @@ -5,7 +5,7 @@ "style": [ "file:./media-text.css" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "screenoptions", "keywords": [ "media", diff --git a/views/blocks/media-text/media-text.php b/views/blocks/media-text/media-text.php index dcc6e76..01b9cde 100644 --- a/views/blocks/media-text/media-text.php +++ b/views/blocks/media-text/media-text.php @@ -4,10 +4,10 @@ * * This is the template that displays the Media With Text block. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; // Retrieve ACF fields $bgColor = get_field( 'background_color' ) ? get_field( 'background_color' ) : '#c5c5c5'; diff --git a/views/blocks/page-children/block.json b/views/blocks/page-children/block.json index e516d3c..2cd3487 100644 --- a/views/blocks/page-children/block.json +++ b/views/blocks/page-children/block.json @@ -5,7 +5,7 @@ "style": [ "file:./page-children.css" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "block-default", "keywords": [ "page-children" diff --git a/views/blocks/page-children/page-children.php b/views/blocks/page-children/page-children.php index 5193f4e..2e06825 100644 --- a/views/blocks/page-children/page-children.php +++ b/views/blocks/page-children/page-children.php @@ -2,10 +2,10 @@ /** * Page Children block * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; // Retrieve the current page ID and its children $parentId = get_queried_object_id(); @@ -89,7 +89,7 @@ $wrapper = blockWrapperAttributes( $classes, $is_preview ); </h3> </div> - <div class="my-0 grow-1 text-18px text-gray-600 <?php echo esc_attr( $gcPad ); ?>"> + <div class="my-0 grow text-18px text-gray-600 <?php echo esc_attr( $gcPad ); ?>"> <?php if ( ! empty( $grandchildren ) ) { ?> diff --git a/views/blocks/section/block.json b/views/blocks/section/block.json index d6ce9ab..d751622 100644 --- a/views/blocks/section/block.json +++ b/views/blocks/section/block.json @@ -5,7 +5,7 @@ "style": [ "file:./section.css" ], - "category": "vdi-blocks", + "category": "sf-blocks", "icon": "align-wide", "keywords": [ "setion", diff --git a/views/blocks/section/section.php b/views/blocks/section/section.php index 9659e5c..30d17bb 100644 --- a/views/blocks/section/section.php +++ b/views/blocks/section/section.php @@ -4,10 +4,10 @@ * * This is the template that displays the section block. * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; // Retrieve ACF fields $contentWidth = get_field( 'content_width' ); diff --git a/views/components/menu-items/has-children.php b/views/components/menu-items/has-children.php index 182cc59..4f95f9e 100644 --- a/views/components/menu-items/has-children.php +++ b/views/components/menu-items/has-children.php @@ -6,7 +6,7 @@ * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ */ -namespace BasicWP; +namespace SoloFrameEvo; // Variables available: // $item from parent template diff --git a/views/components/menu-items/index.php b/views/components/menu-items/index.php index cf05dad..2f244e7 100644 --- a/views/components/menu-items/index.php +++ b/views/components/menu-items/index.php @@ -6,7 +6,7 @@ * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ */ -namespace BasicWP; +namespace SoloFrameEvo; // Variables available from MenuItems component: // $topLevelNavItems, $hasChildren, $nestedNavItems, $currentPage, $location diff --git a/views/components/menu-items/single.php b/views/components/menu-items/single.php index 7549302..3126518 100644 --- a/views/components/menu-items/single.php +++ b/views/components/menu-items/single.php @@ -6,7 +6,7 @@ * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ */ -namespace BasicWP; +namespace SoloFrameEvo; // Variables available: // $item from parent template diff --git a/views/components/nav-aux.php b/views/components/nav-aux.php index 60f32de..8749a85 100644 --- a/views/components/nav-aux.php +++ b/views/components/nav-aux.php @@ -6,7 +6,7 @@ * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation-aux.html */ -namespace BasicWP; +namespace SoloFrameEvo; // Init Variables global $wp, $views; diff --git a/views/components/nav-main.php b/views/components/nav-main.php index e5626a7..214369d 100644 --- a/views/components/nav-main.php +++ b/views/components/nav-main.php @@ -6,7 +6,7 @@ * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ */ -namespace BasicWP; +namespace SoloFrameEvo; global $views; ?> diff --git a/views/components/nav-main__toggle.php b/views/components/nav-main__toggle.php index bf2c3f2..51aafd9 100644 --- a/views/components/nav-main__toggle.php +++ b/views/components/nav-main__toggle.php @@ -6,7 +6,7 @@ * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/navigation/ */ -namespace BasicWP; +namespace SoloFrameEvo; // Init Variables $navIcon = isset( get_field( 'header', 'option' )['nav_icon'] ) ? get_field( 'header', 'option' )['nav_icon'] : ''; diff --git a/views/forms/search.php b/views/forms/search.php index e548be6..d0a0505 100644 --- a/views/forms/search.php +++ b/views/forms/search.php @@ -6,24 +6,24 @@ * https://docs.vincentdevelopment.ca/docs/starter-v3-enhancements/search-global.html */ -namespace BasicWP; +namespace SoloFrameEvo; ?> <search role="search"> - <form method="get" action="<?php echo esc_url( home_url( '/' ) ); ?>" class="global-search-form relative flex justify-start max-w-full w-full"> - <label for="globalSearch"> - <svg role="img" aria-labelledby="globalSearchLabel" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" class="absolute w-4 top-2 left-2 fill-primary-700"> - <title id="globalSearchLabel"><?php echo esc_attr_x( 'Search', 'search-label', 'basicwp' ); ?> +
+ + + + - + - - + + diff --git a/views/partials/page-hero.php b/views/partials/page-hero.php index a3b4795..6939d01 100644 --- a/views/partials/page-hero.php +++ b/views/partials/page-hero.php @@ -2,10 +2,10 @@ /** * Page Hero Partial * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; // Set variables $bgColor = get_field( 'background_color' ); diff --git a/views/partials/social-media.php b/views/partials/social-media.php index 1882923..affb9a1 100644 --- a/views/partials/social-media.php +++ b/views/partials/social-media.php @@ -2,10 +2,10 @@ /** * Social Media Links Partial * - * @package BasicWP + * @package SoloFrameEvo */ -namespace BasicWP; +namespace SoloFrameEvo; $classes = $args['classes'] ?? ''; $circle = $args['circle'] ?? ''; diff --git a/whitelist.php b/whitelist.php index 5748c62..b35e864 100644 --- a/whitelist.php +++ b/whitelist.php @@ -6,11 +6,11 @@ * These are for use in the editor and do not appear in the theme codebase, so * Tailwind does not know to include them without this list. * - * @package BasicWP + * @package SoloFrameEvo * @since 1.0.0 */ -namespace BasicWP; +namespace SoloFrameEvo; ?>