From 90133c9dd6ccb56256bc6226fa47582e47347911 Mon Sep 17 00:00:00 2001 From: crs48 Date: Sat, 7 Mar 2026 16:56:08 -0800 Subject: [PATCH 1/2] fix(ui): avoid invalid base menu labels - render simple menu labels as static text instead of Base UI group labels - prevent SystemMenu from crashing the Electron shell on open - keep advanced dropdown group label exports unchanged for grouped menus --- packages/ui/src/primitives/Menu.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/ui/src/primitives/Menu.tsx b/packages/ui/src/primitives/Menu.tsx index e68bdf73..fd24578a 100644 --- a/packages/ui/src/primitives/Menu.tsx +++ b/packages/ui/src/primitives/Menu.tsx @@ -115,11 +115,7 @@ export function MenuSeparator() { * A label for use with the simple Menu component. */ export function MenuLabel({ children }: { children: React.ReactNode }) { - return ( - - {children} - - ) + return
{children}
} // ─── Compound Components (for advanced usage) ─────────────────────── From 49c845916e118900083aa0c92dbf922a813da20a Mon Sep 17 00:00:00 2001 From: crs48 Date: Tue, 10 Mar 2026 16:43:06 -0700 Subject: [PATCH 2/2] fix(electron): restore canvas workspace height - replace the canvas shell wrapper with full-height sizing so it cannot collapse inside the absolute workspace shell - add a renderer regression test that guards the canvas host height contract --- .../renderer/components/CanvasView.test.tsx | 70 +++++++++++++++++++ .../src/renderer/components/CanvasView.tsx | 2 +- 2 files changed, 71 insertions(+), 1 deletion(-) create mode 100644 apps/electron/src/renderer/components/CanvasView.test.tsx diff --git a/apps/electron/src/renderer/components/CanvasView.test.tsx b/apps/electron/src/renderer/components/CanvasView.test.tsx new file mode 100644 index 00000000..a797eadf --- /dev/null +++ b/apps/electron/src/renderer/components/CanvasView.test.tsx @@ -0,0 +1,70 @@ +/** + * @vitest-environment jsdom + */ + +import { render, screen } from '@testing-library/react' +import React from 'react' +import { beforeEach, describe, expect, it, vi } from 'vitest' +import { CanvasView } from './CanvasView' + +const mockUseIdentity = vi.fn() +const mockUseNode = vi.fn() + +vi.mock('@xnetjs/canvas', async () => { + const ReactModule = await import('react') + + return { + Canvas: ReactModule.forwardRef(function MockCanvas() { + return
canvas
+ }), + createNode: vi.fn(() => ({ + id: 'node-1', + type: 'card', + position: { x: 0, y: 0, width: 100, height: 100 }, + properties: {} + })) + } +}) + +vi.mock('@xnetjs/data', () => ({ + CanvasSchema: { + schema: { + '@id': 'xnet://schema/canvas' + } + } +})) + +vi.mock('@xnetjs/react', () => ({ + useIdentity: (...args: unknown[]) => mockUseIdentity(...args), + useNode: (...args: unknown[]) => mockUseNode(...args) +})) + +describe('CanvasView', () => { + beforeEach(() => { + const nodesMap = { + size: 0, + observe: vi.fn(), + unobserve: vi.fn() + } + + mockUseIdentity.mockReturnValue({ did: 'did:key:test' }) + mockUseNode.mockReturnValue({ + data: { title: 'Workspace Canvas' }, + doc: { + getMap: vi.fn(() => nodesMap) + }, + loading: false, + awareness: null + }) + }) + + it('keeps the canvas host at full height for the renderer shell', () => { + render() + + const canvas = screen.getByTestId('mock-canvas') + const canvasHost = canvas.parentElement?.parentElement + + expect(canvasHost).not.toBeNull() + expect(canvasHost?.className).toContain('h-full') + }) +}) diff --git a/apps/electron/src/renderer/components/CanvasView.tsx b/apps/electron/src/renderer/components/CanvasView.tsx index ea2a0fe0..b086aa63 100644 --- a/apps/electron/src/renderer/components/CanvasView.tsx +++ b/apps/electron/src/renderer/components/CanvasView.tsx @@ -227,7 +227,7 @@ export const CanvasView = forwardRef(function } return ( -
+
{canvas?.title || 'Workspace Canvas'}