/* ========================================================= * composer-view.js v0.2.1 * ========================================================= * Copyright 2013 Wpbakery * * Visual composer backbone/underscore version * ========================================================= */ (function ( $ ) { var i18n = window.i18nLocale, store = vc.storage, Shortcodes = vc.shortcodes; vc.templateOptions = { default: { evaluate: /<%([\s\S]+?)%>/g, interpolate: /<%=([\s\S]+?)%>/g, escape: /<%-([\s\S]+?)%>/g }, custom: { evaluate: /<#([\s\S]+?)#>/g, interpolate: /\{\{\{([\s\S]+?)\}\}\}/g, escape: /\{\{([^\}]+?)\}\}(?!\})/g } }; vc.builder = { toString: function ( model, type ) { var params = model.get( 'params' ), content = _.isString( params.content ) ? params.content : ''; return wp.shortcode.string( { tag: model.get( 'shortcode' ), attrs: _.omit( params, 'content' ), content: content, type: _.isString( type ) ? type : '' } ); } }; /** * Default view for shortcode as block inside Visual composer design mode. * @type {*} */ vc.clone_index = 1; vc.saved_custom_css = false; var ShortcodeView = vc.shortcode_view = Backbone.View.extend( { tagName: 'div', $content: '', use_default_content: false, params: {}, events: { 'click .column_delete,.vc_control-btn-delete': 'deleteShortcode', 'click .column_add,.vc_control-btn-prepend': 'addElement', 'click .column_edit,.vc_control-btn-edit, .column_edit_trigger': 'editElement', 'click .column_clone,.vc_control-btn-clone': 'clone', 'mousemove': 'checkControlsPosition' }, removeView: function () { vc.closeActivePanel( this.model ); this.remove(); }, checkControlsPosition: function () { if ( ! this.$controls_buttons ) { return; } var window_top, element_position_top, new_position, element_height = this.$el.height(), window_height = $( window ).height(); if ( element_height > window_height ) { window_top = $( window ).scrollTop(); element_position_top = this.$el.offset().top; new_position = (window_top - element_position_top) + $( window ).height() / 2; if ( 40 < new_position && new_position < element_height ) { this.$controls_buttons.css( 'top', new_position ); } else if ( new_position > element_height ) { this.$controls_buttons.css( 'top', element_height - 40 ); } else { this.$controls_buttons.css( 'top', 40 ); } } }, initialize: function () { this.model.bind( 'destroy', this.removeView, this ); this.model.bind( 'change:params', this.changeShortcodeParams, this ); this.model.bind( 'change_parent_id', this.changeShortcodeParent, this ); this.createParams(); }, hasUserAccess: function () { var shortcodeTag; shortcodeTag = this.model.get( 'shortcode' ); if ( - 1 < _.indexOf( [ "vc_row", "vc_column", "vc_row_inner", "vc_column_inner" ], shortcodeTag ) ) { return true; // we cannot block controls for these shortcodes; } if ( ! _.every( vc.roles.current_user, function ( role ) { return ! (! _.isUndefined( vc.roles[ role ] ) && ! _.isUndefined( vc.roles[ role ][ 'shortcodes' ] ) && _.isUndefined( vc.roles[ role ][ 'shortcodes' ][ shortcodeTag ] )); } ) ) { return false; } return true; }, createParams: function () { var tag, settings, params; tag = this.model.get( 'shortcode' ); settings = _.isObject( vc.map[ tag ] ) && _.isArray( vc.map[ tag ].params ) ? vc.map[ tag ].params : []; params = this.model.get( 'params' ); this.params = {}; _.each( settings, function ( param ) { this.params[ param.param_name ] = param; }, this ); }, setContent: function () { this.$content = this.$el.find( '> .wpb_element_wrapper > .vc_container_for_children,' + ' > .vc_element-wrapper > .vc_container_for_children' ); }, setEmpty: function () { }, unsetEmpty: function () { }, checkIsEmpty: function () { if ( this.model.get( 'parent_id' ) ) { vc.app.views[ this.model.get( 'parent_id' ) ].checkIsEmpty(); } }, /** * Convert html into correct element * @param html */ html2element: function ( html ) { var attributes = {}, $template; if ( _.isString( html ) ) { this.template = _.template( html ); $template = $( this.template( this.model.toJSON(), vc.templateOptions.default ).trim() ); } else { this.template = html; $template = html; } _.each( $template.get( 0 ).attributes, function ( attr ) { attributes[ attr.name ] = attr.value; } ); this.$el.attr( attributes ).html( $template.html() ); this.setContent(); this.renderContent(); }, render: function () { var $shortcode_template_el = $( '#vc_shortcode-template-' + this.model.get( 'shortcode' ) ); if ( $shortcode_template_el.is( 'script' ) ) { this.html2element( _.template( $shortcode_template_el.html(), this.model.toJSON(), vc.templateOptions.default ) ); } else { var params = this.model.get( 'params' ); $.ajax( { type: 'POST', url: window.ajaxurl, data: { action: 'wpb_get_element_backend_html', data_element: this.model.get( 'shortcode' ), data_width: _.isUndefined( params.width ) ? '1/1' : params.width, _vcnonce: window.vcAdminNonce }, dataType: 'html', context: this } ).done( function ( html ) { this.html2element( html ); } ); } this.model.view = this; this.$controls_buttons = this.$el.find( '.vc_controls > :first' ); return this; }, renderContent: function () { this.$el.attr( 'data-model-id', this.model.get( 'id' ) ); this.$el.data( 'model', this.model ); return this; }, changedContent: function ( view ) { }, _loadDefaults: function () { var tag, hasChilds; tag = this.model.get( 'shortcode' ); hasChilds = ! ! vc.shortcodes.where( { parent_id: this.model.get( 'id' ) } ).length; if ( ! hasChilds && true === this.use_default_content && _.isObject( vc.map[ tag ] ) && _.isString( vc.map[ tag ].default_content ) && vc.map[ tag ].default_content.length ) { this.use_default_content = false; Shortcodes.createFromString( vc.map[ tag ].default_content, this.model ); } }, _callJsCallback: function () { //Fire INIT callback if it is defined var tag = this.model.get( 'shortcode' ); if ( _.isObject( vc.map[ tag ] ) && _.isObject( vc.map[ tag ].js_callback ) && ! _.isUndefined( vc.map[ tag ].js_callback.init ) ) { var fn = vc.map[ tag ].js_callback.init; window[ fn ]( this.$el ); } }, ready: function ( e ) { this._loadDefaults(); this._callJsCallback(); if ( this.model.get( 'parent_id' ) && _.isObject( vc.app.views[ this.model.get( 'parent_id' ) ] ) ) { vc.app.views[ this.model.get( 'parent_id' ) ].changedContent( this ); } _.defer( _.bind( function () { vc.events.trigger( 'shortcodeView:ready' ); vc.events.trigger( 'shortcodeView:ready:' + this.model.get( 'shortcode' ) ); }, this ) ); return this; }, // View utils {{ addShortcode: function ( view, method ) { var before_shortcode; before_shortcode = _.last( vc.shortcodes.filter( function ( shortcode ) { return shortcode.get( 'parent_id' ) === this.get( 'parent_id' ) && parseFloat( shortcode.get( 'order' ) ) < parseFloat( this.get( 'order' ) ); }, view.model ) ); if ( before_shortcode ) { view.render().$el.insertAfter( '[data-model-id=' + before_shortcode.id + ']' ); } else if ( 'append' === method ) { this.$content.append( view.render().el ); } else { this.$content.prepend( view.render().el ); } }, changeShortcodeParams: function ( model ) { var tag, params, settings, view; // Triggered when shortcode being updated tag = model.get( 'shortcode' ); params = model.get( 'params' ); settings = vc.map[ tag ]; _.defer( function () { vc.events.trigger( 'backend.shortcodeViewChangeParams:' + tag ); } ); if ( _.isArray( settings.params ) ) { _.each( settings.params, function ( param_settings ) { var name, value, $wrapper, label_value, $admin_label; name = param_settings.param_name; value = params[ name ]; $wrapper = this.$el.find( '> .wpb_element_wrapper, > .vc_element-wrapper' ); label_value = value; $admin_label = $wrapper.children( '.admin_label_' + name ); if ( _.isObject( vc.atts[ param_settings.type ] ) && _.isFunction( vc.atts[ param_settings.type ].render ) ) { value = vc.atts[ param_settings.type ].render.call( this, param_settings, value ); } if ( $wrapper.children( '.' + param_settings.param_name ).is( 'input,textarea,select' ) ) { $wrapper.children( '[name=' + param_settings.param_name + ']' ).val( value ); } else if ( $wrapper.children( '.' + param_settings.param_name ).is( 'iframe' ) ) { $wrapper.children( '[name=' + param_settings.param_name + ']' ).attr( 'src', value ); } else if ( $wrapper.children( '.' + param_settings.param_name ).is( 'img' ) ) { var $img; $img = $wrapper.children( '[name=' + param_settings.param_name + ']' ); if ( value && value.match( /^\d+$/ ) ) { $.ajax( { type: 'POST', url: window.ajaxurl, data: { action: 'wpb_single_image_src', content: value, size: 'thumbnail', _vcnonce: window.vcAdminNonce }, dataType: 'html', context: this } ).done( function ( url ) { $img.attr( 'src', url ); } ); } else if ( value ) { $img.attr( 'src', value ); } } else { $wrapper.children( '[name=' + param_settings.param_name + ']' ).html( value ? value : '' ); } if ( $admin_label.length ) { var inverted_value; if ( '' === value || _.isUndefined( value ) ) { $admin_label.hide().addClass( 'hidden-label' ); } else { if ( _.isObject( param_settings.value ) && ! _.isArray( param_settings.value ) && 'checkbox' === param_settings.type ) { inverted_value = _.invert( param_settings.value ); label_value = _.map( value.split( /[\s]*\,[\s]*/ ), function ( val ) { return _.isString( inverted_value[ val ] ) ? inverted_value[ val ] : val; } ).join( ', ' ); } else if ( _.isObject( param_settings.value ) && ! _.isArray( param_settings.value ) ) { inverted_value = _.invert( param_settings.value ); label_value = _.isString( inverted_value[ value ] ) ? inverted_value[ value ] : value; } $admin_label.html( ': ' + label_value ); $admin_label.show().removeClass( 'hidden-label' ); } } }, this ); } view = vc.app.views[ model.get( 'parent_id' ) ]; if ( false !== model.get( 'parent_id' ) && _.isObject( view ) ) { view.checkIsEmpty(); } }, changeShortcodeParent: function ( model ) { if ( false === this.model.get( 'parent_id' ) ) { return model; } var $parent_view = $( '[data-model-id=' + this.model.get( 'parent_id' ) + ']' ), view = vc.app.views[ this.model.get( 'parent_id' ) ]; this.$el.appendTo( $parent_view.find( '> .wpb_element_wrapper > .wpb_column_container,' + ' > .vc_element-wrapper > .wpb_column_container' ) ); view.checkIsEmpty(); }, // }} // Event Actions {{ deleteShortcode: function ( e ) { if ( _.isObject( e ) ) { e.preventDefault(); } var answer = confirm( i18n.press_ok_to_delete_section ); if ( true === answer ) { this.model.destroy(); } }, addElement: function ( e ) { _.isObject( e ) && e.preventDefault(); vc.add_element_block_view.render( this.model, ! _.isObject( e ) || ! $( e.currentTarget ).closest( '.bottom-controls' ).hasClass( 'bottom-controls' ) ); }, editElement: function ( e ) { if ( _.isObject( e ) ) { e.preventDefault(); } if ( ! vc.active_panel || ! vc.active_panel.model || ! this.model || ( vc.active_panel.model && this.model && vc.active_panel.model.get( 'id' ) != this.model.get( 'id' ) ) ) { vc.closeActivePanel(); vc.edit_element_block_view.render( this.model ); } }, clone: function ( e ) { if ( _.isObject( e ) ) { e.preventDefault(); } vc.clone_index = vc.clone_index / 10; return this.cloneModel( this.model, this.model.get( 'parent_id' ) ); }, cloneModel: function ( model, parent_id, save_order ) { var new_order, model_clone, params, tag; new_order = _.isBoolean( save_order ) && true === save_order ? model.get( 'order' ) : parseFloat( model.get( 'order' ) ) + vc.clone_index; params = _.extend( {}, model.get( 'params' ) ); tag = model.get( 'shortcode' ); model_clone = Shortcodes.create( { shortcode: tag, id: window.vc_guid(), parent_id: parent_id, order: new_order, cloned: true, cloned_from: model.toJSON(), params: params } ); _.each( Shortcodes.where( { parent_id: model.id } ), function ( shortcode ) { this.cloneModel( shortcode, model_clone.get( 'id' ), true ); }, this ); return model_clone; } } ); var VisualComposer = vc.visualComposerView = Backbone.View.extend( { el: $( '#wpb_visual_composer' ), views: {}, disableFixedNav: false, events: { "click #wpb-add-new-row": 'createRow', 'click #vc_post-settings-button': 'editSettings', 'click #vc_add-new-element, .vc_add-element-button, .vc_add-element-not-empty-button': 'addElement', 'click .vc_add-text-block-button': 'addTextBlock', 'click .wpb_switch-to-composer': 'switchComposer', 'click #vc_templates-editor-button': 'openTemplatesWindow', 'click #vc_templates-more-layouts': 'openTemplatesWindow', 'click .vc_template[data-template_unique_id] > .wpb_wrapper': 'loadDefaultTemplate', 'click #wpb-save-post': 'save', 'click .vc_control-preview': 'preview' }, initialize: function () { this.accessPolicy = $( '.vc_js_composer_group_access_show_rule' ).val(); if ( 'no' === this.accessPolicy ) { return false; } this.buildRelevance(); _.bindAll( this, 'switchComposer', 'dropButton', 'processScroll', 'updateRowsSorting', 'updateElementsSorting' ); vc.events.on( 'shortcodes:add', vcAddShortcodeDefaultParams, this ); vc.events.on( 'shortcodes:add', vc.atts.addShortcodeIdParam, this ); // update vc_grid_id on shortcode adding vc.events.on( 'shortcodes:add', this.addShortcode, this ); vc.events.on( 'shortcodes:destroy', this.checkEmpty, this ); Shortcodes.on( 'change:params', this.changeParamsEvents, this ); Shortcodes.on( 'reset', this.addAll, this ); this.render(); }, changeParamsEvents: function ( model ) { vc.events.triggerShortcodeEvents( 'update', model ); }, render: function () { var front = ''; // Find required elemnts of the view. this.$vcStatus = $( '#wpb_vc_js_status' ); this.$metablock_content = $( '.metabox-composer-content' ); this.$content = $( "#visual_composer_content" ); this.$post = $( '#postdivrich' ); this.$loading_block = $( '#vc_logo' ); if ( 'only' !== this.accessPolicy ) { if ( vc_frontend_enabled ) { front = '' + window.i18nLocale.main_button_title_frontend_editor + ''; } this.$buttonsContainer = $( '
' + window.i18nLocale.main_button_title_backend_editor + '' + front + '
' ).insertAfter( 'div#titlediv' ); this.$switchButton = this.$buttonsContainer.find( '.wpb_switch-to-composer' ); this.$switchButton.click( this.switchComposer ); } vc.add_element_block_view = new vc.AddElementUIPanelBackendEditor( { el: '#vc_ui-panel-add-element' } ); vc.edit_element_block_view = new vc.EditElementUIPanel( { el: '#vc_ui-panel-edit-element' } ); /** * @deprecated 4.4 * @type {vc.TemplatesEditorPanelViewBackendEditor} */ vc.templates_editor_view = new vc.TemplatesEditorPanelViewBackendEditor( { el: '#vc_templates-editor' } ); vc.templates_panel_view = new vc.TemplateWindowUIPanelBackendEditor( { el: '#vc_ui-panel-templates' } ); vc.post_settings_view = new vc.PostSettingsUIPanelBackendEditor( { el: '#vc_ui-panel-post-settings' } ); this.setSortable(); this.setDraggable(); vc.is_mobile = 0 < $( 'body.mobile' ).length; vc.saved_custom_css = $( '#wpb_custom_post_css_field' ).val(); vc.updateSettingsBadge(); /** * @since 4.5 */ _.defer( function () { vc.events.trigger( 'app.render' ); } ); return this; }, addAll: function () { this.views = {}; this.$content.removeClass( 'loading' ).empty(); this.addChild( false ); this.checkEmpty(); this.$loading_block.removeClass( 'vc_ajax-loading' ); this.$metablock_content.removeClass( 'vc_loading-shortcodes' ); }, addChild: function ( parent_id ) { _.each( vc.shortcodes.where( { parent_id: parent_id } ), function ( shortcode ) { this.appendShortcode( shortcode ); this.setSortable(); this.addChild( shortcode.get( 'id' ) ); }, this ); }, getView: function ( model ) { var view; if ( _.isObject( vc.map[ model.get( 'shortcode' ) ] ) && _.isString( vc.map[ model.get( 'shortcode' ) ].js_view ) && vc.map[ model.get( 'shortcode' ) ].js_view.length && ! _.isUndefined( window[ window.vc.map[ model.get( 'shortcode' ) ].js_view ] ) ) { view = new window[ window.vc.map[ model.get( 'shortcode' ) ].js_view ]( { model: model } ); } else { view = new ShortcodeView( { model: model } ); } model.set( { view: view } ); return view; }, setDraggable: function () { $( '#wpb-add-new-element, #wpb-add-new-row' ).draggable( { helper: function () { return $( '
' ).appendTo( 'body' ); }, zIndex: 99999, // cursorAt: { left: 10, top : 20 }, cursor: "move", // appendTo: "body", revert: "invalid", start: function ( event, ui ) { $( "#drag_placeholder" ).addClass( "column_placeholder" ).html( window.i18nLocale.drag_drop_me_in_column ); } } ); this.$content.droppable( { greedy: true, accept: ".dropable_el,.dropable_row", hoverClass: "wpb_ui-state-active", drop: this.dropButton } ); }, dropButton: function ( event, ui ) { if ( ui.draggable.is( '#wpb-add-new-element' ) ) { this.addElement(); } else if ( ui.draggable.is( '#wpb-add-new-row' ) ) { this.createRow(); } }, appendShortcode: function ( model ) { var view, parentModelView, params; view = this.getView( model ); params = _.extend( vc.getDefaults( model.get( 'shortcode' ) ), model.get( 'params' ) ); model.set( 'params', params, { silent: true } ); parentModelView = false !== model.get( 'parent_id' ) ? this.views[ model.get( 'parent_id' ) ] : false; this.views[ model.id ] = view; if ( model.get( 'parent_id' ) ) { var parentView; parentView = this.views[ model.get( 'parent_id' ) ]; parentView.unsetEmpty(); } if ( parentModelView ) { parentModelView.addShortcode( view, 'append' ); } else { this.$content.append( view.render().el ); } view.ready(); view.changeShortcodeParams( model ); // Refactor view.checkIsEmpty(); this.setNotEmpty(); }, addShortcode: function ( model ) { var view, parentModelView, params; params = _.extend( vc.getDefaults( model.get( 'shortcode' ) ), model.get( 'params' ) ); model.set( 'params', params, { silent: true } ); view = this.getView( model ); parentModelView = false !== model.get( 'parent_id' ) ? this.views[ model.get( 'parent_id' ) ] : false; view.use_default_content = true !== model.get( 'cloned' ); this.views[ model.id ] = view; if ( parentModelView ) { parentModelView.addShortcode( view ); parentModelView.checkIsEmpty(); var self; self = this; _.defer( function () { view.changeShortcodeParams && view.changeShortcodeParams( model ); view.ready(); self.setSortable(); self.setNotEmpty(); } ); } else { this.addRow( view ); _.defer( function () { view.changeShortcodeParams && view.changeShortcodeParams( model ); } ); } }, addRow: function ( view ) { var before_shortcode; before_shortcode = _.last( vc.shortcodes.filter( function ( shortcode ) { return false === shortcode.get( 'parent_id' ) && parseFloat( shortcode.get( 'order' ) ) < parseFloat( this.get( 'order' ) ); }, view.model ) ); if ( before_shortcode ) { view.render().$el.insertAfter( '[data-model-id=' + before_shortcode.id + ']' ); } else { this.$content.append( view.render().el ); } }, addTextBlock: function ( e ) { var row, column, params; e.preventDefault(); row = Shortcodes.create( { shortcode: 'vc_row' } ); column = Shortcodes.create( { shortcode: 'vc_column', params: { width: '1/1' }, parent_id: row.id, root_id: row.id } ); params = vc.getDefaults( 'vc_column_text' ); if ( 'undefined' !== typeof(window.vc_settings_presets[ 'vc_column_text' ]) ) { params = _.extend( params, window.vc_settings_presets[ 'vc_column_text' ] ); } return Shortcodes.create( { shortcode: 'vc_column_text', parent_id: column.id, root_id: row.id, params: params } ); }, /** * Create row */ createRow: function () { var row = Shortcodes.create( { shortcode: 'vc_row' } ); Shortcodes.create( { shortcode: 'vc_column', params: { width: '1/1' }, parent_id: row.id, root_id: row.id } ); return row; }, /** * Add Element with a help of modal view. */ addElement: function ( e ) { _.isObject( e ) && e.preventDefault(); vc.add_element_block_view.render( false ); }, /** * @deprecated 4.4 use openTemplatesWindow * @param e */ openTemplatesEditor: function ( e ) { e && e.preventDefault(); vc.templates_editor_view.render().show(); }, openTemplatesWindow: function ( e ) { e && e.preventDefault(); if ( $( e.currentTarget ).is( '#vc_templates-more-layouts' ) ) { vc.templates_panel_view.once( 'show', function () { $( '[data-vc-ui-element-target="[data-tab=default_templates]"]' ).click(); } ); } vc.templates_panel_view.render().show(); }, loadDefaultTemplate: function ( e ) { e && e.preventDefault(); vc.templates_panel_view.loadTemplate( e ); }, editSettings: function ( e ) { e && e.preventDefault(); vc.post_settings_view.render().show(); }, sortingStarted: function ( event, ui ) { $( '#visual_composer_content' ).addClass( 'vc_sorting-started' ); }, sortingStopped: function ( event, ui ) { $( '#visual_composer_content' ).removeClass( 'vc_sorting-started' ); }, updateElementsSorting: function ( event, ui ) { _.defer( function ( app, event, ui ) { var $current_container = ui.item.parent().closest( '[data-model-id]' ), parent = $current_container.data( 'model' ), model = ui.item.data( 'model' ), models = app.views[ parent.id ].$content.find( '> [data-model-id]' ), i = 0; // Change parent if block moved to another container. if ( ! _.isNull( ui.sender ) ) { var old_parent_id = model.get( 'parent_id' ); store.lock(); model.save( { parent_id: parent.id } ); app.views[ old_parent_id ].checkIsEmpty(); app.views[ parent.id ].checkIsEmpty(); } models.each( function () { var shortcode = $( this ).data( 'model' ); store.lock(); shortcode.save( { 'order': i ++ } ); } ); model.save(); }, this, event, ui ); }, updateRowsSorting: function () { _.defer( function ( app ) { var $rows = app.$content.find( app.rowSortableSelector ); $rows.each( function () { var index = $( this ).index(); if ( $rows.length - 1 > index ) { store.lock(); } $( this ).data( 'model' ).save( { 'order': index } ); } ); }, this ); }, renderPlaceholder: function ( event, element ) { var tag = $( element ).data( 'element_type' ); var is_container = _.isObject( vc.map[ tag ] ) && ( ( _.isBoolean( vc.map[ tag ].is_container ) && true === vc.map[ tag ].is_container ) || ! _.isEmpty( vc.map[ tag ].as_parent ) ); var $helper = $( '
' + vc.map[ tag ].name + '
' ).prependTo( 'body' ); return $helper; }, rowSortableSelector: "> .wpb_vc_row", setSortable: function () { // 1st level sorting (rows). work also in wp41. $( '.wpb_main_sortable' ).sortable( { forcePlaceholderSize: true, placeholder: "widgets-placeholder", cursor: "move", items: this.rowSortableSelector, // wpb_sortablee handle: '.column_move', distance: 0.5, start: this.sortingStarted, stop: this.sortingStopped, update: this.updateRowsSorting, over: function ( event, ui ) { ui.placeholder.css( { maxWidth: ui.placeholder.parent().width() } ); } } ); // 2st level sorting (elements). $( '.wpb_column_container' ).sortable( { forcePlaceholderSize: true, forceHelperSize: false, connectWith: ".wpb_column_container", placeholder: "vc_placeholder", items: "> div.wpb_sortable", //wpb_sortablee helper: this.renderPlaceholder, distance: 3, scroll: true, scrollSensitivity: 70, cursor: 'move', cursorAt: { top: 20, left: 16 }, tolerance: 'intersect', // this helps with dragging textblock into tabs start: function () { $( '#visual_composer_content' ).addClass( 'vc_sorting-started' ); $( '.vc_not_inner_content' ).addClass( 'dragging_in' ); }, stop: function ( event, ui ) { $( '#visual_composer_content' ).removeClass( 'vc_sorting-started' ); $( '.dragging_in' ).removeClass( 'dragging_in' ); var tag = ui.item.data( 'element_type' ), parent_tag = ui.item.parent().closest( '[data-element_type]' ).data( 'element_type' ), allowed_container_element = ! _.isUndefined( vc.map[ parent_tag ].allowed_container_element ) ? vc.map[ parent_tag ].allowed_container_element : true; if ( ! vc.check_relevance( parent_tag, tag ) ) { $( this ).sortable( 'cancel' ); } var is_container = _.isObject( vc.map[ tag ] ) && ( ( _.isBoolean( vc.map[ tag ].is_container ) && true === vc.map[ tag ].is_container ) || ! _.isEmpty( vc.map[ tag ].as_parent ) ); if ( is_container && ! (true === allowed_container_element || allowed_container_element === ui.item.data( 'element_type' ).replace( /_inner$/, '' )) ) { $( this ).sortable( 'cancel' ); } $( '.vc_sorting-empty-container' ).removeClass( 'vc_sorting-empty-container' ); }, update: this.updateElementsSorting, over: function ( event, ui ) { var tag = ui.item.data( 'element_type' ), parent_tag = ui.placeholder.closest( '[data-element_type]' ).data( 'element_type' ), allowed_container_element = ! _.isUndefined( vc.map[ parent_tag ].allowed_container_element ) ? vc.map[ parent_tag ].allowed_container_element : true; if ( ! vc.check_relevance( parent_tag, tag ) ) { ui.placeholder.addClass( 'vc_hidden-placeholder' ); return false; } var is_container = _.isObject( vc.map[ tag ] ) && ( ( _.isBoolean( vc.map[ tag ].is_container ) && true === vc.map[ tag ].is_container ) || ! _.isEmpty( vc.map[ tag ].as_parent ) ); if ( is_container && ! (true === allowed_container_element || allowed_container_element === ui.item.data( 'element_type' ).replace( /_inner$/, '' )) ) { ui.placeholder.addClass( 'vc_hidden-placeholder' ); return false; } if ( ! _.isNull( ui.sender ) && ui.sender.length && ! ui.sender.find( '[data-element_type]:visible' ).length ) { ui.sender.addClass( 'vc_sorting-empty-container' ); } ui.placeholder.removeClass( 'vc_hidden-placeholder' ); ui.placeholder.css( { maxWidth: ui.placeholder.parent().width() } ); } } ); return this; }, setNotEmpty: function () { $( '#vc_no-content-helper' ).addClass( 'vc_not-empty' ); }, setIsEmpty: function () { $( '#vc_no-content-helper' ).removeClass( 'vc_not-empty' ) }, checkEmpty: function ( model ) { if ( _.isObject( model ) && false !== model.get( 'parent_id' ) && model.get( 'parent_id' ) != model.id ) { var parent_view = this.views[ model.get( 'parent_id' ) ]; parent_view.checkIsEmpty(); } if ( 0 === Shortcodes.length ) { this.setIsEmpty(); } else { this.setNotEmpty(); } }, switchComposer: function ( e ) { if ( _.isObject( e ) ) { e.preventDefault(); } if ( 'shown' === this.status ) { if ( 'only' !== this.accessPolicy ) { ! _.isUndefined( this.$switchButton ) && this.$switchButton.text( window.i18nLocale.main_button_title_backend_editor ); ! _.isUndefined( this.$buttonsContainer ) && this.$buttonsContainer.removeClass( 'vc_backend-status' ); } this.close(); this.status = 'closed'; } else { if ( 'only' !== this.accessPolicy ) { ! _.isUndefined( this.$switchButton ) && this.$switchButton.text( window.i18nLocale.main_button_title_revert ); ! _.isUndefined( this.$buttonsContainer ) && this.$buttonsContainer.addClass( 'vc_backend-status' ); } this.show(); this.status = 'shown'; } }, show: function () { this.$el.show(); this.$post.hide(); this.$vcStatus.val( "true" ); this.navOnScroll(); if ( vc.storage.isContentChanged() ) { vc.app.setLoading(); vc.app.views = {}; // @todo 4.5 why setTimeout not defer? window.setTimeout( function () { Shortcodes.fetch( { reset: true } ); vc.events.trigger( 'backendEditor.show' ); }, 100 ); } }, setLoading: function () { this.setNotEmpty(); this.$loading_block.addClass( 'vc_ajax-loading' ); this.$metablock_content.addClass( 'vc_loading-shortcodes' ); }, close: function () { this.$vcStatus.val( "false" ); this.$el.hide(); if ( _.isObject( window.editorExpand ) ) { _.defer( function () { window.editorExpand.on(); window.editorExpand.on(); // double call fixes "space" in height } ); } this.$post.show(); _.defer( function () { vc.events.trigger( 'backendEditor.close' ); } ); }, checkVcStatus: function () { if ( 'only' === this.accessPolicy || 'true' === this.$vcStatus.val() ) { this.switchComposer(); } }, setNavTop: function () { this.navTop = this.$nav.length && this.$nav.offset().top - 28; }, save: function () { $( '#wpb-save-post' ).text( window.i18nLocale.loading ); $( '#publish' ).click(); }, preview: function () { $( '#post-preview' ).click(); }, navOnScroll: function () { var $win = $( window ); this.$nav = $( '#vc_navbar' ); this.setNavTop(); this.processScroll(); $win.unbind( 'scroll.composer' ).on( 'scroll.composer', this.processScroll ); }, processScroll: function ( e ) { if ( true === this.disableFixedNav ) { this.$nav.removeClass( 'vc_subnav-fixed' ); return; } if ( ! this.navTop || 0 > this.navTop ) { this.setNavTop(); } this.scrollTop = $( window ).scrollTop() + 80; if ( 0 < this.navTop && this.scrollTop >= this.navTop && ! this.isFixed ) { this.isFixed = 1; this.$nav.addClass( 'vc_subnav-fixed' ); } else if ( this.scrollTop <= this.navTop && this.isFixed ) { this.isFixed = 0; this.$nav.removeClass( 'vc_subnav-fixed' ); } }, buildRelevance: function () { vc.shortcode_relevance = {}; _.map( vc.map, function ( object ) { if ( _.isObject( object.as_parent ) && _.isString( object.as_parent.only ) ) { vc.shortcode_relevance[ 'parent_only_' + object.base ] = object.as_parent.only.replace( /\s/, '' ).split( ',' ); } if ( _.isObject( object.as_parent ) && _.isString( object.as_parent.except ) ) { vc.shortcode_relevance[ 'parent_except_' + object.base ] = object.as_parent.except.replace( /\s/, '' ).split( ',' ); } if ( _.isObject( object.as_child ) && _.isString( object.as_child.only ) ) { vc.shortcode_relevance[ 'child_only_' + object.base ] = object.as_child.only.replace( /\s/, '' ).split( ',' ); } if ( _.isObject( object.as_child ) && _.isString( object.as_child.except ) ) { vc.shortcode_relevance[ 'child_except_' + object.base ] = object.as_child.except.replace( /\s/, '' ).split( ',' ); } } ); /** * Check parent/children relationship between two tags * @param tag * @param related_tag * @return boolean - Returns true if relevance is positive */ vc.check_relevance = function ( tag, related_tag ) { if ( _.isArray( vc.shortcode_relevance[ 'parent_only_' + tag ] ) && ! _.contains( vc.shortcode_relevance[ 'parent_only_' + tag ], related_tag ) ) { return false; } if ( _.isArray( vc.shortcode_relevance[ 'parent_except_' + tag ] ) && _.contains( vc.shortcode_relevance[ 'parent_except_' + tag ], related_tag ) ) { return false; } if ( _.isArray( vc.shortcode_relevance[ 'child_only_' + related_tag ] ) && ! _.contains( vc.shortcode_relevance[ 'child_only_' + related_tag ], tag ) ) { return false; } if ( _.isArray( vc.shortcode_relevance[ 'child_except_' + related_tag ] ) && _.contains( vc.shortcode_relevance[ 'child_except' + related_tag ], tag ) ) { return false; } return true; }; } } ); $( function () { if ( $( '#wpb_visual_composer' ).is( 'div' ) ) { var app = vc.app = new VisualComposer(); 'no' !== app.accessPolicy && vc.app.checkVcStatus(); } } ); /** * Called when initial content rendered or when content changed in tinymce */ Shortcodes.on( 'sync', function ( collection ) { if ( _.isObject( collection ) && ! _.isEmpty( collection.models ) ) { _.each( collection.models, function ( model ) { vc.events.triggerShortcodeEvents( 'sync', model ); } ); } } ); /** * Called when shortcode created */ Shortcodes.on( 'add', function ( model ) { if ( _.isObject( model ) ) { vc.events.triggerShortcodeEvents( 'add', model ); } } ); })( window.jQuery ); Κριτική SkyThor Casino: Μπόνους χωρίς τζιράρισμα & παιχνίδια – Huuzoek

Κριτική SkyThor Casino: Μπόνους χωρίς τζιράρισμα & παιχνίδια

Skythor Casino

Η βιβλιοθήκη του υποστηρίζεται από 30+ παρόχους, συνδυάζοντας κορυφαία στούντιο του κλάδου με νεότερους δημιουργούς.

  • Το δοκιμάσαμε τόσο σε iOS όσο και σε Android συσκευές, και ο ιστότοπος προσαρμόστηκε ομαλά σε κάθε μέγεθος οθόνης.
  • Πέρα από το μπόνους καλωσορίσματος, το cashback και την προσφορά Stars, το SkyThor διοργανώνει συχνά τουρνουά — τόσο δικτύου όσο και εσωτερικά.
  • Με άδεια από την Κυβέρνηση του Anjouan και διαθέσιμο για παίκτες στην Κύπρο, η πλατφόρμα προσφέρει πάνω από 3.500 παιχνίδια, πληρωμές με κρυπτονομίσματα και εβδομαδιαίο cashback χωρίς τζιράρισμα.
  • Οι αναλήψεις περιορίζονται σε €10.000 τον μήνα, ενώ αν το υπόλοιπό σου ξεπερνά 10× το σύνολο των καταθέσεων, το μηνιαίο όριο μειώνεται σε €5.000.
  • Ξέρω ποια είναι τα καλύτερα online καζίνο στην Κύπρο, γιατί έχω παίξει σχεδόν σε όλα.
  • Η μεγαλύτερη δύναμη του SkyThor βρίσκεται στην τεράστια ποικιλία παιχνιδιών.

Πακέτο Καλωσορίσματος

Οι αναλήψεις χρειάζονται συνήθως έως 3 εργάσιμες ημέρες, ανάλογα με τη μέθοδο. Θα μάθεις επίσης όλες τις λεπτομέρειες που συνήθως περνούν απαρατήρητες — όπως τα υψηλότερα ελάχιστα ποσά ανάληψης και τον κανόνα 1x turnover στις καταθέσεις. Η ευρεία γκάμα μεθόδων πληρωμής, συμπεριλαμβανομένων crypto και e-wallets, προσδίδει μια σύγχρονη και ευέλικτη εμπειρία. Τα φρουτάκια κυριαρχούν στο SkyThor, από κλασικά τρίκυλινδρα μέχρι video slots και τίτλους Megaways. Δημοφιλή παιχνίδια που δοκιμάσαμε περιλαμβάνουν τα Chicken Chase, Peru Candyland, Arcane Reel Chaos και The Knight King.

Sportsbook & eSports

Αν και δεν προσφέρει το κύρος ενός VIP club με προσωπικούς διαχειριστές, οι τακτικές επιστροφές χρημάτων και οι μηνιαίες καμπάνιες εξασφαλίζουν σταθερή αξία για όσους παίζουν συχνά. Επιπλέον, κάθε κατάθεση πρέπει να τζιραριστεί τουλάχιστον μία φορά πριν την ανάληψη. Αν αυτό δεν συμβεί, το SkyThor επιβάλλει σημαντική χρέωση — €100 ή 10% του ποσού ανάληψης (όποιο είναι μεγαλύτερο). Ξέρω ποια είναι τα καλύτερα online καζίνο στην Κύπρο, γιατί έχω παίξει σχεδόν σε όλα. Πολλά δεν είναι κατάλληλα για Κύπριους ή δεν είναι καν διαθέσιμα στην Κύπρο.

Skythor Casino

Άλλες Προσφορές & Τουρνουά

  • Αν αυτό δεν συμβεί, το SkyThor επιβάλλει σημαντική χρέωση — €100 ή 10% του ποσού ανάληψης (όποιο είναι μεγαλύτερο).
  • Αμέσως μετά, το ταμείο μάς παρουσίασε το πακέτο καλωσορίσματος, με ξεκάθαρη ανάλυση των επιπέδων κατάθεσης και των δωρεάν περιστροφών.
  • Το SkyThor Casino λειτουργεί εξ ολοκλήρου μέσω browser, χωρίς να απαιτείται ειδική εφαρμογή.
  • Ένα από τα πιο ξεχωριστά στοιχεία του SkyThor είναι το ενσωματωμένο sportsbook.
  • Τότε το SkyThor Casino, που λανσαρίστηκε τον Μάρτιο του 2025, αξίζει την προσοχή σου.
  • Δεν υπάρχει τηλεφωνική γραμμή, αλλά το παράθυρο συνομιλίας είναι πάντα ορατό στον ιστότοπο και οι αντιπρόσωποι απαντούν άμεσα.
  • Το πακέτο καλωσορίσματος προσαρμόζεται ανάλογα με το ποσό της πρώτης κατάθεσης, το cashback αποδίδεται εβδομαδιαία χωρίς rollover, ενώ η μηνιαία προσφορά “Stars” χαρίζει πραγματικά μετρητά.
  • Η μόνη προϋπόθεση είναι το 1× τζιράρισμα της κατάθεσης πριν από οποιαδήποτε ανάληψη.
  • Οι παίκτες μπορούν να στοιχηματίσουν σε 20+ αθλήματα, από ποδόσφαιρο και τένις μέχρι βόλεϊ και μπάσκετ, τόσο πριν τον αγώνα όσο και live.
  • Η φόρμα εγγραφής ήταν γρήγορη — χρειάστηκαν μόνο βασικά προσωπικά στοιχεία και επιβεβαίωση email.

Κάθε επίπεδο ισχύει για 7 ημέρες, ενώ οι περιστροφές αντιστοιχούν σε συγκεκριμένα φρουτάκια. Η μόνη προϋπόθεση είναι το 1× τζιράρισμα της κατάθεσης πριν από οποιαδήποτε ανάληψη. Τα bonus είναι sticky, δηλαδή το αρχικό ποσό του μπόνους αφαιρείται κατά την ανάληψη, ενώ όλα τα κέρδη παραμένουν δικά σου. Πέρα από το μπόνους καλωσορίσματος, το cashback και την προσφορά Stars, το SkyThor διοργανώνει συχνά τουρνουά — τόσο δικτύου όσο και εσωτερικά. Με τη δήλωση συμμετοχής και παίζοντας τα επιλεγμένα slots, μπορείς να ανέβεις στη βαθμολογία και να κερδίσεις μέρος από χρηματικά έπαθλα. Πολλά τουρνουά συνοδεύονται από επιπλέον δωρεάν περιστροφές ή cash drops, πέρα από τα βασικά βραβεία.

SkyThor – Ασφάλεια, Άδεια & Δικαιοσύνη

Είναι το SkyThor απλώς ένα ακόμη νέο όνομα στην αγορά των EU-friendly καζίνο, ή πραγματικά ξεχωρίζει με την πολιτική μπόνους και τις επιλογές στοιχήματος; Ας το ανακαλύψουμε. Στις δοκιμές μας, οι ροές ήταν γρήγορες και σταθερές, ακόμα και σε κινητές συσκευές, με άψογη ποιότητα εικόνας. Αποθήκευσε το όνομά μου, email, και τον ιστότοπο μου σε αυτόν τον πλοηγό για την επόμενη φορά που θα σχολιάσω.

Κριτική SkyThor Casino 2025 – Τι Πρέπει να Ξέρουν οι Παίκτες στην Κύπρο

Το καζίνο δεν διαθέτει σταθερό ημερολόγιο με μακροπρόθεσμες καμπάνιες, αλλά νέα events εμφανίζονται τακτικά στη σελίδα των προσφορών. Τυπικά παραδείγματα περιλαμβάνουν τα Pragmatic Play Drops & Wins ή εποχιακά slot races. Επειδή τα έπαθλα καταβάλλονται συνήθως σε μετρητά χωρίς τζιράρισμα, αποτελούν μια ευχάριστη επιβράβευση για τους ενεργούς παίκτες. Το SkyThor διαθέτει άδεια από την Κυβέρνηση του Anjouan και δέχεται παίκτες από την Κύπρο. Αν και η άδεια δεν προέρχεται από την ΕΕ, το καζίνο λειτουργεί νόμιμα για Κύπριους χρήστες. Οι e-wallet και crypto πληρωμές ολοκληρώνονται συνήθως μέσα σε 24–72 ώρες, ενώ οι αναλήψεις με κάρτα χρειάζονται έως 3 εργάσιμες ημέρες.

Άλλες Προσφορές & Τουρνουά

Κατά τη διάρκεια της δοκιμής μας, οι καταθέσεις και αναλήψεις εκτελέστηκαν με ασφάλεια, και οι όροι ήταν ξεκάθαροι. Τα μοναδικά σημεία προσοχής είναι ο κανόνας τζιραρίσματος 1× και το υψηλό ελάχιστο ποσό ανάληψης. Η προσθήκη χρημάτων στον λογαριασμό σου στο SkyThor είναι γρήγορη και απλή.

Εξυπηρέτηση Πελατών στο SkyThor Casino – Ταχύτητα & Αποτελεσματικότητα

Οι παίκτες μπορούν να στοιχηματίσουν σε 20+ αθλήματα, από ποδόσφαιρο και τένις μέχρι βόλεϊ και μπάσκετ, τόσο πριν τον αγώνα όσο και live. Το SkyThor Casino κρατά τα πράγματα απλά αλλά γενναιόδωρα, προσφέροντας μπόνους χωρίς απαιτήσεις τζιραρίσματος. Οι λάτρεις των jackpots θα βρουν και προοδευτικά φρουτάκια, αν και η συλλογή δεν είναι τόσο εκτεταμένη όσο σε ορισμένα από τα μεγαλύτερα brands της αγοράς.

Sportsbook & eSports

Ξέρω πού μπορείτε να παίξετε με ασφάλεια και σιγουριά με μεγάλες πιθανότητες να κερδίσετε πολλά χρήματα. Σε τεχνικό επίπεδο, η πλατφόρμα χρησιμοποιεί SSL κρυπτογράφηση για την προστασία συναλλαγών και προσωπικών δεδομένων. Όλα τα παιχνίδια προέρχονται από πιστοποιημένους παρόχους, όπως NetEnt, Evolution, Pragmatic Play και Red Tiger, εξασφαλίζοντας δίκαια αποτελέσματα μέσω ανεξάρτητων ελέγχων RNG.

Φρουτάκια & Jackpots

Οι ερωτήσεις μας σχετικά με τις χρεώσεις αναλήψεων και τη διάρκεια του cashback απαντήθηκαν ξεκάθαρα, αν και οι απαντήσεις έμοιαζαν κάπως προκαθορισμένες. Παρ’ όλα αυτά, οι πληροφορίες ήταν σωστές και ο τόνος του εκπροσώπου ευγενικός καθ’ όλη τη συνομιλία. Με πάνω από 3.300 παιχνίδια βελτιστοποιημένα για κινητό, η εμπειρία δεν υστερεί σε τίποτα από τη desktop έκδοση. Το sportsbook λειτουργεί εξίσου ομαλά, με ανταποκρινόμενες αποδόσεις και live στοιχήματα που λειτούργησαν άψογα στις δοκιμές μας.

Στη δοκιμή μας, ανάληψη €150 σε USDT ολοκληρώθηκε μέσα σε 18 ώρες μετά την επαλήθευση KYC. Οι e-wallet πληρωμές χρειάστηκαν περίπου 36 ώρες, ενώ οι Mastercard αναλήψεις λίγο πάνω από 2 ημέρες. Δηλαδή, πρέπει να παίξεις τουλάχιστον μία φορά το ποσό που κατέθεσες πριν κάνεις ανάληψη.

Η Εμπειρία μας – Πρώτες Εντυπώσεις από το SkyThor

  • Αν και η άδεια δεν προέρχεται από την ΕΕ, το καζίνο λειτουργεί νόμιμα για Κύπριους χρήστες.
  • Παρ’ όλα αυτά, οι πληροφορίες ήταν σωστές και ο τόνος του εκπροσώπου ευγενικός καθ’ όλη τη συνομιλία.
  • Όσον αφορά την υποστήριξη πελατών, το live chat μας συνέδεσε με εκπρόσωπο μέσα σε ένα λεπτό.
  • Οι αναλήψεις χρειάζονται συνήθως έως 3 εργάσιμες ημέρες, ανάλογα με τη μέθοδο.
  • Το ταμείο υποστηρίζει πάνω από 19 επιλογές κατάθεσης, που καλύπτουν τα πάντα — από παραδοσιακές κάρτες έως σύγχρονα e-wallets και κρυπτονομίσματα.
  • Το SkyThor είναι ιδανικό για παίκτες που εκτιμούν την ευελιξία, το cashback χωρίς όρους και έναν πλούσιο συνδυασμό καζίνο & sportsbook.
  • Επειδή τα έπαθλα καταβάλλονται συνήθως σε μετρητά χωρίς τζιράρισμα, αποτελούν μια ευχάριστη επιβράβευση για τους ενεργούς παίκτες.

Ο συνδυασμός μπόνους χωρίς τζιράρισμα, βιβλιοθήκης με 3.500+ παιχνίδια και πλήρους sportsbook με eSports στοιχήματα το διαφοροποιεί από πολλούς ανταγωνιστές που εστιάζουν αποκλειστικά στα slots. Στη δοκιμή μας, κατάθεση €50 μέσω Skrill πραγματοποιήθηκε άμεσα, ενεργοποιώντας παράλληλα και το μπόνους καλωσορίσματος. Το https://skythor.org/ υποστηρίζει πάνω από 19 μεθόδους πληρωμής, προσφέροντας ευκολία σε καταθέσεις και αναλήψεις, είτε προτιμάς κάρτες, e-wallets είτε κρυπτονομίσματα. Όλες οι συναλλαγές εκτελούνται με ασφάλεια, ενώ οι καταθέσεις εμφανίζονται άμεσα. Όσον αφορά την υποστήριξη πελατών, το live chat μας συνέδεσε με εκπρόσωπο μέσα σε ένα λεπτό. Οι ερωτήσεις μας σχετικά με αναλήψεις και cashback απαντήθηκαν σαφώς, αν και τηλεφωνική υποστήριξη δεν υπάρχει.

Skythor Casino

Συμπέρασμα – Αξίζει το SkyThor Casino;

Δεν είναι όμως η καλύτερη επιλογή για όσους επιζητούν υπερ-γρήγορες αναλήψεις, χαμηλότερα όρια ή ένα δομημένο VIP σύστημα. Οι περισσότερες προσφορές ισχύουν για 7 ημέρες, ενώ παραμένει η υποχρέωση 1× τζιραρίσματος της κατάθεσης πριν από οποιαδήποτε ανάληψη. Το SkyThor Casino αποτελεί μια από τις πιο ενδιαφέρουσες νέες επιλογές για παίκτες στην Κύπρο το 2025.

Το SkyThor Casino προσφέρει τα βασικά εργαλεία που χρειάζονται οι παίκτες για να παραμένουν υπό έλεγχο. Μπορείς να ζητήσεις αυτο-αποκλεισμό είτε μέσα από τις ρυθμίσεις του λογαριασμού σου είτε επικοινωνώντας απευθείας με την ομάδα υποστήριξης. Ένα από τα πιο ξεχωριστά στοιχεία του SkyThor είναι το ενσωματωμένο sportsbook.

Το πακέτο καλωσορίσματος προσαρμόζεται ανάλογα με το ποσό της πρώτης κατάθεσης, το cashback αποδίδεται εβδομαδιαία χωρίς rollover, ενώ η μηνιαία προσφορά “Stars” χαρίζει πραγματικά μετρητά. Τότε το SkyThor Casino, που λανσαρίστηκε τον Μάρτιο του 2025, αξίζει την προσοχή σου. Με άδεια από την Κυβέρνηση του Anjouan και διαθέσιμο για παίκτες στην Κύπρο, η πλατφόρμα προσφέρει πάνω από 3.500 παιχνίδια, πληρωμές με κρυπτονομίσματα και εβδομαδιαίο cashback χωρίς τζιράρισμα. Το SkyThor είναι ιδανικό για παίκτες που εκτιμούν την ευελιξία, το cashback χωρίς όρους και έναν πλούσιο συνδυασμό καζίνο & sportsbook.

  • Παρ’ όλα αυτά, οι πληροφορίες ήταν σωστές και ο τόνος του εκπροσώπου ευγενικός καθ’ όλη τη συνομιλία.
  • Οι ερωτήσεις μας σχετικά με αναλήψεις και cashback απαντήθηκαν σαφώς, αν και τηλεφωνική υποστήριξη δεν υπάρχει.
  • Το ταμείο υποστηρίζει πάνω από 19 επιλογές κατάθεσης, που καλύπτουν τα πάντα — από παραδοσιακές κάρτες έως σύγχρονα e-wallets και κρυπτονομίσματα.
  • Οι αναλήψεις χρειάζονται συνήθως έως 3 εργάσιμες ημέρες, ανάλογα με τη μέθοδο.

Αν παραβείς αυτόν τον κανόνα, επιβάλλεται πρόστιμο €100 ή 10% του ποσού ανάληψης (όποιο είναι μεγαλύτερο) — μία από τις πιο αυστηρές πολιτικές που έχουμε συναντήσει. Για να αποκτήσουμε πραγματική εικόνα του SkyThor Casino, εγγραφήκαμε με κυπριακή IP, καταθέσαμε χρήματα και δοκιμάσαμε τόσο το καζίνο όσο και το sportsbook. Η φόρμα εγγραφής ήταν γρήγορη — χρειάστηκαν μόνο βασικά προσωπικά στοιχεία και επιβεβαίωση email. Αμέσως μετά, το ταμείο μάς παρουσίασε το πακέτο καλωσορίσματος, με ξεκάθαρη ανάλυση των επιπέδων κατάθεσης και των δωρεάν περιστροφών.

Δοκιμάσαμε διάφορα φρουτάκια, όπως το Chicken Chase και το Big Bass Crash, και στη συνέχεια περάσαμε σε live τραπέζια από Evolution και Pragmatic Play. Το sportsbook μάς εντυπωσίασε επίσης με πολλές pre-match και live αγορές, συμπεριλαμβανομένου του κυπριακού ποδοσφαίρου και κορυφαίων τουρνουά eSports. Είμαι από την Κύπρο και όπως σχεδόν όλοι οι Κύπριοι, αγαπώ τα τυχερά παιχνίδια. Το SkyThor Casino λειτουργεί εξ ολοκλήρου μέσω browser, χωρίς να απαιτείται ειδική εφαρμογή. Το δοκιμάσαμε τόσο σε iOS όσο και σε Android συσκευές, και ο ιστότοπος προσαρμόστηκε ομαλά σε κάθε μέγεθος οθόνης.

Το ταμείο υποστηρίζει πάνω από 19 επιλογές κατάθεσης, που καλύπτουν τα πάντα — από παραδοσιακές κάρτες έως σύγχρονα e-wallets και κρυπτονομίσματα. Οι καταθέσεις εκτελούνται στιγμιαία, ενώ το ελάχιστο ποσό είναι €20, το οποίο ευθυγραμμίζεται με τον μέσο όρο της αγοράς. Όταν έρθει η ώρα της ανάληψης, το SkyThor αποδίδει ικανοποιητικά, αλλά υπάρχουν ορισμένοι όροι που πρέπει να γνωρίζεις.

Η ελάχιστη ανάληψη είναι €40, λίγο υψηλότερη από τον μέσο όρο της αγοράς (€20–€25). Οι αναλήψεις περιορίζονται σε €10.000 τον μήνα, ενώ αν το υπόλοιπό σου ξεπερνά 10× το σύνολο των καταθέσεων, το μηνιαίο όριο μειώνεται σε €5.000. Οι νέοι παίκτες λαμβάνουν 100% μπόνους έως €100 και έως 200 δωρεάν περιστροφές, ανάλογα με το ποσό της κατάθεσης.

Η πλοήγηση ήταν απλή και καθαρή — τα παιχνίδια, το ταμείο και οι προσφορές ήταν εύκολα προσβάσιμα από το βασικό μενού. Η μεγαλύτερη δύναμη του SkyThor βρίσκεται στην τεράστια ποικιλία παιχνιδιών. Με πάνω από 3.500 τίτλους συνολικά και περισσότερους από 3.300 βελτιστοποιημένους για κινητό, η πλατφόρμα προσφέρει κάτι για κάθε τύπο παίκτη — από περιστασιακούς fans των slots μέχρι λάτρεις του sportsbook. Δεν υπάρχει τηλεφωνική γραμμή, αλλά το παράθυρο συνομιλίας είναι πάντα ορατό στον ιστότοπο και οι αντιπρόσωποι απαντούν άμεσα.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *