@next-buildr/editor 0.0.0-stage → 2.0.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/LICENSE +21 -0
- 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 +66 -3
- package/README.md +0 -3
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { createContext, useContext, useMemo } from 'react';
|
|
3
|
+
const NONE = { schema: undefined, context: undefined };
|
|
4
|
+
const DataCtx = createContext(NONE);
|
|
5
|
+
/** What the value editors of the inspector know about the data: its schema and a sample of it. */
|
|
6
|
+
export function InspectorDataProvider({ schema, context, children }) {
|
|
7
|
+
const value = useMemo(() => ({ schema, context }), [schema, context]);
|
|
8
|
+
return _jsx(DataCtx.Provider, { value: value, children: children });
|
|
9
|
+
}
|
|
10
|
+
export const useInspectorData = () => useContext(DataCtx);
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Says that what is edited depends on the language (docs/i18n.md#model-shared-structure-localized-content):
|
|
3
|
+
* texts belong to the current one, structure and style to all of them. Nothing in the default language.
|
|
4
|
+
*/
|
|
5
|
+
export declare function TranslationBanner(props: {
|
|
6
|
+
readonly locale: string | undefined;
|
|
7
|
+
readonly defaultLocale: string | undefined;
|
|
8
|
+
}): import("react").JSX.Element | null;
|
|
9
|
+
/**
|
|
10
|
+
* Under a translatable field in another language: while the field is untranslated it says the
|
|
11
|
+
* default-language text is shown (the control is greyed) and offers to start a translation from
|
|
12
|
+
* it; once translated the field's own button removes the translation again.
|
|
13
|
+
*/
|
|
14
|
+
export declare function TranslationHint(props: {
|
|
15
|
+
readonly translated: boolean;
|
|
16
|
+
readonly disabled: boolean;
|
|
17
|
+
readonly label: string;
|
|
18
|
+
readonly onTranslate: () => void;
|
|
19
|
+
}): import("react").JSX.Element | null;
|
|
20
|
+
//# sourceMappingURL=translation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"translation.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/values/translation.tsx"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C,sCASA;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE;IACrC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,MAAM,IAAI,CAAC;CAClC,sCAgBA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useT } from '../../../messages/index.js';
|
|
3
|
+
import { Button } from '../../../ui/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Says that what is edited depends on the language (docs/i18n.md#model-shared-structure-localized-content):
|
|
6
|
+
* texts belong to the current one, structure and style to all of them. Nothing in the default language.
|
|
7
|
+
*/
|
|
8
|
+
export function TranslationBanner(props) {
|
|
9
|
+
const t = useT();
|
|
10
|
+
const { locale, defaultLocale } = props;
|
|
11
|
+
if (locale === undefined || locale === defaultLocale)
|
|
12
|
+
return null;
|
|
13
|
+
return (_jsx("p", { className: "bd-translation-banner", role: "note", "data-locale": locale, children: t('translation.banner') }));
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Under a translatable field in another language: while the field is untranslated it says the
|
|
17
|
+
* default-language text is shown (the control is greyed) and offers to start a translation from
|
|
18
|
+
* it; once translated the field's own button removes the translation again.
|
|
19
|
+
*/
|
|
20
|
+
export function TranslationHint(props) {
|
|
21
|
+
const t = useT();
|
|
22
|
+
if (props.translated)
|
|
23
|
+
return null;
|
|
24
|
+
return (_jsxs("div", { className: "bd-translation-hint", children: [_jsx("p", { className: "bd-field-hint", children: t('translation.showingDefault') }), _jsx(Button, { variant: "ghost", disabled: props.disabled, "aria-label": `${t('translation.translate')}: ${props.label}`, onClick: props.onTranslate, children: t('translation.translate') })] }));
|
|
25
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type PropDef, type Value } from '@next-buildr/core';
|
|
2
|
+
import { type ReactNode } from 'react';
|
|
3
|
+
export interface ValueEditorProps {
|
|
4
|
+
readonly def: PropDef;
|
|
5
|
+
readonly label: string;
|
|
6
|
+
/** The node's own value for the prop (`undefined` while it still shows the default). */
|
|
7
|
+
readonly raw: Value | undefined;
|
|
8
|
+
readonly disabled: boolean;
|
|
9
|
+
/** The control for a fixed value; shown in the "Fixed" mode. */
|
|
10
|
+
readonly staticControl: ReactNode;
|
|
11
|
+
/** Writes a binding or a formula. */
|
|
12
|
+
readonly onSet: (value: Value) => void;
|
|
13
|
+
/** Back to a fixed value: the prop shows its default again. */
|
|
14
|
+
readonly onFixed: () => void;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* The switch between a fixed value, a field of the data and a formula
|
|
18
|
+
* (docs/editor.md#value-modes-and-the-binding-picker-pb-081), and the editor of the chosen mode. A
|
|
19
|
+
* prop that takes no bindings (`accepts` is empty) has no switch. A mode the prop is switched to
|
|
20
|
+
* but has no value in yet (no field picked, no valid formula) is only shown, not written: nothing
|
|
21
|
+
* invalid reaches the document.
|
|
22
|
+
*/
|
|
23
|
+
export declare function ValueEditor({ def, label, raw, disabled, staticControl, onSet, onFixed, }: ValueEditorProps): import("react").JSX.Element;
|
|
24
|
+
export interface ValueChipProps {
|
|
25
|
+
readonly def: PropDef;
|
|
26
|
+
readonly value: Value;
|
|
27
|
+
}
|
|
28
|
+
/** What a bound or formula prop shows where a control would be: the path or the formula, red when it is wrong. */
|
|
29
|
+
export declare function ValueChip({ def, value }: ValueChipProps): import("react").JSX.Element | null;
|
|
30
|
+
//# sourceMappingURL=value-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"value-editor.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/values/value-editor.tsx"],"names":[],"mappings":"AAAA,OAAO,EAOL,KAAK,OAAO,EAEZ,KAAK,KAAK,EACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,KAAK,SAAS,EAAuC,MAAM,OAAO,CAAC;AAsC5E,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,wFAAwF;IACxF,QAAQ,CAAC,GAAG,EAAE,KAAK,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,gEAAgE;IAChE,QAAQ,CAAC,aAAa,EAAE,SAAS,CAAC;IAClC,qCAAqC;IACrC,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACvC,+DAA+D;IAC/D,QAAQ,CAAC,OAAO,EAAE,MAAM,IAAI,CAAC;CAC9B;AAKD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,EAC1B,GAAG,EACH,KAAK,EACL,GAAG,EACH,QAAQ,EACR,aAAa,EACb,KAAK,EACL,OAAO,GACR,EAAE,gBAAgB,+BAiElB;AAID,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;CACvB;AAED,kHAAkH;AAClH,wBAAgB,SAAS,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,cAAc,sCAevD"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { bind, expr, schemaAtPath, } from '@next-buildr/core';
|
|
3
|
+
import { useEffect, useId, useMemo, useState } from 'react';
|
|
4
|
+
import { useT } from '../../../messages/index.js';
|
|
5
|
+
import { Icon, Input, SegmentedControl, Select } from '../../../ui/index.js';
|
|
6
|
+
import { bindingOptions, checkBinding, checkFormula, defaultFormat, formatKindsFor, previewValue, spanOf, } from './analyze.js';
|
|
7
|
+
import { useInspectorData } from './data.js';
|
|
8
|
+
/** How many fields the picker lists at once; a long list is narrowed with the search. */
|
|
9
|
+
const MAX_LISTED = 100;
|
|
10
|
+
/** The icon of each data type in the field list. */
|
|
11
|
+
const TYPE_ICON = {
|
|
12
|
+
string: 'type',
|
|
13
|
+
number: 'hash',
|
|
14
|
+
boolean: 'toggle-left',
|
|
15
|
+
date: 'calendar',
|
|
16
|
+
url: 'link',
|
|
17
|
+
richText: 'text-align-start',
|
|
18
|
+
media: 'image',
|
|
19
|
+
link: 'link',
|
|
20
|
+
enum: 'list',
|
|
21
|
+
object: 'braces',
|
|
22
|
+
list: 'list',
|
|
23
|
+
ref: 'database',
|
|
24
|
+
};
|
|
25
|
+
const modeOf = (raw) => raw?.kind === 'binding' ? 'binding' : raw?.kind === 'expression' ? 'expression' : 'static';
|
|
26
|
+
/**
|
|
27
|
+
* The switch between a fixed value, a field of the data and a formula
|
|
28
|
+
* (docs/editor.md#value-modes-and-the-binding-picker-pb-081), and the editor of the chosen mode. A
|
|
29
|
+
* prop that takes no bindings (`accepts` is empty) has no switch. A mode the prop is switched to
|
|
30
|
+
* but has no value in yet (no field picked, no valid formula) is only shown, not written: nothing
|
|
31
|
+
* invalid reaches the document.
|
|
32
|
+
*/
|
|
33
|
+
export function ValueEditor({ def, label, raw, disabled, staticControl, onSet, onFixed, }) {
|
|
34
|
+
const t = useT();
|
|
35
|
+
const [pending, setPending] = useState(null);
|
|
36
|
+
const saved = modeOf(raw);
|
|
37
|
+
const mode = saved === 'static' && pending !== null ? pending : saved;
|
|
38
|
+
const canBind = def.accepts.length > 0;
|
|
39
|
+
if (!canBind) {
|
|
40
|
+
return raw !== undefined && raw.kind !== 'static' ? (_jsx(ValueChip, { def: def, value: raw })) : (_jsx(_Fragment, { children: staticControl }));
|
|
41
|
+
}
|
|
42
|
+
const choose = (next) => {
|
|
43
|
+
if (next === mode)
|
|
44
|
+
return;
|
|
45
|
+
if (next === 'static') {
|
|
46
|
+
setPending(null);
|
|
47
|
+
if (saved !== 'static')
|
|
48
|
+
onFixed();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
setPending(next);
|
|
52
|
+
};
|
|
53
|
+
const modes = [
|
|
54
|
+
{ mode: 'static', key: 'values.mode.static', icon: 'type' },
|
|
55
|
+
{ mode: 'binding', key: 'values.mode.binding', icon: 'database' },
|
|
56
|
+
{ mode: 'expression', key: 'values.mode.formula', icon: 'sigma' },
|
|
57
|
+
];
|
|
58
|
+
return (_jsxs("div", { className: "bd-value", "data-mode": mode, children: [_jsx(SegmentedControl, { className: "bd-value-modes", label: `${label}: ${t('values.mode')}`, value: mode, disabled: disabled, options: modes.map((entry) => ({
|
|
59
|
+
value: entry.mode,
|
|
60
|
+
label: t(entry.key),
|
|
61
|
+
icon: entry.icon,
|
|
62
|
+
})), onValueChange: (next) => choose(next) }), mode === 'static' ? staticControl : null, mode === 'binding' ? (_jsx(BindingEditor, { def: def, label: label, raw: raw?.kind === 'binding' ? raw : undefined, disabled: disabled, onSet: onSet })) : null, mode === 'expression' ? (_jsx(FormulaEditor, { def: def, label: label, raw: raw?.kind === 'expression' ? raw : undefined, disabled: disabled, onSet: onSet })) : null] }));
|
|
63
|
+
}
|
|
64
|
+
/** What a bound or formula prop shows where a control would be: the path or the formula, red when it is wrong. */
|
|
65
|
+
export function ValueChip({ def, value }) {
|
|
66
|
+
const t = useT();
|
|
67
|
+
const { schema } = useInspectorData();
|
|
68
|
+
if (value.kind === 'static')
|
|
69
|
+
return null;
|
|
70
|
+
const invalid = value.kind === 'binding'
|
|
71
|
+
? ['missing', 'type'].includes(checkBinding(schema, value.path, def.accepts))
|
|
72
|
+
: !checkFormula(value.expr, value.mode ?? 'formula', schema, def.accepts).valid;
|
|
73
|
+
return (_jsxs("p", { className: "bd-field-chip bd-value-chip", "data-invalid": invalid, children: [value.kind === 'binding' ? t('inspector.bound') : t('inspector.formula'), ":", ' ', _jsx("code", { children: value.kind === 'binding' ? value.path : value.expr }), invalid ? _jsxs("span", { children: [" (", t('values.chip.invalid'), ")"] }) : null] }));
|
|
74
|
+
}
|
|
75
|
+
// --- shared pieces ------------------------------------------------------------------------------
|
|
76
|
+
function Preview({ value }) {
|
|
77
|
+
const t = useT();
|
|
78
|
+
const { context } = useInspectorData();
|
|
79
|
+
const preview = useMemo(() => previewValue(value, context), [value, context]);
|
|
80
|
+
if (context === undefined)
|
|
81
|
+
return null;
|
|
82
|
+
return (_jsxs("p", { className: "bd-value-preview bd-card", children: [_jsx(Icon, { name: "eye" }), _jsxs("span", { className: "bd-value-preview-label", children: [t('values.preview'), ": "] }), preview.text !== undefined ? (_jsx("output", { children: preview.text })) : (_jsx("span", { className: "bd-value-preview-none", children: t('values.preview.none') }))] }));
|
|
83
|
+
}
|
|
84
|
+
function Fallback(props) {
|
|
85
|
+
const t = useT();
|
|
86
|
+
const shown = props.value === undefined || props.value === null ? '' : String(props.value);
|
|
87
|
+
return (_jsxs("div", { className: "bd-value-row", children: [_jsx("span", { children: t('values.fallback') }), _jsx(Input, { "aria-label": t('values.fallback'), type: "text", value: shown, disabled: props.disabled, onChange: (event) => {
|
|
88
|
+
const text = event.target.value;
|
|
89
|
+
if (text === '')
|
|
90
|
+
return props.onChange(undefined);
|
|
91
|
+
const number = Number(text);
|
|
92
|
+
props.onChange(props.def.kind === 'number' && Number.isFinite(number) ? number : text);
|
|
93
|
+
} })] }));
|
|
94
|
+
}
|
|
95
|
+
// --- data bindings ------------------------------------------------------------------------------
|
|
96
|
+
const STATUS_KEY = {
|
|
97
|
+
missing: 'values.binding.missing',
|
|
98
|
+
type: 'values.binding.type',
|
|
99
|
+
};
|
|
100
|
+
function BindingEditor(props) {
|
|
101
|
+
const { def, raw, disabled, onSet } = props;
|
|
102
|
+
const t = useT();
|
|
103
|
+
const { schema } = useInspectorData();
|
|
104
|
+
const pathId = useId();
|
|
105
|
+
const [query, setQuery] = useState('');
|
|
106
|
+
const [draft, setDraft] = useState(raw?.path ?? '');
|
|
107
|
+
useEffect(() => setDraft(raw?.path ?? ''), [raw?.path]);
|
|
108
|
+
const options = useMemo(() => bindingOptions(schema, def.accepts), [schema, def.accepts]);
|
|
109
|
+
const needle = query.trim().toLowerCase();
|
|
110
|
+
const listed = options.filter((option) => needle === '' ||
|
|
111
|
+
option.path.toLowerCase().includes(needle) ||
|
|
112
|
+
(option.label?.toLowerCase().includes(needle) ?? false));
|
|
113
|
+
const status = raw === undefined ? 'unchecked' : checkBinding(schema, raw.path, def.accepts);
|
|
114
|
+
const statusKey = STATUS_KEY[status];
|
|
115
|
+
const tag = raw === undefined || schema === undefined ? undefined : schemaAtPath(schema, raw.path)?.type.t;
|
|
116
|
+
const write = (path, extra) => onSet(bind(path, {
|
|
117
|
+
...(extra.format !== undefined ? { format: extra.format } : {}),
|
|
118
|
+
...(extra.fallback !== undefined ? { fallback: extra.fallback } : {}),
|
|
119
|
+
}));
|
|
120
|
+
const keep = { format: raw?.format, fallback: raw?.fallback };
|
|
121
|
+
const commitPath = (path) => {
|
|
122
|
+
const trimmed = path.trim();
|
|
123
|
+
if (trimmed === '' || trimmed === raw?.path)
|
|
124
|
+
return;
|
|
125
|
+
write(trimmed, keep);
|
|
126
|
+
};
|
|
127
|
+
return (_jsxs("div", { className: "bd-value-binding", children: [raw !== undefined ? _jsx(ValueChip, { def: def, value: raw }) : null, _jsx("label", { className: "bd-value-row", htmlFor: pathId, children: _jsx("span", { children: t('values.binding.path') }) }), _jsx(Input, { id: pathId, type: "text", value: draft, disabled: disabled, "aria-invalid": statusKey !== undefined, placeholder: t('values.binding.pick'), onChange: (event) => setDraft(event.target.value), onBlur: () => commitPath(draft), onKeyDown: (event) => {
|
|
128
|
+
if (event.key === 'Enter')
|
|
129
|
+
commitPath(draft);
|
|
130
|
+
} }), statusKey !== undefined ? (_jsx("p", { className: "bd-value-error", role: "alert", children: t(statusKey) })) : null, schema === undefined ? (_jsx("p", { className: "bd-field-hint", children: t('values.binding.noSchema') })) : (_jsxs(_Fragment, { children: [_jsx(Input, { type: "search", value: query, disabled: disabled, "aria-label": t('values.binding.search'), placeholder: t('values.binding.search'), onChange: (event) => setQuery(event.target.value) }), listed.length === 0 ? (_jsx("p", { className: "bd-field-hint", children: t('values.binding.none') })) : (_jsx("ul", { className: "bd-value-fields", children: listed.slice(0, MAX_LISTED).map((option) => (_jsx("li", { children: _jsxs("button", { type: "button", className: "bd-value-field", "aria-pressed": raw?.path === option.path, disabled: disabled, onClick: () => write(option.path, keep), children: [_jsx(Icon, { name: TYPE_ICON[option.tag], className: "bd-value-field-icon" }), _jsx("code", { children: option.path }), _jsx("span", { className: "bd-value-field-type", children: option.tag })] }) }, option.path))) }))] })), raw !== undefined ? (_jsxs(_Fragment, { children: [_jsx(FormatEditor, { format: raw.format, tag: tag, disabled: disabled, onChange: (format) => write(raw.path, { format, fallback: keep.fallback }) }), _jsx(Fallback, { def: def, value: raw.fallback, disabled: disabled, onChange: (fallback) => write(raw.path, { format: raw.format, fallback }) }), _jsx(Preview, { value: raw })] })) : null] }));
|
|
131
|
+
}
|
|
132
|
+
function FormatEditor(props) {
|
|
133
|
+
const { format, disabled, onChange } = props;
|
|
134
|
+
const t = useT();
|
|
135
|
+
const kinds = formatKindsFor(props.tag);
|
|
136
|
+
if (kinds.length <= 1 && format === undefined)
|
|
137
|
+
return null;
|
|
138
|
+
const kind = format?.type ?? 'none';
|
|
139
|
+
const opts = (values, key) => values.map((value) => ({ value, label: t(key(value)) }));
|
|
140
|
+
return (_jsxs("div", { className: "bd-value-format", children: [_jsx(Select, { label: t('values.format'), value: kind, disabled: disabled, options: opts(kinds, (value) => `values.format.${value}`), onValueChange: (next) => onChange(defaultFormat(next)) }), format?.type === 'date' ? (_jsx(Select, { label: t('values.format.dateStyle'), value: format.style, disabled: disabled, options: opts(['short', 'medium', 'long', 'iso'], (v) => `values.style.${v}`), onValueChange: (style) => onChange({ type: 'date', style: style }) })) : null, format?.type === 'number' ? (_jsx(Select, { label: t('values.format.numberStyle'), value: format.style ?? 'decimal', disabled: disabled, options: opts(['decimal', 'percent'], (v) => `values.style.${v}`), onValueChange: (style) => onChange({ ...format, style: style }) })) : null, format?.type === 'currency' ? (_jsxs("div", { className: "bd-value-row", children: [_jsx("span", { children: t('values.format.currencyCode') }), _jsx(Input, { "aria-label": t('values.format.currencyCode'), type: "text", value: format.currency, maxLength: 3, disabled: disabled, onChange: (event) => {
|
|
141
|
+
const currency = event.target.value.toUpperCase();
|
|
142
|
+
if (/^[A-Z]{3}$/.test(currency))
|
|
143
|
+
onChange({ type: 'currency', currency });
|
|
144
|
+
} })] })) : null, format?.type === 'text' ? (_jsx(Select, { label: t('values.format.transform'), value: format.transform ?? 'none', disabled: disabled, options: opts(['none', 'upper', 'lower', 'capitalize'], (v) => `values.transform.${v}`), onValueChange: (transform) => {
|
|
145
|
+
const { transform: _drop, ...rest } = format;
|
|
146
|
+
onChange(transform === 'none'
|
|
147
|
+
? rest
|
|
148
|
+
: { ...rest, transform: transform });
|
|
149
|
+
} })) : null] }));
|
|
150
|
+
}
|
|
151
|
+
// --- formulas -----------------------------------------------------------------------------------
|
|
152
|
+
function FormulaEditor(props) {
|
|
153
|
+
const { def, raw, disabled, onSet } = props;
|
|
154
|
+
const t = useT();
|
|
155
|
+
const { schema } = useInspectorData();
|
|
156
|
+
const sourceId = useId();
|
|
157
|
+
const [draft, setDraft] = useState(raw?.expr ?? '');
|
|
158
|
+
const [mode, setMode] = useState(raw?.mode ?? 'formula');
|
|
159
|
+
// An undo (or anything else that changes the saved formula) replaces the draft.
|
|
160
|
+
useEffect(() => {
|
|
161
|
+
if (raw !== undefined) {
|
|
162
|
+
setDraft(raw.expr);
|
|
163
|
+
setMode(raw.mode ?? 'formula');
|
|
164
|
+
}
|
|
165
|
+
}, [raw?.expr, raw?.mode, raw]);
|
|
166
|
+
const check = useMemo(() => checkFormula(draft, mode, schema, def.accepts), [draft, mode, schema, def.accepts]);
|
|
167
|
+
const fallback = raw?.fallback;
|
|
168
|
+
const emit = (source, nextMode, nextFallback = fallback) => onSet(expr(source, {
|
|
169
|
+
...(nextMode === 'template' ? { mode: 'template' } : {}),
|
|
170
|
+
...(nextFallback !== undefined ? { fallback: nextFallback } : {}),
|
|
171
|
+
// A translation belongs to the formula it was written for.
|
|
172
|
+
...(raw?.l10n !== undefined && raw.expr === source ? { l10n: raw.l10n } : {}),
|
|
173
|
+
}));
|
|
174
|
+
// Only a formula that checks out is written; the fallback of a saved one is always editable.
|
|
175
|
+
const write = (source, nextMode) => {
|
|
176
|
+
if (checkFormula(source, nextMode, schema, def.accepts).valid)
|
|
177
|
+
emit(source, nextMode);
|
|
178
|
+
};
|
|
179
|
+
const saved = raw !== undefined && raw.expr === draft && (raw.mode ?? 'formula') === mode;
|
|
180
|
+
const modes = ['formula', 'template'];
|
|
181
|
+
return (_jsxs("div", { className: "bd-value-formula", children: [raw !== undefined ? _jsx(ValueChip, { def: def, value: raw }) : null, _jsx(SegmentedControl, { className: "bd-value-modes", label: t('values.formula.mode'), value: mode, disabled: disabled, options: modes.map((entry) => ({ value: entry, label: t(`values.formula.mode.${entry}`) })), onValueChange: (entry) => {
|
|
182
|
+
setMode(entry);
|
|
183
|
+
write(draft, entry);
|
|
184
|
+
} }), _jsx("label", { className: "bd-value-row", htmlFor: sourceId, children: _jsx("span", { children: t('values.formula.source') }) }), _jsx("textarea", { id: sourceId, className: "bd-input bd-value-source", rows: 3, value: draft, disabled: disabled, spellCheck: false, "aria-invalid": !check.valid, onChange: (event) => {
|
|
185
|
+
setDraft(event.target.value);
|
|
186
|
+
write(event.target.value, mode);
|
|
187
|
+
} }), draft !== '' && check.diagnostics.length > 0 ? (_jsx("ul", { className: "bd-value-diagnostics", "aria-live": "polite", children: check.diagnostics.map((diagnostic, index) => {
|
|
188
|
+
const span = spanOf(diagnostic);
|
|
189
|
+
return (_jsxs("li", { "data-severity": diagnostic.severity, children: [span !== undefined ? _jsx("code", { children: draft.slice(span.start, span.end) }) : null, ' ', diagnostic.message] }, index));
|
|
190
|
+
}) })) : null, draft !== '' && !check.valid && !saved ? (_jsx("p", { className: "bd-value-error", role: "alert", children: t('values.formula.unsaved') })) : null, check.valid && check.diagnostics.length === 0 && draft !== '' ? (_jsx("p", { className: "bd-field-hint", children: t('values.formula.valid') })) : null, raw !== undefined ? (_jsxs(_Fragment, { children: [_jsx(Fallback, { def: def, value: raw.fallback, disabled: disabled, onChange: (next) => emit(raw.expr, raw.mode ?? 'formula', next) }), _jsx(Preview, { value: raw })] })) : null] }));
|
|
191
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"values.test.d.ts","sourceRoot":"","sources":["../../../../src/panels/inspector/values/values.test.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { jsx as _jsx } 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 { ManifestProvider } from '../../../app/manifest.js';
|
|
8
|
+
import { MessagesProvider } from '../../../messages/index.js';
|
|
9
|
+
import { createEditorStore, EditorStoreProvider } from '../../../store/index.js';
|
|
10
|
+
import { Inspector } from '../inspector.js';
|
|
11
|
+
import { bindingOptions, checkBinding, checkFormula, defaultFormat, formatKindsFor, previewValue, } from './analyze.js';
|
|
12
|
+
import { InspectorDataProvider } from './data.js';
|
|
13
|
+
globalThis.IS_REACT_ACT_ENVIRONMENT = true;
|
|
14
|
+
const widget = {
|
|
15
|
+
type: 'buildr/widget',
|
|
16
|
+
version: 1,
|
|
17
|
+
label: 'Widget',
|
|
18
|
+
category: 'content',
|
|
19
|
+
props: {
|
|
20
|
+
title: p.text({ label: 'Title', default: 'Hello' }),
|
|
21
|
+
fixed: p.boolean({ default: true }),
|
|
22
|
+
},
|
|
23
|
+
contentCategories: ['flow'],
|
|
24
|
+
styles: { groups: [] },
|
|
25
|
+
runtime: 'shared',
|
|
26
|
+
slots: { default: {} },
|
|
27
|
+
};
|
|
28
|
+
const page = {
|
|
29
|
+
...widget,
|
|
30
|
+
type: 'buildr/page',
|
|
31
|
+
label: 'Page',
|
|
32
|
+
props: {},
|
|
33
|
+
capabilities: { root: true },
|
|
34
|
+
};
|
|
35
|
+
const registry = createRegistryMeta({ components: [page, widget] });
|
|
36
|
+
const manifest = toManifest(registry);
|
|
37
|
+
const schema = {
|
|
38
|
+
scopes: {
|
|
39
|
+
post: {
|
|
40
|
+
type: {
|
|
41
|
+
t: 'object',
|
|
42
|
+
fields: {
|
|
43
|
+
title: { type: { t: 'string' }, label: 'Title' },
|
|
44
|
+
views: { type: { t: 'number' } },
|
|
45
|
+
published: { type: { t: 'date' } },
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
entities: {},
|
|
51
|
+
};
|
|
52
|
+
const context = {
|
|
53
|
+
scopes: { post: { title: 'Hello world', views: 3, published: '2026-01-02T00:00:00Z' } },
|
|
54
|
+
locale: 'en',
|
|
55
|
+
locales: { default: 'en', fallback: true, intl: { en: 'en-US' } },
|
|
56
|
+
timeZone: 'UTC',
|
|
57
|
+
mode: 'preview',
|
|
58
|
+
};
|
|
59
|
+
const fixture = (props) => ({
|
|
60
|
+
schemaVersion: 1,
|
|
61
|
+
root: 'root',
|
|
62
|
+
nodes: {
|
|
63
|
+
root: { id: 'root', type: 'buildr/page', slots: { default: ['widget0001'] } },
|
|
64
|
+
widget0001: {
|
|
65
|
+
id: 'widget0001',
|
|
66
|
+
type: 'buildr/widget',
|
|
67
|
+
...(props === undefined ? {} : { props: props }),
|
|
68
|
+
},
|
|
69
|
+
},
|
|
70
|
+
components: {},
|
|
71
|
+
});
|
|
72
|
+
describe('analyze', () => {
|
|
73
|
+
const accepts = ['string'];
|
|
74
|
+
it('lists the fields a prop can take', () => {
|
|
75
|
+
expect(bindingOptions(schema, accepts).map((option) => option.path)).toEqual(['post.title']);
|
|
76
|
+
expect(bindingOptions(undefined, accepts)).toEqual([]);
|
|
77
|
+
});
|
|
78
|
+
it('checks a binding against the schema', () => {
|
|
79
|
+
expect(checkBinding(schema, 'post.title', accepts)).toBe('ok');
|
|
80
|
+
expect(checkBinding(schema, 'post.nope', accepts)).toBe('missing');
|
|
81
|
+
expect(checkBinding(schema, 'post.views', accepts)).toBe('type');
|
|
82
|
+
expect(checkBinding(undefined, 'post.views', accepts)).toBe('unchecked');
|
|
83
|
+
});
|
|
84
|
+
it('checks a formula without running it', () => {
|
|
85
|
+
expect(checkFormula('post.title', 'formula', schema, accepts).valid).toBe(true);
|
|
86
|
+
expect(checkFormula('post.title +', 'formula', schema, accepts).valid).toBe(false);
|
|
87
|
+
expect(checkFormula(' ', 'formula', schema, accepts).valid).toBe(false);
|
|
88
|
+
expect(checkFormula('Hi {{ post.title }}', 'template', schema, accepts).valid).toBe(true);
|
|
89
|
+
});
|
|
90
|
+
it('previews a value against sample data and never throws', () => {
|
|
91
|
+
expect(previewValue({ kind: 'binding', path: 'post.title' }, context).text).toBe('Hello world');
|
|
92
|
+
expect(previewValue({ kind: 'expression', expr: 'post.views' }, context).text).toBe('3');
|
|
93
|
+
expect(previewValue({ kind: 'expression', expr: 'post.views +' }, context).text).toBeUndefined();
|
|
94
|
+
expect(previewValue({ kind: 'binding', path: 'post.title' }, undefined).text).toBeUndefined();
|
|
95
|
+
expect(previewValue(s('x'), context).text).toBeUndefined();
|
|
96
|
+
});
|
|
97
|
+
it('offers formats that fit the field', () => {
|
|
98
|
+
expect(formatKindsFor('date')).toEqual(['none', 'date']);
|
|
99
|
+
expect(defaultFormat('none')).toBeUndefined();
|
|
100
|
+
expect(defaultFormat('currency')).toEqual({ type: 'currency', currency: 'USD' });
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
describe('value modes in the inspector', () => {
|
|
104
|
+
let container;
|
|
105
|
+
let root;
|
|
106
|
+
beforeEach(() => {
|
|
107
|
+
container = document.createElement('div');
|
|
108
|
+
document.body.append(container);
|
|
109
|
+
root = createRoot(container);
|
|
110
|
+
Element.prototype.scrollIntoView ??= () => { };
|
|
111
|
+
Element.prototype.hasPointerCapture ??= () => false;
|
|
112
|
+
Element.prototype.setPointerCapture ??= () => { };
|
|
113
|
+
Element.prototype.releasePointerCapture ??= () => { };
|
|
114
|
+
});
|
|
115
|
+
afterEach(() => {
|
|
116
|
+
act(() => root.unmount());
|
|
117
|
+
document.body.innerHTML = '';
|
|
118
|
+
});
|
|
119
|
+
async function mount(props) {
|
|
120
|
+
const store = createEditorStore({
|
|
121
|
+
doc: fixture(props),
|
|
122
|
+
registry,
|
|
123
|
+
generateId: createSeededIdGenerator(3),
|
|
124
|
+
validationDelayMs: null,
|
|
125
|
+
});
|
|
126
|
+
store.select('widget0001');
|
|
127
|
+
await act(async () => root.render(_jsx(MessagesProvider, { locale: "en", children: _jsx(ManifestProvider, { manifest: manifest, children: _jsx(EditorStoreProvider, { store: store, children: _jsx(InspectorDataProvider, { schema: schema, context: context, children: _jsx(Inspector, {}) }) }) }) })));
|
|
128
|
+
return store;
|
|
129
|
+
}
|
|
130
|
+
const title = () => container.querySelector('[data-prop=title]');
|
|
131
|
+
const button = (name) => [...title().querySelectorAll('button')].find((element) => element.textContent === name);
|
|
132
|
+
const click = (element) => act(async () => {
|
|
133
|
+
element.dispatchEvent(new MouseEvent('click', { bubbles: true }));
|
|
134
|
+
});
|
|
135
|
+
const propOf = (store) => store.getState().doc.nodes['widget0001']?.props?.['title'];
|
|
136
|
+
it('picking a field writes a binding', async () => {
|
|
137
|
+
const store = await mount();
|
|
138
|
+
await click(button('Data'));
|
|
139
|
+
const field = [...title().querySelectorAll('button')].find((element) => element.textContent?.includes('post.title'));
|
|
140
|
+
expect(field).toBeDefined();
|
|
141
|
+
await click(field);
|
|
142
|
+
expect(propOf(store)).toMatchObject({ kind: 'binding', path: 'post.title' });
|
|
143
|
+
expect(title().textContent).toContain('Hello world');
|
|
144
|
+
});
|
|
145
|
+
it('does not save an invalid formula and says why', async () => {
|
|
146
|
+
const store = await mount({ title: { kind: 'expression', expr: 'post.title' } });
|
|
147
|
+
const area = title().querySelector('textarea');
|
|
148
|
+
await act(async () => {
|
|
149
|
+
const setter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;
|
|
150
|
+
setter?.call(area, 'post.title +');
|
|
151
|
+
area.dispatchEvent(new Event('input', { bubbles: true }));
|
|
152
|
+
});
|
|
153
|
+
expect(propOf(store)).toEqual({ kind: 'expression', expr: 'post.title' });
|
|
154
|
+
expect(title().querySelector('[role=alert]')).not.toBeNull();
|
|
155
|
+
});
|
|
156
|
+
it('marks a binding to a missing field as invalid', async () => {
|
|
157
|
+
await mount({ title: { kind: 'binding', path: 'post.gone' } });
|
|
158
|
+
expect(title().textContent).toContain('This field does not exist');
|
|
159
|
+
});
|
|
160
|
+
it('shows the mode switch as a segmented control with icons, and the field list with type icons', async () => {
|
|
161
|
+
await mount({ title: { kind: 'binding', path: 'post.title' } });
|
|
162
|
+
const modes = title().querySelector('.bd-value-modes.bd-segmented');
|
|
163
|
+
expect(modes?.tagName).toBe('FIELDSET');
|
|
164
|
+
expect(modes?.querySelectorAll('svg')).toHaveLength(3);
|
|
165
|
+
expect(title().querySelector('.bd-value-field-icon')).not.toBeNull();
|
|
166
|
+
expect(title().querySelector('.bd-value-preview.bd-card')).not.toBeNull();
|
|
167
|
+
});
|
|
168
|
+
it('switching back to Fixed restores a static value', async () => {
|
|
169
|
+
const store = await mount({ title: { kind: 'binding', path: 'post.title' } });
|
|
170
|
+
await click(button('Fixed'));
|
|
171
|
+
expect(propOf(store)?.kind ?? 'static').toBe('static');
|
|
172
|
+
});
|
|
173
|
+
});
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import type { A11yFix, A11yIssue, BuilderDocument, Diagnostic, NodeId, ValidationIssue } from '@next-buildr/core';
|
|
2
|
+
export type IssueSeverity = 'error' | 'warning' | 'info';
|
|
3
|
+
export type IssueSource = 'validation' | 'a11y' | 'canvas';
|
|
4
|
+
/** One row of the Issues panel: a finding of any of the checks, in one shape. */
|
|
5
|
+
export interface IssueItem {
|
|
6
|
+
readonly key: string;
|
|
7
|
+
readonly source: IssueSource;
|
|
8
|
+
readonly severity: IssueSeverity;
|
|
9
|
+
/** The rule or the diagnostic code. */
|
|
10
|
+
readonly code: string;
|
|
11
|
+
readonly message: string;
|
|
12
|
+
readonly help?: string | undefined;
|
|
13
|
+
/** The node it is about, when it is about one that is still in the document. */
|
|
14
|
+
readonly nodeId?: NodeId | undefined;
|
|
15
|
+
/** The document must not be saved or published while it exists. */
|
|
16
|
+
readonly blocking: boolean;
|
|
17
|
+
readonly fix?: A11yFix | undefined;
|
|
18
|
+
/** The language a finding was made in (`missing-translation`); absent for the ones that do not depend on it. */
|
|
19
|
+
readonly locale?: string | undefined;
|
|
20
|
+
}
|
|
21
|
+
/** The node a diagnostic is about: the one its path points into, else the one it names in `details`. */
|
|
22
|
+
export declare function nodeOfDiagnostic(diagnostic: Diagnostic): NodeId | undefined;
|
|
23
|
+
export interface CollectInput {
|
|
24
|
+
readonly doc: BuilderDocument;
|
|
25
|
+
readonly validation?: readonly ValidationIssue[] | undefined;
|
|
26
|
+
readonly a11y?: readonly A11yIssue[] | undefined;
|
|
27
|
+
/** What the canvas reported (a component that threw, a binding that failed at render). */
|
|
28
|
+
readonly canvas?: readonly Diagnostic[] | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Merges the findings of validation, the accessibility rules and the canvas into one list: worst
|
|
32
|
+
* first, then in the order the checks reported them. A finding about a node that is gone keeps its
|
|
33
|
+
* text but loses its node, so clicking it does nothing rather than selecting a stale id.
|
|
34
|
+
*/
|
|
35
|
+
export declare function collectIssues(input: CollectInput): IssueItem[];
|
|
36
|
+
export type SeverityFilter = 'all' | IssueSeverity;
|
|
37
|
+
export declare function filterIssues(items: readonly IssueItem[], filter: SeverityFilter): IssueItem[];
|
|
38
|
+
export interface IssueCounts {
|
|
39
|
+
readonly all: number;
|
|
40
|
+
readonly error: number;
|
|
41
|
+
readonly warning: number;
|
|
42
|
+
readonly info: number;
|
|
43
|
+
}
|
|
44
|
+
export declare function countIssues(items: readonly IssueItem[]): IssueCounts;
|
|
45
|
+
export type PublishPolicy = 'warn' | 'block';
|
|
46
|
+
export interface PublishGate {
|
|
47
|
+
/** Publishing is not allowed. */
|
|
48
|
+
readonly blocked: boolean;
|
|
49
|
+
/** Why: a corrupt document always blocks; errors block under the `block` policy. */
|
|
50
|
+
readonly reason: 'blocking' | 'errors' | undefined;
|
|
51
|
+
readonly counts: IssueCounts;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Whether the findings allow publishing. A blocking validation issue (a corrupt structure) stops
|
|
55
|
+
* it under any policy; under `publishPolicy: 'block'` so does any error, from validation or from
|
|
56
|
+
* the accessibility rules. Under `'warn'` (the default) the author is told and may go on.
|
|
57
|
+
*/
|
|
58
|
+
export declare function publishGate(items: readonly IssueItem[], policy?: PublishPolicy): PublishGate;
|
|
59
|
+
/** The rule that flags a translatable text with no translation; the panel lists its findings per language. */
|
|
60
|
+
export declare const MISSING_TRANSLATION = "missing-translation";
|
|
61
|
+
export interface MissingGroup {
|
|
62
|
+
readonly locale: string;
|
|
63
|
+
readonly items: readonly IssueItem[];
|
|
64
|
+
}
|
|
65
|
+
/** Splits the findings into the ordinary ones and the missing translations, those grouped by language in the order the languages first appear. */
|
|
66
|
+
export declare function groupMissingTranslations(items: readonly IssueItem[]): {
|
|
67
|
+
readonly rest: readonly IssueItem[];
|
|
68
|
+
readonly groups: readonly MissingGroup[];
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=collect.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"collect.d.ts","sourceRoot":"","sources":["../../../src/panels/issues/collect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,OAAO,EACP,SAAS,EACT,eAAe,EACf,UAAU,EACV,MAAM,EACN,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AACzD,MAAM,MAAM,WAAW,GAAG,YAAY,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE3D,iFAAiF;AACjF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC;IACjC,uCAAuC;IACvC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,gFAAgF;IAChF,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,mEAAmE;IACnE,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,gHAAgH;IAChH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACtC;AAID,wGAAwG;AACxG,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,SAAS,CAK3E;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,eAAe,EAAE,GAAG,SAAS,CAAC;IAC7D,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,SAAS,EAAE,GAAG,SAAS,CAAC;IACjD,0FAA0F;IAC1F,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,CAAC;CACrD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,YAAY,GAAG,SAAS,EAAE,CA2C9D;AAED,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,aAAa,CAAC;AAEnD,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,EAAE,MAAM,EAAE,cAAc,GAAG,SAAS,EAAE,CAE7F;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,WAAW,CAIpE;AAED,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7C,MAAM,WAAW,WAAW;IAC1B,iCAAiC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,oFAAoF;IACpF,QAAQ,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,GAAG,SAAS,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;CAC9B;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CACzB,KAAK,EAAE,SAAS,SAAS,EAAE,EAC3B,MAAM,GAAE,aAAsB,GAC7B,WAAW,CAKb;AAED,8GAA8G;AAC9G,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,CAAC;CACtC;AAED,kJAAkJ;AAClJ,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG;IACrE,QAAQ,CAAC,IAAI,EAAE,SAAS,SAAS,EAAE,CAAC;IACpC,QAAQ,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,CAAC;CAC1C,CAaA"}
|