--- i/src/Element/ComponentElementBuilder.php
+++ w/src/Element/ComponentElementBuilder.php
@@ -8,6 +8,7 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Plugin\Component;
+use Drupal\Core\Plugin\PreviewAwarePluginInterface;
 use Drupal\Core\Render\Component\Exception\ComponentNotFoundException;
 use Drupal\Core\Render\Element;
 use Drupal\Core\Security\TrustedCallbackInterface;
@@ -206,7 +207,9 @@
    * Update the build array for a configured source on a prop/slot.
    *
    * @param array $build
-   *   The build array.
+   *   The build array. A truthy '#in_preview' marks the whole subtree as a
+   *   preview rather than a real display, and any source implementing
+   *   PreviewAwarePluginInterface is told so before it resolves.
    * @param string $prop_or_slot_id
    *   Prop ID or slot ID.
    * @param array $definition
@@ -228,6 +231,9 @@
       if (!$source) {
         return $build;
       }
+      if (!empty($build['#in_preview']) && $source instanceof PreviewAwarePluginInterface) {
+        $source->setInPreview(TRUE);
+      }
       /** @var \Drupal\ui_patterns\PropTypeInterface $prop_type */
       $prop_type = $source->getPropDefinition()['ui_patterns']['type_definition'];
       // Alter the build array before getting the value.
--- i/src/Plugin/UiPatterns/Source/ComponentSource.php
+++ w/src/Plugin/UiPatterns/Source/ComponentSource.php
@@ -8,6 +8,7 @@
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\Context\ContextRepositoryInterface;
+use Drupal\Core\Plugin\PreviewAwarePluginInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\Core\Utility\Token;
@@ -30,7 +31,16 @@
   description: new TranslatableMarkup('Add a Component'),
   prop_types: ['slot']
 )]
-class ComponentSource extends SourcePluginBase implements SourceWithChoicesInterface {
+class ComponentSource extends SourcePluginBase implements SourceWithChoicesInterface, PreviewAwarePluginInterface {
+
+  /**
+   * Whether this component is being rendered in a preview.
+   *
+   * Carried into the nested component so a source further down learns it too:
+   * the sources of a component in a slot are built by another pass of the
+   * element builder, which only knows what the element it is given says.
+   */
+  protected bool $inPreview = FALSE;
 
   /**
    * {@inheritdoc}
@@ -101,10 +111,18 @@
       '#component' => $component_settings['component_id'],
       '#ui_patterns' => $component_settings,
       '#source_contexts' => $this->context,
+      '#in_preview' => $this->inPreview,
     ];
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function setInPreview(bool $in_preview): void {
+    $this->inPreview = $in_preview;
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function settingsForm(array $form, FormStateInterface $form_state): array {
