@neosjs/vitepress-theme
Version:
NeosJS VitePress theme
88 lines (87 loc) • 2.08 kB
JavaScript
import { onMounted, onUnmounted } from "vue";
import { inBrowser } from "vitepress";
import { throttleAndDebounce } from "../support/utils.mjs";
const GridSettings = {
xmini: [[0, 2]],
mini: [],
small: [
[920, 6],
[768, 5],
[640, 4],
[480, 3],
[0, 2]
],
medium: [
[960, 5],
[832, 4],
[640, 3],
[480, 2]
],
big: [
[832, 3],
[640, 2]
]
};
export function useSponsorsGrid({
el,
size = "medium"
}) {
const onResize = throttleAndDebounce(manage, 100);
onMounted(() => {
manage();
inBrowser && window.addEventListener("resize", onResize);
});
onUnmounted(() => {
inBrowser && window.removeEventListener("resize", onResize);
});
function manage() {
adjustSlots(el.value, size);
}
}
function adjustSlots(el, size) {
const tsize = el.children.length;
const asize = el.querySelectorAll(".vp-sponsor-grid-item:not(.empty)").length;
const grid = setGrid(el, size, asize);
manageSlots(el, grid, tsize, asize);
}
function setGrid(el, size, items) {
const settings = GridSettings[size];
const screen = inBrowser && window.innerWidth || 0;
let grid = 1;
settings.some(([breakpoint, value]) => {
if (screen >= breakpoint) {
grid = items < value ? items : value;
return true;
}
return false;
});
setGridData(el, grid);
return grid;
}
function setGridData(el, value) {
el.dataset.vpGrid = String(value);
}
function manageSlots(el, grid, tsize, asize) {
const diff = tsize - asize;
const rem = asize % grid;
const drem = rem === 0 ? rem : grid - rem;
neutralizeSlots(el, drem - diff);
}
function neutralizeSlots(el, count) {
if (count === 0) {
return;
}
count > 0 ? addSlots(el, count) : removeSlots(el, count * -1);
}
function addSlots(el, count) {
for (let i = 0; i < count; i++) {
const slot = document.createElement("div");
slot.classList.add("vp-sponsor-grid-item", "empty");
el.append(slot);
}
}
function removeSlots(el, count) {
for (let i = 0; i < count; i++) {
el.removeChild(el.lastElementChild);
}
}