__( 'Save as a template', 'elementor' ); __( 'New', 'elementor' ); __( 'Create component', 'elementor' ); __( 'To create new components, update Elementor Pro to the latest version.', 'elementor' ); __( 'Update Now', 'elementor' ); __( 'Add %s', 'elementor' ); __( 'Edit %s', 'elementor' ); __( 'Duplicate %s', 'elementor' ); __( 'Delete %s', 'elementor' );# Members - EDD Integration The Members - EDD Integration add-on more nicely integrates the [Easy Digital Downloads](https://easydigitaldownloads.com/) plugin capabilities into the Members plugin's role manager. The [Members plugin](https://themehybrid.com/plugins/members) and the Easy Digital Downloads plugin are required to be installed and activated for this plugin to work. ## Shop Role Group The plugin creates a new "Shop" role group for Easy Digital Downloads, which is located under the Users > Roles screen in the admin. This role group lists the following roles: - Shop Accountant - Shop Manager - Shop Vendor - Shop Worker - Any other roles that have EDD-related capabilities. This allows you to see any roles that have EDD permissions at a glance. ## Downloads Capability Group When editing or creating a new role in Members, this add-on creates a new "Downloads" tab (cap group). This tab combines all of the Easy Digital Downloads capabilities in one place. That way, you can see all available caps without jumping between different tabs. ## Copyright and License This project is licensed under the [GNU GPL](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html), version 2 or later. 2019 © [Justin Tadlock](http://justintadlock.com). /******/ (function() { // webpackBootstrap /******/ "use strict"; /******/ var __webpack_modules__ = ({ /***/ "./node_modules/@monaco-editor/loader/lib/es/_virtual/_rollupPluginBabelHelpers.js": /*!*****************************************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/_virtual/_rollupPluginBabelHelpers.js ***! \*****************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ arrayLikeToArray: function() { return /* binding */ _arrayLikeToArray; }, /* harmony export */ arrayWithHoles: function() { return /* binding */ _arrayWithHoles; }, /* harmony export */ defineProperty: function() { return /* binding */ _defineProperty; }, /* harmony export */ iterableToArrayLimit: function() { return /* binding */ _iterableToArrayLimit; }, /* harmony export */ nonIterableRest: function() { return /* binding */ _nonIterableRest; }, /* harmony export */ objectSpread2: function() { return /* binding */ _objectSpread2; }, /* harmony export */ objectWithoutProperties: function() { return /* binding */ _objectWithoutProperties; }, /* harmony export */ objectWithoutPropertiesLoose: function() { return /* binding */ _objectWithoutPropertiesLoose; }, /* harmony export */ slicedToArray: function() { return /* binding */ _slicedToArray; }, /* harmony export */ toPrimitive: function() { return /* binding */ _toPrimitive; }, /* harmony export */ toPropertyKey: function() { return /* binding */ _toPropertyKey; }, /* harmony export */ unsupportedIterableToArray: function() { return /* binding */ _unsupportedIterableToArray; } /* harmony export */ }); function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; } function _arrayWithHoles(r) { if (Array.isArray(r)) return r; } function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: true, configurable: true, writable: true }) : e[r] = t, e; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = true, o = false; try { if (i = (t = t.call(r)).next, 0 === l) ; else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = true, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), true).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; } function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } } /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/config/index.js": /*!*******************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/config/index.js ***! \*******************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ config; } /* harmony export */ }); var config = { paths: { vs: 'https://cdn.jsdelivr.net/npm/monaco-editor@0.55.1/min/vs' } }; /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/index.js": /*!************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/index.js ***! \************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* reexport safe */ _loader_index_js__WEBPACK_IMPORTED_MODULE_0__["default"]; } /* harmony export */ }); /* harmony import */ var _loader_index_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./loader/index.js */ "./node_modules/@monaco-editor/loader/lib/es/loader/index.js"); /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/loader/index.js": /*!*******************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/loader/index.js ***! \*******************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ loader; } /* harmony export */ }); /* harmony import */ var _virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../_virtual/_rollupPluginBabelHelpers.js */ "./node_modules/@monaco-editor/loader/lib/es/_virtual/_rollupPluginBabelHelpers.js"); /* harmony import */ var state_local__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! state-local */ "./node_modules/state-local/lib/es/state-local.js"); /* harmony import */ var _config_index_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../config/index.js */ "./node_modules/@monaco-editor/loader/lib/es/config/index.js"); /* harmony import */ var _validators_index_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../validators/index.js */ "./node_modules/@monaco-editor/loader/lib/es/validators/index.js"); /* harmony import */ var _utils_compose_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utils/compose.js */ "./node_modules/@monaco-editor/loader/lib/es/utils/compose.js"); /* harmony import */ var _utils_deepMerge_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../utils/deepMerge.js */ "./node_modules/@monaco-editor/loader/lib/es/utils/deepMerge.js"); /* harmony import */ var _utils_makeCancelable_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/makeCancelable.js */ "./node_modules/@monaco-editor/loader/lib/es/utils/makeCancelable.js"); var _excluded = ["monaco"]; /** the local state of the module */ var _state$create = state_local__WEBPACK_IMPORTED_MODULE_1__["default"].create({ config: _config_index_js__WEBPACK_IMPORTED_MODULE_2__["default"], isInitialized: false, resolve: null, reject: null, monaco: null }), _state$create2 = (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.slicedToArray)(_state$create, 2), getState = _state$create2[0], setState = _state$create2[1]; /** * set the loader configuration * @param {Object} config - the configuration object */ function config(globalConfig) { var _validators$config = _validators_index_js__WEBPACK_IMPORTED_MODULE_3__["default"].config(globalConfig), monaco = _validators$config.monaco, config = (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.objectWithoutProperties)(_validators$config, _excluded); setState(function (state) { return { config: (0,_utils_deepMerge_js__WEBPACK_IMPORTED_MODULE_5__["default"])(state.config, config), monaco: monaco }; }); } /** * handles the initialization of the monaco-editor * @return {Promise} - returns an instance of monaco (with a cancelable promise) */ function init() { var state = getState(function (_ref) { var monaco = _ref.monaco, isInitialized = _ref.isInitialized, resolve = _ref.resolve; return { monaco: monaco, isInitialized: isInitialized, resolve: resolve }; }); if (!state.isInitialized) { setState({ isInitialized: true }); if (state.monaco) { state.resolve(state.monaco); return (0,_utils_makeCancelable_js__WEBPACK_IMPORTED_MODULE_6__["default"])(wrapperPromise); } if (window.monaco && window.monaco.editor) { storeMonacoInstance(window.monaco); state.resolve(window.monaco); return (0,_utils_makeCancelable_js__WEBPACK_IMPORTED_MODULE_6__["default"])(wrapperPromise); } (0,_utils_compose_js__WEBPACK_IMPORTED_MODULE_4__["default"])(injectScripts, getMonacoLoaderScript)(configureLoader); } return (0,_utils_makeCancelable_js__WEBPACK_IMPORTED_MODULE_6__["default"])(wrapperPromise); } /** * injects provided scripts into the document.body * @param {Object} script - an HTML script element * @return {Object} - the injected HTML script element */ function injectScripts(script) { return document.body.appendChild(script); } /** * creates an HTML script element with/without provided src * @param {string} [src] - the source path of the script * @return {Object} - the created HTML script element */ function createScript(src) { var script = document.createElement('script'); return src && (script.src = src), script; } /** * creates an HTML script element with the monaco loader src * @return {Object} - the created HTML script element */ function getMonacoLoaderScript(configureLoader) { var state = getState(function (_ref2) { var config = _ref2.config, reject = _ref2.reject; return { config: config, reject: reject }; }); var loaderScript = createScript("".concat(state.config.paths.vs, "/loader.js")); loaderScript.onload = function () { return configureLoader(); }; loaderScript.onerror = state.reject; return loaderScript; } /** * configures the monaco loader */ function configureLoader() { var state = getState(function (_ref3) { var config = _ref3.config, resolve = _ref3.resolve, reject = _ref3.reject; return { config: config, resolve: resolve, reject: reject }; }); var require = window.require; require.config(state.config); require(['vs/editor/editor.main'], function (loaded) { var monaco = loaded.m /* for 0.53 & 0.54 */ || loaded /* for other versions */; storeMonacoInstance(monaco); state.resolve(monaco); }, function (error) { state.reject(error); }); } /** * store monaco instance in local state */ function storeMonacoInstance(monaco) { if (!getState().monaco) { setState({ monaco: monaco }); } } /** * internal helper function * extracts stored monaco instance * @return {Object|null} - the monaco instance */ function __getMonacoInstance() { return getState(function (_ref4) { var monaco = _ref4.monaco; return monaco; }); } var wrapperPromise = new Promise(function (resolve, reject) { return setState({ resolve: resolve, reject: reject }); }); var loader = { config: config, init: init, __getMonacoInstance: __getMonacoInstance }; /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/utils/compose.js": /*!********************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/utils/compose.js ***! \********************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ compose; } /* harmony export */ }); var compose = function compose() { for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) { fns[_key] = arguments[_key]; } return function (x) { return fns.reduceRight(function (y, f) { return f(y); }, x); }; }; /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/utils/curry.js": /*!******************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/utils/curry.js ***! \******************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ curry; } /* harmony export */ }); function curry(fn) { return function curried() { var _this = this; for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } return args.length >= fn.length ? fn.apply(this, args) : function () { for (var _len2 = arguments.length, nextArgs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { nextArgs[_key2] = arguments[_key2]; } return curried.apply(_this, [].concat(args, nextArgs)); }; }; } /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/utils/deepMerge.js": /*!**********************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/utils/deepMerge.js ***! \**********************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ merge; } /* harmony export */ }); /* harmony import */ var _virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../_virtual/_rollupPluginBabelHelpers.js */ "./node_modules/@monaco-editor/loader/lib/es/_virtual/_rollupPluginBabelHelpers.js"); function merge(target, source) { Object.keys(source).forEach(function (key) { if (source[key] instanceof Object) { if (target[key]) { Object.assign(source[key], merge(target[key], source[key])); } } }); return (0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.objectSpread2)((0,_virtual_rollupPluginBabelHelpers_js__WEBPACK_IMPORTED_MODULE_0__.objectSpread2)({}, target), source); } /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/utils/isObject.js": /*!*********************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/utils/isObject.js ***! \*********************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ isObject; } /* harmony export */ }); function isObject(value) { return {}.toString.call(value).includes('Object'); } /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/utils/makeCancelable.js": /*!***************************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/utils/makeCancelable.js ***! \***************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CANCELATION_MESSAGE: function() { return /* binding */ CANCELATION_MESSAGE; }, /* harmony export */ "default": function() { return /* binding */ makeCancelable; } /* harmony export */ }); // The source (has been changed) is https://github.com/facebook/react/issues/5465#issuecomment-157888325 var CANCELATION_MESSAGE = { type: 'cancelation', msg: 'operation is manually canceled' }; function makeCancelable(promise) { var hasCanceled_ = false; var wrappedPromise = new Promise(function (resolve, reject) { promise.then(function (val) { return hasCanceled_ ? reject(CANCELATION_MESSAGE) : resolve(val); }); promise["catch"](reject); }); return wrappedPromise.cancel = function () { return hasCanceled_ = true; }, wrappedPromise; } /***/ }), /***/ "./node_modules/@monaco-editor/loader/lib/es/validators/index.js": /*!***********************************************************************!*\ !*** ./node_modules/@monaco-editor/loader/lib/es/validators/index.js ***! \***********************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ "default": function() { return /* binding */ validators; }, /* harmony export */ errorHandler: function() { return /* binding */ errorHandler; }, /* harmony export */ errorMessages: function() { return /* binding */ errorMessages; } /* harmony export */ }); /* harmony import */ var _utils_curry_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ../utils/curry.js */ "./node_modules/@monaco-editor/loader/lib/es/utils/curry.js"); /* harmony import */ var _utils_isObject_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/isObject.js */ "./node_modules/@monaco-editor/loader/lib/es/utils/isObject.js"); /** * validates the configuration object and informs about deprecation * @param {Object} config - the configuration object * @return {Object} config - the validated configuration object */ function validateConfig(config) { if (!config) errorHandler('configIsRequired'); if (!(0,_utils_isObject_js__WEBPACK_IMPORTED_MODULE_1__["default"])(config)) errorHandler('configType'); if (config.urls) { informAboutDeprecation(); return { paths: { vs: config.urls.monacoBase } }; } return config; } /** * logs deprecation message */ function informAboutDeprecation() { console.warn(errorMessages.deprecation); } function throwError(errorMessages, type) { throw new Error(errorMessages[type] || errorMessages["default"]); } var errorMessages = { configIsRequired: 'the configuration object is required', configType: 'the configuration object should be an object', "default": 'an unknown error accured in `@monaco-editor/loader` package', deprecation: "Deprecation warning!\n You are using deprecated way of configuration.\n\n Instead of using\n monaco.config({ urls: { monacoBase: '...' } })\n use\n monaco.config({ paths: { vs: '...' } })\n\n For more please check the link https://github.com/suren-atoyan/monaco-loader#config\n " }; var errorHandler = (0,_utils_curry_js__WEBPACK_IMPORTED_MODULE_0__["default"])(throwError)(errorMessages); var validators = { config: validateConfig }; /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-editor.styles.ts": /*!************************************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-editor.styles.ts ***! \************************************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ EditorWrapper: function() { return /* binding */ EditorWrapper; }, /* harmony export */ ResizeHandle: function() { return /* binding */ ResizeHandle; } /* harmony export */ }); /* harmony import */ var _elementor_ui__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @elementor/ui */ "@elementor/ui"); /* harmony import */ var _elementor_ui__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_elementor_ui__WEBPACK_IMPORTED_MODULE_0__); const EditorWrapper = (0,_elementor_ui__WEBPACK_IMPORTED_MODULE_0__.styled)((0,_elementor_ui__WEBPACK_IMPORTED_MODULE_0__.Box))` /* @noflip */ direction: ltr; border: 1px solid var( --e-a-border-color ); border-radius: 8px; padding: 4px; position: relative; height: 200px; .monaco-editor .suggest-widget { width: 220px !important; max-width: 220px !important; z-index: 1001; } .visual-content-dimmed { opacity: 0.6; color: #aaa !important; pointer-events: none; } .monaco-editor { .margin-view-overlays > div:nth-of-type( 1 ) .cldr.codicon.codicon-folding-expanded { visibility: hidden; } .monaco-scrollable-element { > .scrollbar { width: 6px !important; > .slider { width: 6px !important; } } } } `; const ResizeHandle = (0,_elementor_ui__WEBPACK_IMPORTED_MODULE_0__.styled)((0,_elementor_ui__WEBPACK_IMPORTED_MODULE_0__.Button))` position: absolute; bottom: 0; left: 0; right: 0; height: 6px; cursor: ns-resize; background: transparent; border: none; padding: 0; &:hover { background: rgba( 0, 0, 0, 0.05 ); } &:active { background: rgba( 0, 0, 0, 0.1 ); } &::after { content: ''; position: absolute; top: 50%; left: 50%; transform: translate( -50%, -50% ); width: 30px; height: 2px; background: var( --e-a-border-color ); border-radius: 1px; } `; /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-editor.tsx": /*!******************************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-editor.tsx ***! \******************************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ CssEditor: function() { return /* binding */ CssEditor; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @elementor/editor-controls */ "@elementor/editor-controls"); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _elementor_editor_ui__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @elementor/editor-ui */ "@elementor/editor-ui"); /* harmony import */ var _elementor_editor_ui__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_ui__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _elementor_ui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @elementor/ui */ "@elementor/ui"); /* harmony import */ var _elementor_ui__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_elementor_ui__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _monaco_editor_react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @monaco-editor/react */ "./node_modules/@monaco-editor/react/dist/index.mjs"); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_5___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__); /* harmony import */ var _css_editor_styles__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./css-editor.styles */ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-editor.styles.ts"); /* harmony import */ var _css_validation__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./css-validation */ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-validation.ts"); /* harmony import */ var _resize_handle__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./resize-handle */ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/resize-handle.tsx"); /* harmony import */ var _visual_content_change_protection__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(/*! ./visual-content-change-protection */ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/visual-content-change-protection.ts"); const createEditorDidMountHandler = (editorRef, monacoRef, onUserContentChange, setIsValid, syntaxRuleOptions) => { return (editor, monaco) => { editorRef.current = editor; monacoRef.current = monaco; (0,_visual_content_change_protection__WEBPACK_IMPORTED_MODULE_9__.preventChangeOnVisualContent)(editor); (0,_css_validation__WEBPACK_IMPORTED_MODULE_7__.setCustomSyntaxRules)(editor, monaco, syntaxRuleOptions); const initialCode = editor.getModel()?.getValue() ?? ''; const initialUserContent = (0,_visual_content_change_protection__WEBPACK_IMPORTED_MODULE_9__.getActual)(initialCode); onUserContentChange(initialUserContent); monaco.editor.onDidChangeMarkers(() => { (0,_css_validation__WEBPACK_IMPORTED_MODULE_7__.clearMarkersFromVisualContent)(editor, monaco); setIsValid((0,_css_validation__WEBPACK_IMPORTED_MODULE_7__.validate)(editor, monaco)); }); editor.setPosition({ lineNumber: 2, column: (editor.getModel()?.getLineContent(2).length ?? 0) + 1 }); disableFoldingFirstRow(editor); // eslint-disable-next-line no-bitwise editor.addCommand(monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyA, () => { const editorModel = editor.getModel(); if (!editorModel) { return; } const fullRange = editorModel.getFullModelRange(); const contentEndLine = fullRange.endLineNumber - 1; let endColumn = editorModel.getLineLastNonWhitespaceColumn(contentEndLine); if (endColumn === 0) { endColumn = editorModel.getLineMaxColumn(contentEndLine); } editor.setSelection(new monaco.Selection(fullRange.startLineNumber + 1, fullRange.startColumn, contentEndLine, endColumn)); }); }; }; function disableFoldingFirstRow(editor) { if (!(typeof editor.getDomNode === 'function')) { return; } const marginViewOverlays = editor.getDomNode()?.querySelector('.margin-view-overlays'); const handler = event => { const ev = event; if (ev.button !== 0) { return; } const target = ev.target; const firstElem = marginViewOverlays?.children[0]; const isFirstRow = target === firstElem || target.parentElement === firstElem; if (isFirstRow) { event.preventDefault(); event.stopPropagation(); } }; marginViewOverlays?.addEventListener('mousedown', handler); editor.onDidDispose(() => { marginViewOverlays?.removeEventListener('mousedown', handler); }); } const CssEditor = ({ value, onChange, syntaxRuleOptions, readOnly = false }) => { const theme = (0,_elementor_ui__WEBPACK_IMPORTED_MODULE_3__.useTheme)(); const containerRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); const editorRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); const monacoRef = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); const debounceTimer = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(null); const [hasContent, setHasContent] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(value.trim() !== ''); const [isValid, setIsValid] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(true); const [contentVersion, setContentVersion] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(0); useOnUpdate(() => { const code = editorRef.current?.getModel()?.getValue() ?? ''; const userContent = (0,_visual_content_change_protection__WEBPACK_IMPORTED_MODULE_9__.getActual)(code); setHasContent(!userContent.trim()); onChange(userContent, isValid); }, [contentVersion, isValid]); const handleUserContentChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(newValue => { setHasContent(newValue.trim() !== ''); }, []); const handleResize = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(() => { editorRef.current?.layout(); }, []); const handleHeightChange = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(height => { if (containerRef.current) { containerRef.current.style.height = `${height}px`; } }, []); const handleEditorChange = () => { if (!editorRef.current || !monacoRef.current) { return; } (0,_css_validation__WEBPACK_IMPORTED_MODULE_7__.setCustomSyntaxRules)(editorRef?.current, monacoRef.current, syntaxRuleOptions); if (debounceTimer.current) { clearTimeout(debounceTimer.current); } debounceTimer.current = setTimeout(() => { setContentVersion(prev => prev + 1); }, 500); }; const handleEditorDidMount = createEditorDidMountHandler(editorRef, monacoRef, handleUserContentChange, setIsValid, syntaxRuleOptions); const handleReset = () => editorRef.current?.getModel()?.setValue((0,_visual_content_change_protection__WEBPACK_IMPORTED_MODULE_9__.setVisualContent)('')); (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { const timerRef = debounceTimer; return () => { const timer = timerRef.current; if (timer) { clearTimeout(timer); } }; }, []); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_editor_ui__WEBPACK_IMPORTED_MODULE_2__.FloatingActionsBar, { actions: hasContent ? [/*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__.ClearIconButton, { key: "clear", tooltipText: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_5__.__)('Clear', 'elementor-pro'), onClick: handleReset })] : [] }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_ui__WEBPACK_IMPORTED_MODULE_3__.Box, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_css_editor_styles__WEBPACK_IMPORTED_MODULE_6__.EditorWrapper, { ref: containerRef, dir: "ltr" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_monaco_editor_react__WEBPACK_IMPORTED_MODULE_4__.Editor, { height: "100%", language: "css", theme: theme.palette.mode === 'dark' ? 'vs-dark' : 'vs', value: (0,_visual_content_change_protection__WEBPACK_IMPORTED_MODULE_9__.setVisualContent)(value), onMount: handleEditorDidMount, onChange: handleEditorChange, options: { lineNumbers: 'on', lineNumbersMinChars: 3, folding: true, minimap: { enabled: false }, fontFamily: 'Roboto, Arial, Helvetica, Verdana, sans-serif', fontSize: 12, renderLineHighlight: 'none', hideCursorInOverviewRuler: true, overviewRulerBorder: false, fixedOverflowWidgets: true, suggestFontSize: 10, suggestLineHeight: 14, stickyScroll: { enabled: false }, lineDecorationsWidth: 2, wordWrap: 'on', scrollBeyondLastLine: false, readOnly, editContext: false } }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_resize_handle__WEBPACK_IMPORTED_MODULE_8__.ResizeHandleComponent, { onResize: handleResize, containerRef: containerRef, onHeightChange: handleHeightChange })))); }; function useOnUpdate(callback, dependencies) { const hasMounted = (0,react__WEBPACK_IMPORTED_MODULE_0__.useRef)(false); (0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(() => { if (hasMounted.current) { callback(); } else { hasMounted.current = true; } // eslint-disable-next-line react-hooks/exhaustive-deps }, dependencies); } /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-validation.ts": /*!*********************************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-validation.ts ***! \*********************************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ clearMarkersFromVisualContent: function() { return /* binding */ clearMarkersFromVisualContent; }, /* harmony export */ setCustomSyntaxRules: function() { return /* binding */ setCustomSyntaxRules; }, /* harmony export */ validate: function() { return /* binding */ validate; } /* harmony export */ }); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__); const syntaxRules = { pseudoState: { pattern: '^\\s*[&]{0,1}\\s*(?::hover|:active|:focus)', regex: true, message: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('The use of pseudo-states is not permitted. Instead, switch to the desired pseudo state and add your custom code there.', 'elementor-pro') }, mediaQuery: { pattern: '@media\\s+[^{]*\\b(?:min-width|max-width|width)\\b', regex: true, message: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_0__.__)('The use of @media width queries is not permitted. Instead, switch to the desired breakpoint and add your custom code there.', 'elementor-pro') } }; function setCustomSyntaxRules(editor, monaco, options) { const model = editor.getModel(); if (!model) { return true; } const customMarkers = []; Object.entries(syntaxRules).forEach(([id, rule]) => { if (options?.rules?.[id] === false) { return; } const matches = model.findMatches(rule.pattern, true, rule.regex ?? false, true, null, true); matches.forEach(match => { customMarkers.push({ severity: monaco.MarkerSeverity.Error, message: rule.message, startLineNumber: match.range.startLineNumber, startColumn: match.range.startColumn, endLineNumber: match.range.endLineNumber, endColumn: match.range.endColumn, source: 'custom-css-rules' }); }); }); monaco.editor.setModelMarkers(model, 'custom-css-rules', customMarkers); return customMarkers.length === 0; } function validate(editor, monaco) { const model = editor.getModel(); if (!model) { return true; } const allMarkers = monaco.editor.getModelMarkers({ resource: model.uri }); return allMarkers.filter(marker => marker.severity === monaco.MarkerSeverity.Error).length === 0; } function clearMarkersFromVisualContent(editor, monaco) { const model = editor.getModel(); if (!model) { return; } const allMarkers = monaco.editor.getModelMarkers({ resource: model.uri }); const filteredMarkers = allMarkers.filter(marker => marker.startLineNumber !== 1); const nonCustomMarkers = filteredMarkers.filter(m => m.source !== 'custom-css-rules'); if (nonCustomMarkers.length === allMarkers.length) { return; } monaco.editor.setModelMarkers(model, 'css', nonCustomMarkers); } /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/resize-handle.tsx": /*!*********************************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/resize-handle.tsx ***! \*********************************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ ResizeHandleComponent: function() { return /* binding */ ResizeHandleComponent; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _css_editor_styles__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./css-editor.styles */ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-editor.styles.ts"); const ResizeHandleComponent = ({ onResize, containerRef, onHeightChange }) => { const handleResizeMove = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(e => { const container = containerRef.current; if (!container) { return; } const containerRect = container.getBoundingClientRect(); const newHeight = Math.max(100, e.clientY - containerRect.top); onHeightChange?.(newHeight); onResize(newHeight); }, [containerRef, onResize, onHeightChange]); const handleResizeEnd = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(() => { document.removeEventListener('mousemove', handleResizeMove); document.removeEventListener('mouseup', handleResizeEnd); }, [handleResizeMove]); const handleResizeStart = react__WEBPACK_IMPORTED_MODULE_0__.useCallback(e => { e.preventDefault(); e.stopPropagation(); document.addEventListener('mousemove', handleResizeMove); document.addEventListener('mouseup', handleResizeEnd); }, [handleResizeMove, handleResizeEnd]); react__WEBPACK_IMPORTED_MODULE_0__.useEffect(() => { return () => { document.removeEventListener('mousemove', handleResizeMove); document.removeEventListener('mouseup', handleResizeEnd); }; }, [handleResizeMove, handleResizeEnd]); return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_css_editor_styles__WEBPACK_IMPORTED_MODULE_1__.ResizeHandle, { onMouseDown: handleResizeStart, "aria-label": "Resize editor height", title: "Drag to resize editor height" }); }; /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/visual-content-change-protection.ts": /*!***************************************************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/visual-content-change-protection.ts ***! \***************************************************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ getActual: function() { return /* binding */ getActual; }, /* harmony export */ preventChangeOnVisualContent: function() { return /* binding */ preventChangeOnVisualContent; }, /* harmony export */ setVisualContent: function() { return /* binding */ setVisualContent; } /* harmony export */ }); const preventChangeOnVisualContent = editor => { const model = editor.getModel(); if (!model) { return; } // On first load applyVisualContentStyling(editor, model); // On every change model.onDidChangeContent(() => { applyVisualContentStyling(editor, model); }); disableCursorOnVisualContent(editor); overridePushEditOperations(model); }; const applyVisualContentStyling = (editor, model) => { const decorationsCollection = editor.createDecorationsCollection(); const lineCount = model.getLineCount(); const decorations = []; decorations.push({ range: { startLineNumber: 1, startColumn: 1, endLineNumber: 1, endColumn: model.getLineContent(1).length + 1 }, options: { inlineClassName: 'visual-content-dimmed', isWholeLine: false } }); if (lineCount > 1) { decorations.push({ range: { startLineNumber: lineCount, startColumn: 1, endLineNumber: lineCount, endColumn: model.getLineContent(lineCount).length + 1 }, options: { inlineClassName: 'visual-content-dimmed', isWholeLine: false } }); } decorationsCollection.set(decorations); }; const disableCursorOnVisualContent = editor => { const model = editor.getModel(); if (!model) { return; } editor.onDidChangeCursorPosition(e => { const totalLines = model.getLineCount(); const position = e.position; if (position.lineNumber === 1) { editor.setPosition({ lineNumber: 2, column: 1 }); } else if (position.lineNumber === totalLines) { editor.setPosition({ lineNumber: totalLines - 1, column: model.getLineContent(totalLines - 1).length + 1 }); } }); }; const overridePushEditOperations = model => { const originalPushEditOperations = model.pushEditOperations; model.pushEditOperations = (beforeCursorState, editOperations, cursorStateComputer) => { const totalLines = model.getLineCount(); const modelRange = model.getFullModelRange(); const filteredOperations = editOperations.filter(operation => { const range = operation.range; const affectsProtectedLine = range.startLineNumber === 1 || range.endLineNumber === 1 || range.startLineNumber === totalLines || range.endLineNumber === totalLines; if (affectsProtectedLine && isFullContentReplacement(range, modelRange) && hasVisualContent(operation.text)) { return true; } return !affectsProtectedLine; }); return originalPushEditOperations.call(model, beforeCursorState, filteredOperations, cursorStateComputer); }; }; const isFullContentReplacement = (range, modelRange) => { return range.startLineNumber === modelRange.startLineNumber && range.endLineNumber === modelRange.endLineNumber && range.startColumn === modelRange.startColumn && range.endColumn === modelRange.endColumn; }; const hasVisualContent = text => { if (!text) { return false; } return text.startsWith('element.style {') && text.endsWith('}'); }; const setVisualContent = value => { const trimmed = value.trim(); return `element.style {\n${trimmed ? ' ' + trimmed.replace(/\n/g, '\n ') + '\n' : ' \n'}}`; }; const getActual = value => { const lines = value.split('\n'); if (lines.length < 2) { return ''; } return lines.slice(1, -1).map(line => line.replace(/^ {2}/, '')).join('\n'); }; /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/controls/attributes-control.tsx": /*!********************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/controls/attributes-control.tsx ***! \********************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AttributesControl: function() { return /* binding */ AttributesControl; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @elementor/editor-controls */ "@elementor/editor-controls"); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__); const AttributesControl = (0,_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__.createControl)(() => { const getHelperText = (key, value) => { if (value && !key) { return { keyHelper: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)("Empty attribute names aren't valid and won't render on the page.", 'elementor-pro') }; } return {}; }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__.KeyValueControl, { keyName: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Name', 'elementor-pro'), valueName: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Value', 'elementor-pro'), regexKey: "^[a-zA-Z0-9_-]*$", validationErrorMessage: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Names can only use letters, numbers, dashes (-) and underscores (_).', 'elementor-pro'), getHelperText: getHelperText }); }); /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/controls/display-conditions-control.tsx": /*!****************************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/controls/display-conditions-control.tsx ***! \****************************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DisplayConditionsControl: function() { return /* binding */ DisplayConditionsControl; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @elementor/editor-controls */ "@elementor/editor-controls"); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _elementor_icons__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @elementor/icons */ "@elementor/icons"); /* harmony import */ var _elementor_icons__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_elementor_icons__WEBPACK_IMPORTED_MODULE_2__); /* harmony import */ var _elementor_ui__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @elementor/ui */ "@elementor/ui"); /* harmony import */ var _elementor_ui__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(_elementor_ui__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_4___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__); /* harmony import */ var _prop_types_display_conditions__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ../prop-types/display-conditions */ "./packages/packages/pro/editor-controls-extended/src/prop-types/display-conditions.ts"); /* harmony import */ var _utils_display_conditions_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ../utils/display-conditions-utils */ "./packages/packages/pro/editor-controls-extended/src/utils/display-conditions-utils.ts"); const OPEN_MODAL_EVENT = 'elementor/display-conditions/open'; const CLOSE_MODAL_EVENT = 'elementor/display-conditions/close'; const SET_CACHE_NOTICE_STATUS_EVENT = 'elementor/display-conditions/set-cache-notice-status'; const ariaLabel = (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_4__.__)('Display Conditions', 'elementor-pro'); async function setCacheNoticeStatus() { return new Promise((resolve, reject) => { window.dispatchEvent(new CustomEvent(SET_CACHE_NOTICE_STATUS_EVENT, { detail: { resolve, reject } })); }); } const DisplayConditionsControl = (0,_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__.createControl)(({ disabled = false }) => { const { setValue, value: displayConditionsValue } = (0,_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__.useBoundProp)(_prop_types_display_conditions__WEBPACK_IMPORTED_MODULE_5__.displayConditionsPropTypeUtil); const [isModalOpen, setIsModalOpen] = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)(false); const hasValue = !!displayConditionsValue?.length; const setControlValue = value => setValue((0,_utils_display_conditions_utils__WEBPACK_IMPORTED_MODULE_6__.transformV3ToV4)(JSON.parse(value ?? '[]'))); const getControlValue = () => (0,_utils_display_conditions_utils__WEBPACK_IMPORTED_MODULE_6__.transformV4ToV3)(displayConditionsValue) ?? []; const onClose = () => { setIsModalOpen(false); window.dispatchEvent(new CustomEvent(CLOSE_MODAL_EVENT)); }; const conditions = getControlValue(); const openConditionsModal = () => { setIsModalOpen(true); window.dispatchEvent(new CustomEvent(OPEN_MODAL_EVENT, { detail: { props: { getControlValue, setControlValue, onClose, setCacheNoticeStatus } } })); }; return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(react__WEBPACK_IMPORTED_MODULE_0__.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_ui__WEBPACK_IMPORTED_MODULE_3__.Stack, { direction: "row", spacing: 2, sx: { justifyContent: 'flex-end', alignItems: 'center' } }, disabled && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_ui__WEBPACK_IMPORTED_MODULE_3__.Chip, { icon: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_icons__WEBPACK_IMPORTED_MODULE_2__.CrownFilledIcon, { fontSize: "tiny" }), size: "tiny", color: "promotion", variant: "standard", sx: { width: '20px', '& .MuiChip-label': { display: 'none' } } }), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_ui__WEBPACK_IMPORTED_MODULE_3__.Tooltip, { title: ariaLabel, placement: "top" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_ui__WEBPACK_IMPORTED_MODULE_3__.Box, { sx: { cursor: disabled ? 'not-allowed' : 'pointer', display: 'inline-flex' } }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_ui__WEBPACK_IMPORTED_MODULE_3__.ToggleButton, { value: JSON.stringify(conditions), size: "tiny", variant: "outline", "aria-pressed": hasValue, "aria-expanded": isModalOpen, selected: hasValue, "aria-haspopup": "dialog", "aria-label": ariaLabel, onClick: openConditionsModal, disabled: disabled, sx: { pointerEvents: disabled ? 'none' : 'auto' }, "data-behavior": "display-conditions" }, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_icons__WEBPACK_IMPORTED_MODULE_2__.SitemapIcon, { fontSize: "tiny" })))))); }); /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/controls/options-control.tsx": /*!*****************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/controls/options-control.tsx ***! \*****************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ OptionsControl: function() { return /* binding */ OptionsControl; } /* harmony export */ }); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "react"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(react__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @elementor/editor-controls */ "@elementor/editor-controls"); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! @wordpress/i18n */ "@wordpress/i18n"); /* harmony import */ var _wordpress_i18n__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__); const OptionsControl = (0,_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__.createControl)(() => { return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_0__.createElement(_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_1__.KeyValueControl, { keyName: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Name', 'elementor-pro'), valueName: (0,_wordpress_i18n__WEBPACK_IMPORTED_MODULE_2__.__)('Value', 'elementor-pro') }); }); /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/extend-transition-properties.ts": /*!********************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/extend-transition-properties.ts ***! \********************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ extendTransitionProperties: function() { return /* binding */ extendTransitionProperties; }, /* harmony export */ transitionProperties: function() { return /* reexport safe */ _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__.transitionProperties; }, /* harmony export */ transitionsItemsList: function() { return /* reexport safe */ _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__.transitionsItemsList; } /* harmony export */ }); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @elementor/editor-controls */ "@elementor/editor-controls"); /* harmony import */ var _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__); function extendTransitionProperties(isDisabled = false) { if (!_elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__.transitionProperties || _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__.transitionProperties.length === 0) { return; } _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__.transitionProperties.forEach(category => { category.properties.forEach(property => { if (property.value !== 'all') { property.isDisabled = isDisabled; } }); }); _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__.transitionsItemsList.splice(0, _elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__.transitionsItemsList.length, ..._elementor_editor_controls__WEBPACK_IMPORTED_MODULE_0__.transitionProperties.map(category => ({ label: category.label, items: category.properties.map(property => property.label) }))); } /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/init.ts": /*!********************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/init.ts ***! \********************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ init: function() { return /* binding */ init; } /* harmony export */ }); /* harmony import */ var _elementor_license_api__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @elementor/license-api */ "@elementor/license-api"); /* harmony import */ var _elementor_license_api__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_elementor_license_api__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _extend_transition_properties__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./extend-transition-properties */ "./packages/packages/pro/editor-controls-extended/src/extend-transition-properties.ts"); async function init() { const [isExpired, features] = await Promise.all([(0,_elementor_license_api__WEBPACK_IMPORTED_MODULE_0__.fetchLicenseStatus)().catch(() => false), (0,_elementor_license_api__WEBPACK_IMPORTED_MODULE_0__.fetchTierFeatures)().catch(() => [])]); if (features.includes('transitions')) { (0,_extend_transition_properties__WEBPACK_IMPORTED_MODULE_1__.extendTransitionProperties)(isExpired); } } /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/prop-types/condition-group.ts": /*!******************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/prop-types/condition-group.ts ***! \******************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ conditionGroupPropTypeUtil: function() { return /* binding */ conditionGroupPropTypeUtil; } /* harmony export */ }); /* harmony import */ var _elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @elementor/editor-props */ "@elementor/editor-props"); /* harmony import */ var _elementor_editor_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _elementor_schema__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @elementor/schema */ "@elementor/schema"); /* harmony import */ var _elementor_schema__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_elementor_schema__WEBPACK_IMPORTED_MODULE_1__); const unknownChildrenSchema = _elementor_schema__WEBPACK_IMPORTED_MODULE_1__.z.any().nullable(); const conditionGroupPropTypeUtil = (0,_elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__.createPropUtils)('condition-group', _elementor_schema__WEBPACK_IMPORTED_MODULE_1__.z.array(unknownChildrenSchema)); /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/prop-types/display-conditions.ts": /*!*********************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/prop-types/display-conditions.ts ***! \*********************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ displayConditionsPropTypeUtil: function() { return /* binding */ displayConditionsPropTypeUtil; } /* harmony export */ }); /* harmony import */ var _elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @elementor/editor-props */ "@elementor/editor-props"); /* harmony import */ var _elementor_editor_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__); /* harmony import */ var _elementor_schema__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @elementor/schema */ "@elementor/schema"); /* harmony import */ var _elementor_schema__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_elementor_schema__WEBPACK_IMPORTED_MODULE_1__); const unknownChildrenSchema = _elementor_schema__WEBPACK_IMPORTED_MODULE_1__.z.any().nullable(); const displayConditionsPropTypeUtil = (0,_elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__.createPropUtils)('display-conditions', _elementor_schema__WEBPACK_IMPORTED_MODULE_1__.z.array(unknownChildrenSchema)); /***/ }), /***/ "./packages/packages/pro/editor-controls-extended/src/utils/display-conditions-utils.ts": /*!**********************************************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/utils/display-conditions-utils.ts ***! \**********************************************************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ transformV3ToV4: function() { return /* binding */ transformV3ToV4; }, /* harmony export */ transformV4ToV3: function() { return /* binding */ transformV4ToV3; } /* harmony export */ }); /* harmony import */ var _elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @elementor/editor-props */ "@elementor/editor-props"); /* harmony import */ var _elementor_editor_props__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__); // Value must be falsy for navigator indication to work properly function transformV3ToV4(displayConditions) { if (!Array.isArray(displayConditions) || !displayConditions?.length) { return null; } const transformed = displayConditions.filter(conditionGroup => !!conditionGroup?.length).map(conditionGroup => ({ $$type: 'condition-group', value: conditionGroup.map(condition => _elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__.stringPropTypeUtil.create(JSON.stringify(condition))) })); return transformed.length ? transformed : null; } function transformV4ToV3(value) { const conditionGroups = value; const transformed = conditionGroups?.map(group => group.value.map(conditions => { return JSON.parse(_elementor_editor_props__WEBPACK_IMPORTED_MODULE_0__.stringPropTypeUtil.extract(conditions) ?? '[]'); })) ?? null; return getStructuredConditions(transformed); } function shouldConvertConditionsStructure(conditions) { return !!conditions?.length && !Array.isArray(conditions?.[0]); } function getStructuredConditions(conditions) { return shouldConvertConditionsStructure(conditions) ? [conditions] : conditions; } /***/ }), /***/ "./node_modules/state-local/lib/es/state-local.js": /*!********************************************************!*\ !*** ./node_modules/state-local/lib/es/state-local.js ***! \********************************************************/ /***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread2(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } function compose() { for (var _len = arguments.length, fns = new Array(_len), _key = 0; _key < _len; _key++) { fns[_key] = arguments[_key]; } return function (x) { return fns.reduceRight(function (y, f) { return f(y); }, x); }; } function curry(fn) { return function curried() { var _this = this; for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { args[_key2] = arguments[_key2]; } return args.length >= fn.length ? fn.apply(this, args) : function () { for (var _len3 = arguments.length, nextArgs = new Array(_len3), _key3 = 0; _key3 < _len3; _key3++) { nextArgs[_key3] = arguments[_key3]; } return curried.apply(_this, [].concat(args, nextArgs)); }; }; } function isObject(value) { return {}.toString.call(value).includes('Object'); } function isEmpty(obj) { return !Object.keys(obj).length; } function isFunction(value) { return typeof value === 'function'; } function hasOwnProperty(object, property) { return Object.prototype.hasOwnProperty.call(object, property); } function validateChanges(initial, changes) { if (!isObject(changes)) errorHandler('changeType'); if (Object.keys(changes).some(function (field) { return !hasOwnProperty(initial, field); })) errorHandler('changeField'); return changes; } function validateSelector(selector) { if (!isFunction(selector)) errorHandler('selectorType'); } function validateHandler(handler) { if (!(isFunction(handler) || isObject(handler))) errorHandler('handlerType'); if (isObject(handler) && Object.values(handler).some(function (_handler) { return !isFunction(_handler); })) errorHandler('handlersType'); } function validateInitial(initial) { if (!initial) errorHandler('initialIsRequired'); if (!isObject(initial)) errorHandler('initialType'); if (isEmpty(initial)) errorHandler('initialContent'); } function throwError(errorMessages, type) { throw new Error(errorMessages[type] || errorMessages["default"]); } var errorMessages = { initialIsRequired: 'initial state is required', initialType: 'initial state should be an object', initialContent: 'initial state shouldn\'t be an empty object', handlerType: 'handler should be an object or a function', handlersType: 'all handlers should be a functions', selectorType: 'selector should be a function', changeType: 'provided value of changes should be an object', changeField: 'it seams you want to change a field in the state which is not specified in the "initial" state', "default": 'an unknown error accured in `state-local` package' }; var errorHandler = curry(throwError)(errorMessages); var validators = { changes: validateChanges, selector: validateSelector, handler: validateHandler, initial: validateInitial }; function create(initial) { var handler = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; validators.initial(initial); validators.handler(handler); var state = { current: initial }; var didUpdate = curry(didStateUpdate)(state, handler); var update = curry(updateState)(state); var validate = curry(validators.changes)(initial); var getChanges = curry(extractChanges)(state); function getState() { var selector = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : function (state) { return state; }; validators.selector(selector); return selector(state.current); } function setState(causedChanges) { compose(didUpdate, update, validate, getChanges)(causedChanges); } return [getState, setState]; } function extractChanges(state, causedChanges) { return isFunction(causedChanges) ? causedChanges(state.current) : causedChanges; } function updateState(state, changes) { state.current = _objectSpread2(_objectSpread2({}, state.current), changes); return changes; } function didStateUpdate(state, handler, changes) { isFunction(handler) ? handler(state.current) : Object.keys(changes).forEach(function (field) { var _handler$field; return (_handler$field = handler[field]) === null || _handler$field === void 0 ? void 0 : _handler$field.call(handler, state.current[field]); }); return changes; } var index = { create: create }; /* harmony default export */ __webpack_exports__["default"] = (index); /***/ }), /***/ "react": /*!**************************!*\ !*** external ["React"] ***! \**************************/ /***/ (function(module) { module.exports = window["React"]; /***/ }), /***/ "@elementor/editor-controls": /*!*************************************************!*\ !*** external ["elementorV2","editorControls"] ***! \*************************************************/ /***/ (function(module) { module.exports = window["elementorV2"]["editorControls"]; /***/ }), /***/ "@elementor/editor-props": /*!**********************************************!*\ !*** external ["elementorV2","editorProps"] ***! \**********************************************/ /***/ (function(module) { module.exports = window["elementorV2"]["editorProps"]; /***/ }), /***/ "@elementor/editor-ui": /*!*******************************************!*\ !*** external ["elementorV2","editorUi"] ***! \*******************************************/ /***/ (function(module) { module.exports = window["elementorV2"]["editorUi"]; /***/ }), /***/ "@elementor/icons": /*!****************************************!*\ !*** external ["elementorV2","icons"] ***! \****************************************/ /***/ (function(module) { module.exports = window["elementorV2"]["icons"]; /***/ }), /***/ "@elementor/license-api": /*!*********************************************!*\ !*** external ["elementorV2","licenseApi"] ***! \*********************************************/ /***/ (function(module) { module.exports = window["elementorV2"]["licenseApi"]; /***/ }), /***/ "@elementor/schema": /*!*****************************************!*\ !*** external ["elementorV2","schema"] ***! \*****************************************/ /***/ (function(module) { module.exports = window["elementorV2"]["schema"]; /***/ }), /***/ "@elementor/ui": /*!*************************************!*\ !*** external ["elementorV2","ui"] ***! \*************************************/ /***/ (function(module) { module.exports = window["elementorV2"]["ui"]; /***/ }), /***/ "@wordpress/i18n": /*!******************************!*\ !*** external ["wp","i18n"] ***! \******************************/ /***/ (function(module) { module.exports = window["wp"]["i18n"]; /***/ }), /***/ "./node_modules/@monaco-editor/react/dist/index.mjs": /*!**********************************************************!*\ !*** ./node_modules/@monaco-editor/react/dist/index.mjs ***! \**********************************************************/ /***/ (function(__unused_webpack___webpack_module__, __webpack_exports__, __webpack_require__) { __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ DiffEditor: function() { return /* binding */ we; }, /* harmony export */ Editor: function() { return /* binding */ de; }, /* harmony export */ "default": function() { return /* binding */ Ft; }, /* harmony export */ loader: function() { return /* reexport safe */ _monaco_editor_loader__WEBPACK_IMPORTED_MODULE_0__["default"]; }, /* harmony export */ useMonaco: function() { return /* binding */ Le; } /* harmony export */ }); /* harmony import */ var _monaco_editor_loader__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @monaco-editor/loader */ "./node_modules/@monaco-editor/loader/lib/es/index.js"); /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "react"); var le={wrapper:{display:"flex",position:"relative",textAlign:"initial"},fullWidth:{width:"100%"},hide:{display:"none"}},v=le;var ae={container:{display:"flex",height:"100%",width:"100%",justifyContent:"center",alignItems:"center"}},Y=ae;function Me({children:e}){return react__WEBPACK_IMPORTED_MODULE_1__.createElement("div",{style:Y.container},e)}var Z=Me;var $=Z;function Ee({width:e,height:r,isEditorReady:n,loading:t,_ref:a,className:m,wrapperProps:E}){return react__WEBPACK_IMPORTED_MODULE_1__.createElement("section",{style:{...v.wrapper,width:e,height:r},...E},!n&&react__WEBPACK_IMPORTED_MODULE_1__.createElement($,null,t),react__WEBPACK_IMPORTED_MODULE_1__.createElement("div",{ref:a,style:{...v.fullWidth,...!n&&v.hide},className:m}))}var ee=Ee;var H=(0,react__WEBPACK_IMPORTED_MODULE_1__.memo)(ee);function Ce(e){(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(e,[])}var k=Ce;function he(e,r,n=!0){let t=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(!0);(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(t.current||!n?()=>{t.current=!1}:e,r)}var l=he;function D(){}function h(e,r,n,t){return De(e,t)||be(e,r,n,t)}function De(e,r){return e.editor.getModel(te(e,r))}function be(e,r,n,t){return e.editor.createModel(r,n,t?te(e,t):void 0)}function te(e,r){return e.Uri.parse(r)}function Oe({original:e,modified:r,language:n,originalLanguage:t,modifiedLanguage:a,originalModelPath:m,modifiedModelPath:E,keepCurrentOriginalModel:g=!1,keepCurrentModifiedModel:N=!1,theme:x="light",loading:P="Loading...",options:y={},height:V="100%",width:z="100%",className:F,wrapperProps:j={},beforeMount:A=D,onMount:q=D}){let[M,O]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(!1),[T,s]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(!0),u=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null),c=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null),w=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null),d=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(q),o=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(A),b=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(!1);k(()=>{let i=_monaco_editor_loader__WEBPACK_IMPORTED_MODULE_0__["default"].init();return i.then(f=>(c.current=f)&&s(!1)).catch(f=>f?.type!=="cancelation"&&console.error("Monaco initialization: error:",f)),()=>u.current?I():i.cancel()}),l(()=>{if(u.current&&c.current){let i=u.current.getOriginalEditor(),f=h(c.current,e||"",t||n||"text",m||"");f!==i.getModel()&&i.setModel(f)}},[m],M),l(()=>{if(u.current&&c.current){let i=u.current.getModifiedEditor(),f=h(c.current,r||"",a||n||"text",E||"");f!==i.getModel()&&i.setModel(f)}},[E],M),l(()=>{let i=u.current.getModifiedEditor();i.getOption(c.current.editor.EditorOption.readOnly)?i.setValue(r||""):r!==i.getValue()&&(i.executeEdits("",[{range:i.getModel().getFullModelRange(),text:r||"",forceMoveMarkers:!0}]),i.pushUndoStop())},[r],M),l(()=>{u.current?.getModel()?.original.setValue(e||"")},[e],M),l(()=>{let{original:i,modified:f}=u.current.getModel();c.current.editor.setModelLanguage(i,t||n||"text"),c.current.editor.setModelLanguage(f,a||n||"text")},[n,t,a],M),l(()=>{c.current?.editor.setTheme(x)},[x],M),l(()=>{u.current?.updateOptions(y)},[y],M);let L=(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(()=>{if(!c.current)return;o.current(c.current);let i=h(c.current,e||"",t||n||"text",m||""),f=h(c.current,r||"",a||n||"text",E||"");u.current?.setModel({original:i,modified:f})},[n,r,a,e,t,m,E]),U=(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(()=>{!b.current&&w.current&&(u.current=c.current.editor.createDiffEditor(w.current,{automaticLayout:!0,...y}),L(),c.current?.editor.setTheme(x),O(!0),b.current=!0)},[y,x,L]);(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{M&&d.current(u.current,c.current)},[M]),(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{!T&&!M&&U()},[T,M,U]);function I(){let i=u.current?.getModel();g||i?.original?.dispose(),N||i?.modified?.dispose(),u.current?.dispose()}return react__WEBPACK_IMPORTED_MODULE_1__.createElement(H,{width:z,height:V,isEditorReady:M,loading:P,_ref:w,className:F,wrapperProps:j})}var ie=Oe;var we=(0,react__WEBPACK_IMPORTED_MODULE_1__.memo)(ie);function Pe(){let[e,r]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(_monaco_editor_loader__WEBPACK_IMPORTED_MODULE_0__["default"].__getMonacoInstance());return k(()=>{let n;return e||(n=_monaco_editor_loader__WEBPACK_IMPORTED_MODULE_0__["default"].init(),n.then(t=>{r(t)})),()=>n?.cancel()}),e}var Le=Pe;function He(e){let r=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)();return (0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{r.current=e},[e]),r.current}var se=He;var _=new Map;function Ve({defaultValue:e,defaultLanguage:r,defaultPath:n,value:t,language:a,path:m,theme:E="light",line:g,loading:N="Loading...",options:x={},overrideServices:P={},saveViewState:y=!0,keepCurrentModel:V=!1,width:z="100%",height:F="100%",className:j,wrapperProps:A={},beforeMount:q=D,onMount:M=D,onChange:O,onValidate:T=D}){let[s,u]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(!1),[c,w]=(0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(!0),d=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null),o=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null),b=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(null),L=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(M),U=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(q),I=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(),i=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(t),f=se(m),Q=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(!1),B=(0,react__WEBPACK_IMPORTED_MODULE_1__.useRef)(!1);k(()=>{let p=_monaco_editor_loader__WEBPACK_IMPORTED_MODULE_0__["default"].init();return p.then(R=>(d.current=R)&&w(!1)).catch(R=>R?.type!=="cancelation"&&console.error("Monaco initialization: error:",R)),()=>o.current?pe():p.cancel()}),l(()=>{let p=h(d.current,e||t||"",r||a||"",m||n||"");p!==o.current?.getModel()&&(y&&_.set(f,o.current?.saveViewState()),o.current?.setModel(p),y&&o.current?.restoreViewState(_.get(m)))},[m],s),l(()=>{o.current?.updateOptions(x)},[x],s),l(()=>{!o.current||t===void 0||(o.current.getOption(d.current.editor.EditorOption.readOnly)?o.current.setValue(t):t!==o.current.getValue()&&(B.current=!0,o.current.executeEdits("",[{range:o.current.getModel().getFullModelRange(),text:t,forceMoveMarkers:!0}]),o.current.pushUndoStop(),B.current=!1))},[t],s),l(()=>{let p=o.current?.getModel();p&&a&&d.current?.editor.setModelLanguage(p,a)},[a],s),l(()=>{g!==void 0&&o.current?.revealLine(g)},[g],s),l(()=>{d.current?.editor.setTheme(E)},[E],s);let X=(0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(()=>{if(!(!b.current||!d.current)&&!Q.current){U.current(d.current);let p=m||n,R=h(d.current,t||e||"",r||a||"",p||"");o.current=d.current?.editor.create(b.current,{model:R,automaticLayout:!0,...x},P),y&&o.current.restoreViewState(_.get(p)),d.current.editor.setTheme(E),g!==void 0&&o.current.revealLine(g),u(!0),Q.current=!0}},[e,r,n,t,a,m,x,P,y,E,g]);(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{s&&L.current(o.current,d.current)},[s]),(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{!c&&!s&&X()},[c,s,X]),i.current=t,(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{s&&O&&(I.current?.dispose(),I.current=o.current?.onDidChangeModelContent(p=>{B.current||O(o.current.getValue(),p)}))},[s,O]),(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(()=>{if(s){let p=d.current.editor.onDidChangeMarkers(R=>{let G=o.current.getModel()?.uri;if(G&&R.find(J=>J.path===G.path)){let J=d.current.editor.getModelMarkers({resource:G});T?.(J)}});return()=>{p?.dispose()}}return()=>{}},[s,T]);function pe(){I.current?.dispose(),V?y&&_.set(m,o.current.saveViewState()):o.current.getModel()?.dispose(),o.current.dispose()}return react__WEBPACK_IMPORTED_MODULE_1__.createElement(H,{width:z,height:F,isEditorReady:s,loading:N,_ref:b,className:j,wrapperProps:A})}var fe=Ve;var de=(0,react__WEBPACK_IMPORTED_MODULE_1__.memo)(fe);var Ft=de; //# sourceMappingURL=index.mjs.map /***/ }) /******/ }); /************************************************************************/ /******/ // The module cache /******/ var __webpack_module_cache__ = {}; /******/ /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ var cachedModule = __webpack_module_cache__[moduleId]; /******/ if (cachedModule !== undefined) { /******/ return cachedModule.exports; /******/ } /******/ // Create a new module (and put it into the cache) /******/ var module = __webpack_module_cache__[moduleId] = { /******/ // no module.id needed /******/ // no module.loaded needed /******/ exports: {} /******/ }; /******/ /******/ // Execute the module function /******/ if (!(moduleId in __webpack_modules__)) { /******/ delete __webpack_module_cache__[moduleId]; /******/ var e = new Error("Cannot find module '" + moduleId + "'"); /******/ e.code = 'MODULE_NOT_FOUND'; /******/ throw e; /******/ } /******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); /******/ /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ /************************************************************************/ /******/ /* webpack/runtime/compat get default export */ /******/ !function() { /******/ // getDefaultExport function for compatibility with non-harmony modules /******/ __webpack_require__.n = function(module) { /******/ var getter = module && module.__esModule ? /******/ function() { return module['default']; } : /******/ function() { return module; }; /******/ __webpack_require__.d(getter, { a: getter }); /******/ return getter; /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/define property getters */ /******/ !function() { /******/ // define getter functions for harmony exports /******/ __webpack_require__.d = function(exports, definition) { /******/ for(var key in definition) { /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); /******/ } /******/ } /******/ }; /******/ }(); /******/ /******/ /* webpack/runtime/hasOwnProperty shorthand */ /******/ !function() { /******/ __webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); } /******/ }(); /******/ /******/ /* webpack/runtime/make namespace object */ /******/ !function() { /******/ // define __esModule on exports /******/ __webpack_require__.r = function(exports) { /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); /******/ } /******/ Object.defineProperty(exports, '__esModule', { value: true }); /******/ }; /******/ }(); /******/ /************************************************************************/ var __webpack_exports__ = {}; // This entry needs to be wrapped in an IIFE because it needs to be isolated against other modules in the chunk. !function() { /*!*********************************************************************!*\ !*** ./packages/packages/pro/editor-controls-extended/src/index.ts ***! \*********************************************************************/ __webpack_require__.r(__webpack_exports__); /* harmony export */ __webpack_require__.d(__webpack_exports__, { /* harmony export */ AttributesControl: function() { return /* reexport safe */ _controls_attributes_control__WEBPACK_IMPORTED_MODULE_1__.AttributesControl; }, /* harmony export */ CssEditor: function() { return /* reexport safe */ _components_css_code_editor_css_editor__WEBPACK_IMPORTED_MODULE_6__.CssEditor; }, /* harmony export */ DisplayConditionsControl: function() { return /* reexport safe */ _controls_display_conditions_control__WEBPACK_IMPORTED_MODULE_3__.DisplayConditionsControl; }, /* harmony export */ OptionsControl: function() { return /* reexport safe */ _controls_options_control__WEBPACK_IMPORTED_MODULE_2__.OptionsControl; }, /* harmony export */ conditionGroupPropTypeUtil: function() { return /* reexport safe */ _prop_types_condition_group__WEBPACK_IMPORTED_MODULE_5__.conditionGroupPropTypeUtil; }, /* harmony export */ displayConditionsPropTypeUtil: function() { return /* reexport safe */ _prop_types_display_conditions__WEBPACK_IMPORTED_MODULE_4__.displayConditionsPropTypeUtil; } /* harmony export */ }); /* harmony import */ var _init__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./init */ "./packages/packages/pro/editor-controls-extended/src/init.ts"); /* harmony import */ var _controls_attributes_control__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./controls/attributes-control */ "./packages/packages/pro/editor-controls-extended/src/controls/attributes-control.tsx"); /* harmony import */ var _controls_options_control__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./controls/options-control */ "./packages/packages/pro/editor-controls-extended/src/controls/options-control.tsx"); /* harmony import */ var _controls_display_conditions_control__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./controls/display-conditions-control */ "./packages/packages/pro/editor-controls-extended/src/controls/display-conditions-control.tsx"); /* harmony import */ var _prop_types_display_conditions__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./prop-types/display-conditions */ "./packages/packages/pro/editor-controls-extended/src/prop-types/display-conditions.ts"); /* harmony import */ var _prop_types_condition_group__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./prop-types/condition-group */ "./packages/packages/pro/editor-controls-extended/src/prop-types/condition-group.ts"); /* harmony import */ var _components_css_code_editor_css_editor__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./components/css-code-editor/css-editor */ "./packages/packages/pro/editor-controls-extended/src/components/css-code-editor/css-editor.tsx"); (0,_init__WEBPACK_IMPORTED_MODULE_0__.init)(); }(); (window.elementorV2 = window.elementorV2 || {}).editorControlsExtended = __webpack_exports__; /******/ })() ; window.elementorV2.editorControlsExtended?.init?.(); Australia Archives - Char's Footsteps https://www.charsfootsteps.com/travel/oceania/australia/ Best Female Travel Blogs 2024 Tue, 05 Aug 2025 09:47:51 +0000 en-US hourly 1 The Pinnacles: The Perfect Perth to Pinnacles Day Trip https://www.charsfootsteps.com/travel/oceania/australia/perth-to-pinnacles/?utm_source=rss&utm_medium=rss&utm_campaign=perth-to-pinnacles https://www.charsfootsteps.com/travel/oceania/australia/perth-to-pinnacles/#respond Tue, 05 Aug 2025 09:47:51 +0000 https://www.charsfootsteps.com/?p=4152 A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 days in Perth, visiting the Pinnacles was one of my favourite parts. The Pinnacles are located in Nambung National Park, just 200km north of Perth. These extraordinary limestone formations are some of the region’s most […]

