__( '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?.(); Best Portugal Travel Guide | Char's Footsteps https://www.charsfootsteps.com/travel/europe/portugal/ Best Female Travel Blogs 2024 Tue, 08 Jul 2025 17:57:29 +0000 en-US hourly 1 Where to Stay in Lisbon https://www.charsfootsteps.com/travel/europe/portugal/where-to-stay-in-lisbon/?utm_source=rss&utm_medium=rss&utm_campaign=where-to-stay-in-lisbon https://www.charsfootsteps.com/travel/europe/portugal/where-to-stay-in-lisbon/#respond Mon, 16 Sep 2024 07:55:00 +0000 https://www.charsfootsteps.com/?p=3751 Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay in Lisbon depends on your budget, preferred activities and proximity to attractions. Each neighbourhood offers a unique perspective of the city, but with Lisbon’s efficient transport system, you can easily explore multiple areas. I’ve put […]

The post Where to Stay in Lisbon appeared first on Char's Footsteps.

]]>
Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay in Lisbon depends on your budget, preferred activities and proximity to attractions. Each neighbourhood offers a unique perspective of the city, but with Lisbon’s efficient transport system, you can easily explore multiple areas. I’ve put this list together to highlight some of the best places to stay in Lisbon.

Baixa

Baixa is Lisbon’s downtown area and serves as the central hub for tourists. Known for its grand plazas, neoclassical architecture, and wide pedestrian streets, Baixa is a bustling area filled with shops, restaurants, and historic landmarks. It’s the perfect place to stay if you want to be in the middle of the action.

Key features:

  • Landmarks: Rua Augusta, Rossio Square, and the Santa Justa Lift.
  • Accommodation options: A mix of mid-range hotels, boutique guesthouses, and serviced apartments.
  • Ambience: Bustling and lively, with a strong tourist presence.

Pros of Staying in Baixa:

The main pro of staying in Baixa is its central location. You’ll be within walking distance of some of Lisbon’s most famous landmarks, like Rua Augusta, Rossio Square, and the Santa Justa Lift. Public transport is easily accessible, with metro stations and trams nearby. The area is also packed with restaurants, cafés, and shops, making it a convenient base for exploring the city.

Cons of Staying in Baixa:

I would say the biggest downside to staying in Baixa is that it can be very crowded, especially during peak tourist season. This can lead to higher accommodation prices and a less peaceful experience compared to other neighbourhoods. It’s also not the best choice for nightlife, as the area tends to quieten down in the evenings compared to districts like Bairro Alto.

Lisbon Tram 28

Alfama

Alfama is Lisbon’s oldest district, known for its winding, narrow streets and rich historical atmosphere. It’s the perfect spot for those who want to immerse themselves in the city’s authentic local culture. From traditional fado music echoing through the alleys to stunning views from São Jorge Castle, Alfama offers a deeply historical experience.

Key features:

  • Landmarks: São Jorge Castle, Lisbon Cathedral, and the National Pantheon.
  • Accommodation options: Primarily small guesthouses and short-term rentals.
  • Ambience: Quiet, traditional, and steeped in history.

Pros of Staying in Alfama:

The main pro of staying in Alfama is its authentic charm and historical significance. You’ll be surrounded by traditional architecture, and major attractions like São Jorge Castle are just a short walk away. The area has a truly local atmosphere, making it ideal for travellers who want to experience the “real” Lisbon.

Cons of Staying in Alfama:

Alfama’s hilly streets can be challenging for some visitors, especially those not used to navigating steep, uneven terrain. Additionally, public transport options are more limited here compared to other districts, although trams and buses are available.

Bairro Alto

Bairro Alto is known for its vibrant nightlife and is one of Lisbon’s main areas for bars and restaurants. During the day, it’s relatively quiet, but the area comes alive in the evening. This area is popular for young travellers and backpackers, so you’ll find lots of hostels and cheaper accommodation here, amongst more expensive options. The legendary Tram 28 can found be found here, along with several other transport routes.

Key features:

  • Nightlife hub: Bars, clubs, and restaurants open until late.
  • Accommodation options: Budget hostels, guesthouses, and a few boutique hotels.
  • Access to public transport: Tram 28 and nearby metro stations provide easy connectivity.

Pros of Staying in Barrio Alto:

The main pro of staying in Barrio Alto is for the vibrant nightlife and diverse dining options! You’ll be spoilt for choice for going out options and for the shopping.

Cons of Staying in Barrio Alto

The main issue i’ve found when staying in Barrio Alto is it can be noisy at night. This might seem obvious, given it’s a nightlife hub. However, I found the few airbnbs I stayed in had really thin walls, barely keeping out the street noise. The noise was definitely worse Thursday-Saturday nights. I also found the accommodation can be more basic here than in other areas.

Chiado

Chiado is an elegant and sophisticated neighbourhood in Lisbon, known for its high-end shopping, theatres, and historic literary cafés. It’s a great place to stay for travellers who enjoy a more polished, upscale experience.

Key features:

  • Landmarks: Theatres, museums, and historic cafés like A Brasileira.
  • Accommodation options: Upscale hotels, boutique guesthouses, and serviced apartments.
  • Ambience: Elegant, with a mix of locals and tourists.

Pros of Staying in Chiado:

The main pro of staying in Chiado is its sophisticated atmosphere. You’ll have access to excellent restaurants, cultural venues like theatres, and high-end shopping streets. It’s centrally located, making it easy to explore Lisbon’s most iconic areas.

Cons of Staying in Chiado:

Chiado can be more expensive than other districts in Lisbon, particularly in terms of accommodation and dining. It also tends to get quite busy during peak tourist seasons, which can detract from its otherwise serene vibe.

Avenidas Novas

Avenidas Novas is a modern, upper-middle-class district known for its wide boulevards, modern architecture, and business centres. It’s a great area for those who prefer a more contemporary side of Lisbon, with easy access to shopping, dining, and transportation.

Key features:

  • Landmarks: Gulbenkian Museum, Eduardo VII Park, and El Corte Inglés shopping centre.
  • Accommodation options: Modern hotels, serviced apartments, and upscale rentals.
  • Ambience: Modern, spacious, and business-focused.

Pros of Staying in Avenidas Novas:

The area offers modern amenities and plenty of shopping opportunities, such as El Corte Inglés. It’s also well-connected to other parts of Lisbon via metro and bus routes, making it convenient for getting around. The neighbourhood’s wide streets and modern buildings provide a clean, spacious feel.

Cons of Staying in Avenidas Novas:

While Avenidas Novas is convenient and modern, it lacks the historic charm found in Lisbon’s older neighbourhoods like Alfama or Bairro Alto. If you’re looking for a more traditional Lisbon experience, this may not be the best area for you.

Belém

Belém is located west of Lisbon’s city centre, along the Tagus River, and is known for its maritime history and stunning landmarks. It’s a quieter, more relaxed area compared to the bustling downtown neighbourhoods, but still filled with historical significance.

Key features:

  • Famous landmarks: Belém Tower, Jerónimos Monastery, and the Monument to the Discoveries.
  • Accommodation options: Primarily higher-end hotels.
  • Ambience: Quieter than central Lisbon, with large green spaces and riverside views.

Pros of Staying in Belém:

Belém is ideal for visitors interested in Lisbon’s maritime history and major landmarks. It’s home to attractions like the Jerónimos Monastery and Belém Tower, with a peaceful riverside setting. The area is also famous for the iconic pastéis de nata from the original Pastéis de Belém bakery.

Cons of Staying in Belém:

The main con of staying in Belém is its distance from the city centre. While it’s easy to get into town by tram or train, it does take more time. The nightlife here is also quite limited compared to more central districts.

Príncipe Real

Príncipe Real is one of Lisbon’s most fashionable districts, known for its gardens, antique shops, and upscale dining options. It’s a great place to stay for those looking for a trendy yet peaceful neighbourhood. This would be ideal for travellers seeking a chic, residential area with plenty of upscale dining and shopping options.

Key features:

  • Landmarks: Jardim do Príncipe Real, antique shops, and art galleries.
  • Accommodation options: Luxury hotels, boutique guesthouses, and serviced apartments.
  • Ambience: Upscale and trendy, with a mix of locals and visitors.

Pros of Staying in Príncipe Real

The biggest pro of staying in Príncipe Real is the area’s stylish, upscale vibe. It’s quieter than central areas, with plenty of green spaces, trendy bars, and boutique shops. The neighbourhood feels both elegant and local, with a charming, laid-back atmosphere.

Cons of Staying in Príncipe Real

Accommodation in Príncipe Real tends to be more expensive due to its high-end appeal. Public transport options are also somewhat limited, so you may need to rely on walking or taxis to get around.

Parque das Nações

Parque das Nações is Lisbon’s most modern district, developed for the 1998 World Expo. It’s located near the airport and offers a completely different vibe from Lisbon’s older, historical neighbourhoods. This area is ideal for families, those seeking modern amenities and easy airport access.

Key features:

  • Modern amenities: Vasco da Gama shopping centre, Lisbon Oceanarium, and cable cars.
  • Accommodation options: Mid- to high-end hotels and serviced apartments.
  • Family-friendly: With its modern infrastructure, it’s suitable for families with children.

Pros of Staying in Parque das Nações:

The modern infrastructure is the main pro of staying in Parque das Nações. You’ll find family-friendly attractions, like the Lisbon Oceanarium, along with shopping centres and cable cars. It’s also conveniently located for those who need easy access to the airport.

Cons of Staying in Parque das Nações:

The area lacks the traditional charm and history that other districts like Alfama or Bairro Alto offer. If you’re after an authentic Lisbon experience, this may not be the best option.

Campo do Ourique

Campo do Ourique is a middle- to upper-class residential neighbourhood, known for its relaxed atmosphere and local charm. It’s slightly outside the tourist-heavy areas, making it ideal for those who want a more authentic Lisbon experience while still being close to the city centre. I would say this is the perfect place to stay if you want a more relaxed, residential area with a more local feel.

Key features:

  • Landmarks: Amoreiras Shopping Centre, Mercado de Campo de Ourique, and Jardim da Parada.
  • Accommodation options: Primarily short-term rentals, boutique guesthouses, and mid-range hotels.
  • Ambience: Quiet, with a strong local and family-friendly atmosphere.

Pros of Staying in Campo do Ourique:

The main pro of staying in Campo do Ourique is its quiet, residential vibe. You’ll enjoy a more local feel, with plenty of parks, bakeries, and traditional markets like the Mercado de Campo de Ourique. It’s also near the Amoreiras Shopping Centre, offering easy access to shopping.

