Skip to content

Instantly share code, notes, and snippets.

@AgentCoop
Created January 12, 2026 21:47
Show Gist options
  • Select an option

  • Save AgentCoop/dc5c2361e7c8ecd3bd37ff787507cbf2 to your computer and use it in GitHub Desktop.

Select an option

Save AgentCoop/dc5c2361e7c8ecd3bd37ff787507cbf2 to your computer and use it in GitHub Desktop.
Angular Desktop UI Architecture Guide
desktop-ui-app/
β”œβ”€β”€ src/
β”‚ β”œβ”€β”€ app/
β”‚ β”‚ β”œβ”€β”€ core/ # Singleton services, guards
β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window-state.service.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout-persistence.service.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ theme.service.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ shortcut.service.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ drag-drop.service.ts
β”‚ β”‚ β”‚ β”‚ └── core.service.ts
β”‚ β”‚ β”‚ β”œβ”€β”€ guards/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ unsaved-changes.guard.ts
β”‚ β”‚ β”‚ β”‚ └── layout-access.guard.ts
β”‚ β”‚ β”‚ β”œβ”€β”€ interceptors/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window-state.interceptor.ts
β”‚ β”‚ β”‚ β”‚ └── layout.interceptor.ts
β”‚ β”‚ β”‚ β”œβ”€β”€ models/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window.models.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel.models.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ pane.models.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout.models.ts
β”‚ β”‚ β”‚ β”‚ └── index.ts
β”‚ β”‚ β”‚ └── core.module.ts
β”‚ β”‚ β”‚
β”‚ β”‚ β”œβ”€β”€ shared/ # Reusable components, directives, pipes
β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ ui/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ splitter/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ splitter.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ splitter.component.html
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ splitter.component.scss
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── splitter.component.spec.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ resizable/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ resizable.directive.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ resizable-handle.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── index.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ draggable/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ draggable.directive.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ drag-handle.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── index.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ drop-zone/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── drop-zone.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ context-menu/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── context-menu.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── tooltip/
β”‚ β”‚ β”‚ β”‚ β”‚ └── custom-tooltip.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ icons/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ app-icon.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ file-icon.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── folder-icon.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── layout/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ empty-state/
β”‚ β”‚ β”‚ β”‚ β”‚ └── empty-state.component.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ loading/
β”‚ β”‚ β”‚ β”‚ β”‚ └── loading.component.ts
β”‚ β”‚ β”‚ β”‚ └── error-state/
β”‚ β”‚ β”‚ β”‚ └── error-state.component.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ directives/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ auto-focus.directive.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ drag-drop.directive.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ resize-observer.directive.ts
β”‚ β”‚ β”‚ β”‚ └── click-outside.directive.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ pipes/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ file-size.pipe.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ safe-url.pipe.ts
β”‚ β”‚ β”‚ β”‚ └── truncate.pipe.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ utils/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ dom.utils.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout.utils.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ geometry.utils.ts
β”‚ β”‚ β”‚ β”‚ └── color.utils.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ └── shared.module.ts
β”‚ β”‚ β”‚
β”‚ β”‚ β”œβ”€β”€ layout/ # Main layout components
β”‚ β”‚ β”‚ β”œβ”€β”€ shell/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ shell.component.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ shell.component.html
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ shell.component.scss
β”‚ β”‚ β”‚ β”‚ └── shell.component.spec.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ window-manager/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window-container/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── window-container.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── window.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window-header/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── window-header.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window-resize-handles/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── window-resize-handles.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── window-minimap/
β”‚ β”‚ β”‚ β”‚ β”‚ └── window-minimap.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window-manager.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window-factory.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── window-zorder.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── window-manager.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ panel-system/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel-container/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── panel-container.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── panel.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel-header/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── panel-header.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel-group/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── panel-group.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ dock-container/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── dock-container.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── floating-panel/
β”‚ β”‚ β”‚ β”‚ β”‚ └── floating-panel.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel-manager.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ dock.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── splitter.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── panel-system.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ tiling-system/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ tiling-container/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── tiling-container.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ split-view/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── split-view.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ grid-layout/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── grid-layout.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ tab-group-container/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── tab-group-container.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── layout-minimap/
β”‚ β”‚ β”‚ β”‚ β”‚ └── layout-minimap.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ tiling-manager.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout-engine.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── snap-guide.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── tiling-system.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ pane-system/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ pane/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ pane-header/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── pane-header.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ tab-group/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── tab-group.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ tab-item/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── tab-item.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ pane-split-controls/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── pane-split-controls.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── pane-drop-zone/
β”‚ β”‚ β”‚ β”‚ β”‚ └── pane-drop-zone.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ pane-manager.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ tab-manager.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── content-link.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── pane-system.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ desktop-ui/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ menu-bar/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── menu-bar.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ taskbar/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── taskbar.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ system-tray/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── system-tray.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ desktop-icons/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── desktop-icons.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ virtual-desktop-switcher/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── virtual-desktop-switcher.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── notification-center/
β”‚ β”‚ β”‚ β”‚ β”‚ └── notification-center.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ desktop-manager.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ virtual-desktop.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── notification.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── desktop-ui.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ layout-manager/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout-manager/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── layout-manager.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout-presets/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── layout-presets.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout-import-export/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── layout-import-export.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── layout-history/
β”‚ β”‚ β”‚ β”‚ β”‚ └── layout-history.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout-manager.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout-persistence.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── layout-history.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── layout-manager.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ └── layout.module.ts
β”‚ β”‚ β”‚
β”‚ β”‚ β”œβ”€β”€ features/ # Feature modules (lazy-loaded)
β”‚ β”‚ β”‚ β”œβ”€β”€ file-explorer/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ file-explorer-panel/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── file-explorer-panel.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ file-tree/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── file-tree.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ file-list/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── file-list.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ breadcrumb/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── breadcrumb.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ quick-access/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── quick-access.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── file-preview/
β”‚ β”‚ β”‚ β”‚ β”‚ └── file-preview.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ file-system.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ file-icon.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── file-search.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panes/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ file-explorer-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── file-explorer-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── file-search-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ └── file-search-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── file-explorer.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ editor/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ editor-toolbar/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── editor-toolbar.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ editor-status-bar/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── editor-status-bar.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ editor-minimap/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── editor-minimap.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ editor-gutter/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── editor-gutter.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── editor-sidebar/
β”‚ β”‚ β”‚ β”‚ β”‚ └── editor-sidebar.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ editor.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ syntax-highlight.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ auto-complete.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── linting.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panes/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ code-editor-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── code-editor-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ markdown-editor-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── markdown-editor-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── json-editor-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ └── json-editor-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── editor.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ terminal/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ terminal-toolbar/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── terminal-toolbar.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ terminal-tabs/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── terminal-tabs.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── terminal-settings/
β”‚ β”‚ β”‚ β”‚ β”‚ └── terminal-settings.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ terminal.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ shell.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── command-history.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panes/
β”‚ β”‚ β”‚ β”‚ β”‚ └── terminal-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ └── terminal-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── terminal.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ debugger/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ debug-toolbar/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── debug-toolbar.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ call-stack/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── call-stack.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ variables-view/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── variables-view.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ breakpoints/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── breakpoints.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── debug-console/
β”‚ β”‚ β”‚ β”‚ β”‚ └── debug-console.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ debugger.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ breakpoint.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── debug-adapter.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panes/
β”‚ β”‚ β”‚ β”‚ β”‚ └── debugger-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ └── debugger-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── debugger.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ git/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ git-status/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── git-status.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ git-history/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── git-history.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ git-branches/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── git-branches.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ git-diff/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── git-diff.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── git-commit/
β”‚ β”‚ β”‚ β”‚ β”‚ └── git-commit.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ git.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── diff.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panes/
β”‚ β”‚ β”‚ β”‚ β”‚ └── git-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ └── git-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── git.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ settings/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ settings-navigation/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── settings-navigation.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ settings-editor/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── settings-editor.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ settings-theme/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── settings-theme.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ settings-shortcuts/
β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ └── settings-shortcuts.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚ └── settings-layout/
β”‚ β”‚ β”‚ β”‚ β”‚ └── settings-layout.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”‚ └── settings.service.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panes/
β”‚ β”‚ β”‚ β”‚ β”‚ └── settings-pane/
β”‚ β”‚ β”‚ β”‚ β”‚ └── settings-pane.component.ts
β”‚ β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”‚ └── settings.module.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ └── search/
β”‚ β”‚ β”‚ β”œβ”€β”€ components/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ search-bar/
β”‚ β”‚ β”‚ β”‚ β”‚ └── search-bar.component.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ search-results/
β”‚ β”‚ β”‚ β”‚ β”‚ └── search-results.component.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ find-replace/
β”‚ β”‚ β”‚ β”‚ β”‚ └── find-replace.component.ts
β”‚ β”‚ β”‚ β”‚ └── advanced-search/
β”‚ β”‚ β”‚ β”‚ └── advanced-search.component.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ services/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ search.service.ts
β”‚ β”‚ β”‚ β”‚ └── find-replace.service.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ panes/
β”‚ β”‚ β”‚ β”‚ └── search-pane/
β”‚ β”‚ β”‚ β”‚ └── search-pane.component.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ └── search.module.ts
β”‚ β”‚ β”‚
β”‚ β”‚ β”œβ”€β”€ store/ # State management (if using NgRx/NGXS)
β”‚ β”‚ β”‚ β”œβ”€β”€ state/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ app.state.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout.state.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window.state.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel.state.ts
β”‚ β”‚ β”‚ β”‚ └── pane.state.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ actions/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout.actions.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window.actions.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel.actions.ts
β”‚ β”‚ β”‚ β”‚ └── pane.actions.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ reducers/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout.reducer.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window.reducer.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel.reducer.ts
β”‚ β”‚ β”‚ β”‚ └── pane.reducer.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ effects/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout.effects.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window.effects.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel.effects.ts
β”‚ β”‚ β”‚ β”‚ └── pane.effects.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ selectors/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ layout.selectors.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window.selectors.ts
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel.selectors.ts
β”‚ β”‚ β”‚ β”‚ └── pane.selectors.ts
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ └── store.module.ts
β”‚ β”‚ β”‚
β”‚ β”‚ β”œβ”€β”€ app.component.ts
β”‚ β”‚ β”œβ”€β”€ app.component.html
β”‚ β”‚ β”œβ”€β”€ app.component.scss
β”‚ β”‚ └── app.module.ts
β”‚ β”‚
β”‚ β”œβ”€β”€ assets/
β”‚ β”‚ β”œβ”€β”€ icons/
β”‚ β”‚ β”‚ β”œβ”€β”€ file-icons/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ typescript.svg
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ javascript.svg
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ html.svg
β”‚ β”‚ β”‚ β”‚ └── css.svg
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ β”œβ”€β”€ app-icons/
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ window.svg
β”‚ β”‚ β”‚ β”‚ β”œβ”€β”€ panel.svg
β”‚ β”‚ β”‚ β”‚ └── pane.svg
β”‚ β”‚ β”‚ β”‚
β”‚ β”‚ β”‚ └── system-icons/
β”‚ β”‚ β”‚ β”œβ”€β”€ close.svg
β”‚ β”‚ β”‚ β”œβ”€β”€ minimize.svg
β”‚ β”‚ β”‚ β”œβ”€β”€ maximize.svg
β”‚ β”‚ β”‚ └── restore.svg
β”‚ β”‚ β”‚
β”‚ β”‚ β”œβ”€β”€ themes/
β”‚ β”‚ β”‚ β”œβ”€β”€ dark-theme.scss
β”‚ β”‚ β”‚ β”œβ”€β”€ light-theme.scss
β”‚ β”‚ β”‚ └── high-contrast-theme.scss
β”‚ β”‚ β”‚
β”‚ β”‚ └── layouts/
β”‚ β”‚ β”œβ”€β”€ default-layout.json
β”‚ β”‚ β”œβ”€β”€ web-dev-layout.json
β”‚ β”‚ β”œβ”€β”€ data-science-layout.json
β”‚ β”‚ └── presentation-layout.json
β”‚ β”‚
β”‚ β”œβ”€β”€ environments/
β”‚ β”‚ β”œβ”€β”€ environment.ts
β”‚ β”‚ β”œβ”€β”€ environment.prod.ts
β”‚ β”‚ └── environment.dev.ts
β”‚ β”‚
β”‚ β”œβ”€β”€ styles/
β”‚ β”‚ β”œβ”€β”€ _variables.scss
β”‚ β”‚ β”œβ”€β”€ _mixins.scss
β”‚ β”‚ β”œβ”€β”€ _animations.scss
β”‚ β”‚ β”œβ”€β”€ _themes.scss
β”‚ β”‚ β”œβ”€β”€ _layout.scss
β”‚ β”‚ β”œβ”€β”€ _window.scss
β”‚ β”‚ β”œβ”€β”€ _panel.scss
β”‚ β”‚ β”œβ”€β”€ _pane.scss
β”‚ β”‚ β”œβ”€β”€ _dock.scss
β”‚ β”‚ β”œβ”€β”€ _splitter.scss
β”‚ β”‚ β”œβ”€β”€ _tab.scss
β”‚ β”‚ β”œβ”€β”€ _taskbar.scss
β”‚ β”‚ β”œβ”€β”€ _menu-bar.scss
β”‚ β”‚ └── styles.scss
β”‚ β”‚
β”‚ └── index.html
β”‚
β”œβ”€β”€ .editorconfig
β”œβ”€β”€ .gitignore
β”œβ”€β”€ angular.json
β”œβ”€β”€ package.json
β”œβ”€β”€ tsconfig.json
β”œβ”€β”€ tsconfig.app.json
β”œβ”€β”€ tsconfig.spec.json
└── README.md
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment