__( '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?.(); Travel in Asia | Asia Travel Guides | Char's Footsteps https://www.charsfootsteps.com/travel/asia/ Best Female Travel Blogs 2024 Thu, 07 Aug 2025 13:56:00 +0000 en-US hourly 1 Best Things to Do in Sentosa Island https://www.charsfootsteps.com/travel/asia/singapore/things-to-do-sentosa-island/?utm_source=rss&utm_medium=rss&utm_campaign=things-to-do-sentosa-island https://www.charsfootsteps.com/travel/asia/singapore/things-to-do-sentosa-island/#respond Wed, 11 Sep 2024 00:41:27 +0000 https://www.charsfootsteps.com/?p=3700 Sentosa is a popular island resort in Singapore and a great destination for those seeking a range of leisure activities. Located just off the southern coast of Singapore’s main island, Sentosa offers everything from pristine beaches and adventure parks to dining options and historical landmarks. Once a British military fortress known as Pulau Blakang Mati, […]

The post Best Things to Do in Sentosa Island appeared first on Char's Footsteps.

]]>
Sentosa is a popular island resort in Singapore and a great destination for those seeking a range of leisure activities. Located just off the southern coast of Singapore’s main island, Sentosa offers everything from pristine beaches and adventure parks to dining options and historical landmarks. Once a British military fortress known as Pulau Blakang Mati, Sentosa was transformed into a recreational hub in the 1970s. Today, it stands as one of Singapore’s most visited attractions and a great place to come with kids! I’ve always enjoyed coming here, but particularly enjoy cooling off from the heat at the beaches. Here is a list of things to do on Sentosa Island, during your trip to Singapore.

Things to Do on Sentosa Island

Sentosa Beaches

Sentosa is home to three man-made beaches, each offering a different experience for visitors. One of the things I love about Singapore is how quickly you can be in the city centre to lying on a beach! The easiest way to get to the beaches is to take the monorail to ‘Beach Station’ and get the free shuttle bus from there. Alternatively, you can walk from Beach Station to the beaches but it’s a fairly long walk in the heat, particularly to Tanjong Beach.

Siloso Beach: Known for its lively atmosphere, Siloso Beach is ideal for beach sports, bars, and restaurants. I love this beach for all the activities you can find, like beach volleyball, skydiving, water-jetpacking, kayaking etc. This sandy cove is also home to a few great eateries, like Siloso Beach Bar, and some sites, like Fort Siloso. I found this beach to be hit/miss in terms of how crowded it gets. Sometimes it’s been fairly empty and other times it’s been more packed.

Palawan Beach: Perfect for families, Palawan Beach is known for its shallow waters, playgrounds, and suspension bridge leading to a small offshore islet, which is considered the southernmost point of continental Asia. This is a great beach to enjoy the waters easily or to have picnics in the shaded areas. There’s also a 7/11 right on the beach if you need to get extra refreshments or beach gear!

Tanjong Beach: The most tranquil and quiet of the three, Tanjong Beach is great for a more relaxing day. It is the furthest beach to get to out of the three but great to set up for the day. Tanjong Beach is also home to the Tanjong Beach Club, which has great food, a swimming pool and different areas to rent (beach beds, pool beds etc). You won’t find activities here, like Siloso, so this is perfect for lying on the sandy beach with a book.

Tip: I recommend signing up for an Islander Membership if you visit Sentosa regularly. It’s free to sign up and unlocks loads of discounts, vouchers and deals. You can find out more information on this here.

Activities and Amusement Parks

If you’re looking for a little more adventure or something to do with kids, check out one of the many activities Sentosa has to offer. I recommend buying tickets online in-advance to avoid queues on the day. Sentosa gets pretty busy on weekends and holidays, so this will just save you time (and sometimes money!).

Universal Studios Singapore: One of the most popular attractions on the island, Universal Studios is a theme park offering a range of rides, shows, and attractions based on blockbuster films. It’s a must-visit for families and movie lovers.

Adventure Cove Waterpark: The Adventure Cove Waterpark is home to a number of water slides ,rides, a lazy river, and free-fall platform jumping. There’s also the opportunity to snorkel with tropical fish or enjoy one of their dolphin experiences! It’s a great place to cool off from the heat, without going to the beach. Find out more on their tickets and pricing here.

iFly Singapore: iFly offers the chance to experience skydiving in one of the world’s largest indoor wind tunnels. I haven’t yet braved this one but have heard great things about it! If you’re looking for a thrill-seeking experience, check out iFly.

Mega Adventure Park: Mega Adventure Park caters to a range of outdoor adventures. One of the key highlights is the 60km/h Zip-line that’ll take you 75m above ground and through Sentosa’s lush jungle canopy and coastline. Additionally, there’s a treetop adventure park, a 15m mega jump, a climbing wall and trampoline park. This is a great place to spend a few hours with kids! Check out their site for more information and to buy tickets online.

S.E.A. Aquarium: One of the largest aquariums in the world, the S.E.A Aquarium is home to over 100,000 marine animals from across 1,000 species. They currently have 12 species on sharks, including the endangered scalloped hammerhead shark, and a daily dive-feeding session! Check out their site for more information and to book tickets.

Madame Tussauds Singapore: A classic favourite, Madame Tussauds Singapore is home to the popular life-sized, wax figures of famous personalities from around the world.

Hikes and Trails

If you’re looking for prefer quieter, nature-focused activities, there are a number of walking trails and scenic areas to choose from. Be sure to pack enough water and sun protection for these. Although they’re fairly short trails, it’s best to be too prepared when dealing with Singapore’s heat and humidity.

Fort Siloso Skywalk

A walking trail that provides scenic views of the island while leading to Fort Siloso, a restored British-era fort offering a glimpse into Singapore’s military history.

Sentosa Nature Discovery

The Sentosa Nature Discovery is another great trail that’ll take you through stunning nature and greenery. What I like about this trail is the interactive exhibits you’ll come across along the way, educating on Sentosa’s biodiversity! There’s also a great lookout point you can stop at for pictures.

Imbiah Trail

The Imbiah Trail is a 2.3km hiking trail that takes you through lush forests. This peaceful and easy hike will take you around 35 minutes. Be sure to check out the waterfalls and Imbiah Bridge along the way. If you’re starting your trip from mainland Singapore, get the Sentosa Express straight to Imbiah Station. You’ll see maps and signs that will point you in the direction of the Imbiah Trail from there.

Where to Eat in Sentosa

Sentosa is home to a wide range of food options, located across the island, to suit all budgets! Here are some places i’ve enjoyed going to in the past;

  • Coastes: Close to Siloso Beach, Coastes is a chilled beach bar offering seafood, burgers and drinks with ocean views.
  • Tanjong Beach Club: Probably one of my favourites in Sentosa, Tanjong Beach Club is a chic dining spot popular for its Mediterranean-inspired menu and weekend brunches. They do great cocktails and good vibes!
  • FOC Sentosa: Close to Palawan Beach, FOC Sentosa is a stylish beach restaurant offering Spanish cuisine with beachfront views.
  • Quayside Isle: This dining hub located at Sentosa Cove Marina offers various international cuisines, ranging from Italian to Japanese. I love Quayside Isle for the wide range of options available and the beautiful waterfront views! It’s also a nice place to come in the evening, as the area is lit up and the outdoor seating area has fans to keep you cool.
  • Malaysian Food Street: Malaysian Street Food is a great hawker centre offering a range of dishes from curries to noodles. Prices here are a little more expensive than standard hawker centres, but that’s due to the proximity to the amusement parks and attractions. It is still a cheaper option than many other restaurants on the island.

Historical and Cultural Sites

Sentosa has a few notable historical sites and cultural experiences you can enjoy.

Fort Siloso

Fort Siloso is a preserved coastal fort that played a significant role during World War II. The on-site museums has a wide range of WW2 memorabilia to explore, including old bunkers, tunnels, coastal guns, cannons and exhibits that tell the story of Singapore’s military past. I found it to be larger than I expected and ended up spending about 2.5 hours here! Whilst here, consider doing the Fort Siloso Skywalk (as mentioned above). Check out the Sentosa site for more information on Fort Siloso.

Images of Singapore LIVE

The Images of Singapore is an interactive museum that provides an engaging overview of Singapore’s history through actors and exhibits. Here you can get insight into the country’s colonial past and path to independence. It has 15 interactive areas that showcase 200 years of extraordinary history. You’ll find the Images of Singapore LIVE located alongside Madame Tussauds.

How to Get to Sentosa

There are several ways to get to Sentosa from mainland Singapore.

Sentosa Express

You can catch the Sentosa Express monorail from VivoCity shopping mall to various stations on the island. For this option, take the train to HarbourFront station, the termini of the North East line and Circle line. Once at HarbourFront Station, follow signs for the Sentosa Express monorail line. This can be found on the 3rd floor of VivoCity and is a direct train to the island for a $4 roundtrip journey. Or, head to the first floor and walk along the Sentosa Boardwalk. This is probably the easiest ways to get to Sentosa!

Sentosa Boardwalk

This pedestrian walkway links VivoCity to Sentosa, providing an easy 15-minute walk onto the island. To access the boardwalk, head to the first floor of VivoCity shopping mall and follow signs to the boardwalk start. This area is covered so you’ll be protected from the sun or rain during the walk there.

Cable Car

For a scenic, and more adventurous route to Sentosa, take the cable car! Take the cable car from Faber Peak, Mount Faber to Sentosa and enjoy aerial views of the harbour and coastline. As someone who is scared of heights, I found the cable car terrifying, but it was a cool experience. Read the official site for more info. This could be a good option if you’re coming back from a hike at Faber Park or the Henderson Waves. You can take the cable car to Sentosa on a one-way trip or buy a return ticket.

Drive or Taxi

You can drive onto Sentosa via the Gateway Toll Plaza, which charges an entry fee per car. Or get a taxi, which will conveniently drop off or pick up anywhere on the island. There is a small surcharge on top of the metered fare. Both personal cars and taxis will be charged $2-6 SG dollars depending on time of day. Read this article for up-to-date Sentosa entrance fees and parking costs.

FAQs about Sentosa

When is the best time to visit?

You can visit the island all-year round, however, be mindful of the rainy season! Between November and January, you’ll likely experience bursts of rain. If you’re planning to do the beaches or trails then it might be worth planning your day around the weather. Or plan a few indoor activities for when it’s due to rain.

Are there any entrance fees to Sentosa?

Entrance fees apply when taking the monorail, cable car, or driving into Sentosa. The boardwalk offers free entry for pedestrians.

How long should I plan to spend on Sentosa?

To experience the main attractions, I’d recommend a full day, but you could easily spend two days. One for more of a beach day and another for the amusement parks.

Is Sentosa family-friendly?

Absolutely! This is probably one of the best places to go in Singapore with kids. You’ll be spoilt for choice with the number of attractions, beaches, theme parks, and educational trails.

Other great things to do in Singapore include visiting the Gardens by the Bay or one of the big hikes on the island.

Singapore Blogs

Best Things to Do in Sentosa Island

Sentosa is a popular island resort in Singapore and a great destination for those seeking a range of leisure activities …
hiking in singapore

Best Places to Hike in Singapore

Despite Singapore’s size, this urban jungle is home to a surprising number of nature trails and hikes! From leisurely walks …

Travelling from Singapore to Kuala Lumpur by Bus

After another amazing week in Singapore, it was time to head to Kuala Lumpur. I’m don’t like flying, and given …

A Guide to Gardens by the Bay in Singapore

Costing over SG$1billion to build, this impressive nature park spans across 101ha of reclaimed land in Central Singapore. The idea …

The post Best Things to Do in Sentosa Island appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/singapore/things-to-do-sentosa-island/feed/ 0
Ella, Sri Lanka: A Guide https://www.charsfootsteps.com/travel/asia/sri-lanka/ella-sri-lanka/?utm_source=rss&utm_medium=rss&utm_campaign=ella-sri-lanka https://www.charsfootsteps.com/travel/asia/sri-lanka/ella-sri-lanka/#respond Thu, 05 Sep 2024 03:51:36 +0000 https://www.charsfootsteps.com/?p=2879 Ella is a gem tucked away in the lush greenery of Sri Lanka‘s hill country. I got to spend 5 amazing nights in Ella and have written up the best things I did during my time. With its beautiful landscapes, rich history and lively atmosphere, Ella offers a plethora of experiences for everyone. Getting the […]

The post Ella, Sri Lanka: A Guide appeared first on Char's Footsteps.

]]>
Ella is a gem tucked away in the lush greenery of Sri Lanka‘s hill country. I got to spend 5 amazing nights in Ella and have written up the best things I did during my time. With its beautiful landscapes, rich history and lively atmosphere, Ella offers a plethora of experiences for everyone.

