/* 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":141941,"date":"2026-06-12T09:40:11","date_gmt":"2026-06-12T09:40:11","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=141941"},"modified":"2026-06-12T09:40:11","modified_gmt":"2026-06-12T09:40:11","slug":"el-casino-digital-disenado-para-triunfadores-en-espana-es-spinfin-casino","status":"publish","type":"post","link":"http:\/\/klecet.edu.in\/alumni\/el-casino-digital-disenado-para-triunfadores-en-espana-es-spinfin-casino\/","title":{"rendered":"El casino digital dise\u00f1ado para triunfadores en Espa\u00f1a es Spinfin Casino"},"content":{"rendered":"
\n

He recorrido durante a\u00f1os los casinos digitales, y con el tiempo uno aprende a separar el humo de la p\u00f3lvora spinfinn.es<\/a>. En Espa\u00f1a, donde sobran alternativas pero no todas son igual de fiables, toparse con un sitio que ofrezca seguridad, calidad de juego y ventajas genuinas es todo un hallazgo. En mi caso, Spinfin Casino ha resultado ser ese descubrimiento. No solo respeta estrictamente la normativa de la Direcci\u00f3n General de Ordenaci\u00f3n del Juego (DGOJ), sino que su propuesta est\u00e1 pensada desde cero para el jugador espa\u00f1ol que quiere algo m\u00e1s que pasar el rato. Este casino est\u00e1 pensado para quienes juegan de forma inteligente, valoran las recompensas habituales y exigen un servicio de primera. Te cuento por qu\u00e9 creo que Spinfin se ha convertido en la opci\u00f3n inteligente para el que juega a ganar.<\/p>\n

Un espacio de juego fiable y autorizado para la seguridad del jugador espa\u00f1ol<\/h2>\n

El primer aspecto que examino en cualquier plataforma es su posici\u00f3n frente a la protecci\u00f3n y la regulaci\u00f3n. En Espa\u00f1a, contar con una licencia de la DGOJ no es un simple paso. Es la seguridad de que el casino respeta las directrices de defensa del cliente, entretenimiento controlado y transparencia en los pagos. Spinfin Casino act\u00faa bajo este contexto legal, algo que desde el inicio me dio confianza. Su tecnolog\u00eda encripta mis informaci\u00f3n privada y mis transacciones, lo que me permite enfocarme en lo esencial cuando me accedo: participar. Agrega a esto que trabaja con desarrolladores de juegos de reconocido prestigio, de los que sus juegos pasan controles de azar con asiduidad. Cada vuelta de la ruleta, cada partida de blackjack, es equitativo. Sin esta base firme, el resto se viene abajo.<\/p>\n

Instrumentos preventivos para un juego controlado<\/h3>\n

Un casino que vela por el jugador no se limita a brindar diversi\u00f3n. Tambi\u00e9n facilita instrumentos para que administre su actividad. Spinfin incorpora estas opciones de manera sencilla y accesible, lo que refleja su compromiso. Desde mi panel, soy capaz de configurar restricciones de dep\u00f3sito diarios, por semana o por mes sin dificultades. Es una funci\u00f3n que empleo y agradezco, porque me facilita manejar mi dinero para entretenimiento. Tambi\u00e9n posibilitan determinar l\u00edmites de duraci\u00f3n de sesi\u00f3n y de p\u00e9rdidas, adem\u00e1s de la posibilidad de exclusi\u00f3n por tiempo o permanente si resultara preciso. Esta honestidad y la sencillez para adaptar la experiencia me provocan que sienta que el casino cree en m\u00ed y, al mismo tiempo, protege mis intereses.<\/p>\n

Gesti\u00f3n a tu disposici\u00f3n<\/h4>\n

La secci\u00f3n de juego responsable no se oculta en un rinc\u00f3n; se accede f\u00e1cilmente desde el perfil. En ese lugar, aparte de configurar los l\u00edmites, soy capaz de consultar un informe pormenorizado de mi actividad, acceso tras acceso. Esto me permite mantener un control objetivo de mi tiempo de juego y mi gasto, algo clave para administrarme correctamente. El casino tambi\u00e9n incorpora enlaces directos a organizaciones como Jugadores An\u00f3nimos, mostrando un verdadero compromiso con el beneficio de sus clientes. Este enfoque integral, que me da el control, es lo que caracteriza a una plataforma fiable y confiable en el mercado espa\u00f1ol de hoy.<\/p>\n

Asistencia al cliente: soporte en espa\u00f1ol siempre que lo precisas<\/h2>\n

Incluso en la plataforma m\u00e1s intuitiva pueden presentarse dudas o alg\u00fan problema t\u00e9cnico. Por eso, un servicio de atenci\u00f3n al cliente al alcance y capacitado es la prueba definitiva para cualquier casino online. Spinfin Casino brinda soporte en espa\u00f1ol a trav\u00e9s de varios canales. Mi preferido es el chat en vivo por su inmediatez. Las veces que lo he usado, los agentes han sido efectivos, amables y entendidos de la plataforma. Tambi\u00e9n cuentan con un servicio de correo electr\u00f3nico para consultas menos urgentes y una secci\u00f3n de preguntas frecuentes (FAQ) muy completa que normalmente resuelve mis dudas sobre bonos, pagos o normativa sin necesidad de contactar con nadie.<\/p>\n

M\u00e1s lejos de la resoluci\u00f3n de problemas<\/h3>\n

El buen servicio al cliente no se limita a apagar fuegos. Tambi\u00e9n consiste en anticiparse a ellos y en mejorar la experiencia del usuario. He visto que Spinfin se dedica a comunicar de forma proactiva cualquier cambio en los t\u00e9rminos, un mantenimiento programado o una funcionalidad nueva. Lo hace a trav\u00e9s de su correo interno o de avisos en la web. Esta transparencia genera confianza. Adem\u00e1s, el equipo entiende las particularidades del mercado espa\u00f1ol, desde las preferencias de juego hasta los horarios de m\u00e1s actividad, y ajusta su disponibilidad y sus respuestas en consecuencia. Este toque local, dentro de un est\u00e1ndar internacional de calidad, es lo que marca la diferencia.<\/p>\n

Una plataforma de pagos r\u00e1pido y adaptado a Espa\u00f1a<\/h2>\n

De poco sirve acumular ganancias si despu\u00e9s retirar el dinero se convierte en un calvario tedioso y complicado. En este punto, Spinfin Casino ha integrado m\u00e9todos de pago \u00e1giles, seguros y frecuentes en Espa\u00f1a. Puedo hacer dep\u00f3sitos al instante con tarjetas Visa o Mastercard, mediante transferencia bancaria tradicional o usando billeteras digitales y sistemas de pago online de garant\u00eda. Para los retiros, la rapidez es asimismo crucial. He comprobado que los tiempos de procesamiento son breves y, una vez concedida la solicitud, el dinero ingresa a mi cuenta en los plazos indicados. El hecho de que no existan comisiones no declaradas en las transacciones es otro aspecto que se aprecia.<\/p>\n

Una colecci\u00f3n de juegos que rivaliza con los principales casinos del mundo<\/h2>\n

Una vez establecida la confianza en la seguridad, lo que fideliza a un jugador es, sin duda, el conjunto de juegos. Aqu\u00ed es donde Spinfin Casino brilla de verdad. Su oferta es extensa y est\u00e1 muy seleccionada. Abarca desde las tragamonedas m\u00e1s conocidas y actuales hasta los cl\u00e1sicos de mesa que exigen habilidad. He jugado a t\u00edtulos de estudios como NetEnt, Play’n GO, Pragmatic Play y Evolution Gaming, lo que es sin\u00f3nimo de gr\u00e1ficos de calidad, juego fluida y funciones novedosas. Ya persiga la adrenalina de un jackpot progresivo, la planificaci\u00f3n del blackjack con crupier en vivo o la simplicidad de las ruletas europeas, la plataforma tiene algo para cada momento y cada tipo de jugador.<\/p>\n

Encuentra las joyas de la corona de Spinfin<\/h3>\n

Entre cientos de opciones, algunos juegos se han labrado un lugar entre mis favoritos por su equilibrio entre diversi\u00f3n y potencial de premio. Las tragamonedas de video, con temas que van desde la mitolog\u00eda n\u00f3rdica hasta aventuras ex\u00f3ticas, ofrecen rondas de bonificaci\u00f3n ingeniosas y multiplicadores generosos. Para los que optan por la estrategia, las variantes de blackjack y las mesas de ruleta con distintos l\u00edmites de apuesta me posibilitan adaptar la partida a mi forma y a mi banca. Y no me olvido de los juegos instant\u00e1neos, perfectos para una sesi\u00f3n corta con premio. La plataforma se actualiza constantemente con novedades, as\u00ed que siempre hay algo nuevo que probar.<\/p>\n

Bonificaciones y promociones creadas para maximizar tus triunfos<\/h2>\n

Los bonos de bienvenida son el est\u00e1ndar, pero lo que separa a un casino normal de uno concebido para triunfadores es el valor de sus promociones a largo plazo. Spinfin Casino lo tiene muy claro. Su conjunto de bienvenida est\u00e1 pensado para proporcionarme m\u00e1s tiempo de juego desde el inicio, permiti\u00e9ndome conocer buena parte de su oferta con un saldo ampliado. Pero en el punto donde veo su verdadero enfoque es en las promociones para jugadores activos. Desde bonos de recarga semanales con giros gratis hasta campeonatos de slots con premios en efectivo y devoluci\u00f3n sobre las p\u00e9rdidas sufridas, percibo que mi lealtad se premia de forma constante. Eso s\u00ed, siempre reviso los cl\u00e1usulas, sobre todo los condiciones de juego, para saber c\u00f3mo transformar esos bonos en dinero retirable.<\/p>\n