66 HomeIcon , ReaderIcon , GearIcon , LayersIcon , CubeIcon , ChatBubbleIcon ,
77 DoubleArrowLeftIcon ,
88} from "@radix-ui/react-icons" ;
9- import { GlobalHeader } from "./components/GlobalHeader" ;
9+ import { GlobalHeader , VerticalFeatureTabs } from "./components/GlobalHeader" ;
1010import { setAutoCopyOnSelect , getAutoCopyOnSelect } from "./components/Terminal" ;
1111import { Collapsible , CollapsibleTrigger , CollapsibleContent as CollapsibleBody } from "./components/ui/collapsible" ;
1212import { Switch } from "./components/ui/switch" ;
@@ -24,7 +24,7 @@ import type {
2424 TemplatesCatalog , UserProfile ,
2525} from "./types" ;
2626import { useAtom } from "jotai" ;
27- import { sidebarCollapsedAtom , marketplaceCategoryAtom , shortenPathsAtom , profileAtom , navigationStateAtom , viewAtom , viewHistoryAtom , historyIndexAtom } from "./store" ;
27+ import { sidebarCollapsedAtom , marketplaceCategoryAtom , shortenPathsAtom , profileAtom , navigationStateAtom , viewAtom , viewHistoryAtom , historyIndexAtom , featureTabsLayoutAtom , workspaceDataAtom } from "./store" ;
2828import { AppConfigContext , useAppConfig , type AppConfig } from "./context" ;
2929import { FEATURES , FEATURE_ICONS } from "./constants" ;
3030// Modular views
@@ -103,6 +103,8 @@ function App() {
103103 } , [ setNavigationState ] ) ;
104104
105105 const [ sidebarCollapsed , setSidebarCollapsed ] = useAtom ( sidebarCollapsedAtom ) ;
106+ const [ featureTabsLayout ] = useAtom ( featureTabsLayoutAtom ) ;
107+ const [ workspace ] = useAtom ( workspaceDataAtom ) ;
106108 const [ marketplaceCategory , setMarketplaceCategory ] = useAtom ( marketplaceCategoryAtom ) ;
107109 const [ catalog , setCatalog ] = useState < TemplatesCatalog | null > ( null ) ;
108110 const [ homeDir , setHomeDir ] = useState ( "" ) ;
@@ -246,6 +248,9 @@ function App() {
246248 onShowProfileDialog = { ( ) => setShowProfileDialog ( true ) }
247249 onShowSettings = { ( ) => setShowSettings ( true ) }
248250 />
251+ < div className = "flex-1 flex overflow-hidden" >
252+ { /* Vertical Feature Tabs Sidebar */ }
253+ { featureTabsLayout === "vertical" && workspace && < VerticalFeatureTabs /> }
249254 < main className = "flex-1 overflow-auto" >
250255 { view . type === "home" && (
251256 < Home
@@ -432,6 +437,7 @@ function App() {
432437 ) }
433438 { view . type === "feature-todo" && < FeatureTodo feature = { view . feature } /> }
434439 </ main >
440+ </ div >
435441 </ div >
436442 ) : (
437443 < div className = "h-screen bg-canvas flex" >
@@ -785,6 +791,7 @@ function App() {
785791function AppSettingsDialog ( { open, onClose } : { open : boolean ; onClose : ( ) => void } ) {
786792 const { shortenPaths, setShortenPaths } = useAppConfig ( ) ;
787793 const [ autoCopy , setAutoCopy ] = useState ( getAutoCopyOnSelect ) ;
794+ const [ featureTabsLayout , setFeatureTabsLayout ] = useAtom ( featureTabsLayoutAtom ) ;
788795
789796 const handleAutoCopyChange = ( checked : boolean ) => {
790797 setAutoCopy ( checked ) ;
@@ -812,6 +819,34 @@ function AppSettingsDialog({ open, onClose }: { open: boolean; onClose: () => vo
812819 </ div >
813820 < Switch checked = { shortenPaths } onCheckedChange = { setShortenPaths } />
814821 </ div >
822+ < div className = "flex items-center justify-between" >
823+ < div >
824+ < p className = "text-sm font-medium text-ink" > Project tabs layout</ p >
825+ < p className = "text-xs text-muted-foreground" > Position of project/feature tabs</ p >
826+ </ div >
827+ < div className = "flex gap-0.5 p-0.5 bg-muted rounded-lg" >
828+ < button
829+ onClick = { ( ) => setFeatureTabsLayout ( "horizontal" ) }
830+ className = { `px-2.5 py-1 text-xs rounded-md transition-colors ${
831+ featureTabsLayout === "horizontal"
832+ ? "bg-background text-ink shadow-sm"
833+ : "text-muted-foreground hover:text-ink"
834+ } `}
835+ >
836+ Horizontal
837+ </ button >
838+ < button
839+ onClick = { ( ) => setFeatureTabsLayout ( "vertical" ) }
840+ className = { `px-2.5 py-1 text-xs rounded-md transition-colors ${
841+ featureTabsLayout === "vertical"
842+ ? "bg-background text-ink shadow-sm"
843+ : "text-muted-foreground hover:text-ink"
844+ } `}
845+ >
846+ Vertical
847+ </ button >
848+ </ div >
849+ </ div >
815850 </ div >
816851 { /* Terminal */ }
817852 < div className = "space-y-3" >
0 commit comments