Getting the Train to Ella

Reaching Ella is an experience in itself, with the scenic train journey from Kandy often regarded as one of the most beautiful in the world. Winding through lush tea plantations, misty mountains and quaint villages, the journey offers breathtaking views at every turn. This iconic train ride is not just a mode of transport, but also a highlight of any trip to Sri Lanka. It does take a while (7 hours on average!!) but it’s absolutely worth it!

Hike to Ella Rock

Ella Rock is an iconic landmark that offers panoramic views of the surrounding valleys and tea plantations. Without doubt, hiking Ella Rock was my favourite thing to do in Ella. So much so, that I did it twice! The hike begins near the Ella Railway Station and takes approximately 2-3 hours to reach the summit. It’s not the most obvious trail route, so if like me you have no sense of direction, I’d go with people. I became close with some girls from my hostel, and even as a group, we got a bit lost at times.

hiking in ella sri lanka

During the hike, you’ll encounter lush forests, cascading waterfalls, and friendly locals who are always ready to offer a helping hand. Trust me, the breathtaking view from the top is well worth the effort. Both times I went, there were a group of people at the top selling cold drinks and snacks. We bought some refreshments and enjoyed the view at the top for a while.

Visit the Nine Arch Bridge

No trip to Ella is complete without marvelling at the Nine Arch Bridge. To note, it can get very crowded with tourists, so go early! We met organised people who had worked out exactly what time the train would be coming through. However, we just bought some snacks and chatted whilst waiting for the trains.

nine arch bridge sri lanka

We walked over the bridge to get pictures from both sides and get a better view into the valley below. The photos honestly don’t do it justice and it was such a nice place to just hang out regardless of the trains.

There were some ladies selling mangos and coconuts on one side too which were so fresh!

Try Ceylon Tea

Sri Lanka is renowned for its tea, and Ella is no exception. I went on a Tea Tasting Experience in Ella at one of the local plantations and got to learn about the art of tea cultivation and production. We got to try a variety of flavours, ranging from strong black teas to light green teas. The green surroundings here were stunning too! I booked my tea tour through my hostel, but through researching, I believe it’s the Halpewatte Tea Factory Tour.

Sri Lanka tea plantation

If you’re getting the Kandy to Ella train, you’ll spend hours travelling through the tea plantations and be treated to incredible smells!!

Explore the Ravana Falls

There are hundreds of waterfalls in Ella and its surrounding area. I went with some new friends to visit the Ravana Falls, one of Ella’s most iconic waterfalls. Located just a short tuk-tuk ride away from the town centre, you will be treated to breathtaking 25m waterfalls. Some people were swimming in the base of the falls, but we just sat on the nearby rocks and enjoyed the atmosphere. As with many places in Ella, it was quite crowded here. I expect if you go early in the morning, you could have a quieter experience.

Little Adam’s Peak

Another brilliant hike to do in Ella is Little Adam’s Peak. This is much less strenuous than Ella Rock but still provides rewarding views. A relatively easy trek from the town centre, this miniature peak offers sweeping vistas of Ella’s lush landscapes and distant mountain ranges. We took some food with us and enjoyed a small lunch at the end of the route. Alternatively, you can here for a while and wait for the epic sunsets over the valley below.

All The Food!!

No visit to Ella would be complete without indulging in the all the mouthwatering flavours of Sri Lankan cuisine. From fragrant curries to spicy sambols, Ella has some great places to try particularly all the roti!

For an even better taste of the Sri Lankan food, visit the Ella Spice Garden! Here you can take cooking classes and learn how to make authentic, tasty Sri Lankan dishes. They also provide guided tours of their gardens where you can learn about how they use a variety of spices for cooking and medicinal properties. The big ones being cinnamon, cardamom and cloves! We also got to sample a few freshly brewed spice tea. The whole experience definitely exceeded my expectations and i’d highly recommend visiting if you’re a foodie.

Watch the Sunset at Ella Gap

Spend one of your evenings watching the sunset over Ella Gap. This gap in the mountain range offers incredible views of the valley below. In the evenings, At sunset, you’ll find groups of people gathered together to marvel over the colourful skies. You’ll be able to get here from Little Adam’s Peak, so if you’re short on time, do the hike in the afternoon and wait for sunset.

Bicycle Around Ella Village

One of my biggest regrets was not renting a bike or doing a cycling tour around Ella. On my last day, I met people who raved about cycling tours that went past emerald green fields, quaint cottages, local markets and eateries. I wasn’t aware this was something on offer, but I’d do it if I go back to Ella.

After my incredible trip in Ella, I caught a shuttle bus down to Mirissa for the next part of my trip in Sri Lanka. Read more on my favourite beaches in Sri Lanka, visiting Galle and why Sigiriya is a must-do!

Sri Lanka Blog Posts

hiking ella rock

Ella, Sri Lanka: A Guide

Ella is a gem tucked away in the lush greenery of Sri Lanka’s hill country. I got to spend 5 …
nine arch bridge sri lanka

Ultimate Guide for Travel in Sri Lanka

Sri Lanka is an incredible island country located in the Indian Ocean, just south of India. I spent three glorious …
best beaches in sri lanka

Best Beaches in Sri Lanka

When it comes to beaches, Sri Lanka has it all. From scuba diving to whale watching, surfing to sunbathing, there’s …
Galle

The 8 Best Things to Do in Galle, Sri Lanka

When people think about Galle, they usually imagine the infamous Lighthouse and nothing else. I nearly avoided the add journey …
sigiriya lions rock

Everything You Need To Know About Climbing Sigiriya

Sigiriya, or Lion Rock, is an ancient rock fortress located in the central plains of Sri Lanka. As one of …
kandy to ella train

The Kandy to Ella Train: The Ultimate Sri Lanka Experience

The Kandy to Ella train is one of the most scenic train rides in Sri Lanka and provides for a …

The post Ella, Sri Lanka: A Guide appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/sri-lanka/ella-sri-lanka/feed/ 0
Best Places to Hike in Singapore https://www.charsfootsteps.com/travel/asia/singapore/hiking-in-singapore/?utm_source=rss&utm_medium=rss&utm_campaign=hiking-in-singapore https://www.charsfootsteps.com/travel/asia/singapore/hiking-in-singapore/#respond Wed, 04 Sep 2024 10:01:59 +0000 https://www.charsfootsteps.com/?p=3642 Despite Singapore’s size, this urban jungle is home to a surprising number of nature trails and hikes! From leisurely walks to more challenging treks, these trails provide a chance to experience the city-state’s greenery and wildlife. After being based there for four months, these were some of my favourite hikes in Singapore, suitable for all […]

The post Best Places to Hike in Singapore appeared first on Char's Footsteps.

]]>
Despite Singapore’s size, this urban jungle is home to a surprising number of nature trails and hikes! From leisurely walks to more challenging treks, these trails provide a chance to experience the city-state’s greenery and wildlife. After being based there for four months, these were some of my favourite hikes in Singapore, suitable for all levels and fitness!

Easy Hikes

MacRitchie Reservoir Park (TreeTop Walk Loop)

The MacRitchie TreeTop Walk is one of Singapore’s most popular walks due to its 250m-long freestanding suspension bridge and forest canopy views. The trail is mostly flat, with a few gentle inclines, making it a great choice for beginners. Read more on the Treetop Walk Trails here.

Distance: 7km (round tip); approx 2-3 hours

Bukit Batok Nature Park

Bukit Batok Nature Park offers a peaceful walk with well-maintained paths, gentle slopes, and scenic views of an old quarry. You’ll be treated to a variety of fruit trees, wildlife and clear, calm waters. It’s an excellent spot for a short, relaxing walk. Be sure to head to the centre of the park for the Bukit Batok Nature Park Lookout Point, where you’ll be treated to great views of the abandoned quarry! Check out the Bukit Batok Nature Park site for more information.

Distance: 1.7 km (loop), approx 1 hour

Photo taken from myheart.org

Pasir Ris Mangrove Boardwalk

Pasir Ris Mangrove Boardwalk is an easy boardwalk trail that’ll take you through a 6-hectare mangrove forest!! This short walk is is perfect for an easy stroll and you’ll be treated to a variety of bird species and other wildlife. The boardwalk trail is located within Pasir Ris park, which is home to Singapore’s largest playground, a maze garden and a ‘kitchen’ (herb) garden. There’s plenty to see outside of the mangrove area and you can easily access park from Pasir Ris MRT station.

Distance: 1.5 km (loop), approx 45 mins – 1 hour

The Southern Ridges

The Southern Ridges (probably one of my favourites hikes in Singapore) is a series of trails that connected several parks and gardens. The full area covers Kent Ridge Park, Labrador Nature Reserve, Telok Blangah Hill Park and Mount Faber Park. You’ll be treated to everything from elevated walkways, dense forest bits and panoramic views of the city! The majority of the walk is flat, but there are a few section with stairs. As the trail is fairly long, I’d recommend going early in the morning so you’re not out in peak heat and humidity.

Distance: 10 km (one-way), 3-4 hours

Moderate Hikes

Labrador Nature Reserve

The Labrador Nature Reserve (or Labrador Park) is a great mix of historical sites and natural beauty. Home to a number of historical relics and artefacts, many dating back to WW2, make this park a must-do for any history buffs. The trails itself showcase thriving plant and animal life whilst providing panoramic views of the sea! You’ll find more than 70 kinds of bird species within the park too, so i’d recommend this one for bird watchers.

Distance: 2.1 km (loop), approx 1.5 – 2 hours

Coney Island Hike

Coney Island (also known as Pulau Serangoon) offers a rustic, less manicured environment with sandy paths and dense vegetation. Although the trails are predominately flat, it can be a tiring walk due to the sandy terrain.

Distance: 2.4 km (one-way), approx. 2 hours

Bukit Timah Nature Reserve

Bukit Timah Nature Reserve is home to Singapore’s highest natural point at at 163.63m. There are four main trails to choose from, that begin at the Visitor Centre, and range in terrain and difficulty. What makes this reserve so special is the rich biodiversity of the rainforest. According to Singapore’s National Library Board, one-hectare of land in the Bukit Timah Nature Reserve contains more tree species than the whole of North America! With over 1,000 species of flowering plants and over 500 species of wildlife, Bukit Timah Nature Reserve is really worth doing!

Distance: 4 km (loop), approx. 1.5 to 2 hours

Pulau Ubin (Puaka Hill Trail)

This trail on Pulau Ubin offers a moderate hike with a short, steep climb to Puaka Hill, where you can enjoy views of the quarry below. The climb is only about 10-15 minutes and you’ll be treated to stunning views over the quarry. The more challenging aspect to this is actually getting to Pulau Ubin. You’ll need to catch a 10 minute boat ride from Changi Ferry Point Terminal. Therefore, if you decide to do this trail, I’d recommend doing a full day trip to Pulau Ubin to make the most of everything there.

Distance: 1.6 km (loop), 1 hour

More Challenging Hikes

MacRitchie Reservoir Park (12 km Loop)

This extended loop around the MacRitchie Reservoir is a more challenging option, with undulating terrain and longer distance. It’s ideal for those looking for a longer hike with scenic views. I love this loop for it’s diversity; containing everything from boardwalks to woodland trails, enclosed areas and sections that take you along the water. Definitely one of my favourite hikes in Singapore, so i’d urge anyone with the time to give this one a go.

The MacRitchie Reservoir Park is part of a much wider Central Catchment Nature Reserve with 20km of trails and boardwalks to choose from. This area is popular so you’ll likely bump into a few other walkers and runners along the way. Always be careful of the monkeys, particularly on the golf course you pass through!!

Distance: 12 km (loop), approx. 4 hours

Mount Faber and Henderson Waves

This trail involves a steady climb up Mount Faber, followed by a walk along the Henderson Waves bridge. This is the highest pedestrian bridge in Singapore at 118ft in height and 900ft in length! The unique wave-like structure is worth visiting, and Mount Faber offers a scenic path directly to it! You can also tag this along with the Southern Ridges walk (featured above) to make it an even longer hike. This is a great hike to do if you’re looking to head to Sentosa too, as the cable car connects the island from Mount Faber!

Distance: 3.5 km (one-way), approx. 2 hours

Chestnut Nature Park (Northern and Southern Loops)

Chestnut Nature Park offers trails with varying levels of difficulty, including rugged sections with steep climbs. There are two main loops, the Northern Loop (the more challenging one) and the Southern Loop. Chestnut Nature Park is also a favourite with mountain-bikers, with cycling trails taking you through scenic woodlands.

Distance: 5.6 km (combined), approx. 2-3 hours

Other Parks To Consider in Singapore

Other great areas to enjoy nature in Singapore include the Botanic Gardens, Fort Canning Park, East Coast Park, Bishan-Ang Mo Kio Park and Gardens by the Bay!

