/*! 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 = '<
That is a massive red flag and bettors will just find other UK online casino sites to play at. This site could be neck and neck with another casino site in terms of welcome bonuses, customer support, payment methods and number of slots games. When we compare online casinos we have a method when rating the sites. We will show you the exciting side of online gambling with the best welcome offers and special bonus deals that will be on offer at every casino site. By doing this, we are providing bettors with everything they need to know when it comes to online gambling at the top 50 online casinos. We ensure we employ writers with a wealth of experience writing online casino reviews that provide players with the best information available.
Here’s a look at some of the top 50 online casino sites according to different organisations and when they scooped the coveted prizes. With so many top UK online casinos in the UK, there is always a competitive field in awards season. Real tables with live dealers, the ability to chat with other players and gameshow-style titles with human hosts such as Monopoly Live are just some of the functionality you can expect.
Customers who sign up and register a new account will need to deposit and wager at least £10 on any slot game to receive the 50 free spins. Unlike many betting websites that offer just casino, HighbetUK has options for casino as well as their other products. Something that sets HighbetUK apart as a real money casino is its impressive bonus.
The UK Gambling Commission states (in terms of casino player rights) that players must be allowed to withdraw their deposit balance at any time, even when a bonus is pending. When assessing new casinos UK players can trust, we apply best horse racing betting sites in the UK a systematic, transparent process. While Mr Q may have strong offers across the board, Pub Casino leads in the new-site category for no wagering casino bonuses by offering straightforward, transparent cashback with no wagering.
Duelz is a unique site well worth your time, especially if you’re looking for fast withdrawal casinos in the UK. Pay by Mobile deposits through your debit card are almost instant, and there are no bonus charges. Although only around since 2022, the site has established itself as one of the top options for mobile play, with excellent iOS and Android apps and lightning-quick and secure mobile payments. If you’re looking for the best pay-by-mobile casino in the UK, HotStreak is our recommendation. In addition to traditional poker games such as Texas Hold ‘Em and Omaha, there is a large variety of in-house variations to both games and tournament structures called GGPoker Originals.
Every slot and casino game has its own odds, return to player percentage (RTP) and payouts. Read our top stories about the world of UK casino sites. As part of a Responsible Gambling policy, regulated UK casinos are also required to provide players with tools that they can use to modify their playing behaviours.
Indulge in the timeless excitement of classic casino games at 32Red Casino. Games are divided into different categories per the numerous tabs at the top of the page, so if for example you want to see all the different types of roulette games on offer, click the ‘roulette’ tab. With everything you need in one place, getting started at 32Red is the perfect way to explore all the thrills of a leading online casino. Once your account is set up, you can choose from a wide range of secure deposit options, including debit cards, e-wallets, and bank transfers, making it easy to fund your account and start playing for real money. But if you’re still not sure what it is exactly about 32Red that makes it a UK online casino that has stood the test of time and somehow just keeps getting better and better, keep reading.
These casinos use SSL encryption to protect your personal and financial details, and their games are independently tested for randomness and fairness. Every online casino listed here holds a licence from the UK Gambling Commission and must meet strict requirements for player protection and fair gaming. With excitement, variety, and real money gaming, 32Red Casino has built its reputation as a standout choice for online players. The casino offers a comprehensive suite of responsible gaming tools, allowing you to set deposit limits, take breaks, or even self-exclude if you need time away from gaming. 32Red is dedicated to ensuring that your experience with casino games remains fun, safe, and under your control.
]]>Furthermore, UK players are now prioritising bankroll management tools over chasing bonuses. Dozens upon dozens of live dealer games, or RNG blackjack options to choose from. Buzz casino are brilliant for jackpot games, they’ve a huge number of them, so if you are a jackpot hunter, they are very much recommended. Coupled with the loyalty program and regular promotions, Spinyoo really do offer a place for regular players to feel valued – We don’t best bitcoin sports betting sites ask for much more than that. This is separated from the main part of the site, where you can browse a huge range of live dealer games, running through the usual blackjack and roulette through to live poker too. Very much like Neptune, they have a simple interface, making finding the games you want to play nice and easy, providing ‘top picks for you’ based on your play history.
Games like Big Bass Bonanza, Starburst, Big Bass Splash, Gates of Olympus, Sweet Bonanza and Gold Blitz are staples at nearly every UK online casino because of their huge demand. A lot of casino sites like to showcase their own exclusives, but you’ll usually find the most popular titles across more than one platform. This gambling method allows punters to recreate betting in a real casino by placing bets alongside a live video of a human dealer. You may have seen logos for organisations likeeCOGRAif you’ve visited casinos online before. How exactly do sites ensure that their games are fair, honest and safe for the general public to use? The United Kingdom is one of the largest online casino markets on the planet.
It is important to know that a pre-paid card is only available to make deposits, and the amount you can deposit will depend on what you have stored on the pre-paid card. It is safer to use your debit card, so you qualify for any deal or offer. Whether it is in the world of gambling or with everyday activities, people want a quick and simple service if they are paying for it. The customer support section is also a very important part of the gambling process.
A lot of punters love to play Blackjack at real money casinos as they combine luck and skill in an attempt to win money. Looking for the best online live casinos to enjoy real time gaming action? Usually powered by software providers such as Evolution, goodlive casino sitesare expected to provide the likes of Blackjack, Roulette, and many other titles. At a real-life casino, you can only play the games that are situated in the building.
Poker is one of the most popular casino card games and is available at most UK online casino sites. Once the game has passed the test and has gone out live, online casino sites are legally required to check its performance. When using the best real money casinos in the UK, players can use features & responsible gaming tools that help to keep their online experience healthy. Big Bass Splash is used by a lot of the online casinos in the UK, and although you may need to play that game at first with your free spins, you do not have to continue using that game.
There are plenty of UK online casinos, but how do you know which ones can be trusted? It is essential for the all casinos online to be licensed and regulated by the UK Gambling Commission in order to accept UK players, as well as having reputable affiliates. Most casino sites will operate a 24/7 live chat system that allows punters to chat with an experienced operator who can help with any problems that arise. There are plenty of online casinos available and in this section we will do a comparison between online casinos that are licensed in the UK and the benefits for doing so.
Star Sports looks after their casino players and they will provide new customers with the chance to claim 100 Free Spins to be used on Big Bass Splash 1000. The next site to make it onto our UK online casino list is Star Sports. TheBetnero welcome bonusgreets new customers with an attractive offer of 100% casino bonus up to £50 plus 50 Free Spins on Big Bass Splash.
What sets them apart is their dedicated focus on providing the most comprehensive blackjack experience available at any new UK casino. A great new option for roulette players, particularly those who are also interested in sports betting. If you navigate to the table games section, you’ll find further variations of roulette, including American First Person Roulette and European Roulette. ✓ Wide variety of games from all the top providers The ‘New Games’ section is regularly updated, while customers can get a sense of what other gamers are playing via the ‘Popular’ and ‘Hot Slots’ sections. Yet there’s hundreds of alternative slots too, including video slots, Drops and Wins, Megaways and slingo.
First deposit only. Claim up to £50 on your first deposit. Spins must be used and/or Bonus must be claimed before using deposited funds.
We are not saying you should have your mobile crypto casino sites phone glued to your hand and you need to be playing at online casinos every second of the day. Customers can download any of the real money online casino apps for free and have the benefit of playing a wide variety of online casino games from the convenience of their smartphone or tablet. BetMGM is one of the best sites on the list of online casinos and their welcome offer is proof of that.
]]>Others delay payments or deliver poor customer service. Always check a casino’s licence status – or just use our trusted list and save the worry. Here’s what we look at in every casino we review – and what you should too. Our team of casino experts have tested all these areas out to and here are the winners in each category. We have carried out detailed analysis of each casino site to discover what they are good at and where they stand out. Always on 10% cashback on your deposits is something we hadn’t seen before.
Minimum deposit £10. BeGambleAware.org The Welcome Offers cannot be used in conjunction with any other bonuses. However, there’s another aspect that further sweetens the pot – our excellent casino promotions!
There’s a plain and simple 100 free spins waiting for you at 888Casino when you deposit £10. Bonus funds expire in 30 days, subject to 10x wagering of bonus funds only. Claim bonus via pop-up/My Account within 48 hours of deposit.
Casumo was founded in Sweden in 2012, and over the last decade, it has almost become a household name in the gambling world. Wagering requirements apply. The live chat is available 24/7, meaning that if there are problems, help is always at hand. Instead, the casino ensures that it explains all terms and conditions, fees, and so on in clear language.
New players at BetMGM UK can look forward to a great welcome offer of 200 free spins on Big Bass Splash when you deposit and play for £10. Opening a new online casino account comes with a whole lot of perks, especially if you choose one of our top 50 online casinos for the UK. Players in the UK are spoiled for choice when it comes to top online casinos, and even though you might have a few accounts already, you may be in search of better options. Opt in, deposit £10+ within 7 days of registering & wager 1x on any live casino games within 7 days to get £5 in Golden Chips to use on eligible Playtech games. Opt in & deposit £10+ in 7 days & wager 1x in 7 days on any eligible casino game (excluding live casino and table games) for 50 Free Spins.
Duelz has an average payout time of 6 minutes from request to the money landing in your account. He has worked in the sports betting industry since 2017 and has provided content for some of the biggest casino and betting brands in the UK. Liam is an experienced iGaming and sports betting journalist based in Cardiff. On top of that, you can also get your hands on an array of exciting bonuses and promotions. This creates a seamless loop where your registration and CSS Garden’s CSS best practices deposits are handled instantly without manual data entry.
Welcome Offer is 50 free spins on Big Bass Bonanza on your first deposit. Welcome Offer is 75 free spins on Big Bass Bonanza on your first deposit. Opt in and stake £10+ on Casino slots within 30 days of reg. All offers valid for 7 days after claiming. £20 Bonus on selected games (10x Wagering). 18+ New players only.
Today all self-respecting casinos are fully mobile compatible. Therefore, be sure to check that the casino you are interested in has the type of games that you are looking for. In the UK, you should only ever play at gambling sites licenced by the UKGC. Thereafter, there are plenty more promotions to enjoy offering free spins, cash bonuses, and more. 20 bonus spins on “Sahara Riches Cash Collect” and 100% deposit bonus up to £25 on first deposit.
]]>If playing top-rated games is your thing, you can stop the scroll right here, because whatever you’re in the mood for, there’s plenty to pick from here. For all those new here, let’s point out that Casumo is a UKGC-licensed casino, meaning UK players get a site built around strong standards for security and fairness. You’ll see the remaining wagering requirement for your casino bonus there. Come explore our bursting library of 3,500+ slots, try one of the best Live Casino experiences around, and get stuck into all our classics that simply never get old. Whether you’re here for the spark of the best slots around or a seat at our exclusive Live Blackjack tables, you’ve found the home of fair play and world-class entertainment. For less urgent queries, you can also reach the support team via email or browse the Help Centre, which includes detailed guides and FAQs on account management, deposits, withdrawals, and gameplay.
However, it is worth noting that the app is relatively new, and it has less than 50 reviews on each platform at the time of writing. I signed up with the site when it was first launched and have watched it continue to improve in the time since. I am clearly not alone in this experience, as the site boasts impressive ratings on the App and Google Play Stores. Another major US player that has entered the British market is Bally Casino.
Many games include free-spin triggers, bonus rounds and progressive prize mechanics, and new titles are added regularly to keep the selection fresh. We want to provide you with a lifelike casino experience directly from your own home, and what better way to do that than with our mobile gaming app? You’ll find an unparalleled online gaming experience, no matter how much or how little you have played before. Just the thrill of the latest sports betting odds and online casino action. You can find a varied collection of slots at Unibet, including video slots, jackpots slots, Megaways slots, and the classic titles that paved the way for the modern hits.
Matched deposit bonuses may offer higher potential value but often come with wagering requirements. Some PayPal casino apps UK players can access support both deposits and withdrawals via PayPal. A strong mobile casino app should work smoothly on both iPhone and Android devices and offer responsible gambling tools. Slots are the most popular game type on real money casino apps used by UK players. For those who prefer an alternative e-wallet, our guide to the best Skrill casinos for UK players is worth checking out.
During this time, users will be unable to access not just their LeoVegas login, but also their accounts at sister casinos also run by LeoVegas Gaming PLC. Reality Check reminders are designed to help players recognise how much time they’re spending on our website. We have implemented a number of safer gambling tools to help our players build responsible gambling habits. Note that players may only claim one new user offer. As a premier casino provider in the UK, LeoVegas has an incredibly diverse collection of games and betting opportunities spanning multiple categories.
That’s why it practically goes without saying that all UK mobile casinos As seen on CreativWeb I’ll ever showcase to you make this a priority. Of course, all games must be at least mobile-compatible, with some mobile exclusives to boot. There are so many brilliant mobile casinos to choose from in the UK that knowing where to start can be a real headache. Finding a high-performance casino app that doesn’t crash during a high-stakes Live Dealer session or drain your battery with unoptimized code is a constant struggle for UK players. Selected games offer withdrawable cash prizes (up to £750) – expires within 30 days.
Remember, you’ll usually need to withdraw to the same method you used to deposit, except in the case of prepaid cards. If that’s not possible, you’ll be asked to submit ID and proof of address documents before you can start playing. You should always start off by clicking on a link on this page at Bookies.com – that’s how we can ensure you’ll get the best possible welcome offer. Must opt-in to each offer.
]]>However, I’ve known for a while now that it also offers a top-quality casino selection for players. With 32Red, I was treated to one of the most diverse gaming portfolios on the market, loaded with top online slots, live casino, and more. For starters, it lured me in as a new player with a brilliant three-part welcome bonus worth 200 spins to be used on selected slots. I was happy to see this stylish, modern casino offers over 1,000 different games from some of the industry’s biggest names. I was impressed by the operator’s collection of over 2,000 games, with slots on offer from the likes of NetEnt, Play’n Go, and Push Games. Speaking of bonuses, there is a no-deposit welcome bonus of 10 free spins that players can claim.
Whether you want to play online slots casually or discover new online slots available for UK players at Spin & Win, the site makes browsing and comparing games easier and straightforward. Full game details are available to review at any time, and once registered and logged in, access to play online casino games is direct and easy. Spin & Win is a casino site in the UK where players can play a wide range of online casino games for real money.
While not all UK online casinos accept cryptocurrency at the moment, you’ll find a few that do. Depositing and withdrawing is essential at online casinos – after all, you want to stand a chance for an online casino real money win. Video poker is hugely popular at land-based casinos, but it can be a little difficult to find at online casinos. Basically, any game you can play in a land-based casino should be available at your online casino of choice, plus lots of extra options. For example, they don’t just have generous welcome offers, they also have lots of bonuses for players who keep coming back.
Online casinos don’t get to rise to high levels of popularity without being able to consistently demonstrate to players that they’re safe and secure places to play. It’s also key that we see high quality mobile apps that feature most of the games from the regular desktop sites. The highest of these are the live casino games, such as Pragmatic Play’s Live Blackjack game with an almighty RTP of 99.5%. All British is another online casino with a high quality mobile app.
When you sign up and play your first £10, we’ll treat you to 100 free slot spin. When we give you casino bonus promotions, we want you to enjoy them, not need a law degree to understand them. Throw in the sharp gameplay of Play’n GO, the classic vibes of Greentube, and the feature-packed fun from Blueprint Gaming, and you’re spoilt Bugy’s ultimate buggy buyer’s guide for choice.
Extra cash in your account – with wagering requirements. All services are provided in English and are designed to give customers clear information in a timely manner. Experience enhanced value with our welcome offer designed for new Unibet UK customers. At Unibet UK, our slot library is packed with fan-favourites and exciting classics — think hits like Eye of Horus, Big Bass Splash and Gold Blitz Ultimate — plus many other staple titles from top providers. Only play if you are 18 or over, and check the terms and eligibility for any promotions before you opt in.
All of the top online casinos in the UK are totally safe for you to use. We’d been able to whittle down the selection to the top 10, top 20, and top 50 UK online casinos, where you can sign up right now. Hundreds of the best online casinos operate legally in the UK, but some are definitely better than others. Some UK online casinos have a dedicated helpline or email address just for complaints.
]]>Whatever kind of different slots you’re looking for, it’s just a deposit away – and then you’ll have a great choice of the best slots games at our online casino! With smooth gameplay, transparent mechanics and live prizes that increase with every qualifying spin, this collection gives you a fast and exciting way to enjoy jackpot slots online. Yes, you can win real money at online casinos, especially when playing licensed games from providers like NetEnt and Microgaming.
Min £10 lifetime deposit required. These Rules exclude any type of casino and/or bingo wagering. The Qualifying Bet must settle within 30 days from when you make the first deposit. You have 30 days from when you make your first deposit to place the Qualifying Bet, completing the remaining Qualifying Requirements.
One offer per player. No wagering requirements on free spin winnings. Claim your 50 Free spins from your promotional hub. Accept Free Spins to use on King Kong Cash Even Bigger Bananas Jackpot King via pop up within 24 hrs of qualifying (10p spin value, 3 days expiry). Max 200 spins on Fishin’ Frenzy Even Bigger Fish 3 Megaways Rapid Fire.
Whether you’re playing for real money or just for fun, you’ll always have the tools and support you need to play responsibly. These features are always available and easy to use, helping you manage your gaming activity in a way that suits you best. Thanks to our intuitive mobile platform, you can enjoy a seamless gaming experience wherever you are. They’re quick Read more at CAFC Women and easy to play and will appeal to the player who doesn’t necessarily want to play for big stakes, but is after big thrills.
We were founded in 2012 and have spent well over a decade revolutionising the mobile casino industry. If you need support in relation to your gambling habits you find more information at gambleaware.org. Find out more about the UKGC on For the latest details, head to our dedicated offers page to always be on the pulse of what’s happening at Casumo. Make your initial deposit and you’ll get a proper Casumo hello. If it’s variety you want, the lobby brings it in style, and if it’s an intuitive site you’re after, that is exactly what Casumo delivers.
Gambling.com has been helping UK players find the best online casinos for nearly 20 years. All of the sites that we feature here prioritise mobile casino games, and make their slots and other games easily accessible on smartphones and tablets. One of the reasons UK online casinos are required to verify the identity of its players. The games at all of the online casinos featured here are independently audited and tested by a third party agency, such as eCogra or iTech Labs. This is a huge win for players, given that some casino sites have had wagering requirements up to 65x and higher.
The exact time it takes to reach you can vary depending on the method used and other checks. Your money is safe with us since we’re a UKGC-licensed casino. The minimum deposit is £10 across all available deposit methods. Select your balance from the main menu, choose your preferred deposit option, then follow the on-screen steps. Play with more cash in your balance – wagering requirements included.
]]>
Licensed casinos must follow strict rules
Unlicensed casinos may not protect your funds or resolve disputes fairly
The longer the jackpot goes unclaimed, the more it grows — until it is randomly awarded to a lucky player. Getting started couldn’t be easier — just visit the Jackpot slots login & account page to jump in. Like pick’em rounds, free spins that can be re-triggered, or Walking Wilds. Like those whose action is taking place in Ancient Egypt or slots featuring different assortments of fruits or candy, for those with a sweeter tooth. So a real (human) Dealer will manage the game including spinning the ball onto an actual roulette wheel, keeping losing chips and paying out winning ones, and all done with a smile on their face. If for you a casino game should involve elements of strategy and decision-making, then maybe you should start out with the old classics.
We get reviews from players practically every day. The offer is valid for 30 days after sign up. Again, there’s no wagering requirements applied to your free spin winnings. Any good casino site will have this game. An absolutely classic casino game. WhichBingo cares about responsible gambling and we highly rate sites that do too.
Please ensure you continue to gamble responsibly if you join any of the sites we feature. Legit sites will also be operated from a reputable jurisdiction, like Malta, Alderney or Gibraltar. Any casino that we feature here will adhere to UKGC regulations with regard to terms and conditions. The Gambling Commission wants to change this, so it is adding rules that mean a ‘deposit limit’ will only refer to deposits you make and won’t factor your withdrawals. You can rest assured that at WhichBingo we will not recommend a UK casino site that does not protect your payments, personal and financial data. However, the main point of difference is when it comes to withdrawals, which is dependent on the individual casino as well as the chosen payment method.
C) have no wagering requirements and there is no cash alternative to Free Spins. B) must all be played through before your account balance will be updated with any applicable winnings; and A) are credited once the game is opened, refreshed or you leave the game to the home page and return to it;
We’ve reviewed hundreds of the UK’s best online casino sites and rated them all – so you can compare and choose the perfect casino for your needs. Registration provides access to the full range of slots, Slingo games and jackpot titles available on the platform. Players can access a variety of slot games, Megaways titles, jackpot slots and Slingo games on this platform. Most online casino games use Random Number Generator (RNG) technology to ensure outcomes are independently determined. Each promotion clearly outlines eligibility, wagering requirements and qualifying games, so players understand the terms before participating. Slingo is one of the online casino games that sets this UK online casino apart.
New operators are regularly added to the site, with existing sites shifting up or down the list throughout the month. Sites like MrVegas, Pub and Grosvenor are consistently ranked among the most reputable thanks to their strong licensing, secure payments and responsible gambling tools. Dean Ryan has nearly 20 years of experience in the gambling industry, working directly with some of the UK’s most recognised operators, including 888, Bet Victor and Boyle Sports. Finally, wherever you decide to play, remember to set limies and gamble responsibly.
How to make deposits, payments and withdrawals at LeoVegas UK Additional terms and conditions for each of the offers above can be found on their respective pages. The LeoVegas sportsbook welcome promotion offers users a 100% profit boost worth up to £100 in extra winnings on their first bets. Ranging from welcome bonuses to weekly deals and more, LeoVegas’ Smith’s Magazine commentary promotions stand out from the crowd. With HD streaming and professional dealers, LeoVegas UK brings the excitement of a real casino directly to your device.
]]>The second most popular promo in the case of the UK gambling niche is a bonus cash offer. A standalone promotion appeared in some of the newest online casinos in the UK. That’s why the best approach is to cover all the available options for playing for real money without making a deposit at new and leading casino sites in the United Kingdom. It’s advisable to verify that the no deposit bonus offer remains active. We also consider the ease of claiming these bonuses and the level of customer support available to players.
To receive this £0.50 no deposit bonus, you must verify your debit card. After you clear the wagering requirements, you need to make a minimum deposit to withdraw the funds. After registration, you need to verify your card to claim this no deposit bonus. Get your Royal Valley no deposit bonus in 2026 directly on KingCasinoBonus UK. Still, to be able to cash out, you will have to complete a 60x wagering requirements. Yet, for a no deposit offer, the 60x wagering can be too high.
Quite a few slots use the all-ways-win system. Many slots do things differently. Some slots pay you for Essay Solution’s expert guidance getting just one scatter on screen; others only give you a win if there’s a minimum number of them.
Welcome Offer is 50 free spins on Big Bass Bonanza on your first deposit. Finally, opt in, deposit and wager £10 to receive 200 more Free Spins on slots. Next, enjoy your 10 Free spins on Paddy’s Mansion Heist (Awarded in the form of a £1 bonus).
Knowing as much as you can about a slot can help you decide whether it’s worth playing or not. Before playing a progressive jackpot slot, check the paytable to find out how much the prize fund starts at and how you can win it. Mega Moolah is regarded as one of the best slots thanks to its incredibly high payouts. On any random spin, the jackpot feature can trigger, with higher bets giving it a better chance of coming into play. These games typically have a feature where you can win any of the jackpots.
That said, there are definitely ways that you can improve the bonus and maximise its winning potential. These provide punters with a free bet without the need for them to deposit their own funds. If you are a sports bettor, no deposit free bets are going to be a popular option for you. To get these, you just need to opt-in, then deposit and wager £10 using a Debit Card, Pay by Bank, or Apple Pay. Legit sites will also be operated from a reputable jurisdiction, like Malta, Alderney or Gibraltar.
New players can claim an impressive 70 free spins simply by registering an account and adding a valid debit card—no deposit is required. While no deposit offers are an excellent way to start playing without risk, many players also want to know where their chances of long-term payouts are stronger. In some cases, the operator will want players to wager a certain number of times before any winnings from these free spins can be withdrawn.
Every online casino featured holds a valid UKGC licence and has been independently reviewed by our team. We update this list every month to reflect new casino promotions, expired offers, and any changes to terms. Casino bonuses are legal in the UK when they are offered by licensed operators.
Unlike standard bonuses, these offers allow you to keep your winnings without having to meet strict wagering requirements. When we combine these two together, you get this page, an in depth look at casinos, with structure in place to rate them, plus a focus on no deposit free spins offers. Of course, in addition to this, our page here is dedicated to no deposit free spins, so when we’re looking at brands for this page, they have to offer this kind of welcome bonus to new players. Some offers have restrictions on the games you can use to get your free spins, and these are even more common with no deposit free spins. There are many casino bonus offers and you will have heard of free spins no deposit offers, but what’s the pros and cons when it comes to this particular offer type?
]]>If a casino cannot explain its bonus in a few clear sentences, that is a warning sign. Live casino tables often contribute 0-5% towards wagering, effectively excluding them entirely. Cashback bonuses return a percentage of your losses. Mega Riches offers 100% up to £25, and Mr Vegas matches 100% up to £50.
As the title suggests, the casino bonuses below are exclusive to CasinoHawks readers, so you won’t find them on any other site. With that in mind, here are five new casino bonuses to enjoy. Online casino reviews are our bread and butter, but this doesn’t stop us from hunting around to bring you the best casino bonuses too.
So without further ado, check out the bonus of the month. When picking our bonus of the month, there’s more to it than closing our eyes and choosing at random. From welcome packages to ongoing promotions, every recommendation is expert-reviewed to help you player smarter, enjoy more and truly Raise Your Game. Any bonus we recommend has been reviewed and updated to ensure full compliance with the UKGC’s new standards.
You can use this alongside your initial deposit, meaning you essentially have four times what you deposited. Weigh them up against one another and then you’ll be ready to see if this bonus is right for you. Funds can be added and your bonus will be ready to use in as little as 10 minutes! A broad range of deposit methods means you can easily add funds to your account to activate this deal.
Many daily free spins offers come with flexible wagering terms, low entry requirements, and recurring rewards that add extra value over time. We realize that casino players that like to wager large amounts of money will be looking specific types of bonuses, so we’ve created a section withcasino bonuses for high rollers. No wagering bonuses are one the most preferred kinds of offers for punters, because they allow the customer to withdraw any of the winning they manage to win. By taking advantage of these promotions, players can explore new games, test out casino features, and make the most of their playtime. Some of these offers are tied to deposits as part of welcome packages, whilst reload promotions can also include free spins. We have a full section aboutno deposit free spins, where you can find all the latest offers, and how they work.
Bonus wagering requirements are now capped at 10x the bonus amount. The rule aims to reduce confusion and potential harm by ensuring offers apply to a single gambling activity. Some casinos exclude specific deposit methods (such as Neteller or PayPal) from eligibility, or may apply fees or limits to certain withdrawal types. Secure and convenient withdrawal options are vital when playing with bonuses. Reliable customer support is essential when claiming or managing casino bonuses. Look for casinos that regularly update their libraries with new and exclusive releases – these often come with fresh bonus opportunities and special promotions.
]]>