From 82cbf66589fadc679e4fb0dbb626f318dc8c7ff9 Mon Sep 17 00:00:00 2001 From: Olivier Gorzalka Date: Wed, 7 Oct 2026 09:53:07 +0200 Subject: [PATCH 1/4] docs: refresh the README --- README.md | 82 ++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 25 deletions(-) diff --git a/README.md b/README.md index 63694c4..ce13e8c 100644 --- a/README.md +++ b/README.md @@ -1,32 +1,44 @@ -# Apiary +

+ + Apiary: a WooCommerce theme for Pollora + +

-A WooCommerce theme built on the [Pollora](https://pollora.dev) framework, featuring Tailwind CSS v4 and Alpine.js. +

+ Version + License +

-## Requirements +Apiary is a complete WooCommerce storefront for [Pollora](https://pollora.dev), written in Blade with Tailwind CSS v4 and Alpine.js. Every shop page is covered, from the product grid to the cart, the checkout and the customer account, so you start a shop from a finished design and change what you need instead of overriding WooCommerce template by template. -- PHP 8.1+ -- WordPress 6.0+ -- [Pollora](https://pollora.dev) framework -- [WooCommerce](https://woocommerce.com/) 8.0+ -- Node.js 18+ (for asset compilation) +

+ The Apiary storefront +

## Installation -The theme must be installed within a Pollora project. +Apiary is the "E-commerce" template of `pollora:make:theme`: ```bash -# Install Node dependencies -npm install - -# Build production assets -npm run build +php artisan pollora:make:theme my-shop # then choose "E-commerce" +# or, without the prompt +php artisan pollora:make:theme my-shop --repository=Pollora/theme-apiary ``` +The command downloads the latest tag, fills in the theme's name and namespace, compiles the translations, offers to install and activate WooCommerce (declared in `requirements.json`), runs `npm install` and `npm run build`, and offers to activate the theme. + +Requirements: + +- A Pollora project: PHP 8.4+ and WordPress 7.1+ for a new one +- [WooCommerce](https://woocommerce.com/) 10.3+: the template overrides are written against 10.3, and CI runs the current release +- Node.js 20.19+ or 22.12+ (Vite 8), for the asset build + ## Development ```bash -# Start Vite dev server with HMR -npm run dev +cd themes/my-shop +npm run dev # Vite dev server with hot reload +npm run build # production assets ``` The Vite dev server auto-detects DDEV/Docker environments for proper HMR configuration. @@ -36,19 +48,22 @@ The Vite dev server auto-detects DDEV/Docker environments for proper HMR configu ``` %theme_name%/ ├── app/ # PHP application logic -│ ├── Cms/ # WordPress CMS integrations +│ ├── Cms/ # WordPress integrations (setup, cascade layers, WooCommerce) +│ ├── Http/Controllers/ # Controllers, including the product search API │ ├── Providers/ # Laravel service providers +│ ├── Services/ # Product price, search and URL helpers │ ├── Walkers/ # Custom menu walkers │ └── inc/ # Hooks, helpers, WooCommerce customizations ├── config/ # Theme configuration (menus, sidebars, supports, WooCommerce) ├── resources/ │ ├── assets/ # CSS, JavaScript, fonts, images -│ └── views/ # Blade templates (128 files) +│ └── views/ # Blade templates │ └── woocommerce/ # Full WooCommerce template overrides +├── routes/api.php # Theme API routes (prefix /api) ├── languages/ # Translations (text domain: %theme_name%) +├── requirements.json # Packages make:theme offers to install (WooCommerce) ├── theme.json # Base settings; the build adds the design tokens -├── vite.config.js # Build configuration -└── routes.php # Theme routes (optional) +└── vite.config.js # Build configuration ``` ## Features @@ -56,15 +71,16 @@ The Vite dev server auto-detects DDEV/Docker environments for proper HMR configu - **WooCommerce**: Complete template coverage (cart, checkout, my account, orders, product pages) - **Tailwind CSS v4**: Design tokens synced with WordPress `theme.json` - **Alpine.js**: Lightweight interactivity (menus, modals, cart slide-over) -- **Blade templates**: 128 views with component support -- **11 menu locations**: Header, footer, mobile, account, and more +- **Blade templates**: 130 views with component support +- **12 menu locations**: Header, footer, mobile, account, and more - **Accessibility**: Semantic HTML, ARIA labels, keyboard navigation - **i18n**: Fully translatable (French included) +- **Product search API**: `GET /api/products/search`, declared as a theme API route in `routes/api.php` ## Design tokens The design lives in the `@theme static` block of `resources/assets/css/app.css`: -colours, type scale, fonts and radii, with concrete values. `npm run build` +colors, type scale, fonts and radii, with concrete values. `npm run build` writes them into the `theme.json` the editor reads (`public/build/theme//assets/theme.json`), so the page and the editor always offer the same palette and sizes. @@ -107,16 +123,32 @@ All theme behavior is driven by config files in `config/`: | File | Purpose | | ------------------ | ----------------------------------------------- | | `admin.php` | WordPress admin customization | +| `config.php` | Asset paths and build settings | | `disable.php` | Disable unnecessary WP features | | `gutenberg.php` | Block editor categories | | `images.php` | Custom image sizes | +| `login.php` | Login screen logo and switches | | `menus.php` | Menu locations | | `providers.php` | Additional service providers | | `sidebars.php` | Widget areas | | `supports.php` | Theme supports (thumbnails, WooCommerce, etc.) | | `templates.php` | Custom page templates | -| `woocommerce.php` | Product grid classes, icons, checkout layout | +| `woocommerce.php` | Product grid classes, icons, checkout layout | + +## Documentation + +- [Themes](https://pollora.dev/theming/theme-structure/): generating a theme, its structure, `theme.json` and the Vite build +- [Assets and Vite](https://pollora.dev/theming/assets-vite/) +- [Theme API routes](https://pollora.dev/routing/wordpress-routes/#theme--plugin-api-routes), as used by `routes/api.php` + +## Template development + +This repository is a template: its files carry placeholders that `pollora:make:theme` substitutes, so it does not run as is. Develop on a theme generated under the slug `apiary` in a Pollora test project, then copy it back with `./bin/package-theme.sh /path/to/project/themes/apiary`, which turns the slug and namespace back into placeholders. `bin/` is removed when the theme is downloaded; it also holds the CI checks (`php bin/tests/design-system.php`, the HTTP sweep and the browser tests). + +## Contributing + +Contributions are welcome: see the [contributing guide](https://github.com/Pollora/.github/blob/main/CONTRIBUTING.md). Report security issues privately, as described in the [security policy](https://github.com/Pollora/.github/blob/main/SECURITY.md). ## License -GPL-2.0-or-later +Apiary is open-source software licensed under the [GPL-2.0-or-later](LICENSE). © [RuBee group](https://rubee.group) From 4c77a9d4714283a4a4231c1b58c93df6cb2504fc Mon Sep 17 00:00:00 2001 From: Olivier Gorzalka Date: Wed, 7 Oct 2026 09:53:07 +0200 Subject: [PATCH 2/4] chore: ship the GPL-2.0 text as LICENSE license.txt was a leftover from Themosis (its own name and copyright in the appendix). LICENSE now holds the unmodified GPL-2.0 text from gnu.org, the package script leaves both names alone, and package.json declares the same SPDX id as style.css. --- license.txt => LICENSE | 15 +++++++-------- bin/package-theme.sh | 2 ++ package.json | 1 + 3 files changed, 10 insertions(+), 8 deletions(-) rename license.txt => LICENSE (97%) diff --git a/license.txt b/LICENSE similarity index 97% rename from license.txt rename to LICENSE index 56c817e..9efa6fb 100644 --- a/license.txt +++ b/LICENSE @@ -2,7 +2,7 @@ Version 2, June 1991 Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. @@ -290,8 +290,8 @@ to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. - Themosis framework, a framework for WordPress developers. - Copyright (C) 2012 Julien Lambé + + Copyright (C) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -304,8 +304,7 @@ the "copyright" line and a pointer to where the full notice is found. GNU General Public License for more details. You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + with this program; if not, see . Also add information on how to contact you by electronic and paper mail. @@ -329,11 +328,11 @@ necessary. Here is a sample; alter the names: Yoyodyne, Inc., hereby disclaims all copyright interest in the program `Gnomovision' (which makes passes at compilers) written by James Hacker. - , 1 April 1989 - Ty Coon, President of Vice + , 1 April 1989 + Moe Ghoul, President of Vice This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. \ No newline at end of file +Public License instead of this License. diff --git a/bin/package-theme.sh b/bin/package-theme.sh index ac06d10..cd4d4ee 100755 --- a/bin/package-theme.sh +++ b/bin/package-theme.sh @@ -45,6 +45,8 @@ rsync -av --delete \ --exclude='README.md' \ --exclude='languages/*.mo' \ --exclude='screenshot.png' \ + --exclude='LICENSE' \ + --exclude='license.txt' \ --exclude='tailwind.safelist.txt' \ "$SOURCE/" "$TARGET_DIR/" \ --quiet diff --git a/package.json b/package.json index 94b405d..8acdd14 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,6 @@ { "private": true, + "license": "GPL-2.0-or-later", "type": "module", "scripts": { "dev": "vite", From 0f3e13709a076575d62a760d6a7b3def21eab5c8 Mon Sep 17 00:00:00 2001 From: Olivier Gorzalka Date: Wed, 7 Oct 2026 10:10:49 +0200 Subject: [PATCH 3/4] docs: move the showcase to .github/README.md and give generated projects their own README GitHub shows .github/README.md before the root one, and the scaffolder's File::allFiles() skips dot-directories, so the showcase stays on GitHub and the root README, with placeholders, becomes the generated project's guide. --- .github/README.md | 154 +++++++++++++++++++++++++++++++++++++++++ README.md | 171 +++++++++------------------------------------- 2 files changed, 188 insertions(+), 137 deletions(-) create mode 100644 .github/README.md diff --git a/.github/README.md b/.github/README.md new file mode 100644 index 0000000..cc2dd20 --- /dev/null +++ b/.github/README.md @@ -0,0 +1,154 @@ +

+ + Apiary: a WooCommerce theme for Pollora + +

+ +

+ Version + License +

+ +Apiary is a complete WooCommerce storefront for [Pollora](https://pollora.dev), written in Blade with Tailwind CSS v4 and Alpine.js. Every shop page is covered, from the product grid to the cart, the checkout and the customer account, so you start a shop from a finished design and change what you need instead of overriding WooCommerce template by template. + +

+ The Apiary storefront +

+ +## Installation + +Apiary is the "E-commerce" template of `pollora:make:theme`: + +```bash +php artisan pollora:make:theme my-shop # then choose "E-commerce" +# or, without the prompt +php artisan pollora:make:theme my-shop --repository=Pollora/theme-apiary +``` + +The command downloads the latest tag, fills in the theme's name and namespace, compiles the translations, offers to install and activate WooCommerce (declared in `requirements.json`), runs `npm install` and `npm run build`, and offers to activate the theme. + +Requirements: + +- A Pollora project: PHP 8.4+ and WordPress 7.1+ for a new one +- [WooCommerce](https://woocommerce.com/) 10.3+: the template overrides are written against 10.3, and CI runs the current release +- Node.js 20.19+ or 22.12+ (Vite 8), for the asset build + +## Development + +```bash +cd themes/my-shop +npm run dev # Vite dev server with hot reload +npm run build # production assets +``` + +The Vite dev server auto-detects DDEV/Docker environments for proper HMR configuration. + +## Structure + +``` +%theme_name%/ +├── app/ # PHP application logic +│ ├── Cms/ # WordPress integrations (setup, cascade layers, WooCommerce) +│ ├── Http/Controllers/ # Controllers, including the product search API +│ ├── Providers/ # Laravel service providers +│ ├── Services/ # Product price, search and URL helpers +│ ├── Walkers/ # Custom menu walkers +│ └── inc/ # Hooks, helpers, WooCommerce customizations +├── config/ # Theme configuration (menus, sidebars, supports, WooCommerce) +├── resources/ +│ ├── assets/ # CSS, JavaScript, fonts, images +│ └── views/ # Blade templates +│ └── woocommerce/ # Full WooCommerce template overrides +├── routes/api.php # Theme API routes (prefix /api) +├── languages/ # Translations (text domain: %theme_name%) +├── requirements.json # Packages make:theme offers to install (WooCommerce) +├── theme.json # Base settings; the build adds the design tokens +└── vite.config.js # Build configuration +``` + +## Features + +- **WooCommerce**: Complete template coverage (cart, checkout, my account, orders, product pages) +- **Tailwind CSS v4**: Design tokens synced with WordPress `theme.json` +- **Alpine.js**: Lightweight interactivity (menus, modals, cart slide-over) +- **Blade templates**: 130 views with component support +- **12 menu locations**: Header, footer, mobile, account, and more +- **Accessibility**: Semantic HTML, ARIA labels, keyboard navigation +- **i18n**: Fully translatable (French included) +- **Product search API**: `GET /api/products/search`, declared as a theme API route in `routes/api.php` + +## Design tokens + +The design lives in the `@theme static` block of `resources/assets/css/app.css`: +colors, type scale, fonts and radii, with concrete values. `npm run build` +writes them into the `theme.json` the editor reads +(`public/build/theme//assets/theme.json`), so the page and the editor +always offer the same palette and sizes. + +- Change a token in `app.css`, not in `theme.json`: the root `theme.json` is + only the base (layout, editor settings), and a slug defined there wins over + `@theme`. +- To keep a value out of Tailwind, define that slug in `theme.json`, or turn a + whole family off in `vite.config.js` (`disableTailwindColors`, + `disableTailwindFontSizes`, `disableTailwindFonts`, + `disableTailwindBorderRadius`). +- Spacing and layout widths are not generated: set them in `theme.json`. + +See [Theme.json and Vite Build Integration](https://pollora.dev/theming/theme-structure/) +for the details. + +## Gutenberg design system + +Every core block is styled in `theme.json` (`styles`: root, elements, blocks), +from the design tokens only, so a paragraph, a quote, a table or a button look +the same in the editor and on the page. Content is no longer styled by +Tailwind Typography (`prose`); product descriptions still are. + +- Reference presets by the name WordPress prints: `2xl` becomes + `var(--wp--preset--font-size--2-xl)`. Never a Tailwind variable: it does not + exist in the editor. A block's `css` takes one selector per rule. +- Links are styled inside content blocks (paragraph, list, table, verse), not + globally, so WooCommerce and the templates keep their own link styles. +- `app/Cms/StyleLayers.php` puts WordPress's CSS in cascade layers, declared at + the top of `app.css`: `theme, base, wp-core, wp, components, utilities`. The + block library and the global styles beat Tailwind's reset, and a Tailwind + class always beats them. +- `php bin/tests/design-system.php` (run in CI) checks that every preset and + custom variable the styles use exists. + +## Configuration + +All theme behavior is driven by config files in `config/`: + +| File | Purpose | +| ------------------ | ----------------------------------------------- | +| `admin.php` | WordPress admin customization | +| `config.php` | Asset paths and build settings | +| `disable.php` | Disable unnecessary WP features | +| `gutenberg.php` | Block editor categories | +| `images.php` | Custom image sizes | +| `login.php` | Login screen logo and switches | +| `menus.php` | Menu locations | +| `providers.php` | Additional service providers | +| `sidebars.php` | Widget areas | +| `supports.php` | Theme supports (thumbnails, WooCommerce, etc.) | +| `templates.php` | Custom page templates | +| `woocommerce.php` | Product grid classes, icons, checkout layout | + +## Documentation + +- [Themes](https://pollora.dev/theming/theme-structure/): generating a theme, its structure, `theme.json` and the Vite build +- [Assets and Vite](https://pollora.dev/theming/assets-vite/) +- [Theme API routes](https://pollora.dev/routing/wordpress-routes/#theme--plugin-api-routes), as used by `routes/api.php` + +## Template development + +This repository is a template: its files carry placeholders that `pollora:make:theme` substitutes, so it does not run as is. Develop on a theme generated under the slug `apiary` in a Pollora test project, then copy it back with `./bin/package-theme.sh /path/to/project/themes/apiary`, which turns the slug and namespace back into placeholders. `bin/` is removed when the theme is downloaded; it also holds the CI checks (`php bin/tests/design-system.php`, the HTTP sweep and the browser tests). + +## Contributing + +Contributions are welcome: see the [contributing guide](https://github.com/Pollora/.github/blob/main/CONTRIBUTING.md). Report security issues privately, as described in the [security policy](https://github.com/Pollora/.github/blob/main/SECURITY.md). + +## License + +Apiary is open-source software licensed under the [GPL-2.0-or-later](../LICENSE). © [RuBee group](https://rubee.group) diff --git a/README.md b/README.md index ce13e8c..990663e 100644 --- a/README.md +++ b/README.md @@ -1,154 +1,51 @@ -

- - Apiary: a WooCommerce theme for Pollora - -

+# %theme_name% -

- Version - License -

+%theme_description% -Apiary is a complete WooCommerce storefront for [Pollora](https://pollora.dev), written in Blade with Tailwind CSS v4 and Alpine.js. Every shop page is covered, from the product grid to the cart, the checkout and the customer account, so you start a shop from a finished design and change what you need instead of overriding WooCommerce template by template. +Built with [Pollora](https://pollora.dev) from the [Apiary](https://github.com/Pollora/theme-apiary) template: a WooCommerce storefront in Blade, Tailwind CSS v4 and Alpine.js. It needs the WooCommerce plugin, active. -

- The Apiary storefront -

- -## Installation - -Apiary is the "E-commerce" template of `pollora:make:theme`: - -```bash -php artisan pollora:make:theme my-shop # then choose "E-commerce" -# or, without the prompt -php artisan pollora:make:theme my-shop --repository=Pollora/theme-apiary -``` - -The command downloads the latest tag, fills in the theme's name and namespace, compiles the translations, offers to install and activate WooCommerce (declared in `requirements.json`), runs `npm install` and `npm run build`, and offers to activate the theme. - -Requirements: - -- A Pollora project: PHP 8.4+ and WordPress 7.1+ for a new one -- [WooCommerce](https://woocommerce.com/) 10.3+: the template overrides are written against 10.3, and CI runs the current release -- Node.js 20.19+ or 22.12+ (Vite 8), for the asset build - -## Development - -```bash -cd themes/my-shop -npm run dev # Vite dev server with hot reload -npm run build # production assets -``` - -The Vite dev server auto-detects DDEV/Docker environments for proper HMR configuration. - -## Structure +## What's inside ``` %theme_name%/ -├── app/ # PHP application logic -│ ├── Cms/ # WordPress integrations (setup, cascade layers, WooCommerce) -│ ├── Http/Controllers/ # Controllers, including the product search API -│ ├── Providers/ # Laravel service providers -│ ├── Services/ # Product price, search and URL helpers -│ ├── Walkers/ # Custom menu walkers -│ └── inc/ # Hooks, helpers, WooCommerce customizations -├── config/ # Theme configuration (menus, sidebars, supports, WooCommerce) +├── app/ # PHP classes, namespace %theme_namespace% +│ ├── Cms/ # WordPress and WooCommerce integrations +│ ├── Http/Controllers # Controllers, including the product search API +│ ├── Services/ # Product price, search and URL helpers +│ └── inc/ # Hooks, helpers, WooCommerce customizations +├── config/ # menus, sidebars, supports, image sizes, WooCommerce, login screen +├── languages/ # Translations (text domain: %theme_name%) ├── resources/ -│ ├── assets/ # CSS, JavaScript, fonts, images -│ └── views/ # Blade templates -│ └── woocommerce/ # Full WooCommerce template overrides -├── routes/api.php # Theme API routes (prefix /api) -├── languages/ # Translations (text domain: %theme_name%) -├── requirements.json # Packages make:theme offers to install (WooCommerce) -├── theme.json # Base settings; the build adds the design tokens -└── vite.config.js # Build configuration +│ ├── assets/ # CSS (design tokens in app.css), JS, fonts, images +│ └── views/ # Blade templates +│ └── woocommerce/ # WooCommerce template overrides +├── routes/api.php # Theme API routes, under /api +├── style.css # WordPress theme header +├── theme.json # Base editor settings; the build adds the design tokens +└── vite.config.js # Asset build ``` -## Features - -- **WooCommerce**: Complete template coverage (cart, checkout, my account, orders, product pages) -- **Tailwind CSS v4**: Design tokens synced with WordPress `theme.json` -- **Alpine.js**: Lightweight interactivity (menus, modals, cart slide-over) -- **Blade templates**: 130 views with component support -- **12 menu locations**: Header, footer, mobile, account, and more -- **Accessibility**: Semantic HTML, ARIA labels, keyboard navigation -- **i18n**: Fully translatable (French included) -- **Product search API**: `GET /api/products/search`, declared as a theme API route in `routes/api.php` +## Commands -## Design tokens +Run from `themes/%theme_name%`: -The design lives in the `@theme static` block of `resources/assets/css/app.css`: -colors, type scale, fonts and radii, with concrete values. `npm run build` -writes them into the `theme.json` the editor reads -(`public/build/theme//assets/theme.json`), so the page and the editor -always offer the same palette and sizes. - -- Change a token in `app.css`, not in `theme.json`: the root `theme.json` is - only the base (layout, editor settings), and a slug defined there wins over - `@theme`. -- To keep a value out of Tailwind, define that slug in `theme.json`, or turn a - whole family off in `vite.config.js` (`disableTailwindColors`, - `disableTailwindFontSizes`, `disableTailwindFonts`, - `disableTailwindBorderRadius`). -- Spacing and layout widths are not generated: set them in `theme.json`. - -See [Theme.json and Vite Build Integration](https://pollora.dev/theming/theme-structure/) -for the details. - -## Gutenberg design system - -Every core block is styled in `theme.json` (`styles`: root, elements, blocks), -from the design tokens only, so a paragraph, a quote, a table or a button look -the same in the editor and on the page. Content is no longer styled by -Tailwind Typography (`prose`); product descriptions still are. - -- Reference presets by the name WordPress prints: `2xl` becomes - `var(--wp--preset--font-size--2-xl)`. Never a Tailwind variable: it does not - exist in the editor. A block's `css` takes one selector per rule. -- Links are styled inside content blocks (paragraph, list, table, verse), not - globally, so WooCommerce and the templates keep their own link styles. -- `app/Cms/StyleLayers.php` puts WordPress's CSS in cascade layers, declared at - the top of `app.css`: `theme, base, wp-core, wp, components, utilities`. The - block library and the global styles beat Tailwind's reset, and a Tailwind - class always beats them. -- `php bin/tests/design-system.php` (run in CI) checks that every preset and - custom variable the styles use exists. +```bash +npm run dev # Vite dev server with hot reload +npm run build # production assets +``` -## Configuration +From the project root: -All theme behavior is driven by config files in `config/`: +```bash +php artisan pollora:make:block my-block --theme=%theme_name% # a new Gutenberg block +php artisan discovery:clear # after adding attribute-based classes +php artisan pollora:doctor # when something fails without an error +``` -| File | Purpose | -| ------------------ | ----------------------------------------------- | -| `admin.php` | WordPress admin customization | -| `config.php` | Asset paths and build settings | -| `disable.php` | Disable unnecessary WP features | -| `gutenberg.php` | Block editor categories | -| `images.php` | Custom image sizes | -| `login.php` | Login screen logo and switches | -| `menus.php` | Menu locations | -| `providers.php` | Additional service providers | -| `sidebars.php` | Widget areas | -| `supports.php` | Theme supports (thumbnails, WooCommerce, etc.) | -| `templates.php` | Custom page templates | -| `woocommerce.php` | Product grid classes, icons, checkout layout | +Change colors, font sizes, fonts and radii in the `@theme static` block of `resources/assets/css/app.css`, not in `theme.json`: `npm run build` writes them into the `theme.json` the editor reads. -## Documentation +## Read more -- [Themes](https://pollora.dev/theming/theme-structure/): generating a theme, its structure, `theme.json` and the Vite build +- [Themes](https://pollora.dev/theming/theme-structure/): structure, template hierarchy, `theme.json` and the Vite build - [Assets and Vite](https://pollora.dev/theming/assets-vite/) -- [Theme API routes](https://pollora.dev/routing/wordpress-routes/#theme--plugin-api-routes), as used by `routes/api.php` - -## Template development - -This repository is a template: its files carry placeholders that `pollora:make:theme` substitutes, so it does not run as is. Develop on a theme generated under the slug `apiary` in a Pollora test project, then copy it back with `./bin/package-theme.sh /path/to/project/themes/apiary`, which turns the slug and namespace back into placeholders. `bin/` is removed when the theme is downloaded; it also holds the CI checks (`php bin/tests/design-system.php`, the HTTP sweep and the browser tests). - -## Contributing - -Contributions are welcome: see the [contributing guide](https://github.com/Pollora/.github/blob/main/CONTRIBUTING.md). Report security issues privately, as described in the [security policy](https://github.com/Pollora/.github/blob/main/SECURITY.md). - -## License - -Apiary is open-source software licensed under the [GPL-2.0-or-later](LICENSE). © [RuBee group](https://rubee.group) +- [Theme API routes](https://pollora.dev/routing/wordpress-routes/#theme--plugin-api-routes) From c465df2964ac75dc0acf8c9d59db34b77a270e5a Mon Sep 17 00:00:00 2001 From: Olivier Gorzalka Date: Wed, 7 Oct 2026 10:10:49 +0200 Subject: [PATCH 4/4] chore: keep packaging from overwriting what the template owns The rsync now leaves README.md, .github/ and the license files alone (with --delete it removed .github/ and its workflows), the sed loop and leak check skip .github/ and bin/ (they rewrote the template's own tests), and the package.json license is set back after the sync. --- bin/package-theme.sh | 30 +++++++++++++++++++++++++++--- 1 file changed, 27 insertions(+), 3 deletions(-) diff --git a/bin/package-theme.sh b/bin/package-theme.sh index cd4d4ee..5c44c54 100755 --- a/bin/package-theme.sh +++ b/bin/package-theme.sh @@ -42,19 +42,43 @@ rsync -av --delete \ --exclude='.claude' \ --exclude='package-theme.sh' \ --exclude='bin/' \ - --exclude='README.md' \ --exclude='languages/*.mo' \ --exclude='screenshot.png' \ - --exclude='LICENSE' \ - --exclude='license.txt' \ --exclude='tailwind.safelist.txt' \ + --exclude='/README.md' \ + --exclude='/.github/' \ + --exclude='/LICENSE' \ + --exclude='/license.txt' \ "$SOURCE/" "$TARGET_DIR/" \ --quiet +# package.json comes from the development copy, which declares no license (or +# another one): the template's is GPL-2.0-or-later, the same as LICENSE. +echo "Setting the package.json license to GPL-2.0-or-later..." +node -e ' +const fs = require("fs"); +const [file, license] = process.argv.slice(1); +const pkg = JSON.parse(fs.readFileSync(file, "utf8")); +let out = pkg; +if ("license" in pkg) { + pkg.license = license; +} else { + out = {}; + for (const [key, value] of Object.entries(pkg)) { + out[key] = value; + if (key === "private") out.license = license; + } + if (!("license" in out)) out.license = license; +} +fs.writeFileSync(file, JSON.stringify(out, null, 4) + "\n"); +' "$TARGET_DIR/package.json" "GPL-2.0-or-later" + echo "Replacing code name with placeholders..." find "$TARGET_DIR" -type f \ -not -path "*/.git/*" \ + -not -path "*/.github/*" \ + -not -path "*/bin/*" \ -not -path "*/node_modules/*" \ -not -name "package-theme.sh" \ -not -name "README.md" \