import { For, Show, createSignal, type JSX } from "solid-js"; import { ChevronRight, Plus, X } from "../../../lib/icons"; import { createLongPressGesture } from "../createLongPressGesture"; import { activeProject, activeServer, createWorkspaceStaticTarget, createWorkspaceSurfaceTarget, createWorkspaceTreeTarget, workspaceStaticItems, workspaceTree, type SidebarItem, type WorkspaceContextMenuAction, type WorkspaceContextMenuTarget, type WorkspaceStaticItem, type WorkspaceTreeNode, } from "../data/shell.data"; import { WorkspaceMobileActionSheet } from "../WorkspaceMobileActionSheet/WorkspaceMobileActionSheet"; import styles from "./MobileWorkspaceBrowser.module.scss"; type MobileWorkspaceBrowserProps = { open: boolean; onClose: VoidFunction; }; const TreeRow = (props: { node: WorkspaceTreeNode; depth?: number }): JSX.Element => { const depth = props.depth ?? 0; const Icon = props.node.icon; const hasChildren = (props.node.children?.length ?? 0) > 0; return ( ); }; const StaticRow = (props: { item: SidebarItem }): JSX.Element => { const Icon = props.item.icon; return ( ); }; const WorkspaceStaticRow = (props: { item: WorkspaceStaticItem; onOpenActionSheet: (target: WorkspaceContextMenuTarget) => void; }): JSX.Element => { const target = createWorkspaceStaticTarget(props.item); const longPress = createLongPressGesture({ onLongPress: () => { props.onOpenActionSheet(target); }, }); return (
  • { event.preventDefault(); props.onOpenActionSheet(target); }} {...longPress} >
  • ); }; const WorkspaceTreeBranch = (props: { nodes: readonly WorkspaceTreeNode[]; depth?: number; onOpenActionSheet: (target: WorkspaceContextMenuTarget) => void; }): JSX.Element => { const depth = props.depth ?? 0; return ( {(node): JSX.Element => { const target = createWorkspaceTreeTarget(node); const longPress = createLongPressGesture({ onLongPress: () => { props.onOpenActionSheet(target); }, }); return (
  • { event.preventDefault(); props.onOpenActionSheet(target); }} {...longPress} >
  • ); }}
    ); }; export const MobileWorkspaceBrowser = (props: MobileWorkspaceBrowserProps): JSX.Element => { const [actionSheetTarget, setActionSheetTarget] = createSignal(null); const sectionNodes = workspaceTree.filter((node) => (node.children?.length ?? 0) > 0); const looseNodes = workspaceTree.filter((node) => (node.children?.length ?? 0) === 0); const workspaceTarget = createWorkspaceSurfaceTarget(activeProject); const openActionSheet = (target: WorkspaceContextMenuTarget): void => { setActionSheetTarget(target); }; const closeActionSheet = (): void => { setActionSheetTarget(null); }; const openWorkspaceActionSheet = (): void => { openActionSheet(workspaceTarget); }; const handleActionSelect = (_action: WorkspaceContextMenuAction, _target: WorkspaceContextMenuTarget): void => { // Mobile first pass only establishes the action-sheet IA and long-press behavior. }; const workspaceLongPress = createLongPressGesture({ onLongPress: openWorkspaceActionSheet, }); return (
    { event.preventDefault(); openWorkspaceActionSheet(); }} {...workspaceLongPress} > {/* Long-pressing the browser header exposes workspace-level actions on mobile. */} Moku Work {activeProject.name} {activeServer.name}
    Workspace
      {(item): JSX.Element => }
    Items
    0}>
    More
    ); };