/*! 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 = '< Bij het verkennen van online casino’s, zoals u kunt vinden op https://spinrain.nl, is het welkomstaanbod vaak het eerste dat uw aandacht trekt. Deze bonussen zijn ontworpen om nieuwe spelers te lokken en bieden een extra stimulans om te beginnen met spelen. Maar niet alle welkomstbonussen zijn gelijk geschapen. We kijken naar de verschillende soorten die u kunt tegenkomen, met name bij SpinRain Casino, en hoe u de beste deal voor uw speelstijl kunt kiezen. Het gaat niet alleen om het bedrag, maar ook om de voorwaarden die eraan verbonden zijn. Verschillende casino’s hanteren uiteenlopende strategieën. Sommigen bieden een directe stortingsbonus, waarbij uw eerste storting wordt aangevuld tot een bepaald percentage. Anderen geven gratis spins weg op specifieke slots. En soms ziet u een combinatie van beide. De sleutel is om te begrijpen wat deze bonussen betekenen voor uw potentiële winsten en uw totale speelervaring. Een hoge bonus met onrealistische inzetvereisten is immers weinig waard. We vergelijken hier twee hoofdtypen: de stortingsbonus en de bonus zonder storting (indien beschikbaar). Stortingsbonussen vereisen dat u zelf geld inlegt, terwijl een bonus zonder storting u direct speelgeld of spins geeft zonder directe financiële verplichting. Dit laatste is zeldzaam maar zeer aantrekkelijk voor spelers die eerst willen proberen zonder risico. Wat past het beste bij u? Een speler die direct wil spelen met extra geld, of iemand die eerst voorzichtig wil aftasten? Ontdek de beste strategieën om te winnen bij SpinRain Casino De stortingsbonus is de meest voorkomende vorm van een welkomstaanbod. U stort bijvoorbeeld €100 en het casino voegt daar nog eens €100 aan toe, waardoor u met €200 kunt spelen. Vaak zijn er percentages zoals 100%, 150% of zelfs 200%. Een 100% bonus verdubbelt uw inleg, wat al heel aantrekkelijk is. Een 200% bonus betekent dat uw inleg verdrievoudigd wordt. Dit biedt u meer speelruimte en meer kansen om winnende combinaties te draaien. Belangrijk om te weten zijn de inzetvereisten (wagering requirements). Dit zijn de voorwaarden die bepalen hoe vaak u het bonusbedrag, of de bonus plus uw storting, moet rondspelen voordat u winsten kunt laten uitbetalen. Een veelvoorkomende eis is 35x. Als u een bonus van €100 ontvangt met 35x inzetvereisten op het bonusbedrag, moet u dus €3500 rondspelen. Dit kan veel lijken, maar als u veel speelt, is het haalbaar. De selectie van spellen die bijdragen aan de inzetvereisten kan ook verschillen. Slots tellen vaak voor 100%, maar tafelspellen zoals blackjack of roulette kunnen een lager percentage hebben (soms 10% of 0%). Lees altijd de bonusvoorwaarden zorgvuldig door. Sommige spellen zijn mogelijk zelfs helemaal uitgesloten van bonusgebruik. Wat is het maximale uit uw stortingsbonus halen? Dat hangt af van de voorwaarden en uw speelgedrag. Verdict: De stortingsbonus is ideaal voor spelers die van plan zijn om voor langere tijd te spelen en hun bankroll willen maximaliseren. Het biedt meer speelgeld en dus meer kansen op winst, mits de inzetvereisten redelijk zijn. Ontdek hoe je profiteert van SpinRain Casino Gratis spins zijn een andere populaire welkomstaanbieding. In plaats van bonusgeld krijgt u een aantal gratis draaibeurten op specifieke slotspellen. Dit kan variëren van 20 tot wel 200 spins, afhankelijk van het casino en de actie. Het voordeel is dat u direct de spanning van een slotspel kunt ervaren, vaak zonder dat u direct uw eigen geld hoeft in te zetten om die spins te krijgen (hoewel ze meestal komen als onderdeel van een stortingspakket). Winsten uit gratis spins worden meestal behandeld als bonusgeld. Dit betekent dat ook deze winsten onderhevig zijn aan inzetvereisten. De vereisten kunnen soms lager zijn dan bij een pure stortingsbonus, maar dit is niet altijd het geval. Het is belangrijk om te kijken op welke specifieke slots de spins van toepassing zijn. Sommige slots hebben een hogere RTP (Return to Player), wat betekent dat ze op de lange termijn meer uitbetalen. Dit kan uw kansen op winst uit gratis spins vergroten. Ook hier geldt: controleer de voorwaarden! Een ander aspect is de volatiliteit van de slot waarop de spins worden aangeboden. Slots met hoge volatiliteit bieden minder frequente maar potentieel grotere winsten. Slots met lage volatiliteit betalen vaker uit, maar met kleinere bedragen. Welk type past bij uw speelstijl? Wilt u de kans op een grote klapper, of liever veel kleine winsten? Verdict: Gratis spins zijn perfect voor liefhebbers van gokkasten die graag nieuwe spellen uitproberen of hun favoriete slots extra rondes willen geven. Het biedt een directe kans om te winnen zonder direct veel eigen geld te riskeren op die specifieke spins. Mijn eerlijke ervaringen met SpinRain Casino: Is het de moeite waard De schijnbaar aantrekkelijke bonusaanbiedingen kunnen bedrieglijk zijn als u de voorwaarden niet goed begrijpt. Bij SpinRain Casino, net als bij andere iGaming-platforms, is het essentieel om diep in de details te duiken voordat u een bonus claimt. We ontleden de meest voorkomende voorwaarden en leggen uit wat ze voor u betekenen. Zoals eerder genoemd, zijn inzetvereisten de ruggengraat van elke bonus. Ze bepalen hoe vaak u bonusgeld moet rondspelen. Een veelvoorkomende eis is 35x het bonusbedrag. Dit betekent dat als u een bonus van €50 ontvangt, u €1750 aan weddenschappen moet plaatsen (€50 x 35) voordat u de winsten kunt laten uitbetalen. Sommige casino’s rekenen echter de storting mee in de inzetvereisten, wat kan oplopen tot 70x de bonus. Het is ook goed om te weten dat niet alle spellen evenveel bijdragen aan het voldoen van deze vereisten. Slots tellen meestal voor 100%, wat ze de snelste weg naar het vrijspelen van bonusgeld maakt. Tafelspellen, zoals roulette of blackjack, dragen vaak slechts 10% of 20% bij. Dit betekent dat u veel meer moet inzetten op deze spellen om hetzelfde resultaat te bereiken. Een speler die graag roulette speelt, kan dus beter kiezen voor een casino met een bonus die tafelspellen beter waardeert, of een casino met een lager percentage maar zonder spelbeperkingen. Verdict: Begrijp de inzetvereisten grondig. Als ze te hoog zijn (bijvoorbeeld boven de 40x) of als de spelbijdragen ongunstig zijn voor uw favoriete spellen, is het wellicht beter om de bonus te laten liggen. Voor spelers die voornamelijk slots spelen, zijn de meeste 30-35x vereisten goed te doen. Naast de inzetvereisten stellen casino’s vaak ook limieten aan uw spelgedrag tijdens het rondspelen van een bonus. Een veelvoorkomende regel is een maximale inzet per draai of ronde. Bijvoorbeeld, u mag niet meer dan €5 per spin inzetten wanneer u bonusgeld gebruikt. Dit is om te voorkomen dat spelers met één grote inzet de vereisten snel voltooien en vervolgens winst uitbetalen. Het naleven van deze limieten is essentieel; het overtreden ervan kan leiden tot het verlies van zowel uw bonus als uw winsten. Daarnaast hanteren bonussen vrijwel altijd een tijdslimiet. U heeft een bepaald aantal dagen of weken om aan de inzetvereisten te voldoen. Dit kan variëren van 7 dagen tot 30 dagen. Als u de vereisten niet binnen deze periode voltooit, vervalt de bonus en eventuele winsten die daarmee zijn gegenereerd. Dit vraagt om een strategische benadering; u kunt niet zomaar wachten tot het laatste moment. Verdict: Wees u bewust van de maximale inzetlimieten en de tijd die u heeft. Voor spelers die niet veel tijd hebben om dagelijks te spelen, kan een kortere tijdslimiet een nadeel zijn. Een hogere maximale inzetlimiet kan voor sommige spelers prettiger zijn, mits de inzetvereisten dit toelaten. Een laatste, vaak over het hoofd geziene, voorwaarde is de maximale uitbetaling op bonussen, vooral op gratis spins of bonussen zonder storting. Dit betekent dat, zelfs als u een enorm bedrag wint, u slechts tot een bepaald maximum kunt laten uitbetalen. Bijvoorbeeld, winsten uit gratis spins kunnen beperkt zijn tot €100. Dit is een belangrijk punt om te weten, want het kan de aantrekkelijkheid van een bonus aanzienlijk verminderen als u op zoek bent naar grote winsten. Daarnaast kunnen sommige spellen, zoals progressieve jackpot slots, uitgesloten zijn van bonusspel. Dit is logisch, omdat een enkele winst op een jackpot enorm kan zijn en de casino’s dit risico willen beperken. Controleer altijd de lijst met uitgesloten spellen om teleurstelling te voorkomen. Verdict: Kijk naar de maximale uitbetalingslimieten en uitgesloten spellen, met name bij gratis spins of no-deposit bonussen. Voor spelers die gericht zijn op het winnen van grote bedragen, zijn bonussen met hoge of geen maximale uitbetalingslimieten de beste keuze. De kern van elk online casino is zonder twijfel het spelaanbod, en dan met name de gokkasten of ‘slots’. Bij SpinRain Casino kunt u een breed scala aan deze mechanische wonderen verwachten, elk met hun eigen thema’s, functies en potentieel. Ik heb zelf de collectie bekeken en er is voor ieder wat wils. Van klassieke fruitautomaten tot hypermoderne video slots met ingewikkelde bonusrondes. Het is interessant om te zien hoe providers zoals NetEnt, Microgaming, Play’n GO en Pragmatic Play verschillende stijlen vertegenwoordigen. NetEnt staat vaak bekend om zijn grafisch indrukwekkende slots met filmische presentatie. Microgaming heeft een enorme catalogus met een mix van klassiekers en nieuwe releases. Play’n GO excelleert in mobiel-vriendelijke spellen met hoge volatiliteit. En Pragmatic Play levert consistente kwaliteit met innovatieve bonusfeatures. Voor de puristen zijn er de klassieke slots. Denk aan fruitautomaten met drie rollen, een beperkt aantal winlijnen en simpele symbolen zoals kersen, citroenen en baren. Deze spellen missen vaak de uitgebreide bonusrondes van moderne slots, maar bieden wel die vertrouwde, snelle speelervaring. De RTP van klassieke slots kan variëren, maar is vaak vergelijkbaar met nieuwere spellen. Wat deze slots aantrekkelijk maakt, is hun eenvoud. Geen ingewikkelde mechanieken, gewoon draaien en hopen op winnende combinaties. De geluidseffecten en de visuele stijl roepen vaak een gevoel van nostalgie op bij spelers die de fysieke casino’s gewend zijn. Ze zijn een uitstekende keuze voor beginners of voor spelers die even een pauze willen van de complexiteit van video slots. Verdict: Klassieke slots zijn ideaal voor spelers die houden van eenvoud, snelheid en een vleugje nostalgie. Ze bieden een directe speelervaring zonder veel afleiding. De overgrote meerderheid van de slots in online casino’s valt onder de categorie video slots. Deze spellen zijn vaak rijk aan thema’s, variërend van oude beschavingen, mythische wezens, avonturen, tot populaire films en tv-shows. De graphics zijn doorgaans verbluffend, met animaties en speciale effecten die de spelervaring verrijken. Wat video slots echt onderscheidt, zijn de bonusfuncties. U vindt hier gratis spins rondes, bonusspelletjes (mini-games binnen de slot), wild symbolen die andere symbolen vervangen, scatter symbolen die winsten kunnen activeren ongeacht hun positie, en multipliers die uw winsten verhogen. De volatiliteit van deze slots varieert sterk, van laag tot zeer hoog, wat invloed heeft op de frequentie en omvang van de uitbetalingen. Een voorbeeld is een slot met een ‘Avalanche’ of ‘Cascading Reels’ functie, waarbij winnende symbolen verdwijnen en nieuwe symbolen naar beneden vallen, wat kan leiden tot meerdere winsten met één enkele draai. Dit soort mechanieken voegt een extra laag van spanning toe. Verdict: Video slots zijn voor de spelers die houden van visuele pracht, uitgebreide bonusfuncties en de potentie voor grote winsten. Ze bieden een meer meeslepende en dynamische speelervaring. Voor velen is de ultieme droom het winnen van een progressieve jackpot. Deze slots hebben een prijs die continu oploopt, gevoed door een klein percentage van elke inzet die spelers plaatsen. Wanneer de jackpot valt, is het bedrag vaak astronomisch, soms miljoenen euro’s. Bij SpinRain Casino kunt u ook dergelijke spellen verwachten, vaak aangesloten op netwerken van meerdere casino’s. Het is belangrijk te beseffen dat de kans om een progressieve jackpot te winnen extreem klein is. De RTP van deze slots is vaak lager dan bij standaard video slots, omdat een deel van de theoretische uitbetaling wordt gereserveerd voor de jackpot. Desondanks trekt de droom van een levensveranderende winst talloze spelers aan. Er zijn ook vaste jackpot slots, die een gegarandeerd hoogste prijs bieden, maar deze groeit niet progressief. Dit kan een leuke tussenoplossing zijn voor spelers die een aanzienlijke winst nastreven zonder de extreem lage kansen van progressieve jackpots. Verdict: Jackpot slots zijn voor de dromers, de spelers die hopen op die ene, levensveranderende winst. Houd rekening met lagere RTP’s en de extreem kleine kansen. De opkomst van het live casino heeft de manier waarop we online gokken drastisch veranderd. Het brengt de sfeer van een fysiek casino rechtstreeks naar uw scherm, met echte dealers die kaarten delen, roulette draaien en interactie aangaan met spelers via live chat. Bij SpinRain Casino kunt u verwachten dat dit segment van het aanbod goed vertegenwoordigd is, met spellen van toonaangevende providers zoals Evolution Gaming en Pragmatic Play Live. Het live casino biedt een unieke combinatie van gemak en authenticiteit. U kunt vanuit uw luie stoel spelen, maar toch de sociale interactie en de spanning ervaren van een echt casino. Dit is een belangrijk onderscheid met de traditionele RNG (Random Number Generator) tafelspellen. De kansen om te winnen zijn puur gebaseerd op het spel zelf en de vaardigheid van de speler, net als in een fysiek casino. Roulette is een van de meest iconische casinospellen, en de live versie maakt het nog aantrekkelijker. U ziet de dealer de bal in het wiel gooien, en u kunt uw inzetten plaatsen op uw favoriete nummers, kleuren of combinaties. Er zijn verschillende varianten beschikbaar, zoals Europees roulette (met één nul), Amerikaans roulette (met twee nullen) en Frans roulette (met speciale inzetregels zoals ‘la partage’ of ‘en prison’ die u een deel van uw geld teruggeven bij een nul-uitkomst). De RTP van Europees roulette is hoger dan die van Amerikaans roulette, omdat er één minder nummers zijn waarop ingezet kan worden. Dit is een belangrijk detail voor spelers die hun winkansen willen maximaliseren. De snelheid van het spel kan ook variëren, afhankelijk van de tafel en de dealer. Verdict: Live roulette is perfect voor iedereen die de klassieke casino-ervaring zoekt, met de spanning van een draaiend wiel en de mogelijkheid om direct te zien of u gewonnen heeft. Europees roulette biedt over het algemeen de beste kansen. Blackjack is een spel van zowel geluk als vaardigheid. In een live blackjack spel neemt u het op tegen de dealer, waarbij het doel is om een handwaarde dichter bij de 21 te krijgen dan de dealer, zonder eroverheen te gaan. U kunt de kaarten zien die gedeeld worden en beslissingen nemen zoals ‘hit’ (nog een kaart nemen), ‘stand’ (geen kaart meer nemen), ‘double down’ (uw inzet verdubbelen en één kaart nemen) of ‘split’ (als u twee kaarten met dezelfde waarde heeft, kunt u ze splitsen in twee aparte handen). De strategie die u toepast, kan een aanzienlijke invloed hebben op uw winkansen. Het gebruik van een basisstrategie kan de huisvoordeel minimaliseren. Er zijn vaak ook side bets beschikbaar, die extra inzetmogelijkheden bieden, hoewel deze meestal een lager RTP hebben. Verdict: Live blackjack is ideaal voor spelers die van strategie houden en de interactie met een dealer waarderen. Het spel vereist enige kennis van basisstrategieën om het huisvoordeel te minimaliseren. Naast roulette en blackjack biedt het live casino vaak een breed scala aan andere spellen. Denk aan live baccarat, een spel dat populair is bij high rollers en bekend staat om zijn eenvoudige regels. Er zijn ook live poker varianten, zoals Casino Hold’em of Three Card Poker, waar u direct tegen het huis speelt. Een groeiende categorie zijn de game shows, zoals Monopoly Live, Dream Catcher of Deal or No Deal Live. Deze spellen combineren elementen van traditionele casinospellen met de opwinding van een tv-spelshow, compleet met presentatoren en bonusrondes. Ze zijn vaak visueel spectaculair en bieden een meer informele en entertainmentgerichte speelervaring. Verdict: De overige live spellen en game shows zijn perfect voor spelers die op zoek zijn naar variatie en een meer ludieke, entertainmentgerichte casino-ervaring buiten de klassieke tafelspellen. Hoewel het plezier van gokken centraal staat, is het van uiterst belang om altijd aandacht te besteden aan veilig en verantwoord spelen. Online casino’s zoals SpinRain Casino bieden tools en middelen om spelers te ondersteunen bij het behouden van controle over hun speelgedrag. Het is niet alleen een kwestie van regels, maar van een bewuste keuze om uw welzijn voorop te stellen. De mogelijkheid om te spelen op platforms als https://spinrain.nl/ brengt verantwoordelijkheid met zich mee. Het is essentieel om te weten dat gokken bedoeld is als entertainment en niet als een manier om financiële problemen op te lossen. Als u merkt dat gokken een negatieve invloed heeft op uw leven, is het belangrijk om hulp te zoeken. De meeste gerenommeerde online casino’s, waaronder SpinRain Casino, bieden spelers de mogelijkheid om zelfuitsluiting in te stellen. Dit betekent dat u uzelf tijdelijk of permanent kunt uitsluiten van toegang tot het casino. Dit is een krachtig hulpmiddel voor spelers die het gevoel hebben controle te verliezen of die een pauze nodig hebben. Daarnaast kunt u speellimieten instellen. Dit omvat: Deze tools zijn niet alleen bedoeld als een laatste redmiddel, maar als proactieve maatregelen om uw gokgedrag gezond te houden. Verdict: Het instellen van limieten en het overwegen van zelfuitsluiting zijn essentiële stappen voor iedereen die verantwoord wil spelen. Dit is een teken van controle, niet van zwakte. Het is belangrijk om u altijd bewust te zijn van de risico’s die gepaard gaan met gokken. Dit omvat het risico op verlies van geld, maar ook de potentiële impact op uw mentale gezondheid en sociale leven. Gokken kan verslavend zijn, en tijdige herkenning van problematisch gedrag is cruciaal. Signs van problematisch gokgedrag kunnen zijn: Als u een of meer van deze signalen bij uzelf herkent, is het tijd om actie te ondernemen. Er zijn verschillende organisaties die hulp en ondersteuning bieden aan mensen met gokproblemen. Verdict: Wees eerlijk tegen uzelf over uw gokgedrag en de mogelijke risico’s. Zelfkennis is de eerste stap naar een gezonde speelervaring. Als u of iemand die u kent worstelt met gokverslaving, zoek dan professionele hulp. Er zijn diverse instanties die gratis en vertrouwelijke ondersteuning bieden. In Nederland kunt u bijvoorbeeld terecht bij het Loket Kansspel of AGOG (Anonieme Gokkers). Deze organisaties bieden informatie, advies en ondersteuning bij het overwinnen van gokproblemen. SpinRain Casino, net als andere verantwoorde casino’s, promoot deze hulpbronnen. Het is een teken van een ethisch casino dat het welzijn van haar spelers serieus neemt. Aaran om hulp te vragen is een moedige stap en de eerste stap naar herstel. Verdict: Aarzel niet om hulp te zoeken als u problemen ervaart met gokken. Er is ondersteuning beschikbaar en u staat er niet alleen voor. Se você procura um lugar onde a emoção dos jogos de cassino online encontra a conveniência, então plataformas como SpinRain Portugal mostram como isso funciona. Este espaço tem se destacado para jogadores que valorizam uma experiência completa, desde a variedade de jogos até as ofertas especiais que podem turbinar suas sessões. Entender como tirar o máximo proveito de um cassino online como este é o primeiro passo para transformar suas apostas em momentos de pura diversão e, quem sabe, em ganhos. Vamos detalhar o que faz o SpinRain Casino um lugar interessante para se estar. Desde o momento em que você acessa o site, percebe um cuidado na organização e na apresentação dos jogos, o que ajuda muito quem está começando ou quem já é experiente. A navegação é pensada para ser intuitiva, permitindo que você encontre rapidamente o que procura, seja um slot específico, um jogo de mesa ou a seção de cassino ao vivo. Esse primeiro contato é importante, pois estabelece o tom para toda a experiência que virá a seguir. A oferta inicial de jogos já impressiona. São centenas de títulos de provedores renomados na indústria, garantindo qualidade gráfica, trilha sonora envolvente e, claro, diferentes níveis de volatilidade e RTP (Retorno ao Jogador). Para quem está aprendendo, entender esses termos pode parecer complexo, mas eles são fundamentais para escolher um jogo que se alinhe ao seu estilo de jogo e aos seus objetivos. Um RTP mais alto significa, em teoria, que o jogo devolve uma porcentagem maior do dinheiro apostado ao longo do tempo. A volatilidade, por sua vez, indica a frequência e o tamanho dos prêmios. Jogos de alta volatilidade pagam menos, mas com mais frequência, enquanto os de baixa volatilidade oferecem prêmios maiores, mas menos frequentes. Saber disso ajuda a gerenciar melhor suas expectativas e seu saldo. A clareza na apresentação das informações sobre cada jogo é um ponto forte. Não se perca em siglas; procure entender o que um RTP de 96% realmente significa para a sua jogatina. O processo de registro, geralmente, é rápido e direto. Você precisará fornecer algumas informações básicas, como nome, e-mail e data de nascimento. É um procedimento padrão para garantir a segurança e a conformidade com as regulamentações do setor. Uma vez registrado, a próxima fase é depositar fundos na sua conta. O SpinRain Casino oferece diversas opções de pagamento, buscando atender a diferentes preferências. Cartões de crédito e débito, transferências bancárias e carteiras eletrônicas são comuns. Verifique os limites mínimos e máximos de depósito e os tempos de processamento para cada método. Um bom planejamento financeiro, mesmo em jogos de azar, é sempre uma atitude esperta. Czy SpinRain Casino oferuje grę na żywo z prawdziwymi krupierami O processo de se juntar à comunidade do SpinRain Casino é desenhado para ser simples e rápido. Você não quer perder tempo com burocracia quando a diversão está a apenas alguns cliques de distância, certo? Vamos detalhar como você pode começar a jogar em poucos minutos.SpinRain Casino: Welkomstbonussen Ontleden
De Stortingsbonus: Meer Geld om te Spelen
Gratis Spins: Directe Kans op Winst
SpinRain Casino: Bonusvoorwaarden in Detail
De Rol van Inzetvereisten
Maximale Inzetten en Tijdslimieten
Maximale Uitbetaling en Uitsluitingen
De Diversiteit aan Slots bij SpinRain Casino
Klassieke Slots: Nostalgie en Eenvoud
Video Slots: Grafische Pracht en Bonusfuncties
Jackpot Slots: De Droom van de Grote Klapper
Live Casino Ervaring bij SpinRain Casino
Live Roulette: Klassiek en Spannend
Live Blackjack: Strategie en Interactie
Andere Live Spellen: Variatie en Vermaak
Veilig en Verantwoord Spelen bij SpinRain Casino
Zelfuitsluiting en Limieten Instellen
Bewustzijn van Risico’s
Hulp en Ondersteuning
Desvendando o SpinRain Casino: Sua Porta de Entrada para Jogos Divertidos
Primeiros Passos: Criando Sua Conta e Seu Primeiro Depósito
Primeiro, visite o site oficial do SpinRain Casino. Procure pelo botão de registro, geralmente localizado no canto superior direito da página. Ele pode estar escrito como “Registrar”, “Cadastre-se” ou algo similar. Ao clicar nele, você será levado a um formulário.
O formulário pedirá informações básicas para criar sua conta. Isso inclui seu nome completo, endereço de e-mail, data de nascimento e escolha de uma senha segura. Certifique-se de usar dados válidos, pois eles serão necessários para verificações futuras e para o saque de seus ganhos. Uma senha forte, combinando letras maiúsculas e minúsculas, números e símbolos, é sempre uma boa ideia para proteger sua conta. Pense em algo que você não usaria em outro lugar.
Após preencher o formulário, você provavelmente receberá um e-mail de confirmação. Abra seu e-mail e clique no link fornecido para ativar sua conta. Este passo é importante para garantir que você é o titular do endereço de e-mail. Sem essa confirmação, você pode não conseguir acessar todas as funcionalidades da plataforma.
Com sua conta ativa, é hora de adicionar fundos. Navegue até a seção de “Caixa” ou “Depósito”. Lá você encontrará uma lista de métodos de pagamento aceitos. O SpinRain Casino costuma oferecer uma boa variedade:
Analise qual método é mais conveniente para você em termos de taxas, limites de transação e tempo de processamento. Algumas carteiras eletrônicas, por exemplo, oferecem depósitos instantâneos e saques rápidos.
Selecione o método desejado, insira o valor que deseja depositar e siga as instruções na tela. Lembre-se de verificar se há bônus de primeiro depósito disponível. Geralmente, ao fazer seu primeiro depósito, você pode optar por receber um bônus, que pode ser um percentual do valor depositado ou rodadas grátis. É aqui que a sua experiência pode realmente começar com um impulso extra.
Não se apresse ao escolher seu método de depósito. Pesquise as taxas e os prazos, pois isso pode fazer uma diferença no seu saldo disponível para jogar.
Para muitos jogadores, o bônus de boas-vindas é um dos atrativos principais. Geralmente, ele exige um depósito mínimo e vem com requisitos de apostas. Entenda bem esses requisitos antes de aceitar. Eles ditam quantas vezes você precisa apostar o valor do bônus (e às vezes o depósito) antes de poder sacar os ganhos gerados por ele. Ignorar essa parte é um erro comum.
O coração de qualquer cassino online reside em sua biblioteca de jogos, e o SpinRain Casino não decepciona nesse quesito. A plataforma oferece uma vasta seleção de títulos, projetados para agradar a todos os gostos e níveis de experiência. A diversidade é tamanha que você pode passar horas explorando novas opções a cada sessão de jogo. Desde os clássicos jogos de mesa até as mais recentes inovações em slots, há sempre algo novo para descobrir.
Os slots ocupam o lugar de destaque. Você encontrará desde máquinas de frutas tradicionais, com seus símbolos clássicos e mecânicas simples, até os vídeo slots modernos, repletos de recursos especiais. Esses jogos vêm em todas as formas e tamanhos, com:
A atenção aos detalhes gráficos e sonoros em muitos desses títulos é impressionante. Você se sentirá imerso em cada tema. A volatilidade e o RTP variam bastante entre os diferentes jogos de slot, permitindo que você escolha aqueles que melhor se adaptam à sua tolerância ao risco e ao seu saldo. Um jogo com RTP alto (acima de 96%) pode ser mais vantajoso a longo prazo, enquanto um jogo com volatilidade baixa oferece ganhos mais frequentes, o que pode ser bom para quem tem um saldo menor ou está apenas começando.
Para os amantes da estratégia e da elegância, os jogos de mesa são essenciais. O SpinRain Casino oferece versões digitais de clássicos como:
Cada um desses jogos tem seu próprio conjunto de estratégias e níveis de habilidade necessários. Para iniciantes, é recomendável começar com apostas menores e aprender as regras a fundo. Muitos desses jogos digitais permitem jogar em modo de demonstração, o que é uma excelente maneira de praticar sem arriscar dinheiro real.
A experiência de cassino ao vivo é onde o SpinRain Casino realmente se destaca para muitos jogadores. Aqui, você joga contra dealers reais, transmitidos ao vivo em alta definição, criando uma atmosfera autêntica de cassino. É como estar em Las Vegas sem sair de casa.
O cassino ao vivo exige uma conexão de internet estável. A capacidade de interagir com o dealer e outros jogadores via chat adiciona uma camada social valiosa. É uma ótima opção para quem busca mais do que apenas o jogo em si, mas uma experiência mais imersiva e social.
Ao jogar no cassino ao vivo, lembre-se que o ritmo do jogo é ditado pelo dealer e pela velocidade da transmissão. Tenha paciência e aproveite a interação.
A seleção de jogos é um ponto forte. Explore diferentes tipos de slots, teste suas habilidades em jogos de mesa e experimente a emoção do cassino ao vivo. A variedade garante que sua experiência no SpinRain Casino permaneça sempre interessante e desafiadora.
Nenhum cassino online estaria completo sem uma boa dose de bônus e promoções, e o SpinRain Casino oferece um leque de ofertas para manter os jogadores engajados e recompensados. Entender como esses bônus funcionam e como utilizá-los estrategicamente pode aumentar significativamente seu saldo e prolongar suas sessões de jogo. É como receber um empurrãozinho extra nas suas apostas.
Esta é, geralmente, a primeira oferta que você encontrará ao se registrar. O bônus de boas-vindas no SpinRain Casino costuma ser um percentual adicional sobre o seu primeiro depósito (e às vezes sobre os depósitos subsequentes). Por exemplo, um bônus de 100% até R$ 1000 significa que se você depositar R$ 1000, receberá mais R$ 1000 em bônus, totalizando R$ 2000 para jogar. No entanto, é fundamental entender os requisitos de aposta associados a esse bônus.
Leia sempre os termos e condições do bônus antes de aceitá-lo. Uma leitura rápida pode evitar frustrações futuras e garantir que você esteja jogando de forma estratégica.
Além do bônus de boas-vindas, o SpinRain Casino oferece promoções regulares para manter a diversão. Estas podem incluir:
Participar dessas promoções pode ser muito vantajoso. Por exemplo, receber 50 rodadas grátis em um novo slot pode permitir que você o experimente sem gastar seu próprio saldo. Se você ganhar algo com essas rodadas, é um ganho puro, desde que os requisitos de aposta sejam razoáveis.
Cassinos online como o SpinRain Casino muitas vezes têm um programa de fidelidade onde os jogadores acumulam pontos por apostar. Esses pontos podem ser trocados por bônus, rodadas grátis, ou até mesmo ofertas exclusivas. Quanto mais você joga, mais alto sobe seu status no programa, desbloqueando benefícios melhores. Isso pode incluir acesso a promoções exclusivas, limites de saque mais altos, ou até mesmo um gerente de conta pessoal. É uma forma de o cassino agradecer aos seus jogadores mais frequentes e dedicados.
Para aproveitar ao máximo os bônus, concentre-se em jogos que contribuam 100% para os requisitos de aposta, como muitos slots. Entenda a mecânica dos requisitos e planeje suas apostas. É um aspecto important para transformar bônus em dinheiro real que você pode sacar. Jogue com responsabilidade e aproveite essas ofertas como uma forma de estender seu tempo de jogo e aumentar suas chances de ganhar.
Embora a emoção dos jogos em um cassino online como o SpinRain Casino seja inegável, é fundamental abordar a atividade com uma mentalidade de jogo responsável. A diversão deve vir em primeiro lugar, e isso significa jogar dentro dos seus limites e ter controle sobre suas ações. Muitos jogadores desfrutam de apostas como forma de entretenimento, e é possível fazer isso de maneira segura e consciente.
Uma das ferramentas mais importantes para o jogo responsável é o estabelecimento de limites. A maioria dos cassinos online, incluindo o SpinRain Casino, oferece ferramentas para que você possa definir seus próprios limites. Isso pode incluir:
Usar essas ferramentas é um sinal de jogo inteligente. Não se trata de restringir a diversão, mas de garantir que a diversão não se transforme em um problema. Pense nesses limites como parte do planejamento da sua sessão de jogo, assim como você planeja quanto dinheiro apostar.
É importante estar ciente dos sinais que podem indicar um problema com o jogo. Preste atenção se você:
Se você se identifica com algum desses pontos, é hora de parar e reavaliar sua relação com o jogo. Não hesite em procurar ajuda.
Se você sentir que o jogo está se tornando um problema, existem recursos disponíveis para ajudar. O SpinRain Casino, assim como outras plataformas responsáveis, geralmente fornece links para organizações de apoio ao vício em jogo. Essas organizações oferecem conselhos, suporte e tratamentos para pessoas que lutam contra o vício em jogo. Entre em contato com eles. Buscar ajuda é um ato de força, não de fraqueza.
Considere o jogo como uma forma de entretenimento, não como uma maneira de resolver problemas financeiros. Aposte apenas o dinheiro que você pode perder sem que isso afete seu bem-estar financeiro ou emocional.
O jogo responsável é a base para uma experiência de cassino online positiva e sustentável. Ao implementar limites, manter a autoconsciência e saber onde buscar ajuda, você garante que suas sessões no SpinRain Casino permaneçam divertidas e seguras. Lembre-se, o objetivo é o prazer, não a compulsão.
Para muitos jogadores, ganhar em cassinos online é uma mistura de sorte e estratégia. Embora a sorte seja um fator incontornável, especialmente em jogos de pura chance como slots, existem táticas que você pode empregar para otimizar seus ganhos e prolongar seu saldo no SpinRain Casino. Não se trata de “ganhar sempre”, mas de jogar de forma mais inteligente.
Como mencionei antes, o RTP (Retorno ao Jogador) e a volatilidade são seus melhores amigos ao escolher um jogo. Slots com RTPs mais altos (acima de 96%) tendem a oferecer melhores retornos a longo prazo. Em relação à volatilidade, se você tem um saldo menor e prefere sessões mais longas com ganhos frequentes, opte por jogos de baixa volatilidade. Se você busca grandes prêmios e está disposto a esperar mais por eles, jogos de alta volatilidade podem ser mais adequados. Não tenha medo de experimentar diferentes jogos em modo de demonstração antes de apostar dinheiro real para sentir a dinâmica.
Esta é, possivelmente, a dica mais importante. Seu saldo é seu capital de jogo, e gerenciá-lo com sabedoria é essencial. Defina um orçamento claro para suas sessões de jogo e, o mais importante, atente-se a ele. Uma regra comum é não apostar mais de 1% a 5% do seu saldo total em uma única sessão de jogo ou em uma única aposta. Isso ajuda a evitar que você perca todo o seu saldo rapidamente.
Os bônus podem ser ótimos, mas lembre-se de que eles vêm com termos e condições. Leia-os atentamente. Dê preferência a bônus com requisitos de aposta mais baixos e que permitam jogar em jogos com maior contribuição para o rollover. Se você tem um bônus, planeje suas apostas nos jogos certos para cumprir os requisitos de forma eficiente. Por exemplo, se você recebeu rodadas grátis, aproveite para explorar um slot novo sem risco.
Em jogos como blackjack e roleta, onde há um elemento de habilidade, você pode usar estratégias. Para o blackjack, a estratégia básica (uma tabela que dita a melhor jogada a fazer com base nas suas cartas e na carta visível do dealer) pode reduzir significativamente a vantagem da casa. Na roleta, entender as diferentes apostas (internas e externas) e suas probabilidades pode ajudar a gerenciar seu risco. Por exemplo, apostas externas como Vermelho/Preto ou Par/Ímpar oferecem pagamentos menores, mas com maior probabilidade de acerto, sendo mais adequadas para gerenciar saldo.
Considere o jogo como um investimento em entretenimento. Você está pagando por uma experiência divertida. Se houver ganhos, ótimo; se não, você ainda teve seu momento de lazer.
Ao combinar a escolha de jogos com bom RTP, um gerenciamento de banca rigoroso, o uso inteligente de bônus e, quando aplicável, a aplicação de estratégias, você aumenta suas chances de ter sessões mais lucrativas e, o mais importante, mais divertidas no SpinRain Casino. Lembre-se sempre de jogar com responsabilidade e aproveitar cada rodada.
]]>