@ai-matrx/canvas 0.10.36 → 0.10.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/react.d.cts CHANGED
@@ -323,6 +323,14 @@ interface CanvasHostPorts {
323
323
  readonly output?: CanvasOutputPorts | undefined;
324
324
  }
325
325
  type CanvasTabStripMode = "auto" | "always";
326
+ /**
327
+ * How panes are drawn. "card" (default): rounded cards on the column's frame, the header a
328
+ * compact strip (Claude desktop / Codex). "mac": a macOS window section — no card, the column
329
+ * flush to the window's edge behind one hairline, each pane's header a unified-toolbar band
330
+ * (the title centred in bold with its proxy icon, or the kind's Toolbar in its place, as Safari's
331
+ * address bar is), and two or more tabs in a tab bar under it (Terminal, Finder, Safari).
332
+ */
333
+ type CanvasLook = "card" | "mac";
326
334
  /**
327
335
  * One contextual launcher entry: a page offers something about ITSELF in the
328
336
  * canvas's "New tab" launcher ("This chat's documents" on a chat page) for as
@@ -356,8 +364,10 @@ interface CanvasProviderProps extends CanvasHostPorts {
356
364
  readonly regionWidth?: number | null;
357
365
  /** "auto": a pane with one tab shows a title instead of a tab strip. Default "auto". */
358
366
  readonly tabStrip?: CanvasTabStripMode;
367
+ /** "mac": panes are macOS window sections (see CanvasLook). Default "card". */
368
+ readonly look?: CanvasLook;
359
369
  }
360
- declare function CanvasProvider({ children, store, persistence, onError, hotkeys, windowId: windowIdProp, layoutRules, regionWidth, tabStrip, itemActions, popOut, dockBack, showMenu, overlay, onNativeBodyFrame, output, }: CanvasProviderProps): react.JSX.Element;
370
+ declare function CanvasProvider({ children, store, persistence, onError, hotkeys, windowId: windowIdProp, layoutRules, regionWidth, tabStrip, look, itemActions, popOut, dockBack, showMenu, overlay, onNativeBodyFrame, output, }: CanvasProviderProps): react.JSX.Element;
361
371
  /**
362
372
  * Renders a subtree as ANOTHER window of the same canvas — the web host's
363
373
  * pop-out panel: `<CanvasWindowScope windowId={id}><CanvasColumn placement="fill"/></CanvasWindowScope>`.
@@ -652,4 +662,4 @@ interface BrowserBarProps {
652
662
  */
653
663
  declare function BrowserBar({ url, canGoBack, canGoForward, onBack, onForward, onReload, onNavigate, trailing, className }: BrowserBarProps): react.JSX.Element;
654
664
 
