Children

Custom main menu, welcome screen, sidebar, and footer via the childrenBuilder prop (React elements). Use UIOptions to control layout (e.g. dockedSidebarBreakpoint).

<script lang="ts">
  import { browser } from "$app/environment";
  import React from "react";
  import Excalidraw from "svelte-excalidraw";

  function buildMainMenu(mod: typeof import("@excalidraw/excalidraw")) {
    const { MainMenu } = mod;
    const Def = MainMenu.DefaultItems;
    return React.createElement(MainMenu, { key: "main-menu" }, [
      React.createElement(
        MainMenu.Group,
        {
          key: "group-defaults",
          title: "Excalidraw items",
        },
        [
          React.createElement(Def.LoadScene, { key: "loadScene" }),
          React.createElement(Def.SaveToActiveFile, {
            key: "saveToActiveFile",
          }),
          React.createElement(Def.SaveAsImage, { key: "saveAsImage" }),
          React.createElement(Def.CommandPalette, { key: "commandPalette" }),
          React.createElement(Def.SearchMenu, { key: "searchMenu" }),
          React.createElement(Def.Help, { key: "help" }),
          React.createElement(Def.ClearCanvas, { key: "clearCanvas" }),
          React.createElement(Def.ToggleTheme, { key: "toggleTheme" }),
          React.createElement(Def.ChangeCanvasBackground, {
            key: "changeCanvasBackground",
          }),
          React.createElement(Def.Export, { key: "export" }),
          React.createElement(Def.LiveCollaborationTrigger, {
            key: "liveCollab",
            onSelect: () => window.alert("Live collaboration"),
            isCollaborating: false,
          }),
          React.createElement(Def.PreferencesToggleGridModeItem, {
            key: "gridMode",
          }),
          React.createElement(Def.PreferencesToggleZenModeItem, {
            key: "zenMode",
          }),
          React.createElement(Def.Preferences, { key: "preferences" }),
        ],
      ),
      React.createElement(
        MainMenu.Group,
        { key: "group-links", title: "Links" },
        [
          React.createElement(
            MainMenu.ItemLink,
            { key: "google", href: "https://google.com" },
            "Google",
          ),
          React.createElement(
            MainMenu.ItemLink,
            { key: "excalidraw", href: "https://excalidraw.com" },
            "Excalidraw",
          ),
        ],
      ),
      React.createElement(
        MainMenu.Group,
        { key: "group-custom", title: "Custom items" },
        [
          React.createElement(
            MainMenu.Item,
            { key: "item1", onSelect: () => window.alert("Item1") },
            "Item1",
          ),
          React.createElement(
            MainMenu.Item,
            { key: "item2", onSelect: () => window.alert("Item 2") },
            "Item 2",
          ),
        ],
      ),
      React.createElement(
        MainMenu.ItemCustom,
        { key: "itemCustom" },
        React.createElement(
          "button",
          {
            style: { height: "2rem" },
            onClick: () => window.alert("custom menu item"),
          },
          "custom item",
        ),
      ),
    ]);
  }

  function buildWelcomeScreen(mod: typeof import("@excalidraw/excalidraw")) {
    return React.createElement(mod.WelcomeScreen, { key: "welcome-screen" });
  }

  function buildSidebar(mod: typeof import("@excalidraw/excalidraw")) {
    const { Sidebar } = mod;
    return React.createElement(
      Sidebar,
      {
        key: "sidebar",
        name: "custom",
        docked: false,
      },
      [
        React.createElement(Sidebar.Header, { key: "header" }),
        React.createElement(
          Sidebar.Tabs,
          { key: "tabs", style: { padding: "0.5rem" } },
          [
            React.createElement(
              Sidebar.Tab,
              { key: "tab-one", tab: "one" },
              "Tab one",
            ),
            React.createElement(
              Sidebar.Tab,
              { key: "tab-two", tab: "two" },
              "Tab two",
            ),
            React.createElement(Sidebar.TabTriggers, { key: "triggers" }, [
              React.createElement(
                Sidebar.TabTrigger,
                { key: "t1", tab: "one" },
                "One",
              ),
              React.createElement(
                Sidebar.TabTrigger,
                { key: "t2", tab: "two" },
                "Two",
              ),
            ]),
          ],
        ),
      ],
    );
  }

  function buildFooter(mod: typeof import("@excalidraw/excalidraw")) {
    const { Footer, Sidebar } = mod;
    return React.createElement(
      Footer,
      { key: "footer" },
      React.createElement(
        Sidebar.Trigger,
        {
          name: "custom",
          tab: "one",
          style: {
            marginLeft: "0.5rem",
            background: "#70b1ec",
            color: "white",
          },
        },
        "Open custom sidebar",
      ),
    );
  }

  function buildChildren(mod: typeof import("@excalidraw/excalidraw")) {
    return React.createElement(React.Fragment, null, [
      buildMainMenu(mod),
      buildWelcomeScreen(mod),
      buildSidebar(mod),
      buildFooter(mod),
    ]);
  }
</script>

{#if browser}
  <Excalidraw
    childrenBuilder={buildChildren}
    UIOptions={{ dockedSidebarBreakpoint: 0 } as any}
    autoFocus={true}
  />
{/if}