Index: /controller/wpsg_ShopController.class.php
===================================================================
--- /controller/wpsg_ShopController.class.php	(revision 8534)
+++ /controller/wpsg_ShopController.class.php	(revision 8535)
@@ -1863,4 +1863,22 @@
 
 		} // public function renderProdukt($produkt_id)
+
+		/**
+		 * Shortcode fÃŒr den Link zum Widerrufsformular. Nutzbar nach Aktivierung des "Widerrufsformular"-Moduls
+		 */
+		public function shortcode_revocation($atts, $content = '') {
+
+			/* Nur ausgeben, wenn das Widerruf-Modul aktiviert ist */
+			if (!$this->hasMod('wpsg_mod_revocation')) return 'Bitte das Widerruf-Modul aktivieren, um diesen Shortcode zu nutzen.';
+
+			if (!wpsg_isSizedString($content)) {
+				$content = __('Vertrag widerrufen', 'wpsgRevocation');
+			}
+
+			/* Die Klasse wpsg_revocation_link Ã¶ffnet im Footer-JS open_dialog(),
+			   welches den ajaxDialogContent des Moduls per AJAX nachlÃ€dt. */
+			return '<a href="#" class="wpsg_revocation_link"><p>' . wpsg_hspc($content) . '</p></a>';
+
+		}
 
 		/**
Index: /mods/mod_revocation/Action.php
===================================================================
--- /mods/mod_revocation/Action.php	(revision 8534)
+++ /mods/mod_revocation/Action.php	(revision 8535)
@@ -109,3 +109,21 @@
 	}
 
+	/**
+	 * Rendert das Widerrufsformular als eigenstÃ€ndige Seite (kein Popup),
+	 * sobald die dafÃŒr angelegte Seite (Option wpsg_page_widerrufsformular) aufgerufen wird.
+	 * Wird ÃŒber wpsg_ShopController::content_filter() / callMods('content_filter') aufgerufen.
+	 */
+	public static function content_filter(&$content): void {
+
+		$pageId = intval(\wpsg_ShopController::getShop()->get_option('wpsg_page_widerrufsformular'));
+
+		if ($pageId <= 0) return;
+		if (\wpsg_get_the_id() !== $pageId) return;
+
+		// An den vorhandenen Seiteninhalt anhÃ€ngen, damit bei einer zugeordneten bestehenden Seite
+		// ein evtl. gepflegter Einleitungstext erhalten bleibt (leere neue Seite => nur das Formular).
+		$content .= \wpsg_ShopController::getShop()->render(WPSG_PATH_VIEW.'mods/mod_revocation/page_form.phtml', false);
+
+	}
+
 }
Index: /mods/wpsg_mod_revocation.class.php
===================================================================
--- /mods/wpsg_mod_revocation.class.php	(revision 8534)
+++ /mods/wpsg_mod_revocation.class.php	(revision 8535)
@@ -110,4 +110,9 @@
 			$this->install();
 	
+			// Seitenauswahl fÃŒr das Widerrufsformular (neu anlegen oder bestehende Seite verwenden)
+			$arPages = ['-1' => __('Neu anlegen und zuordnen', 'wpsgRevocation')];
+			foreach (\get_pages() as $oPage) { $arPages[$oPage->ID] = $oPage->post_title.' (ID:'.$oPage->ID.')'; }
+			\wpsg_ShopController::getShop()->view['pages'] = $arPages;
+	
 			\wpsg_ShopController::getShop()->render(dirname(__FILE__).'/../views/mods/mod_revocation/settings_edit.phtml');
 	
@@ -122,4 +127,7 @@
 	
 			\wpsg_ShopController::getShop()->update_option('wpsg_mod_revocation_reason', $_REQUEST['wpsg_mod_revocation_reason']??null, false, false, WPSG_SANITIZE_TEXTFIELD);
+
+			// Widerrufsformular-Seite anlegen (-1) oder die ausgewÃ€hlte bestehende Seite zuordnen
+			\wpsg_ShopController::getShop()->createPage(__('Widerrufsformular', 'wpsgRevocation'), 'wpsg_page_widerrufsformular', wpsg_sinput(WPSG_SANITIZE_INT, $_REQUEST['wpsg_page_widerrufsformular'] ?? '-1'));
 	
 		}
@@ -177,5 +185,11 @@
 		}
 	
