From 59d5af49a47a6788d6edd2cf0c0393eef57d946c Mon Sep 17 00:00:00 2001 From: Tiberiu Ichim Date: Sun, 20 Feb 2022 19:13:07 +0200 Subject: [PATCH] Plone 6 docs (#3001) * WIP on making something usable for sphinx * Add index files, to be used with spinx * Change cheatsheet to MyST, improve the main index * Make links into a bulleted list * Add MyST link examples and a seealso to documentation's MyST cheat sheet * First draft of contributing with Volto submodules. Move existing "Managing contributions on GitHub" section after "Contributor Roles" section * remove polluted .md files having which are not in docs/ * Fix all broken links and redirects, except: - volto/upgrade-guide/index.md:283: [broken] https://github.com/kitconcept/plone.volto/pull/29: 404 Client Error: Not Found for url: https://github.com/kitconcept/plone.volto/pull/29 - volto/addons/i18n.md:15: [broken] https://github.com/plone/volto/blob/master/src/i18n.js: 404 Client Error: Not Found for url: https://github.com/plone/volto/blob/master/src/i18n.js * Add change log entry * Fix one of two broken links * Move /recipes/overridei18n.md content to /recipes/i18n.md * Docs: Add metadata * Update add-on Internationalization to current way to do * Update CHANGELOG.md * grammar and syntax fixes Co-authored-by: Steve Piercy * grammar and syntax fixes Co-authored-by: Steve Piercy * grammar and syntax fixes Co-authored-by: Steve Piercy * mark technical terms Co-authored-by: Steve Piercy * Better wording Co-authored-by: Steve Piercy * Clear instructions and result Co-authored-by: Steve Piercy * grammar and syntax fixes Co-authored-by: Steve Piercy * Clear instructions and result Co-authored-by: Steve Piercy * MySt adjustments Co-Authored-By: Steve Piercy * Update i18n.md Line break * Create a new Documentation section in CHANGELOG.md * Final clean up - Consistent indent of enumerated list - Remove duplicate lines because GitHub does not allow multi-line suggestions * Deduplicate index label * Add line break * Remove bad merge conflict resolution * Fix typo * Content was moved to recipes/i18n.md * Fix bad link * Add MyST and Sphinx basic configuration * Add CHANGELOG.md entry * Add docs/_build/ to .gitignore * Remove references to files that were moved under developer-guidelines Remove comments that are obsolete Add html_meta values * Fix heading levels Add html_meta values * Align toctree elements with production Remove redundant directory listing Add html_meta values * Fix add-ons spelling Remove `./` Fix syntax highlighting and emphasis Fix broken references Add html_meta values * Fix jsx syntax highlighting Add html_meta values * Fix jsx syntax highlighting Add html_meta values * Fix reference to addons/index Add html_meta values * Fix references Add html_meta values * Merge plone6index.md into index.md Adjust references * Fix nginx syntax highlighting (conf -> nginx) Add html_meta values * Improve shell syntax highlighting and formatting Minor grammar fixes Add html_meta values * Minor grammar fixes Remove unused lexer parameter Add html_meta values * Fix download link Add html_meta values * Fix syntax highlighting Add html_meta values * Fix reference to addons/index Add html_meta values * Fix broken link to storybook Add html_meta values * Fix json highlighting (do not use ellipses or comments) Fix reference to openobjectbrowser-handler-api-label Add html_meta values * Add change log entry * Unfix "fixes" for jsx syntax highlighting * Don't use `'` in lexed code blocks. Sheesh! * Don't use `'` in lexed code blocks. Sheesh! * dedupe cheatsheet as its already in Plone docs * Revert "dedupe cheatsheet as its already in Plone docs" This reverts commit baffc8b26354dfcebe141a4022c3d57a62c14c9a. * Add plone to Intersphinx configuration, and update link in cheatsheet.md * Add CHANGELOG.md entry * Get version from package.json * Remove legacy folder in docs * Add typescript to toctree * Remove mkdocs config (#3070) * Remove mkdocs configuration * Use correct filename in Makefile to install requirements for standalone docs * Add CHANGELOG.md entry * Restore logos * Remove mkdocs remainings, docs-clean cleans also legacy docs envs * Move logos up to root of directory, and adjust link in README.md * Improve help comment * Update docs GitHub workflow to use Sphinx/MyST only * Add netlify target for preview of Sphinx HTML docs build * Add CHANGELOG.md entry for Netlify * Add runtime.txt to specify Python version for Netlify * Adjust Netlify build path Co-authored-by: Victor Fernandez de Alba * Fix docs not referenced in any doctree. Cleanup the ones not needed * Use `orphan` field list item to build the file, but exclude from toctree omissions errors and navigation. * Add html_meta values * Use correct internal link reference * Grammar and one sentence per line * Remove obsolete links to Python Markdown extensions, now that we use MyST * Remove unnecessary and undefined variable from docs-livehtml target * Add CHANGELOG.md entry * Remove runtime.txt and instead use global setting for netlify See https://docs.netlify.com/configure-builds/environment-variables/ * Attempt to turn off some checks, set environment variable to use Python 3.8 * Remove blank configuration values. It is not possible to disable these preview builds. See https://answers.netlify.com/t/disabling-header-rules-pages-changed-redirect-rules-mixed-content-reports/46323/2 * Use netlify.toml to set PYTHON_VERSION env var instead of obscured global setting * Use MyST admonition syntax * Fix indentation of list items so that code blocks and admonitions align are within their list items Add html_meta tags * Remove optional `true` for `:sorted:` * Add html_meta values * Add CHANGELOG.md * Backport 15-alpha docs (#3066) * Changes in docs (upgrade guide) until Volto 15a3 * Upgrade Guide i18n: Make clear what's project, what add-on. @ksuess (backport #3056) * Add Widget additional information link (#2999) Add a link to widget developer recipe at the end of Widget section. I think it is import to point developer where to find information about customizing and overriding widgets. Thanks @tiberiuichim for the tip https://community.plone.org/t/using-react-currency-selector/14737 * Backport RAZZLE_ environment variable docs Add html_meta tag values for SEO See https://github.com/plone/volto/pull/3067/files#diff-00609ed769cd40cf3bc3d6fcc4431b714cb37c73cedaaea18fe9fc4c1c589597 * Backport upgrade guide for #2992 (Lazy load draftJS) * Backport Richsettings docs of #2992 * Backport docs for #3067 (ADDONS var) * Update changelog to latest Co-authored-by: Arky Co-authored-by: Steve Piercy Co-authored-by: Victor Fernandez de Alba Co-authored-by: Steve Piercy Co-authored-by: nileshgulia1 Co-authored-by: ksuess Co-authored-by: Arky --- .github/ISSUE_TEMPLATE/bug_report.md | 13 +- .github/ISSUE_TEMPLATE/feature_request.md | 1 - .github/workflows/docs.yml | 70 +-- .gitignore | 3 + CHANGELOG.md | 18 + CODE_OF_CONDUCT.md | 1 - COMMITLINT.md | 40 +- Makefile | 75 ++- README.md | 2 +- SECURITY.md | 1 - docs/mkdocs.yml | 108 ---- docs/source/_static/Plone_logo_square.png | Bin 0 -> 30912 bytes docs/source/_static/custom.css | 236 ++++++++ docs/source/_static/favicon.ico | Bin 0 -> 5430 bytes docs/source/_static/logo.png | Bin 0 -> 12314 bytes docs/source/_static/logo.svg | 48 ++ docs/source/_static/logo_2x.png | Bin 0 -> 3243 bytes docs/source/_static/print.css | 3 + docs/source/_static/searchtools.js | 553 ++++++++++++++++++ docs/source/_static/standards.png | Bin 0 -> 24305 bytes docs/source/addons/best-practices.md | 10 +- docs/source/addons/i18n.md | 71 +-- docs/source/addons/index.md | 110 ++-- docs/source/backend/index.md | 20 +- docs/source/blocks/anatomy.md | 15 +- docs/source/blocks/editcomponent.md | 26 +- docs/source/blocks/extensions.md | 30 +- docs/source/blocks/index.md | 32 + docs/source/blocks/introduction.md | 17 +- docs/source/blocks/settings.md | 15 +- docs/source/blocks/ssr.md | 8 + docs/source/cheatsheet.md | 129 ++-- docs/source/conf.py | 242 ++++++++ docs/source/configuration/backend.md | 20 +- .../configuration/environmentvariables.md | 32 +- docs/source/configuration/expanders.md | 8 + docs/source/configuration/how-to.md | 12 +- docs/source/configuration/index.md | 41 ++ docs/source/configuration/internalproxy.md | 25 +- docs/source/configuration/locking.md | 8 + docs/source/configuration/multilingual.md | 17 +- .../configuration/richeditor-settings.md | 8 + .../configuration/settings-reference.md | 194 +++--- docs/source/configuration/workingcopy.md | 8 + .../configuration/zero-config-builds.md | 24 +- docs/source/contributing/guidelines.md | 8 + docs/source/contributing/index.md | 18 +- docs/source/contributing/volips.md | 0 docs/source/deploying/apache.md | 8 + docs/source/deploying/index.md | 30 + docs/source/deploying/performance.md | 8 + docs/source/deploying/pm2.md | 18 +- docs/source/deploying/seamless-mode.md | 32 +- docs/source/deploying/sentry.md | 40 +- docs/source/deploying/simple.md | 15 +- .../developer-guidelines/acceptance-tests.md | 8 + .../accessibility-guidelines.md | 12 +- .../developer-guidelines/design-principles.md | 8 + docs/source/developer-guidelines/index.md | 26 + .../developer-guidelines/language-features.md | 19 +- docs/source/developer-guidelines/linting.md | 15 +- docs/source/developer-guidelines/react.md | 15 +- docs/source/developer-guidelines/redux.md | 32 +- docs/source/developer-guidelines/routing.md | 15 +- .../developer-guidelines/style-guide.md | 12 +- docs/source/developer-guidelines/testing.md | 17 +- .../source/developer-guidelines/typescript.md | 13 +- docs/source/getting-started/index.md | 18 + docs/source/getting-started/install.md | 212 ++++--- docs/source/getting-started/others.md | 8 + docs/source/getting-started/roadmap.md | 10 +- docs/source/index.md | 33 +- docs/source/introduction/introduction.md | 33 -- docs/source/legacy/create_example.txt | 26 - docs/source/legacy/introduction.md | 11 - docs/source/legacy/manage.md | 7 - docs/source/legacy/mosaic.md | 10 - docs/source/legacy/theme.md | 7 - docs/source/recipes/actions-reducers.md | 4 - docs/source/recipes/appextras.md | 10 +- docs/source/recipes/contextnavigation.md | 11 +- docs/source/recipes/creating-project.md | 22 +- docs/source/recipes/creating-views.md | 8 + docs/source/recipes/customizing-components.md | 29 +- docs/source/recipes/customizing-views.md | 8 + docs/source/recipes/environment-variables.md | 49 +- docs/source/recipes/express.md | 15 +- docs/source/recipes/fetch-data.md | 4 - docs/source/recipes/folder-structure.md | 8 + docs/source/recipes/i18n.md | 75 ++- docs/source/{ => recipes}/ie11compat.md | 20 +- docs/source/recipes/index.md | 46 ++ docs/source/recipes/lazyload.md | 20 +- docs/source/recipes/overridei18n.md | 32 - docs/source/recipes/pluggables.md | 14 +- docs/source/recipes/widget.md | 19 +- docs/source/releases.md | 18 +- docs/source/robots.txt | 7 + docs/source/spelling_wordlist.txt | 440 ++++++++++++++ docs/source/theming/about-semantic.md | 10 +- docs/source/theming/custom-styling.md | 48 +- docs/source/theming/index.md | 30 + docs/source/theming/integrate-third-party.md | 4 - docs/source/theming/semanticui-theming.md | 8 + docs/source/theming/theming-engine.md | 8 + docs/source/theming/theming-strategy.md | 8 + .../theming/using-third-party-themes.md | 15 +- docs/source/upgrade-guide/index.md | 208 +++++-- docs/theme/partials/header.html | 47 -- {docs/logos => logos}/Logo.png | Bin {docs/logos => logos}/volto-colorful.png | Bin {docs/logos => logos}/volto-colorful.svg | 0 {docs/logos => logos}/volto-guide.png | Bin {docs/logos => logos}/volto-h-transparent.svg | 0 {docs/logos => logos}/volto-transparent.png | Bin {docs/logos => logos}/volto-transparent.svg | 0 {docs/logos => logos}/volto-transparent2.svg | 0 {docs/logos => logos}/volto-yellow.svg | 0 {docs/logos => logos}/volto.sketch | Bin netlify.toml | 2 + packages/generator-volto/README.md | 2 + .../generators/app/templates/README.md | 1 - requirements-docs.txt | 16 +- 123 files changed, 3266 insertions(+), 1038 deletions(-) delete mode 100644 docs/mkdocs.yml create mode 100644 docs/source/_static/Plone_logo_square.png create mode 100644 docs/source/_static/custom.css create mode 100644 docs/source/_static/favicon.ico create mode 100644 docs/source/_static/logo.png create mode 100644 docs/source/_static/logo.svg create mode 100644 docs/source/_static/logo_2x.png create mode 100644 docs/source/_static/print.css create mode 100644 docs/source/_static/searchtools.js create mode 100644 docs/source/_static/standards.png create mode 100644 docs/source/conf.py create mode 100644 docs/source/configuration/index.md delete mode 100644 docs/source/contributing/volips.md create mode 100644 docs/source/deploying/index.md create mode 100644 docs/source/developer-guidelines/index.md create mode 100644 docs/source/getting-started/index.md delete mode 100644 docs/source/introduction/introduction.md delete mode 100644 docs/source/legacy/create_example.txt delete mode 100644 docs/source/legacy/introduction.md delete mode 100644 docs/source/legacy/manage.md delete mode 100644 docs/source/legacy/mosaic.md delete mode 100644 docs/source/legacy/theme.md delete mode 100644 docs/source/recipes/actions-reducers.md delete mode 100644 docs/source/recipes/fetch-data.md rename docs/source/{ => recipes}/ie11compat.md (76%) create mode 100644 docs/source/recipes/index.md delete mode 100644 docs/source/recipes/overridei18n.md create mode 100644 docs/source/robots.txt create mode 100644 docs/source/spelling_wordlist.txt create mode 100644 docs/source/theming/index.md delete mode 100644 docs/source/theming/integrate-third-party.md delete mode 100644 docs/theme/partials/header.html rename {docs/logos => logos}/Logo.png (100%) rename {docs/logos => logos}/volto-colorful.png (100%) rename {docs/logos => logos}/volto-colorful.svg (100%) rename {docs/logos => logos}/volto-guide.png (100%) rename {docs/logos => logos}/volto-h-transparent.svg (100%) rename {docs/logos => logos}/volto-transparent.png (100%) rename {docs/logos => logos}/volto-transparent.svg (100%) rename {docs/logos => logos}/volto-transparent2.svg (100%) rename {docs/logos => logos}/volto-yellow.svg (100%) rename {docs/logos => logos}/volto.sketch (100%) create mode 100644 netlify.toml diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index bb88bf9cc3..2890551b80 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -4,7 +4,6 @@ about: Create a report to help us improve Volto title: '' labels: '01 type: bug' assignees: '' - --- **Describe the bug** @@ -12,6 +11,7 @@ A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: + 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' @@ -24,11 +24,12 @@ A clear and concise description of what you expected to happen. If applicable, add screenshots to help explain your problem. **Software (please complete the following information):** - - OS: [e.g. iOS] - - Browser [e.g. chrome, safari] - - Volto Version [e.g. 8.5.0] - - Plone Version [e.g. 5.2.2] - - Plone REST API Version [e.g. 7.0.1] + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Volto Version [e.g. 8.5.0] +- Plone Version [e.g. 5.2.2] +- Plone REST API Version [e.g. 7.0.1] **Additional context** Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md index 537e0b62bf..4f3c00fc34 100644 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -4,7 +4,6 @@ about: Suggest an idea for Volto title: '' labels: '04 type: enhancement' assignees: '' - --- **Is your feature request related to a problem? Please describe.** diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index d7e1f63868..f34e4f72f1 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -3,79 +3,41 @@ on: push: branches: - master + # Build pull requests + pull_request: + jobs: - build: + docs: runs-on: ubuntu-latest strategy: matrix: - node-version: [16.x] - python-version: [3.7] + python-version: [3.10] steps: - uses: actions/checkout@v2 - # node setup - - name: Use Node.js ${{ matrix.node-version }} - uses: actions/setup-node@v1 - with: - node-version: ${{ matrix.node-version }} - - # node cache - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v1 - id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} - restore-keys: | - ${{ runner.os }}-yarn- - - # node install - - run: yarn install --frozen-lockfile - - # python setup - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v1 + uses: actions/setup-python@v2 with: python-version: ${{ matrix.python-version }} - # python cache - - uses: actions/cache@v1 + - name: Use Python GitHub Actions cache + uses: actions/cache@v2 with: path: ~/.cache/pip key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements-docs.txt') }} restore-keys: | ${{ runner.os }}-pip- - # python install - - run: pip install virtualenv + - name: Create Python virtual environment + run: pip install virtualenv - - name: pip install + - name: pip install requirements run: pip install -r requirements-docs.txt - # Build main documentation - - name: Build documentation + - name: Check for broken links working-directory: docs - run: mkdocs build - - # Build Storybook - - name: Build Storybook - run: yarn build-storybook -o docs/build/storybook - - # Deploy docs to server - - name: Deploy to server - id: deploy - uses: Pendect/action-rsyncer@v1.1.0 - env: - DEPLOY_KEY: ${{secrets.DEPLOY_KEY}} - with: - flags: '-avzr --delete' - options: '' - ssh_options: '-p ${{secrets.DEPLOY_PORT}}' - src: 'docs/build/' - dest: '${{secrets.DEPLOY_USER}}@${{secrets.DEPLOY_SERVER}}:/var/www/docs.voltocms.com' - + run: make docs-linkcheckbroken - - name: Display status from deploy - run: echo "${{ steps.deploy.outputs.status }}" + - name: Build HTML documentation + working-directory: docs + run: make docs-html diff --git a/.gitignore b/.gitignore index c5e65838a0..126aa4bde0 100644 --- a/.gitignore +++ b/.gitignore @@ -65,3 +65,6 @@ cypress/screenshots # Local environment setup .env public/critical.css + +# Sphinx and MyST +docs/_build/ \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index e7473555d0..c238a31a57 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,24 @@ ### Internal +### Documentation + +- (Experimental) Prepare documentation for MyST and importing into `plone/documentation@6-dev`. @stevepiercy +- Fix broken links and redirects in documentation to be compatible with MyST. @stevepiercy +- Update add-on internationalization. @ksuess +- Add MyST and Sphinx basic configuration for rapid build and comparison against MkDocs builds. @stevepiercy +- Fix many MyST and Sphinx warnings. @stevepiercy +- Remove MkDocs configuration. See https://github.com/plone/volto/issues/3042 @stevepiercy +- Add Plone docs to Intersphinx and fix broken link. @stevepiercy +- Get version from `package.json` @sneridagh +- Remove legacy folder in docs @sneridagh +- Backport docs of RAZZLE_TESTING_ADDONS environment variables. See https://github.com/plone/volto/pull/3067/files#diff-00609ed769cd40cf3bc3d6fcc4431b714cb37c73cedaaea18fe9fc4c1c589597 @stevepiercy +- Add missing developer-guidelines/typescript to toctree @stevepiercy +- Add Netlify for preview of Sphinx builds for pull requests against `master` and `plone6-docs`. @stevepiercy +- Clean up toctree errors by removing obsolete files, adding `:orphan:` field list, and reorganizing some files. @sneridagh and @stevepiercy +- Switch to using netlify.toml to configure Netlify Python environment. @stevepiercy +- Convert admonition syntax from Markdown to MyST. @sneridagh + ## 15.0.0-alpha.5 (2022-02-16) ### Breaking diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index 636488d727..ddbeaa4da4 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -11,4 +11,3 @@ If a participant engages in harassing behavior, representatives of the community If you are being harassed, notice that someone else is being harassed, or have any other concerns, please act to intercede or ask for help from any member of the Plone Foundation, IRC chat admins, website admins, or organizers/representatives of any physical events put on under the auspices of the Plone Foundation. Source: https://plone.org/foundation/materials/foundation-resolutions/code-of-conduct (2019-09-29) - diff --git a/COMMITLINT.md b/COMMITLINT.md index 916bb53c2e..a4a79c240c 100644 --- a/COMMITLINT.md +++ b/COMMITLINT.md @@ -4,75 +4,73 @@ Volto uses the (conventional commit specification)[https://www.conventionalcommi All commit messages should have the following form: -```` +``` : -```` +``` ## Fix A fix (PATCH in semantic versioning) looks like this: -```` +``` fix: correct minor typos in code -```` +``` ## Feature A new feature (MINOR in semantic versioning) looks like this: -```` +``` feat: add catalan language -```` +``` ## Breaking Change Breaking changes can be indicated by either appending a "!" to the type: -```` +``` refactor!: drop support for Node 6 -```` +``` Or adding "BREAKING CHANGE" to the commit message body text: -```` +``` refactor!: drop support for Node 6 BREAKING CHANGE: refactor to use JavaScript features not available in Node 6. -```` +``` ## Available Types In addition to "fix" and "feat" the following types are allowed: build:, chore:, ci:, docs:, style:, refactor:, perf:, test: - - Install commitlint: -```` +``` npm install --save-dev @commitlint/{config-conventional,cli} -```` +``` or via yarn: -```` +``` yarn add @commitlint/{config-conventional,cli} -```` +``` Create a commitlint.config.js file: -```` +``` echo "module.exports = {extends: ['@commitlint/config-conventional']}" > commitlint.config.js -```` +``` Add husky to package.json: -```` +``` { "husky": { "hooks": { "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" - } + } } } -```` \ No newline at end of file +``` diff --git a/Makefile b/Makefile index 5769256520..d429b0e176 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,16 @@ INSTANCE_PORT=8080 DOCKER_IMAGE=plone/plone-backend:5.2.6 KGS=plone.restapi==8.21.0 plone.volto==4.0.0a3 plone.rest==2.0.0a2 plone.app.iterate==4.0.2 plone.app.vocabularies==4.3.0 +# Sphinx variables +# You can set these variables from the command line. +SPHINXOPTS ?= +# Internal variables. +SPHINXBUILD = $(realpath bin/sphinx-build) +SPHINXAUTOBUILD = $(realpath bin/sphinx-autobuild) +DOCS_DIR = ./docs/source/ +BUILDDIR = ../_build/ +ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(SPHINXOPTS) . + # Recipe snippets for reuse CHECKOUT_BASENAME=$(shell basename $(shell realpath ./)) @@ -92,19 +102,62 @@ test-clean: ## Test in a separate, clean worktree to expose clean build issues # Leave the temporary worktree around for the developer to inspect. # Use the `$ make clean-tmp-worktrees` target to clean up all temporary worktrees -.PHONY: docs-serve -docs-serve: - (cd docs && ../bin/mkdocs serve) - -.PHONY: docs-build -docs-build: -# The build in netlify breaks because they have not installed ensurepip -# So we should continue using virtualenv - virtualenv --python=python3 . - ./bin/pip install -r requirements-docs.txt - (cd docs && ../bin/mkdocs build) +.PHONY: storybook-build +storybook-build: yarn build-storybook -o docs/build/storybook +bin/python: + python3 -m venv . || virtualenv --clear --python=python3 . + bin/python -m pip install --upgrade pip + bin/pip install -r requirements-docs.txt + +.PHONY: docs-clean +docs-clean: ## Clean current and legacy docs build directories, and Python virtual environment + cd $(DOCS_DIR) && rm -rf $(BUILDDIR)/ + rm -rf bin include lib + rm -rf docs/build + +.PHONY: docs-html +docs-html: bin/python ## Build html + cd $(DOCS_DIR) && $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html + @echo + @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." + +.PHONY: docs-livehtml +docs-livehtml: bin/python ## Rebuild Sphinx documentation on changes, with live-reload in the browser + cd "$(DOCS_DIR)" && ${SPHINXAUTOBUILD} \ + --ignore "*.swp" \ + -b html . "$(BUILDDIR)/html" $(SPHINXOPTS) + +.PHONY: docs-linkcheck +docs-linkcheck: bin/python ## Run linkcheck + cd $(DOCS_DIR) && $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/ ." + +.PHONY: docs-linkcheckbroken +docs-linkcheckbroken: bin/python ## Run linkcheck and show only broken links + cd $(DOCS_DIR) && $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck | GREP_COLORS='0;31' egrep -wi broken --color=auto + @echo + @echo "Link check complete; look for any errors in the above output " \ + "or in $(BUILDDIR)/linkcheck/ ." + +.PHONY: docs-spellcheck +docs-spellcheck: bin/python ## Run spellcheck + cd $(DOCS_DIR) && LANGUAGE=$* $(SPHINXBUILD) -b spelling -j 4 $(ALLSPHINXOPTS) $(BUILDDIR)/spellcheck/$* + @echo + @echo "Spellcheck is finished; look for any errors in the above output " \ + " or in $(BUILDDIR)/spellcheck/ ." + +.PHONY: netlify +netlify: + pip install -r requirements-docs.txt + cd $(DOCS_DIR) && sphinx-build -b html $(ALLSPHINXOPTS) ../$(BUILDDIR)/html + +.PHONY: docs-test +docs-test: docs-clean docs-linkcheck docs-spellcheck ## Clean docs build, then run linkcheck, spellcheck + .PHONY: start # Run both the back-end and the front end start: diff --git a/README.md b/README.md index 02d92c2526..f8b0766b60 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Volto -Volto png +Volto png [![NPM](https://img.shields.io/npm/v/@plone/volto.svg)](https://www.npmjs.com/package/@plone/volto) [![Build Status Core](https://github.com/plone/volto/actions/workflows/core.yml/badge.svg)](https://github.com/plone/volto/actions) diff --git a/SECURITY.md b/SECURITY.md index f1b4da5c2b..c25158310e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -12,4 +12,3 @@ Volto is currently under very active development. Therefore we only support the ## Reporting a Vulnerability If you found a possible vulnerability please contact the Plone security team under security@plone.org. - diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml deleted file mode 100644 index 864f35cd9b..0000000000 --- a/docs/mkdocs.yml +++ /dev/null @@ -1,108 +0,0 @@ -site_name: Volto Developer Documentation -docs_dir: ./source -site_dir: ./build -repo_url: 'https://github.com/plone/volto' -copyright: 'Made with ❤️ by the Plone Community - All code owned by the Plone Foundation' -theme: - name: 'material' -# custom_dir: 'theme' - logo: 'images/volto-h-transparent.svg' - favicon: 'images/favicon.ico' - palette: - primary: 'teal' - accent: 'red' - font: - text: 'Montserrat' - code: 'Source Code Pro' -extra_css: - - 'stylesheets/extra.oct2020.css' - - 'stylesheets/pygments.css' - -nav: - - Getting Started: - - Installing Volto: 'getting-started/install.md' - - Developer roadmap: 'getting-started/roadmap.md' - - Learning resources: 'getting-started/others.md' - - Configuration: - - What is configurable?: 'configuration/how-to.md' - - Settings reference guide: 'configuration/settings-reference.md' - - Zero config builds: 'configuration/zero-config-builds.md' - - Internal proxy: 'configuration/internalproxy.md' - - Dynamic Volto Addons Configuration: 'configuration/volto-config-js.md' - - Backend configuration: 'configuration/backend.md' - - Richeditor settings: 'configuration/richeditor-settings.md' - - Multilingual: 'configuration/multilingual.md' - - Working copy: 'configuration/workingcopy.md' - - Environment variables: 'configuration/environmentvariables.md' - - API expanders: 'configuration/expanders.md' - - Theming & Semantic UI: - - About Semantic UI: 'theming/about-semantic.md' - - Semantic UI Theming: 'theming/semanticui-theming.md' - - Theming Engine: 'theming/theming-engine.md' - - Theming strategy: 'theming/theming-strategy.md' - - Custom styling: 'theming/custom-styling.md' - - Use another theming engine: 'theming/using-third-party-themes.md' - - Development recipes: - - Creating a project: 'recipes/creating-project.md' - - Folder structure: 'recipes/folder-structure.md' - - Customizing components: 'recipes/customizing-components.md' - - Customizing views: 'recipes/customizing-views.md' - - Creating new views: 'recipes/creating-views.md' - - Internationalization: 'recipes/i18n.md' - - Express middleware: 'recipes/express.md' - - Lazy loading and code splitting: 'recipes/lazyload.md' - - Overriding i18n messages: 'recipes/overridei18n.md' - - App component insertion point: 'recipes/appextras.md' - - Context navigation component: 'recipes/contextnavigation.md' - - Pluggables: 'recipes/pluggables.md' - - Forms and widgets: 'recipes/widget.md' - - Blocks: - - Introduction: 'blocks/introduction.md' - - Anatomy: 'blocks/anatomy.md' - - Settings: 'blocks/settings.md' - - Edit components: 'blocks/editcomponent.md' - - Extensions: 'blocks/extensions.md' - - SSR: 'blocks/ssr.md' - - Addons: - - Introduction: 'addons/index.md' - - Internationalization: 'addons/i18n.md' - - Best practices: 'addons/best-practices.md' - - Backend integration: 'backend/index.md' - - Deploying: - - Simple deployment: 'deploying/simple.md' - - Using PM2: 'deploying/pm2.md' - - Seamless mode: 'deploying/seamless-mode.md' - - Using apache: 'deploying/apache.md' - - Using sentry: 'deploying/sentry.md' - - Performance improvements: 'deploying/performance.md' - - Upgrade Guide: 'upgrade-guide/index.md' - - Developer Guidelines: - - Design principles: 'developer-guidelines/design-principles.md' - - Style Guide: 'developer-guidelines/style-guide.md' - - Language features: 'developer-guidelines/language-features.md' - - Linting: 'developer-guidelines/linting.md' - - React: 'developer-guidelines/react.md' - - Redux: 'developer-guidelines/redux.md' - - Routing: 'developer-guidelines/routing.md' - - Testing: 'developer-guidelines/testing.md' - - Acceptance tests: 'developer-guidelines/acceptance-tests.md' - - Accessibility: 'developer-guidelines/accessibility-guidelines.md' - - Contributing: - - Guidelines: 'contributing/guidelines.md' - -markdown_extensions: - - admonition - - codehilite: - guess_lang: false - - pymdownx.superfences - - pymdownx.magiclink - - pymdownx.mark - - pymdownx.details - - pymdownx.tasklist - - pymdownx.tabbed - - pymdownx.emoji: - emoji_generator: !!python/name:pymdownx.emoji.to_svg - - toc: - permalink: '#' - - markdown.extensions.def_list - - pymdownx.tilde diff --git a/docs/source/_static/Plone_logo_square.png b/docs/source/_static/Plone_logo_square.png new file mode 100644 index 0000000000000000000000000000000000000000..f42a1220d761a40ad9f0f0df919136f61ef729e2 GIT binary patch literal 30912 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 LD@#>L7zh0yh&`2n literal 0 HcmV?d00001 diff --git a/docs/source/_static/custom.css b/docs/source/_static/custom.css new file mode 100644 index 0000000000..0f540ff020 --- /dev/null +++ b/docs/source/_static/custom.css @@ -0,0 +1,236 @@ +.visuallyhidden { + display: none; +} +pre { + border-radius: 0; + background-color: white; + box-shadow: none; +} +a, +a:visited { + color: #2980b9; +} +a:hover { + color: #176aa1; + text-decoration: underline; +} +ul { + list-style-type: square; +} +ul li > p { + margin-bottom: 0.3rem; +} +ol li > p { + margin-bottom: 0.3rem; +} +img{ + margin: 1rem 0; +} +figure img, +.figure img { + box-shadow: 0 6px 24px 0 rgba(153,153,153,0.3); +} +.sidebar img.logo { + box-shadow: none; + width: 200px; + margin-bottom: 1rem; +} +span.linenos { + padding-right: 1em; +} +p.ploneorglink img { + vertical-align: bottom; +} + +.bd-sidebar .nav ul { + padding: 0 0 0 1rem; +} +.bd-sidebar .nav .toctree-checkbox ~ label i { + transform: rotate(90deg); +} +.bd-sidebar .nav .toctree-checkbox:checked ~ label i { + transform: rotate(0deg); +} + +.toctree-wrapper .caption { + font-weight: bold; + font-size: 1.2em; + margin-top: 3rem; +} +.toctree-wrapper ul { + list-style: none; +} + +section:not(#glossary) h1 ~ dl { + display: grid; + grid-template-columns: max-content auto; +} +section:not(#glossary) h1 ~ dl dd { + margin-bottom: unset !important; +} + +div.section { + margin-bottom: 5rem; +} + +.admonition { + border-radius: 0; + border: none; + border-left: .2rem solid; + border-left-color: rgba(var(--pst-color-admonition-default),1); +} +.admonition .admonition-title { + margin-bottom: 1.5rem !important; +} +.admonition.toggle .admonition-title { + cursor: pointer; + display: flex; +} +.admonition.toggle .admonition-title::after { + content: "\f105"; + font-weight: 900; + font-family: "Font Awesome 5 Free"; + margin-left: auto; +} +.admonition.toggle .admonition-title.open::after { + content: "\f107"; +} + +.topic { + padding: 1.5em 1em .5em 1em; +} +.topic-title { + font-weight: bold; +} + +#search-form { + display: flex; + flex-direction: row; + align-items: baseline; + flex-wrap: wrap; +} +#search-form select, +#search-form input[type="text"] { + height: 2rem; + margin-right: 1rem; + margin-bottom: 1rem; + background-color: white; + border: 1px solid darkgrey; +} +#search-form input[type="submit"] { + margin-right: 1rem; +} +ul.search .title_doc_section::before { + content: ' – '; +} +p.search-summary { + margin-top: 1em; +} +#search-results ul { + list-style-type: none; + padding-left: 0; +} +#search-results ul li { + margin-bottom: 1em; +} + +/* submenu */ +.bd-toc { + box-shadow: 0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1); +} + +/* extra sidebar */ +div.sidebar:not(.margin){ + width: 40%; + float: right; + clear: right; + margin: .3rem 0 .3rem 0.5em; + padding: 2rem 0 1.5rem 1rem !important; + background-color: rgba(var(--pst-color-admonition-note),.1); + border: none; + border-left: 8px rgba(var(--pst-color-admonition-default),1) solid; + border-radius: .2rem; + box-shadow: 0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1); +} + +div.sidebar:not(.margin) .figure { + margin-top: 0; + padding-top: 0; + margin-left: 0; + padding-left: 0; +} +div.sidebar:not(.margin) img.logo { + margin-top: 0; + margin-bottom: .3rem; +} +div.sidebar:not(.margin) p { + margin-bottom: 0; +} +div.sidebar:not(.margin) p.sidebar-title { + display: none; +} +div.sidebar:not(.margin) div.topic { + padding: .5em 0; + background-color: transparent; + border: none; +} +div.sidebar:not(.margin) pre { + margin: .5em 0 1.5em 0; +} +div.sidebar:not(.margin) div[class*="highlight-"] { + margin-right: .5em; +} +div.sidebar:not(.margin) .admonition { + margin-right: .5em; + background-color: #ffffff; +} +@media (min-width:768px) { + div.sidebar:not(.margin) { + width: 50%; + margin-left: 1.5em; + margin-right: -28%; + } +} + + +main.bd-content #main-content dl.simple dt { + margin-top: .8em; +} +main.bd-content #main-content dl.simple dt:nth-of-type(1) { + margin-top: 0; +} +main.bd-content #main-content dl.simple dd { + margin-top: .8em; +} +main.bd-content #main-content dl.simple dt + dd { + margin-top: 0; +} + +.prev-next-bottom { + margin: 20px 0 30px 0; +} +.prev-next-bottom a.left-prev, .prev-next-bottom a.right-next { + padding: 5px 10px; + border: 1px solid rgba(0,0,0,.2); + max-width: 45%; + overflow-x: hidden; + color: rgba(0,0,0,.65); + border-radius: 10px; +} + +/* Local navigation */ +li.nav-item.toc-entry { + line-height: 1.25em; + margin-bottom: 0.25em; +} + +span.guilabel, span.menuselection { + border: none; + background: #e7f2fa; + border-radius: 4px; + padding: 4px 5px; + font-size: 90%; + font-weight: bold; + font-style: italic; + white-space: nowrap; +} diff --git a/docs/source/_static/favicon.ico b/docs/source/_static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ae7bb0cd8b1f4f2e6d657bc7a253472819d77819 GIT binary patch literal 5430 zcmdUzv1$}y6or39*mCm*nMy3Tv=B0n;3G_FX)6dj5Wz;UwcFM%Z{S2y*ogZGGvWhm z#3q7dJYSp}Zf^dW-Bm#h9Pa(^J?Gr{Z)P`;lCe04v=C~c5&99(gR}V4d8U_FC9H+9nPYV{kIiS_C~YBdpE3Vk>v$CV z%oqQ$uo;<6{X}5T9@M5ZJMBUq>^pZi?on>L2OI%z&ZC;rOT)dRu2t=NF1cX$9(~US z9@^-a-Gg|A5ck)pc3{t}d?iG`+WIk~74YyHW)vB2Pb;nr@L;rhn2Sno0`a^%NO%p=Cq^TlH~kz?oDb9c@6@!W^|AI<+;`~Mg3 zU*q0~cH7Ry<*vNLpz?g3OM&+bl)h)V>hbdj*WN#3R)=1_b>PCk^%=8SG2$Kc%>Jj} zza#f5GtbVx{hoYYM}9nK?tb<62cCLW@NRXEe}7kjv-5ns1U$Vaes?#a-}pPI$9KEe z`+VWKF_&)A8@@P&;NMOB(OvIB`AVSfQN?+7Ml0aq`OGMcH&q- zV?-mM^|Q%u>^-BaG8%M^P)2?{!x^}7F6S!pb7%3`L;PKsU#lLU1>1o|YV?ffBVLpD zj?W=}Av7a?-g{e)M-lyZJxf~&>)&_|G}W$iw(;a;@7>f+=<)lQ{5<+ueK+g-`c8kD z((*@2M;C_|hv&~O=Uum)z3-OCXQxMJFHes?zwDNu=iTyr{{7qeygwaKKb`krIMWjc zE*i9WbX`Bg6K`fPiOdT`*PLHiTJtBB+P literal 0 HcmV?d00001 diff --git a/docs/source/_static/logo.png b/docs/source/_static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..ad5af00bf163bf8e5896ab1e3627a03eabb300bd GIT binary patch literal 12314 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 A*Z=?k literal 0 HcmV?d00001 diff --git a/docs/source/_static/logo.svg b/docs/source/_static/logo.svg new file mode 100644 index 0000000000..6bfdc1ee90 --- /dev/null +++ b/docs/source/_static/logo.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/source/_static/logo_2x.png b/docs/source/_static/logo_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..9e303f7cedb8c0292848930560c210e6dba9506b GIT binary patch literal 3243 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 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 = $('