/*
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' );
Yes, no deposit casino bonuses are fully legal in the US when offered by licensed operators in regulated states. It also offers other existing players no deposit bonuses like the 5,000 Gold Coins and 0.30 Sweep Coins daily and the 200,000 GC and 70 SC refer-a-friend bonus. Lonestar Casino has one of the most valuable no purchase free welcome bonuses set at 100,000 GC and 2 Sweeps Coins. With a very player-friendly 1x wagering requirement and a low 50 SC limit for gift card redemptions, it’s a top choice for those who value quick prize turnarounds. You can also visit our sweepstakes casino no deposit bonus page for a full list of brands.
While BetMGM and Caesars provide no-purchase credits, in 2026 several casinos offer high-volume rewards for a minimal $5 or $10 initial deposit. Minimum wagering within 7 days required to unlock bonuses. As part of a generous welcome bonus offered to new players in MI, NJ, PA, and WV, BetMGM includes a no deposit bonus. This is as close to “free money” as things can get with online casinos. All users have to do is create an account with an online casino, and without ever depositing any money, they receive bonus cash or credits right away.
Most no deposit bonuses apply only to selected slot games. Checking expiry dates is essential when using a real money casino no deposit bonus 2025. These periods can range from a few days to several weeks. Understanding the difference helps players choose the right offer.
As always, it’s well worth checking out the casino’s T&Cs to ensure you have enough time to reap the benefits from any bonuses. Below are the different types of no deposit bonuses among online US casinos that players should watch for. Use our shortlist to compare top online casino sites with no deposit offers. We’ve ranked and reviewed all of the best no deposit casinos with the latest sign-up offers, all in one place.
Focus on one bonus at a time and plan your gameplay around the terms. Claiming a casino welcome bonus can be exciting, but it’s easy to overlook key details. Selecting the right casino registration bonus can set the tone for your gaming experience.
When it comes to several online casinos (though not all) you must deposit in order to withdraw any winnings that come by way of a NDB. In many online casinos, if you take a NDB, you will no longer be able to take advantage of any other new player bonuses as they will not construe you as a new player. Upon registration, 900 Free Spins will be awarded over the next 30 days – 30 Free Spins per day, with no deposit required.
No-deposit bonus codes are promotional offers from online casinos and gaming platforms that allow players to claim bonuses without making a deposit. Here, you can find our brief but effective guide on how to claim free spins no deposit offers. The Polymarket promo code ROTOWIRE gets new users a $50 bonus just for depositing $20! Currently there are a few online casinos such as Caesars Palace giving no-deposit bonuses for new users. The casinos that payout the highest are usually those that include fewer restrictions into a bonuses’ terms, set up so you get to keep more of what you win. US-facing https://sirbetalot-nl.nl/ casinos have historically featured slots from RTG, Rival, Arrow’s Edge, and Betsoft, but nowadays, more providers have joined the market, including Playtech, Play’n GO, ELK Studios, Thunderkick, and aggregators like Light & Wonder.
Popular slots and popular online slots are often the top picks for players seeking real money wins. The best online casinos allow you to play a wide variety of games with your no deposit bonus credits, but some choices are better than others. But it does happen, and it’s yet another reason that you need to read the terms and conditions carefully.
For Icelandic players the rules feel a bit different – the language, payment options and support are all tailored to the local market. A no-deposit bonus is designed to encourage new users to get involved in starting to play for real money. BetMGM is one of the few online casinos currently offering no-deposit bonuses. There are online casinos that give customers bonus spins on occasionally, and these deals have no deposit requirement.
Unlike traditional welcome offers that require a first deposit to unlock bonus credits, no-deposit bonuses let users start playing without any upfront financial commitment. The main advantage of no-deposit bonus codes is that they allow players to enjoy casino games, whether slots or table games, using house funds or free spins, rather than their own money. If it is seven days, be sure to use the credits within one week, or they will be removed from the account.
Playing online casino games at no cost while still keeping the chance to win money is exceptional and yet possible thanks to no deposit bonuses.
]]>Start with modest amounts to evaluate processing speed and accuracy before regular use of any casino payment method. Ensure that both adding and withdrawing funds are available through your chosen casino payment method. Selecting the right casino payment method requires matching your priorities with each option’s strengths. Using two factor authentication helps online casino players protect financial information, secure transactions, and keep every chosen payment method safer across casino payment systems. Even if someone gains access to login details, they cannot enter the casino account or use any casino payment method without completing this extra check.
Each method has its own pros and cons, making it essential to choose the best casino payment methods and the right online casino payment method for your needs. The list of casino payment methods may vary depending on the platform, but most include the main solutions, such as credit cards, e-wallets, and bank transfers. Choosing the best casino payment methods is not just a matter of convenience. Mobile solutions are some of the most secure online casino payment methods. The table below highlights common legal online casino payment methods by state, including options for deposits, withdrawals, and in-person cash transactions where available.
The best instant payout casino is usually the one with clear rules, realistic promotions, and steady payouts. Reliable casinos list payment methods, fees, minimum withdrawals, and estimated timelines openly. Always read the cashier rules before funding an account. Limits such as C$250 per week, mandatory extra reviews, or vague “security checks” can create long delays.
Digital wallets act as an intermediate layer between bank accounts, cards, and online casino operators. Many regional cards allow online casino deposits but not withdrawals, which requires choosing a secondary casino payment method inside the cashier or withdrawal section. Availability depends heavily on region and on each operator’s partnerships, with US-focused casinos more likely to list these cards than platforms in Europe or Asia.
Slot Mafia organizes its cashier around widely used casino payment methods rather than complex banking layers. This guide explains the most common casino payment methods used in 2026 and how they function in practice. Promoting faster payment options like e-wallets or cryptocurrencies can address slow processing times for online casino https://totbet.casino/fr/ payments.
Discover our expert recommendations and join casinos that accept deposits and withdrawals via Canada’s top payment option. Only ever use known and recommended payment options to avoid bad service and even fraud or theft. All the payment options we recommend make it their top priority to be the safest and the most secure. When in doubt, choose the payment options that give you the most control, because responsible gambling is not only about how much you play, but also how carefully you manage your money.
The best payment method for online casino play should be simple to set up, easy to find in the cashier, and practical for both desktop and mobile users. Because some e-wallets require less personal identification to set up as opposed to bank accounts, it is harder for the casino to verify your identity at your first deposit. Making an online casino deposit in the US requires identity verification so you’re going to want to have some information ready, including your Social Security Number and your ZIP code. That is why Apple Pay casinos are increasing in their popularity because the payment method is already set up in your phone and you only need to make a few clicks to complete your deposit.
Interac is on par with other e-wallets, and there’s even a case to be made that it’s better than others because it connects directly to your bank account. We have listed our top Interac online casinos where you can try your luck! Anyone with a legitimate bank account with an institution based in Canada can use Interac by connecting their online banking with an account. Interac offers a secure, straightforward, cost-effective method for transferring money from your bank account to your preferred online casino. It’s an independent, knowledge-based, charitable organisation dedicated to the cause of safety. At Casino.org, we make it our mission to ensure our players gamble responsibly.
Some casinos process BLIK payouts within hours, while others require one or two business days because of internal review procedures. Many players specifically search for casinos supporting instant BLIK deposits because the process already matches how they pay online in everyday situations. CasinoRIX experts regularly point out that faster payment flow increases the number of completed first deposits across casino platforms. These numbers matter for online casinos because most Polish players already understand how the payment flow works before entering the cashier section. BLIK spread quickly because Polish users already rely on it outside of gambling websites. Many users already keep their banking app active while using casino websites, so the entire payment flow takes less than a minute.
As a gambling fan, Jemma brings a forensic approach to her reviews, digging into the data behind the numbers. As a result, you may not see your winnings appear in your bank account for a few working days after initiating the transfer. Most fees, particularly at the Interac casinos we recommend, are absorbed by gambling sites to make playing there more attractive. This option enables you to use cash in your bank account without exposing your details to casino sites. Regardless, it’s certainly much faster than paying in or cashing out via cheque, wire transfer, etc.
If you’re playing at a casino approved by a state licensing board, your general safety is assured, at least from the operator’s side. Get a snapshot of comparison fees, processing times and withdrawal limits , or dive deeper into each review for a full list of casinos covering your preferred payment method. California Online Casinos – Where to Play Online in min readJan 06, 2026 E-wallets like PayPal and Skrill, along with fast mobile payment options like Apple Pay and Google Pay, are often the quickest for processing withdrawals.