Browse Source

add custom renderer hook

add-custom-renderer-hook
Can Urgan 9 months ago
parent
commit
181c87e964
  1. 17
      packages/core/src/canvas/config/config.ts
  2. 23
      packages/core/src/canvas/view/FrameView.ts

17
packages/core/src/canvas/config/config.ts

@ -1,5 +1,9 @@
import Component from '../../dom_components/model/Component'; import Component from '../../dom_components/model/Component';
import ComponentView from '../../dom_components/view/ComponentView';
import Editor from '../../editor';
import { CanvasSpotBuiltInTypes } from '../model/CanvasSpot'; import { CanvasSpotBuiltInTypes } from '../model/CanvasSpot';
import Frame from '../model/Frame';
import FrameView from '../view/FrameView';
export interface CanvasConfig { export interface CanvasConfig {
stylePrefix?: string; stylePrefix?: string;
@ -102,6 +106,19 @@ export interface CanvasConfig {
* @default false * @default false
*/ */
scrollableCanvas?: boolean; scrollableCanvas?: boolean;
/**
* Custom renderer function for canvas content.
* This allows replacing the default HTML rendering with custom frameworks like React.
* @example
* customRenderer: ({ editor, frame, window, frameView }) => {
* // Mount React on the frame body
* const root = frame.getComponent();
* const reactRoot = createRoot(window.document.body);
* reactRoot.render(<React.StrictMode><RenderChildren components={[root]}/></React.StrictMode>);
* }
*/
customRenderer?: (options: { editor: Editor; frame: Frame; window: Window; frameView: FrameView }) => ComponentView;
} }
const config: () => CanvasConfig = () => ({ const config: () => CanvasConfig = () => ({

23
packages/core/src/canvas/view/FrameView.ts

@ -429,14 +429,23 @@ export default class FrameView extends ModuleView<Frame, HTMLIFrameElement> {
const { view } = em?.Components?.getType('wrapper') || {}; const { view } = em?.Components?.getType('wrapper') || {};
if (!view) return; if (!view) return;
this.wrapper = new view({ if (typeof config.customRenderer === 'function') {
model: root, this.wrapper = config.customRenderer({
config: { editor: em.Editor,
...root.config, frame: model,
em, window: win,
frameView: this, frameView: this,
}, });
}).render(); } else {
this.wrapper = new view({
model: root,
config: {
...root.config,
em,
frameView: this,
},
}).render();
}
append(body, this.wrapper?.el!); append(body, this.wrapper?.el!);
append( append(
body, body,

Loading…
Cancel
Save