diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml
index 7ceaec452..c384afd88 100644
--- a/.github/workflows/cypress.yml
+++ b/.github/workflows/cypress.yml
@@ -8,17 +8,17 @@ jobs:
options: --user 1001
steps:
- uses: actions/checkout@v2
- - run: yarn pull_tools && yarn tools:update
+ - run: yarn ci:pull_paragraph
- uses: cypress-io/github-action@v2
with:
config: video=false
browser: firefox
build: yarn build
chrome:
- runs-on: ubuntu-16.04
+ runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- - run: yarn pull_tools && yarn tools:update
+ - run: yarn ci:pull_paragraph
- uses: cypress-io/github-action@v2
with:
config: video=false
@@ -28,7 +28,7 @@ jobs:
runs-on: windows-latest
steps:
- uses: actions/checkout@v2
- - run: yarn pull_tools && yarn tools:update
+ - run: yarn ci:pull_paragraph
- uses: cypress-io/github-action@v2
with:
config: video=false
diff --git a/.gitmodules b/.gitmodules
index cd7ec4ee6..7dc8f02cb 100644
--- a/.gitmodules
+++ b/.gitmodules
@@ -49,3 +49,6 @@
[submodule "example/tools/underline"]
path = example/tools/underline
url = https://github.com/editor-js/underline
+[submodule "example/tools/nested-list"]
+ path = example/tools/nested-list
+ url = https://github.com/editor-js/nested-list
diff --git a/README.md b/README.md
index e873c1e47..dcc4fa393 100644
--- a/README.md
+++ b/README.md
@@ -251,4 +251,4 @@ CodeX is a team of digital specialists around the world interested in building h
| π | Join π | Twitter | Instagram |
| -- | -- | -- | -- |
-| [codex.so](https://codex.so) | [codex.so/join](https://codex.so/join) |[@codex_team](http://twitter.com/codex_team) | [@codex_team](http://instagram.com/codex_team) |
+| [codex.so](https://codex.so) | [codex.so/join](https://codex.so/join) |[@codex_team](http://twitter.com/codex_team) | [@codex_team](http://instagram.com/codex_team/) |
diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md
index 573ca444a..52adf8fcb 100644
--- a/docs/CHANGELOG.md
+++ b/docs/CHANGELOG.md
@@ -2,8 +2,24 @@
### 2.23.0
-- `Improvement` β The `onChange` callback now accepts two arguments: EditorJS API and the CustomEvent with `type` and `detail` allowing to determine what happened with a Block
-- `New` *Block API* β The new `dispatchChange()` method allows to manually trigger the 'onChange' callback. Useful when Tool made a state mutation that is invisible for editor core.
+- `Improvement` β *EditorConfig* β The `onChange` callback now accepts two arguments: EditorJS API and the CustomEvent with `type` and `detail` allowing to determine what happened with a Block
+- `New` β *Block API* β The new `dispatchChange()` method allows to manually trigger the 'onChange' callback. Useful when Tool made a state mutation that is invisible for editor core.
+- `Improvement` β *UI* β Block Tunes toggler moved to the left
+- `Improvement` β *UI* β Block Actions (BT toggler + Plus Button) will appear on block hovering instead of click
+- `Improvement` β *UI* β Block Tunes toggler icon and Plus button icon updated
+- `Improvement` β *Dev Example Page* β The menu with helpful buttons added to the bottom of the screen
+- `Improvement` β *Dev Example Page* β The 'dark' theme added. Now we can code at night more comfortably.
+- `Improvement` β *Rectangle Selection* β paint optimized
+- `Fix` β *Rectangle Selection* β the first click after RS was not clear selection state. Now does.
+- `Improvement` β *Blocks API* β toolbar moving logic removed from `blocks.move()` and `blocks.swap()` methods. Instead, you should use Toolbar API (it was used by MoveUp and MoveDown tunes, they were updated).
+- `New` β *Blocks API* β The `getBlockIndex()` method added
+- `New` β *Blocks API* β the `insert()` method now has the `replace: boolean` parameter
+- `New` β *Blocks API* β the `insert()` method now returns the inserted `Block API`
+- `New` β *Listeners API* β the `on()` method now returns the listener id.
+- `New` β *Listeners API* β the new `offById()` method added
+- `New` β `API` β The new `UiApi` section was added. It allows accessing some editor UI nodes and methods.
+- `Refactoring` β Toolbox became a standalone class instead of a Module. It can be accessed only through the Toolbar module.
+- `Refactoring` β CI flow optimized.
### 2.22.3
diff --git a/example/assets/demo.css b/example/assets/demo.css
index 60ed8b7f4..cffebcd9a 100644
--- a/example/assets/demo.css
+++ b/example/assets/demo.css
@@ -1,11 +1,27 @@
/**
* Styles for the example page
*/
+
+:root {
+ --color-bg-main: #fff;
+ --color-border-light: #E8E8EB;
+ --color-text-main: #000;
+}
+
+.dark-mode {
+ --color-border-light: rgba(255, 255, 255,.08);
+ --color-bg-main: #1c1e24;
+ --color-text-main: #737886;
+}
+
+
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
font-size: 14px;
line-height: 1.5em;
margin: 0;
+ background: var(--color-bg-main);
+ color: var(--color-text-main);
}
.ce-example {
@@ -13,7 +29,7 @@ body {
}
.ce-example__header {
- border-bottom: 1px solid #E8E8EB;
+ border-bottom: 1px solid var(--color-border-light);
height: 50px;
line-height: 50px;
display: flex;
@@ -62,23 +78,17 @@ body {
-moz-osx-font-smoothing: grayscale;
}
-.ce-example__content--small {
+.thin-mode .ce-example__content {
max-width: 500px;
border-left: 1px solid #eee;
border-right: 1px solid #eee;
padding: 0 15px;
}
-.ce-example__content--with-bg {
- background: #f4f4f4;
- max-width: none;
- margin-top: -30px;
-}
-
.ce-example__output {
background: #1B202B;
overflow-x: auto;
- padding: 0 30px;
+ padding: 0 30px 80px;
}
.ce-example__output-content {
@@ -127,29 +137,94 @@ body {
}
.ce-example__statusbar {
+ display: flex;
+ align-items: center;
position: fixed;
- bottom: 10px;
- right: 10px;
- background: #fff;
- border-radius: 8px;
- box-shadow: 0 2px 6px rgba(0, 0, 0, 0.18);
- font-size: 12px;
+ bottom: 0;
+ right: 0;
+ left: 0;
+ background: var(--color-bg-main);
+ border-radius: 8px 8px 0 0;
+ border-top: 1px solid var(--color-border-light);
+ box-shadow: 0 2px 6px var(--color-border-light);
+ font-size: 13px;
padding: 8px 15px;
z-index: 1;
+ user-select: none;
+}
+
+@media (max-width: 768px) {
+ .ce-example__statusbar {
+ display: none;
+ }
+}
+
+.ce-example__statusbar-item:not(:last-of-type)::after {
+ content: '|';
+ color: #ddd;
+ margin: 0 15px 0 12px;
+}
+
+.ce-example__statusbar-item--right {
+ margin-left: auto;
}
.ce-example__statusbar-button {
- display: inline-flex;
- margin-left: 10px;
- background: #4A9DF8;
- padding: 6px 12px;
- box-shadow: 0 7px 8px -4px rgba(137, 207, 255, 0.77);
+ display: inline-block;
+ padding: 3px 12px;
transition: all 150ms ease;
cursor: pointer;
border-radius: 31px;
+ background: #eff1f4;
+ text-align: center;
+ user-select: none;
+}
+
+.ce-example__statusbar-button:hover {
+ background: #e0e4eb;
+}
+
+.ce-example__statusbar-button-primary {
+ background: #4A9DF8;
color: #fff;
+ box-shadow: 0 7px 8px -4px rgba(137, 207, 255, 0.77);
font-family: 'PT Mono', Menlo, Monaco, Consolas, Courier New, monospace;
- text-align: center;
+}
+
+.ce-example__statusbar {
+ --toggler-size: 20px;
+}
+
+.ce-example__statusbar-toggler {
+ position: relative;
+ background: #7b8799;
+ border-radius: 20px;
+ padding: 2px;
+ width: calc(var(--toggler-size) * 2.2);
+ cursor: pointer;
+ user-select: none;
+}
+
+.ce-example__statusbar-toggler::before {
+ display: block;
+ content: '';
+ width: var(--toggler-size);
+ height: var(--toggler-size);
+ background: #fff;
+ border-radius: 50%;
+ transition: transform 100ms ease-in;
+}
+
+.ce-example__statusbar-toggler::after {
+ --moon-size: calc(var(--toggler-size) * 0.5);
+ content: '';
+ position: absolute;
+ top: 5px;
+ right: 5px;
+ height: var(--moon-size);
+ width: var(--moon-size);
+ box-shadow: calc(var(--moon-size) * 0.25 * -1) calc(var(--moon-size) * 0.18) 0 calc(var(--moon-size) * 0.05) white;
+ border-radius: 50%;
}
@media all and (max-width: 730px){
@@ -178,22 +253,10 @@ body {
color: rgb(247, 60, 173);
}
-.ce-example .ce-block:first-of-type h2.ce-header{
+.ce-example .ce-block:first-of-type h1.ce-header{
font-size: 50px;
}
-.ce-example h2.ce-header{
- font-size: 30px;
-}
-
-.ce-example h3.ce-header {
- font-size: 24px;
-}
-
-.ce-example h4.ce-header {
- font-size: 18px;
-}
-
.ce-example-multiple {
display: grid;
grid-template-columns: calc(50% - 15px) calc(50% - 15px);
@@ -206,3 +269,101 @@ body {
border-radius: 7px;
padding: 30px;
}
+
+.show-block-boundaries .ce-block {
+ box-shadow: inset 0 0 0 1px #eff2f5;
+}
+
+.show-block-boundaries .ce-block__content {
+ box-shadow: 0 0 0 1px rgba(224, 231, 241, 0.61) inset;
+}
+.show-block-boundaries #showBlocksBoundariesButton span,
+.thin-mode #enableThinModeButton span {
+ font-size: 0;
+ vertical-align: bottom;
+}
+
+.show-block-boundaries #showBlocksBoundariesButton span::before,
+.thin-mode #enableThinModeButton span::before {
+ content: attr(data-toggled-text);
+ display: inline;
+ font-size: 13px;
+}
+
+
+
+/**
+ * Dark theme overrides
+ */
+.dark-mode img {
+ opacity: 0.5;
+}
+
+.dark-mode .cdx-simple-image__picture--with-border,
+.dark-mode .cdx-input {
+ border-color: var(--color-border-light);
+}
+
+.dark-mode .ce-example__button {
+ box-shadow: 0 24px 18px -14px rgba(4, 154, 255, 0.24);
+}
+
+.dark-mode .ce-example__output {
+ background-color: #17191f;
+}
+
+.dark-mode .inline-code {
+ background-color: rgba(53, 56, 68, 0.62);
+ color: #727683;
+}
+
+.dark-mode a {
+ color: #959ba8;
+}
+
+.dark-mode .ce-example__statusbar-toggler,
+.dark-mode .ce-example__statusbar-button {
+ background-color: #343842;
+}
+
+.dark-mode .ce-example__statusbar-toggler::before {
+ transform: translateX(calc(var(--toggler-size) * 2.2 - var(--toggler-size)));
+}
+
+.dark-mode .ce-example__statusbar-toggler::after {
+ content: '*';
+ right: auto;
+ left: 6px;
+ top: 7px;
+ color: #fff;
+ box-shadow: none;
+ font-size: 32px;
+}
+
+.dark-mode.show-block-boundaries .ce-block,
+.dark-mode.show-block-boundaries .ce-block__content {
+ box-shadow: 0 0 0 1px rgba(128, 144, 159, 0.09) inset;
+}
+
+.dark-mode.thin-mode .ce-example__content{
+ border-color: var(--color-border-light);
+}
+
+.dark-mode .ce-example__statusbar-item:not(:last-of-type)::after {
+ color: var(--color-border-light);
+}
+
+.dark-mode .ce-block--selected .ce-block__content,
+.dark-mode ::selection{
+ background-color: rgba(57, 68, 84, 0.57);
+}
+
+.dark-mode .ce-toolbox__button,
+.dark-mode .ce-toolbar__settings-btn,
+.dark-mode .ce-toolbar__plus {
+ color: inherit;
+}
+
+.dark-mode .ce-stub {
+ opacity: 0.3;
+}
diff --git a/example/example-dev.html b/example/example-dev.html
index 8064cb07e..cb7e90897 100644
--- a/example/example-dev.html
+++ b/example/example-dev.html
@@ -1,5 +1,5 @@
-
+
@@ -88,10 +112,10 @@