@next-buildr/editor 2.0.1 → 3.0.0-rc.0
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/README.md +2 -0
- package/UPGRADING.md +322 -0
- package/dist/.tsbuildinfo +1 -1
- package/dist/app/builder-editor.test.js +223 -18
- package/dist/app/config.d.ts +27 -4
- package/dist/app/config.d.ts.map +1 -1
- package/dist/app/config.js +4 -3
- package/dist/app/contracts.d.ts +40 -0
- package/dist/app/contracts.d.ts.map +1 -0
- package/dist/app/contracts.js +4 -0
- package/dist/app/editor-app.d.ts.map +1 -1
- package/dist/app/editor-app.js +316 -24
- package/dist/app/editor-app.test.js +144 -6
- package/dist/app/layout.d.ts +11 -2
- package/dist/app/layout.d.ts.map +1 -1
- package/dist/app/layout.js +170 -9
- package/dist/app/manifest.d.ts +7 -2
- package/dist/app/manifest.d.ts.map +1 -1
- package/dist/app/manifest.js +16 -4
- package/dist/app/shell-panels.d.ts +15 -0
- package/dist/app/shell-panels.d.ts.map +1 -1
- package/dist/app/small-screen.test.js +2 -2
- package/dist/app/stage-slots.d.ts +9 -0
- package/dist/app/stage-slots.d.ts.map +1 -0
- package/dist/app/stage-slots.js +10 -0
- package/dist/app/status-info.d.ts +2 -3
- package/dist/app/status-info.d.ts.map +1 -1
- package/dist/app/status-info.js +49 -16
- package/dist/canvas-host/canvas-frame.d.ts +13 -1
- package/dist/canvas-host/canvas-frame.d.ts.map +1 -1
- package/dist/canvas-host/canvas-frame.js +96 -8
- package/dist/canvas-host/canvas-frame.test.js +156 -3
- package/dist/canvas-host/host.d.ts +6 -0
- package/dist/canvas-host/host.d.ts.map +1 -1
- package/dist/canvas-host/host.js +116 -4
- package/dist/canvas-host/host.test.js +195 -6
- package/dist/clipboard/clipboard.d.ts +1 -1
- package/dist/clipboard/clipboard.d.ts.map +1 -1
- package/dist/clipboard/clipboard.js +5 -0
- package/dist/clipboard/clipboard.test.js +21 -1
- package/dist/clipboard/format.d.ts +3 -1
- package/dist/clipboard/format.d.ts.map +1 -1
- package/dist/clipboard/react.d.ts +1 -1
- package/dist/clipboard/react.d.ts.map +1 -1
- package/dist/clipboard/react.js +49 -3
- package/dist/dialogs/external-source.d.ts +15 -0
- package/dist/dialogs/external-source.d.ts.map +1 -0
- package/dist/dialogs/external-source.js +18 -0
- package/dist/dialogs/index.d.ts +4 -0
- package/dist/dialogs/index.d.ts.map +1 -1
- package/dist/dialogs/index.js +2 -0
- package/dist/dialogs/media-picker/index.d.ts +2 -2
- package/dist/dialogs/media-picker/index.d.ts.map +1 -1
- package/dist/dialogs/media-picker/index.js +1 -1
- package/dist/dialogs/media-picker/media-picker.d.ts +5 -0
- package/dist/dialogs/media-picker/media-picker.d.ts.map +1 -1
- package/dist/dialogs/media-picker/media-picker.js +67 -5
- package/dist/dialogs/media-picker/media-picker.test.js +72 -1
- package/dist/dialogs/media-picker/media-ref.d.ts +15 -0
- package/dist/dialogs/media-picker/media-ref.d.ts.map +1 -1
- package/dist/dialogs/media-picker/media-ref.js +29 -0
- package/dist/dialogs/remove-confirm.d.ts +14 -0
- package/dist/dialogs/remove-confirm.d.ts.map +1 -0
- package/dist/dialogs/remove-confirm.js +42 -0
- package/dist/dialogs/remove-confirm.test.d.ts +2 -0
- package/dist/dialogs/remove-confirm.test.d.ts.map +1 -0
- package/dist/dialogs/remove-confirm.test.js +118 -0
- package/dist/dnd/dnd-react.test.js +11 -2
- package/dist/dnd/dnd.test.js +23 -0
- package/dist/dnd/engine.d.ts +4 -2
- package/dist/dnd/engine.d.ts.map +1 -1
- package/dist/dnd/engine.js +6 -0
- package/dist/dnd/move-to-dialog.d.ts +4 -3
- package/dist/dnd/move-to-dialog.d.ts.map +1 -1
- package/dist/dnd/move-to-dialog.js +67 -10
- package/dist/dnd/react.d.ts.map +1 -1
- package/dist/dnd/react.js +5 -0
- package/dist/i18n/diagnostics.d.ts +22 -0
- package/dist/i18n/diagnostics.d.ts.map +1 -0
- package/dist/i18n/diagnostics.js +153 -0
- package/dist/i18n/diagnostics.test.d.ts +2 -0
- package/dist/i18n/diagnostics.test.d.ts.map +1 -0
- package/dist/i18n/diagnostics.test.js +74 -0
- package/dist/i18n/label-catalog.d.ts +20 -0
- package/dist/i18n/label-catalog.d.ts.map +1 -0
- package/dist/i18n/label-catalog.js +1 -0
- package/dist/i18n/locale-name.d.ts +7 -0
- package/dist/i18n/locale-name.d.ts.map +1 -0
- package/dist/i18n/locale-name.js +31 -0
- package/dist/i18n/localize-manifest.d.ts +11 -0
- package/dist/i18n/localize-manifest.d.ts.map +1 -0
- package/dist/i18n/localize-manifest.js +78 -0
- package/dist/i18n/localize-manifest.test.d.ts +2 -0
- package/dist/i18n/localize-manifest.test.d.ts.map +1 -0
- package/dist/i18n/localize-manifest.test.js +71 -0
- package/dist/messages/catalogs.test.d.ts +2 -0
- package/dist/messages/catalogs.test.d.ts.map +1 -0
- package/dist/messages/catalogs.test.js +80 -0
- package/dist/messages/en/app.d.ts +8 -0
- package/dist/messages/en/app.d.ts.map +1 -0
- package/dist/messages/en/app.js +7 -0
- package/dist/messages/en/blocks.d.ts +54 -0
- package/dist/messages/en/blocks.d.ts.map +1 -0
- package/dist/messages/en/blocks.js +53 -0
- package/dist/messages/en/canvas.d.ts +31 -0
- package/dist/messages/en/canvas.d.ts.map +1 -0
- package/dist/messages/en/canvas.js +30 -0
- package/dist/messages/en/clipboard.d.ts +13 -0
- package/dist/messages/en/clipboard.d.ts.map +1 -0
- package/dist/messages/en/clipboard.js +12 -0
- package/dist/messages/en/colorPicker.d.ts +20 -0
- package/dist/messages/en/colorPicker.d.ts.map +1 -0
- package/dist/messages/en/colorPicker.js +19 -0
- package/dist/messages/en/diagnostics.d.ts +40 -0
- package/dist/messages/en/diagnostics.d.ts.map +1 -0
- package/dist/messages/en/diagnostics.js +39 -0
- package/dist/messages/en/dialogs/common.d.ts +6 -0
- package/dist/messages/en/dialogs/common.d.ts.map +1 -0
- package/dist/messages/en/dialogs/common.js +5 -0
- package/dist/messages/en/dialogs/conflict.d.ts +15 -0
- package/dist/messages/en/dialogs/conflict.d.ts.map +1 -0
- package/dist/messages/en/dialogs/conflict.js +14 -0
- package/dist/messages/en/dialogs/delete.d.ts +19 -0
- package/dist/messages/en/dialogs/delete.d.ts.map +1 -0
- package/dist/messages/en/dialogs/delete.js +18 -0
- package/dist/messages/en/dialogs/pageOptions.d.ts +9 -0
- package/dist/messages/en/dialogs/pageOptions.d.ts.map +1 -0
- package/dist/messages/en/dialogs/pageOptions.js +8 -0
- package/dist/messages/en/dialogs/publish.d.ts +15 -0
- package/dist/messages/en/dialogs/publish.d.ts.map +1 -0
- package/dist/messages/en/dialogs/publish.js +14 -0
- package/dist/messages/en/dnd.d.ts +19 -0
- package/dist/messages/en/dnd.d.ts.map +1 -0
- package/dist/messages/en/dnd.js +18 -0
- package/dist/messages/en/editor.d.ts +30 -0
- package/dist/messages/en/editor.d.ts.map +1 -0
- package/dist/messages/en/editor.js +29 -0
- package/dist/messages/en/external.d.ts +6 -0
- package/dist/messages/en/external.d.ts.map +1 -0
- package/dist/messages/en/external.js +5 -0
- package/dist/messages/en/insert.d.ts +25 -0
- package/dist/messages/en/insert.d.ts.map +1 -0
- package/dist/messages/en/insert.js +24 -0
- package/dist/messages/en/inspector.d.ts +176 -0
- package/dist/messages/en/inspector.d.ts.map +1 -0
- package/dist/messages/en/inspector.js +175 -0
- package/dist/messages/en/issues.d.ts +36 -0
- package/dist/messages/en/issues.d.ts.map +1 -0
- package/dist/messages/en/issues.js +35 -0
- package/dist/messages/en/layers.d.ts +29 -0
- package/dist/messages/en/layers.d.ts.map +1 -0
- package/dist/messages/en/layers.js +28 -0
- package/dist/messages/en/leftPanel.d.ts +15 -0
- package/dist/messages/en/leftPanel.d.ts.map +1 -0
- package/dist/messages/en/leftPanel.js +14 -0
- package/dist/messages/en/list.d.ts +9 -0
- package/dist/messages/en/list.d.ts.map +1 -0
- package/dist/messages/en/list.js +8 -0
- package/dist/messages/en/locale.d.ts +4 -0
- package/dist/messages/en/locale.d.ts.map +1 -0
- package/dist/messages/en/locale.js +3 -0
- package/dist/messages/en/media.d.ts +51 -0
- package/dist/messages/en/media.d.ts.map +1 -0
- package/dist/messages/en/media.js +50 -0
- package/dist/messages/en/menu.d.ts +12 -0
- package/dist/messages/en/menu.d.ts.map +1 -0
- package/dist/messages/en/menu.js +11 -0
- package/dist/messages/en/patterns.d.ts +24 -0
- package/dist/messages/en/patterns.d.ts.map +1 -0
- package/dist/messages/en/patterns.js +23 -0
- package/dist/messages/en/preview.d.ts +8 -0
- package/dist/messages/en/preview.d.ts.map +1 -0
- package/dist/messages/en/preview.js +7 -0
- package/dist/messages/en/publish.d.ts +19 -0
- package/dist/messages/en/publish.d.ts.map +1 -0
- package/dist/messages/en/publish.js +18 -0
- package/dist/messages/en/richText.d.ts +21 -0
- package/dist/messages/en/richText.d.ts.map +1 -0
- package/dist/messages/en/richText.js +20 -0
- package/dist/messages/en/sample.d.ts +5 -0
- package/dist/messages/en/sample.d.ts.map +1 -0
- package/dist/messages/en/sample.js +4 -0
- package/dist/messages/en/save.d.ts +15 -0
- package/dist/messages/en/save.d.ts.map +1 -0
- package/dist/messages/en/save.js +14 -0
- package/dist/messages/en/shortcut.d.ts +36 -0
- package/dist/messages/en/shortcut.d.ts.map +1 -0
- package/dist/messages/en/shortcut.js +35 -0
- package/dist/messages/en/statusBar.d.ts +14 -0
- package/dist/messages/en/statusBar.d.ts.map +1 -0
- package/dist/messages/en/statusBar.js +13 -0
- package/dist/messages/en/structure.d.ts +28 -0
- package/dist/messages/en/structure.d.ts.map +1 -0
- package/dist/messages/en/structure.js +27 -0
- package/dist/messages/en/style.d.ts +168 -0
- package/dist/messages/en/style.d.ts.map +1 -0
- package/dist/messages/en/style.js +167 -0
- package/dist/messages/en/styleField.d.ts +301 -0
- package/dist/messages/en/styleField.d.ts.map +1 -0
- package/dist/messages/en/styleField.js +300 -0
- package/dist/messages/en/styleOption.d.ts +128 -0
- package/dist/messages/en/styleOption.d.ts.map +1 -0
- package/dist/messages/en/styleOption.js +127 -0
- package/dist/messages/en/styleSection.d.ts +16 -0
- package/dist/messages/en/styleSection.d.ts.map +1 -0
- package/dist/messages/en/styleSection.js +15 -0
- package/dist/messages/en/toast.d.ts +22 -0
- package/dist/messages/en/toast.d.ts.map +1 -0
- package/dist/messages/en/toast.js +21 -0
- package/dist/messages/en/toolbar.d.ts +47 -0
- package/dist/messages/en/toolbar.d.ts.map +1 -0
- package/dist/messages/en/toolbar.js +46 -0
- package/dist/messages/en/translation.d.ts +7 -0
- package/dist/messages/en/translation.d.ts.map +1 -0
- package/dist/messages/en/translation.js +6 -0
- package/dist/messages/en/ui.d.ts +4 -0
- package/dist/messages/en/ui.d.ts.map +1 -0
- package/dist/messages/en/ui.js +3 -0
- package/dist/messages/en/values.d.ts +45 -0
- package/dist/messages/en/values.d.ts.map +1 -0
- package/dist/messages/en/values.js +44 -0
- package/dist/messages/en.d.ts +1298 -202
- package/dist/messages/en.d.ts.map +1 -1
- package/dist/messages/en.js +82 -330
- package/dist/messages/index.d.ts +12 -0
- package/dist/messages/index.d.ts.map +1 -1
- package/dist/messages/index.js +28 -1
- package/dist/messages/pl/app.d.ts +8 -0
- package/dist/messages/pl/app.d.ts.map +1 -0
- package/dist/messages/pl/app.js +7 -0
- package/dist/messages/pl/blocks.d.ts +54 -0
- package/dist/messages/pl/blocks.d.ts.map +1 -0
- package/dist/messages/pl/blocks.js +53 -0
- package/dist/messages/pl/canvas.d.ts +31 -0
- package/dist/messages/pl/canvas.d.ts.map +1 -0
- package/dist/messages/pl/canvas.js +30 -0
- package/dist/messages/pl/clipboard.d.ts +13 -0
- package/dist/messages/pl/clipboard.d.ts.map +1 -0
- package/dist/messages/pl/clipboard.js +12 -0
- package/dist/messages/pl/colorPicker.d.ts +20 -0
- package/dist/messages/pl/colorPicker.d.ts.map +1 -0
- package/dist/messages/pl/colorPicker.js +19 -0
- package/dist/messages/pl/componentLabels.d.ts +9 -0
- package/dist/messages/pl/componentLabels.d.ts.map +1 -0
- package/dist/messages/pl/componentLabels.js +308 -0
- package/dist/messages/pl/diagnostics.d.ts +39 -0
- package/dist/messages/pl/diagnostics.d.ts.map +1 -0
- package/dist/messages/pl/diagnostics.js +38 -0
- package/dist/messages/pl/dialogs/common.d.ts +6 -0
- package/dist/messages/pl/dialogs/common.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/common.js +5 -0
- package/dist/messages/pl/dialogs/conflict.d.ts +15 -0
- package/dist/messages/pl/dialogs/conflict.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/conflict.js +14 -0
- package/dist/messages/pl/dialogs/delete.d.ts +19 -0
- package/dist/messages/pl/dialogs/delete.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/delete.js +18 -0
- package/dist/messages/pl/dialogs/pageOptions.d.ts +9 -0
- package/dist/messages/pl/dialogs/pageOptions.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/pageOptions.js +8 -0
- package/dist/messages/pl/dialogs/publish.d.ts +15 -0
- package/dist/messages/pl/dialogs/publish.d.ts.map +1 -0
- package/dist/messages/pl/dialogs/publish.js +14 -0
- package/dist/messages/pl/dnd.d.ts +19 -0
- package/dist/messages/pl/dnd.d.ts.map +1 -0
- package/dist/messages/pl/dnd.js +18 -0
- package/dist/messages/pl/editor.d.ts +30 -0
- package/dist/messages/pl/editor.d.ts.map +1 -0
- package/dist/messages/pl/editor.js +29 -0
- package/dist/messages/pl/external.d.ts +6 -0
- package/dist/messages/pl/external.d.ts.map +1 -0
- package/dist/messages/pl/external.js +5 -0
- package/dist/messages/pl/insert.d.ts +25 -0
- package/dist/messages/pl/insert.d.ts.map +1 -0
- package/dist/messages/pl/insert.js +24 -0
- package/dist/messages/pl/inspector.d.ts +176 -0
- package/dist/messages/pl/inspector.d.ts.map +1 -0
- package/dist/messages/pl/inspector.js +175 -0
- package/dist/messages/pl/issues.d.ts +36 -0
- package/dist/messages/pl/issues.d.ts.map +1 -0
- package/dist/messages/pl/issues.js +35 -0
- package/dist/messages/pl/layers.d.ts +29 -0
- package/dist/messages/pl/layers.d.ts.map +1 -0
- package/dist/messages/pl/layers.js +28 -0
- package/dist/messages/pl/leftPanel.d.ts +15 -0
- package/dist/messages/pl/leftPanel.d.ts.map +1 -0
- package/dist/messages/pl/leftPanel.js +14 -0
- package/dist/messages/pl/list.d.ts +9 -0
- package/dist/messages/pl/list.d.ts.map +1 -0
- package/dist/messages/pl/list.js +8 -0
- package/dist/messages/pl/locale.d.ts +4 -0
- package/dist/messages/pl/locale.d.ts.map +1 -0
- package/dist/messages/pl/locale.js +3 -0
- package/dist/messages/pl/media.d.ts +51 -0
- package/dist/messages/pl/media.d.ts.map +1 -0
- package/dist/messages/pl/media.js +50 -0
- package/dist/messages/pl/menu.d.ts +12 -0
- package/dist/messages/pl/menu.d.ts.map +1 -0
- package/dist/messages/pl/menu.js +11 -0
- package/dist/messages/pl/patterns.d.ts +24 -0
- package/dist/messages/pl/patterns.d.ts.map +1 -0
- package/dist/messages/pl/patterns.js +23 -0
- package/dist/messages/pl/preview.d.ts +8 -0
- package/dist/messages/pl/preview.d.ts.map +1 -0
- package/dist/messages/pl/preview.js +7 -0
- package/dist/messages/pl/publish.d.ts +19 -0
- package/dist/messages/pl/publish.d.ts.map +1 -0
- package/dist/messages/pl/publish.js +18 -0
- package/dist/messages/pl/richText.d.ts +21 -0
- package/dist/messages/pl/richText.d.ts.map +1 -0
- package/dist/messages/pl/richText.js +20 -0
- package/dist/messages/pl/sample.d.ts +5 -0
- package/dist/messages/pl/sample.d.ts.map +1 -0
- package/dist/messages/pl/sample.js +4 -0
- package/dist/messages/pl/save.d.ts +15 -0
- package/dist/messages/pl/save.d.ts.map +1 -0
- package/dist/messages/pl/save.js +14 -0
- package/dist/messages/pl/shortcut.d.ts +36 -0
- package/dist/messages/pl/shortcut.d.ts.map +1 -0
- package/dist/messages/pl/shortcut.js +35 -0
- package/dist/messages/pl/statusBar.d.ts +14 -0
- package/dist/messages/pl/statusBar.d.ts.map +1 -0
- package/dist/messages/pl/statusBar.js +13 -0
- package/dist/messages/pl/structure.d.ts +28 -0
- package/dist/messages/pl/structure.d.ts.map +1 -0
- package/dist/messages/pl/structure.js +27 -0
- package/dist/messages/pl/style.d.ts +168 -0
- package/dist/messages/pl/style.d.ts.map +1 -0
- package/dist/messages/pl/style.js +167 -0
- package/dist/messages/pl/styleField.d.ts +301 -0
- package/dist/messages/pl/styleField.d.ts.map +1 -0
- package/dist/messages/pl/styleField.js +300 -0
- package/dist/messages/pl/styleOption.d.ts +128 -0
- package/dist/messages/pl/styleOption.d.ts.map +1 -0
- package/dist/messages/pl/styleOption.js +127 -0
- package/dist/messages/pl/styleSection.d.ts +16 -0
- package/dist/messages/pl/styleSection.d.ts.map +1 -0
- package/dist/messages/pl/styleSection.js +15 -0
- package/dist/messages/pl/toast.d.ts +22 -0
- package/dist/messages/pl/toast.d.ts.map +1 -0
- package/dist/messages/pl/toast.js +21 -0
- package/dist/messages/pl/toolbar.d.ts +47 -0
- package/dist/messages/pl/toolbar.d.ts.map +1 -0
- package/dist/messages/pl/toolbar.js +46 -0
- package/dist/messages/pl/translation.d.ts +7 -0
- package/dist/messages/pl/translation.d.ts.map +1 -0
- package/dist/messages/pl/translation.js +6 -0
- package/dist/messages/pl/ui.d.ts +4 -0
- package/dist/messages/pl/ui.d.ts.map +1 -0
- package/dist/messages/pl/ui.js +3 -0
- package/dist/messages/pl/values.d.ts +45 -0
- package/dist/messages/pl/values.d.ts.map +1 -0
- package/dist/messages/pl/values.js +44 -0
- package/dist/messages/pl.d.ts.map +1 -1
- package/dist/messages/pl.js +82 -325
- package/dist/messages/plural.test.d.ts +2 -0
- package/dist/messages/plural.test.d.ts.map +1 -0
- package/dist/messages/plural.test.js +50 -0
- package/dist/panels/breadcrumbs/breadcrumbs.d.ts +1 -1
- package/dist/panels/breadcrumbs/breadcrumbs.d.ts.map +1 -1
- package/dist/panels/breadcrumbs/breadcrumbs.js +10 -3
- package/dist/panels/breadcrumbs/breadcrumbs.test.js +9 -2
- package/dist/panels/index.d.ts +3 -0
- package/dist/panels/index.d.ts.map +1 -1
- package/dist/panels/index.js +1 -0
- package/dist/panels/insert/catalog.d.ts +21 -1
- package/dist/panels/insert/catalog.d.ts.map +1 -1
- package/dist/panels/insert/catalog.js +85 -3
- package/dist/panels/insert/catalog.order.test.js +106 -1
- package/dist/panels/insert/index.d.ts +1 -0
- package/dist/panels/insert/index.d.ts.map +1 -1
- package/dist/panels/insert/insert-panel.d.ts +14 -4
- package/dist/panels/insert/insert-panel.d.ts.map +1 -1
- package/dist/panels/insert/insert-panel.js +128 -69
- package/dist/panels/insert/insert-panel.test.js +278 -37
- package/dist/panels/insert/target.d.ts +5 -1
- package/dist/panels/insert/target.d.ts.map +1 -1
- package/dist/panels/insert/target.js +11 -1
- package/dist/panels/inspector/author-fields.d.ts +21 -0
- package/dist/panels/inspector/author-fields.d.ts.map +1 -0
- package/dist/panels/inspector/author-fields.js +191 -0
- package/dist/panels/inspector/author-fields.test.d.ts +2 -0
- package/dist/panels/inspector/author-fields.test.d.ts.map +1 -0
- package/dist/panels/inspector/author-fields.test.js +237 -0
- package/dist/panels/inspector/controls/external-link.d.ts +24 -0
- package/dist/panels/inspector/controls/external-link.d.ts.map +1 -0
- package/dist/panels/inspector/controls/external-link.js +43 -0
- package/dist/panels/inspector/controls/external-link.test.d.ts +2 -0
- package/dist/panels/inspector/controls/external-link.test.d.ts.map +1 -0
- package/dist/panels/inspector/controls/external-link.test.js +105 -0
- package/dist/panels/inspector/controls/index.d.ts +1 -0
- package/dist/panels/inspector/controls/index.d.ts.map +1 -1
- package/dist/panels/inspector/controls/index.js +1 -0
- package/dist/panels/inspector/controls/media.d.ts +3 -1
- package/dist/panels/inspector/controls/media.d.ts.map +1 -1
- package/dist/panels/inspector/controls/media.js +8 -3
- package/dist/panels/inspector/controls/rich-text.d.ts.map +1 -1
- package/dist/panels/inspector/controls/rich-text.js +36 -6
- package/dist/panels/inspector/controls/textarea.d.ts +7 -2
- package/dist/panels/inspector/controls/textarea.d.ts.map +1 -1
- package/dist/panels/inspector/controls/textarea.js +37 -2
- package/dist/panels/inspector/default-hint.d.ts +13 -0
- package/dist/panels/inspector/default-hint.d.ts.map +1 -0
- package/dist/panels/inspector/default-hint.js +30 -0
- package/dist/panels/inspector/default-hint.test.d.ts +2 -0
- package/dist/panels/inspector/default-hint.test.d.ts.map +1 -0
- package/dist/panels/inspector/default-hint.test.js +46 -0
- package/dist/panels/inspector/index.d.ts +3 -3
- package/dist/panels/inspector/index.d.ts.map +1 -1
- package/dist/panels/inspector/index.js +2 -2
- package/dist/panels/inspector/inspector.d.ts +20 -2
- package/dist/panels/inspector/inspector.d.ts.map +1 -1
- package/dist/panels/inspector/inspector.js +246 -26
- package/dist/panels/inspector/inspector.test.js +276 -11
- package/dist/panels/inspector/props-panel.d.ts +36 -0
- package/dist/panels/inspector/props-panel.d.ts.map +1 -1
- package/dist/panels/inspector/props-panel.js +99 -17
- package/dist/panels/inspector/props-panel.test.d.ts +2 -0
- package/dist/panels/inspector/props-panel.test.d.ts.map +1 -0
- package/dist/panels/inspector/props-panel.test.js +17 -0
- package/dist/panels/inspector/scrub-label.d.ts +14 -0
- package/dist/panels/inspector/scrub-label.d.ts.map +1 -0
- package/dist/panels/inspector/scrub-label.js +75 -0
- package/dist/panels/inspector/scrub-label.test.d.ts +2 -0
- package/dist/panels/inspector/scrub-label.test.d.ts.map +1 -0
- package/dist/panels/inspector/scrub-label.test.js +132 -0
- package/dist/panels/inspector/styles/background-media.d.ts +28 -0
- package/dist/panels/inspector/styles/background-media.d.ts.map +1 -0
- package/dist/panels/inspector/styles/background-media.js +78 -0
- package/dist/panels/inspector/styles/box-model.d.ts +13 -16
- package/dist/panels/inspector/styles/box-model.d.ts.map +1 -1
- package/dist/panels/inspector/styles/box-model.js +10 -25
- package/dist/panels/inspector/styles/color-input.d.ts +3 -0
- package/dist/panels/inspector/styles/color-input.d.ts.map +1 -0
- package/dist/panels/inspector/styles/color-input.js +72 -0
- package/dist/panels/inspector/styles/gradient-fields.d.ts +9 -0
- package/dist/panels/inspector/styles/gradient-fields.d.ts.map +1 -0
- package/dist/panels/inspector/styles/gradient-fields.js +50 -0
- package/dist/panels/inspector/styles/index.d.ts +2 -0
- package/dist/panels/inspector/styles/index.d.ts.map +1 -1
- package/dist/panels/inspector/styles/index.js +2 -0
- package/dist/panels/inspector/styles/model.d.ts +27 -5
- package/dist/panels/inspector/styles/model.d.ts.map +1 -1
- package/dist/panels/inspector/styles/model.js +101 -3
- package/dist/panels/inspector/styles/motion-rows.d.ts +17 -0
- package/dist/panels/inspector/styles/motion-rows.d.ts.map +1 -0
- package/dist/panels/inspector/styles/motion-rows.js +117 -0
- package/dist/panels/inspector/styles/number-input.d.ts +4 -0
- package/dist/panels/inspector/styles/number-input.d.ts.map +1 -0
- package/dist/panels/inspector/styles/number-input.js +12 -0
- package/dist/panels/inspector/styles/option-label.d.ts +7 -0
- package/dist/panels/inspector/styles/option-label.d.ts.map +1 -0
- package/dist/panels/inspector/styles/option-label.js +9 -0
- package/dist/panels/inspector/styles/property-label.d.ts +9 -0
- package/dist/panels/inspector/styles/property-label.d.ts.map +1 -0
- package/dist/panels/inspector/styles/property-label.js +11 -0
- package/dist/panels/inspector/styles/section-state.d.ts +22 -0
- package/dist/panels/inspector/styles/section-state.d.ts.map +1 -0
- package/dist/panels/inspector/styles/section-state.js +96 -0
- package/dist/panels/inspector/styles/section.d.ts +25 -0
- package/dist/panels/inspector/styles/section.d.ts.map +1 -0
- package/dist/panels/inspector/styles/section.js +43 -0
- package/dist/panels/inspector/styles/sections-context.d.ts +13 -0
- package/dist/panels/inspector/styles/sections-context.d.ts.map +1 -0
- package/dist/panels/inspector/styles/sections-context.js +19 -0
- package/dist/panels/inspector/styles/sections-context.test.d.ts +2 -0
- package/dist/panels/inspector/styles/sections-context.test.d.ts.map +1 -0
- package/dist/panels/inspector/styles/sections-context.test.js +18 -0
- package/dist/panels/inspector/styles/sections-toggle.d.ts +6 -0
- package/dist/panels/inspector/styles/sections-toggle.d.ts.map +1 -0
- package/dist/panels/inspector/styles/sections-toggle.js +18 -0
- package/dist/panels/inspector/styles/segments.d.ts +3 -0
- package/dist/panels/inspector/styles/segments.d.ts.map +1 -1
- package/dist/panels/inspector/styles/segments.js +11 -4
- package/dist/panels/inspector/styles/sides-editor.d.ts +1 -1
- package/dist/panels/inspector/styles/sides-editor.d.ts.map +1 -1
- package/dist/panels/inspector/styles/sides-editor.js +33 -4
- package/dist/panels/inspector/styles/style-inspector.d.ts +3 -1
- package/dist/panels/inspector/styles/style-inspector.d.ts.map +1 -1
- package/dist/panels/inspector/styles/style-inspector.js +610 -42
- package/dist/panels/inspector/styles/style-inspector.test.js +694 -14
- package/dist/panels/inspector/styles/token-picker.d.ts +1 -1
- package/dist/panels/inspector/styles/token-picker.d.ts.map +1 -1
- package/dist/panels/inspector/styles/token-picker.js +10 -3
- package/dist/panels/inspector/styles/widgets.d.ts +116 -0
- package/dist/panels/inspector/styles/widgets.d.ts.map +1 -0
- package/dist/panels/inspector/styles/widgets.js +304 -0
- package/dist/panels/inspector/styles/widgets.test.d.ts +2 -0
- package/dist/panels/inspector/styles/widgets.test.d.ts.map +1 -0
- package/dist/panels/inspector/styles/widgets.test.js +247 -0
- package/dist/panels/inspector/values/value-editor.d.ts +1 -1
- package/dist/panels/inspector/values/value-editor.d.ts.map +1 -1
- package/dist/panels/inspector/values/value-editor.js +9 -8
- package/dist/panels/inspector/values/values.test.js +9 -3
- package/dist/panels/issues/collect.d.ts +2 -0
- package/dist/panels/issues/collect.d.ts.map +1 -1
- package/dist/panels/issues/collect.js +1 -0
- package/dist/panels/issues/index.d.ts +1 -0
- package/dist/panels/issues/index.d.ts.map +1 -1
- package/dist/panels/issues/index.js +1 -0
- package/dist/panels/issues/issues-panel.d.ts +4 -3
- package/dist/panels/issues/issues-panel.d.ts.map +1 -1
- package/dist/panels/issues/issues-panel.js +22 -35
- package/dist/panels/issues/path.d.ts +7 -0
- package/dist/panels/issues/path.d.ts.map +1 -0
- package/dist/panels/issues/path.js +21 -0
- package/dist/panels/layers/flatten.d.ts +16 -2
- package/dist/panels/layers/flatten.d.ts.map +1 -1
- package/dist/panels/layers/flatten.js +48 -4
- package/dist/panels/layers/layers-panel.d.ts +5 -2
- package/dist/panels/layers/layers-panel.d.ts.map +1 -1
- package/dist/panels/layers/layers-panel.js +177 -35
- package/dist/panels/layers/layers-panel.test.js +173 -15
- package/dist/panels/left-panel.d.ts +17 -0
- package/dist/panels/left-panel.d.ts.map +1 -0
- package/dist/panels/left-panel.js +47 -0
- package/dist/panels/left-panel.test.d.ts +2 -0
- package/dist/panels/left-panel.test.d.ts.map +1 -0
- package/dist/panels/left-panel.test.js +77 -0
- package/dist/persistence/persistence.test.js +9 -3
- package/dist/persistence/react.d.ts.map +1 -1
- package/dist/persistence/react.js +2 -2
- package/dist/preview/preview.d.ts +8 -0
- package/dist/preview/preview.d.ts.map +1 -1
- package/dist/preview/preview.js +21 -1
- package/dist/preview/preview.test.js +18 -1
- package/dist/shortcuts/actions.d.ts +13 -2
- package/dist/shortcuts/actions.d.ts.map +1 -1
- package/dist/shortcuts/actions.js +70 -15
- package/dist/shortcuts/help.d.ts +11 -0
- package/dist/shortcuts/help.d.ts.map +1 -0
- package/dist/shortcuts/help.js +77 -0
- package/dist/shortcuts/index.d.ts +5 -2
- package/dist/shortcuts/index.d.ts.map +1 -1
- package/dist/shortcuts/index.js +3 -1
- package/dist/shortcuts/map.d.ts +1 -1
- package/dist/shortcuts/map.d.ts.map +1 -1
- package/dist/shortcuts/map.js +14 -8
- package/dist/shortcuts/navigation.d.ts +13 -0
- package/dist/shortcuts/navigation.d.ts.map +1 -0
- package/dist/shortcuts/navigation.js +48 -0
- package/dist/shortcuts/shortcuts.d.ts +12 -1
- package/dist/shortcuts/shortcuts.d.ts.map +1 -1
- package/dist/shortcuts/shortcuts.js +61 -14
- package/dist/shortcuts/shortcuts.test.js +206 -5
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/create-store.js +19 -1
- package/dist/store/index.d.ts +4 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/index.js +3 -1
- package/dist/store/react.d.ts +4 -0
- package/dist/store/react.d.ts.map +1 -1
- package/dist/store/react.js +7 -0
- package/dist/store/store.test.js +24 -0
- package/dist/store/structure-lock.d.ts +16 -0
- package/dist/store/structure-lock.d.ts.map +1 -0
- package/dist/store/structure-lock.js +43 -0
- package/dist/store/structure-lock.test.d.ts +2 -0
- package/dist/store/structure-lock.test.d.ts.map +1 -0
- package/dist/store/structure-lock.test.js +49 -0
- package/dist/store/types.d.ts +9 -0
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/view.d.ts +20 -0
- package/dist/store/view.d.ts.map +1 -0
- package/dist/store/view.js +17 -0
- package/dist/store/view.test.d.ts +2 -0
- package/dist/store/view.test.d.ts.map +1 -0
- package/dist/store/view.test.js +103 -0
- package/dist/styles/tokens.test.js +88 -9
- package/dist/styles.css +4112 -586
- package/dist/toolbar/brand.d.ts +2 -2
- package/dist/toolbar/brand.d.ts.map +1 -1
- package/dist/toolbar/brand.js +4 -4
- package/dist/toolbar/breakpoint-control.d.ts +4 -0
- package/dist/toolbar/breakpoint-control.d.ts.map +1 -1
- package/dist/toolbar/breakpoint-control.js +11 -4
- package/dist/toolbar/editable-title.d.ts +4 -1
- package/dist/toolbar/editable-title.d.ts.map +1 -1
- package/dist/toolbar/editable-title.js +2 -2
- package/dist/toolbar/editable-title.test.js +10 -0
- package/dist/toolbar/locale-chip.d.ts +10 -0
- package/dist/toolbar/locale-chip.d.ts.map +1 -0
- package/dist/toolbar/locale-chip.js +27 -0
- package/dist/toolbar/locale-switcher.d.ts.map +1 -1
- package/dist/toolbar/locale-switcher.js +4 -1
- package/dist/toolbar/more-menu.d.ts +26 -4
- package/dist/toolbar/more-menu.d.ts.map +1 -1
- package/dist/toolbar/more-menu.js +60 -13
- package/dist/toolbar/page-chip.d.ts +10 -0
- package/dist/toolbar/page-chip.d.ts.map +1 -0
- package/dist/toolbar/page-chip.js +12 -0
- package/dist/toolbar/page-options-dialog.d.ts +16 -0
- package/dist/toolbar/page-options-dialog.d.ts.map +1 -0
- package/dist/toolbar/page-options-dialog.js +13 -0
- package/dist/toolbar/panel-toggles.d.ts +3 -2
- package/dist/toolbar/panel-toggles.d.ts.map +1 -1
- package/dist/toolbar/panel-toggles.js +9 -4
- package/dist/toolbar/publish-dialog.d.ts +3 -0
- package/dist/toolbar/publish-dialog.d.ts.map +1 -1
- package/dist/toolbar/publish-dialog.js +34 -7
- package/dist/toolbar/publish.test.js +63 -19
- package/dist/toolbar/safe-history.d.ts +3 -0
- package/dist/toolbar/safe-history.d.ts.map +1 -0
- package/dist/toolbar/safe-history.js +5 -0
- package/dist/toolbar/sample-picker.d.ts +24 -4
- package/dist/toolbar/sample-picker.d.ts.map +1 -1
- package/dist/toolbar/sample-picker.js +42 -18
- package/dist/toolbar/toolbar-centre.d.ts +3 -11
- package/dist/toolbar/toolbar-centre.d.ts.map +1 -1
- package/dist/toolbar/toolbar-centre.js +4 -5
- package/dist/toolbar/toolbar-left.d.ts +4 -7
- package/dist/toolbar/toolbar-left.d.ts.map +1 -1
- package/dist/toolbar/toolbar-left.js +13 -11
- package/dist/toolbar/toolbar-right.d.ts +21 -6
- package/dist/toolbar/toolbar-right.d.ts.map +1 -1
- package/dist/toolbar/toolbar-right.js +28 -14
- package/dist/toolbar/toolbar.d.ts +23 -17
- package/dist/toolbar/toolbar.d.ts.map +1 -1
- package/dist/toolbar/toolbar.js +28 -11
- package/dist/toolbar/toolbar.test.js +238 -23
- package/dist/toolbar/use-overflow-level.d.ts +2 -1
- package/dist/toolbar/use-overflow-level.d.ts.map +1 -1
- package/dist/toolbar/use-overflow-level.js +9 -3
- package/dist/toolbar/zoom-menu.d.ts +5 -1
- package/dist/toolbar/zoom-menu.d.ts.map +1 -1
- package/dist/toolbar/zoom-menu.js +3 -2
- package/dist/ui/icon.d.ts +53 -0
- package/dist/ui/icon.d.ts.map +1 -1
- package/dist/ui/icon.js +58 -1
- package/dist/ui/icon.test.js +101 -3
- package/dist/ui/index.d.ts +4 -3
- package/dist/ui/index.d.ts.map +1 -1
- package/dist/ui/index.js +3 -2
- package/dist/ui/primitives.d.ts +97 -14
- package/dist/ui/primitives.d.ts.map +1 -1
- package/dist/ui/primitives.js +108 -22
- package/dist/ui/primitives.test.js +204 -3
- package/dist/ui/structure-locked.d.ts +9 -0
- package/dist/ui/structure-locked.d.ts.map +1 -0
- package/dist/ui/structure-locked.js +28 -0
- package/dist/ui/toast.d.ts +3 -1
- package/dist/ui/toast.d.ts.map +1 -1
- package/dist/ui/toast.js +21 -5
- package/dist/ui/toast.test.js +34 -0
- package/package.json +5 -4
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
3
|
+
import { useT } from '../../messages/index.js';
|
|
4
|
+
import { useEditor } from '../../store/index.js';
|
|
5
|
+
import { stepNumberText } from '../../ui/primitives.js';
|
|
6
|
+
/** Clamp and quantize to the field's step, preserving its unit and rejecting non-finite input. */
|
|
7
|
+
function scrubValue(text, delta, step, min, max) {
|
|
8
|
+
const match = /^(-?(?:\d+\.?\d*|\.\d+))([a-z%]*)$/.exec(text);
|
|
9
|
+
if (match === null || !Number.isFinite(step) || step <= 0)
|
|
10
|
+
return undefined;
|
|
11
|
+
const start = Number(match[1]);
|
|
12
|
+
const raw = start + delta;
|
|
13
|
+
if (!Number.isFinite(raw))
|
|
14
|
+
return undefined;
|
|
15
|
+
const lower = min !== undefined && Number.isFinite(min) ? min : -Infinity;
|
|
16
|
+
const upper = max !== undefined && Number.isFinite(max) ? max : Infinity;
|
|
17
|
+
const origin = Number.isFinite(lower) ? lower : 0;
|
|
18
|
+
const quantized = origin + Math.round((raw - origin) / step) * step;
|
|
19
|
+
const next = Math.min(upper, Math.max(lower, Number(quantized.toPrecision(12))));
|
|
20
|
+
return Number.isFinite(next) ? `${Object.is(next, -0) ? 0 : next}${match[2]}` : undefined;
|
|
21
|
+
}
|
|
22
|
+
/** Pointer scrubbing supplements keyboard controls and records the entire gesture as one undo step. */
|
|
23
|
+
export function ScrubLabel(props) {
|
|
24
|
+
const t = useT();
|
|
25
|
+
const store = useEditor();
|
|
26
|
+
const drag = useRef(null);
|
|
27
|
+
const finish = useCallback(() => {
|
|
28
|
+
if (drag.current === null)
|
|
29
|
+
return;
|
|
30
|
+
drag.current = null;
|
|
31
|
+
store.history.commit();
|
|
32
|
+
// Only history metadata changes here; document writes always go through the caller's commands.
|
|
33
|
+
store.setState({
|
|
34
|
+
inTransaction: store.history.inTransaction,
|
|
35
|
+
canUndo: store.history.canUndo,
|
|
36
|
+
canRedo: store.history.canRedo,
|
|
37
|
+
cursorId: store.history.cursorId,
|
|
38
|
+
undoLabel: store.history.past.at(-1)?.label,
|
|
39
|
+
redoLabel: store.history.future.at(-1)?.label,
|
|
40
|
+
});
|
|
41
|
+
}, [store]);
|
|
42
|
+
useEffect(() => finish, [finish]);
|
|
43
|
+
return (_jsx("label", { htmlFor: props.htmlFor, className: "bd-field-label bd-scrub-label", title: props.disabled ? undefined : t('inspector.scrub'), "data-disabled": props.disabled, onPointerDown: (event) => {
|
|
44
|
+
if (props.disabled ||
|
|
45
|
+
store.getState().readOnly ||
|
|
46
|
+
event.button !== 0 ||
|
|
47
|
+
drag.current !== null)
|
|
48
|
+
return;
|
|
49
|
+
const value = stepNumberText(props.value, 0, props.unit ?? '');
|
|
50
|
+
if (value === undefined ||
|
|
51
|
+
scrubValue(value, 0, props.step ?? 1, props.min, props.max) === undefined)
|
|
52
|
+
return;
|
|
53
|
+
if (!store.history.begin(t('inspector.scrub')).ok)
|
|
54
|
+
return;
|
|
55
|
+
drag.current = { x: event.clientX, value, last: value };
|
|
56
|
+
store.setState({ inTransaction: true, canUndo: false, canRedo: false });
|
|
57
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
58
|
+
}, onPointerMove: (event) => {
|
|
59
|
+
const start = drag.current;
|
|
60
|
+
if (start === null || props.disabled)
|
|
61
|
+
return;
|
|
62
|
+
const delta = Math.trunc((event.clientX - start.x) / 3);
|
|
63
|
+
const step = props.step ?? 1;
|
|
64
|
+
const next = scrubValue(start.value, delta * step * (event.shiftKey ? 10 : event.altKey ? 0.1 : 1), step, props.min, props.max);
|
|
65
|
+
if (next !== undefined && next !== start.last) {
|
|
66
|
+
start.last = next;
|
|
67
|
+
props.onValueChange(next);
|
|
68
|
+
}
|
|
69
|
+
}, onPointerUp: (event) => {
|
|
70
|
+
finish();
|
|
71
|
+
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
72
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
73
|
+
}
|
|
74
|
+
}, onPointerCancel: finish, onLostPointerCapture: finish, children: props.children }));
|
|
75
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scrub-label.test.d.ts","sourceRoot":"","sources":["../../../src/panels/inspector/scrub-label.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
// @vitest-environment jsdom
|
|
3
|
+
import { createRegistryMeta, p } from '@next-buildr/core';
|
|
4
|
+
import { act } from 'react';
|
|
5
|
+
import { createRoot } from 'react-dom/client';
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
7
|
+
import { createEditorStore, EditorStoreProvider, useEditorState } from '../../store/index.js';
|
|
8
|
+
import { ScrubLabel } from './scrub-label.js';
|
|
9
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
10
|
+
let container;
|
|
11
|
+
let root;
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
container = document.createElement('div');
|
|
14
|
+
document.body.append(container);
|
|
15
|
+
root = createRoot(container);
|
|
16
|
+
Element.prototype.setPointerCapture ??= () => { };
|
|
17
|
+
Element.prototype.hasPointerCapture ??= () => false;
|
|
18
|
+
});
|
|
19
|
+
afterEach(() => {
|
|
20
|
+
act(() => root.unmount());
|
|
21
|
+
container.remove();
|
|
22
|
+
});
|
|
23
|
+
async function mount(step = 1, initial = '5') {
|
|
24
|
+
let time = 0;
|
|
25
|
+
const store = createEditorStore({
|
|
26
|
+
doc: {
|
|
27
|
+
schemaVersion: 1,
|
|
28
|
+
root: 'root',
|
|
29
|
+
nodes: { root: { id: 'root', type: 'test/number' } },
|
|
30
|
+
components: {},
|
|
31
|
+
},
|
|
32
|
+
registry: createRegistryMeta({
|
|
33
|
+
components: [
|
|
34
|
+
{
|
|
35
|
+
type: 'test/number',
|
|
36
|
+
version: 1,
|
|
37
|
+
label: 'Number',
|
|
38
|
+
category: 'content',
|
|
39
|
+
contentCategories: ['flow'],
|
|
40
|
+
props: { count: p.number({ default: 5 }) },
|
|
41
|
+
styles: { groups: [] },
|
|
42
|
+
runtime: 'shared',
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
}),
|
|
46
|
+
validationDelayMs: null,
|
|
47
|
+
history: { clock: () => time },
|
|
48
|
+
});
|
|
49
|
+
const dispatch = vi.spyOn(store, 'dispatch');
|
|
50
|
+
function View() {
|
|
51
|
+
const value = useEditorState((state) => state.doc.nodes['root']?.props?.['count']);
|
|
52
|
+
return (_jsx(ScrubLabel, { htmlFor: "count", value: value?.kind === 'static' ? String(value.value) : initial, step: step, min: 0, max: 10, disabled: false, onValueChange: (text) => {
|
|
53
|
+
store.dispatch({
|
|
54
|
+
type: 'node.setProp',
|
|
55
|
+
payload: { id: 'root', prop: 'count', value: { kind: 'static', value: Number(text) } },
|
|
56
|
+
});
|
|
57
|
+
}, children: "Count" }));
|
|
58
|
+
}
|
|
59
|
+
await act(async () => root.render(_jsx(EditorStoreProvider, { store: store, children: _jsx(View, {}) })));
|
|
60
|
+
const pointer = async (type, clientX = 0, modifiers = {}) => {
|
|
61
|
+
time += 1000;
|
|
62
|
+
await act(async () => container
|
|
63
|
+
.querySelector('label')
|
|
64
|
+
?.dispatchEvent(new MouseEvent(type, { bubbles: true, button: 0, clientX, ...modifiers })));
|
|
65
|
+
};
|
|
66
|
+
const value = () => store.getState().doc.nodes['root']?.props?.['count'];
|
|
67
|
+
return { store, dispatch, pointer, value };
|
|
68
|
+
}
|
|
69
|
+
describe('ScrubLabel', () => {
|
|
70
|
+
it('clamps both limits and respects the allowed step with Alt and Shift', async () => {
|
|
71
|
+
const { pointer, value, dispatch } = await mount();
|
|
72
|
+
await pointer('pointerdown');
|
|
73
|
+
await pointer('pointermove', 9, { altKey: true });
|
|
74
|
+
expect(dispatch).not.toHaveBeenCalled();
|
|
75
|
+
await pointer('pointermove', 30, { altKey: true });
|
|
76
|
+
expect(value()).toEqual({ kind: 'static', value: 6 });
|
|
77
|
+
await pointer('pointermove', 300);
|
|
78
|
+
expect(value()).toEqual({ kind: 'static', value: 10 });
|
|
79
|
+
await pointer('pointermove', -300, { shiftKey: true });
|
|
80
|
+
expect(value()).toEqual({ kind: 'static', value: 0 });
|
|
81
|
+
await pointer('pointerup');
|
|
82
|
+
});
|
|
83
|
+
it('rounds fractional steps without floating point artifacts and rejects NaN', async () => {
|
|
84
|
+
const { pointer, value } = await mount(0.1, '0.2');
|
|
85
|
+
await pointer('pointerdown');
|
|
86
|
+
await pointer('pointermove', 3);
|
|
87
|
+
expect(value()).toEqual({ kind: 'static', value: 0.3 });
|
|
88
|
+
await pointer('pointermove', 9, { altKey: true });
|
|
89
|
+
expect(value()).toEqual({ kind: 'static', value: 0.2 });
|
|
90
|
+
await pointer('pointerup');
|
|
91
|
+
const invalid = await mount(1, 'NaN');
|
|
92
|
+
await invalid.pointer('pointerdown');
|
|
93
|
+
await invalid.pointer('pointermove', 30);
|
|
94
|
+
expect(invalid.dispatch).not.toHaveBeenCalled();
|
|
95
|
+
expect(invalid.store.history.inTransaction).toBe(false);
|
|
96
|
+
});
|
|
97
|
+
it('groups a slow gesture into exactly one undo step and keeps separate gestures separate', async () => {
|
|
98
|
+
const { store, pointer, value, dispatch } = await mount();
|
|
99
|
+
const before = store.getState().doc;
|
|
100
|
+
await pointer('pointerdown');
|
|
101
|
+
await pointer('pointermove', 3);
|
|
102
|
+
await pointer('pointermove', 6);
|
|
103
|
+
await pointer('pointermove', 9);
|
|
104
|
+
await pointer('pointerup');
|
|
105
|
+
expect(dispatch).toHaveBeenCalledTimes(3);
|
|
106
|
+
expect(store.history.past).toHaveLength(1);
|
|
107
|
+
expect(store.getState()).toMatchObject({
|
|
108
|
+
inTransaction: false,
|
|
109
|
+
canUndo: true,
|
|
110
|
+
cursorId: store.history.cursorId,
|
|
111
|
+
});
|
|
112
|
+
await act(async () => {
|
|
113
|
+
store.undo();
|
|
114
|
+
});
|
|
115
|
+
expect(store.getState().doc).toEqual(before);
|
|
116
|
+
await act(async () => {
|
|
117
|
+
store.redo();
|
|
118
|
+
});
|
|
119
|
+
expect(value()).toEqual({ kind: 'static', value: 8 });
|
|
120
|
+
await pointer('pointerdown');
|
|
121
|
+
await pointer('pointermove', 3);
|
|
122
|
+
await pointer('pointercancel');
|
|
123
|
+
expect(store.history.past).toHaveLength(2);
|
|
124
|
+
expect(store.history.inTransaction).toBe(false);
|
|
125
|
+
await pointer('pointerdown');
|
|
126
|
+
await pointer('pointermove', -3);
|
|
127
|
+
await act(async () => root.render(null));
|
|
128
|
+
expect(store.history.inTransaction).toBe(false);
|
|
129
|
+
expect(store.history.past).toHaveLength(3);
|
|
130
|
+
expect(store.getState().inTransaction).toBe(false);
|
|
131
|
+
});
|
|
132
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { ComponentMeta, PageNode } from '@next-buildr/core';
|
|
2
|
+
/** The props that hold the image and the video of a background, and the poster of the video. */
|
|
3
|
+
export declare const BACKGROUND_IMAGE = "backgroundImage";
|
|
4
|
+
export declare const BACKGROUND_VIDEO = "backgroundVideo";
|
|
5
|
+
export declare const BACKGROUND_POSTER = "backgroundPoster";
|
|
6
|
+
/** What a component offers for a media background, found by the shape of its props. */
|
|
7
|
+
export declare function backgroundMediaSupport(meta: ComponentMeta | undefined): {
|
|
8
|
+
readonly image: boolean;
|
|
9
|
+
readonly video: boolean;
|
|
10
|
+
};
|
|
11
|
+
/** The node carries a value for the prop (a link, a library file, a binding or a formula). */
|
|
12
|
+
export declare function hasMedia(node: PageNode, name: string): boolean;
|
|
13
|
+
/** The media a mode does not keep: switching to the mode removes these (one undo step). */
|
|
14
|
+
export declare function mediaToClear(mode: string): readonly string[];
|
|
15
|
+
/**
|
|
16
|
+
* The fields of the Image and Video background modes: the media itself (library picker or an
|
|
17
|
+
* external link behind the ADR-028 warning), the poster of a video, the overlay and how the media
|
|
18
|
+
* fills the box. They are the component's own props, written with the same commands as the
|
|
19
|
+
* Content tab does.
|
|
20
|
+
*/
|
|
21
|
+
export declare function BackgroundMediaFields(props: {
|
|
22
|
+
readonly node: PageNode;
|
|
23
|
+
readonly meta: ComponentMeta;
|
|
24
|
+
readonly mode: 'image' | 'video';
|
|
25
|
+
readonly disabled: boolean;
|
|
26
|
+
readonly onError: (message: string) => void;
|
|
27
|
+
}): import("react").JSX.Element;
|
|
28
|
+
//# sourceMappingURL=background-media.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"background-media.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/background-media.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAkB,MAAM,mBAAmB,CAAC;AAMjF,gGAAgG;AAChG,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAClD,eAAO,MAAM,gBAAgB,oBAAoB,CAAC;AAClD,eAAO,MAAM,iBAAiB,qBAAqB,CAAC;AAcpD,uFAAuF;AACvF,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,GAAG;IACvE,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACzB,CAKA;AAED,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAM9D;AAED,2FAA2F;AAC3F,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAI5D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC3C,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAC7B,QAAQ,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7C,+BAgEA"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useT } from '../../../messages/index.js';
|
|
3
|
+
import { useEditor } from '../../../store/index.js';
|
|
4
|
+
import { Field } from '../props-panel.js';
|
|
5
|
+
import { readProp } from '../value.js';
|
|
6
|
+
/** The props that hold the image and the video of a background, and the poster of the video. */
|
|
7
|
+
export const BACKGROUND_IMAGE = 'backgroundImage';
|
|
8
|
+
export const BACKGROUND_VIDEO = 'backgroundVideo';
|
|
9
|
+
export const BACKGROUND_POSTER = 'backgroundPoster';
|
|
10
|
+
/** Settings shared by both kinds of media, in the order they are shown. */
|
|
11
|
+
const SHARED = [
|
|
12
|
+
'backgroundOverlay',
|
|
13
|
+
'overlayTone',
|
|
14
|
+
'overlayOpacity',
|
|
15
|
+
'backgroundFit',
|
|
16
|
+
'backgroundPosition',
|
|
17
|
+
'backgroundAttachment',
|
|
18
|
+
];
|
|
19
|
+
const isMedia = (def) => def?.kind === 'media';
|
|
20
|
+
/** What a component offers for a media background, found by the shape of its props. */
|
|
21
|
+
export function backgroundMediaSupport(meta) {
|
|
22
|
+
return {
|
|
23
|
+
image: isMedia(meta?.props[BACKGROUND_IMAGE]),
|
|
24
|
+
video: isMedia(meta?.props[BACKGROUND_VIDEO]),
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/** The node carries a value for the prop (a link, a library file, a binding or a formula). */
|
|
28
|
+
export function hasMedia(node, name) {
|
|
29
|
+
if (node.props === undefined || !Object.hasOwn(node.props, name))
|
|
30
|
+
return false;
|
|
31
|
+
const value = node.props[name];
|
|
32
|
+
if (value === undefined)
|
|
33
|
+
return false;
|
|
34
|
+
if (value.kind !== 'static')
|
|
35
|
+
return true;
|
|
36
|
+
return value.value !== null && value.value !== undefined && value.value !== '';
|
|
37
|
+
}
|
|
38
|
+
/** The media a mode does not keep: switching to the mode removes these (one undo step). */
|
|
39
|
+
export function mediaToClear(mode) {
|
|
40
|
+
if (mode === 'image')
|
|
41
|
+
return [BACKGROUND_VIDEO, BACKGROUND_POSTER];
|
|
42
|
+
if (mode === 'video')
|
|
43
|
+
return [BACKGROUND_IMAGE];
|
|
44
|
+
return [BACKGROUND_IMAGE, BACKGROUND_VIDEO, BACKGROUND_POSTER];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* The fields of the Image and Video background modes: the media itself (library picker or an
|
|
48
|
+
* external link behind the ADR-028 warning), the poster of a video, the overlay and how the media
|
|
49
|
+
* fills the box. They are the component's own props, written with the same commands as the
|
|
50
|
+
* Content tab does.
|
|
51
|
+
*/
|
|
52
|
+
export function BackgroundMediaFields(props) {
|
|
53
|
+
const t = useT();
|
|
54
|
+
const store = useEditor();
|
|
55
|
+
const { node, meta, mode } = props;
|
|
56
|
+
const report = (result) => props.onError(result.ok ? '' : (result.error?.message ?? ''));
|
|
57
|
+
const names = [
|
|
58
|
+
...(mode === 'image' ? [BACKGROUND_IMAGE] : [BACKGROUND_VIDEO, BACKGROUND_POSTER]),
|
|
59
|
+
...SHARED,
|
|
60
|
+
].filter((name) => meta.props[name] !== undefined);
|
|
61
|
+
return (_jsxs("div", { className: "bd-props-fields bd-bg-media", "data-mode": mode, children: [names.map((name) => {
|
|
62
|
+
const def = meta.props[name];
|
|
63
|
+
const raw = node.props !== undefined && Object.hasOwn(node.props, name)
|
|
64
|
+
? node.props[name]
|
|
65
|
+
: undefined;
|
|
66
|
+
return (_jsx(Field, { name: name, def: def, reading: readProp(node, name, def, undefined, undefined), raw: raw, disabled: props.disabled, translating: false, nameFor: (text) => text, onChange: (prop, _def, value) => report(store.dispatch({
|
|
67
|
+
type: 'node.setProp',
|
|
68
|
+
payload: { id: node.id, prop, value: { kind: 'static', value } },
|
|
69
|
+
})), onReset: (prop) => report(store.dispatch({ type: 'node.unsetProp', payload: { id: node.id, prop } })), onSetValue: (prop, _def, value) => report(store.dispatch({ type: 'node.setProp', payload: { id: node.id, prop, value } })), onFixed: (prop, fieldDef) => report(store.dispatch({
|
|
70
|
+
type: 'node.setProp',
|
|
71
|
+
payload: {
|
|
72
|
+
id: node.id,
|
|
73
|
+
prop,
|
|
74
|
+
value: { kind: 'static', value: fieldDef.default },
|
|
75
|
+
},
|
|
76
|
+
})) }, name));
|
|
77
|
+
}), _jsx("p", { className: "bd-hint", children: t('style.media.switchHint') })] }));
|
|
78
|
+
}
|
|
@@ -1,20 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
export interface
|
|
4
|
-
readonly
|
|
5
|
-
|
|
6
|
-
readonly label: string;
|
|
7
|
-
readonly effective: EffectiveStyles;
|
|
8
|
-
readonly layer: string;
|
|
9
|
-
readonly disabled: boolean;
|
|
10
|
-
/** Draws the edit field of the chosen side(s); it writes to every side in `sides`. */
|
|
11
|
-
readonly renderEditor: (sides: readonly Side[]) => React.ReactNode;
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/** Where the bars of the two boxes (key colour, label, unit, link) are drawn, above the diagram. */
|
|
3
|
+
export interface BoxBars {
|
|
4
|
+
readonly margin: HTMLElement | null;
|
|
5
|
+
readonly padding: HTMLElement | null;
|
|
12
6
|
}
|
|
7
|
+
/** Present inside a `BoxModel`; the ring editors portal their header into the matching slot. */
|
|
8
|
+
export declare const BoxBarsContext: import("react").Context<BoxBars | undefined>;
|
|
13
9
|
/**
|
|
14
|
-
* The
|
|
15
|
-
*
|
|
16
|
-
*
|
|
10
|
+
* The frame of the margin-and-padding editor: a bar for each box (key colour, name, unit, link
|
|
11
|
+
* toggle), then the nested boxes with the value inputs, then the hint. It owns no value; the ring
|
|
12
|
+
* editors it wraps write through the same commands as any other style field.
|
|
17
13
|
*/
|
|
18
|
-
export declare function BoxModel({
|
|
19
|
-
|
|
14
|
+
export declare function BoxModel({ children }: {
|
|
15
|
+
readonly children: ReactNode;
|
|
16
|
+
}): import("react").JSX.Element;
|
|
20
17
|
//# sourceMappingURL=box-model.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"box-model.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/box-model.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"box-model.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/box-model.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,SAAS,EAAY,MAAM,OAAO,CAAC;AAGhE,oGAAoG;AACpG,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IACpC,QAAQ,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;CACtC;AAED,gGAAgG;AAChG,eAAO,MAAM,cAAc,8CAAgD,CAAC;AAE5E;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;CAAE,+BActE"}
|
|
@@ -1,31 +1,16 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
3
|
-
import { useState } from 'react';
|
|
2
|
+
import { createContext, useState } from 'react';
|
|
4
3
|
import { useT } from '../../../messages/index.js';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
bottom: 'top',
|
|
8
|
-
left: 'right',
|
|
9
|
-
right: 'left',
|
|
10
|
-
};
|
|
11
|
-
const shortOf = (value) => {
|
|
12
|
-
if (value === undefined)
|
|
13
|
-
return '–';
|
|
14
|
-
const text = String(value);
|
|
15
|
-
const token = /^\$[A-Za-z]+\.(.+)$/.exec(text);
|
|
16
|
-
return token?.[1] ?? text.replace(/px$/, '');
|
|
17
|
-
};
|
|
4
|
+
/** Present inside a `BoxModel`; the ring editors portal their header into the matching slot. */
|
|
5
|
+
export const BoxBarsContext = createContext(undefined);
|
|
18
6
|
/**
|
|
19
|
-
* The
|
|
20
|
-
*
|
|
21
|
-
*
|
|
7
|
+
* The frame of the margin-and-padding editor: a bar for each box (key colour, name, unit, link
|
|
8
|
+
* toggle), then the nested boxes with the value inputs, then the hint. It owns no value; the ring
|
|
9
|
+
* editors it wraps write through the same commands as any other style field.
|
|
22
10
|
*/
|
|
23
|
-
export function BoxModel({
|
|
11
|
+
export function BoxModel({ children }) {
|
|
24
12
|
const t = useT();
|
|
25
|
-
const [
|
|
26
|
-
const
|
|
27
|
-
return (_jsxs("
|
|
28
|
-
const current = effective[`${def.group}.${def.name}.${side}`];
|
|
29
|
-
return (_jsx("button", { type: "button", className: "bd-box-side", "data-side": side, "data-source": current === undefined ? 'none' : current.source === layer ? 'set' : 'inherited', "aria-pressed": sides.includes(side), disabled: disabled, "aria-label": `${label} ${t(`style.side.${side}`)}`, onClick: (event) => choose(side, event.altKey), children: shortOf(current?.value) }, side));
|
|
30
|
-
}), _jsx("span", { className: "bd-box-inner", "aria-hidden": "true" })] }), _jsx("p", { className: "bd-field-hint", children: t('style.box.hint') }), _jsx("div", { className: "bd-box-editor", children: renderEditor(sides) }, sides.join())] }));
|
|
13
|
+
const [margin, setMargin] = useState(null);
|
|
14
|
+
const [padding, setPadding] = useState(null);
|
|
15
|
+
return (_jsx(BoxBarsContext.Provider, { value: { margin, padding }, children: _jsxs("fieldset", { className: "bd-boxmodel", "aria-label": t('styleField.spacing.title'), children: [_jsx("div", { className: "bd-boxbar", "data-kind": "margin", ref: setMargin }), _jsx("div", { className: "bd-boxbar", "data-kind": "padding", ref: setPadding }), children, _jsx("p", { className: "bd-hint", children: t('styleField.spacing.hint') })] }) }));
|
|
31
16
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color-input.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/color-input.tsx"],"names":[],"mappings":"AAEA,OAAO,EAEL,KAAK,eAAe,EAKrB,MAAM,sBAAsB,CAAC;AAmB9B,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,KAAK,EACL,QAAQ,EACR,aAAa,EACb,OAAY,GACb,EAAE,eAAe,+BAuHjB"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useId, useState } from 'react';
|
|
3
|
+
import { useT } from '../../../messages/index.js';
|
|
4
|
+
import { Button, ColorSwatch, hexOf, Input, Popover, } from '../../../ui/index.js';
|
|
5
|
+
/** The hue (0-360) of a colour written as `hsl(...)` or `#rrggbb`; 0 for anything else. */
|
|
6
|
+
function hueOf(color) {
|
|
7
|
+
const hsl = /^hsl\(\s*(-?\d+(?:\.\d+)?)/i.exec(color?.trim() ?? '');
|
|
8
|
+
if (hsl?.[1] !== undefined)
|
|
9
|
+
return Math.round(((Number(hsl[1]) % 360) + 360) % 360);
|
|
10
|
+
const hex = hexOf(color);
|
|
11
|
+
if (hex === undefined)
|
|
12
|
+
return 0;
|
|
13
|
+
const [r = 0, g = 0, b = 0] = [1, 3, 5].map((i) => Number.parseInt(hex.slice(i, i + 2), 16) / 255);
|
|
14
|
+
const max = Math.max(r, g, b);
|
|
15
|
+
const delta = max - Math.min(r, g, b);
|
|
16
|
+
if (delta === 0)
|
|
17
|
+
return 0;
|
|
18
|
+
const sector = max === r ? ((g - b) / delta + 6) % 6 : max === g ? (b - r) / delta + 2 : (r - g) / delta + 4;
|
|
19
|
+
return Math.round(sector * 60) % 360;
|
|
20
|
+
}
|
|
21
|
+
export function StyleColorInput({ color, label, disabled, onColorChange, palette = [], }) {
|
|
22
|
+
const t = useT();
|
|
23
|
+
const id = useId();
|
|
24
|
+
const [open, setOpen] = useState(false);
|
|
25
|
+
const [draft, setDraft] = useState();
|
|
26
|
+
// The slider keeps its own position while it is dragged (a grey has no hue to read back).
|
|
27
|
+
const [hue, setHue] = useState();
|
|
28
|
+
const text = draft ?? color ?? '';
|
|
29
|
+
const expanded = color !== undefined && /^#[0-9a-f]{3,4}$/i.test(color)
|
|
30
|
+
? `#${[...color.slice(1)].map((c) => c + c).join('')}`
|
|
31
|
+
: color;
|
|
32
|
+
const hex = hexOf(expanded?.slice(0, 7)) ?? '#000000';
|
|
33
|
+
const alpha = expanded !== undefined && /^#[0-9a-f]{8}$/i.test(expanded)
|
|
34
|
+
? Math.round((Number.parseInt(expanded.slice(7), 16) / 255) * 100)
|
|
35
|
+
: 100;
|
|
36
|
+
const change = (value) => {
|
|
37
|
+
if (disabled === true)
|
|
38
|
+
return;
|
|
39
|
+
if (!value.startsWith('hsl('))
|
|
40
|
+
setHue(undefined);
|
|
41
|
+
onColorChange(value);
|
|
42
|
+
};
|
|
43
|
+
const choose = (value) => {
|
|
44
|
+
setDraft(undefined);
|
|
45
|
+
const chosenHex = hexOf(value);
|
|
46
|
+
const suffix = expanded !== undefined && /^#[0-9a-f]{8}$/i.test(expanded) ? expanded.slice(7) : '';
|
|
47
|
+
change(chosenHex !== undefined && suffix !== '' ? `${chosenHex}${suffix}` : value);
|
|
48
|
+
};
|
|
49
|
+
return (_jsxs(Popover, { open: open, onOpenChange: setOpen, label: label, contentClassName: "bd-color-popover", trigger: _jsx(Button, { className: "bd-color-trigger", "aria-label": label, disabled: disabled === true, children: _jsx(ColorSwatch, { color: color }) }), children: [_jsx("h4", { children: t('style.palette.page') }), _jsx("fieldset", { className: "bd-color-palette", "aria-label": t('style.tokens'), children: palette.map((entry) => (_jsx(Button, { className: "bd-palette-color", "aria-label": `${entry.label}: ${entry.color}`, title: `${entry.label}: ${entry.color}`, "aria-pressed": color === entry.color, disabled: disabled === true, onClick: () => {
|
|
50
|
+
if (entry.value !== undefined) {
|
|
51
|
+
setDraft(undefined);
|
|
52
|
+
change(entry.value);
|
|
53
|
+
}
|
|
54
|
+
else
|
|
55
|
+
choose(entry.color);
|
|
56
|
+
}, children: _jsx(ColorSwatch, { color: entry.color }) }, entry.label))) }), _jsx("h4", { children: t('style.palette.custom') }), _jsx("input", { type: "range", className: "bd-style-hue", min: "0", max: "360", value: hue ?? hueOf(expanded), "aria-label": t('style.palette.hue'), disabled: disabled, onChange: (event) => {
|
|
57
|
+
// One undo step per drag: each write is the same `node.setStyle` property, which coalesces.
|
|
58
|
+
const next = Number(event.target.value);
|
|
59
|
+
setHue(next);
|
|
60
|
+
choose(`hsl(${next} 100% 50%)`);
|
|
61
|
+
} }), _jsxs("label", { className: "bd-color-hex", htmlFor: `${id}-hex`, children: [_jsx("span", { children: t('style.color.hex') }), _jsx(Input, { id: `${id}-hex`, value: text, disabled: disabled === true, spellCheck: false, "aria-invalid": draft !== undefined && !/^#[0-9a-f]{3,4}$|^#[0-9a-f]{6}([0-9a-f]{2})?$/i.test(text), onChange: (event) => {
|
|
62
|
+
const value = event.target.value;
|
|
63
|
+
setDraft(value);
|
|
64
|
+
if (/^#[0-9a-f]{3,4}$|^#[0-9a-f]{6}([0-9a-f]{2})?$/i.test(value))
|
|
65
|
+
change(value);
|
|
66
|
+
}, onBlur: () => setDraft(undefined) })] }), _jsxs("label", { className: "bd-color-opacity", children: [_jsx("span", { children: t('style.color.alpha') }), _jsxs("output", { children: [alpha, "%"] }), _jsx("input", { type: "range", className: "bd-range", min: "0", max: "100", value: alpha, disabled: disabled === true || hexOf(expanded?.slice(0, 7)) === undefined, onChange: (event) => {
|
|
67
|
+
setDraft(undefined);
|
|
68
|
+
change(`${hex}${Math.round((Number(event.target.value) / 100) * 255)
|
|
69
|
+
.toString(16)
|
|
70
|
+
.padStart(2, '0')}`);
|
|
71
|
+
} })] }), _jsx(Button, { onClick: () => setOpen(false), children: t('style.palette.done') })] }));
|
|
72
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { type Theme } from '@next-buildr/core';
|
|
2
|
+
/** The template's two-stop editor. More complex existing gradients retain their text editor. */
|
|
3
|
+
export declare function GradientFields(props: {
|
|
4
|
+
readonly value: string;
|
|
5
|
+
readonly theme: Theme;
|
|
6
|
+
readonly disabled: boolean;
|
|
7
|
+
readonly onChange: (value: string) => void;
|
|
8
|
+
}): import("react").JSX.Element | null;
|
|
9
|
+
//# sourceMappingURL=gradient-fields.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gradient-fields.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/gradient-fields.tsx"],"names":[],"mappings":"AAYA,OAAO,EAAmB,KAAK,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAUhE,gGAAgG;AAChG,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5C,sCAoHA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
const STYLE_POSITIONS = [
|
|
3
|
+
'center',
|
|
4
|
+
'top',
|
|
5
|
+
'bottom',
|
|
6
|
+
'left',
|
|
7
|
+
'right',
|
|
8
|
+
'top left',
|
|
9
|
+
'top right',
|
|
10
|
+
'bottom left',
|
|
11
|
+
'bottom right',
|
|
12
|
+
];
|
|
13
|
+
import { resolveTokenRef } from '@next-buildr/core';
|
|
14
|
+
import { useT } from '../../../messages/index.js';
|
|
15
|
+
import { StyleColorInput as ColorInput } from './color-input.js';
|
|
16
|
+
import { NumberUnitInput } from './number-input.js';
|
|
17
|
+
import { optionLabel } from './option-label.js';
|
|
18
|
+
import { RangeSlider } from './widgets.js';
|
|
19
|
+
const SIMPLE_GRADIENT = /^linear-gradient\((-?\d+(?:\.\d+)?deg),\s*(#[0-9a-f]{3,8}|\$color\.[a-z0-9-]+)(?: 0%)?,\s*(#[0-9a-f]{3,8}|\$color\.[a-z0-9-]+)(?: 100%)?\)$/i;
|
|
20
|
+
/** The template's two-stop editor. More complex existing gradients retain their text editor. */
|
|
21
|
+
export function GradientFields(props) {
|
|
22
|
+
const t = useT();
|
|
23
|
+
const radial = /^radial-gradient\((circle|ellipse) at ([a-z ]+),\s*(#[0-9a-f]{3,8}|\$color\.[a-z0-9-]+)(?: 0%)?,\s*(#[0-9a-f]{3,8}|\$color\.[a-z0-9-]+)(?: 100%)?\)$/i.exec(props.value);
|
|
24
|
+
const match = SIMPLE_GRADIENT.exec(props.value);
|
|
25
|
+
const names = Object.keys(props.theme.tokens.color);
|
|
26
|
+
if (match === null && radial === null && props.value !== '' && props.value !== 'none')
|
|
27
|
+
return null;
|
|
28
|
+
if (names.length === 0)
|
|
29
|
+
return null;
|
|
30
|
+
const angle = match?.[1]?.slice(0, -3) ?? '180';
|
|
31
|
+
const start = radial?.[3] ?? match?.[2] ?? `$color.${names[0]}`;
|
|
32
|
+
const end = radial?.[4] ?? match?.[3] ?? `$color.${names[1] ?? names[0]}`;
|
|
33
|
+
const resolve = (value) => {
|
|
34
|
+
if (!value.startsWith('$'))
|
|
35
|
+
return value;
|
|
36
|
+
const token = resolveTokenRef(props.theme, value);
|
|
37
|
+
return token.ok ? token.value.value : undefined;
|
|
38
|
+
};
|
|
39
|
+
const palette = Object.entries(props.theme.tokens.color).map(([label, color]) => ({
|
|
40
|
+
label,
|
|
41
|
+
color,
|
|
42
|
+
value: `$color.${label}`,
|
|
43
|
+
}));
|
|
44
|
+
const write = (a, b, degrees) => props.onChange(radial
|
|
45
|
+
? `radial-gradient(${radial[1]} at ${radial[2]}, ${a}, ${b})`
|
|
46
|
+
: `linear-gradient(${degrees}deg, ${a}, ${b})`);
|
|
47
|
+
return (_jsxs("div", { className: "bd-gradient-fields", children: [_jsxs("label", { children: [t('styleField.bg.gradientKind'), _jsxs("select", { className: "bd-input", disabled: props.disabled, value: radial ? 'radial' : 'linear', onChange: (event) => props.onChange(event.target.value === 'radial'
|
|
48
|
+
? `radial-gradient(ellipse at center, ${start}, ${end})`
|
|
49
|
+
: `linear-gradient(${angle}deg, ${start}, ${end})`), children: [_jsx("option", { value: "linear", children: t('styleField.bg.linear') }), _jsx("option", { value: "radial", children: t('styleField.bg.radial') })] })] }), radial ? (_jsxs("label", { children: [t('styleField.bg.position'), _jsx("select", { className: "bd-input", value: radial[2], disabled: props.disabled, onChange: (event) => props.onChange(`radial-gradient(${radial[1]} at ${event.target.value}, ${start}, ${end})`), children: STYLE_POSITIONS.map((position) => (_jsx("option", { value: position, children: optionLabel(position, t) }, position))) })] })) : null, _jsxs("div", { className: "bd-gradient-stop", children: [_jsx("span", { children: t('style.gradient.start') }), _jsx(ColorInput, { label: t('style.gradient.start'), color: resolve(start), palette: palette, disabled: props.disabled, onColorChange: (color) => write(color, end, angle) })] }), _jsxs("div", { className: "bd-gradient-stop", children: [_jsx("span", { children: t('style.gradient.end') }), _jsx(ColorInput, { label: t('style.gradient.end'), color: resolve(end), palette: palette, disabled: props.disabled, onColorChange: (color) => write(start, color, angle) })] }), !radial ? (_jsxs("div", { className: "bd-gradient-angle", children: [_jsx("span", { children: t('style.gradient.angle') }), _jsx(NumberUnitInput, { value: angle, units: [], unitLabel: t('style.unit'), ariaLabel: t('style.gradient.angle'), disabled: props.disabled, onValueChange: (value) => write(start, end, value) }), _jsx(RangeSlider, { label: `${t('style.gradient.angle')}: ${t('style.slider')}`, min: -360, max: 360, step: 1, value: Number(angle) || 0, unit: "\u00B0", disabled: props.disabled, onChange: (value) => write(start, end, value) })] })) : null] }));
|
|
50
|
+
}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export type { StyleInput } from './model.ts';
|
|
2
2
|
export { checkStyleInput, layerFor } from './model.ts';
|
|
3
|
+
export { StyleSectionsProvider } from './sections-context.tsx';
|
|
4
|
+
export { SectionsToggle } from './sections-toggle.tsx';
|
|
3
5
|
export type { StyleInspectorProps } from './style-inspector.tsx';
|
|
4
6
|
export { StyleInspector } from './style-inspector.tsx';
|
|
5
7
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/styles/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,YAAY,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|