Singapore Blogs

Best Things to Do in Sentosa Island

Sentosa is a popular island resort in Singapore and a great destination for those seeking a range of leisure activities …
hiking in singapore

Best Places to Hike in Singapore

Despite Singapore’s size, this urban jungle is home to a surprising number of nature trails and hikes! From leisurely walks …

Travelling from Singapore to Kuala Lumpur by Bus

After another amazing week in Singapore, it was time to head to Kuala Lumpur. I’m don’t like flying, and given …

A Guide to Gardens by the Bay in Singapore

Costing over SG$1billion to build, this impressive nature park spans across 101ha of reclaimed land in Central Singapore. The idea …

The post Best Places to Hike in Singapore appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/singapore/hiking-in-singapore/feed/ 0
Ultimate Guide for Travel in Sri Lanka https://www.charsfootsteps.com/travel/asia/sri-lanka/sri-lanka-itinerary/?utm_source=rss&utm_medium=rss&utm_campaign=sri-lanka-itinerary https://www.charsfootsteps.com/travel/asia/sri-lanka/sri-lanka-itinerary/#respond Tue, 03 Sep 2024 03:23:53 +0000 https://www.charsfootsteps.com/?p=65 Sri Lanka is an incredible island country located in the Indian Ocean, just south of India. I spent three glorious weeks travelling around this beautiful country as a solo backpacker and loved every minute. Here is a guide to some of the best places to visit in Sri Lanka, whilst reassuring how easy it was […]

The post Ultimate Guide for Travel in Sri Lanka appeared first on Char's Footsteps.

]]>
Sri Lanka is an incredible island country located in the Indian Ocean, just south of India. I spent three glorious weeks travelling around this beautiful country as a solo backpacker and loved every minute. Here is a guide to some of the best places to visit in Sri Lanka, whilst reassuring how easy it was travelling solo. So, from the ancient ruins in the north, to sandy beaches in the south, here are the best places to go in Sri Lanka!

Sri Lanka Itinerary

There is so much to do in Sri Lanka and I loved how varied each place is! This is a suggested itinerary based on my 3-week trip. I wanted a mix of historical sites, hikes, beaches, nights-out, cities and chill time:

  • Dambulla – 4 nights (I arrived very late on night one)
  • Kandy – 1 night
  • Ella – 5 nights
  • Mirissa – 4 nights
  • Weligama – 1 night
  • Unawatuna – 4 nights
  • Galle (day trip from Unawatuna)
  • Colombo – 1 night

Best Places to Go in Sri Lanka

For a small country, there are so many incredible places to visit whilst spending time in Sri Lanka. I wanted a mix of cultural sites, nature, beaches and cities so picked my route accordingly. Landing in the international airport, Colombo Bandaranaike, I started my three weeks in Sri Lanka by heading straight to Dambulla.

Dambulla

Dambulla, a small town tucked away in the Central Province of Sri Lanka, provided an excellent base to explore the cultural north. The main attraction within Dambulla itself is the World Heritage Site The Golden Temple of Dambulla. These are the largest and best preserved cave temples in Sri Lanka and definitely worth a visit.

By staying in Dambulla, I was able to easily do day excursions to Sigiriya, Polonnaruwa and Anuradhapura. The main bus station in Dambulla has a number of options to get to each place cheaply. However, for these journeys I shared a private taxi with two guys I met in my hotel. This worked out to be approximately £110 in total for 3 days worth of taxis.

This option worked out well for us! We saved time getting between each place and our lovely driver made for an excellent guide, providing us with lots of interesting information for each area.

Polonnaruwa, located in Sri Lanka’s North Central Province, is an ancient city that served as the island’s capital during the 11th and 12th centuries. It is renowned for its well-preserved ruins, including royal palaces, temples, and massive statues of Buddha, such as the Gal Vihara. Polonnaruwa archaeological park, a UNESCO World Heritage Site, offers an interesting glimpse into Sri Lanka’s rich history. We rented bicycles to make exploring Polonnaruwa easier!

Anuradhapura is one of the island’s ancient capitals, also renowned for its well-preserved ruins and religious significance. This UNESCO World Heritage Site features impressive stupas, monasteries, and the sacred Bodhi tree, believed to be the world’s oldest living tree planted by humans. As a major centre of Buddhism, Anuradhapura offers insight into Sri Lanka’s early civilisation and spiritual heritage, with its vast archaeological complex spread over several square kilometres. Like Polonnaruwa, you can rent bikes to explore the area. Or even tuktuks!

Sigiriya / Lion Rock

Sigiriya, also known as Lion Rock, is an ancient rock fortress known for its well-preserved gardens and incredible views from the summit. I’ve written a detailed post regarding Sigiriya and my experience climbing Lion Rock here. If you’re limited for time in the North of Sri Lanka, I would personally recommend Sigiriya and Polonnaruwa as must-dos!

sigiriya lions rock

I am extremely scared of heights so getting to the top of Sigiriya was quite a feat! But the whole experience going up and seeing the views from the summit were absolutely worth it. Just don’t make the same mistake as me and go on a Sri Lankan public holiday – as you’ll see from the queues going up, it was packed!

Sigiriya Lion Staircase

After 4 nights in Dambulla, it was time to head down the country. Dambulla has numerous bus routes, which made it easy to travel to my next stop, Kandy. The journey took roughly 2.5 hours in a public bus and was very cheap! For a look into bus routes from Dambulla, check out this post. I relied on this site a lot for bus information. However my hotel were really helpful and flagged the bus for me to jump on, saving me walking a mile to the bus station.

Kandy

Kandy is one of the largest cities in the country and a great place to marvel in some of Sri Lanka’s rich heritage. Some of the best things to do in Kandy include watching a traditional dance show and visiting the UNESCO world heritage site The Temple of the Tooth Relic. Both of these are possible to do late afternoon and in the evening. I spent the day exploring Kandy, sitting by the Lake during the day and enjoying some sites in the evening. I found one night in Kandy to be enough time to everything I wanted.

One of my favourite things to do in Sri Lanka was catch the infamous Kandy to Ella Train. Although it was a long journey – 7 hours – the views were incredible and it was such a unique experience to travel through the country sitting in an open train doorway. I would definitely recommend catching an early train so you’re not spending the bulk of your day travelling.

kandy to ella train

Ella

Ella is nestled in Sri Lanka’s Hill Country and is famous for its lush tea plantations, scenic hikes and waterfalls. I LOVED Ella and extended my original stay to 5 nights. I found there was so much to do in Ella and it was easy to meet other backpackers, making excursions and evenings very fun.

ella sri lanka

The best things to do in Ella were trekking to Ella Rock, climbing Little Adam rock, admiring the waterfalls, visiting Nine Arch Bridge and trying the famous Ceylon Tea. Ella had lots of cute bars, cafes and shops. I also enjoyed a few self-care pamper sessions like massages.

After an incredible stay in Ella, I made my way down to the beaches, with my first stop at Mirissa.

Mirissa

Mirissa, a coastal town in southern Sri Lanka, is renowned for its stunning beaches and vibrant marine life. One of the main things to do here are the whale watching tours, where you see blue whales, dolphins, and other marine species.

best beaches in sri lanka

I had heard negative reviews on how the whales were treated on the tours, so I decided to skip this. Instead I enjoyed Mirissa Beach for its swimming and snorkelling. For those interested in surfing, this is a good beach for it, but there are other more noteworthy surfing beaches – like Weligama. I also went to the famous Coconut Tree Hill to enjoy the scenic viewpoint and to take pictures.

Additionally, Mirissa has a lively nightlife with beachside bars and restaurants serving fresh seafood. As a solobackpacker, I found Mirissa was a great place to meet other people. We were out most nights at beach parties and I found it to be a very lively area, with lots going on.

Mirissa is about 150km South of Colombo and easily accessible by train, bus or car. I took a shuttle from Ella to Mirissa, which was long but a very cheap option.

Weligama

Weligama is primarily known for its surfing – being a great place for beginners and seasoned surfers alike. Although I did enjoy my surf lesson here, I found the beach here to not be very nice compared to Mirissa and Unawatuna. The beach had a few sun bed areas in one section but these were expensive to rent. There were a few small vans selling juices and snacks by the beach, which were enjoyed after tiring work trying to learn to surf. I stayed for one night in Weligama, but in hindsight, would have preferred to just do a day trip to Weligama for the surf lesson.

However, in recent years, Weligama has become quite a hub for digital nomads. Therefore the beach might be quite different now compared to when I went in 2019. This area could be a great place to base yourself if you’re looking for a more long-term option, in terms of accommodation and meeting other long-term stayers.

Related: Best Beaches in Sri Lanka Guide

Unawatuna

30km west of Mirissa is another coastal town worth checking out, Unawatuna. Unawatuna is home to a huge beach; famous for its clear waters, diving, swimming and snorkelling. The main street here is lined with many cafes, restaurants and shops, making it a great place to base yourself for a few days. I stayed here for 4 nights, choosing to chill in Unawatuna and spend some time exploring surrounding areas. I had a day trip to the nearby Hikkaduwa Beach to see turtles and had another day trip to Galle.

The area is also home to the Japanese Peace Pagoda, offering panoramic views of the coastline. Another beach worth checking out in the area is Jungle Beach. It’s much quieter and perfect for a relaxed day by the sea.

Like Mirissa, Unawatuna had great nightlife, with beachfront restaurants and beach bars. As a solo backpacker, I was able to meet people easily in both beaches and had really fun nights out each evening!

Galle

I had no expectations for Galle, but it turned out to be one of my favourite places in Sri Lanka. Galle can easily be done as a day trip from Unawatuna or you could choose to stay there for a night. As I was based in Unawatuna for 4 nights, I chose to visit Galle for the day. It was really easy, and cheap, to get the local bus from Unawatuna straight to Galle, but you could get a train, tuktuk or taxi.

Galle

The best thing to do in Galle is head to the Old Town, walk around the Historic Fort and see the famous Lighthouse. You can easily spend several hours walking around this UNESCO World Heritage Site, and learn more about the old fortified harbour town’s mix of colonial and local traditions.

I also loved walking through the streets of the Old Town, browsing through the boutiques, shops, art galleries and stopping for food in one of the many cafes. I would recommend staying into the evening so you can watch the sunset from the Lighthouse Beach! I’ve written a more detailed post on my time in Galle.

Colombo

Colombo, the capital (and largest city) of Sri Lanka, offers a mix of cultural, historical, and modern attractions. After an incredible three weeks in Sri Lanka, it was time to head home. I took the train from Unawatuna to Colombo for 24 hours in the city before my flight to London.

unawatuna train station

The main things I did during my time in Colombo were; visiting the National Museum – home to artefacts from Sri Lanka’s history. I walked along the Galle Face Green which is a popular seaside promenade – it was bustling with people! In the morning I visited the Jami Ul-Alfar Mosque, one of the oldest mosques in Colombo. Although it was interesting to see, there were MANY scammers in the area trying to make me get into tuk-tuks to another mosque. Nearby is the famous Pettah Market which I’d be recommended by other travellers for some shopping. I would say it was fairly overwhelming given how busy it was and all the shouting to look into stalls/shops. But it was interesting to see.

I only stayed for one night but it seemed like there was good nightlife, with numerous restaurants and bars scattered across the city. Cinnamon Gardens and Fort were the areas recommended to me for nightlife.

Other things I had on my list, but didn’t have time to see were the Gangaramaya Temple (for insight into the country’s Buddhist heritage) and the Old Dutch Hospital – a shopping/dining area that shows the colonial history. Although I enjoyed exploring Colombo, I would say you don’t need very long here. I used it as a base before flying home, so spent a night and two days there.

Weather in Sri Lanka

Like many Asian countries, Sri Lanka’s peak season is between December and mid-April. However different parts of the island are hit by monsoons at times of the year. It’s important to keep this in mind if you’re going for the beaches or hikes.

  • South-West – Monsoon Season: May – Sept, Dry Season: Dec – March
  • North, East Coast – Monsoon Season: Oct-Jan, Dry Season: May-Sept
  • Whole Island – Inter-monsoonal: October – November

For a detailed look into weather in Sri Lanka, check out this site.

Getting to Sri Lanka

Bandaranaike International Airport (BIA) is the main international airport serving Sri Lanka, so it’s likely you’ll be starting your journey here. Many people choose to stay in Colombo (the capital) or Negombo when they first arrive. Both are easy to get to from the airport and are a good place to relax in after long flights.

BIA has a number of bus routes if you’re wanting to save money and immerse yourself into public transport immediately. However, I was travelling solo and landed late in the evening, so opted for a private taxi. It was easy to get one from the airport and only cost £34 for a 4 hour drive to my first stop, Dambulla.

