Skip to content

Convert Behat annotations to PHP attributes in UI Shop contexts#18829

Merged
TheMilek merged 2 commits intoSylius:2.3from
loic425:behat-annotations-to-attributes/ui-shop
Feb 17, 2026
Merged

Convert Behat annotations to PHP attributes in UI Shop contexts#18829
TheMilek merged 2 commits intoSylius:2.3from
loic425:behat-annotations-to-attributes/ui-shop

Conversation

@loic425
Copy link
Copy Markdown
Member

@loic425 loic425 commented Feb 13, 2026

Q A
Branch? 2.3
Bug fix? no
New feature? no
BC breaks? no
Deprecations? no
Related tickets partially #18822
License MIT

Summary by CodeRabbit

Release Notes

  • Chores
    • Modernized test automation framework by upgrading annotation syntax across 29 test context files to use PHP 8 attributes
    • Enhanced internal test automation for login, checkout, and product attribute workflows with improved assertion robustness
    • Updated locale and currency testing logic for more reliable test execution

@loic425 loic425 requested review from a team as code owners February 13, 2026 19:36
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Feb 13, 2026

📝 Walkthrough

Walkthrough

Multiple Behat Shop UI context files are migrated from PHPDoc step annotations (@When/@Then/@given) to PHP 8 attributes (#[When]/#[Then]/#[Given]). Affected areas include account management, authentication, product browsing, cart/checkout operations, and specialized contexts. Minor behavioral adjustments in login flows, page state validation, and address/payment handling also applied.

Changes

Cohort / File(s) Summary
Authentication & Account
AccountContext.php, AuthorizationContext.php, LoginContext.php
Migrated step annotations to PHP 8 attributes. Enhanced login flows to populate credentials and submit forms. Added explicit page state checks before proceeding.
Address Management
AddressBookContext.php
Converted docblock annotations to attributes. Adjusted address editing logic to derive full_name from firstName/lastName before opening the address.
Product Browsing & Attributes
BrowsingProductContext.php, ProductContext.php, ProductAttributeContext.php, ProductReviewContext.php
Replaced PHPDoc step annotations with PHP 8 attributes. Updated date comparison logic and attribute retrieval methods in ProductAttributeContext. Enhanced review submission in ProductReviewContext.
Cart & Checkout Core
CartContext.php, CheckoutContext.php
Migrated step annotations to attributes. Refined checkout flow declarations without altering core logic.
Checkout Workflow Steps
Checkout/CheckoutAddressingContext.php, Checkout/CheckoutOrderDetailsContext.php, Checkout/CheckoutPaymentContext.php, Checkout/CheckoutShippingContext.php, Checkout/CheckoutThankYouContext.php, Checkout/CheckoutCompleteContext.php, Checkout/RegistrationAfterCheckoutContext.php
Converted PHPDoc annotations to PHP 8 attributes across addressing, payment, and shipping contexts. Added runtime page-state validation in addressing step. Enhanced order confirmation with locale header support and entity manager refresh. Added null checks for customer verification.
Shop Context & Localization
CurrencyContext.php, LocaleContext.php, HomepageContext.php
Migrated step annotations to attributes. Added explicit logic inversions for currency/locale availability checks instead of implicit assertions.
User Interactions
ContactContext.php, PaymentRequestContext.php, ErrorPageContext.php, RegistrationContext.php
Converted docblock annotations to PHP 8 attributes. Added new password specification steps in RegistrationContext. Refactored notification-checking logic in ContactContext.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

Suggested labels

DX, Frontend, Maintenance

Suggested reviewers

  • TheMilek

Poem

🐰 With attributes bright in PHP eight's glow,
Old docblocks fade where new decorators flow,
Each step now tagged with graceful syntax true,
The Behat dance, refreshed and shiny new! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.36% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely describes the main change: converting Behat annotations to PHP attributes across all UI Shop context files.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Warning

Review ran into problems

🔥 Problems

Git: Failed to clone repository. Please run the @coderabbitai full review command to re-trigger a full review. If the issue persists, set path_filters to include or exclude specific files.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@loic425 loic425 mentioned this pull request Feb 13, 2026
27 tasks
@github-actions
Copy link
Copy Markdown

github-actions bot commented Feb 13, 2026

❗ Preview Environment delete from Bunnyshell failed

Check https://github.com/Sylius/Sylius/actions/runs/22107436203 for details.

See: Environment Details

Available commands:

  • 🚀 /bns:deploy to redeploy the environment
  • /bns:delete to remove the environment

Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
src/Sylius/Behat/Context/Ui/Shop/CurrencyContext.php (1)

73-85: ⚠️ Potential issue | 🔴 Critical

Bug: iShouldSeeCurrenciesInTheList has inverted logic and a broken in_array check.

Three issues:

  1. $currenciesCodes is a variadic string ... (i.e., an array), but it's passed directly to in_array() — this checks if the array itself is an element of the available currencies list, which will always be false.
  2. The logic is inverted: the method name and step pattern say "I should see ... in the list," but the code throws when the currencies are found.
  3. Line 81 passes an array to sprintf('%s', ...), which will produce a PHP warning/error.

This method should assert that each currency is present, not that it isn't.

🐛 Proposed fix
     #[Then('I should see :firstCurrency and :secondCurrency in the list')]
     public function iShouldSeeCurrenciesInTheList(string ...$currenciesCodes): void
     {
         $this->homePage->open();
 
-        if (in_array($currenciesCodes, $this->homePage->getAvailableCurrencies(), true)) {
-            throw new \InvalidArgumentException(sprintf(
-                'Expected "%s" not to be in "%s"',
-                $currenciesCodes,
-                implode('", "', $this->homePage->getAvailableCurrencies()),
-            ));
-        }
+        $availableCurrencies = $this->homePage->getAvailableCurrencies();
+        foreach ($currenciesCodes as $currencyCode) {
+            if (!in_array($currencyCode, $availableCurrencies, true)) {
+                throw new \InvalidArgumentException(sprintf(
+                    'Expected "%s" to be in "%s"',
+                    $currencyCode,
+                    implode('", "', $availableCurrencies),
+                ));
+            }
+        }
     }
src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutThankYouContext.php (1)

67-71: ⚠️ Potential issue | 🟡 Minor

Step text contradicts assertion logic.

The step pattern says I should see the thank you page in :localeCode, but the method asserts Assert::false(...) — meaning it expects the page to not be open in that locale. If this is intentional (e.g., verifying locale restriction), the step text should say "I should not see the thank you page in :localeCode" to match.

src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php (1)

355-359: ⚠️ Potential issue | 🟡 Minor

#[When] attribute used for an assertion method (iShouldSeeWithUnitPrice).

Line 355 declares #[When(...)] but the method name iShouldSeeWithUnitPrice and its body (Assert::same(...)) indicate it's an assertion — this should likely be #[Then].

Proposed fix
-    #[When('/^I should see (product "[^"]+") with unit price ("[^"]+")$/')]
+    #[Then('/^I should see (product "[^"]+") with unit price ("[^"]+")$/')]
🤖 Fix all issues with AI agents
In `@src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php`:
- Around line 195-199: The step definition attribute on the method
myTaxTotalShouldBe in class CheckoutCompleteContext uses #[Given('my tax total
should be :taxTotal')] but this is an assertion step and should be annotated
with #[Then(...)]; update the attribute to #[Then('my tax total should be
:taxTotal')] (keeping the method name myTaxTotalShouldBe and the Assert::same
call intact) so the step follows the Given-When-Then semantics and Behat will
recognize it as a Then assertion.
🧹 Nitpick comments (11)
rector.php (1)

