{"id":13760218,"url":"https://github.com/digitoimistodude/air-light","last_synced_at":"2026-02-06T15:13:34.757Z","repository":{"id":41309051,"uuid":"50655926","full_name":"digitoimistodude/air-light","owner":"digitoimistodude","description":"💨 WordPress starter theme - designed to be dependency-free, minimal, ultra-lightweight (\u003c 20 kB) and easy for all kinds of WordPress projects. We prefer the original WordPress way of doing things - no strange templating languages or frameworks here.","archived":false,"fork":false,"pushed_at":"2026-02-03T14:51:13.000Z","size":47437,"stargazers_count":1127,"open_issues_count":2,"forks_count":167,"subscribers_count":28,"default_branch":"master","last_synced_at":"2026-02-03T23:50:32.492Z","etag":null,"topics":["accessibility-ready","accessible","development-theme","gutenberg","gutenberg-blocks","lightweight","navigation","one-column","sass","wordpress","wordpress-development","wordpress-starter-theme","wordpress-theme"],"latest_commit_sha":null,"homepage":"https://airwptheme.com","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/digitoimistodude.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-01-29T10:32:01.000Z","updated_at":"2026-02-03T17:39:59.000Z","dependencies_parsed_at":"2023-12-08T09:28:19.163Z","dependency_job_id":"72c6f417-f2b3-4dbb-ad8b-dfc176159899","html_url":"https://github.com/digitoimistodude/air-light","commit_stats":{"total_commits":2573,"total_committers":21,"mean_commits":"122.52380952380952","dds":0.4279051690633502,"last_synced_commit":"5af52f437a4988579a38d4b2ae6b9fd2d31e4723"},"previous_names":[],"tags_count":562,"template":false,"template_full_name":null,"purl":"pkg:github/digitoimistodude/air-light","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitoimistodude%2Fair-light","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitoimistodude%2Fair-light/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitoimistodude%2Fair-light/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitoimistodude%2Fair-light/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/digitoimistodude","download_url":"https://codeload.github.com/digitoimistodude/air-light/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/digitoimistodude%2Fair-light/sbom","scorecard":{"id":342724,"data":{"date":"2025-08-11","repo":{"name":"github.com/digitoimistodude/air-light","commit":"486e1ef22ba61dcafc3fccf0f7a35d9a29d79a3c"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"Maintained","score":10,"reason":"30 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Code-Review","score":0,"reason":"Found 0/27 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/html.yml:1","Warn: no topLevel permission defined: .github/workflows/js.yml:1","Warn: no topLevel permission defined: .github/workflows/php.yml:1","Warn: no topLevel permission defined: .github/workflows/php8.3.yml:1","Warn: no topLevel permission defined: .github/workflows/styles.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE.md:0","Info: FSF or OSI recognized license: MIT License: LICENSE.md:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/html.yml:15: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/html.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/js.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/js.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/js.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/php.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/php.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/php.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/php.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/php.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/php.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/php8.3.yml:18: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/php8.3.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/php8.3.yml:21: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/php8.3.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/php8.3.yml:27: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/php8.3.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/styles.yml:12: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/styles.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/styles.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/digitoimistodude/air-light/styles.yml/master?enable=pin","Warn: npmCommand not pinned by hash: bin/tasks/dependencies.sh:5","Warn: npmCommand not pinned by hash: bin/tasks/dependencies.sh:6","Warn: downloadThenRun not pinned by hash: bin/tasks/wsl-packages.sh:5","Warn: npmCommand not pinned by hash: .github/workflows/js.yml:25","Warn: npmCommand not pinned by hash: .github/workflows/styles.yml:25","Info:   0 out of   7 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   4 third-party GitHubAction dependencies pinned","Info:   0 out of   4 npmCommand dependencies pinned","Info:   0 out of   1 downloadThenRun dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 6 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"13 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-pfrx-2q88-qq97","Warn: Project is vulnerable to: GHSA-m5qc-5hw7-8vg7","Warn: Project is vulnerable to: GHSA-35jh-r3h4-6jhm","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-7fh5-64p2-3v2j","Warn: Project is vulnerable to: GHSA-pq67-2wwv-3xjx","Warn: Project is vulnerable to: GHSA-8cj5-5rvv-wf4v","Warn: Project is vulnerable to: GHSA-4v9v-hfq4-rm2v","Warn: Project is vulnerable to: GHSA-9jgg-88mc-972h","Warn: Project is vulnerable to: GHSA-3h5v-q93c-6h6q"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-18T06:16:28.978Z","repository_id":41309051,"created_at":"2025-08-18T06:16:28.978Z","updated_at":"2025-08-18T06:16:28.978Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29166229,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-06T14:37:12.680Z","status":"ssl_error","status_checked_at":"2026-02-06T14:36:22.973Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["accessibility-ready","accessible","development-theme","gutenberg","gutenberg-blocks","lightweight","navigation","one-column","sass","wordpress","wordpress-development","wordpress-starter-theme","wordpress-theme"],"created_at":"2024-08-03T13:01:05.539Z","updated_at":"2026-02-06T15:13:34.736Z","avatar_url":"https://github.com/digitoimistodude.png","language":"PHP","funding_links":[],"categories":["SCSS"],"sub_categories":[],"readme":"## Air-light - A minimalist WordPress starter theme\n\n[![GitHub release](https://img.shields.io/github/v/release/digitoimistodude/air-light?style=for-the-badge)](https://github.com/digitoimistodude/air-light/releases) [![WordPress](https://img.shields.io/badge/WordPress-%23117AC9.svg?style=for-the-badge\u0026logo=WordPress\u0026logoColor=white)](#) [![PHP](https://img.shields.io/badge/PHP-777BB4?style=for-the-badge\u0026logo=php\u0026logoColor=white)](#) [![Build Status for PHP 8.3](https://img.shields.io/github/actions/workflow/status/digitoimistodude/air-light/php8.3.yml?style=for-the-badge\u0026label=PHP%208.3)](https://github.com/digitoimistodude/air-light/actions/workflows/php8.3.yml) [![Build Status for HTML](https://img.shields.io/github/actions/workflow/status/digitoimistodude/air-light/html.yml?style=for-the-badge\u0026label=HTML)](https://github.com/digitoimistodude/air-light/actions/workflows/html.yml) [![Build Status for JS](https://img.shields.io/github/actions/workflow/status/digitoimistodude/air-light/js.yml?style=for-the-badge\u0026label=JS)](https://github.com/digitoimistodude/air-light/actions/workflows/js.yml) [![Build Status for CSS](https://img.shields.io/github/actions/workflow/status/digitoimistodude/air-light/styles.yml?style=for-the-badge\u0026label=CSS)](https://github.com/digitoimistodude/air-light/actions/workflows/styles.yml) [![Build Status for PHP](https://img.shields.io/github/actions/workflow/status/digitoimistodude/air-light/php.yml?style=for-the-badge\u0026label=PHP)](https://github.com/digitoimistodude/air-light/actions/workflows/php.yml)\n\nAir-light (or simply *Air*) is designed to be an ultra minimal starting point for a WordPress project at [Digitoimisto Dude Oy](https://www.dude.fi), a Finnish boutique digital agency in the center of Jyväskylä. Theme is originally based on [\\_s](https://github.com/automattic/_s). We welcome all happy contributors with open arms!\n\n## [Demo](https://airwptheme.com/demo) | [Documentation](https://github.com/digitoimistodude/air-light/wiki)\n\n* **CSS gzipped:** 16.8 KB *(originally 124.4 KB)*\n* **JS gzipped:** 8.6 KB *(28.6 KB original)*\n* **Front page HTML**: 7.4 KB *(29.4 KB original)*\n\n\u003cimg width=\"1200\" height=\"630\" alt=\"air-light-github-cover-web-10\" src=\"https://github.com/user-attachments/assets/792488d5-88c7-418d-9861-ac8efc1d9595\" /\u003e\n\n## Weekly updates!\n\nThis theme is constantly kept up to date by a bunch of [awesome contributors](https://github.com/digitoimistodude/air-light/graphs/contributors). Wanna join in development? Read [the instructions for contributing](#contributing) and let us know about your first PR!\n\n![Alt](https://repobeats.axiom.co/api/embed/bd95f5747b41d3cf662e033044af08dee9a15f9f.svg \"Repobeats analytics image\")\n\n### Mission \u0026 vision\n\nAir-light is built to be very straightforward, backwards compatible, front-end developer friendly and modular by its structure. Following [Underscores](https://github.com/automattic/_s) and [WordPress Theme Coding Standards](https://codex.wordpress.org/Theme_Development#Theme_Development_Standards) best practices and most of the changes in \\_s are implemented as soon as they are committed.\n\n**Our mission and goal** is **minimalism** and **simplicity**. **Our vision** is to build a theme that will not implement its own wrappers or functions, will not use any templating languages that would take things further from traditional PHP or CSS, will contain nothing that people will not use or need. Air-light will be free of weird \"app-like\" folder structures or odd syntaxes that nobody else uses. We love WordPress as it was and as it is.\n\nAir was renamed to air-light in version 3.7.8 (March 20th, 2018), because *air* was already taken in the official WordPress theme directory.\n\n### Official, approved, accessibility-ready!\n\nAir-light v. 4.2.2 was approved to [official WordPress theme directory](https://wordpress.org/themes/air-light/) on June 4, 2018. But please note, all changes you do to the theme without generating your own or changing textdomain will be overridden in theme updates - so if you use this theme as a starting point, please follow instructions and/or replace the textdomain with your own.\n\n## Table of contents\n\n1. [Usage](#usage)\n2. [Please note before using](#please-note-before-using)\n3. [License](#license)\n4. [Features](#features)\n    1. [Layout base \u0026 grid](#layout-base--grid)\n    2. [Typography](#typography)\n    3. [Development](#development)\n    4. [Navigation](#navigation)\n    5. [WordPress \u0026 functions](#wordpress--functions)\n    6. [Custom Post Types](#custom-post-types)\n    7. [Custom Taxonomies](#custom-taxonomies)\n    8. [Namespaced PHP](#namespaced-php)\n    9. [Accessibility](#accessibility)\n    10. [Lazy load](#lazy-load)\n    11. [Disabled features](#disabled-features)\n5. [Extra building blocks](#extra-building-blocks)\n    1. [Sticky navigation](#sticky-navigation)\n    2. [WooCommerce support](#woocommerce-support)\n6. [Requirements](#requirements)\n7. [Recommendations for development](#recommendations-for-development)\n8. [How to build a new theme](#how-to-build-a-new-theme)\n9. [Contributing](#contributing)\n    1. [Air development](#air-development)\n    2. [Debuggers](#debuggers)\n    3. [Releasing a new version (staff only)](#releasing-a-new-version-staff-only)\n10. [Notes](#notes)\n\n### Please note before using\n\nAir is a **development theme**, so it has updates very often. By using this starter theme, you agree that anything can change to a different direction without a warning when you look at this dev-git the next time. Please note this theme has no updates inside WordPress by design. Use this theme to hack it to pieces and create your new awesome theme based on Air! Please also see [Debuggers](#debuggers)!\n\nAir is not meant to be \"a theme for everyone\", which means it doesn't have all the parts that are generally included in multi-purpose themes for non-technical people (please see [Disabled features](#disabled-features)).\n\nIf you want to use this theme as starter for your new theme, please note the theme won't necessarily be that much fun or won't look good by default and needs work from you. We recommend using [Sage](https://roots.io/sage/) if you need something more extended.\n\n### License\n\nAir is licensed with [The MIT License (MIT)](http://choosealicense.com/licenses/mit/) which means you can freely use this theme commercially or privately, modify it, or distribute it, but you are forbidden to hold Dude liable for anything, or claim that what you do with this is made by us.\n\n## Theme structure\n\nWe try to follow traditional WordPress [Template Hierarchy](https://developer.wordpress.org/themes/basics/template-hierarchy) as much as possible. This way we will provide a low threshold for junior developers and go hand in hand with official [WordPress Theme Coding Standards](https://developer.wordpress.org/coding-standards/wordpress-coding-standards/).\n\nPlease see [Visual Overview](https://developer.wordpress.org/themes/basics/template-hierarchy/#visual-overview) if you are interested in how the WordPress theme structure works.\n\n### Features\n\nSome features, WooCommerce support and personal preferences of Dude are moved to [Air helper](https://github.com/digitoimistodude/air-helper) plugin.\n\n#### Layout base \u0026 grid\n\n* Gutenberg-ready\n* Flexbox-ready\n* CSS Grid-ready\n* SVG-ready\n* [SASS](http://sass-lang.com/)-support (SCSS-syntax)\n* CSS reset from [sanitize.css](https://github.com/csstools/sanitize.css)\n* Section blocks and containers\n* Basic and minimal CSS framework for forms, commenting and typography\n\n#### Typography\n\n* Responsive typography with viewport units with fallbacks, see more in [sass/layout/\\_typography.scss](https://github.com/digitoimistodude/air/blob/master/sass/layout/_typography.scss) and [sass/base/\\_helpers.scss](https://github.com/digitoimistodude/air/blob/master/sass/base/_helpers.scss#L91), default syntax is `@include responsive-font($font-size-min, $font-size-max);` (formerly [Megatype](https://github.com/StudioThick/megatype), still recommended with blogs or text-only based sites, but **not** included by default after 1.5.0)\n* Web fonts file are preferred, helper included: [Sass Boilerplate's fontFace-mixin](https://github.com/magnetikonline/sassboilerplate/blob/master/fontface.scss). Put files in `fonts/` directory, you'll need .odt, .ttf, .woff, .woff2. Then just `@include fontFace('Proxima Nova', '../../fonts/proximanova-regular-webfont', 400);` in \\_typography.scss.\n\n#### Development\n\n* [BrowserSync](http://www.browsersync.io/) for keeping multiple browsers and devices synchronized while testing, along with injecting updated CSS and JS into your browser while you're developing\n* [Parcel](https://parceljs.org/) build tool that compiles Sass, bundles JavaScript, and optimizes assets with zero configuration\n* [npm](https://www.npmjs.com) for front-end package management\n\n#### Navigation\n\n* Dependency-free, all in Vanilla JS\n* Custom navigation walker built accessibility in mind\n* Fully accessible\n* Full keyboard navigation support\n* Arrow navigation support\n* WCAG 2.0 AA compliant: Dropdowns close when pressing Esc while hovering\n* Supports multi-level drop down submenus\n* Supports animations\n* Hover-intent support\n* Focus trap for mobile navigation\n* Accessible burger menu\n* Easy to customize\n\n#### WordPress \u0026 functions\n\n* Available for translation, full Polylang Pro support\n* Support for Post Thumbnails on posts and pages\n* Gutenberg support\n* HTML5 core markup for WordPress elements\n* **Air specific:** Hero template, section *blocks*\n\n#### Custom Post Types\n\nAir-light can register your CPT:s automatically.\n\n1. Add your custom post type to theme settings under post\\_types, located in `functions.php` like this:\n\n```\n'post_types' =\u003e [\n  'Your_Post_Type'\n]\n```\n\n2. Add a file `inc/post-types/your-post-type.php`\n3. Extend `Post_Type` class with `Your_Post_Type` and define your post type in a public function called `register()`. See the example: `inc/post-types/your-post-type.php`.\n\n#### Custom Taxonomies\n\nAir-light can register your Taxonomies automatically.\n\n1. Add your taxonomy to theme settings under taxonomies, located in `functions.php` like this:\n\n```\n'taxonomies' =\u003e [\n  'Your_Taxonomy' =\u003e [ 'post', 'page', 'your-post-type' ]\n]\n```\n\n2. Add a file `inc/taxonomies/your-taxonomy.php`\n3. Extend `Taxonomy` class with `Your_Taxonomy` and define your taxonomy in a public function called `register()`. See the example: `inc/taxonomies/your-taxonomy.php`.\n\n### Namespaced PHP\n\nAir-light uses namespaced PHP since 5.0.0. This means that we no longer need to prefix functions and hooks, because `namespace Air_Light;` takes care of that.\n\nWhen old function format was:\n\n``` php\n// Pre_get_posts\nadd_action( 'pre_get_posts', 'dude_pre_get_posts' );\nfunction dude_pre_get_posts( $query ) {\n  // Do something\n}\n```\n\nNew format goes like this:\n\n``` php\n// Pre_get_posts\nadd_action( 'pre_get_posts', __NAMESPACE__ . '\\pre_get_posts' );\nfunction pre_get_posts( $query ) {\n  // Do something\n}\n```\n\n#### Accessibility\n\nCreating accessible websites is really important and our goal is to make air as accessible-ready as possible. Theme fully supports navigating with keyboard and screen-readers. Other accessible features:\n\n* [Navigation patterns](#navigation)\n* Skip to content link\n* Smart focus for keyboard users, [what-input](https://github.com/ten1seven/what-input) baked in\n* Valid HTML\n* Accessible SVG icons\n* Screen reader class\n* External link indicators\n* Underlined links\n* Content-aware back to top link\n* WCAG 2.0 AAA Accessible-ready Gravity Forms styles (needs [WCAG 2.0 form fields for Gravity Forms](https://wordpress.org/plugins/gravity-forms-wcag-20-form-fields/), included in [dudestack](https://github.com/digitoimistodude/dudestack))\n\n#### Lazy load\n\nFrom 4.7.1 air-light has a lazy loading image features for background images and imgs. If you don't use this feature, remove it from [scripts](https://github.com/digitoimistodude/blob/d517688bb400ac68100dcbdcd4bc7dbce7739099/js/src/scripts.js#L10). This feature depends on [air-helper](https://github.com/digitoimistodude/air-helper), check out [the documentation in air-helper](https://github.com/digitoimistodude/air-helper#image-lazyloading-1) for further instructions.\n\n#### Disabled features\n\n* Widgets\n* Post formats\n* Jetpack support\n* (Threaded) comments\n* Underscores Template tags\n* Sidebar\n\n### Javascript\n\n#### Structure\n\nAll .js files in `/assets/src/js/` are built to `/assets/dist/js/` folder. The main scripts file loaded in front end is `/assets/src/js/front-end.js`.\n\nIf you want to add a piece of custom JS, create a file under `/assets/src/js/modules/` and import or require it in `/assets/src/js/front-end.js`. If you need admin-specific JS, add a `/assets/src/js/admin.js` and then enqueue `/assets/dist/js/admin.js` with `enqueue_admin_scripts`\n\n### Extra building blocks\n\n#### Sticky navigation\n\nAir has a sticky navigation baked in.\n\n##### How to enable\n\nYou can enable the sticky navigation by uncommenting navSticky() in the assets/src/js/front-end.js file.\n\n#### WooCommerce support\n\nAir had by default a basic WooCommerce support [from version 1.9.2](https://github.com/digitoimistodude/commit/55c539bb9cd2e35fdbfdf4f39a136c542b42b884), and for a while it was been separated to its own repository, [air-woocommerce](https://github.com/digitoimistodude/air-woocommerce) since v2.5.6.\n\n##### How to enable\n\nStarting from v2.6.0 WooCommerce support comes with [Air helper](https://github.com/digitoimistodude/air-helper) plugin and Air contains optional very basic WC styles. Air helper will add it's WC functionality when theme support for WooCommerce is added. To enable:\n\n1. Get [Air helper](https://github.com/digitoimistodude/air-helper)\n2. Activate the plugin\n\n### Requirements\n\n* PHP \u003e= 8.3\n* Requires at least: WordPress 4.7.1\n* Tested up to WordPress 6.8.2\n\n### Recommendations for development\n\n* macOS\n* Node.js and npm\n* [Dudestack](https://github.com/digitoimistodude/dudestack) \\- A toolkit for creating a new professional WordPress project with deployments\\. Heavily based on Bedrock by Roots\\.\n\n### How to build a new theme\n\nPlease refer to Wiki section [Getting started in theming with Air-light](https://github.com/digitoimistodude/air-light/wiki#2-getting-started-in-theming-with-air-light).\n\n### Usage\n\nSee [Documentation](https://github.com/digitoimistodude/air-light/wiki).\n\n### Contributing\n\nIf you have ideas about the theme or spot an issue, please let us know. Before contributing ideas or reporting an issue about \"missing\" features or things regarding to the nature of that matter, please read [Please note](#please-note-before-using) section. Thank you very much.\n\nIf you want to contribute to the development, please follow these instructions:\n\n1. Create a fork of this repository (or new branch if you have editor/maintainer permissions)\n2. Make your changes\n3. Create a pull request\n\n### Air development\n\n#### Installation\n\nIf you want to improve air, you have two options.\n\n##### 1\\. Use dudestack\n\nAir is originally built on [dudestack](https://github.com/digitoimistodude/dudestack). Install our development environment with these steps (unix only, sorry Windows!):\n\n1. `mkdir -p /var/www \u0026\u0026 cd /var/www/ \u0026\u0026 git clone https://github.com/digitoimistodude/dudestack`\n2. Go to bin folder `cd /var/www/dudestack/bin` and run `bash wsl.sh` or `bash macos.sh` depending on your platform. Follow instructions.\n3. Run `createproject`, name project after *airdev* when asked\n4. Wait for the project to be created (get a coffee, first time can take couple of minutes)\n5. Create a fork of air-light (press fork button on GitHub) (or if you are Dude staff, just create new branch for changes)\n6. Go to the themes folder of your WordPress instance via Terminal (`cd /var/www/airdev/content/themes`)\n7. Clone your fork with `git clone git@github.com:yourusername/air-light.git` (replace `yourusername` with your actual username)\n8. Cd to your new cloned repository `cd /var/www/airdev/content/themes/air-light`\n9. Run `nvm use`.\n10. Install the dependencies by running `npm install` inside the theme folder (if you don't have npm installed, see [here](https://www.npmjs.com/get-npm) or just use [homebrew](https://brew.sh))\n11. Wait npm to get through files (get another cup of coffee)\n12. Activate theme - if you are using the lightweight [macos-lemp-setup](https://github.com/digitoimistodude/macos-lemp-setup): `cd /var/www/airdev \u0026\u0026 vendor/wp-cli/wp-cli/bin/wp theme activate air-light`\n13. Open whole project to your preferred coding editor, for example when using [Visual Studio Code](https://github.com/ronilaukkarinen/vscode-settings) that would be `code /var/www/airdev/content/themes/air-light` or via GUI (Open folder).\n14. Go to back to air-light dir with `cd /var/www/airdev/content/themes/air-light` and then run `npm run dev` and start developing!\n\nYou may want to add `alias wp='./vendor/wp-cli/wp-cli/bin/wp'` for [macos-lemp-setup](https://github.com/digitoimistodude/macos-lemp-setup) to be able to run WP-CLI with just `wp`.\n\n##### 2\\. Use your own stack\n\nTo install air-light to your own development environment, just clone your fork to your theme directory, activate the theme, and make changes. If you make changes to front-end (JS/SCSS), you'll need npm dependencies, so make sure you go through steps 9-10 and 12 above.\n\nWhen you make changes, commit them with clear describing commit messages and them make a pull request. We are happy to accept improvements!\n\n##### Content and unit tests\n\nNext you just need to add content and menu via [airdev.test/admin](http://airdev.test/), or you can use the ready-made content:\n\n1. `cd ~/Projects/airdev`\n2. `wp plugin install wordpress-importer --activate`\n3. `wget https://wpcom-themes.svn.automattic.com/demo/theme-unit-test-data.xml`\n4. `wp import theme-unit-test-data.xml --authors=create`\n\n### Debuggers\n\nAir-light comes with [PHP_CodeSniffer](https://github.com/squizlabs/PHP_CodeSniffer) for PHP files, [stylelint](https://github.com/stylelint/stylelint) for SCSS/CSS files and [eslint](https://github.com/eslint/eslint) for JS files. **Please note, you need to configure global versions of these separately!**\n\nIt's also recommended to use [Query Monitor](https://wordpress.org/plugins/query-monitor/) plugin, as some debugging messages goes straight to it's logger.\n\nThe golden rule here is to make sure the commands `stylelint`, `eslint` and `phpcs` work from command line.\n\n#### How to install PHP_CodeSniffer with WordPress Coding Standards\n\nThis tutorial is based on the official instructions in [WordPress-Coding-Standards](https://github.com/WordPress/WordPress-Coding-Standards) and can be found also in our Internal handbook [How to install the latest PHP_CodeSniffers with latest WordPress-Coding-Standards](https://app.gitbook.com/o/PedExJWZmbCiZe4gDwKC/s/VVikkYgIZ9miBzwYDCYh/servers/scripts-and-automation/upgrade-php-to-a-new-version/scan-wordpress-sites-files-for-php-version-compatibility-e.-g.-php-8.3) (private)\n\nFirst, remove the old phpcs installation if you have one:\n\n```bash\nsudo rm /usr/local/bin/phpcs\n```\n\nThen go to home (not _really yet_, just on your command line, lol):\n\n```bash\ncd $HOME\n```\n\nThen, install phpcs + WPCS via [composer](https://getcomposer.org/):\n\n```bash\ncomposer global config allow-plugins.dealerdirect/phpcodesniffer-composer-installer true\ncomposer global require --dev wp-coding-standards/wpcs:\"^3.0\"\n```\n\nSymlink globally:\n\n```bash\nsudo ln -s $HOME/.composer/vendor/bin/phpcs /usr/local/bin/phpcs\nsudo chmod +x /usr/local/bin/phpcs\n```\n\nGet PHPCompatibility package:\n\n```bash\ncomposer global require --dev phpcompatibility/php-compatibility:\"*\"\n```\n\nTest it works:\n\n```bash\nphpcs -i\n```\n\nOutput should read:\n\n```bash\nThe installed coding standards are MySource, PEAR, PSR1, PSR2, PSR12, Squiz, Zend, PHPCompatibility, Modernize, NormalizedArrays, Universal, PHPCSUtils, WordPress, WordPress-Core, WordPress-Docs and WordPress-Extra\n```\n\nCheck that other linters work: `stylelint -v`, `eslint -v`\n\n#### For your editor\n\nIt's also best to have all `stylelint`, `eslint`, `phpcs` living inside your editor. We think [Visual Studio Code](https://github.com/ronilaukkarinen/vscode-settings) is best for this, check out the [plugins inside vscode-settings repository](https://github.com/ronilaukkarinen/vscode-settings) to make sure everything is installed.\n\n### Releasing a new version (staff only)\n\nThis release cycle will release a new version to:\n\n- [GitHub](https://github.com/digitoimistodude/air-light)\n- [WordPress.org](https://wordpress.org/themes/air-light/)\n- [Demo site](https://dudetest.xyz/air/)\n\nWhenever you have updates that are worthwhile, commit them with clear commit messages and then do versioning. Every meaningful commit or bunch of commits that form a feature together make the version go up semantically 0.0.1.\n\nUse bash alias (replace YOURUSERNAME with your own):\n\n``` bash\nalias release_new_air_version='git push \u0026\u0026 git push --tags \u0026\u0026 rsync -av -e ssh --exclude={\"/node_modules/*\",\"/bin/*\",\"/assets/src/*\"} /var/www/airdev/content/themes/air-light/* YOURUSERNAME@YOURSERVER:/var/www/airwptheme.com/public_html/demo/content/themes/air-light/ \u0026\u0026 /var/www/airdev/content/themes/air-light/bin \u0026\u0026 sh air-move-out.sh \u0026\u0026 sh air-pack.sh'\n```\n\nThe release cycle:\n\n1. Commit your changes or merge a pull request\n2. Search and replace version in style.css, functions.php, package.json, readme.txt, CHANGELOG.md. Remember update Tested up WordPress version as well.\n3. Add a tag with `git tag -a x.x.x` commands, add the same description than in CHANGELOG.md\n4. Run `release_new_air_version` (this will move dotfiles etc. out, take care of packing and will give the URL for uploading to WordPress.org)\n5. Follow script instructions (do a theme check and upload the theme)\n6. Run `sh air-move-in.sh`. This will move dev-version back and restore the git functionality.\n\nThat's it, you released a new version!\n\n### Notes\n\nGzip file sizes tested with `wc -c assets/dist/css/global.css` and `gzip -c assets/dist/css/global.css | wc -c` commands.\n\n**Theme developers please note:** if you use phpcs in [SublimeLinter as custom standard](https://github.com/ronilaukkarinen/sublime-settings/blob/master/Library/Application%20Support/Sublime%20Text%203/Packages/User/SublimeLinter.sublime-settings#L47) on [dudestack](https://github.com/digitoimistodude/dudestack), you will need extra content/themes/air-light subfolders inside the theme directory for it to work on both global projects and with air-light.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdigitoimistodude%2Fair-light","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdigitoimistodude%2Fair-light","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdigitoimistodude%2Fair-light/lists"}