tabby-tabbyspaces 0.2.3 → 0.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  /*! For license information please see index.js.LICENSE.txt */
2
- !function(e,r){if("object"==typeof exports&&"object"==typeof module)module.exports=r(require("@angular/core"),require("@angular/common"),require("@angular/forms"),require("tabby-core"),require("tabby-settings"),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,l)=>(()=>{var d={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;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,WC3QW,CD+Qb,gBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,gBChRW,CDiRX,kEAAA,CACA,eClRW,CDqRb,gBACE,YAAA,CACA,kBAAA,CACA,OC3RW,CD6RX,qCACE,UAAA,CACA,WAAA,CACA,QAAA,CAGF,sBACE,eCrPM,CDsPN,qBAAA,CACA,cAAA,CAIJ,sBACE,YAAA,CACA,OC3SW,CD6SX,iCE3NA,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,CF8MF,mCE/NA,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,CDoSpB,yCACE,aCpSY,CDqSZ,gBAAA,CACA,eC3TS",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 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%;min-height:140px;gap:4px;border-radius:3px;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{min-height:0;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,gBCqCe,CDpCf,OCFW,CDGX,iBCQU,CDPV,0BAAA,CACA,8DAAA,CAEA,0BACE,kBAAA,CAGF,wBACE,qBAAA,CAGF,sBACE,YAAA,CACA,sCAAA,CACA,8BCqBc,CDpBd,WCnBS,CDoBT,iBCVQ,CDcZ,cErBE,YAAA,CACA,kBAAA,CACA,sBAAA,CFqBA,+BAAA,CACA,iBCjBU,CDkBV,8DAAA,CACA,cAAA,CACA,mBAAA,CACA,iBAAA,CACA,eAAA,CAEA,oBACE,oCAAA,CACA,2DAAA,CAGF,uBACE,iCAAA,CACA,yFAAA,CAQJ,cACE,iBAAA,CACA,WClDW,CDmDX,qBAAA,CACA,cAAA,CACA,eAAA,CAGF,YACE,gBAAA,CACA,eAAA,CACA,iBC5DW,CCiKX,kBAAA,CACA,eAAA,CACA,sBAAA,CFnGF,0BAEE,eAAA,CACA,eAAA,CACA,iBCrEW,CCkKX,kBAAA,CACA,eAAA,CACA,sBAAA,CF3FF,cACE,eAAA,CACA,UAAA,CACA,cC3EW,CD6EX,2BE1EA,YAAA,CACA,kBAAA,CACA,sBAAA,CF0EE,OC/ES,CDiFT,6BACE,UAAA,CACA,iBAAA,CACA,gBAAA,CAGF,gCE0EF,kBAAA,CACA,eAAA,CACA,sBAAA,CF1EI,eAAA,CAMN,sBEqDE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,YDlGuB,CD4CzB,cACE,cAAA,CACA,0BAAA,CACA,8DAAA,CACA,iBC3FU,CD4FV,eCzEoB,CD0EpB,eAAA,CACA,WC1GW,CD2GX,YCnDe,CDsDjB,mBACE,YAAA,CACA,kBAAA,CACA,QC/GW,CDgHX,UAAA,CACA,gBAAA,CACA,WAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,cAAA,CACA,iBChHU,CDkHV,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 min-height: $preview-height;\r\n gap: $spacing-sm;\r\n border-radius: $radius-md;\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 min-height: 0;\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 l=0;l<e.length;l++){var d=[].concat(e[l]);t&&i[d[0]]||(void 0!==a&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=a),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),o&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=o):d[4]="".concat(o)),r.push(d))}},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,l;try{a=a||n(947).readFileSync(t,{encoding:"utf8"}),i=3,s=a.split("\n"),c=Math.max(o-i,0),l=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,l).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===l){var r=new Error("Cannot find module 'fs'");throw r.code="MODULE_NOT_FOUND",r}e.exports=l},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===d[e]){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var t=p[e]={id:e,exports:{}};return d[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),l=A(349),d=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 l.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 l.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,d.first)(),(0,d.timeout)(2e3),(0,p.catchError)(()=>(0,d.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`)),this.repairCorruptedRatios()}repairCorruptedRatios(){const e=this.getWorkspaces();let r=!1;for(const n of e)this.repairSplitRatios(n.root)&&(r=!0,console.log(`[${i}] Repaired corrupted ratios in workspace "${n.name}"`));r&&this.config.save()}repairSplitRatios(e){let r=!1;for(const n of e.children)b(n)&&this.repairSplitRatios(n)&&(r=!0);return e.ratios.length!==e.children.length&&(e.ratios=e.children.map(()=>1/e.children.length),r=!0),r}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 T=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 l.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)}};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}([(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])],T);var 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},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})}};O([(0,e.Input)(),W("design:type",Object)],R.prototype,"workspace",void 0),O([(0,e.Input)(),W("design:type",Object)],R.prototype,"autoFocus",void 0),O([(0,e.Input)(),W("design:type",Object)],R.prototype,"hasUnsavedChanges",void 0),O([(0,e.Output)(),W("design:type",Object)],R.prototype,"save",void 0),O([(0,e.Output)(),W("design:type",Object)],R.prototype,"cancel",void 0),O([(0,e.ViewChild)("nameInput"),W("design:type",e.ElementRef)],R.prototype,"nameInput",void 0),O([(0,e.HostListener)("document:click",["$event"]),W("design:type",Function),W("design:paramtypes",[MouseEvent]),W("design:returntype",void 0)],R.prototype,"onDocumentClick",null),R=O([(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 M=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},j=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)}};M([(0,e.Input)(),j("design:type",Object)],q.prototype,"split",void 0),M([(0,e.Input)(),j("design:type",Object)],q.prototype,"depth",void 0),M([(0,e.Input)(),j("design:type",Object)],q.prototype,"selectedPaneId",void 0),M([(0,e.Input)(),j("design:type",Array)],q.prototype,"profiles",void 0),M([(0,e.Output)(),j("design:type",Object)],q.prototype,"paneEdit",void 0),M([(0,e.Output)(),j("design:type",Object)],q.prototype,"splitHorizontal",void 0),M([(0,e.Output)(),j("design:type",Object)],q.prototype,"splitVertical",void 0),M([(0,e.Output)(),j("design:type",Object)],q.prototype,"removePane",void 0),M([(0,e.Output)(),j("design:type",Object)],q.prototype,"addLeft",void 0),M([(0,e.Output)(),j("design:type",Object)],q.prototype,"addRight",void 0),M([(0,e.Output)(),j("design:type",Object)],q.prototype,"addTop",void 0),M([(0,e.Output)(),j("design:type",Object)],q.prototype,"addBottom",void 0),q=M([(0,e.Component)({selector:"split-preview",template:A(581),styles:[A(210)]}),j("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:T,multi:!0},w,u,I],declarations:[S,R,N,q,E]})],U);const L=U})(),g})());
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,l)=>(()=>{var d={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;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,WC3QW,CD+Qb,gBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,gBChRW,CDiRX,kEAAA,CACA,eClRW,CDqRb,gBACE,YAAA,CACA,kBAAA,CACA,OC3RW,CD6RX,qCACE,UAAA,CACA,WAAA,CACA,QAAA,CAGF,sBACE,eCrPM,CDsPN,qBAAA,CACA,cAAA,CAIJ,sBACE,YAAA,CACA,OC3SW,CD6SX,iCE3NA,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,CF8MF,mCE/NA,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,CDoSpB,yCACE,aCpSY,CDqSZ,gBAAA,CACA,eC3TS",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 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 or /home/user/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%;min-height:140px;gap:4px;border-radius:3px;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{min-height:0;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,gBCqCe,CDpCf,OCFW,CDGX,iBCQU,CDPV,0BAAA,CACA,8DAAA,CAEA,0BACE,kBAAA,CAGF,wBACE,qBAAA,CAGF,sBACE,YAAA,CACA,sCAAA,CACA,8BCqBc,CDpBd,WCnBS,CDoBT,iBCVQ,CDcZ,cErBE,YAAA,CACA,kBAAA,CACA,sBAAA,CFqBA,+BAAA,CACA,iBCjBU,CDkBV,8DAAA,CACA,cAAA,CACA,mBAAA,CACA,iBAAA,CACA,eAAA,CAEA,oBACE,oCAAA,CACA,2DAAA,CAGF,uBACE,iCAAA,CACA,yFAAA,CAQJ,cACE,iBAAA,CACA,WClDW,CDmDX,qBAAA,CACA,cAAA,CACA,eAAA,CAGF,YACE,gBAAA,CACA,eAAA,CACA,iBC5DW,CCiKX,kBAAA,CACA,eAAA,CACA,sBAAA,CFnGF,0BAEE,eAAA,CACA,eAAA,CACA,iBCrEW,CCkKX,kBAAA,CACA,eAAA,CACA,sBAAA,CF3FF,cACE,eAAA,CACA,UAAA,CACA,cC3EW,CD6EX,2BE1EA,YAAA,CACA,kBAAA,CACA,sBAAA,CF0EE,OC/ES,CDiFT,6BACE,UAAA,CACA,iBAAA,CACA,gBAAA,CAGF,gCE0EF,kBAAA,CACA,eAAA,CACA,sBAAA,CF1EI,eAAA,CAMN,sBEqDE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,YDlGuB,CD4CzB,cACE,cAAA,CACA,0BAAA,CACA,8DAAA,CACA,iBC3FU,CD4FV,eCzEoB,CD0EpB,eAAA,CACA,WC1GW,CD2GX,YCnDe,CDsDjB,mBACE,YAAA,CACA,kBAAA,CACA,QC/GW,CDgHX,UAAA,CACA,gBAAA,CACA,WAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,cAAA,CACA,iBChHU,CDkHV,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 min-height: $preview-height;\r\n gap: $spacing-sm;\r\n border-radius: $radius-md;\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 min-height: 0;\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 l=0;l<e.length;l++){var d=[].concat(e[l]);t&&i[d[0]]||(void 0!==a&&(void 0===d[5]||(d[1]="@layer".concat(d[5].length>0?" ".concat(d[5]):""," {").concat(d[1],"}")),d[5]=a),n&&(d[2]?(d[1]="@media ".concat(d[2]," {").concat(d[1],"}"),d[2]=n):d[2]=n),o&&(d[4]?(d[1]="@supports (".concat(d[4],") {").concat(d[1],"}"),d[4]=o):d[4]="".concat(o)),r.push(d))}},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,l;try{a=a||n(947).readFileSync(t,{encoding:"utf8"}),i=3,s=a.split("\n"),c=Math.max(o-i,0),l=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,l).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===l){var r=new Error("Cannot find module 'fs'");throw r.code="MODULE_NOT_FOUND",r}e.exports=l},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===d[e]){var n=new Error("Cannot find module '"+e+"'");throw n.code="MODULE_NOT_FOUND",n}var t=p[e]={id:e,exports:{}};return d[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),l=A(349),d=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 l.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 l.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,d.first)(),(0,d.timeout)(2e3),(0,p.catchError)(()=>(0,d.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`)),this.repairCorruptedRatios()}repairCorruptedRatios(){const e=this.getWorkspaces();let r=!1;for(const n of e)this.repairSplitRatios(n.root)&&(r=!0,console.log(`[${i}] Repaired corrupted ratios in workspace "${n.name}"`));r&&this.config.save()}repairSplitRatios(e){let r=!1;for(const n of e.children)b(n)&&this.repairSplitRatios(n)&&(r=!0);return e.ratios.length!==e.children.length&&(e.ratios=e.children.map(()=>1/e.children.length),r=!0),r}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=e.cwd||t.options?.cwd||"",a=this.isWslProfile(t),i=t.options?.args||[],s={restoreFromPTYID:!1,command:t.options?.command||"",args:a&&o?[...i,"--cd",o]:i,cwd:a?"":o,env:t.options?.env||{},width:null,height:null,pauseAfterExit:!1,runAsAdministrator:!1};return{type:"app:local-tab",profile:{id:t.id,type:"local",name:t.name||"Shell",group:t.group||"",options:s,icon:t.icon||"",color:t.color||"",disableDynamicTitle:!0,weight:0,isBuiltin:!1,isTemplate:!1,terminalColorScheme:null,behaviorOnSessionEnd:"auto"},savedState:!1,tabTitle:r,tabCustomTitle:e.id,workspaceId:n,disableDynamicTitle:!0,cwd:a?"":o}}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"}isWslProfile(e){return e.id?.startsWith("local:wsl")??!1}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 T=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 l.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)}};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}([(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])],T);var 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},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})}};O([(0,e.Input)(),W("design:type",Object)],R.prototype,"workspace",void 0),O([(0,e.Input)(),W("design:type",Object)],R.prototype,"autoFocus",void 0),O([(0,e.Input)(),W("design:type",Object)],R.prototype,"hasUnsavedChanges",void 0),O([(0,e.Output)(),W("design:type",Object)],R.prototype,"save",void 0),O([(0,e.Output)(),W("design:type",Object)],R.prototype,"cancel",void 0),O([(0,e.ViewChild)("nameInput"),W("design:type",e.ElementRef)],R.prototype,"nameInput",void 0),O([(0,e.HostListener)("document:click",["$event"]),W("design:type",Function),W("design:paramtypes",[MouseEvent]),W("design:returntype",void 0)],R.prototype,"onDocumentClick",null),R=O([(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:T,multi:!0},w,u,I],declarations:[S,R,N,q,E]})],U);const L=U})(),g})());
3
3
  //# sourceMappingURL=index.js.map