Other Places to See in Sri Lanka

There were many places I didn’t have time to see in Sri Lanka. Here are a few I’d visit if I got the chance to go back:

Jaffna

Jaffna is the capital city of the Northern Province of Sri Lanka and is home to the countries’ vibrant Tamil culture. Visit ancient temples, stroll along pristine beaches and immerse yourself in a side of Sri Lanka that is largely untouched by backpackers.

National Parks of Sri Lanka

There are a number of national parks throughout the country to choose from;

  • Udawalawe National Park – huge nature reserve most famous for its elephants. Although you’ll also see wild buffalos, sambars, spotted deer and more.
  • Yala National Park – a wildlife sanctuary known for its conservation of elephants, leopards and aquatic birds.
  • Sinharaja Forest Reserve – a reserve protecting the last viable remnants of tropical rainforest in Sri Lanka. Home to 139 endemic plant species, two types of forest, insects, birds, reptiles and amphibians.
  • Bundala National Park – famous for migrating water birds; home to 197 species of birds, lagoons and waterways.
  • Wilpattu National Park – the largest and oldest national park in Sri Lanka and known for its leopard population.

Adam’s Peake

Adam’s Peak (Sri Pada) is a prominent pilgrimage site in Sri Lanka. Located in the central highlands, it stands at 2,243 metres and is revered by multiple religious communities. To reach Adam’s Peak, it’s best to start from Hatton (135km SW of Colombo), which is accessible by train or bus from Colombo. From Hatton, a further journey by bus or taxi will take you to the trailhead at Dalhousie, the most common starting point for the ascent.

Adam’s Peake is a challenging 5,000 step climb that typically takes 3-5 hours. From what I heard from other travellers, it’s a fairly well-maintained path with lots of tea shops along the way for refreshments. The climb is often done at night to reach the summit in time for sunrise, which offers stunning views of the surrounding landscape. I imagine this also makes it easier given how hot Sri Lanka can get during the day. At the peak, there is a footprint-shaped rock formation, which is considered sacred. Pilgrims and visitors alike appreciate both the spiritual significance and the natural beauty of the site.

Nuwara Eliya

Nuwara Eliya is located in the Central Highlands at 1,868m and is known for its cool climate and colonial charm. It’s about 170km east of Colombo and can be reached by train or bus – I definitely recommend taking the Kandy to Nuwara Eliya train as the route is unbelievably stunning! (it’s the same train route as Kandy to Ella). The area is popular for its tea plantations and nearby Horton Plains National Park, with a highlight being the World’s End Trek. The World’s End Trek is a 9km hike offers views of grasslands, forests, and a dramatic cliff drop. Nuwara Eliya also offers other activities like golfing, boating on Gregory Lake, and exploring local gardens. I met a lot of people heading that way so I imagine there’s a good community of travellers around there.

Sri Lanka Guides

hiking ella rock

Ella, Sri Lanka: A Guide

Ella is a gem tucked away in the lush greenery of Sri Lanka’s hill country. I got to spend 5 …
nine arch bridge sri lanka

Ultimate Guide for Travel in Sri Lanka

Sri Lanka is an incredible island country located in the Indian Ocean, just south of India. I spent three glorious …
best beaches in sri lanka

Best Beaches in Sri Lanka

When it comes to beaches, Sri Lanka has it all. From scuba diving to whale watching, surfing to sunbathing, there’s …
Galle

The 8 Best Things to Do in Galle, Sri Lanka

When people think about Galle, they usually imagine the infamous Lighthouse and nothing else. I nearly avoided the add journey …
sigiriya lions rock

Everything You Need To Know About Climbing Sigiriya

Sigiriya, or Lion Rock, is an ancient rock fortress located in the central plains of Sri Lanka. As one of …
kandy to ella train

The Kandy to Ella Train: The Ultimate Sri Lanka Experience

The Kandy to Ella train is one of the most scenic train rides in Sri Lanka and provides for a …

The post Ultimate Guide for Travel in Sri Lanka appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/sri-lanka/sri-lanka-itinerary/feed/ 0
Kuala Lumpur To Singapore by Bus – An Eventful Experience! https://www.charsfootsteps.com/travel/asia/malaysia/kuala-lumpur-to-singapore/?utm_source=rss&utm_medium=rss&utm_campaign=kuala-lumpur-to-singapore https://www.charsfootsteps.com/travel/asia/malaysia/kuala-lumpur-to-singapore/#respond Sun, 18 Aug 2024 07:38:06 +0000 https://www.charsfootsteps.com/?p=3084 After an incredible three months based in Kuala Lumpur, and exploring Malaysia, it was time to head back to Singapore. I had a great experience getting the bus from Singapore to Kuala Lumpur, so I decided to save the airfare and do the same journey back. I, however, ended up having one of the worst […]

The post Kuala Lumpur To Singapore by Bus – An Eventful Experience! appeared first on Char's Footsteps.

]]>
After an incredible three months based in Kuala Lumpur, and exploring Malaysia, it was time to head back to Singapore. I had a great experience getting the bus from Singapore to Kuala Lumpur, so I decided to save the airfare and do the same journey back. I, however, ended up having one of the worst travel experiences of my life and wanted to warn people of the BillionStars bus company. In short, DO NOT USE THIS COMPANY. In full, read on.

Terminal Bersepadu Selatan Station (TBS)

I decided to depart from TBS station, as I thought it’d be easier than choosing Berjaya Times Square bus station, where you wait for buses on the roadside. After getting a Grab and leaving early, 10:55am, I arrived at TBS. I queued for 15 mins for the ticket with the exact 55 RM cash for a ticket, only to discover there was a service fee of 55cent which I didn’t have. The ticket counters and machines only take cash. So I ended up buying the ticket online. Huge waste of time. 

Quickly went to the bathroom and grabbed some snacks before heading to Gate 18. The bus was due at 11:45 so I had plenty of time to wait at the gate. And wait I did, as the bus didn’t arrive until 1pm!!! No updates from the staff or any idea as to how long we’d be waiting, so it was an incredibly frustrating experience for everyone at the gate. The bus eventually arrived, we scanned tickets and put our suitcases under the bus. 

Departing From TBS Station

Eventually at 1:10pm we departed TBS. After explicitly being told this was a direct bus to Singapore, with no drop offs or pick ups, we were shocked to arrive at Berjaya Times Square at 1:30pm. We were now literally 5 mins from where my accommodation was…so I had moved a matter of miles in the space of 3hrs 15 mins. We were all quite confused why we had stopped here. I was glad this wasn’t my original stop, as it was road side pick up and chaotic. I would have been even more stressed waiting for a delayed bus here compared to the actual train station.

After changing drivers, we departed Berjaya Times Square at 1:41pm. By 1:57pm, we depressingly passed TBS again…nearly 4 hours after leaving my accommodation. I had expected to be half way through Malaysia by this point. 

First Bathroom Break

We made our first bathroom stop at 14:33 at a petrol station. We were told we only had 10 minutes here to use the toilets and get snacks. With just one toilet, the queue was extremely long for the women’s bathroom. I was worried about being left behind so I decided to hold on and hope we would stop again. The petrol station shop only supplied junk food so I skipped that as well.

I’m glad I decided to skip the bathroom as the driver didn’t do a head count! He just got back on the bus and drove off. We were on our way at 14:42pm. For the next hour we crawled through traffic, passing the Malacca turnoff at 4:30pm. 

Second Bathroom Break

At 5:50pm we had our second bathroom stop. Luckily this stop had lots of toilets and street food options. I raced to the bathroom, grabbed a few cold drinks and some curry puffs (I became obsessed with these during my trip!). We left 10 mins later. I got chatting to a few of my bus mates and everyone was quite shocked how disorganised the journey seemed to be. This included a guy who makes the journey between Kuala Lumpur and Singapore every month.

Third Bathroom Break

After a few hours of driving, we stopped at another petrol station at 8pm. Everyone seemed very frustrated with how long the journey was taking. I was exhausted, dreading all the border crossings and navigating Singapore to my accommodation. I was also stressing about my accommodation check in…I had said 7pm arrival. Without phone data, I couldn’t alert the hotel I’d be so late and hoped I could check-in ok. We departed at 8:20pm. 

At 8:30 we did our first drop off, with people getting out somewhere random near Johor Bahru. Again, this was very frustrating as I’d been told it was a direct journey with no drop offs. We did a second drop off at Lakin bus station at 8:55pm.

We spent the next 15 mins faffing around here – the bus was only allowed 5 minute parking slots. So the driver kept reversing and re-parking to restart the parking countdown. 

At 9:10pm the driver announced we’d be changing bus and to wait by the road. We all got out and waited whilst the driver took photos of us and asked other drivers if they had space. Very bizarre. By 9:20 another driver announced he had an empty bus, so the 6 of us followed and boarded. I had so many bags so it was difficult being moved around a lot. We drove for 10 minutes to another petrol station before being told to get out and into another bus – 9:30pm!!!

We sat here for 15 mins whilst the driver walked off, leaving the door open and strong petrol fumes coming inside – we all had headaches and were done with this experience. No one explained what was happening, how long we’d be waiting for or if we had to change bus AGAIN. Genuinely the worst bus journey I’ve ever taken.

By now, it was 11 hours since leaving my AirBNB – my phone was dying and we were at least an hour away from drop off in Singapore.

We finally left the petrol station at 9:52pm and were on our way to immigration! I was nervous as I didn’t have proof of onward journey for Singapore. Just my main flight home to the UK in July. The roads were surprisingly busy at this time. The saving grace of being in a bus meant we got a fast lane on the approach to immigration, whilst cars sat in a pile up of traffic. 

Malaysian Immigration

Reaching the Malaysian immigration at 10:17, we had a very short queue. I was heavily questioned as to why I was in Malaysia, why I was going to Singapore etc. lots of questions regarding onward journeys and if I planned on entering Malaysia again. By 10:30pm, I was back on the bus. I was so grateful to my amazing bus mates who waited for me at immigration to find the bus together. I had told them I was very anxious about not being able to find the bus after, and given I have a UK passport, I had to go in a separate section to them. Their Singapore and Malaysian passports qualified for a quicker check in section. But they very kindly still waited for me. 

We left the Malaysian Immigration at 10:40 and were at the Woodlands checkpoint within minutes. 

Woodlands Checkpoint (Singapore Immigration)

The Woodlands checkpoint was very empty and we were through immigration in minutes. Love Singapore’s efficiency! 

The next saga of the evening was our bus not returning to pick us up. The 6 of us waited for 30 minutes at the bus collection point and he never showed. The buses driver through their own checks and then wait amongst the other buses. We decided to split, with some of us checking each bus and others waiting at the bus entrance. He never showed. After speaking to 5-6 other bus drivers, they confirmed this was the only meeting point and that the Billionstar Bus was a shambles. All said they weren’t to be trusted. 

In despair, we gave up on our original bus ever showing and asked other drivers for help. We found one kind driver who had space for the 6 of us. 

He charged us $3 SGD each for the journey.   dropped off near Bugis MRT. I was just so happy and relived to be on a bus again. Interestingly this driver also laughed when we told him we were left my our BillionStar bus. Calling them the ‘cowboys’ of the Malaysia to Singapore route. We left at 11:22pm exhausted but happy to be nearing the end. 

Finally Arriving in Singapore

At 11:46pm, we got dropped off 800 meters from Bugis MRT and ran to try catch the last train. After running with all our bags, we managed to catch the last MRT train to Expo by a minute!!! Absolute miracle! 

I’m so, so grateful to the amazing bus mates who made this journey remotely bearable and who helped during immigration. I bizarrely bumped into one of them two weeks later and we swapped instagrams and relived the nightmare journey!

I made it to my accommodation just after 12:45am on Sunday…14.5 hours after leaving Malaysia – I could have flown back home to London in that time. 

If I had known the journey was going to be that long and horrendous, I would have just gone by air. The journey from Singapore to Kuala Lumpur with CityLine had been so quick and easy, so I’d thought I’d try it again. After speaking to a few people it sounds like this is a common theme with the bus company we used. I’ve never been one to write negative reviews, or waste energy creating a negative blog post, but I felt compelled after this horrendous experience. There are many other bus companies to choose from, and although they might be a little more expensive (80-130rm were the other prices), you’ll likely have a better experience. The 13 hour journey not only wasted a day, but I was exhausted and very dehydrated the next day.

I met up with an Aussie friend in Singapore (we met in Malaysia the previous week). She got a private taxi to Singapore from Legoland Mayalsia and said it was dreamy. She didn’t even have to get out the car at immigration, the driver just took her passport!! Definitely something to consider if you have the money, or even someone to split the journey with. 

Malaysia & Singapore Guides

Best Things to Do in Sentosa Island

