// =================================================================================================
// == Pack: Static Text (WP-template-less; schema-driven)
// == File: /includes/page-form-builder/field-packs/static-text/_out/static-text.js
// == Depends: WPBC_BFB_Field_Base, Field_Renderer_Registry, Core.Sanitize, Exporter API
// == Version: 1.0.1 (09.11.2025) — add base CSS class "wpbc_static_text" to preview & export
// =================================================================================================
(function (w, d) {
'use strict';
var Core = w.WPBC_BFB_Core || {};
var registry = Core.WPBC_BFB_Field_Renderer_Registry;
var Base = Core.WPBC_BFB_Field_Base;
if ( ! registry || typeof registry.register !== 'function' || ! Base ) {
_wpbc?.dev?.error?.( 'wpbc_bfb_field_static_text', 'Core registry/base missing' );
return;
}
/**
* Field Renderer: static_text
* - Renders a single text element with configurable tag, align, bold, italic.
* - Supports pass-through HTML (preview only) if html_allowed=1; otherwise escapes + optional nl2br.
*
* @class wpbc_bfb_field_static_text
* @extends Core.WPBC_BFB_Field_Base
*/
class wpbc_bfb_field_static_text extends Base {
/**
* Defaults (must mirror PHP schema).
* @returns {{type:string,text:string,tag:string,align:string,bold:number,italic:number,html_allowed:number,nl2br:number,cssclass_extra:string,name:string,html_id:string,help:string,usage_key:string}}
*/
static get_defaults() {
return {
type : 'static_text',
text : 'Add your message here…',
tag : 'p',
align : 'left',
bold : 0,
italic : 0,
html_allowed : 0,
nl2br : 1,
cssclass_extra : '',
name : '',
html_id : '',
help : '',
usage_key : 'static_text'
};
}
/**
* Whitelist tag.
* @param {string} v
* @returns {string}
*/
static allow_tag( v ) {
var t = String( v || 'p' ).toLowerCase();
var ok = { p:1,label:1,span:1,small:1,div:1,h1:1,h2:1,h3:1,h4:1,h5:1,h6:1 };
return ok[t] ? t : 'p';
}
/**
* Whitelist align.
* @param {string} v
* @returns {string}
*/
static allow_align( v ) {
var a = String( v || 'left' ).toLowerCase();
var ok = { left:1, center:1, right:1 };
return ok[a] ? a : 'left';
}
/**
* Escape + optional nl2br for preview/export when HTML is not allowed.
* @param {string} raw
* @param {boolean} do_nl2br
* @returns {string}
*/
static escape_text( raw, do_nl2br ) {
var esc = Core.WPBC_BFB_Sanitize.escape_html( String( raw || '' ) );
if ( do_nl2br && ! /
/i.test( esc ) ) {
esc = esc.replace(/\n/g, '
');
}
return esc;
}
/**
* Main render entry (called by Builder).
* Adds the base class "wpbc_static_text" to the text element for styling parity with export.
*
* @param {HTMLElement} el
* @param {Object} data
* @param {{builder?:any}} ctx
* @returns {void}
*/
static render( el, data, ctx ) {
if ( ! el ) { return; }
var sanit = Core.WPBC_BFB_Sanitize || {};
var esc_html = sanit.escape_html || (v => String(v).replace(/[<>&"]/g, ''));
var sanitize_id = sanit.sanitize_html_id || (v => String(v).trim());
var sanitize_name = sanit.sanitize_html_name || (v => String(v).trim());
var sanitize_cls = sanit.sanitize_css_classlist || (v => String(v).trim());
var d_norm = Object.assign( {}, this.get_defaults(), data || {} );
var tag = this.allow_tag( d_norm.tag );
var align = this.allow_align( d_norm.align );
var html_id = d_norm.html_id ? sanitize_id( String( d_norm.html_id ) ) : '';
var name_val = d_norm.name ? sanitize_name( String( d_norm.name ) ) : '';
var cls_extra_raw = String( d_norm.cssclass_extra || '' );
var cls_extra = sanitize_cls( cls_extra_raw );
// Persist sanitized dataset (helps Inspector & snapshots)
if ( el.dataset.html_id !== html_id ) { el.dataset.html_id = html_id; }
if ( el.dataset.name !== name_val ) { el.dataset.name = name_val; }
if ( el.dataset.cssclass_extra !== cls_extra ) { el.dataset.cssclass_extra = cls_extra; }
if ( el.dataset.tag !== tag ) { el.dataset.tag = tag; }
if ( el.dataset.align !== align ) { el.dataset.align = align; }
var id_attr = html_id ? ' id="' + esc_html( html_id ) + '"' : '';
var name_attr = name_val ? ' name="' + esc_html( name_val ) + '"' : '';
// --- NEW: base class on the TEXT element ---
var base_cls = 'wpbc_static_text';
var tag_cls_full = base_cls + ( cls_extra ? ( ' ' + cls_extra ) : '' );
var cls_attr = ' class="' + esc_html( tag_cls_full ) + '"';
var style_bits = [];
if ( align ) { style_bits.push( 'text-align:' + align ); }
if ( d_norm.bold ) { style_bits.push( 'font-weight:bold' ); }
if ( d_norm.italic ) { style_bits.push( 'font-style:italic' ); }
var style_attr = style_bits.length ? ( ' style="' + style_bits.join(';') + '"' ) : '';
// Content
var content = '';
if ( d_norm.html_allowed ) {
content = String( d_norm.text || '' );
} else {
content = this.escape_text( d_norm.text, !! d_norm.nl2br );
}
var help_html = d_norm.help ? '