tabby-tabbyspaces 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/.github/workflows/ci.yml +26 -0
  3. package/.github/workflows/claude-code-review.yml +44 -0
  4. package/.github/workflows/claude.yml +81 -0
  5. package/.github/workflows/release.yml +30 -0
  6. package/CHANGELOG.md +46 -0
  7. package/CLAUDE.md +33 -0
  8. package/CONTRIBUTING.md +3 -1
  9. package/README.md +27 -18
  10. package/TODO.md +5 -0
  11. package/dist/build-config.d.ts +3 -3
  12. package/dist/components/deleteConfirmModal.component.d.ts +7 -0
  13. package/dist/components/deleteConfirmModal.component.d.ts.map +1 -0
  14. package/dist/components/paneEditor.component.d.ts +9 -18
  15. package/dist/components/paneEditor.component.d.ts.map +1 -1
  16. package/dist/components/splitPreview.component.d.ts +50 -50
  17. package/dist/components/splitPreview.component.d.ts.map +1 -1
  18. package/dist/components/workspaceEditor.component.d.ts +61 -54
  19. package/dist/components/workspaceEditor.component.d.ts.map +1 -1
  20. package/dist/components/workspaceList.component.d.ts +56 -39
  21. package/dist/components/workspaceList.component.d.ts.map +1 -1
  22. package/dist/index.d.ts +6 -6
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.LICENSE.txt +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/models/workspace.model.d.ts +118 -78
  28. package/dist/models/workspace.model.d.ts.map +1 -1
  29. package/dist/package.json +1 -1
  30. package/dist/providers/config.provider.d.ts +8 -8
  31. package/dist/providers/settings.provider.d.ts +7 -7
  32. package/dist/providers/toolbar.provider.d.ts +23 -15
  33. package/dist/providers/toolbar.provider.d.ts.map +1 -1
  34. package/dist/services/startupCommand.service.d.ts +27 -19
  35. package/dist/services/startupCommand.service.d.ts.map +1 -1
  36. package/dist/services/workspaceBackground.service.d.ts +38 -0
  37. package/dist/services/workspaceBackground.service.d.ts.map +1 -0
  38. package/dist/services/workspaceEditor.service.d.ts +46 -32
  39. package/dist/services/workspaceEditor.service.d.ts.map +1 -1
  40. package/docs/DESIGN.md +57 -0
  41. package/docs/SESSION-2026-01-14-S1-DESIGN.md +134 -0
  42. package/mockups/index.html +162 -0
  43. package/mockups/s1-tight-sharp.html +522 -0
  44. package/mockups/shared/base.css +216 -0
  45. package/mockups/v06-tabbed.html +643 -0
  46. package/package.json +2 -1
  47. package/screenshots/editor.png +0 -0
  48. package/screenshots/pane-edit.png +0 -0
  49. package/scripts/build-dev.js +2 -1
  50. package/scripts/build-prod.js +2 -1
  51. package/src/components/deleteConfirmModal.component.ts +23 -0
  52. package/src/components/paneEditor.component.pug +27 -43
  53. package/src/components/paneEditor.component.scss +37 -85
  54. package/src/components/paneEditor.component.ts +4 -32
  55. package/src/components/splitPreview.component.pug +0 -9
  56. package/src/components/splitPreview.component.scss +46 -70
  57. package/src/components/splitPreview.component.ts +15 -25
  58. package/src/components/workspaceEditor.component.pug +140 -112
  59. package/src/components/workspaceEditor.component.scss +270 -202
  60. package/src/components/workspaceEditor.component.ts +161 -85
  61. package/src/components/workspaceList.component.pug +31 -51
  62. package/src/components/workspaceList.component.scss +86 -77
  63. package/src/components/workspaceList.component.ts +89 -34
  64. package/src/index.ts +4 -0
  65. package/src/models/workspace.model.ts +80 -2
  66. package/src/providers/toolbar.provider.ts +78 -9
  67. package/src/services/startupCommand.service.ts +30 -32
  68. package/src/services/workspaceBackground.service.ts +167 -0
  69. package/src/services/workspaceEditor.service.ts +77 -40
  70. package/src/styles/_index.scss +3 -0
  71. package/src/styles/_mixins.scss +180 -0
  72. package/src/styles/_variables.scss +67 -0
  73. package/TEST_MCP.md +0 -176
  74. package/cdp-click.js +0 -22
  75. package/cdp-test.js +0 -28
  76. package/test_cdp.py +0 -50
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /*! For license information please see index.js.LICENSE.txt */
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]="&quot;fa-&quot; + 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]="&quot;fa-&quot; + 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(&quot;horizontal&quot;)" title="Split Horizontal"><i class="fas fa-arrows-alt-h"></i></button><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="splitSelectedPane(&quot;vertical&quot;)" 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(&quot;left&quot;)" title="Add Left"><i class="fas fa-caret-left"></i></button><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="addPane(&quot;right&quot;)" title="Add Right"><i class="fas fa-caret-right"></i></button><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="addPane(&quot;top&quot;)" title="Add Top"><i class="fas fa-caret-up"></i></button><button class="toolbar-btn" type="button" [disabled]="!selectedPaneId" (click)="addPane(&quot;bottom&quot;)" 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, &quot;horizontal&quot;)" (splitVertical)="splitPane($event, &quot;vertical&quot;)" (addLeft)="addPaneFromEvent($event, &quot;left&quot;)" (addRight)="addPaneFromEvent($event, &quot;right&quot;)" (addTop)="addPaneFromEvent($event, &quot;top&quot;)" (addBottom)="addPaneFromEvent($event, &quot;bottom&quot;)" (removePane)="removePane($event)"></split-preview></div></div></ng-template><pane-editor *ngIf="showPaneEditor &amp;&amp; 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 &gt; 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]="&quot;fa-&quot; + (workspace.icon || &quot;columns&quot;)"></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">&middot;</span><span>{{ getOrientationLabel(workspace) }}</span><span class="separator" *ngIf="workspace.launchOnStartup">&middot;</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 &amp;&amp; !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 === &quot;horizontal&quot;" [class.vertical]="split.orientation === &quot;vertical&quot;" [class.nested]="depth &gt; 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,"&#39;")+"'"}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="&quot;";break;case 38:i="&amp;";break;case 60:i="&lt;";break;case 62:i="&gt;";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})());
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"),require("@ng-bootstrap/ng-bootstrap"),require("tabby-terminal"),require("rxjs"),require("rxjs/operators"),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","@ng-bootstrap/ng-bootstrap","tabby-terminal","rxjs","rxjs/operators","fs"],r);else{var n="object"==typeof exports?r(require("@angular/core"),require("@angular/common"),require("@angular/forms"),require("tabby-core"),require("tabby-settings"),require("@ng-bootstrap/ng-bootstrap"),require("tabby-terminal"),require("rxjs"),require("rxjs/operators"),function(){try{return require("fs")}catch(e){}}()):r(e["@angular/core"],e["@angular/common"],e["@angular/forms"],e["tabby-core"],e["tabby-settings"],e["@ng-bootstrap/ng-bootstrap"],e["tabby-terminal"],e.rxjs,e["rxjs/operators"],e.fs);for(var t in n)("object"==typeof exports?exports:e)[t]=n[t]}}(global,(e,r,n,t,o,a,i,s,c,d)=>(()=>{var l={28(e,r,n){"use strict";n.r(r),n.d(r,{default:()=>s});var t=n(354),o=n.n(t),a=n(314),i=n.n(a)()(o());i.push([e.id,".editor-section{margin-bottom:14px}.section-title{font-size:11px;color:var(--theme-fg-more);text-transform:uppercase;letter-spacing:.5px;margin-bottom:10px;display:flex;align-items:center;gap:4px}.form-row{display:flex;gap:10px;align-items:flex-end}.form-group{flex:1;position:relative}.form-group.auto-width{flex:none}.form-group label{display:block;font-size:.7rem;color:var(--theme-fg-less);text-transform:uppercase;letter-spacing:.5px;margin-bottom:2px}.form-group .form-control{padding:4px 6px;border-radius:2px;border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));background:var(--theme-bg-more);color:var(--theme-fg);font-size:.85rem}.form-group .form-control:focus{outline:none;border-color:var(--theme-primary)}.form-group .form-control::placeholder{color:var(--theme-fg-more, rgba(255, 255, 255, 0.3))}.form-group .form-control{width:100%;font-size:.8rem;border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1)) !important}.form-group .form-control:focus{border-color:var(--theme-primary) !important}.dropdown-trigger{display:flex;align-items:center;gap:4px;padding:4px 6px;background:var(--theme-bg-more);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:2px;cursor:pointer;transition:border-color .15s;height:32px;box-sizing:border-box}.dropdown-trigger:hover{border-color:var(--theme-fg-more)}.dropdown-icon{font-size:14px}.dropdown-chevron{color:var(--theme-fg-more);font-size:10px}.icon-dropdown{position:absolute;top:100%;left:0;margin-top:4px;padding:6px;background:var(--theme-bg-more);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:3px;box-shadow:none;z-index:100;display:grid;grid-template-columns:repeat(6, 28px);gap:4px}.icon-option{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(0,0,0,0);border-radius:2px;background:rgba(0,0,0,0);color:var(--theme-fg-more);cursor:pointer;transition:all .15s;font-size:.85rem}.icon-option:hover{background:var(--theme-bg-more-more);color:var(--theme-fg)}.icon-option.selected{border-color:currentColor;background:var(--theme-bg)}.color-trigger{display:flex;align-items:center;gap:4px;padding:4px 6px;background:var(--theme-bg-more);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:2px;cursor:pointer;position:relative;transition:border-color .15s;height:32px;box-sizing:border-box}.color-trigger:hover{border-color:var(--theme-fg-more)}.color-trigger:focus-within{border-color:var(--theme-primary)}.color-trigger .color-input-hidden{position:absolute;top:0;left:0;width:100%;height:100%;opacity:0;cursor:pointer}.dropdown-color{width:16px;height:16px;border-radius:2px}.background-picker{position:relative}.background-trigger{display:flex;align-items:center;gap:4px;padding:4px 6px;background:var(--theme-bg-more);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:2px;cursor:pointer;transition:border-color .15s;height:32px;box-sizing:border-box}.background-trigger:hover{border-color:var(--theme-fg-more)}.background-preview{width:48px;height:18px;border-radius:2px;border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));display:flex;align-items:center;justify-content:center;color:var(--theme-fg-more, rgba(255, 255, 255, 0.3));font-size:10px}.background-dropdown{position:absolute;top:100%;left:0;right:0;margin-top:4px;padding:6px;background:var(--theme-bg-more);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:3px;box-shadow:none;z-index:100;min-width:260px}.preset-grid{display:grid;grid-template-columns:repeat(4, 1fr);gap:4px;margin-bottom:6px}.preset-option{aspect-ratio:1.5;height:32px;display:flex;align-items:center;justify-content:center;border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:2px;cursor:pointer;transition:all .15s;color:var(--theme-fg-more, rgba(255, 255, 255, 0.3));font-size:10px}.preset-option:hover{border-color:var(--theme-fg-more)}.preset-option.selected{border-color:var(--theme-primary);border-width:2px}.custom-input-wrapper .custom-bg-input{width:100%;font-size:.7rem}.split-preview-container{background:var(--theme-bg-more);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:3px;padding:10px}.preview-toolbar{display:flex;justify-content:flex-end;align-items:center;gap:4px;margin-bottom:10px;padding-bottom:6px;border-bottom:1px solid var(--theme-border, rgba(255, 255, 255, 0.1))}.toolbar-separator{width:1px;height:18px;background:var(--theme-border, rgba(255, 255, 255, 0.1));margin:0 4px;align-self:center}.preview-btn{width:24px;height:24px;display:flex;align-items:center;justify-content:center;background:var(--theme-bg);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:2px;color:var(--theme-fg-more, rgba(255, 255, 255, 0.3));cursor:pointer;font-size:10px;transition:all .15s}.preview-btn:hover:not(:disabled){border-color:var(--theme-primary);color:var(--theme-primary)}.preview-btn.danger:hover:not(:disabled){border-color:var(--theme-danger);color:var(--theme-danger)}.preview-btn:disabled{opacity:.4;cursor:not-allowed}.layout-preview{background:var(--theme-bg);border-radius:2px;min-height:150px;max-height:200px;padding:4px}.action-buttons{display:flex;justify-content:space-between;align-items:center;padding-top:14px;border-top:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));margin-top:14px}.checkbox-group{display:flex;align-items:center;gap:4px}.checkbox-group input[type=checkbox]{width:14px;height:14px;margin:0}.checkbox-group label{font-size:.8rem;color:var(--theme-fg);cursor:pointer}.action-buttons-right{display:flex;gap:6px}.action-buttons-right .btn-ghost{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;font-size:.8rem;border-radius:2px;cursor:pointer;transition:all .15s;background:rgba(0,0,0,0);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));color:var(--theme-fg)}.action-buttons-right .btn-ghost:hover{background:var(--theme-bg-more)}.action-buttons-right .btn-success{display:inline-flex;align-items:center;gap:4px;padding:4px 10px;font-size:.8rem;border-radius:2px;cursor:pointer;transition:all .15s;background:#10b981;border-color:#10b981;color:#fff}.action-buttons-right .btn-success:hover{background:#059669;border-color:#059669}.action-buttons-right .unsaved-indicator{color:#f59e0b;font-weight:bold;margin-left:2px}","",{version:3,sources:["webpack://./src/components/workspaceEditor.component.scss","webpack://./src/styles/_variables.scss","webpack://./src/styles/_mixins.scss"],names:[],mappings:"AAGA,gBACE,kBCGW,CAAA,eDCX,cAAA,CACA,0BAAA,CACA,wBAAA,CACA,mBAAA,CACA,kBCNW,CDOX,YAAA,CACA,kBAAA,CACA,OCXW,CDeb,UACE,YAAA,CACA,QCfW,CDgBX,oBAAA,CAGF,YACE,MAAA,CACA,iBAAA,CAEA,uBACE,SAAA,CAGF,kBEMA,aAAA,CACA,eDUQ,CCTR,0BAAA,CACA,wBAAA,CACA,mBAAA,CACA,iBDzCW,CDkCX,0BEpBA,eAAA,CACA,iBDJU,CCKV,8DAAA,CACA,+BFkBsB,CEjBtB,qBAAA,CACA,gBD8BQ,CC5BR,gCACE,YAAA,CACA,iCAAA,CAGF,uCACE,oDAAA,CFOF,0BAEE,UAAA,CACA,eCWM,CDTN,yEAAA,CAEA,gCACE,4CAAA,CAMN,kBACE,YAAA,CACA,kBAAA,CACA,OClDW,CDmDX,eAAA,CACA,+BAAA,CACA,8DAAA,CACA,iBC5CU,CD6CV,cAAA,CACA,4BAAA,CACA,WAAA,CACA,qBAAA,CAEA,wBACE,iCAAA,CAIJ,eACE,cAAA,CAGF,kBACE,0BAAA,CACA,cAAA,CAIF,eACE,iBAAA,CACA,QAAA,CACA,MAAA,CACA,cC/EW,CDgFX,WC/EW,CC0KX,+BAAA,CACA,8DAAA,CACA,iBDlKU,CCmKV,eDhJgB,CDoDhB,WC7BW,CD8BX,YAAA,CACA,qCAAA,CACA,OCrFW,CDwFb,aACE,UAAA,CACA,WAAA,CEvFA,YAAA,CACA,kBAAA,CACA,sBAAA,CFuFA,8BAAA,CACA,iBCnFU,CDoFV,wBAAA,CACA,0BAAA,CACA,cAAA,CACA,mBAAA,CACA,gBAAA,CAEA,mBACE,oCAAA,CACA,qBAAA,CAGF,sBACE,yBAAA,CACA,0BAAA,CAKJ,eACE,YAAA,CACA,kBAAA,CACA,OCnHW,CDoHX,eAAA,CACA,+BAAA,CACA,8DAAA,CACA,iBC7GU,CD8GV,cAAA,CACA,iBAAA,CACA,4BAAA,CACA,WAAA,CACA,qBAAA,CAEA,qBACE,iCAAA,CAGF,4BACE,iCAAA,CAGF,mCACE,iBAAA,CACA,KAAA,CACA,MAAA,CACA,UAAA,CACA,WAAA,CACA,SAAA,CACA,cAAA,CAIJ,gBACE,UAAA,CACA,WAAA,CACA,iBC3IU,CD+IZ,mBACE,iBAAA,CAGF,oBACE,YAAA,CACA,kBAAA,CACA,OC/JW,CDgKX,eAAA,CACA,+BAAA,CACA,8DAAA,CACA,iBCzJU,CD0JV,cAAA,CACA,4BAAA,CACA,WAAA,CACA,qBAAA,CAEA,0BACE,iCAAA,CAIJ,oBACE,UAAA,CACA,WAAA,CACA,iBCxKU,CDyKV,8DAAA,CE/KA,YAAA,CACA,kBAAA,CACA,sBAAA,CF+KA,oDAAA,CACA,cAAA,CAGF,qBACE,iBAAA,CACA,QAAA,CACA,MAAA,CACA,OAAA,CACA,cC7LW,CD8LX,WC7LW,CC0KX,+BAAA,CACA,8DAAA,CACA,iBDlKU,CCmKV,eDhJgB,CDkKhB,WC3IW,CD4IX,eAAA,CAGF,aACE,YAAA,CACA,oCAAA,CACA,OCvMW,CDwMX,iBCvMW,CD0Mb,eACE,gBAAA,CACA,WAAA,CE1MA,YAAA,CACA,kBAAA,CACA,sBAAA,CF0MA,8DAAA,CACA,iBCtMU,CDuMV,cAAA,CACA,mBAAA,CACA,oDAAA,CACA,cAAA,CAEA,qBACE,iCAAA,CAGF,wBACE,iCAAA,CACA,gBAAA,CAKF,uCACE,UAAA,CACA,eCrLM,CD0LV,yBACE,+BAAA,CACA,8DAAA,CACA,iBChOU,CDiOV,YC1OW,CD8Ob,iBACE,YAAA,CACA,wBAAA,CACA,kBAAA,CACA,OCpPW,CDqPX,kBCnPW,CDoPX,kBCrPW,CDsPX,qEAAA,CAGF,mBACE,SAAA,CACA,WAAA,CACA,wDAAA,CACA,YAAA,CACA,iBAAA,CAGF,aE9IE,UADwB,CAExB,WAFwB,CAhHxB,YAAA,CACA,kBAAA,CACA,sBAAA,CAkHA,0BAAA,CACA,8DAAA,CACA,iBD/GU,CCgHV,oDAAA,CACA,cAAA,CACA,cAAA,CACA,mBAAA,CAEA,kCACE,iCAAA,CACA,0BAAA,CAGF,yCACE,gCAAA,CACA,yBAAA,CAGF,sBACE,UAAA,CACA,kBAAA,CF4HJ,gBACE,0BAAA,CACA,iBC/PU,CDgQV,gBAAA,CACA,gBAAA,CACA,WC5QW,CDgRb,gBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,gBCjRW,CDkRX,kEAAA,CACA,eCnRW,CDsRb,gBACE,YAAA,CACA,kBAAA,CACA,OC5RW,CD8RX,qCACE,UAAA,CACA,WAAA,CACA,QAAA,CAGF,sBACE,eCtPM,CDuPN,qBAAA,CACA,cAAA,CAIJ,sBACE,YAAA,CACA,OC5SW,CD8SX,iCE5NA,mBAAA,CACA,kBAAA,CACA,ODrFW,CCsFX,gBAAA,CACA,eDxCQ,CCyCR,iBD9EU,CC+EV,cAAA,CACA,mBAAA,CAKA,wBAAA,CACA,8DAAA,CACA,qBAAA,CAEA,uCACE,+BAAA,CF+MF,mCEhOA,mBAAA,CACA,kBAAA,CACA,ODrFW,CCsFX,gBAAA,CACA,eDxCQ,CCyCR,iBD9EU,CC+EV,cAAA,CACA,mBAAA,CAlBA,kBDtDc,CCuDd,oBDvDc,CCwDd,UAAA,CAEA,yCACE,kBD1DkB,CC2DlB,oBD3DkB,CDqSpB,yCACE,aCrSY,CDsSZ,gBAAA,CACA,eC5TS",sourcesContent:["@use '../styles/index' as *;\r\n\r\n// Editor section\r\n.editor-section {\r\n margin-bottom: $spacing-xl;\r\n}\r\n\r\n.section-title {\r\n font-size: 11px;\r\n color: var(--theme-fg-more);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n margin-bottom: $spacing-lg;\r\n display: flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n}\r\n\r\n// Form layout\r\n.form-row {\r\n display: flex;\r\n gap: $spacing-lg;\r\n align-items: flex-end;\r\n}\r\n\r\n.form-group {\r\n flex: 1;\r\n position: relative;\r\n\r\n &.auto-width {\r\n flex: none;\r\n }\r\n\r\n label {\r\n @include form-label;\r\n }\r\n\r\n .form-control {\r\n @include form-input(var(--theme-bg-more));\r\n width: 100%;\r\n font-size: $font-sm;\r\n // Override Tabby's global border reset\r\n border: 1px solid var(--theme-border, $fallback-border) !important;\r\n\r\n &:focus {\r\n border-color: var(--theme-primary) !important;\r\n }\r\n }\r\n}\r\n\r\n// Dropdown trigger (icon picker)\r\n.dropdown-trigger {\r\n display: flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n padding: $spacing-sm $spacing-md;\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n cursor: pointer;\r\n transition: border-color $transition-fast;\r\n height: 32px;\r\n box-sizing: border-box;\r\n\r\n &:hover {\r\n border-color: var(--theme-fg-more);\r\n }\r\n}\r\n\r\n.dropdown-icon {\r\n font-size: 14px;\r\n}\r\n\r\n.dropdown-chevron {\r\n color: var(--theme-fg-more);\r\n font-size: 10px;\r\n}\r\n\r\n// Icon dropdown\r\n.icon-dropdown {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n margin-top: $spacing-sm;\r\n padding: $spacing-md;\r\n @include dropdown-panel;\r\n z-index: $z-dropdown;\r\n display: grid;\r\n grid-template-columns: repeat(6, 28px);\r\n gap: $spacing-sm;\r\n}\r\n\r\n.icon-option {\r\n width: 28px;\r\n height: 28px;\r\n @include flex-center;\r\n border: 1px solid transparent;\r\n border-radius: $radius-sm;\r\n background: transparent;\r\n color: var(--theme-fg-more);\r\n cursor: pointer;\r\n transition: all $transition-fast;\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// Color trigger (wraps native color input)\r\n.color-trigger {\r\n display: flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n padding: $spacing-sm $spacing-md;\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n cursor: pointer;\r\n position: relative;\r\n transition: border-color $transition-fast;\r\n height: 32px;\r\n box-sizing: border-box;\r\n\r\n &:hover {\r\n border-color: var(--theme-fg-more);\r\n }\r\n\r\n &:focus-within {\r\n border-color: var(--theme-primary);\r\n }\r\n\r\n .color-input-hidden {\r\n position: absolute;\r\n top: 0;\r\n left: 0;\r\n width: 100%;\r\n height: 100%;\r\n opacity: 0;\r\n cursor: pointer;\r\n }\r\n}\r\n\r\n.dropdown-color {\r\n width: 16px;\r\n height: 16px;\r\n border-radius: $radius-xs;\r\n}\r\n\r\n// Background picker\r\n.background-picker {\r\n position: relative;\r\n}\r\n\r\n.background-trigger {\r\n display: flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n padding: $spacing-sm $spacing-md;\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n cursor: pointer;\r\n transition: border-color $transition-fast;\r\n height: 32px;\r\n box-sizing: border-box;\r\n\r\n &:hover {\r\n border-color: var(--theme-fg-more);\r\n }\r\n}\r\n\r\n.background-preview {\r\n width: 48px;\r\n height: 18px;\r\n border-radius: $radius-xs;\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n @include flex-center;\r\n color: var(--theme-fg-more, $fallback-fg-more);\r\n font-size: 10px;\r\n}\r\n\r\n.background-dropdown {\r\n position: absolute;\r\n top: 100%;\r\n left: 0;\r\n right: 0;\r\n margin-top: $spacing-sm;\r\n padding: $spacing-md;\r\n @include dropdown-panel;\r\n z-index: $z-dropdown;\r\n min-width: 260px;\r\n}\r\n\r\n.preset-grid {\r\n display: grid;\r\n grid-template-columns: repeat(4, 1fr);\r\n gap: $spacing-sm;\r\n margin-bottom: $spacing-md;\r\n}\r\n\r\n.preset-option {\r\n aspect-ratio: 1.5;\r\n height: 32px;\r\n @include flex-center;\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n cursor: pointer;\r\n transition: all $transition-fast;\r\n color: var(--theme-fg-more, $fallback-fg-more);\r\n font-size: 10px;\r\n\r\n &:hover {\r\n border-color: var(--theme-fg-more);\r\n }\r\n\r\n &.selected {\r\n border-color: var(--theme-primary);\r\n border-width: 2px;\r\n }\r\n}\r\n\r\n.custom-input-wrapper {\r\n .custom-bg-input {\r\n width: 100%;\r\n font-size: $font-xs;\r\n }\r\n}\r\n\r\n// Split preview container\r\n.split-preview-container {\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-md;\r\n padding: $spacing-lg;\r\n}\r\n\r\n// Preview toolbar\r\n.preview-toolbar {\r\n display: flex;\r\n justify-content: flex-end;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n margin-bottom: $spacing-lg;\r\n padding-bottom: $spacing-md;\r\n border-bottom: 1px solid var(--theme-border, $fallback-border);\r\n}\r\n\r\n.toolbar-separator {\r\n width: 1px;\r\n height: 18px;\r\n background: var(--theme-border, $fallback-border);\r\n margin: 0 $spacing-sm;\r\n align-self: center;\r\n}\r\n\r\n.preview-btn {\r\n @include icon-btn-sm;\r\n}\r\n\r\n// Layout preview area\r\n.layout-preview {\r\n background: var(--theme-bg);\r\n border-radius: $radius-sm;\r\n min-height: 150px;\r\n max-height: 200px;\r\n padding: $spacing-sm;\r\n}\r\n\r\n// Action buttons\r\n.action-buttons {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n padding-top: $spacing-xl;\r\n border-top: 1px solid var(--theme-border, $fallback-border);\r\n margin-top: $spacing-xl;\r\n}\r\n\r\n.checkbox-group {\r\n display: flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n\r\n input[type=\"checkbox\"] {\r\n width: 14px;\r\n height: 14px;\r\n margin: 0;\r\n }\r\n\r\n label {\r\n font-size: $font-sm;\r\n color: var(--theme-fg);\r\n cursor: pointer;\r\n }\r\n}\r\n\r\n.action-buttons-right {\r\n display: flex;\r\n gap: $spacing-md;\r\n\r\n .btn-ghost {\r\n @include btn-ghost;\r\n }\r\n\r\n .btn-success {\r\n @include btn-base;\r\n @include btn-success;\r\n }\r\n\r\n .unsaved-indicator {\r\n color: $color-warning;\r\n font-weight: bold;\r\n margin-left: $spacing-xs;\r\n }\r\n}\r\n","// ======================\r\n// SPACING SCALE (S1: Tight)\r\n// ======================\r\n$spacing-xs: 2px; // toolbar group gap, tiny margins\r\n$spacing-sm: 4px; // gaps, small padding\r\n$spacing-md: 6px; // default gaps, button padding\r\n$spacing-lg: 10px; // section gaps, form spacing\r\n$spacing-xl: 14px; // container padding, large gaps\r\n$spacing-2xl: 18px; // modal padding, section margins\r\n\r\n// ======================\r\n// BORDER RADIUS SCALE (S1: Sharp)\r\n// ======================\r\n$radius-xs: 2px; // tiny elements\r\n$radius-sm: 2px; // buttons, small elements\r\n$radius-md: 3px; // inputs, dropdowns\r\n$radius-lg: 4px; // cards, containers, modals\r\n\r\n// ======================\r\n// CUSTOM COLORS\r\n// ======================\r\n// These extend Tabby's --theme-* variables\r\n$color-success: #10b981;\r\n$color-success-hover: #059669;\r\n$color-warning: #f59e0b;\r\n$color-danger: #ef4444;\r\n\r\n// Fallback values for Tabby theme variables that may not be defined\r\n$fallback-border: rgba(255, 255, 255, 0.1);\r\n$fallback-fg-more: rgba(255, 255, 255, 0.3);\r\n\r\n// ======================\r\n// SHADOWS (S1: Flat - no shadows)\r\n// ======================\r\n$shadow-dropdown: none;\r\n$shadow-context-menu: none;\r\n$shadow-modal: none;\r\n$overlay-bg: rgba(0, 0, 0, 0.7);\r\n\r\n// ======================\r\n// PREVIEW COMPONENT\r\n// ======================\r\n$preview-height: 140px;\r\n$nested-split-bg: rgba(255, 255, 255, 0.02);\r\n$selected-pane-gradient-start: rgba(59, 130, 246, 0.08);\r\n$selected-pane-gradient-end: rgba(59, 130, 246, 0.04);\r\n\r\n// ======================\r\n// FONT SIZES (S1: Compact)\r\n// ======================\r\n$font-xs: 0.7rem; // 11px - sublabels, hints\r\n$font-sm: 0.8rem; // 13px - labels, secondary text\r\n$font-md: 0.85rem; // 14px - default body\r\n\r\n// ======================\r\n// Z-INDEX SCALE\r\n// ======================\r\n$z-dropdown: 100;\r\n$z-modal-overlay: 1100;\r\n$z-context-menu-overlay: 1200;\r\n$z-context-menu: 1201;\r\n\r\n// ======================\r\n// TRANSITIONS\r\n// ======================\r\n$transition-fast: 0.15s;\r\n$transition-normal: 0.2s;\r\n","@use 'variables' as *;\r\n\r\n// ======================\r\n// LAYOUT MIXINS\r\n// ======================\r\n\r\n@mixin flex-center {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n// ======================\r\n// FORM INPUT MIXIN\r\n// ======================\r\n\r\n@mixin form-input($bg: var(--theme-bg)) {\r\n padding: $spacing-sm $spacing-md;\r\n border-radius: $radius-sm;\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n background: $bg;\r\n color: var(--theme-fg);\r\n font-size: $font-md;\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, $fallback-fg-more);\r\n }\r\n}\r\n\r\n// ======================\r\n// FORM LABEL MIXIN (S1: Uppercase compact)\r\n// ======================\r\n\r\n@mixin form-label {\r\n display: block;\r\n font-size: $font-xs;\r\n color: var(--theme-fg-less);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n margin-bottom: $spacing-xs;\r\n}\r\n\r\n// ======================\r\n// BUTTON MIXINS\r\n// ======================\r\n\r\n@mixin toolbar-btn {\r\n padding: $spacing-sm $spacing-md;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n color: var(--theme-fg);\r\n cursor: pointer;\r\n transition: all $transition-fast;\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, $color-danger);\r\n }\r\n}\r\n\r\n@mixin btn-success {\r\n background: $color-success;\r\n border-color: $color-success;\r\n color: white;\r\n\r\n &:hover {\r\n background: $color-success-hover;\r\n border-color: $color-success-hover;\r\n }\r\n}\r\n\r\n@mixin btn-base {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n padding: $spacing-sm $spacing-lg;\r\n font-size: $font-sm;\r\n border-radius: $radius-sm;\r\n cursor: pointer;\r\n transition: all $transition-fast;\r\n}\r\n\r\n@mixin btn-ghost {\r\n @include btn-base;\r\n background: transparent;\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n color: var(--theme-fg);\r\n\r\n &:hover {\r\n background: var(--theme-bg-more);\r\n }\r\n}\r\n\r\n@mixin btn-primary {\r\n @include btn-base;\r\n background: var(--theme-primary);\r\n border: 1px solid var(--theme-primary);\r\n color: white;\r\n\r\n &:hover {\r\n filter: brightness(1.1);\r\n }\r\n}\r\n\r\n@mixin icon-btn-sm($size: 24px) {\r\n width: $size;\r\n height: $size;\r\n @include flex-center;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n color: var(--theme-fg-more, $fallback-fg-more);\r\n cursor: pointer;\r\n font-size: 10px;\r\n transition: all $transition-fast;\r\n\r\n &:hover:not(:disabled) {\r\n border-color: var(--theme-primary);\r\n color: var(--theme-primary);\r\n }\r\n\r\n &.danger:hover:not(:disabled) {\r\n border-color: var(--theme-danger);\r\n color: var(--theme-danger);\r\n }\r\n\r\n &:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n}\r\n\r\n// ======================\r\n// OVERLAY/MODAL MIXINS\r\n// ======================\r\n\r\n@mixin full-overlay($z-index: $z-modal-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: $z-index;\r\n}\r\n\r\n// ======================\r\n// TEXT UTILITIES\r\n// ======================\r\n\r\n@mixin text-ellipsis {\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n// ======================\r\n// DROPDOWN/POPUP\r\n// ======================\r\n\r\n@mixin dropdown-panel {\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-md;\r\n box-shadow: $shadow-dropdown;\r\n}\r\n"],sourceRoot:""}]);const s=i},33(e,r,n){var t=n(893);t&&t.__esModule&&(t=t.default),e.exports="string"==typeof t?t:t.toString()},182(e){"use strict";e.exports=n},210(e,r,n){var t=n(270);t&&t.__esModule&&(t=t.default),e.exports="string"==typeof t?t:t.toString()},234(e,r,n){n(766),e.exports=function(e){return""+'<div class="editor-section"><div class="section-title"><i class="fas fa-cog"></i> Workspace Settings</div><div class="form-row"><div class="form-group"><label>Name</label><input class="form-control" #nameInput type="text" [(ngModel)]="workspace.name" placeholder="Workspace name"></div><div class="form-group auto-width"><label>Icon</label><div class="dropdown-trigger" (click)="toggleIconDropdown()"><span class="dropdown-icon" [style.color]="workspace.color"><i class="fas" [class]="&quot;fa-&quot; + workspace.icon"></i></span><span class="dropdown-chevron"><i class="fas fa-chevron-down"></i></span></div><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]="&quot;fa-&quot; + icon"></i></button></div></div><div class="form-group auto-width"><label>Color</label><div class="color-trigger"><span class="dropdown-color" [style.background]="workspace.color"></span><input class="color-input-hidden" type="color" [(ngModel)]="workspace.color"><span class="dropdown-chevron"><i class="fas fa-chevron-down"></i></span></div></div><div class="form-group auto-width"><label>Background</label><div class="background-picker"><div class="background-trigger" (click)="toggleBackgroundDropdown()"><span class="background-preview" [style.background]="workspace.background?.value || &quot;transparent&quot;"><i class="fas fa-ban" *ngIf="!workspace.background?.value"></i></span><span class="dropdown-chevron"><i class="fas fa-chevron-down"></i></span></div><div class="background-dropdown" *ngIf="backgroundDropdownOpen"><div class="preset-grid"><button class="preset-option" *ngFor="let preset of backgroundPresets" type="button" [class.selected]="isBackgroundSelected(preset)" [style.background]="preset.value || &quot;var(--theme-bg)&quot;" (click)="selectBackgroundPreset(preset)"><i class="fas fa-ban" *ngIf="preset.type === &quot;none&quot;"></i></button></div><div class="custom-input-wrapper"><input class="form-control custom-bg-input" type="text" [(ngModel)]="customBackgroundValue" placeholder="Custom CSS gradient..." (blur)="applyCustomBackground()"></div></div></div></div></div></div><div class="editor-section"><div class="section-title"><i class="fas fa-columns"></i> Split Layout</div><div class="split-preview-container"><div class="preview-toolbar"><button class="preview-btn" type="button" title="Split Horizontal" [disabled]="!selectedPaneId" (click)="splitSelectedPane(&quot;horizontal&quot;)"><i class="fas fa-grip-lines-vertical"></i></button><button class="preview-btn" type="button" title="Split Vertical" [disabled]="!selectedPaneId" (click)="splitSelectedPane(&quot;vertical&quot;)"><i class="fas fa-grip-lines"></i></button><span class="toolbar-separator"></span><button class="preview-btn" type="button" title="Add Left" [disabled]="!selectedPaneId" (click)="addPane(&quot;left&quot;)"><i class="fas fa-arrow-left"></i></button><button class="preview-btn" type="button" title="Add Right" [disabled]="!selectedPaneId" (click)="addPane(&quot;right&quot;)"><i class="fas fa-arrow-right"></i></button><button class="preview-btn" type="button" title="Add Top" [disabled]="!selectedPaneId" (click)="addPane(&quot;top&quot;)"><i class="fas fa-arrow-up"></i></button><button class="preview-btn" type="button" title="Add Bottom" [disabled]="!selectedPaneId" (click)="addPane(&quot;bottom&quot;)"><i class="fas fa-arrow-down"></i></button><span class="toolbar-separator"></span><button class="preview-btn danger" type="button" title="Remove pane" [disabled]="!selectedPaneId || !canRemovePane()" (click)="removeSelectedPane()"><i class="fas fa-trash"></i></button></div><div class="layout-preview" (click)="onPreviewBackgroundClick()"><split-preview [split]="workspace.root" [selectedPaneId]="selectedPaneId" [profiles]="profiles" (paneEdit)="editPane($event)" (splitHorizontal)="splitPane($event, &quot;horizontal&quot;)" (splitVertical)="splitPane($event, &quot;vertical&quot;)" (addLeft)="addPaneFromEvent($event, &quot;left&quot;)" (addRight)="addPaneFromEvent($event, &quot;right&quot;)" (addTop)="addPaneFromEvent($event, &quot;top&quot;)" (addBottom)="addPaneFromEvent($event, &quot;bottom&quot;)" (removePane)="removePane($event)"></split-preview></div><pane-editor *ngIf="showPaneEditor &amp;&amp; editingPane" [pane]="editingPane" [profiles]="profiles" (close)="closePaneEditor()"></pane-editor></div></div><div class="action-buttons"><div class="checkbox-group"><input type="checkbox" [(ngModel)]="workspace.launchOnStartup" id="launchStartup"><label for="launchStartup">Launch on startup</label></div><div class="action-buttons-right"><button class="btn btn-ghost" type="button" (click)="onCancel()"><i class="fas fa-xmark"></i> Cancel</button><button class="btn btn-success" type="button" (click)="onSave()" [disabled]="!workspace.name?.trim() || !hasUnsavedChanges"><i class="fas fa-check"></i> Save<span class="unsaved-indicator" *ngIf="hasUnsavedChanges">*</span></button></div></div>'}},245(e,r,n){n(766),e.exports=function(e){return""+'<div class="pane-details"><div class="pane-details-header"><span class="pane-details-title"><i class="fas fa-terminal"></i> Pane Configuration</span></div><div class="pane-form"><div class="form-group"><label>Profile</label><select class="form-control" [(ngModel)]="pane.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)]="pane.cwd" placeholder="C:\\path\\to\\project"></div><div class="form-group"><label>Startup Command</label><input class="form-control" type="text" [(ngModel)]="pane.startupCommand" placeholder="e.g., npm run dev"></div></div></div>'}},261(e,r,n){n(766),e.exports=function(e){return""+'<div class="workspace-list-container"><div class="tab-bar"><div class="tab" *ngFor="let tab of displayTabs; trackBy: trackByTab" [class.active]="isTabSelected(tab)" (click)="!tab.isNew &amp;&amp; selectWorkspace(tab.workspace)"><span class="tab-icon" [style.color]="tab.workspace.color"><i class="fas" [class]="&quot;fa-&quot; + (tab.workspace.icon || &quot;columns&quot;)"></i></span><span class="tab-name">{{ tab.workspace.name || \'New Workspace\' }}</span><span class="tab-close" *ngIf="!tab.isNew" (click)="deleteWorkspace($event, tab.workspace)" title="Delete workspace"><i class="fas fa-xmark"></i></span></div><div class="tab-new" (click)="createWorkspace()" title="New workspace"><i class="fas fa-plus"></i></div></div><div class="tab-content" *ngIf="editingWorkspace"><workspace-editor [workspace]="editingWorkspace" [autoFocus]="isCreatingNew" [hasUnsavedChanges]="hasUnsavedChanges" (save)="onEditorSave($event)" (cancel)="onEditorCancel()"></workspace-editor></div><div class="tab-content empty-state" *ngIf="!editingWorkspace &amp;&amp; workspaces.length === 0"><p>No workspaces configured yet.</p><p>Click<strong>+</strong>to create your first workspace.</p></div></div>'}},270(e,r,n){"use strict";n.r(r),n.d(r,{default:()=>s});var t=n(354),o=n.n(t),a=n(314),i=n.n(a)()(o());i.push([e.id,".split-preview{display:flex;width:100%;height:140px;gap:4px;border-radius:3px;overflow:hidden;background:var(--theme-bg);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1))}.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:2px}.preview-pane{display:flex;align-items:center;justify-content:center;background:var(--theme-bg-more);border-radius:2px;border:2px solid var(--theme-border, rgba(255, 255, 255, 0.1));cursor:pointer;transition:all .15s;position:relative;min-height:50px}.preview-pane:hover{background:var(--theme-bg-more-more);border-color:var(--theme-fg-more, rgba(255, 255, 255, 0.3))}.preview-pane.selected{border-color:var(--theme-primary);background:linear-gradient(to bottom, rgba(59, 130, 246, 0.08), rgba(59, 130, 246, 0.04))}.pane-content{text-align:center;padding:6px;color:var(--theme-fg);max-width:100%;overflow:hidden}.pane-label{font-size:.85rem;font-weight:600;margin-bottom:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.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{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100px}.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, rgba(255, 255, 255, 0.1));border-radius:4px;box-shadow:none;min-width:160px;padding:4px;z-index:1201}.context-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:6px 10px;border:none;background:none;color:var(--theme-fg);font-size:.9rem;text-align:left;cursor:pointer;border-radius:2px}.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, rgba(255, 255, 255, 0.1));margin:4px 0}:host{display:flex;flex:1}","",{version:3,sources:["webpack://./src/components/splitPreview.component.scss","webpack://./src/styles/_variables.scss","webpack://./src/styles/_mixins.scss"],names:[],mappings:"AAEA,eACE,YAAA,CACA,UAAA,CACA,YCqCe,CDpCf,OCFW,CDGX,iBCQU,CDPV,eAAA,CACA,0BAAA,CACA,8DAAA,CAEA,0BACE,kBAAA,CAGF,wBACE,qBAAA,CAGF,sBACE,WAAA,CACA,sCAAA,CACA,8BCoBc,CDnBd,WCpBS,CDqBT,iBCXQ,CDeZ,cEtBE,YAAA,CACA,kBAAA,CACA,sBAAA,CFsBA,+BAAA,CACA,iBClBU,CDmBV,8DAAA,CACA,cAAA,CACA,mBAAA,CACA,iBAAA,CACA,eAAA,CAEA,oBACE,oCAAA,CACA,2DAAA,CAGF,uBACE,iCAAA,CACA,yFAAA,CAQJ,cACE,iBAAA,CACA,WCnDW,CDoDX,qBAAA,CACA,cAAA,CACA,eAAA,CAGF,YACE,gBAAA,CACA,eAAA,CACA,iBC7DW,CCiKX,kBAAA,CACA,eAAA,CACA,sBAAA,CFlGF,0BAEE,eAAA,CACA,eAAA,CACA,iBCtEW,CCkKX,kBAAA,CACA,eAAA,CACA,sBAAA,CF1FF,cACE,eAAA,CACA,UAAA,CACA,cC5EW,CD8EX,2BE3EA,YAAA,CACA,kBAAA,CACA,sBAAA,CF2EE,OChFS,CDkFT,6BACE,UAAA,CACA,iBAAA,CACA,gBAAA,CAGF,gCEyEF,kBAAA,CACA,eAAA,CACA,sBAAA,CFzEI,eAAA,CAMN,sBEoDE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,YDlGuB,CD6CzB,cACE,cAAA,CACA,0BAAA,CACA,8DAAA,CACA,iBC5FU,CD6FV,eC1EoB,CD2EpB,eAAA,CACA,WC3GW,CD4GX,YCpDe,CDuDjB,mBACE,YAAA,CACA,kBAAA,CACA,QChHW,CDiHX,UAAA,CACA,gBAAA,CACA,WAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,cAAA,CACA,iBCjHU,CDmHV,yBACE,+BAAA,CAGF,0BACE,kCAAA,CAEA,gCACE,6BAAA,CAIJ,qBACE,UAAA,CACA,iBAAA,CACA,UAAA,CAIJ,sBACE,UAAA,CACA,wDAAA,CACA,YAAA,CAIF,MACE,YAAA,CACA,MAAA",sourcesContent:["@use '../styles/index' as *;\r\n\r\n.split-preview {\r\n display: flex;\r\n width: 100%;\r\n height: $preview-height;\r\n gap: $spacing-sm;\r\n border-radius: $radius-md;\r\n overflow: hidden;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border, rgba(255, 255, 255, 0.1));\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: $nested-split-bg;\r\n padding: $spacing-sm;\r\n border-radius: $radius-sm;\r\n }\r\n}\r\n\r\n.preview-pane {\r\n @include flex-center;\r\n background: var(--theme-bg-more);\r\n border-radius: $radius-sm;\r\n border: 2px solid var(--theme-border, rgba(255, 255, 255, 0.1));\r\n cursor: pointer;\r\n transition: all $transition-fast;\r\n position: relative;\r\n min-height: 50px;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more-more);\r\n border-color: var(--theme-fg-more, rgba(255, 255, 255, 0.3));\r\n }\r\n\r\n &.selected {\r\n border-color: var(--theme-primary);\r\n background: linear-gradient(\r\n to bottom,\r\n $selected-pane-gradient-start,\r\n $selected-pane-gradient-end\r\n );\r\n }\r\n}\r\n\r\n.pane-content {\r\n text-align: center;\r\n padding: $spacing-md;\r\n color: var(--theme-fg);\r\n max-width: 100%;\r\n overflow: hidden;\r\n}\r\n\r\n.pane-label {\r\n font-size: 0.85rem;\r\n font-weight: 600;\r\n margin-bottom: $spacing-sm;\r\n @include text-ellipsis;\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: $spacing-xs;\r\n @include text-ellipsis;\r\n}\r\n\r\n.pane-details {\r\n font-size: 0.7rem;\r\n opacity: 0.7;\r\n margin-top: $spacing-sm;\r\n\r\n .pane-detail {\r\n @include flex-center;\r\n gap: $spacing-sm;\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 @include text-ellipsis;\r\n max-width: 100px;\r\n }\r\n }\r\n}\r\n\r\n// Context menu\r\n.context-menu-overlay {\r\n @include full-overlay($z-context-menu-overlay);\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, $fallback-border);\r\n border-radius: $radius-lg;\r\n box-shadow: $shadow-context-menu;\r\n min-width: 160px;\r\n padding: $spacing-sm;\r\n z-index: $z-context-menu;\r\n}\r\n\r\n.context-menu-item {\r\n display: flex;\r\n align-items: center;\r\n gap: $spacing-lg;\r\n width: 100%;\r\n padding: $spacing-md $spacing-lg;\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: $radius-sm;\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, $color-danger);\r\n\r\n &:hover {\r\n background: rgba($color-danger, 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, $fallback-border);\r\n margin: $spacing-sm 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","// ======================\r\n// SPACING SCALE (S1: Tight)\r\n// ======================\r\n$spacing-xs: 2px; // toolbar group gap, tiny margins\r\n$spacing-sm: 4px; // gaps, small padding\r\n$spacing-md: 6px; // default gaps, button padding\r\n$spacing-lg: 10px; // section gaps, form spacing\r\n$spacing-xl: 14px; // container padding, large gaps\r\n$spacing-2xl: 18px; // modal padding, section margins\r\n\r\n// ======================\r\n// BORDER RADIUS SCALE (S1: Sharp)\r\n// ======================\r\n$radius-xs: 2px; // tiny elements\r\n$radius-sm: 2px; // buttons, small elements\r\n$radius-md: 3px; // inputs, dropdowns\r\n$radius-lg: 4px; // cards, containers, modals\r\n\r\n// ======================\r\n// CUSTOM COLORS\r\n// ======================\r\n// These extend Tabby's --theme-* variables\r\n$color-success: #10b981;\r\n$color-success-hover: #059669;\r\n$color-warning: #f59e0b;\r\n$color-danger: #ef4444;\r\n\r\n// Fallback values for Tabby theme variables that may not be defined\r\n$fallback-border: rgba(255, 255, 255, 0.1);\r\n$fallback-fg-more: rgba(255, 255, 255, 0.3);\r\n\r\n// ======================\r\n// SHADOWS (S1: Flat - no shadows)\r\n// ======================\r\n$shadow-dropdown: none;\r\n$shadow-context-menu: none;\r\n$shadow-modal: none;\r\n$overlay-bg: rgba(0, 0, 0, 0.7);\r\n\r\n// ======================\r\n// PREVIEW COMPONENT\r\n// ======================\r\n$preview-height: 140px;\r\n$nested-split-bg: rgba(255, 255, 255, 0.02);\r\n$selected-pane-gradient-start: rgba(59, 130, 246, 0.08);\r\n$selected-pane-gradient-end: rgba(59, 130, 246, 0.04);\r\n\r\n// ======================\r\n// FONT SIZES (S1: Compact)\r\n// ======================\r\n$font-xs: 0.7rem; // 11px - sublabels, hints\r\n$font-sm: 0.8rem; // 13px - labels, secondary text\r\n$font-md: 0.85rem; // 14px - default body\r\n\r\n// ======================\r\n// Z-INDEX SCALE\r\n// ======================\r\n$z-dropdown: 100;\r\n$z-modal-overlay: 1100;\r\n$z-context-menu-overlay: 1200;\r\n$z-context-menu: 1201;\r\n\r\n// ======================\r\n// TRANSITIONS\r\n// ======================\r\n$transition-fast: 0.15s;\r\n$transition-normal: 0.2s;\r\n","@use 'variables' as *;\r\n\r\n// ======================\r\n// LAYOUT MIXINS\r\n// ======================\r\n\r\n@mixin flex-center {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n// ======================\r\n// FORM INPUT MIXIN\r\n// ======================\r\n\r\n@mixin form-input($bg: var(--theme-bg)) {\r\n padding: $spacing-sm $spacing-md;\r\n border-radius: $radius-sm;\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n background: $bg;\r\n color: var(--theme-fg);\r\n font-size: $font-md;\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, $fallback-fg-more);\r\n }\r\n}\r\n\r\n// ======================\r\n// FORM LABEL MIXIN (S1: Uppercase compact)\r\n// ======================\r\n\r\n@mixin form-label {\r\n display: block;\r\n font-size: $font-xs;\r\n color: var(--theme-fg-less);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n margin-bottom: $spacing-xs;\r\n}\r\n\r\n// ======================\r\n// BUTTON MIXINS\r\n// ======================\r\n\r\n@mixin toolbar-btn {\r\n padding: $spacing-sm $spacing-md;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n color: var(--theme-fg);\r\n cursor: pointer;\r\n transition: all $transition-fast;\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, $color-danger);\r\n }\r\n}\r\n\r\n@mixin btn-success {\r\n background: $color-success;\r\n border-color: $color-success;\r\n color: white;\r\n\r\n &:hover {\r\n background: $color-success-hover;\r\n border-color: $color-success-hover;\r\n }\r\n}\r\n\r\n@mixin btn-base {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n padding: $spacing-sm $spacing-lg;\r\n font-size: $font-sm;\r\n border-radius: $radius-sm;\r\n cursor: pointer;\r\n transition: all $transition-fast;\r\n}\r\n\r\n@mixin btn-ghost {\r\n @include btn-base;\r\n background: transparent;\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n color: var(--theme-fg);\r\n\r\n &:hover {\r\n background: var(--theme-bg-more);\r\n }\r\n}\r\n\r\n@mixin btn-primary {\r\n @include btn-base;\r\n background: var(--theme-primary);\r\n border: 1px solid var(--theme-primary);\r\n color: white;\r\n\r\n &:hover {\r\n filter: brightness(1.1);\r\n }\r\n}\r\n\r\n@mixin icon-btn-sm($size: 24px) {\r\n width: $size;\r\n height: $size;\r\n @include flex-center;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n color: var(--theme-fg-more, $fallback-fg-more);\r\n cursor: pointer;\r\n font-size: 10px;\r\n transition: all $transition-fast;\r\n\r\n &:hover:not(:disabled) {\r\n border-color: var(--theme-primary);\r\n color: var(--theme-primary);\r\n }\r\n\r\n &.danger:hover:not(:disabled) {\r\n border-color: var(--theme-danger);\r\n color: var(--theme-danger);\r\n }\r\n\r\n &:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n}\r\n\r\n// ======================\r\n// OVERLAY/MODAL MIXINS\r\n// ======================\r\n\r\n@mixin full-overlay($z-index: $z-modal-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: $z-index;\r\n}\r\n\r\n// ======================\r\n// TEXT UTILITIES\r\n// ======================\r\n\r\n@mixin text-ellipsis {\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n// ======================\r\n// DROPDOWN/POPUP\r\n// ======================\r\n\r\n@mixin dropdown-panel {\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-md;\r\n box-shadow: $shadow-dropdown;\r\n}\r\n"],sourceRoot:""}]);const s=i},314(e){"use strict";e.exports=function(e){var r=[];return r.toString=function(){return this.map(function(r){var n="",t=void 0!==r[5];return r[4]&&(n+="@supports (".concat(r[4],") {")),r[2]&&(n+="@media ".concat(r[2]," {")),t&&(n+="@layer".concat(r[5].length>0?" ".concat(r[5]):""," {")),n+=e(r),t&&(n+="}"),r[2]&&(n+="}"),r[4]&&(n+="}"),n}).join("")},r.i=function(e,n,t,o,a){"string"==typeof e&&(e=[[null,e,void 0]]);var i={};if(t)for(var s=0;s<this.length;s++){var c=this[s][0];null!=c&&(i[c]=!0)}for(var d=0;d<e.length;d++){var l=[].concat(e[d]);t&&i[l[0]]||(void 0!==a&&(void 0===l[5]||(l[1]="@layer".concat(l[5].length>0?" ".concat(l[5]):""," {").concat(l[1],"}")),l[5]=a),n&&(l[2]?(l[1]="@media ".concat(l[2]," {").concat(l[1],"}"),l[2]=n):l[2]=n),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,n){var t=n(481);t&&t.__esModule&&(t=t.default),e.exports="string"==typeof t?t:t.toString()},349(e){"use strict";e.exports=i},354(e){"use strict";e.exports=function(e){var r=e[1],n=e[3];if(!n)return r;if("function"==typeof btoa){var t=btoa(unescape(encodeURIComponent(JSON.stringify(n)))),o="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(t),a="/*# ".concat(o," */");return[r].concat([a]).join("\n")}return[r].join("\n")}},358(e){"use strict";e.exports=r},439(e){"use strict";e.exports=c},481(e,r,n){"use strict";n.r(r),n.d(r,{default:()=>s});var t=n(354),o=n.n(t),a=n(314),i=n.n(a)()(o());i.push([e.id,".workspace-list-container{padding:18px}.tab-bar{display:flex;background:var(--theme-bg-more);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-bottom:none;overflow-y:hidden;overflow-x:auto}.tab-bar::-webkit-scrollbar{height:6px}.tab-bar::-webkit-scrollbar-track{background:var(--theme-bg-more)}.tab-bar::-webkit-scrollbar-thumb{background:var(--theme-border, rgba(255, 255, 255, 0.1));border-radius:3px}.tab-bar::-webkit-scrollbar-thumb:hover{background:var(--theme-fg-more)}.tab{display:flex;align-items:center;gap:6px;padding:6px 10px;border-right:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));color:var(--theme-fg-more);cursor:pointer;font-size:.8rem;min-width:120px;transition:background .15s}.tab:hover{background:var(--theme-bg-more-more)}.tab:hover .tab-close{opacity:1}.tab.active{background:var(--theme-bg);color:var(--theme-fg);border-bottom:2px solid var(--theme-primary);margin-bottom:-1px}.tab-icon{font-size:12px}.tab-name{flex:1;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tab-close{width:16px;height:16px;display:flex;align-items:center;justify-content:center;opacity:0;font-size:9px;border-radius:2px;transition:opacity .15s,background .15s}.tab-close:hover{background:var(--theme-danger);color:#fff}.tab-new{display:flex;align-items:center;justify-content:center;width:36px;color:var(--theme-fg-more);cursor:pointer;transition:color .15s,background .15s}.tab-new:hover{background:var(--theme-bg-more-more);color:var(--theme-primary)}.tab-content{background:var(--theme-bg);border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));border-top:none;padding:14px}.tab-content.empty-state{text-align:center;padding:18px;color:var(--theme-fg-more)}.tab-content.empty-state p{margin:6px 0}.tab-content.empty-state strong{color:var(--theme-primary);padding:0 2px}","",{version:3,sources:["webpack://./src/components/workspaceList.component.scss","webpack://./src/styles/_variables.scss"],names:[],mappings:"AAEA,0BACE,YCKY,CDDd,SACE,YAAA,CACA,+BAAA,CACA,8DAAA,CACA,kBAAA,CACA,iBAAA,CACA,eAAA,CAGA,4BACE,UAAA,CAGF,kCACE,+BAAA,CAGF,kCACE,wDAAA,CACA,iBAAA,CAEA,wCACE,+BAAA,CAKN,KACE,YAAA,CACA,kBAAA,CACA,OChCW,CDiCX,gBAAA,CACA,oEAAA,CACA,0BAAA,CACA,cAAA,CACA,eCSQ,CDRR,eAAA,CACA,0BAAA,CAEA,WACE,oCAAA,CAEA,sBACE,SAAA,CAIJ,YACE,0BAAA,CACA,qBAAA,CACA,4CAAA,CACA,kBAAA,CAIJ,UACE,cAAA,CAGF,UACE,MAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CAGF,WACE,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,SAAA,CACA,aAAA,CACA,iBCpEU,CDqEV,uCAAA,CAEA,iBACE,8BAAA,CACA,UAAA,CAIJ,SACE,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,UAAA,CACA,0BAAA,CACA,cAAA,CACA,qCAAA,CAEA,eACE,oCAAA,CACA,0BAAA,CAKJ,aACE,0BAAA,CACA,8DAAA,CACA,eAAA,CACA,YCvGW,CDyGX,yBACE,iBAAA,CACA,YC1GU,CD2GV,0BAAA,CAEA,2BACE,YAAA,CAGF,gCACE,0BAAA,CACA,aAAA",sourcesContent:["@use '../styles/index' as *;\r\n\r\n.workspace-list-container {\r\n padding: $spacing-2xl;\r\n}\r\n\r\n// Tab bar\r\n.tab-bar {\r\n display: flex;\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-bottom: none;\r\n overflow-y: hidden;\r\n overflow-x: auto;\r\n\r\n // Thin scrollbar\r\n &::-webkit-scrollbar {\r\n height: 6px;\r\n }\r\n\r\n &::-webkit-scrollbar-track {\r\n background: var(--theme-bg-more);\r\n }\r\n\r\n &::-webkit-scrollbar-thumb {\r\n background: var(--theme-border, $fallback-border);\r\n border-radius: 3px;\r\n\r\n &:hover {\r\n background: var(--theme-fg-more);\r\n }\r\n }\r\n}\r\n\r\n.tab {\r\n display: flex;\r\n align-items: center;\r\n gap: $spacing-md;\r\n padding: $spacing-md $spacing-lg;\r\n border-right: 1px solid var(--theme-border, $fallback-border);\r\n color: var(--theme-fg-more);\r\n cursor: pointer;\r\n font-size: $font-sm;\r\n min-width: 120px;\r\n transition: background $transition-fast;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more-more);\r\n\r\n .tab-close {\r\n opacity: 1;\r\n }\r\n }\r\n\r\n &.active {\r\n background: var(--theme-bg);\r\n color: var(--theme-fg);\r\n border-bottom: 2px solid var(--theme-primary);\r\n margin-bottom: -1px;\r\n }\r\n}\r\n\r\n.tab-icon {\r\n font-size: 12px;\r\n}\r\n\r\n.tab-name {\r\n flex: 1;\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n.tab-close {\r\n width: 16px;\r\n height: 16px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n opacity: 0;\r\n font-size: 9px;\r\n border-radius: $radius-xs;\r\n transition: opacity $transition-fast, background $transition-fast;\r\n\r\n &:hover {\r\n background: var(--theme-danger);\r\n color: white;\r\n }\r\n}\r\n\r\n.tab-new {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n width: 36px;\r\n color: var(--theme-fg-more);\r\n cursor: pointer;\r\n transition: color $transition-fast, background $transition-fast;\r\n\r\n &:hover {\r\n background: var(--theme-bg-more-more);\r\n color: var(--theme-primary);\r\n }\r\n}\r\n\r\n// Tab content\r\n.tab-content {\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-top: none;\r\n padding: $spacing-xl;\r\n\r\n &.empty-state {\r\n text-align: center;\r\n padding: $spacing-2xl;\r\n color: var(--theme-fg-more);\r\n\r\n p {\r\n margin: $spacing-md 0;\r\n }\r\n\r\n strong {\r\n color: var(--theme-primary);\r\n padding: 0 $spacing-xs;\r\n }\r\n }\r\n}\r\n","// ======================\r\n// SPACING SCALE (S1: Tight)\r\n// ======================\r\n$spacing-xs: 2px; // toolbar group gap, tiny margins\r\n$spacing-sm: 4px; // gaps, small padding\r\n$spacing-md: 6px; // default gaps, button padding\r\n$spacing-lg: 10px; // section gaps, form spacing\r\n$spacing-xl: 14px; // container padding, large gaps\r\n$spacing-2xl: 18px; // modal padding, section margins\r\n\r\n// ======================\r\n// BORDER RADIUS SCALE (S1: Sharp)\r\n// ======================\r\n$radius-xs: 2px; // tiny elements\r\n$radius-sm: 2px; // buttons, small elements\r\n$radius-md: 3px; // inputs, dropdowns\r\n$radius-lg: 4px; // cards, containers, modals\r\n\r\n// ======================\r\n// CUSTOM COLORS\r\n// ======================\r\n// These extend Tabby's --theme-* variables\r\n$color-success: #10b981;\r\n$color-success-hover: #059669;\r\n$color-warning: #f59e0b;\r\n$color-danger: #ef4444;\r\n\r\n// Fallback values for Tabby theme variables that may not be defined\r\n$fallback-border: rgba(255, 255, 255, 0.1);\r\n$fallback-fg-more: rgba(255, 255, 255, 0.3);\r\n\r\n// ======================\r\n// SHADOWS (S1: Flat - no shadows)\r\n// ======================\r\n$shadow-dropdown: none;\r\n$shadow-context-menu: none;\r\n$shadow-modal: none;\r\n$overlay-bg: rgba(0, 0, 0, 0.7);\r\n\r\n// ======================\r\n// PREVIEW COMPONENT\r\n// ======================\r\n$preview-height: 140px;\r\n$nested-split-bg: rgba(255, 255, 255, 0.02);\r\n$selected-pane-gradient-start: rgba(59, 130, 246, 0.08);\r\n$selected-pane-gradient-end: rgba(59, 130, 246, 0.04);\r\n\r\n// ======================\r\n// FONT SIZES (S1: Compact)\r\n// ======================\r\n$font-xs: 0.7rem; // 11px - sublabels, hints\r\n$font-sm: 0.8rem; // 13px - labels, secondary text\r\n$font-md: 0.85rem; // 14px - default body\r\n\r\n// ======================\r\n// Z-INDEX SCALE\r\n// ======================\r\n$z-dropdown: 100;\r\n$z-modal-overlay: 1100;\r\n$z-context-menu-overlay: 1200;\r\n$z-context-menu: 1201;\r\n\r\n// ======================\r\n// TRANSITIONS\r\n// ======================\r\n$transition-fast: 0.15s;\r\n$transition-normal: 0.2s;\r\n"],sourceRoot:""}]);const s=i},528(e,r,n){n(766),e.exports=function(e){return""+'<div class="split-preview" [class.horizontal]="split.orientation === &quot;horizontal&quot;" [class.vertical]="split.orientation === &quot;vertical&quot;" [class.nested]="depth &gt; 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()" (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></div><split-preview *ngIf="isSplit(child)" [split]="asSplit(child)" [depth]="depth + 1" [selectedPaneId]="selectedPaneId" [profiles]="profiles" [style.flex-basis]="getFlexStyle(i)" (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,r,n){var t=n(528);e.exports=(t.default||t).apply(t,[])},650(e){"use strict";e.exports=t},700(e){"use strict";e.exports=o},765(e){"use strict";e.exports=a},766(e,r,n){"use strict";var t=Object.prototype.hasOwnProperty;function o(e,r){return Array.isArray(e)?function(e,r){for(var n,t="",a="",i=Array.isArray(r),s=0;s<e.length;s++)(n=o(e[s]))&&(i&&r[s]&&(n=c(n)),t=t+a+n,a=" ");return t}(e,r):e&&"object"==typeof e?function(e){var r="",n="";for(var o in e)o&&e[o]&&t.call(e,o)&&(r=r+n+o,n=" ");return r}(e):e||""}function a(e){if(!e)return"";if("object"==typeof e){var r="";for(var n in e)t.call(e,n)&&(r=r+n+":"+e[n]+";");return r}return e+""}function i(e,r,n,t){if(!1===r||null==r||!r&&("class"===e||"style"===e))return"";if(!0===r)return" "+(t?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),n||-1===r.indexOf('"'))?(n&&(r=c(r))," "+e+'="'+r+'"'):" "+e+"='"+r.replace(/'/g,"&#39;")+"'"}r.merge=function e(r,n){if(1===arguments.length){for(var t=r[0],o=1;o<r.length;o++)t=e(t,r[o]);return t}for(var i in n)if("class"===i){var s=r[i]||[];r[i]=(Array.isArray(s)?s:[s]).concat(n[i]||[])}else if("style"===i){s=(s=a(r[i]))&&";"!==s[s.length-1]?s+";":s;var c=a(n[i]);c=c&&";"!==c[c.length-1]?c+";":c,r[i]=s+c}else r[i]=n[i];return r},r.classes=o,r.style=a,r.attr=i,r.attrs=function(e,r){var n="";for(var s in e)if(t.call(e,s)){var c=e[s];if("class"===s){n=i(s,c=o(c),!1,r)+n;continue}"style"===s&&(c=a(c)),n+=i(s,c,!1,r)}return n};var s=/["&<>]/;function c(e){var r=""+e,n=s.exec(r);if(!n)return e;var t,o,a,i="";for(t=n.index,o=0;t<r.length;t++){switch(r.charCodeAt(t)){case 34:a="&quot;";break;case 38:a="&amp;";break;case 60:a="&lt;";break;case 62:a="&gt;";break;default:continue}o!==t&&(i+=r.substring(o,t)),o=t+1,i+=a}return o!==t?i+r.substring(o,t):i}r.escape=c,r.rethrow=function e(r,t,o,a){if(!(r instanceof Error))throw r;if(!("undefined"==typeof window&&t||a))throw r.message+=" on line "+o,r;var i,s,c,d;try{a=a||n(947).readFileSync(t,{encoding:"utf8"}),i=3,s=a.split("\n"),c=Math.max(o-i,0),d=Math.min(s.length,o+i)}catch(n){return r.message+=" - could not read from "+t+" ("+n.message+")",void e(r,null,o)}i=s.slice(c,d).map(function(e,r){var n=r+c+1;return(n==o?" > ":" ")+n+"| "+e}).join("\n"),r.path=t;try{r.message=(t||"Pug")+":"+o+"\n"+i+"\n\n"+r.message}catch(e){}throw r}},801(e,r,n){var t=n(234);e.exports=(t.default||t).apply(t,[])},840(e,r,n){var t=n(28);t&&t.__esModule&&(t=t.default),e.exports="string"==typeof t?t:t.toString()},860(r){"use strict";r.exports=e},864(e,r,n){var t=n(245);e.exports=(t.default||t).apply(t,[])},893(e,r,n){"use strict";n.r(r),n.d(r,{default:()=>s});var t=n(354),o=n.n(t),a=n(314),i=n.n(a)()(o());i.push([e.id,".pane-details{background:var(--theme-bg-more-more);border-radius:2px;padding:10px;padding-top:10px;margin-top:14px;border-left:2px solid var(--theme-primary);border-top:1px solid var(--theme-border, rgba(255, 255, 255, 0.1))}.pane-details-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.pane-details-title{font-size:.8rem;color:var(--theme-fg);font-weight:500;display:flex;align-items:center;gap:4px}.pane-form{display:grid;grid-template-columns:1fr 1fr;gap:10px}@media(max-width: 600px){.pane-form{grid-template-columns:1fr}}.form-group label{display:block;font-size:.7rem;color:var(--theme-fg-less);text-transform:uppercase;letter-spacing:.5px;margin-bottom:2px}.form-control{width:100%;padding:4px 6px;border-radius:2px;border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1));background:var(--theme-bg);color:var(--theme-fg);font-size:.85rem}.form-control:focus{outline:none;border-color:var(--theme-primary)}.form-control::placeholder{color:var(--theme-fg-more, rgba(255, 255, 255, 0.3))}.form-control{font-size:.8rem;border:1px solid var(--theme-border, rgba(255, 255, 255, 0.1)) !important}.form-control:focus{border-color:var(--theme-primary) !important}select.form-control{cursor:pointer;appearance:auto}","",{version:3,sources:["webpack://./src/components/paneEditor.component.scss","webpack://./src/styles/_variables.scss","webpack://./src/styles/_mixins.scss"],names:[],mappings:"AAGA,cACE,oCAAA,CACA,iBCSU,CDRV,YAAA,CACA,gBCDW,CDEX,eCDW,CDEX,0CAAA,CACA,kEAAA,CAGF,qBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,kBCXW,CDcb,oBACE,eC8BQ,CD7BR,qBAAA,CACA,eAAA,CACA,YAAA,CACA,kBAAA,CACA,OCtBW,CD0Bb,WACE,YAAA,CACA,6BAAA,CACA,QC3BW,CD8Bb,yBACE,WACE,yBAAA,CAAA,CAKF,kBEJA,aAAA,CACA,eDUQ,CCTR,0BAAA,CACA,wBAAA,CACA,mBAAA,CACA,iBDzCW,CD6Cb,cACE,UAAA,CEhCA,eAAA,CACA,iBDJU,CCKV,8DAAA,CACA,0BF8BoB,CE7BpB,qBAAA,CACA,gBD8BQ,CC5BR,oBACE,YAAA,CACA,iCAAA,CAGF,2BACE,oDAAA,CFkBJ,cAGE,eAAA,CAEA,yEAAA,CAEA,oBACE,4CAAA,CAIJ,oBACE,cAAA,CACA,eAAA",sourcesContent:["@use '../styles/index' as *;\r\n\r\n// Inline pane details panel\r\n.pane-details {\r\n background: var(--theme-bg-more-more);\r\n border-radius: $radius-sm;\r\n padding: $spacing-lg;\r\n padding-top: $spacing-lg;\r\n margin-top: $spacing-xl;\r\n border-left: 2px solid var(--theme-primary);\r\n border-top: 1px solid var(--theme-border, $fallback-border);\r\n}\r\n\r\n.pane-details-header {\r\n display: flex;\r\n justify-content: space-between;\r\n align-items: center;\r\n margin-bottom: $spacing-lg;\r\n}\r\n\r\n.pane-details-title {\r\n font-size: $font-sm;\r\n color: var(--theme-fg);\r\n font-weight: 500;\r\n display: flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n}\r\n\r\n// 2-column grid for pane form\r\n.pane-form {\r\n display: grid;\r\n grid-template-columns: 1fr 1fr;\r\n gap: $spacing-lg;\r\n}\r\n\r\n@media (max-width: 600px) {\r\n .pane-form {\r\n grid-template-columns: 1fr;\r\n }\r\n}\r\n\r\n.form-group {\r\n label {\r\n @include form-label;\r\n }\r\n}\r\n\r\n.form-control {\r\n width: 100%;\r\n @include form-input(var(--theme-bg));\r\n font-size: $font-sm;\r\n // Override Tabby's global border reset\r\n border: 1px solid var(--theme-border, $fallback-border) !important;\r\n\r\n &:focus {\r\n border-color: var(--theme-primary) !important;\r\n }\r\n}\r\n\r\nselect.form-control {\r\n cursor: pointer;\r\n appearance: auto; // Show dropdown arrow\r\n}\r\n","// ======================\r\n// SPACING SCALE (S1: Tight)\r\n// ======================\r\n$spacing-xs: 2px; // toolbar group gap, tiny margins\r\n$spacing-sm: 4px; // gaps, small padding\r\n$spacing-md: 6px; // default gaps, button padding\r\n$spacing-lg: 10px; // section gaps, form spacing\r\n$spacing-xl: 14px; // container padding, large gaps\r\n$spacing-2xl: 18px; // modal padding, section margins\r\n\r\n// ======================\r\n// BORDER RADIUS SCALE (S1: Sharp)\r\n// ======================\r\n$radius-xs: 2px; // tiny elements\r\n$radius-sm: 2px; // buttons, small elements\r\n$radius-md: 3px; // inputs, dropdowns\r\n$radius-lg: 4px; // cards, containers, modals\r\n\r\n// ======================\r\n// CUSTOM COLORS\r\n// ======================\r\n// These extend Tabby's --theme-* variables\r\n$color-success: #10b981;\r\n$color-success-hover: #059669;\r\n$color-warning: #f59e0b;\r\n$color-danger: #ef4444;\r\n\r\n// Fallback values for Tabby theme variables that may not be defined\r\n$fallback-border: rgba(255, 255, 255, 0.1);\r\n$fallback-fg-more: rgba(255, 255, 255, 0.3);\r\n\r\n// ======================\r\n// SHADOWS (S1: Flat - no shadows)\r\n// ======================\r\n$shadow-dropdown: none;\r\n$shadow-context-menu: none;\r\n$shadow-modal: none;\r\n$overlay-bg: rgba(0, 0, 0, 0.7);\r\n\r\n// ======================\r\n// PREVIEW COMPONENT\r\n// ======================\r\n$preview-height: 140px;\r\n$nested-split-bg: rgba(255, 255, 255, 0.02);\r\n$selected-pane-gradient-start: rgba(59, 130, 246, 0.08);\r\n$selected-pane-gradient-end: rgba(59, 130, 246, 0.04);\r\n\r\n// ======================\r\n// FONT SIZES (S1: Compact)\r\n// ======================\r\n$font-xs: 0.7rem; // 11px - sublabels, hints\r\n$font-sm: 0.8rem; // 13px - labels, secondary text\r\n$font-md: 0.85rem; // 14px - default body\r\n\r\n// ======================\r\n// Z-INDEX SCALE\r\n// ======================\r\n$z-dropdown: 100;\r\n$z-modal-overlay: 1100;\r\n$z-context-menu-overlay: 1200;\r\n$z-context-menu: 1201;\r\n\r\n// ======================\r\n// TRANSITIONS\r\n// ======================\r\n$transition-fast: 0.15s;\r\n$transition-normal: 0.2s;\r\n","@use 'variables' as *;\r\n\r\n// ======================\r\n// LAYOUT MIXINS\r\n// ======================\r\n\r\n@mixin flex-center {\r\n display: flex;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n\r\n// ======================\r\n// FORM INPUT MIXIN\r\n// ======================\r\n\r\n@mixin form-input($bg: var(--theme-bg)) {\r\n padding: $spacing-sm $spacing-md;\r\n border-radius: $radius-sm;\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n background: $bg;\r\n color: var(--theme-fg);\r\n font-size: $font-md;\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, $fallback-fg-more);\r\n }\r\n}\r\n\r\n// ======================\r\n// FORM LABEL MIXIN (S1: Uppercase compact)\r\n// ======================\r\n\r\n@mixin form-label {\r\n display: block;\r\n font-size: $font-xs;\r\n color: var(--theme-fg-less);\r\n text-transform: uppercase;\r\n letter-spacing: 0.5px;\r\n margin-bottom: $spacing-xs;\r\n}\r\n\r\n// ======================\r\n// BUTTON MIXINS\r\n// ======================\r\n\r\n@mixin toolbar-btn {\r\n padding: $spacing-sm $spacing-md;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n color: var(--theme-fg);\r\n cursor: pointer;\r\n transition: all $transition-fast;\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, $color-danger);\r\n }\r\n}\r\n\r\n@mixin btn-success {\r\n background: $color-success;\r\n border-color: $color-success;\r\n color: white;\r\n\r\n &:hover {\r\n background: $color-success-hover;\r\n border-color: $color-success-hover;\r\n }\r\n}\r\n\r\n@mixin btn-base {\r\n display: inline-flex;\r\n align-items: center;\r\n gap: $spacing-sm;\r\n padding: $spacing-sm $spacing-lg;\r\n font-size: $font-sm;\r\n border-radius: $radius-sm;\r\n cursor: pointer;\r\n transition: all $transition-fast;\r\n}\r\n\r\n@mixin btn-ghost {\r\n @include btn-base;\r\n background: transparent;\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n color: var(--theme-fg);\r\n\r\n &:hover {\r\n background: var(--theme-bg-more);\r\n }\r\n}\r\n\r\n@mixin btn-primary {\r\n @include btn-base;\r\n background: var(--theme-primary);\r\n border: 1px solid var(--theme-primary);\r\n color: white;\r\n\r\n &:hover {\r\n filter: brightness(1.1);\r\n }\r\n}\r\n\r\n@mixin icon-btn-sm($size: 24px) {\r\n width: $size;\r\n height: $size;\r\n @include flex-center;\r\n background: var(--theme-bg);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-sm;\r\n color: var(--theme-fg-more, $fallback-fg-more);\r\n cursor: pointer;\r\n font-size: 10px;\r\n transition: all $transition-fast;\r\n\r\n &:hover:not(:disabled) {\r\n border-color: var(--theme-primary);\r\n color: var(--theme-primary);\r\n }\r\n\r\n &.danger:hover:not(:disabled) {\r\n border-color: var(--theme-danger);\r\n color: var(--theme-danger);\r\n }\r\n\r\n &:disabled {\r\n opacity: 0.4;\r\n cursor: not-allowed;\r\n }\r\n}\r\n\r\n// ======================\r\n// OVERLAY/MODAL MIXINS\r\n// ======================\r\n\r\n@mixin full-overlay($z-index: $z-modal-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: $z-index;\r\n}\r\n\r\n// ======================\r\n// TEXT UTILITIES\r\n// ======================\r\n\r\n@mixin text-ellipsis {\r\n white-space: nowrap;\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n}\r\n\r\n// ======================\r\n// DROPDOWN/POPUP\r\n// ======================\r\n\r\n@mixin dropdown-panel {\r\n background: var(--theme-bg-more);\r\n border: 1px solid var(--theme-border, $fallback-border);\r\n border-radius: $radius-md;\r\n box-shadow: $shadow-dropdown;\r\n}\r\n"],sourceRoot:""}]);const s=i},947(e){"use strict";if(void 0===d){var r=new Error("Cannot find module 'fs'");throw r.code="MODULE_NOT_FOUND",r}e.exports=d},958(e,r,n){var t=n(261);e.exports=(t.default||t).apply(t,[])},961(e){"use strict";e.exports=s}},p={};function A(e){var r=p[e];if(void 0!==r)return r.exports;if(void 0===l[e]){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var t=p[e]={id:e,exports:{}};return l[e](t,t.exports,A),t.exports}A.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return A.d(r,{a:r}),r},A.d=(e,r)=>{for(var n in r)A.o(r,n)&&!A.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:r[n]})},A.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),A.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var g={};return(()=>{"use strict";A.r(g),A.d(g,{WorkspaceEditorConfigProvider:()=>s,WorkspaceEditorService:()=>w,WorkspaceEditorSettingsProvider:()=>P,default:()=>L});var e=A(860),r=A(358),n=A(182),t=A(650),o=A(700);const a="tabbyspaces",i="TabbySpaces";let s=class extends t.ConfigProvider{constructor(){super(...arguments),this.defaults={[a]:{workspaces:[]}}}};s=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i}([(0,e.Injectable)()],s);var c=A(765),d=A(349),l=A(961),p=A(439);let u=class{constructor(e){this.app=e,this.pendingCommands=new Map,this.app.tabOpened$.subscribe(e=>this.onTabOpened(e))}registerCommands(e){console.log("[TabbySpaces] Registering commands:",e);for(const r of e)this.pendingCommands.set(r.paneId,r)}onTabOpened(e){if(console.log("[TabbySpaces] Tab opened:",{type:e.constructor.name,title:e.title}),e instanceof t.SplitTabComponent)return console.log("[TabbySpaces] SplitTabComponent detected, waiting for children..."),void setTimeout(()=>this.processChildTabs(e),300);e instanceof d.BaseTerminalTabComponent&&this.processTerminalTab(e)}processChildTabs(e){const r=e.getAllTabs();console.log("[TabbySpaces] Found child tabs:",r.length);for(const e of r)e instanceof d.BaseTerminalTabComponent&&this.processTerminalTab(e)}processTerminalTab(e){const r=e.customTitle||e.title;console.log("[TabbySpaces] Processing terminal tab:",{title:e.title,customTitle:e.customTitle,paneId:r,pendingKeys:[...this.pendingCommands.keys()]});const n=this.pendingCommands.get(r);if(!n)return void console.log("[TabbySpaces] No matching command for paneId:",r);this.pendingCommands.delete(r);const t=this.buildFullCommand(n);if(!t)return void console.log("[TabbySpaces] No command to send (no cwd or startup command)");console.log("[TabbySpaces] Command matched, waiting for shell output...:",t);const o=()=>{console.log("[TabbySpaces] Shell ready, sending command:",t),e.sendInput(t+"\r"),this.clearProfileArgs(e),this.setTabTitle(e,n.originalTitle)};e.session?.output$?e.session.output$.pipe((0,l.first)(),(0,l.timeout)(2e3),(0,p.catchError)(()=>(0,l.of)(null))).subscribe(()=>{setTimeout(o,100)}):(console.log("[TabbySpaces] No session.output$, falling back to timeout"),setTimeout(o,500))}buildFullCommand(e){return e.command||null}clearProfileArgs(e){const r=e.profile;r?.options?.args&&(console.log("[TabbySpaces] Clearing profile args to prevent re-run on split"),r.options.args=[])}setTabTitle(e,r){e.setTitle(r),e.customTitle=r}};u=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i}([(0,e.Injectable)(),function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)}("design:paramtypes",[t.AppService])],u);const m=[{type:"none",value:""},{type:"gradient",value:"linear-gradient(132deg, transparent 83%, rgba(6, 220, 249, 0.18) 100%), linear-gradient(210deg, transparent 85%, rgba(139, 92, 246, 0.2) 100%)"},{type:"gradient",value:"linear-gradient(135deg, rgba(16, 185, 129, 0.15) 0%, transparent 50%)"},{type:"gradient",value:"linear-gradient(45deg, rgba(239, 68, 68, 0.1) 0%, transparent 50%)"},{type:"gradient",value:"linear-gradient(135deg, rgba(59, 130, 246, 0.15) 0%, transparent 50%)"},{type:"gradient",value:"linear-gradient(225deg, transparent 70%, rgba(249, 115, 22, 0.15) 100%)"},{type:"gradient",value:"linear-gradient(180deg, rgba(139, 92, 246, 0.1) 0%, transparent 40%)"},{type:"gradient",value:"linear-gradient(315deg, transparent 80%, rgba(236, 72, 153, 0.15) 100%)"},{type:"gradient",value:"linear-gradient(0deg, rgba(6, 182, 212, 0.12) 0%, transparent 35%)"},{type:"gradient",value:"linear-gradient(45deg, transparent 85%, rgba(234, 179, 8, 0.18) 100%), linear-gradient(225deg, transparent 85%, rgba(249, 115, 22, 0.15) 100%)"},{type:"gradient",value:"linear-gradient(160deg, rgba(34, 197, 94, 0.12) 0%, transparent 40%)"},{type:"gradient",value:"linear-gradient(200deg, transparent 75%, rgba(99, 102, 241, 0.18) 100%)"},{type:"gradient",value:"linear-gradient(135deg, rgba(20, 184, 166, 0.1) 0%, transparent 50%), linear-gradient(315deg, rgba(139, 92, 246, 0.1) 0%, transparent 50%)"},{type:"gradient",value:"linear-gradient(90deg, rgba(239, 68, 68, 0.08) 0%, transparent 30%, transparent 70%, rgba(59, 130, 246, 0.08) 100%)"},{type:"gradient",value:"linear-gradient(180deg, transparent 60%, rgba(16, 185, 129, 0.12) 100%)"},{type:"gradient",value:"linear-gradient(45deg, rgba(168, 85, 247, 0.1) 0%, transparent 40%), linear-gradient(225deg, rgba(6, 182, 212, 0.1) 0%, transparent 40%)"},{type:"gradient",value:"linear-gradient(150deg, transparent 70%, rgba(251, 146, 60, 0.15) 100%), linear-gradient(30deg, transparent 70%, rgba(251, 146, 60, 0.1) 100%)"}];function b(e){return"orientation"in e&&"children"in e}function h(){return{id:x(),profileId:"",cwd:"",startupCommand:""}}function f(e="horizontal"){return{orientation:e,ratios:[.5,.5],children:[h(),h()]}}const C=["#3b82f6","#10b981","#f59e0b","#ef4444","#8b5cf6","#ec4899","#06b6d4","#f97316"],v=["columns","terminal","code","folder","home","briefcase","cog","database","server","cloud","rocket","flask","bug","wrench","cube","layer-group","sitemap","project-diagram"];function x(){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 y(e){return b(e)?e.children.reduce((e,r)=>e+y(r),0):1}function k(e){if(null===e||"object"!=typeof e)return e;if(Array.isArray(e))return e.map(e=>k(e));const r={};for(const n in e)Object.prototype.hasOwnProperty.call(e,n)&&(r[n]=k(e[n]));return r}let w=class{constructor(e,r,n){this.config=e,this.notifications=r,this.profilesService=n,this.cachedProfiles=null,this.cacheTimestamp=0,this.CACHE_TTL=3e4}async getCachedProfiles(){const e=Date.now();return(!this.cachedProfiles||e-this.cacheTimestamp>this.CACHE_TTL)&&(this.cachedProfiles=await this.profilesService.getProfiles(),this.cacheTimestamp=e),this.cachedProfiles}getWorkspaces(){return this.config.store?.[a]?.workspaces??[]}async saveWorkspaces(e){if(!this.config.store?.[a])throw new Error("Config store not initialized");this.config.store[a].workspaces=e,await this.saveConfig()}async addWorkspace(e){try{const r=this.getWorkspaces();r.push(e),await this.saveWorkspaces(r),this.notifications.info(`Workspace "${e.name}" created`)}catch(r){throw this.notifications.error(`Failed to create workspace "${e.name}"`),r}}async updateWorkspace(e){try{const r=this.getWorkspaces(),n=r.findIndex(r=>r.id===e.id);-1!==n&&(r[n]=e,await this.saveWorkspaces(r),this.notifications.info(`Workspace "${e.name}" updated`))}catch(r){throw this.notifications.error(`Failed to update workspace "${e.name}"`),r}}async deleteWorkspace(e){const r=this.getWorkspaces(),n=r.find(r=>r.id===e);try{const t=r.filter(r=>r.id!==e);await this.saveWorkspaces(t),n&&this.notifications.info(`Workspace "${n.name}" deleted`)}catch(r){throw this.notifications.error(`Failed to delete workspace "${n?.name||e}"`),r}}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,r=`split-layout:${a}:`,n=e.filter(e=>!e.id?.startsWith(r));n.length!==e.length&&(this.config.store.profiles=n,this.config.save(),console.log(`[${i}] Cleaned up ${e.length-n.length} orphaned profiles`))}async generateTabbyProfile(e){await this.getCachedProfiles();const r=this.sanitizeForProfileId(e.name);return{id:`split-layout:${a}:${r}:${e.id}`,type:"split-layout",name:e.name,group:i,icon:e.icon,color:e.color,isBuiltin:!1,options:{recoveryToken:this.generateRecoveryToken(e.root,e.name,e.id)}}}generateRecoveryToken(e,r,n){return{type:"app:split-tab",orientation:"horizontal"===e.orientation?"h":"v",ratios:e.ratios,workspaceId:n,children:e.children.map(e=>b(e)?this.generateRecoveryToken(e,r,n):this.generatePaneToken(e,r,n))}}generatePaneToken(e,r,n){const t=this.getProfileById(e.profileId);if(!t)return{type:"app:local-tab",profile:{type:"local",name:"Shell"},savedState:!1};const o={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},a={id:t.id,type:"local",name:t.name||"Shell",group:t.group||"",options:o,icon:t.icon||"",color:t.color||"",disableDynamicTitle:!0,weight:0,isBuiltin:!1,isTemplate:!1,terminalColorScheme:null,behaviorOnSessionEnd:"auto"},i=e.cwd||t.options?.cwd||"";return{type:"app:local-tab",profile:a,savedState:!1,tabTitle:r,tabCustomTitle:e.id,workspaceId:n,disableDynamicTitle:!0,cwd:i}}duplicateWorkspace(e){const r=k(e);return r.id=x(),r.name=`${e.name} (Copy)`,r.launchOnStartup=!1,this.regenerateIds(r.root),r}regenerateIds(e){if(b(e))for(const r of e.children)this.regenerateIds(r);else e.id=x()}sanitizeForProfileId(e){return e.toLowerCase().replace(/[^a-z0-9-]/g,"-").replace(/-+/g,"-").replace(/^-|-$/g,"")||"workspace"}getProfileById(e){const r=e=>"local"===e||e?.startsWith("local:");return(this.config.store?.profiles??[]).find(n=>n.id===e&&r(n.type))||this.cachedProfiles?.find(n=>n.id===e&&r(n.type))}collectStartupCommands(e){const r=[];return this.collectCommandsFromNode(e.root,e.name,r),r}collectCommandsFromNode(e,r,n){if(b(e))for(const t of e.children)this.collectCommandsFromNode(t,r,n);else e.startupCommand&&n.push({paneId:e.id,command:e.startupCommand,originalTitle:r})}async saveConfig(){try{await this.config.save()}catch(e){throw console.error("TabbySpaces save error:",e),e}}};w=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i}([(0,e.Injectable)({providedIn:"root"}),function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)}("design:paramtypes",[t.ConfigService,t.NotificationsService,t.ProfilesService])],w);var $=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i},B=function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)};let E=class{constructor(e){this.modal=e,this.workspaceName=""}};$([(0,e.Input)(),B("design:type",Object)],E.prototype,"workspaceName",void 0),E=$([(0,e.Component)({selector:"delete-confirm-modal",template:'\n <div class="modal-header">\n <h5 class="modal-title">Delete Workspace</h5>\n </div>\n <div class="modal-body">\n <p>Delete workspace "{{ workspaceName }}"?</p>\n <p class="text-muted">This action cannot be undone.</p>\n </div>\n <div class="modal-footer">\n <button class="btn btn-secondary" (click)="modal.dismiss()">Cancel</button>\n <button class="btn btn-danger" (click)="modal.close()" ngbAutofocus>Delete</button>\n </div>\n '}),B("design:paramtypes",[c.NgbActiveModal])],E);let S=class{constructor(e,r,n,t,o,a,i,s){this.config=e,this.workspaceService=r,this.profilesService=n,this.startupService=t,this.modalService=o,this.cdr=a,this.elementRef=i,this.zone=s,this.workspaces=[],this.selectedWorkspace=null,this.editingWorkspace=null,this.isCreatingNew=!1,this.openingWorkspaceId=null,this.displayTabs=[],this.cachedProfiles=[],this.configSubscription=null}async ngOnInit(){this.loadWorkspaces(),this.autoSelectFirst(),this.cachedProfiles=await this.workspaceService.getAvailableProfiles(),this.configSubscription=this.config.changed$.subscribe(()=>{this.zone.run(()=>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=k(e),this.updateDisplayTabs()}isSelected(e){return this.selectedWorkspace?.id===e.id}ngOnDestroy(){this.configSubscription?.unsubscribe()}loadWorkspaces(){const e=this.selectedWorkspace?.id;this.workspaces=this.workspaceService.getWorkspaces(),e&&(this.selectedWorkspace=this.workspaces.find(r=>r.id===e)||null),this.updateDisplayTabs()}createWorkspace(){const e=this.cachedProfiles[0]?.id||"",r=function(e=""){return{id:x(),name:e,icon:v[Math.floor(Math.random()*v.length)],color:C[Math.floor(Math.random()*C.length)],root:f(),launchOnStartup:!1}}();this.setProfileForAllPanes(r.root,e),this.selectedWorkspace=null,this.editingWorkspace=r,this.isCreatingNew=!0,this.updateDisplayTabs(),this.cdr.detectChanges()}setProfileForAllPanes(e,r){b(e)?e.children.forEach(e=>this.setProfileForAllPanes(e,r)):e.profileId=r}editWorkspace(e){this.selectWorkspace(e)}async duplicateWorkspace(e,r){e.stopPropagation();const n=this.workspaceService.duplicateWorkspace(r);await this.workspaceService.addWorkspace(n),this.zone.run(()=>{this.loadWorkspaces();const e=this.workspaces.find(e=>e.id===n.id);e&&this.selectWorkspace(e)})}async deleteWorkspace(e,r){if(e.stopPropagation(),!await this.confirmDelete(r.name))return;const n=this.selectedWorkspace?.id===r.id,t=this.workspaces.findIndex(e=>e.id===r.id);await this.workspaceService.deleteWorkspace(r.id),this.zone.run(()=>{if(this.loadWorkspaces(),0===this.workspaces.length)this.selectedWorkspace=null,this.editingWorkspace=null,this.isCreatingNew=!1;else if(n){const e=Math.min(t,this.workspaces.length-1);this.selectWorkspace(this.workspaces[e])}})}async confirmDelete(e){const r=this.modalService.open(E);r.componentInstance.workspaceName=e;try{return await r.result,!0}catch{return!1}}async onEditorSave(e){this.workspaces.find(r=>r.id===e.id)?await this.workspaceService.updateWorkspace(e):await this.workspaceService.addWorkspace(e),this.zone.run(()=>{this.loadWorkspaces(),this.isCreatingNew=!1;const r=this.workspaces.find(r=>r.id===e.id);r&&this.selectWorkspace(r)})}onEditorCancel(){this.isCreatingNew?(this.isCreatingNew=!1,this.workspaces.length>0?this.selectWorkspace(this.workspaces[0]):(this.selectedWorkspace=null,this.editingWorkspace=null,this.updateDisplayTabs())):this.selectedWorkspace&&(this.editingWorkspace=k(this.selectedWorkspace)),this.cdr.detectChanges()}getPaneCount(e){return y(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}updateDisplayTabs(){const e=this.workspaces.map(e=>({workspace:e,isNew:!1}));this.isCreatingNew&&this.editingWorkspace&&e.push({workspace:this.editingWorkspace,isNew:!0}),this.displayTabs=e}isTabSelected(e){return!!e.isNew||this.selectedWorkspace?.id===e.workspace.id}trackByTab(e,r){return r.isNew?"__new__":r.workspace.id}async openWorkspace(e,r){if(e.stopPropagation(),!this.openingWorkspaceId){this.openingWorkspaceId=r.id;try{const e=this.workspaceService.collectStartupCommands(r);e.length>0&&this.startupService.registerCommands(e);const n=await this.workspaceService.generateTabbyProfile(r);this.zone.run(()=>{this.profilesService.openNewTabForProfile(n)})}finally{this.openingWorkspaceId=null,this.cdr.detectChanges()}}}};S=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i}([(0,e.Component)({selector:"workspace-list",template:A(958),styles:[A(341)]}),function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)}("design:paramtypes",[t.ConfigService,w,t.ProfilesService,u,c.NgbModal,e.ChangeDetectorRef,e.ElementRef,e.NgZone])],S);let P=class extends o.SettingsTabProvider{constructor(){super(...arguments),this.id=a,this.icon="th-large",this.title=i}getComponentType(){return S}};P=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i}([(0,e.Injectable)()],P);let I=class{constructor(e,r){this.app=e,this.workspaceService=r,this.styleElement=null,this.appliedWorkspaces=new Map}initialize(){this.setupTabListeners()}setupTabListeners(){this.app.tabOpened$.subscribe(e=>this.onTabOpened(e)),this.app.tabClosed$.subscribe(e=>this.onTabClosed(e))}onTabOpened(e){e instanceof t.SplitTabComponent&&setTimeout(()=>{const r=this.extractWorkspaceId(e);if(!r)return;const n=this.workspaceService.getWorkspaces().find(e=>e.id===r);n?.background&&"none"!==n.background.type&&this.applyBackground(r,n.background)},200)}onTabClosed(e){if(!(e instanceof t.SplitTabComponent))return;const r=this.extractWorkspaceId(e);r&&this.removeBackground(r)}extractWorkspaceId(e){const r=e;if(r._recoveredState?.workspaceId)return r._recoveredState.workspaceId;const n=`split-layout:${a}:`;for(const r of e.getAllTabs()){const e=r.profile?.id??"";if(e.startsWith(n)){const r=e.split(":");return r[r.length-1]}}}applyBackground(e,r){this.markSplitTabElement(e);const n=this.generateCSS(e,r);this.injectCSS(e,n)}markSplitTabElement(e){const r=document.querySelectorAll("split-tab");for(let n=r.length-1;n>=0;n--){const t=r[n];if(!t.hasAttribute("data-workspace-id")){t.setAttribute("data-workspace-id",e);break}}}generateCSS(e,r){return"none"!==r.type&&r.value?`\n split-tab[data-workspace-id="${e}"] {\n background: ${r.value} !important;\n }\n split-tab[data-workspace-id="${e}"] .xterm-viewport,\n split-tab[data-workspace-id="${e}"] .xterm-screen {\n background: transparent !important;\n }\n `:""}injectCSS(e,r){this.styleElement||(this.styleElement=document.createElement("style"),this.styleElement.id="tabbyspaces-backgrounds",document.head.appendChild(this.styleElement)),this.appliedWorkspaces.set(e,r),this.updateStyleElement()}removeBackground(e){this.appliedWorkspaces.delete(e),this.updateStyleElement()}updateStyleElement(){this.styleElement&&(this.styleElement.textContent=Array.from(this.appliedWorkspaces.values()).join("\n"))}refreshWorkspaceBackground(e){const r=this.workspaceService.getWorkspaces().find(r=>r.id===e);if(r){if(r.background&&"none"!==r.background.type){const n=this.generateCSS(e,r.background);this.appliedWorkspaces.set(e,n)}else this.appliedWorkspaces.delete(e);this.updateStyleElement()}else this.removeBackground(e)}};I=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i}([(0,e.Injectable)({providedIn:"root"}),function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)}("design:paramtypes",[t.AppService,w])],I);const D="__settings__";let O=class extends t.ToolbarButtonProvider{constructor(e,r,n,t,o){super(),this.workspaceService=e,this.profilesService=r,this.app=n,this.startupService=t,this.backgroundService=o,this.backgroundService.initialize(),this.waitForTabbyReady().then(()=>{this.workspaceService.cleanupOrphanedProfiles(),this.launchStartupWorkspaces()})}waitForTabbyReady(){return new Promise(e=>{let r=-1;const n=()=>{const t=this.app.tabs.length;t===r&&t>=0?e():(r=t,setTimeout(n,300))};setTimeout(n,500)})}async launchStartupWorkspaces(){const e=this.workspaceService.getWorkspaces().filter(e=>e.launchOnStartup);for(const r of e)this.isWorkspaceAlreadyOpen(r.id)?console.log(`[TabbySpaces] Workspace "${r.name}" already open, skipping`):await this.openWorkspace(r.id)}getRecoveryWorkspaceId(e){if(e&&"object"==typeof e&&"recoveryToken"in e){const r=e.recoveryToken;return r?.workspaceId}}isWorkspaceAlreadyOpen(e){const r=`split-layout:${a}:`;for(const n of this.app.tabs)if(n instanceof t.SplitTabComponent){if(this.getRecoveryWorkspaceId(n)===e)return!0;for(const t of n.getAllTabs())if(t instanceof d.BaseTerminalTabComponent){const n=t.profile?.id??"";if(n.startsWith(r)&&n.endsWith(`:${e}`))return!0}}return!1}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:i,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:`${y(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:D});const n=await this.app.showSelector("Select Workspace",r);n===D?this.openSettings():n&&this.openWorkspace(n)}openSettings(){this.app.openNewTabRaw({type:o.SettingsTabComponent,inputs:{activeTab:a}})}async openWorkspace(e){const r=this.workspaceService.getWorkspaces().find(r=>r.id===e);if(!r)return;const n=this.workspaceService.collectStartupCommands(r);n.length>0&&this.startupService.registerCommands(n);const t=await this.workspaceService.generateTabbyProfile(r);this.profilesService.openNewTabForProfile(t)}};O=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i}([(0,e.Injectable)(),function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)}("design:paramtypes",[w,t.ProfilesService,t.AppService,u,I])],O);var T=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i},W=function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)};let R=class{constructor(r,n,t){this.workspaceService=r,this.elementRef=n,this.cdr=t,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,this.backgroundPresets=m,this.backgroundDropdownOpen=!1,this.customBackgroundValue=""}onDocumentClick(e){const r=this.elementRef.nativeElement.querySelector(".dropdown-trigger"),n=this.elementRef.nativeElement.querySelector(".icon-dropdown"),t=r?.contains(e.target)||n?.contains(e.target);this.iconDropdownOpen&&!t&&(this.iconDropdownOpen=!1);const o=this.elementRef.nativeElement.querySelector(".background-trigger"),a=this.elementRef.nativeElement.querySelector(".background-dropdown"),i=o?.contains(e.target)||a?.contains(e.target);this.backgroundDropdownOpen&&!i&&(this.backgroundDropdownOpen=!1)}toggleIconDropdown(){this.iconDropdownOpen=!this.iconDropdownOpen}selectIcon(e){this.workspace.icon=e,this.iconDropdownOpen=!1}toggleBackgroundDropdown(){this.backgroundDropdownOpen=!this.backgroundDropdownOpen}selectBackgroundPreset(e){"none"===e.type?(this.workspace.background=void 0,this.customBackgroundValue=""):(this.workspace.background={...e},this.customBackgroundValue=e.value),this.backgroundDropdownOpen=!1}applyCustomBackground(){const e=this.customBackgroundValue.trim();this.workspace.background=e?{type:"gradient",value:e}:void 0}clearBackground(){this.workspace.background=void 0,this.customBackgroundValue=""}isBackgroundSelected(e){return"none"===e.type?!this.workspace.background||"none"===this.workspace.background.type:this.workspace.background?.value===e.value}async ngOnInit(){this.profiles=await this.workspaceService.getAvailableProfiles(),this.initializeWorkspace(),this.cdr.detectChanges()}ngAfterViewInit(){this.autoFocus&&this.focusNameInput()}focusNameInput(){requestAnimationFrame(()=>{setTimeout(()=>{this.nameInput?.nativeElement&&(this.nameInput.nativeElement.focus(),this.nameInput.nativeElement.select())},0)})}ngOnChanges(e){if(e.workspace&&!e.workspace.firstChange){const r=e.workspace.previousValue?.id;r!==this.workspace.id?(this.selectedPaneId=null,this.editingPane=null,this.showPaneEditor=!1,this.focusNameInput()):this.selectedPaneId&&this.showPaneEditor&&(this.editingPane=this.findPaneById(this.selectedPaneId)),this.iconDropdownOpen=!1,this.backgroundDropdownOpen=!1,this.customBackgroundValue=this.workspace.background?.value||"",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()}deselectPane(){this.selectedPaneId=null}onPreviewBackgroundClick(){this.deselectPane(),this.closePaneEditor()}editPane(e){this.selectedPaneId=e.id,this.editingPane=e,this.showPaneEditor=!0,this.cdr.detectChanges()}closePaneEditor(){this.showPaneEditor=!1,this.editingPane=null,this.cdr.detectChanges()}findPaneById(e){return this.findPaneInNode(this.workspace.root,e)}findPaneInNode(e,r){for(const n of e.children)if(b(n)){const e=this.findPaneInNode(n,r);if(e)return e}else if(n.id===r)return n;return null}canRemovePane(){return this.countPanes(this.workspace.root)>1}countPanes(e){return e.children.reduce((e,r)=>e+(b(r)?this.countPanes(r):1),0)}walkTree(e,r,n=null){for(let t=0;t<e.children.length;t++){const o=e.children[t],a={node:e,index:t,parent:n,child:o};if(b(o)){if(this.walkTree(o,r,e))return!0}else if(r(a))return!0}return!1}updatePaneInTree(e){return this.walkTree(this.workspace.root,r=>r.child.id===e.id&&(r.node.children[r.index]=e,!0))}splitPane(e,r){this.splitPaneInTree(e,r),this.cdr.detectChanges()}splitSelectedPane(e){if(!this.selectedPaneId)return;const r=this.findPaneById(this.selectedPaneId);r&&this.splitPane(r,e)}splitPaneInTree(e,r){return this.walkTree(this.workspace.root,n=>{if(n.child.id===e.id){const e=h();e.profileId=n.child.profileId;const t={orientation:r,ratios:[.5,.5],children:[n.child,e]};return n.node.children[n.index]=t,this.recalculateRatios(n.node),!0}return!1})}removePane(e){this.selectedPaneId===e.id&&(this.selectedPaneId=null),this.removePaneFromTree(this.workspace.root,e),this.cdr.detectChanges()}removeSelectedPane(){if(!this.selectedPaneId||!this.canRemovePane())return;const e=this.findPaneById(this.selectedPaneId);e&&this.removePane(e)}removePaneFromTree(e,r){for(let n=0;n<e.children.length;n++){const t=e.children[n];if(b(t)){const o=t.children.findIndex(e=>!b(e)&&e.id===r.id);if(-1!==o&&t.children.length>1)return t.children.splice(o,1),this.recalculateRatios(t),1===t.children.length&&(e.children[n]=t.children[0]),!0;if(this.removePaneFromTree(t,r))return!0}else if(t.id===r.id&&e.children.length>1)return e.children.splice(n,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,this.cdr.detectChanges()}updateRatio(e,r){const n=[...this.workspace.root.ratios],t=r-n[e];e<n.length-1?(n[e]=r,n[e+1]-=t):(n[e]=r,n[e-1]-=t),n.forEach((e,r)=>{n[r]=Math.max(.1,Math.min(.9,e))}),this.workspace.root.ratios=n,this.cdr.detectChanges()}addPane(e){if(!this.selectedPaneId)return;const r=this.findPaneById(this.selectedPaneId);r&&(this.addPaneInTree(r,e),this.cdr.detectChanges())}addPaneFromEvent(e,r){this.addPaneInTree(e,r),this.cdr.detectChanges()}addPaneInTree(e,r){const n="left"===r||"top"===r,t="left"===r||"right"===r?"horizontal":"vertical";return this.walkTree(this.workspace.root,r=>{if(r.child.id!==e.id)return!1;const o=h();if(o.profileId=r.child.profileId,r.node.orientation===t){const e=n?r.index:r.index+1;r.node.children.splice(e,0,o),this.recalculateRatios(r.node)}else{const e={orientation:r.node.orientation,ratios:[...r.node.ratios],children:[...r.node.children]},a={orientation:t,ratios:[.5,.5],children:n?[o,e]:[e,o]};if(r.node===this.workspace.root)this.workspace.root=a;else if(r.parent){const e=r.parent.children.indexOf(r.node);-1!==e&&(r.parent.children[e]=a)}}return!0})}};T([(0,e.Input)(),W("design:type",Object)],R.prototype,"workspace",void 0),T([(0,e.Input)(),W("design:type",Object)],R.prototype,"autoFocus",void 0),T([(0,e.Input)(),W("design:type",Object)],R.prototype,"hasUnsavedChanges",void 0),T([(0,e.Output)(),W("design:type",Object)],R.prototype,"save",void 0),T([(0,e.Output)(),W("design:type",Object)],R.prototype,"cancel",void 0),T([(0,e.ViewChild)("nameInput"),W("design:type",e.ElementRef)],R.prototype,"nameInput",void 0),T([(0,e.HostListener)("document:click",["$event"]),W("design:type",Function),W("design:paramtypes",[MouseEvent]),W("design:returntype",void 0)],R.prototype,"onDocumentClick",null),R=T([(0,e.Component)({selector:"workspace-editor",template:A(801),styles:[A(840)]}),W("design:paramtypes",[w,e.ElementRef,e.ChangeDetectorRef])],R);var z=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i},F=function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)};let N=class{constructor(){this.profiles=[],this.close=new e.EventEmitter}onEscapeKey(){this.close.emit()}getProfileName(e){const r=this.profiles.find(r=>r.id===e);return r?.name??"Unknown"}};z([(0,e.Input)(),F("design:type",Object)],N.prototype,"pane",void 0),z([(0,e.Input)(),F("design:type",Array)],N.prototype,"profiles",void 0),z([(0,e.Output)(),F("design:type",Object)],N.prototype,"close",void 0),z([(0,e.HostListener)("document:keydown.escape"),F("design:type",Function),F("design:paramtypes",[]),F("design:returntype",void 0)],N.prototype,"onEscapeKey",null),N=z([(0,e.Component)({selector:"pane-editor",template:A(864),styles:[A(33)]})],N);var j=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i},M=function(e,r){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(e,r)};let q=class{constructor(r){this.cdr=r,this.depth=0,this.selectedPaneId=null,this.profiles=[],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}}ngOnChanges(e){e.split&&this.closeContextMenu()}isPane(e){return!b(e)}isSplit(e){return b(e)}asSplit(e){return e}asPane(e){return e}getFlexStyle(e){return 100*this.split.ratios[e]+"%"}onPaneClick(e){this.paneEdit.emit(e)}truncate(e,r){return e.length>r?e.substring(0,r)+"...":e}onContextMenu(e,r){e.preventDefault(),this.contextMenuPane=r,this.contextMenuPosition={x:e.clientX,y:e.clientY}}closeContextMenu(){this.contextMenuPane=null,this.cdr.detectChanges()}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){if(!e.profileId)return"Select profile";const r=this.profiles.find(r=>r.id===e.profileId);return r?.name||"Select profile"}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)}};j([(0,e.Input)(),M("design:type",Object)],q.prototype,"split",void 0),j([(0,e.Input)(),M("design:type",Object)],q.prototype,"depth",void 0),j([(0,e.Input)(),M("design:type",Object)],q.prototype,"selectedPaneId",void 0),j([(0,e.Input)(),M("design:type",Array)],q.prototype,"profiles",void 0),j([(0,e.Output)(),M("design:type",Object)],q.prototype,"paneEdit",void 0),j([(0,e.Output)(),M("design:type",Object)],q.prototype,"splitHorizontal",void 0),j([(0,e.Output)(),M("design:type",Object)],q.prototype,"splitVertical",void 0),j([(0,e.Output)(),M("design:type",Object)],q.prototype,"removePane",void 0),j([(0,e.Output)(),M("design:type",Object)],q.prototype,"addLeft",void 0),j([(0,e.Output)(),M("design:type",Object)],q.prototype,"addRight",void 0),j([(0,e.Output)(),M("design:type",Object)],q.prototype,"addTop",void 0),j([(0,e.Output)(),M("design:type",Object)],q.prototype,"addBottom",void 0),q=j([(0,e.Component)({selector:"split-preview",template:A(581),styles:[A(210)]}),M("design:paramtypes",[e.ChangeDetectorRef])],q);let U=class{};U=function(e,r,n,t){var o,a=arguments.length,i=a<3?r:null===t?t=Object.getOwnPropertyDescriptor(r,n):t;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)i=Reflect.decorate(e,r,n,t);else for(var s=e.length-1;s>=0;s--)(o=e[s])&&(i=(a<3?o(i):a>3?o(r,n,i):o(r,n))||i);return a>3&&i&&Object.defineProperty(r,n,i),i}([(0,e.NgModule)({imports:[r.CommonModule,n.FormsModule],providers:[{provide:t.ConfigProvider,useClass:s,multi:!0},{provide:o.SettingsTabProvider,useClass:P,multi:!0},{provide:t.ToolbarButtonProvider,useClass:O,multi:!0},w,u,I],declarations:[S,R,N,q,E]})],U);const L=U})(),g})());
3
3
  //# sourceMappingURL=index.js.map
@@ -39,5 +39,5 @@
39
39
  /*! fs */
40
40
 
41
41
  /*!***********************************!*\
42
- !*** ./src/index.ts + 11 modules ***!
42
+ !*** ./src/index.ts + 13 modules ***!
43
43
  \***********************************/