-		/* Modulfunktionen */
+		public function content_filter(&$content) {
+
+		\wpsgRevocation\Action::content_filter($content);
+
+	}
+
+	/* Modulfunktionen */
 	
 		public static function getInstance(): wpsg_mod_revocation {
Index: /views/mods/mod_revocation/ajaxDialogContent.phtml
===================================================================
--- /views/mods/mod_revocation/ajaxDialogContent.phtml	(revision 8534)
+++ /views/mods/mod_revocation/ajaxDialogContent.phtml	(revision 8535)
@@ -13,6 +13,7 @@
 	use \wpsg\M1;
 	use wpsg_product;
+	use wpsg_ShopController;
 
-	$arReason = \wpsgRevocation\Revocation::getReasons();
+$arReason = \wpsgRevocation\Revocation::getReasons();
 
 	// Produkte
@@ -101,5 +102,5 @@
 
 			<div class="form_field">
-				<div class="label"><?php echo __('Produkt - Nr.', 'wpsgRevocation'); ?></div>
+				<div class="label"><?php echo __('Artikel - Nr.', 'wpsgRevocation'); ?></div>
 				<div class="value">
 					<input type="text" name="wpsg_revocation_reason[row][<?php echo $key; ?>][product_nr]" value="<?php echo ($dialog_config['set_product_anr']??''); ?>" />
@@ -146,3 +147,7 @@
 	</div>
 
+	<p>
+		Es gelten unsere <?php echo '<a href="' . $GLOBALS['wpsg_sc']->getURL(wpsg_ShopController::URL_DATENSCHUTZ) . '">Datenschutzbestimmungen</a>' ?>
+	</p>
+
 </form>
Index: /views/mods/mod_revocation/settings_edit.phtml
===================================================================
--- /views/mods/mod_revocation/settings_edit.phtml	(revision 8534)
+++ /views/mods/mod_revocation/settings_edit.phtml	(revision 8535)
@@ -30,4 +30,10 @@
 				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_revocation_view_product', __('Im Produkt neben "In den Warenkorb" anzeigen.', 'wpsgRevocation'), wpsg_ShopController::getShop()->get_option('wpsg_mod_revocation_view_product'), ['fullWidth' => true]); ?>
 				<?php echo wpsg_drawForm_Checkbox('wpsg_mod_revocation_view_customer_mail', __('Widerruflink in BestellbestÃ€tigungsmail an Kunden.', 'wpsgRevocation'), wpsg_ShopController::getShop()->get_option('wpsg_mod_revocation_view_customer_mail'), ['fullWidth' => true]); ?>
+
+				<hr />
+
+				<div v-pre>
+					<?php echo wpsg_drawForm_Select('wpsg_page_widerrufsformular', __('Seite fÃŒr das Widerrufsformular', 'wpsgRevocation'), wpsg_ShopController::getShop()->view['pages'], wpsg_ShopController::getShop()->get_option('wpsg_page_widerrufsformular'), ['hint' => __('WÃ€hlen Sie âNeu anlegen und zuordnen", damit beim Speichern automatisch eine eigene Seite erstellt wird â oder ordnen Sie eine bestehende Seite zu. Das Formular wird automatisch in diese Seite eingebunden.', 'wpsgRevocation')]); ?>
+				</div>
 
 				<p class="wpsg_note">
Index: /views/mods/mod_revocation/wp_footer.phtml
===================================================================
--- /views/mods/mod_revocation/wp_footer.phtml	(revision 8534)
+++ /views/mods/mod_revocation/wp_footer.phtml	(revision 8535)
@@ -201,5 +201,7 @@
 		});
 
-	};
+        setTimeout(() => {document.querySelector('[name="wpsg_revocation_reason[row][0][product_nr]"]')?.focus();}, 1000)
+
+    };
 
 	 // Button am Produkt
@@ -216,5 +218,18 @@
 	// Button Listener FlyOut
 	document.getElementById('wpsg_revocation_button').addEventListener('click', event => { open_dialog(); });
-	
+
+	// Shortcode-Link Listener [wpshopgermany_widerruf]
+	document.addEventListener('click', event => {
+
+		const link = event.target.closest('a.wpsg_revocation_link');
+
+		if (link === null) return;
+
+		event.preventDefault();
+        open_dialog();
+
+	});
+
+
 	// GET Parameter verarbeiten
 	const urlParams = new URLSearchParams(window.location.search);
Index: /views/mods/mod_revocation/wpsg_revocation.css
===================================================================
--- /views/mods/mod_revocation/wpsg_revocation.css	(revision 8534)
+++ /views/mods/mod_revocation/wpsg_revocation.css	(revision 8535)
@@ -65,2 +65,23 @@
 	word-break: normal;
 }
+/* EigenstÃ€ndige Widerrufsformular-Seite (kein Popup) */
+.wpsg_revocation_page { width:100%; max-width:800px; margin:0 auto; }
+
+#wpsg_revocation_page_form { display:flex; flex-direction:column; gap:0.5rem; width:100%;
+	.wpsg_revocation_order_product { border:1px solid #ddd; border-radius:0.5rem; padding:1rem; margin:0 0 1rem 0; }
+	.wpsg_revocation_order_product > div { width:100%; }
+	.form_field { display:flex; width:100%; flex-direction:column; gap:0.125rem;
+		.label { color:black; font-size:1.25rem; }
+		.value { display:flex; justify-content:stretch; gap:0.25rem;
+			input, textarea, select { width:auto; flex-grow:1; min-height:30px; text-indent:0.25rem; flex-shrink:1; }
+			textarea { min-height:90px; padding:0.25rem; }
+			select { height:36px; }
+			input[type="number"] { flex-shrink:2; flex-grow:0; }
+		}
+	}
+	#wpsg_error, .wpsg_error { padding-left:5px; color:red; list-style:none; margin:0 0 1rem 0; }
+	.wpsg_revocation_page_submit_wrap { margin-top:0.5rem; }
+}
+
+.wpsg_revocation_page_success { padding:1rem; border:1px solid #2e7d32; border-radius:0.5rem; background:#edf7ed; color:#2e7d32; }
+.wpsg_revocation_page_datenschutz { margin:0.5rem 0; }
Index: /wpshopgermany.php
===================================================================
--- /wpshopgermany.php	(revision 8534)
+++ /wpshopgermany.php	(revision 8535)
@@ -281,4 +281,5 @@
 		add_shortcode('wpshopgermany', array($shop, 'shortcode'));
 		add_shortcode('wpshopgermany_link', array($shop, 'shortcode_basket'));
+		add_shortcode('wpshopgermany_widerruf', array($shop, 'shortcode_revocation'));
 		
 		add_filter('the_title', array($shop, 'the_title'), 10, 2);
