/* 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":79938,"date":"2026-05-23T00:45:39","date_gmt":"2026-05-23T00:45:39","guid":{"rendered":"https:\/\/klecet.edu.in\/alumni\/?p=79938"},"modified":"2026-05-23T00:45:41","modified_gmt":"2026-05-23T00:45:41","slug":"play-free-ports-32178-casino-slot-demos-6","status":"publish","type":"post","link":"http:\/\/klecet.edu.in\/alumni\/play-free-ports-32178-casino-slot-demos-6\/","title":{"rendered":"Play Free Ports 32,178+ Casino Slot Demos"},"content":{"rendered":"

As Big Bass Splash<\/a> the wagering criteria to the welcome bonus is heavy, the new two hundred bonus spins are a great way to find a good be to the casino and its particular offerings. The new casino does this by employing 128-piece protection by the Thawte, as the site as well as holds a safe certificate courtesy of Symantec. Ports Heaven holds a license on the Uk Gambling Commission, meaning that it should meet strict protection criteria.<\/p>\n

To know how the new cashback bonus works and you can what you have to do so you can qualify, check out the Fine print prior to accepting the advantage. The new cashback option is some other advanced give that works such as a keen insurance policy to protect players out of a streak out of bad luck. The new also offers are different according to the latest promotions but can are bonus spins, Golden Chips, and you can a variety of bonus also offers. You’ll found special casino codes which can be redeemed thanks to the new cashier, without needing to create a deposit. The new after-bet bonus ‘s the lone exception as it can only be taken after you\u2019ve played enough game so you can allege the cash. The biggest work for that comes with such bonus is you to as it\u2019s just granted following the bet criteria had been met \u2013 it can be used as soon as it\u2019s deposited to the your account.<\/p>\n

Such bonuses activate instantly from the internet-based platform, allowing you to feel premium ports without any upfront funding. As opposed to forcing players so you can download independent apps, Ports Garden’s mobile-optimized instant play delivers a full casino feel through your phone’s browser. RTG’s optimized game motors send easy gameplay without sacrificing graphic quality or bonus has. That it browser-based approach mode you could dive to the game such as Tarot Destiny Ports or Scam all the way Ports within a few minutes. Old-fashioned casino app downloads is also eat up dear storage and you can slow down your device. No downloads, no waiting, no stores questions \u2013 just pure gambling step you to starts as soon as you click play.<\/p>\n

New users can enjoy welcome bundles, when you are normal players can benefit out of cashback also offers, loyalty apps, and you can free spins. The quality wagering criteria to have bonus spins is calculated based on the full successful contribution. Such as, if you make a good \u00a3fifty deposit, you could found \u00a3fifty in the bonus currency and you can twenty five bonus spins which can be used in the new Kingdom Go up slot game suite.<\/p>\n

The various game available plays a serious role in the drawing players, giving something for everyone, whether they is beginners or experienced bettors. As the what you runs through your browser, there\u2019s no risk of downloading dangerous app. Protection is important, and you can Instant Play Casinos are made with this in mind. Status also are automatic, so you\u2019ll always have the new models without needing to set up something the new.<\/p>\n

Your goal would be to make the best five-card hand you can using the cards you\u2019re dealt; you also get the chance to hang, Twice and you can Twice Half of to add an extra dimension to the game \u2013 and several of our game also offer massive progressive jackpots so you can play for. With over three hundred casino games to choose from, it can be difficult to decide which to play. Opening an account takes just minutes \u2013 and all the new players are eligible so you can allege a good one hundred% bonus of up to \u20acone hundred (as well as two hundred free spins) straight away! Many of our game has massive progressive jackpots to play to have, and we has amount of less common game and you can unusual variants on how to enjoy, such as arcade game and you can a live Casino that uses the new experience out of a professional broker.<\/p>\n

To have Uk-based players, the new Cura\u00e7ao licence mode Spins Heaven is classified as the a non-GamStop platform. This is a valid offshore regulatory structure used by a serious amount of online casinos worldwide, though it varies drastically on the UKGC in terms of player protection criteria. Wrote processing window highly recommend e-purse withdrawals is treated efficiently, even if first withdrawals can take extended on account of name verification checks. To have players who prefer a strategy-based feel, Spins Heaven’s table game section talks about Blackjack, Roulette, and you can Baccarat around the multiple code variants.<\/p>\n

Even if analysis episodes and you can wagering criteria can vary out of system so you can system, the idea would be to create bets according to the research out of earlier fashion. Williams Interactive came into existence the new dawn out of property-based casino gambling which is credited to the innovation out of multiple-line and you can multiple-coin slot gameplay. Aristocrat is a keen Australian-based gambling company that offers its features so you can over two hundred jurisdictions across the globe.<\/p>\n

Hence, Ports Heaven takes plenty of steps to make sure you get it. Safety and security are important for your peace of mind. The new casino spends RNGs in all casino games to make sure done randomness.<\/p>\n

It\u2019s you can to turn you to bonus currency to the withdrawable successful as the well, that’s one of the best parts of saying an online casino bonus. To have players, everything you need to do is load the game up whether or not you\u2019re also to the mobile internet or has downloaded an app, and the slot is to scale to the mobile screen and be up and running. ✅ You could allege bonuses to strengthen your play.✅ No sign-up or verification is required to play. All the ports play is based on random luck for the most region, so that\u2019s as good a means as the one to decide a different game to try. And if it\u2019s just mode a complete bet, you\u2019re also most likely to play a good \u201crepaired lines\u201d or \u201call the means pays\u201d slot, where the amount of lines is pre-calculated. For me, it\u2019s on the templates you to click, gameplay you to has me engaged, and you can a sentimental or fun factor that makes me need to hit \u201cspin\u201d over and over.<\/p>\n

That it welcome package is an excellent solution to initiate exploring the casino\u2019s offerings, that have free spins tend to related to popular slot game. The new players is invited that have an attractive sign-up bonus, and that generally comes with a match deposit bonus and you can free spins. Ports Heaven is known for its generous bonuses and you can promotions tailored to compliment the player feel. The new live casino has popular game such as Live Roulette, Live Blackjack, and you can Live Baccarat, bringing a keen immersive feel you to closely mirrors the air out of a good land-based casino. As well as its comprehensive slot collection, Ports Heaven will bring a strong group of table game, as well as multiple differences out of blackjack, roulette, baccarat, and you can poker.<\/p>\n

CasinoBeats is your leading guide to the online and you can property-based casino world. Our editorial group works independently out of commercial interests, ensuring that reviews, news, and you can advice is based solely to the merit and you can reader worth. CasinoBeats is invested in bringing exact, independent, and you can objective exposure of your online gambling world, backed by comprehensive search, hands-to the analysis, and you can strict truth-checking. Raging Bull is our best instant\u2011play find thanks to its solid game library and you can prompt, flexible banking options, when you are Crazy Casino remains the best no\u2011download option for seamless mobile and you can desktop play.<\/p>\n

After you play free casino ports, you\u2019ll get to feel all the fun has and you can templates of your game. This program, titled RNG (Random Number Generator), guarantees all the players have the same odds of successful less than equal criteria. Everything you need to play free online ports is an online relationship.<\/p>\n","protected":false},"excerpt":{"rendered":"

As Big Bass Splash the wagering criteria to the welcome bonus is heavy, the new two hundred bonus spins are a great way to find a good be to the casino and its particular offerings. The new casino does this by employing 128-piece protection by the Thawte, as the site\u2026<\/p>\n

Continue reading<\/span><\/i><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-79938","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"_links":{"self":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/79938","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/comments?post=79938"}],"version-history":[{"count":1,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/79938\/revisions"}],"predecessor-version":[{"id":79939,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/posts\/79938\/revisions\/79939"}],"wp:attachment":[{"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/media?parent=79938"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/categories?post=79938"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/klecet.edu.in\/alumni\/wp-json\/wp\/v2\/tags?post=79938"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}