mirror of
https://github.com/locomotivemtl/locomotive-boilerplate.git
synced 2026-01-15 00:55:08 +08:00
139 lines
3.8 KiB
JavaScript
139 lines
3.8 KiB
JavaScript
/**
|
|
* Grid Helper
|
|
*
|
|
* Provides a grid based on the design guidelines and is helpful for web integration.
|
|
*
|
|
* - `Control + g` to toggle the grid
|
|
*
|
|
*/
|
|
|
|
/**
|
|
* @typedef {Object} GridHelperReference
|
|
*
|
|
* @property {string} [gutterCssVar=GRID_HELPER_GUTTER_CSS_VAR] - CSS variable used to define grid gutters.
|
|
* @property {string} [marginCssVar=GRID_HELPER_MARGIN_CSS_VAR] - CSS variable used to define grid margins.
|
|
* @property {string} [rgbaColor=GRID_HELPER_RGBA_COLOR] - RGBA color for the grid appearence.
|
|
*/
|
|
|
|
const GRID_HELPER_GUTTER_CSS_VAR = '--grid-gutter';
|
|
const GRID_HELPER_MARGIN_CSS_VAR = '--grid-margin';
|
|
const GRID_HELPER_RGBA_COLOR = 'rgba(255, 0, 0, .1)';
|
|
|
|
/**
|
|
* Create a grid helper
|
|
*
|
|
* @param {GridHelperReference}
|
|
*
|
|
*/
|
|
function gridHelper({
|
|
gutterCssVar = GRID_HELPER_GUTTER_CSS_VAR,
|
|
marginCssVar = GRID_HELPER_MARGIN_CSS_VAR,
|
|
rgbaColor = GRID_HELPER_RGBA_COLOR,
|
|
} = {}) {
|
|
// Set grid container
|
|
const $gridContainer = document.createElement('div');
|
|
document.body.append($gridContainer);
|
|
|
|
// Set grid appearence
|
|
setGridHelperColumns($gridContainer, rgbaColor);
|
|
setGridHelperStyles($gridContainer, gutterCssVar, marginCssVar);
|
|
|
|
// Set grid interactivity
|
|
setGridEvents($gridContainer, rgbaColor);
|
|
}
|
|
|
|
/**
|
|
* Set grid container styles
|
|
*
|
|
* @param {HTMLElement} $container - DOM Element that contains a list of generated columns
|
|
* @param {string} gutterCssVar - CSS variable used to define grid gutters.
|
|
* @param {string} marginCssVar - CSS variable used to define grid margins.
|
|
*
|
|
*/
|
|
function setGridHelperStyles($container, gutterCssVar, marginCssVar) {
|
|
const elStyles = $container.style;
|
|
elStyles.zIndex = '10000';
|
|
elStyles.position = 'fixed';
|
|
elStyles.top = '0';
|
|
elStyles.left = '0';
|
|
elStyles.display = 'flex';
|
|
elStyles.width = '100%';
|
|
elStyles.height = '100%';
|
|
elStyles.columnGap = `var(${gutterCssVar}, 0)`;
|
|
elStyles.paddingLeft = `var(${marginCssVar}, 0)`;
|
|
elStyles.paddingRight = `var(${marginCssVar}, 0)`;
|
|
elStyles.pointerEvents = 'none';
|
|
elStyles.visibility = 'hidden';
|
|
}
|
|
|
|
/**
|
|
* Set grid columns
|
|
*
|
|
* @param {HTMLElement} $container - DOM Element that will contain a list of generated columns
|
|
* @param {string} rgbaColor - RGBA color to stylize the generated columns
|
|
*
|
|
*/
|
|
function setGridHelperColumns($container, rgbaColor) {
|
|
// Clear columns
|
|
$container.innerHTML = '';
|
|
|
|
// Loop through columns
|
|
const columns = Number(
|
|
window.getComputedStyle($container).getPropertyValue('--grid-columns')
|
|
);
|
|
|
|
let $col;
|
|
for (var i = 0; i < columns; i++) {
|
|
$col = document.createElement('div');
|
|
$col.style.flex = '1 1 0';
|
|
$col.style.backgroundColor = rgbaColor;
|
|
$container.appendChild($col);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set grid events
|
|
*
|
|
* Resize to rebuild columns
|
|
* Keydown/Keyup to toggle the grid display
|
|
*
|
|
* @param {HTMLElement} $container - DOM Element that contains a list of generated columns
|
|
* @param {string} rgbaColor - RGBA color to stylize the generated columns
|
|
*
|
|
*/
|
|
function setGridEvents($container, rgbaColor) {
|
|
// Handle resize
|
|
window.addEventListener(
|
|
'resize',
|
|
setGridHelperColumns($container, rgbaColor)
|
|
);
|
|
|
|
// Toggle grid
|
|
let ctrlDown = false;
|
|
let isActive = false;
|
|
|
|
document.addEventListener('keydown', (e) => {
|
|
if (e.key == 'Control') {
|
|
ctrlDown = true;
|
|
} else {
|
|
if (ctrlDown && e.key == 'g') {
|
|
if (isActive) {
|
|
$container.style.visibility = 'hidden';
|
|
} else {
|
|
$container.style.visibility = 'visible';
|
|
}
|
|
|
|
isActive = !isActive;
|
|
}
|
|
}
|
|
});
|
|
|
|
document.addEventListener('keyup', (e) => {
|
|
if (e.key == 'Control') {
|
|
ctrlDown = false;
|
|
}
|
|
});
|
|
}
|
|
|
|
export { gridHelper };
|