Cons of Staying in Campo do Ourique:

The downside is that it’s a bit further from the main tourist attractions, meaning you’ll likely need to rely on public transport or taxis to get around. However, Lisbon’s transport system is efficient, so this shouldn’t be a major issue.

Other Areas to Stay Nearby Lisbon

If it’s your first time visiting Portugal, or its capital, I would recommend staying in Lisbon itself. However, there are a few other notable places to consider staying that are nearby Lisbon.

Cascais

Although not in Lisbon, Cascais is a popular coastal town located just 30 minutes away by train. This coastal escape is best known for its beaches and more relaxed pace of life. Cascais is a popular spot for those looking to combine a city break with a beach holiday. It’s an excellent option for travellers who want to stay near the coast while having easy access to Lisbon.

Key features:

  • Beaches: Praia da Rainha and Praia de Carcavelos.
  • Accommodation options: Primarily resort hotels and holiday rentals.
  • Transport: A direct train service connects Cascais to Lisbon’s Cais do Sodré station.

Pros of Staying in Cascais::

The main pro of staying in Cascais is its beachside location. You’ll have access to stunning beaches like Praia da Rainha and Praia de Carcavelos, making it perfect for sunbathing and watersports. Cascais also offers a laid-back vibe with plenty of seafood restaurants, cafés, and scenic spots to enjoy, all while being a short train ride away from Lisbon.

Cons of Staying in Cascais:

  • Staying here requires commuting to Lisbon. Although this is easy to do, via driving or public transport, it might get tedious if you’re planning to do multiple trips into Lisbon.
  • Cascais can get crowded in summer!

Sintra

Like Cascais, Sintra isn’t located in Lisbon itself, but it does make for a great place to stay and visit Lisbon for day trips. Sintra is a historic town in the mountains, about 30km northwest of Lisbon. This could be a good option for those wanting to primarily explore Sintra during their time in Portugal. Then do a day trip to Lisbon. There’s a number of things to do in Sintra – you could easily spend a few days here exploring all the incredible castles, palaces, ruins, and hikes! Although the days can get crowded, the evenings are often less crowded.

Key features:

  • Landmarks: Pena Palace, Quinta da Regaleira, and Moorish Castle.
  • Accommodation options: Charming guesthouses, boutique hotels, and historic estates.
  • Ambience: Romantic, historical, and surrounded by nature.

Pros of Staying in Sintra:

The main pro of staying in Sintra is the abundance of palaces, castles, and hiking trails right on your doorstep. You can easily spend a few days exploring iconic sites like the Pena Palace, Quinta da Regaleira, and Moorish Castle. The cooler climate and scenic surroundings also provide a welcome break from the summer heat of Lisbon.

Cons of Staying in Sintra:

The biggest con is that it’s a bit further from Lisbon, meaning you’ll need to commute if you’re planning to visit the capital frequently. While public transport is available, the commute can feel long if you’re doing it often. Therefore, I would only recommend this option if you’re planning on doing a day trip to Lisbon from Sintra. Additionally, Sintra gets crowded during the day with tourists, though it tends to quiet down in the evenings.

How to Choose Where to Stay in Lisbon

Lisbon offers a range of diverse neighbourhoods for you to enjoy during you stay. Choosing where to stay in Lisbon will largely depend on what you’re planning to do, budget and your travel style. A solo backpacker will have different needs to a honeymoon couple or a family. Baixa and Chiado are best for those who want central access, while Alfama and Belém offer a quieter, more historic feel. Bairro Alto, my personal favourite, caters to those interested in nightlife, while Parque das Nações is family-friendly and modern. Finally, Cascais provides a coastal retreat near the city. There are so many incredible places to stay in Lisbon, with all sorts of accommodation types. From cheap backpacker hostels, to luxury, boutique hotels, there’s something to suit all budgets and travel styles.

I will add that Lisbon is easy to travel around, meaning it doesn’t matter too much where you stay. You’ll be able to visit the neighbouring districts, and notable areas, easily!! Check out my other guides on how to get from Lisbon to Porto and Porto Itinerary.

Portugal Blogs

where to stay in lisbon

Where to Stay in Lisbon

Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay …
porto city break

Porto City Break – Best Way to Spend a Weekend!

The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned …

The Ultimate Travel Guide to Sintra

Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural …

Best Things To Do In Cascais – Day Trips from Lisbon

Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now …
Porto Sao bento station

How to travel between Porto and Lisbon – Bus, Train and Car

Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres …

The Best Wine Regions in Portugal

Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next …

The post Where to Stay in Lisbon appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/europe/portugal/where-to-stay-in-lisbon/feed/ 0
Porto City Break – Best Way to Spend a Weekend! https://www.charsfootsteps.com/travel/europe/portugal/porto-city-break/?utm_source=rss&utm_medium=rss&utm_campaign=porto-city-break https://www.charsfootsteps.com/travel/europe/portugal/porto-city-break/#respond Thu, 16 May 2024 11:01:23 +0000 https://www.charsfootsteps.com/?p=2856 The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned for its historic city centre, Port wine production, and stunning riviera, Porto was the perfect city for a weekend break from London. Over the course of 3 days, I ambled through the city’s winding, hilly […]

The post Porto City Break – Best Way to Spend a Weekend! appeared first on Char's Footsteps.

]]>
The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned for its historic city centre, Port wine production, and stunning riviera, Porto was the perfect city for a weekend break from London. Over the course of 3 days, I ambled through the city’s winding, hilly streets, sampled LOTS of local food and wine and discovered classic Portuguese architectural gems. I’ve put together this blog to show how I spent 3 days in Porto and to provide inspiration for anyone planning a long weekend in Portugal.

Day 1: Exploring Porto’s Historic Center

After waking up in Porto, I decided to spend my first day exploring Porto’s old town and Ribeira District. This is Porto’s oldest, and probably most photogenic neighbourhood, with narrow cobblestone streets

This started with a coffee and walk along the Douro River – Nata Sweet Nata hvae Pastel de Natas to die for! This whole area was beautiful with a lively atmosphere! I’ve always been a big fan of walking tours, so I signed up to the Porto Walkers 10:45am free walking tour.

Porto Walking Tour

The walking tour started at Avenida dos Aliados, one of the main avenues in Porto and home to lots of stunning, historical buildings. From here, we embarked on a 3 hour walking tour of the key sites, including São Bento railway station, Santa Catarina, Batalha, Bridge Luis I, Porto Cathedral / Sé de Porto, Barredo neighbourhood, Ribeira quarter. It ended at the Ribeira Quarter.

It was a great way to meet other people, see a city’s highlights and get insider tips! Be sure to wear comfortable walking shoes. You’ll be walking around 3-4km and much of Porto is hilly and cobblestoned. Also be sure to bring water with you – it was very warm when I went. Although this is free, it’s strongly recommended to give the tour guide a tip!

street art in Porto

I enjoyed the tour so much and met some lovely people, so a group of us signed up for the afternoon Port Wine Tasting Tour.

Port Wine Tasting Tour

After having a quick lunch with some girls I met from the tour, we made our way to the Port Wine Tasting meeting point. The tour takes you across the famous Dom Luís I Bridge to Vila Nova de Gaia – the ‘World of Wine Porto’. This area is famous for its museums, restaurants and cellar bars detailing Porto’s port wine industry and history. We spent the next 4 hours visiting 3 wine lodges and trying 7 different Port wines. Each location was different from the other – including a real working wine cellar, a small producer and a wine tasting workshop.

port wine tour in Gaia
Port Wine Cellar we got to visit on our tour

It was fascinating to learn about the history of Port wine production, experience different establishments and sample a variety of wines. To learn a little more about the wines of Portugal.

Day 2: Discovering Porto’s Cultural Gems

After a long day of walking on day one, I decided to have an easier second day. Both tours on the previous day provided me with some inspiration on what I wanted to explore in more depth. After a hearty breakfast, I made my way to the waterfront to start my day with the Elevador da Ribeira.

Elevador da Ribeira

Like Lisbon, Porto has an elevator in the heart of the city that provides excellent scenic views across the city. I went in the morning, but heard people recommend that late afternoon was better to catch the sunset. It’s completely free and you’ll be able to enjoy great views of the Douro, Dom Luis Bridge and the wider city.

Clerigos Tower

Climb the iconic Clérigos Tower for panoramic views of Porto. Marvel at the cityscape from the top of this Baroque bell tower, which offers a breathtaking vantage point. I paid for the guided tour to the Clérigos Museum, Church and Tower for just under €10. At 76 metres tall, with over 200 steps, it’s a narrow, steep climb. I’m not great with heights but luckily it was quite quiet when I went, so I could get up and down fairly easily. There are evening tours too if that’s of interest.

Tour Livraria Lello

One of my favourite places to explore was the book-lovers haven of Livraria Lello. Known as one of the most beautiful bookshops in the world, the neo-Gothic facade, stunning interiors and famous grand staircase are worth a visit. Supposedly, Livraria Lello help provide some inspiration for the Harry Potter books too! It was a lovely place to experience but i’d say it was way too crowded. The main attraction is the stunning staircase, but I could barely get on it with the hoards of people trying to take selfies on it.

Livraria Lello

I went back again near closing time and it was much quieter. You will need to buy a ticket to enter Livraria Lello, however this is fully discountable against any book purchase! Tickets start at €8.

I spent a large portion of my second day sat in various eateries between sightseeing, people watching and enjoying the incredible food. The city has a nice pace about it that lets you just relax and watch the world go by.

Day 3: Day Trip to Douro Valley

If you’re staying for a third day in Porto, consider doing one of the many day trips to the Douro Valley on offer. This UNESCO World Heritage Site is renowned for its terraced vineyards and stunning landscapes. You can do this trip via train or join a guided tour.

River Cruise Along the Douro

Some guided tours with take you on a river cruise along the Douro River, the perfect way to escape the hustle and bustle of the city and get immersed in Portugal’s stunning countryside. You’ll cruise past terraced vineyards, quaint villages, and historic wine estates, learning about the region’s winemaking traditions along the way.

Visit a Winery in Douro Valley

No trip to the Douro Valley would be complete without visiting one of the many wineries. One of the most famous, that we got to see, is Quinta do Crasto. Here you can tour the vineyards, learn about the winemaking process, and indulge in a tasting of their award-winning ports and wines, all while soaking in panoramic views of the valley.

porto wine tasting tour

Explore Peso da Régua or Pinhão