12-15: Commented-out Rector sets should be tracked for re-enablement.

Disabling UP_TO_PHP_82 and PHPUNIT_110 sets removes automated upgrade rules from the pipeline. If this is temporary (e.g., to avoid conflicts during the attribute migration), consider adding a TODO comment so the sets are re-enabled once the migration is complete.

src/Sylius/Behat/Context/Ui/Shop/AddressBookContext.php (1)

16-18: Import order nit: Behat\Step\Then should come before Behat\Step\When alphabetically.

Current order is Given, When, Then; alphabetical would be Given, Then, When. This is consistent with other files in this PR (e.g., CheckoutCompleteContext.php lines 16-20 has them sorted), but inconsistent here.

Proposed fix
 use Behat\Step\Given;
-use Behat\Step\When;
 use Behat\Step\Then;
+use Behat\Step\When;
src/Sylius/Behat/Context/Ui/Shop/BrowsingProductContext.php (1)

16-17: Imports are not sorted alphabetically.

Behat\Behat\Context\Context should precede Behat\Step\Then alphabetically.

Proposed fix
-use Behat\Step\Then;
 use Behat\Behat\Context\Context;
+use Behat\Step\Then;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutPaymentContext.php (1)

16-20: Imports are not sorted alphabetically.

The new Behat\Step\Given and Behat\Step\Then imports were added above Behat\Behat\Context\Context and are not contiguous with the existing Behat\Step\When on line 20.

