diff --git a/vendor/magento/module-contact/Block/ContactForm.php b/vendor/magento/module-contact/Block/ContactForm.php
index d0450fb5b0e5..436e8131edbe 100644
--- a/vendor/magento/module-contact/Block/ContactForm.php
+++ b/vendor/magento/module-contact/Block/ContactForm.php
@@ -5,6 +5,7 @@
  */
 namespace Magento\Contact\Block;
 
+use Magento\Framework\View\Element\Block\ArgumentInterface;
 use Magento\Framework\View\Element\Template;
 
 /**
@@ -18,9 +19,11 @@ class ContactForm extends Template
     /**
      * @param Template\Context $context
      * @param array $data
+     * @param ArgumentInterface|null $viewModel
      */
-    public function __construct(Template\Context $context, array $data = [])
+    public function __construct(Template\Context $context, array $data = [], ArgumentInterface $viewModel = null)
     {
+        $data['view_model'] = $viewModel;
         parent::__construct($context, $data);
         $this->_isScopePrivate = true;
     }
diff --git a/vendor/magento/module-contact/ViewModel/ContactUsButton.php b/vendor/magento/module-contact/ViewModel/ContactUsButton.php
new file mode 100644
index 000000000000..9d4db56d864d
--- /dev/null
+++ b/vendor/magento/module-contact/ViewModel/ContactUsButton.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Contact\ViewModel;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+/**
+ * Custom Contact Us button view model
+ */
+class ContactUsButton implements ArgumentInterface
+{
+    /**
+     * If Contact Us button should be disabled
+     *
+     * @return bool
+     */
+    public function disabled(): bool
+    {
+        return false;
+    }
+}
diff --git a/vendor/magento/module-contact/etc/frontend/di.xml b/vendor/magento/module-contact/etc/frontend/di.xml
index a84adeec2801..74f681f2b8e8 100644
--- a/vendor/magento/module-contact/etc/frontend/di.xml
+++ b/vendor/magento/module-contact/etc/frontend/di.xml
@@ -13,4 +13,9 @@
             </argument>
         </arguments>
     </type>
+    <type name="Magento\Contact\Block\ContactForm">
+        <arguments>
+            <argument name="viewModel" xsi:type="object">Magento\Contact\ViewModel\UserDataProvider</argument>
+        </arguments>
+    </type>
 </config>
diff --git a/vendor/magento/module-contact/view/frontend/layout/contact_index_index.xml b/vendor/magento/module-contact/view/frontend/layout/contact_index_index.xml
index c7009831d464..1f5e4fcbee96 100644
--- a/vendor/magento/module-contact/view/frontend/layout/contact_index_index.xml
+++ b/vendor/magento/module-contact/view/frontend/layout/contact_index_index.xml
@@ -12,10 +12,10 @@
     <body>
         <referenceContainer name="content">
             <block class="Magento\Contact\Block\ContactForm" name="contactForm" template="Magento_Contact::form.phtml">
-                <container name="form.additional.info" label="Form Additional Info"/>
                 <arguments>
-                    <argument name="view_model" xsi:type="object">Magento\Contact\ViewModel\UserDataProvider</argument>
+                    <argument name="contact_us_button_view_model" xsi:type="object">Magento\Contact\ViewModel\ContactUsButton</argument>
                 </arguments>
+                <container name="form.additional.info" label="Form Additional Info"/>
             </block>
         </referenceContainer>
     </body>
diff --git a/vendor/magento/module-contact/view/frontend/templates/form.phtml b/vendor/magento/module-contact/view/frontend/templates/form.phtml
index e9d0c065fd8b..8a48f60706e9 100644
--- a/vendor/magento/module-contact/view/frontend/templates/form.phtml
+++ b/vendor/magento/module-contact/view/frontend/templates/form.phtml
@@ -11,6 +11,7 @@
 /** @var \Magento\Contact\ViewModel\UserDataProvider $viewModel */
 
 $viewModel = $block->getViewModel();
+$contactUsButtonViewModel = $block->getData('contact_us_button_view_model');
 ?>
 <form class="form contact"
       action="<?= $block->escapeUrl($block->getFormAction()) ?>"
@@ -78,7 +79,9 @@ $viewModel = $block->getViewModel();
     <div class="actions-toolbar">
         <div class="primary">
             <input type="hidden" name="hideit" id="hideit" value="" />
-            <button type="submit" title="<?= $block->escapeHtmlAttr(__('Submit')) ?>" class="action submit primary">
+            <button type="submit" title="<?= $block->escapeHtmlAttr(__('Submit')) ?>" class="action submit primary"
+                    id="send2"
+                <?php if ($contactUsButtonViewModel->disabled()): ?> disabled="disabled" <?php endif; ?>>
                 <span><?= $block->escapeHtml(__('Submit')) ?></span>
             </button>
         </div>
diff --git a/vendor/magento/module-customer/ViewModel/CreateAccountButton.php b/vendor/magento/module-customer/ViewModel/CreateAccountButton.php
new file mode 100644
index 000000000000..8fa8718fe37e
--- /dev/null
+++ b/vendor/magento/module-customer/ViewModel/CreateAccountButton.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Customer\ViewModel;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+/**
+ * Custom Create Account button view model
+ */
+class CreateAccountButton implements ArgumentInterface
+{
+    /**
+     * If Create Account button should be disabled
+     *
+     * @return bool
+     */
+    public function disabled(): bool
+    {
+        return false;
+    }
+}
diff --git a/vendor/magento/module-customer/ViewModel/EditAccountButton.php b/vendor/magento/module-customer/ViewModel/EditAccountButton.php
new file mode 100644
index 000000000000..03c9dcda9f8f
--- /dev/null
+++ b/vendor/magento/module-customer/ViewModel/EditAccountButton.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Customer\ViewModel;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+/**
+ * Custom Edit Account button view model
+ */
+class EditAccountButton implements ArgumentInterface
+{
+    /**
+     * If Edit Account button should be disabled
+     *
+     * @return bool
+     */
+    public function disabled(): bool
+    {
+        return false;
+    }
+}
diff --git a/vendor/magento/module-customer/ViewModel/LoginButton.php b/vendor/magento/module-customer/ViewModel/LoginButton.php
new file mode 100644
index 000000000000..75349043e8ba
--- /dev/null
+++ b/vendor/magento/module-customer/ViewModel/LoginButton.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Customer\ViewModel;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+/**
+ * Custom Login button view model
+ */
+class LoginButton implements ArgumentInterface
+{
+    /**
+     * If Login button should be disabled
+     *
+     * @return bool
+     */
+    public function disabled(): bool
+    {
+        return false;
+    }
+}
diff --git a/vendor/magento/module-customer/view/frontend/layout/customer_account_create.xml b/vendor/magento/module-customer/view/frontend/layout/customer_account_create.xml
index 0c5af453f237..a995c9297990 100644
--- a/vendor/magento/module-customer/view/frontend/layout/customer_account_create.xml
+++ b/vendor/magento/module-customer/view/frontend/layout/customer_account_create.xml
@@ -17,6 +17,7 @@
             <block class="Magento\Customer\Block\Form\Register" name="customer_form_register" template="Magento_Customer::form/register.phtml">
                 <arguments>
                     <argument name="attribute_data" xsi:type="object">Magento\Customer\Block\DataProviders\AddressAttributeData</argument>
+                    <argument name="create_account_button_view_model" xsi:type="object">Magento\Customer\ViewModel\CreateAccountButton</argument>
                 </arguments>
                 <container name="form.additional.info" as="form_additional_info"/>
                 <container name="customer.form.register.fields.before" as="form_fields_before" label="Form Fields Before" htmlTag="div" htmlClass="customer-form-before"/>
diff --git a/vendor/magento/module-customer/view/frontend/layout/customer_account_edit.xml b/vendor/magento/module-customer/view/frontend/layout/customer_account_edit.xml
index f4dfaa6586b1..b07ddcd41bc9 100644
--- a/vendor/magento/module-customer/view/frontend/layout/customer_account_edit.xml
+++ b/vendor/magento/module-customer/view/frontend/layout/customer_account_edit.xml
@@ -18,6 +18,9 @@
         </referenceBlock>
         <referenceContainer name="content">
             <block class="Magento\Customer\Block\Form\Edit" name="customer_edit" template="Magento_Customer::form/edit.phtml" cacheable="false">
