@sveltia/cms 0.54.0 → 0.55.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,7 +26,7 @@ The free, open source alternative to Netlify/Decap CMS is now in public beta, tu
26
26
  - [Better productivity](#better-productivity)
27
27
  - [Better accessibility](#better-accessibility)
28
28
  - [Better security](#better-security)
29
- - [Better configuration](#better-configuration)
29
+ - [Better installation](#better-installation)
30
30
  - [Better backend support](#better-backend-support)
31
31
  - [Better i18n support](#better-i18n-support)
32
32
  - [Better collections](#better-collections)
@@ -69,6 +69,7 @@ The free, open source alternative to Netlify/Decap CMS is now in public beta, tu
69
69
  - [Controlling data output](#controlling-data-output)
70
70
  - [Disabling automatic deployments](#disabling-automatic-deployments)
71
71
  - [Setting up Content Security Policy](#setting-up-content-security-policy)
72
+ - [Showing the CMS version](#showing-the-cms-version)
72
73
  - [Support \& feedback](#support--feedback)
73
74
  - [Contributions](#contributions)
74
75
  - [Roadmap](#roadmap)
@@ -84,7 +85,7 @@ Sveltia CMS was born in November 2022, when the progress of Netlify CMS was stal
84
85
 
85
86
  To achieve radical improvements in UX, performance, i18n and other areas, it was ultimately decided to build an alternative from the ground up, while ensuring an easy migration path from the other. After proving the concept with a rapid [Svelte](https://svelte.dev/) prototype, development was accelerated to address their primary use cases. The new product has since been named Sveltia CMS and released as open source software to encourage wider adoption.
86
87
 
87
- We loved the concept of Netlify CMS — a single page app served from a CDN, plus a single YAML config file — and we wanted to revive it, modernize it, and take it to the next level.
88
+ We loved the concept of Netlify CMS — turning a Git repository into a database with a single page app served from a CDN plus a plain YAML config file — and we wanted to revive it, modernize it, and take it to the next level.
88
89
 
89
90
  ### Our advantage
90
91
 
@@ -134,80 +135,81 @@ We hope Netlify/Decap CMS users will be pleased and surprised by the hundreds of
134
135
 
135
136
  - Created and maintained by an [experienced UX engineer](https://github.com/kyoshino) who loves code, design and marketing. You can expect constant improvements to the user experience (UX) and developer experience (DX) across the platform.
136
137
  - The maintainer tries to be as responsive as possible. While there are no guarantees, the typical turnaround time for a bug fix is less than 24 hours.
137
- - Offers a modern, intuitive user interface, including an immersive dark mode[^2], inspired in part by the Netlify CMS v3 prototype[^1].
138
+ - Offers a modern, intuitive user interface, including an immersive dark mode,[^2] inspired in part by the Netlify CMS v3 prototype.[^1]
138
139
  - We develop [our own UI library](https://github.com/sveltia/sveltia-ui) to ensure optimal usability without compromising accessibility.
139
140
  - Comes with touch device support, such as larger buttons for easier tapping. While the UI is not yet optimized for small screens, it should work well with large tablets like iPad Pro or Pixel Tablet. Mobile support and other optimizations such as swipe navigation are planned after the 1.0 release.
140
- - Made with [Svelte](https://svelte.dev/), not React, means we can spend more time on UX rather than tedious state management. It also allows us to avoid common React application crashes[^113][^129]. Best of all, Svelte offers great performance.
141
+ - Made with [Svelte](https://svelte.dev/), not React, means we can spend more time on UX rather than tedious state management. It also allows us to avoid common React application crashes.[^113][^129] Best of all, Svelte offers great performance.
141
142
  - The in-app Help menu provides all links to useful resources, including release notes, feedback and support.
142
143
  - Users can personalize the application with various settings, including appearance and language. Developer Mode can also be enabled.
143
- - Never miss out on the latest features and bug fixes by being notified when an update to the CMS is available[^31]. Then update to the latest version with a single click[^66].
144
+ - Never miss out on the latest features and bug fixes by being notified when an update to the CMS is available.[^31] Then update to the latest version with a single click.[^66]
144
145
 
145
146
  ### Better performance
146
147
 
147
148
  - Built completely from scratch with [Svelte](https://svelte.dev/) instead of forking React-based Netlify/Decap CMS. The app starts fast and stays fast. The compiled code is vanilla JavaScript — you can use it with any framework or static site generator (SSG) that can load static data files during the build process.
148
- - Small footprint: The bundle size is less than 500 KB when minified and [brotlied](https://en.wikipedia.org/wiki/Brotli), which is much lighter than Netlify CMS (1.5 MB), Decap CMS (1.7 MB) and Static CMS (2.6 MB)[^57][^64], even though we haven’t implemented some features yet, but rather added many new features. That’s the power of Svelte + [Vite](https://vite.dev/).
149
+ - Small footprint: The bundle size is less than 500 KB when minified and [brotlied](https://en.wikipedia.org/wiki/Brotli), which is much lighter than Netlify CMS (1.5 MB), Decap CMS (1.7 MB) and Static CMS (2.6 MB),[^57][^64] even though we haven’t implemented some features yet, but rather added many new features. That’s the power of Svelte + [Vite](https://vite.dev/).
149
150
  - We have upgraded from Svelte 4 to [Svelte 5](https://svelte.dev/blog/svelte-5-is-alive) to further improve performance, including an even smaller bundle size. A full migration to the Runes reactivity API is underway.
150
151
  - Sveltia CMS is free of technical debt (except for the Moment.js dependency, which will soon be replaced by Day.js) and [virtual DOM overhead](https://svelte.dev/blog/virtual-dom-is-pure-overhead).
151
- - Uses the GraphQL API for GitHub and GitLab to quickly fetch content at once, so that entries and assets can be listed and searched instantly[^32][^65] (the useless `search` configuration option is ignored). It also avoids the slowness and potential API rate limit violations caused by hundreds of requests with Relation widgets[^14].
152
+ - Uses the GraphQL API for GitHub and GitLab to quickly fetch content at once, so that entries and assets can be listed and searched instantly[^32][^65] (the useless `search` configuration option is therefore ignored). It also avoids the slowness and potential API rate limit violations caused by hundreds of requests with Relation widgets.[^14]
152
153
  - Saving entries and assets to GitHub is also much faster thanks to the [GraphQL mutation](https://github.blog/changelog/2021-09-13-a-simpler-api-for-authoring-commits/).
153
154
  - Our [local repository workflow](#working-with-a-local-git-repository) utilizes the modern [File System Access API](https://developer.chrome.com/articles/file-system-access/) to read and write files natively through the web browser, rather than using a slow, ad hoc REST API through a proxy server.
154
155
  - Sorting, filtering and grouping of entries is done instantly without reloading the entire content.
155
156
  - Uses caching, lazy loading and infinite scrolling techniques. A list of repository files is stored locally for faster startup and bandwidth savings.
156
- - Thumbnails of assets, including videos and PDF files, are generated and cached for faster rendering of the Asset Library and other parts of the CMS[^39].
157
- - No typing lag on input widgets, especially within nested lists and objects[^77].
157
+ - Thumbnails of assets, including videos and PDF files, are generated and cached for faster rendering of the Asset Library and other parts of the CMS.[^39]
158
+ - No typing lag on input widgets, especially within nested lists and objects.[^77]
158
159
 
159
160
  ### Better productivity
160
161
 
161
- - Developers can [work with a local Git repository](#working-with-a-local-git-repository) without any additional configuration or proxy server, resulting in a streamlined workflow and improved performance[^26].
162
- - It also avoids a number of issues, including potential dependency corruption[^158], a 30 MB file size limit[^51], an unknown error with `publish_mode`[^75], and an unused `logo_url`[^49].
162
+ - Developers can [work with a local Git repository](#working-with-a-local-git-repository) without any additional configuration or proxy server, resulting in a streamlined workflow and improved performance.[^26]
163
+ - It also avoids a number of issues, including potential dependency corruption,[^158] a 30 MB file size limit,[^51] an unknown error with `publish_mode`,[^75] and an unused `logo_url`.[^49]
163
164
  - When you delete an entry or an asset file, the empty folder that contains it is also deleted, so you don’t have to delete it manually.
164
165
  - Provides a smoother user experience in the Content Editor:
165
- - A local backup of an entry draft is automatically created without interruption by a confirmation dialog, which annoys users and can cause a page navigation problem if dismissed[^106]. The backup can then be reliably restored without unexpected overwriting[^85].
166
+ - A local backup of an entry draft is automatically created without interruption by a confirmation dialog, which annoys users and can cause a page navigation problem if dismissed.[^106] The backup can then be reliably restored without unexpected overwriting.[^85]
166
167
  - Click once (the Save button) instead of twice (Publish > Publish now) to save an entry. Or just hit the `Ctrl+S` (Windows/Linux) or `Command+S` (macOS) key to save your time.
167
168
  - The editor closes automatically when an entry is saved. This behaviour can be changed in the application settings.
168
- - Uploading files can be done with drag and drop[^20].
169
- - Users can upload multiple files at once to the Asset Library[^5].
169
+ - Uploading files can be done with drag and drop.[^20]
170
+ - Users can upload multiple files at once to the Asset Library.[^5]
170
171
  - Users can delete multiple entries and assets at once.
171
172
  - Some [keyboard shortcuts](#using-keyboard-shortcuts) are available for faster editing.
172
173
 
173
174
  ### Better accessibility
174
175
 
175
- - Improved keyboard handling lets you efficiently navigate through UI elements using the Tab, Space, Enter and arrow keys[^17][^67].
176
+ - Improved keyboard handling lets you efficiently navigate through UI elements using the Tab, Space, Enter and arrow keys.[^17][^67]
176
177
  - Comprehensive [WAI-ARIA](https://w3c.github.io/aria/) support enables users who rely on screen readers such as NVDA and VoiceOver. An announcement is read out when you navigate to another page.
177
178
  - The rich text editor is built with [Lexical](https://lexical.dev/), which is said to follow accessibility best practices. The [Dragon NaturallySpeaking support](https://lexical.dev/docs/packages/lexical-dragon) is enabled.
178
179
  - Ensures sufficient contrast between the foreground text and background colours.
179
- - Enabled and disabled buttons can be clearly distinguished[^105].
180
+ - Enabled and disabled buttons can be clearly distinguished.[^105]
180
181
  - Links are underlined by default to make them easier to recognize. This behaviour can be changed in the Accessibility Settings if you prefer.
181
182
  - Honours your operating system’s [reduced motion](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion) and [reduced transparency](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-transparency) settings. Support for [high contrast mode](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-contrast) will be added later.
182
- - Browser console logs for developers are readable in either light or dark mode[^116].
183
+ - Browser console logs for developers are readable in either light or dark mode.[^116]
183
184
  - We’ll continue to test and improve the application to meet [WCAG 2.2](https://w3c.github.io/wcag/guidelines/22/).
184
185
 
185
186
  ### Better security
186
187
 
187
- - Avoids vulnerabilities in dependencies through constant updates, [`pnpm audit`](https://pnpm.io/cli/audit), and frequent releases, unlike Netlify/Decap CMS where a number of high severity vulnerabilities are unpatched[^33].
188
- - Our [local repository workflow](#working-with-a-local-git-repository) doesn’t require a proxy server, reducing an attack surface[^158].
188
+ - Avoids vulnerabilities in dependencies through constant updates, [`pnpm audit`](https://pnpm.io/cli/audit), and frequent releases, unlike Netlify/Decap CMS where a number of high severity vulnerabilities are unpatched.[^33]
189
+ - Our [local repository workflow](#working-with-a-local-git-repository) doesn’t require a proxy server, reducing an attack surface.[^158]
189
190
  - We have enabled [npm package provenance](https://github.blog/security/supply-chain-security/introducing-npm-package-provenance/).
190
- - We have documented how to [set up a Content Security Policy](#setting-up-content-security-policy) for the CMS to prevent any unexpected errors or otherwise insecure configuration[^108].
191
- - The `unsafe-eval` and `unsafe-inline` keywords are not needed in the `script-src` CSP directive[^34].
191
+ - We have documented how to [set up a Content Security Policy](#setting-up-content-security-policy) for the CMS to prevent any unexpected errors or otherwise insecure configuration.[^108]
192
+ - The `unsafe-eval` and `unsafe-inline` keywords are not needed in the `script-src` CSP directive.[^34]
192
193
  - The `same-origin` referrer policy is automatically set with a `<meta>` tag.
193
194
  - Sveltia CMS has a [secure context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) requirement that forces the site content, including the CMS configuration file, to be served over HTTPS.
194
- - GitHub commits are automatically GPG-signed and [marked as verified](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification)[^144].
195
+ - GitHub commits are automatically GPG-signed and [marked as verified](https://docs.github.com/en/authentication/managing-commit-signature-verification/about-commit-signature-verification).[^144]
195
196
 
196
- ### Better configuration
197
+ ### Better installation
197
198
 
198
- - Some servers and frameworks remove the trailing slash from the CMS URL (`/admin`) depending on the configuration. In such cases, the config file is loaded from a root-relative URL (`/admin/config.yml`) instead of a regular relative URL (`./config.yml` = `/config.yml`) that results in a 404 Not Found error[^107].
199
- - Supports a [JSON configuration file](#providing-a-json-configuration-file) that can be generated for bulk or complex collections[^60].
199
+ - Sveltia CMS automatically adds the [robots `meta` tag](https://developers.google.com/search/docs/crawling-indexing/robots-meta-tag) to HTML to prevent the admin page from being indexed by search engines. Developers are still recommended to manually add `<meta name="robots" content="noindex" />` to `index.html`, as not all crawlers support dynamically added tags. However, our solution should at least work with Google in case you forget to do so.[^174]
200
+ - Some servers and frameworks are known to remove the trailing slash from the CMS URL (`/admin`) depending on the configuration. In such cases, the config file is loaded from a root-relative URL (`/admin/config.yml`) instead of a regular relative URL (`./config.yml` = `/config.yml`) that results in a 404 Not Found error.[^107]
201
+ - Supports a [JSON configuration file](#providing-a-json-configuration-file) that can be generated for bulk or complex collections.[^60]
200
202
 
201
203
  ### Better backend support
202
204
 
203
205
  - Uses the GraphQL API where possible for better performance, as mentioned above. You don’t need to set the `use_graphql` option to enable it for GitHub and GitLab.
204
- - The Git branch name is automatically set to the repository’s default branch (`main`, `master` or whatever) if not specified in the configuration file, preventing data loading errors due to a hardcoded fallback to `master`[^95][^27].
205
- - It’s possible to [disable automatic deployments](#disabling-automatic-deployments) by default or on demand to save costs and resources associated with CI/CD and to publish multiple changes at once[^24].
206
+ - The Git branch name is automatically set to the repository’s default branch (`main`, `master` or whatever) if not specified in the configuration file, preventing data loading errors due to a hardcoded fallback to `master`.[^95][^27]
207
+ - It’s possible to [disable automatic deployments](#disabling-automatic-deployments) by default or on demand to save costs and resources associated with CI/CD and to publish multiple changes at once.[^24]
206
208
  - The GitLab backend support comes with background [service status](https://status.gitlab.com/) checking, just like GitHub.
207
209
  - Service status checks are performed frequently and an incident notification is displayed prominently.
208
210
  - Users can quickly open the source file of an entry or asset in your repository using View on GitHub (or GitLab) under the 3-dot menu when Developer Mode is enabled.
209
211
  - We provide [our own OAuth client](https://github.com/sveltia/sveltia-cms-auth) for GitHub and GitLab.
210
- - Users won’t get a 404 Not Found error when you sign in to the GitLab backend[^115].
212
+ - Users won’t get a 404 Not Found error when you sign in to the GitLab backend.[^115]
211
213
  - Features the all-new local backend that boosts DX. See the [productivity section](#better-productivity) above.
212
214
  - Developers can select the local and remote backends while working on a local server.
213
215
 
@@ -217,170 +219,170 @@ Sveltia CMS has been built with a multilingual architecture from the very beginn
217
219
 
218
220
  - Configuration
219
221
  - The [i18n limitations](https://decapcms.org/docs/i18n/#limitations) in Netlify/Decap CMS do not apply to Sveltia CMS:
220
- - File collections support multiple files/folders i18n structures[^87]. To enable it, simply use the `{{locale}}` template tag in the `file` path option, e.g. `content/pages/about.{{locale}}.json` or `content/pages/{{locale}}/about.json`. For backward compatibility, the global `structure` option only applies to folder collections, and the default i18n structure for file collections remains single file.
221
- - The List and Object widgets support the `i18n: duplicate` field configuration so that changes made with these widgets are duplicated between locales[^7][^68]. The `i18n` configuration can normally be used for the subfields.
222
+ - File collections support multiple files/folders i18n structures.[^87] To enable it, simply use the `{{locale}}` template tag in the `file` path option, e.g. `content/pages/about.{{locale}}.json` or `content/pages/{{locale}}/about.json`. For backward compatibility, the global `structure` option only applies to folder collections, and the default i18n structure for file collections remains single file.
223
+ - The List and Object widgets support the `i18n: duplicate` field configuration so that changes made with these widgets are duplicated between locales.[^7][^68] The `i18n` configuration can normally be used for the subfields.
222
224
  - The `required` field option accepts an array of locale codes in addition to a boolean, making the field required for a subset of locales when i18n support is enabled. For example, if only English is required, you could write `required: [en]`. An empty array is equivalent to `required: false`.
223
- - [Entry-relative media folders](https://decapcms.org/docs/collection-folder/#media-and-public-folder) can be used in conjunction with the `multiple_folders` i18n structure[^21].
224
- - The `{{locale}}` template tag can be used in the [`preview_path`](https://decapcms.org/docs/configuration-options/#preview_path) collection option to provide site preview links for each language[^63].
225
+ - [Entry-relative media folders](https://decapcms.org/docs/collection-folder/#media-and-public-folder) can be used in conjunction with the `multiple_folders` i18n structure.[^21]
226
+ - The `{{locale}}` template tag can be used in the [`preview_path`](https://decapcms.org/docs/configuration-options/#preview_path) collection option to provide site preview links for each language.[^63]
225
227
  - It’s possible to [use a random UUID for an entry slug](#using-a-random-id-for-an-entry-slug), which is a good option for locales that write in non-Latin characters.
226
- - It’s possible to [localize entry slugs](#localizing-entry-slugs) while linking the localized files[^80], thanks to the support for Hugo’s `translationKey`[^81].
227
- - When the `clean_accents` option is enabled for [entry slugs](https://decapcms.org/docs/configuration-options/#slug-type), certain characters, such as German umlauts, will be [transliterated](https://en.wikipedia.org/wiki/Transliteration)[^99].
228
- - It’s possible to embed the locale code in an entry by using `widget: hidden` along with `default: '{{locale}}'`[^101].
228
+ - It’s possible to [localize entry slugs](#localizing-entry-slugs) while linking the localized files,[^80] thanks to the support for Hugo’s `translationKey`.[^81]
229
+ - When the `clean_accents` option is enabled for [entry slugs](https://decapcms.org/docs/configuration-options/#slug-type), certain characters, such as German umlauts, will be [transliterated](https://en.wikipedia.org/wiki/Transliteration).[^99]
230
+ - It’s possible to embed the locale code in an entry by using `widget: hidden` along with `default: '{{locale}}'`.[^101]
229
231
  - User interface
230
232
  - Eliminates UI confusion: The Preview pane can be displayed without toggling i18n in the Content Editor. Both panes are scrollable. There is no condition where both panes are edited in the same language at the same time.
231
233
  - Users can easily switch between locales while editing by clicking a button instead of a dropdown list.
232
234
  - Language labels appear in human-readable display names instead of ISO 639 language codes because it’s not easy for everyone to recognize `DE` as German, `NL` as Dutch, `ZH` as Chinese, and so on.
233
235
  - Content editing
234
236
  - [Integrates DeepL](#using-deepl-to-translate-entry-fields) to allow translation of text fields from another locale with one click. More translation services will be added in the future.
235
- - The Content Editor supports [RTL scripts](https://en.wikipedia.org/wiki/Right-to-left_script) such as Arabic, Hebrew and Persian[^146].
236
- - It’s possible to [disable non-default locale content](#disabling-non-default-locale-content)[^15].
237
+ - The Content Editor supports [RTL scripts](https://en.wikipedia.org/wiki/Right-to-left_script) such as Arabic, Hebrew and Persian.[^146]
238
+ - It’s possible to [disable non-default locale content](#disabling-non-default-locale-content).[^15]
237
239
  - Boolean, DateTime, List and Number fields in the entry preview are displayed in a localized format.
238
- - Boolean fields are updated in real time between locales like other widgets to avoid confusion[^35].
239
- - Relation fields with i18n enabled won’t trigger a change in the content draft status when you start editing an existing entry[^84].
240
- - Solves problems with Chinese, Japanese and Korean (CJK) [IME](https://en.wikipedia.org/wiki/Input_method) text input in the rich text editor for the Markdown widget[^54].
241
- - Raises a validation error instead of failing silently if the `single_file` structure is used and a required field is not filled in any of the locales[^55].
242
- - Fields in non-default locales are validated as expected[^13].
243
- - No internal error is thrown when changing the locale[^103].
244
- - Duplicating an entry duplicates all locale content, not just the default locale[^170].
240
+ - Boolean fields are updated in real time between locales like other widgets to avoid confusion.[^35]
241
+ - Relation fields with i18n enabled won’t trigger a change in the content draft status when you start editing an existing entry.[^84]
242
+ - Solves problems with Chinese, Japanese and Korean (CJK) [IME](https://en.wikipedia.org/wiki/Input_method) text input in the rich text editor for the Markdown widget.[^54]
243
+ - Raises a validation error instead of failing silently if the `single_file` structure is used and a required field is not filled in any of the locales.[^55]
244
+ - Fields in non-default locales are validated as expected.[^13]
245
+ - No internal error is thrown when changing the locale.[^103]
246
+ - Duplicating an entry duplicates all locale content, not just the default locale.[^170]
245
247
 
246
248
  ### Better collections
247
249
 
248
250
  - Configuration
249
251
  - Provides some new options, including:
250
- - `icon`: [Choose a custom icon for each collection](#using-a-custom-icon-for-a-collection)[^3].
252
+ - `icon`: [Choose a custom icon for each collection](#using-a-custom-icon-for-a-collection).[^3]
251
253
  - `divider`: [Add dividers to the collection list](#adding-dividers-to-the-collection-list).
252
- - `thumbnail`: Specify the field name for a thumbnail displayed on the entry list, like `thumbnail: featuredImage`[^130].
254
+ - `thumbnail`: Specify the field name for a thumbnail displayed on the entry list, like `thumbnail: featuredImage`.[^130]
253
255
  - A nested field can be specified using dot notation, e.g. `heroImage.src`.
254
256
  - A wildcard in the field name is also supported, e.g. `images.*.src`.
255
257
  - Multiple field names can be specified as an array for fallback purpose, e.g. `[thumbnail, cover]`.
256
- - If this option is omitted, any non-nested, non-empty Image or File field will be used[^173].
258
+ - If this option is omitted, any non-nested, non-empty Image or File field will be used.[^173]
257
259
  - Enhancements to the entry `filter` option for folder collections:
258
- - Boolean `value` works as expected[^93].
260
+ - Boolean `value` works as expected.[^93]
259
261
  - `value` accepts `null` to match an undefined field value.
260
- - `value` accepts an array to provide multiple possible values[^151].
261
- - `pattern` can be used instead of `value` to provide a regular expression, just like the `view_filters` collection option[^153].
262
+ - `value` accepts an array to provide multiple possible values.[^151]
263
+ - `pattern` can be used instead of `value` to provide a regular expression, just like the `view_filters` collection option.[^153]
262
264
  - Enhancements to [summary string transformations](https://decapcms.org/docs/summary-strings/):
263
265
  - Transformations can be used in more places than just the collection `summary`:
264
266
  - The `slug` collection option[^29]
265
267
  - The `summary` field option for the List and Object widgets
266
268
  - Multiple transformations can be chained like `{{title | upper | truncate(20)}}`.
267
269
  - The `date` transformation supports the time zone argument. The only available value is `utc`, which converts a date to UTC. This is useful if the specified DateTime field is local, but you want to force UTC in the entry slug, e.g. `{{date | date('YYYYMMDD-HHmm', 'utc')}}`. ([Discussion](https://github.com/sveltia/sveltia-cms/issues/278#issuecomment-2565313420))
268
- - Nested fields (dot notation) can be used in the `path` option for a folder collection, e.g. `{{fields.state.name}}/{{slug}}`[^62].
269
- - Markdown is supported in the `description` collection option[^79]. Bold, italic, strikethrough, code and links are allowed.
270
+ - Nested fields (dot notation) can be used in the `path` option for a folder collection, e.g. `{{fields.state.name}}/{{slug}}`.[^62]
271
+ - Markdown is supported in the `description` collection option.[^79] Bold, italic, strikethrough, code and links are allowed.
270
272
  - The collection `folder` can be an empty string (or `.` or `/`) if you want to store entries in the root folder. This supports a typical VitePress setup.
271
273
  - Entry slugs
272
274
  - It’s possible to [use a random UUID for an entry slug](#using-a-random-id-for-an-entry-slug).
273
- - Slug generation is fail-safe: If a slug cannot be determined from entry content, part of a random UUID is used instead of throwing an error or filling in with arbitrary string field values[^133].
275
+ - Slug generation is fail-safe: If a slug cannot be determined from entry content, part of a random UUID is used instead of throwing an error or filling in with arbitrary string field values.[^133]
274
276
  - If a collection only has the Markdown `body` field, an entry slug will be generated from a header in the `body`, if exists. This supports a typical VitePress setup.
275
- - Entry slug template tags support [transformations](https://decapcms.org/docs/summary-strings/) just like summary string template tags[^29].
276
- - Single quotes (apostrophes) in a slug will be replaced with `sanitize_replacement` (default: hyphen) rather than being removed[^52].
277
- - The maximum number of characters for an entry slug can be set with the new `slug_length` collection option to avoid deployment errors with Netlify or other platforms[^25].
278
- - Setting the collection `path` doesn’t affect the entry slugs stored with the Relation widget[^137].
279
- - Entry slugs are [localizable](#localizing-entry-slugs)[^80].
277
+ - Entry slug template tags support [transformations](https://decapcms.org/docs/summary-strings/) just like summary string template tags.[^29]
278
+ - Single quotes (apostrophes) in a slug will be replaced with `sanitize_replacement` (default: hyphen) rather than being removed.[^52]
279
+ - The maximum number of characters for an entry slug can be set with the new `slug_length` collection option to avoid deployment errors with Netlify or other platforms.[^25]
280
+ - Setting the collection `path` doesn’t affect the entry slugs stored with the Relation widget.[^137]
281
+ - Entry slugs are [localizable](#localizing-entry-slugs).[^80]
280
282
  - Entry listing
281
- - [Default sort field and direction](#specifying-default-entry-sort-field-and-direction) can be specified[^172].
282
- - Sorting entries by a DateTime field works as expected[^110].
283
+ - [Default sort field and direction](#specifying-default-entry-sort-field-and-direction) can be specified.[^172]
284
+ - Sorting entries by a DateTime field works as expected.[^110]
283
285
  - Entry grouping and sorting can work together. For example, it’s possible to group by year and then sort by year if configured properly.
284
- - Hugo’s special `_index.md` files, including localized ones like `_index.en.md`, are ignored in folder collections unless the `path` option is configured to end with `_index` and the `extension` is `md`[^120]. You can still manage these files as part of a file collection if necessary.
285
- - A console error won’t be thrown when a collection doesn’t have the `title` field[^152]. In that case, an entry summary will be generated from a header in the Markdown `body` field, if exists, or from the entry slug, so the summary will never be an empty[^161]. This supports a typical VitePress setup.
286
- - If there was an error while parsing an entry file, such as duplicate front matter keys, it won’t show up as a blank entry, and a clear error message will be displayed in the browser console[^121].
287
- - A single file can be used for more than one item in a file collection[^127].
286
+ - Hugo’s special `_index.md` files, including localized ones like `_index.en.md`, are ignored in folder collections unless the `path` option is configured to end with `_index` and the `extension` is `md`.[^120] You can still manage these files as part of a file collection if necessary.
287
+ - A console error won’t be thrown when a collection doesn’t have the `title` field.[^152] In that case, an entry summary will be generated from a header in the Markdown `body` field, if exists, or from the entry slug, so the summary will never be an empty.[^161] This supports a typical VitePress setup.
288
+ - If there was an error while parsing an entry file, such as duplicate front matter keys, it won’t show up as a blank entry, and a clear error message will be displayed in the browser console.[^121]
289
+ - A single file can be used for more than one item in a file collection.[^127]
288
290
  - User interface
289
291
  - The collection list displays the number of items in each collection.
290
292
  - Users can select multiple entries and delete them at once.
291
- - In an entry summary, basic Markdown syntax used in the title, including bold, italic and code, are parsed as Markdown. HTML character references (entities) are also parsed properly[^69].
292
- - If you update an entry field that appears in the collection’s `summary`, such as `title`, the entry list displays an updated summary after you save the entry[^159].
293
- - If entries don’t have an Image field for thumbnails, the entry list will only be displayed in list view, because it doesn’t make sense to show grid view[^143].
293
+ - In an entry summary, basic Markdown syntax used in the title, including bold, italic and code, are parsed as Markdown. HTML character references (entities) are also parsed properly.[^69]
294
+ - If you update an entry field that appears in the collection’s `summary`, such as `title`, the entry list displays an updated summary after you save the entry.[^159]
295
+ - If entries don’t have an Image field for thumbnails, the entry list will only be displayed in list view, because it doesn’t make sense to show grid view.[^143]
294
296
  - Assets stored in a [collection media folder](#using-a-custom-media-folder-for-a-collection) can be displayed next to the entries.
295
- - The New Entry button won’t appear when a developer accidentally sets the `create: true` option on a file collection because it’s useless[^89].
297
+ - The New Entry button won’t appear when a developer accidentally sets the `create: true` option on a file collection because it’s useless.[^89]
296
298
  - The Delete Entry button won’t appear when a developer accidentally sets the `delete: true` option on a file collection because the preconfigured files should not be deleted.
297
299
 
298
300
  ### Better content editing
299
301
 
300
302
  - Required fields, not optional fields, are marked for efficient data entry.
301
303
  - Users can revert changes to all fields or a specific field.
302
- - If you revert changes and there are no unsaved changes, the Save button is disabled as expected[^118].
303
- - Fields with validation errors are automatically expanded if they are part of nested, collapsed objects[^40].
304
- - A full regular expression, including flags, can be used for the widget `pattern` option[^82]. For example, if you want to allow 280 characters or less in a multiline text field, you could write `/^.{0,280}$/s` (but you can now use the `maxlength` option instead.)
305
- - A long validation error message is displayed in full, without being hidden behind the field label[^59].
306
- - Any links to other entries will work as expected, with the Content Editor being updated for the other[^100].
307
- - In the Boolean and Select widgets, you don’t have to update a value twice to re-enable the Save button after saving an entry[^139].
304
+ - If you revert changes and there are no unsaved changes, the Save button is disabled as expected.[^118]
305
+ - Fields with validation errors are automatically expanded if they are part of nested, collapsed objects.[^40]
306
+ - A full regular expression, including flags, can be used for the widget `pattern` option.[^82] For example, if you want to allow 280 characters or less in a multiline text field, you could write `/^.{0,280}$/s` (but you can now use the `maxlength` option instead.)
307
+ - A long validation error message is displayed in full, without being hidden behind the field label.[^59]
308
+ - Any links to other entries will work as expected, with the Content Editor being updated for the other.[^100]
309
+ - In the Boolean and Select widgets, you don’t have to update a value twice to re-enable the Save button after saving an entry.[^139]
308
310
 
309
311
  ### Better content preview
310
312
 
311
- - The Preview pane comes with a minimal default style[^168]. It looks nice without a custom preview style or template.
313
+ - The Preview pane comes with a minimal default style.[^168] It looks nice without a custom preview style or template.
312
314
  - The Preview pane displays all fields, including each label, making it easier to see which fields are populated.
313
- - When you click on a field in the Preview pane, the corresponding field in the Edit pane is highlighted[^41]. It will be automatically expanded if collapsed.
314
- - The Preview pane won’t cause a scrolling issue[^136].
315
- - Provides better scroll synchronization between the panes when editing or previewing an entry[^92].
316
- - Developers can hide the preview of a specific field using a new field option: `preview: false`[^126].
315
+ - When you click on a field in the Preview pane, the corresponding field in the Edit pane is highlighted.[^41] It will be automatically expanded if collapsed.
316
+ - The Preview pane won’t cause a scrolling issue.[^136]
317
+ - Provides better scroll synchronization between the panes when editing or previewing an entry.[^92]
318
+ - Developers can hide the preview of a specific field using a new field option: `preview: false`.[^126]
317
319
  - [See below](#better-widgets) for widget-specific enhancements, including support for variable types[^42] and YouTube videos.
318
320
 
319
321
  ### Better data output
320
322
 
321
- - Keys in generated JSON/TOML/YAML content are always sorted by the order of configured fields, making Git commits clean and consistent[^86].
322
- - Netlify/Decap CMS often, but not always, omits optional and empty fields from the output[^154]. Sveltia CMS aims at complete and consistent data output — it always saves proper values, such as an empty string, an empty array or `null`, instead of nothing (`undefined`), regardless of the `required` field option[^45][^46][^44][^157].
323
+ - Keys in generated JSON/TOML/YAML content are always sorted by the order of configured fields, making Git commits clean and consistent.[^86]
324
+ - Netlify/Decap CMS often, but not always, omits optional and empty fields from the output.[^154] Sveltia CMS aims at complete and consistent data output — it always saves proper values, such as an empty string, an empty array or `null`, instead of nothing (`undefined`), regardless of the `required` field option.[^45][^46][^44][^157]
323
325
  - In other words, in Sveltia CMS, `required: false` makes data input optional, but doesn’t make data output optional.
324
- - To omit empty optional fields from data output, use `omit_empty_optional_fields: true` in the [data output options](#controlling-data-output). This is useful if you have data type validations that expect `undefined`[^156].
325
- - JSON/TOML/YAML data is saved with a new line at the end of the file to prevent unnecessary changes being made to the file[^11].
326
- - Leading and trailing spaces in text-type field values are automatically removed when you save an entry[^37].
327
- - YAML string folding (maximum line width) is disabled, mainly for framework compatibility[^119].
328
- - DateTime field values in ISO 8601 format are stored in native date/time format instead of quoted strings when the data output is TOML[^147].
329
- - Provides JSON/YAML format options as part of the [data output options](#controlling-data-output), including indentation[^155] and quotes[^9].
326
+ - To omit empty optional fields from data output, use `omit_empty_optional_fields: true` in the [data output options](#controlling-data-output). This is useful if you have data type validations that expect `undefined`.[^156]
327
+ - JSON/TOML/YAML data is saved with a new line at the end of the file to prevent unnecessary changes being made to the file.[^11]
328
+ - Leading and trailing spaces in text-type field values are automatically removed when you save an entry.[^37]
329
+ - YAML string folding (maximum line width) is disabled, mainly for framework compatibility.[^119]
330
+ - DateTime field values in ISO 8601 format are stored in native date/time format instead of quoted strings when the data output is TOML.[^147]
331
+ - Provides JSON/YAML format options as part of the [data output options](#controlling-data-output), including indentation and quotes.[^155][^9]
330
332
  - The `yaml_quote` collection option added in [v0.5.10](https://github.com/sveltia/sveltia-cms/releases/tag/v0.5.10) is now deprecated and will be removed in v1.0.0. `yaml_quote: true` is equivalent to `quote: double` in the new YAML format options.
331
333
 
332
334
  ### Better widgets
333
335
 
334
336
  - Boolean
335
- - A required Boolean field with no default value is saved as `false` by default, without raising a confusing validation error[^45].
336
- - An optional Boolean field with no default value is also saved as `false` by default, rather than nothing[^46].
337
+ - A required Boolean field with no default value is saved as `false` by default, without raising a confusing validation error.[^45]
338
+ - An optional Boolean field with no default value is also saved as `false` by default, rather than nothing.[^46]
337
339
  - Color
338
- - The widget doesn’t cause scrolling issues[^128].
340
+ - The widget doesn’t cause scrolling issues.[^128]
339
341
  - The preview shows both the RGB(A) hex value and the `rgb()` function notation.
340
342
  - DateTime
341
- - A DateTime field doesn’t trigger a change in the content draft status when you’ve just started editing a new entry[^90].
342
- - User’s local time is not saved in UTC unless the `picker_utc` option is `true`[^150].
343
+ - A DateTime field doesn’t trigger a change in the content draft status when you’ve just started editing a new entry.[^90]
344
+ - User’s local time is not saved in UTC unless the `picker_utc` option is `true`.[^150]
343
345
  - Hidden
344
346
  - The `default` value supports the following template tags:
345
- - `{{locale}}`: The current locale code[^101].
346
- - `{{datetime}}`: The current date/time in [ISO 8601 format](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format)[^102].
347
- - `{{uuid}}`, `{{uuid_short}}` and `{{uuid_shorter}}`: A random UUID or its shorter version, just like the [slug template tags](#using-a-random-id-for-an-entry-slug)[^12].
348
- - The `default` value is saved when you create a file collection item, not just a folder collection item[^78].
347
+ - `{{locale}}`: The current locale code.[^101]
348
+ - `{{datetime}}`: The current date/time in [ISO 8601 format](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_time_string_format).[^102]
349
+ - `{{uuid}}`, `{{uuid_short}}` and `{{uuid_shorter}}`: A random UUID or its shorter version, just like the [slug template tags](#using-a-random-id-for-an-entry-slug).[^12]
350
+ - The `default` value is saved when you create a file collection item, not just a folder collection item.[^78]
349
351
  - List
350
- - It’s possible to [edit data files with a top-level list](#editing-data-files-with-a-top-level-list) using the new `root` option[^148].
351
- - The `min` and `max` options can be used separately. You don’t need to specify both to use either option[^145].
352
+ - It’s possible to [edit data files with a top-level list](#editing-data-files-with-a-top-level-list) using the new `root` option.[^148]
353
+ - The `min` and `max` options can be used separately. You don’t need to specify both to use either option.[^145]
352
354
  - The Add Item button appears at the bottom of the list when the `add_to_top` option is not `true`, so you don’t have to scroll up each time to add new items.
353
- - Users can expand or collapse the entire list, while the Expand All and Collapse All buttons allow you to expand or collapse all items in the list at once[^164].
354
- - A required List field with no subfield or value is marked as invalid[^43].
355
- - An optional List field with no subfield or value is saved as an empty array, rather than nothing[^44].
356
- - An optional List field won’t populate an item by default when the subfield has the `default` value[^162].
357
- - Users can enter spaces in a simple text-based List field[^50].
358
- - Users can preview variable types without having to register a preview template[^42].
359
- - It’s possible to omit `fields` in a variable type object[^163]. In that case only the `typeKey` (default: `type`) is saved in the output.
355
+ - Users can expand or collapse the entire list, while the Expand All and Collapse All buttons allow you to expand or collapse all items in the list at once.[^164]
356
+ - A required List field with no subfield or value is marked as invalid.[^43]
357
+ - An optional List field with no subfield or value is saved as an empty array, rather than nothing.[^44]
358
+ - An optional List field won’t populate an item by default when the subfield has the `default` value.[^162]
359
+ - Users can enter spaces in a simple text-based List field.[^50]
360
+ - Users can preview variable types without having to register a preview template.[^42]
361
+ - It’s possible to omit `fields` in a variable type object.[^163] In that case, only the `typeKey` (default: `type`) is saved in the output.
360
362
  - Markdown
361
- - The rich text editor is built with the well-maintained [Lexical](https://lexical.dev/) framework, which solves various issues with a [Slate](https://github.com/ianstormtaylor/slate)-based editor in Netlify/Decap CMS, including fatal application crashes[^71][^72][^73][^111], lost formatting when pasting[^124], an extra line break when pasting[^169], backslash injections[^53], dropdown visibility[^70], and text input difficulties with IME[^54].
362
- - The default editor mode can be set by changing the order of the `modes` option[^58]. If you want to use the plain text editor by default, add `modes: [raw, rich_text]` to the field configuration.
363
- - A combination of bold and italic doesn’t create a confusing 3-asterisk markup[^160]. In our editor, bold is 2 asterisks and italic is an underscore.
363
+ - The rich text editor is built with the well-maintained [Lexical](https://lexical.dev/) framework, which solves various issues with a [Slate](https://github.com/ianstormtaylor/slate)-based editor in Netlify/Decap CMS, including fatal application crashes,[^71][^72][^73][^111] lost formatting when pasting,[^124] an extra line break when pasting,[^169] backslash injections,[^53] dropdown visibility,[^70] and text input difficulties with IME.[^54]
364
+ - The default editor mode can be set by changing the order of the `modes` option.[^58] If you want to use the plain text editor by default, add `modes: [raw, rich_text]` to the field configuration.
365
+ - A combination of bold and italic doesn’t create a confusing 3-asterisk markup.[^160] In our editor, bold is 2 asterisks and italic is an underscore.
364
366
  - The built-in `image` component can be inserted with a single click.
365
- - The built-in `image` component allows users to add, edit or remove a link set on an image[^171].
367
+ - The built-in `image` component allows users to add, edit or remove a link on an image.[^171]
366
368
  - The built-in `code-block` component is implemented just like a blockquote. You can simply convert a normal paragraph into a code block instead of adding a component.
367
- - Code in a code block in the editor can be copied as expected[^165].
369
+ - Code in a code block in the editor can be copied as expected.[^165]
368
370
  - Line breaks are rendered as line breaks in the Preview pane according to GitHub Flavored Markdown (GFM).
369
371
  - Number
370
- - If the `value_type` option is `int` (default) or `float`, the `required` option is `false`, and the value is not entered, the field will be saved as `null` instead of an empty string[^157]. If `value_type` is anything else, the data type will remain a string.
372
+ - If the `value_type` option is `int` (default) or `float`, the `required` option is `false`, and the value is not entered, the field will be saved as `null` instead of an empty string.[^157] If `value_type` is anything else, the data type will remain a string.
371
373
  - Object
372
- - Sveltia CMS offers two ways to have conditional fields in a collection[^30]:
374
+ - Sveltia CMS offers two ways to have conditional fields in a collection:[^30]
373
375
  - The Object widget supports [variable types](https://decapcms.org/docs/variable-type-widgets/) (the `types` option) just like the List widget.
374
- - An optional Object field (`required: false`) can be manually added or removed with a checkbox[^88]. If unadded or removed, the required subfields won’t trigger validation errors[^16], and the field will be saved as `null`.
376
+ - An optional Object field (`required: false`) can be manually added or removed with a checkbox.[^88] If unadded or removed, the required subfields won’t trigger validation errors,[^16] and the field will be saved as `null`.
375
377
  - Relation
376
- - Field options are displayed with no additional API requests[^14]. The confusing `options_length` option, which defaults to 20, is therefore ignored[^76].
377
- - `slug` can be used for `value_field` to show all available options instead of just one in some situations[^91].
378
- - Template strings with a wildcard like `{{cities.*.name}}` can also be used for `value_field`[^94].
378
+ - Field options are displayed with no additional API requests.[^14] The confusing `options_length` option, which defaults to 20, is therefore ignored.[^76]
379
+ - `slug` can be used for `value_field` to show all available options instead of just one in some situations.[^91]
380
+ - Template strings with a wildcard like `{{cities.*.name}}` can also be used for `value_field`.[^94]
379
381
  - `display_fields` is displayed in the Preview pane instead of `value_field`.
380
382
  - The redundant `search_fields` option is not required in Sveltia CMS, as it defaults to `display_fields` (and `value_field`).
381
- - A new item created in a referenced collection is immediately available in the options[^138].
383
+ - A new item created in a referenced collection is immediately available in the options.[^138]
382
384
  - Select
383
- - It’s possible to select an option with value `0`[^56].
385
+ - It’s possible to select an option with value `0`.[^56]
384
386
  - `label` is displayed in the Preview pane instead of `value`.
385
387
  - String
386
388
  - When a YouTube video URL is entered in a String field, it appears as an embedded video in the Preview pane. Check your site’s [CSP](#setting-up-content-security-policy) if the preview doesn’t work.
@@ -388,76 +390,76 @@ Sveltia CMS has been built with a multilingual architecture from the very beginn
388
390
  - Supports the `type` option that accepts `url` or `email` as a value, which will validate the value as a URL or email.
389
391
  - Supports the `prefix` and `suffix` string options, which automatically prepend and/or append the developer-defined value to the user-input value.
390
392
  - Boolean, Number and String
391
- - Supports the `before_input` and `after_input` string options, which allow developers to display custom labels before and/or after the input UI[^28]. Markdown is supported in the value.
393
+ - Supports the `before_input` and `after_input` string options, which allow developers to display custom labels before and/or after the input UI.[^28] Markdown is supported in the value.
392
394
  - Compatibility note: In Static CMS, these options are implemented as `prefix` and `suffix`, respectively, which have different meaning in Sveltia CMS.
393
395
  - File and Image
394
396
  - Provides a reimagined all-in-one asset selection dialog for File and Image fields.
395
- - [Collection-specific assets](#using-a-custom-media-folder-for-a-collection) are listed for easy selection, while all assets are displayed in a separate tab[^19].
396
- - A new asset can be uploaded by dragging & dropping it into the dialog[^20].
397
+ - [Collection-specific assets](#using-a-custom-media-folder-for-a-collection) are listed for easy selection, while all assets are displayed in a separate tab.[^19]
398
+ - A new asset can be uploaded by dragging & dropping it into the dialog.[^20]
397
399
  - A URL can also be entered in the dialog.
398
- - Integration with Pexels, Pixabay and Unsplash makes it easy to select and insert a free stock photo[^8]. More stock photo providers will be added in the future.
400
+ - Integration with Pexels, Pixabay and Unsplash makes it easy to select and insert a free stock photo.[^8] More stock photo providers will be added in the future.
399
401
  - Users can also simply drag and drop a file onto a File/Image field to attach it without having to open the Select File dialog.
400
402
  - Large images automatically fit in the Preview pane instead of being displayed at their original size, which can easily exceed the width of the pane.
401
- - If the `public_folder` contains `{{slug}}` and you’ve edited a slug field (e.g. `title`) of a new entry after uploading an asset, the updated slug will be used in the saved asset path[^140]. Other dynamic template tags such as `{{filename}}` will also be populated as expected[^141].
403
+ - If the `public_folder` contains `{{slug}}` and you’ve edited a slug field (e.g. `title`) of a new entry after uploading an asset, the updated slug will be used in the saved asset path.[^140] Other dynamic template tags such as `{{filename}}` will also be populated as expected.[^141]
402
404
  - List and Object
403
405
  - The `summary` is displayed correctly when it refers to a Relation field[^36] or a simple List field.
404
406
  - The `summary` template tags support [transformations](https://decapcms.org/docs/summary-strings/), e.g. `{{fields.date | date('YYYY-MM-DD')}}`.
405
407
  - Markdown, String and Text
406
408
  - A required field containing only spaces or line breaks will result in a validation error, as if no characters were entered.
407
409
  - Relation and Select
408
- - If a dropdown list has options with long wrapping labels, they won’t overlap with the next option[^83].
409
- - When there are 5 or fewer options, the UI automatically switches from a dropdown list to radio buttons (single-select) or checkboxes (multi-select) for faster data entry[^61]. This number can be changed with the `dropdown_threshold` option for the `relation` and `select` widgets.
410
+ - If a dropdown list has options with long wrapping labels, they won’t overlap with the next option.[^83]
411
+ - When there are 5 or fewer options, the UI automatically switches from a dropdown list to radio buttons (single-select) or checkboxes (multi-select) for faster data entry.[^61] This number can be changed with the `dropdown_threshold` option for the `relation` and `select` widgets.
410
412
  - String and Text
411
413
  - Supports the `minlength` and `maxlength` options, which allow developers to specify the minimum and maximum number of characters required for input without having to write a custom regular expression with the `pattern` option. A character counter is available when one of the options is given, and a user-friendly validation error is displayed if the condition is not met.
412
414
 
413
415
  #### New widgets
414
416
 
415
417
  - Compute
416
- - The experimental `compute` widget allows to reference the value of other fields in the same collection, similar to the `summary` property for the List and Object widgets[^104]. Use the `value` property to define the value template, e.g. `posts-{{fields.slug}}` ([example](https://github.com/sveltia/sveltia-cms/issues/111)).
418
+ - The experimental `compute` widget allows to reference the value of other fields in the same collection, similar to the `summary` property for the List and Object widgets.[^104] Use the `value` property to define the value template, e.g. `posts-{{fields.slug}}` ([example](https://github.com/sveltia/sveltia-cms/issues/111)).
417
419
  - The `value` property also supports a value of `{{index}}`, which can hold the index of a list item ([example](https://github.com/sveltia/sveltia-cms/issues/172)).
418
420
  - KeyValue (Dictionary)
419
- - The new `keyvalue` widget allows users to add arbitrary key-value string pairs to a field[^123].
421
+ - The new `keyvalue` widget allows users to add arbitrary key-value string pairs to a field.[^123]
420
422
  - While the implementation is compatible with [Static CMS](https://staticjscms.netlify.app/docs/widget-keyvalue), we provide a more intuitive UI. You can press Enter to move focus or add a new row while editing, and the preview is displayed in a clean table.
421
423
  - UUID
422
- - In addition to [generating UUIDs for entry slugs](#using-a-random-id-for-an-entry-slug), Sveltia CMS supports the proposed `uuid` widget with the following properties[^12]:
424
+ - In addition to [generating UUIDs for entry slugs](#using-a-random-id-for-an-entry-slug), Sveltia CMS supports the proposed `uuid` widget with the following properties:[^12]
423
425
  - `prefix`: A string to be prepended to the value. Default: an empty string.
424
426
  - `use_b32_encoding`: Whether to encode the value with Base32. Default: `false`.
425
427
  - `read_only`: Whether to make the field read-only. Default: `true`.
426
428
 
427
429
  ### Better asset management
428
430
 
429
- - A completely new, full-fledged Asset Library, built separately from the image selection dialog, makes it easy to manage all of your files, including images, videos and documents[^96].
430
- - Navigate between the global media folder and [collection media folders](#using-a-custom-media-folder-for-a-collection)[^6].
431
+ - A completely new, full-fledged Asset Library, built separately from the image selection dialog, makes it easy to manage all of your files, including images, videos and documents.[^96]
432
+ - Navigate between the global media folder and [collection media folders](#using-a-custom-media-folder-for-a-collection).[^6]
431
433
  - Preview image, audio, video, text and PDF files. Check your site’s [CSP](#setting-up-content-security-policy) if the preview doesn’t work.
432
- - Copy the public URL[^74], file path, text data or image data of a selected asset to clipboard. The file path starts with `/` as expected[^48].
434
+ - Copy the public URL,[^74] file path, text data or image data of a selected asset to clipboard. The file path starts with `/` as expected.[^48]
433
435
  - Edit plain text assets, including SVG images.
434
436
  - Rename existing assets. If the asset is used in any entries, the File/Image fields will be automatically updated with a new file path.
435
437
  - Replace existing assets.
436
438
  - Download one or more selected assets at once.
437
439
  - Delete one or more selected assets at once.
438
- - Upload multiple assets at once, including files in nested folders, by browsing or dragging and dropping them into the library[^5].
440
+ - Upload multiple assets at once, including files in nested folders, by browsing or dragging and dropping them into the library.[^5]
439
441
  - Sort or filter assets by name or file type.
440
442
  - View asset details, including size, dimensions, commit author/date and a list of entries that use the selected asset.
441
443
  - The global `media_folder` can be an empty string (or `.` or `/`) if you want to store assets in the root folder.
442
- - PDF documents are displayed with a thumbnail image in both the Asset Library and the Select File dialog, making it easier to find the file you’re looking for[^38].
443
- - Assets stored in an entry-relative media folder are displayed in the Asset Library[^142].
444
- - These entry-relative assets are automatically deleted when the associated entry is deleted because these are not available for other entries[^22]. When you’re [working with a local repository](#working-with-a-local-git-repository), the empty enclosing folder is also deleted.
445
- - Hidden files (dot files) don’t appear in the Asset Library[^47].
444
+ - PDF documents are displayed with a thumbnail image in both the Asset Library and the Select File dialog, making it easier to find the file you’re looking for.[^38]
445
+ - Assets stored in an entry-relative media folder are displayed in the Asset Library.[^142]
446
+ - These entry-relative assets are automatically deleted when the associated entry is deleted because these are not available for other entries.[^22] When you’re [working with a local repository](#working-with-a-local-git-repository), the empty enclosing folder is also deleted.
447
+ - Hidden files (dot files) don’t appear in the Asset Library.[^47]
446
448
  - Users can add assets using the Quick Add button in the upper right corner of the application.
447
- - Files are uploaded with their original names, without converting uppercase letters and spaces to lowercase letters and hyphens[^97].
448
- - No fatal application crash when uploading assets[^112].
449
+ - Files are uploaded with their original names, without converting uppercase letters and spaces to lowercase letters and hyphens.[^97]
450
+ - No fatal application crash when uploading assets.[^112]
449
451
 
450
452
  ### Better customization
451
453
 
452
- - The application renders within the dimensions of a [custom mount element](https://decapcms.org/docs/custom-mounting/), if exists[^109].
453
- - A custom logo defined with the `logo_url` property is displayed on the global application header and the browser tab (favicon)[^134]. A smaller logo is also correctly positioned on the authentication page[^135].
454
- - `CMS.registerCustomFormat()` supports async parser/formatter functions[^149].
454
+ - The application renders within the dimensions of a [custom mount element](https://decapcms.org/docs/custom-mounting/), if exists.[^109]
455
+ - A custom logo defined with the `logo_url` property is displayed on the global application header and the browser tab (favicon).[^134] A smaller logo is also correctly positioned on the authentication page.[^135]
456
+ - `CMS.registerCustomFormat()` supports async parser/formatter functions.[^149]
455
457
 
456
458
  ### Better localization
457
459
 
458
- - The application UI locale is automatically selected based on the preferred language set with the browser[^132]. Users can also change the locale in the application settings. Therefore, the `locale` configuration option is ignored and `CMS.registerLocale()` is not required.
459
- - The List widget’s `label` and `label_singular` are not converted to lowercase, which is especially problematic in German, where all nouns are capitalized[^98].
460
- - Long menu item labels, especially in non-English locales, don’t overflow the dropdown container[^117].
460
+ - The application UI locale is automatically selected based on the preferred language set with the browser.[^132] Users can also change the locale in the application settings. Therefore, the `locale` configuration option is ignored and `CMS.registerLocale()` is not required.
461
+ - The List widget’s `label` and `label_singular` are not converted to lowercase, which is especially problematic in German, where all nouns are capitalized.[^98]
462
+ - Long menu item labels, especially in non-English locales, don’t overflow the dropdown container.[^117]
461
463
  - We are migrating from [svelte-i18n](https://github.com/kaisermann/svelte-i18n) to the new [MessageFormat 2](https://github.com/unicode-org/message-format-wg)-based sveltia-i18n library for natural-sounding translations in every locale.
462
464
 
463
465
  ## Compatibility
@@ -468,7 +470,7 @@ However, 100% feature parity is not planned, and some features are still missing
468
470
 
469
471
  ### Features not to be implemented
470
472
 
471
- - **The Bitbucket, Gitea/Forgejo and Git Gateway backends will not be supported** for performance reasons. [Git Gateway](https://github.com/netlify/git-gateway) has not been actively maintained since Netlify CMS was abandoned, and it’s known to be slow and prone to rate limit violations. We plan to develop a high-performance alternative in the future. We may also support the other platforms if their APIs improve to allow the CMS to fetch multiple entries at once.
473
+ - **The Bitbucket, Gitea/Forgejo and Git Gateway backends will not be supported** for performance reasons. [Git Gateway](https://github.com/netlify/git-gateway) has not been actively maintained since Netlify CMS was abandoned, and it’s known to be slow and prone to rate limit violations. We plan to develop a GraphQL-based high-performance alternative in the future. We may also support the other platforms if their APIs improve to allow the CMS to fetch multiple entries at once.
472
474
  - **Netlify Identity Widget will not be supported**, as it’s not useful without Git Gateway. The [widget](https://github.com/netlify/netlify-identity-widget) has been unmaintained for years, and Netlify no longer officially supports it [according to a Netlify customer](https://github.com/sveltia/sveltia-cms/discussions/284). We plan to develop an alternative solution with role support in the future, most likely using [Cloudflare Workers](https://workers.cloudflare.com/) and [Auth.js](https://authjs.dev/).
473
475
  - The deprecated client-side implicit grant for the GitLab backend will not be supported, as it has already been [removed from GitLab 15.0](https://gitlab.com/gitlab-org/gitlab/-/issues/344609). Use the client-side PKCE authorization instead.
474
476
  - The deprecated Netlify Large Media service will not be supported. Consider other storage providers.
@@ -485,7 +487,7 @@ These limitations are expected to be resolved before the 1.0 release scheduled f
485
487
  | --- | --- |
486
488
  | Backends | The [Test backend](https://decapcms.org/docs/test-backend/) needed for our demo site is not yet added. We’ll see if [Azure DevOps](https://decapcms.org/docs/azure-backend/) can also be supported. |
487
489
  | Configuration | Comprehensive config validation is not yet implemented. |
488
- | Localization | The application UI is only available in English and Japanese at this time. |
490
+ | Localization | The application UI is only available in English and Japanese at this time. Want to be a localizer? See [this README](https://github.com/sveltia/sveltia-cms/blob/main/src/lib/locales/README.md). |
489
491
  | Media Libraries | [Cloudinary](https://decapcms.org/docs/cloudinary/) and [Uploadcare](https://decapcms.org/docs/uploadcare/) are not yet supported. |
490
492
  | Widgets | [Custom widgets](https://decapcms.org/docs/custom-widgets/) are not yet supported. See the table below for other limitations. |
491
493
  | Customization | [Custom previews](https://decapcms.org/docs/customization/) and [event subscriptions](https://decapcms.org/docs/registering-events/) are not yet supported. |
@@ -511,7 +513,7 @@ Due to the complexity, the following features are planned for after the 1.0 rele
511
513
  We plan to provide partial compatibility with [Static CMS](https://github.com/StaticJsCMS/static-cms), a now-defunct fork of Netlify CMS. This README will be updated with more details as our development progresses.
512
514
 
513
515
  - Configuration options
514
- - Static CMS made [some breaking changes](https://staticjscms.netlify.app/docs/decap-migration-guide) to sortable fields, view filters/groups, List widget, etc. while Sveltia CMS follows Netlify/Decap CMS, so you should review your configuration carefully.
516
+ - Static CMS made [some breaking changes](https://staticjscms.netlify.app/docs/decap-migration-guide) to view filters/groups, List widget, etc. while Sveltia CMS follows Netlify/Decap CMS, so you should review your configuration carefully.
515
517
  - The `default` option for sortable fields is [implemented in Sveltia CMS](#specifying-default-sort-field-and-direction).
516
518
  - Directory navigation in the Asset Library is partially supported in Sveltia CMS. If you define [collection-specific `media_folder`s](#using-a-custom-media-folder-for-a-collection), these folders will be displayed in the Asset Library and Select File/Image dialog. Display of subfolders within a configured folder will be implemented soon. We don’t plan to support the `folder_support` and `display_in_navigation` options for `media_library`; subfolders will be displayed with no configuration. ([#301](https://github.com/sveltia/sveltia-cms/issues/301))
517
519
  - The `logo_link` global option will not be supported. Use `display_url` or `site_url` instead.
@@ -537,7 +539,7 @@ We plan to provide partial compatibility with [Static CMS](https://github.com/St
537
539
 
538
540
  ### New users
539
541
 
540
- Currently, Sveltia CMS is primarily intended for existing Netlify/Decap CMS users. If you don’t have it yet, follow [their documentation](https://decapcms.org/docs/basic-steps/) to add it to your site and create a configuration file first. Make sure you choose the [GitHub](https://decapcms.org/docs/github-backend/) or [GitLab](https://decapcms.org/docs/gitlab-backend/) backend (and ignore the Choosing a Backend page). Then migrate to Sveltia CMS as described below.
542
+ Currently, Sveltia CMS is primarily intended for existing Netlify/Decap CMS users. If you don’t have it yet, follow [their documentation](https://decapcms.org/docs/basic-steps/) to add it to your site and create a configuration file first. Make sure you choose the [GitHub](https://decapcms.org/docs/github-backend/) or [GitLab](https://decapcms.org/docs/gitlab-backend/) backend (and skip the [Choosing a Backend](https://decapcms.org/docs/choosing-a-backend/) page). Then migrate to Sveltia CMS as described below.
541
543
 
542
544
  As the product evolves, we’ll implement a built-in configuration editor and provide comprehensive documentation to make it easier for everyone to get started with Sveltia CMS.
543
545
 
@@ -627,7 +629,7 @@ Sveltia CMS has simplified the local repository workflow by removing the need fo
627
629
  Here are the workflow steps and tips:
628
630
 
629
631
  1. Make sure you have configured the [GitHub](https://decapcms.org/docs/github-backend/) or [GitLab](https://decapcms.org/docs/gitlab-backend/) backend.
630
- - Please note that the Git Gateway backend mentioned in the Netlify/Decap CMS [local Git repository document](https://decapcms.org/docs/working-with-a-local-git-repository/) is not supported in Sveltia CMS, so `name: git-gateway` won’t work. You’ll need either `name: github` or `name: gitlab` along with the `repo` definition. If you haven’t determined your repository name yet, just use a tentative name.
632
+ - The Git Gateway backend mentioned in the Netlify/Decap CMS [local Git repository document](https://decapcms.org/docs/working-with-a-local-git-repository/) is not supported in Sveltia CMS, so `name: git-gateway` won’t work. You’ll need either `name: github` or `name: gitlab` along with the `repo` definition. If you haven’t determined your repository name yet, just use a tentative name.
631
633
  1. Launch the local development server for your frontend framework, typically with `npm run dev` or `pnpm dev`.
632
634
  1. Open `http://localhost:[port]/admin/index.html` with Chrome or Edge.
633
635
  - The port number varies by framework. Check the terminal output from the previous step.
@@ -643,7 +645,7 @@ Here are the workflow steps and tips:
643
645
  1. Use `git diff` or a GUI like [GitHub Desktop](https://desktop.github.com/) to see if the produced changes look good.
644
646
  1. Commit and push the changes if satisfied, or discard them if you’re just testing.
645
647
 
646
- Note that, as with Netlify/Decap CMS, the local repository support in Sveltia CMS doesn’t perform any Git operations. You’ll have to manually fetch, pull, commit and push all changes using a Git client. In the future, we’ll figure out if there’s a way to do this in a browser, because the proxy server actually has the undocumented, experimental `git` mode that creates commits to a local repository[^131].
648
+ Note that, as with Netlify/Decap CMS, the local repository support in Sveltia CMS doesn’t perform any Git operations. You’ll have to manually fetch, pull, commit and push all changes using a Git client. In the future, we’ll figure out if there’s a way to commit in a browser, because the proxy server actually has the undocumented, experimental `git` mode that creates commits to a local repository.[^131] ([Discussion](https://github.com/sveltia/sveltia-cms/discussions/31))
647
649
 
648
650
  You will also need to reload the CMS after making changes to the configuration file or retrieving remote updates. This manual work will hopefully be unnecessary once the proposed `FileSystemObserver` API, which is being [implemented in Chromium](https://issues.chromium.org/issues/40105284) behind a flag, becomes available.
649
651
 
@@ -693,7 +695,7 @@ collections:
693
695
 
694
696
  ### Using a custom media folder for a collection
695
697
 
696
- This is actually not new in Sveltia CMS but rather an undocumented feature in Netlify/Decap CMS[^4]. You can specify media and public folders for each collection that override the [global media folder](https://decapcms.org/docs/configuration-options/#media-and-public-folders). Well, it’s [documented](https://decapcms.org/docs/collection-folder/#media-and-public-folder), but that’s probably not what you want.
698
+ This is actually not new in Sveltia CMS but rather an undocumented feature in Netlify/Decap CMS.[^4] You can specify media and public folders for each collection that override the [global media folder](https://decapcms.org/docs/configuration-options/#media-and-public-folders). Well, it’s [documented](https://decapcms.org/docs/collection-folder/#media-and-public-folder), but that’s probably not what you want.
697
699
 
698
700
  Rather, if you’d like to add all the media files for a collection in one single folder, specify both `media_folder` and `public_folder` instead of leaving them empty. The trick is to use an **absolute path** for `media_folder` like the example below. You can try this with Netlify/Decap CMS first if you prefer.
699
701
 
@@ -714,16 +716,16 @@ In Sveltia CMS, those collection media folders are displayed prominently for eas
714
716
 
715
717
  ### Specifying default sort field and direction
716
718
 
717
- Sveltia CMS has extended the `sortable_fields` collection option to allow developers to define the field name and direction to be used for sorting entries by default. Our implementation is compatible with Static CMS. This is especially useful if you want to sort entries by date from new to old:
719
+ Sveltia CMS has extended the `sortable_fields` collection option to allow developers to define the field name and direction to be used for sorting entries by default. Our implementation is compatible with Static CMS. This is especially useful if you want to show entries sorted by date from new to old:
718
720
 
719
721
  ```yaml
720
722
  collections:
721
723
  - name: posts
722
724
  sortable_fields:
723
- fields: ['title', 'published_date', 'author']
725
+ fields: [title, published_date, author]
724
726
  default:
725
727
  field: published_date
726
- direction: descending # or ascending
728
+ direction: descending # default: ascending
727
729
  ```
728
730
 
729
731
  For backward compatibility with [Netlify/Decap CMS](https://decapcms.org/docs/configuration-options/#sortable_fields), `sortable_fields` with a field list (an array) will continue to work.
@@ -942,7 +944,7 @@ script-src 'self' https://unpkg.com;
942
944
  connect-src 'self' blob: data: https://unpkg.com;
943
945
  ```
944
946
 
945
- (UNPKG is used not only to download the CMS script bundle, but also to check for the latest version and retrieve additional dependencies such as [PDF.js](https://github.com/mozilla/pdf.js))
947
+ (UNPKG is used not only to download the CMS script bundle, but also to check for the latest version and retrieve additional dependencies such as [PDF.js](https://github.com/mozilla/pdf.js) and [Prism](https://prismjs.com/) language definitions)
946
948
 
947
949
  Then, add the following origins depending on your Git backend and enabled integrations.
948
950
 
@@ -1026,6 +1028,16 @@ If you have image field(s) and expect that images will be inserted as URLs, you
1026
1028
  img-src 'self' blob: data: https://*;
1027
1029
  ```
1028
1030
 
1031
+ ### Showing the CMS version
1032
+
1033
+ 1. Click on your avatar in the top right corner of the application to open the Account menu.
1034
+ 1. Click Settings.
1035
+ 1. Click the Advanced tab.
1036
+ 1. Enable Developer Mode.
1037
+ 1. Close the Settings dialog.
1038
+
1039
+ Now you can see the application version under the Help menu, next to the Account menu.
1040
+
1029
1041
  ## Support & feedback
1030
1042
 
1031
1043
  While we don’t have dedicated developer/user support resources, [quick questions](https://github.com/sveltia/sveltia-cms/discussions/new?category=q-a) and [feedback](https://github.com/sveltia/sveltia-cms/discussions/new?category=general) are welcome on the [Discussions](https://github.com/sveltia/sveltia-cms/discussions) page of our GitHub repository. We also have a [Discord channel](https://discord.gg/5hwCGqup5b) for casual chat.
@@ -1055,11 +1067,12 @@ See [Contributing to Sveltia CMS](https://github.com/sveltia/sveltia-cms/blob/ma
1055
1067
  ### After the 1.0 release
1056
1068
 
1057
1069
  - Implementing the [remaining Netlify/Decap CMS features](#features-to-be-implemented-after-ga)
1058
- - Tackling even more Netlify/Decap CMS issues, including MDX support[^122], manual entry sorting[^125], mobile optimization[^18], config editor[^10] and other [top-voted features](https://github.com/decaporg/decap-cms/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc)
1059
- - Exploring features that require server-side implementation, including user management (Netlify Identity alternative), roles[^23], commits without a GitHub or GitLab account (Git Gateway alternative), post locking (like [WordPress](https://codex.wordpress.org/Post_Locking))[^166] and scheduled posts[^167]
1070
+ - Tackling even more Netlify/Decap CMS issues, including MDX support,[^122] manual entry sorting,[^125] mobile optimization,[^18] config editor[^10] and other [top-voted features](https://github.com/decaporg/decap-cms/issues?q=is%3Aissue+is%3Aopen+sort%3Areactions-%2B1-desc)
1071
+ - Exploring features that require server-side implementation, including user management (Netlify Identity alternative), roles,[^23] commits without a GitHub or GitLab account (Git Gateway alternative), post locking (like [WordPress](https://codex.wordpress.org/Post_Locking))[^166] and scheduled posts[^167]
1060
1072
  - Considering further [compatibility with Static CMS](#compatibility-with-static-cms)
1061
- - More integration options: stock photos, stock videos, cloud storage providers, translation services, maps, analytics tools
1073
+ - More integration options: stock photos, stock videos, cloud storage providers, translation services, maps, analytics tools, etc.
1062
1074
  - AI integrations for image generation and content writing
1075
+ - Search enhancements
1063
1076
  - Advanced digital asset management (DAM) features, including image editing and tagging[^114]
1064
1077
  - End-user documentation
1065
1078
  - Contributor documentation
@@ -1306,7 +1319,7 @@ This software is provided “as is” without any express or implied warranty. W
1306
1319
 
1307
1320
  [^112]: Netlify/Decap CMS [#5815](https://github.com/decaporg/decap-cms/issues/5815), [#6522](https://github.com/decaporg/decap-cms/issues/6522), [#6532](https://github.com/decaporg/decap-cms/issues/6532), [#6588](https://github.com/decaporg/decap-cms/issues/6588), [#6617](https://github.com/decaporg/decap-cms/issues/6617), [#6640](https://github.com/decaporg/decap-cms/issues/6640), [#6663](https://github.com/decaporg/decap-cms/issues/6663), [#6695](https://github.com/decaporg/decap-cms/issues/6695), [#6697](https://github.com/decaporg/decap-cms/issues/6697), [#6764](https://github.com/decaporg/decap-cms/issues/6764), [#6765](https://github.com/decaporg/decap-cms/issues/6765), [#6835](https://github.com/decaporg/decap-cms/issues/6835), [#6983](https://github.com/decaporg/decap-cms/issues/6983), [#7205](https://github.com/decaporg/decap-cms/issues/7205)
1308
1321
 
1309
- [^113]: Netlify/Decap CMS [#5656](https://github.com/decaporg/decap-cms/issues/5656), [#5837](https://github.com/decaporg/decap-cms/issues/5837), [#5972](https://github.com/decaporg/decap-cms/issues/5972), [#6476](https://github.com/decaporg/decap-cms/issues/6476), [#6516](https://github.com/decaporg/decap-cms/issues/6516), [#6930](https://github.com/decaporg/decap-cms/issues/6930), [#6965](https://github.com/decaporg/decap-cms/issues/6965), [#7080](https://github.com/decaporg/decap-cms/issues/7080), [#7105](https://github.com/decaporg/decap-cms/issues/7105), [#7106](https://github.com/decaporg/decap-cms/issues/7106), [#7119](https://github.com/decaporg/decap-cms/issues/7119), [#7176](https://github.com/decaporg/decap-cms/issues/7176), [#7194](https://github.com/decaporg/decap-cms/issues/7194), [#7244](https://github.com/decaporg/decap-cms/issues/7244), [#7301](https://github.com/decaporg/decap-cms/issues/7301), [#7342](https://github.com/decaporg/decap-cms/issues/7342), [#7348](https://github.com/decaporg/decap-cms/issues/7348), [#7354](https://github.com/decaporg/decap-cms/issues/7354) — These `removeChild` crashes are common in React apps, likely caused by a [browser extension](https://github.com/facebook/react/issues/17256) or [Google Translate](https://github.com/facebook/react/issues/11538).
1322
+ [^113]: Netlify/Decap CMS [#5656](https://github.com/decaporg/decap-cms/issues/5656), [#5837](https://github.com/decaporg/decap-cms/issues/5837), [#5972](https://github.com/decaporg/decap-cms/issues/5972), [#6476](https://github.com/decaporg/decap-cms/issues/6476), [#6516](https://github.com/decaporg/decap-cms/issues/6516), [#6930](https://github.com/decaporg/decap-cms/issues/6930), [#6965](https://github.com/decaporg/decap-cms/issues/6965), [#7080](https://github.com/decaporg/decap-cms/issues/7080), [#7105](https://github.com/decaporg/decap-cms/issues/7105), [#7106](https://github.com/decaporg/decap-cms/issues/7106), [#7119](https://github.com/decaporg/decap-cms/issues/7119), [#7176](https://github.com/decaporg/decap-cms/issues/7176), [#7194](https://github.com/decaporg/decap-cms/issues/7194), [#7244](https://github.com/decaporg/decap-cms/issues/7244), [#7301](https://github.com/decaporg/decap-cms/issues/7301), [#7342](https://github.com/decaporg/decap-cms/issues/7342), [#7348](https://github.com/decaporg/decap-cms/issues/7348), [#7354](https://github.com/decaporg/decap-cms/issues/7354), [#7376](https://github.com/decaporg/decap-cms/issues/7376) — These `removeChild` crashes are common in React apps, likely caused by a [browser extension](https://github.com/facebook/react/issues/17256) or [Google Translate](https://github.com/facebook/react/issues/11538).
1310
1323
 
1311
1324
  [^114]: Netlify/Decap CMS [#5029](https://github.com/decaporg/decap-cms/issues/5029), [#5048](https://github.com/decaporg/decap-cms/issues/5048)
1312
1325
 
@@ -1427,3 +1440,5 @@ This software is provided “as is” without any express or implied warranty. W
1427
1440
  [^172]: Netlify/Decap CMS [#3715](https://github.com/decaporg/decap-cms/issues/3715)
1428
1441
 
1429
1442
  [^173]: Netlify/Decap CMS [#3715](https://github.com/decaporg/decap-cms/issues/5317)
1443
+
1444
+ [^174]: Netlify/Decap CMS [#6616](https://github.com/decaporg/decap-cms/issues/6616)