Proposed fix
-use Behat\Step\Given;
-use Behat\Step\Then;
 use Behat\Behat\Context\Context;
 use Behat\Mink\Exception\ElementNotFoundException;
+use Behat\Step\Given;
+use Behat\Step\Then;
 use Behat\Step\When;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

src/Sylius/Behat/Context/Ui/Shop/HomepageContext.php (1)

16-18: Imports are not sorted alphabetically.

Same pattern as other files — Behat\Step\* imports should come after Behat\Behat\Context\Context.

Proposed fix
-use Behat\Step\When;
-use Behat\Step\Then;
 use Behat\Behat\Context\Context;
+use Behat\Step\Then;
+use Behat\Step\When;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

src/Sylius/Behat/Context/Ui/Shop/LocaleContext.php (1)

16-19: Imports are not sorted alphabetically.

Proposed fix
-use Behat\Step\Given;
-use Behat\Step\When;
-use Behat\Step\Then;
 use Behat\Behat\Context\Context;
+use Behat\Step\Given;
+use Behat\Step\Then;
+use Behat\Step\When;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

src/Sylius/Behat/Context/Ui/Shop/ProductAttributeContext.php (1)

16-17: Imports are not sorted alphabetically.

Proposed fix
-use Behat\Step\Then;
 use Behat\Behat\Context\Context;
+use Behat\Step\Then;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

src/Sylius/Behat/Context/Ui/Shop/RegistrationContext.php (1)

16-18: Imports are not sorted alphabetically.

Proposed fix
-use Behat\Step\Then;
 use Behat\Behat\Context\Context;
+use Behat\Step\Then;
 use Behat\Step\When;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

src/Sylius/Behat/Context/Ui/Shop/Checkout/RegistrationAfterCheckoutContext.php (1)

16-18: Imports are not sorted alphabetically.

Proposed fix
-use Behat\Step\Then;
 use Behat\Behat\Context\Context;
+use Behat\Step\Then;
 use Behat\Step\When;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

src/Sylius/Behat/Context/Ui/Shop/AccountContext.php (1)

16-19: Imports are not sorted alphabetically.

Proposed fix
-use Behat\Step\When;
-use Behat\Step\Then;
-use Behat\Step\Given;
 use Behat\Behat\Context\Context;
+use Behat\Step\Given;
+use Behat\Step\Then;
+use Behat\Step\When;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

src/Sylius/Behat/Context/Ui/Shop/CheckoutContext.php (1)

16-19: Import statements are not sorted alphabetically.

The newly added use Behat\Step\Then was inserted before use Behat\Behat\Context\Context, breaking alphabetical order. As per coding guidelines, use imports should be sorted alphabetically.

Suggested fix
-use Behat\Step\Then;
 use Behat\Behat\Context\Context;
 use Behat\Step\Given;
+use Behat\Step\Then;
 use Behat\Step\When;

Comment on lines +195 to 199
#[Given('my tax total should be :taxTotal')]
public function myTaxTotalShouldBe(string $taxTotal): void
{
Assert::same($this->completePage->getTaxTotal(), $taxTotal);
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

rg -n "my tax total should be" --glob '*.feature' -C2

Repository: Sylius/Sylius

Length of output: 2337


Change #[Given] to #[Then] for assertion step.

This step is used exclusively as an assertion after Then steps in feature files (e.g., "And my tax total should be..."). It should be annotated with #[Then], not #[Given], to comply with the Given-When-Then pattern.

🤖 Prompt for AI Agents
In `@src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php` around
lines 195 - 199, The step definition attribute on the method myTaxTotalShouldBe
in class CheckoutCompleteContext uses #[Given('my tax total should be
:taxTotal')] but this is an assertion step and should be annotated with
#[Then(...)]; update the attribute to #[Then('my tax total should be
:taxTotal')] (keeping the method name myTaxTotalShouldBe and the Assert::same
call intact) so the step follows the Given-When-Then semantics and Behat will
recognize it as a Then assertion.