655
- export { type AnyCanvasKind, BrowserBar, type BrowserBarProps, type BrowserTab, BrowserTabs, type BrowserTabsProps, CANVAS_TAB_LIST_ROOM, CANVAS_TAB_MIN_WIDTH, CanvasColumn, type CanvasColumnProps, type CanvasFloating, CanvasFrame, CanvasHeaderButton, type CanvasHeaderButtonProps, type CanvasHostPorts, type CanvasKind, type CanvasKindIcon, CanvasKindIcons, type CanvasKindProps, type CanvasKindSurface, type CanvasLauncherEntry, type CanvasMenuEntry, type CanvasMenuItem, CanvasMenuTrigger, type CanvasNativeBodyFrame, type CanvasNativeBodyInfo, type CanvasNativeRect, type CanvasOutputHandlers, type CanvasOutputPorts, type CanvasOutputRequest, type CanvasOverlayPort, CanvasPaneView, CanvasPanel, CanvasPanelEmpty, type CanvasPanelProps, CanvasProvider, type CanvasProviderProps, type CanvasShowMenu, type CanvasStripEntry, type CanvasStripTab, CanvasTab, type CanvasTabProps, type CanvasTabStripMode, type CanvasTabWindow, CanvasToggle, CanvasWindowScope, CanvasWindowTabs, beginCanvasResize, canvasItemElement, canvasKindOutputProblems, canvasKindSurface, canvasOutputMenu, canvasSessionKey, defineCanvasKind, fitCanvasTabWindow, getCanvasKind, itemTitle, listCanvasKinds, planCanvasTabStrip, registerCanvasKind, registerCanvasKinds, useCanvas, useCanvasColumnWidth, useCanvasHostPorts, useCanvasIsPresented, useCanvasKind, useCanvasKindToggle, useCanvasKinds, useCanvasLauncherEntries, useCanvasLauncherEntry, useCanvasMenuItems, useCanvasNativeBodies, useCanvasOutput, useCanvasPresentation, useCanvasState, useCanvasWindowId, useOptionalCanvas, useOptionalCanvasState };
665
+ export { type AnyCanvasKind, BrowserBar, type BrowserBarProps, type BrowserTab, BrowserTabs, type BrowserTabsProps, CANVAS_TAB_LIST_ROOM, CANVAS_TAB_MIN_WIDTH, CanvasColumn, type CanvasColumnProps, type CanvasFloating, CanvasFrame, CanvasHeaderButton, type CanvasHeaderButtonProps, type CanvasHostPorts, type CanvasKind, type CanvasKindIcon, CanvasKindIcons, type CanvasKindProps, type CanvasKindSurface, type CanvasLauncherEntry, type CanvasLook, type CanvasMenuEntry, type CanvasMenuItem, CanvasMenuTrigger, type CanvasNativeBodyFrame, type CanvasNativeBodyInfo, type CanvasNativeRect, type CanvasOutputHandlers, type CanvasOutputPorts, type CanvasOutputRequest, type CanvasOverlayPort, CanvasPaneView, CanvasPanel, CanvasPanelEmpty, type CanvasPanelProps, CanvasProvider, type CanvasProviderProps, type CanvasShowMenu, type CanvasStripEntry, type CanvasStripTab, CanvasTab, type CanvasTabProps, type CanvasTabStripMode, type CanvasTabWindow, CanvasToggle, CanvasWindowScope, CanvasWindowTabs, beginCanvasResize, canvasItemElement, canvasKindOutputProblems, canvasKindSurface, canvasOutputMenu, canvasSessionKey, defineCanvasKind, fitCanvasTabWindow, getCanvasKind, itemTitle, listCanvasKinds, planCanvasTabStrip, registerCanvasKind, registerCanvasKinds, useCanvas, useCanvasColumnWidth, useCanvasHostPorts, useCanvasIsPresented, useCanvasKind, useCanvasKindToggle, useCanvasKinds, useCanvasLauncherEntries, useCanvasLauncherEntry, useCanvasMenuItems, useCanvasNativeBodies, useCanvasOutput, useCanvasPresentation, useCanvasState, useCanvasWindowId, useOptionalCanvas, useOptionalCanvasState };
package/dist/react.d.ts CHANGED
@@ -323,6 +323,14 @@ interface CanvasHostPorts {
323
323
  readonly output?: CanvasOutputPorts | undefined;
324
324
  }
325
325
  type CanvasTabStripMode = "auto" | "always";
326
+ /**
327
+ * How panes are drawn. "card" (default): rounded cards on the column's frame, the header a
328
+ * compact strip (Claude desktop / Codex). "mac": a macOS window section — no card, the column
329
+ * flush to the window's edge behind one hairline, each pane's header a unified-toolbar band
330
+ * (the title centred in bold with its proxy icon, or the kind's Toolbar in its place, as Safari's
331
+ * address bar is), and two or more tabs in a tab bar under it (Terminal, Finder, Safari).
332
+ */
333
+ type CanvasLook = "card" | "mac";
326
334
  /**
327
335
  * One contextual launcher entry: a page offers something about ITSELF in the
328
336
  * canvas's "New tab" launcher ("This chat's documents" on a chat page) for as
@@ -356,8 +364,10 @@ interface CanvasProviderProps extends CanvasHostPorts {
356
364
  readonly regionWidth?: number | null;
357
365
  /** "auto": a pane with one tab shows a title instead of a tab strip. Default "auto". */
358
366
  readonly tabStrip?: CanvasTabStripMode;
367
+ /** "mac": panes are macOS window sections (see CanvasLook). Default "card". */
368
+ readonly look?: CanvasLook;
359
369
  }
360
- declare function CanvasProvider({ children, store, persistence, onError, hotkeys, windowId: windowIdProp, layoutRules, regionWidth, tabStrip, itemActions, popOut, dockBack, showMenu, overlay, onNativeBodyFrame, output, }: CanvasProviderProps): react.JSX.Element;
370
+ declare function CanvasProvider({ children, store, persistence, onError, hotkeys, windowId: windowIdProp, layoutRules, regionWidth, tabStrip, look, itemActions, popOut, dockBack, showMenu, overlay, onNativeBodyFrame, output, }: CanvasProviderProps): react.JSX.Element;
361
371
  /**
362
372
  * Renders a subtree as ANOTHER window of the same canvas — the web host's
363
373
  * pop-out panel: `<CanvasWindowScope windowId={id}><CanvasColumn placement="fill"/></CanvasWindowScope>`.
@@ -652,4 +662,4 @@ interface BrowserBarProps {
652
662
  */