Sentosa is a popular island resort in Singapore and a great destination for those seeking a range of leisure activities …
hiking in singapore

Best Places to Hike in Singapore

Despite Singapore’s size, this urban jungle is home to a surprising number of nature trails and hikes! From leisurely walks …
kuala lumpur

Kuala Lumpur To Singapore by Bus – An Eventful Experience!

After an incredible three months based in Kuala Lumpur, and exploring Malaysia, it was time to head back to Singapore …
petronas twin towers kl

Things to Do in Kuala Lumpur

Kuala Lumpur, the vibrant capital of Malaysia, offers a fascinating blend of modern skyscrapers, colonial architecture, and lush greenery. Whether …

A Guide on Visiting the Batu Caves, Kuala Lumpur

No trip to Kuala Lumpur is complete without visiting the Batu Caves. The iconic coloured staircase, and colossal golden statue …
kuala lumpur to penang bus

Kuala Lumpur to Penang by Bus

After a month of remote work in KL, it was time to head off to my next destination; George Town, …

The post Kuala Lumpur To Singapore by Bus – An Eventful Experience! appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/malaysia/kuala-lumpur-to-singapore/feed/ 0
The Pyramids of Chi https://www.charsfootsteps.com/travel/asia/indonesia/pyramids-of-chi/?utm_source=rss&utm_medium=rss&utm_campaign=pyramids-of-chi https://www.charsfootsteps.com/travel/asia/indonesia/pyramids-of-chi/#respond Tue, 09 Jul 2024 13:41:07 +0000 https://www.charsfootsteps.com/?p=3065 Tucked away in the jungles of Ubud, you’ll find the serene sanctuary of the Pyramids of Chi. Offering a unique blend of ancient and modern wellness practices, the Pyramids of Chi has built a following of devoted visitors. This tranquil sanctuary, inspired by the pyramids of Egypt, is a haven for those seeking spiritual rejuvenation, […]

The post The Pyramids of Chi appeared first on Char's Footsteps.

]]>
Tucked away in the jungles of Ubud, you’ll find the serene sanctuary of the Pyramids of Chi. Offering a unique blend of ancient and modern wellness practices, the Pyramids of Chi has built a following of devoted visitors. This tranquil sanctuary, inspired by the pyramids of Egypt, is a haven for those seeking spiritual rejuvenation, healing, and relaxation. I was quite skeptical of the effectiveness of these types of sessions. However, after hearing rave reviews from people I met throughout Bali, I decided to give a few sessions a try.

How to Get to the Pyramids of Chi

The best way to get to the Pyramids of Chi is via scooter. It’s located just north of Ubud centre but it isn’t very walkable. There is a small car park just in front of the Pyramids of Chi entrance, so you will be able to park.

I believe they have a shuttle that helps take you back to Ubud centre. However, the three classes I tried were each at 7pm and the shuttle wasn’t still running after the class.

The Cafe

There is a cafe located on site with a range of healthy food options, from all day breakfasts to large plates. As you’d expect from a place like this, the food is vegan, organic, gluten free, sugar free etc. I only ate there once, but had a really tasty zucchini lasagne! I also enjoyed the impressive view of the pyramids with jungle trees in the background. Check out the menu on their site for more information on what’s on offer.

pyramids of chi cafe

What Are the Pyramids of Chi?

The Pyramids of Chi are two large, pyramid-shaped structures designed to “harness the natural energies of the earth and amplify the benefits of sound healing”. Created by Australian founders Peter & Lynn McIntosh, this unique venue combines ancient pyramid power with modern sound healing techniques to create a powerful space for meditation and relaxation.

What to Do at The Pyramids of Chi

Sound Healing Sessions

At the heart of the Pyramids of Chi experience are their sound healing sessions. These sessions use a variety of instruments, including gongs, drums, and didgeridoos, to produce therapeutic sounds that help align and balance your body’s energy. The acoustics of the pyramids enhance the vibrations, supposedly promoting deep relaxation and healing.

The Famous Light Sound Vibration – Sound Healing

My first two sessions here were their famous Light, Sound, Vibration classes. On both occasions, I chose to do the 7pm evening sessions in the hopes it would give me a restful sleep. I booked through their official website and was sent confirmation emails containing a QR code. Upon arrival, they’ll scan you code and give you a lanyard with a specific coloured string. This colour will correspond with the class you’re doing. I waited in the cafe, before having a quick briefing on how the Pyramids of Chi work and where I needed to go for my class.

Once in my pyramid, we sat in a circle for a brief introduction to each other and the session itself. The Pyramid had a few rows of water beds lined up, with blankets and eye masks. Without giving too much away, you lie on the water beds and the main lights are dimmed.

LSV Pyramids of chi

Once the session starts, you’ll experience various flashing lights overhead and hear different sounds, like the didgeridoo. It was a very unique experience and I left feeling very relaxed and much lighter. I would say your experience will be largely influenced by the people around you. My first class was packed and the guy next to me fell asleep, snoring throughout the session. Whereas the second one was very empty and undisturbed throughout.

Meditation and Yoga

The Pyramids of Chi offer guided meditation and yoga classes in their peaceful environment. These sessions are designed to help you connect with your inner self, reduce stress, and improve overall well-being. The serene setting makes it an ideal place for both beginners and experienced practitioners.

Workshops and Retreats

Throughout the year, the Pyramids of Chi host various workshops and retreats focused on wellness, spirituality, and personal growth. These programs are led by experienced facilitators and cover a range of topics, from mindfulness and breath-work to sound therapy and energy healing.

Healing Services

In addition to sound healing, the Pyramids of Chi offer a variety of other healing services. These include Reiki and chakra balancing all aimed at promoting physical, emotional and spiritual well-being.

All-in-all, I really enjoyed my time at the Pyramids of Chi. If nothing else, it’s a very relaxing area with beautiful scenery and no street noise. The cafe serves good, healthy food and the shop is filled with a variety of wellness products and souvenirs. There are so many different types of classes so definitely spend time on their site going through different options.

Ubud & Bali Blogs

pyramids of chi ubud

The Pyramids of Chi

Tucked away in the jungles of Ubud, you’ll find the serene sanctuary of the Pyramids of Chi. Offering a unique …

B211A Visa Bali: Everything You Need to Know

The B211a visa is great visa option for extended stays in Bali, Indonesia. With Bali being a top destination for …
nyepi day

Nyepi: The Balinese Day of Silence

Nyepi, otherwise known as the Balinese Day of Silence, is one of the most significant and unique cultural celebrations in …

Things To Do In Ubud

Nestled amongst the lush jungles of Bali, Ubud is blend of culture, nature and adventure. With a rice terraces, tropical …
bali voa

How to Apply for The Visa On Arrival in Bali

With its pristine beaches, lush rice terraces, vibrant culture and incredible food, it’s easy to see why Bali is such …

The post The Pyramids of Chi appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/indonesia/pyramids-of-chi/feed/ 0
The Complete Guide to Wadi Rum, Jordan https://www.charsfootsteps.com/travel/asia/jordan/wadi-rum/?utm_source=rss&utm_medium=rss&utm_campaign=wadi-rum https://www.charsfootsteps.com/travel/asia/jordan/wadi-rum/#respond Thu, 27 Jun 2024 03:56:56 +0000 https://www.charsfootsteps.com/?p=3220 Wadi Rum – or Valley of the Moon – is an unbelievably stunning desert wilderness in southern Jordan. Covering 720 km2, this UNESCO World Heritage Site is famous for its dramatic sandstone mountains, expansive red dunes, and ancient rock carvings. If you’re planning a trip to Jordan, you HAVE to visit Wadi Rum. You’ll get the […]

The post The Complete Guide to Wadi Rum, Jordan appeared first on Char's Footsteps.

]]>
Wadi Rum – or Valley of the Moon – is an unbelievably stunning desert wilderness in southern Jordan. Covering 720 km2, this UNESCO World Heritage Site is famous for its dramatic sandstone mountains, expansive red dunes, and ancient rock carvings. If you’re planning a trip to Jordan, you HAVE to visit Wadi Rum. You’ll get the chance to experience the Bedouin culture, enjoy various outdoor activities, see starry-night skies and the most incredible desert surroundings. Here is my experience visiting Wadi Rum, with two great friends, during our trip to Jordan.

wadi rum jeep

What to Do in Wadi Rum

Jeep Tours of Wadi Rum

Jeep tours are one of the most popular activities in Wadi Rum, allowing you to explore the vast desert quickly and comfortably. These tours typically last a few hours and take you to the most iconic sites; Lawrence’s Spring, Khazali Canyon and famous rock formations like the Seven Pillars of Wisdom. Local Bedouin guides lead the tours, providing insights into the culture, history and geology of Wadi Rum.

Hiking and Rock Climbing

Wadi Rum is home to a variety of trails and climbing routes that cater to all skill levels. The Jebel Umm ad Dami, the highest peak in Jordan, offers a difficult hike with panoramic views of the desert, and even Saudi Arabia on clear days. Those looking for rock climbing opportunities, there are number cliffs and steep rock faces to try out. I’d recommend choosing a guided tour, whether you’re beginner or advanced, to navigate these!

Hot Air Balloon Rides

For the thrill-seekers, you can take a hot air balloon ride over Wadi Rum at sunrise. You’ll be able to enjoy bird’s-eye view of the stunning desert, dunes and rock formations. I imagine the photo opportunities are epic, particularly given the morning colours of the desert at sunrise. I’m absolutely terrified of heights, so I can’t think of anything worse than a hot air balloon ride. But if this is up your street, Google search one of the many tours to find the best price/package for you.

Camel Rides

Another popular part of most tours are the camel experiences. You’ll get the chance to learn more about the camels and how they played an integral part of transport within Wadi Rum. The treks can range from short one-hour rides to multi-day journeys. I felt a bit bad riding on one so we opted for the one-hour session in our tour.

Bedouin Camps and the Bedouin Culture

I’d highly recommend doing a multi-day tour in Wadi Rum, so you’re able to stay at a Bedouin camp and experience some of their culture. We were able to eat authentic meals, listen to traditional music and hear about Bedouin customs. It also allows you to experience the breathtaking starry-sky. Depending on when you go, you can also see the edge of the milky way! You’ll also get to experience Zarb. Zarb is a traditional Bedouin delicacy, where meats and vegetables are cooked on a barbecue located underground, in a large pit. The food is placed on racks which are lowered into a pit, overtop hot coals and then the pit is covered with sand until the Zarb is finished. The food each night was unreal!

Stargazing

Wadi Rum is famous for its clear skies and minimal light pollution, making it the perfect place for stargazing. Many camps have guided stargazing sessions, where guides will point out constellations and planets. Some camps also provide telescopes! Whether you go a guided session, or just enjoy the stars alone, it’s an unforgettable experience!

Sandboarding

Given the many sand dunes in Wadi Rum, a popular activity with tours is sandboarding. With boards provided by your tour, you’ll get to slide down the soft, powdery dunes – fun and very fast! Definitely a different way to enjoy the desert.

Sunrise and Sunsets

The Wadi Rum desert transforms from dawn to dusk, as the sky changes colours. Most tours and camps offer specific trips to the best viewing spots, where you’ll be able to unwind and watch the stunning sunrises or sunsets. Both nights of our tour included sunset watching and it was out of this world!

Photography Tours

With its dramatic landscapes and unique light conditions, Wadi Rum is a popular place for photographers. Consider taking an organised photography tour, that’ll take you to the most photogenic spots, at the best times, to ensure you’re getting the best out of the desert.

Historical Sites of Wadi Rum

There are several historical sites in Wadi Rum that you’ll likely visit, particularly if you’re doing a tour. Lawrence Springs is a historic site named after T.E. Lawrence, renowned for its small natural spring, ancient inscriptions and panoramic views. Another historical location is Khazali Canyon, featuring petroglyphs and inscription that date back thousands of years. These are some of the areas that provide fascinating insights into Wadi Rum’s past and the ancient civilisations who lived there.

Where to Stay in Wadi Rum

There are several options to consider when deciding on where to stay within Wadi Rum itself. The most popular would be the Bedouin Camps, where you can get a glimpse of what life is like for people permanently living within the desert. There are different ‘levels’ of these, some basic and others more luxury.

We had a lovely stay in a fairly basic 3-man cabin. Our camp consisted of a few cabins, a campfire area, a main tent for eating and hanging out, and a small bathroom hut with toilets and showers. I would say going to the bathroom in the middle of the night was an experience!! Aside from the little solar lights near the bathroom entrance, you’re in pitch dark! It was very, very dark, so I used my phone torch and sprinted to/from the bathroom.

The image above shows our camp; with the communal tents in the foreground, our sleeping cabins in the back right and the bathroom is the back left.

