/* 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' );{"id":156211,"date":"2026-06-15T06:16:07","date_gmt":"2026-06-15T06:16:07","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=156211"},"modified":"2026-06-15T06:16:07","modified_gmt":"2026-06-15T06:16:07","slug":"casino-rainbet-7","status":"publish","type":"post","link":"http:\/\/klecet.edu.in\/alumni\/casino-rainbet-7\/","title":{"rendered":"Davantage de bonus, davantage de plaisir avec Rainbet Casino pour les joueurs canadiens"},"content":{"rendered":"
\n\"RTBet<\/p>\n

Trouver un Casino Rainbet<\/a> en ligne, c\u2019est souvent chercher plus que des jeux. On souhaite aussi une vraie valeur ajout\u00e9e, quelque chose qui accompagne chaque visite. Rainbet Casino a fait son nom au Canada en misant sur une g\u00e9n\u00e9rosit\u00e9 constante avec ses bonus. Chaque session se transforme en une chance de jouer plus longtemps et de gagner un peu plus. Je vous pr\u00e9sente ici un tour complet de ce que la plateforme offre. Nous regarderons l\u2019offre de bienvenue, les promotions r\u00e9guli\u00e8res, le programme de fid\u00e9lit\u00e9, et surtout, les conditions \u00e0 conna\u00eetre. L\u2019id\u00e9e est simple : vous aider \u00e0 mieux profiter du divertissement et \u00e0 g\u00e9rer votre argent de jeu avec ces bonus.<\/p>\n

L’approche g\u00e9n\u00e9reuse de Rainbet envers les joueurs canadiens<\/h2>\n

Rainbet Casino a clairement \u00e9labor\u00e9 son offre pour les joueurs d\u2019ici. Leur philosophie est claire : un bonus n\u2019est pas un simple app\u00e2t, mais un vrai levier de divertissement sur la dur\u00e9e. Beaucoup de sites se contentent d\u2019un cadeau de bienvenue avant de dispara\u00eetre. Pas Rainbet. Ici, les promotions reviennent r\u00e9guli\u00e8rement, une mani\u00e8re de dire aux joueurs r\u00e9guliers qu\u2019ils sont importants. \u00c7a g\u00e9n\u00e8re un sentiment de r\u00e9compense continue, que vous soyez nouveau ou habitu\u00e9. Cette constance dans la g\u00e9n\u00e9rosit\u00e9, c\u2019est ce qui construit une relation de confiance avec la communaut\u00e9.<\/p>\n

D\u00e9cortiquer le bonus de bienvenue : un ensemble de valeur<\/h2>\n

Votre premi\u00e8re rencontre avec Rainbet d\u00e9marre par une aide g\u00e9n\u00e9reuse. L\u2019offre d\u2019accueil n\u2019est habituellement pas un bonus unique. Il s\u2019agit plut\u00f4t d\u2019un pack \u00e9tal\u00e9 sur vos premiers d\u00e9p\u00f4ts, ce qui augmente vos fonds de d\u00e9part. Une offre typique peut inclure un match en pourcentage sur le premier d\u00e9p\u00f4t, un autre bonus sur le deuxi\u00e8me, et parfois un troisi\u00e8me coup de pouce. \u00c0 chaque \u00e9tape, on vous offre souvent des tours gratuits sur des machines \u00e0 sous populaires. Cette structure vous permet d\u2019explorer le casino par \u00e9tapes, avec un capital bonus qui se renouvelle, et de \u00e9taler un peu le risque.<\/p>\n

Les parties cl\u00e9s de l’offre de bienvenue<\/h3>\n

Pour bien en profiter, il faut appr\u00e9hender chaque \u00e9l\u00e9ment. Le pourcentage de match, parfois tr\u00e8s \u00e9lev\u00e9, fixe la somme que le casino ajoute \u00e0 votre argent. Les tours gratuits, eux, sont une porte d\u2019entr\u00e9e sans risque vers de nouveaux jeux et des gains potentiels. Attention, ces deux types de bonus s\u2019accompagnent presque toujours de conditions de mise, un point que nous expliciterons plus loin. L\u2019avantage de ce package \u00e9tal\u00e9 ? Vous avez le temps de vous habituer avec le site, les r\u00e8gles des jeux et les conditions g\u00e9n\u00e9rales, sans tout miser d\u2019un coup.<\/p>\n

\"Online<\/p>\n

Promotions permanentes : maintenir l’excitation au quotidien<\/h2>\n

La v\u00e9ritable force de Rainbet r\u00e9side apr\u00e8s le bonus de bienvenue. L’\u00e9tablissement ne vous oublie pas. Un calendrier de promotions permanentes relaie. Imaginez des reloads hebdomadaires, des tours gratuits sur les derni\u00e8res sorties, ou des tournois avec des prix garantis. Ces offres rendent l\u2019exp\u00e9rience vivante. Pour un joueur r\u00e9gulier, se connecter peut rimer avec une nouvelle opportunit\u00e9. \u00c7a casse la routine et renforce l\u2019envie de revenir. C\u2019est cette strat\u00e9gie qui diff\u00e9rencie un casino banal d\u2019une plateforme \u00e0 l’\u00e9coute \u00e0 ses joueurs.<\/p>\n

Le programme de fid\u00e9lit\u00e9 : recevoir des avantages pour vos parties<\/h2>\n

Outre les offres temporaires, Rainbet r\u00e9compense la loyaut\u00e9 via un programme \u00e9tabli. En jouant comme d’habitude, vous accumulez des points. Ces points se convertissent ensuite en argent r\u00e9el, en bonus ou en avantages exclusifs. Le message est simple : chaque mise a son importance. Les diff\u00e9rents niveaux de statut activent des b\u00e9n\u00e9fices croissants, comme un taux de conversion sup\u00e9rieur, un cadeau d’anniversaire ou l’acc\u00e8s \u00e0 un gestionnaire personnel. C’est la mani\u00e8re dont le casino vous t\u00e9moigne sa gratitude pour votre activit\u00e9, instaurant un cercle o\u00f9 plus vous misez (toujours avec mod\u00e9ration), plus vous obtenez de reconnaissance.<\/p>\n

Offre sans d\u00e9p\u00f4t et tours offerts : tenter sa chance sans frais<\/h2>\n

Les promotions les plus demand\u00e9es demeurent les primes sans d\u00e9p\u00f4t et les tours offerts hors package. Rainbet comprend qu\u2019on appr\u00e9cie tester une plateforme sans toucher \u00e0 son solde. Ces bonus, m\u00eame si les sommes sont petits, ont une importance immense. Elles vous donnent une visite libre du casino, des visuels des slots \u00e0 la qualit\u00e9 des jeux en direct. Pour un novice, c\u2019est un gage de s\u00e9rieux. Pour un joueur r\u00e9gulier, c\u2019est une agr\u00e9able surprise qui peut aboutir \u00e0 un profit surprise. Elles ont aussi leurs r\u00e8gles de mise, bien s\u00fbr, mais elles constituent une opportunit\u00e9 sans risque id\u00e9ale pour se faire une opinion.<\/p>\n

Appr\u00e9hender les conditions de mise (Wagering Requirements)<\/h2>\n

Aborder bonus, c\u2019est in\u00e9vitablement discuter des conditions de mise, les fameux \u00ab wagering requirements \u00bb. C\u2019est la n\u00e9cessit\u00e9 de parier un multiple du montant du bonus (parfois du d\u00e9p\u00f4t aussi) avant de pouvoir retirer vos gains. Rainbet, comme tout casino s\u00e9rieux, montre ces r\u00e8gles clairement. Les comprendre est la cl\u00e9 pour contr\u00f4ler votre argent de jeu intelligemment.<\/p>\n