tabby-tabbyspaces 0.0.1 → 0.1.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 +28 -2
- package/CHANGELOG.md +46 -20
- package/CLAUDE.md +163 -15
- package/README.md +71 -61
- package/RELEASE.md +91 -0
- package/TEST_MCP.md +176 -0
- package/TODO.md +72 -0
- package/cdp-click.js +22 -0
- package/cdp-test.js +28 -0
- package/dist/components/paneEditor.component.d.ts +6 -1
- package/dist/components/paneEditor.component.d.ts.map +1 -1
- package/dist/components/splitPreview.component.d.ts +22 -7
- package/dist/components/splitPreview.component.d.ts.map +1 -1
- package/dist/components/workspaceEditor.component.d.ts +30 -4
- package/dist/components/workspaceEditor.component.d.ts.map +1 -1
- package/dist/components/workspaceList.component.d.ts +21 -9
- package/dist/components/workspaceList.component.d.ts.map +1 -1
- 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 +4 -2
- package/dist/models/workspace.model.d.ts.map +1 -1
- package/dist/package.json +26 -0
- package/dist/providers/settings.provider.d.ts.map +1 -1
- package/dist/providers/toolbar.provider.d.ts +4 -1
- package/dist/providers/toolbar.provider.d.ts.map +1 -1
- package/dist/services/startupCommand.service.d.ts +20 -0
- package/dist/services/startupCommand.service.d.ts.map +1 -0
- package/dist/services/workspaceEditor.service.d.ts +11 -3
- package/dist/services/workspaceEditor.service.d.ts.map +1 -1
- package/docs/marketing_status.md +92 -0
- package/package.json +2 -7
- package/screenshots/editor.png +0 -0
- package/screenshots/pane-edit.png +0 -0
- package/scripts/build-prod.js +39 -0
- package/src/components/paneEditor.component.pug +2 -2
- package/src/components/paneEditor.component.ts +19 -1
- package/src/components/splitPreview.component.pug +45 -5
- package/src/components/splitPreview.component.scss +79 -22
- package/src/components/splitPreview.component.ts +91 -16
- package/src/components/workspaceEditor.component.pug +130 -70
- package/src/components/workspaceEditor.component.scss +205 -120
- package/src/components/workspaceEditor.component.ts +193 -6
- package/src/components/workspaceList.component.pug +31 -20
- package/src/components/workspaceList.component.scss +12 -6
- package/src/components/workspaceList.component.ts +116 -34
- package/src/index.ts +2 -0
- package/src/models/workspace.model.ts +33 -6
- package/src/providers/settings.provider.ts +2 -2
- package/src/providers/toolbar.provider.ts +41 -10
- package/src/services/startupCommand.service.ts +142 -0
- package/src/services/workspaceEditor.service.ts +70 -38
- package/test_cdp.py +50 -0
- package/RELEASE_PLAN.md +0 -161
- package/screenshots/workspace-edit.png +0 -0
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
/*! For license information please see index.js.LICENSE.txt */
|
|
2
|
-
!function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("@angular/core"),require("@angular/common"),require("@angular/forms"),require("tabby-core"),require("tabby-settings"),function(){try{return require("fs")}catch(e){}}());else if("function"==typeof define&&define.amd)define(["@angular/core","@angular/common","@angular/forms","tabby-core","tabby-settings","fs"],r);else{var t="object"==typeof exports?r(require("@angular/core"),require("@angular/common"),require("@angular/forms"),require("tabby-core"),require("tabby-settings"),function(){try{return require("fs")}catch(e){}}()):r(e["@angular/core"],e["@angular/common"],e["@angular/forms"],e["tabby-core"],e["tabby-settings"],e.fs);for(var n in t)("object"==typeof exports?exports:e)[n]=t[n]}}(global,(e,r,t,n,o,i)=>(()=>{var a={28(e,r,t){"use strict";t.r(r),t.d(r,{default:()=>s});var n=t(354),o=t.n(n),i=t(314),a=t.n(i)()(o());a.push([e.id,".workspace-editor-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:1000}.workspace-editor-modal{background:var(--theme-bg);border-radius:12px;width:90%;max-width:700px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.4)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--theme-border)}.modal-header h4{margin:0;font-size:1.25rem}.modal-header .close-btn{font-size:1.25rem;color:var(--theme-fg-more);padding:4px 8px}.modal-header .close-btn:hover{color:var(--theme-fg)}.modal-body{padding:20px;overflow-y:auto;flex:1}.form-row{display:flex;gap:16px;margin-bottom:16px}.form-row:last-child{margin-bottom:0}.form-group{display:flex;flex-direction:column;gap:6px}.form-group.flex-grow{flex:1}.form-group label{font-size:.9rem;color:var(--theme-fg-more)}.form-group input[type=checkbox]{margin-right:8px}.form-control{padding:8px 12px;border-radius:6px;border:1px solid var(--theme-border);background:var(--theme-bg-more);color:var(--theme-fg);font-size:.95rem}.form-control:focus{outline:none;border-color:var(--theme-primary)}.color-input{width:60px;height:36px;padding:2px;cursor:pointer}.icon-selector{display:flex;flex-wrap:wrap;gap:4px}.icon-option{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border:1px solid var(--theme-border);border-radius:6px;background:var(--theme-bg-more);color:var(--theme-fg-more);cursor:pointer;transition:all .2s}.icon-option:hover{background:var(--theme-bg-more-more);color:var(--theme-fg)}.icon-option.selected{border-color:var(--theme-primary);background:var(--theme-primary);color:#fff}.form-section{margin-top:20px}.form-section .section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.form-section .section-header h5{margin:0;font-size:1rem}.orientation-toggle{display:flex;gap:8px}.orientation-toggle .btn{display:flex;align-items:center;gap:6px}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 20px;border-top:1px solid var(--theme-border)}","",{version:3,sources:["webpack://./src/components/workspaceEditor.component.scss"],names:[],mappings:"AAAA,0BACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,yBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,YAAA,CAGF,wBACE,0BAAA,CACA,kBAAA,CACA,SAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,YAAA,CACA,qBAAA,CACA,qCAAA,CAGF,cACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CACA,2CAAA,CAEA,iBACE,QAAA,CACA,iBAAA,CAGF,yBACE,iBAAA,CACA,0BAAA,CACA,eAAA,CAEA,+BACE,qBAAA,CAKN,YACE,YAAA,CACA,eAAA,CACA,MAAA,CAGF,UACE,YAAA,CACA,QAAA,CACA,kBAAA,CAEA,qBACE,eAAA,CAIJ,YACE,YAAA,CACA,qBAAA,CACA,OAAA,CAEA,sBACE,MAAA,CAGF,kBACE,eAAA,CACA,0BAAA,CAGF,iCACE,gBAAA,CAIJ,cACE,gBAAA,CACA,iBAAA,CACA,oCAAA,CACA,+BAAA,CACA,qBAAA,CACA,gBAAA,CAEA,oBACE,YAAA,CACA,iCAAA,CAIJ,aACE,UAAA,CACA,WAAA,CACA,WAAA,CACA,cAAA,CAGF,eACE,YAAA,CACA,cAAA,CACA,OAAA,CAGF,aACE,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oCAAA,CACA,iBAAA,CACA,+BAAA,CACA,0BAAA,CACA,cAAA,CACA,kBAAA,CAEA,mBACE,oCAAA,CACA,qBAAA,CAGF,sBACE,iCAAA,CACA,+BAAA,CACA,UAAA,CAIJ,cACE,eAAA,CAEA,8BACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,kBAAA,CAEA,iCACE,QAAA,CACA,cAAA,CAKN,oBACE,YAAA,CACA,OAAA,CAEA,yBACE,YAAA,CACA,kBAAA,CACA,OAAA,CAIJ,cACE,YAAA,CACA,wBAAA,CACA,QAAA,CACA,iBAAA,CACA,wCAAA",sourcesContent:[".workspace-editor-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.6);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 1000;\r\n}\r\n\r\n.workspace-editor-modal {\r\n background: var(--theme-bg);\r\n border-radius: 12px;\r\n width: 90%;\r\n max-width: 700px;\r\n max-height: 90vh;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\r\n}\r\n\r\n.modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px 20px;\r\n border-bottom: 1px solid var(--theme-border);\r\n\r\n h4 {\r\n margin: 0;\r\n font-size: 1.25rem;\r\n }\r\n\r\n .close-btn {\r\n font-size: 1.25rem;\r\n color: var(--theme-fg-more);\r\n padding: 4px 8px;\r\n\r\n &:hover {\r\n color: var(--theme-fg);\r\n }\r\n }\r\n}\r\n\r\n.modal-body {\r\n padding: 20px;\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n.form-row {\r\n display: flex;\r\n gap: 16px;\r\n margin-bottom: 16px;\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n}\r\n\r\n.form-group {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 6px;\r\n\r\n &.flex-grow {\r\n flex: 1;\r\n }\r\n\r\n label {\r\n font-size: 0.9rem;\r\n color: var(--theme-fg-more);\r\n }\r\n\r\n input[type='checkbox'] {\r\n margin-right: 8px;\r\n }\r\n}\r\n\r\n.form-control {\r\n padding: 8px 12px;\r\n border-radius: 6px;\r\n border: 1px solid var(--theme-border);\r\n background: var(--theme-bg-more);\r\n color: var(--theme-fg);\r\n font-size: 0.95rem;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: var(--theme-primary);\r\n }\r\n}\r\n\r\n.color-input {\r\n width: 60px;\r\n height: 36px;\r\n padding: 2px;\r\n cursor: pointer;\r\n}\r\n\r\n.icon-selector {\r\n display: flex;\r\n flex-wrap: wrap;\r\n gap: 4px;\r\n}\r\n\r\n.icon-option {\r\n width: 36px;\r\n height: 36px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid var(--theme-border);\r\n border-radius: 6px;\r\n background: var(--theme-bg-more);\r\n color: var(--theme-fg-more);\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more-more);\r\n color: var(--theme-fg);\r\n }\r\n\r\n &.selected {\r\n border-color: var(--theme-primary);\r\n background: var(--theme-primary);\r\n color: white;\r\n }\r\n}\r\n\r\n.form-section {\r\n margin-top: 20px;\r\n\r\n .section-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 12px;\r\n\r\n h5 {\r\n margin: 0;\r\n font-size: 1rem;\r\n }\r\n }\r\n}\r\n\r\n.orientation-toggle {\r\n display: flex;\r\n gap: 8px;\r\n\r\n .btn {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n }\r\n}\r\n\r\n.modal-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 12px;\r\n padding: 16px 20px;\r\n border-top: 1px solid var(--theme-border);\r\n}\r\n"],sourceRoot:""}]);const s=a},33(e,r,t){var n=t(893);n&&n.__esModule&&(n=n.default),e.exports="string"==typeof n?n:n.toString()},182(e){"use strict";e.exports=t},210(e,r,t){var n=t(270);n&&n.__esModule&&(n=n.default),e.exports="string"==typeof n?n:n.toString()},234(e,r,t){t(766),e.exports=function(e){return""+'<div class="workspace-editor-overlay" (click)="onCancel()"><div class="workspace-editor-modal" (click)="$event.stopPropagation()"><div class="modal-header"><h4>{{ workspace.id ? \'Edit\' : \'New\' }} Workspace</h4><button class="btn btn-link close-btn" type="button" (click)="onCancel()"><i class="fas fa-times"></i></button></div><div class="modal-body"><div class="form-row"><div class="form-group flex-grow"><label>Name</label><input class="form-control" type="text" [(ngModel)]="workspace.name" placeholder="Workspace name"></div></div><div class="form-row"><div class="form-group"><label>Icon</label><div class="icon-selector"><button class="icon-option" *ngFor="let icon of availableIcons" type="button" [class.selected]="workspace.icon === icon" (click)="workspace.icon = icon"><i class="fas" [class]=""fa-" + icon"></i></button></div></div><div class="form-group"><label>Color</label><input class="form-control color-input" type="color" [(ngModel)]="workspace.color"></div></div><div class="form-row"><div class="form-group"><label><input type="checkbox" [(ngModel)]="workspace.isDefault"> Launch on startup</label></div></div><div class="form-section"><div class="section-header"><h5>Layout Preview</h5><div class="orientation-toggle"><button class="btn btn-sm" type="button" [class.btn-primary]="workspace.root.orientation === "horizontal"" [class.btn-outline-secondary]="workspace.root.orientation !== "horizontal"" (click)="setOrientation("horizontal")"><i class="fas fa-arrows-alt-h"></i> Horizontal</button><button class="btn btn-sm" type="button" [class.btn-primary]="workspace.root.orientation === "vertical"" [class.btn-outline-secondary]="workspace.root.orientation !== "vertical"" (click)="setOrientation("vertical")"><i class="fas fa-arrows-alt-v"></i> Vertical</button></div></div><split-preview [split]="workspace.root" (paneClick)="selectPane($event)" (splitHorizontal)="splitPane($event, "horizontal")" (splitVertical)="splitPane($event, "vertical")" (removePane)="removePane($event)"></split-preview></div></div><div class="modal-footer"><button class="btn btn-secondary" type="button" (click)="onCancel()">Cancel</button><button class="btn btn-primary" type="button" (click)="onSave()" [disabled]="!workspace.name?.trim()"><i class="fas fa-save"></i> Save Workspace</button></div></div></div><pane-editor *ngIf="showPaneEditor && selectedPane" [pane]="selectedPane" [profiles]="profiles" (save)="onPaneSave($event)" (cancel)="closePaneEditor()"></pane-editor>'}},245(e,r,t){t(766),e.exports=function(e){return""+'<div class="pane-editor-overlay" (click)="onCancel()"><div class="pane-editor-modal" (click)="$event.stopPropagation()"><div class="modal-header"><h4>Edit Pane</h4><button class="btn btn-link close-btn" type="button" (click)="onCancel()"><i class="fas fa-times"></i></button></div><div class="modal-body"><div class="form-group"><label>Base Profile</label><select class="form-control" [(ngModel)]="editedPane.profileId"><option value="">-- Select Profile --</option><option *ngFor="let profile of profiles" [value]="profile.id">{{ profile.name }}</option></select></div><div class="form-group"><label>Working Directory</label><input class="form-control" type="text" [(ngModel)]="editedPane.cwd" placeholder="C:\\path\\to\\project"></div><div class="form-group"><label>Startup Command</label><input class="form-control" type="text" [(ngModel)]="editedPane.startupCommand" placeholder="e.g., npm run dev"><small class="help-text">Command to execute when the pane opens. For Nushell, use commands like: uv run serve</small></div><div class="form-group"><label>Pane Title (optional)</label><input class="form-control" type="text" [(ngModel)]="editedPane.title" placeholder="Custom tab title"></div></div><div class="modal-footer"><button class="btn btn-secondary" type="button" (click)="onCancel()">Cancel</button><button class="btn btn-primary" type="button" (click)="onSave()"><i class="fas fa-check"></i> Apply</button></div></div></div>'}},261(e,r,t){t(766),e.exports=function(e){return""+'<div class="workspace-list-container"><div class="workspace-list-header"><h3>Workspace Editor</h3><button class="btn btn-primary" type="button" (click)="createWorkspace()"><i class="fas fa-plus"></i> New Workspace</button></div><div class="workspace-list" *ngIf="workspaces.length > 0"><div class="workspace-item" *ngFor="let workspace of workspaces"><div class="workspace-info"><div class="workspace-icon" [style.color]="workspace.color"><i class="fas" [class]=""fa-" + (workspace.icon || "columns")"></i></div><div class="workspace-details"><div class="workspace-name">{{ workspace.name }}</div><div class="workspace-meta"><span>{{ getPaneCount(workspace) }} panes</span><span class="separator">·</span><span>{{ getOrientationLabel(workspace) }}</span><span class="separator" *ngIf="workspace.isDefault">·</span><span class="badge badge-primary" *ngIf="workspace.isDefault">default</span></div></div></div><div class="workspace-actions"><button class="btn btn-link" type="button" title="Set as default" (click)="setAsDefault(workspace)" [class.active]="workspace.isDefault"><i class="fas fa-star"></i></button><button class="btn btn-link" type="button" title="Duplicate" (click)="duplicateWorkspace(workspace)"><i class="fas fa-copy"></i></button><button class="btn btn-link" type="button" title="Edit" (click)="editWorkspace(workspace)"><i class="fas fa-edit"></i></button><button class="btn btn-link text-danger" type="button" title="Delete" (click)="deleteWorkspace(workspace)"><i class="fas fa-trash"></i></button></div></div></div><div class="workspace-empty" *ngIf="workspaces.length === 0"><p>No workspaces configured yet.</p><p>Click "New Workspace" to create your first split-layout workspace.</p></div></div><workspace-editor *ngIf="showEditor" [workspace]="editingWorkspace" (save)="onEditorSave($event)" (cancel)="closeEditor()"></workspace-editor>'}},270(e,r,t){"use strict";t.r(r),t.d(r,{default:()=>s});var n=t(354),o=t.n(n),i=t(314),a=t.n(i)()(o());a.push([e.id,".split-preview{display:flex;width:100%;min-height:200px;gap:4px;border-radius:8px;overflow:hidden;background:var(--theme-bg-more);border:1px solid var(--theme-border)}.split-preview.horizontal{flex-direction:row}.split-preview.vertical{flex-direction:column}.preview-pane{display:flex;align-items:center;justify-content:center;background:var(--theme-bg-more-more);border-radius:4px;cursor:pointer;transition:all .2s;position:relative;min-height:80px}.preview-pane:hover{background:var(--theme-primary)}.preview-pane:hover .pane-content{color:#fff}.preview-pane:hover .pane-hint{opacity:1}.pane-content{text-align:center;padding:12px;color:var(--theme-fg)}.pane-label{font-size:.9rem;font-weight:500;margin-bottom:4px}.pane-hint{font-size:.75rem;opacity:.5;transition:opacity .2s}.context-menu-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1200}.context-menu{position:fixed;background:var(--theme-bg);border:1px solid var(--theme-border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.3);min-width:160px;padding:4px;z-index:1201}.context-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:8px 12px;border:none;background:none;color:var(--theme-fg);font-size:.9rem;text-align:left;cursor:pointer;border-radius:4px}.context-menu-item:hover{background:var(--theme-bg-more)}.context-menu-item.danger{color:var(--theme-danger, #ef4444)}.context-menu-item.danger:hover{background:rgba(239,68,68,.1)}.context-menu-item i{width:16px;text-align:center;opacity:.7}.context-menu-divider{height:1px;background:var(--theme-border);margin:4px 0}:host{display:flex;flex:1}","",{version:3,sources:["webpack://./src/components/splitPreview.component.scss"],names:[],mappings:"AAAA,eACE,YAAA,CACA,UAAA,CACA,gBAAA,CACA,OAAA,CACA,iBAAA,CACA,eAAA,CACA,+BAAA,CACA,oCAAA,CAEA,0BACE,kBAAA,CAGF,wBACE,qBAAA,CAIJ,cACE,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oCAAA,CACA,iBAAA,CACA,cAAA,CACA,kBAAA,CACA,iBAAA,CACA,eAAA,CAEA,oBACE,+BAAA,CAEA,kCACE,UAAA,CAGF,+BACE,SAAA,CAKN,cACE,iBAAA,CACA,YAAA,CACA,qBAAA,CAGF,YACE,eAAA,CACA,eAAA,CACA,iBAAA,CAGF,WACE,gBAAA,CACA,UAAA,CACA,sBAAA,CAIF,sBACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,YAAA,CAGF,cACE,cAAA,CACA,0BAAA,CACA,oCAAA,CACA,iBAAA,CACA,oCAAA,CACA,eAAA,CACA,WAAA,CACA,YAAA,CAGF,mBACE,YAAA,CACA,kBAAA,CACA,QAAA,CACA,UAAA,CACA,gBAAA,CACA,WAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,cAAA,CACA,iBAAA,CAEA,yBACE,+BAAA,CAGF,0BACE,kCAAA,CAEA,gCACE,6BAAA,CAIJ,qBACE,UAAA,CACA,iBAAA,CACA,UAAA,CAIJ,sBACE,UAAA,CACA,8BAAA,CACA,YAAA,CAIF,MACE,YAAA,CACA,MAAA",sourcesContent:[".split-preview {\r\n display: flex;\r\n width: 100%;\r\n min-height: 200px;\r\n gap: 4px;\r\n border-radius: 8px;\r\n overflow: hidden;\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border);\r\n\r\n &.horizontal {\r\n flex-direction: row;\r\n }\r\n\r\n &.vertical {\r\n flex-direction: column;\r\n }\r\n}\r\n\r\n.preview-pane {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--theme-bg-more-more);\r\n border-radius: 4px;\r\n cursor: pointer;\r\n transition: all 0.2s;\r\n position: relative;\r\n min-height: 80px;\r\n\r\n &:hover {\r\n background: var(--theme-primary);\r\n\r\n .pane-content {\r\n color: white;\r\n }\r\n\r\n .pane-hint {\r\n opacity: 1;\r\n }\r\n }\r\n}\r\n\r\n.pane-content {\r\n text-align: center;\r\n padding: 12px;\r\n color: var(--theme-fg);\r\n}\r\n\r\n.pane-label {\r\n font-size: 0.9rem;\r\n font-weight: 500;\r\n margin-bottom: 4px;\r\n}\r\n\r\n.pane-hint {\r\n font-size: 0.75rem;\r\n opacity: 0.5;\r\n transition: opacity 0.2s;\r\n}\r\n\r\n// Context menu\r\n.context-menu-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n z-index: 1200;\r\n}\r\n\r\n.context-menu {\r\n position: fixed;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border);\r\n border-radius: 8px;\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);\r\n min-width: 160px;\r\n padding: 4px;\r\n z-index: 1201;\r\n}\r\n\r\n.context-menu-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n width: 100%;\r\n padding: 8px 12px;\r\n border: none;\r\n background: none;\r\n color: var(--theme-fg);\r\n font-size: 0.9rem;\r\n text-align: left;\r\n cursor: pointer;\r\n border-radius: 4px;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more);\r\n }\r\n\r\n &.danger {\r\n color: var(--theme-danger, #ef4444);\r\n\r\n &:hover {\r\n background: rgba(239, 68, 68, 0.1);\r\n }\r\n }\r\n\r\n i {\r\n width: 16px;\r\n text-align: center;\r\n opacity: 0.7;\r\n }\r\n}\r\n\r\n.context-menu-divider {\r\n height: 1px;\r\n background: var(--theme-border);\r\n margin: 4px 0;\r\n}\r\n\r\n// Nested splits styling\r\n:host {\r\n display: flex;\r\n flex: 1;\r\n}\r\n"],sourceRoot:""}]);const s=a},314(e){"use strict";e.exports=function(e){var r=[];return r.toString=function(){return this.map(function(r){var t="",n=void 0!==r[5];return r[4]&&(t+="@supports (".concat(r[4],") {")),r[2]&&(t+="@media ".concat(r[2]," {")),n&&(t+="@layer".concat(r[5].length>0?" ".concat(r[5]):""," {")),t+=e(r),n&&(t+="}"),r[2]&&(t+="}"),r[4]&&(t+="}"),t}).join("")},r.i=function(e,t,n,o,i){"string"==typeof e&&(e=[[null,e,void 0]]);var a={};if(n)for(var s=0;s<this.length;s++){var c=this[s][0];null!=c&&(a[c]=!0)}for(var A=0;A<e.length;A++){var l=[].concat(e[A]);n&&a[l[0]]||(void 0!==i&&(void 0===l[5]||(l[1]="@layer".concat(l[5].length>0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=i),t&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=t):l[2]=t),o&&(l[4]?(l[1]="@supports (".concat(l[4],") {").concat(l[1],"}"),l[4]=o):l[4]="".concat(o)),r.push(l))}},r}},341(e,r,t){var n=t(481);n&&n.__esModule&&(n=n.default),e.exports="string"==typeof n?n:n.toString()},354(e){"use strict";e.exports=function(e){var r=e[1],t=e[3];if(!t)return r;if("function"==typeof btoa){var n=btoa(unescape(encodeURIComponent(JSON.stringify(t)))),o="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(n),i="/*# ".concat(o," */");return[r].concat([i]).join("\n")}return[r].join("\n")}},358(e){"use strict";e.exports=r},481(e,r,t){"use strict";t.r(r),t.d(r,{default:()=>s});var n=t(354),o=t.n(n),i=t(314),a=t.n(i)()(o());a.push([e.id,".workspace-list-container{padding:20px;max-width:800px}.workspace-list-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.workspace-list-header h3{margin:0;font-size:1.5rem}.workspace-list{display:flex;flex-direction:column;gap:12px}.workspace-item{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--theme-bg-more);border-radius:8px;border:1px solid var(--theme-border);transition:background .2s}.workspace-item:hover{background:var(--theme-bg-more-more)}.workspace-info{display:flex;align-items:center;gap:16px}.workspace-icon{font-size:24px;width:40px;text-align:center}.workspace-details{display:flex;flex-direction:column;gap:4px}.workspace-name{font-size:1.1rem;font-weight:500}.workspace-meta{font-size:.85rem;color:var(--theme-fg-more)}.workspace-meta .separator{margin:0 6px}.workspace-meta .badge{font-size:.75rem;padding:2px 6px;border-radius:4px;background:var(--theme-primary);color:#fff}.workspace-actions{display:flex;gap:4px}.workspace-actions .btn-link{padding:8px;color:var(--theme-fg-more);opacity:.7;transition:opacity .2s}.workspace-actions .btn-link:hover{opacity:1}.workspace-actions .btn-link.active{color:gold;opacity:1}.workspace-actions .btn-link.text-danger:hover{color:var(--theme-danger)}.workspace-empty{text-align:center;padding:40px;color:var(--theme-fg-more)}.workspace-empty p{margin:8px 0}","",{version:3,sources:["webpack://./src/components/workspaceList.component.scss"],names:[],mappings:"AAAA,0BACE,YAAA,CACA,eAAA,CAGF,uBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,kBAAA,CAEA,0BACE,QAAA,CACA,gBAAA,CAIJ,gBACE,YAAA,CACA,qBAAA,CACA,QAAA,CAGF,gBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,YAAA,CACA,+BAAA,CACA,iBAAA,CACA,oCAAA,CACA,yBAAA,CAEA,sBACE,oCAAA,CAIJ,gBACE,YAAA,CACA,kBAAA,CACA,QAAA,CAGF,gBACE,cAAA,CACA,UAAA,CACA,iBAAA,CAGF,mBACE,YAAA,CACA,qBAAA,CACA,OAAA,CAGF,gBACE,gBAAA,CACA,eAAA,CAGF,gBACE,gBAAA,CACA,0BAAA,CAEA,2BACE,YAAA,CAGF,uBACE,gBAAA,CACA,eAAA,CACA,iBAAA,CACA,+BAAA,CACA,UAAA,CAIJ,mBACE,YAAA,CACA,OAAA,CAEA,6BACE,WAAA,CACA,0BAAA,CACA,UAAA,CACA,sBAAA,CAEA,mCACE,SAAA,CAGF,oCACE,UAAA,CACA,SAAA,CAGF,+CACE,yBAAA,CAKN,iBACE,iBAAA,CACA,YAAA,CACA,0BAAA,CAEA,mBACE,YAAA",sourcesContent:[".workspace-list-container {\r\n padding: 20px;\r\n max-width: 800px;\r\n}\r\n\r\n.workspace-list-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 20px;\r\n\r\n h3 {\r\n margin: 0;\r\n font-size: 1.5rem;\r\n }\r\n}\r\n\r\n.workspace-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n\r\n.workspace-item {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px;\r\n background: var(--theme-bg-more);\r\n border-radius: 8px;\r\n border: 1px solid var(--theme-border);\r\n transition: background 0.2s;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more-more);\r\n }\r\n}\r\n\r\n.workspace-info {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n}\r\n\r\n.workspace-icon {\r\n font-size: 24px;\r\n width: 40px;\r\n text-align: center;\r\n}\r\n\r\n.workspace-details {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.workspace-name {\r\n font-size: 1.1rem;\r\n font-weight: 500;\r\n}\r\n\r\n.workspace-meta {\r\n font-size: 0.85rem;\r\n color: var(--theme-fg-more);\r\n\r\n .separator {\r\n margin: 0 6px;\r\n }\r\n\r\n .badge {\r\n font-size: 0.75rem;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n background: var(--theme-primary);\r\n color: white;\r\n }\r\n}\r\n\r\n.workspace-actions {\r\n display: flex;\r\n gap: 4px;\r\n\r\n .btn-link {\r\n padding: 8px;\r\n color: var(--theme-fg-more);\r\n opacity: 0.7;\r\n transition: opacity 0.2s;\r\n\r\n &:hover {\r\n opacity: 1;\r\n }\r\n\r\n &.active {\r\n color: gold;\r\n opacity: 1;\r\n }\r\n\r\n &.text-danger:hover {\r\n color: var(--theme-danger);\r\n }\r\n }\r\n}\r\n\r\n.workspace-empty {\r\n text-align: center;\r\n padding: 40px;\r\n color: var(--theme-fg-more);\r\n\r\n p {\r\n margin: 8px 0;\r\n }\r\n}\r\n"],sourceRoot:""}]);const s=a},528(e,r,t){t(766),e.exports=function(e){return""+'<div class="split-preview" [class.horizontal]="split.orientation === "horizontal"" [class.vertical]="split.orientation === "vertical""><ng-container *ngFor="let child of split.children; let i = index"><div class="preview-pane" *ngIf="isPane(child)" [style.flex-basis]="getFlexStyle(i)" (click)="onPaneClick(asPane(child))" (contextmenu)="onContextMenu($event, asPane(child))"><div class="pane-content"><div class="pane-label">{{ getPaneLabel(asPane(child)) }}</div><div class="pane-hint">Click to edit</div></div></div><split-preview *ngIf="isSplit(child)" [split]="asSplit(child)" [depth]="depth + 1" [style.flex-basis]="getFlexStyle(i)" (paneClick)="onNestedPaneClick($event)" (splitHorizontal)="onNestedSplitH($event)" (splitVertical)="onNestedSplitV($event)" (removePane)="onNestedRemove($event)"></split-preview></ng-container></div><div class="context-menu-overlay" *ngIf="contextMenuPane" (click)="closeContextMenu()"><div class="context-menu" [style.left.px]="contextMenuPosition.x" [style.top.px]="contextMenuPosition.y" (click)="$event.stopPropagation()"><button class="context-menu-item" type="button" (click)="onSplitH()"><i class="fas fa-arrows-alt-h"></i> Split Horizontal</button><button class="context-menu-item" type="button" (click)="onSplitV()"><i class="fas fa-arrows-alt-v"></i> Split Vertical</button><div class="context-menu-divider"></div><button class="context-menu-item danger" type="button" (click)="onRemove()"><i class="fas fa-trash"></i> Remove Pane</button></div></div>'}},581(e,r,t){var n=t(528);e.exports=(n.default||n).apply(n,[])},650(e){"use strict";e.exports=n},700(e){"use strict";e.exports=o},766(e,r,t){"use strict";var n=Object.prototype.hasOwnProperty;function o(e,r){return Array.isArray(e)?function(e,r){for(var t,n="",i="",a=Array.isArray(r),s=0;s<e.length;s++)(t=o(e[s]))&&(a&&r[s]&&(t=c(t)),n=n+i+t,i=" ");return n}(e,r):e&&"object"==typeof e?function(e){var r="",t="";for(var o in e)o&&e[o]&&n.call(e,o)&&(r=r+t+o,t=" ");return r}(e):e||""}function i(e){if(!e)return"";if("object"==typeof e){var r="";for(var t in e)n.call(e,t)&&(r=r+t+":"+e[t]+";");return r}return e+""}function a(e,r,t,n){if(!1===r||null==r||!r&&("class"===e||"style"===e))return"";if(!0===r)return" "+(n?e:e+'="'+e+'"');var o=typeof r;return"object"!==o&&"function"!==o||"function"!=typeof r.toJSON||(r=r.toJSON()),"string"==typeof r||(r=JSON.stringify(r),t||-1===r.indexOf('"'))?(t&&(r=c(r))," "+e+'="'+r+'"'):" "+e+"='"+r.replace(/'/g,"'")+"'"}r.merge=function e(r,t){if(1===arguments.length){for(var n=r[0],o=1;o<r.length;o++)n=e(n,r[o]);return n}for(var a in t)if("class"===a){var s=r[a]||[];r[a]=(Array.isArray(s)?s:[s]).concat(t[a]||[])}else if("style"===a){s=(s=i(r[a]))&&";"!==s[s.length-1]?s+";":s;var c=i(t[a]);c=c&&";"!==c[c.length-1]?c+";":c,r[a]=s+c}else r[a]=t[a];return r},r.classes=o,r.style=i,r.attr=a,r.attrs=function(e,r){var t="";for(var s in e)if(n.call(e,s)){var c=e[s];if("class"===s){t=a(s,c=o(c),!1,r)+t;continue}"style"===s&&(c=i(c)),t+=a(s,c,!1,r)}return t};var s=/["&<>]/;function c(e){var r=""+e,t=s.exec(r);if(!t)return e;var n,o,i,a="";for(n=t.index,o=0;n<r.length;n++){switch(r.charCodeAt(n)){case 34:i=""";break;case 38:i="&";break;case 60:i="<";break;case 62:i=">";break;default:continue}o!==n&&(a+=r.substring(o,n)),o=n+1,a+=i}return o!==n?a+r.substring(o,n):a}r.escape=c,r.rethrow=function e(r,n,o,i){if(!(r instanceof Error))throw r;if(!("undefined"==typeof window&&n||i))throw r.message+=" on line "+o,r;var a,s,c,A;try{i=i||t(947).readFileSync(n,{encoding:"utf8"}),a=3,s=i.split("\n"),c=Math.max(o-a,0),A=Math.min(s.length,o+a)}catch(t){return r.message+=" - could not read from "+n+" ("+t.message+")",void e(r,null,o)}a=s.slice(c,A).map(function(e,r){var t=r+c+1;return(t==o?" > ":" ")+t+"| "+e}).join("\n"),r.path=n;try{r.message=(n||"Pug")+":"+o+"\n"+a+"\n\n"+r.message}catch(e){}throw r}},801(e,r,t){var n=t(234);e.exports=(n.default||n).apply(n,[])},840(e,r,t){var n=t(28);n&&n.__esModule&&(n=n.default),e.exports="string"==typeof n?n:n.toString()},860(r){"use strict";r.exports=e},864(e,r,t){var n=t(245);e.exports=(n.default||n).apply(n,[])},893(e,r,t){"use strict";t.r(r),t.d(r,{default:()=>s});var n=t(354),o=t.n(n),i=t(314),a=t.n(i)()(o());a.push([e.id,".pane-editor-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:1100}.pane-editor-modal{background:var(--theme-bg);border-radius:12px;width:90%;max-width:500px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.4)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--theme-border)}.modal-header h4{margin:0;font-size:1.15rem}.modal-header .close-btn{font-size:1.15rem;color:var(--theme-fg-more);padding:4px 8px}.modal-header .close-btn:hover{color:var(--theme-fg)}.modal-body{padding:20px;overflow-y:auto;flex:1}.form-group{margin-bottom:16px}.form-group:last-child{margin-bottom:0}.form-group label{display:block;margin-bottom:6px;font-size:.9rem;color:var(--theme-fg-more)}.form-control{width:100%;padding:10px 12px;border-radius:6px;border:1px solid var(--theme-border);background:var(--theme-bg-more);color:var(--theme-fg);font-size:.95rem}.form-control:focus{outline:none;border-color:var(--theme-primary)}select.form-control{cursor:pointer}.input-with-button{display:flex;gap:8px}.input-with-button input{flex:1}.help-text{display:block;margin-top:4px;font-size:.8rem;color:var(--theme-fg-more);opacity:.8}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 20px;border-top:1px solid var(--theme-border)}","",{version:3,sources:["webpack://./src/components/paneEditor.component.scss"],names:[],mappings:"AAAA,qBACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,yBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,YAAA,CAGF,mBACE,0BAAA,CACA,kBAAA,CACA,SAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,YAAA,CACA,qBAAA,CACA,qCAAA,CAGF,cACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CACA,2CAAA,CAEA,iBACE,QAAA,CACA,iBAAA,CAGF,yBACE,iBAAA,CACA,0BAAA,CACA,eAAA,CAEA,+BACE,qBAAA,CAKN,YACE,YAAA,CACA,eAAA,CACA,MAAA,CAGF,YACE,kBAAA,CAEA,uBACE,eAAA,CAGF,kBACE,aAAA,CACA,iBAAA,CACA,eAAA,CACA,0BAAA,CAIJ,cACE,UAAA,CACA,iBAAA,CACA,iBAAA,CACA,oCAAA,CACA,+BAAA,CACA,qBAAA,CACA,gBAAA,CAEA,oBACE,YAAA,CACA,iCAAA,CAIJ,oBACE,cAAA,CAGF,mBACE,YAAA,CACA,OAAA,CAEA,yBACE,MAAA,CAIJ,WACE,aAAA,CACA,cAAA,CACA,eAAA,CACA,0BAAA,CACA,UAAA,CAGF,cACE,YAAA,CACA,wBAAA,CACA,QAAA,CACA,iBAAA,CACA,wCAAA",sourcesContent:[".pane-editor-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.7);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 1100;\r\n}\r\n\r\n.pane-editor-modal {\r\n background: var(--theme-bg);\r\n border-radius: 12px;\r\n width: 90%;\r\n max-width: 500px;\r\n max-height: 80vh;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\r\n}\r\n\r\n.modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px 20px;\r\n border-bottom: 1px solid var(--theme-border);\r\n\r\n h4 {\r\n margin: 0;\r\n font-size: 1.15rem;\r\n }\r\n\r\n .close-btn {\r\n font-size: 1.15rem;\r\n color: var(--theme-fg-more);\r\n padding: 4px 8px;\r\n\r\n &:hover {\r\n color: var(--theme-fg);\r\n }\r\n }\r\n}\r\n\r\n.modal-body {\r\n padding: 20px;\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n.form-group {\r\n margin-bottom: 16px;\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n label {\r\n display: block;\r\n margin-bottom: 6px;\r\n font-size: 0.9rem;\r\n color: var(--theme-fg-more);\r\n }\r\n}\r\n\r\n.form-control {\r\n width: 100%;\r\n padding: 10px 12px;\r\n border-radius: 6px;\r\n border: 1px solid var(--theme-border);\r\n background: var(--theme-bg-more);\r\n color: var(--theme-fg);\r\n font-size: 0.95rem;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: var(--theme-primary);\r\n }\r\n}\r\n\r\nselect.form-control {\r\n cursor: pointer;\r\n}\r\n\r\n.input-with-button {\r\n display: flex;\r\n gap: 8px;\r\n\r\n input {\r\n flex: 1;\r\n }\r\n}\r\n\r\n.help-text {\r\n display: block;\r\n margin-top: 4px;\r\n font-size: 0.8rem;\r\n color: var(--theme-fg-more);\r\n opacity: 0.8;\r\n}\r\n\r\n.modal-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 12px;\r\n padding: 16px 20px;\r\n border-top: 1px solid var(--theme-border);\r\n}\r\n"],sourceRoot:""}]);const s=a},947(e){"use strict";if(void 0===i){var r=new Error("Cannot find module 'fs'");throw r.code="MODULE_NOT_FOUND",r}e.exports=i},958(e,r,t){var n=t(261);e.exports=(n.default||n).apply(n,[])}},s={};function c(e){var r=s[e];if(void 0!==r)return r.exports;if(void 0===a[e]){var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}var n=s[e]={id:e,exports:{}};return a[e](n,n.exports,c),n.exports}c.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return c.d(r,{a:r}),r},c.d=(e,r)=>{for(var t in r)c.o(r,t)&&!c.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},c.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),c.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var A={};return(()=>{"use strict";c.r(A),c.d(A,{WorkspaceEditorConfigProvider:()=>s,WorkspaceEditorService:()=>m,WorkspaceEditorSettingsProvider:()=>g,default:()=>j});var e=c(860),r=c(358),t=c(182),n=c(650),o=c(700);const i="tabbyspaces",a="TabbySpaces";let s=class extends n.ConfigProvider{constructor(){super(...arguments),this.defaults={[i]:{workspaces:[]}}}};function l(e){return"orientation"in e&&"children"in e}function p(){return{id:f(),profileId:"",cwd:"",startupCommand:"",title:""}}function d(e="horizontal"){return{orientation:e,ratios:[.5,.5],children:[p(),p()]}}function f(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const r=16*Math.random()|0;return("x"===e?r:3&r|8).toString(16)})}function u(e){return l(e)?e.children.reduce((e,r)=>e+u(r),0):1}s=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a}([(0,e.Injectable)()],s);let m=class{constructor(e,r,t){this.config=e,this.notifications=r,this.profilesService=t}getWorkspaces(){return this.config.store[i]?.workspaces??[]}async saveWorkspaces(e){return this.config.store[i].workspaces=e,this.syncTabbyProfiles(e),await this.saveConfig()}async addWorkspace(e){const r=this.getWorkspaces();r.push(e),await this.saveWorkspaces(r),this.notifications.info(`Workspace "${e.name}" created`)}async updateWorkspace(e){const r=this.getWorkspaces(),t=r.findIndex(r=>r.id===e.id);-1!==t&&(r[t]=e,await this.saveWorkspaces(r),this.notifications.info(`Workspace "${e.name}" updated`))}async deleteWorkspace(e){const r=this.getWorkspaces(),t=r.find(r=>r.id===e),n=r.filter(r=>r.id!==e);await this.saveWorkspaces(n),t&&this.notifications.info(`Workspace "${t.name}" deleted`)}async getAvailableProfiles(){return(await this.profilesService.getProfiles()).filter(e=>"local"===e.type&&!e.id?.startsWith("split-layout:"))}syncTabbyProfiles(e){const r=this.config.store.profiles??[];for(let e=r.length-1;e>=0;e--)r[e].id?.startsWith(`split-layout:${i}:`)&&r.splice(e,1);for(const t of e){const e=this.generateTabbyProfile(t);r.push(e)}}generateTabbyProfile(e){const r=this.sanitizeForProfileId(e.name);return{id:`split-layout:${i}:${r}:${e.id}`,type:"split-layout",name:e.name,group:a,icon:e.icon,color:e.color,isBuiltin:!1,options:{recoveryToken:this.generateRecoveryToken(e.root)}}}generateRecoveryToken(e){return{type:"app:split-tab",orientation:"horizontal"===e.orientation?"h":"v",ratios:e.ratios,children:e.children.map(e=>l(e)?this.generateRecoveryToken(e):this.generatePaneToken(e))}}generatePaneToken(e){const r=this.getProfileById(e.profileId);if(!r)return{type:"app:local-tab",profile:{type:"local",name:"Shell"},savedState:!1};const t={restoreFromPTYID:!1,command:r.options?.command||"",args:r.options?.args||[],cwd:e.cwd||r.options?.cwd||"",env:r.options?.env||{},width:null,height:null,pauseAfterExit:!1,runAsAdministrator:!1};if(e.startupCommand){const n=r.options?.command||"";n.includes("nu.exe")||r.name?.toLowerCase().includes("nushell")?t.args=["-e",e.startupCommand]:n.includes("powershell")||n.includes("pwsh")?t.args=["-NoExit","-Command",e.startupCommand]:n.includes("cmd.exe")?t.args=["/K",e.startupCommand]:t.args=["-c",e.startupCommand]}return{type:"app:local-tab",profile:{id:r.id,type:"local",name:r.name||"Shell",group:r.group||"",options:t,icon:r.icon||"",color:r.color||"",disableDynamicTitle:!1,weight:0,isBuiltin:!1,isTemplate:!1,terminalColorScheme:null,behaviorOnSessionEnd:"auto"},savedState:!1,tabTitle:e.title||"",tabCustomTitle:e.title||"",disableDynamicTitle:!!e.title}}duplicateWorkspace(e){const r=JSON.parse(JSON.stringify(e));return r.id=f(),r.name=`${e.name} (Copy)`,r.isDefault=!1,this.regenerateIds(r.root),r}regenerateIds(e){if(l(e))for(const r of e.children)this.regenerateIds(r);else e.id=f()}sanitizeForProfileId(e){return e.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"workspace"}getProfileById(e){return(this.config.store.profiles??[]).find(r=>r.id===e&&"local"===r.type)}getProfileName(e){return this.getProfileById(e)?.name}async saveConfig(){try{return await this.config.save(),!0}catch(e){return this.notifications.error("Failed to save configuration"),console.error("TabbySpaces save error:",e),!1}}};m=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a}([(0,e.Injectable)({providedIn:"root"}),function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)}("design:paramtypes",[n.ConfigService,n.NotificationsService,n.ProfilesService])],m);let C=class{constructor(e,r,t){this.config=e,this.workspaceService=r,this.cdr=t,this.workspaces=[],this.editingWorkspace=null,this.showEditor=!1,this.configSubscription=null}ngOnInit(){this.loadWorkspaces(),this.configSubscription=this.config.changed$.subscribe(()=>{this.loadWorkspaces()})}ngOnDestroy(){this.configSubscription?.unsubscribe()}loadWorkspaces(){this.workspaces=this.workspaceService.getWorkspaces(),this.cdr.detectChanges()}async createWorkspace(){const e=await this.workspaceService.getAvailableProfiles(),r=e[0]?.id||"",t=function(e="New Workspace"){return{id:f(),name:e,icon:"columns",color:"#3b82f6",root:d(),isDefault:!1}}();this.setProfileForAllPanes(t.root,r),this.editingWorkspace=t,this.showEditor=!0}setProfileForAllPanes(e,r){l(e)?e.children.forEach(e=>this.setProfileForAllPanes(e,r)):e.profileId=r}editWorkspace(e){this.editingWorkspace=JSON.parse(JSON.stringify(e)),this.showEditor=!0}async duplicateWorkspace(e){const r=this.workspaceService.duplicateWorkspace(e);await this.workspaceService.addWorkspace(r),this.loadWorkspaces()}async deleteWorkspace(e){console.log("[TabbySpaces] deleteWorkspace called",e.id),confirm(`Delete workspace "${e.name}"?`)&&(console.log("[TabbySpaces] confirm = true, calling service.deleteWorkspace"),await this.workspaceService.deleteWorkspace(e.id),console.log("[TabbySpaces] service.deleteWorkspace done, calling loadWorkspaces"),this.loadWorkspaces(),console.log("[TabbySpaces] loadWorkspaces done, workspaces:",this.workspaces.length))}async onEditorSave(e){console.log("[TabbySpaces] onEditorSave called",e.id,e.name);const r=this.workspaces.find(r=>r.id===e.id);console.log("[TabbySpaces] existing workspace?",!!r),r?await this.workspaceService.updateWorkspace(e):await this.workspaceService.addWorkspace(e),console.log("[TabbySpaces] save done, calling loadWorkspaces"),this.loadWorkspaces(),console.log("[TabbySpaces] calling closeEditor"),this.closeEditor(),console.log("[TabbySpaces] closeEditor done, showEditor:",this.showEditor)}closeEditor(){console.log("[TabbySpaces] closeEditor called, showEditor before:",this.showEditor),this.showEditor=!1,this.editingWorkspace=null,this.cdr.detectChanges(),console.log("[TabbySpaces] closeEditor done, showEditor after:",this.showEditor)}getPaneCount(e){return u(e.root)}getOrientationLabel(e){return"horizontal"===e.root.orientation?"horizontal":"vertical"}async setAsDefault(e){this.workspaces.forEach(e=>e.isDefault=!1),e.isDefault=!0,await this.workspaceService.saveWorkspaces(this.workspaces),this.loadWorkspaces()}};C=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a}([(0,e.Component)({selector:"workspace-list",template:c(958),styles:[c(341)]}),function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)}("design:paramtypes",[n.ConfigService,m,e.ChangeDetectorRef])],C);let g=class extends o.SettingsTabProvider{constructor(){super(...arguments),this.id=i,this.icon="columns",this.title=a}getComponentType(){return C}};g=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a}([(0,e.Injectable)()],g);let h=class extends n.ToolbarButtonProvider{constructor(e,r,t){super(),this.workspaceService=e,this.profilesService=r,this.app=t}provide(){return[{icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <rect x="3" y="3" width="7" height="7"/>\n <rect x="14" y="3" width="7" height="7"/>\n <rect x="14" y="14" width="7" height="7"/>\n <rect x="3" y="14" width="7" height="7"/>\n </svg>',title:a,weight:5,click:()=>this.showWorkspaceSelector()}]}async showWorkspaceSelector(){const e=this.workspaceService.getWorkspaces();if(0===e.length)return void this.openSettings();const r=e.map(e=>({name:e.name,description:`${u(e.root)} panes`,icon:e.icon||"grid",color:e.color,result:e.id}));r.push({name:"Manage Workspaces...",description:"Create and edit workspaces",icon:"cog",color:void 0,result:"__settings__"});const t=await this.app.showSelector("Select Workspace",r);"__settings__"===t?this.openSettings():t&&this.openWorkspace(t)}openSettings(){this.app.openNewTabRaw({type:o.SettingsTabComponent,inputs:{activeTab:i}})}openWorkspace(e){const r=this.workspaceService.getWorkspaces().find(r=>r.id===e);if(!r)return;const t=this.workspaceService.generateTabbyProfile(r);this.profilesService.openNewTabForProfile(t)}};h=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a}([(0,e.Injectable)(),function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)}("design:paramtypes",[m,n.ProfilesService,n.AppService])],h);var b=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a},v=function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)};let x=class{constructor(r){this.workspaceService=r,this.save=new e.EventEmitter,this.cancel=new e.EventEmitter,this.selectedPane=null,this.showPaneEditor=!1,this.profiles=[],this.availableIcons=["columns","terminal","code","folder","home","briefcase","cog","database","server","cloud","rocket","flask","bug","wrench","cube","layer-group","sitemap","project-diagram"]}async ngOnInit(){this.profiles=await this.workspaceService.getAvailableProfiles(),this.workspace.root||(this.workspace.root={orientation:"horizontal",ratios:[.5,.5],children:[p(),p()]})}onSave(){this.workspace.name?.trim()&&this.save.emit(this.workspace)}onCancel(){this.cancel.emit()}selectPane(e){this.selectedPane=e,this.showPaneEditor=!0}closePaneEditor(){this.showPaneEditor=!1,this.selectedPane=null}onPaneSave(e){this.updatePaneInTree(this.workspace.root,e),this.closePaneEditor()}updatePaneInTree(e,r){for(let t=0;t<e.children.length;t++){const n=e.children[t];if(l(n)){if(this.updatePaneInTree(n,r))return!0}else if(n.id===r.id)return e.children[t]=r,!0}return!1}splitPane(e,r){this.splitPaneInTree(this.workspace.root,e,r)}splitPaneInTree(e,r,t){for(let n=0;n<e.children.length;n++){const o=e.children[n];if(l(o)){if(this.splitPaneInTree(o,r,t))return!0}else if(o.id===r.id){const r=p();r.profileId=o.profileId;const i={orientation:t,ratios:[.5,.5],children:[o,r]};return e.children[n]=i,this.recalculateRatios(e),!0}}return!1}removePane(e){this.removePaneFromTree(this.workspace.root,e)}removePaneFromTree(e,r){for(let t=0;t<e.children.length;t++){const n=e.children[t];if(l(n)){const o=n.children.findIndex(e=>!l(e)&&e.id===r.id);if(-1!==o&&n.children.length>1)return n.children.splice(o,1),this.recalculateRatios(n),1===n.children.length&&(e.children[t]=n.children[0]),!0;if(this.removePaneFromTree(n,r))return!0}else if(n.id===r.id&&e.children.length>1)return e.children.splice(t,1),this.recalculateRatios(e),!0}return!1}recalculateRatios(e){const r=e.children.length;e.ratios=e.children.map(()=>1/r)}setOrientation(e){this.workspace.root.orientation=e}updateRatio(e,r){const t=[...this.workspace.root.ratios],n=r-t[e];e<t.length-1?(t[e]=r,t[e+1]-=n):(t[e]=r,t[e-1]-=n),t.forEach((e,r)=>{t[r]=Math.max(.1,Math.min(.9,e))}),this.workspace.root.ratios=t}};b([(0,e.Input)(),v("design:type",Object)],x.prototype,"workspace",void 0),b([(0,e.Output)(),v("design:type",Object)],x.prototype,"save",void 0),b([(0,e.Output)(),v("design:type",Object)],x.prototype,"cancel",void 0),x=b([(0,e.Component)({selector:"workspace-editor",template:c(801),styles:[c(840)]}),v("design:paramtypes",[m])],x);var y=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a},k=function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)};let w=class{constructor(){this.profiles=[],this.save=new e.EventEmitter,this.cancel=new e.EventEmitter}ngOnInit(){this.editedPane={...this.pane}}onSave(){this.save.emit(this.editedPane)}onCancel(){this.cancel.emit()}getProfileName(e){const r=this.profiles.find(r=>r.id===e);return r?.name??"Unknown"}};y([(0,e.Input)(),k("design:type",Object)],w.prototype,"pane",void 0),y([(0,e.Input)(),k("design:type",Array)],w.prototype,"profiles",void 0),y([(0,e.Output)(),k("design:type",Object)],w.prototype,"save",void 0),y([(0,e.Output)(),k("design:type",Object)],w.prototype,"cancel",void 0),w=y([(0,e.Component)({selector:"pane-editor",template:c(864),styles:[c(33)]})],w);var B=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a},E=function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)};let P=class{constructor(r){this.workspaceService=r,this.depth=0,this.paneClick=new e.EventEmitter,this.splitHorizontal=new e.EventEmitter,this.splitVertical=new e.EventEmitter,this.removePane=new e.EventEmitter,this.contextMenuPane=null,this.contextMenuPosition={x:0,y:0}}isPane(e){return!l(e)}isSplit(e){return l(e)}asSplit(e){return e}asPane(e){return e}getFlexStyle(e){return 100*this.split.ratios[e]+"%"}onPaneClick(e){this.paneClick.emit(e)}onContextMenu(e,r){e.preventDefault(),this.contextMenuPane=r,this.contextMenuPosition={x:e.clientX,y:e.clientY}}closeContextMenu(){this.contextMenuPane=null}onSplitH(){this.contextMenuPane&&(this.splitHorizontal.emit(this.contextMenuPane),this.closeContextMenu())}onSplitV(){this.contextMenuPane&&(this.splitVertical.emit(this.contextMenuPane),this.closeContextMenu())}onRemove(){this.contextMenuPane&&(this.removePane.emit(this.contextMenuPane),this.closeContextMenu())}getProfileName(e){return this.workspaceService.getProfileName(e)??"Select profile"}getPaneLabel(e){if(e.title)return e.title;if(e.startupCommand){const r=e.startupCommand;return r.length>20?r.substring(0,17)+"...":r}return this.getProfileName(e.profileId)}onNestedPaneClick(e){this.paneClick.emit(e)}onNestedSplitH(e){this.splitHorizontal.emit(e)}onNestedSplitV(e){this.splitVertical.emit(e)}onNestedRemove(e){this.removePane.emit(e)}};B([(0,e.Input)(),E("design:type",Object)],P.prototype,"split",void 0),B([(0,e.Input)(),E("design:type",Object)],P.prototype,"depth",void 0),B([(0,e.Output)(),E("design:type",Object)],P.prototype,"paneClick",void 0),B([(0,e.Output)(),E("design:type",Object)],P.prototype,"splitHorizontal",void 0),B([(0,e.Output)(),E("design:type",Object)],P.prototype,"splitVertical",void 0),B([(0,e.Output)(),E("design:type",Object)],P.prototype,"removePane",void 0),P=B([(0,e.Component)({selector:"split-preview",template:c(581),styles:[c(210)]}),E("design:paramtypes",[m])],P);let S=class{};S=function(e,r,t,n){var o,i=arguments.length,a=i<3?r:null===n?n=Object.getOwnPropertyDescriptor(r,t):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,r,t,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(r,t,a):o(r,t))||a);return i>3&&a&&Object.defineProperty(r,t,a),a}([(0,e.NgModule)({imports:[r.CommonModule,t.FormsModule],providers:[{provide:n.ConfigProvider,useClass:s,multi:!0},{provide:o.SettingsTabProvider,useClass:g,multi:!0},{provide:n.ToolbarButtonProvider,useClass:h,multi:!0},m],declarations:[C,x,w,P]})],S);const j=S})(),A})());
|
|
2
|
+
!function(e,t){if("object"==typeof exports&&"object"==typeof module)module.exports=t(require("@angular/core"),require("@angular/common"),require("@angular/forms"),require("tabby-core"),require("tabby-settings"),require("tabby-terminal"),require("rxjs"),function(){try{return require("fs")}catch(e){}}());else if("function"==typeof define&&define.amd)define(["@angular/core","@angular/common","@angular/forms","tabby-core","tabby-settings","tabby-terminal","rxjs","fs"],t);else{var r="object"==typeof exports?t(require("@angular/core"),require("@angular/common"),require("@angular/forms"),require("tabby-core"),require("tabby-settings"),require("tabby-terminal"),require("rxjs"),function(){try{return require("fs")}catch(e){}}()):t(e["@angular/core"],e["@angular/common"],e["@angular/forms"],e["tabby-core"],e["tabby-settings"],e["tabby-terminal"],e.rxjs,e.fs);for(var n in r)("object"==typeof exports?exports:e)[n]=r[n]}}(global,(e,t,r,n,o,i,a,s)=>(()=>{var c={28(e,t,r){"use strict";r.r(t),r.d(t,{default:()=>s});var n=r(354),o=r.n(n),i=r(314),a=r.n(i)()(o());a.push([e.id,".workspace-editor-inline{background:var(--theme-bg-more);border-radius:8px;border:1px solid var(--theme-border);margin-bottom:16px}.workspace-editor-inline .editor-body{padding:16px}.workspace-editor-inline .editor-footer{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-top:1px solid var(--theme-border);background:var(--theme-bg);border-radius:0 0 8px 8px}.workspace-editor-inline .editor-footer .startup-checkbox{display:flex;align-items:center;gap:6px;font-size:.85rem;color:var(--theme-fg-more);cursor:pointer}.workspace-editor-inline .editor-footer .startup-checkbox input{margin:0}.workspace-editor-inline .editor-footer .editor-actions{display:flex;gap:8px}.workspace-editor-inline .editor-footer .editor-actions .btn-success{background:#10b981;border-color:#10b981;color:#fff}.workspace-editor-inline .editor-footer .editor-actions .btn-success:hover{background:#059669;border-color:#059669}.workspace-editor-inline .editor-footer .editor-actions .unsaved-indicator{color:#f59e0b;font-weight:bold;margin-left:2px}.editor-top-row{display:flex;align-items:flex-start;gap:12px;margin-bottom:16px}.color-picker .color-input{width:40px;height:40px;padding:2px;border:1px solid var(--theme-border);border-radius:6px;cursor:pointer;background:var(--theme-bg)}.color-picker .color-input::-webkit-color-swatch-wrapper{padding:2px}.color-picker .color-input::-webkit-color-swatch{border-radius:4px;border:none}.name-input{flex:1;min-width:150px;padding:10px 12px;border-radius:6px;border:1px solid var(--theme-border);background:var(--theme-bg);color:var(--theme-fg);font-size:1rem;font-weight:500}.name-input:focus{outline:none;border-color:var(--theme-primary)}.name-input::placeholder{color:var(--theme-fg-more);font-weight:400}.icon-picker{position:relative}.icon-picker .icon-trigger{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:1px solid var(--theme-border);border-radius:6px;background:var(--theme-bg);cursor:pointer;font-size:1.1rem;transition:background .15s}.icon-picker .icon-trigger:hover{background:var(--theme-bg-more)}.icon-picker .icon-dropdown{position:absolute;top:100%;right:0;margin-top:4px;padding:8px;background:var(--theme-bg-more);border:1px solid var(--theme-border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);z-index:100;display:grid;grid-template-columns:repeat(6, 28px);gap:4px}.icon-picker .icon-option{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(0,0,0,0);border-radius:4px;background:rgba(0,0,0,0);color:var(--theme-fg-more);cursor:pointer;transition:all .15s;font-size:.85rem}.icon-picker .icon-option:hover{background:var(--theme-bg-more-more);color:var(--theme-fg)}.icon-picker .icon-option.selected{border-color:currentColor;background:var(--theme-bg)}.layout-section .layout-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.layout-section .layout-title{font-size:.8rem;font-weight:500;color:var(--theme-fg-more);text-transform:uppercase;letter-spacing:.5px}.layout-toolbar{display:flex;align-items:center;gap:4px;padding:8px 0;margin-bottom:8px}.layout-toolbar .toolbar-group{display:flex;align-items:center;gap:2px}.layout-toolbar .toolbar-label{font-size:.75rem;color:var(--theme-fg-more);margin-right:4px;text-transform:uppercase;letter-spacing:.3px}.layout-toolbar .toolbar-spacer{flex:1}.layout-toolbar .toolbar-divider{width:1px;height:20px;background:var(--theme-border);margin:0 4px}.layout-toolbar .toolbar-btn{padding:4px 8px;background:var(--theme-bg);border:1px solid var(--theme-border);border-radius:4px;color:var(--theme-fg);cursor:pointer;transition:all .15s;font-size:.85rem}.layout-toolbar .toolbar-btn:hover:not(:disabled){background:var(--theme-bg-more-more)}.layout-toolbar .toolbar-btn:disabled{opacity:.4;cursor:not-allowed}.layout-toolbar .toolbar-btn.danger{color:var(--theme-danger, #ef4444)}.layout-preview-container{background:var(--theme-bg);border-radius:6px;padding:8px;min-height:120px;max-height:180px}","",{version:3,sources:["webpack://./src/components/workspaceEditor.component.scss"],names:[],mappings:"AACA,yBACE,+BAAA,CACA,iBAAA,CACA,oCAAA,CACA,kBAAA,CAEA,sCACE,YAAA,CAGF,wCACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CACA,wCAAA,CACA,0BAAA,CACA,yBAAA,CAEA,0DACE,YAAA,CACA,kBAAA,CACA,OAAA,CACA,gBAAA,CACA,0BAAA,CACA,cAAA,CAEA,gEACE,QAAA,CAIJ,wDACE,YAAA,CACA,OAAA,CAEA,qEACE,kBAAA,CACA,oBAAA,CACA,UAAA,CAEA,2EACE,kBAAA,CACA,oBAAA,CAIJ,2EACE,aAAA,CACA,gBAAA,CACA,eAAA,CAOR,gBACE,YAAA,CACA,sBAAA,CACA,QAAA,CACA,kBAAA,CAIA,2BACE,UAAA,CACA,WAAA,CACA,WAAA,CACA,oCAAA,CACA,iBAAA,CACA,cAAA,CACA,0BAAA,CAEA,yDACE,WAAA,CAGF,iDACE,iBAAA,CACA,WAAA,CAKN,YACE,MAAA,CACA,eAAA,CACA,iBAAA,CACA,iBAAA,CACA,oCAAA,CACA,0BAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CAEA,kBACE,YAAA,CACA,iCAAA,CAGF,yBACE,0BAAA,CACA,eAAA,CAIJ,aACE,iBAAA,CAEA,2BACE,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oCAAA,CACA,iBAAA,CACA,0BAAA,CACA,cAAA,CACA,gBAAA,CACA,0BAAA,CAEA,iCACE,+BAAA,CAIJ,4BACE,iBAAA,CACA,QAAA,CACA,OAAA,CACA,cAAA,CACA,WAAA,CACA,+BAAA,CACA,oCAAA,CACA,iBAAA,CACA,qCAAA,CACA,WAAA,CACA,YAAA,CACA,qCAAA,CACA,OAAA,CAGF,0BACE,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,8BAAA,CACA,iBAAA,CACA,wBAAA,CACA,0BAAA,CACA,cAAA,CACA,mBAAA,CACA,gBAAA,CAEA,gCACE,oCAAA,CACA,qBAAA,CAGF,mCACE,yBAAA,CACA,0BAAA,CAOJ,+BACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CAGF,8BACE,eAAA,CACA,eAAA,CACA,0BAAA,CACA,wBAAA,CACA,mBAAA,CAKJ,gBACE,YAAA,CACA,kBAAA,CACA,OAAA,CACA,aAAA,CACA,iBAAA,CAEA,+BACE,YAAA,CACA,kBAAA,CACA,OAAA,CAGF,+BACE,gBAAA,CACA,0BAAA,CACA,gBAAA,CACA,wBAAA,CACA,mBAAA,CAGF,gCACE,MAAA,CAGF,iCACE,SAAA,CACA,WAAA,CACA,8BAAA,CACA,YAAA,CAGF,6BACE,eAAA,CACA,0BAAA,CACA,oCAAA,CACA,iBAAA,CACA,qBAAA,CACA,cAAA,CACA,mBAAA,CACA,gBAAA,CAEA,kDACE,oCAAA,CAGF,sCACE,UAAA,CACA,kBAAA,CAGF,oCACE,kCAAA,CAKN,0BACE,0BAAA,CACA,iBAAA,CACA,WAAA,CACA,gBAAA,CACA,gBAAA",sourcesContent:["// Workspace editor (inline)\r\n.workspace-editor-inline {\r\n background: var(--theme-bg-more);\r\n border-radius: 8px;\r\n border: 1px solid var(--theme-border);\r\n margin-bottom: 16px;\r\n\r\n .editor-body {\r\n padding: 16px;\r\n }\r\n\r\n .editor-footer {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 10px 16px;\r\n border-top: 1px solid var(--theme-border);\r\n background: var(--theme-bg);\r\n border-radius: 0 0 8px 8px;\r\n\r\n .startup-checkbox {\r\n display: flex;\r\n align-items: center;\r\n gap: 6px;\r\n font-size: 0.85rem;\r\n color: var(--theme-fg-more);\r\n cursor: pointer;\r\n\r\n input {\r\n margin: 0;\r\n }\r\n }\r\n\r\n .editor-actions {\r\n display: flex;\r\n gap: 8px;\r\n\r\n .btn-success {\r\n background: #10b981;\r\n border-color: #10b981;\r\n color: white;\r\n\r\n &:hover {\r\n background: #059669;\r\n border-color: #059669;\r\n }\r\n }\r\n\r\n .unsaved-indicator {\r\n color: #f59e0b;\r\n font-weight: bold;\r\n margin-left: 2px;\r\n }\r\n }\r\n }\r\n}\r\n\r\n// Shared editor content\r\n.editor-top-row {\r\n display: flex;\r\n align-items: flex-start;\r\n gap: 12px;\r\n margin-bottom: 16px;\r\n}\r\n\r\n.color-picker {\r\n .color-input {\r\n width: 40px;\r\n height: 40px;\r\n padding: 2px;\r\n border: 1px solid var(--theme-border);\r\n border-radius: 6px;\r\n cursor: pointer;\r\n background: var(--theme-bg);\r\n\r\n &::-webkit-color-swatch-wrapper {\r\n padding: 2px;\r\n }\r\n\r\n &::-webkit-color-swatch {\r\n border-radius: 4px;\r\n border: none;\r\n }\r\n }\r\n}\r\n\r\n.name-input {\r\n flex: 1;\r\n min-width: 150px;\r\n padding: 10px 12px;\r\n border-radius: 6px;\r\n border: 1px solid var(--theme-border);\r\n background: var(--theme-bg);\r\n color: var(--theme-fg);\r\n font-size: 1rem;\r\n font-weight: 500;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: var(--theme-primary);\r\n }\r\n\r\n &::placeholder {\r\n color: var(--theme-fg-more);\r\n font-weight: 400;\r\n }\r\n}\r\n\r\n.icon-picker {\r\n position: relative;\r\n\r\n .icon-trigger {\r\n width: 40px;\r\n height: 40px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid var(--theme-border);\r\n border-radius: 6px;\r\n background: var(--theme-bg);\r\n cursor: pointer;\r\n font-size: 1.1rem;\r\n transition: background 0.15s;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more);\r\n }\r\n }\r\n\r\n .icon-dropdown {\r\n position: absolute;\r\n top: 100%;\r\n right: 0;\r\n margin-top: 4px;\r\n padding: 8px;\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border);\r\n border-radius: 6px;\r\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\r\n z-index: 100;\r\n display: grid;\r\n grid-template-columns: repeat(6, 28px);\r\n gap: 4px;\r\n }\r\n\r\n .icon-option {\r\n width: 28px;\r\n height: 28px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n border: 1px solid transparent;\r\n border-radius: 4px;\r\n background: transparent;\r\n color: var(--theme-fg-more);\r\n cursor: pointer;\r\n transition: all 0.15s;\r\n font-size: 0.85rem;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more-more);\r\n color: var(--theme-fg);\r\n }\r\n\r\n &.selected {\r\n border-color: currentColor;\r\n background: var(--theme-bg);\r\n }\r\n }\r\n}\r\n\r\n// Layout section\r\n.layout-section {\r\n .layout-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 8px;\r\n }\r\n\r\n .layout-title {\r\n font-size: 0.8rem;\r\n font-weight: 500;\r\n color: var(--theme-fg-more);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n }\r\n}\r\n\r\n// Layout toolbar\r\n.layout-toolbar {\r\n display: flex;\r\n align-items: center;\r\n gap: 4px;\r\n padding: 8px 0;\r\n margin-bottom: 8px;\r\n\r\n .toolbar-group {\r\n display: flex;\r\n align-items: center;\r\n gap: 2px;\r\n }\r\n\r\n .toolbar-label {\r\n font-size: 0.75rem;\r\n color: var(--theme-fg-more);\r\n margin-right: 4px;\r\n text-transform: uppercase;\r\n letter-spacing: 0.3px;\r\n }\r\n\r\n .toolbar-spacer {\r\n flex: 1;\r\n }\r\n\r\n .toolbar-divider {\r\n width: 1px;\r\n height: 20px;\r\n background: var(--theme-border);\r\n margin: 0 4px;\r\n }\r\n\r\n .toolbar-btn {\r\n padding: 4px 8px;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border);\r\n border-radius: 4px;\r\n color: var(--theme-fg);\r\n cursor: pointer;\r\n transition: all 0.15s;\r\n font-size: 0.85rem;\r\n\r\n &:hover:not(:disabled) {\r\n background: var(--theme-bg-more-more);\r\n }\r\n\r\n &:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n\r\n &.danger {\r\n color: var(--theme-danger, #ef4444);\r\n }\r\n }\r\n}\r\n\r\n.layout-preview-container {\r\n background: var(--theme-bg);\r\n border-radius: 6px;\r\n padding: 8px;\r\n min-height: 120px;\r\n max-height: 180px;\r\n}\r\n"],sourceRoot:""}]);const s=a},33(e,t,r){var n=r(893);n&&n.__esModule&&(n=n.default),e.exports="string"==typeof n?n:n.toString()},182(e){"use strict";e.exports=r},210(e,t,r){var n=r(270);n&&n.__esModule&&(n=n.default),e.exports="string"==typeof n?n:n.toString()},234(e,t,r){r(766),e.exports=function(e){return""+'<div class="workspace-editor-inline"><div class="editor-body"><ng-container *ngTemplateOutlet="editorContent"></ng-container></div><div class="editor-footer"><label class="startup-checkbox"><input type="checkbox" [(ngModel)]="workspace.launchOnStartup"> Launch on startup</label><div class="editor-actions"><button class="btn btn-secondary btn-sm" type="button" (click)="onCancel()">Cancel</button><button class="btn btn-primary btn-sm" type="button" (click)="onSave()" [disabled]="!workspace.name?.trim() || !hasUnsavedChanges"><i class="fas fa-save"></i> Save<span class="unsaved-indicator" *ngIf="hasUnsavedChanges">*</span></button></div></div></div><ng-template #editorContent><div class="editor-top-row"><div class="color-picker"><input class="color-input" type="color" [(ngModel)]="workspace.color" title="Workspace color"></div><input class="name-input" #nameInput type="text" [(ngModel)]="workspace.name" placeholder="Name your workspace"><div class="icon-picker"><button class="icon-trigger" type="button" [style.color]="workspace.color" (click)="toggleIconDropdown()" title="Select icon"><i class="fas" [class]=""fa-" + workspace.icon"></i></button><div class="icon-dropdown" *ngIf="iconDropdownOpen"><button class="icon-option" *ngFor="let icon of availableIcons" type="button" [class.selected]="workspace.icon === icon" [style.color]="workspace.icon === icon ? workspace.color : null" (click)="selectIcon(icon)"><i class="fas" [class]=""fa-" + icon"></i></button></div></div></div><div class="layout-section"><div class="layout-header"><span class="layout-title">Layout</span></div><div class="layout-toolbar"><div class="toolbar-group split-group"><span class="toolbar-label">Split</span><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="splitSelectedPane("horizontal")" title="Split Horizontal"><i class="fas fa-arrows-alt-h"></i></button><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="splitSelectedPane("vertical")" title="Split Vertical"><i class="fas fa-arrows-alt-v"></i></button></div><div class="toolbar-divider"></div><div class="toolbar-group add-group"><span class="toolbar-label">Add</span><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="addPane("left")" title="Add Left"><i class="fas fa-caret-left"></i></button><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="addPane("right")" title="Add Right"><i class="fas fa-caret-right"></i></button><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="addPane("top")" title="Add Top"><i class="fas fa-caret-up"></i></button><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="addPane("bottom")" title="Add Bottom"><i class="fas fa-caret-down"></i></button></div><div class="toolbar-spacer"></div><div class="toolbar-group"><button class="toolbar-btn danger" type="button" [disabled]="!selectedPaneId || !canRemovePane()" (click)="removeSelectedPane()" title="Remove pane"><i class="fas fa-trash"></i></button></div></div><div class="layout-preview-container" (click)="onPreviewBackgroundClick()"><split-preview [split]="workspace.root" [selectedPaneId]="selectedPaneId" [profiles]="profiles" (paneSelect)="selectPane($event)" (paneEdit)="editPane($event)" (splitHorizontal)="splitPane($event, "horizontal")" (splitVertical)="splitPane($event, "vertical")" (addLeft)="addPaneFromEvent($event, "left")" (addRight)="addPaneFromEvent($event, "right")" (addTop)="addPaneFromEvent($event, "top")" (addBottom)="addPaneFromEvent($event, "bottom")" (removePane)="removePane($event)"></split-preview></div></div></ng-template><pane-editor *ngIf="showPaneEditor && editingPane" [pane]="editingPane" [profiles]="profiles" (save)="onPaneSave($event)" (cancel)="closePaneEditor()"></pane-editor>'}},245(e,t,r){r(766),e.exports=function(e){return""+'<div class="pane-editor-overlay" (click)="onOverlayClick($event)"><div class="pane-editor-modal" #modal><div class="modal-header"><h4>Edit Pane</h4><button class="btn btn-link close-btn" type="button" (click)="onCancel()"><i class="fas fa-times"></i></button></div><div class="modal-body"><div class="form-group"><label>Base Profile</label><select class="form-control" [(ngModel)]="editedPane.profileId"><option value="">-- Select Profile --</option><option *ngFor="let profile of profiles" [value]="profile.id">{{ profile.name }}</option></select></div><div class="form-group"><label>Working Directory</label><input class="form-control" type="text" [(ngModel)]="editedPane.cwd" placeholder="C:\\path\\to\\project"></div><div class="form-group"><label>Startup Command</label><input class="form-control" type="text" [(ngModel)]="editedPane.startupCommand" placeholder="e.g., npm run dev"><small class="help-text">Command to execute when the pane opens. For Nushell, use commands like: uv run serve</small></div><div class="form-group"><label>Pane Title (optional)</label><input class="form-control" type="text" [(ngModel)]="editedPane.title" placeholder="Custom tab title"></div></div><div class="modal-footer"><button class="btn btn-secondary" type="button" (click)="onCancel()">Cancel</button><button class="btn btn-primary" type="button" (click)="onSave()"><i class="fas fa-check"></i> Apply</button></div></div></div>'}},261(e,t,r){r(766),e.exports=function(e){return""+'<div class="workspace-list-container"><div class="workspace-list-header"><h3>Workspace Editor</h3><button class="btn btn-primary" type="button" (click)="createWorkspace()"><i class="fas fa-plus"></i> New Workspace</button></div><workspace-editor *ngIf="editingWorkspace" [workspace]="editingWorkspace" [autoFocus]="isCreatingNew" [hasUnsavedChanges]="hasUnsavedChanges" (save)="onEditorSave($event)" (cancel)="onEditorCancel()"></workspace-editor><div class="workspace-list" *ngIf="workspaces.length > 0"><div class="workspace-item" *ngFor="let workspace of workspaces" [class.selected]="isSelected(workspace)" (click)="selectWorkspace(workspace)"><div class="workspace-info"><div class="workspace-icon" [style.color]="workspace.color"><i class="fas" [class]=""fa-" + (workspace.icon || "columns")"></i></div><div class="workspace-details"><div class="workspace-name">{{ workspace.name }}</div><div class="workspace-meta"><span>{{ getPaneCount(workspace) }} panes</span><span class="separator">·</span><span>{{ getOrientationLabel(workspace) }}</span><span class="separator" *ngIf="workspace.launchOnStartup">·</span><span class="badge badge-primary" *ngIf="workspace.launchOnStartup">startup</span></div></div></div><div class="workspace-actions"><button class="btn btn-link open-btn" type="button" title="Open" [disabled]="openingWorkspaceId === workspace.id" (click)="openWorkspace($event, workspace)"><i class="fas" [class.fa-external-link-alt]="openingWorkspaceId !== workspace.id" [class.fa-spinner]="openingWorkspaceId === workspace.id" [class.fa-spin]="openingWorkspaceId === workspace.id"></i></button><button class="btn btn-link" type="button" title="Duplicate" (click)="duplicateWorkspace($event, workspace)"><i class="fas fa-copy"></i></button><button class="btn btn-link text-danger" type="button" title="Delete" (click)="deleteWorkspace($event, workspace)"><i class="fas fa-trash"></i></button></div></div></div><div class="workspace-empty" *ngIf="workspaces.length === 0 && !isCreatingNew"><p>No workspaces configured yet.</p><p>Click "New Workspace" to create your first split-layout workspace.</p></div></div>'}},270(e,t,r){"use strict";r.r(t),r.d(t,{default:()=>s});var n=r(354),o=r.n(n),i=r(314),a=r.n(i)()(o());a.push([e.id,".split-preview{display:flex;width:100%;height:140px;gap:4px;border-radius:6px;overflow:hidden;background:var(--theme-bg);border:1px solid var(--theme-border)}.split-preview.horizontal{flex-direction:row}.split-preview.vertical{flex-direction:column}.split-preview.nested{height:auto;border:1px dashed var(--theme-fg-more);background:hsla(0,0%,100%,.02);padding:4px;border-radius:4px}.preview-pane{display:flex;align-items:center;justify-content:center;background:var(--theme-bg-more);border-radius:4px;border:2px solid rgba(0,0,0,0);cursor:pointer;transition:all .15s;position:relative;min-height:50px}.preview-pane:hover{background:var(--theme-bg-more-more)}.preview-pane.selected{border-color:var(--theme-primary);background:var(--theme-bg-more-more)}.pane-content{text-align:center;padding:8px;color:var(--theme-fg);max-width:100%;overflow:hidden}.pane-title,.pane-profile{font-size:.8rem;font-weight:500;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pane-details{font-size:.7rem;opacity:.7;margin-top:4px}.pane-details .pane-detail{display:flex;align-items:center;justify-content:center;gap:4px}.pane-details .pane-detail i{width:12px;text-align:center;font-size:.65rem}.pane-details .pane-detail span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100px}.pane-edit-btn{position:absolute;top:4px;right:4px;padding:4px 6px;background:var(--theme-bg);border:1px solid var(--theme-border);border-radius:4px;color:var(--theme-fg);cursor:pointer;font-size:.7rem;transition:all .15s;opacity:0}.pane-edit-btn:hover{background:var(--theme-primary);color:#fff;border-color:var(--theme-primary)}.preview-pane:hover .pane-edit-btn{opacity:1}.context-menu-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1200}.context-menu{position:fixed;background:var(--theme-bg);border:1px solid var(--theme-border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.3);min-width:160px;padding:4px;z-index:1201}.context-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:8px 12px;border:none;background:none;color:var(--theme-fg);font-size:.9rem;text-align:left;cursor:pointer;border-radius:4px}.context-menu-item:hover{background:var(--theme-bg-more)}.context-menu-item.danger{color:var(--theme-danger, #ef4444)}.context-menu-item.danger:hover{background:rgba(239,68,68,.1)}.context-menu-item i{width:16px;text-align:center;opacity:.7}.context-menu-divider{height:1px;background:var(--theme-border);margin:4px 0}:host{display:flex;flex:1}","",{version:3,sources:["webpack://./src/components/splitPreview.component.scss"],names:[],mappings:"AAAA,eACE,YAAA,CACA,UAAA,CACA,YAAA,CACA,OAAA,CACA,iBAAA,CACA,eAAA,CACA,0BAAA,CACA,oCAAA,CAEA,0BACE,kBAAA,CAGF,wBACE,qBAAA,CAGF,sBACE,WAAA,CACA,sCAAA,CACA,8BAAA,CACA,WAAA,CACA,iBAAA,CAIJ,cACE,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,+BAAA,CACA,iBAAA,CACA,8BAAA,CACA,cAAA,CACA,mBAAA,CACA,iBAAA,CACA,eAAA,CAEA,oBACE,oCAAA,CAGF,uBACE,iCAAA,CACA,oCAAA,CAIJ,cACE,iBAAA,CACA,WAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CAGF,0BAEE,eAAA,CACA,eAAA,CACA,iBAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CAGF,cACE,eAAA,CACA,UAAA,CACA,cAAA,CAEA,2BACE,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,OAAA,CAEA,6BACE,UAAA,CACA,iBAAA,CACA,gBAAA,CAGF,gCACE,eAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAKN,eACE,iBAAA,CACA,OAAA,CACA,SAAA,CACA,eAAA,CACA,0BAAA,CACA,oCAAA,CACA,iBAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CACA,mBAAA,CACA,SAAA,CAEA,qBACE,+BAAA,CACA,UAAA,CACA,iCAAA,CAIJ,mCACE,SAAA,CAIF,sBACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,YAAA,CAGF,cACE,cAAA,CACA,0BAAA,CACA,oCAAA,CACA,iBAAA,CACA,oCAAA,CACA,eAAA,CACA,WAAA,CACA,YAAA,CAGF,mBACE,YAAA,CACA,kBAAA,CACA,QAAA,CACA,UAAA,CACA,gBAAA,CACA,WAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,cAAA,CACA,iBAAA,CAEA,yBACE,+BAAA,CAGF,0BACE,kCAAA,CAEA,gCACE,6BAAA,CAIJ,qBACE,UAAA,CACA,iBAAA,CACA,UAAA,CAIJ,sBACE,UAAA,CACA,8BAAA,CACA,YAAA,CAIF,MACE,YAAA,CACA,MAAA",sourcesContent:[".split-preview {\r\n display: flex;\r\n width: 100%;\r\n height: 140px;\r\n gap: 4px;\r\n border-radius: 6px;\r\n overflow: hidden;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border);\r\n\r\n &.horizontal {\r\n flex-direction: row;\r\n }\r\n\r\n &.vertical {\r\n flex-direction: column;\r\n }\r\n\r\n &.nested {\r\n height: auto;\r\n border: 1px dashed var(--theme-fg-more);\r\n background: rgba(255, 255, 255, 0.02);\r\n padding: 4px;\r\n border-radius: 4px;\r\n }\r\n}\r\n\r\n.preview-pane {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n background: var(--theme-bg-more);\r\n border-radius: 4px;\r\n border: 2px solid transparent;\r\n cursor: pointer;\r\n transition: all 0.15s;\r\n position: relative;\r\n min-height: 50px;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more-more);\r\n }\r\n\r\n &.selected {\r\n border-color: var(--theme-primary);\r\n background: var(--theme-bg-more-more);\r\n }\r\n}\r\n\r\n.pane-content {\r\n text-align: center;\r\n padding: 8px;\r\n color: var(--theme-fg);\r\n max-width: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.pane-title,\r\n.pane-profile {\r\n font-size: 0.8rem;\r\n font-weight: 500;\r\n margin-bottom: 2px;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.pane-details {\r\n font-size: 0.7rem;\r\n opacity: 0.7;\r\n margin-top: 4px;\r\n\r\n .pane-detail {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n gap: 4px;\r\n\r\n i {\r\n width: 12px;\r\n text-align: center;\r\n font-size: 0.65rem;\r\n }\r\n\r\n span {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n white-space: nowrap;\r\n max-width: 100px;\r\n }\r\n }\r\n}\r\n\r\n.pane-edit-btn {\r\n position: absolute;\r\n top: 4px;\r\n right: 4px;\r\n padding: 4px 6px;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border);\r\n border-radius: 4px;\r\n color: var(--theme-fg);\r\n cursor: pointer;\r\n font-size: 0.7rem;\r\n transition: all 0.15s;\r\n opacity: 0;\r\n\r\n &:hover {\r\n background: var(--theme-primary);\r\n color: white;\r\n border-color: var(--theme-primary);\r\n }\r\n}\r\n\r\n.preview-pane:hover .pane-edit-btn {\r\n opacity: 1;\r\n}\r\n\r\n// Context menu\r\n.context-menu-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n z-index: 1200;\r\n}\r\n\r\n.context-menu {\r\n position: fixed;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border);\r\n border-radius: 8px;\r\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);\r\n min-width: 160px;\r\n padding: 4px;\r\n z-index: 1201;\r\n}\r\n\r\n.context-menu-item {\r\n display: flex;\r\n align-items: center;\r\n gap: 10px;\r\n width: 100%;\r\n padding: 8px 12px;\r\n border: none;\r\n background: none;\r\n color: var(--theme-fg);\r\n font-size: 0.9rem;\r\n text-align: left;\r\n cursor: pointer;\r\n border-radius: 4px;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more);\r\n }\r\n\r\n &.danger {\r\n color: var(--theme-danger, #ef4444);\r\n\r\n &:hover {\r\n background: rgba(239, 68, 68, 0.1);\r\n }\r\n }\r\n\r\n i {\r\n width: 16px;\r\n text-align: center;\r\n opacity: 0.7;\r\n }\r\n}\r\n\r\n.context-menu-divider {\r\n height: 1px;\r\n background: var(--theme-border);\r\n margin: 4px 0;\r\n}\r\n\r\n// Nested splits styling\r\n:host {\r\n display: flex;\r\n flex: 1;\r\n}\r\n"],sourceRoot:""}]);const s=a},314(e){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map(function(t){var r="",n=void 0!==t[5];return t[4]&&(r+="@supports (".concat(t[4],") {")),t[2]&&(r+="@media ".concat(t[2]," {")),n&&(r+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),r+=e(t),n&&(r+="}"),t[2]&&(r+="}"),t[4]&&(r+="}"),r}).join("")},t.i=function(e,r,n,o,i){"string"==typeof e&&(e=[[null,e,void 0]]);var a={};if(n)for(var s=0;s<this.length;s++){var c=this[s][0];null!=c&&(a[c]=!0)}for(var A=0;A<e.length;A++){var l=[].concat(e[A]);n&&a[l[0]]||(void 0!==i&&(void 0===l[5]||(l[1]="@layer".concat(l[5].length>0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=i),r&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=r):l[2]=r),o&&(l[4]?(l[1]="@supports (".concat(l[4],") {").concat(l[1],"}"),l[4]=o):l[4]="".concat(o)),t.push(l))}},t}},341(e,t,r){var n=r(481);n&&n.__esModule&&(n=n.default),e.exports="string"==typeof n?n:n.toString()},349(e){"use strict";e.exports=i},354(e){"use strict";e.exports=function(e){var t=e[1],r=e[3];if(!r)return t;if("function"==typeof btoa){var n=btoa(unescape(encodeURIComponent(JSON.stringify(r)))),o="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(n),i="/*# ".concat(o," */");return[t].concat([i]).join("\n")}return[t].join("\n")}},358(e){"use strict";e.exports=t},481(e,t,r){"use strict";r.r(t),r.d(t,{default:()=>s});var n=r(354),o=r.n(n),i=r(314),a=r.n(i)()(o());a.push([e.id,".workspace-list-container{padding:20px}.workspace-list-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.workspace-list-header h3{margin:0;font-size:1.5rem}.workspace-list{display:flex;flex-direction:column;gap:12px}.workspace-item{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--theme-bg-more);border-radius:8px;border:1px solid var(--theme-border);transition:background .2s,border-color .2s;cursor:pointer}.workspace-item:hover{background:var(--theme-bg-more-more)}.workspace-item.selected{border-color:var(--theme-primary);border-left-width:3px;background:var(--theme-bg-more-more);box-shadow:0 0 0 1px var(--theme-primary) inset}.workspace-info{display:flex;align-items:center;gap:16px}.workspace-icon{font-size:24px;width:40px;text-align:center}.workspace-details{display:flex;flex-direction:column;gap:4px}.workspace-name{font-size:1.1rem;font-weight:500}.workspace-meta{font-size:.85rem;color:var(--theme-fg-more)}.workspace-meta .separator{margin:0 6px}.workspace-meta .badge{font-size:.75rem;padding:2px 6px;border-radius:4px;background:var(--theme-primary);color:#fff}.workspace-actions{display:flex;gap:4px}.workspace-actions .btn-link{padding:8px;color:var(--theme-fg-more);opacity:.7;transition:opacity .2s,color .2s}.workspace-actions .btn-link:hover{opacity:1}.workspace-actions .btn-link.open-btn:hover{color:var(--theme-success, #10b981)}.workspace-actions .btn-link.text-danger:hover{color:var(--theme-danger)}.workspace-empty{text-align:center;padding:40px;color:var(--theme-fg-more)}.workspace-empty p{margin:8px 0}","",{version:3,sources:["webpack://./src/components/workspaceList.component.scss"],names:[],mappings:"AAAA,0BACE,YAAA,CAGF,uBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,kBAAA,CAEA,0BACE,QAAA,CACA,gBAAA,CAIJ,gBACE,YAAA,CACA,qBAAA,CACA,QAAA,CAGF,gBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,YAAA,CACA,+BAAA,CACA,iBAAA,CACA,oCAAA,CACA,0CAAA,CACA,cAAA,CAEA,sBACE,oCAAA,CAGF,yBACE,iCAAA,CACA,qBAAA,CACA,oCAAA,CACA,+CAAA,CAIJ,gBACE,YAAA,CACA,kBAAA,CACA,QAAA,CAGF,gBACE,cAAA,CACA,UAAA,CACA,iBAAA,CAGF,mBACE,YAAA,CACA,qBAAA,CACA,OAAA,CAGF,gBACE,gBAAA,CACA,eAAA,CAGF,gBACE,gBAAA,CACA,0BAAA,CAEA,2BACE,YAAA,CAGF,uBACE,gBAAA,CACA,eAAA,CACA,iBAAA,CACA,+BAAA,CACA,UAAA,CAIJ,mBACE,YAAA,CACA,OAAA,CAEA,6BACE,WAAA,CACA,0BAAA,CACA,UAAA,CACA,gCAAA,CAEA,mCACE,SAAA,CAGF,4CACE,mCAAA,CAGF,+CACE,yBAAA,CAKN,iBACE,iBAAA,CACA,YAAA,CACA,0BAAA,CAEA,mBACE,YAAA",sourcesContent:[".workspace-list-container {\r\n padding: 20px;\r\n}\r\n\r\n.workspace-list-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: 20px;\r\n\r\n h3 {\r\n margin: 0;\r\n font-size: 1.5rem;\r\n }\r\n}\r\n\r\n.workspace-list {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 12px;\r\n}\r\n\r\n.workspace-item {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px;\r\n background: var(--theme-bg-more);\r\n border-radius: 8px;\r\n border: 1px solid var(--theme-border);\r\n transition: background 0.2s, border-color 0.2s;\r\n cursor: pointer;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more-more);\r\n }\r\n\r\n &.selected {\r\n border-color: var(--theme-primary);\r\n border-left-width: 3px;\r\n background: var(--theme-bg-more-more);\r\n box-shadow: 0 0 0 1px var(--theme-primary) inset;\r\n }\r\n}\r\n\r\n.workspace-info {\r\n display: flex;\r\n align-items: center;\r\n gap: 16px;\r\n}\r\n\r\n.workspace-icon {\r\n font-size: 24px;\r\n width: 40px;\r\n text-align: center;\r\n}\r\n\r\n.workspace-details {\r\n display: flex;\r\n flex-direction: column;\r\n gap: 4px;\r\n}\r\n\r\n.workspace-name {\r\n font-size: 1.1rem;\r\n font-weight: 500;\r\n}\r\n\r\n.workspace-meta {\r\n font-size: 0.85rem;\r\n color: var(--theme-fg-more);\r\n\r\n .separator {\r\n margin: 0 6px;\r\n }\r\n\r\n .badge {\r\n font-size: 0.75rem;\r\n padding: 2px 6px;\r\n border-radius: 4px;\r\n background: var(--theme-primary);\r\n color: white;\r\n }\r\n}\r\n\r\n.workspace-actions {\r\n display: flex;\r\n gap: 4px;\r\n\r\n .btn-link {\r\n padding: 8px;\r\n color: var(--theme-fg-more);\r\n opacity: 0.7;\r\n transition: opacity 0.2s, color 0.2s;\r\n\r\n &:hover {\r\n opacity: 1;\r\n }\r\n\r\n &.open-btn:hover {\r\n color: var(--theme-success, #10b981);\r\n }\r\n\r\n &.text-danger:hover {\r\n color: var(--theme-danger);\r\n }\r\n }\r\n}\r\n\r\n.workspace-empty {\r\n text-align: center;\r\n padding: 40px;\r\n color: var(--theme-fg-more);\r\n\r\n p {\r\n margin: 8px 0;\r\n }\r\n}\r\n"],sourceRoot:""}]);const s=a},528(e,t,r){r(766),e.exports=function(e){return""+'<div class="split-preview" [class.horizontal]="split.orientation === "horizontal"" [class.vertical]="split.orientation === "vertical"" [class.nested]="depth > 0"><ng-container *ngFor="let child of split.children; let i = index"><div class="preview-pane" *ngIf="isPane(child)" [style.flex-basis]="getFlexStyle(i)" [class.selected]="asPane(child).id === selectedPaneId" (click)="onPaneClick(asPane(child)); $event.stopPropagation()" (dblclick)="onEditClick($event, asPane(child))" (contextmenu)="onContextMenu($event, asPane(child))"><div class="pane-content"><div class="pane-label">{{ getPaneLabel(asPane(child)) }}</div><div class="pane-details"><div class="pane-detail" *ngIf="asPane(child).cwd" [title]="asPane(child).cwd"><i class="fas fa-folder"></i><span>{{ truncate(asPane(child).cwd, 20) }}</span></div><div class="pane-detail" *ngIf="asPane(child).startupCommand" [title]="asPane(child).startupCommand"><i class="fas fa-terminal"></i><span>{{ truncate(asPane(child).startupCommand, 20) }}</span></div></div></div><button class="pane-edit-btn" type="button" (click)="onEditClick($event, asPane(child))" title="Edit pane"><i class="fas fa-pen"></i></button></div><split-preview *ngIf="isSplit(child)" [split]="asSplit(child)" [depth]="depth + 1" [selectedPaneId]="selectedPaneId" [profiles]="profiles" [style.flex-basis]="getFlexStyle(i)" (paneSelect)="onNestedPaneSelect($event)" (paneEdit)="onNestedPaneEdit($event)" (splitHorizontal)="onNestedSplitH($event)" (splitVertical)="onNestedSplitV($event)" (addLeft)="onNestedAddLeft($event)" (addRight)="onNestedAddRight($event)" (addTop)="onNestedAddTop($event)" (addBottom)="onNestedAddBottom($event)" (removePane)="onNestedRemove($event)"></split-preview></ng-container></div><div class="context-menu-overlay" *ngIf="contextMenuPane" (click)="closeContextMenu()"><div class="context-menu" [style.left.px]="contextMenuPosition.x" [style.top.px]="contextMenuPosition.y" (click)="$event.stopPropagation()"><button class="context-menu-item" type="button" (click)="onEdit()"><i class="fas fa-pen"></i> Edit</button><div class="context-menu-divider"></div><button class="context-menu-item" type="button" (click)="onSplitH()"><i class="fas fa-arrows-alt-h"></i> Split Horizontal</button><button class="context-menu-item" type="button" (click)="onSplitV()"><i class="fas fa-arrows-alt-v"></i> Split Vertical</button><div class="context-menu-divider"></div><button class="context-menu-item" type="button" (click)="onAddLeft()"><i class="fas fa-caret-left"></i> Add Left</button><button class="context-menu-item" type="button" (click)="onAddRight()"><i class="fas fa-caret-right"></i> Add Right</button><button class="context-menu-item" type="button" (click)="onAddTop()"><i class="fas fa-caret-up"></i> Add Top</button><button class="context-menu-item" type="button" (click)="onAddBottom()"><i class="fas fa-caret-down"></i> Add Bottom</button><div class="context-menu-divider"></div><button class="context-menu-item danger" type="button" (click)="onRemove()"><i class="fas fa-trash"></i> Remove Pane</button></div></div>'}},581(e,t,r){var n=r(528);e.exports=(n.default||n).apply(n,[])},650(e){"use strict";e.exports=n},700(e){"use strict";e.exports=o},766(e,t,r){"use strict";var n=Object.prototype.hasOwnProperty;function o(e,t){return Array.isArray(e)?function(e,t){for(var r,n="",i="",a=Array.isArray(t),s=0;s<e.length;s++)(r=o(e[s]))&&(a&&t[s]&&(r=c(r)),n=n+i+r,i=" ");return n}(e,t):e&&"object"==typeof e?function(e){var t="",r="";for(var o in e)o&&e[o]&&n.call(e,o)&&(t=t+r+o,r=" ");return t}(e):e||""}function i(e){if(!e)return"";if("object"==typeof e){var t="";for(var r in e)n.call(e,r)&&(t=t+r+":"+e[r]+";");return t}return e+""}function a(e,t,r,n){if(!1===t||null==t||!t&&("class"===e||"style"===e))return"";if(!0===t)return" "+(n?e:e+'="'+e+'"');var o=typeof t;return"object"!==o&&"function"!==o||"function"!=typeof t.toJSON||(t=t.toJSON()),"string"==typeof t||(t=JSON.stringify(t),r||-1===t.indexOf('"'))?(r&&(t=c(t))," "+e+'="'+t+'"'):" "+e+"='"+t.replace(/'/g,"'")+"'"}t.merge=function e(t,r){if(1===arguments.length){for(var n=t[0],o=1;o<t.length;o++)n=e(n,t[o]);return n}for(var a in r)if("class"===a){var s=t[a]||[];t[a]=(Array.isArray(s)?s:[s]).concat(r[a]||[])}else if("style"===a){s=(s=i(t[a]))&&";"!==s[s.length-1]?s+";":s;var c=i(r[a]);c=c&&";"!==c[c.length-1]?c+";":c,t[a]=s+c}else t[a]=r[a];return t},t.classes=o,t.style=i,t.attr=a,t.attrs=function(e,t){var r="";for(var s in e)if(n.call(e,s)){var c=e[s];if("class"===s){r=a(s,c=o(c),!1,t)+r;continue}"style"===s&&(c=i(c)),r+=a(s,c,!1,t)}return r};var s=/["&<>]/;function c(e){var t=""+e,r=s.exec(t);if(!r)return e;var n,o,i,a="";for(n=r.index,o=0;n<t.length;n++){switch(t.charCodeAt(n)){case 34:i=""";break;case 38:i="&";break;case 60:i="<";break;case 62:i=">";break;default:continue}o!==n&&(a+=t.substring(o,n)),o=n+1,a+=i}return o!==n?a+t.substring(o,n):a}t.escape=c,t.rethrow=function e(t,n,o,i){if(!(t instanceof Error))throw t;if(!("undefined"==typeof window&&n||i))throw t.message+=" on line "+o,t;var a,s,c,A;try{i=i||r(947).readFileSync(n,{encoding:"utf8"}),a=3,s=i.split("\n"),c=Math.max(o-a,0),A=Math.min(s.length,o+a)}catch(r){return t.message+=" - could not read from "+n+" ("+r.message+")",void e(t,null,o)}a=s.slice(c,A).map(function(e,t){var r=t+c+1;return(r==o?" > ":" ")+r+"| "+e}).join("\n"),t.path=n;try{t.message=(n||"Pug")+":"+o+"\n"+a+"\n\n"+t.message}catch(e){}throw t}},801(e,t,r){var n=r(234);e.exports=(n.default||n).apply(n,[])},840(e,t,r){var n=r(28);n&&n.__esModule&&(n=n.default),e.exports="string"==typeof n?n:n.toString()},860(t){"use strict";t.exports=e},864(e,t,r){var n=r(245);e.exports=(n.default||n).apply(n,[])},893(e,t,r){"use strict";r.r(t),r.d(t,{default:()=>s});var n=r(354),o=r.n(n),i=r(314),a=r.n(i)()(o());a.push([e.id,".pane-editor-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:1100}.pane-editor-modal{background:var(--theme-bg);border-radius:12px;width:90%;max-width:500px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.4)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--theme-border)}.modal-header h4{margin:0;font-size:1.15rem}.modal-header .close-btn{font-size:1.15rem;color:var(--theme-fg-more);padding:4px 8px}.modal-header .close-btn:hover{color:var(--theme-fg)}.modal-body{padding:20px;overflow-y:auto;flex:1}.form-group{margin-bottom:16px}.form-group:last-child{margin-bottom:0}.form-group label{display:block;margin-bottom:6px;font-size:.9rem;color:var(--theme-fg-more)}.form-control{width:100%;padding:10px 12px;border-radius:6px;border:1px solid var(--theme-border);background:var(--theme-bg-more);color:var(--theme-fg);font-size:.95rem}.form-control:focus{outline:none;border-color:var(--theme-primary)}select.form-control{cursor:pointer}.input-with-button{display:flex;gap:8px}.input-with-button input{flex:1}.help-text{display:block;margin-top:4px;font-size:.8rem;color:var(--theme-fg-more);opacity:.8}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 20px;border-top:1px solid var(--theme-border)}","",{version:3,sources:["webpack://./src/components/paneEditor.component.scss"],names:[],mappings:"AAAA,qBACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,yBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,YAAA,CAGF,mBACE,0BAAA,CACA,kBAAA,CACA,SAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,YAAA,CACA,qBAAA,CACA,qCAAA,CAGF,cACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CACA,2CAAA,CAEA,iBACE,QAAA,CACA,iBAAA,CAGF,yBACE,iBAAA,CACA,0BAAA,CACA,eAAA,CAEA,+BACE,qBAAA,CAKN,YACE,YAAA,CACA,eAAA,CACA,MAAA,CAGF,YACE,kBAAA,CAEA,uBACE,eAAA,CAGF,kBACE,aAAA,CACA,iBAAA,CACA,eAAA,CACA,0BAAA,CAIJ,cACE,UAAA,CACA,iBAAA,CACA,iBAAA,CACA,oCAAA,CACA,+BAAA,CACA,qBAAA,CACA,gBAAA,CAEA,oBACE,YAAA,CACA,iCAAA,CAIJ,oBACE,cAAA,CAGF,mBACE,YAAA,CACA,OAAA,CAEA,yBACE,MAAA,CAIJ,WACE,aAAA,CACA,cAAA,CACA,eAAA,CACA,0BAAA,CACA,UAAA,CAGF,cACE,YAAA,CACA,wBAAA,CACA,QAAA,CACA,iBAAA,CACA,wCAAA",sourcesContent:[".pane-editor-overlay {\r\n position: fixed;\r\n top: 0;\r\n left: 0;\r\n right: 0;\r\n bottom: 0;\r\n background: rgba(0, 0, 0, 0.7);\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n z-index: 1100;\r\n}\r\n\r\n.pane-editor-modal {\r\n background: var(--theme-bg);\r\n border-radius: 12px;\r\n width: 90%;\r\n max-width: 500px;\r\n max-height: 80vh;\r\n overflow: hidden;\r\n display: flex;\r\n flex-direction: column;\r\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\r\n}\r\n\r\n.modal-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding: 16px 20px;\r\n border-bottom: 1px solid var(--theme-border);\r\n\r\n h4 {\r\n margin: 0;\r\n font-size: 1.15rem;\r\n }\r\n\r\n .close-btn {\r\n font-size: 1.15rem;\r\n color: var(--theme-fg-more);\r\n padding: 4px 8px;\r\n\r\n &:hover {\r\n color: var(--theme-fg);\r\n }\r\n }\r\n}\r\n\r\n.modal-body {\r\n padding: 20px;\r\n overflow-y: auto;\r\n flex: 1;\r\n}\r\n\r\n.form-group {\r\n margin-bottom: 16px;\r\n\r\n &:last-child {\r\n margin-bottom: 0;\r\n }\r\n\r\n label {\r\n display: block;\r\n margin-bottom: 6px;\r\n font-size: 0.9rem;\r\n color: var(--theme-fg-more);\r\n }\r\n}\r\n\r\n.form-control {\r\n width: 100%;\r\n padding: 10px 12px;\r\n border-radius: 6px;\r\n border: 1px solid var(--theme-border);\r\n background: var(--theme-bg-more);\r\n color: var(--theme-fg);\r\n font-size: 0.95rem;\r\n\r\n &:focus {\r\n outline: none;\r\n border-color: var(--theme-primary);\r\n }\r\n}\r\n\r\nselect.form-control {\r\n cursor: pointer;\r\n}\r\n\r\n.input-with-button {\r\n display: flex;\r\n gap: 8px;\r\n\r\n input {\r\n flex: 1;\r\n }\r\n}\r\n\r\n.help-text {\r\n display: block;\r\n margin-top: 4px;\r\n font-size: 0.8rem;\r\n color: var(--theme-fg-more);\r\n opacity: 0.8;\r\n}\r\n\r\n.modal-footer {\r\n display: flex;\r\n justify-content: flex-end;\r\n gap: 12px;\r\n padding: 16px 20px;\r\n border-top: 1px solid var(--theme-border);\r\n}\r\n"],sourceRoot:""}]);const s=a},947(e){"use strict";if(void 0===s){var t=new Error("Cannot find module 'fs'");throw t.code="MODULE_NOT_FOUND",t}e.exports=s},958(e,t,r){var n=r(261);e.exports=(n.default||n).apply(n,[])},961(e){"use strict";e.exports=a}},A={};function l(e){var t=A[e];if(void 0!==t)return t.exports;if(void 0===c[e]){var r=new Error("Cannot find module '"+e+"'");throw r.code="MODULE_NOT_FOUND",r}var n=A[e]={id:e,exports:{}};return c[e](n,n.exports,l),n.exports}l.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return l.d(t,{a:t}),t},l.d=(e,t)=>{for(var r in t)l.o(t,r)&&!l.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},l.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),l.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var p={};return(()=>{"use strict";l.r(p),l.d(p,{WorkspaceEditorConfigProvider:()=>s,WorkspaceEditorService:()=>v,WorkspaceEditorSettingsProvider:()=>y,default:()=>R});var e=l(860),t=l(358),r=l(182),n=l(650),o=l(700);const i="tabbyspaces",a="TabbySpaces";let s=class extends n.ConfigProvider{constructor(){super(...arguments),this.defaults={[i]:{workspaces:[]}}}};s=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a}([(0,e.Injectable)()],s);var c=l(349),A=l(961);let d=class{constructor(e){this.app=e,this.pendingCommands=new Map,this.subscription=this.app.tabOpened$.subscribe(e=>this.onTabOpened(e))}registerCommands(e){console.log("[TabbySpaces] Registering commands:",e);for(const t of e)this.pendingCommands.set(t.paneId,t)}onTabOpened(e){if(console.log("[TabbySpaces] Tab opened:",{type:e.constructor.name,title:e.title}),e instanceof n.SplitTabComponent)return console.log("[TabbySpaces] SplitTabComponent detected, waiting for children..."),void setTimeout(()=>this.processChildTabs(e),300);e instanceof c.BaseTerminalTabComponent&&this.processTerminalTab(e)}processChildTabs(e){const t=e.getAllTabs();console.log("[TabbySpaces] Found child tabs:",t.length);for(const e of t)e instanceof c.BaseTerminalTabComponent&&this.processTerminalTab(e)}processTerminalTab(e){const t=e.customTitle||e.title;console.log("[TabbySpaces] Processing terminal tab:",{title:e.title,customTitle:e.customTitle,paneId:t,pendingKeys:[...this.pendingCommands.keys()]});const r=this.pendingCommands.get(t);if(!r)return void console.log("[TabbySpaces] No matching command for paneId:",t);this.pendingCommands.delete(t);const n=this.buildFullCommand(r);n?(console.log("[TabbySpaces] Command matched, waiting for shell output...:",n),e.session?.output$?e.session.output$.pipe((0,A.first)(),(0,A.switchMap)(()=>(0,A.timer)(100))).subscribe(()=>{console.log("[TabbySpaces] Shell ready, sending command:",n),e.sendInput(n+"\r"),this.clearProfileArgs(e),r.originalTitle?e.setTitle(r.originalTitle):e.customTitle=""}):(console.log("[TabbySpaces] No session.output$, falling back to timeout"),setTimeout(()=>{e.sendInput(n+"\r"),this.clearProfileArgs(e),r.originalTitle?e.setTitle(r.originalTitle):e.customTitle=""},500))):console.log("[TabbySpaces] No command to send (no cwd or startup command)")}buildFullCommand(e){return e.command||null}clearProfileArgs(e){const t=e.profile;t?.options?.args&&(console.log("[TabbySpaces] Clearing profile args to prevent re-run on split"),t.options.args=[])}ngOnDestroy(){this.subscription?.unsubscribe()}};function u(e){return"orientation"in e&&"children"in e}function h(){return{id:f(),profileId:"",cwd:"",startupCommand:"",title:""}}function C(e="horizontal"){return{orientation:e,ratios:[.5,.5],children:[h(),h()]}}d=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a}([(0,e.Injectable)(),function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}("design:paramtypes",[n.AppService])],d);const g=["#3b82f6","#10b981","#f59e0b","#ef4444","#8b5cf6","#ec4899","#06b6d4","#f97316"],m=["columns","terminal","code","folder","home","briefcase","cog","database","server","cloud","rocket","flask","bug","wrench","cube","layer-group","sitemap","project-diagram"];function f(){return"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,e=>{const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)})}function b(e){return u(e)?e.children.reduce((e,t)=>e+b(t),0):1}let v=class{constructor(e,t,r){this.config=e,this.notifications=t,this.profilesService=r,this.cachedProfiles=[]}async cacheProfiles(){this.cachedProfiles=await this.profilesService.getProfiles()}getWorkspaces(){return this.config.store?.[i]?.workspaces??[]}async saveWorkspaces(e){return!!this.config.store?.[i]&&(this.config.store[i].workspaces=e,await this.saveConfig())}async addWorkspace(e){const t=this.getWorkspaces();t.push(e),await this.saveWorkspaces(t),this.notifications.info(`Workspace "${e.name}" created`)}async updateWorkspace(e){const t=this.getWorkspaces(),r=t.findIndex(t=>t.id===e.id);-1!==r&&(t[r]=e,await this.saveWorkspaces(t),this.notifications.info(`Workspace "${e.name}" updated`))}async deleteWorkspace(e){const t=this.getWorkspaces(),r=t.find(t=>t.id===e),n=t.filter(t=>t.id!==e);await this.saveWorkspaces(n),r&&this.notifications.info(`Workspace "${r.name}" deleted`)}async getAvailableProfiles(){return(await this.profilesService.getProfiles()).filter(e=>("local"===e.type||e.type?.startsWith("local:"))&&!e.id?.startsWith("split-layout:"))}cleanupOrphanedProfiles(){if(!this.config.store?.profiles)return;const e=this.config.store.profiles,t=`split-layout:${i}:`,r=e.filter(e=>!e.id?.startsWith(t));r.length!==e.length&&(this.config.store.profiles=r,this.config.save(),console.log(`[${a}] Cleaned up ${e.length-r.length} orphaned profiles`))}async generateTabbyProfile(e){await this.cacheProfiles();const t=this.sanitizeForProfileId(e.name);return{id:`split-layout:${i}:${t}:${e.id}`,type:"split-layout",name:e.name,group:a,icon:e.icon,color:e.color,isBuiltin:!1,options:{recoveryToken:this.generateRecoveryToken(e.root)}}}generateRecoveryToken(e){return{type:"app:split-tab",orientation:"horizontal"===e.orientation?"h":"v",ratios:e.ratios,children:e.children.map(e=>u(e)?this.generateRecoveryToken(e):this.generatePaneToken(e))}}generatePaneToken(e){const t=this.getProfileById(e.profileId);if(!t)return{type:"app:local-tab",profile:{type:"local",name:"Shell"},savedState:!1};const r={restoreFromPTYID:!1,command:t.options?.command||"",args:t.options?.args||[],cwd:e.cwd||t.options?.cwd||"",env:t.options?.env||{},width:null,height:null,pauseAfterExit:!1,runAsAdministrator:!1},n={id:t.id,type:"local",name:t.name||"Shell",group:t.group||"",options:r,icon:t.icon||"",color:t.color||"",disableDynamicTitle:!1,weight:0,isBuiltin:!1,isTemplate:!1,terminalColorScheme:null,behaviorOnSessionEnd:"auto"},o=e.cwd||t.options?.cwd||"";return{type:"app:local-tab",profile:n,savedState:!1,tabTitle:e.id,tabCustomTitle:e.id,disableDynamicTitle:!1,cwd:o}}duplicateWorkspace(e){const t=JSON.parse(JSON.stringify(e));return t.id=f(),t.name=`${e.name} (Copy)`,t.launchOnStartup=!1,this.regenerateIds(t.root),t}regenerateIds(e){if(u(e))for(const t of e.children)this.regenerateIds(t);else e.id=f()}sanitizeForProfileId(e){return e.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"workspace"}getProfileById(e){const t=e=>"local"===e||e?.startsWith("local:");return(this.config.store?.profiles??[]).find(r=>r.id===e&&t(r.type))||this.cachedProfiles.find(r=>r.id===e&&t(r.type))}collectStartupCommands(e){const t=[];return this.collectCommandsFromNode(e.root,t),t}collectCommandsFromNode(e,t){if(u(e))for(const r of e.children)this.collectCommandsFromNode(r,t);else e.startupCommand&&t.push({paneId:e.id,command:e.startupCommand,originalTitle:e.title||""})}async saveConfig(){try{return await this.config.save(),!0}catch(e){return this.notifications.error("Failed to save configuration"),console.error("TabbySpaces save error:",e),!1}}};v=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a}([(0,e.Injectable)({providedIn:"root"}),function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}("design:paramtypes",[n.ConfigService,n.NotificationsService,n.ProfilesService])],v);let x=class{constructor(e,t,r,n,o,i,a){this.config=e,this.workspaceService=t,this.profilesService=r,this.startupService=n,this.cdr=o,this.elementRef=i,this.zone=a,this.workspaces=[],this.selectedWorkspace=null,this.editingWorkspace=null,this.isCreatingNew=!1,this.openingWorkspaceId=null,this.configSubscription=null}ngOnInit(){this.loadWorkspaces(),this.autoSelectFirst(),this.configSubscription=this.config.changed$.subscribe(()=>{this.loadWorkspaces()})}ngAfterViewInit(){setTimeout(()=>{const e=this.elementRef.nativeElement.closest("settings-tab-body");e&&(e.style.maxWidth="876px")},0)}autoSelectFirst(){this.workspaces.length>0&&!this.selectedWorkspace&&this.selectWorkspace(this.workspaces[0])}selectWorkspace(e){this.isCreatingNew=!1,this.selectedWorkspace=e,this.editingWorkspace=JSON.parse(JSON.stringify(e))}isSelected(e){return this.selectedWorkspace?.id===e.id}ngOnDestroy(){this.configSubscription?.unsubscribe()}loadWorkspaces(){this.workspaces=this.workspaceService.getWorkspaces(),this.cdr.detectChanges()}async createWorkspace(){const e=await this.workspaceService.getAvailableProfiles(),t=e[0]?.id||"",r=function(e=""){return{id:f(),name:e,icon:m[Math.floor(Math.random()*m.length)],color:g[Math.floor(Math.random()*g.length)],root:C(),launchOnStartup:!1}}();this.setProfileForAllPanes(r.root,t),this.selectedWorkspace=null,this.editingWorkspace=r,this.isCreatingNew=!0,this.cdr.detectChanges()}setProfileForAllPanes(e,t){u(e)?e.children.forEach(e=>this.setProfileForAllPanes(e,t)):e.profileId=t}editWorkspace(e){this.selectWorkspace(e)}async duplicateWorkspace(e,t){e.stopPropagation();const r=this.workspaceService.duplicateWorkspace(t);await this.workspaceService.addWorkspace(r),this.loadWorkspaces();const n=this.workspaces.find(e=>e.id===r.id);n&&this.selectWorkspace(n),this.cdr.detectChanges()}async deleteWorkspace(e,t){if(e.stopPropagation(),confirm(`Delete workspace "${t.name}"?`)){const e=this.workspaces.findIndex(e=>e.id===t.id);if(await this.workspaceService.deleteWorkspace(t.id),this.loadWorkspaces(),this.workspaces.length>0){const t=Math.min(e,this.workspaces.length-1);this.selectWorkspace(this.workspaces[t])}else this.selectedWorkspace=null,this.editingWorkspace=null,this.isCreatingNew=!1;this.cdr.detectChanges()}}async onEditorSave(e){this.workspaces.find(t=>t.id===e.id)?await this.workspaceService.updateWorkspace(e):await this.workspaceService.addWorkspace(e),this.loadWorkspaces(),this.isCreatingNew=!1;const t=this.workspaces.find(t=>t.id===e.id);t&&this.selectWorkspace(t),this.cdr.detectChanges()}onEditorCancel(){this.isCreatingNew?(this.isCreatingNew=!1,this.workspaces.length>0?this.selectWorkspace(this.workspaces[0]):(this.selectedWorkspace=null,this.editingWorkspace=null)):this.selectedWorkspace&&(this.editingWorkspace=JSON.parse(JSON.stringify(this.selectedWorkspace))),this.cdr.detectChanges()}getPaneCount(e){return b(e.root)}getOrientationLabel(e){return"horizontal"===e.root.orientation?"horizontal":"vertical"}get hasUnsavedChanges(){return this.editingWorkspace&&this.selectedWorkspace?JSON.stringify(this.editingWorkspace)!==JSON.stringify(this.selectedWorkspace):this.isCreatingNew}async openWorkspace(e,t){if(e.stopPropagation(),!this.openingWorkspaceId){this.openingWorkspaceId=t.id;try{const e=this.workspaceService.collectStartupCommands(t);e.length>0&&this.startupService.registerCommands(e);const r=await this.workspaceService.generateTabbyProfile(t);this.zone.run(()=>{this.profilesService.openNewTabForProfile(r)})}finally{this.openingWorkspaceId=null,this.cdr.detectChanges()}}}};x=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a}([(0,e.Component)({selector:"workspace-list",template:l(958),styles:[l(341)]}),function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}("design:paramtypes",[n.ConfigService,v,n.ProfilesService,d,e.ChangeDetectorRef,e.ElementRef,e.NgZone])],x);let y=class extends o.SettingsTabProvider{constructor(){super(...arguments),this.id=i,this.icon="th-large",this.title=a}getComponentType(){return x}};y=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a}([(0,e.Injectable)()],y);let k=class extends n.ToolbarButtonProvider{constructor(e,t,r,n){super(),this.workspaceService=e,this.profilesService=t,this.app=r,this.startupService=n,setTimeout(()=>{this.workspaceService.cleanupOrphanedProfiles(),this.launchStartupWorkspaces()},500)}async launchStartupWorkspaces(){const e=this.workspaceService.getWorkspaces().filter(e=>e.launchOnStartup);for(const t of e)await this.openWorkspace(t.id)}provide(){return[{icon:'<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">\n <rect x="3" y="3" width="7" height="7"/>\n <rect x="14" y="3" width="7" height="7"/>\n <rect x="14" y="14" width="7" height="7"/>\n <rect x="3" y="14" width="7" height="7"/>\n</svg>',title:a,weight:5,click:()=>this.showWorkspaceSelector()}]}async showWorkspaceSelector(){const e=this.workspaceService.getWorkspaces();if(0===e.length)return void this.openSettings();const t=e.map(e=>({name:e.name,description:`${b(e.root)} panes`,icon:e.icon||"grid",color:e.color,result:e.id}));t.push({name:"Manage Workspaces...",description:"Create and edit workspaces",icon:"cog",color:void 0,result:"__settings__"});const r=await this.app.showSelector("Select Workspace",t);"__settings__"===r?this.openSettings():r&&this.openWorkspace(r)}openSettings(){this.app.openNewTabRaw({type:o.SettingsTabComponent,inputs:{activeTab:i}})}async openWorkspace(e){const t=this.workspaceService.getWorkspaces().find(t=>t.id===e);if(!t)return;const r=this.workspaceService.collectStartupCommands(t);r.length>0&&this.startupService.registerCommands(r);const n=await this.workspaceService.generateTabbyProfile(t);this.profilesService.openNewTabForProfile(n)}};k=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a}([(0,e.Injectable)(),function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)}("design:paramtypes",[v,n.ProfilesService,n.AppService,d])],k);var w=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},P=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};let B=class{constructor(t,r){this.workspaceService=t,this.elementRef=r,this.autoFocus=!1,this.hasUnsavedChanges=!1,this.save=new e.EventEmitter,this.cancel=new e.EventEmitter,this.selectedPaneId=null,this.editingPane=null,this.showPaneEditor=!1,this.profiles=[],this.availableIcons=["columns","terminal","code","folder","home","briefcase","cog","database","server","cloud","rocket","flask","bug","wrench","cube","layer-group","sitemap","project-diagram"],this.iconDropdownOpen=!1}onDocumentClick(e){const t=this.elementRef.nativeElement.querySelector(".icon-picker");t&&!t.contains(e.target)&&(this.iconDropdownOpen=!1)}toggleIconDropdown(){this.iconDropdownOpen=!this.iconDropdownOpen}selectIcon(e){this.workspace.icon=e,this.iconDropdownOpen=!1}async ngOnInit(){this.profiles=await this.workspaceService.getAvailableProfiles(),this.initializeWorkspace()}ngAfterViewInit(){this.autoFocus&&this.focusNameInput()}focusNameInput(){requestAnimationFrame(()=>{setTimeout(()=>{this.nameInput?.nativeElement&&(this.nameInput.nativeElement.focus(),this.nameInput.nativeElement.select())},0)})}ngOnChanges(e){e.workspace&&!e.workspace.firstChange&&(this.selectedPaneId=null,this.editingPane=null,this.showPaneEditor=!1,this.iconDropdownOpen=!1,this.initializeWorkspace()),e.autoFocus?.currentValue&&this.focusNameInput()}initializeWorkspace(){this.workspace.root||(this.workspace.root={orientation:"horizontal",ratios:[.5,.5],children:[h(),h()]})}onSave(){this.workspace.name?.trim()&&this.save.emit(this.workspace)}onCancel(){this.cancel.emit()}selectPane(e){this.selectedPaneId=e.id}deselectPane(){this.selectedPaneId=null}onPreviewBackgroundClick(){this.deselectPane()}editPane(e){this.editingPane=e,this.showPaneEditor=!0}editSelectedPane(){if(!this.selectedPaneId)return;const e=this.findPaneById(this.selectedPaneId);e&&this.editPane(e)}closePaneEditor(){this.showPaneEditor=!1,this.editingPane=null}onPaneSave(e){this.updatePaneInTree(this.workspace.root,e),this.closePaneEditor()}findPaneById(e){return this.findPaneInNode(this.workspace.root,e)}findPaneInNode(e,t){for(const r of e.children)if(u(r)){const e=this.findPaneInNode(r,t);if(e)return e}else if(r.id===t)return r;return null}canRemovePane(){return this.countPanes(this.workspace.root)>1}countPanes(e){return e.children.reduce((e,t)=>e+(u(t)?this.countPanes(t):1),0)}updatePaneInTree(e,t){for(let r=0;r<e.children.length;r++){const n=e.children[r];if(u(n)){if(this.updatePaneInTree(n,t))return!0}else if(n.id===t.id)return e.children[r]=t,!0}return!1}splitPane(e,t){this.splitPaneInTree(this.workspace.root,e,t)}splitSelectedPane(e){if(!this.selectedPaneId)return;const t=this.findPaneById(this.selectedPaneId);t&&this.splitPane(t,e)}splitPaneInTree(e,t,r){for(let n=0;n<e.children.length;n++){const o=e.children[n];if(u(o)){if(this.splitPaneInTree(o,t,r))return!0}else if(o.id===t.id){const t=h();t.profileId=o.profileId;const i={orientation:r,ratios:[.5,.5],children:[o,t]};return e.children[n]=i,this.recalculateRatios(e),!0}}return!1}removePane(e){this.selectedPaneId===e.id&&(this.selectedPaneId=null),this.removePaneFromTree(this.workspace.root,e)}removeSelectedPane(){if(!this.selectedPaneId||!this.canRemovePane())return;const e=this.findPaneById(this.selectedPaneId);e&&this.removePane(e)}removePaneFromTree(e,t){for(let r=0;r<e.children.length;r++){const n=e.children[r];if(u(n)){const o=n.children.findIndex(e=>!u(e)&&e.id===t.id);if(-1!==o&&n.children.length>1)return n.children.splice(o,1),this.recalculateRatios(n),1===n.children.length&&(e.children[r]=n.children[0]),!0;if(this.removePaneFromTree(n,t))return!0}else if(n.id===t.id&&e.children.length>1)return e.children.splice(r,1),this.recalculateRatios(e),!0}return!1}recalculateRatios(e){const t=e.children.length;e.ratios=e.children.map(()=>1/t)}setOrientation(e){this.workspace.root.orientation=e}updateRatio(e,t){const r=[...this.workspace.root.ratios],n=t-r[e];e<r.length-1?(r[e]=t,r[e+1]-=n):(r[e]=t,r[e-1]-=n),r.forEach((e,t)=>{r[t]=Math.max(.1,Math.min(.9,e))}),this.workspace.root.ratios=r}addPane(e){if(!this.selectedPaneId)return;const t=this.findPaneById(this.selectedPaneId);t&&this.addPaneInTree(this.workspace.root,t,e,null)}addPaneFromEvent(e,t){this.addPaneInTree(this.workspace.root,e,t,null)}addPaneInTree(e,t,r,n){const o="left"===r||"top"===r,i="left"===r||"right"===r?"horizontal":"vertical";for(let a=0;a<e.children.length;a++){const s=e.children[a];if(u(s)){if(this.addPaneInTree(s,t,r,e))return!0}else if(s.id===t.id){const t=h();if(t.profileId=s.profileId,e.orientation===i){const r=o?a:a+1;e.children.splice(r,0,t),this.recalculateRatios(e)}else{const r={orientation:e.orientation,ratios:[...e.ratios],children:[...e.children]},a={orientation:i,ratios:[.5,.5],children:o?[t,r]:[r,t]};if(e===this.workspace.root)this.workspace.root=a;else if(n){const t=n.children.indexOf(e);-1!==t&&(n.children[t]=a)}}return!0}}return!1}};w([(0,e.Input)(),P("design:type",Object)],B.prototype,"workspace",void 0),w([(0,e.Input)(),P("design:type",Object)],B.prototype,"autoFocus",void 0),w([(0,e.Input)(),P("design:type",Object)],B.prototype,"hasUnsavedChanges",void 0),w([(0,e.Output)(),P("design:type",Object)],B.prototype,"save",void 0),w([(0,e.Output)(),P("design:type",Object)],B.prototype,"cancel",void 0),w([(0,e.ViewChild)("nameInput"),P("design:type",e.ElementRef)],B.prototype,"nameInput",void 0),w([(0,e.HostListener)("document:click",["$event"]),P("design:type",Function),P("design:paramtypes",[MouseEvent]),P("design:returntype",void 0)],B.prototype,"onDocumentClick",null),B=w([(0,e.Component)({selector:"workspace-editor",template:l(801),styles:[l(840)]}),P("design:paramtypes",[v,e.ElementRef])],B);var E=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},S=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};let I=class{constructor(){this.profiles=[],this.save=new e.EventEmitter,this.cancel=new e.EventEmitter,this.pointerDownInsideModal=!1}ngOnInit(){this.editedPane={...this.pane}}onEscapeKey(){this.cancel.emit()}onDocumentPointerDown(e){this.pointerDownInsideModal=this.modalRef.nativeElement.contains(e.target)}onOverlayClick(e){this.pointerDownInsideModal||e.target!==e.currentTarget||this.cancel.emit()}onSave(){this.save.emit(this.editedPane)}onCancel(){this.cancel.emit()}getProfileName(e){const t=this.profiles.find(t=>t.id===e);return t?.name??"Unknown"}};E([(0,e.Input)(),S("design:type",Object)],I.prototype,"pane",void 0),E([(0,e.Input)(),S("design:type",Array)],I.prototype,"profiles",void 0),E([(0,e.Output)(),S("design:type",Object)],I.prototype,"save",void 0),E([(0,e.Output)(),S("design:type",Object)],I.prototype,"cancel",void 0),E([(0,e.ViewChild)("modal",{static:!0}),S("design:type",e.ElementRef)],I.prototype,"modalRef",void 0),E([(0,e.HostListener)("document:keydown.escape"),S("design:type",Function),S("design:paramtypes",[]),S("design:returntype",void 0)],I.prototype,"onEscapeKey",null),E([(0,e.HostListener)("document:pointerdown",["$event"]),S("design:type",Function),S("design:paramtypes",[PointerEvent]),S("design:returntype",void 0)],I.prototype,"onDocumentPointerDown",null),I=E([(0,e.Component)({selector:"pane-editor",template:l(864),styles:[l(33)]})],I);var O=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a},W=function(e,t){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,t)};let j=class{constructor(){this.depth=0,this.selectedPaneId=null,this.profiles=[],this.paneSelect=new e.EventEmitter,this.paneEdit=new e.EventEmitter,this.splitHorizontal=new e.EventEmitter,this.splitVertical=new e.EventEmitter,this.removePane=new e.EventEmitter,this.addLeft=new e.EventEmitter,this.addRight=new e.EventEmitter,this.addTop=new e.EventEmitter,this.addBottom=new e.EventEmitter,this.contextMenuPane=null,this.contextMenuPosition={x:0,y:0}}isPane(e){return!u(e)}isSplit(e){return u(e)}asSplit(e){return e}asPane(e){return e}getFlexStyle(e){return 100*this.split.ratios[e]+"%"}onPaneClick(e){this.paneSelect.emit(e)}onEditClick(e,t){e.stopPropagation(),this.paneEdit.emit(t)}truncate(e,t){return e.length>t?e.substring(0,t)+"...":e}onContextMenu(e,t){e.preventDefault(),this.contextMenuPane=t,this.contextMenuPosition={x:e.clientX,y:e.clientY}}closeContextMenu(){this.contextMenuPane=null}onEdit(){this.contextMenuPane&&(this.paneEdit.emit(this.contextMenuPane),this.closeContextMenu())}onSplitH(){this.contextMenuPane&&(this.splitHorizontal.emit(this.contextMenuPane),this.closeContextMenu())}onSplitV(){this.contextMenuPane&&(this.splitVertical.emit(this.contextMenuPane),this.closeContextMenu())}onAddLeft(){this.contextMenuPane&&(this.addLeft.emit(this.contextMenuPane),this.closeContextMenu())}onAddRight(){this.contextMenuPane&&(this.addRight.emit(this.contextMenuPane),this.closeContextMenu())}onAddTop(){this.contextMenuPane&&(this.addTop.emit(this.contextMenuPane),this.closeContextMenu())}onAddBottom(){this.contextMenuPane&&(this.addBottom.emit(this.contextMenuPane),this.closeContextMenu())}onRemove(){this.contextMenuPane&&(this.removePane.emit(this.contextMenuPane),this.closeContextMenu())}getPaneLabel(e){let t="";if(e.profileId){const r=this.profiles.find(t=>t.id===e.profileId);r?.name&&(t=r.name)}return t?e.title?`${e.title} - ${t}`:t:"Select profile"}onNestedPaneSelect(e){this.paneSelect.emit(e)}onNestedPaneEdit(e){this.paneEdit.emit(e)}onNestedSplitH(e){this.splitHorizontal.emit(e)}onNestedSplitV(e){this.splitVertical.emit(e)}onNestedAddLeft(e){this.addLeft.emit(e)}onNestedAddRight(e){this.addRight.emit(e)}onNestedAddTop(e){this.addTop.emit(e)}onNestedAddBottom(e){this.addBottom.emit(e)}onNestedRemove(e){this.removePane.emit(e)}};O([(0,e.Input)(),W("design:type",Object)],j.prototype,"split",void 0),O([(0,e.Input)(),W("design:type",Object)],j.prototype,"depth",void 0),O([(0,e.Input)(),W("design:type",Object)],j.prototype,"selectedPaneId",void 0),O([(0,e.Input)(),W("design:type",Array)],j.prototype,"profiles",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"paneSelect",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"paneEdit",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"splitHorizontal",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"splitVertical",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"removePane",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"addLeft",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"addRight",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"addTop",void 0),O([(0,e.Output)(),W("design:type",Object)],j.prototype,"addBottom",void 0),j=O([(0,e.Component)({selector:"split-preview",template:l(581),styles:[l(210)]})],j);let T=class{};T=function(e,t,r,n){var o,i=arguments.length,a=i<3?t:null===n?n=Object.getOwnPropertyDescriptor(t,r):n;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,r,n);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(a=(i<3?o(a):i>3?o(t,r,a):o(t,r))||a);return i>3&&a&&Object.defineProperty(t,r,a),a}([(0,e.NgModule)({imports:[t.CommonModule,r.FormsModule],providers:[{provide:n.ConfigProvider,useClass:s,multi:!0},{provide:o.SettingsTabProvider,useClass:y,multi:!0},{provide:n.ToolbarButtonProvider,useClass:k,multi:!0},v,d],declarations:[x,B,I,j]})],T);const R=T})(),p})());
|
|
3
3
|
//# sourceMappingURL=index.js.map
|