Lightningbeam/src/layouts.js

260 lines
6.0 KiB
JavaScript

// Layout definitions for Lightningbeam
// Each layout defines a workspace preset optimized for different workflows
/**
* Layout Schema:
* {
* name: string,
* description: string,
* layout: {
* type: "pane" | "horizontal-grid" | "vertical-grid",
* name?: string, // for type="pane"
* percent?: number, // for grid types (split percentage)
* children?: [LayoutNode, LayoutNode] // for grid types
* }
* }
*/
export const defaultLayouts = {
animation: {
name: "Animation",
description: "Drawing tools, timeline, and layers front and center",
layout: {
type: "horizontal-grid",
percent: 10,
children: [
{ type: "pane", name: "toolbar" },
{
type: "vertical-grid",
percent: 70,
children: [
{
type: "vertical-grid",
percent: 30,
children: [
{ type: "pane", name: "timeline" },
{ type: "pane", name: "stage" }
]
},
{ type: "pane", name: "infopanel" }
]
}
]
}
},
videoEditing: {
name: "Video Editing",
description: "Clip timeline, source monitor, and effects panel",
layout: {
type: "vertical-grid",
percent: 10,
children: [
{ type: "pane", name: "toolbar" },
{
type: "vertical-grid",
percent: 65,
children: [
{
type: "horizontal-grid",
percent: 50,
children: [
{ type: "pane", name: "stage" },
{ type: "pane", name: "infopanel" }
]
},
{ type: "pane", name: "timeline" }
]
}
]
}
},
audioDaw: {
name: "Audio/DAW",
description: "Audio tracks prominent with mixer, node editor, and preset browser",
layout: {
type: "horizontal-grid",
percent: 75,
children: [
{
type: "vertical-grid",
percent: 50,
children: [
{ type: "pane", name: "timeline" },
{ type: "pane", name: "nodeEditor"}
]
},
{ type: "pane", name: "presetBrowser" }
]
}
},
scripting: {
name: "Scripting",
description: "Code editor, object hierarchy, and console",
layout: {
type: "vertical-grid",
percent: 10,
children: [
{ type: "pane", name: "toolbar" },
{
type: "horizontal-grid",
percent: 70,
children: [
{
type: "vertical-grid",
percent: 50,
children: [
{ type: "pane", name: "stage" },
{ type: "pane", name: "timeline" }
]
},
{
type: "vertical-grid",
percent: 50,
children: [
{ type: "pane", name: "infopanel" },
{ type: "pane", name: "outlineer" }
]
}
]
}
]
}
},
rigging: {
name: "Rigging",
description: "Viewport focused with bone controls and weight painting",
layout: {
type: "vertical-grid",
percent: 10,
children: [
{ type: "pane", name: "toolbar" },
{
type: "horizontal-grid",
percent: 75,
children: [
{ type: "pane", name: "stage" },
{
type: "vertical-grid",
percent: 50,
children: [
{ type: "pane", name: "infopanel" },
{ type: "pane", name: "timeline" }
]
}
]
}
]
}
},
threeD: {
name: "3D",
description: "3D viewport, camera controls, and lighting panel",
layout: {
type: "vertical-grid",
percent: 10,
children: [
{ type: "pane", name: "toolbar" },
{
type: "horizontal-grid",
percent: 70,
children: [
{
type: "vertical-grid",
percent: 70,
children: [
{ type: "pane", name: "stage" },
{ type: "pane", name: "timeline" }
]
},
{ type: "pane", name: "infopanel" }
]
}
]
}
},
drawingPainting: {
name: "Drawing/Painting",
description: "Minimal UI - just canvas and drawing tools",
layout: {
type: "vertical-grid",
percent: 8,
children: [
{ type: "pane", name: "toolbar" },
{
type: "horizontal-grid",
percent: 85,
children: [
{ type: "pane", name: "stage" },
{
type: "vertical-grid",
percent: 70,
children: [
{ type: "pane", name: "infopanel" },
{ type: "pane", name: "timeline" }
]
}
]
}
]
}
},
shaderEditor: {
name: "Shader Editor",
description: "Split between viewport preview and code editor",
layout: {
type: "vertical-grid",
percent: 10,
children: [
{ type: "pane", name: "toolbar" },
{
type: "horizontal-grid",
percent: 50,
children: [
{ type: "pane", name: "stage" },
{
type: "vertical-grid",
percent: 60,
children: [
{ type: "pane", name: "infopanel" },
{ type: "pane", name: "timeline" }
]
}
]
}
]
}
}
};
// Get all layout names
export function getLayoutNames() {
return Object.keys(defaultLayouts);
}
// Get a layout by key
export function getLayout(key) {
return defaultLayouts[key];
}
// Get a layout by name
export function getLayoutByName(name) {
for (const [key, layout] of Object.entries(defaultLayouts)) {
if (layout.name === name) {
return layout;
}
}
return null;
}
// Check if a layout exists
export function layoutExists(key) {
return key in defaultLayouts;
}