⚠️ OpenSpec-managed issue — this content is automatically synced
from the openspec/ directory. Manual edits will be overwritten on next sync.
Artifacts
Specs
Tasks
1.1 Create lib/Service/CustomCssValidator.php (SPDX docblock, @spec tags referencing
1.2 Create lib/Service/CustomCssService.php (SPDX docblock, @spec tags), mirroring
2.1 In lib/Service/CssInjectionService.php, add a new step immediately after the existing
2.2 Bump appinfo/info.xml <version> (new stylesheet in the cascade — bust the ?v=
3.1 Create lib/Controller/CustomCssController.php (SPDX docblock, @spec tags) with
3.2 Register the new routes in appinfo/routes.php following the existing
4.1 Extend templates/settings/admin.php with a "Custom CSS" section: an enable/disable
5.1 tests/Unit/Service/CustomCssValidatorTest.php: one test per rule in task 1.1 (reject
5.2 tests/Unit/Service/CustomCssServiceTest.php: atomic write (temp file + rename),
5.3 tests/Unit/Controller/CustomCssControllerAuditTest.php (mirroring the existing
5.4 Extend tests/Unit/Service/CssInjectionServiceTest.php: assert custom-css is emitted
6.1 Run composer check:strict (PHPCS, PHPMD, Psalm, PHPStan) against all new/changed PHP
6.2 Run the full phpunit suite and confirm all new and existing tests pass.
6.3 Add/extend a Playwright spec-coverage test (tests/e2e/spec-coverage/custom-css-freeform.spec.ts,
6.4 Run npm run test:lasuite-tokens, test:lasuite-override, test:lasuite-bridge-coverage,
Design
See design.md for technical design details.
Synced from openspec/changes/custom-css-freeform by OpenSpec workflow
App: thematiq
Artifacts
Specs
Tasks
lib/Service/CustomCssValidator.php(SPDX docblock,@spectags referencinglib/Service/CustomCssService.php(SPDX docblock,@spectags), mirroringlib/Service/CssInjectionService.php, add a new step immediately after the existingappinfo/info.xml<version>(new stylesheet in the cascade — bust the?v=lib/Controller/CustomCssController.php(SPDX docblock,@spectags) withappinfo/routes.phpfollowing the existingtemplates/settings/admin.phpwith a "Custom CSS" section: an enable/disabletests/Unit/Service/CustomCssValidatorTest.php: one test per rule in task 1.1 (rejecttests/Unit/Service/CustomCssServiceTest.php: atomic write (temp file + rename),tests/Unit/Controller/CustomCssControllerAuditTest.php(mirroring the existingtests/Unit/Service/CssInjectionServiceTest.php: assertcustom-cssis emittedcomposer check:strict(PHPCS, PHPMD, Psalm, PHPStan) against all new/changed PHPphpunitsuite and confirm all new and existing tests pass.tests/e2e/spec-coverage/custom-css-freeform.spec.ts,npm run test:lasuite-tokens,test:lasuite-override,test:lasuite-bridge-coverage,Design
See design.md for technical design details.
Synced from
openspec/changes/custom-css-freeformby OpenSpec workflowApp:
thematiq