• File: builder.php
  • Full Path: /home/bravrvjk/hpgt.org/wp-content/plugins/royal-elementor-addons/modules/widget-builder/views/builder.php
  • Date Modified: 04/10/2026 2:58 PM
  • File size: 13.06 KB
  • MIME-type: text/x-php
  • Charset: utf-8
<?php
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

// phpcs:ignore WordPress.Security.NonceVerification.Recommended
$widget_id    = isset( $_GET['post'] ) ? intval( wp_unslash( $_GET['post'] ) ) : 0;
$widget_title = $widget_id ? get_the_title( $widget_id ) : esc_html__( 'New Widget', 'wpr-addons' );
$back_url     = admin_url( 'edit.php?post_type=wpr_custom_widget' );
$preview_url  = '';

if ( $widget_id ) {
	$preview_url = str_replace(
		[ '&amp;', 'action=edit' ],
		[ '&', 'action=elementor' ],
		get_edit_post_link( $widget_id )
	);
}
?>
<script>
	var wprWidgetBuilder = {
		apiBase: '<?php echo esc_url( rest_url( 'wpr-addons/v1/widget-builder/' ) ); ?>',
		postId: <?php echo intval( $widget_id ); ?>,
		nonce: '<?php echo esc_js( wp_create_nonce( 'wp_rest' ) ); ?>',
		previewUrl: '<?php echo esc_url( $preview_url ); ?>',
		backUrl: '<?php echo esc_url( $back_url ); ?>',
		eiconsUrl: '<?php echo esc_url( ELEMENTOR_ASSETS_URL . 'lib/eicons/eicons.json' ); ?>'
	};
</script>

