diff --git a/docs/guides/divi-design-system.md b/docs/guides/divi-design-system.md index 830ad91..8cd34b4 100644 --- a/docs/guides/divi-design-system.md +++ b/docs/guides/divi-design-system.md @@ -125,7 +125,7 @@ Einzelne Module bekommen Presets mit `lit-divi-insert`, `lit-divi-update` und `l Standardaussehen. Ein **Standard-Preset** wird nicht „entkoppelt“, weil Divi es ohne Verweis anwendet; detach entfernt dort nur ausdrückliche Verweise und sagt das in `warnings`. Zum Beenden der Standardwirkung das Preset löschen (`lit/divi-presets-delete`) oder mit `make_default: false` den Standard aufheben. -- Variablen: `variable` wird noch nicht unterstützt (`unsupported`; Variablen folgen mit Etappe 4c). +- Variablen: `variable` (Name oder ID) ersetzt jeden ganzen Verweis auf die Variable durch ihren aktuellen Wert, auch in Presets; danach lässt sie sich mit `lit/divi-variables-set` archivieren (löschen kann Divi sie nicht). - Meldet die Antwort `hidden_count` größer als 0, können Seiten, die dieses Konto nicht lesen darf, noch Verweise enthalten; dann nennt sie den Hinweis auf `lit/divi-presets-delete` nicht. - Danach `lit/divi-presets-delete` aufrufen (Probelauf, `confirm`, `design_rev`); es meldet kein `in_use` mehr, diff --git a/src/Integrations/Divi/DiviIntegration.php b/src/Integrations/Divi/DiviIntegration.php index f37fa9a..e66f980 100644 --- a/src/Integrations/Divi/DiviIntegration.php +++ b/src/Integrations/Divi/DiviIntegration.php @@ -16,6 +16,7 @@ use LIT\MCP\Integrations\Divi\BlockTree\Parser; use LIT\MCP\Integrations\Divi\Design\ColorRestorePlanner; use LIT\MCP\Integrations\Divi\Design\DesignSystemReader; use LIT\MCP\Integrations\Divi\Design\DesignSystemWriter; +use LIT\MCP\Integrations\Divi\Design\DiviColorsSetAbility; use LIT\MCP\Integrations\Divi\Design\DiviDesignSystemAbility; use LIT\MCP\Integrations\Divi\Design\DesignChange; use LIT\MCP\Integrations\Divi\Design\DesignRights; @@ -28,6 +29,7 @@ use LIT\MCP\Integrations\Divi\Design\GlobalVariablesAdapter; use LIT\MCP\Integrations\Divi\Design\DiviPresetsAssignAbility; use LIT\MCP\Integrations\Divi\Design\DiviPresetsDeleteAbility; use LIT\MCP\Integrations\Divi\Design\DiviPresetsSetAbility; +use LIT\MCP\Integrations\Divi\Design\DiviVariablesSetAbility; use LIT\MCP\Integrations\Divi\Design\PageRewriter; use LIT\MCP\Integrations\Divi\Design\PresetAssignment; use LIT\MCP\Integrations\Divi\Design\PresetComposer; @@ -91,6 +93,10 @@ final class DiviIntegration implements Integration, Bootable private ThemeBuilderAccess $themeBuilderAccess; private DesignSystemWriter $designWriter; + private GlobalColorsAdapter $colorsAdapter; + + private GlobalVariablesAdapter $variablesAdapter; + /** @var (Closure(): bool)|null Whether lit/divi-insert is enabled (ruling P9, E9, audit M2); null = always. */ private ?Closure $diviWritable; @@ -114,6 +120,8 @@ final class DiviIntegration implements Integration, Bootable $this->modules = new DiviModules(); $this->design = new DesignSystemReader(); $this->designWriter = new DesignSystemWriter(); + $this->colorsAdapter = new GlobalColorsAdapter(); + $this->variablesAdapter = new GlobalVariablesAdapter(); $this->diviWritable = $this->gate(static fn (ToolAvailability $t): bool => $t->allows('lit/divi-insert')); $this->libraryInsertable = $this->gate( static fn (ToolAvailability $t): bool => $t->allows('lit/library-insert') @@ -270,8 +278,8 @@ final class DiviIntegration implements Integration, Bootable $this->designChange(), new SnapshotStore(), new PresetRestorePlanner($this->designWriter, DesignRights::unfilteredHtml()), - new ColorRestorePlanner($this->designWriter, new GlobalColorsAdapter()), - new VariableRestorePlanner($this->designWriter, new GlobalVariablesAdapter()) + new ColorRestorePlanner($this->designWriter, $this->colorsAdapter), + new VariableRestorePlanner($this->designWriter, $this->variablesAdapter) ), new DiviPresetsAssignAbility( $this->designWriter, @@ -280,12 +288,24 @@ final class DiviIntegration implements Integration, Bootable ), new DiviDesignDetachAbility( $this->designWriter, - new GlobalVariablesAdapter(), + $this->variablesAdapter, $this->designChange(), $this->globalUsages(), $this->pageRewriter($loader), DesignRights::unfilteredHtml() ), + new DiviColorsSetAbility( + $this->designWriter, + $this->colorsAdapter, + $this->designChange(), + $this->globalUsages() + ), + new DiviVariablesSetAbility( + $this->designWriter, + $this->variablesAdapter, + $this->designChange(), + $this->globalUsages() + ), ]; } diff --git a/tests/Unit/Integrations/Divi/DiviIntegrationTest.php b/tests/Unit/Integrations/Divi/DiviIntegrationTest.php index be828af..6a3f91d 100644 --- a/tests/Unit/Integrations/Divi/DiviIntegrationTest.php +++ b/tests/Unit/Integrations/Divi/DiviIntegrationTest.php @@ -57,6 +57,8 @@ final class DiviIntegrationTest extends TestCase 'lit/divi-design-restore', 'lit/divi-presets-assign', 'lit/divi-design-detach', + 'lit/divi-colors-set', + 'lit/divi-variables-set', ]; public function testProvidesTheDiviAbilitiesOnlyWithDivi5(): void diff --git a/tests/Unit/Integrations/Divi/Release/DiviToolFeaturesTest.php b/tests/Unit/Integrations/Divi/Release/DiviToolFeaturesTest.php index 3b746a4..e534bc1 100644 --- a/tests/Unit/Integrations/Divi/Release/DiviToolFeaturesTest.php +++ b/tests/Unit/Integrations/Divi/Release/DiviToolFeaturesTest.php @@ -65,6 +65,8 @@ final class DiviToolFeaturesTest extends TestCase 'page-read', 'page-write', 'catalog', 'design-read', 'preset-write', 'library-read', 'library-write', 'tb-write', 'roles', ], + 'lit/divi-colors-set' => ['design-read', 'color-write'], + 'lit/divi-variables-set' => ['design-read', 'variable-write'], // Library (divi-library) 'lit/library-list' => ['library-read', 'roles'], 'lit/library-find-similar' => ['page-read', 'catalog', 'roles'], @@ -348,6 +350,7 @@ final class DiviToolFeaturesTest extends TestCase 'lit/divi-node-copy' => 'page-write', 'lit/library-insert' => 'page-write', 'lit/library-make-global' => 'library-write', 'lit/library-save' => 'library-write', 'lit/divi-presets-set' => 'preset-write', 'lit/divi-presets-delete' => 'preset-write', + 'lit/divi-colors-set' => 'color-write', 'lit/divi-variables-set' => 'variable-write', 'lit/divi-design-restore' => 'preset-write', 'lit/divi-design-detach' => 'preset-write', 'lit/divi-presets-assign' => 'page-write', 'lit/tb-assign' => 'tb-write', 'lit/tb-activate' => 'tb-write', 'lit/tb-create-template' => 'tb-write',