Alternatively, you can opt for a more luxury option, like the Bubble Luxotel; a bubble dome experience where you can watch the stunning sunsets from your jacuzzi!

Our Wadi Rum Itinerary

Here is an overview of how we spent our 3 nights in Wadi Rum, so you have an idea of what to expect if you book a tour. We chose a 2-day/2-night tour but spent an extra night in the camp before it started.

Day 1: Petra to Wadi Rum

After a few incredible days exploring Petra, we got a taxi to Wadi Rum. Arriving in the afternoon, we presented our Jordan Pass and met our tour guide- Mohammed. From there, he drove us 45 minutes through Wadi Rum to our camp. The views around us were out of this world!!

We were welcomed by Mohammed’s amazing team and spent the evening sat by the fire, drinking copious amounts of sweet Jordanian tea and marvelling at our surroundings. We only had one other person at our camp so it felt intimate and quiet.

As someone born and raised in London, I couldn’t get over how dark and quiet it was at night. Very peaceful and surreal, with incredible stars!

Day 2 – Hikes, Jeep Tours, Dune Surfing & Lawrence Springs

Our first proper day in Wadi Rum started with an early, traditional breakfast before pilling into a jeep for a tour. We spent several hours in the morning touring some key sites of Wadi Rum, before our first main stop, Lawrence Springs.

We were dropped at the base of Lawrence Springs, before starting the rocky climb up to the springs. I’m terrified of heights and found this to be quite unnerving, particularly given the steepness. In the end, I made it 3/4 of the way up before stopping. I hid by some rocks for shade, whilst my friends continued to see the springs. They said it was worth it but that I probably would have struggled, height-wise, going any further up. I was happy enjoying the panoramic views around me.

lawrence springs climb

We stopped during peak sun for lunch, which Mohammed provided. Very filling local food, ample amounts of water and sweat tea were provided. Our guides were brilliant at setting everything up quickly and providing us with everything we could need. Once the peak sun had passed, and we were full from the amazing food, we continued on the tour. This entailed climbing up our first sand dune, more hikes in the afternoon and a last sand dune in the late afternoon for sandboarding. I spent most of it on my arse, but it was very fun!

Back near our camp, we were taken to the most incredible view point to watch the sunset. There are limited numbers of tourists allowed in Wadi Rum at any time, so we shared this area with maybe 10 people maximum. After the sunset, we were driven back to the camp where we had our first experience of Zarb. Safe to say the food was incredible and we enjoyed our dinner by the campfire.

Day 3 – Saudi Border, Camel Rides, Hikes and Sunsets

Our second day of the tour began early, with more walks and hikes. We spent most of the morning exploring the Khazali Canyon, which provided a different terrain and interesting insights into the preserved petroglyphs. We also did a longer walking hike, which gave us great views of the Jordan – Saudi Arabia border! Similarly to the previous day, we found shaded shelter during the peak heat and ahd another feast of a lunch. The tour were so incredible at providing lots of fresh food, water and their famous sweet tea.

In the afternoon we headed back towards our camp, with a camel stop! I wasn’t too sure about this part of the tour but it was great to meet some of the Bedouin’s camels, hear about how they still help. Our tour guide for this part was a young boy (13 years old maybe?) who brought three camels from his family for us to meet. We did a short ride on them before hearing more about how the camels are apart of their every day life.

By now it was getting close to sunset, so we were taken to another fantastic view point. Again, there’s limited numbers allowed in Wadi Rum, so it wasn’t crowded. But nice to see a few other people in the desert, outside of ourselves. Back at camp we had another Zarb dinner under the stars before heading back to our cabin.

Day 4 – Wadi Rum to Amman

After an amazing 3 nights in Wadi Rum, we had our last breakfast before being driven in the 4×4 back to the main tourist entrance. From here we took a taxi to Amman for our last night in Jordan.

Wadi Rum was without doubt my favourite place to visit in Jordan, so I’d highly recommend going on a multi-day tour. The whole country was amazing though and we had incredible times at the Dead Sea, Dana Biosphere Reserve, Petra and Amman.

More Jordan Blogs

The Complete Guide to Wadi Rum, Jordan

Wadi Rum – or Valley of the Moon – is an unbelievably stunning desert wilderness in southern Jordan. Covering 720 km2, …
wadi rum jeep

The Ultimate Guide to Travelling in Jordan

Jordan is a land rich in history, culture, and natural beauty, and probably one of the most spectacular places on …
visiting ancient city of petra in jordan

Visiting the Ancient City of Petra Jordan

The ancient Jordanian city of Petra is located in the southwestern part of the country, 150 miles south from the …
dana biosphere reserve

A Guide to Dana Biosphere Reserve

Dana Biosphere Reserve is Jordan’s largest nature reserve, covering an impressive 320 square kilometres of diverse landscapes and habitats. During …
dead sea jordan guide

Visiting the Dead Sea in Jordan

The Dead Sea, a unique natural wonder, attracts visitors from all over the world. Known for its high salinity and …

The post The Complete Guide to Wadi Rum, Jordan appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/jordan/wadi-rum/feed/ 0
The Ultimate Guide to Travelling in Jordan https://www.charsfootsteps.com/travel/asia/jordan/jordan-travel-guide/?utm_source=rss&utm_medium=rss&utm_campaign=jordan-travel-guide https://www.charsfootsteps.com/travel/asia/jordan/jordan-travel-guide/#respond Sat, 22 Jun 2024 10:52:02 +0000 https://www.charsfootsteps.com/?p=415 Jordan is a land rich in history, culture, and natural beauty, and probably one of the most spectacular places on Earth I’ve visited. From the ancient city of Petra to the stunning landscapes of Wadi Rum, Jordan offers an array of experiences for every traveller. Here is how I spent a week in Jordan with […]

The post The Ultimate Guide to Travelling in Jordan appeared first on Char's Footsteps.

]]>
Jordan is a land rich in history, culture, and natural beauty, and probably one of the most spectacular places on Earth I’ve visited. From the ancient city of Petra to the stunning landscapes of Wadi Rum, Jordan offers an array of experiences for every traveller. Here is how I spent a week in Jordan with two friends. This guide will also provide information to help you plan your trip, including key places to visit, practical tips on visas, what to wear, and what to pack.

To make this trip more cost effective, my friends and I flew from London to Amman via Milan. We saved several hundreds of pounds doing this and got to have a night in Bergamo, either side of the trip. If you’re short on cash, I highly recommend doing this as we had a great time in Bergamo too.

Camels in Petra

Jordan Pass

The Jordan Pass is the best way to save time and money on your trip. when visiting Jordan. It gives you pre-paid entry into more than 40 popular tourist destinations, including Petra, Wadi Rum and Jerash. The Jordan Pass also waivers your visa fee, as long as you stay a minimum of 3 nights/4 days.

There are three types available – Jordan Wanderer, Jordan Explorer, and Jordan Expert – depending on how long you want to spend in Petra. The cheaper of the passes will allow you 1 day in Petra, whilst the most expensive pass will give you 3 consecutive days in Petra. The pass will be sent via email, with a PDF containing a QR code that will be scanned at the airport and sites. I’d recommend having a few print out copies alongside your digital copy. You can buy the Jordan pass online here. I can’t recommend this pass enough, it saved us money and we skipped most queues at popular sites.

dead sea jordan guide

Jordan Visa

You’ll likely need a visa to travel to Jordan but these can be obtained upon arrival at the airport or at border crossings. The visa fee is typically around 40 JOD. However, if you purchase the Jordan Pass, the visa fee is waived. Check the specific visa requirements for your nationality before traveling, as some nationalities may need to apply in advance.

Things to do in Jordan

There are so many amazing places to explore in Jordan! We had just over a week there, so decided to visit the Dead Sea, Dana Biosphere, Petra, Wadi Rum and Amman. This was to cover some of the main sites and get a varied experience of the country – between desert, city and historical sites. Here are more details on each place, in order of our itinerary, before looking at a few other key places to consider.

The Dead Sea – 1 Night

The Dead Sea, located at the lowest point on Earth, is renowned for its extremely high salt content, which allows you to float effortlessly. The mineral-rich mud and waters are also said to have therapeutic properties. After landing at Queen Alia International Airport, Jordan’s main international airport, we got a taxi directly to the Dead Sea. The taxi was fixed rate at 15 JOD (17) and took an hour, but this will cost more at night. We managed to get a good deal at the Movenpick hotel at the Dead Sea, so choice to do out first night in Jordan there.

the dead sea

We spent our first afternoon swimming (or floating) around the Dead Sea. It was a surprisingly good core workout!! We were also able to enjoy a mud bath here, which is supposedly great for your skin. If you’re planning to visit the Dead Sea via a hotel, there should be a jetty that will allow you to walk into the sea. Otherwise be sure to bring thick water shoes, as the salt along the shore is very sharp! It felt like walking on glass. After a few hours enjoying the Dead Sea, we spent the rest of the afternoon relaxing by our hotel pool, before having dinner at the resort. We didn’t venture out of the hotel, but it seemed like there wasn’t much to do outside of enjoying the Dead Sea, spending time within the resort or visiting a public beach.

getting muddy at the dead sea

I’ve written a detailed guide on our time at the Dead Sea, along with tips on how to make the most out of your experience there. From the Dead Sea, we took a taxi to Dana Biosphere Reserve.

Dana Biosphere Reserve – 1 Night

Dana Biosphere is the largest nature reserve in Jordan, covering 320sq km, and is famous for its stunning views and impressive hiking. The limited public transport in Jordan meant it was easiest to grab a taxi here. However, I believe you can get buses to Dana Biosphere Reserve from any main city, like Petra or Amman.

dana biosphere reserve

After arriving in the afternoon and settling into our cabins, we went for our first hike. The whole area was very peaceful and provided stunning views! Once we got back to the camp, we spent the evening watching the sunset, before joining everyone in the main tent for dinner.

dana biosphere sunset

Our accomodation provided a huge buffet of local cuisine, all eaten in a traditional tent. It was a great way to meet other people, hear their stories and exchange travel tips for Jordan.

The tents were surprisingly comfortable, warm and quiet, so I slept well. We got up early to watch the sunrise, which was equally as impressive as the previous night’s sunset. After a lazy morning and tasty local breakfast, we packed up and got a taxi to Petra.

dana biosphere hike

If you’re looking for something a little more off-the-beaten-track from the standard sites of Jordan, I really recommend coming to Dana Biosphere. The nature and views are unlike anything else, there are many hikes and the overall atmosphere is very peaceful. Read more about this with my guide on the Dana Biosphere Reserve.

Our sunrise view at dana biosphere

Petra – 2 Nights

Petra is an ancient city carved into rose-red cliffs by the Nabateans over 2,000 years ago. Recognised as a UNESCO World Heritage site, Petra is often referred to as the “Lost City” due to its rediscovery by the Western world in the early 19th century. The iconic Treasury is the most famous structure, but Petra is vast, with many tombs, temples, and an impressive amphitheater.

the Treasury at Petra

We stayed in the centre of Petra and our hotel included free, return transfer to the Petra Archaeologic Park. I’d recommend looking into this when booking, as a number of places offered free return transport to the Park and it saved us hassle and money.

We spent two nights here, to have 1.5 days of exploring Petra. I found this to be enough time to do the main hikes of Petra. Highlights included seeing the famous Treasury, the Siq, the High Place of Sacrifice and the Monastry. You can easily spend three days here though.

I’ve written a more detailed guide on Petra, which goes into more detail on the different hikes and activities within the Park. After an incredible time in Petra, we made our way to Wadi Rum for our desert adventure.

Wadi Rum – 3 Nights

Wadi Rum is one of Jordan’s most breathtaking deserts, and honestly, one of the most unbelievable places I’ve ever been. Truely felt like something out of a movie. Known as the ‘Valley of the Moon’, this surreal landscape features awe-inspiring rock formations, ancient petroglyphs, and vast, echoing canyons. This mesmerising spectacle is an absolute must-do in Jordan.

We chose to spend 3 nights in Wadi Rum and stayed in a traditional Bedouin camp. During the night, we marvelled at the starry-skies and ate incredible local meals that had been cooked using the heat of the sand! In the day, we would explore different parts of Wadi Rum desert via Jeep. This included walking through unique rock formations, dune surfing, spotting wild camels and driving through vast desert plains. This is a place no picture can do justice. One of my favourite parts was watching the sunsets with other groups every evening. Wadi Rum only allows a very small number of tourists in at any given time, so it feels very empty!

After an unbelievable experience at Wadi Rum, we got up early to catch a taxi to the capital of Jordan, Amman.

Amman – 1 Night

Amman is a vibrant capital city, blending ancient history with modern culture. Known for its Roman ruins, bustling markets, and contemporary art scene, Amman offers a truely varied experience.