Before heading back to Porto, you might get the chance to explore some of the cute towns in the vicinity. One town is Peso da Régua, the heart of the Douro wine region. You can stroll along the riverfront promenade, browse local markets selling artisanal products, and sample more delicious wines at one of the many wine bars dotting the town.

Or consider taking some time to explore the charming village of Pinhão, known for its historic railway station adorned with azulejo tiles and its picturesque riverside setting

Mercado do Bolhão

Porto’s iconic market, Mercado do Bolhão, is located in the heart of the city and was recently completely renovated. Unfortunately it was completed and open a year after I was there, so this is a great reason for me to go back. Filled with stalls of fish, meat, fresh produce, flowers, the market is meant to be a brilliant place to visit. Check out their official site to hear about events coming up – from beer fairs to Fado!

Porto FAQs

Is Porto a Walkable City?

Absolutely! Porto is a very walkable city and I didn’t need to use public transport during my time in the city. Although it is hilly, the beautiful cobblestoned streets, lined with stunning historic buildings were worth walking through. Also many of the main sights are located near each other, so you can easily pick a part of town and just walk round that area.

porto funicular

There is a funicular and bubble cars that connect the main parts of Porto and you’ll easily be able to grab an Uber.

How Many Days in Porto?

Ideally 2 or 3 nights is a great amount of time to enjoy the main sights of Porto, without rushing. This will also afford you some time to enjoy the many eateries, bars and wineries at a relaxed pace and watch the world go by.

What is the Best Month to Visit Porto?

The best time to visit Porto will be between March and October for the sunny months. However, spring and autumn will be a great time to visit to avoid the peak crowds. I went to Porto in March and it was quieter with brilliant weather.

After a fantastic long weekend in Porto, I took the train from Porto to Lisbon to continue my Portugal travels. Some highlights from this Portugal trip included first-time visits to Sintra and Cascais.

Find More Portugal Guides

where to stay in lisbon

Where to Stay in Lisbon

Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay …
porto city break

Porto City Break – Best Way to Spend a Weekend!

The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned …

The Ultimate Travel Guide to Sintra

Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural …

Best Things To Do In Cascais – Day Trips from Lisbon

Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now …
Porto Sao bento station

How to travel between Porto and Lisbon – Bus, Train and Car

Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres …

The Best Wine Regions in Portugal

Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next …

The post Porto City Break – Best Way to Spend a Weekend! appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/europe/portugal/porto-city-break/feed/ 0
The Ultimate Travel Guide to Sintra https://www.charsfootsteps.com/travel/europe/portugal/guide-to-sintra/?utm_source=rss&utm_medium=rss&utm_campaign=guide-to-sintra https://www.charsfootsteps.com/travel/europe/portugal/guide-to-sintra/#respond Sun, 15 Oct 2023 06:33:03 +0000 https://www.charsfootsteps.com/?p=920 Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural Landscape clarification in 1995, the town of Sintra and its surrounding areas are bursting with things to do and is a must when visiting Portugal. Given its close proximity to Lisbon and Cascais, it is […]

The post The Ultimate Travel Guide to Sintra appeared first on Char's Footsteps.

]]>
Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural Landscape clarification in 1995, the town of Sintra and its surrounding areas are bursting with things to do and is a must when visiting Portugal. Given its close proximity to Lisbon and Cascais, it is feasible to visit Sintra as a day trip. However, I’d highly recommend spending at least two days in Sintra to have enough time to properly see everything.

Things to Do in Sintra

There are plenty of things to do in Sintra. I would strongly suggest you plan out exactly what you want to see ahead of your journey, to make choosing bus routes there much easier.

Park and National Palace of Pena

Probably one of the most recognisable images of Portugal, the Pena Palace is even more breathtaking in person. This colourful fairytale palace is situated at the top of Sintra Mountains, giving you expansive views of the village below, and its surrounding areas. The exterior of Pena Palace is a combination of colourful pinks, blues and yellows, which contrast beautifully against the surrounding forests. Once inside the Palace, walk up the stairs and join the walkway that surrounds the Palace. This will not only give you an up-close look at the architecture of Pena Palace but you’ll be treated to some breathtaking, panoramic views of Sintra and its countryside. This was a highlight of my day and something not to miss!

pena palace sintra

Pena Palace Tickets

You can buy tickets to enter Pena Palace online, saving you time on queues and 5% off entry fee. However, you’ll need to know the date and time you’re planning to go. I found easier to buy my ticket once I have arrived at the Palace and the queues weren’t too bad. Tickets for the National Palace of Pena cost €14 adult and can be found at the Palace’s main entrance.

Once through the main entrance, you’ll walk through Park of Pena until you reach the Pena Palace entrance. It’s a 15 minute uphill walk or you can pay for the bus that goes up. As you walk up you’ll be greeted by the colourful palace

Pena Palace Map

As you can see from the map of Pena Palace, it’s a pretty big area that could easily take a day to cover. I only managed the Palace and the High Cross.

Quinta da Regaleria

Quinta da Regaleria, or Palace of the Monteiro Millionaire, is a 20th Century Palace that’s famously known for its architectural features, labyrinth network of underground tunnels and initiation wells. Nestled within the hills of Sintra, this neo-Manueline style mansion is rich in symbolic details and sits amongst luscious gardens. The most famous party of Quinta de Regaleria is probably the wells or ‘inverted towers’. These moss-covered, spiralling wells have become a famous image of Sintra and are a key stopping point in Sintra for visitors. Aside from the wells, I really enjoyed hearing a bit about the mysterious history of the Palace and the different theories behind its original purpose. Definitely a must-do whilst in Sintra! With Quinta da Regaleria, you can actually walk from Sintra’s town centre for about 15 minutes to reach the Palace.

Castelo dos Mouros

Castelo dos Mouros, or Castle of the Moors, is a hilltop medieval castle that’s part of the Sintra Cultural Landscape and a UNESCO World Heritage Site. These 8th Century ruins will give you sweeping, panoramic views over Sintra’s forests, the National Palace and beyond. The remnants of the Castle is well preserved, with many walls and towers still in place, allowing you to take a step back in time. As with most sights in Sintra, I’d recommend visiting the Castle; taking the time to explore the ruins and learn about the history of this medieval fortress.

For Castelo dos Mouros, you need to follow the same bus route as Pena Palace by taking the 434 bus and walking from there. It’s a short walk from the bus stop.

Monserrate Palace

Founded in the 19th century, the Palace of Monserrate was originally a summer holiday home for the Portuguese Court. Nowadays it’s better known as an architectural masterpiece that’s surrounded by an exceptional garden. Its architecture is unique as it blends Indian, Gothic, Moorish, and Islamic influences to create this fairy tale palace that is often seen as a symbol of the Romanticism movement.

The Monserrate Palace, and its gardens, are estimated to take 1-2 hours to explore properly. The palace itself is worth visiting to see the stunning interior, stained glass windows and decorative tiles. However, if you’re short on time, opt for walking around the botanical garden that surrounds the palace. Home to an extensive collection of plants from around the world, the gardens provide a tranquil escape. As one of the least visited sights in the region, you won’t need to contend with the masses or queues.

The Monserrate Palace is roughly 4km away from the Historic Centre and can be accessed on the 435 bus route. I would say if you’re trying to visit all these sights in a day, it can make for a rushed experience…what was supposed to be a gentle walk through the gardens, ended up being me sprinting through trying to see everything quickly. This is why I’d highly recommend having a few days in Sintra, to visit everything in a relaxed manner.

Powered by GetYourGuide

Sintra Historic Centre

One of my favourite things to do in Sintra was to wander around the Historic Centre. Lined with winding cobbled streets, quaint shops, and unique architecture, Sintra’s Historic Centre is worth exploring. You can easily spend a few hours getting lost in the colourful side streets, enjoying outdoor eateries, and sampling the many gelaterias around the village.

A few things to see in Sintra’s Historic Center include;

  • The welcome centre (great guides here providing tailored information)
  • NewsMuseum – a museum of journalism and media
  • The Sintra National Palace
  • Palácio Valenças – a 15th-century former royal palace with tours available.
  • Jardim do Bico – a children’s playground
  • All the gelato!!!

Sintra National Palace

The National Palace of Sintra is located within the Historic Centre and is one of the best-preserved medieval royal palaces. The Palace contains the largest set of Mudéjar tiles, multicultural artifacts and decorate art from the 16-18th Century. You’ll be The National Palace is a great opportunity to get a deeper understanding of Portugal’s rich history. Entry to the National Palace will cost you €10/€8.5/€33 (adult/child & seniors/family) but you can buy your ticket as a combi deal with the other attractions.

Beaches in Sintra

There are surprisingly many beaches in Sintra to take advantage of. An easy one to get to from Sintra is Praia Grande. Stretching over 2km, Praia Grande is a sandy beach known for its surfing, dinosaur footprints, and Europe’s largest seawater swimming pool. It’s fairly straightforward to get to from Sintra. Catch the train from Sintra to Portela de Sintra station, and grab the 439 or 441 bus. Services are less regular during the off-peak season (September to May) so plan ahead.

Here is a guide looking at the many beaches of Sintra

Sintra-Cascais Natural Park

The Sintra-Cascais Natural Park covers 145km² and is one of 13 Natural Parks in Portugal. Located just outside of Sintra, it’s easily accessible by public bus (1254 bus), car or even foot – although I wouldn’t advise walking along the main roads there, as they’re very winding and narrow! It’s close to Monserrate Palace

There are a large number of hikes and trails found in the area. Walking between the sights was enough of a hike for me. But when I next go back, I’ll be planning out some hiking trips. For avid hikers, AllTrails provides detailed routes and maps to help plan your trip.

Cabo da Roca

Cabo da Roca is continental Europe’s most westernpoint and is famous for its stunning views off the Atlantic Ocean and coastline. There’s also a lighthouse and monument you can check out here too. This is one best to do if you’re renting a car! Here’s a more detailed post on Cabo da Roca and the best things to do there. If you’re looking to visit Cabo da Roca by public transport, there is a 403 bus from Sintra to Cascais and then another bus from there to Cabo da Roca. I wasn’t able to fit this in with my schedule but it’s on my list for next time.

How Long to Spend in Sintra?

You can easily see the key sights of Sintra in a day. However, if you have the time, I’d highly suggest staying in the Historic Center for a few days. There are plenty of hotels in Sintra and you’ll be given a head start to the day from the crowds coming from Lisbon. In addition, you’ll be able to explore everything this region has to offer, and in good time. If you’re very short on time, I’d recommend Pena Palace as a must-do, which can be done in a morning/afternoon trip.