TheMilek
TheMilek previously approved these changes Feb 17, 2026
Co-authored-by: Kamil Grygierzec <53942444+TheMilek@users.noreply.github.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php (1)

355-359: ⚠️ Potential issue | 🟡 Minor

Change #[When] to #[Then] — this is an assertion step, not an action.

The pattern I should see ... with unit price ... is assertion language and performs Assert::same. Feature files use this step as And (an assertion continuation), not as a When action. It should be annotated with #[Then].

Proposed fix
-    #[When('/^I should see (product "[^"]+") with unit price ("[^"]+")$/')]
+    #[Then('/^I should see (product "[^"]+") with unit price ("[^"]+")$/')]
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php` around
lines 355 - 359, The step definition iShouldSeeWithUnitPrice currently annotated
with #[When] is an assertion and should be #[Then]; update the attribute on the
iShouldSeeWithUnitPrice method in CheckoutCompleteContext.php (method name:
iShouldSeeWithUnitPrice, uses Assert::same and calls
$this->completePage->getProductUnitPrice) to #[Then('/^I should see (product
"[^"]+") with unit price ("[^"]+")$/')] so it reflects assertion semantics in
feature files.
src/Sylius/Behat/Context/Ui/Shop/CurrencyContext.php (1)

73-85: ⚠️ Potential issue | 🔴 Critical

Bug: iShouldSeeCurrenciesInTheList has inverted logic and a type error.

Three problems:

  1. Inverted assertion: The step text I should see :firstCurrency and :secondCurrency in the list expects the currencies to be present, but the code throws when they are found — this is backwards.
  2. Array passed to in_array as needle: $currenciesCodes is a variadic array, not a string. in_array($currenciesCodes, $availableCurrencies, true) will almost never match because it checks whether the array itself is an element. Each currency code should be checked individually.
  3. sprintf('%s', $currenciesCodes) on Line 81 passes an array to %s, producing "Array" and a PHP warning.
Proposed fix
     #[Then('I should see :firstCurrency and :secondCurrency in the list')]
     public function iShouldSeeCurrenciesInTheList(string ...$currenciesCodes): void
     {
         $this->homePage->open();
 
-        if (in_array($currenciesCodes, $this->homePage->getAvailableCurrencies(), true)) {
-            throw new \InvalidArgumentException(sprintf(
-                'Expected "%s" not to be in "%s"',
-                $currenciesCodes,
-                implode('", "', $this->homePage->getAvailableCurrencies()),
-            ));
-        }
+        $availableCurrencies = $this->homePage->getAvailableCurrencies();
+
+        foreach ($currenciesCodes as $currencyCode) {
+            Assert::oneOf($currencyCode, $availableCurrencies);
+        }
     }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Sylius/Behat/Context/Ui/Shop/CurrencyContext.php` around lines 73 - 85,
The step iShouldSeeCurrenciesInTheList currently uses inverted logic and treats
the variadic $currenciesCodes as a single needle; fix it by fetching $available
= $this->homePage->getAvailableCurrencies() after opening the page, then loop
over each currency code in the variadic $currenciesCodes and assert
in_array($code, $available, true); if any are missing throw an
\InvalidArgumentException listing the missing codes (use implode to format the
message) so you check presence (not absence) and avoid passing an array to
sprintf/%s.
🧹 Nitpick comments (2)
src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php (1)

16-20: Imports are not sorted alphabetically.

Behat\Step\Given (line 16) should come after Behat\Mink\Exception\ElementNotFoundException (line 18) per alphabetical ordering.

Proposed fix
-use Behat\Step\Given;
 use Behat\Behat\Context\Context;
 use Behat\Mink\Exception\ElementNotFoundException;
+use Behat\Step\Given;
 use Behat\Step\Then;
 use Behat\Step\When;