Arriving in Amman late morning, we were ready for a jam-packed day! We started with lunch at the famous Hashem Restaurant in the bustling downtown area. It was packed with tourists and locals alike and it became obvious why it was so highly recommended. The food was incredible; falafel and other Jordan specialities with the freshest ingredients and very efficient service. I also had the best Knafeh of my life at a stall round the corner from here too.

After eating, we embarked on a self-guided walking tour of the historic parks of Amman, using the Lonely Planet tour. This BRILLIANT 3km walk took about 2.5 hours, taking us through all the key sites; including the Citadel, the Roman Theatre and some Souks. There were 20 notable stops on the tour, one being Hashem restaurant we’d been to earlier. Although it was an incredible afternoon, I would say it was hot in 40-degree heat and being completed covered up out of respect to the culture. Definitely bring light, floaty clothing as I was dying in black jeans!

We opted for a more fine dining experience for dinner at Fakhr el Din. After a lovely meal, we wandered around the night markets at Souk Jara and Rainbow Street. Here you’re find a number of food stalls, handcrafts, antiques, jewellery, clothes, paintings and more! As Jordan is predominately a Muslim country, you’re more likely to see Shisha lounges in the evenings, as opposed to bars.

The next morning, we had our final breakfast of Jordan and wandered around Amman, before leaving for the airport.

Flight to Bergamo

To end our time in Jordan, we flew back to London via a night in Bergamo. This saved us a lot of money and allowed us to have 24 hours to explore Bergamo, Italy. I have a full itinerary on the best things to do in Bergamo.

We managed to do a lot in our short time in Jordan, but these are places I’d love to visit next time:

Jerash

Jerash is home to one of the best-preserved Roman cities outside Italy. The key things to see here include the ancient streets, the colonnaded avenues, and the impressive theatres, temples, and plazas. Every summer the Jerash Festival is put on, featuring cultural performances of traditional music, dance, and theatre.

Aqaba

Aqaba, Jordan’s only coastal city, offers access to the Red Sea’s vibrant marine life and coral reefs. If you’re into reef diving, water sports, snorkelling, or just lying on a beach, then Aqaba is a must-do. The city also has a rich history, with sites like the Aqaba Fort and the early Islamic city of Ayla. Aqaba is apparently a great transport hub for excursions to Wadi Rum and Petra, so consider this in your planning. 

Mount Nebo

Mount Nebo is a significant biblical site where Moses is said to have seen the Promised Land. The Mount Nebo Summit offers panoramic views of the Jordan Valley, the Dead Sea, and even Jerusalem on clear days. Mount Nebo is also home to the Memorial Church of Moses, which houses mosaics from the Byzantine period.

What to Wear In Jordan

What to wear in Jordan was a big concern of mine ahead of travelling. Dress code was very relaxed in the hotels and resorts. We were able to walk around in swimwear and wore short dresses in the evening. However, as Jordan is a conservative country, you’ll need to dress modestly outside of your accommodation, particularly in rural areas or religious sites.

For women, this generally means covering shoulders, cleavage, and knees. Long skirts, dresses, and loose trousers paired with tops that cover the shoulders are ideal. Men should avoid wearing shorts in cities and opt for long trousers. Comfortable walking shoes are a must for exploring archaeological sites. As it was extremely hot, I’d choose floaty or thin clothing – particularly in Amman!

What to Pack for Jordan

  • Clothing: Bring lightweight, breathable clothes for the day and layers for the cooler evenings. A scarf or shawl is useful for visiting religious sites.
  • Footwear: Comfortable walking shoes or hiking boots for exploring sites like Petra and Wadi Rum.
  • Sun Protection: Sunscreen, sunglasses, and a hat to protect against the strong desert sun.
  • Hydration: A reusable water bottle to stay hydrated, especially in the desert!
  • Medications: Basic first-aid supplies and any personal medications you may need.
  • Adapters: Jordan uses Type C, D, F, G, and J power outlets, so a universal adapter is useful.

Jordan FAQs

Is Jordan Safe?

This is the first thing people always asked me after my trip to Jordan. As three female travellers, we all felt very safe throughout our trip. If anything, everyone was extremely friendly and welcoming. The Jordanian government has put in huge efforts to make tourists feel safe by increasing the police presence in cities and tourist areas. The country also has a stable political environment and a strong security presence. However, it’s always wise to stay informed about current events and follow any travel advisories from your home country.

What Is The Best Time to Visit Jordan?

The best time to visit Jordan is during the spring (March to May) and autumn (September to November) when the weather is mild and pleasant. Summers can be extremely hot, especially in the desert, while winters can be cold, particularly in the northern regions. We went in September I found

Can I Use Credit Cards in Jordan?

Credit cards are widely accepted in hotels, restaurants, and larger shops in major cities. However, it’s advisable to carry cash for smaller purchases, especially in rural areas and local markets.

What Language is Spoken in Jordan?

Arabic is the official language of Jordan. English is widely spoken, especially in tourist areas, hotels, and by younger Jordanians.

Do I Need Any Vaccinations to Travel to Jordan?

No specific vaccinations are required for entry into Jordan. However, it’s recommended to be up-to-date on routine vaccines such as measles, mumps, rubella (MMR), diphtheria-tetanus-pertussis, varicella (chickenpox), polio, and your yearly flu shot. Check with your healthcare provider for the most current advice.

How Can I Get Around Jordan?

Public transport options are quite limited in Jordan. There are coaches you can get that’ll let you travel between key places in Jordan, e.g. Amman to Petra. But I would try to plan your journey ahead of time to see if public transport options are available for your specific itinerary. Otherwise it’s easy to organise taxis between places. We met a few travellers who had rented cars. A last option is to join an organised tour.

Jordan Blog Posts to Check Out

The Complete Guide to Wadi Rum, Jordan

Wadi Rum – or Valley of the Moon – is an unbelievably stunning desert wilderness in southern Jordan. Covering 720 km2, …
wadi rum jeep

The Ultimate Guide to Travelling in Jordan

Jordan is a land rich in history, culture, and natural beauty, and probably one of the most spectacular places on …
visiting ancient city of petra in jordan

Visiting the Ancient City of Petra Jordan

The ancient Jordanian city of Petra is located in the southwestern part of the country, 150 miles south from the …
dana biosphere reserve

A Guide to Dana Biosphere Reserve

Dana Biosphere Reserve is Jordan’s largest nature reserve, covering an impressive 320 square kilometres of diverse landscapes and habitats. During …
dead sea jordan guide

Visiting the Dead Sea in Jordan

The Dead Sea, a unique natural wonder, attracts visitors from all over the world. Known for its high salinity and …

The post The Ultimate Guide to Travelling in Jordan appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/jordan/jordan-travel-guide/feed/ 0
Visiting the Ancient City of Petra Jordan https://www.charsfootsteps.com/travel/asia/jordan/petra-jordan/?utm_source=rss&utm_medium=rss&utm_campaign=petra-jordan https://www.charsfootsteps.com/travel/asia/jordan/petra-jordan/#respond Sat, 08 Jun 2024 07:08:17 +0000 https://www.charsfootsteps.com/?p=776 The ancient Jordanian city of Petra is located in the southwestern part of the country, 150 miles south from the capital Amman. Also known as the Red Rose City, Petra has quickly become a symbol of Jordan and has become the country’s most visited site. The Petra Archaeological Park was declared a UNESCO World Heritage […]

The post Visiting the Ancient City of Petra Jordan appeared first on Char's Footsteps.

]]>
The ancient Jordanian city of Petra is located in the southwestern part of the country, 150 miles south from the capital Amman. Also known as the Red Rose City, Petra has quickly become a symbol of Jordan and has become the country’s most visited site. The Petra Archaeological Park was declared a UNESCO World Heritage Site in 1985 and is considered a seventh wonder of the modern world. It’s believed to have been built around 312BC, but was only rediscovered in 1812 by a Swiss Explorer – giving it another name of The Lost City. We spent several days in Petra during our trip to Jordan, so hopefully this post helps cover how to get to Petra, entrance fees, what to bring and wear and different walking trails.

How to Get to Petra

How you get to Petra will depend on where you’re coming from within Jordan. Public transport is fairly limited in Jordan, so it’s likely you’ll get to Petra via a rental car or taxi. There are some tourist coaches available that’ll take you between the main cities and tourist destinations. We took a taxi from Dana Biosphere Reserve straight into Petra centre.

Jordan Airport to Petra

If you’re planning on heading to Petra directly from the Queen Alia International Airport, you can take a car or taxi, lasting approximately 2.5-3 hours. This typically costs around 85 JOD (£91/$120). There is public transport available, which is the cheapest option, however it is also the slowest option. You’ll need to take the Sarah Airport Express Bus to the Tabarbour bus station in Amman, before changing onto a JETT bus to Petra. This will cost around 13.50 JOD (£15/$19) and will take approximately 5.5 hours.

Entrance Fees and Tickets to Petra

Tickets can be bought on arrival from the visitor centre at the entrance of the park. The entrance fee will vary depending on who is purchasing it, length of stay and number of days at Petra. These can be bought with cash or card. It’s important to note, you’ll need a valid passport or ID with you to purchase tickets. The most common ticket type is for the ‘accommodated visitor’ who is staying in Jordan for at least one night:

TicketPrice
One Day50 JOD (£53/$71)
Two Day55 JOD (£59/$78)
Three Days60 JOD (£64/$85)
12yrs and underFree

The less common ticket type will include the accommodated visitor who goes to Petra on their first day from the border. For this, you’ll pay a border ticket fee of 90 JOD (£96/$127) and receive a 40 JOD refund upon returning the next day.

