tabby-tabbyspaces 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/.claude/settings.local.json +29 -2
  2. package/.github/workflows/ci.yml +26 -0
  3. package/.github/workflows/claude-code-review.yml +44 -0
  4. package/.github/workflows/claude.yml +81 -0
  5. package/.github/workflows/release.yml +30 -0
  6. package/CHANGELOG.md +92 -20
  7. package/CLAUDE.md +196 -15
  8. package/CONTRIBUTING.md +3 -1
  9. package/README.md +80 -61
  10. package/RELEASE.md +91 -0
  11. package/TODO.md +77 -0
  12. package/dist/build-config.d.ts +3 -3
  13. package/dist/components/deleteConfirmModal.component.d.ts +7 -0
  14. package/dist/components/deleteConfirmModal.component.d.ts.map +1 -0
  15. package/dist/components/paneEditor.component.d.ts +9 -13
  16. package/dist/components/paneEditor.component.d.ts.map +1 -1
  17. package/dist/components/splitPreview.component.d.ts +50 -35
  18. package/dist/components/splitPreview.component.d.ts.map +1 -1
  19. package/dist/components/workspaceEditor.component.d.ts +61 -28
  20. package/dist/components/workspaceEditor.component.d.ts.map +1 -1
  21. package/dist/components/workspaceList.component.d.ts +56 -27
  22. package/dist/components/workspaceList.component.d.ts.map +1 -1
  23. package/dist/index.d.ts +6 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.LICENSE.txt +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/models/workspace.model.d.ts +118 -76
  29. package/dist/models/workspace.model.d.ts.map +1 -1
  30. package/dist/package.json +26 -0
  31. package/dist/providers/config.provider.d.ts +8 -8
  32. package/dist/providers/settings.provider.d.ts +7 -7
  33. package/dist/providers/settings.provider.d.ts.map +1 -1
  34. package/dist/providers/toolbar.provider.d.ts +23 -12
  35. package/dist/providers/toolbar.provider.d.ts.map +1 -1
  36. package/dist/services/startupCommand.service.d.ts +28 -0
  37. package/dist/services/startupCommand.service.d.ts.map +1 -0
  38. package/dist/services/workspaceBackground.service.d.ts +38 -0
  39. package/dist/services/workspaceBackground.service.d.ts.map +1 -0
  40. package/dist/services/workspaceEditor.service.d.ts +46 -24
  41. package/dist/services/workspaceEditor.service.d.ts.map +1 -1
  42. package/docs/DESIGN.md +57 -0
  43. package/docs/SESSION-2026-01-14-S1-DESIGN.md +134 -0
  44. package/docs/marketing_status.md +92 -0
  45. package/mockups/index.html +162 -0
  46. package/mockups/s1-tight-sharp.html +522 -0
  47. package/mockups/shared/base.css +216 -0
  48. package/mockups/v06-tabbed.html +643 -0
  49. package/package.json +3 -7
  50. package/screenshots/editor.png +0 -0
  51. package/screenshots/pane-edit.png +0 -0
  52. package/scripts/build-dev.js +2 -1
  53. package/scripts/build-prod.js +40 -0
  54. package/src/components/deleteConfirmModal.component.ts +23 -0
  55. package/src/components/paneEditor.component.pug +27 -43
  56. package/src/components/paneEditor.component.scss +37 -85
  57. package/src/components/paneEditor.component.ts +6 -16
  58. package/src/components/splitPreview.component.pug +36 -5
  59. package/src/components/splitPreview.component.scss +78 -45
  60. package/src/components/splitPreview.component.ts +83 -18
  61. package/src/components/workspaceEditor.component.pug +162 -74
  62. package/src/components/workspaceEditor.component.scss +261 -108
  63. package/src/components/workspaceEditor.component.ts +294 -31
  64. package/src/components/workspaceList.component.pug +32 -41
  65. package/src/components/workspaceList.component.scss +89 -74
  66. package/src/components/workspaceList.component.ts +181 -44
  67. package/src/index.ts +6 -0
  68. package/src/models/workspace.model.ts +113 -8
  69. package/src/providers/settings.provider.ts +2 -2
  70. package/src/providers/toolbar.provider.ts +113 -13
  71. package/src/services/startupCommand.service.ts +140 -0
  72. package/src/services/workspaceBackground.service.ts +167 -0
  73. package/src/services/workspaceEditor.service.ts +134 -65
  74. package/src/styles/_index.scss +3 -0
  75. package/src/styles/_mixins.scss +180 -0
  76. package/src/styles/_variables.scss +67 -0
  77. package/RELEASE_PLAN.md +0 -161
  78. package/screenshots/workspace-edit.png +0 -0
