@next-buildr/editor 0.0.0-stage → 2.0.1
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/LICENSE +21 -0
- package/README.md +4 -2
- package/dist/.tsbuildinfo +1 -0
- package/dist/app/builder-editor.d.ts +8 -0
- package/dist/app/builder-editor.d.ts.map +1 -0
- package/dist/app/builder-editor.js +14 -0
- package/dist/app/builder-editor.test.d.ts +2 -0
- package/dist/app/builder-editor.test.d.ts.map +1 -0
- package/dist/app/builder-editor.test.js +199 -0
- package/dist/app/config.d.ts +59 -0
- package/dist/app/config.d.ts.map +1 -0
- package/dist/app/config.js +18 -0
- package/dist/app/content-language.test.d.ts +2 -0
- package/dist/app/content-language.test.d.ts.map +1 -0
- package/dist/app/content-language.test.js +157 -0
- package/dist/app/editor-app.d.ts +17 -0
- package/dist/app/editor-app.d.ts.map +1 -0
- package/dist/app/editor-app.js +206 -0
- package/dist/app/editor-app.test.d.ts +2 -0
- package/dist/app/editor-app.test.d.ts.map +1 -0
- package/dist/app/editor-app.test.js +135 -0
- package/dist/app/layout.d.ts +32 -0
- package/dist/app/layout.d.ts.map +1 -0
- package/dist/app/layout.js +82 -0
- package/dist/app/manifest.d.ts +12 -0
- package/dist/app/manifest.d.ts.map +1 -0
- package/dist/app/manifest.js +17 -0
- package/dist/app/shell-panels.d.ts +15 -0
- package/dist/app/shell-panels.d.ts.map +1 -0
- package/dist/app/shell-panels.js +5 -0
- package/dist/app/small-screen.d.ts +12 -0
- package/dist/app/small-screen.d.ts.map +1 -0
- package/dist/app/small-screen.js +33 -0
- package/dist/app/small-screen.test.d.ts +2 -0
- package/dist/app/small-screen.test.d.ts.map +1 -0
- package/dist/app/small-screen.test.js +108 -0
- package/dist/app/status-info.d.ts +14 -0
- package/dist/app/status-info.d.ts.map +1 -0
- package/dist/app/status-info.js +34 -0
- package/dist/app/use-resizable.d.ts +34 -0
- package/dist/app/use-resizable.d.ts.map +1 -0
- package/dist/app/use-resizable.js +84 -0
- package/dist/canvas-host/canvas-frame.d.ts +53 -0
- package/dist/canvas-host/canvas-frame.d.ts.map +1 -0
- package/dist/canvas-host/canvas-frame.js +146 -0
- package/dist/canvas-host/canvas-frame.test.d.ts +2 -0
- package/dist/canvas-host/canvas-frame.test.d.ts.map +1 -0
- package/dist/canvas-host/canvas-frame.test.js +91 -0
- package/dist/canvas-host/host.d.ts +109 -0
- package/dist/canvas-host/host.d.ts.map +1 -0
- package/dist/canvas-host/host.js +293 -0
- package/dist/canvas-host/host.test.d.ts +2 -0
- package/dist/canvas-host/host.test.d.ts.map +1 -0
- package/dist/canvas-host/host.test.js +398 -0
- package/dist/canvas-host/index.d.ts +5 -0
- package/dist/canvas-host/index.d.ts.map +1 -0
- package/dist/canvas-host/index.js +2 -0
- package/dist/clipboard/clipboard.d.ts +38 -0
- package/dist/clipboard/clipboard.d.ts.map +1 -0
- package/dist/clipboard/clipboard.js +160 -0
- package/dist/clipboard/clipboard.test.d.ts +2 -0
- package/dist/clipboard/clipboard.test.d.ts.map +1 -0
- package/dist/clipboard/clipboard.test.js +457 -0
- package/dist/clipboard/format.d.ts +27 -0
- package/dist/clipboard/format.d.ts.map +1 -0
- package/dist/clipboard/format.js +37 -0
- package/dist/clipboard/index.d.ts +6 -0
- package/dist/clipboard/index.d.ts.map +1 -0
- package/dist/clipboard/index.js +3 -0
- package/dist/clipboard/react.d.ts +20 -0
- package/dist/clipboard/react.d.ts.map +1 -0
- package/dist/clipboard/react.js +71 -0
- package/dist/dialogs/index.d.ts +2 -0
- package/dist/dialogs/index.d.ts.map +1 -0
- package/dist/dialogs/index.js +1 -0
- package/dist/dialogs/media-picker/index.d.ts +7 -0
- package/dist/dialogs/media-picker/index.d.ts.map +1 -0
- package/dist/dialogs/media-picker/index.js +3 -0
- package/dist/dialogs/media-picker/library.d.ts +17 -0
- package/dist/dialogs/media-picker/library.d.ts.map +1 -0
- package/dist/dialogs/media-picker/library.js +9 -0
- package/dist/dialogs/media-picker/media-picker.d.ts +18 -0
- package/dist/dialogs/media-picker/media-picker.d.ts.map +1 -0
- package/dist/dialogs/media-picker/media-picker.js +99 -0
- package/dist/dialogs/media-picker/media-picker.test.d.ts +2 -0
- package/dist/dialogs/media-picker/media-picker.test.d.ts.map +1 -0
- package/dist/dialogs/media-picker/media-picker.test.js +161 -0
- package/dist/dialogs/media-picker/media-ref.d.ts +28 -0
- package/dist/dialogs/media-picker/media-ref.d.ts.map +1 -0
- package/dist/dialogs/media-picker/media-ref.js +52 -0
- package/dist/dnd/check.d.ts +8 -0
- package/dist/dnd/check.d.ts.map +1 -0
- package/dist/dnd/check.js +12 -0
- package/dist/dnd/destinations.d.ts +15 -0
- package/dist/dnd/destinations.d.ts.map +1 -0
- package/dist/dnd/destinations.js +43 -0
- package/dist/dnd/dnd-react.test.d.ts +2 -0
- package/dist/dnd/dnd-react.test.d.ts.map +1 -0
- package/dist/dnd/dnd-react.test.js +93 -0
- package/dist/dnd/dnd.test.d.ts +2 -0
- package/dist/dnd/dnd.test.d.ts.map +1 -0
- package/dist/dnd/dnd.test.js +327 -0
- package/dist/dnd/engine.d.ts +85 -0
- package/dist/dnd/engine.d.ts.map +1 -0
- package/dist/dnd/engine.js +185 -0
- package/dist/dnd/fragment.d.ts +6 -0
- package/dist/dnd/fragment.d.ts.map +1 -0
- package/dist/dnd/fragment.js +18 -0
- package/dist/dnd/geometry.d.ts +30 -0
- package/dist/dnd/geometry.d.ts.map +1 -0
- package/dist/dnd/geometry.js +31 -0
- package/dist/dnd/index.d.ts +14 -0
- package/dist/dnd/index.d.ts.map +1 -0
- package/dist/dnd/index.js +7 -0
- package/dist/dnd/move-to-dialog.d.ts +13 -0
- package/dist/dnd/move-to-dialog.d.ts.map +1 -0
- package/dist/dnd/move-to-dialog.js +30 -0
- package/dist/dnd/react.d.ts +43 -0
- package/dist/dnd/react.d.ts.map +1 -0
- package/dist/dnd/react.js +185 -0
- package/dist/dnd/tree-target.d.ts +29 -0
- package/dist/dnd/tree-target.d.ts.map +1 -0
- package/dist/dnd/tree-target.js +97 -0
- package/dist/fonts/LICENSE-inter.txt +93 -0
- package/dist/fonts/inter-latin-400-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-500-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-600-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-ext-400-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-ext-500-normal.woff2 +0 -0
- package/dist/fonts/inter-latin-ext-600-normal.woff2 +0 -0
- package/dist/index.d.ts +22 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/messages/en.d.ts +335 -0
- package/dist/messages/en.d.ts.map +1 -0
- package/dist/messages/en.js +332 -0
- package/dist/messages/index.d.ts +16 -0
- package/dist/messages/index.d.ts.map +1 -0
- package/dist/messages/index.js +22 -0
- package/dist/messages/pl.d.ts +3 -0
- package/dist/messages/pl.d.ts.map +1 -0
- package/dist/messages/pl.js +327 -0
- package/dist/panels/breadcrumbs/breadcrumbs.d.ts +6 -0
- package/dist/panels/breadcrumbs/breadcrumbs.d.ts.map +1 -0
- package/dist/panels/breadcrumbs/breadcrumbs.js +24 -0
- package/dist/panels/breadcrumbs/breadcrumbs.test.d.ts +2 -0
- package/dist/panels/breadcrumbs/breadcrumbs.test.d.ts.map +1 -0
- package/dist/panels/breadcrumbs/breadcrumbs.test.js +56 -0
- package/dist/panels/index.d.ts +9 -0
- package/dist/panels/index.d.ts.map +1 -0
- package/dist/panels/index.js +6 -0
- package/dist/panels/insert/catalog.d.ts +30 -0
- package/dist/panels/insert/catalog.d.ts.map +1 -0
- package/dist/panels/insert/catalog.js +76 -0
- package/dist/panels/insert/catalog.order.test.d.ts +2 -0
- package/dist/panels/insert/catalog.order.test.d.ts.map +1 -0
- package/dist/panels/insert/catalog.order.test.js +17 -0
- package/dist/panels/insert/category-name.d.ts +4 -0
- package/dist/panels/insert/category-name.d.ts.map +1 -0
- package/dist/panels/insert/category-name.js +8 -0
- package/dist/panels/insert/index.d.ts +3 -0
- package/dist/panels/insert/index.d.ts.map +1 -0
- package/dist/panels/insert/index.js +2 -0
- package/dist/panels/insert/insert-panel.d.ts +7 -0
- package/dist/panels/insert/insert-panel.d.ts.map +1 -0
- package/dist/panels/insert/insert-panel.js +155 -0
- package/dist/panels/insert/insert-panel.test.d.ts +2 -0
- package/dist/panels/insert/insert-panel.test.d.ts.map +1 -0
- package/dist/panels/insert/insert-panel.test.js +323 -0
- package/dist/panels/insert/target.d.ts +17 -0
- package/dist/panels/insert/target.d.ts.map +1 -0
- package/dist/panels/insert/target.js +48 -0
- package/dist/panels/inspector/controls/boolean.d.ts +4 -0
- package/dist/panels/inspector/controls/boolean.d.ts.map +1 -0
- package/dist/panels/inspector/controls/boolean.js +4 -0
- package/dist/panels/inspector/controls/compound.d.ts +15 -0
- package/dist/panels/inspector/controls/compound.d.ts.map +1 -0
- package/dist/panels/inspector/controls/compound.js +99 -0
- package/dist/panels/inspector/controls/compound.test.d.ts +2 -0
- package/dist/panels/inspector/controls/compound.test.d.ts.map +1 -0
- package/dist/panels/inspector/controls/compound.test.js +195 -0
- package/dist/panels/inspector/controls/icon.d.ts +5 -0
- package/dist/panels/inspector/controls/icon.d.ts.map +1 -0
- package/dist/panels/inspector/controls/icon.js +6 -0
- package/dist/panels/inspector/controls/index.d.ts +13 -0
- package/dist/panels/inspector/controls/index.d.ts.map +1 -0
- package/dist/panels/inspector/controls/index.js +11 -0
- package/dist/panels/inspector/controls/label.d.ts +4 -0
- package/dist/panels/inspector/controls/label.d.ts.map +1 -0
- package/dist/panels/inspector/controls/label.js +8 -0
- package/dist/panels/inspector/controls/link.d.ts +5 -0
- package/dist/panels/inspector/controls/link.d.ts.map +1 -0
- package/dist/panels/inspector/controls/link.js +6 -0
- package/dist/panels/inspector/controls/media.d.ts +9 -0
- package/dist/panels/inspector/controls/media.d.ts.map +1 -0
- package/dist/panels/inspector/controls/media.js +21 -0
- package/dist/panels/inspector/controls/number.d.ts +10 -0
- package/dist/panels/inspector/controls/number.d.ts.map +1 -0
- package/dist/panels/inspector/controls/number.js +33 -0
- package/dist/panels/inspector/controls/rich-text-model.d.ts +20 -0
- package/dist/panels/inspector/controls/rich-text-model.d.ts.map +1 -0
- package/dist/panels/inspector/controls/rich-text-model.js +91 -0
- package/dist/panels/inspector/controls/rich-text.d.ts +10 -0
- package/dist/panels/inspector/controls/rich-text.d.ts.map +1 -0
- package/dist/panels/inspector/controls/rich-text.js +159 -0
- package/dist/panels/inspector/controls/select.d.ts +5 -0
- package/dist/panels/inspector/controls/select.d.ts.map +1 -0
- package/dist/panels/inspector/controls/select.js +16 -0
- package/dist/panels/inspector/controls/select.test.d.ts +2 -0
- package/dist/panels/inspector/controls/select.test.d.ts.map +1 -0
- package/dist/panels/inspector/controls/select.test.js +43 -0
- package/dist/panels/inspector/controls/text.d.ts +4 -0
- package/dist/panels/inspector/controls/text.d.ts.map +1 -0
- package/dist/panels/inspector/controls/text.js +5 -0
- package/dist/panels/inspector/controls/textarea.d.ts +4 -0
- package/dist/panels/inspector/controls/textarea.d.ts.map +1 -0
- package/dist/panels/inspector/controls/textarea.js +4 -0
- package/dist/panels/inspector/controls/types.d.ts +16 -0
- package/dist/panels/inspector/controls/types.d.ts.map +1 -0
- package/dist/panels/inspector/controls/types.js +1 -0
- package/dist/panels/inspector/index.d.ts +17 -0
- package/dist/panels/inspector/index.d.ts.map +1 -0
- package/dist/panels/inspector/index.js +9 -0
- package/dist/panels/inspector/inspector.d.ts +16 -0
- package/dist/panels/inspector/inspector.d.ts.map +1 -0
- package/dist/panels/inspector/inspector.js +116 -0
- package/dist/panels/inspector/inspector.test.d.ts +2 -0
- package/dist/panels/inspector/inspector.test.d.ts.map +1 -0
- package/dist/panels/inspector/inspector.test.js +328 -0
- package/dist/panels/inspector/props-panel.d.ts +26 -0
- package/dist/panels/inspector/props-panel.d.ts.map +1 -0
- package/dist/panels/inspector/props-panel.js +117 -0
- package/dist/panels/inspector/styles/box-model.d.ts +20 -0
- package/dist/panels/inspector/styles/box-model.d.ts.map +1 -0
- package/dist/panels/inspector/styles/box-model.js +31 -0
- package/dist/panels/inspector/styles/index.d.ts +5 -0
- package/dist/panels/inspector/styles/index.d.ts.map +1 -0
- package/dist/panels/inspector/styles/index.js +2 -0
- package/dist/panels/inspector/styles/model.d.ts +55 -0
- package/dist/panels/inspector/styles/model.d.ts.map +1 -0
- package/dist/panels/inspector/styles/model.js +111 -0
- package/dist/panels/inspector/styles/segments.d.ts +18 -0
- package/dist/panels/inspector/styles/segments.d.ts.map +1 -0
- package/dist/panels/inspector/styles/segments.js +75 -0
- package/dist/panels/inspector/styles/sides-editor.d.ts +34 -0
- package/dist/panels/inspector/styles/sides-editor.d.ts.map +1 -0
- package/dist/panels/inspector/styles/sides-editor.js +86 -0
- package/dist/panels/inspector/styles/style-inspector.d.ts +15 -0
- package/dist/panels/inspector/styles/style-inspector.d.ts.map +1 -0
- package/dist/panels/inspector/styles/style-inspector.js +219 -0
- package/dist/panels/inspector/styles/style-inspector.test.d.ts +2 -0
- package/dist/panels/inspector/styles/style-inspector.test.d.ts.map +1 -0
- package/dist/panels/inspector/styles/style-inspector.test.js +265 -0
- package/dist/panels/inspector/styles/token-picker.d.ts +15 -0
- package/dist/panels/inspector/styles/token-picker.d.ts.map +1 -0
- package/dist/panels/inspector/styles/token-picker.js +23 -0
- package/dist/panels/inspector/styles/use-style-value.d.ts +28 -0
- package/dist/panels/inspector/styles/use-style-value.d.ts.map +1 -0
- package/dist/panels/inspector/styles/use-style-value.js +51 -0
- package/dist/panels/inspector/value.d.ts +20 -0
- package/dist/panels/inspector/value.d.ts.map +1 -0
- package/dist/panels/inspector/value.js +32 -0
- package/dist/panels/inspector/values/analyze.d.ts +49 -0
- package/dist/panels/inspector/values/analyze.d.ts.map +1 -0
- package/dist/panels/inspector/values/analyze.js +115 -0
- package/dist/panels/inspector/values/data.d.ts +18 -0
- package/dist/panels/inspector/values/data.d.ts.map +1 -0
- package/dist/panels/inspector/values/data.js +10 -0
- package/dist/panels/inspector/values/translation.d.ts +20 -0
- package/dist/panels/inspector/values/translation.d.ts.map +1 -0
- package/dist/panels/inspector/values/translation.js +25 -0
- package/dist/panels/inspector/values/value-editor.d.ts +30 -0
- package/dist/panels/inspector/values/value-editor.d.ts.map +1 -0
- package/dist/panels/inspector/values/value-editor.js +191 -0
- package/dist/panels/inspector/values/values.test.d.ts +2 -0
- package/dist/panels/inspector/values/values.test.d.ts.map +1 -0
- package/dist/panels/inspector/values/values.test.js +173 -0
- package/dist/panels/issues/collect.d.ts +70 -0
- package/dist/panels/issues/collect.d.ts.map +1 -0
- package/dist/panels/issues/collect.js +96 -0
- package/dist/panels/issues/index.d.ts +5 -0
- package/dist/panels/issues/index.d.ts.map +1 -0
- package/dist/panels/issues/index.js +2 -0
- package/dist/panels/issues/issues-panel.d.ts +17 -0
- package/dist/panels/issues/issues-panel.d.ts.map +1 -0
- package/dist/panels/issues/issues-panel.js +77 -0
- package/dist/panels/layers/flatten.d.ts +28 -0
- package/dist/panels/layers/flatten.d.ts.map +1 -0
- package/dist/panels/layers/flatten.js +61 -0
- package/dist/panels/layers/layers-panel.d.ts +14 -0
- package/dist/panels/layers/layers-panel.d.ts.map +1 -0
- package/dist/panels/layers/layers-panel.js +428 -0
- package/dist/panels/layers/layers-panel.test.d.ts +2 -0
- package/dist/panels/layers/layers-panel.test.d.ts.map +1 -0
- package/dist/panels/layers/layers-panel.test.js +315 -0
- package/dist/persistence/controller.d.ts +55 -0
- package/dist/persistence/controller.d.ts.map +1 -0
- package/dist/persistence/controller.js +341 -0
- package/dist/persistence/index.d.ts +6 -0
- package/dist/persistence/index.d.ts.map +1 -0
- package/dist/persistence/index.js +3 -0
- package/dist/persistence/load.d.ts +35 -0
- package/dist/persistence/load.d.ts.map +1 -0
- package/dist/persistence/load.js +67 -0
- package/dist/persistence/persistence.test.d.ts +2 -0
- package/dist/persistence/persistence.test.d.ts.map +1 -0
- package/dist/persistence/persistence.test.js +483 -0
- package/dist/persistence/react.d.ts +18 -0
- package/dist/persistence/react.d.ts.map +1 -0
- package/dist/persistence/react.js +105 -0
- package/dist/persistence/types.d.ts +182 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +1 -0
- package/dist/preview/index.d.ts +3 -0
- package/dist/preview/index.d.ts.map +1 -0
- package/dist/preview/index.js +2 -0
- package/dist/preview/prepare.d.ts +16 -0
- package/dist/preview/prepare.d.ts.map +1 -0
- package/dist/preview/prepare.js +21 -0
- package/dist/preview/preview.d.ts +27 -0
- package/dist/preview/preview.d.ts.map +1 -0
- package/dist/preview/preview.js +51 -0
- package/dist/preview/preview.test.d.ts +2 -0
- package/dist/preview/preview.test.d.ts.map +1 -0
- package/dist/preview/preview.test.js +129 -0
- package/dist/shortcuts/actions.d.ts +17 -0
- package/dist/shortcuts/actions.d.ts.map +1 -0
- package/dist/shortcuts/actions.js +85 -0
- package/dist/shortcuts/index.d.ts +11 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +5 -0
- package/dist/shortcuts/keys.d.ts +29 -0
- package/dist/shortcuts/keys.d.ts.map +1 -0
- package/dist/shortcuts/keys.js +100 -0
- package/dist/shortcuts/map.d.ts +17 -0
- package/dist/shortcuts/map.d.ts.map +1 -0
- package/dist/shortcuts/map.js +31 -0
- package/dist/shortcuts/registry.d.ts +32 -0
- package/dist/shortcuts/registry.d.ts.map +1 -0
- package/dist/shortcuts/registry.js +53 -0
- package/dist/shortcuts/shortcuts.d.ts +32 -0
- package/dist/shortcuts/shortcuts.d.ts.map +1 -0
- package/dist/shortcuts/shortcuts.js +95 -0
- package/dist/shortcuts/shortcuts.test.d.ts +2 -0
- package/dist/shortcuts/shortcuts.test.d.ts.map +1 -0
- package/dist/shortcuts/shortcuts.test.js +263 -0
- package/dist/store/create-store.d.ts +13 -0
- package/dist/store/create-store.d.ts.map +1 -0
- package/dist/store/create-store.js +248 -0
- package/dist/store/index.d.ts +9 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +5 -0
- package/dist/store/locale.d.ts +23 -0
- package/dist/store/locale.d.ts.map +1 -0
- package/dist/store/locale.js +31 -0
- package/dist/store/react.d.ts +17 -0
- package/dist/store/react.d.ts.map +1 -0
- package/dist/store/react.js +32 -0
- package/dist/store/selection.d.ts +32 -0
- package/dist/store/selection.d.ts.map +1 -0
- package/dist/store/selection.js +84 -0
- package/dist/store/selection.test.d.ts +2 -0
- package/dist/store/selection.test.d.ts.map +1 -0
- package/dist/store/selection.test.js +95 -0
- package/dist/store/selectors.d.ts +18 -0
- package/dist/store/selectors.d.ts.map +1 -0
- package/dist/store/selectors.js +39 -0
- package/dist/store/store.test.d.ts +2 -0
- package/dist/store/store.test.d.ts.map +1 -0
- package/dist/store/store.test.js +331 -0
- package/dist/store/types.d.ts +114 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +1 -0
- package/dist/styles/tokens.test.d.ts +2 -0
- package/dist/styles/tokens.test.d.ts.map +1 -0
- package/dist/styles/tokens.test.js +199 -0
- package/dist/styles.css +2885 -0
- package/dist/toolbar/brand.d.ts +7 -0
- package/dist/toolbar/brand.d.ts.map +1 -0
- package/dist/toolbar/brand.js +11 -0
- package/dist/toolbar/breakpoint-control.d.ts +9 -0
- package/dist/toolbar/breakpoint-control.d.ts.map +1 -0
- package/dist/toolbar/breakpoint-control.js +23 -0
- package/dist/toolbar/editable-title.d.ts +14 -0
- package/dist/toolbar/editable-title.d.ts.map +1 -0
- package/dist/toolbar/editable-title.js +46 -0
- package/dist/toolbar/editable-title.test.d.ts +2 -0
- package/dist/toolbar/editable-title.test.d.ts.map +1 -0
- package/dist/toolbar/editable-title.test.js +53 -0
- package/dist/toolbar/index.d.ts +12 -0
- package/dist/toolbar/index.d.ts.map +1 -0
- package/dist/toolbar/index.js +5 -0
- package/dist/toolbar/locale-switcher.d.ts +10 -0
- package/dist/toolbar/locale-switcher.d.ts.map +1 -0
- package/dist/toolbar/locale-switcher.js +20 -0
- package/dist/toolbar/more-menu.d.ts +12 -0
- package/dist/toolbar/more-menu.d.ts.map +1 -0
- package/dist/toolbar/more-menu.js +47 -0
- package/dist/toolbar/panel-toggles.d.ts +9 -0
- package/dist/toolbar/panel-toggles.d.ts.map +1 -0
- package/dist/toolbar/panel-toggles.js +19 -0
- package/dist/toolbar/publish-dialog.d.ts +18 -0
- package/dist/toolbar/publish-dialog.d.ts.map +1 -0
- package/dist/toolbar/publish-dialog.js +49 -0
- package/dist/toolbar/publish.test.d.ts +2 -0
- package/dist/toolbar/publish.test.d.ts.map +1 -0
- package/dist/toolbar/publish.test.js +258 -0
- package/dist/toolbar/sample-picker.d.ts +18 -0
- package/dist/toolbar/sample-picker.d.ts.map +1 -0
- package/dist/toolbar/sample-picker.js +72 -0
- package/dist/toolbar/sample-picker.test.d.ts +2 -0
- package/dist/toolbar/sample-picker.test.d.ts.map +1 -0
- package/dist/toolbar/sample-picker.test.js +78 -0
- package/dist/toolbar/save-indicator.d.ts +8 -0
- package/dist/toolbar/save-indicator.d.ts.map +1 -0
- package/dist/toolbar/save-indicator.js +30 -0
- package/dist/toolbar/theme.d.ts +22 -0
- package/dist/toolbar/theme.d.ts.map +1 -0
- package/dist/toolbar/theme.js +46 -0
- package/dist/toolbar/theme.test.d.ts +2 -0
- package/dist/toolbar/theme.test.d.ts.map +1 -0
- package/dist/toolbar/theme.test.js +49 -0
- package/dist/toolbar/toolbar-centre.d.ts +13 -0
- package/dist/toolbar/toolbar-centre.d.ts.map +1 -0
- package/dist/toolbar/toolbar-centre.js +7 -0
- package/dist/toolbar/toolbar-left.d.ts +12 -0
- package/dist/toolbar/toolbar-left.d.ts.map +1 -0
- package/dist/toolbar/toolbar-left.js +16 -0
- package/dist/toolbar/toolbar-right.d.ts +19 -0
- package/dist/toolbar/toolbar-right.d.ts.map +1 -0
- package/dist/toolbar/toolbar-right.js +21 -0
- package/dist/toolbar/toolbar.d.ts +38 -0
- package/dist/toolbar/toolbar.d.ts.map +1 -0
- package/dist/toolbar/toolbar.js +27 -0
- package/dist/toolbar/toolbar.test.d.ts +2 -0
- package/dist/toolbar/toolbar.test.d.ts.map +1 -0
- package/dist/toolbar/toolbar.test.js +289 -0
- package/dist/toolbar/use-overflow-level.d.ts +9 -0
- package/dist/toolbar/use-overflow-level.d.ts.map +1 -0
- package/dist/toolbar/use-overflow-level.js +40 -0
- package/dist/toolbar/zoom-menu.d.ts +10 -0
- package/dist/toolbar/zoom-menu.d.ts.map +1 -0
- package/dist/toolbar/zoom-menu.js +17 -0
- package/dist/ui/icon.d.ts +102 -0
- package/dist/ui/icon.d.ts.map +1 -0
- package/dist/ui/icon.js +182 -0
- package/dist/ui/icon.test.d.ts +2 -0
- package/dist/ui/icon.test.d.ts.map +1 -0
- package/dist/ui/icon.test.js +115 -0
- package/dist/ui/index.d.ts +11 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +5 -0
- package/dist/ui/panel.d.ts +18 -0
- package/dist/ui/panel.d.ts.map +1 -0
- package/dist/ui/panel.js +21 -0
- package/dist/ui/portal.d.ts +14 -0
- package/dist/ui/portal.d.ts.map +1 -0
- package/dist/ui/portal.js +14 -0
- package/dist/ui/primitives.d.ts +190 -0
- package/dist/ui/primitives.d.ts.map +1 -0
- package/dist/ui/primitives.js +164 -0
- package/dist/ui/primitives.test.d.ts +2 -0
- package/dist/ui/primitives.test.d.ts.map +1 -0
- package/dist/ui/primitives.test.js +215 -0
- package/dist/ui/toast.d.ts +39 -0
- package/dist/ui/toast.d.ts.map +1 -0
- package/dist/ui/toast.js +76 -0
- package/dist/ui/toast.test.d.ts +2 -0
- package/dist/ui/toast.test.d.ts.map +1 -0
- package/dist/ui/toast.test.js +95 -0
- package/package.json +67 -3
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createIndex, } from '@next-buildr/core';
|
|
2
|
+
import { pathTo } from './selection.js';
|
|
3
|
+
const indexes = new WeakMap();
|
|
4
|
+
/**
|
|
5
|
+
* The parent/slot index of the document, built when first asked for and reused until the document
|
|
6
|
+
* changes (a new document is a new object, so the cache needs no invalidation).
|
|
7
|
+
*/
|
|
8
|
+
export function selectIndex(state) {
|
|
9
|
+
let index = indexes.get(state.doc);
|
|
10
|
+
if (index === undefined) {
|
|
11
|
+
index = createIndex(state.doc);
|
|
12
|
+
indexes.set(state.doc, index);
|
|
13
|
+
}
|
|
14
|
+
return index;
|
|
15
|
+
}
|
|
16
|
+
/** A node, or `undefined`. The same object until that node changes (structural sharing). */
|
|
17
|
+
export function selectNode(state, id) {
|
|
18
|
+
return Object.hasOwn(state.doc.nodes, id) ? state.doc.nodes[id] : undefined;
|
|
19
|
+
}
|
|
20
|
+
const NO_CHILDREN = Object.freeze([]);
|
|
21
|
+
/** The children of a node in one slot; the same array until it changes. */
|
|
22
|
+
export function selectChildren(state, id, slot = 'default') {
|
|
23
|
+
const slots = selectNode(state, id)?.slots;
|
|
24
|
+
return slots !== undefined && Object.hasOwn(slots, slot)
|
|
25
|
+
? (slots[slot] ?? NO_CHILDREN)
|
|
26
|
+
: NO_CHILDREN;
|
|
27
|
+
}
|
|
28
|
+
/** The anchor of the selection (the last node selected), if any. */
|
|
29
|
+
export function selectSelectedNode(state) {
|
|
30
|
+
return state.anchorId === null ? undefined : selectNode(state, state.anchorId);
|
|
31
|
+
}
|
|
32
|
+
/** The nodes from the root down to the anchor (empty with no selection). */
|
|
33
|
+
export function selectSelectionPath(state) {
|
|
34
|
+
return state.anchorId === null ? NO_CHILDREN : pathTo(state.doc, state.anchorId);
|
|
35
|
+
}
|
|
36
|
+
/** Whether the document differs from the saved one; undoing back to the saved state is clean again. */
|
|
37
|
+
export function selectIsDirty(state) {
|
|
38
|
+
return state.cursorId !== state.savedCursorId;
|
|
39
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.d.ts","sourceRoot":"","sources":["../../src/store/store.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,331 @@
|
|
|
1
|
+
import { createRegistryMeta, createSeededIdGenerator, p, s, } from '@next-buildr/core';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { createEditorStore } from './create-store.js';
|
|
4
|
+
import { selectChildren, selectIndex, selectIsDirty, selectNode } from './selectors.js';
|
|
5
|
+
const meta = (type, overrides = {}) => ({
|
|
6
|
+
type,
|
|
7
|
+
version: 1,
|
|
8
|
+
label: type,
|
|
9
|
+
category: 'content',
|
|
10
|
+
props: {},
|
|
11
|
+
contentCategories: ['flow'],
|
|
12
|
+
styles: { groups: [] },
|
|
13
|
+
runtime: 'shared',
|
|
14
|
+
...overrides,
|
|
15
|
+
});
|
|
16
|
+
const registry = createRegistryMeta({
|
|
17
|
+
components: [
|
|
18
|
+
meta('buildr/page', { capabilities: { root: true }, slots: { default: {} } }),
|
|
19
|
+
meta('buildr/box', { slots: { default: {} } }),
|
|
20
|
+
meta('buildr/text', { props: { text: p.text({ default: '' }) } }),
|
|
21
|
+
],
|
|
22
|
+
});
|
|
23
|
+
const node = (id, type, extra = {}) => ({
|
|
24
|
+
id,
|
|
25
|
+
type,
|
|
26
|
+
...extra,
|
|
27
|
+
});
|
|
28
|
+
function fixture() {
|
|
29
|
+
return {
|
|
30
|
+
schemaVersion: 1,
|
|
31
|
+
root: 'root',
|
|
32
|
+
nodes: {
|
|
33
|
+
root: node('root', 'buildr/page', { slots: { default: ['boxNode001'] } }),
|
|
34
|
+
boxNode001: node('boxNode001', 'buildr/box', {
|
|
35
|
+
slots: { default: ['textNodeA1', 'textNodeB1'] },
|
|
36
|
+
}),
|
|
37
|
+
textNodeA1: node('textNodeA1', 'buildr/text', { props: { text: s('A') } }),
|
|
38
|
+
textNodeB1: node('textNodeB1', 'buildr/text', { props: { text: s('B') } }),
|
|
39
|
+
},
|
|
40
|
+
components: { 'buildr/page': 1, 'buildr/box': 1, 'buildr/text': 1 },
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** A document that throws on any write, at any depth: proof that nothing mutates it. */
|
|
44
|
+
function deepFreeze(value) {
|
|
45
|
+
if (typeof value === 'object' && value !== null && !Object.isFrozen(value)) {
|
|
46
|
+
Object.freeze(value);
|
|
47
|
+
for (const child of Object.values(value))
|
|
48
|
+
deepFreeze(child);
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
const create = (overrides = {}) => createEditorStore({
|
|
53
|
+
doc: fixture(),
|
|
54
|
+
registry,
|
|
55
|
+
generateId: createSeededIdGenerator(7),
|
|
56
|
+
validationDelayMs: null,
|
|
57
|
+
...overrides,
|
|
58
|
+
});
|
|
59
|
+
const setText = (id, text) => ({
|
|
60
|
+
type: 'node.setProp',
|
|
61
|
+
payload: { id, prop: 'text', value: s(text) },
|
|
62
|
+
});
|
|
63
|
+
const remove = (...ids) => ({ type: 'node.remove', payload: { ids } });
|
|
64
|
+
const textOf = (store, id) => JSON.stringify(selectNode(store.getState(), id)?.props?.['text']);
|
|
65
|
+
describe('dispatch', () => {
|
|
66
|
+
it('runs a command, swaps the document in and counts the version', () => {
|
|
67
|
+
const store = create();
|
|
68
|
+
const before = store.getState().doc;
|
|
69
|
+
const result = store.dispatch(setText('textNodeA1', 'Changed'));
|
|
70
|
+
expect(result.ok).toBe(true);
|
|
71
|
+
const state = store.getState();
|
|
72
|
+
expect(state.doc).not.toBe(before);
|
|
73
|
+
expect(textOf(store, 'textNodeA1')).toContain('Changed');
|
|
74
|
+
expect(state.docVersion).toBe(1);
|
|
75
|
+
expect(state.canUndo).toBe(true);
|
|
76
|
+
expect(state.undoLabel).toBe('node.setProp');
|
|
77
|
+
// Structural sharing: an untouched node is the very same object.
|
|
78
|
+
expect(selectNode(state, 'textNodeB1')).toBe(before.nodes['textNodeB1']);
|
|
79
|
+
});
|
|
80
|
+
it('leaves everything as it was when a command fails', () => {
|
|
81
|
+
const store = create();
|
|
82
|
+
const before = store.getState();
|
|
83
|
+
const result = store.dispatch(setText('missing', 'x'));
|
|
84
|
+
expect(result.ok).toBe(false);
|
|
85
|
+
expect(store.getState()).toBe(before);
|
|
86
|
+
});
|
|
87
|
+
it('refuses in a read-only document', () => {
|
|
88
|
+
const store = create({ readOnly: true });
|
|
89
|
+
const result = store.dispatch(setText('textNodeA1', 'x'));
|
|
90
|
+
expect(result.ok).toBe(false);
|
|
91
|
+
if (!result.ok)
|
|
92
|
+
expect(result.error.code).toBe('editor.read-only');
|
|
93
|
+
expect(store.undo().ok).toBe(false);
|
|
94
|
+
expect(store.transaction('x', () => true)).toBe(false);
|
|
95
|
+
store.setReadOnly(false);
|
|
96
|
+
expect(store.dispatch(setText('textNodeA1', 'x')).ok).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
it('names the undo step, and merges typing into one', () => {
|
|
99
|
+
const store = create();
|
|
100
|
+
store.dispatch(setText('textNodeA1', 'A1'), { label: 'Edit text' });
|
|
101
|
+
store.dispatch(setText('textNodeA1', 'A12'), { label: 'Edit text' });
|
|
102
|
+
expect(store.getState().undoLabel).toBe('Edit text');
|
|
103
|
+
expect(store.history.past).toHaveLength(1);
|
|
104
|
+
});
|
|
105
|
+
it('runs a batch as one undo step, all or nothing', () => {
|
|
106
|
+
const store = create();
|
|
107
|
+
const failed = store.dispatchBatch([setText('textNodeA1', '1'), setText('missing', '2')]);
|
|
108
|
+
expect(failed.ok).toBe(false);
|
|
109
|
+
expect(textOf(store, 'textNodeA1')).toContain('A');
|
|
110
|
+
expect(store.getState().docVersion).toBe(0);
|
|
111
|
+
expect(store.dispatchBatch([setText('textNodeA1', '1'), setText('textNodeB1', '2')], {
|
|
112
|
+
label: 'Two',
|
|
113
|
+
}).ok).toBe(true);
|
|
114
|
+
expect(store.history.past).toHaveLength(1);
|
|
115
|
+
store.undo();
|
|
116
|
+
expect(textOf(store, 'textNodeA1')).toContain('A');
|
|
117
|
+
expect(textOf(store, 'textNodeB1')).toContain('B');
|
|
118
|
+
});
|
|
119
|
+
});
|
|
120
|
+
describe('undo and redo', () => {
|
|
121
|
+
it('go back and forth, with the version always moving forward', () => {
|
|
122
|
+
const store = create();
|
|
123
|
+
store.dispatch(setText('textNodeA1', 'One'));
|
|
124
|
+
store.dispatch(remove('textNodeB1'));
|
|
125
|
+
expect(selectNode(store.getState(), 'textNodeB1')).toBeUndefined();
|
|
126
|
+
expect(store.undo().ok).toBe(true);
|
|
127
|
+
expect(selectNode(store.getState(), 'textNodeB1')).toBeDefined();
|
|
128
|
+
expect(store.getState().canRedo).toBe(true);
|
|
129
|
+
expect(store.getState().redoLabel).toBe('node.remove');
|
|
130
|
+
expect(store.redo().ok).toBe(true);
|
|
131
|
+
expect(selectNode(store.getState(), 'textNodeB1')).toBeUndefined();
|
|
132
|
+
expect(store.getState().docVersion).toBe(4);
|
|
133
|
+
store.undo();
|
|
134
|
+
store.undo();
|
|
135
|
+
expect(JSON.stringify(store.getState().doc)).toBe(JSON.stringify(fixture()));
|
|
136
|
+
expect(store.undo().ok).toBe(false);
|
|
137
|
+
expect(store.getState().canUndo).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
it('restores the selection that went with the step', () => {
|
|
140
|
+
const store = create();
|
|
141
|
+
store.setSelection(['textNodeB1']);
|
|
142
|
+
store.dispatch(remove('textNodeB1'));
|
|
143
|
+
expect(store.getState().selectedIds).not.toContain('textNodeB1');
|
|
144
|
+
store.undo();
|
|
145
|
+
expect(store.getState().selectedIds).toEqual(['textNodeB1']);
|
|
146
|
+
});
|
|
147
|
+
it('a new change drops what could be redone', () => {
|
|
148
|
+
const store = create();
|
|
149
|
+
store.dispatch(setText('textNodeA1', 'One'));
|
|
150
|
+
store.undo();
|
|
151
|
+
store.dispatch(setText('textNodeB1', 'Two'));
|
|
152
|
+
expect(store.getState().canRedo).toBe(false);
|
|
153
|
+
});
|
|
154
|
+
});
|
|
155
|
+
describe('transactions', () => {
|
|
156
|
+
it('make everything inside one step', () => {
|
|
157
|
+
const store = create();
|
|
158
|
+
const done = store.transaction('Rewrite', () => {
|
|
159
|
+
store.dispatch(setText('textNodeA1', '1'));
|
|
160
|
+
store.dispatch(setText('textNodeB1', '2'));
|
|
161
|
+
return true;
|
|
162
|
+
});
|
|
163
|
+
expect(done).toBe(true);
|
|
164
|
+
expect(store.getState().inTransaction).toBe(false);
|
|
165
|
+
expect(store.history.past).toHaveLength(1);
|
|
166
|
+
expect(store.getState().undoLabel).toBe('Rewrite');
|
|
167
|
+
store.undo();
|
|
168
|
+
expect(JSON.stringify(store.getState().doc)).toBe(JSON.stringify(fixture()));
|
|
169
|
+
});
|
|
170
|
+
it('roll back when told to, and when they throw', () => {
|
|
171
|
+
const store = create();
|
|
172
|
+
expect(store.transaction('No', () => {
|
|
173
|
+
store.dispatch(setText('textNodeA1', '1'));
|
|
174
|
+
return false;
|
|
175
|
+
})).toBe(false);
|
|
176
|
+
expect(JSON.stringify(store.getState().doc)).toBe(JSON.stringify(fixture()));
|
|
177
|
+
expect(store.getState().canUndo).toBe(false);
|
|
178
|
+
expect(() => store.transaction('Boom', () => {
|
|
179
|
+
store.dispatch(setText('textNodeA1', '1'));
|
|
180
|
+
throw new Error('boom');
|
|
181
|
+
})).toThrow('boom');
|
|
182
|
+
expect(JSON.stringify(store.getState().doc)).toBe(JSON.stringify(fixture()));
|
|
183
|
+
expect(store.getState().inTransaction).toBe(false);
|
|
184
|
+
});
|
|
185
|
+
it('cannot be nested', () => {
|
|
186
|
+
const store = create();
|
|
187
|
+
let inner;
|
|
188
|
+
store.transaction('Outer', () => {
|
|
189
|
+
inner = store.transaction('Inner', () => true);
|
|
190
|
+
return true;
|
|
191
|
+
});
|
|
192
|
+
expect(inner).toBe(false);
|
|
193
|
+
});
|
|
194
|
+
});
|
|
195
|
+
describe('what the canvas host hears', () => {
|
|
196
|
+
it('a patch per change, from and to consecutive versions, that reproduce the document', async () => {
|
|
197
|
+
const { applyDocumentPatches } = await import('@next-buildr/core/commands');
|
|
198
|
+
const store = create();
|
|
199
|
+
const seen = [];
|
|
200
|
+
store.onChange((change) => seen.push(change));
|
|
201
|
+
let replica = fixture();
|
|
202
|
+
store.dispatch(setText('textNodeA1', 'One'));
|
|
203
|
+
store.dispatch(remove('textNodeB1'));
|
|
204
|
+
store.undo();
|
|
205
|
+
store.redo();
|
|
206
|
+
expect(seen.map((c) => (c.kind === 'patch' ? [c.from, c.to] : null))).toEqual([
|
|
207
|
+
[0, 1],
|
|
208
|
+
[1, 2],
|
|
209
|
+
[2, 3],
|
|
210
|
+
[3, 4],
|
|
211
|
+
]);
|
|
212
|
+
for (const change of seen) {
|
|
213
|
+
if (change.kind !== 'patch')
|
|
214
|
+
throw new Error('expected patches');
|
|
215
|
+
const applied = applyDocumentPatches(replica, change.patches);
|
|
216
|
+
if (!applied.ok)
|
|
217
|
+
throw new Error(applied.error.message);
|
|
218
|
+
replica = applied.value;
|
|
219
|
+
}
|
|
220
|
+
expect(JSON.stringify(replica)).toBe(JSON.stringify(store.getState().doc));
|
|
221
|
+
});
|
|
222
|
+
it('a set for a replaced document, which also forgets the history; and stops when unsubscribed', () => {
|
|
223
|
+
const store = create();
|
|
224
|
+
const seen = [];
|
|
225
|
+
const off = store.onChange((change) => seen.push(change));
|
|
226
|
+
store.dispatch(setText('textNodeA1', 'One'));
|
|
227
|
+
const other = fixture();
|
|
228
|
+
store.replaceDocument(other);
|
|
229
|
+
expect(seen.at(-1)).toEqual({ kind: 'set', doc: other, version: 2 });
|
|
230
|
+
expect(store.getState().canUndo).toBe(false);
|
|
231
|
+
expect(store.getState().docVersion).toBe(2);
|
|
232
|
+
off();
|
|
233
|
+
store.dispatch(setText('textNodeB1', 'x'));
|
|
234
|
+
expect(seen).toHaveLength(2);
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe('selection', () => {
|
|
238
|
+
it('keeps only nodes that exist', () => {
|
|
239
|
+
const store = create();
|
|
240
|
+
store.setSelection(['textNodeA1', 'ghost', 'textNodeA1', 'textNodeB1']);
|
|
241
|
+
expect(store.getState().selectedIds).toEqual(['textNodeA1', 'textNodeB1']);
|
|
242
|
+
store.dispatch(remove('textNodeA1'));
|
|
243
|
+
expect(store.getState().selectedIds).toEqual(['textNodeB1']);
|
|
244
|
+
});
|
|
245
|
+
});
|
|
246
|
+
describe('dirty state', () => {
|
|
247
|
+
it('is clean again after undoing back to the saved state', () => {
|
|
248
|
+
const store = create();
|
|
249
|
+
expect(selectIsDirty(store.getState())).toBe(false);
|
|
250
|
+
store.dispatch(setText('textNodeA1', 'One'));
|
|
251
|
+
expect(selectIsDirty(store.getState())).toBe(true);
|
|
252
|
+
store.markSaved();
|
|
253
|
+
expect(selectIsDirty(store.getState())).toBe(false);
|
|
254
|
+
store.dispatch(setText('textNodeB1', 'Two'));
|
|
255
|
+
expect(selectIsDirty(store.getState())).toBe(true);
|
|
256
|
+
store.undo();
|
|
257
|
+
expect(selectIsDirty(store.getState())).toBe(false);
|
|
258
|
+
store.undo();
|
|
259
|
+
expect(selectIsDirty(store.getState())).toBe(true);
|
|
260
|
+
});
|
|
261
|
+
});
|
|
262
|
+
describe('derived state', () => {
|
|
263
|
+
it('builds the index once per document', () => {
|
|
264
|
+
const store = create();
|
|
265
|
+
const first = selectIndex(store.getState());
|
|
266
|
+
expect(selectIndex(store.getState())).toBe(first);
|
|
267
|
+
store.dispatch(setText('textNodeA1', 'One'));
|
|
268
|
+
expect(selectIndex(store.getState())).not.toBe(first);
|
|
269
|
+
expect(selectChildren(store.getState(), 'boxNode001')).toEqual(['textNodeA1', 'textNodeB1']);
|
|
270
|
+
expect(selectChildren(store.getState(), 'boxNode001', 'nope')).toEqual([]);
|
|
271
|
+
});
|
|
272
|
+
it('validates a moment after the last change, not on each one', () => {
|
|
273
|
+
const scheduled = [];
|
|
274
|
+
const cleared = [];
|
|
275
|
+
const store = create({
|
|
276
|
+
validationDelayMs: 300,
|
|
277
|
+
timers: {
|
|
278
|
+
setTimeout: (callback, ms) => {
|
|
279
|
+
scheduled.push({ callback, ms });
|
|
280
|
+
return scheduled.length;
|
|
281
|
+
},
|
|
282
|
+
clearTimeout: (h) => cleared.push(h),
|
|
283
|
+
},
|
|
284
|
+
});
|
|
285
|
+
store.dispatch(setText('textNodeA1', 'One'));
|
|
286
|
+
store.dispatch(setText('textNodeB1', 'Two'));
|
|
287
|
+
expect(store.getState().validation).toBeUndefined();
|
|
288
|
+
expect(scheduled.map((t) => t.ms)).toEqual([300, 300]);
|
|
289
|
+
expect(cleared).toContain(1);
|
|
290
|
+
scheduled.at(-1)?.callback();
|
|
291
|
+
const validation = store.getState().validation;
|
|
292
|
+
expect(validation?.docVersion).toBe(2);
|
|
293
|
+
expect(validation?.issues).toEqual([]);
|
|
294
|
+
expect(Array.isArray(validation?.a11y)).toBe(true);
|
|
295
|
+
});
|
|
296
|
+
it('validates on request, and reports a problem the document has', () => {
|
|
297
|
+
const base = fixture();
|
|
298
|
+
const doc = {
|
|
299
|
+
...base,
|
|
300
|
+
nodes: { ...base.nodes, textNodeA1: node('textNodeA1', 'acme/unknown') },
|
|
301
|
+
};
|
|
302
|
+
const store = create({ doc, validationDelayMs: null });
|
|
303
|
+
const snapshot = store.validateNow();
|
|
304
|
+
expect(snapshot.issues.length).toBeGreaterThan(0);
|
|
305
|
+
expect(store.getState().validation).toBe(snapshot);
|
|
306
|
+
});
|
|
307
|
+
});
|
|
308
|
+
describe('no mutation outside execute', () => {
|
|
309
|
+
it('works on a deeply frozen document through every operation', () => {
|
|
310
|
+
const store = create({ doc: deepFreeze(fixture()) });
|
|
311
|
+
expect(() => {
|
|
312
|
+
store.dispatch(setText('textNodeA1', 'One'));
|
|
313
|
+
store.dispatch(remove('textNodeB1'));
|
|
314
|
+
store.undo();
|
|
315
|
+
store.redo();
|
|
316
|
+
store.transaction('T', () => {
|
|
317
|
+
store.dispatch(setText('textNodeA1', 'Two'));
|
|
318
|
+
return true;
|
|
319
|
+
});
|
|
320
|
+
store.transaction('R', () => {
|
|
321
|
+
store.dispatch(setText('textNodeA1', 'Three'));
|
|
322
|
+
return false;
|
|
323
|
+
});
|
|
324
|
+
store.undo();
|
|
325
|
+
store.replaceDocument(deepFreeze(fixture()));
|
|
326
|
+
store.dispatch(setText('textNodeB1', 'Four'));
|
|
327
|
+
store.validateNow();
|
|
328
|
+
}).not.toThrow();
|
|
329
|
+
expect(textOf(store, 'textNodeB1')).toContain('Four');
|
|
330
|
+
});
|
|
331
|
+
});
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { A11yIssue, BuilderDocument, IdGenerator, LocaleConfig, NodeId, RegistryMeta, Result, ValidationIssue } from '@next-buildr/core';
|
|
2
|
+
import type { Command, CommandEnv, CommandError, CommandRegistry, CommandResult, DocumentPatch, HistoryManager, HistoryOptions } from '@next-buildr/core/commands';
|
|
3
|
+
import type { StoreApi } from 'zustand/vanilla';
|
|
4
|
+
import type { SelectionMove, SelectMode } from './selection.ts';
|
|
5
|
+
/** Findings about the document as it is now, recomputed after it stops changing. */
|
|
6
|
+
export interface ValidationSnapshot {
|
|
7
|
+
/** The version of the document they describe. */
|
|
8
|
+
readonly docVersion: number;
|
|
9
|
+
readonly issues: readonly ValidationIssue[];
|
|
10
|
+
readonly a11y: readonly A11yIssue[];
|
|
11
|
+
}
|
|
12
|
+
/** The editor's state (docs/state-management.md#slices). Data only: what changes it is on `EditorStore`. */
|
|
13
|
+
export interface EditorState {
|
|
14
|
+
readonly doc: BuilderDocument;
|
|
15
|
+
/** Counts every change to `doc` (a command, an undo, a redo, a replacement), so the canvas can tell what it missed. */
|
|
16
|
+
readonly docVersion: number;
|
|
17
|
+
/** The document may not be changed (a component newer than this build knows, a viewer's role). */
|
|
18
|
+
readonly readOnly: boolean;
|
|
19
|
+
readonly canUndo: boolean;
|
|
20
|
+
readonly canRedo: boolean;
|
|
21
|
+
readonly inTransaction: boolean;
|
|
22
|
+
/** Where in the history the document is; changes with every step, returns on undo. */
|
|
23
|
+
readonly cursorId: string;
|
|
24
|
+
/** The `cursorId` that was last saved; the document is dirty when it differs. */
|
|
25
|
+
readonly savedCursorId: string;
|
|
26
|
+
readonly undoLabel: string | undefined;
|
|
27
|
+
readonly redoLabel: string | undefined;
|
|
28
|
+
/** In the order they were selected; only nodes of `doc`. */
|
|
29
|
+
readonly selectedIds: readonly NodeId[];
|
|
30
|
+
/** The node the selection is centred on: the inspector shows it, keyboard moves start from it. */
|
|
31
|
+
readonly anchorId: NodeId | null;
|
|
32
|
+
/** Which repetition of a Loop the single selected node is, as the canvas reported it. */
|
|
33
|
+
readonly selectedInstance: string | undefined;
|
|
34
|
+
readonly hoveredId: NodeId | null;
|
|
35
|
+
readonly validation: ValidationSnapshot | undefined;
|
|
36
|
+
}
|
|
37
|
+
/** A change to the document, as the canvas host sends it on (`doc:patch`, `doc:set`). */
|
|
38
|
+
export type DocumentChange = {
|
|
39
|
+
readonly kind: 'patch';
|
|
40
|
+
readonly from: number;
|
|
41
|
+
readonly to: number;
|
|
42
|
+
readonly patches: readonly DocumentPatch[];
|
|
43
|
+
} | {
|
|
44
|
+
readonly kind: 'set';
|
|
45
|
+
readonly doc: BuilderDocument;
|
|
46
|
+
readonly version: number;
|
|
47
|
+
};
|
|
48
|
+
export interface DispatchOptions {
|
|
49
|
+
/** Names the undo step; the command's type by default. */
|
|
50
|
+
readonly label?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface EditorStoreOptions {
|
|
53
|
+
readonly doc: BuilderDocument;
|
|
54
|
+
readonly registry: RegistryMeta;
|
|
55
|
+
/** The command set; the core commands by default. */
|
|
56
|
+
readonly commands?: CommandRegistry;
|
|
57
|
+
readonly generateId?: IdGenerator;
|
|
58
|
+
readonly canUnlock?: CommandEnv['canUnlock'];
|
|
59
|
+
/** Run `checkInvariants` after every command (a development aid); off by default. */
|
|
60
|
+
readonly checkInvariants?: boolean;
|
|
61
|
+
readonly readOnly?: boolean;
|
|
62
|
+
/** The languages of the content; the accessibility check reports missing translations against them. */
|
|
63
|
+
readonly locales?: LocaleConfig;
|
|
64
|
+
readonly history?: HistoryOptions;
|
|
65
|
+
/** Injected so tests control the validation delay. */
|
|
66
|
+
readonly timers?: {
|
|
67
|
+
setTimeout(callback: () => void, ms: number): unknown;
|
|
68
|
+
clearTimeout(handle: unknown): void;
|
|
69
|
+
};
|
|
70
|
+
/** Validation and accessibility checks run this long after the last change; `null` turns them off. */
|
|
71
|
+
readonly validationDelayMs?: number | null;
|
|
72
|
+
}
|
|
73
|
+
/** The store and what changes it. Every change to the document goes through `dispatch`, `undo`, `redo` or `replaceDocument`. */
|
|
74
|
+
export interface EditorStore extends StoreApi<EditorState> {
|
|
75
|
+
/** The registry the commands run against; the palette asks it what may go where. */
|
|
76
|
+
readonly registry: RegistryMeta;
|
|
77
|
+
/** Runs a command (`execute`) on the document and records it in the history. */
|
|
78
|
+
dispatch(command: Command, options?: DispatchOptions): Result<CommandResult, CommandError>;
|
|
79
|
+
/** Runs commands as one undo step, all or nothing (`executeBatch`). */
|
|
80
|
+
dispatchBatch(commands: readonly Command[], options?: DispatchOptions): Result<CommandResult, CommandError>;
|
|
81
|
+
/**
|
|
82
|
+
* Everything dispatched inside `fn` becomes one undo step. Returning `false` or throwing rolls it
|
|
83
|
+
* back (the document goes back to what it was; a throw is rethrown).
|
|
84
|
+
*/
|
|
85
|
+
transaction(label: string, fn: () => boolean | undefined): boolean;
|
|
86
|
+
undo(): Result<true, CommandError>;
|
|
87
|
+
redo(): Result<true, CommandError>;
|
|
88
|
+
/** Loads another document; the history starts again. */
|
|
89
|
+
replaceDocument(doc: BuilderDocument, options?: {
|
|
90
|
+
readonly readOnly?: boolean;
|
|
91
|
+
}): void;
|
|
92
|
+
/** Says that the document as it is now (or as it was at `cursorId`, when saving took a while) is the saved one. */
|
|
93
|
+
markSaved(cursorId?: string): void;
|
|
94
|
+
/** Selects a node: replaces the selection, toggles it (Ctrl/Cmd) or adds to it (Shift). */
|
|
95
|
+
select(id: NodeId, options?: {
|
|
96
|
+
readonly mode?: SelectMode;
|
|
97
|
+
readonly instance?: string;
|
|
98
|
+
}): void;
|
|
99
|
+
/** Replaces the selection; the last id becomes the anchor. */
|
|
100
|
+
setSelection(ids: readonly NodeId[]): void;
|
|
101
|
+
clearSelection(): void;
|
|
102
|
+
/** Moves the selection one step from the anchor; returns the node now selected, or `undefined` when there was nowhere to go. */
|
|
103
|
+
moveSelection(move: SelectionMove): NodeId | undefined;
|
|
104
|
+
setHovered(id: NodeId | null): void;
|
|
105
|
+
setReadOnly(readOnly: boolean): void;
|
|
106
|
+
/** Called after every change to the document. Returns the function that stops listening. */
|
|
107
|
+
onChange(listener: (change: DocumentChange) => void): () => void;
|
|
108
|
+
/** Runs validation and the accessibility checks now, instead of after the delay. */
|
|
109
|
+
validateNow(): ValidationSnapshot;
|
|
110
|
+
readonly history: HistoryManager;
|
|
111
|
+
/** Stops the pending validation. */
|
|
112
|
+
destroy(): void;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/store/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.test.d.ts","sourceRoot":"","sources":["../../src/styles/tokens.test.ts"],"names":[],"mappings":""}
|