How to Get to Sintra from Lisbon?

Sintra is only 30km from Lisbon, making it a very easy day trip. There are several ways to get to Sintra from Lisbon:

The best way is to catch a 40-minute train from Rossio Station in Lisbon’s center. Be sure to get to the station early as the queues were crazy! I went on a weekday in March and the queues for the ticket office and booths were through the door. I can’t imagine what it’d be like during peak tourist season. After the ticket debacle, the train was very straightforward. The direct journey will take you to Sintra Station, where you have a number of travel options to take you to the various destinations this incredible town has to offer. The train costs €2.30, or free with the Lisboa card. Alternatively, if you’re staying further out of Lisbon’s centre, you can get the train direct from Oriente station.

There is also a bus that goes to Sintra station from Marques de Pombal in Lisbon. It’ll cost you €10/€15 for a single/return journey. Finally, you can drive from Lisbon to Sintra. However, be warned that it gets congested during peak times, Sintra’s historic town center isn’t car-friendly and there is limited parking.

How to Travel Around Sintra?

Getting around Sintra is fairly straightforward, but is made easier by planning your route ahead of time. The main way to travel between the sights is by bus. As the roads are narrow and winding, all bus routes are one-way loops that start in Sintra town centre. Because of this, it’s important to plan which sights you want to see and in what order. This will determine which bus loop you will need to take, with bus 434 and 435 being the two main loops. I would strongly recommend planning this ahead of time, so you’re not like me, panicking at the station as all the buses arrived.

Sintra Buses

  • Bus 434: Sintra town center to several major attractions – Pena Palace, the Moorish Castle, and Quinta da Regaleira.
  • Bus 435: Sintra town center to various attractions, including Monserrate Palace and Seteais Palace.
  • Bus 403: Sintra to Cascais. From here you can catch buses to other destinations like Cabo da Roca.
  • Bus 417: Sintra train station to Praia Grande and Azenhas do Mar on the coast.
    Bus Stops: Pay attention to the names of the bus stops or landmarks along the route to ensure you don’t miss your destination.

Be sure to check out the names of the bus stop or landmarks along the route so you don’t miss your destination.

Getting around Sintra by bus is an excellent way to explore the town and its numerous attractions, allowing you to efficiently visit the historical sights, palaces, and natural wonders that make Sintra such a captivating destination. However, there are also hop-on-hop-off buses, taxis, private tuk-tuks and the options of hire cars, that can all help with your visit to Sintra.

Just a note on private tuk-tuks – this might be a good option if you’re looking for something a bit different. However at €5 per journey, this more expensive option was isn’t as private as you might expect. At several places, tuk-tuk drivers came round the queue to collect more people to join the tuk-tuk. Meaning you’ll likely be sharing a small tuk-tuk with other people.

Weather in Sintra

Like most of Portugal, the weather is favourable all year round, ranging from mild winters to hot summers. However, it does get a little chilly in parts of Sintra, like the top of Pena Palace. And expect temperatures to drop as low as 6 degrees in winter. As with anywhere, check the weather before you go and dress accordingly: sun cream, layers, hat, etc.

I hope this helps anyone looking to visit Sintra. Be sure to check out my guides on Porto, Lisbon, and Cascais if you’re travelling to Portugal.

Grid

where to stay in lisbon

Where to Stay in Lisbon

Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay …
porto city break

Porto City Break – Best Way to Spend a Weekend!

The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned …

The Ultimate Travel Guide to Sintra

Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural …

Best Things To Do In Cascais – Day Trips from Lisbon

Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now …
Porto Sao bento station

How to travel between Porto and Lisbon – Bus, Train and Car

Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres …

The Best Wine Regions in Portugal

Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next …
travel guide Lisbon

Ultimate Travel Guide to Lisbon

Lisbon is one of the most vibrant and charismatic capital cities in Europe. Famous for its impressive architecture, traditional Fado …
Lisbon Tram 28

A Guide to Lisbon’s Tram 28 & Alternatives

Tram 28 has become one of the most iconic things to see whilst spending time in Lisbon. With the infamous …

The post The Ultimate Travel Guide to Sintra appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/europe/portugal/guide-to-sintra/feed/ 0
Best Things To Do In Cascais – Day Trips from Lisbon https://www.charsfootsteps.com/travel/europe/portugal/things-to-do-cascais/?utm_source=rss&utm_medium=rss&utm_campaign=things-to-do-cascais https://www.charsfootsteps.com/travel/europe/portugal/things-to-do-cascais/#respond Fri, 07 Apr 2023 05:57:53 +0000 https://www.charsfootsteps.com/?p=792 Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now a popular tourist destination, showcasing some of the best Portugal has to offer. With its lively marina, great food scene, rich history and stunning beaches, it’s the perfect place to spend the weekend or just […]

The post Best Things To Do In Cascais – Day Trips from Lisbon appeared first on Char's Footsteps.

]]>
Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now a popular tourist destination, showcasing some of the best Portugal has to offer. With its lively marina, great food scene, rich history and stunning beaches, it’s the perfect place to spend the weekend or just a day trip from Lisbon. Here are my top things to do for a day trip to Cascais.

Powered by GetYourGuide

Best Things To Do In Cascais

Cascais is a very walkable town so most places are easily accessible on foot. As everything is close to each other, I’d suggest mapping out a route with everything you want to see and loop round the city.

Boca do Inferno

Boca do Inferno, otherwise known as Hell’s Mouth, is a sea arch formed in the cliffs just west of Cascais center. It was originally a sea cave, but the force of the Atlantic Ocean caused it to collapse, leaving behind a chasm and sea arch. Depending on when you go, you’ll see the dramatic scene of crash waves through the arch. I visited during the day, but have heard the sunsets are magical! There is a viewing platform, which is free to enter, but this is open weather-permitted. I found I got a better view of Boca do Inferno by walking further up the street and avoid the viewing platform altogether.

boca do inferno cascais

It took roughly 25 minutes to walk there from the town center. However, there is a bike path alongside it, so consider renting a bicycle as an alternative route.

Cascais Old Town

One of my favourite things to do in Cascais was to stroll around the old town, getting lost down all the winding side streets. The architecture here is your stunning classic, colourful buildings found throughout Portuguese towns. Although it’s less hectic than Lisbon, Cascais still has that lively vibe with people eating and drinking along the streets.

There’s something for everyone here, from tourist-shops selling knick knacks to high-end boutiques.

cascais old town

Cascais Marina

Marina de Cascais is the third largest marina in Portugal and definitely worth a visit during your stay. Located just south of the Citadel, the Marina’s 600-berth keeps Lisbon’s most affluent yachts and boats. There are shops, bars, and restaurants around here to enjoy while you take in the incredible ocean view. These are on the more expensive side compared to the shops and restaurants further into town. I would imagine walking round here during sunset would be stunning! This whole area, and the main promenade by the beach, are really nice to walk around. There are also plenty of benches to sit and watch the world go by.

Cascais marina

The Beaches

You wouldn’t be surprised to know, that this seaside town is home to a number of spectacular beaches. Praia da Rainha is probably the most famous one – a small, sandy beach accessible by stairs. I went on a weekday in March, so had the place to myself. I can imagine it’s packed in the height of tourist season in the summer though!

cascais beach

Just further along from here, you can find another popular beach – Praia da Ribeira de Cascais. This is another small, sandy beach where you’ll be able to rent sunbeds for €30/day and enjoy the beach bars. Further along is Praia da Duquesa, a large beach with more sunbed options and activities to join. These are more spacious, so I’d imagine they’re a better option if you’re going during a busy season. All three beaches were swimming-friendly, but the water was freezing! I’ll have to try again in July. There are other beaches further along the coast, however, I didn’t have enough time to check them out.

cascais beaches

Cascais Citadel and Fortress

A trip to Cascais isn’t complete without exploring the remains of forts built in 15th and 17th centuries. The Fortress played an important role in Portugal’s history, as it defended the coastline of Cascais and River Tagus estuary. It’s very impressive to walk around and seeing the constract between it and the modern architecture.

fortress cascais

Explore Cascais on bikes

A great way to see Cascais is to rent a bike and explore the city. There are several bike rental shops in the center, offering everything from road bikes to gravel bikes. Cascais has over 400 cycling routes in the city and surrounding areas. Here is a great site to check out different routes recommended by other cyclists. And if you’re a passionate cyclist, Cascais hosts several cycling events every year, including the Ironman!

The Santa Marta Lighthouse Museum

Built in 1868, on what was once the most southern tip of Cascais, the Santa Marta Lighthouse played a crucial role in defending the coastline. Now, it’s home to a museum showcasing the lighthouse of Santa Marta throughout time and the history of lighthouses in Portugal. Even if you decide not to visit the museum, its worth walking around the area and admiring the lighthouse.

cascais lighthouse

Entry to the Santa Marta Lighthouse Musuem costs €5 and is open Wednesday-Sunday.

The Food

Cascais has an unbelievable amount of restaurants, cafes, and bars given how small it is. A few streets I’d recommend wandering down to grab a bite to eat include:

  • Run Amarela / Yellow Street – a cool area with painted streets filled with bars and restaurants. Prices were a little higher here due to it being popular with tourists. Definitely worth checking out even if you don’t eat anything
  • Largo Luis de Camoes – plenty of restaurants to choose from here and down its side streets
  • Alameda Combatentes da Grande Guerra – as above, lots of choices here and on the side streets off it.
cascais restaurants and street food

Visit a Market

There are several markets dotted around Cascais. I used this TimeOut guide before my trip for ideas and ended up going to the Mercado da Vila. This huge market is located a short walk from the city center and is home to a wide selection of food – including cheese, fish, fresh produce, baked goods and meats. You’ll also find clothing, bags, jewellery, plants and gifts. It’s open every day and you can spend some serious time here. I had a lovely coffee and pastry, whilst enjoying the buzzing vibe of the market! I heard from other travelers that the Boca do Inferno market is also worth visiting too.

Museu Condes de Castro Guimaraes

The Museu Condes de Castro Guimarães boasts an impressive art collection, rare pieces of Indo-Portuguese furniture, prehistoric archaeological remains and a 25,000 book library. After visiting the musuem, you can wander round the surrounding Marechal Carmona Park, where you’ll be treated to stunning traditional tiles and a small zoo. If you’ve been to Sintra, you might notice the similarities between achitectural style! The musuem was designed by Luigi Magnini who also designed Quinta da Regaleira in Sintra!

museu condes de castro Guimaraes cascais

Other Things to Do in Cascais

