@lonli-lokli/react-mosaic-component
Version:
A React Tiling Window Manager
156 lines (154 loc) • 6.02 kB
JavaScript
;
var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
// If the importer is in node compatibility mode or this is not an ESM
// file that has been converted to a CommonJS file using a Babel-
// compatible transform (i.e. "__esModule" has not been set), then set
// "default" to the CommonJS "module.exports" for node compatibility.
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// libs/react-mosaic-component/src/lib/MosaicRoot.tsx
var MosaicRoot_exports = {};
__export(MosaicRoot_exports, {
MosaicRoot: () => MosaicRoot
});
module.exports = __toCommonJS(MosaicRoot_exports);
var import_lodash_es = require("lodash-es");
var import_react = __toESM(require("react"), 1);
var import_contextTypes = require("./contextTypes.cjs");
var import_Split = require("./Split.cjs");
var import_BoundingBox = require("./util/BoundingBox.cjs");
var import_mosaicUtilities = require("./util/mosaicUtilities.cjs");
var import_MosaicTabs = require("./MosaicTabs.cjs");
var MosaicRoot = class extends import_react.default.PureComponent {
static contextType = import_contextTypes.MosaicContext;
render() {
const naryRoot = (0, import_mosaicUtilities.convertLegacyToNary)(this.props.root);
if (naryRoot === null) {
return null;
}
return /* @__PURE__ */ import_react.default.createElement("div", { className: "mosaic-root" }, this.renderRecursively(naryRoot, (0, import_BoundingBox.emptyBoundingBox)(), []));
}
// The recursive renderer is now updated for the n-ary tree structure
renderRecursively(node, boundingBox, path) {
if (typeof node === "string" || typeof node === "number") {
return /* @__PURE__ */ import_react.default.createElement(
"div",
{
key: node,
className: "mosaic-tile",
style: { ...(0, import_BoundingBox.boundingBoxAsStyles)(boundingBox) }
},
this.props.renderTile(node, path)
);
}
switch (node.type) {
// Case 2: Node is a split container
case "split": {
const { children, direction } = node;
const splitPercentages = node.splitPercentages ?? children.map(() => 100 / children.length);
const childBoxes = (0, import_BoundingBox.splitBoundingBox)(
boundingBox,
splitPercentages,
direction
);
const renderedChildren = children.flatMap((child, index) => {
const childPath = path.concat(index);
const elements = [
this.renderRecursively(child, childBoxes[index], childPath)
];
if (index < children.length - 1) {
elements.push(this.renderSplit(node, path, index, boundingBox));
}
return elements;
});
const flattenedElements = (0, import_lodash_es.flatten)(renderedChildren).filter(nonNullElement);
return /* @__PURE__ */ import_react.default.createElement(import_react.default.Fragment, null, flattenedElements.map(
(element, index) => import_react.default.cloneElement(element, {
key: element.key || `${path.join("-")}-${index}`
})
));
}
// Case 3: Node is a tab container
case "tabs": {
return /* @__PURE__ */ import_react.default.createElement(
import_MosaicTabs.MosaicTabs,
{
node,
path,
renderTile: this.props.renderTile,
renderTabToolbar: this.props.renderTabToolbar,
boundingBox,
renderTabTitle: this.props.renderTabTitle,
renderTabButton: this.props.renderTabButton,
canClose: this.props.canClose
}
);
}
default:
console.error("Unknown mosaic node type:", node);
return null;
}
}
renderSplit(parentNode, path, splitIndex, boundingBox) {
const { resize } = this.props;
if (resize !== "DISABLED" && parentNode.children.length > 1) {
const { direction } = parentNode;
const splitPercentages = parentNode.splitPercentages ?? parentNode.children.map(() => 100 / parentNode.children.length);
return /* @__PURE__ */ import_react.default.createElement(
import_Split.Split,
{
key: `split-${path.join("-")}-${splitIndex}`,
...resize,
direction,
boundingBox,
splitIndex,
splitPercentages,
onChange: (percentages) => this.onResize(percentages, path, true),
onRelease: (percentages) => this.onResize(percentages, path, false)
}
);
} else {
return null;
}
}
// onResize now handles an array of percentages
onResize = (percentages, path, suppressOnRelease) => {
this.context.mosaicActions.updateTree(
[
{
path,
// Path to the parent MosaicSplitNode
spec: {
splitPercentages: {
$set: percentages
}
}
}
],
{ suppressOnRelease }
);
};
};
function nonNullElement(x) {
return x !== null;
}