You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

81 lines
2.0 KiB

// export function connectResponsiveness(rootAttributes) {
// // API
// return {
// selectMode: (mode) => selectMode(mode),
// }
// }
//
import React, {useEffect, useState} from 'react';
import * as ReactDOM from 'react-dom/client';
import {WrapperStyling} from "./responsive.style.js";
import {ResponsiveButton} from "./responsive-button/ResponsiveButton.jsx";
const modes = [
'reset',
'desktop',
'tablet',
'mobile'
];
function Responsive(props = {}) {
props.rootAttributes = props.rootAttributes ?? {};
const initialState = {mode: 'default', breakpoint: '100%'}
const [state, setState] = useState(initialState);
const updateState = (update) => setState(Object.assign({}, state, update));
useEffect(() => {
// Update the document title using the browser API
updateController(state);
});
const previewFrame = props.rootAttributes.previewFrame;
return render();
//
// Functions
//
function render() {
return <WrapperStyling>
{modes.map((mode) => {
return <ResponsiveButton mode={mode}
active={isActive(mode)}
onSelect={(breakpoint) => selectMode(mode, breakpoint)}/>
})}
</WrapperStyling>;
}
function selectMode(mode, breakpoint) {
if (mode === 'reset') {
updateState(initialState);
return;
}
updateState({mode, breakpoint})
}
function isActive(mode) {
return mode === state.mode;
}
function updateController() {
const unit = typeof state.breakpoint === 'string' ? '' : 'px';
previewFrame.style.setProperty('--breakpoint', state.breakpoint + unit);
previewFrame.classList.add('has-breakpoint');
}
}
export function setupResponsiveness(rootAttributes) {
// INIT
const wrapper = document.createElement('div');
document.querySelector('.page_toolbar').prepend(wrapper)
const root = ReactDOM.createRoot(wrapper);
const html = (<Responsive rootAttributes={rootAttributes}/>);
root.render(html);
}