/*
Widget Name: Button
Description: Create a custom button with flexible styling, icon support, and click tracking functionality.
Author: SiteOrigin
Author URI: https://siteorigin.com
Documentation: https://siteorigin.com/widgets-bundle/button-widget-documentation/
Keywords: event, icon, link
*/
class SiteOrigin_Widget_Button_Widget extends SiteOrigin_Widget {
public function __construct() {
parent::__construct(
'sow-button',
__( 'SiteOrigin Button', 'so-widgets-bundle' ),
array(
'description' => __( 'Create a custom button with flexible styling, icon support, and click tracking functionality.', 'so-widgets-bundle' ),
'help' => 'https://siteorigin.com/widgets-bundle/button-widget-documentation/',
),
array(
),
false,
plugin_dir_path( __FILE__ )
);
}
public function get_settings_form() {
return array(
'responsive_breakpoint' => array(
'type' => 'measurement',
'label' => __( 'Responsive Breakpoint', 'so-widgets-bundle' ),
'default' => '780px',
'description' => __( 'This setting controls when the Mobile Align setting will be used. The default value is 780px.', 'so-widgets-bundle' ),
),
);
}
public function initialize() {
$this->register_frontend_styles(
array(
array(
'sow-button-base',
plugin_dir_url( __FILE__ ) . 'css/style.css',
array(),
SOW_BUNDLE_VERSION,
),
)
);
}
public function get_widget_form() {
return array(
'text' => array(
'type' => 'text',
'label' => __( 'Button Text', 'so-widgets-bundle' ),
),
'url' => array(
'type' => 'link',
'label' => __( 'Destination URL', 'so-widgets-bundle' ),
'allow_shortcode' => true,
),
'new_window' => array(
'type' => 'checkbox',
'default' => false,
'label' => __( 'Open in a new window', 'so-widgets-bundle' ),
),
'download' => array(
'type' => 'checkbox',
'default' => false,
'label' => __( 'Download', 'so-widgets-bundle' ),
'description' => __( 'The Destination URL will be downloaded when a user clicks on the button.', 'so-widgets-bundle' ),
),
'button_icon' => array(
'type' => 'section',
'label' => __( 'Icon', 'so-widgets-bundle' ),
'fields' => array(
'icon_selected' => array(
'type' => 'icon',
'label' => __( 'Icon', 'so-widgets-bundle' ),
),
'icon_color' => array(
'type' => 'color',
'label' => __( 'Icon Color', 'so-widgets-bundle' ),
),
'icon' => array(
'type' => 'media',
'label' => __( 'Image Icon', 'so-widgets-bundle' ),
'description' => __( 'Replaces the icon with your own image icon.', 'so-widgets-bundle' ),
),
'icon_placement' => array(
'type' => 'select',
'label' => __( 'Icon Placement', 'so-widgets-bundle' ),
'default' => 'left',
'options' => array(
'top' => __( 'Top', 'so-widgets-bundle' ),
'right' => __( 'Right', 'so-widgets-bundle' ),
'bottom' => __( 'Bottom', 'so-widgets-bundle' ),
'left' => __( 'Left', 'so-widgets-bundle' ),
),
),
),
),
'design' => array(
'type' => 'section',
'label' => __( 'Design and Layout', 'so-widgets-bundle' ),
'hide' => true,
'fields' => array(
'width' => array(
'type' => 'measurement',
'label' => __( 'Width', 'so-widgets-bundle' ),
'description' => __( 'Leave blank to let the button resize according to content.', 'so-widgets-bundle' ),
),
'align' => array(
'type' => 'select',
'label' => __( 'Align', 'so-widgets-bundle' ),
'default' => 'center',
'options' => array(
'left' => __( 'Left', 'so-widgets-bundle' ),
'right' => __( 'Right', 'so-widgets-bundle' ),
'center' => __( 'Center', 'so-widgets-bundle' ),
'justify' => __( 'Full Width', 'so-widgets-bundle' ),
),
),
'mobile_align' => array(
'type' => 'select',
'label' => __( 'Mobile Align', 'so-widgets-bundle' ),
'default' => 'center',
'options' => array(
'left' => __( 'Left', 'so-widgets-bundle' ),
'right' => __( 'Right', 'so-widgets-bundle' ),
'center' => __( 'Center', 'so-widgets-bundle' ),
'justify' => __( 'Full Width', 'so-widgets-bundle' ),
),
),
'theme' => array(
'type' => 'select',
'label' => __( 'Button Theme', 'so-widgets-bundle' ),
'default' => 'flat',
'options' => array(
'atom' => __( 'Atom', 'so-widgets-bundle' ),
'flat' => __( 'Flat', 'so-widgets-bundle' ),
'wire' => __( 'Wire', 'so-widgets-bundle' ),
),
),
'button_color' => array(
'type' => 'color',
'label' => __( 'Button Color', 'so-widgets-bundle' ),
),
'text_color' => array(
'type' => 'color',
'label' => __( 'Text Color', 'so-widgets-bundle' ),
),
'hover' => array(
'type' => 'checkbox',
'default' => true,
'label' => __( 'Use hover effects', 'so-widgets-bundle' ),
'state_emitter' => array(
'callback' => 'conditional',
'args' => array(
'hover[show]: val',
'hover[hide]: ! val',
),
),
),
'hover_background_color' => array(
'type' => 'color',
'label' => __( 'Hover Background Color', 'so-widgets-bundle' ),
'state_handler' => array(
'hover[show]' => array( 'show' ),
'hover[hide]' => array( 'hide' ),
),
),
'hover_text_color' => array(
'type' => 'color',
'label' => __( 'Hover Text Color', 'so-widgets-bundle' ),
'state_handler' => array(
'hover[show]' => array( 'show' ),
'hover[hide]' => array( 'hide' ),
),
),
'font' => array(
'type' => 'font',
'label' => __( 'Font', 'so-widgets-bundle' ),
'default' => 'default',
),
'font_size' => array(
'type' => 'measurement',
'label' => __( 'Font Size', 'so-widgets-bundle' ),
'default' => '1em',
),
'icon_size' => array(
'type' => 'measurement',
'label' => __( 'Icon Size', 'so-widgets-bundle' ),
'default' => '1.3em',
),
'padding' => array(
'type' => 'measurement',
'label' => __( 'Padding', 'so-widgets-bundle' ),
'default' => '1em',
),
'rounding' => array(
'type' => 'multi-measurement',
'label' => __( 'Rounding', 'so-widgets-bundle' ),
'default' => '0.25em 0.25em 0.25em 0.25em',
'measurements' => array(
'top' => array(
'label' => __( 'Top', 'so-widgets-bundle' ),
),
'right' => array(
'label' => __( 'Right', 'so-widgets-bundle' ),
),
'bottom' => array(
'label' => __( 'Bottom', 'so-widgets-bundle' ),
),
'left' => array(
'label' => __( 'Left', 'so-widgets-bundle' ),
),
),
),
),
),
'attributes' => array(
'type' => 'section',
'label' => __( 'Other Attributes and SEO', 'so-widgets-bundle' ),
'hide' => true,
'fields' => array(
'id' => array(
'type' => 'text',
'label' => __( 'Button ID', 'so-widgets-bundle' ),
'description' => __( 'An ID attribute allows you to target this button in JavaScript.', 'so-widgets-bundle' ),
),
'classes' => array(
'type' => 'text',
'label' => __( 'Button Classes', 'so-widgets-bundle' ),
'description' => __( 'Additional CSS classes added to the button link.', 'so-widgets-bundle' ),
),
'title' => array(
'type' => 'text',
'label' => __( 'Title Attribute', 'so-widgets-bundle' ),
'description' => __( 'Adds a title attribute to the button link.', 'so-widgets-bundle' ),
),
'on_click' => array(
'type' => 'text',
'label' => __( 'Onclick', 'so-widgets-bundle' ),
'description' => __( 'Run this JavaScript when the button is clicked. Ideal for tracking.', 'so-widgets-bundle' ),
'onclick' => true,
),
'rel' => array(
'type' => 'text',
'label' => __( 'Rel Attribute', 'so-widgets-bundle' ),
'description' => __( 'Adds a rel attribute to the button link.', 'so-widgets-bundle' ),
),
),
),
);
}
public function get_style_name( $instance ) {
if ( empty( $instance['design']['theme'] ) ) {
return 'atom';
}
return $instance['design']['theme'];
}
/**
* Get the variables for the Button Widget.
*
* @return array
*/
public function get_template_variables( $instance, $args ) {
$button_attributes = array();
$attributes = $instance['attributes'];
$classes = ! empty( $attributes['classes'] ) ? $attributes['classes'] : '';
if ( ! empty( $classes ) ) {
$classes .= ' ';
}
$classes .= 'sowb-button ow-icon-placement-' . $instance['button_icon']['icon_placement'];
if ( ! empty( $instance['design']['hover'] ) ) {
$classes .= ' ow-button-hover';
}
$button_attributes['class'] = implode(
' ',
array_map(
'sanitize_html_class',
explode( ' ', $classes )
)
);
if ( ! empty( $instance['new_window'] ) ) {
$button_attributes['target'] = '_blank';
$button_attributes['rel'] = 'noopener noreferrer';
}
if ( ! empty( $instance['download'] ) ) {
$button_attributes['download'] = null;
}
if ( ! empty( $attributes['id'] ) ) {
$button_attributes['id'] = $attributes['id'];
}
if ( ! empty( $attributes['title'] ) ) {
$button_attributes['title'] = $attributes['title'];
}
if ( ! empty( $attributes['rel'] ) ) {
if ( isset( $button_attributes['rel'] ) ) {
$button_attributes['rel'] .= " $attributes[rel]";
} else {
$button_attributes['rel'] = $attributes['rel'];
}
}
$icon_image_url = '';
if ( ! empty( $instance['button_icon']['icon'] ) ) {
$attachment = wp_get_attachment_image_src( $instance['button_icon']['icon'] );
if ( ! empty( $attachment ) ) {
$icon_image_url = $attachment[0];
}
}
return array(
'button_attributes' => apply_filters( 'siteorigin_widgets_button_attributes', $button_attributes, $instance ),
'href' => ! empty( $instance['url'] ) ? $instance['url'] : '',
'on_click' => ! empty( $attributes['on_click'] ) ? $attributes['on_click'] : '',
'align' => $instance['design']['align'],
'icon_image_url' => $icon_image_url,
'icon' => $instance['button_icon']['icon_selected'],
'icon_color' => $instance['button_icon']['icon_color'],
'text' => $instance['text'],
);
}
/**
* Get the variables that we'll be injecting into the less stylesheet.
*
* @return array
*/
public function get_less_variables( $instance ) {
if ( empty( $instance ) || empty( $instance['design'] ) ) {
return array();
}
$text_color = isset( $instance['design']['text_color'] ) ? $instance['design']['text_color'] : '';
$button_color = isset( $instance['design']['button_color'] ) ? $instance['design']['button_color'] : '';
$less_vars = array(
'button_width' => isset( $instance['design']['width'] ) ? $instance['design']['width'] : '',
'button_color' => $button_color,
'text_color' => $text_color,
'icon_size' => ! empty( $instance['design']['icon_size'] ) ? $instance['design']['icon_size'] : '1.3em',
'hover_text_color' => ! empty( $instance['design']['hover_text_color'] ) ? $instance['design']['hover_text_color'] : $text_color,
'hover_background_color' => ! empty( $instance['design']['hover_background_color'] ) ? $instance['design']['hover_background_color'] : $button_color,
'font_size' => isset( $instance['design']['font_size'] ) ? $instance['design']['font_size'] : '',
'rounding' => isset( $instance['design']['rounding'] ) ? $instance['design']['rounding'] : '',
'padding' => isset( $instance['design']['padding'] ) ? $instance['design']['padding'] : '',
'has_text' => empty( $instance['text'] ) ? 'false' : 'true',
'responsive_breakpoint' => $this->get_global_settings( 'responsive_breakpoint' ),
'align' => ! empty( $instance['design']['align'] ) ? $instance['design']['align'] : 'center',
'mobile_align' => ! empty( $instance['design']['mobile_align'] ) ? $instance['design']['mobile_align'] : 'center',
'has_button_icon' => empty( $instance['button_icon']['icon_selected'] ) ? 'false' : 'true',
);
if ( ! empty( $instance['design']['font'] ) ) {
$font = siteorigin_widget_get_font( $instance['design']['font'] );
$less_vars['button_font'] = $font['family'];
if ( ! empty( $font['weight'] ) ) {
$less_vars['button_font_weight'] = $font['weight_raw'];
$less_vars['button_font_style'] = $font['style'];
}
}
return $less_vars;
}
/**
* Make sure the instance is the most up to date version.
*
* @return mixed
*/
public function modify_instance( $instance ) {
if ( empty( $instance ) ) {
return array();
}
$migrate_props = array(
'button_icon' => array(
'icon_selected',
'icon_color',
'icon',
),
'design' => array(
'align',
'theme',
'button_color',
'text_color',
'hover',
'hover_text_color',
'hover_background_color',
'font_size',
'rounding',
'padding',
),
'attributes' => array(
'id',
),
);
foreach ( $migrate_props as $prop => $sub_props ) {
if ( empty( $instance[ $prop ] ) ) {
$instance[ $prop ] = array();
foreach ( $sub_props as $sub_prop ) {
if ( isset( $instance[ $sub_prop ] ) ) {
$instance[ $prop ][ $sub_prop ] = $instance[ $sub_prop ];
unset( $instance[ $sub_prop ] );
}
}
}
}
// Migrate onclick setting to prevent Wordfence flag.
if (
! empty( $instance['attributes'] ) &&
! empty( $instance['attributes']['onclick'] )
) {
$instance['attributes']['on_click'] = $instance['attributes']['onclick'];
}
// If the mobile_align setting isn't set, set it to the same value as the align value.
if (
! empty( $instance['design'] ) &&
! empty( $instance['design']['align'] ) &&
empty( $instance['design']['mobile_align'] )
) {
$instance['design']['mobile_align'] = $instance['design']['align'];
}
// Migrate predefined settings to more customizable settings.
if ( ! empty( $instance['design']['font_size'] ) && is_numeric( $instance['design']['font_size'] ) ) {
$instance['design']['font_size'] .= 'em';
}
if ( ! empty( $instance['design']['padding'] ) && is_numeric( $instance['design']['padding'] ) ) {
$instance['design']['padding'] .= 'em';
}
if ( ! empty( $instance['design']['rounding'] ) && is_numeric( $instance['design']['rounding'] ) ) {
$instance['design']['rounding'] = $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em ' . $instance['design']['rounding'] . 'em';
}
if ( empty( $instance['design']['icon_size'] ) ) {
$instance['design']['icon_size'] = '1.3em';
}
return $instance;
}
public function get_form_teaser() {
if ( class_exists( 'SiteOrigin_Premium' ) ) {
return false;
}
return array(
sprintf(
__( 'Add a beautiful tooltip to the Button Widget with %sSiteOrigin Premium%s', 'so-widgets-bundle' ),
'',
' '
),
);
}
}
siteorigin_widget_register( 'sow-button', __FILE__, 'SiteOrigin_Widget_Button_Widget' );
Uncategorized – Page 4022 – Alumni
Archive by category "Uncategorized" (Page 4022)
Content Angeschlossen Casino Auszahlungen direkt bekommen – auf diese weise geht’s Spielauswahl in Online Casinos bedingungslos Vorteile, Nachteile ferner Alternativen irgendeiner Zahlungsmethode Gebührenstruktur ferner an irgendeinem ort Sie überall qua Bitcoins saldieren können Das Absoluter betrag steht Jedem sofortig zum Aufführen zur Verfügung Nachfolgende Transaktionen ereignen schlichtweg via die jeweilige…
Continue reading
記事 新しい盲目の音楽家 ゲームナイトバンドル! 開発手順 よくある質問:カラオケグループ情報 「新しい歌詞を必ず覚えておいてください」 100ドルで約8名様までご利用いただけます(最大16名様まで – 両レーンをご予約の場合)。 カラオケに詳しい人は、オンラインゲームと自由に歌えることの最適なバランスを見つけ出します。チームゲーム用に、自分の好きな曲から選んでオリジナルのカラオケを作りましょう。新しい友達を作りたい、競争したい、楽しい時間を過ごしたいなど、どんな目的であれ、この15種類のオンラインゲームはカラオケナイトを盛り上げてくれます。 新しい盲目の音楽家 2000年代のカラオケ製品は、カラオケ曲の選択肢を減らすためにハードディスクドライブの使用をやめ、タッチスクリーン式のデバイスでユーザーが音を選択できるようになったことで、再生方法に変化が見られました。長年にわたり普及しているカラオケ製品の1つが、最新のDVDおよびHDDカラオケソリューションです。これは、カラオケサーバーのレンタルやKTVバーなどの一般的な運営に膨大な数の曲が付属しており、中国、特にフィリピンで人気を博しました。CD+Gの専門家は、サブコードと呼ばれる新しい曲で遊んでおり、他のほとんどのプラットフォームがネイティブでオーディオとビデオの両方を表示するときに、モニターに表示される新しい歌詞と画像をエンコードできます。 ゲームナイトバンドル! これは最新のカラオケトレンドゲームセットアップとあなたのコレクションにリリースされたもので、番組が終了したため、新しい番組用のカラオケトレンドオンラインゲームのインストールはこれ以上ありません。新しいPlayStation jp.mrbetgames.com このサイトをめくってみる 3とXbox 360コンソールブランドは、オンラインソングを実際に表示した唯一のものでしたが、5月14日になると、新しいダウンロード可能なサウンドは両方のバージョンに表示されなくなりました。新しいXbox 360版は2004年11月に発売され、カラオケウェーブボリューム2に含まれる5曲と、新しい低セキュリティバージョンである10のプライベートモータウンサウンドを提供しました。新しいゲームの日本語版には、アニメトラックコレクションとJ-POP音楽以外のボリュームに加えて、多くの拡張ディスクが提供されています。 新たな予測不可能性は、楽しい問題を生み出し、面白い活動につながるだろう。 彼らの歌声を最高のヒット曲に変え、デュエットの楽しい部分を加えて最も楽しいものにし、あなたも参加できます。 これは、カラオケを楽しむカップルの大グループにとって、本当に素晴らしい、面白い選曲です。 私たちは皆、素晴らしいカラオケ体験をしたことがあるのですが、面白いゲームや魅力的なアクティビティが全くなく、イライラしてしまいました。 だから、カラオケゲームは、家族みんなで楽しむイベントには最適です。 開発手順 カラオケナイトを特別なものにする方法をお探しですか?カラオケナイトを開催するのは楽しいだけでなく、グループで感謝しているときに、友人のデイブが「ダンスキング」を台無しにするのを見る機会でもあります。素晴らしいカラオケホストと、ポップミュージックの次の大きなトレンドだと信じている少数の家族グループよりも良いものは何でしょうか?「90年代の偉大なR&B女性アーティストの曲を見つける」や「ビギー対パック」などのトラックカテゴリがあり、新しいカードを使用してトラックの詳細を提供したり、ライバルとゲームを楽しみ、知識豊富なトラックの選択を構築することができます。カルチャーカラオケは、今後のゲームナイトやカラオケナイトをより高いレベルに引き上げます。新しいアメイズソングゲームは、夜を盛り上げるのに役立つランダムな曲で新しいカラオケの楽しさを向上させます。 よくある質問:カラオケグループ情報 各アフィリエイトまたはアスリートは、キャップから選んだ単語を含む曲の名前を1つ引きます。このゲームは、チーム、デュオ、または2対1でプレイされます。このゲームは、チーム、デュオ、または2対1でプレイされます。チームとしてゲームをプレイする方法はいくつかあります。このゲームの目的は、最初に自分の曲の新しい名前を正しく推測することです。 「新しい歌詞を必ず覚えておいてください」 歴史は、若者やビジネスマンが夜の飲酒活動の直後に行うことを妨げ、カラオケは家族向けアクティビティとしてよく知られており、信じられないかもしれませんが、いくつかの店は閉鎖されています。また、ビデオゲーム+Gとアプリベースのカラオケ、マイクベースのカラオケは、米国とフィリピンを含む多くのアジア諸国で広く人気があります。2003年には、いくつかの組織が携帯電話でカラオケサービスを提供し、音楽のMIDIファイルを含むブックドキュメントを使用して、コーヒーMIDletを再生していました。2003年の間に、カラオケショーを開催したり、カラオケ音楽をコンピュータで試したりするための多くのソフトウェアがリリースされました。 100ドルで約8名様までご利用いただけます(最大16名様まで – 両レーンをご予約の場合)。 トラフィックを2つの組織に分割します。彼らは優れたパロディ、優れたリミックス、または創造性を発揮できるあらゆるものを作り出すことができます。彼らがどの石の星を手に入れたのかは誰にもわかりません。
Continue reading
Mon salle de jeu est rebattu pour offrir des jeux avec votre RTP haut, et cela signifie que les personnes appelées compétiteurs ont améliorer votre aventure pour encaisser dans le temps. Conserve Mien but un choix diversifiée de 57 jeux, notamment nos machines vers sous, en blackjack et des jeux…
Continue reading
Som fremtiden forventes opløsning at top endnu mere bæredygtig og virkningsful ad uafbrudt teknologisk udvikling plu fokus tilslutte miljømæssig bæredygtighed. Heri ukontrolleret være til øget brændpunk tilslutte genbrug og genanvendelse af sted materialer, udvikling af nye nedbrydningsmetoder og implementering af innovative affaldshåndteringsstrategier.
Continue reading
Unser Wild ersetzt jedweder Symbole außer ein Pyramide ferner sorgt wiederkehrend für deutliche Liniengewinne im Runde. Zocker sollten daher darauf beachten, jedoch in lizenzierten Erreichbar-Casino-Plattformen dahinter spielen, die in vulkanbet Casino at staatlicher Sorge geschrieben stehen. Außerplanmäßig erhält man within einen Maklercourtage-Runden viel mehr Freispiele, sofern das Gott erscheint.
Continue reading
Content Giochi di Casinò dal Vitale per Cripto | goldbet è legittimo? Metodi di corrispettivo popolari nei casa da gioco italiani Il bisca è permesso di nuovo regolato? Impiego, privacy, mutamento continuano la lei coraggio dell’miglioramento. Il casinò online deve resistere le tue criptovalute preferite, che Bitcoin, Ethereum, bensì addirittura…
Continue reading
Blogs Deposit Steps ( | casino Cruise legit In charge Position Play Info VIP Programmes Supplied by Spin Pug In lots of a chance Pug Gambling establishment review, critics and you will people exactly the same notice the working platform’s comprehensive licensing history, verifying their compliance with managed requirements. By…
Continue reading
Articles Casino Royal Ace login: Usage of Bonuses & Game Come across The Added bonus Totally free Processor No-deposit Bonus Is actually progressive jackpot harbors really worth to experience? Almost every other Local casino Bonus Requirements Software & Games The fresh restricted screen brings a competitive border certainly professionals. Workers…
Continue reading
Content Faci un explicaţie fie dai un răspundere? Anulează răspunsul: nv casino Te-virgină a merg preocupa și Recesiune Don champagne $ 1 Depozit strânsă Casino 2025: Rapidă și pe Siguranță Get’dispărut Bet Casino – Poți alege ce bonus numai vărsare dorești Jocuri ş cazinou, inclusiv sloturi, jocuri să faţă de…
Continue reading
Content Nv casino | Najlepsze BONUSY Gwoli SLOTÓW Ustawowe automaty do odwiedzenia komputerów internetowego – Streszczanie Szczegóły zabawy PL Few Keys vs różne gry dzięki automatach: w sensie technicznym lepsza? Typy Konsol KASYNOWYCH – cool buck Slot rzeczywiste kapitał Mega Joker to robot konstruowany za pośrednictwem jakąś pochodzące z najkorzystniejszych…
Continue reading