As I did a day trip from Lisbon, there were a few recommendations that I didn’t have time to explore. This included Casa das Histórias Paula Rego, Cabo da Roca and Praia do Guincho. There is also a 27-hole golf course and a range of watersports available, from kayaking to paddleboarding.

Casa das Histórias Paula Rego

How to get to Cascais from Lisbon

The best way to get to Cascais from Lisbon is by train. The train runs every 20 minutes from Lisboa Cais do Sodre station and will take approximately 40 minutes. The journey follows the coastline west of Lisbon, giving you a pretty and scenic trip.

Tip: On your journey back to Lisbon, head into the Time Out Market located by the Cais do Sodre station. It’s a great place to grab something to eat or drink, with a buzzing atmosphere!

How much does it cost to get to Cascais from Lisbon

A single train ticket will cost 2.25/1.15 (adult/child) as it’s a four-zone fare. Return tickets aren’t available so be sure to buy a single on the way back. The train ride is free if you have a Lisboa card.

Alternatives are driving or taxi, which takes 40 minutes. There are also public buses, but note, the journey will take between 1-1.40 hours and it’s more expensive than the train.

With so many things to do in Cascais, you can easily spend several days here. Given my limited time in Portugal, I was only able to manage a day trip from Lisbon. I would absolutely go back in the future and stay for the whole weekend. Let me know if you make it to Cascais! Or check out my other posts on places to visit in Portugal; Porto, Lisbon and Sintra.

Related Blogs

where to stay in lisbon

Where to Stay in Lisbon

Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay …
porto city break

Porto City Break – Best Way to Spend a Weekend!

The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned …

The Ultimate Travel Guide to Sintra

Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural …

Best Things To Do In Cascais – Day Trips from Lisbon

Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now …
Porto Sao bento station

How to travel between Porto and Lisbon – Bus, Train and Car

Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres …

The Best Wine Regions in Portugal

Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next …
travel guide Lisbon

Ultimate Travel Guide to Lisbon

Lisbon is one of the most vibrant and charismatic capital cities in Europe. Famous for its impressive architecture, traditional Fado …
Lisbon Tram 28

A Guide to Lisbon’s Tram 28 & Alternatives

Tram 28 has become one of the most iconic things to see whilst spending time in Lisbon. With the infamous …

The post Best Things To Do In Cascais – Day Trips from Lisbon appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/europe/portugal/things-to-do-cascais/feed/ 0
How to travel between Porto and Lisbon – Bus, Train and Car https://www.charsfootsteps.com/travel/europe/portugal/porto-to-lisbon/?utm_source=rss&utm_medium=rss&utm_campaign=porto-to-lisbon https://www.charsfootsteps.com/travel/europe/portugal/porto-to-lisbon/#respond Wed, 12 Oct 2022 07:28:20 +0000 https://www.charsfootsteps.com/?p=796 Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres apart, and both promise unique charms from beautiful architecture to tasty foods and wine. If you want to swap the expensive airfare and airport hassle, for a scenic journey through Portugal, then this guide is […]

The post How to travel between Porto and Lisbon – Bus, Train and Car appeared first on Char's Footsteps.

]]>
Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres apart, and both promise unique charms from beautiful architecture to tasty foods and wine. If you want to swap the expensive airfare and airport hassle, for a scenic journey through Portugal, then this guide is for you.

Porto to Lisbon by Train

The easiest way to travel between Porto and Lisbon is to get a direct train. From Porto’s main train station Campanha, you have the choice of getting a direct train to Lisbon Oriente (best for Lisbon Airport) or Lisbon Santa Apolonia (best for city centre).

Porto Campanha station is located in the east of the city. If you’re staying in Porto’s historic centre, get the train from Sao Bento to Campanha. It’s just a 4 minute journey and the price is included in your ticket from Porto Campanha to Lisbon – so no need to buy another ticket. You can find train times and prices on their official site here. Tickets can be bought online, at a ticket booth or in the station’s ticket office. 

I caught the 8:25am from Sao Bento, arrived at Porto Campanha at 8:29am and then caught the 8:37am to lisbon from Porto Campanha. Changing train was really straightforward! The train journey lasted just over 3 hours and cost €24. Overall, I found the journey very easy and comfortable. A much quicker and cheaper alternative to flying!

Make sure you’re sitting in the right seat and carriage when you get on. The ticket inspector moved people who weren’t sat in their allocated seats.  

Once you’re on the train, enjoy the views! you’ll pass through small towns and cities, woodlands and seaside.

Furthermore, Portugal is reportedly getting a new high speed rail between Porto and Lisbon which will cut the journey time down to an hour and 15 minutes!

Tip: Arrive early at the station to allow time to admire the stunning tile work and decor, unique to each station!

sao bento station

Getting from Lisbon Santa Apolonia Station to Lisbon City Centre.

Once you arrive at Lisbon Santa Apolonia station, there are several ways to get to the city centre. If you have minimal luggage, you could opt for a 30-40 minute walk and discover the city on foot.

The nearest metro station to Santa Apolonia is Escolas Gerais station, which will give you easy access to the whole city. However, it’s a 13 minute walk from Santa Apolonia, so factor that in if you have heavy bags!

If you’d rather not walk anywhere, opt for one of the local buses that go various routes around the city. These buses can be found directly outside the station and you’ll be able to buy a ticket at the station. Taxis line up around here too, if you want the most convenient option.

I found everyone in the station, and bus drivers, to be extremely helpful when I was trying to work out which bus I needed. But if you have mobile data, I’d recommend downloading CityMapper to easily find the best route to your final destination.

Powered by GetYourGuide

Porto to Lisbon Flight

There is of course the option to fly between Porto and Lisbon. Direct flights last approximately an hour and vary in price. For me, the extra cost and airport hassle wasn’t worth it. Plus I wanted to see more of Portugal from the train window.

If you decide to go with this option, there are several ways to get to the airport aside from a taxi. The Aeroporto Saldanha metro line will take you directly from downtown Lisbon to Lisbon Airport in 20 minutes. This cheap and quick route will also allow you to see more of Lisbon’s subway, with each station having its own theme and décor.

Alternative options include buses to the airport (only possible with small luggage), the Gare de Oriente Train line (connected to many parts of the country too) and a shuttle.

Getting to Porto airport from the city centre is also very easy. Aside from taxis, you can get the Metro – line E (purple) – which runs every 20 to 30 minutes. There are also bus connections – STCP and Resende providers – which will take you to different parts of the city.

Driving Between Porto and Lisbon

The most direct driving route between the two cities is 314km/195 miles, taking roughly 3 hours. I haven’t done this drive, but a friend who has, gives her top tips: 

  • Leave the motorways and drive through the quaint towns to get a feel of life outside of the cities. 
  • Traffic can be quite congested surrounding both cities, so factor that in to your journey timings.
  • Roads can be narrow and winding, which can be dangerous. Drive slowly! 
  • There are numerous tolls in Portugal so be prepared to research these and sort payment ahead of your journey. 

Buses from Porto to Lisbon

Another option would be to catch a direct bus from Porto to Lisbon. Buses are very regular and take approximately 3hr 30 mins (without traffic). The main bus providers for this journey are Rede Expressos, FlixBus, ALSA, Citi Express, RENEX and RODONORTE. Omio is a great comparison site for the different providers for this journey. Be sure to watch out for the arrival destination within Lisbon, as different providers drop off at different points within Lisbon. Most buses provide excellent facilities on board, including power sockets, free wifi and toilets.

Is Porto Worth a Day Trip from Lisbon?

In short, no! I saw this question a few times when I was initially researching my trip and couldn’t believe people were saying this was feasible. Although it would be physically possible, you would be on a train for 6-8 hours. Ultimately this would leave you with very little time to actually enjoy Porto. Given how much both cities have to offer, it would be better to stay in either Porto or Lisbon, than rushing to cram a city in a day. Although a day trip might be more doable once the high speed line is in operation.

I hope this helps anyone looking to travel around Portugal! Other guides I have for Portugal including days trips to Sintra and Cascais, weekend break in Porto, travel guide to Lisbon and tips on where to stay in Lisbon.

Related Portugal Travel Guides

where to stay in lisbon

Where to Stay in Lisbon

Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay …
porto city break

Porto City Break – Best Way to Spend a Weekend!

The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned …

The Ultimate Travel Guide to Sintra

Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural …

Best Things To Do In Cascais – Day Trips from Lisbon

Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now …
Porto Sao bento station

How to travel between Porto and Lisbon – Bus, Train and Car

Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres …

The Best Wine Regions in Portugal

Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next …

The post How to travel between Porto and Lisbon – Bus, Train and Car appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/europe/portugal/porto-to-lisbon/feed/ 0
The Best Wine Regions in Portugal https://www.charsfootsteps.com/travel/europe/portugal/wine-regions-portugal/?utm_source=rss&utm_medium=rss&utm_campaign=wine-regions-portugal https://www.charsfootsteps.com/travel/europe/portugal/wine-regions-portugal/#respond Mon, 08 Mar 2021 18:28:03 +0000 https://www.charsfootsteps.com/?p=749 Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next to bustling cities. As one of the oldest nations in Europe, Portugal famous for glorious weather, rich history, bustling cities and exquisite cuisine. However, an especially wide variety of grapes has created another attraction for […]

The post The Best Wine Regions in Portugal appeared first on Char's Footsteps.

]]>
Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next to bustling cities. As one of the oldest nations in Europe, Portugal famous for glorious weather, rich history, bustling cities and exquisite cuisine. However, an especially wide variety of grapes has created another attraction for which the Portuguese are now famous – wine!

But what makes the wine and wine regions of Portugal so interesting?

Believe it or not, there are 14 wine regions in Portugal and each one is entirely different. That is to say, some wine regions in Portugal are known for specialising in a particular style or grape. And every region has a different landscape and setting to get lost in. Visiting these wine regions in Portugal is a great way to explore the country, while experiencing the complex taste and secular wine-making traditions in each area.

While Port wine is undoubtedly the most famous, there is a different type of wine for everyone and a variety of grapes in each region to impress any connoisseur. 

Before moving onto the best wine regions in Portugal, here is some information about wine classifications.

About the Wine Classifications in Portugal

Vinho de Mesa – The most basic type of table wine in Portugal

Vinho Regional – Slightly better than table wine, but subject to fewer regulations that IPR or DOC wines.

Denominação de Origem Controlada (DOC) wines – Quality wines subjected to lots of regulations.

IPR or VQPRD: IPR wines and VQPRD wines are yet to achieve DOC status.

