---
title: "editorPanel"
description: "A dock tab in the editor, as an asset. A <name>.editorPanel/ folder carries an init.luau that returns the tab's spec:"
section: "Types"
slug: "types-editorpanel"
canonical: "https://origozero.ai/docs/types-editorpanel"
updated: "2026-09-05T16:41:47.088290658+00:00"
tags: ["asset-type", "reference"]
---

# editorPanel

```luau
local edui = require("@builtin::editor.edui.framework")

return {
    title = "My Tab",        -- the tab's label
    order = 60,              -- sort position in the Window menu
    dock = "bottom",         -- seed area: left | right | bottom | center
    startClosed = true,      -- registered closed; opened from the Window menu
    build = function()       -- the tab's body, rebuilt on the shell's cadence
        return edui.panel{ body = edui.text{ text = "hello" } }
    end,
}
```

The tab id defaults to the folder stem (`myTab.editorPanel` -> `myTab`); an
explicit `id` overrides it. An init may return a LIST of specs when one asset
carries several tabs.

The type's `onRegister` lifecycle registers every instance into the editor
shell: live on `asset.create`, in the world-load sweep for the open world's
panels, and from the boot prelude for the built-in library's. Adding a tab to
a project is authoring one of these folders under `/source/editorPanels/`;
saving it makes the tab appear, editing it re-registers it, deleting it
removes it. Nothing registers panels by name anywhere.