package/README.md CHANGED
@@ -1,61 +1,80 @@
1
- # TabbySpaces
2
-
3
- Visual workspace editor for [Tabby](https://tabby.sh). Create split-layout terminal workspaces without touching config files.
4
-
5
- ![Workspace Editor](screenshots/editor.png)
6
-
7
- ## What it does
8
-
9
- - Visual editor for split layouts (horizontal/vertical, nested, any depth)
10
- - Per-pane configuration: profile, working directory, startup command, title
11
- - One-click workspace launch from toolbar
12
- - Hotkey support for quick workspace switching
13
- - Works with any shell (Bash, Zsh, PowerShell, Nushell, etc.)
14
-
15
- ## Install
16
-
17
- **From Tabby Plugin Manager:**
18
- Settings Plugins Search "tabbyspaces" Install
19
-
20
- **Manual:**
21
- ```bash
22
- cd ~/.config/tabby/plugins # or %APPDATA%\tabby\plugins on Windows
23
- npm install tabby-tabbyspaces
24
- ```
25
-
26
- Restart Tabby after installation.
27
-
28
- ## Usage
29
-
30
- 1. Open Settings TabbySpaces
31
- 2. Create a workspace
32
- 3. Design your split layout visually
33
- 4. Configure each pane (profile, cwd, startup command)
34
- 5. Save and launch from the toolbar
35
-
36
- ### Workspace editor
37
-
38
- ![Edit Workspace](screenshots/workspace-edit.png)
39
-
40
- ### Pane configuration
41
-
42
- ![Edit Pane](screenshots/pane-edit.png)
43
-
44
- ## About this project
45
-
46
- This plugin was written 100% by [Claude Code](https://claude.ai/code).
47
-
48
- Igor Halilović had the idea and provided product direction. He hates Angular so much (19 years of web dev, wrote his own TypeScript framework) that he didn't look at this code. Not once. He told Claude Code what he wanted, Claude Code built it.
49
-
50
- Human provides the *what* and *why*. AI handles the *how*.
51
-
52
- ## Tech
53
-
54
- - Angular 15 (Tabby's framework)
55
- - TypeScript 4.9
56
- - Webpack 5
57
- - Pug templates, SCSS styles
58
-
59
- ## License
60
-
61
- MIT
1
+ # TabbySpaces
2
+
3
+ Visual workspace editor for [Tabby](https://tabby.sh). Create split-layout terminal workspaces without touching config files.
4
+
5
+ ![Workspace Editor](screenshots/editor.png)
6
+
7
+ ## Features
8
+
9
+ - **Visual split editor** - Design layouts inline, not in modal dialogs. Split horizontally, vertically, nest to any depth
10
+ - **Layout toolbar** - Select a pane, then split, add adjacent panes, or delete with toolbar buttons
11
+ - **Per-pane configuration** - Set profile, working directory, and startup command for each pane
12
+ - **One-click launch** - Open workspaces instantly from the toolbar dropdown
13
+ - **Launch on startup** - Auto-open multiple workspaces when Tabby starts
14
+ - **Any shell** - Works with Bash, Zsh, PowerShell, Nushell, cmd, WSL, and any other shell Tabby supports
15
+
16
+ ## Screenshots
17
+
18
+ | Editor with selected pane | Pane configuration |
19
+ |---------------------------|-------------------|
20
+ | ![Editor](screenshots/editor.png) | ![Pane Edit](screenshots/pane-edit.png) |
21
+
22
+ ## About this project
23
+
24
+ This plugin was written 100% by [Claude Code](https://claude.ai/code).
25
+
26
+ Igor Halilovic had the idea and provided product direction. He hates Angular so much (19 years of web dev, wrote his own TypeScript framework) that he didn't look at this code. Not once. He told Claude Code what he wanted, Claude Code built it.
27
+
28
+ Human provides the *what* and *why*. AI handles the *how*.
29
+
30
+ Here's the fun part: to test this plugin, we built [tabby-mcp](https://github.com/halilc4/tabby-mcp) - an MCP server that lets Claude Code interact with Tabby via CDP. So the AI that built TabbySpaces can now test it too. Full circle.
31
+
32
+ ## Install
33
+
34
+ **From Tabby Plugin Manager:**
35
+ Settings > Plugins > Search "tabbyspaces" > Install
36
+
37
+ **Manual:**
38
+ ```bash
39
+ cd ~/.config/tabby/plugins # or %APPDATA%\tabby\plugins on Windows
40
+ npm install tabby-tabbyspaces
41
+ ```
42
+
43
+ Restart Tabby after installation.
44
+
45
+ ## Quick Start
46
+
47
+ 1. **Open settings** - Settings > TabbySpaces
48
+ 2. **Create workspace** - Click "New Workspace", name it
49
+ 3. **Design layout** - Click a pane to select it, use toolbar to split (horizontal/vertical)
50
+ 4. **Configure panes** - Click a pane (or use its context menu) to set profile, cwd, startup command
51
+ 5. **Save and launch** - Save changes, then click "Open" or use the toolbar dropdown
52
+
53
+ ## Roadmap
54
+
55
+ - Hotkey support for quick workspace switching
56
+ - Pane presets (saved configurations for quick adding)
57
+ - Resize panes in editor (adjust split ratios)
58
+ - Drag and drop panes (reorganize layout by dragging)
59
+
60
+ ## Tech
61
+
62
+ - Angular 15 (Tabby's framework)
63
+ - TypeScript 4.9
64
+ - Webpack 5
65
+ - Pug templates, SCSS styles
66
+
67
+ ## Community
68
+
69
+ - [Discussions](https://github.com/halilc4/tabbyspaces/discussions) - Questions, ideas, show your setup
70
+ - [Issues](https://github.com/halilc4/tabbyspaces/issues) - Bug reports
71
+
72
+ ## Contributing
73
+
74
+ PRs welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions.
75
+
76
+ All PRs go to the `dev` branch. CI checks the build automatically.
77
+
78
+ ## License
79
+
80
+ MIT
package/RELEASE.md ADDED
@@ -0,0 +1,91 @@
1
+ # Release Workflow
2
+
3
+ ## Trenutno stanje
4
+ - **Dev branch**: 15 commit-a ispred main-a
5
+ - **Verzija**: 0.0.1
6
+ - **Tagovi**: Nema
7
+ - **PROD instalacija**: Lokalni symlink (za testiranje)
8
+ - **Status**: U toku testiranja (2026-01-13)
9
+
10
+ ## Instalacije u Tabby plugins
11
+ ```json
12
+ // %APPDATA%\tabby\plugins\package.json
13
+ {
14
+ "dependencies": {
15
+ "tabby-tabbyspaces": "file:../../../../tabbyspaces/dist", // LOKALNI SYMLINK (za testiranje)
16
+ "tabby-tabbyspaces-dev": "file:../../../../tabbyspaces/dist-dev"
17
+ }
18
+ }
19
+ ```
20
+
21
+ | Verzija | Config key | Ikonica | Update |
22
+ |---------|------------|---------|--------|
23
+ | PROD | `tabbyspaces` | Grid (`th-large`) | `npm run build` + restart |
24
+ | DEV | `tabbyspaces_dev` | Bolt (`bolt`) | `npm run build:dev` + restart |
25
+
26
+ ## Testiranje (ručno)
27
+
28
+ ### Funkcionalnosti za testirati
29
+ - [x] Plugin se pojavljuje u Settings sidebar (ikonica `th-large`, ne `bolt`)
30
+ - [x] Toolbar dugme (grid ikonica)
31
+ - [x] Kreiranje novog workspace-a
32
+ - [x] Split layout editing (horizontal/vertical)
33
+ - [x] Pane selection i editing
34
+ - [x] Startup command
35
+ - [x] Launch on startup
36
+ - [x] Čuvanje u `config.store.tabbyspaces`
37
+
38
+ ### Install/Uninstall
39
+ - [x] Uninstall PROD (`npm uninstall tabby-tabbyspaces`)
40
+ - [x] Install lokalni symlink (`npm install dist`)
41
+ - [x] Reinstall sa npm registry (`npm install tabby-tabbyspaces`)
42
+
43
+ ### Napomene iz testiranja
44
+ - Na prvi pogled funkcionalno radi
45
+ - (dodaj napomene tokom testiranja)
46
+
47
+ ### Iterativno testiranje
48
+ ```bash
49
+ # Napravi promenu → build → restart Tabby
50
+ npm run build
51
+ ```
52
+
53
+ ## Release (kad bude spremno)
54
+
55
+ ```bash
56
+ # 1. Bump verziju u package.json (npr. "0.1.0")
57
+
58
+ # 2. Final build
59
+ npm run build
60
+
61
+ # 3. Commit
62
+ git add package.json
63
+ git commit -m "Bump version to 0.1.0"
64
+
65
+ # 4. Merge u main
66
+ git checkout main
67
+ git merge dev
68
+
69
+ # 5. Tag
70
+ git tag v0.1.0
71
+
72
+ # 6. Push
73
+ git push origin main
74
+ git push --tags
75
+
76
+ # 7. Publish na npm
77
+ cd dist
78
+ npm publish
79
+
80
+ # 8. Vrati se na dev
81
+ git checkout dev
82
+ ```
83
+
84
+ ## Posle testiranja (opciono)
85
+
86
+ Vrati PROD na npm registry verziju:
87
+ ```bash
88
+ cd %APPDATA%\tabby\plugins
89
+ npm uninstall tabby-tabbyspaces
90
+ npm install tabby-tabbyspaces
91
+ ```
package/TODO.md ADDED
@@ -0,0 +1,77 @@
1
+ # TODO
2
+
3
+ > **Note:** Please write all entries in English.
4
+
5
+ ## To Do
6
+
7
+ ### Layout Editing
8
+ - [ ] Polish design
9
+ - [ ] Find better way to display nested panes in editor
10
+
11
+ ### UX Improvements
12
+ - [ ] Split/Add pane: duplicate existing pane instead of creating empty one
13
+ - [ ] List: add small layout preview
14
+ - [ ] Better input for command
15
+ - [ ] Better input for cwd
16
+ - [ ] Editor workspace + pane editor autosave
17
+ - [ ] Undo/redo for editor changes
18
+
19
+ ### Bugs
20
+ - [~] Resize panes in Tabby reverts to original values (ratio problem) - WATCH: happens only on one workspace
21
+ - [ ] Layout preview responsive - nested splits don't adapt well to smaller sizes
22
+ - [ ] Launch on startup - Tabby remembers open tabs, check if we can detect if workspace is already open; if not, kill the feature
23
+ - [x] Tab titles are a mess - keep only workspace name or default to Tabby behavior (verify no caching/lookup by tab name)
24
+
25
+ ### Other
26
+ - [ ] Update screenshots in README
27
+
28
+ ## Roadmap
29
+
30
+ - [ ] Pane presets (saved pane configurations for quick adding)
31
+ - [ ] Resize panes (adjust ratios in editor)
32
+ - [ ] Drag and drop panes (reorganize layout by dragging)
33
+
34
+ ---
35
+
36
+ ## Done
37
+
38
+ ### Layout Editing
39
+ - [x] Remove two layout vert/hor buttons from toolbar (and horizontal/vertical text from list)
40
+ - [x] Enable selection in toolbar, add button for edit pane (not on click)
41
+ - [x] When item selected in toolbar - show options similar to context menu
42
+ - [x] Context menu for pane: add to left/right/top/bottom alongside split options + edit pane
43
+ - [x] Instead of "click to edit" - edit icon in pane corner
44
+ - [x] Title bug - better handling
45
+ - [x] Edit icon on pane: show on hover instead of on selection
46
+
47
+ ### UX Improvements
48
+ - [x] Pane title format: `(Title - )? Base Profile` (show base profile if no custom title)
49
+ - [x] Move run button to workspace list
50
+ - [x] Launch on startup: switch from single workspace option to multi-select (multiple workspaces can be marked)
51
+ - [x] Not-saved / "you have changes" indicator (compare state after change with saved)
52
+ - [x] New workspace: focus on name input, no default value, placeholder "Name your workspace"
53
+ - [x] Save button: disabled when no changes, enabled when there are (replacement for indicator)
54
+ - [x] Duplicate: select new workspace after duplicating
55
+ - [x] Open/Run/Duplicate/Delete buttons select workspace - add stopPropagation
56
+ - [x] Rename "Run" to "Open" with appropriate icon
57
+
58
+ ### Other
59
+ - [x] Different icon for DEV version (easier distinction in Settings)
60
+ - [x] Open workspace from workspace editor
61
+ - [x] Move workspace edit dialog inline above workspace list (always one selected)
62
+ - [x] Icon picker as dropdown next to color picker (similar UI)
63
+ - [x] Randomize color and icon on new workspace + focus on name input
64
+ - [x] Refactoring: Remove profile persistence, shell-aware CWD, dead code cleanup
65
+
66
+ ### Bugs
67
+ - [x] Focus lost after deleting workspace (native confirm() steals focus from Electron) - fix: use NgbModal instead
68
+ - [x] Audit async functions - check if `detectChanges()` is missing after async operations that change state
69
+ - [x] Split pane runs command (in-memory profiles) - fix: clear profile.options.args after command execution
70
+ - [x] Pane editor modal bug - mouseup outside dialog closes modal. Dialog should close only on Esc or close/cancel/save button
71
+ - [x] Migration and profile deletion not working (fix: timing - cleanup was called before config.store loaded)
72
+ - [x] New workspace: focus on name input not working
73
+ - [x] Built-in shells (PowerShell, cmd, WSL) weren't working - filter looked for `type === 'local'` instead of `type.startsWith('local:')`
74
+ - [x] Fallback for built-in profile lookup (cache all profiles before opening workspace)
75
+
76
+ ### Notes
77
+ - **CWD**: Uses native `options.cwd` in recovery token - shell spawns directly in target directory without visible `cd` commands.
@@ -1,4 +1,4 @@
1
- export declare const CONFIG_KEY: string;
2
- export declare const DISPLAY_NAME: string;
3
- export declare const IS_DEV: boolean;
1
+ export declare const CONFIG_KEY: string;
2
+ export declare const DISPLAY_NAME: string;
3
+ export declare const IS_DEV: boolean;
4
4
  //# sourceMappingURL=build-config.d.ts.map
@@ -0,0 +1,7 @@
1
+ import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap';
2
+ export declare class DeleteConfirmModalComponent {
3
+ modal: NgbActiveModal;
4
+ workspaceName: string;
5
+ constructor(modal: NgbActiveModal);
6
+ }
7
+ //# sourceMappingURL=deleteConfirmModal.component.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deleteConfirmModal.component.d.ts","sourceRoot":"","sources":["../../src/components/deleteConfirmModal.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAA;AAE3D,qBAgBa,2BAA2B;IAEnB,KAAK,EAAE,cAAc;IAD/B,aAAa,SAAK;gBACR,KAAK,EAAE,cAAc;CACzC"}
@@ -1,14 +1,10 @@
1
- import { EventEmitter, OnInit } from '@angular/core';
2
- import { WorkspacePane, TabbyProfile } from '../models/workspace.model';
3
- export declare class PaneEditorComponent implements OnInit {
4
- pane: WorkspacePane;
5
- profiles: TabbyProfile[];
6
- save: EventEmitter<WorkspacePane>;
7
- cancel: EventEmitter<void>;
8
- editedPane: WorkspacePane;
9
- ngOnInit(): void;
10
- onSave(): void;
11
- onCancel(): void;
12
- getProfileName(profileId: string): string;
13
- }
1
+ import { EventEmitter } from '@angular/core';
2
+ import { WorkspacePane, TabbyProfile } from '../models/workspace.model';
3
+ export declare class PaneEditorComponent {
4
+ pane: WorkspacePane;
5
+ profiles: TabbyProfile[];
6
+ close: EventEmitter<void>;
7
+ onEscapeKey(): void;
8
+ getProfileName(profileId: string): string;
9
+ }
14
10
  //# sourceMappingURL=paneEditor.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"paneEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/paneEditor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAEvE,qBAKa,mBAAoB,YAAW,MAAM;IACvC,IAAI,EAAG,aAAa,CAAA;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC5B,IAAI,8BAAoC;IACxC,MAAM,qBAA2B;IAE3C,UAAU,EAAG,aAAa,CAAA;IAE1B,QAAQ,IAAI,IAAI;IAIhB,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAI1C"}
1
+ {"version":3,"file":"paneEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/paneEditor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAgB,MAAM,eAAe,CAAA;AACpF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAEvE,qBAKa,mBAAmB;IACrB,IAAI,EAAG,aAAa,CAAA;IACpB,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC5B,KAAK,qBAA2B;IAG1C,WAAW,IAAI,IAAI;IAInB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;CAI1C"}
@@ -1,36 +1,51 @@
1
- import { EventEmitter } from '@angular/core';
2
- import { WorkspaceSplit, WorkspacePane } from '../models/workspace.model';
3
- import { WorkspaceEditorService } from '../services/workspaceEditor.service';
4
- export declare class SplitPreviewComponent {
5
- private workspaceService;
6
- split: WorkspaceSplit;
7
- depth: number;
8
- paneClick: EventEmitter<WorkspacePane>;
9
- splitHorizontal: EventEmitter<WorkspacePane>;
10
- splitVertical: EventEmitter<WorkspacePane>;
11
- removePane: EventEmitter<WorkspacePane>;
12
- contextMenuPane: WorkspacePane | null;
13
- contextMenuPosition: {
14
- x: number;
15
- y: number;
16
- };
17
- constructor(workspaceService: WorkspaceEditorService);
18
- isPane(child: WorkspacePane | WorkspaceSplit): boolean;
19
- isSplit(child: WorkspacePane | WorkspaceSplit): boolean;
20
- asSplit(child: WorkspacePane | WorkspaceSplit): WorkspaceSplit;
21
- asPane(child: WorkspacePane | WorkspaceSplit): WorkspacePane;
22
- getFlexStyle(index: number): string;
23
- onPaneClick(pane: WorkspacePane): void;
24
- onContextMenu(event: MouseEvent, pane: WorkspacePane): void;
25
- closeContextMenu(): void;
26
- onSplitH(): void;
27
- onSplitV(): void;
28
- onRemove(): void;
29
- getProfileName(profileId: string): string;
30
- getPaneLabel(pane: WorkspacePane): string;
31
- onNestedPaneClick(pane: WorkspacePane): void;
32
- onNestedSplitH(pane: WorkspacePane): void;
33
- onNestedSplitV(pane: WorkspacePane): void;
34
- onNestedRemove(pane: WorkspacePane): void;
35
- }
1
+ import { EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core';
2
+ import { WorkspaceSplit, WorkspacePane, TabbyProfile } from '../models/workspace.model';
3
+ export declare class SplitPreviewComponent implements OnChanges {
4
+ private cdr;
5
+ split: WorkspaceSplit;
6
+ depth: number;
7
+ selectedPaneId: string | null;
8
+ profiles: TabbyProfile[];
9
+ paneEdit: EventEmitter<WorkspacePane>;
10
+ splitHorizontal: EventEmitter<WorkspacePane>;
11
+ splitVertical: EventEmitter<WorkspacePane>;
12
+ removePane: EventEmitter<WorkspacePane>;
13
+ addLeft: EventEmitter<WorkspacePane>;
14
+ addRight: EventEmitter<WorkspacePane>;
15
+ addTop: EventEmitter<WorkspacePane>;
16
+ addBottom: EventEmitter<WorkspacePane>;
17
+ contextMenuPane: WorkspacePane | null;
18
+ contextMenuPosition: {
19
+ x: number;
20
+ y: number;
21
+ };
22
+ constructor(cdr: ChangeDetectorRef);
23
+ ngOnChanges(changes: SimpleChanges): void;
24
+ isPane(child: WorkspacePane | WorkspaceSplit): boolean;
25
+ isSplit(child: WorkspacePane | WorkspaceSplit): boolean;
26
+ asSplit(child: WorkspacePane | WorkspaceSplit): WorkspaceSplit;
27
+ asPane(child: WorkspacePane | WorkspaceSplit): WorkspacePane;
28
+ getFlexStyle(index: number): string;
29
+ onPaneClick(pane: WorkspacePane): void;
30
+ truncate(text: string, maxLength: number): string;
31
+ onContextMenu(event: MouseEvent, pane: WorkspacePane): void;
32
+ closeContextMenu(): void;
33
+ onEdit(): void;
34
+ onSplitH(): void;
35
+ onSplitV(): void;
36
+ onAddLeft(): void;
37
+ onAddRight(): void;
38
+ onAddTop(): void;
39
+ onAddBottom(): void;
40
+ onRemove(): void;
41
+ getPaneLabel(pane: WorkspacePane): string;
42
+ onNestedPaneEdit(pane: WorkspacePane): void;
43
+ onNestedSplitH(pane: WorkspacePane): void;
44
+ onNestedSplitV(pane: WorkspacePane): void;
45
+ onNestedAddLeft(pane: WorkspacePane): void;
46
+ onNestedAddRight(pane: WorkspacePane): void;
47
+ onNestedAddTop(pane: WorkspacePane): void;
48
+ onNestedAddBottom(pane: WorkspacePane): void;
49
+ onNestedRemove(pane: WorkspacePane): void;
50
+ }
36
51
  //# sourceMappingURL=splitPreview.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"splitPreview.component.d.ts","sourceRoot":"","sources":["../../src/components/splitPreview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAA;AACtE,OAAO,EACL,cAAc,EACd,aAAa,EAEd,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAE5E,qBAKa,qBAAqB;IAWpB,OAAO,CAAC,gBAAgB;IAV3B,KAAK,EAAG,cAAc,CAAA;IACtB,KAAK,SAAI;IACR,SAAS,8BAAoC;IAC7C,eAAe,8BAAoC;IACnD,aAAa,8BAAoC;IACjD,UAAU,8BAAoC;IAExD,eAAe,EAAE,aAAa,GAAG,IAAI,CAAO;IAC5C,mBAAmB;;;MAAiB;gBAEhB,gBAAgB,EAAE,sBAAsB;IAE5D,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,OAAO;IAItD,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,OAAO;IAIvD,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,cAAc;IAI9D,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa;IAI5D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAInC,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAItC,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAM3D,gBAAgB,IAAI,IAAI;IAIxB,QAAQ,IAAI,IAAI;IAOhB,QAAQ,IAAI,IAAI;IAOhB,QAAQ,IAAI,IAAI;IAOhB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM;IAIzC,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM;IAUzC,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI5C,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;CAG1C"}
1
+ {"version":3,"file":"splitPreview.component.d.ts","sourceRoot":"","sources":["../../src/components/splitPreview.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAA;AACnH,OAAO,EACL,cAAc,EACd,aAAa,EACb,YAAY,EAEb,MAAM,2BAA2B,CAAA;AAElC,qBAKa,qBAAsB,YAAW,SAAS;IAiBzC,OAAO,CAAC,GAAG;IAhBd,KAAK,EAAG,cAAc,CAAA;IACtB,KAAK,SAAI;IACT,cAAc,EAAE,MAAM,GAAG,IAAI,CAAO;IACpC,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC5B,QAAQ,8BAAoC;IAC5C,eAAe,8BAAoC;IACnD,aAAa,8BAAoC;IACjD,UAAU,8BAAoC;IAC9C,OAAO,8BAAoC;IAC3C,QAAQ,8BAAoC;IAC5C,MAAM,8BAAoC;IAC1C,SAAS,8BAAoC;IAEvD,eAAe,EAAE,aAAa,GAAG,IAAI,CAAO;IAC5C,mBAAmB;;;MAAiB;gBAEhB,GAAG,EAAE,iBAAiB;IAE1C,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAOzC,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,OAAO;IAItD,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,OAAO;IAIvD,OAAO,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,cAAc;IAI9D,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,cAAc,GAAG,aAAa;IAI5D,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;IAInC,WAAW,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAItC,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM;IAMjD,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,aAAa,GAAG,IAAI;IAM3D,gBAAgB,IAAI,IAAI;IAKxB,MAAM,IAAI,IAAI;IAOd,QAAQ,IAAI,IAAI;IAOhB,QAAQ,IAAI,IAAI;IAOhB,SAAS,IAAI,IAAI;IAOjB,UAAU,IAAI,IAAI;IAOlB,QAAQ,IAAI,IAAI;IAOhB,WAAW,IAAI,IAAI;IAOnB,QAAQ,IAAI,IAAI;IAOhB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM;IAQzC,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI3C,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,eAAe,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI1C,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI3C,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIzC,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAI5C,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;CAG1C"}
@@ -1,29 +1,62 @@
1
- import { EventEmitter, OnInit } from '@angular/core';
2
- import { Workspace, WorkspacePane, TabbyProfile } from '../models/workspace.model';
3
- import { WorkspaceEditorService } from '../services/workspaceEditor.service';
4
- export declare class WorkspaceEditorComponent implements OnInit {
5
- private workspaceService;
6
- workspace: Workspace;
7
- save: EventEmitter<Workspace>;
8
- cancel: EventEmitter<void>;
9
- selectedPane: WorkspacePane | null;
10
- showPaneEditor: boolean;
11
- profiles: TabbyProfile[];
12
- availableIcons: string[];
13
- constructor(workspaceService: WorkspaceEditorService);
14
- ngOnInit(): Promise<void>;
15
- onSave(): void;
16
- onCancel(): void;
17
- selectPane(pane: WorkspacePane): void;
18
- closePaneEditor(): void;
19
- onPaneSave(pane: WorkspacePane): void;
20
- private updatePaneInTree;
21
- splitPane(pane: WorkspacePane, orientation: 'horizontal' | 'vertical'): void;
22
- private splitPaneInTree;
23
- removePane(pane: WorkspacePane): void;
24
- private removePaneFromTree;
25
- private recalculateRatios;
26
- setOrientation(orientation: 'horizontal' | 'vertical'): void;
27
- updateRatio(index: number, value: number): void;
28
- }
1
+ import { EventEmitter, OnInit, OnChanges, AfterViewInit, SimpleChanges, ElementRef, ChangeDetectorRef } from '@angular/core';
2
+ import { Workspace, WorkspacePane, WorkspaceBackground, TabbyProfile } from '../models/workspace.model';
3
+ import { WorkspaceEditorService } from '../services/workspaceEditor.service';
4
+ export declare class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewInit {
5
+ private workspaceService;
6
+ private elementRef;
7
+ private cdr;
8
+ workspace: Workspace;
9
+ autoFocus: boolean;
10
+ hasUnsavedChanges: boolean;
11
+ save: EventEmitter<Workspace>;
12
+ cancel: EventEmitter<void>;
13
+ nameInput: ElementRef<HTMLInputElement>;
14
+ selectedPaneId: string | null;
15
+ editingPane: WorkspacePane | null;
16
+ showPaneEditor: boolean;
17
+ profiles: TabbyProfile[];
18
+ availableIcons: string[];
19
+ iconDropdownOpen: boolean;
20
+ backgroundPresets: WorkspaceBackground[];
21
+ backgroundDropdownOpen: boolean;
22
+ customBackgroundValue: string;
23
+ constructor(workspaceService: WorkspaceEditorService, elementRef: ElementRef, cdr: ChangeDetectorRef);
24
+ onDocumentClick(event: MouseEvent): void;
25
+ toggleIconDropdown(): void;
26
+ selectIcon(icon: string): void;
27
+ toggleBackgroundDropdown(): void;
28
+ selectBackgroundPreset(preset: WorkspaceBackground): void;
29
+ applyCustomBackground(): void;
30
+ clearBackground(): void;
31
+ isBackgroundSelected(preset: WorkspaceBackground): boolean;
32
+ ngOnInit(): Promise<void>;
33
+ ngAfterViewInit(): void;
34
+ private focusNameInput;
35
+ ngOnChanges(changes: SimpleChanges): void;
36
+ private initializeWorkspace;
37
+ onSave(): void;
38
+ onCancel(): void;
39
+ deselectPane(): void;
40
+ onPreviewBackgroundClick(): void;
41
+ editPane(pane: WorkspacePane): void;
42
+ closePaneEditor(): void;
43
+ private findPaneById;
44
+ private findPaneInNode;
45
+ canRemovePane(): boolean;
46
+ private countPanes;
47
+ private walkTree;
48
+ private updatePaneInTree;
49
+ splitPane(pane: WorkspacePane, orientation: 'horizontal' | 'vertical'): void;
50
+ splitSelectedPane(orientation: 'horizontal' | 'vertical'): void;
51
+ private splitPaneInTree;
52
+ removePane(pane: WorkspacePane): void;
53
+ removeSelectedPane(): void;
54
+ private removePaneFromTree;
55
+ private recalculateRatios;
56
+ setOrientation(orientation: 'horizontal' | 'vertical'): void;
57
+ updateRatio(index: number, value: number): void;
58
+ addPane(direction: 'left' | 'right' | 'top' | 'bottom'): void;
59
+ addPaneFromEvent(pane: WorkspacePane, direction: 'left' | 'right' | 'top' | 'bottom'): void;
60
+ private addPaneInTree;
61
+ }
29
62
  //# sourceMappingURL=workspaceEditor.component.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workspaceEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/workspaceEditor.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAC9E,OAAO,EACL,SAAS,EACT,aAAa,EAEb,YAAY,EAIb,MAAM,2BAA2B,CAAA;AAClC,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAA;AAE5E,qBAKa,wBAAyB,YAAW,MAAM;IAczC,OAAO,CAAC,gBAAgB;IAb3B,SAAS,EAAG,SAAS,CAAA;IACpB,IAAI,0BAAgC;IACpC,MAAM,qBAA2B;IAE3C,YAAY,EAAE,aAAa,GAAG,IAAI,CAAO;IACzC,cAAc,UAAQ;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAK;IAC7B,cAAc,WAIb;gBAEmB,gBAAgB,EAAE,sBAAsB;IAEtD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAW/B,MAAM,IAAI,IAAI;IAOd,QAAQ,IAAI,IAAI;IAIhB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKrC,eAAe,IAAI,IAAI;IAKvB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAKrC,OAAO,CAAC,gBAAgB;IAexB,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI;IAI5E,OAAO,CAAC,eAAe;IA2BvB,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAIrC,OAAO,CAAC,kBAAkB;IA+B1B,OAAO,CAAC,iBAAiB;IAKzB,cAAc,CAAC,WAAW,EAAE,YAAY,GAAG,UAAU,GAAG,IAAI;IAI5D,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAoBhD"}
1
+ {"version":3,"file":"workspaceEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/workspaceEditor.component.ts"],"names":[],"mappings":"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"}