The post The Pinnacles: The Perfect Perth to Pinnacles Day Trip appeared first on Char's Footsteps.

]]>
A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 days in Perth, visiting the Pinnacles was one of my favourite parts. The Pinnacles are located in Nambung National Park, just 200km north of Perth. These extraordinary limestone formations are some of the region’s most unique natural attraction and are a definite must-do if you’re in the area.

I chose to do a day trip with a tour company, so they could deal with the logistics and driving. This is the specific one I did, but there will be lots to choose from if you do a Google search.

Powered by GetYourGuide

Perth to Pinnacles Day Trip

Given the star-gazing aspect of the trip, the tour started at midday. I was the first person to be picked up, then we spent about 30 minutes collecting others from their different accommodations around Perth CBD. My understanding is the tour will pick anyone up from the Freemantle or Perth CBD area. We had about 15 people in the group – all ranging from different ages and backgrounds. Our driver was hilarious and did a great job at connecting to the group together.

We then embarked on the 90 minute drive to our first stop – the Lancelin Sand Dunes! Our driver told us the tour had been shut down for the week prior, due to devastating bush fires that had broken out. I recommend if you’re doing this trip solo to be checking the status of the area.

The Lancelin Sand Dunes

The first proper stop on the tour was in Lancelin, for the white desert sands and sand-boarding. The Lancelin Sand Dunes are located about 1.5hrs north of Perth and are a fantastic stopover on the way to the Pinnacles. Spanning over 2km, these white sand dunes are breathtaking and offer great views of the surrounding coastline and area. They also make for a great spot for sand-boarding!!

