/*! elementor - v3.27.0 - 03-02-2025 */
/******/ (() => { // webpackBootstrap
/******/ var __webpack_modules__ = ({
/***/ "../assets/dev/js/utils/react.js":
/*!***************************************!*\
!*** ../assets/dev/js/utils/react.js ***!
\***************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react"));
var ReactDOM = _interopRequireWildcard(__webpack_require__(/*! react-dom */ "react-dom"));
var _client = __webpack_require__(/*! react-dom/client */ "../node_modules/react-dom/client.js");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/**
* Support conditional rendering of a React App to the DOM, based on the React version.
* We use `createRoot` when available, but fallback to `ReactDOM.render` for older versions.
*
* @param { React.ReactElement } app The app to render.
* @param { HTMLElement } domElement The DOM element to render the app into.
*
* @return {{ unmount: () => void }} The unmount function.
*/
function render(app, domElement) {
var unmountFunction;
try {
var root = (0, _client.createRoot)(domElement);
root.render(app);
unmountFunction = function unmountFunction() {
root.unmount();
};
} catch (e) {
// eslint-disable-next-line react/no-deprecated
ReactDOM.render(app, domElement);
unmountFunction = function unmountFunction() {
// eslint-disable-next-line react/no-deprecated
ReactDOM.unmountComponentAtNode(domElement);
};
}
return {
unmount: unmountFunction
};
}
var _default = exports["default"] = {
render: render
};
/***/ }),
/***/ "../modules/home/assets/js/components/addons-section.js":
/*!**************************************************************!*\
!*** ../modules/home/assets/js/components/addons-section.js ***!
\**************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
var _objectDestructuringEmpty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/objectDestructuringEmpty */ "../node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js"));
var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "../node_modules/@babel/runtime/helpers/extends.js"));
var _ui = __webpack_require__(/*! @elementor/ui */ "@elementor/ui");
var _List = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/List */ "@elementor/ui/List"));
var _Link = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Link */ "@elementor/ui/Link"));
var _Button = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Button */ "@elementor/ui/Button"));
var _Card = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Card */ "@elementor/ui/Card"));
var _CardActions = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/CardActions */ "@elementor/ui/CardActions"));
var _CardContent = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/CardContent */ "@elementor/ui/CardContent"));
var _CardMedia = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/CardMedia */ "@elementor/ui/CardMedia"));
var Addons = function Addons(_ref) {
var props = (0, _extends2.default)({}, ((0, _objectDestructuringEmpty2.default)(_ref), _ref));
var domain = props.adminUrl.replace('wp-admin/', '');
var addonsArray = props.addonsData.repeater;
var cardsPerRow = 3 === addonsArray.length ? 3 : 2;
return /*#__PURE__*/_react.default.createElement(_ui.Paper, {
elevation: 0,
sx: {
p: 3,
display: 'flex',
flexDirection: 'column',
gap: 2
}
}, /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Typography, {
variant: "h6"
}, props.addonsData.header.title), /*#__PURE__*/_react.default.createElement(_ui.Typography, {
variant: "body2",
color: "text.secondary"
}, props.addonsData.header.description)), /*#__PURE__*/_react.default.createElement(_List.default, {
sx: {
display: 'grid',
gridTemplateColumns: {
md: "repeat(".concat(cardsPerRow, ", 1fr)"),
xs: 'repeat(1, 1fr)'
},
gap: 2
}
}, addonsArray.map(function (item) {
var linkTarget = item.hasOwnProperty('target') ? item.target : '_blank';
return /*#__PURE__*/_react.default.createElement(_Card.default, {
key: item.title,
elevation: 0,
sx: {
display: 'flex',
border: 1,
borderRadius: 1,
borderColor: 'action.focus'
}
}, /*#__PURE__*/_react.default.createElement(_CardContent.default, {
sx: {
display: 'flex',
flexDirection: 'column',
justifyContent: 'space-between',
gap: 3,
p: 3
}
}, /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_CardMedia.default, {
image: item.image,
sx: {
height: '58px',
width: '58px',
mb: 2
}
}), /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Typography, {
variant: "subtitle2"
}, item.title), /*#__PURE__*/_react.default.createElement(_ui.Typography, {
variant: "body2",
color: "text.secondary"
}, item.description))), /*#__PURE__*/_react.default.createElement(_CardActions.default, {
sx: {
p: 0
}
}, /*#__PURE__*/_react.default.createElement(_Button.default, {
variant: "outlined",
size: "small",
color: "promotion",
href: item.url,
target: linkTarget
}, item.button_label))));
})), /*#__PURE__*/_react.default.createElement(_Link.default, {
variant: "body2",
color: "info.main",
underline: "none",
href: "".concat(domain).concat(props.addonsData.footer.file_path)
}, props.addonsData.footer.label));
};
var _default = exports["default"] = Addons;
Addons.propTypes = {
addonsData: PropTypes.object.isRequired,
adminUrl: PropTypes.string.isRequired
};
/***/ }),
/***/ "../modules/home/assets/js/components/create-new-page-dialog.js":
/*!**********************************************************************!*\
!*** ../modules/home/assets/js/components/create-new-page-dialog.js ***!
\**********************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var __ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n")["__"];
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _react = _interopRequireWildcard(__webpack_require__(/*! react */ "react"));
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js"));
var _DialogHeader = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/DialogHeader */ "@elementor/ui/DialogHeader"));
var _DialogHeaderGroup = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/DialogHeaderGroup */ "@elementor/ui/DialogHeaderGroup"));
var _DialogTitle = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/DialogTitle */ "@elementor/ui/DialogTitle"));
var _DialogContent = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/DialogContent */ "@elementor/ui/DialogContent"));
var _DialogContentText = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/DialogContentText */ "@elementor/ui/DialogContentText"));
var _TextField = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/TextField */ "@elementor/ui/TextField"));
var _DialogActions = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/DialogActions */ "@elementor/ui/DialogActions"));
var _Button = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Button */ "@elementor/ui/Button"));
var _Dialog = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Dialog */ "@elementor/ui/Dialog"));
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
var CreateNewPageDialog = function CreateNewPageDialog(_ref) {
var url = _ref.url,
isOpen = _ref.isOpen,
closedDialogCallback = _ref.closedDialogCallback;
var _React$useState = _react.default.useState(false),
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
open = _React$useState2[0],
setOpen = _React$useState2[1];
var _React$useState3 = _react.default.useState(''),
_React$useState4 = (0, _slicedToArray2.default)(_React$useState3, 2),
pageName = _React$useState4[0],
setPageName = _React$useState4[1];
(0, _react.useEffect)(function () {
setOpen(isOpen);
}, [isOpen]);
var handleDialogClose = function handleDialogClose() {
setOpen(false);
closedDialogCallback();
};
var handleChange = function handleChange(event) {
var urlParams = new URLSearchParams();
urlParams.append('post_data[post_title]', event.target.value);
setPageName(urlParams.toString());
};
return /*#__PURE__*/_react.default.createElement(_Dialog.default, {
open: open,
onClose: handleDialogClose,
maxWidth: "xs",
width: "xs",
fullWidth: true
}, /*#__PURE__*/_react.default.createElement(_DialogHeader.default, null, /*#__PURE__*/_react.default.createElement(_DialogHeaderGroup.default, null, /*#__PURE__*/_react.default.createElement(_DialogTitle.default, null, __('Name your page', 'elementor')))), /*#__PURE__*/_react.default.createElement(_DialogContent.default, {
dividers: true
}, /*#__PURE__*/_react.default.createElement(_DialogContentText.default, {
sx: {
mb: 2
}
}, __('To proceed, please name your first page,', 'elementor'), /*#__PURE__*/_react.default.createElement("br", null), __('or rename it later.', 'elementor')), /*#__PURE__*/_react.default.createElement(_TextField.default, {
onChange: handleChange,
fullWidth: true,
placeholder: __('New Page', 'elementor')
})), /*#__PURE__*/_react.default.createElement(_DialogActions.default, null, /*#__PURE__*/_react.default.createElement(_Button.default, {
onClick: handleDialogClose,
color: "secondary"
}, __('Cancel', 'elementor')), /*#__PURE__*/_react.default.createElement(_Button.default, {
variant: "contained",
href: pageName ? url + '&' + pageName : url,
target: "_blank"
}, __('Save', 'elementor'))));
};
var _default = exports["default"] = CreateNewPageDialog;
CreateNewPageDialog.propTypes = {
url: PropTypes.string.isRequired,
isOpen: PropTypes.bool.isRequired,
closedDialogCallback: PropTypes.func.isRequired
};
/***/ }),
/***/ "../modules/home/assets/js/components/external-links-section.js":
/*!**********************************************************************!*\
!*** ../modules/home/assets/js/components/external-links-section.js ***!
\**********************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
var _objectDestructuringEmpty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/objectDestructuringEmpty */ "../node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js"));
var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "../node_modules/@babel/runtime/helpers/extends.js"));
var _ui = __webpack_require__(/*! @elementor/ui */ "@elementor/ui");
var _List = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/List */ "@elementor/ui/List"));
var _ListItemButton = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/ListItemButton */ "@elementor/ui/ListItemButton"));
var _ListItemText = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/ListItemText */ "@elementor/ui/ListItemText"));
var _Divider = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Divider */ "@elementor/ui/Divider"));
var ExternalLinksSection = function ExternalLinksSection(_ref) {
var props = (0, _extends2.default)({}, ((0, _objectDestructuringEmpty2.default)(_ref), _ref));
return /*#__PURE__*/_react.default.createElement(_ui.Paper, {
elevation: 0,
sx: {
px: 3
}
}, /*#__PURE__*/_react.default.createElement(_List.default, null, props.externalLinksData.map(function (item, index) {
return /*#__PURE__*/_react.default.createElement(_ui.Box, {
key: item.label
}, /*#__PURE__*/_react.default.createElement(_ListItemButton.default, {
href: item.url,
target: "_blank",
sx: {
'&:hover': {
backgroundColor: 'initial'
},
gap: 2,
px: 0,
py: 2
}
}, /*#__PURE__*/_react.default.createElement(_ui.Box, {
component: "img",
src: item.image,
sx: {
width: '38px'
}
}), /*#__PURE__*/_react.default.createElement(_ListItemText.default, {
sx: {
color: 'text.secondary'
},
primary: item.label
})), index < props.externalLinksData.length - 1 && /*#__PURE__*/_react.default.createElement(_Divider.default, null));
})));
};
var _default = exports["default"] = ExternalLinksSection;
ExternalLinksSection.propTypes = {
externalLinksData: PropTypes.array.isRequired
};
/***/ }),
/***/ "../modules/home/assets/js/components/get-started-list-item.js":
/*!*********************************************************************!*\
!*** ../modules/home/assets/js/components/get-started-list-item.js ***!
\*********************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
var _slicedToArray2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/slicedToArray */ "../node_modules/@babel/runtime/helpers/slicedToArray.js"));
var _ListItem = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/ListItem */ "@elementor/ui/ListItem"));
var _ListItemText = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/ListItemText */ "@elementor/ui/ListItemText"));
var _Link = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Link */ "@elementor/ui/Link"));
var _Box = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Box */ "@elementor/ui/Box"));
var _createNewPageDialog = _interopRequireDefault(__webpack_require__(/*! ./create-new-page-dialog */ "../modules/home/assets/js/components/create-new-page-dialog.js"));
var GetStartedListItem = function GetStartedListItem(_ref) {
var item = _ref.item,
image = _ref.image,
adminUrl = _ref.adminUrl;
var url = item.is_relative_url ? adminUrl + item.url : item.url;
var _React$useState = _react.default.useState(false),
_React$useState2 = (0, _slicedToArray2.default)(_React$useState, 2),
isOpen = _React$useState2[0],
openDialog = _React$useState2[1];
var handleLinkClick = function handleLinkClick(event) {
if (!item.new_page) {
return;
}
event.preventDefault();
openDialog(true);
};
return /*#__PURE__*/_react.default.createElement(_ListItem.default, {
alignItems: "flex-start",
sx: {
gap: 1,
p: 0,
maxWidth: '150px'
}
}, /*#__PURE__*/_react.default.createElement(_Box.default, {
component: "img",
src: image
}), /*#__PURE__*/_react.default.createElement(_Box.default, null, /*#__PURE__*/_react.default.createElement(_ListItemText.default, {
primary: item.title,
primaryTypographyProps: {
variant: 'subtitle1'
},
sx: {
my: 0
}
}), /*#__PURE__*/_react.default.createElement(_Link.default, {
variant: "body2",
color: item.title_small_color ? item.title_small_color : 'text.tertiary',
underline: "hover",
href: url,
target: "_blank",
onClick: handleLinkClick
}, item.title_small)), item.new_page && /*#__PURE__*/_react.default.createElement(_createNewPageDialog.default, {
url: url,
isOpen: isOpen,
closedDialogCallback: function closedDialogCallback() {
return openDialog(false);
}
}));
};
var _default = exports["default"] = GetStartedListItem;
GetStartedListItem.propTypes = {
item: PropTypes.shape({
title: PropTypes.string.isRequired,
title_small: PropTypes.string.isRequired,
url: PropTypes.string.isRequired,
new_page: PropTypes.bool,
is_relative_url: PropTypes.bool,
title_small_color: PropTypes.string
}).isRequired,
adminUrl: PropTypes.string.isRequired,
image: PropTypes.string
};
/***/ }),
/***/ "../modules/home/assets/js/components/get-started-section.js":
/*!*******************************************************************!*\
!*** ../modules/home/assets/js/components/get-started-section.js ***!
\*******************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
var _objectDestructuringEmpty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/objectDestructuringEmpty */ "../node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js"));
var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "../node_modules/@babel/runtime/helpers/extends.js"));
var _ui = __webpack_require__(/*! @elementor/ui */ "@elementor/ui");
var _List = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/List */ "@elementor/ui/List"));
var _getStartedListItem = _interopRequireDefault(__webpack_require__(/*! ./get-started-list-item */ "../modules/home/assets/js/components/get-started-list-item.js"));
var GetStarted = function GetStarted(_ref) {
var props = (0, _extends2.default)({}, ((0, _objectDestructuringEmpty2.default)(_ref), _ref));
return /*#__PURE__*/_react.default.createElement(_ui.Paper, {
elevation: 0,
sx: {
p: 3,
display: 'flex',
flexDirection: 'column',
gap: 2
}
}, /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Typography, {
variant: "h6"
}, props.getStartedData.header.title), /*#__PURE__*/_react.default.createElement(_ui.Typography, {
variant: "body2",
color: "text.secondary"
}, props.getStartedData.header.description)), /*#__PURE__*/_react.default.createElement(_List.default, {
sx: {
display: 'grid',
gridTemplateColumns: {
md: 'repeat(4, 1fr)',
xs: 'repeat(2, 1fr)'
},
columnGap: {
md: 9,
xs: 7
},
rowGap: 3
}
}, props.getStartedData.repeater.map(function (item) {
return /*#__PURE__*/_react.default.createElement(_getStartedListItem.default, {
key: item.title,
item: item,
image: item.image,
adminUrl: props.adminUrl
});
})));
};
var _default = exports["default"] = GetStarted;
GetStarted.propTypes = {
getStartedData: PropTypes.object.isRequired,
adminUrl: PropTypes.string.isRequired
};
/***/ }),
/***/ "../modules/home/assets/js/components/home-screen.js":
/*!***********************************************************!*\
!*** ../modules/home/assets/js/components/home-screen.js ***!
\***********************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
var _ui = __webpack_require__(/*! @elementor/ui */ "@elementor/ui");
var _topSection = _interopRequireDefault(__webpack_require__(/*! ./top-section */ "../modules/home/assets/js/components/top-section.js"));
var _sidebarPromotion = _interopRequireDefault(__webpack_require__(/*! ./sidebar-promotion */ "../modules/home/assets/js/components/sidebar-promotion.js"));
var _addonsSection = _interopRequireDefault(__webpack_require__(/*! ./addons-section */ "../modules/home/assets/js/components/addons-section.js"));
var _externalLinksSection = _interopRequireDefault(__webpack_require__(/*! ./external-links-section */ "../modules/home/assets/js/components/external-links-section.js"));
var _getStartedSection = _interopRequireDefault(__webpack_require__(/*! ./get-started-section */ "../modules/home/assets/js/components/get-started-section.js"));
var HomeScreen = function HomeScreen(props) {
var hasSidebarUpgrade = props.homeScreenData.hasOwnProperty('sidebar_upgrade');
return /*#__PURE__*/ /* Box wrapper around the Container is needed to neutralize wp-content area left-padding */_react.default.createElement(_ui.Box, {
sx: {
pr: 1
}
}, /*#__PURE__*/_react.default.createElement(_ui.Container, {
disableGutters: true,
maxWidth: "lg",
sx: {
display: 'flex',
flexDirection: 'column',
gap: {
xs: 1,
md: 3
},
pt: {
xs: 2,
md: 6
},
pb: 2
}
}, /*#__PURE__*/_react.default.createElement(_topSection.default, {
topData: props.homeScreenData.top_with_licences,
createNewPageUrl: props.homeScreenData.create_new_page_url
}), /*#__PURE__*/_react.default.createElement(_ui.Box, {
sx: {
display: 'flex',
flexDirection: {
xs: 'column',
sm: 'row'
},
justifyContent: 'space-between',
gap: 3
}
}, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
sx: {
flex: 1,
gap: 3
}
}, /*#__PURE__*/_react.default.createElement(_getStartedSection.default, {
getStartedData: props.homeScreenData.get_started,
adminUrl: props.adminUrl
}), /*#__PURE__*/_react.default.createElement(_addonsSection.default, {
addonsData: props.homeScreenData.add_ons,
adminUrl: props.adminUrl
})), /*#__PURE__*/_react.default.createElement(_ui.Container, {
maxWidth: "xs",
disableGutters: true,
sx: {
width: {
sm: '305px'
},
display: 'flex',
flexDirection: 'column',
gap: 3
}
}, hasSidebarUpgrade && /*#__PURE__*/_react.default.createElement(_sidebarPromotion.default, {
sideData: props.homeScreenData.sidebar_upgrade
}), /*#__PURE__*/_react.default.createElement(_externalLinksSection.default, {
externalLinksData: props.homeScreenData.external_links
})))));
};
HomeScreen.propTypes = {
homeScreenData: PropTypes.object,
adminUrl: PropTypes.string
};
var _default = exports["default"] = HomeScreen;
/***/ }),
/***/ "../modules/home/assets/js/components/sidebar-promotion.js":
/*!*****************************************************************!*\
!*** ../modules/home/assets/js/components/sidebar-promotion.js ***!
\*****************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
var _objectDestructuringEmpty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/objectDestructuringEmpty */ "../node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js"));
var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "../node_modules/@babel/runtime/helpers/extends.js"));
var _ui = __webpack_require__(/*! @elementor/ui */ "@elementor/ui");
var _Button = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Button */ "@elementor/ui/Button"));
var _List = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/List */ "@elementor/ui/List"));
var _ListItem = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/ListItem */ "@elementor/ui/ListItem"));
var _ListItemText = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/ListItemText */ "@elementor/ui/ListItemText"));
var _sideBarCheckIcon = _interopRequireDefault(__webpack_require__(/*! ../icons/side-bar-check-icon */ "../modules/home/assets/js/icons/side-bar-check-icon.js"));
var SideBarPromotion = function SideBarPromotion(_ref) {
var props = (0, _extends2.default)({}, ((0, _objectDestructuringEmpty2.default)(_ref), _ref));
return /*#__PURE__*/_react.default.createElement(_ui.Paper, {
elevation: 0,
sx: {
p: 3
}
}, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
gap: 1.5,
sx: {
alignItems: 'center',
textAlign: 'center',
pb: 4
}
}, /*#__PURE__*/_react.default.createElement(_ui.Box, {
component: "img",
src: props.sideData.header.image
}), /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_ui.Typography, {
variant: "h6"
}, props.sideData.header.title), /*#__PURE__*/_react.default.createElement(_ui.Typography, {
variant: "body2",
color: "text.secondary"
}, props.sideData.header.description)), /*#__PURE__*/_react.default.createElement(_Button.default, {
variant: "contained",
size: "medium",
color: "promotion",
href: props.sideData.cta.url,
startIcon: /*#__PURE__*/_react.default.createElement(_ui.Box, {
component: "img",
src: props.sideData.cta.image,
sx: {
width: '16px'
}
}),
target: "_blank",
sx: {
maxWidth: 'fit-content'
}
}, props.sideData.cta.label)), /*#__PURE__*/_react.default.createElement(_List.default, {
sx: {
p: 0
}
}, props.sideData.repeater.map(function (item, index) {
return /*#__PURE__*/_react.default.createElement(_ListItem.default, {
key: index,
sx: {
p: 0,
gap: 1
}
}, /*#__PURE__*/_react.default.createElement(_sideBarCheckIcon.default, null), /*#__PURE__*/_react.default.createElement(_ListItemText.default, {
primaryTypographyProps: {
variant: 'body2'
},
primary: item.title
}));
})));
};
var _default = exports["default"] = SideBarPromotion;
SideBarPromotion.propTypes = {
sideData: PropTypes.object.isRequired
};
/***/ }),
/***/ "../modules/home/assets/js/components/top-section.js":
/*!***********************************************************!*\
!*** ../modules/home/assets/js/components/top-section.js ***!
\***********************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
/* provided dependency */ var PropTypes = __webpack_require__(/*! prop-types */ "../node_modules/prop-types/index.js");
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _react = _interopRequireDefault(__webpack_require__(/*! react */ "react"));
var _objectDestructuringEmpty2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/objectDestructuringEmpty */ "../node_modules/@babel/runtime/helpers/objectDestructuringEmpty.js"));
var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "../node_modules/@babel/runtime/helpers/extends.js"));
var _ui = __webpack_require__(/*! @elementor/ui */ "@elementor/ui");
var _Typography = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Typography */ "@elementor/ui/Typography"));
var _Button = _interopRequireDefault(__webpack_require__(/*! @elementor/ui/Button */ "@elementor/ui/Button"));
var _youtubeIcon = _interopRequireDefault(__webpack_require__(/*! ../icons/youtube-icon */ "../modules/home/assets/js/icons/youtube-icon.js"));
var TopSection = function TopSection(_ref) {
var props = (0, _extends2.default)({}, ((0, _objectDestructuringEmpty2.default)(_ref), _ref));
return /*#__PURE__*/_react.default.createElement(_ui.Paper, {
elevation: 0,
sx: {
display: 'flex',
flexDirection: {
xs: 'column',
sm: 'row'
},
justifyContent: 'space-between',
py: {
xs: 3,
md: 3
},
px: {
xs: 3,
md: 4
},
gap: {
xs: 2,
sm: 3,
lg: 22
}
}
}, /*#__PURE__*/_react.default.createElement(_ui.Stack, {
gap: 3,
justifyContent: "center"
}, /*#__PURE__*/_react.default.createElement(_ui.Box, null, /*#__PURE__*/_react.default.createElement(_Typography.default, {
variant: "h6"
}, props.topData.title), /*#__PURE__*/_react.default.createElement(_Typography.default, {
variant: "body2",
color: "secondary"
}, props.topData.description)), /*#__PURE__*/_react.default.createElement(_ui.Box, {
sx: {
display: 'flex',
gap: 1
}
}, /*#__PURE__*/_react.default.createElement(_Button.default, {
variant: "contained",
size: "small",
href: props.createNewPageUrl,
target: "_blank"
}, props.topData.button_create_page_title), /*#__PURE__*/_react.default.createElement(_Button.default, {
variant: "outlined",
color: "secondary",
size: "small",
startIcon: /*#__PURE__*/_react.default.createElement(_youtubeIcon.default, null),
href: props.topData.button_watch_url,
target: "_blank"
}, props.topData.button_watch_title))), /*#__PURE__*/_react.default.createElement(_ui.Box, {
component: "iframe",
src: "https://www.youtube.com/embed/".concat(props.topData.youtube_embed_id),
title: "YouTube video player",
frameBorder: "0",
allow: "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",
allowFullScreen: true,
sx: {
aspectRatio: '16/9',
borderRadius: 1,
display: 'flex',
width: '100%',
maxWidth: '365px'
}
}));
};
TopSection.propTypes = {
topData: PropTypes.object.isRequired,
createNewPageUrl: PropTypes.string.isRequired
};
var _default = exports["default"] = TopSection;
/***/ }),
/***/ "../modules/home/assets/js/icons/side-bar-check-icon.js":
/*!**************************************************************!*\
!*** ../modules/home/assets/js/icons/side-bar-check-icon.js ***!
\**************************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "../node_modules/@babel/runtime/helpers/extends.js"));
var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react"));
var _ui = __webpack_require__(/*! @elementor/ui */ "@elementor/ui");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
var SideBarCheckIcon = function SideBarCheckIcon(props) {
return /*#__PURE__*/React.createElement(_ui.SvgIcon, (0, _extends2.default)({
viewBox: "0 0 24 24"
}, props), /*#__PURE__*/React.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M9.09013 3.69078C10.273 3.2008 11.5409 2.94861 12.8213 2.94861C14.1017 2.94861 15.3695 3.2008 16.5525 3.69078C17.7354 4.18077 18.8102 4.89895 19.7156 5.80432C20.621 6.70969 21.3391 7.78452 21.8291 8.96744C22.3191 10.1504 22.5713 11.4182 22.5713 12.6986C22.5713 13.979 22.3191 15.2468 21.8291 16.4298C21.3391 17.6127 20.621 18.6875 19.7156 19.5929C18.8102 20.4983 17.7354 21.2165 16.5525 21.7064C15.3695 22.1964 14.1017 22.4486 12.8213 22.4486C11.5409 22.4486 10.2731 22.1964 9.09013 21.7064C7.9072 21.2165 6.83237 20.4983 5.927 19.5929C5.02163 18.6875 4.30345 17.6127 3.81346 16.4298C3.32348 15.2468 3.07129 13.979 3.07129 12.6986C3.07129 11.4182 3.32348 10.1504 3.81346 8.96744C4.30345 7.78452 5.02163 6.70969 5.927 5.80432C6.83237 4.89895 7.9072 4.18077 9.09013 3.69078ZM12.8213 4.44861C11.7379 4.44861 10.6651 4.662 9.66415 5.0766C8.66321 5.4912 7.75374 6.09889 6.98766 6.86498C6.22157 7.63106 5.61388 8.54053 5.19928 9.54147C4.78468 10.5424 4.57129 11.6152 4.57129 12.6986C4.57129 13.782 4.78468 14.8548 5.19928 15.8557C5.61388 16.8567 6.22157 17.7662 6.98766 18.5322C7.75374 19.2983 8.66322 19.906 9.66415 20.3206C10.6651 20.7352 11.7379 20.9486 12.8213 20.9486C13.9047 20.9486 14.9775 20.7352 15.9784 20.3206C16.9794 19.906 17.8888 19.2983 18.6549 18.5322C19.421 17.7662 20.0287 16.8567 20.4433 15.8557C20.8579 14.8548 21.0713 13.782 21.0713 12.6986C21.0713 11.6152 20.8579 10.5424 20.4433 9.54147C20.0287 8.54053 19.421 7.63106 18.6549 6.86498C17.8888 6.09889 16.9794 5.4912 15.9784 5.0766C14.9775 4.662 13.9047 4.44861 12.8213 4.44861Z",
fill: "#93003F"
}), /*#__PURE__*/React.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M17.3213 9.69424C17.6142 9.98713 17.6142 10.462 17.3213 10.7549L12.3732 15.703C12.0803 15.9959 11.6054 15.9959 11.3125 15.703L8.83851 13.2289C8.54562 12.936 8.54562 12.4612 8.83851 12.1683C9.1314 11.8754 9.60628 11.8754 9.89917 12.1683L11.8429 14.112L16.2606 9.69424C16.5535 9.40135 17.0284 9.40135 17.3213 9.69424Z",
fill: "#93003F"
}));
};
var _default = exports["default"] = SideBarCheckIcon;
/***/ }),
/***/ "../modules/home/assets/js/icons/youtube-icon.js":
/*!*******************************************************!*\
!*** ../modules/home/assets/js/icons/youtube-icon.js ***!
\*******************************************************/
/***/ ((__unused_webpack_module, exports, __webpack_require__) => {
"use strict";
var _interopRequireDefault = __webpack_require__(/*! @babel/runtime/helpers/interopRequireDefault */ "../node_modules/@babel/runtime/helpers/interopRequireDefault.js");
var _typeof = __webpack_require__(/*! @babel/runtime/helpers/typeof */ "../node_modules/@babel/runtime/helpers/typeof.js");
Object.defineProperty(exports, "__esModule", ({
value: true
}));
exports["default"] = void 0;
var _extends2 = _interopRequireDefault(__webpack_require__(/*! @babel/runtime/helpers/extends */ "../node_modules/@babel/runtime/helpers/extends.js"));
var React = _interopRequireWildcard(__webpack_require__(/*! react */ "react"));
var _ui = __webpack_require__(/*! @elementor/ui */ "@elementor/ui");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
var YoutubeIcon = function YoutubeIcon(props) {
return /*#__PURE__*/React.createElement(_ui.SvgIcon, (0, _extends2.default)({
viewBox: "0 0 24 24"
}, props), /*#__PURE__*/React.createElement("path", {
fillRule: "evenodd",
clipRule: "evenodd",
d: "M7 5.75C5.20507 5.75 3.75 7.20507 3.75 9V15C3.75 16.7949 5.20507 18.25 7 18.25H17C18.7949 18.25 20.25 16.7949 20.25 15V9C20.25 7.20507 18.7949 5.75 17 5.75H7ZM2.25 9C2.25 6.37665 4.37665 4.25 7 4.25H17C19.6234 4.25 21.75 6.37665 21.75 9V15C21.75 17.6234 19.6234 19.75 17 19.75H7C4.37665 19.75 2.25 17.6234 2.25 15V9ZM9.63048 8.34735C9.86561 8.21422 10.1542 8.21786 10.3859 8.35688L15.3859 11.3569C15.6118 11.4924 15.75 11.7366 15.75 12C15.75 12.2634 15.6118 12.5076 15.3859 12.6431L10.3859 15.6431C10.1542 15.7821 9.86561 15.7858 9.63048 15.6526C9.39534 15.5195 9.25 15.2702 9.25 15V9C9.25 8.7298 9.39534 8.48048 9.63048 8.34735ZM10.75 10.3246V13.6754L13.5423 12L10.75 10.3246Z"
}));
};
var _default = exports["default"] = YoutubeIcon;
/***/ }),
/***/ "../node_modules/object-assign/index.js":
/*!**********************************************!*\
!*** ../node_modules/object-assign/index.js ***!
\**********************************************/
/***/ ((module) => {
"use strict";
/*
object-assign
(c) Sindre Sorhus
@license MIT
*/
/* eslint-disable no-unused-vars */
var getOwnPropertySymbols = Object.getOwnPropertySymbols;
var hasOwnProperty = Object.prototype.hasOwnProperty;
var propIsEnumerable = Object.prototype.propertyIsEnumerable;
function toObject(val) {
if (val === null || val === undefined) {
throw new TypeError('Object.assign cannot be called with null or undefined');
}
return Object(val);
}
function shouldUseNative() {
try {
if (!Object.assign) {
return false;
}
// Detect buggy property enumeration order in older V8 versions.
// https://bugs.chromium.org/p/v8/issues/detail?id=4118
var test1 = new String('abc'); // eslint-disable-line no-new-wrappers
test1[5] = 'de';
if (Object.getOwnPropertyNames(test1)[0] === '5') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test2 = {};
for (var i = 0; i < 10; i++) {
test2['_' + String.fromCharCode(i)] = i;
}
var order2 = Object.getOwnPropertyNames(test2).map(function (n) {
return test2[n];
});
if (order2.join('') !== '0123456789') {
return false;
}
// https://bugs.chromium.org/p/v8/issues/detail?id=3056
var test3 = {};
'abcdefghijklmnopqrst'.split('').forEach(function (letter) {
test3[letter] = letter;
});
if (Object.keys(Object.assign({}, test3)).join('') !==
'abcdefghijklmnopqrst') {
return false;
}
return true;
} catch (err) {
// We don't expect any of the above to throw, but better to be safe.
return false;
}
}
module.exports = shouldUseNative() ? Object.assign : function (target, source) {
var from;
var to = toObject(target);
var symbols;
for (var s = 1; s < arguments.length; s++) {
from = Object(arguments[s]);
for (var key in from) {
if (hasOwnProperty.call(from, key)) {
to[key] = from[key];
}
}
if (getOwnPropertySymbols) {
symbols = getOwnPropertySymbols(from);
for (var i = 0; i < symbols.length; i++) {
if (propIsEnumerable.call(from, symbols[i])) {
to[symbols[i]] = from[symbols[i]];
}
}
}
}
return to;
};
/***/ }),
/***/ "../node_modules/prop-types/checkPropTypes.js":
/*!****************************************************!*\
!*** ../node_modules/prop-types/checkPropTypes.js ***!
\****************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var printWarning = function() {};
if (true) {
var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ "../node_modules/prop-types/lib/ReactPropTypesSecret.js");
var loggedTypeFailures = {};
var has = __webpack_require__(/*! ./lib/has */ "../node_modules/prop-types/lib/has.js");
printWarning = function(text) {
var message = 'Warning: ' + text;
if (typeof console !== 'undefined') {
console.error(message);
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
throw new Error(message);
} catch (x) { /**/ }
};
}
/**
* Assert that the values match with the type specs.
* Error messages are memorized and will only be shown once.
*
* @param {object} typeSpecs Map of name to a ReactPropType
* @param {object} values Runtime values that need to be type-checked
* @param {string} location e.g. "prop", "context", "child context"
* @param {string} componentName Name of the component for error messages.
* @param {?Function} getStack Returns the component stack.
* @private
*/
function checkPropTypes(typeSpecs, values, location, componentName, getStack) {
if (true) {
for (var typeSpecName in typeSpecs) {
if (has(typeSpecs, typeSpecName)) {
var error;
// Prop type validation may throw. In case they do, we don't want to
// fail the render phase where it didn't fail before. So we log it.
// After these have been cleaned up, we'll let them throw.
try {
// This is intentionally an invariant that gets caught. It's the same
// behavior as without this statement except with a better message.
if (typeof typeSpecs[typeSpecName] !== 'function') {
var err = Error(
(componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' +
'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' +
'This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.'
);
err.name = 'Invariant Violation';
throw err;
}
error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
} catch (ex) {
error = ex;
}
if (error && !(error instanceof Error)) {
printWarning(
(componentName || 'React class') + ': type specification of ' +
location + ' `' + typeSpecName + '` is invalid; the type checker ' +
'function must return `null` or an `Error` but returned a ' + typeof error + '. ' +
'You may have forgotten to pass an argument to the type checker ' +
'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' +
'shape all require an argument).'
);
}
if (error instanceof Error && !(error.message in loggedTypeFailures)) {
// Only monitor this failure once because there tends to be a lot of the
// same error.
loggedTypeFailures[error.message] = true;
var stack = getStack ? getStack() : '';
printWarning(
'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '')
);
}
}
}
}
}
/**
* Resets warning cache when testing.
*
* @private
*/
checkPropTypes.resetWarningCache = function() {
if (true) {
loggedTypeFailures = {};
}
}
module.exports = checkPropTypes;
/***/ }),
/***/ "../node_modules/prop-types/factoryWithTypeCheckers.js":
/*!*************************************************************!*\
!*** ../node_modules/prop-types/factoryWithTypeCheckers.js ***!
\*************************************************************/
/***/ ((module, __unused_webpack_exports, __webpack_require__) => {
"use strict";
/**
* Copyright (c) 2013-present, Facebook, Inc.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
var ReactIs = __webpack_require__(/*! react-is */ "../node_modules/prop-types/node_modules/react-is/index.js");
var assign = __webpack_require__(/*! object-assign */ "../node_modules/object-assign/index.js");
var ReactPropTypesSecret = __webpack_require__(/*! ./lib/ReactPropTypesSecret */ "../node_modules/prop-types/lib/ReactPropTypesSecret.js");
var has = __webpack_require__(/*! ./lib/has */ "../node_modules/prop-types/lib/has.js");
var checkPropTypes = __webpack_require__(/*! ./checkPropTypes */ "../node_modules/prop-types/checkPropTypes.js");
var printWarning = function() {};
if (true) {
printWarning = function(text) {
var message = 'Warning: ' + text;
if (typeof console !== 'undefined') {
console.error(message);
}
try {
// --- Welcome to debugging React ---
// This error was thrown as a convenience so that you can use this stack
// to find the callsite that caused this warning to fire.
throw new Error(message);
} catch (x) {}
};
}
function emptyFunctionThatReturnsNull() {
return null;
}
module.exports = function(isValidElement, throwOnDirectAccess) {
/* global Symbol */
var ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator;
var FAUX_ITERATOR_SYMBOL = '@@iterator'; // Before Symbol spec.
/**
* Returns the iterator method function contained on the iterable object.
*
* Be sure to invoke the function with the iterable as context:
*
* var iteratorFn = getIteratorFn(myIterable);
* if (iteratorFn) {
* var iterator = iteratorFn.call(myIterable);
* ...
* }
*
* @param {?object} maybeIterable
* @return {?function}
*/
function getIteratorFn(maybeIterable) {
var iteratorFn = maybeIterable && (ITERATOR_SYMBOL && maybeIterable[ITERATOR_SYMBOL] || maybeIterable[FAUX_ITERATOR_SYMBOL]);
if (typeof iteratorFn === 'function') {
return iteratorFn;
}
}
/**
* Collection of methods that allow declaration and validation of props that are
* supplied to React components. Example usage:
*
* var Props = require('ReactPropTypes');
* var MyArticle = React.createClass({
* propTypes: {
* // An optional string prop named "description".
* description: Props.string,
*
* // A required enum prop named "category".
* category: Props.oneOf(['News','Photos']).isRequired,
*
* // A prop named "dialog" that requires an instance of Dialog.
* dialog: Props.instanceOf(Dialog).isRequired
* },
* render: function() { ... }
* });
*
* A more formal specification of how these methods are used:
*
* type := array|bool|func|object|number|string|oneOf([...])|instanceOf(...)
* decl := ReactPropTypes.{type}(.isRequired)?
*
* Each and every declaration produces a function with the same signature. This
* allows the creation of custom validation functions. For example:
*
* var MyLink = React.createClass({
* propTypes: {
* // An optional string or URI prop named "href".
* href: function(props, propName, componentName) {
* var propValue = props[propName];
* if (propValue != null && typeof propValue !== 'string' &&
* !(propValue instanceof URI)) {
* return new Error(
* 'Expected a string or an URI for ' + propName + ' in ' +
* componentName
* );
* }
* }
* },
* render: function() {...}
* });
*
* @internal
*/
var ANONYMOUS = '<
Boom Casino tarjoaa pelaajilleen räätälöidyn pelikokemuksen, joka starttaa heti ensihetkestä lähtien. Pelaajat pääsevät nauttimaan kasinon tarjonnasta ja tarjouksista läpi pelimatkansa. Varmista, että markkinointiasetuksesi sallivat kasinon ottaa sinuun yhteyttä, jotta saat tiedon parhaista tarjouksista ensimmäisenä.
Suomenkielisellä sivustolla on helppo navigoida ja löytää kaikki tarvittava. Kaikki ylimääräinen onkin karsittu pois, joten tarjolla on vain kaikki mitä pelaaja tarvitsee. Boom Casino on suunniteltu tarjoamaan pelaajille ainutlaatuinen ja räätälöity pelikokemus. Esimerkiksi Omat pelit -osiossa voit helposti lisätä tai poistaa haluamiasi pelejä tai peliluokkia, mikä mahdollistaa henkilökohtaisesti räätälöidyn pelikokemuksen.
Ainoa kritiikin aihe on se, boom casino että live-chat-toiminto ei ole käytettävissä vuorokauden ympäri. Sen sijaan he ovat heittäytyneet täysin kasinon mobiilisivustolle. Esimerkiksi Boom Casinon tarjoamat järjestelmät ja pelit tarkastaa säännöllisesti ennalta hyväksytty riippumaton osapuoli. Tänään meillä on toinen yksi mielenkiintoinen ja tuore online-kasino, joka voi imress sinua.
Downshiftaaminen Kahnawake-lisenssiin ei ansaitse olalle taputuksia, sillä suomalaispelaajien tulee pulittaa voitoistaan siivu verottajalle. Jo nimen perusteella Boom Casinosta voidaan odottaa räjähdysmäistä menestystä – ja tässä tietysti auttaa ammattimaisesti viimeistelty ulkoasu ja valikkojen suunnittelu. Hero Bet Limited on onnistunut upeasti kasinon suunnittelussa, sillä Boom Casino on helppokäyttöinen ja silmää hivelevän tyylikäs pelipaikka. Ilmaiskierrokset maksetaan 20 kappaleen erissä / 10 päivän ajan Fire Joker -peliin. Ilmaiskierrokset ovat kierrätysvapaita, mutta bonus on puolestaan kierrätettävä 40 kertaa, 60 päivän kuluessa ennen mahdollista kotiutusta. Boom Casino on moderni ja selkeälinjainen pikakasino, jolla pelaaminen on mukavan helppoa.
Komeat julistemaiset pelikuvakkeet ja lukemattomat kategoriat luovat tyylikkään tunnelman. Kymmeninen pelistudioiden joukosta löytyy myös monia harvinaisempia nimiä, kuten Shock, Dreamtech ja Jade Rabbit Studio. Myös toimintaa valvovat viranomaiset asettavat kasinoille vaatimuksia turvallisuuden suhteen, ja siksi prosessi saattaa näyttäytyä pelaajalle monimutkaisena. Kun ajatellaan, mitkä ominaisuudet nettikasinossa tekevät pelaamisesta miellyttävää, nousee ensimmäisenä esiin varmasti selkeys. Boom Casino on lähtenyt toimintansa rakentamisessa siitä, että pelikokemuksen on oltava pelaajalle huolellisesti viimeistelty.
Pelivalikoiman suhteen mobiilissa on joitakin pieniä eroavaisuuksia työpöytäsivustoon verrattuna, mutta mistään merkittävistä puutteista tai eroista ei missään tapauksessa ole kyse. Kaikin puolin sivuston käyttö on nopeaa ja helppoa, eivätkä esimerkiksi latausajat muodosta minkäänlaista ongelmaa. Operaattorille ominaisella tavalla kaikki toimii kuten pitääkin, eikä odottamattomia ongelmia esiinny pidemmänkään testirupeaman aikana. Kasinopelit löytyvät helposti omasta kategoriastaan, joka on jaettu erilaisiin alaluokkiin. Mikä parasta, kasinon aula on jaettu loogisesti ja yhteismitallisesti eri näihin alaluokkiin. Boom Casino on kaiken kaikkiaan harkiten kokoon parsittu kokonaisuus.
Alun perin sivusto kuului Hero Gaming Limitedin kasinoperheeseen, mutta vuoden 2024 keväällä kyseisen ketjun sivustot siirtyivät Techno Offshoren sekä Kahnawaken lisenssin alle. Pelivalikoima on lähestulkoon identtinen muiden Heron tuotteiden kanssa, ja myös Boom on niiden tapaan kasino ilman rekisteröitymistä. Tiliä ei tarvitse siis näin ollen luoda, ja pelaaminen tapahtuu pelkästään pankkitunnusten avulla. Asiakaspalvelun saatavuus on myös hyvä, ja Boom Casino tarjoaa tukea useilla kielillä, mikä tekee siitä kansainvälisesti saavutettavan.
Tee Boom Casinolle vähintään 20 euron talletus ja nappaa itsellesi 100% bonus jopa 100 euroon asti. Tämän lisäksi saat kaupan päälle 100 kierrätysvapaata ilmaiskierrosta suosittuun Fire Joker -kolikkopeliin. Ei ole olemassa vain yhtä tekijää, joka toisi turvallisuuden nettikasinoille.
Boom Casinon asiakaspalvelun saa kiinni pulmatilanteissa tai palautteen antamista varten vasemmasta laidasta avautuvan chatin tai sähköpostin kautta. Live chatissa vastassa on ensimmäisenä botti, joka osaa vastata peruskysymyksiin. Boom Casino tarjoaa mahdollisuuden myös live-vetoihin, mistä se saa luonnollisesti arvostelussamme plussaa. Lisäjännitystä voi hankkia sulkemalla vetoja kiinni kesken ottelun. Yleisvaikutelma on, että pelaajaa on haluttu palvella mahdollisimman hyvin. Mikäli kuhunkin kategoriaan olisi vielä lisätty kunkin ryhmän pelien ajantasainen lukumäärä, monipuolinen ja runsas kokonaisuus olisi vielä helpompi hahmottaa.
Erillisiä rekisteröitymisprosesseja ei siis vaadita ja täten ei tarvitse murehtia aina unohtuvista käyttäjätunnuksista sekä salasanoista. Muutosten myötä Boom Casino ei siis enää valitettavasti kuulu suomalaisten suosimien verovapaiden nettikasinoiden joukkoon. Bonuskierrosten voitoilla on ainoastaan 1x kierrätys, mikä tekee tästä vaihtoehdosta todella hyvän.
Sinun ei siis tarvitse rekisteröityä millään tavalla, kun haluat aloittaa pelaamisen. Riittää, että teet talletuksen haluamallasi summalla Briten kautta, niin pääsy kaikkiin peleihin aukeaa. Toinen Boom Casinon erikoisista tarjouksista on välitön bonus, joka löytyy kasinon etusivun vasemmasta valikosta Välittömät bonustoiminnot -nimellä. Tämän ansiosta sinun on mahdollista käynnistää pelatun pelin bonustoiminto koska vain itse haluat. Kaikki bonuspelit on koottu yhteen paikkaan, mistä ehdoton plussa.
Samalla jokaiselle pelaajalle luodaan automaattisesti tili, jolla rahat ovat turvassa, vaikka joskus kirjautuisi ulos erinomaisesta kasinosta. Talletusbonuksen sijaan pelaaja saa esimerkiksi tietyn määrän bonuskierroksia tietyssä slotissa. Kyseisen bonuskierroksen voittojen kierrätysvaatimus on vain 1x, joten pelaaja voi nostaa voitot lähes välittömästi. Kasino on lisensoitu ja säännelty, mikä tarkoittaa, että se noudattaa tiukkoja sääntöjä ja määräyksiä.
Jokaisen pelin palautusprosentit on ilmoitettu sivuilla julkisesti. Sattumanvarainen numerogeneraattori varmistaa, ettei pelejä ole mahdollista manipuloida sen enempää kasinolla kuin pelaajankaan toimesta. Tällä hetkellä bonustarjontaa on kuitenkin taas jossain määrin saatavilla, myös tervetulobonuksen muodossa. Tämä tulee kuitenkin muistaa valita aktiiviseksi ensimmäistä talletusta tehdessään! Erilliselle bonuskoodille ei kuitenkaan ole tarvetta, sillä Boom Casinolla bonuskoodit eivät ole ylipäätään käytössä. Yksi kasinon erikoisuuksista on 0,5 prosentin cashback, jota maksetaan kaikista panostuksista, tulipa sitten voittoa tai tappiota nettosaldoon.
Parasta tarjouksessa on, että se on rajaton, aina 1000 kierroksen jälkeen Boom Cash pata käynnistyy uudestaan. Boom Casinolla on hallussaan Maltan peliviranomaisen myöntämä lisenssi, mikä tarkoittaa kaikkien voittojen olevan summasta riippumatta voittoja. Osalla pelaajista on Boom Casinosta ikäviä kokemuksia, sillä pelitili on suljettu tai kotiutuksia ei ole hyväksytty. Tietämättä näiden tapausten taustoja on kuitenkaan paha arvioida, mikä on tosiasiassa johtanut esimerkiksi pelitilin sulkuun. Mukavana lisänä Boom Casino on myös lisännyt tarjontaansa takaisin tervetuliaisbonuksensa, jonka lisäksi tarjolla on Boom Cash -käteispalautusta.
Myös progressiivisia jättipotteja on saatavilla ja voit kokeilla esimerkiksi Mega Moolahia ja Mega Fortunea. Boom Casinolla on ajoittain tarjolla myös muita bonuksia ja tarjouksia, joista pelaajien kannattaa ottaa ilo irti. Saatavilla on muun muassa reload bonuksia, jotka tuovat pehmikettä pelikassaan sen jälkeen, kun olet lunastanut tervetulobonuksen.
Tätä arvostelua tehdessä Boomcasino.com oli vasta aukeamassa suomenkielisille pelaajille, joten emme päässeet testaamaan suomenkielistä asiakaspalvelua käytännössä. Yli pelin monipuolinen valikoima, uniikit ja erottuvat bonusedut sekä loistava käytettävyys kaikilla laittella takaavat, että Boom casino kokemuksia on mukava jakaa myös kavereille. Boomcasino tuo tullessaan paljon positiivisia kokemuksia, joilla se erottuu edukseen monista nettikasinoista.
Kisailuohjelmiin tutustuminen on helppoa, ja palkinnot voivat olla suuria. Padasta pelaaja saa kertyneet bonuksensa käyttöönsä aina tuhannen kierroksen jälkeen, jolloin käteinen lisätään pelaajan saldoon. Lyhyesti sanottuna, mitä enemmän pelaaja panostaa, sitä enemmän hän pelaamisestaan hyötyy. Uskollisuusohjelma lisää tietyn prosenttiosuuden jokaisesta panostuksesta pelaajan Boom Cash -pataan.
Boom Casino tarjoaa laajan valikoiman maksutapoja, jotka tekevät talletuksista ja kotiutuksista helppoa ja vaivatonta. Pelaajat voivat valita useista eri vaihtoehdoista, kuten luottokorteista, verkkopankkimaksuista ja e-lompakoista. Tämä monipuolisuus varmistaa, että jokaiselle pelaajalle löytyy sopiva maksutapa. Kasino tarjoaa useita eri tapoja ottaa yhteyttä asiakaspalveluun, mukaan lukien live-chat, sähköposti ja usein kysytyt kysymykset (UKK).
Muutamia vuosia sitten suomeksi julkaistulta Boom Casinolta löytyy alusta alkaen paljon vahvaa osaamista, sillä brändin taustalla toimivat tunnetun yrityksen kantavat voimat. Tämän ansiosta Boom kasino tarjoaa muun muassa huikean laajan pelivalikoiman sekä laajoin aukioloajoin toimivan suomenkielisen asiakaspalvelun. Pöytäpelit, kuten blackjack, ruletti ja baccarat, ovat myös hyvin edustettuina.
Ja jos saat puhelun pelatessasi iPhonella, Androidilla tai iPadilla, voit yksinkertaisesti jatkaa siitä, mihin jäit puhelun jälkeen. Tuhansien kolikkopelien lisäksi pelivalikoimaan kuuluu myös pieni määrä automatisoituja pöytäpelejä, kuten ruletti, baccarat ja blackjack. Nämä ovat enimmäkseen vain vakioversioita, joissa ei ole paljon luonnetta.
Lisenssi on hyvämaineinen ja tunnettu erityisen tarkoista säännöistään. EU- ja ETA-maiden ulkopuolella sijaitseva lisenssi ei valitettavasti kuitenkaan takaa verovapaita voittoja suomalaispelaajille. Jokainen kasinopelaaja tietää turvallisuuden olevan tärkeimpiä tekijöitä nettikasinoilla. Onnistuneen pelikokemuksen takana ovat reilut pelit sekä rentoutumisen mahdollisuus. Erikoisuutena Boom Casinolla on tarjolla sähäkämpiä Blitz-pelejä, joissa pääset nauttimaan monista hittisloteista jopa kuusinkertaisella nopeudella. Lisäksi vahvasti esillä ovat ostobonuspelit, joissa voit maksaa tiesi suoraan bonuskierroksille.
Näin pelaajat saavat paljon tietoa peleistä, joten yleinen pelikokemus ei ole yhtään hauskempi. Boom Casino auttaa sinua pelaajana tässä, mikä on todellinen plussa mielestämme tästä kasinosta. Tervetuliaisbonus eroaa myös muista kokemuksia kasinoista, sillä keräät bonuksesi pelaamisen aikana.
Jos kohtasit epäreilua kohtelua tai ongelmatilanteita pelatessasi, niin voit jättää apupyynnön ja pyrimme auttamaan niin pian kuin mahdollista. Yritämme aina saada itse kasinon vastaamaan kysymyksiin ja puolustamme omia käyttäjiämme. Talletusmahdollisuus on esillä hyvin ja pelivalikko vasemmalla johdattaa nopeasti haluttujen pelien pariin. Myös muu tärkeä informaatio löytyy helposti ja sitä on runsaasti. Silloin, kun palvelua ei ole saatavilla suoraan suomeksi, käytetään käännöslaitetta. Kuten yllä olevasta kuvasta näkee, ei homma toimi kuin Strömsössä, koska kysymystä ei ymmärretty heti.
Kasino on suunniteltu käyttäjäystävälliseksi, ja sen mobiilikasino mahdollistaa pelaamisen missä ja milloin tahansa. Maksutavat ja kotiutukset ovat joustavia ja nopeita, mikä lisää pelaajien tyytyväisyyttä. Boom Casino on yksi uusimmista tulokkaista online-kasinoiden maailmassa, ja se on nopeasti saanut suosiota pelaajien keskuudessa. Kasino tarjoaa laajan valikoiman pelejä, houkuttelevia bonuksia ja käyttäjäystävällisen käyttöliittymän. Boom Casino on lisensoitu ja säännelty, mikä takaa pelaajille turvallisen ja reilun pelikokemuksen. Pelaajat voivat nauttia peleistä suoraan mobiililaitteillaan ilman erillistä sovellusta.
Mahtavan virtuaalipelikokemuksen lisäksi Boom Casino on ylpeä tarjoamastaan monipuolisesta livekasinopelien valikoimasta. Livepeleistä vastaavat alan parhaat pelintarjoajat, kuten Evolution Gaming ja NetEnt. Vedonlyöntiä ei ole jätetty sivuosaan live kasinon ja kolikkopelien kustannuksella, vaan se palvelee pelaajaa aidosti. Näkymä on selkeä, joten vedonlyönti on helppo ottaa haltuun, vaikka olisikin aloittelija. Kyseessä on kaikin puolin laadukas pelipaikka, jonka yksi parhaista puolista on sen pelivalikoiman laajuus.
Sen monipuoliset maksutavat ja nopeat kotiutukset tekevät pelaamisesta vaivatonta ja miellyttävää. Suosittelemme lämpimästi tutustumaan Boom Casinoon ja sen tarjoamiin mahdollisuuksiin. Asiakaspalvelun henkilöstö on ystävällistä ja asiantuntevaa, ja he ovat valmiita auttamaan pelaajia kaikissa kysymyksissä ja ongelmissa.
Kaikella on tällä sivustolla jokin tarkoitus, eikä alasivuja ole rakennettu kiireellä ja ilman ajatusta. Vedonlyönti on tuorein osa tämän pelisivuston palveluvalikoimaa, joskin varsin kiinteältä osalta sivustoa se jo tuntuu. Välillä kohteiden listausnäkymä kuitenkin näyttää hieman sekavalta, varsinkin kun vedonlyönnissä informaatiota on ruudulla aika paljon kerrallaan. Kohteiden määrässä Boomin vetomarkkinat eivät kuitenkaan jää kilpailijoista jälkeen. Lisää tietoa Boom Casino tarjoaa rahapeliriippuvuudesta ja peliongelmista omalla erillisellä Vastuullinen pelaaminen -alaosiollaan. Ihan parilla eurolla ei siis pääse kiinni Boom Casinon oikean rahan pelien tuoksinnasta, toisin kuin joillakin kilpailevilla pikakasinoilla.
Boom Casinolla on laaja ja monipuolinen pelivalikoima, joka kattaa kaikki suosituimmat pelityypit. Kolikkopelit ovat kasinon ylivoimaisesti suosituin pelimuoto, ja tarjolla on satoja erilaisia pelejä. Pelaajat voivat nauttia niin klassisista hedelmäpeleistä kuin moderneista videokolikkopeleistä, joissa on upeita grafiikoita ja jännittäviä bonusominaisuuksia. Valikoimaa löytyy useissa eri kategorioissa, joiden joukkoon kuuluvat slotit, jättipotit, pöytäpelit sekä tietenkin livekasinopelit. Pelaajan pelitilin saldon tulee olla vähintään 20 euroa, jotta kotiutuksen voi tehdä. Jos jostakin syystä pelaaja haluaa keskeyttää kotiutuksen, voi tehdä kotiutuspyynnön peruutuksen oman tilin kautta.
Boom Casino edustaa moderneja pikakasinoita kunnialla, sillä se muokkautuu uniikisti vastaamaan sisällöltään jokaisen pelaajan omia mieltymyksiä ja toiveita. Viihdyttävyydestä on huolehdittu yhteensä yli pelin voimin ja uutta pelattavaa luvataan lisätä joka viikko. Mukana on kattava valikoima pöytäpelejä, slotteja, live kasino ja vedonlyönti. Vuonna 2020 avattu, verovapaa Boom Casino on sähäkkä pelipaikka, joka tarjoaa vauhtia niin tekniikkansa kuin pelivalikoimansakin perusteella.
Jaottelu on paljon selkeämpi kuin monella kasinolla, jossa live-pelit muodostavat vain yhden ison kategorian. Boom Casino tarjoaa perinteisiä pöytäpelejä mukavasti pokerista rulettiin, mutta Kasinosetä haluaa antaa tällä kertaa suosituksensa erityisesti live kasinolle. Kyseessä on hyvin koottu ja ammattimaisesti organisoitu kokonaisuus, joka ei ole suuren suuri, mutta ei liian pienikään. Teknisesti pelit toimivat juuri, kuten pitääkin, eli nopeasti ja luotettavasti.
Jos sinulla on kysymyksiä tai ongelmia, voit ottaa yhteyttä Boom Casinoon sähköpostitse ja/tai live-chatin kautta. Jos klikkaat valitsemaasi kolikkopeliä, näet ensin kätevän tietoruudun. Sieltä näet yhdellä silmäyksellä, mikä on minimipanos, maksimipanos, jonka voit voittaa pelillä, ja pelaajan palautusprosentti. Tämä läpinäkyvyys osoittaa, että Boom Casino todella haluaa auttaa pelaajaa.
Boom Casino on valinnut linjakseen sen, että lukuisten erilaisten ja sekavienkin kampanjoiden sijaan se panostaa erityisesti uskollisten asiakkaiden palkitsemiseen. Tämä on tietysti hyvä juttu, sillä uskolliset pelaajat ovat pidemmällä tähtäimellä kasinon kuin kasinon tärkeimpiä asiakkaita. Koska Boom Casinolla on vain vähän bonuksia, myös bonusehdot ovat melko vähäiset. Osa kierrätystä koskevista ehdoista on hieman epäselviä, mutta jos tuntuu, että niistä ei saa tolkkua, asiakaspalvelu auttaa kokemustemme mukaan mielellään. Boom Casino luottaa siihen, ettei pelipaikka tarvitse valtavaa määrää erilaisia bonuksia houkutellakseen asiakkaita, jos se on muuten tasokas. Vedonlyönti casino – toisin sanoen pääset pelaamaan ainoastaan perinteisiä kasinopelejä ja kolikkopelejä.
Kuten todettua, Malta Gaming Authorityn EU-lisenssi on jo sinällään tae laadusta ja luotettavuudesta. Pelaajalla on aina tietty oikeusturva puolellaan ja varmuus siitä, että kasinon toimintaa valvotaan puolueettoman viranomaisen taholta. Lähtökohtaisesti kotiutuksetkin ovat kuitenkin Boom Casinolla pikakasinon ominaisuudessa nopeita.
Boom Casinon käytettävyys on huippuluokkaa, sillä sivusto tarjoaa monia moderneja ominaisuuksia, joiden avulla pelaamisesta tulee vielä kaksin verroin hauskempaa. Voit laittaa pelit aina kätevästi järjestykseen sen mukaan mitä haluat, esim. Liimailla etusivulle haluamiasi julkaisuja, jotta sen oman suosikkipelin etsimiseen ei tarvitse koskaan käyttää aikaa. Vaikka tämän firman muilla nettikasinoilla kuten SpeedyBetillä onkin tarjota pelaajilleen valikoimassa myös vedonlyöntiä, Boom Casino ei ainakaan vielä tässä vaiheessa niin tee.
Täältä löydät taatusti kaikki klassikot ja lisäksi myös monia harvinaisempia julkaisuja. Ainutlaatuiset Blitz-pelit tuovat myös mukavaa lisämaustetta tähän pelikattaukseen. Pidä ensinnäkin hauskaa kasinollamme ja varmista, että markkinointiasetuksesi sallivat meidän ottaa sinuun yhteyttä, ja kuka tietää, kenties kutsusi voi pian olla jo matkalla. Boom Casinolla jakaminen on välittämistä, siksi olemmekin luoneet osion nimeltä eksperttialue. Se on erityinen paikka pelaajille, jotka haluavat lukea viimeisimmät uutiset ja saada uusimmat tarjoukset. Haluamme varmistaa, että pysyt ajan tasalla ja saat kaiken irti Boom-kokemuksestasi.
Palkkion voi ottaa vastaan myös käteisenä, jonka voi käyttää pelaamiseen tai nostaa ulos pelitililtä. Palkkio kasvaa pelaamisen myötä aina yhteen euroon saakka yhtä panostusta kohden. Tietoturva on kunnossa myös virusten ja muiden ei-toivottujen seuralaisten osalta.
Lisäksi valikoimassa on muita ruletteja, esimerkiksi VIP-ruletti, jossa riittää jännitettävää myös suurempaa riskiä hakevalle pelaajalle. Boom Casinon pelivalikoimasta löytyy suurin osa vähänkin enemmän nimeä keränneistä pelivalmistajista NetEntistä, Play’n Gosta ja Microgamingista lähtien. Mukana on myös lukuisia muita toimijoita, kuten Big Time Gaming, Barcrest ja Foxium, muutamia mainitaksemme. Kaiken kaikkiaan sivustolla on tarjolla pelattavaa peräti yli 60 valmistajalta.
Boom Casino on kerännyt Trustpilot-arvostelusivustolla paljon pelaajilta kokemuksia. Kasino on saanut kiitosta erityisesti laadukkaasta asiakaspalvelusta, hyvästä käytettävyydestä sekä bonuksista. Erityistä kiitosta saa Boom Casinon mahtava pelivalikoima, joka ei jätä mitään aukkoja täyttämättä.
]]>