+                <arguments>
+                    <argument name="edit_account_button_view_model" xsi:type="object">Magento\Customer\ViewModel\EditAccountButton</argument>
+                </arguments>
                 <container name="form.additional.info" as="form_additional_info"/>
             </block>
         </referenceContainer>
diff --git a/vendor/magento/module-customer/view/frontend/layout/customer_account_login.xml b/vendor/magento/module-customer/view/frontend/layout/customer_account_login.xml
index 3518df736c4a..8fb51eeb6650 100644
--- a/vendor/magento/module-customer/view/frontend/layout/customer_account_login.xml
+++ b/vendor/magento/module-customer/view/frontend/layout/customer_account_login.xml
@@ -15,6 +15,9 @@
             <container name="customer.login.container" label="Customer Login Container" htmlTag="div" htmlClass="login-container">
                 <block class="Magento\Customer\Block\Form\Login" name="customer_form_login" template="Magento_Customer::form/login.phtml">
                     <container name="form.additional.info" as="form_additional_info"/>
+                    <arguments>
+                        <argument name="login_button_view_model" xsi:type="object">Magento\Customer\ViewModel\LoginButton</argument>
+                    </arguments>
                 </block>
                 <block class="Magento\Customer\Block\Form\Login\Info" name="customer.new" template="Magento_Customer::newcustomer.phtml"/>
             </container>
diff --git a/vendor/magento/module-customer/view/frontend/templates/form/edit.phtml b/vendor/magento/module-customer/view/frontend/templates/form/edit.phtml
index b64ad58c17af..1fead138391c 100644
--- a/vendor/magento/module-customer/view/frontend/templates/form/edit.phtml
+++ b/vendor/magento/module-customer/view/frontend/templates/form/edit.phtml
@@ -8,6 +8,7 @@ use Magento\Customer\Block\Widget\Name;
 
 /** @var \Magento\Customer\Block\Form\Edit $block */
 /** @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer */
+$editAccountButtonViewModel = $block->getData('edit_account_button_view_model');
 ?>
 <form class="form form-edit-account"
       action="<?= $block->escapeUrl($block->getUrl('customer/account/editPost')) ?>"
@@ -112,7 +113,9 @@ use Magento\Customer\Block\Widget\Name;
 
     <div class="actions-toolbar">
         <div class="primary">
-            <button type="submit" class="action save primary" title="<?= $block->escapeHtmlAttr(__('Save')) ?>">
+            <button type="submit" class="action save primary" title="<?= $block->escapeHtmlAttr(__('Save')) ?>"
+                    id="send2"
+                <?php if ($editAccountButtonViewModel->disabled()): ?> disabled="disabled" <?php endif; ?>>
                 <span><?= $block->escapeHtml(__('Save')) ?></span>
             </button>
         </div>
diff --git a/vendor/magento/module-customer/view/frontend/templates/form/login.phtml b/vendor/magento/module-customer/view/frontend/templates/form/login.phtml
index 73e9ec35d51c..784e13fe435e 100644
--- a/vendor/magento/module-customer/view/frontend/templates/form/login.phtml
+++ b/vendor/magento/module-customer/view/frontend/templates/form/login.phtml
@@ -7,6 +7,8 @@
 // phpcs:disable Generic.Files.LineLength.TooLong
 
 /** @var \Magento\Customer\Block\Form\Login $block */
+/** @var \Magento\Customer\ViewModel\LoginButton $loginButtonViewModel */
+$loginButtonViewModel = $block->getData('login_button_view_model');
 ?>
 <div class="block block-customer-login">
     <div class="block-title">
@@ -44,12 +46,13 @@
                 </div>
                 <?= $block->getChildHtml('form_additional_info') ?>
                 <div class="actions-toolbar">
