/* 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":154786,"date":"2026-06-15T03:55:19","date_gmt":"2026-06-15T03:55:19","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=154786"},"modified":"2026-06-15T03:55:19","modified_gmt":"2026-06-15T03:55:19","slug":"ou-le-divertissement-allie-la-sagesse-pour-le-canada-avec-piperspin-casino","status":"publish","type":"post","link":"http:\/\/klecet.edu.in\/alumni\/ou-le-divertissement-allie-la-sagesse-pour-le-canada-avec-piperspin-casino\/","title":{"rendered":"O\u00f9 le divertissement allie la sagesse pour le Canada avec PiperSpin Casino"},"content":{"rendered":"
\n\"Pied<\/p>\n

Le march\u00e9 canadien du jeu en ligne est un environnement dynamique, o\u00f9 les joueurs souhaitent \u00e0 la fois du plaisir et une plateforme digne de confiance. PiperSpin Casino trouve sa place exactement \u00e0 cette jonction. Il offre une exp\u00e9rience qui allie l\u2019adr\u00e9naline des parties \u00e0 une d\u00e9marche r\u00e9fl\u00e9chie et responsable. La plateforme comprend les besoins particuliers des Canadiens, en offrant un environnement s\u00fbr, \u00e9quitable et adapt\u00e9 aux r\u00e9alit\u00e9s locales, le tout dans un cadre l\u00e9gal et transparent.<\/p>\n

La politique de PiperSpin envers le jeu responsable<\/h2>\n

PiperSpin Casino place l\u2019int\u00e9grit\u00e9 et la s\u00e9curit\u00e9 du joueur au c\u0153ur de tout ce qu\u2019il r\u00e9alise https:\/\/pipersspin.com\/fr-ca\/<\/a>. Le casino part du principe que le jeu doit \u00eatre un plaisir, maintenu dans des limites saines. Pour y arriver, il a cr\u00e9\u00e9 un ensemble d\u2019outils et de politiques visant \u00e0 prot\u00e9ger les joueurs, souvent avant m\u00eame que la loi ne l\u2019exige. Cette d\u00e9marche proactive \u00e9tablit un nouveau r\u00e9f\u00e9rence pour l\u2019industrie au Canada.<\/p>\n

La philosophie de PiperSpin ne se r\u00e9duit pas \u00e0 une conformit\u00e9 juridique. Elle inclut un travail continu pour informer ses joueurs sur les risques possibles et sur les aides disponibles. En travaillant avec des organismes canadiens comme le Centre de toxicomanie et de sant\u00e9 mentale (CAMH), PiperSpin s\u2019assure que ses ressources soient adapt\u00e9es aux besoins de sa communaut\u00e9.<\/p>\n

Les moyens pratiques \u00e0 la disposition des joueurs<\/h3>\n

Pour concr\u00e9tiser ses principes, PiperSpin int\u00e8gre une s\u00e9rie de fonctionnalit\u00e9s directement dans l\u2019espace personnel de chaque joueur. Ces outils procurent un contr\u00f4le direct et imm\u00e9diat sur ses habitudes de jeu. Ils sont utilisables facilement, sans formalit\u00e9, et encouragent une prise de conscience.<\/p>\n

Fonctionnalit\u00e9s de contr\u00f4le des d\u00e9p\u00f4ts et du temps<\/h4>\n

Les joueurs peuvent \u00e9tablir des plafonds de d\u00e9p\u00f4t pour la journ\u00e9e, la semaine ou le mois. Le syst\u00e8me les ex\u00e9cute sans exception. Des alertes de session et un suivi du temps pass\u00e9 contribuent \u00e0 maintenir la notion de l\u2019engagement. L\u2019option d\u2019auto-exclusion temporaire offre de s\u2019accorder une pause d\u00e9termin\u00e9e, une r\u00e9cr\u00e9ation sans avoir \u00e0 fermer son compte d\u00e9finitivement.<\/p>\n

Un agr\u00e9ment et une s\u00e9curit\u00e9 de niveau international<\/h2>\n

Op\u00e9rer au Canada requiert de se soumettre aux normes r\u00e9glementaires les plus strictes. PiperSpin Casino obtient une licence de jeu r\u00e9put\u00e9e, accord\u00e9e par la Kahnawake Gaming Commission, une autorit\u00e9 bien ancr\u00e9e au Qu\u00e9bec. Cette licence n\u2019est pas un simple papier. Elle repr\u00e9sente un audit permanent des activit\u00e9s du casino, une garantie d\u2019\u00e9quit\u00e9 et de transparence pour chaque transaction.<\/p>\n

La protection des donn\u00e9es personnelles et financi\u00e8res est une priorit\u00e9 absolue. PiperSpin utilise un chiffrement SSL 256-bit, une technologie robuste qui garantit tous les \u00e9changes entre l\u2019appareil du joueur et ses serveurs. Les moyens de paiement accept\u00e9s proviennent tous de fournisseurs reconnus, s\u00e9lectionn\u00e9s pour leur popularit\u00e9 aupr\u00e8s des Canadiens.<\/p>\n

Une gamme de jeux loyaux et homologu\u00e9s<\/h2>\n

La ludoth\u00e8que de PiperSpin est \u00e9tendue, mais son vrai point fort, c\u2019est la garantie d\u2019\u00e9quit\u00e9. Chaque titre, des machines \u00e0 sous aux tables de croupiers en direct, fonctionne avec des g\u00e9n\u00e9rateurs de nombres al\u00e9atoires (GNA) certifi\u00e9s par des laboratoires ind\u00e9pendants. Des tests fr\u00e9quents assurent que chaque r\u00e9sultat est al\u00e9atoire et loyal, offrant \u00e0 tous les m\u00eames chances de gagner.<\/p>\n

Vari\u00e9t\u00e9 et qualit\u00e9 des fournisseurs<\/h3>\n

PiperSpin travaille avec les plus grands noms du secteur, comme NetEnt, Microgaming, Evolution Gaming et Play’n GO. Ces partenariats garantissent une qualit\u00e9 visuelle et sonore \u00e9lev\u00e9e, ainsi qu\u2019un renouvellement constant des caract\u00e9ristiques et des th\u00e8mes. Les joueurs canadiens acc\u00e8dent ainsi aux derni\u00e8res sorties internationales comme aux grands classiques qui durent.<\/p>\n

Offres et offres \u00e9labor\u00e9s avec transparence<\/h2>\n

Les offres de bienvenue et les promotions r\u00e9guli\u00e8res de PiperSpin sont s\u00e9duisantes, mais elles se font surtout remarquer par leur clart\u00e9. Chaque bonus est pr\u00e9sent\u00e9 avec des conditions d\u2019utilisation pr\u00e9cises et faciles \u00e0 consulter. Le objectif est de r\u00e9tribuer le joueur sans provoquer d\u2019attentes d\u00e9mesur\u00e9es ou de mauvaises d\u00e9convenues, une habitude encore trop r\u00e9pandue sur d\u2019autres plateformes.<\/p>\n