/** * jQuery fontIconPicker - v2.3 * * An icon picker built on top of font icons and jQuery * * http://codeb.it/fontIconPicker * * Made by Alessandro Benoit & Swashata * Under MIT License * * {@link https://github.com/micc83/fontIconPicker} * * Modified by Visual Composer Dev Team */ (function ( $ ) { 'use strict'; // Create the defaults once var defaults = { theme: 'fip-vc-theme-grey', // The CSS theme to use with this fontIconPicker. You can set different themes on multiple elements on the same page source: false, // Icons source (array|false|object) emptyIcon: true, // Empty icon should be shown? emptyIconValue: '', // The value of the empty icon, change if you select has something else, say "none" iconsPerPage: 20, // Number of icons per page hasSearch: true, // Is search enabled? searchSource: false, // Give a manual search values. If using attributes then for proper search feature we also need to pass icon names under the same order of source useAttribute: false, // Whether to use attribute selector for printing icons attributeName: 'data-icon', // HTML Attribute name convertToHex: true, // Whether or not to convert to hexadecimal for attribute value. If true then please pass decimal integer value to the source (or as value="" attribute of the select field) allCategoryText: 'From all categories', // The text for the select all category option unCategorizedText: 'Uncategorized', // The text for the select uncategorized option iconDownClass: 'fip-icon-down-dir', // Class for icon down iconUpClass: 'fip-icon-up-dir', // Class for icon up iconLeftClass: 'fip-icon-left-dir', // Class for icon left iconRightClass: 'fip-icon-right-dir', // Class for icon right iconSearchClass: 'fip-icon-search', // Class for search iconCancelClass: 'fip-icon-cancel', // Class for search canceling iconSpinClass: 'fip-icon-spin3', // Class for fip-icon-spin3 iconBlockClass: 'fip-icon-block', // Class for block(none icon) searchPlaceholder: 'Search Icon', // Search icon text placeholder mainClass: 'vc-icons-selector' }; // The actual plugin constructor function Plugin( element, options ) { this.element = $( element ); this.settings = $.extend( {}, defaults, options ); if ( this.settings.emptyIcon ) { this.settings.iconsPerPage --; } this.iconPicker = $( '
', { 'class': this.settings.mainClass, style: 'position: relative', html: '
' + '' + '' + '' + '' + '' + '' + '
' + '' } ); this.iconContainer = this.iconPicker.find( '.fip-icons-container' ); this.searchIcon = this.iconPicker.find( '.selector-search i' ); this.iconsSearched = []; this.isSearch = false; this.totalPage = 1; this.currentPage = 1; this.currentIcon = false; this.initialized = false; this.iconsPaged = false; this.iconsCount = 0; this.open = false; // Set the default values for the search related variables this.searchValues = []; this.availableCategoriesSearch = []; // The trigger event for change this.triggerEvent = null; // Backups this.backupSource = []; this.backupSearch = []; // Set the default values of the category related variables this.isCategorized = false; // Automatically detects if the icon listing is categorized this.selectCategory = this.iconPicker.find( '.icon-category-select' ); // The category SELECT input field this.selectedCategory = false; // false means all categories are selected this.availableCategories = []; // Available categories, it is a two dimensional array which holds categorized icons this.unCategorizedKey = null; // Key of the uncategorized category // Initialize plugin this.quickInit(); } Plugin.prototype = { /** * Quick init */ quickInit: function () { var first = true; // Add the theme CSS to the iconPicker this.iconPicker.addClass( this.settings.theme ); // To properly calculate iconPicker height and width // We will first append it to body (with left: -9999px so that it is not visible) this.iconPicker.css( { left: - 9999 } ).appendTo( 'body' ); var iconPickerHeight = this.iconPicker.outerHeight(), iconPickerWidth = this.iconPicker.outerWidth(); // Now reset the iconPicker CSS this.iconPicker.css( { left: '' } ); // Add the icon picker after the select this.element.before( this.iconPicker ); // Hide source element // Instead of doing a display:none, we would rather // make the element invisible // and adjust the margin this.element.css( { visibility: 'hidden', top: 0, position: 'relative', zIndex: '-1', left: '-' + iconPickerWidth + 'px', display: 'none', height: iconPickerHeight + 'px', width: iconPickerWidth + 'px', // Reset all margin, border and padding padding: '0', margin: '0 -' + iconPickerWidth + 'px 0 0', // Left margin adjustment to account for dangling space border: '0 none', verticalAlign: 'top' } ).hide(); // Set the trigger event if ( ! this.element.is( 'select' ) ) { // Determine the event that is fired when user change the field value // Most modern browsers supports input event except IE 7, 8. // IE 9 supports input event but the event is still not fired if I press the backspace key. // Get IE version // https://gist.github.com/padolsey/527683/#comment-7595 var ieVersion = (function () { var v = 3, div = document.createElement( 'div' ), a = div.all || []; while ( div.innerHTML = '', a[ 0 ] ) { ; } return v > 4 ? v : ! v; }()); var el = document.createElement( 'div' ); this.triggerEvent = (ieVersion === 9 || ! ('oninput' in el)) ? [ 'keyup' ] : [ 'input', 'keyup' ]; // Let's keep the keyup event for scripts that listens to it } this.setSelectedIcon( this.element.val() ); /** * Category changer */ this.selectCategory.on( 'change keyup', $.proxy( function ( e ) { // Don't do anything if not categorized if ( this.isCategorized === false ) { return false; } var targetSelect = $( e.currentTarget ), currentCategory = targetSelect.val(); // Check if all categories are selected if ( targetSelect.val() === 'all' ) { // Restore from the backups // @note These backups must be rebuild on source change, otherwise it will lead to error this.settings.source = this.backupSource; this.searchValues = this.backupSearch; // No? So there is a specified category } else { var key = parseInt( currentCategory, 10 ); if ( this.availableCategories[ key ] ) { this.settings.source = this.availableCategories[ key ]; this.searchValues = this.availableCategoriesSearch[ key ]; } } this.resetSearch(); this.loadIcons(); }, this ) ); /** * On down arrow click */ this.iconPicker.find( '.selector-button' ).on( 'click', $.proxy( function () { if ( ! this.open && first ) { first = false; this.initCategories(); } // Open/Close the icon picker this.toggleIconSelector(); }, this ) ); /** * Next page */ this.iconPicker.find( '.selector-arrow-right' ).on( 'click', $.proxy( function ( e ) { if ( this.currentPage < this.totalPage ) { this.iconPicker.find( '.selector-arrow-left' ).show(); this.currentPage = this.currentPage + 1; this.renderIconContainer(); this.renderIcons(); } if ( this.currentPage === this.totalPage ) { $( e.currentTarget ).hide(); } }, this ) ); /** * Prev page */ this.iconPicker.find( '.selector-arrow-left' ).on( 'click', $.proxy( function ( e ) { if ( this.currentPage > 1 ) { this.iconPicker.find( '.selector-arrow-right' ).show(); this.currentPage = this.currentPage - 1; this.renderIconContainer(); this.renderIcons(); } if ( this.currentPage === 1 ) { $( e.currentTarget ).hide(); } }, this ) ); /** * Realtime Icon Search */ this.iconPicker.find( '.icons-search-input' ).on( 'keyup', $.proxy( function ( e ) { // Get the search string var searchString = $( e.currentTarget ).val(); // If the string is not empty if ( searchString === '' ) { this.resetSearch(); return; } // Set icon search to X to reset search this.searchIcon.removeClass( this.settings.iconSearchClass ); this.searchIcon.addClass( this.settings.iconCancelClass ); // Set this as a search this.isSearch = true; // Reset current page this.currentPage = 1; // Actual search // This has been modified to search the searchValues instead // Then return the value from the source if match is found this.iconsSearched = []; $.grep( this.searchValues, $.proxy( function ( n, i ) { if ( n.toLowerCase().search( searchString.toLowerCase() ) >= 0 ) { this.iconsSearched[ this.iconsSearched.length ] = this.settings.source[ i ]; return true; } }, this ) ); // Filter duplicates this.iconsSearched = this.iconsSearched.filter( this.getOnlyUnique ); // Render icon list this.renderIconContainer(); this.renderIcons(); }, this ) ); /** * Quit search */ this.iconPicker.find( '.selector-search i' ).on( 'click', $.proxy( function () { this.iconPicker.find( '.icons-search-input' ).focus(); this.resetSearch(); }, this ) ); /** * On icon selected */ this.iconContainer.on( 'click', '.fip-box', $.proxy( function ( e ) { this.setSelectedIcon( $( e.currentTarget ).find( 'i' ).attr( 'data-fip-value' ) ); this.toggleIconSelector(); }, this ) ); /** * Stop click propagation on iconpicker */ this.iconPicker.on( 'click', function ( event ) { event.stopPropagation(); return false; } ); /** * On click out */ $( 'html' ).on( 'click', $.proxy( function () { if ( this.open ) { this.toggleIconSelector(); } }, this ) ); }, /** * Init */ init: function () { // Add the theme CSS to the iconPicker this.iconPicker.addClass( this.settings.theme ); // To properly calculate iconPicker height and width // We will first append it to body (with left: -9999px so that it is not visible) this.iconPicker.css( { left: - 9999 } ).appendTo( 'body' ); var iconPickerHeight = this.iconPicker.outerHeight(), iconPickerWidth = this.iconPicker.outerWidth(); // Now reset the iconPicker CSS this.iconPicker.css( { left: '' } ); // Add the icon picker after the select this.element.before( this.iconPicker ); // Hide source element // Instead of doing a display:none, we would rather // make the element invisible // and adjust the margin this.element.css( { visibility: 'hidden', top: 0, position: 'relative', zIndex: '-1', left: '-' + iconPickerWidth + 'px', display: 'none', height: iconPickerHeight + 'px', width: iconPickerWidth + 'px', // Reset all margin, border and padding padding: '0', margin: '0 -' + iconPickerWidth + 'px 0 0', // Left margin adjustment to account for dangling space border: '0 none', verticalAlign: 'top' } ).hide(); // Set the trigger event if ( ! this.element.is( 'select' ) ) { // Determine the event that is fired when user change the field value // Most modern browsers supports input event except IE 7, 8. // IE 9 supports input event but the event is still not fired if I press the backspace key. // Get IE version // https://gist.github.com/padolsey/527683/#comment-7595 var ieVersion = (function () { var v = 3, div = document.createElement( 'div' ), a = div.all || []; while ( div.innerHTML = '', a[ 0 ] ) { ; } return v > 4 ? v : ! v; }()); var el = document.createElement( 'div' ); this.triggerEvent = (ieVersion === 9 || ! ('oninput' in el)) ? [ 'keyup' ] : [ 'input', 'keyup' ]; // Let's keep the keyup event for scripts that listens to it } this.initCategories(); /** * Category changer */ this.selectCategory.on( 'change keyup', $.proxy( function ( e ) { // Don't do anything if not categorized if ( this.isCategorized === false ) { return false; } var targetSelect = $( e.currentTarget ), currentCategory = targetSelect.val(); // Check if all categories are selected if ( targetSelect.val() === 'all' ) { // Restore from the backups // @note These backups must be rebuild on source change, otherwise it will lead to error this.settings.source = this.backupSource; this.searchValues = this.backupSearch; // No? So there is a specified category } else { var key = parseInt( currentCategory, 10 ); if ( this.availableCategories[ key ] ) { this.settings.source = this.availableCategories[ key ]; this.searchValues = this.availableCategoriesSearch[ key ]; } } this.resetSearch(); this.loadIcons(); }, this ) ); /** * On down arrow click */ this.iconPicker.find( '.selector-button' ).on( 'click', $.proxy( function () { // Open/Close the icon picker this.toggleIconSelector(); }, this ) ); /** * Next page */ this.iconPicker.find( '.selector-arrow-right' ).on( 'click', $.proxy( function ( e ) { if ( this.currentPage < this.totalPage ) { this.iconPicker.find( '.selector-arrow-left' ).show(); this.currentPage = this.currentPage + 1; this.renderIconContainer(); this.renderIcons(); } if ( this.currentPage === this.totalPage ) { $( e.currentTarget ).hide(); } }, this ) ); /** * Prev page */ this.iconPicker.find( '.selector-arrow-left' ).on( 'click', $.proxy( function ( e ) { if ( this.currentPage > 1 ) { this.iconPicker.find( '.selector-arrow-right' ).show(); this.currentPage = this.currentPage - 1; this.renderIconContainer(); this.renderIcons(); } if ( this.currentPage === 1 ) { $( e.currentTarget ).hide(); } }, this ) ); /** * Realtime Icon Search */ this.iconPicker.find( '.icons-search-input' ).on( 'keyup', $.proxy( function ( e ) { // Get the search string var searchString = $( e.currentTarget ).val(); // If the string is not empty if ( searchString === '' ) { this.resetSearch(); return; } // Set icon search to X to reset search this.searchIcon.removeClass( this.settings.iconSearchClass ); this.searchIcon.addClass( this.settings.iconCancelClass ); // Set this as a search this.isSearch = true; // Reset current page this.currentPage = 1; // Actual search // This has been modified to search the searchValues instead // Then return the value from the source if match is found this.iconsSearched = []; $.grep( this.searchValues, $.proxy( function ( n, i ) { if ( n.toLowerCase().search( searchString.toLowerCase() ) >= 0 ) { this.iconsSearched[ this.iconsSearched.length ] = this.settings.source[ i ]; return true; } }, this ) ); // Filter duplicates this.iconsSearched = this.iconsSearched.filter( this.getOnlyUnique ); // Render icon list this.renderIconContainer(); this.renderIcons(); }, this ) ); /** * Quit search */ this.iconPicker.find( '.selector-search i' ).on( 'click', $.proxy( function () { this.iconPicker.find( '.icons-search-input' ).focus(); this.resetSearch(); }, this ) ); /** * On icon selected */ this.iconContainer.on( 'click', '.fip-box', $.proxy( function ( e ) { this.setSelectedIcon( $( e.currentTarget ).find( 'i' ).attr( 'data-fip-value' ) ); this.toggleIconSelector(); }, this ) ); /** * Stop click propagation on iconpicker */ this.iconPicker.on( 'click', function ( event ) { event.stopPropagation(); return false; } ); /** * On click out */ $( 'html' ).on( 'click', $.proxy( function () { if ( this.open ) { this.toggleIconSelector(); } }, this ) ); }, initCategories: function () { // If current element is SELECT populate settings.source if ( ! this.settings.source && this.element.is( 'select' ) ) { // Reset the source and searchSource // These will be populated according to the available options this.settings.source = []; this.settings.searchSource = []; // Check if optgroup is present within the select // If it is present then the source has to be grouped if ( this.element.find( 'optgroup' ).length ) { // Set the categorized to true this.isCategorized = true; this.element.find( 'optgroup' ).each( $.proxy( function ( i, el ) { // Get the key of the new category array var thisCategoryKey = this.availableCategories.length, // Create the new option for the selectCategory SELECT field categoryOption = $( '' ).prependTo( this.selectCategory ); // Show it and set default value to all categories this.selectCategory.show().val( 'all' ).trigger( 'change' ); }, /** * Load icons */ loadIcons: function () { // Set the content of the popup as loading this.iconContainer.html( '' ); // If source is set if ( this.settings.source instanceof Array ) { // Render icons this.renderIconContainer(); this.renderIcons(); this.setContainerSelectedItems(); } }, /** * Render icons inside the popup */ renderIconContainer: function () { var offset, iconsPaged = []; // Set a temporary array for icons if ( this.isSearch ) { iconsPaged = this.iconsSearched; } else { iconsPaged = this.settings.source; } // Remove duplicates iconsPaged = [ ...new Set( iconsPaged ) ]; // Count elements this.iconsCount = iconsPaged.length; // Calculate total page number this.totalPage = Math.ceil( this.iconsCount / this.settings.iconsPerPage ); // Hide footer if no pagination is needed if ( this.totalPage > 1 ) { this.iconPicker.find( '.selector-footer' ).show(); } else { this.iconPicker.find( '.selector-footer' ).hide(); } // Set the text for page number index and total icons this.iconPicker.find( '.selector-pages' ).html( this.currentPage + '/' + this.totalPage + ' (' + this.iconsCount + ')' ); // Set the offset for slice offset = (this.currentPage - 1) * this.settings.iconsPerPage; // Should empty icon be shown? if ( this.settings.emptyIcon ) { // Reset icon container HTML and prepend empty icon this.iconContainer.html( '' ); // If not show an error when no icons are found } else if ( iconsPaged.length < 1 ) { this.iconContainer.html( '' ); return; // else empty the container } else { this.iconContainer.html( '' ); } // Set an array of current page icons iconsPaged = iconsPaged.slice( offset, offset + this.settings.iconsPerPage ); this.iconsPaged = iconsPaged; // List icons /*for (var i = 0, item; item = iconsPaged[i++];) { // Set the icon title var flipBoxTitle = item; $.grep(this.settings.source, $.proxy(function (e, i) { if (e === item) { flipBoxTitle = this.searchValues[i]; return true; } return false; }, this)); // Set the icon box $('', { html: '', 'class': 'fip-box', title: flipBoxTitle }).appendTo(this.iconContainer); }*/ }, setContainerSelectedItems: function () { // If no empty icon is allowed and no current value is set or current value is not inside the icon set if ( ! this.settings.emptyIcon && (! this.element.val() || $.inArray( this.element.val(), this.settings.source ) === - 1) ) { // Get the first icon this.setSelectedIcon( this.iconsPaged[ 0 ] ); } else if ( $.inArray( this.element.val(), this.settings.source ) === - 1 ) { // Set empty this.setSelectedIcon(); } else { // Set the default selected icon even if not set this.setSelectedIcon( this.element.val() ); } }, /** * Set Highlighted icon */ setHighlightedIcon: function () { this.iconContainer.find( '.current-icon' ).removeClass( 'current-icon' ); if ( this.currentIcon ) { this.iconContainer.find( '[data-fip-value="' + this.currentIcon + '"]' ).parent( 'span' ).addClass( 'current-icon' ); } }, /** * Set selected icon * * @param {string} theIcon */ setSelectedIcon: function ( theIcon ) { if ( theIcon === this.settings.iconBlockClass ) { theIcon = ''; } // Check if attribute is to be used if ( this.settings.useAttribute ) { if ( theIcon ) { this.iconPicker.find( '.selected-icon' ).html( '' ); } else { this.iconPicker.find( '.selected-icon' ).html( '' ); } // Use class } else { this.iconPicker.find( '.selected-icon' ).html( '' ); } // Set the value of the element and trigger change event this.element.val( (theIcon === '' ? this.settings.emptyIconValue : theIcon ) ).trigger( 'change' ); if ( this.triggerEvent !== null ) { // Trigger other events for ( var eventKey in this.triggerEvent ) { this.element.trigger( this.triggerEvent[ eventKey ] ); } } this.currentIcon = theIcon; this.setHighlightedIcon(); }, /** * Open/close popup (toggle) */ toggleIconSelector: function () { this.open = (! this.open) ? 1 : 0; this.iconPicker.find( '.selector-popup' ).slideToggle( 300 ); this.iconPicker.find( '.selector-button i' ).toggleClass( this.settings.iconDownClass ); this.iconPicker.find( '.selector-button i' ).toggleClass( this.settings.iconUpClass ); if ( this.open ) { this.iconPicker.find( '.icons-search-input' ).focus().select(); if ( ! this.initialized ) { this.renderIconContainer(); this.renderIcons(); this.initialized = true; } } }, renderIcons: function () { for ( var i = 0; i < this.iconsPaged.length; i ++ ) { var item = this.iconsPaged[ i ]; // Set the icon title var flipBoxTitle = item; $.grep( this.settings.source, $.proxy( function ( e, i ) { if ( e === item ) { flipBoxTitle = this.searchValues[ i ]; return true; } return false; }, this ) ); // Set the icon box $( '', { html: '', 'class': 'fip-box', title: flipBoxTitle } ).appendTo( this.iconContainer ); } this.setContainerSelectedItems(); }, /** * Reset search */ resetSearch: function () { // Empty input this.iconPicker.find( '.icons-search-input' ).val( '' ); // Reset search icon class this.searchIcon.removeClass( this.settings.iconCancelClass ); this.searchIcon.addClass( this.settings.iconSearchClass ); // Go back to page 1 and remove back arrow this.iconPicker.find( '.selector-arrow-left' ).hide(); this.currentPage = 1; this.isSearch = false; // Rerender icons this.renderIconContainer(); this.renderIcons(); // Restore pagination if needed if ( this.totalPage > 1 ) { this.iconPicker.find( '.selector-arrow-right' ).show(); } } }; // Lightweight plugin wrapper $.fn.vcFontIconPicker = function ( options ) { // Instantiate the plugin this.each( function () { if ( ! $.data( this, "vcFontIconPicker" ) ) { $.data( this, "vcFontIconPicker", new Plugin( this, options ) ); } } ); // setIcons method this.setIcons = $.proxy( function ( newIcons, iconSearch ) { if ( undefined === newIcons ) { newIcons = false; } if ( undefined === iconSearch ) { iconSearch = false; } this.each( function () { $.data( this, "vcFontIconPicker" ).settings.source = newIcons; $.data( this, "vcFontIconPicker" ).settings.searchSource = iconSearch; $.data( this, "vcFontIconPicker" ).initSourceIndex(); $.data( this, "vcFontIconPicker" ).resetSearch(); $.data( this, "vcFontIconPicker" ).loadIcons(); } ); }, this ); // destroy method this.destroyPicker = $.proxy( function () { this.each( function () { if ( ! $.data( this, "vcFontIconPicker" ) ) { return; } // Remove the iconPicker $.data( this, "vcFontIconPicker" ).iconPicker.remove(); // Reset the CSS $.data( this, "vcFontIconPicker" ).element.css( { visibility: '', top: '', position: '', zIndex: '', left: '', display: 'block', height: '', width: '', padding: '', margin: '', border: '', verticalAlign: '' } ).show(); // destroy data $.removeData( this, "vcFontIconPicker" ); } ); }, this ); // reInit method this.refreshPicker = $.proxy( function ( newOptions ) { if ( ! newOptions ) { newOptions = options; } // First destroy this.destroyPicker(); // Now reset this.each( function () { if ( ! $.data( this, "vcFontIconPicker" ) ) { $.data( this, "vcFontIconPicker", new Plugin( this, newOptions ) ); } } ); }, this ); return this; }; })( jQuery );# Changelog ## [Unreleased] ## [1.0.4] - 2024-05-02 ### Fixed - Fix implicit nullable deprecation warning for PHP 8.4 ## [1.0.3] - 2022-01-10 ### Changed - Update PHPstan to 1.0 - Switched to GitHub Actions ## [1.0.2] - 2020-07-15 ### Added - Minor performance improvements ## [1.0.1] - 2020-06-16 ### Fixed - When calling `Punycode::decode()`, the case flags array would fail to populate when given an empty array. ## [1.0.0] - 2020-06-09 - Initial release

What Exactly Does a Casino Welcome Bonus Include?

Best Casino Sign Up Offers for New Players in 2025

Ever wondered why online casinos practically throw bonuses at new players? A casino sign up offer is simply a welcome gift—usually free spins, bonus cash, or both—that kicks in the moment you create an account and make your first deposit. Claiming it correctly matters, because you’ll often need to enter a promo code or tick a box before paying, and the real benefit is stretching that initial bankroll to explore games you’d otherwise skip. Just check the wagering requirement first so you know how many times you must play through the bonus before you can cash out any winnings.

What Exactly Does a Casino Welcome Bonus Include?

A casino welcome bonus, at its core, is a bundled offer triggered by your first real-money deposit through a sign-up offer. Typically, it includes a deposit match percentage—like 100% up to $500—which instantly doubles your starting bankroll, but it rarely stands alone. Most packages layer in free spins on a specific slot, distributed over several days to keep you returning. Crucially, the fine print locks in

wagering requirements, usually 30-40x the bonus amount, meaning you must bet through that sum before any winnings become withdrawable cash.

You’ll also often see a maximum bet cap per spin (e.g., $5) and a restricted game list, since table games contribute far less to those playthrough targets. The real context here is that a welcome bonus isn’t free money—it’s a structured credit with rules that dictate how you must play, and its true value only emerges if you read the terms tied to that initial sign-up action before claiming.

Breaking Down the Match Percentage and Maximum Bonus Cap

The match percentage and maximum bonus cap define the upper limits of a casino sign up offer. A 100% match up to $200 means the casino doubles your first deposit, but only until you contribute $200; depositing $500 still yields a $200 bonus. To calculate the ideal amount, divide the cap by the match rate—for example, $200 ÷ 100% equals a $200 deposit. For a 50% match up to $300, you must deposit $600 to maximize. Depositing beyond the cap never increases your bonus, so extra funds are simply your own bankroll. The key steps are:

casino sign up offers

  1. Identify the match percentage (e.g., 100%, 50%, 25%).
  2. Confirm the maximum cap (e.g., $200, $500).
  3. Divide the cap by the percentage to find the optimal deposit.
  4. Deposit exactly that amount to hit the maximum bonus cap efficiently.

Free Spins Attachments: How Many and On Which Slots

When evaluating casino sign up offers, the free spins attachments often matter more than the match percentage. Typically, you will see between 10 and 200 spins, but the real question is which slots they unlock. Reputable operators restrict these spins to a shortlist of high-volatility games like *Book of Dead* or *Starburst*, ensuring fair wagering. Poor offers attach spins to obscure, low-RTP titles that rarely pay out. Always check the spin value—$0.10 vs. $0.50 changes your actual bankroll dramatically. For max value, target packages that clearly state both the count and the qualifying game list before you deposit.

  • Counts range from 10 to 200, but 50–100 is the sweet spot for meaningful play.
  • Top-rated slots for these attachments are *Dead or Alive 2*, *Gonzo’s Quest*, and *Big Bass Bonanza*.
  • If a bonus hides the slot names, treat it as a red flag—demand transparency.

Understanding the Difference Between a Deposit Match and a No-Deposit Bonus

A deposit match vs no-deposit bonus hinges on whether you must risk your own funds first. A deposit match, such as 100% up to $200, requires you to fund your account; the casino then mirrors that amount, effectively doubling your bankroll. A no-deposit bonus, in contrast, provides a small cash or free-spins sum immediately after registration, requiring zero financial commitment. The trade-off is clear: deposit matches offer larger potential value but demand an upfront stake, while no-deposit bonuses allow risk-free exploration with lower caps and stricter wagering terms. For practical choice, consider your budget and willingness to commit.

casino sign up offers

  • Deposit matches scale with your contribution; no-deposit bonuses are fixed and usually under $50.
  • No-deposit bonuses often carry higher playthrough multipliers (e.g., 50x versus 30x).
  • Winnings from no-deposit bonuses may have a maximum cashout limit, unlike match funds.
  • Deposit matches may include free spins as a secondary component, but the core is your stake multiplier.

How to Claim Your First Deposit Offer Without Losing Value

To claim your first deposit offer without losing value, start by reading the terms for **wagering requirements**—a 30x rollover beats a 50x one because you keep more of your cash after play. Match your deposit to the bonus cap; depositing beyond it only raises your risk without extra reward. Always use a payment method listed as eligible, since e-wallets often exclude the promo. Trigger the bonus manually via the “My Offers” tab before betting, then prioritize low-house-edge games like blackjack to meet playthrough efficiently. Q: Should you take a smaller deposit bonus? A: Yes, if it has fewer restrictions, because a smaller bonus with a low rollover preserves your real balance better than a giant one with punishing terms. Never opt in if you must forfeit existing winnings—that silently erodes your value.

Step-by-Step Guide to Activating a Promo Code or Auto-Credit Bonus

To activate a promo code, first locate the field labeled “Bonus Code” or “Promo Code,” typically found within the deposit screen or your account’s cashier section. Enter the exact alphanumeric string—case-sensitive—before confirming your deposit amount. For no-code offers, the auto-credit bonus activates automatically upon your qualifying first deposit, but you must still select the bonus in the “Offers” dropdown if presented. After depositing, verify the bonus balance updates instantly; if not, contact live chat within 24 hours, referencing the offer’s terms. Some wagering contributions differ for game types, so check the contribution table before playing. Finally, avoid claiming the bonus before reading the minimum odds or game restrictions, as missteps void eligibility.

casino sign up offers

Q: What if my promo code is rejected during activation?
A: Recheck spacing and capitalization, then ensure the code applies to your deposit method—many codes exclude e-wallets. If still invalid, clear your browser cache or try incognito mode, as session cookies can block the redemption trigger.

When to Use a Prepaid Card vs. E-Wallet to Unlock the Full Reward

To unlock the full reward, match the method to the wagering stage. Use a prepaid card for your initial deposit when the bonus is cashable but comes with strict playthrough—this caps your liability and keeps your bankroll separate, preventing overspend before you meet the requirement. Switch to an e-wallet for subsequent deposits if the offer rewards faster turnover, as e-wallets process withdrawals instantly, letting you bank winnings without friction. Avoid e-wallets if the promo excludes them via bonus terms; check the fine print first. Conversely, skip prepaid cards when reload bonuses demand a higher deposit cap, since e-wallets often lift those limits.

Scenario Best Choice
High playthrough, low deposit cap Prepaid card
Speed-to-withdraw needs E-wallet
Bonus excludes e-wallets Prepaid card
Maximizing reload match amount E-wallet

Avoiding the Cliché Mistake of Skipping the “Opt-In” Checkbox

Many players rush through registration and ignore the tiny checkbox, assuming their bonus appears automatically—that’s the cliché mistake that costs real value. Always activate the opt-in checkbox before depositing, since casinos treat it as your explicit request for the promotion. Without it, your deposit qualifies for nothing, and support often refuses retroactive credit. Check the offer’s terms: some require the box to be ticked at signup, others before your first payment. Treat the checkbox as a commitment, not a formality, because skipping it silently voids your welcome package. A quick screenshot after ticking it proves you complied if issues arise.

Wagering Requirements Explained: What 30x or 40x Actually Means for Your Cashout

When you grab a casino sign up offer, that “30x” or “40x” tag isn’t just a number—it’s the multiplier that decides how much you must bet before your bonus money turns into real cash you can withdraw. Wagering requirements directly tie your playtime to your cashout potential. Say you get a $100 bonus with a 30x playthrough: you’ll need to wager $3,000 total (100 × 30) before a single cent of that bonus becomes withdrawable. A 40x offer demands $4,000, meaning more spins or hands and a higher chance you’ll bust before cashing out. Always check if your deposit counts toward the requirement too.

The lower the multiple, the faster and more realistically you’ll hit that cashout threshold—so don’t ignore it when comparing sign up perks.

If you only play slots, requirements are usually met quicker, but table games may contribute far less—or nothing at all. Plan your bets to clear the target without burning through your bankroll first.

How to Calculate the Total Amount You Must Bet Before Withdrawing

To calculate the total amount you must bet before withdrawing, multiply the bonus value by the wagering requirement. For a $100 bonus at 30x, your total wagering obligation is $3,000 ($100 × 30). However, if the offer includes your deposit in the calculation (e.g., “deposit + bonus” at 40x), add the deposit first: ($100 deposit + $100 bonus) × 40 = $8,000. Always confirm whether contributions from specific games (slots at 100%, table games at 10%) reduce this figure, as they alter your effective required turnover. Tracking your playthrough progress is vital; most casinos show a meter in your account.

  • Check the exact eligible components (bonus only vs. deposit + bonus) in the terms.
  • Divide your remaining wagering requirement by the game’s contribution percentage (e.g., $3,000 ÷ 0.10 = $30,000 for 10% slots).
  • Subtract any winnings from your total to avoid overbetting after meeting the rollover threshold.

Which Games Contribute 100% Toward Playthrough—and Which Add Only 10%

Most slots and scratch cards count 100% toward playthrough, making them your fastest route to clearing a 30x or 40x cashout barrier. However, classic table games like blackjack, roulette, and baccarat often contribute only 10%—or sometimes zero. That means a $200 bonus Rainbet Referral Code with 40x wagering requires $8,000 in slot bets, but if you play roulette at 10% weight, you’d need a staggering $80,000 in wagers before cashing out. Always check a game’s contribution rate in the offer’s terms, as video poker and live dealer titles fall somewhere in between. Picking 100% games preserves your bankroll, while 10% games silently drain it through excessive turnover.

Game Type Contribution Impact on Cashout
Slots 100% Fastest wagering progress
Blackjack/Roulette 10% 10x longer grind

Why Time Limits (e.g., 7 Days vs. 30 Days) Change Your Betting Strategy

A 7-day window versus a 30-day window fundamentally rewires your approach to wagering requirements. With only seven days, you must prioritize high-volume, lower-variance bets to churn through the required amount, often accepting smaller profit margins to guarantee completion before the deadline. Conversely, a 30-day limit allows you to strategically hunt for plus-EV opportunities, waiting for favorable odds or using calculated hedge bets that might take a week to materialize. Time limits directly dictate your bet sizing and game selection, because a short deadline forces aggressive, frequent action, while a longer one rewards patience and selective placement, preventing rushed decisions that erode your expected value.

Choosing Between High Roller Bonuses and Low-Wager Deals

When evaluating casino sign up offers, choosing between high roller bonuses and low-wager deals hinges on your bankroll and play style. High roller bonuses often advertise massive match percentages or cash credits, but they typically carry steep wagering requirements, such as 40x or more on the deposit plus bonus, making real cashout a distant prospect. Low-wager deals, though smaller in headline value, prioritize clearing ease—often 5x to 15x on the bonus only—which suits recreational players who value actual withdrawals over theoretical playtime. If you deposit large sums and can stomach volatility, chase the high-multiplier packages; if you prefer consistent, low-risk sessions, accept the smaller match with transparent terms. Always compare the effective cost per spin, not just the bonus figure, because a tiny wager requirement can outperform a huge bonus that you’ll never clear.

The strongest signal is the ratio of wager requirement to your average stake—if it exceeds your expected session bankroll turnover by threefold, the deal is mathematically negative for you.

Ultimately, your decision should reflect whether you prioritize the thrill of a big balance or the practicality of a withdrawable win.

When a Small Match with 5x Requirements Beats a 200% Match with 50x

A 200% match with 50x wagering may look larger, but a small 100% match at 5x often wins in real cash terms. To clear the 50x offer on a $100 deposit, you must wager $10,000 (bonus plus deposit multiplied), whereas the 5x deal on a $50 deposit demands only $250. Effective wagering burden determines actual value, not headline percentage. If you play low-volatility slots or table games with slow bet accumulation, the smaller match clears faster and leaves you with more withdrawable winnings. The high-roller bonus risks trapping your bankroll in prolonged play, making the low-wager alternative mathematically superior for casual or conservative sessions.

  1. Calculate total playthrough (bonus + deposit × multiplier).
  2. Estimate your realistic play speed and volatility tolerance.
  3. Choose the deal whose cleared amount exceeds the larger match’s likely residual value.

How to Spot a “Cashable” Bonus versus a “Sticky” Bonus That Deletes Profits

To distinguish a cashable bonus from a sticky one, read the terms for the word “withdrawable” applied to the bonus balance itself. A cashable bonus converts to real money after wagering, so your profit is paid out in full; a sticky bonus remains locked on the server, and the casino deducts its original amount from your final withdrawal, leaving you only excess winnings. Check the “maximum cashout” line—if it equals your deposit plus bonus, that is cashable, but if it caps at a multiple of the deposit only, it is likely sticky. Spotting a sticky bonus often hinges on phrases like “bonus excluded from withdrawal”. Even a low-wager sticky deal can erase your entire profit if you win early, because the bonus amount is reclaimed before payout. Always scan the FAQ for “cashable” versus “non-cashable” definitions before opting in.

Comparing Weekly Reload Offers vs. One-Time Sign-Up Perks for Long-Term Play

When weighing weekly reload offers vs. one-time sign-up perks for long-term play, the key is mapping your deposit frequency against the initial bonus’s wagering clock. A sign-up perk often inflates your bankroll instantly, but its high playthrough requirement can force you into extended betting patterns that may not suit a casual schedule. Weekly reloads, though smaller in percentage, typically carry lower wagering multipliers and reset every few days, letting you rebuild funds steadily without pressure. For consistent players, reloads preserve momentum because they reward every deposit, while a sign-up bonus only pays off once. If you deposit monthly, a single generous welcome match wins; if you play weekly, reloads generate more cumulative value over a quarter.

Q: Which fuels better bankroll growth for a player depositing $100 every week for six months?
A: Weekly reloads—assuming a 20% match versus a 100% one-time bonus, the sign-up gives $100 once, but reloads give $20 weekly, totaling $520 over 26 weeks, though check each reload’s turnover limit to confirm practical usability.

Common Traps in Welcome Packages and How to Sidestep Them

Welcome packages often hide playthrough requirements that are far steeper than they appear, so always divide the bonus by the wagering multiple before committing. A common trap is the game contribution cap, where slots count 100% but table games count a mere 10%, silently extending your grind. Sidestep this by filtering for games that contribute fully to the active bonus before you spin. Another snare is the max bet limit during wagering—exceeding it voids your entire win instantly. Also, watch for short expiry windows; a 24-hour deadline forces rushed, losing play. The sharpest move is to read the terms and conditions for “bonus abuse” clauses and cashout caps, then treat the package as a loan, not a gift. Only claim if the math favors your bankroll.

Why Game Restrictions on Free Spins Often kill Your Momentum

Free spins tethered to select slots can halt your session before it starts. You cash in a sign-up bonus, only to find your spins limited to a single, unfamiliar game with a low hit frequency—often one that churns through your theoretical wins slowly. This restriction kills your momentum because you cannot pivot to higher-volatility titles when the bonus round stalls. Worse, wagering requirements tied to those restricted spins force you to grind on a game you never chose, draining your bankroll and patience. Why do game restrictions on free spins kill your momentum so effectively? Because every forced spin on an unproven slot reduces your ability to test strategies, chase hot streaks, or simply enjoy the pace that suits your style. If the game performs poorly, your bonus dies—and so does your urge to continue.

Game restrictions on free spins often trap you in low-return loops, so check the eligible games list before claiming, and deposit elsewhere if the featured slot feels unfamiliar or slow.

Understanding Max Bet Limits While the Bonus Is Active (and How to Avoid a Voided Win)

While a welcome bonus is active, the maximum bet per spin or wager is a hard ceiling—typically €5 or equivalent—and exceeding it, even once, triggers a voided win and forfeiture of the entire bonus balance. To avoid this, treat the limit as a non-negotiable parameter, not a suggestion for aggressive play. First, locate the exact cap in the bonus terms, as it may differ for table games versus slots. Second, before placing any bet, manually check the stake field to confirm it sits below the threshold. Third, after every win, review your bet history to ensure no accidental overage occurred. If you do exceed it, stop wagering immediately; the casino will likely flag the round, and further play only compounds the violation.

What Happens to Your Bonus Balance If You Request an Early Withdrawal

Requesting an early withdrawal while a welcome bonus is active typically triggers a **forfeiture of your entire bonus balance**, including any pending wagering progress. Casinos treat this as an opt-out: your real-money funds are paid out, but the bonus amount and all associated winnings are removed immediately. Some operators also apply a penalty, such as a capped cashout or a small processing fee, acting as a deterrent. If you’re stuck on a high wagering requirement, your only clean escape is to contact support and confirm whether the forfeit is automatic or requires a formal request. Never assume a partial withdrawal is allowed—most platforms void the bonus first.

Scroll to Top