diff --git a/vendor/magento/module-catalog-widget/Block/Product/ProductsList.php b/vendor/magento/module-catalog-widget/Block/Product/ProductsList.php
index 7e6693ce68ef..7181d028ab33 100644
--- a/vendor/magento/module-catalog-widget/Block/Product/ProductsList.php
+++ b/vendor/magento/module-catalog-widget/Block/Product/ProductsList.php
@@ -328,15 +328,26 @@ protected function _beforeToHtml()
      */
     public function createCollection()
     {
-        /** @var $collection Collection */
-        $collection = $this->productCollectionFactory->create();
+        $collection = $this->getBaseCollection();
+
+        $collection->setVisibility($this->catalogProductVisibility->getVisibleInCatalogIds());
+
+        return $collection;
+    }

+    /**
+     * Prepare and return product collection without visibility filter
+     *
+     * @return Collection
+     * @throws LocalizedException
+     */
+    public function getBaseCollection(): Collection
+    {
+        $collection = $this->productCollectionFactory->create();
         if ($this->getData('store_id') !== null) {
             $collection->setStoreId($this->getData('store_id'));
         }

-        $collection->setVisibility($this->catalogProductVisibility->getVisibleInCatalogIds());
-
         /**
          * Change sorting attribute to entity_id because created_at can be the same for products fastly created
          * one by one and sorting by created_at is indeterministic in this case.
diff --git a/vendor/magento/module-catalog-widget/view/frontend/templates/product/widget/content/grid.phtml b/vendor/magento/module-catalog-widget/view/frontend/templates/product/widget/content/grid.phtml
index 8677a47e0729..2a96a0b44c48 100644
--- a/vendor/magento/module-catalog-widget/view/frontend/templates/product/widget/content/grid.phtml
+++ b/vendor/magento/module-catalog-widget/view/frontend/templates/product/widget/content/grid.phtml
@@ -15,7 +15,7 @@ use Magento\Framework\App\Action\Action;
 // phpcs:disable Magento2.Templates.ThisInTemplate.FoundHelper
 // phpcs:disable Magento2.Templates.ThisInTemplate.FoundThis
 ?>
-<?php if ($exist = ($block->getProductCollection() && $block->getProductCollection()->getSize())): ?>
+<?php if ($exist = ($block->getProductCollection() && $block->getProductCollection()->count())): ?>
     <?php
     $type = 'widget-product-grid';

diff --git a/vendor/magento/module-configurable-product/Plugin/CatalogWidget/Block/Product/ProductsListPlugin.php b/vendor/magento/module-configurable-product/Plugin/CatalogWidget/Block/Product/ProductsListPlugin.php
new file mode 100644
index 000000000000..782bce8772c7
--- /dev/null
+++ b/vendor/magento/module-configurable-product/Plugin/CatalogWidget/Block/Product/ProductsListPlugin.php
@@ -0,0 +1,105 @@
+<?php
+/**
+ * Copyright © Magento, Inc. All rights reserved.
+ * See COPYING.txt for license details.
+ */
+
+declare(strict_types=1);
+
+namespace Magento\ConfigurableProduct\Plugin\CatalogWidget\Block\Product;
+
+use Magento\Catalog\Model\Product;
+use Magento\Catalog\Model\Product\Visibility;
+use Magento\Catalog\Model\ResourceModel\Product\Collection;
+use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
+use Magento\CatalogWidget\Block\Product\ProductsList;
+use Magento\Framework\App\ResourceConnection;
+use Magento\Framework\EntityManager\MetadataPool;
+use Magento\Framework\Exception\LocalizedException;
+
+class ProductsListPlugin
+{
+    /**
+     * @var CollectionFactory
+     */
+    private CollectionFactory $productCollectionFactory;
+
+    /**
+     * @var Visibility
+     */
+    private Visibility $catalogProductVisibility;
+
+    /**
+     * @var ResourceConnection
+     */
+    private ResourceConnection $resource;
+
+    /**
+     * @var MetadataPool
+     */
+    private MetadataPool $metadataPool;
+
+    /**
+     * @param CollectionFactory $productCollectionFactory
+     * @param Visibility $catalogProductVisibility
+     * @param ResourceConnection $resource
+     * @param MetadataPool $metadataPool
+     */
+    public function __construct(
+        CollectionFactory  $productCollectionFactory,
+        Visibility         $catalogProductVisibility,
+        ResourceConnection $resource,
+        MetadataPool $metadataPool
+    ) {
+        $this->productCollectionFactory = $productCollectionFactory;
+        $this->catalogProductVisibility = $catalogProductVisibility;
+        $this->resource = $resource;
+        $this->metadataPool = $metadataPool;
+    }
+
+    /**
+     * Adds configurable products to the item list if child products are already part of the collection
+     *
+     * @param ProductsList $subject
+     * @param Collection $result
+     * @return Collection
+     * @throws LocalizedException
+     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
+     */
+    public function afterCreateCollection(ProductsList $subject, Collection $result): Collection
+    {
+        $notVisibleCollection = $subject->getBaseCollection();
+        $currentIds = $result->getAllIds();
+        $searchProducts = array_merge($currentIds, $notVisibleCollection->getAllIds());
+
+        if (!empty($searchProducts)) {
+            $linkField = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class)
+                ->getLinkField();
+            $connection = $this->resource->getConnection();
+            $productIds = $connection->fetchCol(
+                $connection
+                ->select()
+                ->from(['e' => $this->resource->getTableName('catalog_product_entity')], ['link_table.parent_id'])
+                ->joinInner(
+                    ['link_table' => $this->resource->getTableName('catalog_product_super_link')],
+                    'link_table.product_id = e.' . $linkField,
+                    []
+                )
+                ->where('link_table.product_id IN (?)', $searchProducts)
+            );
+
+            $configurableProductCollection = $this->productCollectionFactory->create();
+            $configurableProductCollection->setVisibility($this->catalogProductVisibility->getVisibleInCatalogIds());
+            $configurableProductCollection->addIdFilter($productIds);
+
+            /** @var Product $item */
+            foreach ($configurableProductCollection->getItems() as $item) {
+                if (false === in_array($item->getId(), $currentIds)) {
+                    $result->addItem($item->load($item->getId()));
+                }
+            }
+        }
+
+        return $result;
+    }
+}
diff --git a/vendor/magento/module-configurable-product/etc/di.xml b/vendor/magento/module-configurable-product/etc/di.xml
index 4559fd503d03..36041169514c 100644
--- a/vendor/magento/module-configurable-product/etc/di.xml
+++ b/vendor/magento/module-configurable-product/etc/di.xml
@@ -21,6 +21,9 @@
     <preference for="Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price\OptionsSelectBuilderInterface" type="Magento\ConfigurableProduct\Model\ResourceModel\Product\Indexer\Price\OptionsSelectBuilder" />
     <preference for="Magento\ConfigurableProduct\Pricing\Price\ConfigurableOptionsFilterInterface" type="Magento\ConfigurableProduct\Pricing\Price\ConfigurableOptionsCompositeFilter" />

+    <type name="Magento\CatalogWidget\Block\Product\ProductsList">
+        <plugin name="configurable_product_widget_product_list" type="Magento\ConfigurableProduct\Plugin\CatalogWidget\Block\Product\ProductsListPlugin" sortOrder="2"/>
+    </type>
     <type name="Magento\CatalogInventory\Model\Quote\Item\QuantityValidator\Initializer\Option">
         <plugin name="configurable_product" type="Magento\ConfigurableProduct\Model\Quote\Item\QuantityValidator\Initializer\Option\Plugin\ConfigurableProduct" sortOrder="50" />
     </type>
