Procházet zdrojové kódy

Merge branch 'master' into t/1137

Piotrek Koszuliński před 7 roky
rodič
revize
ac7487aba9

+ 1 - 9
README.md

@@ -130,15 +130,7 @@ Read more on the [Support](https://docs.ckeditor.com/ckeditor5/latest/framework/
 
 ## Releases
 
-The five latest releases:
-
-* [Introduced the table feature and soft line-breaks – CKEditor 5 v10.1.0](https://github.com/ckeditor/ckeditor5/releases/tag/v10.1.0) (<time datetime="2018-06-21T12:00:00Z"><i>June 21, 2018</i></time>)
-* [Security release – CKEditor 5 v10.0.1](https://github.com/ckeditor/ckeditor5/releases/tag/v10.0.1) (<time datetime="2018-05-22T12:04:45Z"><i>May 22, 2018</i></time>)
-* [First stable release – CKEditor 5 v10.0.0](https://github.com/ckeditor/ckeditor5/releases/tag/v10.0.0) (<time datetime="2018-04-25T14:12:00Z"><i>Apr 25, 2018</i></time>)
-* [Beta release of CKEditor 5 v1.0.0](https://ckeditor.com/blog/CKEditor-5-v1.0.0-beta-released/) (<time datetime="2018-04-10T12:12:00Z"><i>Apr 10, 2018</i></time>)
-* [Second alpha release of CKEditor 5 v1.0.0](https://ckeditor.com/blog/Second-alpha-release-of-CKEditor-5-v1.0.0/) (<time datetime="2017-11-14T12:52:18Z"><i>Nov 14, 2017</i></time>)
-
-For more CKEditor 5 release blog posts [browse the CKEditor blog](https://ckeditor.com/blog/?category=releases&tags=CKEditor-5).
+See CKEditor 5 release blog posts [on the CKEditor blog](https://ckeditor.com/blog/?category=releases&tags=CKEditor-5).
 
 ## Packages
 

+ 116 - 0
docs/_snippets/builds/saving-data/autosave.html

@@ -0,0 +1,116 @@
+<div id="snippet-autosave">
+	<p>Type some text to test the <a href="#autosave-feature">autosave</a> feature.</p>
+</div>
+
+<div class="snippet-autosave-header">
+	<div class="snippet-autosave-status">
+		<div class="snippet-autosave-status_label">Status:</div>
+		<div class="snippet-autosave-status_spinner">
+			<span class="snippet-autosave-status_spinner-label"></span>
+			<span class="snippet-autosave-status_spinner-loader"></span>
+		</div>
+	</div>
+
+	<div class="snippet-autosave-server">
+		<div class="snippet-autosave-server_label">HTTP server lag (ms):</div>
+		<input id="snippet-autosave-lag" type="number" value="500" step="100" min="0" max="9000">
+	</div>
+</div>
+
+<p>Server data:</p>
+
+<pre>
+	<code id="snippet-autosave-console">Type some text to test the &#x3C;a href=&#x22;#autosave-feature&#x22;&#x3E;autosave&#x3C;/a&#x3E; feature.</code>
+</pre>
+
+<style>
+	.snippet-autosave-header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		background: var(--ck-color-toolbar-background);
+		border: 1px solid var(--ck-color-toolbar-border);
+		padding: 10px;
+		border-radius: var(--ck-border-radius);
+		margin-top: -1.5em;
+		margin-bottom: 1.5em;
+		border-top: 0;
+		border-top-left-radius: 0;
+		border-top-right-radius: 0;
+	}
+
+	.snippet-autosave-status_spinner{
+		display: flex;
+		align-items: center;
+		position: relative;
+	}
+	.snippet-autosave-status_spinner-label {
+		position: relative;
+	}
+
+	.snippet-autosave-status_spinner-label::after {
+		content: 'Saved!';
+		color: green;
+		display: inline-block;
+		margin-right: var(--ck-spacing-medium);
+	}
+
+	/* During "Saving" display spinner and change content of label. */
+	.snippet-autosave-status.busy .snippet-autosave-status_spinner-label::after  {
+		content: 'Saving...';
+		color: red;
+	}
+
+	.snippet-autosave-status.busy .snippet-autosave-status_spinner-loader {
+		display: block;
+		width: 16px;
+		height: 16px;
+		border-radius: 50%;
+		border-top: 3px solid hsl(0, 0%, 70%);
+		border-right: 2px solid transparent;
+		animation: autosave-status-spinner 1s linear infinite;
+	}
+
+	.snippet-autosave-status,
+	.snippet-autosave-server {
+		display: flex;
+		align-items: center;
+	}
+
+	.snippet-autosave-server_label,
+	.snippet-autosave-status_label {
+		font-weight: bold;
+		margin-right: var(--ck-spacing-medium);
+	}
+
+	#snippet-autosave + .ck.ck-editor .ck-editor__editable {
+		border-bottom-right-radius: 0;
+		border-bottom-left-radius: 0;
+	}
+
+	#snippet-autosave-lag {
+		padding: 4px;
+	}
+
+	#snippet-autosave-console {
+		/* Lets wrap content. */
+		max-height: 300px;
+		overflow: auto;
+		white-space: normal;
+		background: #2b2c26;
+		transition: 300ms;
+	}
+
+	#snippet-autosave-console.received {
+		animation: autosave-received 1s ease 1;
+	}
+
+	@keyframes autosave-status-spinner {
+		to { transform: rotate( 360deg ); }
+	}
+
+	@keyframes autosave-received {
+		from { background: green; }
+		to { background: #2b2c26; }
+	}
+</style>

+ 67 - 0
docs/_snippets/builds/saving-data/autosave.js

@@ -0,0 +1,67 @@
+/**
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/* globals ClassicEditor, console, window, document, setTimeout */
+
+import { CS_CONFIG } from '@ckeditor/ckeditor5-cloud-services/tests/_utils/cloud-services-config';
+
+let HTTP_SERVER_LAG = 500;
+
+document.querySelector( '#snippet-autosave-lag' ).addEventListener( 'change', evt => {
+	HTTP_SERVER_LAG = evt.target.value;
+} );
+
+ClassicEditor
+	.create( document.querySelector( '#snippet-autosave' ), {
+		cloudServices: CS_CONFIG,
+		toolbar: {
+			viewportTopOffset: 60
+		},
+		autosave: {
+			save( editor ) {
+				return saveData( editor.getData() );
+			}
+		}
+	} )
+	.then( editor => {
+		window.editor = editor;
+
+		displayStatus( editor );
+	} )
+	.catch( err => {
+		console.error( err.stack );
+	} );
+
+function saveData( data ) {
+	return new Promise( resolve => {
+		// Fake HTTP server's lag.
+		setTimeout( () => {
+			log( data );
+
+			resolve();
+		}, HTTP_SERVER_LAG );
+	} );
+}
+
+function displayStatus( editor ) {
+	const pendingActions = editor.plugins.get( 'PendingActions' );
+	const statusIndicator = document.querySelector( '.snippet-autosave-status' );
+	const console = document.querySelector( '#snippet-autosave-console' );
+
+	pendingActions.on( 'change:hasAny', ( evt, propertyName, newValue ) => {
+		if ( newValue ) {
+			statusIndicator.classList.add( 'busy' );
+			console.classList.remove( 'received' );
+		} else {
+			statusIndicator.classList.remove( 'busy' );
+			console.classList.add( 'received' );
+		}
+	} );
+}
+
+function log( msg ) {
+	const console = document.querySelector( '#snippet-autosave-console' );
+	console.textContent = msg;
+}

+ 0 - 0
docs/_snippets/builds/saving-data/build-autosave-source.html


+ 14 - 0
docs/_snippets/builds/saving-data/build-autosave-source.js

@@ -0,0 +1,14 @@
+/**
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/* globals window */
+
+import ClassicEditor from '@ckeditor/ckeditor5-build-classic/src/ckeditor';
+
+import Autosave from '@ckeditor/ckeditor5-autosave/src/autosave';
+
+ClassicEditor.builtinPlugins.push( Autosave );
+
+window.ClassicEditor = ClassicEditor;

+ 106 - 0
docs/_snippets/builds/saving-data/manualsave.html

@@ -0,0 +1,106 @@
+<div id="snippet-manual">
+	<p>Change the content of this editor, then save it on the server.</p>
+</div>
+
+<div class="snippet-manual-save-header">
+	<div class="snippet-manual-save-server">
+		<div class="snippet-manual-save-server_label">HTTP server lag (ms):</div>
+		<input id="snippet-manual-lag" type="number" value="500" step="100" min="0" max="9000">
+	</div>
+	<div class="snippet-manual-save-submit">
+		<input id="snippet-manual-save" type="submit" value="Save">
+	</div>
+</div>
+
+<p>Server data:</p>
+
+<pre>
+	<code id="snippet-manual-save-console">&#x3C;p&#x3E;Change the content of this editor, then save it on the server.&#x3C;/p&#x3E;</code>
+</pre>
+
+<style>
+	.snippet-manual-save-header {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		background: var(--ck-color-toolbar-background);
+		border: 1px solid var(--ck-color-toolbar-border);
+		padding: 10px;
+		border-radius: var(--ck-border-radius);
+		margin-top: -1.5em;
+		margin-bottom: 1.5em;
+		border-top: 0;
+		border-top-left-radius: 0;
+		border-top-right-radius: 0;
+	}
+
+	.snippet-manual-save-server,
+	.snippet-manual-save-submit {
+		display: flex;
+		align-items: center;
+	}
+
+	.snippet-manual-save-server_label,
+	.snippet-manual-save-status_label {
+		font-weight: bold;
+		margin-right: var(--ck-spacing-medium);
+	}
+
+	#snippet-manual + .ck.ck-editor .ck-editor__editable {
+		border-bottom-right-radius: 0;
+		border-bottom-left-radius: 0;
+	}
+
+	#snippet-manual-save-lag {
+		padding: 4px;
+	}
+
+	#snippet-manual-save {
+		color: #fff;
+		background: hsl( 88, 73%, 39% );
+		opacity: 0.5;
+		padding: 4px 20px;
+		display: block;
+		border: 0;
+		border-radius: 2px;
+		font-weight: bold;
+		outline: none;
+		transition: 300ms ease background;
+		box-shadow: 0 2px 0 rgb(68, 117, 10);
+	}
+
+	#snippet-manual-save:hover {
+		background: hsl( 88, 73%, 42% );
+	}
+
+	#snippet-manual-save:active,
+	#snippet-manual-save:focus {
+		box-shadow: 0 1px 0 rgb(68, 117, 10);
+	}
+
+	#snippet-manual-save.active {
+		cursor: pointer;
+		opacity: 1;
+	}
+
+	#snippet-manual-save.saving {
+		background: hsl( 88, 73%, 34% );
+	}
+
+	#snippet-manual-save-console {
+		/* Lets wrap content. */
+		max-height: 300px;
+		overflow: auto;
+		white-space: normal;
+		background: #2b2c26;
+		transition: 300ms;
+	}
+
+	#snippet-manual-save-console.received {
+		animation: autosave-received 1s ease 1;
+	}
+	@keyframes autosave-received {
+		from { background: green; }
+		to { background: #2b2c26; }
+	}
+</style>

+ 106 - 0
docs/_snippets/builds/saving-data/manualsave.js

@@ -0,0 +1,106 @@
+/**
+ * @license Copyright (c) 2003-2018, CKSource - Frederico Knabben. All rights reserved.
+ * For licensing, see LICENSE.md.
+ */
+
+/* globals ClassicEditor, console, window, document, setTimeout */
+
+import { CS_CONFIG } from '@ckeditor/ckeditor5-cloud-services/tests/_utils/cloud-services-config';
+
+let HTTP_SERVER_LAG = 500;
+let isDirty = false;
+
+document.querySelector( '#snippet-manual-lag' ).addEventListener( 'change', evt => {
+	HTTP_SERVER_LAG = evt.target.value;
+} );
+
+ClassicEditor
+	.create( document.querySelector( '#snippet-manual' ), {
+		cloudServices: CS_CONFIG,
+		toolbar: {
+			viewportTopOffset: 60
+		}
+	} )
+	.then( editor => {
+		window.editor = editor;
+
+		handleStatusChanges( editor );
+		handleSaveButton( editor );
+		handleBeforeunload( editor );
+	} )
+	.catch( err => {
+		console.error( err.stack );
+	} );
+
+// Handle clicking the "Save" button.
+function handleSaveButton( editor ) {
+	const saveButton = document.querySelector( '#snippet-manual-save' );
+	const pendingActions = editor.plugins.get( 'PendingActions' );
+
+	saveButton.addEventListener( 'click', evt => {
+		const data = editor.getData();
+		const action = pendingActions.add( 'Saving in progress.' );
+
+		evt.preventDefault();
+
+		// Fake HTTP server's lag.
+		setTimeout( () => {
+			log( data );
+
+			pendingActions.remove( action );
+
+			// Reset isDirty only if data didn't change in the meantime.
+			if ( data == editor.getData() ) {
+				isDirty = false;
+			}
+
+			updateStatus( editor );
+		}, HTTP_SERVER_LAG );
+	} );
+}
+
+function handleStatusChanges( editor ) {
+	const pendingActions = editor.plugins.get( 'PendingActions' );
+
+	pendingActions.on( 'change:hasAny', () => updateStatus( editor ) );
+
+	editor.model.document.on( 'change:data', () => {
+		isDirty = true;
+
+		updateStatus( editor );
+	} );
+}
+
+function handleBeforeunload( editor ) {
+	window.addEventListener( 'beforeunload', evt => {
+		if ( editor.plugins.get( 'PendingActions' ).hasAny ) {
+			evt.preventDefault();
+		}
+	} );
+}
+
+function updateStatus( editor ) {
+	const saveButton = document.querySelector( '#snippet-manual-save' );
+
+	if ( isDirty ) {
+		saveButton.classList.add( 'active' );
+	} else {
+		saveButton.classList.remove( 'active' );
+	}
+
+	if ( editor.plugins.get( 'PendingActions' ).hasAny ) {
+		document.querySelector( '#snippet-manual-save-console' ).classList.remove( 'received' );
+		saveButton.value = 'Saving...';
+		saveButton.classList.add( 'saving' );
+	} else {
+		saveButton.value = 'Save';
+		saveButton.classList.remove( 'saving' );
+	}
+}
+
+function log( msg ) {
+	const console = document.querySelector( '#snippet-manual-save-console' );
+
+	console.classList.add( 'received' );
+	console.textContent = msg;
+}

+ 21 - 22
docs/builds/guides/development/installing-plugins.md

@@ -186,35 +186,34 @@ All this works because a typical `src/ckeditor.js` module that you can find in e
 ```js
 import ClassicEditorBase from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
 import EssentialsPlugin from '@ckeditor/ckeditor5-essentials/src/essentials';
-import UploadadapterPlugin from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter';
+import UploadAdapterPlugin from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter';
 import AutoformatPlugin from '@ckeditor/ckeditor5-autoformat/src/autoformat';
 import BoldPlugin from '@ckeditor/ckeditor5-basic-styles/src/bold';
 import ItalicPlugin from '@ckeditor/ckeditor5-basic-styles/src/italic';
-import BlockquotePlugin from '@ckeditor/ckeditor5-block-quote/src/blockquote';
+import BlockQuotePlugin from '@ckeditor/ckeditor5-block-quote/src/blockquote';
 // ...
 
 export default class ClassicEditor extends ClassicEditorBase {}
 
-ClassicEditor.build = {
-	plugins: [
-		EssentialsPlugin,
-		UploadadapterPlugin,
-		AutoformatPlugin,
-		BoldPlugin,
-		ItalicPlugin,
-		BlockquotePlugin,
-		// ...
-	],
-	config: {
-		toolbar: {
-			items: [
-				'heading',
-				'bold',
-				// ...
-			]
-		},
-		// ...
-	}
+ClassicEditor.builtInPlugins = [
+	EssentialsPlugin,
+	UploadAdapterPlugin,
+	AutoformatPlugin,
+	BoldPlugin,
+	ItalicPlugin,
+	BlockQuotePlugin,
+	// ...
+];
+
+ClassicEditor.defaultConfig = {
+	toolbar: {
+		items: [
+			'heading',
+			'bold',
+			// ...
+		]
+	},
+	// ...
 };
 ```
 

+ 63 - 65
docs/builds/guides/integration/advanced-setup.md

@@ -1,6 +1,6 @@
 ---
 category: builds-integration
-order: 40
+order: 50
 ---
 
 # Advanced setup
@@ -179,71 +179,69 @@ You can now import all the needed plugins and the creator directly into your cod
 ```js
 import ClassicEditorBase from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
 import EssentialsPlugin from '@ckeditor/ckeditor5-essentials/src/essentials';
-import UploadadapterPlugin from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter';
+import UploadAdapterPlugin from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter';
 import AutoformatPlugin from '@ckeditor/ckeditor5-autoformat/src/autoformat';
 import BoldPlugin from '@ckeditor/ckeditor5-basic-styles/src/bold';
 import ItalicPlugin from '@ckeditor/ckeditor5-basic-styles/src/italic';
-import BlockquotePlugin from '@ckeditor/ckeditor5-block-quote/src/blockquote';
-import EasyimagePlugin from '@ckeditor/ckeditor5-easy-image/src/easyimage';
+import BlockQuotePlugin from '@ckeditor/ckeditor5-block-quote/src/blockquote';
+import EasyImagePlugin from '@ckeditor/ckeditor5-easy-image/src/easyimage';
 import HeadingPlugin from '@ckeditor/ckeditor5-heading/src/heading';
 import ImagePlugin from '@ckeditor/ckeditor5-image/src/image';
-import ImagecaptionPlugin from '@ckeditor/ckeditor5-image/src/imagecaption';
-import ImagestylePlugin from '@ckeditor/ckeditor5-image/src/imagestyle';
-import ImagetoolbarPlugin from '@ckeditor/ckeditor5-image/src/imagetoolbar';
-import ImageuploadPlugin from '@ckeditor/ckeditor5-image/src/imageupload';
+import ImageCaptionPlugin from '@ckeditor/ckeditor5-image/src/imagecaption';
+import ImageStylePlugin from '@ckeditor/ckeditor5-image/src/imagestyle';
+import ImageToolbarPlugin from '@ckeditor/ckeditor5-image/src/imagetoolbar';
+import ImageUploadPlugin from '@ckeditor/ckeditor5-image/src/imageupload';
 import LinkPlugin from '@ckeditor/ckeditor5-link/src/link';
 import ListPlugin from '@ckeditor/ckeditor5-list/src/list';
 import ParagraphPlugin from '@ckeditor/ckeditor5-paragraph/src/paragraph';
 
 export default class ClassicEditor extends ClassicEditorBase {}
 
-ClassicEditor.build = {
-	plugins: [
-		EssentialsPlugin,
-		UploadadapterPlugin,
-		AutoformatPlugin,
-		BoldPlugin,
-		ItalicPlugin,
-		BlockquotePlugin,
-		EasyimagePlugin,
-		HeadingPlugin,
-		ImagePlugin,
-		ImagecaptionPlugin,
-		ImagestylePlugin,
-		ImagetoolbarPlugin,
-		ImageuploadPlugin,
-		LinkPlugin,
-		ListPlugin,
-		ParagraphPlugin
-	],
-	config: {
-		toolbar: {
-			items: [
-				'heading',
-				'|',
-				'bold',
-				'italic',
-				'link',
-				'bulletedList',
-				'numberedList',
-				'imageUpload',
-				'blockQuote',
-				'undo',
-				'redo'
-			]
-		},
-		image: {
-			toolbar: [
-				'imageStyle:full',
-				'imageStyle:side',
-				'|',
-				'imageTextAlternative'
-			]
-		},
-		language: 'en'
-	}
+ClassicEditor.builtinPlugins = [
+	EssentialsPlugin,
+	UploadAdapterPlugin,
+	AutoformatPlugin,
+	BoldPlugin,
+	ItalicPlugin,
+	BlockQuotePlugin,
+	EasyImagePlugin,
+	HeadingPlugin,
+	ImagePlugin,
+	ImageCaptionPlugin,
+	ImageStylePlugin,
+	ImageToolbarPlugin,
+	ImageUploadPlugin,
+	LinkPlugin,
+	ListPlugin,
+	ParagraphPlugin
+];
+
+ClassicEditor.defaultConfig = {
+	toolbar: {
+		items: [
+			'heading',
+			'|',
+			'bold',
+			'italic',
+			'link',
+			'bulletedList',
+			'numberedList',
+			'imageUpload',
+			'blockQuote',
+			'undo',
+			'redo'
+		]
+	},
+	image: {
+		toolbar: [
+			'imageStyle:full',
+			'imageStyle:side',
+			'|',
+			'imageTextAlternative'
+		]
+	},
+	language: 'en'
 };
-
 ```
 
 This module will export an editor creator class which has all the plugins and configuration that you need already built-in. To use such editor, simply import that class and call the static `.create()` method like in all {@link builds/guides/integration/basic-api#creating-an-editor examples}.
@@ -269,18 +267,18 @@ The second variant how to run the editor is to use the creator class directly, w
 ```js
 import ClassicEditor from '@ckeditor/ckeditor5-editor-classic/src/classiceditor';
 import EssentialsPlugin from '@ckeditor/ckeditor5-essentials/src/essentials';
-import UploadadapterPlugin from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter';
+import UploadAdapterPlugin from '@ckeditor/ckeditor5-adapter-ckfinder/src/uploadadapter';
 import AutoformatPlugin from '@ckeditor/ckeditor5-autoformat/src/autoformat';
 import BoldPlugin from '@ckeditor/ckeditor5-basic-styles/src/bold';
 import ItalicPlugin from '@ckeditor/ckeditor5-basic-styles/src/italic';
-import BlockquotePlugin from '@ckeditor/ckeditor5-block-quote/src/blockquote';
-import EasyimagePlugin from '@ckeditor/ckeditor5-easy-image/src/easyimage';
+import BlockQuotePlugin from '@ckeditor/ckeditor5-block-quote/src/blockquote';
+import EasyImagePlugin from '@ckeditor/ckeditor5-easy-image/src/easyimage';
 import HeadingPlugin from '@ckeditor/ckeditor5-heading/src/heading';
 import ImagePlugin from '@ckeditor/ckeditor5-image/src/image';
-import ImagecaptionPlugin from '@ckeditor/ckeditor5-image/src/imagecaption';
-import ImagestylePlugin from '@ckeditor/ckeditor5-image/src/imagestyle';
-import ImagetoolbarPlugin from '@ckeditor/ckeditor5-image/src/imagetoolbar';
-import ImageuploadPlugin from '@ckeditor/ckeditor5-image/src/imageupload';
+import ImageCaptionPlugin from '@ckeditor/ckeditor5-image/src/imagecaption';
+import ImageStylePlugin from '@ckeditor/ckeditor5-image/src/imagestyle';
+import ImageToolbarPlugin from '@ckeditor/ckeditor5-image/src/imagetoolbar';
+import ImageUploadPlugin from '@ckeditor/ckeditor5-image/src/imageupload';
 import LinkPlugin from '@ckeditor/ckeditor5-link/src/link';
 import ListPlugin from '@ckeditor/ckeditor5-list/src/list';
 import ParagraphPlugin from '@ckeditor/ckeditor5-paragraph/src/paragraph';
@@ -293,12 +291,12 @@ ClassicEditor
 			AutoformatPlugin,
 			BoldPlugin,
 			ItalicPlugin,
-			BlockquotePlugin,
+			BlockQuotePlugin,
 			HeadingPlugin,
 			ImagePlugin,
-			ImagecaptionPlugin,
-			ImagestylePlugin,
-			ImagetoolbarPlugin,
+			ImageCaptionPlugin,
+			ImageStylePlugin,
+			ImageToolbarPlugin,
 			LinkPlugin,
 			ListPlugin,
 			ParagraphPlugin

+ 1 - 1
docs/builds/guides/integration/configuration.md

@@ -59,7 +59,7 @@ ClassicEditor
 Each build has a number of plugins available. You can easily list all plugins available in your build:
 
 ```js
-ClassicEditor.build.plugins.map( plugin => plugin.pluginName );
+ClassicEditor.builtinPlugins.map( plugin => plugin.pluginName );
 ```
 
 ## Adding features

Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 313 - 0
docs/builds/guides/integration/saving-data.md


Rozdílová data souboru nebyla zobrazena, protože soubor je příliš velký
+ 1 - 1
docs/framework/guides/overview.md


+ 4 - 8
package.json

@@ -4,14 +4,11 @@
   "description": "The development environment of CKEditor 5 – the best browser-based rich text editor.",
   "private": true,
   "keywords": [
-    "CKEditor",
+    "ckeditor",
     "ckeditor5",
     "ckeditor 5",
-    "WYSIWYG",
-    "WYSIWYM",
-    "text",
-    "rich-text",
-    "richtext",
+    "wysiwyg",
+    "rich text",
     "editor",
     "html",
     "contentEditable",
@@ -21,7 +18,6 @@
     "collaboration",
     "collaborative",
     "real-time",
-    "virtual dom",
     "framework"
   ],
   "dependencies": {
@@ -88,7 +84,7 @@
     "webpack": "^4.15.0"
   },
   "engines": {
-    "node": ">=6.0.0",
+    "node": ">=6.9.0",
     "npm": ">=3.0.0"
   },
   "author": "CKSource (http://cksource.com/)",

+ 1 - 1
scripts/release-ckeditor5.sh

@@ -20,7 +20,7 @@ then
 	mgit exec 'git checkout -b stable 2> /dev/null && git push origin stable && git checkout master'
 
 	# Update all `stable` branches in all packages.
-	mgit exec 'git checkout stable && git merge master && git checkout master'
+	mgit exec 'git checkout stable && git pull origin stable && git merge master && git checkout master'
 
 	# Make sure that `mgit.json` for `stable` and `master` branches is correct.
 	# `stable` branch.

+ 6 - 1
scripts/release/changelog.js

@@ -9,10 +9,15 @@
 
 'use strict';
 
+// In order to use the same version for all packages (including builds and ckeditor5 itself), you can call:
+// npm run changelog [newVersion]
+
 const devEnv = require( '@ckeditor/ckeditor5-dev-env' );
 const commonOptions = {
 	cwd: process.cwd(),
-	packages: 'packages'
+	packages: 'packages',
+	// `newVersion` is mostly used for testing purposes. It allows generating changelog that contains the same version for all packages.
+	newVersion: process.argv[ 2 ] || null
 };
 const editorBuildsGlob = '@ckeditor/ckeditor5-build-*';
 

+ 6 - 1
scripts/release/release-dependencies.js

@@ -9,8 +9,13 @@
 
 'use strict';
 
+// In order to test the whole process, you can use:
+// npm run release:dependencies -- --dry-run
+// It will create some commits but nothing will be pushed or published.
+
 require( '@ckeditor/ckeditor5-dev-env' )
 	.releaseSubRepositories( {
 		cwd: process.cwd(),
-		packages: 'packages'
+		packages: 'packages',
+		dryRun: process.argv.includes( '--dry-run' )
 	} );