/* 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":140569,"date":"2026-06-11T00:17:30","date_gmt":"2026-06-11T00:17:30","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=140569"},"modified":"2026-06-11T00:17:30","modified_gmt":"2026-06-11T00:17:30","slug":"evaluation-mobile-de-twin-casino-pour-les-joueurs-canadiens","status":"publish","type":"post","link":"https:\/\/klecet.edu.in\/alumni\/evaluation-mobile-de-twin-casino-pour-les-joueurs-canadiens\/","title":{"rendered":"\u00c9valuation Mobile de Twin Casino pour les Joueurs Canadiens"},"content":{"rendered":"
\n\"High<\/p>\n

Pour les joueurs canadiens, le t\u00e9l\u00e9phone est g\u00e9n\u00e9ralement le premier \u00e9cran vers lequel on se tourne https:\/\/twinncasino.com\/fr-ca\/<\/a>. L’exp\u00e9rience sur mobile n’est plus un bonus, c’est un crit\u00e8re d\u00e9cisif. Ce test de Twin Casino mobile a pour but de v\u00e9rifier une chose : la plateforme tient-elle ses promesses sur un \u00e9cran de poche ? Nous avons pass\u00e9 du temps sur l’interface, examin\u00e9 la navigation, calcul\u00e9 les chargements et pass\u00e9 en revue les fonctionnalit\u00e9s. Notre analyse d\u00e9taill\u00e9e vous donne les cl\u00e9s pour savoir si Twin Casino mobile m\u00e9rite votre temps, et surtout, votre argent.<\/p>\n

Interface de navigation et Interface utilisateur<\/h2>\n

Depuis un mobile, quand la navigation est mauvaise, on abandonne. Ici, elle a \u00e9t\u00e9 con\u00e7ue avec logique. Le menu de navigation, symbolis\u00e9 par les trois barres, est peu encombrant mais fonctionnel. Une barre inf\u00e9rieure fixe offre un acc\u00e8s permanent aux sections essentielles : page d’accueil, recherche, offres promotionnelles et compte. L’outil de tri des jeux se montre performant. Vous triez par d\u00e9veloppeur par type de jeu (machines \u00e0 sous, jeux de table, live) ou par derni\u00e8res sorties en deux appuis. Les changements d’interface sont douces, sans ces temps morts qui \u00e9voquent un dysfonctionnement. Cette interface bien pens\u00e9e met l’accent sur le plaisir de jouer.<\/p>\n

Atouts et Axes d’am\u00e9lioration<\/h2>\n

Cette \u00e9valuation permet de \u00e9tablir un bilan clair. L’exp\u00e9rience mobile de Twin Casino est convaincante, port\u00e9e par une interface r\u00e9active, des performances solides et un catalogue complet. Pour le joueur canadien, les atouts sont tangibles.<\/p>\n

    \n
  1. Acc\u00e8s adaptable<\/strong> : Le possibilit\u00e9 entre navigateur et application, deux options bien abouties.<\/li>\n
  2. Fiabilit\u00e9<\/strong> : Peu de bugs constat\u00e9s, m\u00eame lors de sessions intensives.<\/li>\n
  3. Catalogue intact<\/strong> : Aucun jeu ou service bancaire n’a \u00e9t\u00e9 oubli\u00e9 pour le mobile.<\/li>\n<\/ol>\n

    Quelques pistes d’am\u00e9lioration subsistent. En p\u00e9riode de l\u00e9g\u00e8res r\u00e9serves. En p\u00e9riode de trafic important, l’acc\u00e8s aux tables de live casino peut requ\u00e9rir quelques secondes de plus. Une barre de recherche avec des suggestions \u00e0 la vol\u00e9e serait aussi un plus. Ces d\u00e9tails n’ob\u00e8rent pas le r\u00e9sultat global, qui reste excellent.<\/p>\n

    Caract\u00e9ristiques Bancaires et S\u00fbret\u00e9<\/h2>\n

    G\u00e9rez son argent en confiance depuis son t\u00e9l\u00e9phone est essentiel. L’espace bancaire de Twin Casino sur mobile est aussi riche que sur ordinateur. Nous avons effectu\u00e9 des d\u00e9p\u00f4ts et des retraits via Interac, Visa, Mastercard et des portefeuilles \u00e9lectroniques, le tout garanti par un chiffrement SSL. Les \u00e9tapes sont simples et accompagn\u00e9es. La s\u00e9curit\u00e9 ne fl\u00e9chit pas : les m\u00eames protocoles de cryptage et la licence de jeu responsable restent en vigueur. Voir son historique de transactions, modifier ses limites de d\u00e9p\u00f4t ou lancer des outils de contr\u00f4le est instantan\u00e9 depuis le menu du compte. Vous restez la main, o\u00f9 que vous soyez.<\/p>\n

    S\u00e9lection de Jeux Mobile<\/h2>\n

    La biblioth\u00e8que de jeux fait le prestige d’un casino. Sur mobile, Twin Casino ne fait pas de compromis. De nombreuses de machines \u00e0 sous sont l\u00e0, des titres r\u00e9tro aux slots vid\u00e9o les plus \u00e9labor\u00e9s, leurs graphismes optimis\u00e9s pour l’\u00e9cran tactile. Les jeux de table \u2013 blackjack, roulette, baccara \u2013 sont bien pr\u00e9sents, dans leurs versions automatiques et live. Des \u00e9diteurs comme Evolution Gaming garantissent un streaming de qualit\u00e9 pour le casino live, avec une interface de paris con\u00e7ue pour le toucher. Gr\u00e2ce aux filtres intelligents, trouver un nouveau jeu pr\u00e9f\u00e9r\u00e9 ne prend que quelques instants.<\/p>\n

    Efficacit\u00e9 et C\u00e9l\u00e9rit\u00e9 de Mise en route<\/h2>\n

    Au Canada, la performance d’un casino mobile se mesure sur la 4G en campagne autant que sur la fibre en ville. Nous avons essay\u00e9 Twin Casino dans ces situations vari\u00e9es. Le constat est favorable. Les pages de structure se affichent en une ou deux secondes sur une connexion standard. Pour les jeux, le temps est li\u00e9 surtout du fournisseur (NetEnt, Pragmatic Play\u2026), mais la plateforme elle-m\u00eame n’ajoute pas de latence excessive. Les images sont optimis\u00e9es pour s’adapter au d\u00e9bit pr\u00e9sent. Quelques conseils peuvent encore am\u00e9liorer les choses :<\/p>\n

    \"$200<\/p>\n