<div id="wpr-wb-app">

	<!-- LEFT PANEL: Settings -->
	<div class="wpr-wb-panel wpr-wb-panel-left">
		<!-- Panel Header -->
		<div class="wpr-wb-panel-header">
			<span class="wpr-wb-panel-header-title" id="wpr-wb-header-title"><?php echo esc_html( $widget_title ); ?></span>
			<button type="button" class="wpr-wb-panel-collapse-btn" id="wpr-wb-collapse-left" title="<?php esc_attr_e( 'Collapse Panel', 'wpr-addons' ); ?>">
				<i class="eicon-chevron-left"></i>
			</button>
		</div>

		<!-- Settings Content -->
		<div class="wpr-wb-panel-body" id="wpr-wb-settings-body">
			<div class="wpr-wb-setting-group">
				<label class="wpr-wb-setting-label"><?php esc_html_e( 'Widget Title', 'wpr-addons' ); ?></label>
				<input type="text" id="wpr-wb-title" class="wpr-wb-setting-input" value="<?php echo esc_attr( $widget_title ); ?>" placeholder="<?php esc_attr_e( 'New Widget', 'wpr-addons' ); ?>">
				<span class="wpr-wb-setting-desc"><?php esc_html_e( 'The Widget Title will show on the widgets list.', 'wpr-addons' ); ?></span>
			</div>

			<div class="wpr-wb-setting-group">
				<label class="wpr-wb-setting-label"><?php esc_html_e( 'Widget Icon', 'wpr-addons' ); ?></label>
				<div class="wpr-wb-icon-preview-wrap">
					<div class="wpr-wb-icon-preview" id="wpr-wb-icon-preview">
						<i class="eicon-cog" id="wpr-wb-icon-preview-i"></i>
					</div>
					<button type="button" class="wpr-wb-btn-outline" id="wpr-wb-change-icon"><?php esc_html_e( 'Change Icon', 'wpr-addons' ); ?></button>
				</div>
				<input type="hidden" id="wpr-wb-icon" value="eicon-cog">
				<span class="wpr-wb-setting-desc"><?php esc_html_e( 'It lets you set the widget icon. You can use any of the eicon or font-awesome icons, simply return the class name as a string.', 'wpr-addons' ); ?></span>
			</div>

			<div class="wpr-wb-setting-group">
				<label class="wpr-wb-setting-label"><?php esc_html_e( 'Widget Category', 'wpr-addons' ); ?></label>
				<select id="wpr-wb-category" class="wpr-wb-setting-input">
					<option value="basic"><?php esc_html_e( 'Basic', 'wpr-addons' ); ?></option>
					<option value="general"><?php esc_html_e( 'General', 'wpr-addons' ); ?></option>
					<option value="wpr-widgets" selected><?php esc_html_e( 'Royal Addons', 'wpr-addons' ); ?></option>
				</select>
				<span class="wpr-wb-setting-desc"><?php esc_html_e( 'Widget categories in Elementor are used to organize the widgets into groups.', 'wpr-addons' ); ?></span>
			</div>
		</div>

		<!-- Bottom Action Bar -->
		<div class="wpr-wb-panel-footer">
			<button type="button" class="wpr-wb-footer-btn wpr-wb-footer-btn-save" id="wpr-wb-btn-save" title="<?php esc_attr_e( 'Save Widget', 'wpr-addons' ); ?>">
				<i class="eicon-save"></i> <?php esc_html_e( 'SAVE', 'wpr-addons' ); ?>
			</button>
		</div>
		<button type="button" class="wpr-wb-collapsed-save-btn" id="wpr-wb-collapsed-save" title="<?php esc_attr_e( 'Save Widget', 'wpr-addons' ); ?>">
			<i class="eicon-save"></i>
		</button>
	</div>

	<!-- CENTER PANEL: Controls Builder -->
	<div class="wpr-wb-panel wpr-wb-panel-center">
		<!-- Tabs -->
		<div class="wpr-wb-center-tabs">
			<button type="button" class="wpr-wb-center-tab active" data-tab="content">
				<i class="eicon-edit"></i>
				<span><?php esc_html_e( 'Content', 'wpr-addons' ); ?></span>
			</button>
			<button type="button" class="wpr-wb-center-tab" data-tab="style">
				<i class="eicon-paint-brush"></i>
				<span><?php esc_html_e( 'Style', 'wpr-addons' ); ?></span>
			</button>
			<button type="button" class="wpr-wb-center-tab" data-tab="advanced">
				<i class="eicon-cog"></i>
				<span><?php esc_html_e( 'Advanced', 'wpr-addons' ); ?></span>
			</button>
		</div>

		<!-- Tab Content Areas -->
		<div class="wpr-wb-center-body">
			<div class="wpr-wb-center-panel active" data-tab="content">
				<div class="wpr-wb-sections-list" data-tab="content"></div>
				<div class="wpr-wb-add-section-wrap">
					<button type="button" class="wpr-wb-add-section-btn" data-tab="content">
						<span class="wpr-wb-add-section-icon">+</span>
					</button>
					<span class="wpr-wb-add-section-label"><?php esc_html_e( 'Add Section', 'wpr-addons' ); ?></span>
				</div>
			</div>
			<div class="wpr-wb-center-panel" data-tab="style">
				<div class="wpr-wb-sections-list" data-tab="style"></div>
				<div class="wpr-wb-add-section-wrap">
					<button type="button" class="wpr-wb-add-section-btn" data-tab="style">
						<span class="wpr-wb-add-section-icon">+</span>
					</button>
					<span class="wpr-wb-add-section-label"><?php esc_html_e( 'Add Section', 'wpr-addons' ); ?></span>
				</div>
			</div>
			<div class="wpr-wb-center-panel" data-tab="advanced">
				<div class="wpr-wb-sections-list" data-tab="advanced"></div>
				<div class="wpr-wb-add-section-wrap">
					<button type="button" class="wpr-wb-add-section-btn" data-tab="advanced">
						<span class="wpr-wb-add-section-icon">+</span>
					</button>
					<span class="wpr-wb-add-section-label"><?php esc_html_e( 'Add Section', 'wpr-addons' ); ?></span>
				</div>
			</div>
		</div>
	</div>

	<!-- RIGHT PANEL: Code Editor -->
	<div class="wpr-wb-panel wpr-wb-panel-right">
		<!-- Code Tabs -->
		<div class="wpr-wb-code-tabs">
			<button type="button" class="wpr-wb-code-tab active" data-editor="html"><?php esc_html_e( 'HTML', 'wpr-addons' ); ?></button>
			<button type="button" class="wpr-wb-code-tab" data-editor="css"><?php esc_html_e( 'CSS', 'wpr-addons' ); ?></button>
			<button type="button" class="wpr-wb-code-tab" data-editor="js"><?php esc_html_e( 'JavaScript', 'wpr-addons' ); ?></button>
			<button type="button" class="wpr-wb-code-tab" data-editor="includes"><?php esc_html_e( 'CSS/JS Includes', 'wpr-addons' ); ?></button>
			<button type="button" class="wpr-wb-code-info-btn" id="wpr-wb-template-info-btn" title="<?php esc_attr_e( 'Template Tags Reference', 'wpr-addons' ); ?>"><i class="eicon-info-circle-o"></i></button>
		</div>

		<!-- Template Tags Info Popup -->
		<div id="wpr-wb-template-info-popup" class="wpr-wb-template-info-popup">
			<div class="wpr-wb-template-info-inner">
				<div class="wpr-wb-template-info-header">
					<span><?php esc_html_e( 'Template Tags Reference', 'wpr-addons' ); ?></span>
					<button type="button" class="wpr-wb-template-info-close"><i class="eicon-close"></i></button>
				</div>
				<div class="wpr-wb-template-info-body">
					<p><?php esc_html_e( 'Write your widget\'s HTML here. To show values from the controls you created on the left panel, use template tags.', 'wpr-addons' ); ?></p>
					<p><?php esc_html_e( 'Template tags look like {{key}} — when the widget renders, they get replaced with whatever the user enters in that control. The "key" is the control\'s unique name shown in the left panel (e.g. text_1, color_2).', 'wpr-addons' ); ?></p>
					<p><?php echo wp_kses( __( 'Example: if you have a Text control with key "title_1", writing <code>&lt;h2&gt;{{title_1}}&lt;/h2&gt;</code> here will display whatever text the user types into that field.', 'wpr-addons' ), [ 'code' => [] ] ); ?></p>
					<h4><?php esc_html_e( 'Output Values', 'wpr-addons' ); ?></h4>
					<table>
						<tr><td><code>{{key}}</code></td><td><?php esc_html_e( 'Text, Number, Textarea, Select, Choose, Color, Switcher, Hidden, Font, Date/Time', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{key.url}}</code></td><td><?php esc_html_e( 'Media — outputs the image/file URL', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{key.size}}</code></td><td><?php esc_html_e( 'Slider — outputs the numeric value', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{icon(key)}}</code></td><td><?php esc_html_e( 'Icons — renders the selected icon SVG/font', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{key}}</code></td><td><?php esc_html_e( 'Code — displays escaped code in &lt;pre&gt;&lt;code&gt; block', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{key}}</code></td><td><?php esc_html_e( 'URL — outputs the link URL', 'wpr-addons' ); ?></td></tr>
					</table>

					<h4><?php esc_html_e( 'Conditionals', 'wpr-addons' ); ?></h4>
					<table>
						<tr><td><code>{{#if key}}</code></td><td><?php esc_html_e( 'Show block if value is not empty (great for Switcher)', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{#if key == val}}</code></td><td><?php esc_html_e( 'Show block if value equals "val" (great for Select/Choose)', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{#if key != val}}</code></td><td><?php esc_html_e( 'Show block if value does NOT equal "val"', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{else}}</code></td><td><?php esc_html_e( 'Optional else branch', 'wpr-addons' ); ?></td></tr>
						<tr><td><code>{{/if}}</code></td><td><?php esc_html_e( 'End conditional block', 'wpr-addons' ); ?></td></tr>
					</table>

					<h4><?php esc_html_e( 'Examples', 'wpr-addons' ); ?></h4>
					<pre><code>&lt;h2&gt;{{title_1}}&lt;/h2&gt;
&lt;img src="{{media_1.url}}"&gt;
{{icon(icons_1)}}

{{#if switcher_1}}
  &lt;span class="badge"&gt;New&lt;/span&gt;
{{/if}}

{{#if select_1 == grid}}
  &lt;div class="grid"&gt;...&lt;/div&gt;
{{else}}
  &lt;div class="list"&gt;...&lt;/div&gt;
{{/if}}</code></pre>

					<h4><?php esc_html_e( 'Notes', 'wpr-addons' ); ?></h4>
					<ul>
						<li><?php esc_html_e( 'CSS Styles use {{VALUE}}, {{SIZE}}{{UNIT}}, {{TOP}}, etc. — these are Elementor placeholders, not template tags.', 'wpr-addons' ); ?></li>
						<li><?php esc_html_e( 'Switcher returns "yes" when ON and "" (empty) when OFF.', 'wpr-addons' ); ?></li>
						<li><?php esc_html_e( 'Group controls (Typography, Background, Border) only use CSS Styles — no template tags needed.', 'wpr-addons' ); ?></li>
					</ul>
				</div>
			</div>
		</div>

		<!-- Editor Areas -->
		<div class="wpr-wb-code-body">
			<div class="wpr-wb-code-panel active" data-editor="html">
				<div id="wpr-wb-editor-html" class="wpr-wb-monaco-editor"></div>
			</div>
			<div class="wpr-wb-code-panel" data-editor="css">
				<div id="wpr-wb-editor-css" class="wpr-wb-monaco-editor"></div>
			</div>
			<div class="wpr-wb-code-panel" data-editor="js">
				<div id="wpr-wb-editor-js" class="wpr-wb-monaco-editor"></div>
			</div>
			<div class="wpr-wb-code-panel" data-editor="includes">
				<div class="wpr-wb-includes-panel">
					<div class="wpr-wb-includes-group">
						<label class="wpr-wb-includes-label"><?php esc_html_e( 'External CSS URLs (one per line)', 'wpr-addons' ); ?></label>
						<textarea id="wpr-wb-css-includes" class="wpr-wb-includes-textarea" rows="5" placeholder="https://example.com/style.css"></textarea>
					</div>
					<div class="wpr-wb-includes-group">
						<label class="wpr-wb-includes-label"><?php esc_html_e( 'External JS URLs (one per line)', 'wpr-addons' ); ?></label>
						<textarea id="wpr-wb-js-includes" class="wpr-wb-includes-textarea" rows="5" placeholder="https://example.com/script.js"></textarea>
					</div>
				</div>
			</div>
		</div>
	</div>

</div>

<!-- Status Toast -->
<div id="wpr-wb-toast" class="wpr-wb-toast"></div>

<!-- Control Type Picker Modal -->
<div id="wpr-wb-control-modal" class="wpr-wb-modal-overlay">
	<div class="wpr-wb-modal wpr-wb-modal-lg">
		<div class="wpr-wb-modal-header">
			<span class="wpr-wb-modal-title"><?php esc_html_e( 'Add Control', 'wpr-addons' ); ?></span>
			<button type="button" class="wpr-wb-modal-close" id="wpr-wb-control-modal-close">&times;</button>
		</div>
		<div class="wpr-wb-modal-search">
			<input type="text" id="wpr-wb-control-search" class="wpr-wb-setting-input" placeholder="<?php esc_attr_e( 'Search control types...', 'wpr-addons' ); ?>">
		</div>
		<div class="wpr-wb-control-type-grid" id="wpr-wb-control-type-grid">
			<!-- Populated via JS -->
		</div>
	</div>
</div>

<!-- Icon Picker Modal -->
<div id="wpr-wb-icon-modal" class="wpr-wb-modal-overlay">
	<div class="wpr-wb-modal">
		<div class="wpr-wb-modal-header">
			<span class="wpr-wb-modal-title"><?php esc_html_e( 'Choose Icon', 'wpr-addons' ); ?></span>
			<button type="button" class="wpr-wb-modal-close" id="wpr-wb-icon-modal-close">&times;</button>
		</div>
		<div class="wpr-wb-modal-search">
			<input type="text" id="wpr-wb-icon-search" class="wpr-wb-setting-input" placeholder="<?php esc_attr_e( 'Search icons...', 'wpr-addons' ); ?>">
		</div>
		<div class="wpr-wb-icon-grid" id="wpr-wb-icon-grid">
			<!-- Icons populated via JS -->
		</div>
	</div>
</div>