lancelin sand dunes

For the sand-boarding, you can either bring your own board or rent your own once their. They were included in our tour, so we got many turns going down the powdery sand. I went down on my bum but a few brave people in our group stood up and boarded down. I had experienced sand-boarding in Wadi Rum, Jordan before but this felt very different due to the incredibly white sand! The dunes also too high, which meant we could walk up many times for multiple sand-boarding experiences…in Wadi Rum, I think I had the fitness to walk up the dunes twice! They also had different steepness, so if you’re an adrenaline junkie, you can find the harder ones compared to the flatter ones I went down.

It’s best to visit early morning or late afternoon, as the sand is cooler then and the sunlight will offer really pretty photo ops! My biggest tip for the Lancelin Sand Dunes is to bring eye protection. People in our group bought swim googles from the nearby shop or, like me, wore sunglasses. Even with sunglasses, I still got some sand in my eyes. You’ll need protection from sand going in your eyes, along with the glare from the sand…it’s completely white!!

The Pinnacles

The drive from Lancelin Sand Dunes to the Pinnacles took approximately an hour. We had another toilet break along the way at a public toilet. For anyone anxious about having enough toilet breaks, our guide was brilliant at checking in on anyone needing to stop and there were plenty of opportunities during the trip.

Once we arrived at the national park, we had an hour to walk round and explore the Pinnacles. It honestly felt otherworldly and was such a unique experience. Being able to walk around these giant rock formations as we neared sunset also provided us with the perfect lighting. After we had explored a bit, a few of us sat on one of the bigger rocks and watch the star of sunset. It felt extremely surreal.

