diff --git a/RELEASING.md b/RELEASING.md
index 55a6def6e7..44e2dac6a0 100644
--- a/RELEASING.md
+++ b/RELEASING.md
@@ -44,13 +44,15 @@ The release process calls `towncrier`.
It is a Python library that uses the Python utility `pipx`.
This utility allows you to call and execute Python modules without installing them as a prerequisite in your system.
It works similar to the NodeJS `npx` utility.
-On macOS, you can install `pipx` into your system:
+
+Install {term}`pipx` for your active Python, and ensure it is on your `$PATH`.
+Carefully read the console output for further instructions, if needed.
```shell
-brew install pipx
+python3 -m pip install pipx
+pipx ensurepath
```
-Or follow detailed instructions in the `pipx` documentation for [Installation](https://pypa.github.io/pipx/installation/).
## Running the release process
diff --git a/docs/source/contributing/branch-policy.md b/docs/source/_inc/_branch-policy.md
similarity index 100%
rename from docs/source/contributing/branch-policy.md
rename to docs/source/_inc/_branch-policy.md
diff --git a/docs/source/contributing/install-docker.md b/docs/source/_inc/_install-docker.md
similarity index 100%
rename from docs/source/contributing/install-docker.md
rename to docs/source/_inc/_install-docker.md
diff --git a/docs/source/contributing/install-git.md b/docs/source/_inc/_install-git.md
similarity index 100%
rename from docs/source/contributing/install-git.md
rename to docs/source/_inc/_install-git.md
diff --git a/docs/source/contributing/install-make.md b/docs/source/_inc/_install-make.md
similarity index 100%
rename from docs/source/contributing/install-make.md
rename to docs/source/_inc/_install-make.md
diff --git a/docs/source/contributing/install-nodejs.md b/docs/source/_inc/_install-nodejs.md
similarity index 100%
rename from docs/source/contributing/install-nodejs.md
rename to docs/source/_inc/_install-nodejs.md
diff --git a/docs/source/contributing/install-nvm.md b/docs/source/_inc/_install-nvm.md
similarity index 100%
rename from docs/source/contributing/install-nvm.md
rename to docs/source/_inc/_install-nvm.md
diff --git a/docs/source/contributing/install-operating-system.md b/docs/source/_inc/_install-operating-system.md
similarity index 100%
rename from docs/source/contributing/install-operating-system.md
rename to docs/source/_inc/_install-operating-system.md
diff --git a/docs/source/_static/searchtools.js b/docs/source/_static/searchtools.js
deleted file mode 100644
index 23ed8bf5a2..0000000000
--- a/docs/source/_static/searchtools.js
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- * searchtools.js
- * ~~~~~~~~~~~~~~~~
- *
- * Sphinx JavaScript utilities for the full-text search.
- *
- * :copyright: Copyright 2007-2021 by the Sphinx team, see AUTHORS.
- * :license: BSD, see LICENSE for details.
- *
- */
-
-
-if (!Scorer) {
- /**
- * Simple result scoring code.
- */
- var Scorer = {
- // Implement the following function to further tweak the score for each result
- // The function takes a result array [filename, title, anchor, descr, score]
- // and returns the new score.
- /*
- score: function(result) {
- return result[4];
- },
- */
-
- // query matches the full name of an object
- objNameMatch: 11,
- // or matches in the last dotted part of the object name
- objPartialMatch: 6,
- // Additive scores depending on the priority of the object
- objPrio: {0: 15, // used to be importantResults
- 1: 5, // used to be objectResults
- 2: -5}, // used to be unimportantResults
- // Used when the priority is not in the mapping.
- objPrioDefault: 0,
-
- // query found in title
- title: 15,
- partialTitle: 7,
- // query found in terms
- term: 5,
- partialTerm: 2
- };
-}
-
-if (!splitQuery) {
- function splitQuery(query) {
- return query.split(/\s+/);
- }
-}
-
-/**
- * Search Module
- */
-var Search = {
-
- _index : null,
- _queued_query : null,
- _pulse_status : -1,
-
- htmlToText : function(htmlString) {
- var virtualDocument = document.implementation.createHTMLDocument('virtual');
- var htmlElement = $(htmlString, virtualDocument);
- htmlElement.find('.headerlink').remove();
- docContent = htmlElement.find('[role=main]')[0];
- if(docContent === undefined) {
- console.warn("Content block not found. Sphinx search tries to obtain it " +
- "via '[role=main]'. Could you check your theme or template.");
- return "";
- }
- return docContent.textContent || docContent.innerText;
- },
-
- init : function() {
- var params = $.getQueryParameters();
- if (params.q) {
- var query = params.q[0];
- $('input[name="q"]')[0].value = query;
- $('input[name="q"]')[1].value = query;
- if (params.doc_section) {
- var doc_section = params.doc_section[0];
- $('select[name="doc_section"]')[0].value = doc_section;
- }
- this.performSearch(query, doc_section);
- }
- },
-
- loadIndex : function(url) {
- $.ajax({type: "GET", url: url, data: null,
- dataType: "script", cache: true,
- complete: function(jqxhr, textstatus) {
- if (textstatus != "success") {
- document.getElementById("searchindexloader").src = url;
- }
- }});
- },
-
- setIndex : function(index) {
- var q;
- this._index = index;
- if ((q = this._queued_query) !== null) {
- this._queued_query = null;
- Search.query(q);
- }
- },
-
- hasIndex : function() {
- return this._index !== null;
- },
-
- deferQuery : function(query) {
- this._queued_query = query;
- },
-
- stopPulse : function() {
- this._pulse_status = 0;
- },
-
- startPulse : function() {
- if (this._pulse_status >= 0)
- return;
- function pulse() {
- var i;
- Search._pulse_status = (Search._pulse_status + 1) % 4;
- var dotString = '';
- for (i = 0; i < Search._pulse_status; i++)
- dotString += '.';
- Search.dots.text(dotString);
- if (Search._pulse_status > -1)
- window.setTimeout(pulse, 500);
- }
- pulse();
- },
-
- /**
- * perform a search for something (or wait until index is loaded)
- */
- performSearch : function(query, doc_section) {
- // create the required interface elements
- this.out = $('#search-results');
- this.title = $('').appendTo(this.out);
- this.dots = $('').appendTo(this.title);
- this.status = $('
').appendTo(this.out);
- this.output = $('
').appendTo(this.out);
-
- $('#search-progress').text(_('Preparing search...'));
- this.startPulse();
-
- // index already loaded, the browser was quick!
- if (this.hasIndex()) {
- this.query(query, doc_section);
- } else {
- this.deferQuery(query);
- }
- },
-
- /**
- * execute search (requires search index to be loaded)
- */
- query : function(query, doc_section) {
- var i;
-
- // stem the searchterms and add them to the correct list
- var stemmer = new Stemmer();
- var searchterms = [];
- var excluded = [];
- var hlterms = [];
- var tmp = splitQuery(query);
- var objectterms = [];
- for (i = 0; i < tmp.length; i++) {
- if (tmp[i] !== "") {
- objectterms.push(tmp[i].toLowerCase());
- }
-
- if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
- // skip this "word"
- continue;
- }
- // stem the word
- var word = stemmer.stemWord(tmp[i].toLowerCase());
- // prevent stemmer from cutting word smaller than two chars
- if(word.length < 3 && tmp[i].length >= 3) {
- word = tmp[i];
- }
- var toAppend;
- // select the correct list
- if (word[0] == '-') {
- toAppend = excluded;
- word = word.substr(1);
- }
- else {
- toAppend = searchterms;
- hlterms.push(tmp[i].toLowerCase());
- }
- // only add if not already in the list
- if (!$u.contains(toAppend, word))
- toAppend.push(word);
- }
- var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
-
- // console.debug('SEARCH: searching for:');
- // console.info('required: ', searchterms);
- // console.info('excluded: ', excluded);
-
- // prepare search
- var terms = this._index.terms;
- var titleterms = this._index.titleterms;
-
- // array of [filename, title, anchor, descr, score]
- var results = [];
- $('#search-progress').empty();
-
- // lookup as object
- for (i = 0; i < objectterms.length; i++) {
- var others = [].concat(objectterms.slice(0, i),
- objectterms.slice(i+1, objectterms.length));
- results = results.concat(this.performObjectSearch(objectterms[i], others));
- }
-
- // lookup as search terms in fulltext
- results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
-
- // let the scorer override scores with a custom scoring function
- if (Scorer.score) {
- for (i = 0; i < results.length; i++)
- results[i][4] = Scorer.score(results[i]);
- }
-
- // Filter results by doc_section
- if (doc_section && doc_section !== 'all') {
- results = results.filter(result => {
- let condition = result[0].split('/')[0] === doc_section;
- return condition
- })
- }
-
- // Enrich item with parent doc_section title
- for (i = 0; i < results.length; i++)
- results[i][6] = results[i][6] || 'TODO Documentation title';
-
- // now sort the results by score (in opposite order of appearance, since the
- // display function below uses pop() to retrieve items) and then
- // alphabetically
- results.sort(function(a, b) {
- var left = a[4];
- var right = b[4];
- if (left > right) {
- return 1;
- } else if (left < right) {
- return -1;
- } else {
- // same score: sort alphabetically
- left = a[1].toLowerCase();
- right = b[1].toLowerCase();
- return (left > right) ? -1 : ((left < right) ? 1 : 0);
- }
- });
-
-
- // print the results
- var resultCount = results.length;
- function displayNextItem() {
- // results left, load the summary and display it
- if (results.length) {
- var item = results.pop();
- var listItem = $('');
- var requestUrl = "";
- var linkUrl = "";
- if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
- // dirhtml builder
- var dirname = item[0] + '/';
- if (dirname.match(/\/index\/$/)) {
- dirname = dirname.substring(0, dirname.length-6);
- } else if (dirname == 'index/') {
- dirname = '';
- }
- requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
- linkUrl = requestUrl;
-
- } else {
- // normal html builders
- requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
- linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
- }
- listItem.append($('').attr('href',
- linkUrl +
- highlightstring + item[2]).html(item[1]));
-
- listItem.append($('' + item[6] + ''));
-
- if (item[3]) {
- listItem.append($(' (' + item[3] + ')'));
- Search.output.append(listItem);
- setTimeout(function() {
- displayNextItem();
- }, 5);
- } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) {
- $.ajax({url: requestUrl,
- dataType: "text",
- complete: function(jqxhr, textstatus) {
- var data = jqxhr.responseText;
- if (data !== '' && data !== undefined) {
- listItem.append(Search.makeSearchSummary(data, searchterms, hlterms));
- }
- Search.output.append(listItem);
- setTimeout(function() {
- displayNextItem();
- }, 5);
- }});
- } else {
- // no source available, just display title
- Search.output.append(listItem);
- setTimeout(function() {
- displayNextItem();
- }, 5);
- }
- }
- // search finished, update title and status message
- else {
- Search.stopPulse();
- Search.title.text(_('Search Results'));
- if (!resultCount)
- Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
- else
- Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
- Search.status.fadeIn(500);
- }
- }
- displayNextItem();
- },
-
- /**
- * search for object names
- */
- performObjectSearch : function(object, otherterms) {
- var filenames = this._index.filenames;
- var docnames = this._index.docnames;
- var objects = this._index.objects;
- var objnames = this._index.objnames;
- var titles = this._index.titles;
-
- var i;
- var results = [];
-
- for (var prefix in objects) {
- for (var name in objects[prefix]) {
- var fullname = (prefix ? prefix + '.' : '') + name;
- var fullnameLower = fullname.toLowerCase()
- if (fullnameLower.indexOf(object) > -1) {
- var score = 0;
- var parts = fullnameLower.split('.');
- // check for different match types: exact matches of full name or
- // "last name" (i.e. last dotted part)
- if (fullnameLower == object || parts[parts.length - 1] == object) {
- score += Scorer.objNameMatch;
- // matches in last name
- } else if (parts[parts.length - 1].indexOf(object) > -1) {
- score += Scorer.objPartialMatch;
- }
- var match = objects[prefix][name];
- var objname = objnames[match[1]][2];
- var title = titles[match[0]];
- // If more than one term searched for, we require other words to be
- // found in the name/title/description
- if (otherterms.length > 0) {
- var haystack = (prefix + ' ' + name + ' ' +
- objname + ' ' + title).toLowerCase();
- var allfound = true;
- for (i = 0; i < otherterms.length; i++) {
- if (haystack.indexOf(otherterms[i]) == -1) {
- allfound = false;
- break;
- }
- }
- if (!allfound) {
- continue;
- }
- }
- var descr = objname + _(', in ') + title;
-
- var anchor = match[3];
- if (anchor === '')
- anchor = fullname;
- else if (anchor == '-')
- anchor = objnames[match[1]][1] + '-' + fullname;
- // add custom score for some objects according to scorer
- if (Scorer.objPrio.hasOwnProperty(match[2])) {
- score += Scorer.objPrio[match[2]];
- } else {
- score += Scorer.objPrioDefault;
- }
- results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
- }
- }
- }
-
- return results;
- },
-
- /**
- * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
- */
- escapeRegExp : function(string) {
- return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
- },
-
- /**
- * search for full-text terms in the index
- */
- performTermsSearch : function(searchterms, excluded, terms, titleterms) {
- var docnames = this._index.docnames;
- var filenames = this._index.filenames;
- var titles = this._index.titles;
-
- var i, j, file;
- var fileMap = {};
- var scoreMap = {};
- var results = [];
-
- // perform the search on the required terms
- for (i = 0; i < searchterms.length; i++) {
- var word = searchterms[i];
- var files = [];
- var _o = [
- {files: terms[word], score: Scorer.term},
- {files: titleterms[word], score: Scorer.title}
- ];
- // add support for partial matches
- if (word.length > 2) {
- var word_regex = this.escapeRegExp(word);
- for (var w in terms) {
- if (w.match(word_regex) && !terms[word]) {
- _o.push({files: terms[w], score: Scorer.partialTerm})
- }
- }
- for (var w in titleterms) {
- if (w.match(word_regex) && !titleterms[word]) {
- _o.push({files: titleterms[w], score: Scorer.partialTitle})
- }
- }
- }
-
- // no match but word was a required one
- if ($u.every(_o, function(o){return o.files === undefined;})) {
- break;
- }
- // found search word in contents
- $u.each(_o, function(o) {
- var _files = o.files;
- if (_files === undefined)
- return
-
- if (_files.length === undefined)
- _files = [_files];
- files = files.concat(_files);
-
- // set score for the word in each file to Scorer.term
- for (j = 0; j < _files.length; j++) {
- file = _files[j];
- if (!(file in scoreMap))
- scoreMap[file] = {};
- scoreMap[file][word] = o.score;
- }
- });
-
- // create the mapping
- for (j = 0; j < files.length; j++) {
- file = files[j];
- if (file in fileMap && fileMap[file].indexOf(word) === -1)
- fileMap[file].push(word);
- else
- fileMap[file] = [word];
- }
- }
-
- // now check if the files don't contain excluded terms
- for (file in fileMap) {
- var valid = true;
-
- // check if all requirements are matched
- var filteredTermCount = // as search terms with length < 3 are discarded: ignore
- searchterms.filter(function(term){return term.length > 2}).length
- if (
- fileMap[file].length != searchterms.length &&
- fileMap[file].length != filteredTermCount
- ) continue;
-
- // ensure that none of the excluded terms is in the search result
- for (i = 0; i < excluded.length; i++) {
- if (terms[excluded[i]] == file ||
- titleterms[excluded[i]] == file ||
- $u.contains(terms[excluded[i]] || [], file) ||
- $u.contains(titleterms[excluded[i]] || [], file)) {
- valid = false;
- break;
- }
- }
-
- // if we have still a valid result we can add it to the result list
- if (valid) {
- // select one (max) score for the file.
- // for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
- var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
- function getParentTitle(f) {
- let parentdocname = docnames[f].split('/')[0] + '/index';
- let parentID = docnames.indexOf(parentdocname);
- let title = parentID === -1 ? 'Plone Documentation' : titles[parentID];
- return title
- }
- results.push([docnames[file], titles[file], '', null, score, filenames[file], getParentTitle(file)]);
- }
- }
- return results;
- },
-
- /**
- * helper function to return a node containing the
- * search summary for a given text. keywords is a list
- * of stemmed words, hlwords is the list of normal, unstemmed
- * words. the first one is used to find the occurrence, the
- * latter for highlighting it.
- */
- makeSearchSummary : function(htmlText, keywords, hlwords) {
- var text = Search.htmlToText(htmlText);
- var textLower = text.toLowerCase();
- var start = 0;
- $.each(keywords, function() {
- var i = textLower.indexOf(this.toLowerCase());
- if (i > -1)
- start = i;
- });
- start = Math.max(start - 120, 0);
- var excerpt = ((start > 0) ? '...' : '') +
- $.trim(text.substr(start, 240)) +
- ((start + 240 - text.length) ? '...' : '');
- var rv = $('').text(excerpt);
- $.each(hlwords, function() {
- rv = rv.highlightText(this, 'highlighted');
- });
- return rv;
- }
-};
-
-$(document).ready(function() {
- Search.init();
- if ($.trim($(".topbar-contents .bd-toc").html()) === "") {
- $(".topbar-contents .bd-toc").css("visibility", "hidden");
- }
- $('select[name="doc_section"]').change(function() {
- this.form.submit();
- });
-});
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 8619c2a428..4c010d58b4 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -63,6 +63,7 @@
"sphinx_copybutton",
"sphinx_examples",
"sphinxcontrib.video",
+ "sphinxcontrib.youtube",
"sphinxext.opengraph",
]
@@ -89,11 +90,8 @@
# Ignore github.com pages with anchors
r"https://github.com/.*#.*",
# Ignore other specific anchors
- # r"https://chromewebstore.google.com/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi", # TODO retest with latest Sphinx when upgrading theme. chromewebstore recently changed its URL and has "too many redirects".
- # r"https://chromewebstore.google.com/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd", # TODO retest with latest Sphinx when upgrading theme. chromewebstore recently changed its URL and has "too many redirects".
r"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS/Errors#Identifying_the_issue",
r"https://docs.cypress.io/guides/references/migration-guide#Migrating-to-Cypress-version-10-0",
- # r"https://stackoverflow.com", # volto and documentation # TODO retest with latest Sphinx.
]
linkcheck_anchors = True
linkcheck_timeout = 5
@@ -117,7 +115,7 @@
# This pattern also affects html_static_path and html_extra_path.
exclude_patterns = [
"spelling_wordlist.txt",
- "contributing/branch-policy.md",
+ "_inc/*",
]
suppress_warnings = [
@@ -179,7 +177,7 @@
"path_to_docs": "docs",
"repository_branch": "main",
"repository_url": "https://github.com/plone/volto",
- "search_bar_text": "Search", # TODO: Confirm usage of search_bar_text in plone-sphinx-theme
+ "search_bar_text": "Search",
"use_edit_page_button": True,
"use_issues_button": True,
"use_repository_button": True,
@@ -187,7 +185,7 @@
# Announce that we have an opensearch plugin
# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_use_opensearch
-html_use_opensearch = "https://6.docs.plone.org" # TODO: Confirm usage of opensearch in theme
+html_use_opensearch = "https://6.docs.plone.org"
# The name for this set of Sphinx documents. If None, it defaults to
# " v documentation".
diff --git a/docs/source/configuration/volto-slate/index.md b/docs/source/configuration/volto-slate/index.md
index d8f51c4726..475cc3653c 100644
--- a/docs/source/configuration/volto-slate/index.md
+++ b/docs/source/configuration/volto-slate/index.md
@@ -13,7 +13,7 @@ myst:
`volto-slate` is an interactive default text editor for Volto, developed on top of {term}`Slate` and integrated into the core system.
It offers enhanced WYSIWYG functionality and behavior.
-See a [brief elevator pitch for `volto-slate`](https://www.youtube.com/watch?v=SOz-rk5e4_w).
+See a [brief elevator pitch for `volto-slate`](https://www.youtube-nocookie.com/embed/SOz-rk5e4_w?privacy_mode=1).
We believe that Volto's rich text form editor (the Volto Composite Page editor) needs strong integration between the rich text capabilities and the rest of the Volto blocks.
Some examples of the kind of strong integration we have in mind:
diff --git a/docs/source/contributing/developing-core.md b/docs/source/contributing/developing-core.md
index f0507b2ede..f0ffb5462e 100644
--- a/docs/source/contributing/developing-core.md
+++ b/docs/source/contributing/developing-core.md
@@ -76,7 +76,7 @@ Volto has the following folder structure.
To set up a Volto core development environment, your system must satisfy the following prerequisites.
-```{include} ./install-operating-system.md
+```{include} ../_inc/_install-operating-system.md
```
- {term}`nvm`
@@ -94,7 +94,7 @@ When developing a project using Plone, Yarn or other package managers may be use
### nvm
-```{include} ./install-nvm.md
+```{include} ../_inc/_install-nvm.md
```
@@ -103,7 +103,7 @@ When developing a project using Plone, Yarn or other package managers may be use
We recommend that you install Node.js using nvm.
Alternatively you can install Node.js using Homebrew or other package installer.
-```{include} ./install-nodejs.md
+```{include} ../_inc/_install-nodejs.md
```
@@ -136,19 +136,19 @@ Compare the output to the [latest pnpm release number](https://www.npmjs.com/pac
### Make
-```{include} ./install-make.md
+```{include} ../_inc/_install-make.md
```
### Docker
-```{include} ./install-docker.md
+```{include} ../_inc/_install-docker.md
```
### Git
-```{include} ../contributing/install-git.md
+```{include} ../_inc/_install-git.md
```
diff --git a/docs/source/contributing/index.md b/docs/source/contributing/index.md
index cc6b8d03b2..46f2240f2b 100644
--- a/docs/source/contributing/index.md
+++ b/docs/source/contributing/index.md
@@ -44,7 +44,7 @@ The Volto Team reviews pull requests only from people with a GitHub account who
## Branch policy
-```{include} ./branch-policy.md
+```{include} ../_inc/_branch-policy.md
```
diff --git a/docs/source/contributing/language-features.md b/docs/source/contributing/language-features.md
index 7102420229..979fed7793 100644
--- a/docs/source/contributing/language-features.md
+++ b/docs/source/contributing/language-features.md
@@ -41,7 +41,6 @@ You can adjust this file according to the environments you want to target.
">1%",
"last 4 versions",
"Firefox ESR",
- "not ie 11",
"not dead"
],
```
diff --git a/docs/source/contributing/version-policy.md b/docs/source/contributing/version-policy.md
index 19bac961b8..fe42d3d1d5 100644
--- a/docs/source/contributing/version-policy.md
+++ b/docs/source/contributing/version-policy.md
@@ -92,7 +92,7 @@ We do not guarantee that outdated browsers, such as Internet Explorer 11, are su
## Branch policy
-```{include} ./branch-policy.md
+```{include} ../_inc/_branch-policy.md
```
diff --git a/docs/source/release-notes/index.md b/docs/source/release-notes/index.md
index 81082946b3..040f15972a 100644
--- a/docs/source/release-notes/index.md
+++ b/docs/source/release-notes/index.md
@@ -17,6 +17,44 @@ myst:
+## 18.1.1 (2024-11-21)
+
+### Bugfix
+
+- Do not break toolbar if layout id is not registered in layoutViewsNamesMapping. @cekk [#6485](https://github.com/plone/volto/issues/6485)
+- Replace _all_ spaces with `-` in `BodyClass` classes, instead of with `-` or `` depending on the content type or section. @giuliaghisini [#6487](https://github.com/plone/volto/issues/6487)
+
+### Internal
+
+- Update instructions to install `pipx` in `RELEASING.md`. @stevepiercy [#6496](https://github.com/plone/volto/issues/6496)
+
+### Documentation
+
+- More privacy concerning youtube links and fixing link check warnings for youtube playlist links. @stevepiercy @ksuess [#4203](https://github.com/plone/volto/issues/4203)
+- Remove conflicting `searchtools.js` file from documentation to allow default Sphinx search in main Plone documentation. @stevepiercy [#6482](https://github.com/plone/volto/issues/6482)
+- Add support for sphinxcontrib-youtube. @stevepiercy [#6486](https://github.com/plone/volto/issues/6486)
+- Refactor documentation includes to align with main documentation pattern. @stevepiercy [#6495](https://github.com/plone/volto/issues/6495)
+
+## 18.1.0 (2024-11-11)
+
+### Feature
+
+- Update Dutch translations. @fredvd [#6476](https://github.com/plone/volto/issues/6476)
+
+### Bugfix
+
+- URL Management control panel: Show errors from a failed CSV upload. @davisagli [#6473](https://github.com/plone/volto/issues/6473)
+- Added missing style Helmet serialization in the HTML component to make it work in SSR. @sneridagh
+ Fix deprecation notice for the usage of apple-mobile-web-app-capable. [#6480](https://github.com/plone/volto/issues/6480)
+
+### Internal
+
+- Added React Router 7 experimental PoC. @sneridagh [#6472](https://github.com/plone/volto/issues/6472)
+
+### Documentation
+
+- Overhaul and update of the add-ons section in documentation. @sneridagh [#6397](https://github.com/plone/volto/issues/6397)
+
## 18.0.3 (2024-11-05)
### Bugfix
diff --git a/docs/source/tutorials/index.md b/docs/source/tutorials/index.md
index 67360cb366..4a1ce15a4e 100644
--- a/docs/source/tutorials/index.md
+++ b/docs/source/tutorials/index.md
@@ -18,6 +18,8 @@ On the [Plone Training website](https://training.plone.org), you'll find Volto-d
- [Mastering Plone 6 Development](https://training.plone.org/mastering-plone/)
The comprehensive training on Plone 6 with best practice tips for developers and integrators.
+- [Customizing Volto Light Theme](https://training.plone.org/customizing-volto-light-theme/index.html)
+- [Volto Customization for JavaScript Beginners](https://training.plone.org/volto-customization/index.html)
- [Volto Hands-On](https://training.plone.org/voltohandson/index.html)
- [Volto Add-ons Development](https://training.plone.org/voltoaddons/index.html)
- [Effective Volto](https://training.plone.org/effective-volto/index.html)
@@ -30,7 +32,11 @@ On the [Plone Training website](https://training.plone.org), you'll find Volto-d
You can watch the talk during the World Plone Day 2021:
-
+```{youtube} kHec4MXH8vo
+:privacy_mode:
+:url_parameters: ?privacy_mode=1
+:width: 100%
+```
## Presentations at Plone Conferences (PloneConf) and other events
@@ -40,43 +46,43 @@ In recent years the React based Volto frontend for Plone has been presented in m
### PloneConf 2023
-- [State of Plone Keynote](https://www.youtube.com/watch?v=jl19wuC0wtw&%3Blist=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&%3Bindex=1)
-- [Piero Nicolli - Theming Volto in 2024](https://www.youtube.com/watch?v=LkPOsIn1jYY&%3Blist=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&%3Bindex=6)
-- [Víctor Fernández de Alba - Breaking boundaries: Plone as headless CMS](https://www.youtube.com/watch?v=43LVtjYyo28&list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=7)
-- [Rob Gietema - How to build a site using Nick](https://www.youtube.com/watch?v=ZbdYvNAnamM&list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=18)
-- [Alok Kumar - Is your Volto add-on developer friendly?](https://www.youtube.com/watch?v=E6fH3NhR2Hc&list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=20)
-- [Dylan Jay and Jefferson Bledsoe - How to implement a Gov Design System in Plone 6](https://www.youtube.com/watch?v=_XmKc7jNIE8&list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=25)
-- [Víctor Fernández de Alba - Volto-light-theme: Volto Theming, Reimagined](https://www.youtube.com/watch?v=t2X2NO62J-8)
+- [State of Plone Keynote](https://www.youtube-nocookie.com/embed/jl19wuC0wtw?list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=1&privacy_mode=1)
+- [Piero Nicolli - Theming Volto in 2024](https://www.youtube-nocookie.com/embed/LkPOsIn1jYY?list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=6&privacy_mode=1)
+- [Víctor Fernández de Alba - Breaking boundaries: Plone as headless CMS](https://www.youtube-nocookie.com/embed/43LVtjYyo28?list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=7&privacy_mode=1)
+- [Rob Gietema - How to build a site using Nick](https://www.youtube-nocookie.com/embed/ZbdYvNAnamM?list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=18&privacy_mode=1)
+- [Alok Kumar - Is your Volto add-on developer friendly?](https://www.youtube-nocookie.com/embed/E6fH3NhR2Hc?list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=20&privacy_mode=1)
+- [Dylan Jay and Jefferson Bledsoe - How to implement a Gov Design System in Plone 6](https://www.youtube-nocookie.com/embed/_XmKc7jNIE8?list=PLGN9BI-OAQkSXMXVBXLWQAQr0AF2xM_NU&index=25&privacy_mode=1)
+- [Víctor Fernández de Alba - Volto-light-theme: Volto Theming, Reimagined](https://www.youtube-nocookie.com/embed/t2X2NO62J-8)
### PloneConf 2022
-[PloneConf 2022 full Playlist on Youtube](https://www.youtube.com/playlist?list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z)
+[PloneConf 2022 full Playlist on Youtube](https://www.youtube-nocookie.com/embed/playlist?list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z&privacy_mode=1)
Plone 6 site presentations:
-- [Rai Way: Plone6 supporting the world of italian information, sports and entertainment](https://www.youtube.com/watch?v=hHHGlSjf5O4&list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z)
-- [How Plone Powers Hundreds of Websites at one of the Largest Research Institutions in Europe](https://www.youtube.com/watch?v=bxWt-GEmPcc&%3Blist=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z)
+- [Rai Way: Plone6 supporting the world of italian information, sports and entertainment](https://www.youtube-nocookie.com/embed/hHHGlSjf5O4?list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z&privacy_mode=1)
+- [How Plone Powers Hundreds of Websites at one of the Largest Research Institutions in Europe](https://www.youtube-nocookie.com/embed/bxWt-GEmPcc?list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z&privacy_mode=1)
Developer/integrator talks:
-- [Anatomy of a Volto project](https://www.youtube.com/watch?v=JtNufyFlgc8&list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z)
-- [Creating a Volto Theme](https://www.youtube.com/watch?v=AMHN74Jr27Y&%3Blist=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z)
-- [A Deep Dive Into Internals Of Volto](https://www.youtube.com/watch?v=sMeTDRgp3uI&list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z)
-- [DevOps Bird's Eye View on the Plone 6 Backend](https://www.youtube.com/watch?v=L5PvGwWC9P4&%3Blist=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z)
+- [Anatomy of a Volto project](https://www.youtube-nocookie.com/embed/JtNufyFlgc8?list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z&privacy_mode=1)
+- [Creating a Volto Theme](https://www.youtube-nocookie.com/embed/AMHN74Jr27Y?list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z&privacy_mode=1)
+- [A Deep Dive Into Internals Of Volto](https://www.youtube-nocookie.com/embed/sMeTDRgp3uI?list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z&privacy_mode=1)
+- [DevOps Bird's Eye View on the Plone 6 Backend](https://www.youtube-nocookie.com/embed/L5PvGwWC9P4?list=PLGN9BI-OAQkQxqQcCZeJefMC8XlA_qv3Z&privacy_mode=1)
### Previous PloneConfs
-- [PloneConf 2021 full Playlist on YouTube](https://www.youtube.com/playlist?list=PLGN9BI-OAQkQDLQinBwdEXpebDTQCwdGi)
-- [PloneConf 2020 full Playlist on YouTube](https://www.youtube.com/playlist?list=PLGN9BI-OAQkTJPayNdKIZ8lLDm5RVOLV3)
+- [PloneConf 2021 full Playlist on YouTube](https://www.youtube-nocookie.com/embed/playlist?list=PLGN9BI-OAQkQDLQinBwdEXpebDTQCwdGi&privacy_mode=1)
+- [PloneConf 2020 full Playlist on YouTube](https://www.youtube-nocookie.com/embed/playlist?list=PLGN9BI-OAQkTJPayNdKIZ8lLDm5RVOLV3&privacy_mode=1)
## World Plone Day 2022
-World Plone Day is a 24-hour streaming event, with the goal was to promote and educate the public about the benefits of using Plone and of being part of the Plone community. [Full World Plone Day 2022 playlist on Youtube](https://www.youtube.com/playlist?list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL)
+World Plone Day is a 24-hour streaming event, with the goal was to promote and educate the public about the benefits of using Plone and of being part of the Plone community. [Full World Plone Day 2022 playlist on Youtube](https://www.youtube-nocookie.com/embed/playlist?list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL&privacy_mode=1)
-- [Plone 6 Volto's Seamless Mode](https://www.youtube.com/watch?v=Mj8pHRBls-w&list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL)
-- [Volto add ons separator and carousel](https://www.youtube.com/watch?v=eyTMI5TYcVg&list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL)
-- [Weekly Volto Live – Retrospective](https://www.youtube.com/watch?v=WT6OjkSrB20&%3Blist=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL)
-- [Migrating from Classic to Volto](https://www.youtube.com/watch?v=09fg456T90s&list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL)
+- [Plone 6 Volto's Seamless Mode](https://www.youtube-nocookie.com/embed/Mj8pHRBls-w?list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL&privacy_mode=1)
+- [Volto add ons separator and carousel](https://www.youtube-nocookie.com/embed/eyTMI5TYcVg?list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL&privacy_mode=1)
+- [Weekly Volto Live – Retrospective](https://www.youtube-nocookie.com/embed/WT6OjkSrB20?list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL&privacy_mode=1)
+- [Migrating from Classic to Volto](https://www.youtube-nocookie.com/embed/09fg456T90s?list=PLGN9BI-OAQkQmEqf6O8jeyoFY1b2hD1uL&privacy_mode=1)
diff --git a/docs/source/user-manual/copy-paste-blocks.md b/docs/source/user-manual/copy-paste-blocks.md
index f15f3b1616..4fbc68e769 100644
--- a/docs/source/user-manual/copy-paste-blocks.md
+++ b/docs/source/user-manual/copy-paste-blocks.md
@@ -28,6 +28,7 @@ This will select all the blocks between the start and end blocks, allowing you t
````{only} not text
```{video} ../_static/user-manual/blocks/block-copy-cut.mp4
+:alt: Copy or cut a block in Volto
```
````
@@ -44,5 +45,6 @@ Also if you hold the {kbd}`ctrl` key while clicking the paste button, it keeps t
````{only} not text
```{video} ../_static/user-manual/blocks/block-paste.mp4
+:alt: Paste a block in Volto
```
````
diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md
index 7e797d13b9..8b6360ff57 100644
--- a/packages/components/CHANGELOG.md
+++ b/packages/components/CHANGELOG.md
@@ -8,6 +8,12 @@
+## 2.2.0 (2024-11-21)
+
+### Feature
+
+- Update RAC to 1.5.0 @sneridagh [#6498](https://github.com/plone/volto/issues/6498)
+
## 2.1.1 (2024-11-05)
### Internal
diff --git a/packages/components/package.json b/packages/components/package.json
index 11df63e9d3..18004f5337 100644
--- a/packages/components/package.json
+++ b/packages/components/package.json
@@ -8,7 +8,7 @@
}
],
"license": "MIT",
- "version": "2.1.1",
+ "version": "2.2.0",
"repository": {
"type": "git",
"url": "http://github.com/plone/components.git"
@@ -110,11 +110,11 @@
"vitest-axe": "^0.1.0"
},
"dependencies": {
- "@react-aria/utils": "^3.25.3",
- "@react-spectrum/utils": "^3.11.11",
+ "@react-aria/utils": "^3.26.0",
+ "@react-spectrum/utils": "^3.12.0",
"@storybook/test": "^8.0.4",
"clsx": "^2.1.1",
- "react-aria-components": "^1.4.0"
+ "react-aria-components": "^1.5.0"
},
"peerDependencies": {
"react": "^16.8.0 || ^17.0.0 || ^18.0.0",
diff --git a/packages/components/src/components/Disclosure/Disclosure.stories.tsx b/packages/components/src/components/Disclosure/Disclosure.stories.tsx
index 6f41082267..c318a693b4 100644
--- a/packages/components/src/components/Disclosure/Disclosure.stories.tsx
+++ b/packages/components/src/components/Disclosure/Disclosure.stories.tsx
@@ -2,7 +2,7 @@ import * as React from 'react';
import { Disclosure } from './Disclosure';
import {
Button,
- UNSTABLE_DisclosurePanel as DisclosurePanel,
+ DisclosurePanel as DisclosurePanel,
} from 'react-aria-components';
import type { Meta, StoryObj } from '@storybook/react';
diff --git a/packages/components/src/components/Disclosure/Disclosure.tsx b/packages/components/src/components/Disclosure/Disclosure.tsx
index 1820159bee..7322a5818b 100644
--- a/packages/components/src/components/Disclosure/Disclosure.tsx
+++ b/packages/components/src/components/Disclosure/Disclosure.tsx
@@ -1,14 +1,11 @@
import * as React from 'react';
import {
- UNSTABLE_Disclosure as RACDisclosure,
+ Disclosure as RACDisclosure,
type DisclosureProps,
} from 'react-aria-components';
/**
* A Disclosure is used to show or hide content that is not visible by default.
- *
- * NOTE: This component is in alpha in RAC thus it's unstable and is subjects of change
- * in the API, behavior, and appearance.
*/
export function Disclosure(props: DisclosureProps) {
return ;
diff --git a/packages/components/src/components/DisclosureGroup/DisclosureGroup.stories.tsx b/packages/components/src/components/DisclosureGroup/DisclosureGroup.stories.tsx
index 1871ade147..c51881e461 100644
--- a/packages/components/src/components/DisclosureGroup/DisclosureGroup.stories.tsx
+++ b/packages/components/src/components/DisclosureGroup/DisclosureGroup.stories.tsx
@@ -2,8 +2,8 @@ import * as React from 'react';
import { DisclosureGroup } from './DisclosureGroup';
import {
Button,
- UNSTABLE_Disclosure as Disclosure,
- UNSTABLE_DisclosurePanel as DisclosurePanel,
+ Disclosure as Disclosure,
+ DisclosurePanel as DisclosurePanel,
} from 'react-aria-components';
import type { Meta, StoryObj } from '@storybook/react';
diff --git a/packages/components/src/components/DisclosureGroup/DisclosureGroup.tsx b/packages/components/src/components/DisclosureGroup/DisclosureGroup.tsx
index 7588d0d580..980950ee75 100644
--- a/packages/components/src/components/DisclosureGroup/DisclosureGroup.tsx
+++ b/packages/components/src/components/DisclosureGroup/DisclosureGroup.tsx
@@ -1,14 +1,11 @@
import * as React from 'react';
import {
- UNSTABLE_DisclosureGroup as RACDisclosureGroup,
+ DisclosureGroup as RACDisclosureGroup,
type DisclosureGroupProps,
} from 'react-aria-components';
/**
* A DisclosureGroup is used to group Disclosures together to create an accordion.
- *
- * NOTE: This component is in alpha in RAC thus it's unstable and is subjects of change
- * in the API, behavior, and appearance.
*/
export function DisclosureGroup(props: DisclosureGroupProps) {
return ;
diff --git a/packages/providers/CHANGELOG.md b/packages/providers/CHANGELOG.md
index 9ee556346e..96a8e9b472 100644
--- a/packages/providers/CHANGELOG.md
+++ b/packages/providers/CHANGELOG.md
@@ -8,6 +8,12 @@
+## 1.0.0-alpha.6 (2024-11-21)
+
+### Feature
+
+- Update RAC to 1.5.0 @sneridagh [#6498](https://github.com/plone/volto/issues/6498)
+
## 1.0.0-alpha.5 (2024-11-05)
### Internal
diff --git a/packages/providers/package.json b/packages/providers/package.json
index 9840705f8f..8a12623112 100644
--- a/packages/providers/package.json
+++ b/packages/providers/package.json
@@ -9,7 +9,7 @@
],
"funding": "https://github.com/sponsors/plone",
"license": "MIT",
- "version": "1.0.0-alpha.5",
+ "version": "1.0.0-alpha.6",
"repository": {
"type": "git",
"url": "https://github.com/plone/volto.git"
@@ -65,7 +65,7 @@
"@plone/components": "workspace:*",
"@plone/registry": "workspace:*",
"@tanstack/react-query": "^5.59.0",
- "react-aria-components": "^1.4.0"
+ "react-aria-components": "^1.5.0"
},
"devDependencies": {
"@arethetypeswrong/cli": "^0.16.4",
diff --git a/packages/registry/docs/conf.py b/packages/registry/docs/conf.py
index 796fc4b620..fa39be8168 100644
--- a/packages/registry/docs/conf.py
+++ b/packages/registry/docs/conf.py
@@ -177,7 +177,7 @@
# Announce that we have an opensearch plugin
# https://www.sphinx-doc.org/en/master/usage/configuration.html#confval-html_use_opensearch
-html_use_opensearch = "https://plone-registry.readthedocs.io/" # TODO: Confirm usage of opensearch in theme
+html_use_opensearch = "https://plone-registry.readthedocs.io"
# The name for this set of Sphinx documents. If None, it defaults to
# " v documentation".
diff --git a/packages/registry/news/6502.documentation b/packages/registry/news/6502.documentation
new file mode 100644
index 0000000000..d46a5b6816
--- /dev/null
+++ b/packages/registry/news/6502.documentation
@@ -0,0 +1 @@
+`html_use_opensearch` value must not have a trailing slash. Clean up comments. @stevepiercy
diff --git a/packages/volto-slate/CHANGELOG.md b/packages/volto-slate/CHANGELOG.md
index b0c2442906..b930fd335e 100644
--- a/packages/volto-slate/CHANGELOG.md
+++ b/packages/volto-slate/CHANGELOG.md
@@ -8,6 +8,12 @@
+## 18.0.1 (2024-11-11)
+
+### Feature
+
+- Update Dutch translations. @fredvd [#6476](https://github.com/plone/volto/issues/6476)
+
## 18.0.0 (2024-10-31)
### Internal
diff --git a/packages/volto-slate/news/6476.feature b/packages/volto-slate/news/6476.feature
deleted file mode 100644
index 97ed49fe87..0000000000
--- a/packages/volto-slate/news/6476.feature
+++ /dev/null
@@ -1 +0,0 @@
-Update Dutch translations. @fredvd
\ No newline at end of file
diff --git a/packages/volto-slate/package.json b/packages/volto-slate/package.json
index d053c3c247..6113f34a3b 100644
--- a/packages/volto-slate/package.json
+++ b/packages/volto-slate/package.json
@@ -1,6 +1,6 @@
{
"name": "@plone/volto-slate",
- "version": "18.0.0",
+ "version": "18.0.1",
"description": "Slate.js integration with Volto",
"main": "src/index.js",
"author": "European Environment Agency: IDM2 A-Team",
diff --git a/packages/volto/CHANGELOG.md b/packages/volto/CHANGELOG.md
index 81082946b3..040f15972a 100644
--- a/packages/volto/CHANGELOG.md
+++ b/packages/volto/CHANGELOG.md
@@ -17,6 +17,44 @@ myst:
+## 18.1.1 (2024-11-21)
+
+### Bugfix
+
+- Do not break toolbar if layout id is not registered in layoutViewsNamesMapping. @cekk [#6485](https://github.com/plone/volto/issues/6485)
+- Replace _all_ spaces with `-` in `BodyClass` classes, instead of with `-` or `` depending on the content type or section. @giuliaghisini [#6487](https://github.com/plone/volto/issues/6487)
+
+### Internal
+
+- Update instructions to install `pipx` in `RELEASING.md`. @stevepiercy [#6496](https://github.com/plone/volto/issues/6496)
+
+### Documentation
+
+- More privacy concerning youtube links and fixing link check warnings for youtube playlist links. @stevepiercy @ksuess [#4203](https://github.com/plone/volto/issues/4203)
+- Remove conflicting `searchtools.js` file from documentation to allow default Sphinx search in main Plone documentation. @stevepiercy [#6482](https://github.com/plone/volto/issues/6482)
+- Add support for sphinxcontrib-youtube. @stevepiercy [#6486](https://github.com/plone/volto/issues/6486)
+- Refactor documentation includes to align with main documentation pattern. @stevepiercy [#6495](https://github.com/plone/volto/issues/6495)
+
+## 18.1.0 (2024-11-11)
+
+### Feature
+
+- Update Dutch translations. @fredvd [#6476](https://github.com/plone/volto/issues/6476)
+
+### Bugfix
+
+- URL Management control panel: Show errors from a failed CSV upload. @davisagli [#6473](https://github.com/plone/volto/issues/6473)
+- Added missing style Helmet serialization in the HTML component to make it work in SSR. @sneridagh
+ Fix deprecation notice for the usage of apple-mobile-web-app-capable. [#6480](https://github.com/plone/volto/issues/6480)
+
+### Internal
+
+- Added React Router 7 experimental PoC. @sneridagh [#6472](https://github.com/plone/volto/issues/6472)
+
+### Documentation
+
+- Overhaul and update of the add-ons section in documentation. @sneridagh [#6397](https://github.com/plone/volto/issues/6397)
+
## 18.0.3 (2024-11-05)
### Bugfix
diff --git a/packages/volto/cypress/tests/core/a11y/content.js b/packages/volto/cypress/tests/core/a11y/content.js
new file mode 100644
index 0000000000..c266399a4b
--- /dev/null
+++ b/packages/volto/cypress/tests/core/a11y/content.js
@@ -0,0 +1,100 @@
+describe('Accessibility Tests Content Types', () => {
+ beforeEach(() => {
+ cy.autologin();
+ cy.visit('/');
+ cy.injectAxe(); // make sure axe is available on the page
+ });
+
+ it('Event tested for a11y axe violations', () => {
+ cy.get('#toolbar-add').click();
+ cy.get('#toolbar-add-event').click();
+ cy.get('.documentFirstHeading').type('Test Event Content Type');
+
+ cy.get('#toolbar-save').click();
+
+ cy.wait(1000);
+ cy.get('.ics-download').contains('Download Event').focus();
+ cy.checkA11y();
+ });
+
+ it('File tested for a11y axe violations', () => {
+ cy.get('#toolbar-add').click();
+ cy.get('#toolbar-add-file').click();
+ cy.get('#field-title').type('Test File Content Type');
+ cy.get('#field-description').type(
+ 'A11y cypress test for File content type',
+ );
+
+ cy.get('input[id="field-file"]').attachFile('file.pdf', {
+ subjectType: 'input',
+ });
+
+ cy.get('#toolbar-save').focus().click();
+
+ cy.wait(1000);
+ cy.contains('file.pdf').focus();
+ cy.checkA11y();
+ });
+
+ it('Image tested for a11y axe violations', () => {
+ cy.get('#toolbar-add').click();
+ cy.get('#toolbar-add-image').click();
+ cy.get('#field-title').type('Test Image Content Type');
+ cy.get('#field-description').type('Image description');
+ cy.fixture('image.png', 'base64')
+ .then((fc) => {
+ return Cypress.Blob.base64StringToBlob(fc);
+ })
+ .then((fileContent) => {
+ cy.get('input#field-image').attachFile(
+ { fileContent, fileName: 'image.png', mimeType: 'image/png' },
+ { subjectType: 'input' },
+ );
+ cy.get('#field-image-image').parent().parent().contains('image.png');
+ });
+ cy.get('#toolbar-save').click();
+
+ cy.wait(1000);
+ cy.get('#view img').should('have.attr', 'alt', 'Test Image Content Type');
+ cy.checkA11y();
+ });
+
+ it('Link tested for a11y axe violations', () => {
+ cy.get('#toolbar-add').click();
+ cy.get('#toolbar-add-link').click();
+ cy.get('#field-title').type('Test Link Content Type');
+ cy.get('#field-description').type(
+ 'A11y cypress test for Link content type',
+ );
+ cy.get('#field-remoteUrl').type('https://google.com');
+ cy.get('#toolbar-save').click();
+
+ cy.wait(1000);
+ cy.get('a.external')
+ .should('have.attr', 'href', 'https://google.com')
+ .focus();
+ cy.checkA11y();
+ });
+
+ it('News Item tested for a11y axe violations', () => {
+ cy.get('#toolbar-add').click();
+ cy.get('#toolbar-add-news-item').click();
+ cy.get('.documentFirstHeading').type('Test News Content Type');
+ cy.get('#field-description').type('test summary');
+ cy.get('#field-subjects').type('test');
+ cy.get('#toolbar-save').click();
+
+ cy.wait(1000);
+ cy.checkA11y();
+ });
+
+ it('Page tested for a11y axe violations', () => {
+ cy.get('#toolbar-add').click();
+ cy.get('#toolbar-add-document').click();
+ cy.get('.documentFirstHeading').type('My Page');
+ cy.get('#toolbar-save').click();
+
+ cy.wait(1000);
+ cy.checkA11y();
+ });
+});
diff --git a/packages/volto/cypress/tests/core/basic/metadata.js b/packages/volto/cypress/tests/core/basic/metadata.js
index 6d5b414aad..7c7924cd1e 100644
--- a/packages/volto/cypress/tests/core/basic/metadata.js
+++ b/packages/volto/cypress/tests/core/basic/metadata.js
@@ -41,6 +41,7 @@ describe('Add Content Tests', () => {
});
it('After removing value of widget the focus should be removed from the field', () => {
+ cy.wait(2000);
cy.get('#field-creators').type('aaa');
cy.get('#field-creators')
.type('aaa{Enter}')
diff --git a/packages/volto/news/6339.internal b/packages/volto/news/6339.internal
new file mode 100644
index 0000000000..972df6ac4d
--- /dev/null
+++ b/packages/volto/news/6339.internal
@@ -0,0 +1 @@
+Add Accessibility acceptance tests for content types. @ana-oprea @ichim-david
diff --git a/packages/volto/news/6397.documentation b/packages/volto/news/6397.documentation
deleted file mode 100644
index 21135b8b4a..0000000000
--- a/packages/volto/news/6397.documentation
+++ /dev/null
@@ -1 +0,0 @@
-Overhaul and update of the add-ons section in documentation. @sneridagh
diff --git a/packages/volto/news/6472.internal b/packages/volto/news/6472.internal
deleted file mode 100644
index af14cbd425..0000000000
--- a/packages/volto/news/6472.internal
+++ /dev/null
@@ -1 +0,0 @@
-Added React Router 7 experimental PoC. @sneridagh
diff --git a/packages/volto/news/6473.bugfix b/packages/volto/news/6473.bugfix
deleted file mode 100644
index f69b52f0e1..0000000000
--- a/packages/volto/news/6473.bugfix
+++ /dev/null
@@ -1 +0,0 @@
-URL Management control panel: Show errors from a failed CSV upload. @davisagli
diff --git a/packages/volto/news/6476.feature b/packages/volto/news/6476.feature
deleted file mode 100644
index 97ed49fe87..0000000000
--- a/packages/volto/news/6476.feature
+++ /dev/null
@@ -1 +0,0 @@
-Update Dutch translations. @fredvd
\ No newline at end of file
diff --git a/packages/volto/news/6499.documentation b/packages/volto/news/6499.documentation
new file mode 100644
index 0000000000..30b4d41068
--- /dev/null
+++ b/packages/volto/news/6499.documentation
@@ -0,0 +1 @@
+Add new Volto trainings to tutorials. @stevepiercy
diff --git a/packages/volto/news/6501.bugfix b/packages/volto/news/6501.bugfix
new file mode 100644
index 0000000000..90818d36c8
--- /dev/null
+++ b/packages/volto/news/6501.bugfix
@@ -0,0 +1 @@
+Remove `not ie 11` from browserslist configuration, because it is now included in `not dead`. @stevepiercy
diff --git a/packages/volto/news/6502.documentation b/packages/volto/news/6502.documentation
new file mode 100644
index 0000000000..d46a5b6816
--- /dev/null
+++ b/packages/volto/news/6502.documentation
@@ -0,0 +1 @@
+`html_use_opensearch` value must not have a trailing slash. Clean up comments. @stevepiercy
diff --git a/packages/volto/package.json b/packages/volto/package.json
index f09d892ea6..8e002cf546 100644
--- a/packages/volto/package.json
+++ b/packages/volto/package.json
@@ -9,7 +9,7 @@
}
],
"license": "MIT",
- "version": "18.0.3",
+ "version": "18.1.1",
"repository": {
"type": "git",
"url": "git@github.com:plone/volto.git"
@@ -171,7 +171,6 @@
">1%",
"last 4 versions",
"Firefox ESR",
- "not ie 11",
"not dead"
],
"engines": {
diff --git a/packages/volto/src/components/manage/Display/Display.jsx b/packages/volto/src/components/manage/Display/Display.jsx
index 5b098644ea..7633b804a1 100644
--- a/packages/volto/src/components/manage/Display/Display.jsx
+++ b/packages/volto/src/components/manage/Display/Display.jsx
@@ -123,13 +123,15 @@ const DisplaySelect = (props) => {
? state.content.data[getLayoutFieldname(state.content.data)]
: '',
);
+ const layoutMappingId = config.views.layoutViewsNamesMapping?.[layout];
const [selectedOption, setselectedOption] = useState({
value: layout,
- label:
- intl.formatMessage({
- id: config.views.layoutViewsNamesMapping?.[layout],
- defaultMessage: config.views.layoutViewsNamesMapping?.[layout],
- }) || layout,
+ label: layoutMappingId
+ ? intl.formatMessage({
+ id: layoutMappingId,
+ defaultMessage: layoutMappingId,
+ })
+ : layout,
});
const type = useSelector((state) =>
diff --git a/packages/volto/src/components/theme/App/App.jsx b/packages/volto/src/components/theme/App/App.jsx
index a7a65415f0..c3076a7fc4 100644
--- a/packages/volto/src/components/theme/App/App.jsx
+++ b/packages/volto/src/components/theme/App/App.jsx
@@ -141,7 +141,7 @@ export class App extends Component {
{this.props.content && this.props.content['@type'] && (
)}
@@ -155,7 +155,7 @@ export class App extends Component {
[`is-adding-contenttype-${decodeURIComponent(
this.props.location?.search?.replace('?type=', ''),
)
- .replace(' ', '')
+ .replaceAll(' ', '-')
.toLowerCase()}`]: this.props.location?.search,
'is-authenticated': !!this.props.token,
'is-anonymous': !this.props.token,
diff --git a/packages/volto/src/helpers/Html/Html.jsx b/packages/volto/src/helpers/Html/Html.jsx
index 7ecd78135e..4a9ae607f5 100644
--- a/packages/volto/src/helpers/Html/Html.jsx
+++ b/packages/volto/src/helpers/Html/Html.jsx
@@ -102,6 +102,7 @@ class Html extends Component {
{head.meta.toComponent()}
{head.link.toComponent()}
{head.script.toComponent()}
+ {head.style.toComponent()}
-
+
{process.env.NODE_ENV === 'production' && criticalCss && (