QVR – 85% of grapes in QVR wines must be grown locally.

VEQPRD – Sparkling wines that come from a demarcated region.

Note – This is information only (It’s not necessary that you know these classes).

Now, let’s take a look at some of my favourite wine regions in Portugal…

best wine regions in Portugal
Image credit: https://winefolly.com/deep-dive/what-wines-to-drink-from-portugal-by-region/

The 5 Best Wine Regions in Portugal

The Vinho Verde Wine Region

Located in the north, and near the Atlantic, the Vinho Verde region experiences a wet climate that produces very green, stunning scenery. This region is easily accessibly from Porto and the Minho province, making it a fantastic day trip. It’s also home to a dedicate “Green Wine Trail”, along with many historic sites and attractions.

The Vinho Verde region is the biggest wine region in Portugal and best known for producing white wine. Aveleda is one such wine that visitors seem to love from here. However there are many other notable wines that use grapes, including the avesso, arinto, and trajadura varieties. As for the taste, Vinho Verde wine tends to be quite fruity and light. The perfect wine for sunny afternoons in the countryside or lively evenings in the cities.

Greater Lisbon Wine Region

Lisbon is the stunning Capital of Portugal and is a hive of activity for tourists wanting to get out and about. But the surrounding region is home to some of the very best wine in Portugal. In fact, Greater Lisbon is the second biggest producer of wine in Portugal, consisting of many sub-regions and endless vineyards. Some of these wines are famous for being inexpensive, such as the cheap and cheerful “Vinho da mesa”, but there’s something for every taste and budget. If you fancy more specifics, Colares is a popular wine sub-region near Sintra National Park. Which means you can take in nature, castles and stunning coastlines, while sampling some of the best wines in Portugal.

Related Post: Be sure to ride the famous Tram 28 whilst in Lisbon

Bairrada Wine Region

Bairrada is located near the ocean which means it’s another wine region in Portugal that takes a lot of rainfall. However, the warmer months still allow for a reliable ripening season, which is down to a big thermal amplitude. This is a phenomenon which helps produce some especially acidic grapes and a certain freshness that you’ll notice in every wine from the region.

Along with the great wine, Bairrada is an exciting place to explore! It was once a major historical site and the fighting ground between the Arabs and Christians many years ago. Alongside its history, top things to do in the area include the umbrella sky project, Buçaco National Forest and the Cascata da Cabreia waterfall. The food is also sublime and another reason not to miss out on this amazing wine region in Portugal.

Altentejo Wine Region

Altentejo features quite a rugged and hilly landscape, with small beaches along the coastline in between. It’s also home to castles, dolmens and UNESCO World Heritage sites. It provides a great outdoor adventure, facilitated by the likes of hiking trails, recreational areas and guided bird-watching tours. But Altentejo is all about the red wine and probably best known for full bodied and high alcohol wines. Meaning you can expect an encounter with some very rich and wild aromas from tannin-rich wines such as Trincadeira and Alfrocheiro. That being said, Arinto, Antão Vaz and Roupeiro are popular grapes that local winemakers use to produce white wine. You might notice how Altentejo is featured heavily on wine menus and supermarket shelves around the country and this is due to huge wine production levels in the region.

The Douro Valley Wine Region

Douro Valley is the oldest wine region in Portugal and the home of the famous Port wine. The Douro Valley is a UNESCO World Heritage Site and a truly awe-inspiring part of the countryside. With a huge mountain range along one side and Douro River at the bottom, this is possibly the most spectacular wine region in Portugal. These features also help create the ideal climate for wine-making, made evident in the crispy whites and full-bodied reds on show. In spite of being so close to Porto, this region also feels rather wild and remote and the dramatic scenery makes this an obvious first choice for grape lovers when it comes to wine regions in Portugal.

Final Thoughts

You might want to visit for the sunny climate and white-powdered sands but the wine regions in Portugal are not to be missed. In many ways, exploring these regions offers a much deeper or more authentic experience. And one that not only brings fine wine and delicious food, but also beautiful scenery and landscapes.  

All regions are easy to visit by yourself or through organised tours depending on your plans and budgets.

The post The Best Wine Regions in Portugal appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/europe/portugal/wine-regions-portugal/feed/ 0
Ultimate Travel Guide to Lisbon https://www.charsfootsteps.com/travel/europe/portugal/travel-guide-lisbon/?utm_source=rss&utm_medium=rss&utm_campaign=travel-guide-lisbon https://www.charsfootsteps.com/travel/europe/portugal/travel-guide-lisbon/#comments Wed, 10 Feb 2021 18:27:08 +0000 https://www.charsfootsteps.com/?p=162 Lisbon is one of the most vibrant and charismatic capital cities in Europe. Famous for its impressive architecture, traditional Fado music, buzzing nightlife, fresh cuisine and welcoming locals, Lisbon has it all! As one of the oldest cities in Europe, Lisbon has rich and fascinating history on every corner. Plus, with its glorious year-round weather, […]

The post Ultimate Travel Guide to Lisbon appeared first on Char's Footsteps.

]]>
Lisbon is one of the most vibrant and charismatic capital cities in Europe. Famous for its impressive architecture, traditional Fado music, buzzing nightlife, fresh cuisine and welcoming locals, Lisbon has it all!

As one of the oldest cities in Europe, Lisbon has rich and fascinating history on every corner. Plus, with its glorious year-round weather, there’s always a great time to visit. Lisbon has something for everyone, making it one of the ultimate city breaks in Europe! I have put together a list of my favourite things to do in Lisbon:

1.) Free Walking Tour in Lisbon

Walking tours are a great way to kick start your stay in a new city. Providing a mix of historical facts, neighbourhood insights and local recommendations, it’s the perfect introduction to the Portuguese Capital. I also love joining walking tours as a way to meet people when i’m travelling solo.

Meeting in the infamous ‘Camoes Square’, Lisbon offers free daily walking tours in various languages. Our guide was hilarious, insightful and gave us invaluable advice on how to make the most of our long weekend there. The tours typical last 3-4 hours, so be sure to bring plenty of water, sun protection and comfortable walking shoes. Although it’s free, the longevity of the tour relies on tips given to the very deserving guides! 

Along with fascinating information on Lisbon, our guide gave us great local tips on the different neighbourhoods, good restaurants and where to go for local Fado! Ultimately, it’s a great way to see what the city has to offer and gives you an idea of where you might want to spend more time. 

Lisbon city centre

2.) Belém Tower

The Torre de Belém, or Belém Tower, is a remarkable landmark located on Lisbon’s expansive waterfront. Originally serving as a point of embarkation and disembarkation for explorers, Belém Tower is now one of the most popular tourist attractions in the city. The 500-year old tower became a UNESCO World Heritage Site in 1983.

Whether you choose to venture inside Belém Tower or not, it’s worth at least wandering around and exploring the surrounding area – especially Jeronomos. Once you’ve seen the tower, head over to Pasteis de Belem to enjoy some of the best Pastel de Nata in Lisbon!!

Belem tower Lisbon
Belem Tower

3.) Santa Justa Lift (Elevador de Santa Justa)

Built in 1902, the Santa Justa Elevator is an exquisit lift found in the historic centre. Additionally, it has a great observation deck giving you sensational panoramic views over the Baixa district and beyond. The impressive views and great photo opportunities make it definitely worth a visit. The Santa Justa Elevator is easy to reach by foot from the city centre, or by taking a metro to Baixa/Chiado (blue/green lines).

The best times to go are early in the morning or during sunset. The Santa Just Lift becomes extremely busy over peak summer months, especially during the day. To avoid long queues, and a congested viewing point, go outside of peak hours! Although the views are stunning, I wouldn’t say it’s worth long queues in the heat. The many incredible hills of Lisbon provide equally good views of the city…and for free!

Consider taking the stairs up to the viewing platform, otherwise prepare for an expensive 30 second ride up. The narrow, spiral staircase to reach the viewpoint is fairly steep, but as someone who’s terrified of heights, I was fine doing it. You can ride up for free with your metro day pass. Otherwise the elevator ride up to the viewing point and back down again will cost you €5!

The Santa Justa Lift isn’t just a great way to see the city. It’s also the fastest way to travel from the Baixa neighbourhood to the Bairro Alto district.

lisbon elevator views

4.) Time Out Market Lisbon

The infamous food and cultural market is one of the most popular things to do in Lisbon. With 35 small restaurant kiosks, offering some of the best local specialities, the Time Out Market is a must-do. Since the market opened in May 2014, its buzzing vibe, delicious meals and fun live music brings people from around the world to visit.

Given its central location, the market is very easily accessible. The nearest metro, bus and tram stop is Cais do Sodre, but it’s also walkable from most parts of the city centre. The Time Out Market is very inclusive; with vegetarian, vegan and gluten free options. It’s also accessible for wheelchairs, offers free wifi, accepts credit cards and has takeout options.

Although it’s not cheap, this highly-rated market has an abundance of fantastic food and drink options. From seafood to mediterranean, to local Portuguese dishes and Asian cuisine there’s something for everyone to enjoy. However, during busy seasons, the Time Out Market can become overcrowded with tourists. Consider buying your food to takeout and sit across from the market in the glorious Jardim Dom Luis park.

Check out the official website, for all the latest news on vendors and events held at the Time Out Market Lisbon.

5.) Explore Lisbon by Bicycle

Renting bicycles is always a great way to see a new city quickly. Lisbon is one of the hilliest cities in Europe, but don’t let this put you off. There are many bicycle rental shops to choose from and many offer organised private and group day tours of different areas. I can recommend both Lisbon Bike Rentals and BikeIberia, who offer great services and fantastic value for money. If the thought of cycling up the steep hills of Lisbon put you off, consider renting an E-Bike. Road bikes and mountain bikes are also available.

A very popular route is along the cycle paths by River Tagus towards Cascais. The route is flat, picturesque, and at points, lined with restaurants serving the freshest fish. Furthermore, you’ll pass the Henry Palace, the Tower of Belem, several museums and parks.

Bike rental shops will provide helmets and bike locks, along with their emergency phone number in case of punctures. They will also be able to suggest many different routes depending on what you’re wanting to see and the type of bike you hire.

6.) Stop for a Pastel de Nata

A trip to Lisbon wouldn’t be complete without a Pasteis de Nata – a Portuguese egg custard tart. The famous Portuguese custard tarts can be found across the city, providing the perfect pick-me-up after a day of sightseeing. Be warned…it’s impossible to just eat one.

If you only try one, make sure to visit Pasteis de Belem. The owners claim they have the original recipe for Pastel de Nata.