Whilst our group enjoyed the Pinnacles, our brilliant guide set up a table of food, wine and soft drinks. At around 7:15, we slowly started coming back to our base to serve up a plate of food and get a drink, before sitting round in a circle underneath the stars. It was buffet style so you could pick and choose what you wanted from the amazing selection of food. There was ample seating provided, so it was a case of finding a spot and eating dinner under the stars!

dinner at the pinnacles

Star Gazing at the Pinnacles

One of the main reasons I signed up to this day trip to the Pinnacles was for the star gazing. Being from London, and only having lived in big cities, I’ve rarely seen a sky filled with stars! And this trip did not disappoint. Once we’d finished eating dinner, everyone passed round binoculars that our guide had provided. He also had one powerful telescope, that we all took turns queueing up for to see different constellations and planets that were pointed out to us. My highlights; seeing the Moon, Jupiter and Saturn!! According to our guide, on certain clear nights in the year, you can also see parts of the Milky Way and shooting stars.

I would recommend bringing warm clothing for this, because once the sun started to set, it was quite chilly. During the day, we wore shorts and t-shirts, but changed into leggings and jumpers for the evening. The guide did have some blankets to pass around, but everyone was saying how surprisingly cold it was. In addition to warm clothes/blankets, I would recommend brining a proper camera if possible. My iPhone really couldn’t capture what we were seeing well, so I just sat and enjoyed the skies. But it would have been nice to have a few good photos too.