As per coding guidelines: "Sort PHP use imports alphabetically and group by type (classes, functions, constants)".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php` around
lines 16 - 20, The import statements in CheckoutCompleteContext are not
alphabetically ordered; reorder the use imports so they are sorted
alphabetically (grouping classes together) — specifically ensure
Behat\Mink\Exception\ElementNotFoundException comes before Behat\Step\Given and
that Behat\Step\Then and Behat\Step\When are placed in proper alphabetical order
relative to the others; update the use block containing Behat\Step\Given,
Behat\Behat\Context\Context, Behat\Mink\Exception\ElementNotFoundException,
Behat\Step\Then, and Behat\Step\When to the correct alphabetical sequence.
src/Sylius/Behat/Context/Ui/Shop/CurrencyContext.php (1)

59-71: Minor: hand-rolled assertion duplicates Assert::notOneOf semantics.

This works correctly but could use Webmozart\Assert\Assert for consistency with the rest of the file (e.g., Line 56 uses Assert::oneOf). Not blocking.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Sylius/Behat/Context/Ui/Shop/CurrencyContext.php` around lines 59 - 71,
Replace the hand-rolled existence check in
iShouldNotBeAbleToShopUsingTheCurrency with Webmozart\Assert::notOneOf to match
file convention; call Assert::notOneOf($currencyCode,
$this->homePage->getAvailableCurrencies(), 'Expected "%s" not to be available')
so the assertion uses the same Assert utility as the one used elsewhere (see
Assert::oneOf usage) and remove the manual in_array/throw logic.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php`:
- Around line 355-359: The step definition iShouldSeeWithUnitPrice currently
annotated with #[When] is an assertion and should be #[Then]; update the
attribute on the iShouldSeeWithUnitPrice method in CheckoutCompleteContext.php
(method name: iShouldSeeWithUnitPrice, uses Assert::same and calls
$this->completePage->getProductUnitPrice) to #[Then('/^I should see (product
"[^"]+") with unit price ("[^"]+")$/')] so it reflects assertion semantics in
feature files.

In `@src/Sylius/Behat/Context/Ui/Shop/CurrencyContext.php`:
- Around line 73-85: The step iShouldSeeCurrenciesInTheList currently uses
inverted logic and treats the variadic $currenciesCodes as a single needle; fix
it by fetching $available = $this->homePage->getAvailableCurrencies() after
opening the page, then loop over each currency code in the variadic
$currenciesCodes and assert in_array($code, $available, true); if any are
missing throw an \InvalidArgumentException listing the missing codes (use
implode to format the message) so you check presence (not absence) and avoid
passing an array to sprintf/%s.

---

Duplicate comments:
In `@src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php`:
- Around line 195-199: Change the Behat step attribute on the myTaxTotalShouldBe
method in CheckoutCompleteContext from #[Given('my tax total should be
:taxTotal')] to #[Then('my tax total should be :taxTotal')]; the method
(myTaxTotalShouldBe) performs an assertion using Assert::same so it should be
annotated with Then instead of Given to follow Given-When-Then semantics,
leaving the method body and parameter unchanged.

---

Nitpick comments:
In `@src/Sylius/Behat/Context/Ui/Shop/Checkout/CheckoutCompleteContext.php`:
- Around line 16-20: The import statements in CheckoutCompleteContext are not
alphabetically ordered; reorder the use imports so they are sorted
alphabetically (grouping classes together) — specifically ensure
Behat\Mink\Exception\ElementNotFoundException comes before Behat\Step\Given and
that Behat\Step\Then and Behat\Step\When are placed in proper alphabetical order
relative to the others; update the use block containing Behat\Step\Given,
Behat\Behat\Context\Context, Behat\Mink\Exception\ElementNotFoundException,
Behat\Step\Then, and Behat\Step\When to the correct alphabetical sequence.

In `@src/Sylius/Behat/Context/Ui/Shop/CurrencyContext.php`:
- Around line 59-71: Replace the hand-rolled existence check in
iShouldNotBeAbleToShopUsingTheCurrency with Webmozart\Assert::notOneOf to match
file convention; call Assert::notOneOf($currencyCode,
$this->homePage->getAvailableCurrencies(), 'Expected "%s" not to be available')
so the assertion uses the same Assert utility as the one used elsewhere (see
Assert::oneOf usage) and remove the manual in_array/throw logic.

@TheMilek TheMilek merged commit a9dd32e into Sylius:2.3 Feb 17, 2026
54 of 56 checks passed
@loic425 loic425 deleted the behat-annotations-to-attributes/ui-shop branch February 18, 2026 08:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants