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.
- package/.claude/settings.local.json +29 -2
- package/.github/workflows/ci.yml +26 -0
- package/.github/workflows/claude-code-review.yml +44 -0
- package/.github/workflows/claude.yml +81 -0
- package/.github/workflows/release.yml +30 -0
- package/CHANGELOG.md +92 -20
- package/CLAUDE.md +196 -15
- package/CONTRIBUTING.md +3 -1
- package/README.md +80 -61
- package/RELEASE.md +91 -0
- package/TODO.md +77 -0
- package/dist/build-config.d.ts +3 -3
- package/dist/components/deleteConfirmModal.component.d.ts +7 -0
- package/dist/components/deleteConfirmModal.component.d.ts.map +1 -0
- package/dist/components/paneEditor.component.d.ts +9 -13
- package/dist/components/paneEditor.component.d.ts.map +1 -1
- package/dist/components/splitPreview.component.d.ts +50 -35
- package/dist/components/splitPreview.component.d.ts.map +1 -1
- package/dist/components/workspaceEditor.component.d.ts +61 -28
- package/dist/components/workspaceEditor.component.d.ts.map +1 -1
- package/dist/components/workspaceList.component.d.ts +56 -27
- package/dist/components/workspaceList.component.d.ts.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/workspace.model.d.ts +118 -76
- package/dist/models/workspace.model.d.ts.map +1 -1
- package/dist/package.json +26 -0
- package/dist/providers/config.provider.d.ts +8 -8
- package/dist/providers/settings.provider.d.ts +7 -7
- package/dist/providers/settings.provider.d.ts.map +1 -1
- package/dist/providers/toolbar.provider.d.ts +23 -12
- package/dist/providers/toolbar.provider.d.ts.map +1 -1
- package/dist/services/startupCommand.service.d.ts +28 -0
- package/dist/services/startupCommand.service.d.ts.map +1 -0
- package/dist/services/workspaceBackground.service.d.ts +38 -0
- package/dist/services/workspaceBackground.service.d.ts.map +1 -0
- package/dist/services/workspaceEditor.service.d.ts +46 -24
- package/dist/services/workspaceEditor.service.d.ts.map +1 -1
- package/docs/DESIGN.md +57 -0
- package/docs/SESSION-2026-01-14-S1-DESIGN.md +134 -0
- package/docs/marketing_status.md +92 -0
- package/mockups/index.html +162 -0
- package/mockups/s1-tight-sharp.html +522 -0
- package/mockups/shared/base.css +216 -0
- package/mockups/v06-tabbed.html +643 -0
- package/package.json +3 -7
- package/screenshots/editor.png +0 -0
- package/screenshots/pane-edit.png +0 -0
- package/scripts/build-dev.js +2 -1
- package/scripts/build-prod.js +40 -0
- package/src/components/deleteConfirmModal.component.ts +23 -0
- package/src/components/paneEditor.component.pug +27 -43
- package/src/components/paneEditor.component.scss +37 -85
- package/src/components/paneEditor.component.ts +6 -16
- package/src/components/splitPreview.component.pug +36 -5
- package/src/components/splitPreview.component.scss +78 -45
- package/src/components/splitPreview.component.ts +83 -18
- package/src/components/workspaceEditor.component.pug +162 -74
- package/src/components/workspaceEditor.component.scss +261 -108
- package/src/components/workspaceEditor.component.ts +294 -31
- package/src/components/workspaceList.component.pug +32 -41
- package/src/components/workspaceList.component.scss +89 -74
- package/src/components/workspaceList.component.ts +181 -44
- package/src/index.ts +6 -0
- package/src/models/workspace.model.ts +113 -8
- package/src/providers/settings.provider.ts +2 -2
- package/src/providers/toolbar.provider.ts +113 -13
- package/src/services/startupCommand.service.ts +140 -0
- package/src/services/workspaceBackground.service.ts +167 -0
- package/src/services/workspaceEditor.service.ts +134 -65
- package/src/styles/_index.scss +3 -0
- package/src/styles/_mixins.scss +180 -0
- package/src/styles/_variables.scss +67 -0
- package/RELEASE_PLAN.md +0 -161
- 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
|
-

|
|
6
|
-
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
- Visual editor
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
-
|
|
56
|
-
-
|
|
57
|
-
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
1
|
+
# TabbySpaces
|
|
2
|
+
|
|
3
|
+
Visual workspace editor for [Tabby](https://tabby.sh). Create split-layout terminal workspaces without touching config files.
|
|
4
|
+
|
|
5
|
+

|
|
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
|
+
|  |  |
|
|
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.
|
package/dist/build-config.d.ts
CHANGED
|
@@ -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 @@
|
|
|
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
|
|
2
|
-
import { WorkspacePane, TabbyProfile } from '../models/workspace.model';
|
|
3
|
-
export declare class PaneEditorComponent
|
|
4
|
-
pane: WorkspacePane;
|
|
5
|
-
profiles: TabbyProfile[];
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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,
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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;
|
|
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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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;
|
|
1
|
+
{"version":3,"file":"workspaceEditor.component.d.ts","sourceRoot":"","sources":["../../src/components/workspaceEditor.component.ts"],"names":[],"mappings":"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"}
|