From 46d681c6b825d21b3f698d793c4e630c687d90ad Mon Sep 17 00:00:00 2001
From: Jake Vanderwerf <get@jakevanderwerf.ca>
Date: Thu, 21 May 2026 21:41:53 +0000
Subject: [PATCH] =Major CustomBlocks.php overhaul, expanding block support and customization from the editor. theme.json should now be updated on new themes to set brand colours, etc. Also note: major change to .col vs .row alignment: simplifying it to .top .bottom vs the confusion of the differences for .col/.row .start and .a-start

---
 inc/managers/LoginManager.php |  103 ++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 77 insertions(+), 26 deletions(-)

diff --git a/inc/managers/LoginManager.php b/inc/managers/LoginManager.php
index 55481ad..68db551 100644
--- a/inc/managers/LoginManager.php
+++ b/inc/managers/LoginManager.php
@@ -23,6 +23,7 @@
 	protected array $fields = [];
 	protected ?string $action = null;
 	protected string $title = '';
+	protected static LoginManager $instance;
 
 	// Token handlers registry
 	protected array $messageHandlers = [];
@@ -35,8 +36,10 @@
 	];
 	private int $max_file_size = 5242880; // 5MB in bytes
 
+
 	public function __construct()
 	{
+		self::$instance = $this;
 		$this->cache = Cache::for('login');
 		$this->cache->flush();
 		// Initialize magic link support if enabled
@@ -65,6 +68,10 @@
 		add_action('user_register', array($this, 'saveRegistrationFields'), 999, 2);
 		add_filter('the_seo_framework_sitemap_exclude_ids', [$this, 'excludeLoginSitemap'], 10, 1);
 	}
+	public static function getInstance():self
+	{
+		return self::$instance;
+	}
 
 	public function excludeLoginSitemap(array $ids): array
 	{
@@ -183,8 +190,13 @@
 
 	protected function setupFields():void
 	{
+		$this->fields = $this->getFieldsForAction($this->action);
+	}
+
+	protected function getFieldsForAction(string $action):array
+	{
 		$fields = [];
-		switch($this->action) {
+		switch($action) {
 			case 'register':
 				$fields = $this->getRegistrationFormFields();
 				break;
@@ -255,9 +267,10 @@
 				break;
 
 		}
-		$this->fields = $fields;
+		return $fields;
 	}
 
+
 	/**
 	 * Ensure login page exists
 	 */
@@ -536,32 +549,12 @@
 	{
 		$form = $this->action.'form';
 		?>
-		<section class="login-box col btw">
+		<section class="login-box col y-btw">
 			<h1><?=$this->labels['title']?></h1>
 			<?= $this->labels['description'] ?>
 
+			<?= $this->renderLoginForm($this->action); ?>
 
-			<form name="<?=$form?>" method="post" data-action="jvb_<?=$this->action?>">
-				<?= jvbFormStatus() ?>
-				<?php wp_nonce_field('jvb_'.$this->action, '_wpnonce'); ?>
-				<input type="hidden" name="action" value="jvb_<?=$this->action?>">
-				<input type="hidden" name="redirect_to" value="<?= esc_attr($_GET['redirect_to'] ?? '') ?>">
-				<input type="hidden" name="request_id" value="<?= wp_generate_password(16, false) ?>">
-				<?= ($this->action === 'magic') ? '<input type="hidden" name="type" value="login">' : '' ?>
-				<?php
-				do_action('jvb_add_token_inputs', $this->action);
-
-				foreach ($this->fields as $name => $config) {
-					echo Form::render($name, '', $config);
-				}
-
-				$this->maybeTurnstile();
-				 ?>
-				 <div class="row btw nowrap">
-					<button type="submit" class="button button-primary button-large"><?=$this->labels['submit']?></button>
-					<?php $this->maybeMagicLink(); ?>
-				</div>
-			</form>
 
 			<?php
 			if (is_array($this->labels['extra'])) {
@@ -575,7 +568,7 @@
 			}
 			?>
 
-			<div class="options row btw">
+			<div class="options row x-btw">
 				<?php
 				switch ($this->action) {
 					case 'login': ?>
@@ -600,7 +593,7 @@
 
 			</div>
 		</section>
-		<div class="navigation row btw">
+		<div class="navigation row x-btw">
 			<a href="<?= get_home_url() ?>">Home</a>
 			<?php
 			$privacy = get_privacy_policy_url();
@@ -610,6 +603,59 @@
 		</div>
 		<?php
 	}
+	public function renderLoginForm(string $action = 'login', string $redirect = '', string $title = ''):string
+	{
+		ob_start();
+		do_action('jvb_add_token_inputs', $this->action);
+		$additionalInputs = ob_get_clean();
+
+		$fields = '';
+		$theFields = $this->getFieldsForAction($action);
+		foreach ($theFields as $name => $config) {
+			$fields .= Form::render($name, '', $config);
+		}
+
+		ob_start();
+		$this->maybeTurnstile();
+		$turnstile = ob_get_clean();
+
+		ob_start();
+		$this->maybeMagicLink();
+		$magicLink = ob_get_clean();
+
+		$redirect = !empty($redirect) ? $redirect : esc_attr($_GET['redirect_to'] ?? '');
+
+		return sprintf(
+			'<form name="%sform" method="post" data-action="jvb_%s">
+				%s%s%s
+				<input type="hidden" name="action" value="jvb_%s">
+				<input type="hidden" name="redirect_to" value="%s">
+				<input type="hidden" name="request_id" value="%s">
+				%s
+				%s
+				%s
+				%s
+				 <div class="row x-btw nowrap">
+					<button type="submit" class="button button-primary button-large">%s</button>
+					%s
+				</div>
+			</form>',
+			$action,
+			$action,
+			jvbFormStatus(),
+			$title,
+			wp_nonce_field('jvb_'.$action),
+			$action,
+			$redirect,
+			wp_generate_password(16, false),
+			($action === 'magic') ? '<input type="hidden" name="type" value="login">' : '',
+			$additionalInputs,
+			$fields,
+			$turnstile,
+			$this->labels['submit'],
+			$magicLink
+		);
+	}
 	protected function renderHeader():void
     {
     ?>
@@ -968,6 +1014,11 @@
 	{
 
 	}
+	public function setAction(string $action = 'login'):void
+	{
+		$this->action = $action;
+		$this->setup();
+	}
 }
 
 // Initialize the login manager

--
Gitblit v1.10.0