For more renowned Pasteis de Nata closer to the city centre, try out:

  1. Manteigaria
  2. Fábrica da Nata
  3. Zarzuela
  4. Aloma
  5. Alcôa

7.) Wander Through Lisbon’s 12 Neighbourhoods

I love exploring different neighbourhoods, and their differing personalities, when arriving in a new city. And Lisbon is no exception. Made up of 12 neighbourhoods, each with their own unique quirks and characteristics, Lisbon is a great place to just walk around and explore! Notable neighbourhoods to wander through include;

The 12 Districts

Alfama: Alfama is a Medieval District where traditional Fado music can be heard on every corner. The charming streets and hidden alleyways of Alfama are bursting with incredible restaurants and hole-in-the-wall shops. The key landmarks here are the Sé de Lisboa, the Church of Santo Estevão and the Monastery of São Vicente de Fora.

Avenida da Liberdada: Best known for its designer shopping, beautiful old buildings and theatres. Avenida da Liberdada is one of the most expensive avenues in the world.

Avenidas Novas: Business district filled with residential and commercial modern buildings.

Bairro Alto: Bairro Alto is most famous for its nightlife!

Baixa: Baixa is the historic centre of Lisbon. Along with key tourist attractions – Rossio Square, the Santa Justa Lift & Praça do Comércio – you’ll find an abundance of restaurants, shops, bars and hotels. The plazas, avenues and architecture here are magnificent, so expect to spend a lot of time here taking photographs.

Belém: Here you can visit the UNESCO World Heritage Sites of Belém Tower and the Monastery of Jerónimos. The Monument to the Discoveries, transport museum, modern MAAT, Berardo Collection Museum and Calçada da Ajuda (home to the royal palace and botanical garden) are all based in this district too. Don’t forget to try the infamous custard tarts at Pastéis de Belém.

Cais Sodré: This once seedy district has been transformed into one of the city’s most trendy areas! Cais Sodré is a buzzing hub of cool bars and clubs. It’s also home to the Pink Street – an iconic lane lined with fun bars and restaurants. During the day, walk along the glorious Ribeira das Naus waterfront and ride the historic funicular ‘Elevator da Bica’. As the night comes alive, visit the many bars, eateries and The Timeout Market.

Chiado: Chiado is one of the most popular districts known for it’s shopping, theatres, historic monuments, unique cafes and tasty restaurants. This elegant neighbourhood is perfect for taking a stroll and enjoying a freshly brewed coffee. Like Bairro Alto, Chiado comes alive at night with lively bars and alfresco eating.

Graça: The historic district of Graça lies on the highest of the seven hills, with most visiting for the viewpoints of Graça and Senhora do Monte. As one of Lisbon’s oldest districts, expect to see some of the capital’s oldest churches and architecture. The small narrow streets are bustlings with restaurants and shops – typically frequented by locals. Graça gives you a real taste of Lisbon life!

Lapa: Known for being an upper class favourite, the Lapa Quarter is famous for its embassies and palaces. This mostly residential neighbourhood has nearly 9,000 residents across 0.72km2 and is perfect for walks amongst the pristine parks and quiet roads.

Parque das Nações: Spanning 5km along the waterfront, this neighbourhood is known for its contemporary architecture. This once industrial district is now characterised by its cultural and recreational areas; full of shops, restaurants and parks.

Príncipe Real: Visit this upmarket, sophisticated neighbourhood for some of the trendiest restaurants and bars in town! Check out the tiny antique stores, unique boutiques, manicured gardens and elegant cafes. The Jardim do Príncipe Real is a must-do if you’re visiting this part of town.

pink street lisbon

8.) Visit the Colourful Sintra

Sintra is a magnificent town located on the Portuguese Riviera, approximately 25km from Lisbon. Home to the Sintra Mountains, Sintra National Palace and the famous Pena Palace, Sintra has become a popular places to visit from Lisbon. The 40 minute direct train journey from Lisbon’s Rossio Station makes it an ideal day trip if you’re short on time!

Sintra gets extremely crowded during the summer months, so I recommend arriving early to avoid the masses. My favourite things to see in Sintra include the unbelievable Pena Palace, Monserrate Palace, Parque de Pena, Moorish Castle, Sintra National Palace and the Old Town area.

9.) Day Trip to Cascais

Another great day trip from Lisbon that I’ve loved to do is visit Cascais! Cascais is a quaint fishing town and one of the most popular resort areas on the Lisbon coastline. Home to cobbled streets, seaside restaurants, museums, numerous parks and pristine beaches, Cascais is definitely worth visiting.

10.) Food & Wine Tasting

A great way to enjoy and learn about a city is through its food. Portuguese cuisine is famous for its fresh fish and seafood, smoked meats and cheeses. Like Spain, it originates from ‘peasant food’ – hearty, rice-heavy meals that are cheap and satisfying. In Portugal’s case, arroz de pato. Lisbon is known for its exceptionally fresh fish and seafood, so be sure to try out some local dishes. Bifanas – national Portuguese sandwich – is another must try, along with the iconic dish ‘Caldo Verde’.

Wine & Wine Tastings in Lisbon

No trip to Lisbon would be complete without sampling their wide range of wines. The most famous wine region in Portugal is Douro, home to Port wines. Alentejo and Minho regions fall closely behind. Arguably the most well-known wine in Portugal originates from the historic Minho region in North Portugal: Vinho Verdo.

Vinho Verde, translating to ‘green wine’, is famous for it light and cheap nature. It’s a must-try when in Lisbon and can be found in any restaurant, wine bar or street side establishment. Enjoy this fresh, fruity wine on one of Lisbon’s many quirky balcony-style bars.

Food Tours in Lisbon

There area a plethora of food tours available in Lisbon, often going hand-in-hand with wine tastings. From small group tastings and private tours, to big cooking classes, there’s something for anyone. The most common food tours consist of Petiscos, small-plate Portuguese Tapas, paired with famous local wines. Not only can you try a range of typical Portuguese food, but you’ll also likely learn some history along the way.

Taste of Lisboa, Treasures of Lisboa and Culinary Backstreets Lisbon are highly rated food and wine tours in the city.

11.) Bar/Pub Crawl

If food and wine tastings aren’t your thing, consider one of the many bar crawls organised throughout the week. These provide a great opportunity to meet other people, particularly solo backpackers, and will give you a taste of what nightlife is on offer. At night, the historical streets of the old town become electric with party goers from around the world. As with most cities, different areas attract different scenes. By joining a bar or pub crawl, you’ll be navigated through the city’s best party areas and benefit from good drink deals. If you’re looking to enjoy some of the best bars and clubs in Lisbon, consider doing it with a tour.

12.) Lisbon Tram 28

Lisbon’s Tram 28 is one of the best ways to explore the old city and the differing neighbourhoods Lisbon has to offer. The entire route takes an hour – starting at Martim Moniz to Campo de Ourique – but you ….

This tram is extremely popular amongst tourists, so prepare for long queues and crammed carriages at times. To beat the crowds and get a seat, start the journey from the other direction. Most tourists get on at Martim Moniz. However during peak season, queues can have over 200 people for very limited tram spaces. By starting your route from Campo de Ourique, you’ll have a higher chance of boarding an emptier carriage.

If this doesn’t appeal, there are alternate routes that still give you the experience. Walking the route of Tram 28, a hills tram tour or taking a different tram route (12, 15e, 18, 24 and 25) will give you the same traditional, wooden tram experience without the hassles of Tram 28.

A single tram ticket costs $3 and can be purchased onboard. However, using a Via Viagem pass will give you 50% off. Similarly, if you’re planning to visit many different areas, you might consider buying a 24hr pass for €6.40.

Lisbon Tram 28

Note: Keep belongings close! Trams are a hotspot for pickpockets. We were warned of this during our walking tour and by the hotel.

13.) Barrio Alto and Lisbon’s Nightlife

Lisbon has vibrant and diverse nightlife is not to be missed during your stay. The narrow, cobbled streets of Bairro Alto remain quiet during the day – filled with tourists wandering the traditional streets. But at night, this neighbourhood comes alive with its many bars, restaurants and fado houses. As venues here are small, it’s not uncommon for people to take their drinks out in the streets – adding to the district’s fun vibe.

14.) Enjoy Lisbon’s Hiking Routes

Lisbon is often referred to as the ‘Cidade das Sete Colinas’ – the city of seven hills. These allow for breathtaking views over the city…along with a great workout! Just spending a view hours walking around the city sightseeing will provide a great hike. All Trails offer great hiking routes in the city centre and surrounding areas.

Two popular hiking routes include:

Sintra Coastline

With the luscious mountains and stunning scenery, Sintra’s mountains are often a go-to for people looking to enjoy a day of walking. However the Sintra Coastline is often wrongly overlooked. Hike this 10km point-to-point route from Sintra to Cascais Natural Park and marvel at this incredible coastline. Hiking from Sintra to Cabo da Roca will treat you to picturesque beaches, whitewashed houses and incredible limestone formations. Many people choose to end their walk at the beautiful Praia da Ursa beach to enjoy some well deserved relax time. This will be one of the easiest options in terms of convenience, for both cars and public transport connections.

Serra de Arrabida

For more challenging hikes, check out Serra de Arrabida and the Parque Natural da Arrabida. This region comprises of forested hills, pristine beaches and towering cliffs overlooking the vast coastline. High, vertical cliffs make up the area just above the sea. On the back of this you’ll find smaller mountains which are easier to hike – these vary in levels of difficulty. Serra de Arrabida is often regarded as one of the most beautiful regions in Portugal.

Despite this, it’s largely untouched by tourists despite being less than 40 minutes from Lisbon. However, this spectacular area can’t be reached easily by public transport so will likely only be an option if you have rented a car.

15.) A Day at the Beach

With the hustle and bustle of city life, it might be hard to believe that Lisbon is close to some of the best beaches in Portugal! This region boasts four different coastlines, all offering unique experiences from one another. From windy surfing beaches to family-friendly beaches, there’s something to suit every travellers’ needs. And the bonus…most of them are easily accessible by public transport.

The top 3 beaches to visit for a day trip from Lisbon include Praia de Carcavelos, Praia de Santo Amaro de Oeiras and Praia da Conceição. During the hottest months sea temperatures average at 20°C (68 °F), perfect for cooling down on a hot day.

For more on the best beaches in Lisbon, visit Lisbon Lisboa Portugal or Olivers Travels for detailed information on each one.

Logistics

Getting to/from the airport

