@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,8 @@
|
|
|
1
|
+
import { type BuilderEditorProps } from './config.ts';
|
|
2
|
+
/**
|
|
3
|
+
* The editor (docs/editor.md#layout-and-modules): `<BuilderEditor adapter manifest canvasUrl
|
|
4
|
+
* documentRef config />`. It fills its container, so give the container a height. The panels are
|
|
5
|
+
* added by the following tasks; the props are already the final mount API.
|
|
6
|
+
*/
|
|
7
|
+
export declare function BuilderEditor(props: BuilderEditorProps): import("react").JSX.Element;
|
|
8
|
+
//# sourceMappingURL=builder-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-editor.d.ts","sourceRoot":"","sources":["../../src/app/builder-editor.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,kBAAkB,EAAiB,MAAM,aAAa,CAAC;AAGrE;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,+BAatD"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo } from 'react';
|
|
3
|
+
import { MessagesProvider } from '../messages/index.js';
|
|
4
|
+
import { resolveConfig } from './config.js';
|
|
5
|
+
import { EditorLayout } from './layout.js';
|
|
6
|
+
/**
|
|
7
|
+
* The editor (docs/editor.md#layout-and-modules): `<BuilderEditor adapter manifest canvasUrl
|
|
8
|
+
* documentRef config />`. It fills its container, so give the container a height. The panels are
|
|
9
|
+
* added by the following tasks; the props are already the final mount API.
|
|
10
|
+
*/
|
|
11
|
+
export function BuilderEditor(props) {
|
|
12
|
+
const config = useMemo(() => resolveConfig(props.config), [props.config]);
|
|
13
|
+
return (_jsx(MessagesProvider, { locale: config.uiLocale, children: _jsx("div", { className: "buildr-editor", lang: config.uiLocale, ...(config.theme !== 'system' ? { 'data-theme': config.theme } : {}), children: _jsx(EditorLayout, {}) }) }));
|
|
14
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"builder-editor.test.d.ts","sourceRoot":"","sources":["../../src/app/builder-editor.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { act } from 'react';
|
|
3
|
+
import { createRoot } from 'react-dom/client';
|
|
4
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
+
import { axe } from 'vitest-axe';
|
|
6
|
+
import * as matchers from 'vitest-axe/matchers';
|
|
7
|
+
import { en } from '../messages/en.js';
|
|
8
|
+
import { createTranslator, MessagesProvider, UI_LOCALES } from '../messages/index.js';
|
|
9
|
+
import { pl } from '../messages/pl.js';
|
|
10
|
+
import { PanelToggle } from '../toolbar/panel-toggles.js';
|
|
11
|
+
import { BuilderEditor } from './builder-editor.js';
|
|
12
|
+
import { resolveConfig } from './config.js';
|
|
13
|
+
import { EditorLayout } from './layout.js';
|
|
14
|
+
expect.extend(matchers);
|
|
15
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
16
|
+
const manifest = {
|
|
17
|
+
manifestVersion: 1,
|
|
18
|
+
components: [],
|
|
19
|
+
templates: [],
|
|
20
|
+
};
|
|
21
|
+
const props = (overrides = {}) => ({
|
|
22
|
+
adapter: {},
|
|
23
|
+
manifest,
|
|
24
|
+
canvasUrl: '/buildr/canvas',
|
|
25
|
+
documentRef: { collection: 'pages', id: '1' },
|
|
26
|
+
...overrides,
|
|
27
|
+
});
|
|
28
|
+
let container;
|
|
29
|
+
let root;
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
window.localStorage.clear();
|
|
32
|
+
container = document.createElement('div');
|
|
33
|
+
document.body.append(container);
|
|
34
|
+
root = createRoot(container);
|
|
35
|
+
});
|
|
36
|
+
afterEach(() => {
|
|
37
|
+
act(() => root.unmount());
|
|
38
|
+
container.remove();
|
|
39
|
+
});
|
|
40
|
+
const show = async (p) => {
|
|
41
|
+
await act(async () => root.render(_jsx(BuilderEditor, { ...p })));
|
|
42
|
+
};
|
|
43
|
+
const $ = (selector) => container.querySelector(selector);
|
|
44
|
+
const key = (el, k) => act(async () => {
|
|
45
|
+
el?.dispatchEvent(new KeyboardEvent('keydown', { key: k, bubbles: true }));
|
|
46
|
+
});
|
|
47
|
+
describe('BuilderEditor shell', () => {
|
|
48
|
+
it('renders the regions, each with a translated name', async () => {
|
|
49
|
+
await show(props());
|
|
50
|
+
expect($('[role=toolbar]').getAttribute('aria-label')).toBe(en['editor.toolbar']);
|
|
51
|
+
expect($('main').getAttribute('aria-label')).toBe(en['editor.canvas']);
|
|
52
|
+
const asides = [...container.querySelectorAll('aside')].map((el) => el.getAttribute('aria-label'));
|
|
53
|
+
expect(asides).toEqual([en['editor.leftPanel'], en['editor.inspector']]);
|
|
54
|
+
expect($('section').getAttribute('aria-label')).toBe(en['editor.issues']);
|
|
55
|
+
});
|
|
56
|
+
it('speaks the configured interface language, and English for one it does not know', async () => {
|
|
57
|
+
await show(props({ config: { uiLocale: 'pl' } }));
|
|
58
|
+
expect($('[role=toolbar]').getAttribute('aria-label')).toBe(pl['editor.toolbar']);
|
|
59
|
+
expect($('.buildr-editor').getAttribute('lang')).toBe('pl');
|
|
60
|
+
await show(props({ config: { uiLocale: 'xx' } }));
|
|
61
|
+
expect($('[role=toolbar]').getAttribute('aria-label')).toBe(en['editor.toolbar']);
|
|
62
|
+
});
|
|
63
|
+
it('has a Polish translation for every English string', () => {
|
|
64
|
+
expect(Object.keys(pl).sort()).toEqual(Object.keys(en).sort());
|
|
65
|
+
for (const k of Object.keys(en))
|
|
66
|
+
expect(pl[k]).not.toBe('');
|
|
67
|
+
expect(UI_LOCALES).toEqual(['en', 'pl']);
|
|
68
|
+
expect(createTranslator('pl-PL')('ui.close')).toBe(pl['ui.close']);
|
|
69
|
+
});
|
|
70
|
+
it('forces a colour scheme when asked, and otherwise follows the system', async () => {
|
|
71
|
+
await show(props({ config: { theme: 'dark' } }));
|
|
72
|
+
expect($('.buildr-editor').getAttribute('data-theme')).toBe('dark');
|
|
73
|
+
await show(props());
|
|
74
|
+
expect($('.buildr-editor').hasAttribute('data-theme')).toBe(false);
|
|
75
|
+
});
|
|
76
|
+
it('resizes the panels with the keyboard, within limits', async () => {
|
|
77
|
+
await show(props());
|
|
78
|
+
const [left, right] = container.querySelectorAll('[role=separator]');
|
|
79
|
+
expect(left?.getAttribute('aria-valuenow')).toBe('280');
|
|
80
|
+
await key(left, 'ArrowRight');
|
|
81
|
+
expect(left?.getAttribute('aria-valuenow')).toBe('296');
|
|
82
|
+
expect($('.bd-body').style.getPropertyValue('--bd-left')).toBe('296px');
|
|
83
|
+
await key(left, 'Home');
|
|
84
|
+
expect(left?.getAttribute('aria-valuenow')).toBe('200');
|
|
85
|
+
await key(left, 'ArrowLeft');
|
|
86
|
+
expect(left?.getAttribute('aria-valuenow')).toBe('200');
|
|
87
|
+
// The right panel grows when its splitter moves left.
|
|
88
|
+
await key(right, 'ArrowLeft');
|
|
89
|
+
expect(right?.getAttribute('aria-valuenow')).toBe('336');
|
|
90
|
+
});
|
|
91
|
+
it('resizes the panels by dragging', async () => {
|
|
92
|
+
await show(props());
|
|
93
|
+
const left = container.querySelector('[role=separator]');
|
|
94
|
+
const pointer = (type, x) => act(async () => {
|
|
95
|
+
left?.dispatchEvent(new MouseEvent(type, { clientX: x, bubbles: true }));
|
|
96
|
+
});
|
|
97
|
+
await pointer('pointerdown', 100);
|
|
98
|
+
expect(left?.getAttribute('data-dragging')).toBe('true');
|
|
99
|
+
await pointer('pointermove', 160);
|
|
100
|
+
expect(left?.getAttribute('aria-valuenow')).toBe('340');
|
|
101
|
+
await pointer('pointermove', 900);
|
|
102
|
+
expect(left?.getAttribute('aria-valuenow')).toBe('480');
|
|
103
|
+
await pointer('pointerup', 900);
|
|
104
|
+
expect(left?.getAttribute('data-dragging')).toBe('false');
|
|
105
|
+
});
|
|
106
|
+
it('shows and hides the issues panel', async () => {
|
|
107
|
+
await show(props());
|
|
108
|
+
const toggle = container.querySelector('.bd-issues button');
|
|
109
|
+
expect(toggle?.textContent).toBe(en['editor.issues.show']);
|
|
110
|
+
expect(toggle?.getAttribute('aria-expanded')).toBe('false');
|
|
111
|
+
await act(async () => toggle?.click());
|
|
112
|
+
expect(toggle?.textContent).toBe(en['editor.issues.hide']);
|
|
113
|
+
expect($('.bd-issues').getAttribute('data-open')).toBe('true');
|
|
114
|
+
});
|
|
115
|
+
it('resets a panel on double-click and remembers the widths', async () => {
|
|
116
|
+
await show(props());
|
|
117
|
+
const [left] = container.querySelectorAll('[role=separator]');
|
|
118
|
+
await key(left, 'ArrowRight');
|
|
119
|
+
expect(window.localStorage.getItem('buildr:editor:left-width')).toBe('296');
|
|
120
|
+
await act(async () => {
|
|
121
|
+
left?.dispatchEvent(new MouseEvent('dblclick', { bubbles: true }));
|
|
122
|
+
});
|
|
123
|
+
expect(left?.getAttribute('aria-valuenow')).toBe('280');
|
|
124
|
+
expect(window.localStorage.getItem('buildr:editor:left-width')).toBe('280');
|
|
125
|
+
window.localStorage.setItem('buildr:editor:left-width', '400');
|
|
126
|
+
await act(async () => root.unmount());
|
|
127
|
+
root = createRoot(container);
|
|
128
|
+
await show(props());
|
|
129
|
+
expect(container.querySelector('[role=separator]')?.getAttribute('aria-valuenow')).toBe('400');
|
|
130
|
+
});
|
|
131
|
+
it('works without storage', async () => {
|
|
132
|
+
const getItem = vi.spyOn(Storage.prototype, 'getItem').mockImplementation(() => {
|
|
133
|
+
throw new Error('denied');
|
|
134
|
+
});
|
|
135
|
+
const setItem = vi.spyOn(Storage.prototype, 'setItem').mockImplementation(() => {
|
|
136
|
+
throw new Error('denied');
|
|
137
|
+
});
|
|
138
|
+
await show(props());
|
|
139
|
+
const [left] = container.querySelectorAll('[role=separator]');
|
|
140
|
+
await key(left, 'ArrowRight');
|
|
141
|
+
expect(left?.getAttribute('aria-valuenow')).toBe('296');
|
|
142
|
+
getItem.mockRestore();
|
|
143
|
+
setItem.mockRestore();
|
|
144
|
+
});
|
|
145
|
+
it('shows the issue counts on the status bar toggle', async () => {
|
|
146
|
+
await act(async () => root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx(EditorLayout, { issueCounts: { error: 2, warning: 3 }, status: _jsx("span", { children: "info" }) }) })));
|
|
147
|
+
const toggle = container.querySelector('.bd-issues button');
|
|
148
|
+
expect(toggle?.querySelector('[data-severity=error]')?.textContent).toBe('2');
|
|
149
|
+
expect(toggle?.querySelector('[data-severity=warning]')?.textContent).toBe('3');
|
|
150
|
+
expect(toggle?.textContent).toContain(en['editor.issues.show']);
|
|
151
|
+
expect($('.bd-issues-bar').textContent).toContain('info');
|
|
152
|
+
await act(async () => toggle?.click());
|
|
153
|
+
expect($('.bd-issues').getAttribute('data-open')).toBe('true');
|
|
154
|
+
});
|
|
155
|
+
it('turns the panels into toolbar-toggled overlays when the editor is narrow', async () => {
|
|
156
|
+
let notify;
|
|
157
|
+
class FakeObserver {
|
|
158
|
+
constructor(callback) {
|
|
159
|
+
notify = callback;
|
|
160
|
+
}
|
|
161
|
+
observe() { }
|
|
162
|
+
disconnect() { }
|
|
163
|
+
}
|
|
164
|
+
vi.stubGlobal('ResizeObserver', FakeObserver);
|
|
165
|
+
const width = vi.spyOn(HTMLElement.prototype, 'clientWidth', 'get').mockReturnValue(1300);
|
|
166
|
+
await act(async () => root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx("div", { className: "buildr-editor", children: _jsx(EditorLayout, { toolbar: _jsx(PanelToggle, { side: "left" }) }) }) })));
|
|
167
|
+
expect($('.bd-body').getAttribute('data-narrow')).toBe('false');
|
|
168
|
+
expect(container.querySelector('.bd-toolbar button')).toBeNull();
|
|
169
|
+
await act(async () => notify?.([{ contentRect: { width: 900 } }]));
|
|
170
|
+
expect($('.bd-body').getAttribute('data-narrow')).toBe('true');
|
|
171
|
+
const left = $('aside[data-side=left]');
|
|
172
|
+
expect(left.hidden).toBe(true);
|
|
173
|
+
const button = $('.bd-toolbar button');
|
|
174
|
+
expect(button.getAttribute('aria-label')).toBe(en['editor.panels.left']);
|
|
175
|
+
await act(async () => button.click());
|
|
176
|
+
expect(left.hidden).toBe(false);
|
|
177
|
+
expect(button.getAttribute('aria-pressed')).toBe('true');
|
|
178
|
+
await key(left, 'Escape');
|
|
179
|
+
expect(left.hidden).toBe(true);
|
|
180
|
+
await act(async () => notify?.([{ contentRect: { width: 1300 } }]));
|
|
181
|
+
expect($('.bd-body').getAttribute('data-narrow')).toBe('false');
|
|
182
|
+
width.mockRestore();
|
|
183
|
+
vi.unstubAllGlobals();
|
|
184
|
+
});
|
|
185
|
+
it('has no accessibility violations', async () => {
|
|
186
|
+
await show(props());
|
|
187
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
188
|
+
await show(props({ config: { uiLocale: 'pl', theme: 'dark' } }));
|
|
189
|
+
expect(await axe(container)).toHaveNoViolations();
|
|
190
|
+
});
|
|
191
|
+
});
|
|
192
|
+
describe('resolveConfig', () => {
|
|
193
|
+
it('fills in the defaults and keeps what the host set', () => {
|
|
194
|
+
const config = resolveConfig();
|
|
195
|
+
expect(config.breakpoints.map((b) => b.id)).toEqual(['desktop', 'tablet', 'mobile']);
|
|
196
|
+
expect(config.autosave).toEqual({ debounceMs: 2000, maxWaitMs: 20_000 });
|
|
197
|
+
expect(resolveConfig({ autosave: { debounceMs: 1, maxWaitMs: 2 }, uiLocale: 'pl' })).toMatchObject({ autosave: { debounceMs: 1, maxWaitMs: 2 }, uiLocale: 'pl' });
|
|
198
|
+
});
|
|
199
|
+
});
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import type { RegistryManifest } from '@next-buildr/core';
|
|
2
|
+
import type { DocumentAdapter, DocumentRef } from '../persistence/types.ts';
|
|
3
|
+
export type { DocumentRef };
|
|
4
|
+
/** One canvas width the toolbar offers (PB-083). */
|
|
5
|
+
export interface BreakpointConfig {
|
|
6
|
+
readonly id: string;
|
|
7
|
+
readonly width: number;
|
|
8
|
+
}
|
|
9
|
+
export interface EditorConfig {
|
|
10
|
+
/** The widths of the canvas the author can switch between. */
|
|
11
|
+
readonly breakpoints?: readonly BreakpointConfig[];
|
|
12
|
+
/** Overrides for keyboard shortcuts, by action id (PB-084). */
|
|
13
|
+
readonly shortcuts?: Readonly<Record<string, string>>;
|
|
14
|
+
readonly autosave?: {
|
|
15
|
+
/** Save after this long without a change. */
|
|
16
|
+
readonly debounceMs: number;
|
|
17
|
+
/** But at the latest this long after the first unsaved change. */
|
|
18
|
+
readonly maxWaitMs: number;
|
|
19
|
+
};
|
|
20
|
+
/** The language of the editor's own interface (not the content's). */
|
|
21
|
+
readonly uiLocale?: string;
|
|
22
|
+
/** Forces a colour scheme; by default it follows the system's. */
|
|
23
|
+
readonly theme?: 'light' | 'dark' | 'system';
|
|
24
|
+
/**
|
|
25
|
+
* The narrowest window (in CSS pixels) the editor opens in; below it a notice asks the author to
|
|
26
|
+
* use a computer. Defaults to 1024 (phones and tablets held upright); `0` turns the check off.
|
|
27
|
+
*/
|
|
28
|
+
readonly minViewportWidth?: number;
|
|
29
|
+
}
|
|
30
|
+
export interface ResolvedEditorConfig {
|
|
31
|
+
readonly breakpoints: readonly BreakpointConfig[];
|
|
32
|
+
readonly shortcuts: Readonly<Record<string, string>>;
|
|
33
|
+
readonly autosave: {
|
|
34
|
+
readonly debounceMs: number;
|
|
35
|
+
readonly maxWaitMs: number;
|
|
36
|
+
};
|
|
37
|
+
readonly uiLocale: string;
|
|
38
|
+
readonly theme: 'light' | 'dark' | 'system';
|
|
39
|
+
readonly minViewportWidth: number;
|
|
40
|
+
}
|
|
41
|
+
/** Below this window width the editor does not open: its panels and the canvas need the room. */
|
|
42
|
+
export declare const DEFAULT_MIN_VIEWPORT_WIDTH = 1024;
|
|
43
|
+
export declare const DEFAULT_BREAKPOINTS: readonly BreakpointConfig[];
|
|
44
|
+
/** Fills in what a host left out. */
|
|
45
|
+
export declare function resolveConfig(config?: EditorConfig): ResolvedEditorConfig;
|
|
46
|
+
export interface BuilderEditorProps {
|
|
47
|
+
/**
|
|
48
|
+
* Loads, saves and publishes the document (`DocumentAdapter`, PB-087). The shell does not use it
|
|
49
|
+
* yet; it is part of the mount API so hosts do not change when the panels arrive.
|
|
50
|
+
*/
|
|
51
|
+
readonly adapter: DocumentAdapter;
|
|
52
|
+
/** What the palette, the inspector and the rules know about the components (`toManifest`). */
|
|
53
|
+
readonly manifest: RegistryManifest;
|
|
54
|
+
/** The canvas route the iframe loads (`@next-buildr/react/canvas` runs there). */
|
|
55
|
+
readonly canvasUrl: string;
|
|
56
|
+
readonly documentRef: DocumentRef;
|
|
57
|
+
readonly config?: EditorConfig;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/app/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE5E,YAAY,EAAE,WAAW,EAAE,CAAC;AAE5B,oDAAoD;AACpD,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IACnD,+DAA+D;IAC/D,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACtD,QAAQ,CAAC,QAAQ,CAAC,EAAE;QAClB,6CAA6C;QAC7C,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAC5B,kEAAkE;QAClE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;KAC5B,CAAC;IACF,sEAAsE;IACtE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,kEAAkE;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC7C;;;OAGG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,WAAW,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAClD,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrD,QAAQ,CAAC,QAAQ,EAAE;QAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CACnC;AAED,iGAAiG;AACjG,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAE/C,eAAO,MAAM,mBAAmB,EAAE,SAAS,gBAAgB,EAI1D,CAAC;AAEF,qCAAqC;AACrC,wBAAgB,aAAa,CAAC,MAAM,GAAE,YAAiB,GAAG,oBAAoB,CAS7E;AAED,MAAM,WAAW,kBAAkB;IACjC;;;OAGG;IACH,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,8FAA8F;IAC9F,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,CAAC;IACpC,kFAAkF;IAClF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC;CAChC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** Below this window width the editor does not open: its panels and the canvas need the room. */
|
|
2
|
+
export const DEFAULT_MIN_VIEWPORT_WIDTH = 1024;
|
|
3
|
+
export const DEFAULT_BREAKPOINTS = [
|
|
4
|
+
{ id: 'desktop', width: 1280 },
|
|
5
|
+
{ id: 'tablet', width: 820 },
|
|
6
|
+
{ id: 'mobile', width: 390 },
|
|
7
|
+
];
|
|
8
|
+
/** Fills in what a host left out. */
|
|
9
|
+
export function resolveConfig(config = {}) {
|
|
10
|
+
return {
|
|
11
|
+
breakpoints: config.breakpoints ?? DEFAULT_BREAKPOINTS,
|
|
12
|
+
shortcuts: config.shortcuts ?? {},
|
|
13
|
+
autosave: config.autosave ?? { debounceMs: 2000, maxWaitMs: 20_000 },
|
|
14
|
+
uiLocale: config.uiLocale ?? 'en',
|
|
15
|
+
theme: config.theme ?? 'system',
|
|
16
|
+
minViewportWidth: config.minViewportWidth ?? DEFAULT_MIN_VIEWPORT_WIDTH,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"content-language.test.d.ts","sourceRoot":"","sources":["../../src/app/content-language.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment jsdom
|
|
3
|
+
import { createRegistryMeta, createSeededIdGenerator, p, s, toManifest, } from '@next-buildr/core';
|
|
4
|
+
import { act } from 'react';
|
|
5
|
+
import { createRoot } from 'react-dom/client';
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
7
|
+
import { MessagesProvider } from '../messages/index.js';
|
|
8
|
+
import { Inspector } from '../panels/inspector/index.js';
|
|
9
|
+
import { IssuesPanel } from '../panels/issues/index.js';
|
|
10
|
+
import { createEditorStore, createLocaleStore, EditorStoreProvider, LocaleProvider, useLocaleState, } from '../store/index.js';
|
|
11
|
+
import { LocaleSwitcher } from '../toolbar/index.js';
|
|
12
|
+
import { ManifestProvider } from './manifest.js';
|
|
13
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
14
|
+
const locales = {
|
|
15
|
+
locales: ['en', 'pl', 'de'],
|
|
16
|
+
default: 'en',
|
|
17
|
+
fallback: true,
|
|
18
|
+
intl: { en: 'English', pl: 'Polski', de: 'Deutsch' },
|
|
19
|
+
};
|
|
20
|
+
const widget = {
|
|
21
|
+
type: 'buildr/widget',
|
|
22
|
+
version: 1,
|
|
23
|
+
label: 'Widget',
|
|
24
|
+
category: 'content',
|
|
25
|
+
props: { title: p.text({ label: 'Title', default: 'Hello' }) },
|
|
26
|
+
contentCategories: ['flow'],
|
|
27
|
+
styles: { groups: [] },
|
|
28
|
+
runtime: 'shared',
|
|
29
|
+
slots: { default: {} },
|
|
30
|
+
};
|
|
31
|
+
const page = {
|
|
32
|
+
...widget,
|
|
33
|
+
type: 'buildr/page',
|
|
34
|
+
label: 'Page',
|
|
35
|
+
props: {},
|
|
36
|
+
capabilities: { root: true },
|
|
37
|
+
};
|
|
38
|
+
const registry = createRegistryMeta({ components: [page, widget] });
|
|
39
|
+
const manifest = toManifest(registry);
|
|
40
|
+
const fixture = () => ({
|
|
41
|
+
schemaVersion: 1,
|
|
42
|
+
root: 'root',
|
|
43
|
+
nodes: {
|
|
44
|
+
root: { id: 'root', type: 'buildr/page', slots: { default: ['widget0001', 'widget0002'] } },
|
|
45
|
+
widget0001: { id: 'widget0001', type: 'buildr/widget', props: { title: s('Hello') } },
|
|
46
|
+
widget0002: {
|
|
47
|
+
id: 'widget0002',
|
|
48
|
+
type: 'buildr/widget',
|
|
49
|
+
props: { title: { kind: 'static', value: 'Bye', l10n: { pl: 'Pa' } } },
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
components: { 'buildr/page': 1, 'buildr/widget': 1 },
|
|
53
|
+
});
|
|
54
|
+
function Harness() {
|
|
55
|
+
const locale = useLocaleState((state) => state.locale);
|
|
56
|
+
return (_jsxs(_Fragment, { children: [_jsx(LocaleSwitcher, {}), _jsx(Inspector, { locale: locale, defaultLocale: "en" }), _jsx(IssuesPanel, {})] }));
|
|
57
|
+
}
|
|
58
|
+
describe('content language', () => {
|
|
59
|
+
let container;
|
|
60
|
+
let root;
|
|
61
|
+
beforeEach(() => {
|
|
62
|
+
container = document.createElement('div');
|
|
63
|
+
document.body.append(container);
|
|
64
|
+
root = createRoot(container);
|
|
65
|
+
Element.prototype.scrollIntoView ??= () => { };
|
|
66
|
+
Element.prototype.hasPointerCapture ??= () => false;
|
|
67
|
+
Element.prototype.setPointerCapture ??= () => { };
|
|
68
|
+
Element.prototype.releasePointerCapture ??= () => { };
|
|
69
|
+
});
|
|
70
|
+
afterEach(() => {
|
|
71
|
+
act(() => root.unmount());
|
|
72
|
+
document.body.innerHTML = '';
|
|
73
|
+
});
|
|
74
|
+
const mount = async (select = 'widget0001') => {
|
|
75
|
+
const store = createEditorStore({
|
|
76
|
+
doc: fixture(),
|
|
77
|
+
registry,
|
|
78
|
+
generateId: createSeededIdGenerator(3),
|
|
79
|
+
validationDelayMs: null,
|
|
80
|
+
locales,
|
|
81
|
+
});
|
|
82
|
+
store.select(select);
|
|
83
|
+
const localeStore = createLocaleStore(locales);
|
|
84
|
+
await act(async () => {
|
|
85
|
+
store.validateNow();
|
|
86
|
+
root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx(ManifestProvider, { manifest: manifest, children: _jsx(EditorStoreProvider, { store: store, children: _jsx(LocaleProvider, { store: localeStore, children: _jsx(Harness, {}) }) }) }) }));
|
|
87
|
+
});
|
|
88
|
+
return { store, localeStore };
|
|
89
|
+
};
|
|
90
|
+
const click = (el) => act(async () => {
|
|
91
|
+
el.click();
|
|
92
|
+
});
|
|
93
|
+
const button = (name) => [...container.querySelectorAll('button')].find((b) => b.textContent === name);
|
|
94
|
+
const l10nOf = (store, id) => store.getState().doc.nodes[id]?.props?.['title']?.l10n;
|
|
95
|
+
const titleInput = () => container.querySelector('[data-prop=title] input');
|
|
96
|
+
it('is quiet in the default language and explains the split in another', async () => {
|
|
97
|
+
const { localeStore } = await mount();
|
|
98
|
+
expect(container.querySelector('.bd-translation-banner')).toBeNull();
|
|
99
|
+
expect(container.querySelector('.bd-translation-hint')).toBeNull();
|
|
100
|
+
await act(async () => localeStore.getState().setLocale('pl'));
|
|
101
|
+
expect(container.querySelector('.bd-translation-banner')?.textContent).toContain('Structure and style are shared');
|
|
102
|
+
expect(container.querySelector('[data-prop=title][data-untranslated]')).not.toBeNull();
|
|
103
|
+
expect(container.textContent).toContain('The default-language text is shown.');
|
|
104
|
+
});
|
|
105
|
+
it('translating writes to l10n; undo and removing take it back', async () => {
|
|
106
|
+
const { store, localeStore } = await mount();
|
|
107
|
+
await act(async () => localeStore.getState().setLocale('pl'));
|
|
108
|
+
await click(button('Translate'));
|
|
109
|
+
expect(l10nOf(store, 'widget0001')).toEqual({ pl: 'Hello' });
|
|
110
|
+
expect(container.querySelector('[data-untranslated]')).toBeNull();
|
|
111
|
+
expect(button('Translate')).toBeUndefined();
|
|
112
|
+
await act(async () => {
|
|
113
|
+
store.undo();
|
|
114
|
+
});
|
|
115
|
+
expect(l10nOf(store, 'widget0001')).toBeUndefined();
|
|
116
|
+
await click(button('Translate'));
|
|
117
|
+
await click(container.querySelector('button[aria-label^="Remove translation"]'));
|
|
118
|
+
expect(l10nOf(store, 'widget0001')).toBeUndefined();
|
|
119
|
+
// The default-language value is untouched by all of it.
|
|
120
|
+
expect(store.getState().doc.nodes['widget0001']?.props?.['title']
|
|
121
|
+
?.value).toBe('Hello');
|
|
122
|
+
});
|
|
123
|
+
it('shows the translation of the chosen language, and ignores an unknown one', async () => {
|
|
124
|
+
const { localeStore } = await mount('widget0002');
|
|
125
|
+
expect(titleInput().value).toBe('Bye');
|
|
126
|
+
await act(async () => localeStore.getState().setLocale('pl'));
|
|
127
|
+
expect(titleInput().value).toBe('Pa');
|
|
128
|
+
await act(async () => localeStore.getState().setLocale('de'));
|
|
129
|
+
expect(titleInput().value).toBe('Bye');
|
|
130
|
+
await act(async () => localeStore.getState().setLocale('xx'));
|
|
131
|
+
expect(localeStore.getState().locale).toBe('de');
|
|
132
|
+
});
|
|
133
|
+
it('lists missing translations per language', async () => {
|
|
134
|
+
await mount();
|
|
135
|
+
const groups = [...container.querySelectorAll('.bd-issues-group')].map((group) => ({
|
|
136
|
+
locale: group.getAttribute('data-locale'),
|
|
137
|
+
count: group.querySelectorAll('li').length,
|
|
138
|
+
}));
|
|
139
|
+
// widget0001 has no translation at all; widget0002 lacks only German.
|
|
140
|
+
expect(groups).toEqual([
|
|
141
|
+
{ locale: 'pl', count: 1 },
|
|
142
|
+
{ locale: 'de', count: 2 },
|
|
143
|
+
]);
|
|
144
|
+
expect(container.querySelector('.bd-issues-group summary')?.textContent).toContain('Missing translations: Polski');
|
|
145
|
+
});
|
|
146
|
+
it('shows no switcher for a single language', async () => {
|
|
147
|
+
const single = {
|
|
148
|
+
locales: ['en'],
|
|
149
|
+
default: 'en',
|
|
150
|
+
fallback: true,
|
|
151
|
+
intl: { en: 'English' },
|
|
152
|
+
};
|
|
153
|
+
const store = createLocaleStore(single);
|
|
154
|
+
await act(async () => root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx(LocaleProvider, { store: store, children: _jsx(LocaleSwitcher, {}) }) })));
|
|
155
|
+
expect(container.innerHTML).toBe('');
|
|
156
|
+
});
|
|
157
|
+
});
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { ComponentMigrations, LocaleConfig, RegistryMeta } from '@next-buildr/core';
|
|
2
|
+
import { type BuilderEditorProps } from './config.ts';
|
|
3
|
+
export interface EditorAppProps extends BuilderEditorProps {
|
|
4
|
+
/** The registry the commands run against (`registry.meta` of the host's registry). */
|
|
5
|
+
readonly registry: RegistryMeta;
|
|
6
|
+
/** The languages the content can be written in; the session's (`getSession().locales`), else one language (`en`), when left out. */
|
|
7
|
+
readonly locales?: LocaleConfig;
|
|
8
|
+
/** `registry.migrations` of the host's registry: lets a paste of content copied under older component versions (or retired types) migrate instead of being refused. */
|
|
9
|
+
readonly migrations?: ComponentMigrations;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* The whole editor (docs/editor.md#the-editor-app): loads the document of `documentRef` through
|
|
13
|
+
* the adapter, creates its store and autosave, and composes the toolbar, the panels, the canvas
|
|
14
|
+
* and the dialogs. `BuilderEditor` is the bare shell; hosts mount this one.
|
|
15
|
+
*/
|
|
16
|
+
export declare function EditorApp(props: EditorAppProps): import("react").JSX.Element;
|
|
17
|
+
//# sourceMappingURL=editor-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor-app.d.ts","sourceRoot":"","sources":["../../src/app/editor-app.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EAGnB,YAAY,EACZ,YAAY,EACb,MAAM,mBAAmB,CAAC;AAqD3B,OAAO,EAAE,KAAK,kBAAkB,EAAmC,MAAM,aAAa,CAAC;AAMvF,MAAM,WAAW,cAAe,SAAQ,kBAAkB;IACxD,sFAAsF;IACtF,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;IAChC,oIAAoI;IACpI,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,CAAC;IAChC,uKAAuK;IACvK,QAAQ,CAAC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAC3C;AAsBD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,cAAc,+BA0F9C"}
|