|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const PANEL_SIZES = { |
|
PORTRAIT: { width: 512, height: 1024 }, |
|
PORTRAIT_MEDIUM: { width: 768, height: 1024 }, |
|
LANDSCAPE: { width: 1024, height: 768 }, |
|
SQUARE: { width: 512, height: 512 }, |
|
SQUARE_LARGE: { width: 1024, height: 1024 }, |
|
PANORAMIC: { width: 1024, height: 512 }, |
|
COVER_SIZE: { width: 512, height: 768 }, |
|
}; |
|
|
|
|
|
const GRID = { |
|
FULL_WIDTH: "1 / span 3", |
|
TWO_THIRDS: "1 / span 2", |
|
FULL_HEIGHT: "1 / span 2", |
|
FULL_HEIGHT_FROM_2: "2 / span 2", |
|
}; |
|
|
|
export const LAYOUTS = { |
|
COVER: { |
|
gridCols: 1, |
|
gridRows: 1, |
|
panels: [ |
|
{ ...PANEL_SIZES.COVER_SIZE, gridColumn: "1", gridRow: "1" }, |
|
], |
|
}, |
|
LAYOUT_1: { |
|
gridCols: 2, |
|
gridRows: 2, |
|
panels: [ |
|
{ ...PANEL_SIZES.LANDSCAPE, gridColumn: "1", gridRow: "1" }, |
|
{ ...PANEL_SIZES.PORTRAIT_MEDIUM, gridColumn: "2", gridRow: "1" }, |
|
{ ...PANEL_SIZES.LANDSCAPE, gridColumn: "1", gridRow: "2" }, |
|
{ ...PANEL_SIZES.PORTRAIT_MEDIUM, gridColumn: "2", gridRow: "2" }, |
|
], |
|
}, |
|
LAYOUT_2: { |
|
gridCols: 3, |
|
gridRows: 2, |
|
panels: [ |
|
{ |
|
...PANEL_SIZES.SQUARE_LARGE, |
|
gridColumn: GRID.TWO_THIRDS, |
|
gridRow: "1", |
|
}, |
|
{ ...PANEL_SIZES.PORTRAIT, gridColumn: "3", gridRow: "1" }, |
|
{ ...PANEL_SIZES.LANDSCAPE, gridColumn: GRID.FULL_WIDTH, gridRow: "2" }, |
|
], |
|
}, |
|
LAYOUT_3: { |
|
gridCols: 3, |
|
gridRows: 2, |
|
panels: [ |
|
{ ...PANEL_SIZES.LANDSCAPE, gridColumn: GRID.TWO_THIRDS, gridRow: "1" }, |
|
{ ...PANEL_SIZES.PORTRAIT, gridColumn: "3", gridRow: "1" }, |
|
{ ...PANEL_SIZES.PORTRAIT, gridColumn: "1", gridRow: "2" }, |
|
{ ...PANEL_SIZES.LANDSCAPE, gridColumn: "2 / span 2", gridRow: "2" }, |
|
], |
|
}, |
|
LAYOUT_4: { |
|
gridCols: 2, |
|
gridRows: 3, |
|
panels: [ |
|
{ ...PANEL_SIZES.PANORAMIC, gridColumn: "1 / span 2", gridRow: "1" }, |
|
{ |
|
...PANEL_SIZES.PORTRAIT, |
|
gridColumn: "1", |
|
gridRow: GRID.FULL_HEIGHT_FROM_2, |
|
}, |
|
{ ...PANEL_SIZES.SQUARE, gridColumn: "2", gridRow: "2" }, |
|
{ ...PANEL_SIZES.SQUARE, gridColumn: "2", gridRow: "3" }, |
|
], |
|
}, |
|
LAYOUT_5: { |
|
gridCols: 3, |
|
gridRows: 3, |
|
panels: [ |
|
{ ...PANEL_SIZES.PANORAMIC, gridColumn: GRID.FULL_WIDTH, gridRow: "1" }, |
|
{ ...PANEL_SIZES.PORTRAIT, gridColumn: "1", gridRow: "2 / span 2" }, |
|
{ |
|
...PANEL_SIZES.SQUARE_LARGE, |
|
gridColumn: "2 / span 2", |
|
gridRow: "2 / span 2", |
|
}, |
|
], |
|
}, |
|
LAYOUT_6: { |
|
gridCols: 3, |
|
gridRows: 2, |
|
panels: [ |
|
{ ...PANEL_SIZES.PORTRAIT, gridColumn: "1", gridRow: GRID.FULL_HEIGHT }, |
|
{ ...PANEL_SIZES.SQUARE, gridColumn: "2", gridRow: "1" }, |
|
{ ...PANEL_SIZES.PORTRAIT, gridColumn: "3", gridRow: GRID.FULL_HEIGHT }, |
|
{ ...PANEL_SIZES.SQUARE, gridColumn: "2", gridRow: "2" }, |
|
], |
|
}, |
|
}; |
|
|
|
export const defaultLayout = "LAYOUT_1"; |
|
export const nonRandomLayouts = Object.keys(LAYOUTS).filter( |
|
(layout) => layout !== "COVER" |
|
); |
|
|
|
|
|
export const getNextLayoutType = (currentLayoutCount) => { |
|
|
|
const availableLayouts = Object.keys(LAYOUTS).filter( |
|
(layout) => layout !== "COVER" |
|
); |
|
|
|
|
|
|
|
const previousLayout = `LAYOUT_${ |
|
(currentLayoutCount % availableLayouts.length) + 1 |
|
}`; |
|
let nextLayout; |
|
|
|
do { |
|
const randomIndex = |
|
Math.floor(Math.random() * (availableLayouts.length - 1)) + 1; |
|
nextLayout = `LAYOUT_${randomIndex}`; |
|
} while (nextLayout === previousLayout); |
|
|
|
return nextLayout; |
|
}; |
|
|
|
export const getLayoutDimensions = (layoutType, panelIndex) => |
|
LAYOUTS[layoutType]?.panels[panelIndex]; |
|
|