-                    <div class="primary"><button type="submit" class="action login primary" name="send" id="send2"><span><?= $block->escapeHtml(__('Sign In')) ?></span></button></div>
+                    <div class="primary"><button type="submit" class="action login primary" name="send" id="send2" <?php if ($loginButtonViewModel->disabled()): ?> disabled="disabled" <?php endif; ?>><span><?= $block->escapeHtml(__('Sign In')) ?></span></button></div>
                     <div class="secondary"><a class="action remind" href="<?= $block->escapeUrl($block->getForgotPasswordUrl()) ?>"><span><?= $block->escapeHtml(__('Forgot Your Password?')) ?></span></a></div>
                 </div>
             </fieldset>
         </form>
     </div>
+    <?php // phpcs:ignore Magento2.Legacy.PhtmlTemplate ?>
     <script type="text/x-magento-init">
         {
             "*": {
diff --git a/vendor/magento/module-customer/view/frontend/templates/form/register.phtml b/vendor/magento/module-customer/view/frontend/templates/form/register.phtml
index 5e58f94683ec..51d01c614a03 100644
--- a/vendor/magento/module-customer/view/frontend/templates/form/register.phtml
+++ b/vendor/magento/module-customer/view/frontend/templates/form/register.phtml
@@ -15,6 +15,8 @@ $addressHelper = $block->getData('addressHelper');
 /** @var \Magento\Directory\Helper\Data $directoryHelper */
 $directoryHelper = $block->getData('directoryHelper');
 $formData = $block->getFormData();
+/** @var \Magento\Customer\ViewModel\CreateAccountButton $createAccountButtonViewModel */
+$createAccountButtonViewModel = $block->getData('create_account_button_view_model');
 ?>
 <?php $displayAll = $block->getConfig('general/region/display_all'); ?>
 <?= $block->getChildHtml('form_fields_before') ?>
@@ -269,7 +271,9 @@ $formData = $block->getFormData();
         <div class="primary">
             <button type="submit"
                     class="action submit primary"
-                    title="<?= $escaper->escapeHtmlAttr(__('Create an Account')) ?>">
+                    title="<?= $escaper->escapeHtmlAttr(__('Create an Account')) ?>"
+                    id="send2"
+                    <?php if ($createAccountButtonViewModel->disabled()): ?> disabled="disabled" <?php endif; ?>>
                 <span><?= $escaper->escapeHtml(__('Create an Account')) ?></span>
             </button>
         </div>
@@ -326,6 +330,7 @@ script;
     $regionId = (int) $formData->getRegionId();
     $countriesWithOptionalZip = /* @noEscape */ $directoryHelper->getCountriesWithOptionalZip(true);
     ?>
+<?php // phpcs:ignore Magento2.Legacy.PhtmlTemplate ?>
 <script type="text/x-magento-init">
     {
         "#country": {
@@ -343,7 +348,7 @@ script;
     }
 </script>
 <?php endif; ?>
-
+<?php // phpcs:ignore Magento2.Legacy.PhtmlTemplate ?>
 <script type="text/x-magento-init">
     {
         ".field.password": {
diff --git a/vendor/magento/module-newsletter/ViewModel/NewsletterButton.php b/vendor/magento/module-newsletter/ViewModel/NewsletterButton.php
new file mode 100644
index 000000000000..657ca96926c9
--- /dev/null
+++ b/vendor/magento/module-newsletter/ViewModel/NewsletterButton.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Newsletter\ViewModel;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+/**
+ * Custom Newsletter subscribe button view model
+ */
+class NewsletterButton implements ArgumentInterface
+{
+    /**
+     * If Newsletter subscribe button should be disabled
+     *
+     * @return bool
+     */
+    public function disabled(): bool
+    {
+        return false;
+    }
+}
diff --git a/vendor/magento/module-newsletter/view/frontend/layout/default.xml b/vendor/magento/module-newsletter/view/frontend/layout/default.xml
index 32a08359333c..eab941338230 100644
--- a/vendor/magento/module-newsletter/view/frontend/layout/default.xml
+++ b/vendor/magento/module-newsletter/view/frontend/layout/default.xml
@@ -11,7 +11,11 @@
             <block class="Magento\Framework\View\Element\Js\Components" name="newsletter_head_components" template="Magento_Newsletter::js/components.phtml" ifconfig="newsletter/general/active"/>
         </referenceBlock>
         <referenceContainer name="footer">
-            <block class="Magento\Newsletter\Block\Subscribe" name="form.subscribe" as="subscribe" before="-" template="Magento_Newsletter::subscribe.phtml" ifconfig="newsletter/general/active"/>
+            <block class="Magento\Newsletter\Block\Subscribe" name="form.subscribe" as="subscribe" before="-" template="Magento_Newsletter::subscribe.phtml" ifconfig="newsletter/general/active">
+                <arguments>
+                    <argument name="newsletter_subscribe_account_button_view_model" xsi:type="object">Magento\Newsletter\ViewModel\NewsletterButton</argument>
+                </arguments>
+            </block>
         </referenceContainer>
     </body>
 </page>
diff --git a/vendor/magento/module-newsletter/view/frontend/templates/subscribe.phtml b/vendor/magento/module-newsletter/view/frontend/templates/subscribe.phtml
index 768c97ef316f..230817d47b03 100644
--- a/vendor/magento/module-newsletter/view/frontend/templates/subscribe.phtml
+++ b/vendor/magento/module-newsletter/view/frontend/templates/subscribe.phtml
@@ -5,6 +5,7 @@
  */
 
 /** @var \Magento\Newsletter\Block\Subscribe $block */
+$newsletterButtonViewModel = $block->getData('newsletter_subscribe_account_button_view_model');
 ?>
 <div class="block newsletter">
     <div class="title"><strong><?= $block->escapeHtml(__('Newsletter')) ?></strong></div>
@@ -33,7 +34,9 @@
                 <button class="action subscribe primary"
                         title="<?= $block->escapeHtmlAttr(__('Subscribe')) ?>"
                         type="submit"
-                        aria-label="Subscribe">
+                        aria-label="Subscribe"
+                        id="send2"
+                    <?php if ($newsletterButtonViewModel->disabled()): ?> disabled="disabled" <?php endif; ?>>
                     <span><?= $block->escapeHtml(__('Subscribe')) ?></span>
                 </button>
             </div>
diff --git a/vendor/magento/module-review/ViewModel/ReviewButton.php b/vendor/magento/module-review/ViewModel/ReviewButton.php
new file mode 100644
index 000000000000..3d41de3c8eb7
--- /dev/null
+++ b/vendor/magento/module-review/ViewModel/ReviewButton.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\Review\ViewModel;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+/**
+ * Custom Review button view model
+ */
+class ReviewButton implements ArgumentInterface
+{
+    /**
+     * If Review button should be disabled
+     *
+     * @return bool
+     */
+    public function disabled(): bool
+    {
+        return false;
+    }
+}
diff --git a/vendor/magento/module-review/view/frontend/layout/catalog_product_view.xml b/vendor/magento/module-review/view/frontend/layout/catalog_product_view.xml
index a6b46f8f25a7..cc53d858e9ad 100644
--- a/vendor/magento/module-review/view/frontend/layout/catalog_product_view.xml
+++ b/vendor/magento/module-review/view/frontend/layout/catalog_product_view.xml
@@ -23,6 +23,9 @@
                     <argument name="sort_order" xsi:type="string">30</argument>
                 </arguments>
                 <block class="Magento\Review\Block\Form" name="product.review.form" as="review_form" ifconfig="catalog/review/active">
+                    <arguments>
+                        <argument name="review_button_view_model" xsi:type="object">Magento\Review\ViewModel\ReviewButton</argument>
+                    </arguments>
                     <container name="product.review.form.fields.before" as="form_fields_before" label="Review Form Fields Before"/>
                 </block>
             </block>
diff --git a/vendor/magento/module-review/view/frontend/layout/checkout_cart_configure.xml b/vendor/magento/module-review/view/frontend/layout/checkout_cart_configure.xml
index 8a853cdd2e40..c08c7bf1ffc5 100644
--- a/vendor/magento/module-review/view/frontend/layout/checkout_cart_configure.xml
+++ b/vendor/magento/module-review/view/frontend/layout/checkout_cart_configure.xml
@@ -11,6 +11,7 @@
         <referenceBlock name="reviews.tab">
             <block class="Magento\Review\Block\Form\Configure" name="product.review.form" as="review_form" ifconfig="catalog/review/active">
                 <arguments>
+                    <argument name="review_button_view_model" xsi:type="object">Magento\Review\ViewModel\ReviewButton</argument>
                     <argument name="jsLayout" xsi:type="array">
                         <item name="components" xsi:type="array">
                             <item name="review-form" xsi:type="array">
diff --git a/vendor/magento/module-review/view/frontend/layout/wishlist_index_configure.xml b/vendor/magento/module-review/view/frontend/layout/wishlist_index_configure.xml
index 8a853cdd2e40..c08c7bf1ffc5 100644
--- a/vendor/magento/module-review/view/frontend/layout/wishlist_index_configure.xml
+++ b/vendor/magento/module-review/view/frontend/layout/wishlist_index_configure.xml
@@ -11,6 +11,7 @@
         <referenceBlock name="reviews.tab">
             <block class="Magento\Review\Block\Form\Configure" name="product.review.form" as="review_form" ifconfig="catalog/review/active">
                 <arguments>
+                    <argument name="review_button_view_model" xsi:type="object">Magento\Review\ViewModel\ReviewButton</argument>
                     <argument name="jsLayout" xsi:type="array">
                         <item name="components" xsi:type="array">
                             <item name="review-form" xsi:type="array">
diff --git a/vendor/magento/module-review/view/frontend/templates/form.phtml b/vendor/magento/module-review/view/frontend/templates/form.phtml
index 6b00bf681c1e..c6d3c205d9e1 100644
--- a/vendor/magento/module-review/view/frontend/templates/form.phtml
+++ b/vendor/magento/module-review/view/frontend/templates/form.phtml
@@ -6,6 +6,7 @@
 
 /** @var \Magento\Review\Block\Form $block */
 //phpcs:disable Generic.Files.LineLength
+$reviewButtonViewModel = $block->getData('review_button_view_model');
 ?>
 <div class="block review-add">
     <div class="block-title"><strong><?= $block->escapeHtml(__('Write Your Own Review')) ?></strong></div>
@@ -74,7 +75,10 @@
     </fieldset>
     <div class="actions-toolbar review-form-actions">
         <div class="primary actions-primary">
-            <button type="submit" class="action submit primary"><span><?= $block->escapeHtml(__('Submit Review')) ?></span></button>
+            <button type="submit" class="action submit primary"
+                    id="send2"
+                <?php if ($reviewButtonViewModel->disabled()): ?> disabled="disabled" <?php endif; ?>
+            ><span><?= $block->escapeHtml(__('Submit Review')) ?></span></button>
         </div>
     </div>
 </form>
diff --git a/vendor/magento/module-send-friend/ViewModel/SendFriendButton.php b/vendor/magento/module-send-friend/ViewModel/SendFriendButton.php
new file mode 100644
index 000000000000..e99705f0c660
--- /dev/null
+++ b/vendor/magento/module-send-friend/ViewModel/SendFriendButton.php
@@ -0,0 +1,26 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+declare(strict_types=1);
+
+namespace Magento\SendFriend\ViewModel;
+
+use Magento\Framework\View\Element\Block\ArgumentInterface;
+
+/**
+ * Custom Email to a Friend button view model
+ */
+class SendFriendButton implements ArgumentInterface
+{
+    /**
+     * If Email to a Friend button should be disabled
+     *
+     * @return bool
+     */
+    public function disabled(): bool
+    {
+        return false;
+    }
+}
diff --git a/vendor/magento/module-send-friend/view/frontend/layout/sendfriend_product_send.xml b/vendor/magento/module-send-friend/view/frontend/layout/sendfriend_product_send.xml
index 4d6f3d8c628b..6705e0f0f92d 100644
--- a/vendor/magento/module-send-friend/view/frontend/layout/sendfriend_product_send.xml
+++ b/vendor/magento/module-send-friend/view/frontend/layout/sendfriend_product_send.xml
@@ -14,6 +14,9 @@
         </referenceBlock>
         <referenceContainer name="content">
             <block class="Magento\SendFriend\Block\Send" name="sendfriend.send" cacheable="false" template="Magento_SendFriend::send.phtml">
+                <arguments>
+                    <argument name="sendfriend_button_view_model" xsi:type="object">Magento\SendFriend\ViewModel\SendFriendButton</argument>
+                </arguments>
                 <container name="form.additional.info" as="form_additional_info"/>
             </block>
         </referenceContainer>
diff --git a/vendor/magento/module-send-friend/view/frontend/templates/send.phtml b/vendor/magento/module-send-friend/view/frontend/templates/send.phtml
index b1e3da8612f7..4dcc3cb6bfb5 100644
--- a/vendor/magento/module-send-friend/view/frontend/templates/send.phtml
+++ b/vendor/magento/module-send-friend/view/frontend/templates/send.phtml
@@ -11,7 +11,7 @@
  * @var \Magento\SendFriend\Block\Send $block
  * @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer
  */
-
+$sendFriendButtonViewModel = $block->getData('sendfriend_button_view_model')
 ?>
 <script id="add-recipient-tmpl" type="text/x-magento-template">
     <div class="actions-toolbar">
@@ -39,7 +39,8 @@
                 <span><?= $block->escapeHtml(__('Email')) ?></span>
             </label>
             <div class="control">
-                <input name="recipients[email][<%- data._index_ %>]" title="<?= $block->escapeHtmlAttr(__('Email')) ?>"
+                <input name="recipients[email][<%- data._index_ %>]"
+                       title="<?= $block->escapeHtmlAttr(__('Email')) ?>"
                        id="recipients-email<%- data._index_ %>" type="email" class="input-text"
                        data-mage-init='{"mage/trim-input":{}}'
                        data-validate="{required:true, 'validate-email':true}"/>
@@ -70,7 +71,8 @@
             <label for="sender-name" class="label"><span><?= $block->escapeHtml(__('Name')) ?></span></label>
             <div class="control">
                 <input name="sender[name]" value="<?= $block->escapeHtmlAttr($block->getUserName()) ?>"
-                       title="<?= $block->escapeHtmlAttr(__('Name')) ?>" id="sender-name" type="text" class="input-text"
+                       title="<?= $block->escapeHtmlAttr(__('Name')) ?>"
+                       id="sender-name" type="text" class="input-text"
                        data-validate="{required:true}"/>
             </div>
         </div>
@@ -87,7 +89,10 @@
         </div>
 
         <div class="field text required">
-            <label for="sender-message" class="label"><span><?= $block->escapeHtml(__('Message')) ?></span></label>
+            <label for="sender-message" class="label">
+                <span><?= $block->escapeHtml(__('Message')) ?>
+                </span>
+            </label>
             <div class="control">
                 <textarea name="sender[message]" class="input-text" id="sender-message" cols="3" rows="3"
                           data-validate="{required:true}"><?= $block->escapeHtml($block->getMessage()) ?></textarea>
@@ -102,7 +107,10 @@
         <div id="recipients-options"></div>
         <?php if ($block->getMaxRecipients()): ?>
             <div id="max-recipient-message" class="message notice limit" role="alert">
-                <span><?= $block->escapeHtml(__('Maximum %1 email addresses allowed.', $block->getMaxRecipients())) ?>
+                <span>
+                    <?= $block->escapeHtml(
+                        __('Maximum %1 email addresses allowed.', $block->getMaxRecipients())
+                    ) ?>
                 </span>
             </div>
             <?= /* @noEscape */ $secureRenderer->renderStyleAsTag("display: none;", 'div#max-recipient-message') ?>
@@ -121,7 +129,11 @@
     <div class="actions-toolbar">
         <div class="primary">
             <button type="submit"
-                    class="action submit primary"<?php if (!$block->canSend()): ?> disabled="disabled"<?php endif ?>>
+                    class="action submit primary"
+                    <?php if (!$block->canSend() || $sendFriendButtonViewModel->disabled()): ?>
+                        disabled="disabled"
+                    <?php endif ?>
+                    id="send2">
                 <span><?= $block->escapeHtml(__('Send Email')) ?></span></button>
         </div>
         <div class="secondary">
