import { For, Show, createSignal, type JSX } from "solid-js"; import { ChevronRight, Plus, X } from "../../../lib/icons"; import { useAppShellData } from "../data/app-shell.context"; import { createLongPressGesture } from "../createLongPressGesture"; import { createWorkspaceStaticTarget, createWorkspaceSurfaceTarget, createWorkspaceTreeTarget, getWorkspaceNodeIcon, workspaceStaticItems, 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 = getWorkspaceNodeIcon(props.node); 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 appShellData = useAppShellData(); const [actionSheetTarget, setActionSheetTarget] = createSignal(null); const sectionNodes = () => appShellData.workspaceTree().filter((node) => (node.children?.length ?? 0) > 0); const looseNodes = () => appShellData.workspaceTree().filter((node) => (node.children?.length ?? 0) === 0); const workspaceTarget = () => createWorkspaceSurfaceTarget(appShellData.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 {appShellData.activeProject().name} {appShellData.activeServer().name}
    Workspace
      {(item): JSX.Element => }
    Items
    0}>
    More
    ); };