653
663
  declare function BrowserBar({ url, canGoBack, canGoForward, onBack, onForward, onReload, onNavigate, trailing, className }: BrowserBarProps): react.JSX.Element;
654
664
 
655
- export { type AnyCanvasKind, BrowserBar, type BrowserBarProps, type BrowserTab, BrowserTabs, type BrowserTabsProps, CANVAS_TAB_LIST_ROOM, CANVAS_TAB_MIN_WIDTH, CanvasColumn, type CanvasColumnProps, type CanvasFloating, CanvasFrame, CanvasHeaderButton, type CanvasHeaderButtonProps, type CanvasHostPorts, type CanvasKind, type CanvasKindIcon, CanvasKindIcons, type CanvasKindProps, type CanvasKindSurface, type CanvasLauncherEntry, type CanvasMenuEntry, type CanvasMenuItem, CanvasMenuTrigger, type CanvasNativeBodyFrame, type CanvasNativeBodyInfo, type CanvasNativeRect, type CanvasOutputHandlers, type CanvasOutputPorts, type CanvasOutputRequest, type CanvasOverlayPort, CanvasPaneView, CanvasPanel, CanvasPanelEmpty, type CanvasPanelProps, CanvasProvider, type CanvasProviderProps, type CanvasShowMenu, type CanvasStripEntry, type CanvasStripTab, CanvasTab, type CanvasTabProps, type CanvasTabStripMode, type CanvasTabWindow, CanvasToggle, CanvasWindowScope, CanvasWindowTabs, beginCanvasResize, canvasItemElement, canvasKindOutputProblems, canvasKindSurface, canvasOutputMenu, canvasSessionKey, defineCanvasKind, fitCanvasTabWindow, getCanvasKind, itemTitle, listCanvasKinds, planCanvasTabStrip, registerCanvasKind, registerCanvasKinds, useCanvas, useCanvasColumnWidth, useCanvasHostPorts, useCanvasIsPresented, useCanvasKind, useCanvasKindToggle, useCanvasKinds, useCanvasLauncherEntries, useCanvasLauncherEntry, useCanvasMenuItems, useCanvasNativeBodies, useCanvasOutput, useCanvasPresentation, useCanvasState, useCanvasWindowId, useOptionalCanvas, useOptionalCanvasState };
665
+ export { type AnyCanvasKind, BrowserBar, type BrowserBarProps, type BrowserTab, BrowserTabs, type BrowserTabsProps, CANVAS_TAB_LIST_ROOM, CANVAS_TAB_MIN_WIDTH, CanvasColumn, type CanvasColumnProps, type CanvasFloating, CanvasFrame, CanvasHeaderButton, type CanvasHeaderButtonProps, type CanvasHostPorts, type CanvasKind, type CanvasKindIcon, CanvasKindIcons, type CanvasKindProps, type CanvasKindSurface, type CanvasLauncherEntry, type CanvasLook, type CanvasMenuEntry, type CanvasMenuItem, CanvasMenuTrigger, type CanvasNativeBodyFrame, type CanvasNativeBodyInfo, type CanvasNativeRect, type CanvasOutputHandlers, type CanvasOutputPorts, type CanvasOutputRequest, type CanvasOverlayPort, CanvasPaneView, CanvasPanel, CanvasPanelEmpty, type CanvasPanelProps, CanvasProvider, type CanvasProviderProps, type CanvasShowMenu, type CanvasStripEntry, type CanvasStripTab, CanvasTab, type CanvasTabProps, type CanvasTabStripMode, type CanvasTabWindow, CanvasToggle, CanvasWindowScope, CanvasWindowTabs, beginCanvasResize, canvasItemElement, canvasKindOutputProblems, canvasKindSurface, canvasOutputMenu, canvasSessionKey, defineCanvasKind, fitCanvasTabWindow, getCanvasKind, itemTitle, listCanvasKinds, planCanvasTabStrip, registerCanvasKind, registerCanvasKinds, useCanvas, useCanvasColumnWidth, useCanvasHostPorts, useCanvasIsPresented, useCanvasKind, useCanvasKindToggle, useCanvasKinds, useCanvasLauncherEntries, useCanvasLauncherEntry, useCanvasMenuItems, useCanvasNativeBodies, useCanvasOutput, useCanvasPresentation, useCanvasState, useCanvasWindowId, useOptionalCanvas, useOptionalCanvasState };
package/dist/react.js CHANGED
@@ -1999,6 +1999,7 @@ function CanvasProvider({
1999
1999
  layoutRules,
2000
2000
  regionWidth = null,
2001
2001
  tabStrip = "auto",
2002
+ look = "card",
2002
2003
  itemActions,
2003
2004
  popOut,
2004
2005
  dockBack,
@@ -2055,8 +2056,8 @@ function CanvasProvider({
2055
2056
  return () => window.removeEventListener("keydown", onKey);
2056
2057
  }, [controller, hotkeys, windowId]);
2057
2058
  const value = useMemo(
2058
- () => ({ controller, windowId, ports: hostPorts, layer, regionWidth, tabStrip, launcherEntries, itemMenus, itemOutputs }),
2059
- [controller, windowId, hostPorts, layer, regionWidth, tabStrip, launcherEntries, itemMenus, itemOutputs]
2059
+ () => ({ controller, windowId, ports: hostPorts, layer, regionWidth, tabStrip, look, launcherEntries, itemMenus, itemOutputs }),
2060
+ [controller, windowId, hostPorts, layer, regionWidth, tabStrip, look, launcherEntries, itemMenus, itemOutputs]
2060
2061
  );
2061
2062
  return /* @__PURE__ */ jsxs(CanvasContext.Provider, { value, children: [
2062
2063
  children,
@@ -3291,7 +3292,8 @@ function parseWindowTabs(signature) {
3291
3292
  }
3292
3293
  function CanvasPaneView({ paneId }) {
3293
3294
  const canvas = useCanvas();
3294
- const { windowId, tabStrip } = useCanvasInternals();
3295
+ const { windowId, tabStrip, look } = useCanvasInternals();
3296
+ const mac = look === "mac";
3295
3297
  const columnSlots = useCanvasSlots();
3296
3298
  const [ownSlots] = useState5(createCanvasSlots);
3297
3299
  const slots = columnSlots ?? ownSlots;
@@ -3333,6 +3335,34 @@ function CanvasPaneView({ paneId }) {
3333
3335
  const tabs = singlePane ? parseWindowTabs(windowTabs) : pane.itemIds.map((itemId, index) => ({ itemId, paneId, index }));
3334
3336
  const single = tabStrip === "auto" && tabs.length === 1 && active;
3335
3337
  const closeLabel = role === "pop-out" && paneCount === 1 ? "Close window" : paneCount > 1 ? "Close pane" : "Close canvas";
3338
+ const newTab = inWindowStrip ? null : /* @__PURE__ */ jsx7(CanvasHeaderButton, { className: "mxc-new-tab", label: "New tab", onClick: () => void canvas.newTab(paneId), children: /* @__PURE__ */ jsx7(PlusIcon, {}) });
3339
+ const history = /* @__PURE__ */ jsxs6(Fragment2, { children: [
3340
+ canGoBack && active ? /* @__PURE__ */ jsx7(CanvasHeaderButton, { className: "mxc-back", label: "Back", shortcut: canvasShortcutHint("canvas.back", isMac()), onClick: () => void canvas.back(active.id), children: /* @__PURE__ */ jsx7(ChevronLeftIcon, {}) }) : null,
3341
+ canGoForward && active ? /* @__PURE__ */ jsx7(
3342
+ CanvasHeaderButton,
3343
+ {
3344
+ className: "mxc-forward",
3345
+ label: "Forward",
3346
+ shortcut: canvasShortcutHint("canvas.forward", isMac()),
3347
+ onClick: () => void canvas.forward(active.id),
3348
+ children: /* @__PURE__ */ jsx7(ChevronRightIcon, {})
3349
+ }
3350
+ ) : null
3351
+ ] });
3352
+ const toolbar = Toolbar && kindProps ? /* @__PURE__ */ jsx7("div", { className: "mxc-item-toolbar", "data-kind": active?.kind, children: /* @__PURE__ */ jsx7(ToolbarBoundary, { kindId: kind?.id ?? "", children: /* @__PURE__ */ jsx7(Toolbar, { ...kindProps }) }) }) : null;
3353
+ const macTabBar = mac && !inWindowStrip && tabs.length > 1;
3354
+ const header = mac ? /* @__PURE__ */ jsxs6(Fragment2, { children: [
3355
+ history,
3356
+ toolbar ? null : active ? /* @__PURE__ */ jsx7(WindowTitle, { item: active, kind }) : /* @__PURE__ */ jsx7("span", { className: "mxc-panel-title mxc-window-title", children: "New tab" })
3357
+ ] }) : /* @__PURE__ */ jsxs6(Fragment2, { children: [
3358
+ history,
3359
+ inWindowStrip ? active ? /* @__PURE__ */ jsx7(PaneTitle, { item: active, kind }) : /* @__PURE__ */ jsx7("span", { className: "mxc-panel-title", children: "New tab" }) : single && active ? /* @__PURE__ */ jsx7(SingleTitle, { item: active, kind }) : tabs.length > 0 ? /* @__PURE__ */ jsx7(TabStrip, { tabs, activeItemId: pane.activeItemId }) : /* @__PURE__ */ jsx7("span", { className: "mxc-panel-title", children: "New tab" }),
3360
+ newTab
3361
+ ] });
3362
+ const kindAction = Action && kindProps ? (
3363
+ // Its own gapless row: a kind's tap buttons space themselves (the tap-target placement rule).
3364
+ /* @__PURE__ */ jsx7("span", { className: "mxc-kind-actions", children: /* @__PURE__ */ jsx7(Action, { ...kindProps }) })
3365
+ ) : null;
3336
3366
  return /* @__PURE__ */ jsxs6(
3337
3367
  CanvasPanel,
3338
3368
  {
@@ -3342,26 +3372,13 @@ function CanvasPaneView({ paneId }) {
3342
3372
  title: active ? itemTitle(active, kind) : "Canvas",
3343
3373
  focused,
3344
3374
  "data-mxc-pane": paneId,
3345
- header: /* @__PURE__ */ jsxs6(Fragment2, { children: [
3346
- canGoBack && active ? /* @__PURE__ */ jsx7(CanvasHeaderButton, { className: "mxc-back", label: "Back", shortcut: canvasShortcutHint("canvas.back", isMac()), onClick: () => void canvas.back(active.id), children: /* @__PURE__ */ jsx7(ChevronLeftIcon, {}) }) : null,
3347
- canGoForward && active ? /* @__PURE__ */ jsx7(
3348
- CanvasHeaderButton,
3349
- {
3350
- className: "mxc-forward",
3351
- label: "Forward",
3352
- shortcut: canvasShortcutHint("canvas.forward", isMac()),
3353
- onClick: () => void canvas.forward(active.id),
3354
- children: /* @__PURE__ */ jsx7(ChevronRightIcon, {})
3355
- }
3356
- ) : null,
3357
- inWindowStrip ? active ? /* @__PURE__ */ jsx7(PaneTitle, { item: active, kind }) : /* @__PURE__ */ jsx7("span", { className: "mxc-panel-title", children: "New tab" }) : single && active ? /* @__PURE__ */ jsx7(SingleTitle, { item: active, kind }) : tabs.length > 0 ? /* @__PURE__ */ jsx7(TabStrip, { tabs, activeItemId: pane.activeItemId }) : /* @__PURE__ */ jsx7("span", { className: "mxc-panel-title", children: "New tab" }),
3358
- inWindowStrip ? null : /* @__PURE__ */ jsx7(CanvasHeaderButton, { className: "mxc-new-tab", label: "New tab", onClick: () => void canvas.newTab(paneId), children: /* @__PURE__ */ jsx7(PlusIcon, {}) })
3359
- ] }),
3360
- leading: Leading && kindProps ? /* @__PURE__ */ jsx7(Leading, { ...kindProps }) : null,
3361
- actions: Action && kindProps ? (
3362
- // Its own gapless row: a kind's tap buttons space themselves (the tap-target placement rule).
3363
- /* @__PURE__ */ jsx7("span", { className: "mxc-kind-actions", children: /* @__PURE__ */ jsx7(Action, { ...kindProps }) })
3364
- ) : null,
3375
+ header,
3376
+ leading: mac ? toolbar : Leading && kindProps ? /* @__PURE__ */ jsx7(Leading, { ...kindProps }) : null,
3377
+ actions: mac ? /* @__PURE__ */ jsxs6(Fragment2, { children: [
3378
+ Leading && kindProps ? /* @__PURE__ */ jsx7(Leading, { ...kindProps }) : null,
3379
+ kindAction,
3380
+ newTab
3381
+ ] }) : kindAction,
3365
3382
  renderMenu: () => /* @__PURE__ */ jsx7(
3366
3383
  PaneMenu,
3367
3384
  {
@@ -3386,7 +3403,8 @@ function CanvasPaneView({ paneId }) {
3386
3403
  },
3387
3404
  ...drop,
3388
3405
  children: [
3389
- Toolbar && kindProps ? /* @__PURE__ */ jsx7("div", { className: "mxc-item-toolbar", "data-kind": active?.kind, children: /* @__PURE__ */ jsx7(ToolbarBoundary, { kindId: kind?.id ?? "", children: /* @__PURE__ */ jsx7(Toolbar, { ...kindProps }) }) }) : null,
3406
+ macTabBar ? /* @__PURE__ */ jsx7("div", { className: "mxc-tab-bar", "data-slot": "canvas-tab-bar", children: /* @__PURE__ */ jsx7(TabStrip, { tabs, activeItemId: pane.activeItemId }) }) : null,
3407
+ mac ? null : toolbar,
3390
3408
  /* @__PURE__ */ jsx7("div", { ref: bodyRef, className: "mxc-pane-slot", "data-mxc-slot": paneId, children: pane.itemIds.length === 0 ? /* @__PURE__ */ jsx7(EmptyPaneLauncher, { paneId }) : columnSlots ? null : /* @__PURE__ */ jsx7(CanvasPaneInlineBodies, { paneId, slots }) })
3391
3409
  ]
3392
3410
  }
@@ -3416,6 +3434,16 @@ function SingleTitle({ item, kind }) {
3416
3434
  /* @__PURE__ */ jsx7("button", { type: "button", className: "mxc-tab-close", "data-slot": "browser-tab-close", "aria-label": `Close ${title}`, onClick: () => canvas.close(item.id), children: /* @__PURE__ */ jsx7(CloseIcon, {}) })
3417
3435
  ] });
3418
3436
  }
3437
+ function WindowTitle({ item, kind }) {
3438
+ const title = itemTitle(item, kind);
3439
+ const drag = useTabDrag(item.id, title);
3440
+ const name = useTruncated(title);
3441
+ const Icon = kind?.icon ?? AlertIcon;
3442
+ return /* @__PURE__ */ jsxs6("span", { className: "mxc-panel-title mxc-window-title", "data-slot": "canvas-window-title", "data-truncated": name.truncated ? "" : void 0, title, children: [
3443
+ /* @__PURE__ */ jsx7("span", { className: "mxc-proxy-icon", "data-draggable": "", ...drag, children: /* @__PURE__ */ jsx7(Icon, { className: "mxc-title-icon" }) }),
3444
+ /* @__PURE__ */ jsx7("span", { ref: name.ref, className: "mxc-tab-title", children: title })
3445
+ ] });
3446
+ }
3419
3447
  function PaneTitle({ item, kind }) {
3420
3448
  const title = itemTitle(item, kind);
3421
3449
  const drag = useTabDrag(item.id, title);
@@ -3866,7 +3894,7 @@ function useCanvasColumnWidth() {
3866
3894
  return fitCanvasWidth(width, region, controller.rules);
3867
3895
  }
3868
3896
  function CanvasColumn({ className, style, onLiveWidth, placement = "docked" }) {
3869
- const { controller, windowId, layer } = useCanvasInternals();
3897
+ const { controller, windowId, layer, look } = useCanvasInternals();
3870
3898
  const isOpen = useCanvasState((s) => selectCanvasIsOpen(s, windowId));
3871
3899
  const isFullscreen = useCanvasState((s) => selectCanvasIsFullscreen(s, windowId));
3872
3900
  const width = useCanvasState((s) => selectCanvasWidth(s, windowId));
@@ -3932,6 +3960,7 @@ function CanvasColumn({ className, style, onLiveWidth, placement = "docked" }) {
3932
3960
  "data-open": isOpen ? "" : void 0,
3933
3961
  "data-fullscreen": isOpen && isFullscreen ? "" : void 0,
3934
3962
  "data-placement": placement,
3963
+ "data-look": look,
3935
3964
  "data-mxc-window": windowId,
3936
3965
  "aria-label": "Canvas",
3937
3966
  "aria-hidden": isOpen ? void 0 : true,