star gazing at the pinnacles

Pinnacles Back to Perth

Once we finished enjoying the night’s sky, we began the 2-2.5 hour journey back to Perth. Our driver was on high alert for wild animals who tend to jump into the road. I would warn people planning to do this trip without a guide to be extra alert during dusk/evening, given the number of animals that jump on and across the road. Our tour guide was telling us horror stories of people having bad crashes after colliding with Kangaroos and Wombats. We were dropped back at our individual accommodations around Perth CBD in the order we were picked up in…meaning I got back first! We got back fairly late, so I would plan to do this trip the day before something like an early morning flight.

All-in-all, the Perth to Pinnacles day trip far exceeded my expectations and I’m so glad I did it. It was definitely a highlight of my time in WA. I also loved visiting Fremantle, Rottnest Island amd exploring Perth during my visit.

The Pinnacles FAQs

How were the Pinnacles Formed?

The Pinnacles were formed over thousands of years through a combination of geological and environmental processes. These striking limestone formations, located in Nambung National Park, are thought to have originated from ancient seashells, rich in calcium carbonate, that were broken down into sand by natural forces.

Over time, these sands were compacted and cemented together to form limestone beneath layers of sand dunes. Wind and water erosion then played a critical role in exposing and sculpting the limestone into the dramatic pillars seen today. The surrounding vegetation, along with microbial activity, contributed to the development of hardened layers that protected the underlying structures, allowing the Pinnacles to stand resilient against erosion.

What is the Nearest Town to the Pinnacles?

Cervantes is the nearest town to the Pinnacles and is home to a few restaurants, different accommodations, lookout points, beaches and the main Pinnacles visitor centre. We briefly stopped here during our tour to use the public restrooms.

How Much is the Entry Fee to the Pinnacles?

It costs $15 AUD per person to enter the Pinnacles – this was included in our price for the day trip.

What to Bring to the Pinnacles?

There’s a small gift shop nearby the entrance, however this closes at 4:30pm. So be sure to bring plenty of water and snacks with you for the duration of your stay. If you’re going in the day, bring sunscreen and a hat to protect you from the sun. If you’re going in the evening, bring warm clothes.

How Long Do You Need at the Pinnacles?

We spent a few hours there at that felt like enough! We were able walk the 1.5km circular route to see the incredible rock formations and have time to enjoy dinner under the stars.

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post The Pinnacles: The Perfect Perth to Pinnacles Day Trip appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/perth-to-pinnacles/feed/ 0
Visiting the Lancelin Sand Dunes in Perth WA https://www.charsfootsteps.com/travel/oceania/australia/lancelin-sand-dunes/?utm_source=rss&utm_medium=rss&utm_campaign=lancelin-sand-dunes https://www.charsfootsteps.com/travel/oceania/australia/lancelin-sand-dunes/#respond Mon, 23 Dec 2024 00:19:09 +0000 https://www.charsfootsteps.com/?p=4158 The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique experience in Western Australia. Spanning several kilometres, these massive white sand dunes offer stunning views and fun activities! I went to the Lancelin Sand Dunes during a day trip from Perth to the Pinnacles. It […]

The post Visiting the Lancelin Sand Dunes in Perth WA appeared first on Char's Footsteps.

]]>
The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique experience in Western Australia. Spanning several kilometres, these massive white sand dunes offer stunning views and fun activities! I went to the Lancelin Sand Dunes during a day trip from Perth to the Pinnacles. It was our first main stop on the tour and was so fun! Here are some of the things you can do at the Lancelin Sand Dunes and why it’s something to consider whilst visiting this part of the country.

For anyone looking to do this trip on a tour, this is the specific one I did and I had the best time!! A day of sand-boarding on the dunes, stargazing, the Pinnacles and a BBQ dinner in the desert.

What to Do in Lancelin Sand Dunes

Sand-boarding

The main things to do at the Lancelin Sand Dunes is sand-boarding. Similar to snowboarding but on sand, this activity involves sliding down the dunes on a specially designed board. Boards can be rented from nearby vendors in the town of Lancelin or directly at the dunes. These were provided for us during our day trip tour so I can’t comment personally on renting the boards. I believe boards can be rented for $10 an hour, between 10am-3pm. Check out the Lancelin site for more detailed information on renting boards if you’re doing this without a tour.

I was a bit nervous about doing this but the powdery sand, mixed with the varying heights of the dunes, made it suitable for anyone! I chose the small dunes, whilst others in the group chose the larger, steeper areas. For the sand-boarding, it’s best to bring sunglasses or goggles to protect your eyes from the glare and flying sand. Be sure to also bring plenty of water and sunscreen, as the dunes can get very hot, especially during the summer months.

Off-Roading and Four-Wheel Driving

For those with a four-wheel drive (4WD) vehicle, the Lancelin Sand Dunes offer an exciting opportunity to test your off-roading skills. The dunes’ varied terrain provides a challenge for both novice and experienced drivers. Make sure your vehicle is equipped for sand driving, and always deflate your tyres to the recommended pressure for better traction.

Photography

This area is a fantastic place for photographers! The pristine white dunes against the bright blue sky create stunning backdrops. Near to the dunes, is the Lancelin Lookout and a beach. These are also great to check out if you want to capture the landscape of the area.

Picnics and Relaxation

For those seeking a quieter experience, the dunes also offer space to relax and take in the scenery. Bring a picnic and enjoy the peaceful surroundings! The little town nearby have shops like IGA and cafes, where you can buy food to take with you. Be sure to bring all your litter with you!!

Powered by GetYourGuide

FAQs

How Far is Lancelin Sand Dunes from Perth?

The Lancelin Sand Dunes are located near the town of Lancelin, approximately 130km / 90 minutes north of Perth, Western Australia.

How to Get to Lancelin Sand Dunes?

The easiest way to get there from Perth is to drive up the Mitchell Freeway North until you get to the Indian Ocean Drive. You’ll find the town of Lancelin about 6km off this road. Here you’ll be able to find the boards to rent for dune boarding, shops and facilities.

What Should I Bring?

I strongly recommend brining sunglasses, and even goggles, to protect your eyes from the sand going into your eyes and from the white sand’s glare. Outside of this, bring the standard sunscreen, water and comfortable clothes.

Is There an Entry Fee for the Lancelin Sand Dunes?

No, access to the Lancelin Sand Dunes is free. However, fees will apply for board rentals or guided tours.

Do You Need 4WD to be on Lancelin Sand Dunes?

You can park at the base of the dunes and walk to the sand-boarding areas in any vehicle. However, if you plan to dive on the dunes themselves then you’ll need a 4WD vehicle.

Are the Dunes Suitable for Children?

Yes, the dunes are family-friendly, and children can enjoy sand-boarding on the smaller slopes. However, adult supervision is recommended, especially on steeper dunes.

Best Time to Visit the Lancelin Sand Dunes?

The dunes can be visited year-round, but mornings and late afternoons are the best times to avoid the midday heat. Spring and autumn offer milder temperatures, making these seasons particularly pleasant. Be sure to check the weather closely prior to going! We had bush fires around the area in the days prior to going, which led to road closures to this area.

Are There Facilities Nearby?

There are no facilities at the dunes themselves, but the nearby town of Lancelin has shops, cafes and rental services for equipment. e.g. for boards for the sand dunes or goggles to protect your eyes.

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post Visiting the Lancelin Sand Dunes in Perth WA appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/lancelin-sand-dunes/feed/ 0
A Complete Guide to Hiking Mount Ainslie in Canberra https://www.charsfootsteps.com/travel/oceania/australia/mount-ainslie/?utm_source=rss&utm_medium=rss&utm_campaign=mount-ainslie https://www.charsfootsteps.com/travel/oceania/australia/mount-ainslie/#respond Wed, 27 Nov 2024 04:18:57 +0000 https://www.charsfootsteps.com/?p=4134 Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located within the Canberra Nature Park, this is the perfect hike for those looking to enjoy some nature without too much physical exertion. Hiking Mount Ainslie was high on my Canberra to-do list, so I’m glad […]

The post A Complete Guide to Hiking Mount Ainslie in Canberra appeared first on Char's Footsteps.

]]>
Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located within the Canberra Nature Park, this is the perfect hike for those looking to enjoy some nature without too much physical exertion. Hiking Mount Ainslie was high on my Canberra to-do list, so I’m glad I got to recently tick it off. Here is a little guide on everything you need to know about hiking Mount Ainslie.

mount ainslie hiking trail

How to Get to Mount Ainslie

Mount Ainslie is located just on the edge of Canberra’s city centre, making it very easy to get to. The easiest way would be to drive take Limestone Avenue towards the Australian War Memorial and follow signs for Mount Ainslie Drive. There’s a car park at the base near the Australian War Memorial or at the summit if you prefer to drive up and enjoy the views without the hike. I found it very easy to get taxis/ubers.

There isn’t direct public transport to the trailhead but you can get buses to the Australian War Memorial. From there, it’s a short walk to the start of the Mount Ainslie Walking Track. During my visit to Canberra, all buses were free of charge, so this made it an economical way to travel around the city!

Depending on where you’re staying within Canberra, you can walk there. The city has great paths and trails, making it easier to navigate most places by foot. As I had just done the Mount Ainslie Parkrun, I started the hike from there.

mount ainslie hike

The Mount Ainslie Hike

The Mount Ainslie Walking Track is a well-maintained trail, suitable for beginners and seasoned hikers alike. The most popular route starts at the rear of the Australian War Memorial and follows a clear path to the summit. It’s open year-round.

  • Distance: 4.2 km return
  • Elevation: Approximately 300 metres
  • Time Required: 1–2 hours, depending on fitness level

The trail is mostly uphill, with steady inclines and some steeper sections. It’s paved with gravel and has steps in parts, making it accessible and safe. I found the trail completely fine, but there was a set of steps towards the summit that were a little steep (pic for reference below).

The trail winds through bushland typical of the Canberra region, with eucalyptus trees and native shrubs. It’s supposed to be great for birdwatchers, with a variety including galahs, rosellas and cockatoos. I’m not really clued up on bird species, but saw pretty, colourful birds en route. I was told kangaroos can occasionally be seen in the mornings or evenings, but didn’t spot any on my hike.

There are interpretive signs along the trail, which provide interesting insights into Canberra’s history and design. It was nice to stop along the route to read more about the city, particularly its links to Walter Burley Griffin’s vision for the city.

The Mount Ainslie Lookout

Once you’ve reached the summit, you’ll be treated to an iconic, unobstructed view over Canberra. The central alignment of Anzac Parade, leading to Parliament House, is a highlight, showcasing the city’s unique layout. On clear days, you can see as far as Black Mountain and Lake Burley Griffin. It was definitely worth the sweaty walk up! There are a few facilities at the lookout point too. I heard great things about going the lookout at sunset for stunning, colourful views over the city. Unfortunately, I didn’t have time to go back in the evening but I’ve seen incredible sunset shots from this lookout and would try squeeze it into your itinerary if possible.

mount ainslie lookout

Facilities

Lookout Platform: The summit has a large viewing platform with railings, perfect for photographs.

Picnic Area: There are benches and shaded areas for resting or enjoying a snack.

Information Boards: These provide details about Canberra’s landmarks and history.

Toilets: Available near the car park at the summit.

Water Fountain: There is a water fountain at the top (but not along the trail). I stupidly didn’t bring water so finding this was a big relief.

Mount Ainslie Hiking Tips

Here are a few extra tips to make your trip to Mount Ainslie more enjoyable:

Bring Water: My biggest tip is to bring water. Although there is a water fountain at the top, there are no refill stations on the trail itself. I went in November, when it wasn’t particularly hot, and regretted not having water with me within 10 minutes of the hike. There is a great fountain at the top, but best to be prepared and bring your own in case.

Wear Sturdy Shoes: The trail can be uneven in parts so it’s to wear proper walking, closed shoes. I saw some people struggling in flip flops (or thongs as the Aussies would say) along the trail. It’s also quite dusty which I imagine would make your feet quite gross.

Check Weather Conditions: Definitely check the weather ahead of the walk and avoid hiking in extreme heat or storms.

Start Early: Beat the crowds and enjoy the serene morning atmosphere.

Respect Nature: Stay on the trail and avoid disturbing wildlife.

FAQs

How Long Does it Take to Walk Up Mount Ainslie?

It takes on average 1-2 hours to walk to the top. This will depend on your fitness levels and how many times you stop – there’s several great photo ops on the way up! I walked up in about 1hr 10 minutes, which included a few stops to take photos.

Is Mount Ainslie Suitable for Beginners?

Yes, the trail is manageable for beginners with a moderate fitness level. It’s a steady uphill climb but definitely not overly challenging. There are also a number of spots along the trail where you can stop for a break if needed.

Can I Bring My Dog?

Dogs are allowed up Mount Ainslie as long as they’r’e on a leash. Ensure they’re comfortable with other hikers and wildlife.

Is The Trail Accessible for Prams or Wheelchairs?

The actual walking track isn’t suitable for prams or wheelchairs, due to the steps, uneven terrain and narrow paths at points. However the summit is accessible by car, so you can drive up to the top and enjoy the view from there.

What’s the Best Time of Year to Visit?

You can technically go throughout the year, but spring (Sept-Nov) and autumn (Mar-May) offer comfortable weather. I haven’t visited Mount Ainslie during the winter, but I imagine this would be the least optimal time to go given the colder and darker weather. For colourful foliage, be sure to visit in the spring or autumn.

Can You Drive To Mount Ainslie Lookout?

Yes, if you’re not feeling up to the hike, you can definitely drive to Mount Ainslie lookout. It’s a quick and easy drive from Canberra’s city centre with free parking at the top. You can also order Ubers from here, so you could hike up and get a taxi back down if you’re short on time.

Mount Ainslie is really pretty hike that’s definitely worth doing during a trip to Canberra. It provides a great opportunity to see some of the city’s natural beauty, learn about its history and get great views at the top. If you’re in the area, be sure to check out the Australian War Memorial – I would say out of all the war museums I’ve been to, this is my favourite one! If you’re short on time, and just want views over Canberra, you can get great views at the rooftop of Parliament House. For more information on the Mount Ainslie hike, and others in Canberra, check out this ACT government site.

Other great hikes I did during my stay in Canberra, included the trails at the National Arboretum Canberra. Outside of Canberra, some of my favourite hiking areas have included Blue Mountains in NSW and the 1000 steps hike in Melbourne.

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post A Complete Guide to Hiking Mount Ainslie in Canberra appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/mount-ainslie/feed/ 0
Things to Do in Healesville https://www.charsfootsteps.com/travel/oceania/australia/things-to-do-in-healesville/?utm_source=rss&utm_medium=rss&utm_campaign=things-to-do-in-healesville https://www.charsfootsteps.com/travel/oceania/australia/things-to-do-in-healesville/#respond Thu, 31 Oct 2024 01:28:42 +0000 https://www.charsfootsteps.com/?p=3969 Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and beautiful natural surroundings. Ideal for both day trips and longer stays, it offers a great a mix of cultural attractions and outdoor activities. This is a guide on the best things to do in Healesville. […]

The post Things to Do in Healesville appeared first on Char's Footsteps.

]]>
Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and beautiful natural surroundings. Ideal for both day trips and longer stays, it offers a great a mix of cultural attractions and outdoor activities. This is a guide on the best things to do in Healesville.

How to Get to Healesville

By Car: Healesville is close to Melbourne with the journey time being approximately 1.5 hours. This makes for an easily accessible day trip from Melbourne! From Melbourne, take the M3 and Maroondah Highway to reach Healesville.

By Public Transport: The journey without a car is fairly straightforward, but will take longer. Take the train from Melbourne’s CBD to Lilydale Station. From Lilydale Station you’ll need to catch the 685 bus to Healesville.

Things to Do in Healesville

There are so many great things to do in Healesville, that you could easily spend a few days here. Here are some of my favourites:

Healesville Sanctuary

The Healesville Sanctuary is a fantastic place to explore Australian wildlife. You can get up-close encounters with native animals such as kangaroos, koalas and wombats in a natural bushland setting. It’s also a great place to see native animals that are much harder to see in the wild, such as the Tasmanian Devil and Platypus. There are a number of talks and presentations held throughout the day to help you learn more about the country’s wildlife.

I recommend keeping an eye out for events held at the sanctuary – I recently went to a ‘wine and wildlife‘ event and it was brilliant! This event had pop-ups with brilliant eateries and local breweries and wineries. Along with live music and ample seating area, we had a great time sampling some local wines without having to travel between multiple wineries. Then we got to enjoy the sanctuary afterwards! I’ve also seen the sanctuary doing free seniors buggy tours on weekends for specific months, so keep an eye on their site for what’s on.

healesville sanctuary koalas

Four Pillars Distillery

The Four Pillars Distillery is a must-do for gin enthusiasts! This award-winning distillery offers tastings, tours and a chance to learn about the gin-making process. There’s also things to do for non-gin drinkers, like their marmalade making experience and a collection of no-alcohol gin. Plus they have a really nice bar on site and a great gift shop for any other gin-lovers in your life. As someone who isn’t a huge fan of gin, I still had a brilliant time on their tour and trying some of the gins. Check out the Four Pillars Site for bookings or to buy gin.

four pillars distillery bar

Innocent Bystander

The area is home to a few wineries, but my favourite to visit is Innocent Bystander. This popular winery is perfect for wine tastings, wood-fired pizzas and a relaxed atmosphere. It’s a brilliant opportunity to try some local wines in a fun setting. They have a great variety of wines here including Pinot Noir, Chardonnay, Prosecco and Moscatos. You have the option of doing a full wine tasting or come for some great food and wine. The Innocent Bystander site has more information on what they do and the wines they specialise in.

Outside of Healesville are a number of other brilliant wineries. The whole Yarra Valley has an extensive range of different wineries to choose from to match your tastes and budget!

TarraWarra Museum of Art

The TarraWarra Museum of Art allows you to explore contemporary Australian art with a stunning vineyard backdrop. The museum has both permanent and rotating exhibitions on offer so keep an eye out for what’s on. They offer private and group tours or you can wander around solo. To note, some of the exhibits are outside so I recommend visiting on a sunny day.

Yarra Valley Railway

For something a little different, take a trip on the Yarra Valley Railway! This heritage railway operates on a section of the original Healesville railway and provides for a relaxed and scenic trip through the stunning Yarra Valley. The journey is approximately a 35 minute round trip. Be sure to check their site for availability as it varies depending on school holidays. Typically they run every Sunday, Wednesdays during school holidays and some Saturdays. Other brilliant train rides in Melbourne include Puffing Billy in the Dandenong Ranges with the beautiful 1000 steps hike nearby. You can find their timetable here.

Maroondah Reservoir Park

My favourite thing about living in Melbourne is how accessible it is to reach stunning nature spots. The Maroondah Reservoir Park is no exception! Spend time here enjoying a scenic picnic, walking trails, and views of the impressive dam wall and gardens. This is an ideal place for families and nature enthusiasts. Definitely bring a camera, if you’re interested in photography, as you can get some moody, atmospheric shots here! The park is huge so you could easily spend a day here exploring. Some things worth checking out with Maroondah Reservoir Park include the Black Spur Drive – an incredible Alpine forest driving experience!! Along with Mount Saint Leonard viewing platform, Maroondah Water Dam Wall and Selover’s Lookout. Visit their site for more information on the park and what to do there.

Free Things to Do in Healesville

There are a few great things to do in Healesville for free. I would say the best thing without doubt is exploring the Maroondah Reservoir Park. I am a big fan of exploring all of the nature and stunning trails Melbourne has to offer and this is a great place for nature and scenic picnics. Other great, free things to do in Healesville include strolling down Healesville’s Main Street. It’s a really cute street filled with local shops, boutiques, art galleries and cafes. I love exploring cute high streets within wider Victoria and Healesville is perfect for that. Albeit a bit small, you can definitely spend some time wandering around here. I particularly LOVED the cheese store and the ‘Laneway’ with a few cute boutiques and a distillers. Lastly you can spend some time viewing the Healesville Memorial Hall Murals. This comprises of local art commemorating Healesville’s heritage.

Best Cafes in Healesville

There are a number of great cafes and restaurants in Healesville to check out. My favourite place to eat would be at the Innocent Bystander. But if you’re looking for more cafe-vibes, consider the ones below;

Habituel Bakery & Coffee Roasters – Artisan coffee and fresh baked treats.

Mocha & Lime – Known for brunch, local produce and vegetarian-friendly options.

Healesville Harvest – Fresh, locally sourced ingredients in a cute, cosy setting.

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post Things to Do in Healesville appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/things-to-do-in-healesville/feed/ 0
A Day Trip to the Rainforest Gallery in Warburton https://www.charsfootsteps.com/travel/oceania/australia/rainforest-gallery/?utm_source=rss&utm_medium=rss&utm_campaign=rainforest-gallery https://www.charsfootsteps.com/travel/oceania/australia/rainforest-gallery/#respond Wed, 30 Oct 2024 02:58:37 +0000 https://www.charsfootsteps.com/?p=3949 The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive from Melbourne, this captivating destination combines serene natural beauty with an elevated Warburton treetop walk, perfect for a day of exploration and relaxation. Getting to the Rainforest Gallery By Car: The most straightforward route is […]

The post A Day Trip to the Rainforest Gallery in Warburton appeared first on Char's Footsteps.

]]>
The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive from Melbourne, this captivating destination combines serene natural beauty with an elevated Warburton treetop walk, perfect for a day of exploration and relaxation.

Getting to the Rainforest Gallery

By Car: The most straightforward route is by car. Take the Eastern Freeway (M3) out of Melbourne, merging onto the Maroondah Highway (B300) towards Lilydale. From there, follow signs towards Warburton and turn onto Donna Buang Road. The drive takes around 90 minutes, with ample parking available at the Rainforest Gallery Warburton car park.

Public Transport: While public transport can get you close to Warburton, reaching the gallery directly is difficult. Take the Lilydale line from Melbourne to Lilydale Station, then catch the 683 bus towards Warburton. From Warburton town centre, a short taxi or rideshare will take you to the gallery. I wouldn’t recommend trying to walk as the road there is very winding and dangerous with cars.

rainforest gallery

What to Do at the Rainforest Gallery

Warburton Treetop Walk: The Rainforest Gallery treetop walk is a stunning 40m elevated walkway suspended over the rainforest floor. The path takes you right up into the canopy, allowing you to experience the lush scenery from an awe-inspiring perspective. The treetop walk includes interpretive signs that share insights into the unique ecosystem of the Yarra Ranges. There are a few viewing platforms on the suspended walkway which provide great photo ops!

Rainforest Walk and Viewing Platform: After taking in the views from the treetop walk, head down the steps to explore the Rainforest Gallery at ground level. The boardwalk meanders through the dense forest, offering close views of moss-covered ferns, ancient trees and crystal-clear creeks. The atmosphere here is quiet and refreshing, making it a beautiful spot for a leisurely stroll.

rainforest gallery viewing platform

Photography: With its stunning variety of flora and misty ambiance, the Rainforest Gallery Warburton is a photographer’s dream. Early morning or late afternoon provides ideal lighting for capturing the towering trees and rich greenery.

Picnic Areas: Although the gallery itself doesn’t offer picnic facilities, nearby Warburton is home to scenic spots along the Yarra River where you can enjoy a packed lunch or pick up takeaway from one of the town’s local cafes. There’s a bakery in town called the Warburton Bakery that does amazing pies! I recommend picking one up (or other baked goodies) and heading down to the river to eat. It’s always a nice buzzing atmosphere here!

The Redwood Forest

If you’re planning a visit to Warburton or the Rainforest Gallery, I highly recommend you make time to visit the Redwood Forest nearby. It’s an unbelievably stunning forest, home to the famous Californian Redwood Trees. After an incredible trip to Rotorua, I’ve had seeing Redwood trees again on my bucket-list. I’ve written a short guide on the Redwood Forests and everything you need to know to have a great time here.

redwood forest warburton

FAQs

Is There an Entry Fee for the Rainforest Gallery?

No, the Rainforest Gallery is free to visit, making it a great option for a cheap day trip out of the city.

Are Dogs Allowed?

No, dogs are not permitted within the Rainforest Gallery to help protect the local flora and fauna. This is the case for most National Parks in Victoria.

Is the Walk Suitable for Young Children?

Yes, the elevated Warburton treetop walk and boardwalks are family-friendly. There are stairs and elevated sections so be mindful of that if you’re planning to bring prams or pushchairs.

Are There Toilet Facilities?

There are no toilets at the Rainforest Gallery. The closest facilities can be found in Warburton, about a 10-minute drive away.

When is the Best Time to Visit?

The rainforest is a lovely spot year-round, but visiting after a rainfall brings out the best of the greenery and fills the air with a refreshing forest scent. Be prepared for cooler temperatures in winter!

Tips for Visiting

Wear Sturdy Footwear: The boardwalk can be slippery, especially after rain, so wear sturdy shoes with good grip.

Layer Up: The rainforest stays cool, even on warmer days, so bring layers. We definitely noticed the difference in temperature even between Warburton and the rainforest.

Bring a Camera: The lush surroundings and unique perspectives on the treetop walk make the Rainforest Gallery a photogenic destination, so don’t forget your camera or smartphone.

A day trip to the Rainforest Gallery in Warburton is a serene and inspiring escape into nature, providing both scenic beauty and a sense of connection with the environment. With its combination of the Warburton treetop walk, easy access from Melbourne and peaceful trails, this forest gem is a must-do! The Warburton area is also great to explore, with the Redwood Forest close by, the Yarra River and cute cafes and shops to explore!

Other great nature places to check out in Melbourne include the Otways, Great Ocean Road, Port Nepean National Park, all the incredible gardens in Melbourne, 1000 steps in Dandenong and Cape Schanck!

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post A Day Trip to the Rainforest Gallery in Warburton appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/rainforest-gallery/feed/ 0
A Day Trip to the Redwood Forest Melbourne https://www.charsfootsteps.com/travel/oceania/australia/redwood-forest-melbourne/?utm_source=rss&utm_medium=rss&utm_campaign=redwood-forest-melbourne https://www.charsfootsteps.com/travel/oceania/australia/redwood-forest-melbourne/#respond Wed, 30 Oct 2024 01:19:36 +0000 https://www.charsfootsteps.com/?p=3940 Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! One of my favourite places to explore here is the Redwood Forest, home to the Californian Redwood trees that seem straight out of a fairytale. With towering trunks, rich green undergrowth and dappled sunlight filtering […]

The post A Day Trip to the Redwood Forest Melbourne appeared first on Char's Footsteps.

]]>
Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! One of my favourite places to explore here is the Redwood Forest, home to the Californian Redwood trees that seem straight out of a fairytale. With towering trunks, rich green undergrowth and dappled sunlight filtering through, the Redwood Forest is an ideal escape from the city. Here is a quick guide on visiting the Redwood Forest in Melbourne.

Getting to the Redwood Forest

