Releases: ianstormtaylor/slate
Releases · ianstormtaylor/slate
0.15.0
BREAKING CHANGES
- The unique
key
generated values have changed. Previously, Slate generated unique keys that looked like'9dk3'
. But they were not very conflict-resistant. Now the keys are simple string of auto-incrementing numbers, like'0'
,'1'
,'2'
. This makes more clear that keys are simply a convenient way to uniquely reference nodes in the short-term lifespan of a single in-memory instance of Slate. They are not designed to be used for long-term uniqueness. A newsetKeyGenerator
function has been exported that allows you to pass in your own key generating mechanism if you want to ensure uniqueness. - The
Raw
serializer doesn't preserve keys by default. Previously, theRaw
serializer would omit keys when passed theterse: true
option, but preserve them without it. Now it will always omit keys, unless you pass the newpreserveKeys: true
option. This better reflects that keys are temporary, in-memory IDs. - Operations on the document now update the selection when needed. This won't affect you unless you were doing some very specific things with transforms and updating selections. Overall, this makes it much easier to write transforms, since in most cases, the underlying operations will update the selection as you would expect without you doing anything.
DEPRECATION CHANGES
- Node accessor methods no longer accept being passed another node! Previously, node accessor methods like
node.getParent
could be passed either akey
string or anode
object. For performance reasons, passing in anode
object is being deprecated. So if you have any calls that look like:node.getParent(descendant)
, they will now need to be written asnode.getParent(descendant.key)
. They will throw a warning for now, and will throw an error in a later version of Slate.
0.14.0
BREAKING CHANGES
- The
undo
andredo
transforms need to be applied! Previously,undo
andredo
were special cased such that they did not require an.apply()
call, and instead would return a newState
directly. Now this is no longer the case, and they are just like every other transform. - Transforms are no longer exposed on
State
orNode
. The transforms API has been completely refactored to be built up of "operations" for collaborative editing support. As part of this refactor, the transforms are now only available via thestate.transform()
API, and aren't exposed on theState
orNode
objects as they were before. Transform
objects are now mutable. PreviouslyTransform
was an Immutable.jsRecord
, but now it is a simple constructor. This is because transforms are inherently mutating their representation of a state, but this decision is up for discussion.- The selection can now be "unset". Previously, a selection could never be in an "unset" state where the
anchorKey
orfocusKey
was null. This is no longer technically true, although this shouldn't really affect anyone in practice.
0.13.0
BREAKING CHANGES
- The
renderNode
andrenderMark
properties are gone! Previously, rendering nodes and marks happened via these two properties of the<Editor>
, but this has been replaced by the newschema
property. Check out the updated examples to see how to define a schema! There's a good chance this eliminates extra code for most use cases! 😄 - The
renderDecorations
property is gone! Decoration rendering has also been replaced by the newschema
property of the<Editor>
.
0.12.0
BREAKING CHANGES
- The
data.files
property is now anArray
. Previously it was a nativeFileList
object, but needed to be changed to add full support for pasting an dropping files in all browsers. This shouldn't affect you unless you were specifically depending on it being array-like instead of a trueArray
.
0.11.0
BREAKING CHANGES
- Void nodes are renderered implicitly again! Previously Slate had required that you wrap void node renderers yourself with the exposed
<Void>
wrapping component. This was to allow for selection styling, but a change was made to make selection styling able to handled in Javascript. Now the<Void>
wrapper will be implicitly rendered by Slate, so you do not need to worry about it, and "voidness" only needs to toggled in one place, theisVoid: true
property of a node.
0.10.0
BREAKING CHANGES
- Marks are now renderable as components. Previously the only supported way to render marks was by returning a
style
object. Now you can return a style object, a class name string, or a full React component. Because of this, the DOM will be renderered slightly differently than before, resulting in an extra<span>
when rendering non-component marks. This won't affect you unless you were depending on the DOM output by Slate for some reason.
0.9.0
BREAKING CHANGES
- The
wrap
andunwrap
method signatures have changed! Previously, you would passtype
anddata
as separate parameters, for example:wrapBlock('code', { src: true })
. This was inconsistent with other transforms, and has been updated such that a single argument ofproperties
is passed instead. So that example could now be:wrapBlock({ type: 'code', { data: { src: true }})
. You can still pass atype
string as shorthand, which will be the most frequent use case, for example:wrapBlock('code')
.
0.8.0
BREAKING CHANGES
- The
onKeyDown
andonBeforeInput
handlers signatures have changed! Previously, some Slate handlers had a signature of(e, state, editor)
and others had a signature of(e, data, state, editor)
. Now all handlers will be passed adata
object—which contains Slate-specific data related to the event—even if it is empty. This is helpful for future compatibility where we might need to add data to a handler that previously didn't have any, and is nicer for consistency. TheonKeyDown
handler's newdata
object contains thekey
name,code
and a series ofis*
properties to make working with hotkeys easier. TheonBeforeInput
handler's newdata
object is empty. - The
Utils
export has been removed. Previously, aKey
utility and thefindDOMNode
utility were exposed under theUtils
object. TheKey
has been removed in favor of thedata
object passed toonKeyDown
. And thenfindDOMNode
utility has been upgraded to a top-level named export, so you'll now need to access it viaimport { findDOMNode } from 'slate'
. - Void nodes now permanently have
" "
as content. Previously, they contained an empty string, but this isn't technically correct, since they have content and shouldn't be considered "empty". Now they will have a single space of content. This shouldn't really affect anyone, unless you happened to be accessing that string for serialization. - Empty inline nodes are now impossible. This is to stay consistent with native
contenteditable
behavior, where although technically the elements can exist, they have odd behavior and can never be selected.
0.7.0
BREAKING CHANGES
- The
Raw
serializer is no longer terse by default! Previously, theRaw
serializer would return a "terse" representation of the document, omitting information that wasn't strictly necessary to deserialize later, like thekey
of nodes. By default this no longer happens. You have to opt-in to the behavior by passing{ terse: true }
as the secondoptions
argument of thedeserialize
andserialize
methods.
0.6.0
BREAKING CHANGES
- Void components are no longer rendered implicity! Previously, Slate would automatically wrap any node with
isVoid: true
in a<Void>
component. But doing this prevented you from customizing the wrapper, like adding aclassName
orstyle
property. So you must now render the wrapper yourself, and it has been exported asSlate.Void
. This, combined with a small change to the<Void>
component's structure allows the "selected" state of void nodes to be rendered purely with CSS based on the:focus
property of a<Void>
element, which previously had to be handled in Javascript. This allows us to streamline selection-handling logic, improving performance and reducing complexity. data-offset-key
is now<key>-<index>
instead of<key>:<start>-<end>
. This shouldn't actually affect anyone, unless you were specifically relying on that attribute in the DOM. This change greatly reduces the number of re-renders needed, since previously any additional characters would cause a cascading change in the<start>
and<end>
offsets of latter text ranges.