Non-accommodated visitors – one day visitors to Jordan who do not spend the night in the country – will pay a day ticket fee of 90 JOD ((£96/$127). For residents, the fee is 1 JOD (£1.07/$1.41 usd), as long as you have had a valid residence card for at least a year. As there’s a lot to see in Petra, I’d recommend two days at least to see the main sites.

Jordan Pass

Another way to get tickets for Petra is to buy a Jordan Pass. This is a pass that can be bought online, and it encompasses your Jordan entrance visa fee along with 40 of the most popular sites! I would highly recommend getting this as it saves so much time and money!

The Jordan Pass does not include the evening event ‘Petra by Night’ and you must bring the pass with you to the Petra visitor centre. It can not be used at any other entrances to Petra.

What to Do in Petra

Petra is enormous with 15 main trails and lots to see! We spent two days in the park and only touched the surface. Upon arrival to Petra, your first point of entry will be the visitor centre. Here you’ll find tickets, informational guides and a museum. There is also Wifi, toilets, coffee shops and ATM machines. I would recommend using the toilets here, as the ones in the park are sparse and often not restocked with toilet paper. Once through the visitors centre, you’ll walk about 30 minutes to the entrance of the Siq.

The Siq

Your journey into Petra begins with a walk through the Siq, a narrow gorge that stretches for about 1.2 kilometers (0.75 miles). The impressive towering walls, up to 80 meters (262 feet) high, create a dramatic entrance to the ancient city. As you walk, you’ll see remnants of ancient carvings and water channels that once supplied the city with water.

al-siq

Be aware of your surroundings as horse carriages come racing through here! It takes about 20-30 minutes to walk through here, which is important to note as you’ll need to factor this into your journey back. You need to get back to the visitors centre for closing and it’s about an hour walk from the Treasury (main area) in total – including the Siq walk.

The Treasury (Al-Khazneh)

Emerging from the Siq, you’ll be greeted by the sight of the Treasury, Petra’s most famous monument. This iconic façade, carved directly into the rock face, is believed to have been a royal tomb. The intricate carvings and grand scale made it an absolute highlight of the visit. As expected, it does get quite busy here. Get there early in the morning or stay late afternoon to see it less crowded. There’s also a great viewing point here, which you can climb up to get photos with the Treasury in the background. This was truely a bucket-list place for me and it was even more spectacular in person! Highly recommend coming to Jordan for the Treasury alone!

The Street of Facades

Continuing past the Treasury, you’ll find the Street of Facades, a row of monumental Nabatean tombs with elaborate carvings. These tombs showcase the architectural ingenuity of the Nabateans, the ancient people who built Petra. There are toilets and some refreshment stalls around here.

The Nabatean Theatre

Nearby is the Nabatean Theatre, which once seated around 8,500 spectators. Carved into the rock, this impressive structure combines Greek and Roman architectural elements, offering insight into the cultural life of ancient Petra. We enjoyed walking around the amphitheater and standing on what was once the stage.

The Royal Tombs

Climbing up to the Royal Tombs offers a fantastic view of the city. These large mausoleums are believed to be the burial sites of Petra’s kings. The Urn Tomb, Silk Tomb, Corinthian Tomb, and Palace Tomb are particularly noteworthy for their size and ornate designs. These are a fair walk from the entrance of Petra so be sure to visit these if you’ve gone early and have time to make it back.

The Monastery (Ad-Deir)

The Monastery is another of Petra’s grand structures and is even larger than the Treasury. Reaching it requires a hike of about 800 steps, but the effort is well worth it. The Monastery is less crowded than the Treasury, offering a more tranquil experience and stunning views of the surrounding landscape.

High Place of Sacrifice

For those who enjoy hiking, the High Place of Sacrifice provides a challenging but rewarding climb. The trail leads to a plateau where religious ceremonies were once performed. From here, you can enjoy panoramic views of Petra and the surrounding mountains. We did this and the Treasury on one day and the rest of the sites from this blog were done on a separate day.

What to wear in Petra

What to wear in Petra was a big concern ahead of my trip. Given that it’s a muslim country, my friends and I wanted to show our respect to the culture. However, it was very hot when we visited, so finding the right mix of being respectful and keeping cool was hard. We opted for activewear that covered our shoulders and either floaty trousers (think Thailand travel pants) or longer shorts. I’d say we were balanced compared to other travellers we saw – some wore strappy tops and short-shorts, others were totally covered up.

Petra at Night

Petra by Night is a unique way to explore this spectacular ancient city by candlelight. The tour takes you on a journey through the Siq all the way to the Treasury, with the beauty of 1,500 candles!! You’ll be treated to the famous sweet Bedouin tea, Jordanian flutes and unbelievable starry skies.

The Petra Night Show is held every Monday, Wednesday and Thursday and lasts two hours. It starts and ends at the visitor centre and is on between 8:30-10:30pm.

Entrance fee for Petra at Night is 17 JOD (approx. £18/$24 USD) and is free for all children below the age of 10. You can buy tickets at the park’s visitor centre, through local tour agencies in Petra or through most hotels. It’s worth noting that you can’t buy Petra by Night tickets in advance, but don’t worry, there are unlimited tickets! You’ll need a valid day ticket too for this, and you can buy these in advance (visitor centre between 7:30-8:30pm). Aside from this, Petra is closed at night and it’s not possible to stay overnight.

Unfortunately, I wasn’t able to do this during my trip to Petra. For transparency, there are mixed reviews on the experience, with some people claiming it’s overrated and underwhelming. I imagine this would be somewhat tiring after a full day exploring the park too.

Tips and Essentials on Visiting Petra

Here are some tips to help you prepare for your trip to Petra.

  • Wear Comfortable Footwear: You’ll be doing a fair amount of walking, so wear comfortable shoes. There are some rocky areas and most of Petra is quite dusty, so I’d strongly recommend closed-toe shoes, like trainers.
  • Stay Hydrated: The desert is hot and dry, so bring as much water as you can carry comfortably. I took 2 litres each day. You can buy some water on site and at the visitors centre.
  • Guided Tours: Local guides can help provide in-depth historical context and insights into each site.
  • Timings: Be very aware of your time in Petra. It takes an hour to walk from the visitor centre entrance to the actual entrance of Petra’s sites. You have to factor this in for the end of day so you are out before it closes. I would recommend getting to Petra early so you aren’t pushed for time with the closing.
  • Respect Local Customs: As stated above, Petra seemed to have a fairly relaxed dress code implementation compared to what I had envisaged. Having said that, Jordan is still predominantly a Muslim country, so dress modestly out of respect for the local culture and people.
  • Weather Considerations and Time of Year: Petra is best visited in the cooler months to help avoid the extreme heat of summer. October to April are good times to visit. We went in September, which was very hot, but bearable.
  • Plan your visit: Petra is so big and there’s so much to do! We divided the different sites across two days in a way that made sense for seeing sites near each other. E.g. the High Palace of Sacrifice is a long hike and a bit far from the tombs. It made sense to divide the region to see across multiple days.
  • STICK TO THE PATHS!! We got a bit lost and thankfully found a local boy who helped us get back on track again. Do not deviate from the tourist areas or main paths as it can be hard to set yourself right again.

Visiting Petra was a huge bucket list goal for me and one of the most incredible places I’ve ever visited. You’ll discover fascinating history, culture and architecture at this Wonder of the World. I hope this has been helpful to anyone planning a trip to Petra, or Jordan in general. For more information on the Petra Archaeological Park, check out their official site www.visitpetra.jo. After our amazing trip to Petra, we took a taxi to Wadi Rum for our next stop.

Jordan Blog Posts

The Complete Guide to Wadi Rum, Jordan

Wadi Rum – or Valley of the Moon – is an unbelievably stunning desert wilderness in southern Jordan. Covering 720 km2, …
wadi rum jeep

The Ultimate Guide to Travelling in Jordan

Jordan is a land rich in history, culture, and natural beauty, and probably one of the most spectacular places on …
visiting ancient city of petra in jordan

Visiting the Ancient City of Petra Jordan

The ancient Jordanian city of Petra is located in the southwestern part of the country, 150 miles south from the …
dana biosphere reserve

A Guide to Dana Biosphere Reserve

Dana Biosphere Reserve is Jordan’s largest nature reserve, covering an impressive 320 square kilometres of diverse landscapes and habitats. During …
dead sea jordan guide

Visiting the Dead Sea in Jordan

The Dead Sea, a unique natural wonder, attracts visitors from all over the world. Known for its high salinity and …

The post Visiting the Ancient City of Petra Jordan appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/jordan/petra-jordan/feed/ 0
A Guide to Dana Biosphere Reserve https://www.charsfootsteps.com/travel/asia/jordan/dana-biosphere-reserve/?utm_source=rss&utm_medium=rss&utm_campaign=dana-biosphere-reserve https://www.charsfootsteps.com/travel/asia/jordan/dana-biosphere-reserve/#respond Mon, 03 Jun 2024 11:24:54 +0000 https://www.charsfootsteps.com/?p=2986 Dana Biosphere Reserve is Jordan’s largest nature reserve, covering an impressive 320 square kilometres of diverse landscapes and habitats. During our 10 days in Jordan, we made the visit the Dana Biosphere Reverse to spend a one night in this tranquil oasis. Located in the south-central region of Jordan, it stretches from the top of […]

The post A Guide to Dana Biosphere Reserve appeared first on Char's Footsteps.

]]>
Dana Biosphere Reserve is Jordan’s largest nature reserve, covering an impressive 320 square kilometres of diverse landscapes and habitats. During our 10 days in Jordan, we made the visit the Dana Biosphere Reverse to spend a one night in this tranquil oasis. Located in the south-central region of Jordan, it stretches from the top of the Jordan Rift Valley down to the desert lowlands of Wadi Araba.

Established in 1989, Dana Biosphere Reserve is a sanctuary for wildlife and a hub for eco-tourism, offering visitors a unique opportunity to explore its rich biodiversity and stunning scenery. In this blog post, I will guide you through the highlights of Dana Biosphere Reserve, why it’s worth a visit, what to do there, and how to get there.

Sunrise Views from Our Bed

How to Get to Dana Biosphere Reserve

Dana Biosphere Reserve is located about 200km south of the capital, Amman, and easiest to reach by car. We booked a taxi from our hotel in the Dead Sea and I’d recommend this option over any other. Alternatively, you could look into renting a car and do the drive yourself. I would say this requires quite a lot of planning and navigating, so we were glad to have the stress taken off with the taxi, despite the higher cost. If you’re driving from the capital, expect it to take between 2.5 to 3 hours via the Desert Highway and King’s Highway.

Alternatively, public transportation options include taking a bus from Amman to Tafila or Ma’an and then hiring a taxi to Dana Village. While this option may be more affordable, it is less convenient than driving directly.

Once you arrive at the reserve, you’ll have the option to either stay at the Dana Eco-Lodge or camp within designated areas. It’s important to note that camping requires a permit, which can be obtained from the reserve’s visitor centre.

Best Things to Do in Dana Biosphere

Explore the Diverse Ecosystems

Dana Biosphere Reserve is home to four distinct bio-geographical zones: Mediterranean, Irano-Turanian, Saharo-Arabian, and Sudanian. This diversity results in a remarkable variety of flora and fauna, with over 800 plant species, 190 bird species, and 45 mammal species. Among these are endangered species such as the Syrian wolf and the sand cat.

Hiking and Trekking

Dana offers some of the best hiking and trekking experiences in Jordan. Trails range from easy walks to challenging hikes, allowing visitors to immerse themselves in the natural beauty of the reserve. Popular trails include the Dana Village Trail, Wadi Dana Trail, and the challenging Feynan Trail, which takes you deep into the reserve’s heart. You can choose to hike self-guided or with a group. We spent our first day doing a hike near our lodge which showed us incredible terrain and views of impressive, expansive landscapes.

Hiking Trails

Bird Watching

With nearly 200 bird species recorded, Dana Biosphere Reserve is a paradise for bird watchers. The reserve’s diverse habitats attract a wide variety of birds, making it an excellent spot for both amateur and professional ornithologists.

Cultural Heritage

The area also has a rich cultural history. Inhabited for around 6,000 years, visitors can explore ancient ruins, traditional Bedouin communities and historical sites. Dana Village, with its restored Ottoman-era houses, offers a glimpse into the region’s past and present.

Traditional meal with everyone at the camp

Enjoy the Peace!

My favourite thing about Dana Biosphere Reserve was just sitting and enjoying the quiet amongst the incredible scenery. We met so many incredible people at our accomodation and it was great to share travel stories together. However, I loved being able to sit with a book in front of incredible nature with complete silence. Such a change from my normal busy life in central London. We also had amazing sunsets to enjoy and we all gathered round together to watch in awe at the sky’s colours. I recommend getting up early to enjoy the sunrise too…again, very peaceful!

Eco-Tourism and Sustainability

The Dana Biosphere Reserve is also well known for its sustainable tourism and conservation. The Royal Society for the Conservation of Nature (RSCN) manages the area, focusing on eco-friendly practices that benefit both the environment and local communities. Staying at eco-lodges like the Feynan Ecolodge supports these initiatives and provides a unique and responsible travel experience.

Our Accomodation for the Night

FAQs

When’s the best time to visit the Dana Biosphere Reserve?

You can visit year-round, but the best times are during the spring (March to May) and autumn (September to November) when the temperatures are mild and the landscapes are at their most vibrant. We were there in September and the temperature was perfect!

Do I need a guide to explore the reserve?

While it’s possible to explore the reserve on your own, it’s highly recommended to hire a local guide, especially if you plan on hiking in the more remote areas. Guides can provide valuable insights into the reserve’s flora and fauna, as well as ensure your safety. If you’re thinking of doing a complicated hike or going very much off-the-beaten-path, I’d recommend looking into guides or tour groups.

What should I pack for a visit to the Dana Biosphere Reserve?

Depending on what you’re choosing to do here, be sure to pack good hiking or walking shoes. We had running trainers which were sufficient, but this isn’t an area to be wearing flip flops or flimsy shoes. Given how open the area is you’ll also need to be mindful of wearing enough sun protection and having good hydration with you. I liked using hydration tablets to add to my bottled water each day. Also bring a camera to capture the stunning landscapes and sunsets/sunrises…although, note the pictures will never do the actual scenery justice! I would also recommend bringing a few layers, as it got chilly early in the morning and evening.

The Dana Biosphere Reserve is a true gem that offers a unique and unforgettable experience. It felt off-the-beaten track and unexplored compared to other places in Jordan, so definitely one to consider if you’re looking to do something a little different. With its diverse landscapes, rich cultural heritage, and sustainable tourism initiatives, this reserve is a must-visit destination for anyone travelling around Jordan.

Check out my other guides for Jordan, including Petra, Wadi Rum and the Dead Sea.

Other Guides for Jordan

The Complete Guide to Wadi Rum, Jordan

Wadi Rum – or Valley of the Moon – is an unbelievably stunning desert wilderness in southern Jordan. Covering 720 km2, …
wadi rum jeep

The Ultimate Guide to Travelling in Jordan

Jordan is a land rich in history, culture, and natural beauty, and probably one of the most spectacular places on …
visiting ancient city of petra in jordan

Visiting the Ancient City of Petra Jordan

The ancient Jordanian city of Petra is located in the southwestern part of the country, 150 miles south from the …
dana biosphere reserve

A Guide to Dana Biosphere Reserve

Dana Biosphere Reserve is Jordan’s largest nature reserve, covering an impressive 320 square kilometres of diverse landscapes and habitats. During …
dead sea jordan guide

Visiting the Dead Sea in Jordan

The Dead Sea, a unique natural wonder, attracts visitors from all over the world. Known for its high salinity and …

The post A Guide to Dana Biosphere Reserve appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/asia/jordan/dana-biosphere-reserve/feed/ 0