Lisbon Airport has a metro station with a direct line to the city centre. The ‘Aeroporto – Saldanha’ line takes you to downtown Lisbon is roughly 20 minutes.

You’ll need to buy a ‘7 Colinas’/ ‘Viva Viagem’ travel card, which you can top up for journeys on either the Metro or Carris (bus network). The card costs €0.50, with a single fare €1.45 and a 24h pass €6.30

Another cheap alternative is to catch the bus. A ticket will cost roughly €4 and takes 45 minutes.

Taxis are the most convenient way to travel from the airport to city centre. It will cost €20 and will take approximately 20 minutes depending on time of day.

Getting Around Lisbon

The easiest and cheapest way to get around the city is by foot or public transport. Lisbon is well connected with trains, trams and buses, making getting around the city or further afield easy! You can purchase a travel card to use across the metro and bus network. Because of its extensive network connections to surrounding areas, it’s not worth renting a car. From beaches and mountainous hiking regions, to the infamous Cascais and Sintra areas, everything you could wish to visit can be reached by metro, train or tram.

Weather in Lisbon

One of the best things about Lisbon is the glorious weather. Its mediterranean climate allows for hot, dry summer and mild, rainy winters.

The best month to visit Lisbon is May. As the tourist season is just starting up, you’ll avoid the bulk crowds and queues. In additional, the weather is fantastic for both day and night. The hottest months in Lisbon are July and August, with temperatures peaking in the late 30s. Not ideal for standing in queues or walking around the hilly city. For these reasons another great time to visit Lisbon is in September. Both these months experience low rainfall too.

The coldest month in Lisbon is January, with average day temperatures sitting between 8-15°C (47-52.9°F). The wettest months are November and December, with an average rainfall of 127mm and 14 rainy days.

Lisbon Travel Guide wrap up

I hope this travel guide is helpful for anyone planning a trip to Lisbon! I have also written a guide on where to stay in Lisbon if you’re unsure on which neighbourhood is best for your style of travelling. There’s so much to see and do in this vibrant capital city. And with great year-round weather, you can enjoy this city throughout the year. If you’re planning to add a trip to Porto during your time in Portugal, be sure to read my guide on travelling between Porto and Lisbon.

Portugal Travel Guides

where to stay in lisbon

Where to Stay in Lisbon

Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay …
porto city break

Porto City Break – Best Way to Spend a Weekend!

The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned …

The Ultimate Travel Guide to Sintra

Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural …

Best Things To Do In Cascais – Day Trips from Lisbon

Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now …
Porto Sao bento station

How to travel between Porto and Lisbon – Bus, Train and Car

Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres …

The Best Wine Regions in Portugal

Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next …
travel guide Lisbon

Ultimate Travel Guide to Lisbon

Lisbon is one of the most vibrant and charismatic capital cities in Europe. Famous for its impressive architecture, traditional Fado …
Lisbon Tram 28

A Guide to Lisbon’s Tram 28 & Alternatives

Tram 28 has become one of the most iconic things to see whilst spending time in Lisbon. With the infamous …

The post Ultimate Travel Guide to Lisbon appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/europe/portugal/travel-guide-lisbon/feed/ 14
A Guide to Lisbon’s Tram 28 & Alternatives https://www.charsfootsteps.com/travel/europe/portugal/lisbon-tram-28/?utm_source=rss&utm_medium=rss&utm_campaign=lisbon-tram-28 https://www.charsfootsteps.com/travel/europe/portugal/lisbon-tram-28/#comments Sun, 03 Jan 2021 10:59:04 +0000 https://www.charsfootsteps.com/?p=341 Tram 28 has become one of the most iconic things to see whilst spending time in Lisbon. With the infamous yellow trains rolling through the steep hills and narrow lanes of the Portuguese capital, there’s no better way to see what this incredible city has to offer. The journey will take you along a stunning […]

The post A Guide to Lisbon’s Tram 28 & Alternatives appeared first on Char's Footsteps.

]]>
Tram 28 has become one of the most iconic things to see whilst spending time in Lisbon. With the infamous yellow trains rolling through the steep hills and narrow lanes of the Portuguese capital, there’s no better way to see what this incredible city has to offer. The journey will take you along a stunning route, through the many different districts of Lisbon, passing by some of the best landmarks.

Despite the stunning route and beautiful, wooden vintage trams, it can feel like a let down. With Lisbon booming in popularity in recent years, Tram 28 has become overwhelming busy as a tourist destination. The queues at Martim Moniz for Tram 28 are CRAZY! It’s not unusual to have over 200 people waiting at Martim Moniz to board. If you’re lucky to get on, you’ll likely be crammed in like sardines. But often, tram drivers won’t stop to pick up people if their trams are too full.

For Locals, Tram 28 is part of their daily life and a necessary way to travel to other parts of the city. Many are now unable to use it for its normal purpose given how dominated it is by tourists.

If you’re wanting to ride this tram, continue on for information and advice on how to get a space. Otherwise I’ve included alternatives to Tram 28, that’ll still let you experience the traditional trams but without any queues, hassle or disruption to locals’ life.

Tram 28 Route

List of stops and timetable

The route connects Martim Moniz to Campo Ourique, and passes through a number of popular districts including Graça, Alfama, Baixa and Estrela.

Key Stops on Tram 28 Route

Sites along the route

  • Praça Martim Moniz (Stop: Praça Martim Moniz)
  • Monastery of São Vicente de Fore (Stop: Voz Operário)
  • Portas do Sol (Stop: Portas do Sol)
  • Lisbon Cathedral (Stop: Sé)
  • Baixa & Terreiro do Paço (Stop: Conceição)
  • Basilica da Estrela (Stop: Estrela)
  • Prazeres Cemetery (Stop: Campo Ourique)

Schedule

Tram 28 runs every day of the week typically from 6am to 10pm.

  • Weekdays: 5:40am – 11:30pm
  • Saturday: 5:45am-10:30pm
  • Sunday: 6:45am – 10:30pm

Taking Tram 28 typically takes between 45 minutes and an hour from start to finish. With trams running every 10 minutes during rush hour, and 15 minutes during off-peak hours.

Check out the official Lisbon Tram website for more detailed information and scheduling.

Cost of Tram 28

You should expect to pay:

  • Single Ride: €3 (€1.50 with Viva Viagem)
  • 24hr Pass (1 day ticket): €6.40

A Viva Viagem card is worth getting for a trip to Lisbon. They’re easy to top up, convenient to use and can save you up to 50% on single rides. These cards can be purchased for €0.50 from tram conductors, metro stations, ferries and PayShop locations.

Without a Viva Viagem travel card, you can buy tickets onboard from the tram conductor.

This isn’t a hop on/hop off ride, so if you’re looking to do that, buy a 24 hour pass. Although you can’t guarantee getting a seat.

Tips for beating the crowds

If you’re visiting Lisbon during peak tourist season (June-August), or at peak times, getting a spot might prove to be impossible. I’d advise going early in the morning or in the evening to try and beat the crazy crowds. Alternatively, consider taking the journey from the opposite direction.

Travellers usually start this journey at Martim Moniz, with the line getting busier over the next few stops. The queues are these stops are insanely long!! However, once the tram has reached its final destination, its likely to have emptied out. Therefore, you’ll have a higher chance of getting a seat if you start your journey at Campo Ourique.

Campo Ourique is also really easy to get to! Tram E25 from Martim Moniz itself will take you straight there. Alternatively, you can catch the 711 bus, which departs downtown Lisbon from Praça de Comércio.

Alternatives to Tram 28

  • Walk the route of Tram 28. Picking out the key points along the route could make a for a nice makeshift walking tour. Whilst taking out the stress of finding a seat or being crammed inside a tram.
  • Go on a hills tram tour. Although it’s more expensive than Tram 28, you’ll be sat in comfort on a traditional vintage Lisbon Tram. It’s is a hop on/off tour, so you can visit different parts of the city as you wish. You’ll pass through the neighbourhoods of Alfama, Mouraria, Chiado, Bairro Alto and Lapa. It’s a great way to see iconic landmarks such as Castelo São Jorge and Sé Cathedral. The audio guide/headphones come in many languages too. Check out their site here for more information.
  • Take a different tram route. If you just want to experience a ride in a traditional wooden Lisbon tram, take a different line. Tram 12, 15e, 18, 24 and 25 all use the infamous Lisbon trams. These will be the same price as Tram 28.

Other things to note

  • There’s WiFi and air-conditioning on board.
  • It’s a bumpy ride! If you’re someone who suffers from motion sickness, you might reconsider doing this trip. Particularly in the summer, when it’s hot and crammed – having a rocky ride might not be desirable.
  • Be extra careful with any belongings as pickpockets are rife on this tram. We were warned during our walking tour and by the hotel.

Other Portugal guides that might be helpful include where to stay in Lisbon, how to travel between Porto and Lisbon, Porto 3-day itinerary, Sintra guide and Cascais guide.

Read More Portugal Travel Guides

where to stay in lisbon

Where to Stay in Lisbon

Lisbon is one of my favourite cities in Europe and a place i’ll always shout about! Choosing where to stay …
porto city break

Porto City Break – Best Way to Spend a Weekend!

The coastal city of Porto had been top of my European bucket-list ever since my first trip to Lisbon. Renowned …

The Ultimate Travel Guide to Sintra

Sintra in Portugal is famous for its natural beauty, fairy tale palaces and brightly coloured buildings. Gaining its UNESCO Cultural …

Best Things To Do In Cascais – Day Trips from Lisbon

Cascais is a quaint coastal town found just 30km from Lisbon, Portugal. Once a former fishing village, Cascais is now …
Porto Sao bento station

How to travel between Porto and Lisbon – Bus, Train and Car

Travelling between Portugal’s two largest cities, Porto and Lisbon, couldn’t be easier. These coastal metropolitans are located about 300 kilometres …

The Best Wine Regions in Portugal

Portugal is a grape lovers paradise where you can find medieval castles on majestic cliffs and white powdered sands next …
travel guide Lisbon

Ultimate Travel Guide to Lisbon

Lisbon is one of the most vibrant and charismatic capital cities in Europe. Famous for its impressive architecture, traditional Fado …
Lisbon Tram 28

A Guide to Lisbon’s Tram 28 & Alternatives

Tram 28 has become one of the most iconic things to see whilst spending time in Lisbon. With the infamous …

The post A Guide to Lisbon’s Tram 28 & Alternatives appeared first on Char's Footsteps.

]]>
https://www.charsfootsteps.com/travel/europe/portugal/lisbon-tram-28/feed/ 9