By Car: The easiest way to reach the Redwood Forest is by car. Follow the Eastern Freeway (M3) from Melbourne, then merge onto the Maroondah Highway (B300) towards Lilydale and Warburton. As you near Warburton, turn onto Cement Creek Road, which leads directly to the Redwood Forest. The journey takes around 90 minutes, depending on traffic and there is limited free parking available onsite.

Public Transport: There isn’t a direct way to get to the Redwood Forests by public transport. If you’re without a ar, you can take a train from Melbourne’s CBD to Lilydale Station on the Lilydale line. From there, catch bus 683 towards Warburton. This won’t bring you directly to the forest, but you can get off at the closest stop and then take a short taxi ride or a long scenic walk to reach the forest itself.

redwood forest warburton

What to Do at the Redwood Forest

Walk Amongst the Giants: The main attraction is undoubtedly the impressive redwoods themselves. These trees, originally planted in the 1930s, tower over visitors at heights of around 55 metres. A meander through these perfectly aligned trees is peaceful and slightly surreal!

If you’re a fan of Californian Redwood Trees, I highly recommend visiting the Redwood Trees in Rotorua! Honestly one of the most incredible parks I’ve ever visited.

Picnic Areas: Pack a picnic to enjoy under the trees or along Cement Creek. The forest offers natural spots where you can lay out a blanket and relax, though there are no formal picnic facilities, so bring any necessities you may need.

Photography: The rows of towering redwoods make for striking photography opportunities, especially as the light changes throughout the day. Early morning or late afternoon is often the best time to capture the forest at its most atmospheric.

Bushwalking Trails: The nearby O’Shannassy Aqueduct Trail offers an accessible walk through native Australian bushland, providing scenic views and opportunities to spot local wildlife. It’s a fantastic way to extend your day trip if you’d like to see more than just the redwoods.

redwood forest melbourne

Birdwatching: There are a variety of bird species in this area, including kookaburras, cockatoos and colourful parrots. We were surprised by how loud they were during our trip to the forest!

The Rainforest Gallery

If you’re spending time at the Redwood Forest, I recommend heading to the nearby Rainforest Gallery. This is a treetop walk through the forest and is a must-do if you’re in the area. Here is a guide on the Rainforest Gallery and all the amazing things to see there.

Where to Eat

Warburton offers several delightful dining options within a short drive of the forest:

Alpine Hotel: My favourite place to eat in Warburton is the Alpine Hotel! Really great pub food set in a cute garden.

the alpine hotel warburton

Riverview Café & Wine Bar: Located along the Yarra River, Riverview Café offers a range of locally sourced dishes and excellent coffee. Perfect for a post-walk lunch or snack with a view of the river.

Little Joe: For a more substantial meal, head to Little Joe in Warburton’s main township. They offer a variety of hearty meals, from burgers and sandwiches to pizzas, making it a great choice for refuelling after your forest adventures.

Warburton Bakery: If you’re after a quick bite, Warburton Bakery is a popular choice. Grab a pie, sandwich or something sweet for the road. They’ve got good doughnuts!

FAQs

Is There an Entry Fee for the Redwood Forest?

No, the Redwood Forest is free to visit.

Can I bring my dog?

No, dogs are not allowed in the Redwood Forest as it’s a National Park. Most National Parks in Victoria (and Australia in general) don’t allow dogs.

Are there toilet facilities?

Unfortunately, there are no toilet facilities at the Redwood Forest. The nearest facilities are located in Warburton town centre.

When is the Best Time to Visit?

The forest is beautiful year-round, but autumn and winter often bring a mystical fog that enhances the atmosphere. Spring and summer bring brighter days and warmer weather, making it perfect for picnics. I recommend picking a day that isn’t raining.

How long should I plan to spend here?

Most visitors find 1-2 hours sufficient to explore the redwoods, with additional time for nearby trails or a leisurely lunch in Warburton.

Tips for Visiting the Redwood Forest

Dress Appropriately: The forest can be cooler than Melbourne, so bring layers, especially in autumn and winter.

Pack Out What You Pack In: There are no bins in the forest, so remember to take any rubbish with you.

Check for Weather Conditions: Rain can make the forest pathways slippery, so wear appropriate footwear and check the weather forecast ahead of time. I would avoid coming here if it’s forecast to rain.

Other great places to walk around Melbourne include Port Nepean National Park, 1000 Steps in Dandenong and cape schanck!

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post A Day Trip to the Redwood Forest Melbourne appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/redwood-forest-melbourne/feed/ 0
Free Tram Zone Melbourne – Everything You Need to Know! https://www.charsfootsteps.com/travel/oceania/australia/free-tram-zone-melbourne/?utm_source=rss&utm_medium=rss&utm_campaign=free-tram-zone-melbourne https://www.charsfootsteps.com/travel/oceania/australia/free-tram-zone-melbourne/#respond Tue, 29 Oct 2024 01:31:56 +0000 https://www.charsfootsteps.com/?p=3922 Melbourne’s Free Tram Zone is a designated area within the Central Business District (CBD) where tram travel is free of charge. Introduced to encourage the use of public transport, the zone provides tourists and locals alike with an accessible way to move around the city without any cost or need for a Myki card. How […]

The post Free Tram Zone Melbourne – Everything You Need to Know! appeared first on Char's Footsteps.

]]>
Melbourne’s Free Tram Zone is a designated area within the Central Business District (CBD) where tram travel is free of charge. Introduced to encourage the use of public transport, the zone provides tourists and locals alike with an accessible way to move around the city without any cost or need for a Myki card.

How Does Melbourne’s Free Tram Zone Work?

Within the Free Tram Zone, all tram travel is entirely free. There’s no need to tap on or tap off a Myki card when boarding trams in this area. As long as you enter and exit the tram within the designated zone, no fare is charged. Trams running through the Free Tram Zone will also pass stops outside the boundary, where fares apply.

Where is the Free Tram Zone in Melbourne?

The Free Tram Zone is limited to Melbourne’s CBD. Boundaries of the zone include popular streets like La Trobe Street to the north, Flinders Street to the south, Spring Street to the east and Spencer Street to the west. There are a few notable stops and areas within the Free Tram Zone. These include Flinders Street Station, Federation Square, Queen Victoria Market and Bourke Street Mall.

melbourne free tram zone map
Melbourne free tram zone map taken from: ptv.vic.gov.au

How to Know Where the Free Tram Zone Is?

Tram stops within the Free Tram Zone are clearly marked with signage. Maps are available on tram stops and platforms, highlighting the Free Tram Zone boundaries. In addition, there’s usually an announcement on the tram that the free zone is ending. For ease of navigation, you can also refer to the official Free Tram Zone map online.

Tourist Activities within the Free Tram Zone

The Free Tram Zone makes for an easy and free way to explore Melbourne’s iconic CBD landmarks. Here are some must-visit places within the free tram zone:

Federation Square: Known for its modern architecture, Federation Square houses cultural institutions, eateries and public spaces. Throughout the year there are many events and exhibitions hosted here too!

Queen Victoria Market: A historic market offering everything from fresh produce to unique souvenirs and food stalls. Check out other amazing markets in Melbourne during your trip!

State Library of Victoria: Victoria’s oldest public library, renowned for its grand reading rooms and fascinating exhibitions on Melbourne’s history.

Flinders Street Station: Melbourne’s iconic railway station with its heritage-listed architecture and easy connection to other parts of the city.

Chinatown: A vibrant district packed with authentic Asian eateries, cultural festivals and unique shops.

Bourke Street Mall: Melbourne’s prime retail hub, home to leading stores and shopping experiences. There are a few other malls to check out nearby including Melbourne Central.

Melbourne Trams – Beyond the Free Zone

Once you travel outside the Free Tram Zone, a valid Myki card is required. Here’s what you need to know about tram fares and payment options:

How Do You Pay for Trams in Melbourne?

Outside the Free Tram Zone, Melbourne’s trams are not free. Fares vary based on travel distance and zones, with most of the metropolitan area covered under Zone 1. A daily fare typically covers all public transport in Melbourne for the day. To travel, you’ll need a Myki card, which costs around AUD 6 for adults and can be purchased at convenience stores, train stations and Myki machines. Once loaded with credit, simply tap on at the start of your journey and tap off upon leaving. If you have an Android phone, you can download a mobile Myki to your Google Wallet and pay via your phone. This isn’t available to iPhone users yet annoyingly.

App for Melbourne Trams

For an easier travel experience, I recommend downloading the PTV (Public Transport Victoria) app. This provides tram schedules, real-time tracking, route planning and easy Myki top-ups. You can check out the PTV site here and download the app here.

Other useful apps for Melbourne Trams include CityMapper and Google Maps. Both offering reliable route planning and live tracking for Melbourne trams, making it easier to plan your journey.

FAQs for Melbourne Trams

Can You Use Credit Cards on Melbourne Trams?

No, you can’t use credit or debit cards on Melbourne Trams. However, you can use Mobile myki if you have an Android phone, via Google Pay. For more information on this, check out this PTV article. This unfortunately isn’t something available to iPhone users as of yet. Therefore you can use a traditional Myki cards for tram travel outside the Free Tram Zone.

What Time Do Trams Start Running in Melbourne?

Trams generally start around 5 a.m. on weekdays, with services starting slightly later on weekends.

Do Trams Run All Night in Melbourne?

Some tram routes run 24 hours on Fridays and Saturdays; otherwise, trams usually cease around midnight.

Historic Tram Tour

For a classic Melbourne experience, hop onto the City Circle Tram (Route 35) – a heritage tram that circles the CBD. This is also free! This route provides audio commentary on historical sites, perfect if you’re wanting to learn about Melbourne’s history and landmarks.

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post Free Tram Zone Melbourne – Everything You Need to Know! appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/free-tram-zone-melbourne/feed/ 0
A Day Trip to The Peninsula Hot Springs From Melbourne https://www.charsfootsteps.com/travel/oceania/australia/mornington-peninsula-hot-springs/?utm_source=rss&utm_medium=rss&utm_campaign=mornington-peninsula-hot-springs https://www.charsfootsteps.com/travel/oceania/australia/mornington-peninsula-hot-springs/#respond Thu, 17 Oct 2024 05:35:09 +0000 https://www.charsfootsteps.com/?p=3583 The Peninsula Hot Springs lie within the Mornington Peninsula and is the perfect tranquil escape from the hustle and bustle of Melbourne. This natural hot spring destination combines therapeutic baths with picturesque surroundings, providing an ideal setting for relaxation and self-care. The hot springs are a geothermal wonderland that allows you to properly unwind and […]

The post A Day Trip to The Peninsula Hot Springs From Melbourne appeared first on Char's Footsteps.

]]>
The Peninsula Hot Springs lie within the Mornington Peninsula and is the perfect tranquil escape from the hustle and bustle of Melbourne. This natural hot spring destination combines therapeutic baths with picturesque surroundings, providing an ideal setting for relaxation and self-care. The hot springs are a geothermal wonderland that allows you to properly unwind and reconnect with nature, whether that’s for an afternoon or full-day trip.

What to Expect at Peninsula Hot Springs

Geothermal Mineral Springs

The Peninsula Hot Springs are renowned for their geothermal mineral springs, which are naturally heated and rich in beneficial minerals. The springs are set amidst a stunning landscape of rolling hills and lush gardens, creating a serene environment where you can escape everyday stresses. There are a number of pools to choose from and you can choose to visit a number of them during your stay. We visited the hot springs on a Friday Morning, so had a very quiet experience and got to go in many empty thermal pools. I would imagine during busier times it might be easier to choose which pools you go in based on how crowded they are.

Varied Thermal Pools

The cornerstone of Peninsula Hot Springs is its array of natural hot spring pools. Fed by mineral-rich waters from deep underground, these pools offer a range of temperatures to suit different preferences. You can enjoy everything from refreshing plunge pools to steaming thermal baths, each providing unique therapeutic benefits. We loved going between the steamy rooms and then jumping into the icy plunge pools! The diverse temperatures and mineral compositions cater to both relaxation and therapeutic needs.

Wellness Activities and Treatments

In addition to the thermal pools, the Peninsula Hot Springs offers a range of wellness experiences. You can indulge in spa treatments such as massages and facials, or participate in wellness classes like yoga and meditation. The focus is on holistic health, aiming to balance both mind and body, with popular activities including:

  • Yoga and Pilates classes
  • Meditation sessions
  • Massage therapies
  • Facials and body treatments

Be sure to check out their site and book these activities in advance to ensure you get them!

The Bath House

The Bath House is the heart of the Peninsula Hot Springs, featuring over 20 different bathing experiences. From the naturally heated pools to the stunning views of the surrounding landscape, it provides a comprehensive and immersive hot springs experience. Hilltop Pool The crown jewel of Peninsula Hot Springs is undoubtedly the hilltop pool. Perched at the highest point of the facility, it offers panoramic views of the surrounding countryside. Soaking in this pool while taking in the breathtaking vistas is truly a memorable experience.

Cave Pool For those seeking a more secluded experience, the cave pool provides a cosy and intimate setting. The dimly lit ambience creates a peaceful atmosphere, perfect for quiet contemplation or intimate conversations.

Reflexology Walk Beyond traditional bathing, Peninsula Hot Springs offers a reflexology walk. This unique feature allows visitors to stimulate pressure points in their feet by walking on a textured path submerged in thermal waters.

Private Bathing

For those seeking a more intimate experience, the Peninsula Hot Springs offer private bathing options. These include private thermal mineral pools, perfect for couples or individuals who prefer a quieter, more personal setting. I went with a big group so I didn’t venture into these private baths and can’t provide much personal experience but I imagine these would be a great place to celebrate anniversaries!

Eating at The Hot Springs

The hot springs have a few dining options on-site. There’s an outdoor bath house cafe which serves light meals, coffee and healthy drinks. For more substantial options, check out their amphitheatre cafe or dining room in their spa centre. These also offer health meal options in an aesthetic setting. I like how the food here uses fresh and locally sourced ingredients, with options to suit various dietary requirements in our group.

How To Get To Peninsula Hot Springs From Melbourne

With a car, the Peninsula Hot Springs are easily accessible, with a journey time of approximately 90 minutes from Melbourne. If you don’t have access to a car, it is possible to get there with public transport, but it’s long!! You’ll need to get the train to Frankston, and from there, get several buses. As there isn’t a direct bus from Frankston, i’d recommend using CityMapper, Google Maps or the PTV app to plan your specific route. This will increase the journey time from 90 minutes to 3-5 hours depending on your route and time of travel. If you can’t drive/rent a car, I would recommend spending a few days in the Mornington Peninsula area or Sorrento area to make place like the Peninsula Hot Springs more accessible for day trips.

Other Logistics

Booking and Reservations

It’s advisable to book your visit in advance, especially during peak times or weekends. You can book through their official site, where a variety of packages are on offer. The facility offers various packages to suit different budgets and preferences, from basic bathing experiences to comprehensive spa retreats.

What to Bring

To make the most of your visit, bring swimwear, a towel and comfortable clothing. The hot springs provide amenities such as lockers and showers, and you can rent dressing gowns to spend the day in.

Peninsula Hot Springs offers a respite from the hustle and bustle of Melbourne city life. Its natural geothermal pools, diverse bathing experiences and focus on overall wellness provides an opportunity to relax, rejuvenate and reconnect with nature! Whether you’re a local looking for a day trip or a tourist seeking a distinctive Melbourne experience, Peninsula Hot Springs is a destination definitely worth exploring.

