| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284 |
- <?php
- /**
- * @class VamtamNumbersModule
- */
- class VamtamNumbersModule extends FLBuilderModule {
- /**
- * @method __construct
- */
- public function __construct() {
- $path = trailingslashit( 'modules/' . basename( dirname( __FILE__ ) ) );
- parent::__construct(array(
- 'name' => __( 'Number Counter', 'vamtam-elements-b' ),
- 'description' => __( 'Renders an animated number counter.', 'vamtam-elements-b' ),
- 'category' => __( 'VamTam Modules', 'vamtam-elements-b' ),
- 'dir' => VAMTAMEL_B_DIR . $path,
- 'url' => VAMTAMEL_B_URL . $path,
- ));
- }
- public function enqueue_scripts() {
- $this->add_js( 'intersection-observer' );
- }
- public function render_number() {
- $number = $this->settings->number ? $this->settings->number : 0;
- $layout = $this->settings->layout ? $this->settings->layout : 'default';
- $type = $this->settings->number_type ? $this->settings->number_type : 'percent';
- $prefix = $type == 'percent' ? '' : $this->settings->number_prefix;
- $suffix = $type == 'percent' ? '%' : $this->settings->number_suffix;
- $noJs = '<noscript>' . number_format( $number ) . '</noscript>';
- $color = ! empty( $this->settings->number_color ) ? 'color:' . vamtam_el_sanitize_accent( $this->settings->number_color ) : '';
- echo '<div class="fl-number-string" style="' . esc_attr( $color ) . '">' . $prefix . '<span class="fl-number-int">' . $noJs . '</span>' . $suffix . '</div>'; // xss ok
- }
- public function render_circle_bar() {
- $width = ! empty( $this->settings->circle_width ) ? esc_attr( $this->settings->circle_width ) : 100;
- $pos = ( $width / 2 );
- $radius = $pos - 10;
- $dash = number_format( ( ( M_PI * 2 ) * $radius ), 2, '.', '' );
- $bg_stroke = isset( $this->settings->circle_bg_color ) ? vamtam_el_sanitize_accent( $this->settings->circle_bg_color ) : '';
- $num_stroke = isset( $this->settings->circle_color ) ? vamtam_el_sanitize_accent( $this->settings->circle_color ) : '';
- $html = '<div class="svg-container">';
- $html .= '<svg class="svg" viewBox="0 0 ' . $width . ' ' . $width . '" version="1.1" preserveAspectRatio="xMinYMin meet">
- <circle class="fl-bar-bg" r="' . $radius . '" cx="' . $pos . '" cy="' . $pos . '" fill="transparent" stroke-dasharray="' . $dash . '" stroke-dashoffset="0" stroke="' . esc_attr( $bg_stroke ) . '"></circle>
- <circle class="fl-bar" r="' . $radius . '" cx="' . $pos . '" cy="' . $pos . '" fill="transparent" stroke-dasharray="' . $dash . '" stroke-dashoffset="' . $dash . '" transform="rotate(-90 ' . $pos . ' ' . $pos . ')" stroke="' . esc_attr( $num_stroke ) . '"></circle>
- </svg>';
- $html .= '</div>';
- echo $html; // xss ok
- }
- }
- /**
- * Register the module and its form settings.
- */
- FLBuilder::register_module('VamtamNumbersModule', array(
- 'general' => array( // Tab
- 'title' => __( 'General', 'vamtam-elements-b' ), // Tab title
- 'sections' => array( // Tab Sections
- 'general' => array( // Section
- 'title' => '', // Section Title
- 'fields' => array( // Section Fields
- 'layout' => array(
- 'type' => 'select',
- 'label' => __( 'Layout', 'vamtam-elements-b' ),
- 'default' => 'default',
- 'options' => array(
- 'default' => __( 'Only Numbers', 'vamtam-elements-b' ),
- 'circle' => __( 'Circle Counter', 'vamtam-elements-b' ),
- 'bars' => __( 'Bars Counter', 'vamtam-elements-b' ),
- ),
- 'toggle' => array(
- 'default' => array(
- 'fields' => array( 'text_align' ),
- ),
- 'circle' => array(
- 'sections' => array( 'circle_bar_style' ),
- ),
- 'bars' => array(
- 'sections' => array( 'bar_style' ),
- 'fields' => array( 'number_position' ),
- ),
- ),
- ),
- 'number_type' => array(
- 'type' => 'select',
- 'label' => __( 'Number Type', 'vamtam-elements-b' ),
- 'default' => 'percent',
- 'options' => array(
- 'percent' => __( 'Percent', 'vamtam-elements-b' ),
- 'standard' => __( 'Standard', 'vamtam-elements-b' ),
- ),
- 'toggle' => array(
- 'standard' => array(
- 'fields' => array( 'number_prefix', 'number_suffix' ),
- ),
- ),
- ),
- 'number' => array(
- 'type' => 'text',
- 'label' => __( 'Number', 'vamtam-elements-b' ),
- 'size' => '5',
- 'default' => '100',
- 'placeholder' => '100',
- ),
- 'max_number' => array(
- 'type' => 'text',
- 'label' => __( 'Total', 'vamtam-elements-b' ),
- 'size' => '5',
- 'help' => __( 'The total number of units for this counter. For example, if the Number is set to 250 and the Total is set to 500, the counter will animate to 50%.', 'vamtam-elements-b' ),
- ),
- 'number_position' => array(
- 'type' => 'select',
- 'label' => __( 'Number Position', 'vamtam-elements-b' ),
- 'size' => '5',
- 'help' => __( 'Where to display the number in relation to the bar.', 'vamtam-elements-b' ),
- 'options' => array(
- 'default' => __( 'Inside Bar', 'vamtam-elements-b' ),
- 'above' => __( 'Above Bar', 'vamtam-elements-b' ),
- 'below' => __( 'Below Bar', 'vamtam-elements-b' ),
- ),
- ),
- 'before_number_text' => array(
- 'type' => 'text',
- 'label' => __( 'Text Before Number', 'vamtam-elements-b' ),
- 'size' => '20',
- 'help' => __( 'Text to appear above the number. Leave it empty for none.', 'vamtam-elements-b' ),
- ),
- 'after_number_text' => array(
- 'type' => 'text',
- 'label' => __( 'Text After Number', 'vamtam-elements-b' ),
- 'size' => '20',
- 'help' => __( 'Text to appear after the number. Leave it empty for none.', 'vamtam-elements-b' ),
- ),
- 'number_prefix' => array(
- 'type' => 'text',
- 'label' => __( 'Number Prefix', 'vamtam-elements-b' ),
- 'size' => '10',
- 'help' => __( 'For example, if your number is US$ 10, your prefix would be "US$ ".', 'vamtam-elements-b' ),
- ),
- 'number_suffix' => array(
- 'type' => 'text',
- 'label' => __( 'Number Suffix', 'vamtam-elements-b' ),
- 'size' => '10',
- 'help' => __( 'For example, if your number is 10%, your suffix would be "%".', 'vamtam-elements-b' ),
- ),
- 'animation_speed' => array(
- 'type' => 'text',
- 'label' => __( 'Animation Speed', 'vamtam-elements-b' ),
- 'size' => '5',
- 'default' => '1',
- 'placeholder' => '1',
- 'description' => __( 'second(s)', 'vamtam-elements-b' ),
- 'help' => __( 'Number of seconds to complete the animation.', 'vamtam-elements-b' ),
- ),
- ),
- ),
- ),
- ),
- 'style' => array( // Tab
- 'title' => __( 'Style', 'vamtam-elements-b' ), // Tab title
- 'sections' => array( // Tab Sections
- 'text_style' => array(
- 'title' => __( 'Colors', 'vamtam-elements-b' ),
- 'fields' => array(
- 'text_color' => array(
- 'type' => 'vamtam-color',
- 'label' => __( 'Text Color', 'vamtam-elements-b' ),
- ),
- 'number_color' => array(
- 'type' => 'vamtam-color',
- 'label' => __( 'Number Color', 'vamtam-elements-b' ),
- ),
- 'number_size' => array(
- 'type' => 'text',
- 'label' => __( 'Number Size', 'vamtam-elements-b' ),
- 'default' => '32',
- 'maxlength' => '3',
- 'size' => '4',
- 'description' => 'px',
- 'preview' => array(
- 'type' => 'css',
- 'selector' => '.fl-number-string',
- 'property' => 'font-size',
- 'unit' => 'px',
- ),
- ),
- 'text_align' => array(
- 'type' => 'select',
- 'label' => __( 'Alignment', 'vamtam-elements-b' ),
- 'default' => 'center',
- 'options' => array(
- 'left' => __( 'Left', 'vamtam-elements-b' ),
- 'center' => __( 'Center', 'vamtam-elements-b' ),
- 'right' => __( 'Right', 'vamtam-elements-b' ),
- ),
- 'preview' => array(
- 'type' => 'css',
- 'selector' => '.fl-number-text',
- 'property' => 'text-align',
- ),
- ),
- ),
- ),
- 'circle_bar_style' => array(
- 'title' => __( 'Circle Bar Styles', 'vamtam-elements-b' ),
- 'fields' => array(
- 'circle_width' => array(
- 'type' => 'text',
- 'label' => __( 'Circle Size', 'vamtam-elements-b' ),
- 'default' => '200',
- 'maxlength' => '4',
- 'size' => '4',
- 'description' => 'px',
- 'preview' => array(
- 'type' => 'css',
- 'rules' => array(
- array(
- 'selector' => '.fl-number-circle-container',
- 'property' => 'max-width',
- 'unit' => 'px',
- ),
- array(
- 'selector' => '.fl-number-circle-container',
- 'property' => 'max-height',
- 'unit' => 'px',
- ),
- ),
- ),
- ),
- 'circle_dash_width' => array(
- 'type' => 'text',
- 'label' => __( 'Circle Stroke Size', 'vamtam-elements-b' ),
- 'default' => '10',
- 'maxlength' => '2',
- 'size' => '4',
- 'description' => 'px',
- 'preview' => array(
- 'type' => 'css',
- 'selector' => '.svg circle',
- 'property' => 'stroke-width',
- 'unit' => 'px',
- ),
- ),
- 'circle_color' => array(
- 'type' => 'vamtam-color',
- 'label' => __( 'Circle Foreground Color', 'vamtam-elements-b' ),
- 'default' => 'accent1',
- ),
- 'circle_bg_color' => array(
- 'type' => 'vamtam-color',
- 'label' => __( 'Circle Background Color', 'vamtam-elements-b' ),
- 'default' => 'accent7',
- ),
- ),
- ),
- 'bar_style' => array(
- 'title' => __( 'Bar Styles', 'vamtam-elements-b' ),
- 'fields' => array(
- 'bar_color' => array(
- 'type' => 'vamtam-color',
- 'label' => __( 'Bar Foreground Color', 'vamtam-elements-b' ),
- 'default' => 'accent1',
- ),
- 'bar_bg_color' => array(
- 'type' => 'vamtam-color',
- 'label' => __( 'Bar Background Color', 'vamtam-elements-b' ),
- 'default' => 'accent7',
- ),
- ),
- ),
- ),
- ),
- ));
|