Other places to check out in the area include Sorrento, the Port Nepean National Park, Arthurs Seat, Cape Schanck and the wider Mornington Peninsula area. Outside of this region, I highly recommend visiting the Yarra Valley, the 1000 steps in Dandenong National Park and Great Ocean Road.

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post A Day Trip to The Peninsula Hot Springs From Melbourne appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/mornington-peninsula-hot-springs/feed/ 0
Visiting Cape Schanck From Melbourne https://www.charsfootsteps.com/travel/oceania/australia/cape-schanck/?utm_source=rss&utm_medium=rss&utm_campaign=cape-schanck https://www.charsfootsteps.com/travel/oceania/australia/cape-schanck/#respond Sun, 06 Oct 2024 23:41:17 +0000 https://www.charsfootsteps.com/?p=3842 Cape Schanck, located on the Mornington Peninsula, is renowned for its rugged coastal beauty, dramatic cliffs, wild rock formations and historic lighthouse. As one of the region’s most iconic natural landmarks, it offers the perfect escape from the city. Whether you’re planning a quick day trip or a relaxing weekend, Cape Schanck is great for […]

The post Visiting Cape Schanck From Melbourne appeared first on Char's Footsteps.

]]>
Cape Schanck, located on the Mornington Peninsula, is renowned for its rugged coastal beauty, dramatic cliffs, wild rock formations and historic lighthouse. As one of the region’s most iconic natural landmarks, it offers the perfect escape from the city. Whether you’re planning a quick day trip or a relaxing weekend, Cape Schanck is great for nature, scenic walking trails and stunning ocean views.

How to Get to Cape Schanck from Melbourne

Reaching Cape Schanck from Melbourne is pretty straightforward by car, with the drive taking approximately 90 minutes. The easiest route is via the M3 (EastLink) and the Mornington Peninsula Freeway, before following Boneo Road to the Cape Schanck Lighthouse precinct.

If you need to take public transport, you can take a train from Melbourne to Frankston, then transfer to a bus that heads towards Cape Schanck. However, this option take considerably longer! I would consider taking a guided tour if you don’t have a car – departing from Melbourne and typically including other Mornington Peninsula attractions.

What to Do in Cape Schanck

Cape Schanck Lighthouse

The Cape Schanck Lighthouse, built in 1859, is a historic beacon perched on the cliffs. You can take guided tours to learn about its history and significance in Victorian maritime heritage. There’s also a viewing platform, offering great views of the Bass Strait and the surrounding rugged coastline. Tours cost $16.50 for adults and $10.50 for children, with family tickets available too.

Bushwalking and the Cape Schanck Boardwalk

My favourite thing to do in Cape Schanck is the excellent walking trails. The Cape Schanck Boardwalk is a must, providing easy access to the rocky coastline while offering dramatic cliffside views. The Bushrangers Bay Track is another popular option, winding through native bushland before revealing pristine coastal scenery.

Rockpools and Beach Exploration

For those keen to explore more, low tide reveals fascinating rockpools along the shoreline. These are great for exploring marine life or simply enjoying the natural beauty. The beaches around Cape Schanck are wild and untamed, offering a more secluded experience compared to the busier beaches of the peninsula.

Visiting Cape Schanck as a Day Trip from Melbourne

Cape Schanck is perfect for a day trip. Start your day by arriving in the morning to explore the lighthouse and take in the sweeping ocean views. A leisurely walk along the Cape Schanck Boardwalk offers stunning sights of the cliffs and coastline, while a picnic in the surrounding parklands is an excellent lunch option.

In the afternoon, enjoy a bushwalk to Bushrangers Bay or explore the rockpools during low tide. If you have time, I would recommend exploring the wider area. We went to Red Gum BBQ in Red Hill and had the most amazing BBQ food. There are a number of good breweries and wineries in the Mornington Peninsula area though for you to choose from. If you’re looking for other activities in the area, I recommend visiting the Peninsula Hot Springs for a relaxing end to the day. Or for more nature, check out the Port Nepean National Park!!

FAQs

Is Cape Schanck Free to Visit?

Yes, access to the natural areas and boardwalks is free. However, there is a fee for guided tours of the lighthouse.

Are Dogs Allowed at Cape Schanck?

No, dogs are not allowed in Cape Schanck National Park to protect the local wildlife.

What Should I Bring?

I recommend wearing sturdy walking shoes, bringing water and sun protection! Melbourne’s weather can change quickly, so it’s a good idea to bring layers or a jacket. We have also had times there with lots of bugs, so consider bringing bug spray!

Is Cape Schanck Suitable for Families?

Yes, it’s a family-friendly destination. The walking trails are relatively easy for children and the lighthouse offers an educational experience.

Best Time to Visit Cape Schanck?

The best time to visit is during the spring and autumn months, when the weather is milder and there are fewer crowds. While summer can be warmer, it’s also the peak tourist season. Winter visits can be rewarding too, although it can be cooler and windier, the dramatic waves crashing against the cliffs make it worth the trip year-round.

If you enjoy Cape Schanck, I’d highly recommend checking out the nearby Port Nepean National Park or 1000 Steps Hike!

Related Posts

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post Visiting Cape Schanck From Melbourne appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/cape-schanck/feed/ 0
Spending a Day at The 1000 Steps in Dandenong https://www.charsfootsteps.com/travel/oceania/australia/1000-steps-dandenong-melbourne/?utm_source=rss&utm_medium=rss&utm_campaign=1000-steps-dandenong-melbourne https://www.charsfootsteps.com/travel/oceania/australia/1000-steps-dandenong-melbourne/#respond Sun, 06 Oct 2024 06:20:14 +0000 https://www.charsfootsteps.com/?p=3822 The 1000 Steps Kokoda Track Memorial Walk is a popular hiking destination in the Dandenong Ranges and a must-do when visiting Melbourne! The hike ascends through dense forest in the Dandenong Ranges National Park, offering stunning views and a great workout. Aside from the obvious beauty of the Dandenong Ranges, what makes the 1000 Steps […]

The post Spending a Day at The 1000 Steps in Dandenong appeared first on Char's Footsteps.

]]>
The 1000 Steps Kokoda Track Memorial Walk is a popular hiking destination in the Dandenong Ranges and a must-do when visiting Melbourne! The hike ascends through dense forest in the Dandenong Ranges National Park, offering stunning views and a great workout. Aside from the obvious beauty of the Dandenong Ranges, what makes the 1000 Steps unique is its connection with Australia’s military history. The trail is dedicated to the Australian soldiers who fought along the Kokoda Track in Papua New Guinea during World War II. The climb is somewhat physically demanding, but it was an enjoyable and rewarding experience! I hope this guide helps cover everything you need to know before visiting the 1000 Steps.

Kokoda Track Memorial Walk

The 1000 Steps Hike

As the name suggests, the trail consists of a series of steps, winding through lush fern gullies and tall eucalypt trees. However, there aren’t quite 1000 steps…I believe the number is closer to 800! You will feel like it’s 1000 though once you reach the top.

Beginning at the Ferntree Gully Picnic Ground, you’ll find a large information board detailing the history of the Kokoda Track and the significance of the memorial walk. From here, you’ll be guided by signposts to the base of the steps and the start of the hike.

The steps are made of a mixture of natural rock and concrete, and can be very slippery at times. Although there are handrails alongside the trail, I’d highly recommend wearing proper hiking boots or sturdy trainers. I’ve been on hot, sunny days and even then it’s pretty slippery at the top. They’re also narrow and can become quite crowded, particularly on weekends!

The hike involves some steep inclines, so pace yourself and take advantage of all the rest stops. Although it’s strenuous, it’s definitely doable for a range of fitness levels and there are plenty of resting points along the way. Don’t worry if you’re not the fittest as you can go slowly at your own pace. As you walk through native forest, you’ll likely encounter wildlife such as lyrebirds and colourful parrots.

Along the way, you’ll notice memorial plaques commemorating the soldiers who fought along the Kokoda Track. These plaques provide information about the hardships faced during the campaign, offering a poignant reminder of the memorial’s significance.

1000 steps dandenong

Once you’re nearing the very top, you’ll find a small lookout area offering views over the surrounding forest. There is no grand panoramic view from the summit, like you would find at Arthurs Seat. But it’s still a cool view and a sense of achievement after completing the climb!

The 1000 Steps trail is supposed to be one-way, with various alternate return trails for the way down. I chose the Lyrebird Track for my descent and highly recommend it! It had stairs and a gravel path, with beautiful views!! Luckily during my visits to the 1000 Steps, everyone has followed the one-way system. However, many of my friends have had experiences of other hikers using it as a two-way system. I imagine this would be a nightmare during busy times as the stairs are quite narrow and wouldn’t easily fit people going both up and down.

lyrebird track

How to Get to The 1000 Steps

The 1000 Steps are located in the Dandenong Ranges National Park, about 40km east of Melbourne.

By Car: From Melbourne, take the Burwood Highway (Route 26) towards the town of Upper Ferntree Gully. The entrance to the 1000 Steps is located just off the Mount Dandenong Tourist Road. Free parking is available at the Ferntree Gully Picnic Ground, which is a short walk from the start of the trail.

By Public Transport: There’s a direct train from Melbourne to Upper Ferntree Gully Station, via the Belgrave line. From there, it’s about a 15min walk along the Station Road Trail to the trailhead. I don’t have a car in Melbourne and found this way super easy!

Tips for Visiting the 1000 Steps

Arrive Early: The 1000 Steps is a popular destination, especially on weekends and public holidays. Arriving early will help you avoid crowds and find parking more easily.

Wear Appropriate Footwear: I strongly recommend wearing proper hiking shoes or good quality trainers. Despite me going on hot, sunny days, the trail was quite slippery at the top. There are handrails to help but I was glad to have good grips on my shoes. I’ve heard during periods of rain, the majority of the trail is slippery, so be safe with sturdy footwear.

Bring Water: There are water refills at top and bottom of the trail and at the picnic area. However you won’t be able to top up your water during the hike, so be sure to bring your own or use the refill stations at the bottom before you head up.

Take Your Time: The climb is quite steep, and while it may be tempting to push yourself, taking regular breaks will make the experience more enjoyable. There are many rest stops throughout the hike, where you can stand or sit, and take in the amazing surroundings.

Respect the Memorial: The trail has significant historical importance, so be mindful of other visitors and avoid loud behaviour.

FAQs

Is the 1000 Steps Hike Suitable for Children?

Yes, children can complete the hike, but younger ones may find the steps challenging. It’s important to supervise them closely, especially on the steeper sections. I would say if they’re quite young it might be worth giving it a miss though. A family behind me on the hike had two toddlers that they ended up carrying the whole way up! Consider bringing a carrier if that makes it easier taking young kids up.

How Long Does the Hike Take?

The average time to complete the 1000 Steps is around 1 to 1.5 hours, depending on fitness level and the number of breaks you take.

Is The Trail Wheelchair Accessible?

Unfortunately, the 1000 Steps is not wheelchair accessible.

Are Dogs Allowed on the Trail?

No, dogs are not permitted on the 1000 Steps, as it is part of the Dandenong Ranges National Park. Dogs are not allowed in most National Parks in Victoria.

What is The Best Time to Visit?

I recommend going early in the morning, when it’s quieter and the weather is cooler. That way you can finish early enough to enjoy some lunch at the local cafe, before heading off.

Other Hiking Routes Around the 1000 Steps

In addition to the iconic 1000 Steps, the Dandenong Ranges National Park offers several other hiking trails that cater to different fitness levels and interests. Below are some alternative routes that can be explored in the same area.

Lyrebird Track

The Lyrebird Track runs parallel to the 1000 Steps, offering a slightly longer and quieter alternative. This track is a wider gravel path, with stairs alongside most of the track. This makes it an easier option for those wanting to avoid the narrow and crowded 1000 Steps trail. The Lyrebird Track is approximately 3.2 kilometres in total and includes some steep sections. It’s also a great spot to observe native wildlife, particularly the superb lyrebird, after which the track is named.

You can do this track as a return trip. However, I’d recommend doing the 1000 Steps climb and using the Lyrebird track as your return journey back down.

Kokoda Track Memorial Walk Extension

For those looking to extend their hike, the Kokoda Track Memorial Walk continues beyond the summit of the 1000 Steps. This extension takes you further into the Dandenong Ranges, offering a peaceful and less crowded walk through lush forest. It provides a more immersive experience with opportunities to encounter more local flora and fauna. The extended walk is suitable for those with moderate fitness levels and can add an extra hour or so to your visit.

Living Bush Nature Walk

The Living Bush Nature Walk is a short, easy walk starting from the Ferntree Gully Picnic Ground. It’s just under 1 kilometre, making it ideal for families with young children or those looking for a more leisurely stroll. The trail meanders through the lower sections of the forest, with informative signs along the way about the local ecosystem and native plant species. It’s a peaceful alternative if you’re not up for the more strenuous trails.

One Tree Hill Track

The One Tree Hill Track starts near the top of the 1000 Steps and is a challenging hike, ascending towards the One Tree Hill lookout. This track is steeper than the 1000 Steps and is recommended for more experienced hikers. The total length is about 2.4 kilometres one way, and it offers more elevation gain, providing a tougher workout. There’s a picnic area at the summit and expansive views of the surrounding region.

Facilities at The 1000 Steps

Parking: There is free parking at the Ferntree Gully Picnic Ground. However, these fill up quickly during busy periods, like weekends, summer holidays etc. So be sure to get there early if you’re planning to park by the trails.

Toilets: There are several toilet facilities near the picnic ground, but none along the trail itself. So plan accordingly! I would advise bringing some hand sanitiser too…during my two recent visits, there was no hand soap in the ladies’ loo. Otherwise the facilities were good.

Picnic Areas: The Ferntree Gully Picnic Ground offers a number of picnic tables and barbecues, making it a great spot for post-hike food.

Cafe: There’s a great, little cafe near the Ferntree Gully Picnic Ground, offering hot meals (breakfast items like eggs to meals like fish and chips), wraps, cakes, coffees, drinks etc. I highly recommend the chicken schnitzel wrap! I loved coming here after spending a few hours on the various hiking routes and eating my lunch in the sun.

Visitor Centre: There is no official visitor centre at the trailhead, but the nearby Upper Ferntree Gully township has cafés, shops and restaurants.

Be sure to check the official site ahead of time for any planned park closures. If you enjoy this hike, I’d highly recommend a trip to the Blue Mountains for incredible trails, nature, Lyrebirds and views!

Related Blogs

day trip to the pinnacles

The Pinnacles: The Perfect Perth to Pinnacles Day Trip

A day trip from Perth to the Pinnacles is a great excursion if you’re visiting Western Australia! During my 8 …
lancelin sand dunes

Visiting the Lancelin Sand Dunes in Perth WA

The Lancelin Sand Dunes are 90 minutes north of Perth and is a must-do if you’re looking for a unique …

A Complete Guide to Hiking Mount Ainslie in Canberra

Mount Ainslie is a popular hiking destination in Canberra, offering panoramic views of the city and the surrounding area. Located …
things to do in healesville

Things to Do in Healesville

Located in the scenic Yarra Valley, Healesville is a charming town known for its vibrant arts scene, renowned wineries and …

A Day Trip to the Rainforest Gallery in Warburton

The Rainforest Gallery in Warburton offers an immersive journey into one of Victoria’s lush temperate rainforests. Just a short drive …
redwood forest melbourne

A Day Trip to the Redwood Forest Melbourne

Warburton is a charming town about 90 minutes east of Melbourne and home to a number of incredible nature spots! …

The post Spending a Day at The 1000 Steps in Dandenong appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/oceania/australia/1000-steps-dandenong-melbourne/feed/ 0