tabby-tabbyspaces 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/.claude/settings.local.json +28 -2
  2. package/CHANGELOG.md +46 -20
  3. package/CLAUDE.md +163 -15
  4. package/README.md +71 -61
  5. package/RELEASE.md +91 -0
  6. package/TEST_MCP.md +176 -0
  7. package/TODO.md +72 -0
  8. package/cdp-click.js +22 -0
  9. package/cdp-test.js +28 -0
  10. package/dist/components/paneEditor.component.d.ts +6 -1
  11. package/dist/components/paneEditor.component.d.ts.map +1 -1
  12. package/dist/components/splitPreview.component.d.ts +22 -7
  13. package/dist/components/splitPreview.component.d.ts.map +1 -1
  14. package/dist/components/workspaceEditor.component.d.ts +30 -4
  15. package/dist/components/workspaceEditor.component.d.ts.map +1 -1
  16. package/dist/components/workspaceList.component.d.ts +21 -9
  17. package/dist/components/workspaceList.component.d.ts.map +1 -1
  18. package/dist/index.d.ts.map +1 -1
  19. package/dist/index.js +1 -1
  20. package/dist/index.js.LICENSE.txt +1 -1
  21. package/dist/index.js.map +1 -1
  22. package/dist/models/workspace.model.d.ts +4 -2
  23. package/dist/models/workspace.model.d.ts.map +1 -1
  24. package/dist/package.json +26 -0
  25. package/dist/providers/settings.provider.d.ts.map +1 -1
  26. package/dist/providers/toolbar.provider.d.ts +4 -1
  27. package/dist/providers/toolbar.provider.d.ts.map +1 -1
  28. package/dist/services/startupCommand.service.d.ts +20 -0
  29. package/dist/services/startupCommand.service.d.ts.map +1 -0
  30. package/dist/services/workspaceEditor.service.d.ts +11 -3
  31. package/dist/services/workspaceEditor.service.d.ts.map +1 -1
  32. package/docs/marketing_status.md +92 -0
  33. package/package.json +2 -7
  34. package/screenshots/editor.png +0 -0
  35. package/screenshots/pane-edit.png +0 -0
  36. package/scripts/build-prod.js +39 -0
  37. package/src/components/paneEditor.component.pug +2 -2
  38. package/src/components/paneEditor.component.ts +19 -1
  39. package/src/components/splitPreview.component.pug +45 -5
  40. package/src/components/splitPreview.component.scss +79 -22
  41. package/src/components/splitPreview.component.ts +91 -16
  42. package/src/components/workspaceEditor.component.pug +130 -70
  43. package/src/components/workspaceEditor.component.scss +205 -120
  44. package/src/components/workspaceEditor.component.ts +193 -6
  45. package/src/components/workspaceList.component.pug +31 -20
  46. package/src/components/workspaceList.component.scss +12 -6
  47. package/src/components/workspaceList.component.ts +116 -34
  48. package/src/index.ts +2 -0
  49. package/src/models/workspace.model.ts +33 -6
  50. package/src/providers/settings.provider.ts +2 -2
  51. package/src/providers/toolbar.provider.ts +41 -10
  52. package/src/services/startupCommand.service.ts +142 -0
  53. package/src/services/workspaceEditor.service.ts +70 -38
  54. package/test_cdp.py +50 -0
  55. package/RELEASE_PLAN.md +0 -161
  56. package/screenshots/workspace-edit.png +0 -0
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","mappings":"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","sources":["webpack://tabby-tabbyspaces/webpack/universalModuleDefinition","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.scss","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.scss?5edd","webpack://tabby-tabbyspaces/external umd \"@angular/forms\"","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.scss?0de1","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.pug","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.pug","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.pug","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.scss","webpack://tabby-tabbyspaces/./node_modules/css-loader/dist/runtime/api.js","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.scss?e911","webpack://tabby-tabbyspaces/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://tabby-tabbyspaces/external umd \"@angular/common\"","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.scss","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.pug","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.pug?8802","webpack://tabby-tabbyspaces/external umd \"tabby-core\"","webpack://tabby-tabbyspaces/external umd \"tabby-settings\"","webpack://tabby-tabbyspaces/./node_modules/pug-runtime/index.js","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.pug?b08a","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.scss?c31e","webpack://tabby-tabbyspaces/external umd \"@angular/core\"","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.pug?4d23","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.scss","webpack://tabby-tabbyspaces/external umd \"fs\"","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.pug?e89b","webpack://tabby-tabbyspaces/webpack/bootstrap","webpack://tabby-tabbyspaces/webpack/runtime/compat get default export","webpack://tabby-tabbyspaces/webpack/runtime/define property getters","webpack://tabby-tabbyspaces/webpack/runtime/hasOwnProperty shorthand","webpack://tabby-tabbyspaces/webpack/runtime/make namespace object","webpack://tabby-tabbyspaces/./src/build-config.ts","webpack://tabby-tabbyspaces/./src/providers/config.provider.ts","webpack://tabby-tabbyspaces/./src/models/workspace.model.ts","webpack://tabby-tabbyspaces/./src/services/workspaceEditor.service.ts","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.ts","webpack://tabby-tabbyspaces/./src/providers/settings.provider.ts","webpack://tabby-tabbyspaces/./src/providers/toolbar.provider.ts","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.ts","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.ts","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.ts","webpack://tabby-tabbyspaces/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@angular/core\"), require(\"@angular/common\"), require(\"@angular/forms\"), require(\"tabby-core\"), require(\"tabby-settings\"), (function webpackLoadOptionalExternalModule() { try { return require(\"fs\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@angular/core\", \"@angular/common\", \"@angular/forms\", \"tabby-core\", \"tabby-settings\", \"fs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"@angular/core\"), require(\"@angular/common\"), require(\"@angular/forms\"), require(\"tabby-core\"), require(\"tabby-settings\"), (function webpackLoadOptionalExternalModule() { try { return require(\"fs\"); } catch(e) {} }())) : factory(root[\"@angular/core\"], root[\"@angular/common\"], root[\"@angular/forms\"], root[\"tabby-core\"], root[\"tabby-settings\"], root[\"fs\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(global, (__WEBPACK_EXTERNAL_MODULE__860__, __WEBPACK_EXTERNAL_MODULE__358__, __WEBPACK_EXTERNAL_MODULE__182__, __WEBPACK_EXTERNAL_MODULE__650__, __WEBPACK_EXTERNAL_MODULE__700__, __WEBPACK_EXTERNAL_MODULE__947__) => {\nreturn ","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.workspace-editor-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.6);display:flex;align-items:center;justify-content:center;z-index:1000}.workspace-editor-modal{background:var(--theme-bg);border-radius:12px;width:90%;max-width:700px;max-height:90vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.4)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--theme-border)}.modal-header h4{margin:0;font-size:1.25rem}.modal-header .close-btn{font-size:1.25rem;color:var(--theme-fg-more);padding:4px 8px}.modal-header .close-btn:hover{color:var(--theme-fg)}.modal-body{padding:20px;overflow-y:auto;flex:1}.form-row{display:flex;gap:16px;margin-bottom:16px}.form-row:last-child{margin-bottom:0}.form-group{display:flex;flex-direction:column;gap:6px}.form-group.flex-grow{flex:1}.form-group label{font-size:.9rem;color:var(--theme-fg-more)}.form-group input[type=checkbox]{margin-right:8px}.form-control{padding:8px 12px;border-radius:6px;border:1px solid var(--theme-border);background:var(--theme-bg-more);color:var(--theme-fg);font-size:.95rem}.form-control:focus{outline:none;border-color:var(--theme-primary)}.color-input{width:60px;height:36px;padding:2px;cursor:pointer}.icon-selector{display:flex;flex-wrap:wrap;gap:4px}.icon-option{width:36px;height:36px;display:flex;align-items:center;justify-content:center;border:1px solid var(--theme-border);border-radius:6px;background:var(--theme-bg-more);color:var(--theme-fg-more);cursor:pointer;transition:all .2s}.icon-option:hover{background:var(--theme-bg-more-more);color:var(--theme-fg)}.icon-option.selected{border-color:var(--theme-primary);background:var(--theme-primary);color:#fff}.form-section{margin-top:20px}.form-section .section-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:12px}.form-section .section-header h5{margin:0;font-size:1rem}.orientation-toggle{display:flex;gap:8px}.orientation-toggle .btn{display:flex;align-items:center;gap:6px}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 20px;border-top:1px solid var(--theme-border)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/workspaceEditor.component.scss\"],\"names\":[],\"mappings\":\"AAAA,0BACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,yBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,YAAA,CAGF,wBACE,0BAAA,CACA,kBAAA,CACA,SAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,YAAA,CACA,qBAAA,CACA,qCAAA,CAGF,cACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CACA,2CAAA,CAEA,iBACE,QAAA,CACA,iBAAA,CAGF,yBACE,iBAAA,CACA,0BAAA,CACA,eAAA,CAEA,+BACE,qBAAA,CAKN,YACE,YAAA,CACA,eAAA,CACA,MAAA,CAGF,UACE,YAAA,CACA,QAAA,CACA,kBAAA,CAEA,qBACE,eAAA,CAIJ,YACE,YAAA,CACA,qBAAA,CACA,OAAA,CAEA,sBACE,MAAA,CAGF,kBACE,eAAA,CACA,0BAAA,CAGF,iCACE,gBAAA,CAIJ,cACE,gBAAA,CACA,iBAAA,CACA,oCAAA,CACA,+BAAA,CACA,qBAAA,CACA,gBAAA,CAEA,oBACE,YAAA,CACA,iCAAA,CAIJ,aACE,UAAA,CACA,WAAA,CACA,WAAA,CACA,cAAA,CAGF,eACE,YAAA,CACA,cAAA,CACA,OAAA,CAGF,aACE,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oCAAA,CACA,iBAAA,CACA,+BAAA,CACA,0BAAA,CACA,cAAA,CACA,kBAAA,CAEA,mBACE,oCAAA,CACA,qBAAA,CAGF,sBACE,iCAAA,CACA,+BAAA,CACA,UAAA,CAIJ,cACE,eAAA,CAEA,8BACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,kBAAA,CAEA,iCACE,QAAA,CACA,cAAA,CAKN,oBACE,YAAA,CACA,OAAA,CAEA,yBACE,YAAA,CACA,kBAAA,CACA,OAAA,CAIJ,cACE,YAAA,CACA,wBAAA,CACA,QAAA,CACA,iBAAA,CACA,wCAAA\",\"sourcesContent\":[\".workspace-editor-overlay {\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n background: rgba(0, 0, 0, 0.6);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n z-index: 1000;\\r\\n}\\r\\n\\r\\n.workspace-editor-modal {\\r\\n background: var(--theme-bg);\\r\\n border-radius: 12px;\\r\\n width: 90%;\\r\\n max-width: 700px;\\r\\n max-height: 90vh;\\r\\n overflow: hidden;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\\r\\n}\\r\\n\\r\\n.modal-header {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n padding: 16px 20px;\\r\\n border-bottom: 1px solid var(--theme-border);\\r\\n\\r\\n h4 {\\r\\n margin: 0;\\r\\n font-size: 1.25rem;\\r\\n }\\r\\n\\r\\n .close-btn {\\r\\n font-size: 1.25rem;\\r\\n color: var(--theme-fg-more);\\r\\n padding: 4px 8px;\\r\\n\\r\\n &:hover {\\r\\n color: var(--theme-fg);\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.modal-body {\\r\\n padding: 20px;\\r\\n overflow-y: auto;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.form-row {\\r\\n display: flex;\\r\\n gap: 16px;\\r\\n margin-bottom: 16px;\\r\\n\\r\\n &:last-child {\\r\\n margin-bottom: 0;\\r\\n }\\r\\n}\\r\\n\\r\\n.form-group {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: 6px;\\r\\n\\r\\n &.flex-grow {\\r\\n flex: 1;\\r\\n }\\r\\n\\r\\n label {\\r\\n font-size: 0.9rem;\\r\\n color: var(--theme-fg-more);\\r\\n }\\r\\n\\r\\n input[type='checkbox'] {\\r\\n margin-right: 8px;\\r\\n }\\r\\n}\\r\\n\\r\\n.form-control {\\r\\n padding: 8px 12px;\\r\\n border-radius: 6px;\\r\\n border: 1px solid var(--theme-border);\\r\\n background: var(--theme-bg-more);\\r\\n color: var(--theme-fg);\\r\\n font-size: 0.95rem;\\r\\n\\r\\n &:focus {\\r\\n outline: none;\\r\\n border-color: var(--theme-primary);\\r\\n }\\r\\n}\\r\\n\\r\\n.color-input {\\r\\n width: 60px;\\r\\n height: 36px;\\r\\n padding: 2px;\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.icon-selector {\\r\\n display: flex;\\r\\n flex-wrap: wrap;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.icon-option {\\r\\n width: 36px;\\r\\n height: 36px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: 1px solid var(--theme-border);\\r\\n border-radius: 6px;\\r\\n background: var(--theme-bg-more);\\r\\n color: var(--theme-fg-more);\\r\\n cursor: pointer;\\r\\n transition: all 0.2s;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-bg-more-more);\\r\\n color: var(--theme-fg);\\r\\n }\\r\\n\\r\\n &.selected {\\r\\n border-color: var(--theme-primary);\\r\\n background: var(--theme-primary);\\r\\n color: white;\\r\\n }\\r\\n}\\r\\n\\r\\n.form-section {\\r\\n margin-top: 20px;\\r\\n\\r\\n .section-header {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n margin-bottom: 12px;\\r\\n\\r\\n h5 {\\r\\n margin: 0;\\r\\n font-size: 1rem;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.orientation-toggle {\\r\\n display: flex;\\r\\n gap: 8px;\\r\\n\\r\\n .btn {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 6px;\\r\\n }\\r\\n}\\r\\n\\r\\n.modal-footer {\\r\\n display: flex;\\r\\n justify-content: flex-end;\\r\\n gap: 12px;\\r\\n padding: 16px 20px;\\r\\n border-top: 1px solid var(--theme-border);\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n var result = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./paneEditor.component.scss\");\n\n if (result && result.__esModule) {\n result = result.default;\n }\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n ","module.exports = __WEBPACK_EXTERNAL_MODULE__182__;","\n var result = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./splitPreview.component.scss\");\n\n if (result && result.__esModule) {\n result = result.default;\n }\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n ","var pug = require(\"!../../node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"workspace-editor-overlay\\\" (click)=\\\"onCancel()\\\"\\u003E\\u003Cdiv class=\\\"workspace-editor-modal\\\" (click)=\\\"$event.stopPropagation()\\\"\\u003E\\u003Cdiv class=\\\"modal-header\\\"\\u003E\\u003Ch4\\u003E{{ workspace.id ? 'Edit' : 'New' }} Workspace\\u003C\\u002Fh4\\u003E\\u003Cbutton class=\\\"btn btn-link close-btn\\\" type=\\\"button\\\" (click)=\\\"onCancel()\\\"\\u003E\\u003Ci class=\\\"fas fa-times\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"modal-body\\\"\\u003E\\u003Cdiv class=\\\"form-row\\\"\\u003E\\u003Cdiv class=\\\"form-group flex-grow\\\"\\u003E\\u003Clabel\\u003EName\\u003C\\u002Flabel\\u003E\\u003Cinput class=\\\"form-control\\\" type=\\\"text\\\" [(ngModel)]=\\\"workspace.name\\\" placeholder=\\\"Workspace name\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-row\\\"\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EIcon\\u003C\\u002Flabel\\u003E\\u003Cdiv class=\\\"icon-selector\\\"\\u003E\\u003Cbutton class=\\\"icon-option\\\" *ngFor=\\\"let icon of availableIcons\\\" type=\\\"button\\\" [class.selected]=\\\"workspace.icon === icon\\\" (click)=\\\"workspace.icon = icon\\\"\\u003E\\u003Ci class=\\\"fas\\\" [class]=\\\"&quot;fa-&quot; + icon\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EColor\\u003C\\u002Flabel\\u003E\\u003Cinput class=\\\"form-control color-input\\\" type=\\\"color\\\" [(ngModel)]=\\\"workspace.color\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-row\\\"\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003E\\u003Cinput type=\\\"checkbox\\\" [(ngModel)]=\\\"workspace.isDefault\\\"\\u003E Launch on startup\\u003C\\u002Flabel\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-section\\\"\\u003E\\u003Cdiv class=\\\"section-header\\\"\\u003E\\u003Ch5\\u003ELayout Preview\\u003C\\u002Fh5\\u003E\\u003Cdiv class=\\\"orientation-toggle\\\"\\u003E\\u003Cbutton class=\\\"btn btn-sm\\\" type=\\\"button\\\" [class.btn-primary]=\\\"workspace.root.orientation === &quot;horizontal&quot;\\\" [class.btn-outline-secondary]=\\\"workspace.root.orientation !== &quot;horizontal&quot;\\\" (click)=\\\"setOrientation(&quot;horizontal&quot;)\\\"\\u003E\\u003Ci class=\\\"fas fa-arrows-alt-h\\\"\\u003E\\u003C\\u002Fi\\u003E Horizontal\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-sm\\\" type=\\\"button\\\" [class.btn-primary]=\\\"workspace.root.orientation === &quot;vertical&quot;\\\" [class.btn-outline-secondary]=\\\"workspace.root.orientation !== &quot;vertical&quot;\\\" (click)=\\\"setOrientation(&quot;vertical&quot;)\\\"\\u003E\\u003Ci class=\\\"fas fa-arrows-alt-v\\\"\\u003E\\u003C\\u002Fi\\u003E Vertical\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Csplit-preview [split]=\\\"workspace.root\\\" (paneClick)=\\\"selectPane($event)\\\" (splitHorizontal)=\\\"splitPane($event, &quot;horizontal&quot;)\\\" (splitVertical)=\\\"splitPane($event, &quot;vertical&quot;)\\\" (removePane)=\\\"removePane($event)\\\"\\u003E\\u003C\\u002Fsplit-preview\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"modal-footer\\\"\\u003E\\u003Cbutton class=\\\"btn btn-secondary\\\" type=\\\"button\\\" (click)=\\\"onCancel()\\\"\\u003ECancel\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-primary\\\" type=\\\"button\\\" (click)=\\\"onSave()\\\" [disabled]=\\\"!workspace.name?.trim()\\\"\\u003E\\u003Ci class=\\\"fas fa-save\\\"\\u003E\\u003C\\u002Fi\\u003E Save Workspace\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cpane-editor *ngIf=\\\"showPaneEditor &amp;&amp; selectedPane\\\" [pane]=\\\"selectedPane\\\" [profiles]=\\\"profiles\\\" (save)=\\\"onPaneSave($event)\\\" (cancel)=\\\"closePaneEditor()\\\"\\u003E\\u003C\\u002Fpane-editor\\u003E\";;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"pane-editor-overlay\\\" (click)=\\\"onCancel()\\\"\\u003E\\u003Cdiv class=\\\"pane-editor-modal\\\" (click)=\\\"$event.stopPropagation()\\\"\\u003E\\u003Cdiv class=\\\"modal-header\\\"\\u003E\\u003Ch4\\u003EEdit Pane\\u003C\\u002Fh4\\u003E\\u003Cbutton class=\\\"btn btn-link close-btn\\\" type=\\\"button\\\" (click)=\\\"onCancel()\\\"\\u003E\\u003Ci class=\\\"fas fa-times\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"modal-body\\\"\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EBase Profile\\u003C\\u002Flabel\\u003E\\u003Cselect class=\\\"form-control\\\" [(ngModel)]=\\\"editedPane.profileId\\\"\\u003E\\u003Coption value=\\\"\\\"\\u003E-- Select Profile --\\u003C\\u002Foption\\u003E\\u003Coption *ngFor=\\\"let profile of profiles\\\" [value]=\\\"profile.id\\\"\\u003E{{ profile.name }}\\u003C\\u002Foption\\u003E\\u003C\\u002Fselect\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EWorking Directory\\u003C\\u002Flabel\\u003E\\u003Cinput class=\\\"form-control\\\" type=\\\"text\\\" [(ngModel)]=\\\"editedPane.cwd\\\" placeholder=\\\"C:\\\\path\\\\to\\\\project\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EStartup Command\\u003C\\u002Flabel\\u003E\\u003Cinput class=\\\"form-control\\\" type=\\\"text\\\" [(ngModel)]=\\\"editedPane.startupCommand\\\" placeholder=\\\"e.g., npm run dev\\\"\\u003E\\u003Csmall class=\\\"help-text\\\"\\u003ECommand to execute when the pane opens. For Nushell, use commands like: uv run serve\\u003C\\u002Fsmall\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EPane Title (optional)\\u003C\\u002Flabel\\u003E\\u003Cinput class=\\\"form-control\\\" type=\\\"text\\\" [(ngModel)]=\\\"editedPane.title\\\" placeholder=\\\"Custom tab title\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"modal-footer\\\"\\u003E\\u003Cbutton class=\\\"btn btn-secondary\\\" type=\\\"button\\\" (click)=\\\"onCancel()\\\"\\u003ECancel\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-primary\\\" type=\\\"button\\\" (click)=\\\"onSave()\\\"\\u003E\\u003Ci class=\\\"fas fa-check\\\"\\u003E\\u003C\\u002Fi\\u003E Apply\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"workspace-list-container\\\"\\u003E\\u003Cdiv class=\\\"workspace-list-header\\\"\\u003E\\u003Ch3\\u003EWorkspace Editor\\u003C\\u002Fh3\\u003E\\u003Cbutton class=\\\"btn btn-primary\\\" type=\\\"button\\\" (click)=\\\"createWorkspace()\\\"\\u003E\\u003Ci class=\\\"fas fa-plus\\\"\\u003E\\u003C\\u002Fi\\u003E New Workspace\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-list\\\" *ngIf=\\\"workspaces.length &gt; 0\\\"\\u003E\\u003Cdiv class=\\\"workspace-item\\\" *ngFor=\\\"let workspace of workspaces\\\"\\u003E\\u003Cdiv class=\\\"workspace-info\\\"\\u003E\\u003Cdiv class=\\\"workspace-icon\\\" [style.color]=\\\"workspace.color\\\"\\u003E\\u003Ci class=\\\"fas\\\" [class]=\\\"&quot;fa-&quot; + (workspace.icon || &quot;columns&quot;)\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-details\\\"\\u003E\\u003Cdiv class=\\\"workspace-name\\\"\\u003E{{ workspace.name }}\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-meta\\\"\\u003E\\u003Cspan\\u003E{{ getPaneCount(workspace) }} panes\\u003C\\u002Fspan\\u003E\\u003Cspan class=\\\"separator\\\"\\u003E&middot;\\u003C\\u002Fspan\\u003E\\u003Cspan\\u003E{{ getOrientationLabel(workspace) }}\\u003C\\u002Fspan\\u003E\\u003Cspan class=\\\"separator\\\" *ngIf=\\\"workspace.isDefault\\\"\\u003E&middot;\\u003C\\u002Fspan\\u003E\\u003Cspan class=\\\"badge badge-primary\\\" *ngIf=\\\"workspace.isDefault\\\"\\u003Edefault\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-actions\\\"\\u003E\\u003Cbutton class=\\\"btn btn-link\\\" type=\\\"button\\\" title=\\\"Set as default\\\" (click)=\\\"setAsDefault(workspace)\\\" [class.active]=\\\"workspace.isDefault\\\"\\u003E\\u003Ci class=\\\"fas fa-star\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-link\\\" type=\\\"button\\\" title=\\\"Duplicate\\\" (click)=\\\"duplicateWorkspace(workspace)\\\"\\u003E\\u003Ci class=\\\"fas fa-copy\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-link\\\" type=\\\"button\\\" title=\\\"Edit\\\" (click)=\\\"editWorkspace(workspace)\\\"\\u003E\\u003Ci class=\\\"fas fa-edit\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-link text-danger\\\" type=\\\"button\\\" title=\\\"Delete\\\" (click)=\\\"deleteWorkspace(workspace)\\\"\\u003E\\u003Ci class=\\\"fas fa-trash\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-empty\\\" *ngIf=\\\"workspaces.length === 0\\\"\\u003E\\u003Cp\\u003ENo workspaces configured yet.\\u003C\\u002Fp\\u003E\\u003Cp\\u003EClick \\\"New Workspace\\\" to create your first split-layout workspace.\\u003C\\u002Fp\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cworkspace-editor *ngIf=\\\"showEditor\\\" [workspace]=\\\"editingWorkspace\\\" (save)=\\\"onEditorSave($event)\\\" (cancel)=\\\"closeEditor()\\\"\\u003E\\u003C\\u002Fworkspace-editor\\u003E\";;return pug_html;};\nmodule.exports = template;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.split-preview{display:flex;width:100%;min-height:200px;gap:4px;border-radius:8px;overflow:hidden;background:var(--theme-bg-more);border:1px solid var(--theme-border)}.split-preview.horizontal{flex-direction:row}.split-preview.vertical{flex-direction:column}.preview-pane{display:flex;align-items:center;justify-content:center;background:var(--theme-bg-more-more);border-radius:4px;cursor:pointer;transition:all .2s;position:relative;min-height:80px}.preview-pane:hover{background:var(--theme-primary)}.preview-pane:hover .pane-content{color:#fff}.preview-pane:hover .pane-hint{opacity:1}.pane-content{text-align:center;padding:12px;color:var(--theme-fg)}.pane-label{font-size:.9rem;font-weight:500;margin-bottom:4px}.pane-hint{font-size:.75rem;opacity:.5;transition:opacity .2s}.context-menu-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1200}.context-menu{position:fixed;background:var(--theme-bg);border:1px solid var(--theme-border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.3);min-width:160px;padding:4px;z-index:1201}.context-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:8px 12px;border:none;background:none;color:var(--theme-fg);font-size:.9rem;text-align:left;cursor:pointer;border-radius:4px}.context-menu-item:hover{background:var(--theme-bg-more)}.context-menu-item.danger{color:var(--theme-danger, #ef4444)}.context-menu-item.danger:hover{background:rgba(239,68,68,.1)}.context-menu-item i{width:16px;text-align:center;opacity:.7}.context-menu-divider{height:1px;background:var(--theme-border);margin:4px 0}:host{display:flex;flex:1}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/splitPreview.component.scss\"],\"names\":[],\"mappings\":\"AAAA,eACE,YAAA,CACA,UAAA,CACA,gBAAA,CACA,OAAA,CACA,iBAAA,CACA,eAAA,CACA,+BAAA,CACA,oCAAA,CAEA,0BACE,kBAAA,CAGF,wBACE,qBAAA,CAIJ,cACE,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oCAAA,CACA,iBAAA,CACA,cAAA,CACA,kBAAA,CACA,iBAAA,CACA,eAAA,CAEA,oBACE,+BAAA,CAEA,kCACE,UAAA,CAGF,+BACE,SAAA,CAKN,cACE,iBAAA,CACA,YAAA,CACA,qBAAA,CAGF,YACE,eAAA,CACA,eAAA,CACA,iBAAA,CAGF,WACE,gBAAA,CACA,UAAA,CACA,sBAAA,CAIF,sBACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,YAAA,CAGF,cACE,cAAA,CACA,0BAAA,CACA,oCAAA,CACA,iBAAA,CACA,oCAAA,CACA,eAAA,CACA,WAAA,CACA,YAAA,CAGF,mBACE,YAAA,CACA,kBAAA,CACA,QAAA,CACA,UAAA,CACA,gBAAA,CACA,WAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,cAAA,CACA,iBAAA,CAEA,yBACE,+BAAA,CAGF,0BACE,kCAAA,CAEA,gCACE,6BAAA,CAIJ,qBACE,UAAA,CACA,iBAAA,CACA,UAAA,CAIJ,sBACE,UAAA,CACA,8BAAA,CACA,YAAA,CAIF,MACE,YAAA,CACA,MAAA\",\"sourcesContent\":[\".split-preview {\\r\\n display: flex;\\r\\n width: 100%;\\r\\n min-height: 200px;\\r\\n gap: 4px;\\r\\n border-radius: 8px;\\r\\n overflow: hidden;\\r\\n background: var(--theme-bg-more);\\r\\n border: 1px solid var(--theme-border);\\r\\n\\r\\n &.horizontal {\\r\\n flex-direction: row;\\r\\n }\\r\\n\\r\\n &.vertical {\\r\\n flex-direction: column;\\r\\n }\\r\\n}\\r\\n\\r\\n.preview-pane {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n background: var(--theme-bg-more-more);\\r\\n border-radius: 4px;\\r\\n cursor: pointer;\\r\\n transition: all 0.2s;\\r\\n position: relative;\\r\\n min-height: 80px;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-primary);\\r\\n\\r\\n .pane-content {\\r\\n color: white;\\r\\n }\\r\\n\\r\\n .pane-hint {\\r\\n opacity: 1;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.pane-content {\\r\\n text-align: center;\\r\\n padding: 12px;\\r\\n color: var(--theme-fg);\\r\\n}\\r\\n\\r\\n.pane-label {\\r\\n font-size: 0.9rem;\\r\\n font-weight: 500;\\r\\n margin-bottom: 4px;\\r\\n}\\r\\n\\r\\n.pane-hint {\\r\\n font-size: 0.75rem;\\r\\n opacity: 0.5;\\r\\n transition: opacity 0.2s;\\r\\n}\\r\\n\\r\\n// Context menu\\r\\n.context-menu-overlay {\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n z-index: 1200;\\r\\n}\\r\\n\\r\\n.context-menu {\\r\\n position: fixed;\\r\\n background: var(--theme-bg);\\r\\n border: 1px solid var(--theme-border);\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);\\r\\n min-width: 160px;\\r\\n padding: 4px;\\r\\n z-index: 1201;\\r\\n}\\r\\n\\r\\n.context-menu-item {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n width: 100%;\\r\\n padding: 8px 12px;\\r\\n border: none;\\r\\n background: none;\\r\\n color: var(--theme-fg);\\r\\n font-size: 0.9rem;\\r\\n text-align: left;\\r\\n cursor: pointer;\\r\\n border-radius: 4px;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-bg-more);\\r\\n }\\r\\n\\r\\n &.danger {\\r\\n color: var(--theme-danger, #ef4444);\\r\\n\\r\\n &:hover {\\r\\n background: rgba(239, 68, 68, 0.1);\\r\\n }\\r\\n }\\r\\n\\r\\n i {\\r\\n width: 16px;\\r\\n text-align: center;\\r\\n opacity: 0.7;\\r\\n }\\r\\n}\\r\\n\\r\\n.context-menu-divider {\\r\\n height: 1px;\\r\\n background: var(--theme-border);\\r\\n margin: 4px 0;\\r\\n}\\r\\n\\r\\n// Nested splits styling\\r\\n:host {\\r\\n display: flex;\\r\\n flex: 1;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\n var result = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./workspaceList.component.scss\");\n\n if (result && result.__esModule) {\n result = result.default;\n }\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n ","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","module.exports = __WEBPACK_EXTERNAL_MODULE__358__;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.workspace-list-container{padding:20px;max-width:800px}.workspace-list-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.workspace-list-header h3{margin:0;font-size:1.5rem}.workspace-list{display:flex;flex-direction:column;gap:12px}.workspace-item{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--theme-bg-more);border-radius:8px;border:1px solid var(--theme-border);transition:background .2s}.workspace-item:hover{background:var(--theme-bg-more-more)}.workspace-info{display:flex;align-items:center;gap:16px}.workspace-icon{font-size:24px;width:40px;text-align:center}.workspace-details{display:flex;flex-direction:column;gap:4px}.workspace-name{font-size:1.1rem;font-weight:500}.workspace-meta{font-size:.85rem;color:var(--theme-fg-more)}.workspace-meta .separator{margin:0 6px}.workspace-meta .badge{font-size:.75rem;padding:2px 6px;border-radius:4px;background:var(--theme-primary);color:#fff}.workspace-actions{display:flex;gap:4px}.workspace-actions .btn-link{padding:8px;color:var(--theme-fg-more);opacity:.7;transition:opacity .2s}.workspace-actions .btn-link:hover{opacity:1}.workspace-actions .btn-link.active{color:gold;opacity:1}.workspace-actions .btn-link.text-danger:hover{color:var(--theme-danger)}.workspace-empty{text-align:center;padding:40px;color:var(--theme-fg-more)}.workspace-empty p{margin:8px 0}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/workspaceList.component.scss\"],\"names\":[],\"mappings\":\"AAAA,0BACE,YAAA,CACA,eAAA,CAGF,uBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,kBAAA,CAEA,0BACE,QAAA,CACA,gBAAA,CAIJ,gBACE,YAAA,CACA,qBAAA,CACA,QAAA,CAGF,gBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,YAAA,CACA,+BAAA,CACA,iBAAA,CACA,oCAAA,CACA,yBAAA,CAEA,sBACE,oCAAA,CAIJ,gBACE,YAAA,CACA,kBAAA,CACA,QAAA,CAGF,gBACE,cAAA,CACA,UAAA,CACA,iBAAA,CAGF,mBACE,YAAA,CACA,qBAAA,CACA,OAAA,CAGF,gBACE,gBAAA,CACA,eAAA,CAGF,gBACE,gBAAA,CACA,0BAAA,CAEA,2BACE,YAAA,CAGF,uBACE,gBAAA,CACA,eAAA,CACA,iBAAA,CACA,+BAAA,CACA,UAAA,CAIJ,mBACE,YAAA,CACA,OAAA,CAEA,6BACE,WAAA,CACA,0BAAA,CACA,UAAA,CACA,sBAAA,CAEA,mCACE,SAAA,CAGF,oCACE,UAAA,CACA,SAAA,CAGF,+CACE,yBAAA,CAKN,iBACE,iBAAA,CACA,YAAA,CACA,0BAAA,CAEA,mBACE,YAAA\",\"sourcesContent\":[\".workspace-list-container {\\r\\n padding: 20px;\\r\\n max-width: 800px;\\r\\n}\\r\\n\\r\\n.workspace-list-header {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n margin-bottom: 20px;\\r\\n\\r\\n h3 {\\r\\n margin: 0;\\r\\n font-size: 1.5rem;\\r\\n }\\r\\n}\\r\\n\\r\\n.workspace-list {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.workspace-item {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n padding: 16px;\\r\\n background: var(--theme-bg-more);\\r\\n border-radius: 8px;\\r\\n border: 1px solid var(--theme-border);\\r\\n transition: background 0.2s;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-bg-more-more);\\r\\n }\\r\\n}\\r\\n\\r\\n.workspace-info {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 16px;\\r\\n}\\r\\n\\r\\n.workspace-icon {\\r\\n font-size: 24px;\\r\\n width: 40px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.workspace-details {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.workspace-name {\\r\\n font-size: 1.1rem;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n.workspace-meta {\\r\\n font-size: 0.85rem;\\r\\n color: var(--theme-fg-more);\\r\\n\\r\\n .separator {\\r\\n margin: 0 6px;\\r\\n }\\r\\n\\r\\n .badge {\\r\\n font-size: 0.75rem;\\r\\n padding: 2px 6px;\\r\\n border-radius: 4px;\\r\\n background: var(--theme-primary);\\r\\n color: white;\\r\\n }\\r\\n}\\r\\n\\r\\n.workspace-actions {\\r\\n display: flex;\\r\\n gap: 4px;\\r\\n\\r\\n .btn-link {\\r\\n padding: 8px;\\r\\n color: var(--theme-fg-more);\\r\\n opacity: 0.7;\\r\\n transition: opacity 0.2s;\\r\\n\\r\\n &:hover {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n &.active {\\r\\n color: gold;\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n &.text-danger:hover {\\r\\n color: var(--theme-danger);\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.workspace-empty {\\r\\n text-align: center;\\r\\n padding: 40px;\\r\\n color: var(--theme-fg-more);\\r\\n\\r\\n p {\\r\\n margin: 8px 0;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var pug = require(\"!../../node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"split-preview\\\" [class.horizontal]=\\\"split.orientation === &quot;horizontal&quot;\\\" [class.vertical]=\\\"split.orientation === &quot;vertical&quot;\\\"\\u003E\\u003Cng-container *ngFor=\\\"let child of split.children; let i = index\\\"\\u003E\\u003Cdiv class=\\\"preview-pane\\\" *ngIf=\\\"isPane(child)\\\" [style.flex-basis]=\\\"getFlexStyle(i)\\\" (click)=\\\"onPaneClick(asPane(child))\\\" (contextmenu)=\\\"onContextMenu($event, asPane(child))\\\"\\u003E\\u003Cdiv class=\\\"pane-content\\\"\\u003E\\u003Cdiv class=\\\"pane-label\\\"\\u003E{{ getPaneLabel(asPane(child)) }}\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"pane-hint\\\"\\u003EClick to edit\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Csplit-preview *ngIf=\\\"isSplit(child)\\\" [split]=\\\"asSplit(child)\\\" [depth]=\\\"depth + 1\\\" [style.flex-basis]=\\\"getFlexStyle(i)\\\" (paneClick)=\\\"onNestedPaneClick($event)\\\" (splitHorizontal)=\\\"onNestedSplitH($event)\\\" (splitVertical)=\\\"onNestedSplitV($event)\\\" (removePane)=\\\"onNestedRemove($event)\\\"\\u003E\\u003C\\u002Fsplit-preview\\u003E\\u003C\\u002Fng-container\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"context-menu-overlay\\\" *ngIf=\\\"contextMenuPane\\\" (click)=\\\"closeContextMenu()\\\"\\u003E\\u003Cdiv class=\\\"context-menu\\\" [style.left.px]=\\\"contextMenuPosition.x\\\" [style.top.px]=\\\"contextMenuPosition.y\\\" (click)=\\\"$event.stopPropagation()\\\"\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onSplitH()\\\"\\u003E\\u003Ci class=\\\"fas fa-arrows-alt-h\\\"\\u003E\\u003C\\u002Fi\\u003E Split Horizontal\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onSplitV()\\\"\\u003E\\u003Ci class=\\\"fas fa-arrows-alt-v\\\"\\u003E\\u003C\\u002Fi\\u003E Split Vertical\\u003C\\u002Fbutton\\u003E\\u003Cdiv class=\\\"context-menu-divider\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cbutton class=\\\"context-menu-item danger\\\" type=\\\"button\\\" (click)=\\\"onRemove()\\\"\\u003E\\u003Ci class=\\\"fas fa-trash\\\"\\u003E\\u003C\\u002Fi\\u003E Remove Pane\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";;return pug_html;};\nmodule.exports = template;","var req = require(\"!!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\src\\\\components\\\\splitPreview.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = __WEBPACK_EXTERNAL_MODULE__650__;","module.exports = __WEBPACK_EXTERNAL_MODULE__700__;","'use strict';\n\nvar pug_has_own_property = Object.prototype.hasOwnProperty;\n\n/**\n * Merge two attribute objects giving precedence\n * to values in object `b`. Classes are special-cased\n * allowing for arrays and merging/joining appropriately\n * resulting in a string.\n *\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n * @api private\n */\n\nexports.merge = pug_merge;\nfunction pug_merge(a, b) {\n if (arguments.length === 1) {\n var attrs = a[0];\n for (var i = 1; i < a.length; i++) {\n attrs = pug_merge(attrs, a[i]);\n }\n return attrs;\n }\n\n for (var key in b) {\n if (key === 'class') {\n var valA = a[key] || [];\n a[key] = (Array.isArray(valA) ? valA : [valA]).concat(b[key] || []);\n } else if (key === 'style') {\n var valA = pug_style(a[key]);\n valA = valA && valA[valA.length - 1] !== ';' ? valA + ';' : valA;\n var valB = pug_style(b[key]);\n valB = valB && valB[valB.length - 1] !== ';' ? valB + ';' : valB;\n a[key] = valA + valB;\n } else {\n a[key] = b[key];\n }\n }\n\n return a;\n}\n\n/**\n * Process array, object, or string as a string of classes delimited by a space.\n *\n * If `val` is an array, all members of it and its subarrays are counted as\n * classes. If `escaping` is an array, then whether or not the item in `val` is\n * escaped depends on the corresponding item in `escaping`. If `escaping` is\n * not an array, no escaping is done.\n *\n * If `val` is an object, all the keys whose value is truthy are counted as\n * classes. No escaping is done.\n *\n * If `val` is a string, it is counted as a class. No escaping is done.\n *\n * @param {(Array.<string>|Object.<string, boolean>|string)} val\n * @param {?Array.<string>} escaping\n * @return {String}\n */\nexports.classes = pug_classes;\nfunction pug_classes_array(val, escaping) {\n var classString = '',\n className,\n padding = '',\n escapeEnabled = Array.isArray(escaping);\n for (var i = 0; i < val.length; i++) {\n className = pug_classes(val[i]);\n if (!className) continue;\n escapeEnabled && escaping[i] && (className = pug_escape(className));\n classString = classString + padding + className;\n padding = ' ';\n }\n return classString;\n}\nfunction pug_classes_object(val) {\n var classString = '',\n padding = '';\n for (var key in val) {\n if (key && val[key] && pug_has_own_property.call(val, key)) {\n classString = classString + padding + key;\n padding = ' ';\n }\n }\n return classString;\n}\nfunction pug_classes(val, escaping) {\n if (Array.isArray(val)) {\n return pug_classes_array(val, escaping);\n } else if (val && typeof val === 'object') {\n return pug_classes_object(val);\n } else {\n return val || '';\n }\n}\n\n/**\n * Convert object or string to a string of CSS styles delimited by a semicolon.\n *\n * @param {(Object.<string, string>|string)} val\n * @return {String}\n */\n\nexports.style = pug_style;\nfunction pug_style(val) {\n if (!val) return '';\n if (typeof val === 'object') {\n var out = '';\n for (var style in val) {\n /* istanbul ignore else */\n if (pug_has_own_property.call(val, style)) {\n out = out + style + ':' + val[style] + ';';\n }\n }\n return out;\n } else {\n return val + '';\n }\n}\n\n/**\n * Render the given attribute.\n *\n * @param {String} key\n * @param {String} val\n * @param {Boolean} escaped\n * @param {Boolean} terse\n * @return {String}\n */\nexports.attr = pug_attr;\nfunction pug_attr(key, val, escaped, terse) {\n if (\n val === false ||\n val == null ||\n (!val && (key === 'class' || key === 'style'))\n ) {\n return '';\n }\n if (val === true) {\n return ' ' + (terse ? key : key + '=\"' + key + '\"');\n }\n var type = typeof val;\n if (\n (type === 'object' || type === 'function') &&\n typeof val.toJSON === 'function'\n ) {\n val = val.toJSON();\n }\n if (typeof val !== 'string') {\n val = JSON.stringify(val);\n if (!escaped && val.indexOf('\"') !== -1) {\n return ' ' + key + \"='\" + val.replace(/'/g, '&#39;') + \"'\";\n }\n }\n if (escaped) val = pug_escape(val);\n return ' ' + key + '=\"' + val + '\"';\n}\n\n/**\n * Render the given attributes object.\n *\n * @param {Object} obj\n * @param {Object} terse whether to use HTML5 terse boolean attributes\n * @return {String}\n */\nexports.attrs = pug_attrs;\nfunction pug_attrs(obj, terse) {\n var attrs = '';\n\n for (var key in obj) {\n if (pug_has_own_property.call(obj, key)) {\n var val = obj[key];\n\n if ('class' === key) {\n val = pug_classes(val);\n attrs = pug_attr(key, val, false, terse) + attrs;\n continue;\n }\n if ('style' === key) {\n val = pug_style(val);\n }\n attrs += pug_attr(key, val, false, terse);\n }\n }\n\n return attrs;\n}\n\n/**\n * Escape the given string of `html`.\n *\n * @param {String} html\n * @return {String}\n * @api private\n */\n\nvar pug_match_html = /[\"&<>]/;\nexports.escape = pug_escape;\nfunction pug_escape(_html) {\n var html = '' + _html;\n var regexResult = pug_match_html.exec(html);\n if (!regexResult) return _html;\n\n var result = '';\n var i, lastIndex, escape;\n for (i = regexResult.index, lastIndex = 0; i < html.length; i++) {\n switch (html.charCodeAt(i)) {\n case 34:\n escape = '&quot;';\n break;\n case 38:\n escape = '&amp;';\n break;\n case 60:\n escape = '&lt;';\n break;\n case 62:\n escape = '&gt;';\n break;\n default:\n continue;\n }\n if (lastIndex !== i) result += html.substring(lastIndex, i);\n lastIndex = i + 1;\n result += escape;\n }\n if (lastIndex !== i) return result + html.substring(lastIndex, i);\n else return result;\n}\n\n/**\n * Re-throw the given `err` in context to the\n * the pug in `filename` at the given `lineno`.\n *\n * @param {Error} err\n * @param {String} filename\n * @param {String} lineno\n * @param {String} str original source\n * @api private\n */\n\nexports.rethrow = pug_rethrow;\nfunction pug_rethrow(err, filename, lineno, str) {\n if (!(err instanceof Error)) throw err;\n if ((typeof window != 'undefined' || !filename) && !str) {\n err.message += ' on line ' + lineno;\n throw err;\n }\n var context, lines, start, end;\n try {\n str = str || require('fs').readFileSync(filename, {encoding: 'utf8'});\n context = 3;\n lines = str.split('\\n');\n start = Math.max(lineno - context, 0);\n end = Math.min(lines.length, lineno + context);\n } catch (ex) {\n err.message +=\n ' - could not read from ' + filename + ' (' + ex.message + ')';\n pug_rethrow(err, null, lineno);\n return;\n }\n\n // Error context\n context = lines\n .slice(start, end)\n .map(function(line, i) {\n var curr = i + start + 1;\n return (curr == lineno ? ' > ' : ' ') + curr + '| ' + line;\n })\n .join('\\n');\n\n // Alter exception message\n err.path = filename;\n try {\n err.message =\n (filename || 'Pug') +\n ':' +\n lineno +\n '\\n' +\n context +\n '\\n\\n' +\n err.message;\n } catch (e) {}\n throw err;\n}\n","var req = require(\"!!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\src\\\\components\\\\workspaceEditor.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","\n var result = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./workspaceEditor.component.scss\");\n\n if (result && result.__esModule) {\n result = result.default;\n }\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n ","module.exports = __WEBPACK_EXTERNAL_MODULE__860__;","var req = require(\"!!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\src\\\\components\\\\paneEditor.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.pane-editor-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:1100}.pane-editor-modal{background:var(--theme-bg);border-radius:12px;width:90%;max-width:500px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.4)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--theme-border)}.modal-header h4{margin:0;font-size:1.15rem}.modal-header .close-btn{font-size:1.15rem;color:var(--theme-fg-more);padding:4px 8px}.modal-header .close-btn:hover{color:var(--theme-fg)}.modal-body{padding:20px;overflow-y:auto;flex:1}.form-group{margin-bottom:16px}.form-group:last-child{margin-bottom:0}.form-group label{display:block;margin-bottom:6px;font-size:.9rem;color:var(--theme-fg-more)}.form-control{width:100%;padding:10px 12px;border-radius:6px;border:1px solid var(--theme-border);background:var(--theme-bg-more);color:var(--theme-fg);font-size:.95rem}.form-control:focus{outline:none;border-color:var(--theme-primary)}select.form-control{cursor:pointer}.input-with-button{display:flex;gap:8px}.input-with-button input{flex:1}.help-text{display:block;margin-top:4px;font-size:.8rem;color:var(--theme-fg-more);opacity:.8}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 20px;border-top:1px solid var(--theme-border)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/paneEditor.component.scss\"],\"names\":[],\"mappings\":\"AAAA,qBACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,yBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,YAAA,CAGF,mBACE,0BAAA,CACA,kBAAA,CACA,SAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,YAAA,CACA,qBAAA,CACA,qCAAA,CAGF,cACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CACA,2CAAA,CAEA,iBACE,QAAA,CACA,iBAAA,CAGF,yBACE,iBAAA,CACA,0BAAA,CACA,eAAA,CAEA,+BACE,qBAAA,CAKN,YACE,YAAA,CACA,eAAA,CACA,MAAA,CAGF,YACE,kBAAA,CAEA,uBACE,eAAA,CAGF,kBACE,aAAA,CACA,iBAAA,CACA,eAAA,CACA,0BAAA,CAIJ,cACE,UAAA,CACA,iBAAA,CACA,iBAAA,CACA,oCAAA,CACA,+BAAA,CACA,qBAAA,CACA,gBAAA,CAEA,oBACE,YAAA,CACA,iCAAA,CAIJ,oBACE,cAAA,CAGF,mBACE,YAAA,CACA,OAAA,CAEA,yBACE,MAAA,CAIJ,WACE,aAAA,CACA,cAAA,CACA,eAAA,CACA,0BAAA,CACA,UAAA,CAGF,cACE,YAAA,CACA,wBAAA,CACA,QAAA,CACA,iBAAA,CACA,wCAAA\",\"sourcesContent\":[\".pane-editor-overlay {\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n background: rgba(0, 0, 0, 0.7);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n z-index: 1100;\\r\\n}\\r\\n\\r\\n.pane-editor-modal {\\r\\n background: var(--theme-bg);\\r\\n border-radius: 12px;\\r\\n width: 90%;\\r\\n max-width: 500px;\\r\\n max-height: 80vh;\\r\\n overflow: hidden;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\\r\\n}\\r\\n\\r\\n.modal-header {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n padding: 16px 20px;\\r\\n border-bottom: 1px solid var(--theme-border);\\r\\n\\r\\n h4 {\\r\\n margin: 0;\\r\\n font-size: 1.15rem;\\r\\n }\\r\\n\\r\\n .close-btn {\\r\\n font-size: 1.15rem;\\r\\n color: var(--theme-fg-more);\\r\\n padding: 4px 8px;\\r\\n\\r\\n &:hover {\\r\\n color: var(--theme-fg);\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.modal-body {\\r\\n padding: 20px;\\r\\n overflow-y: auto;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.form-group {\\r\\n margin-bottom: 16px;\\r\\n\\r\\n &:last-child {\\r\\n margin-bottom: 0;\\r\\n }\\r\\n\\r\\n label {\\r\\n display: block;\\r\\n margin-bottom: 6px;\\r\\n font-size: 0.9rem;\\r\\n color: var(--theme-fg-more);\\r\\n }\\r\\n}\\r\\n\\r\\n.form-control {\\r\\n width: 100%;\\r\\n padding: 10px 12px;\\r\\n border-radius: 6px;\\r\\n border: 1px solid var(--theme-border);\\r\\n background: var(--theme-bg-more);\\r\\n color: var(--theme-fg);\\r\\n font-size: 0.95rem;\\r\\n\\r\\n &:focus {\\r\\n outline: none;\\r\\n border-color: var(--theme-primary);\\r\\n }\\r\\n}\\r\\n\\r\\nselect.form-control {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.input-with-button {\\r\\n display: flex;\\r\\n gap: 8px;\\r\\n\\r\\n input {\\r\\n flex: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.help-text {\\r\\n display: block;\\r\\n margin-top: 4px;\\r\\n font-size: 0.8rem;\\r\\n color: var(--theme-fg-more);\\r\\n opacity: 0.8;\\r\\n}\\r\\n\\r\\n.modal-footer {\\r\\n display: flex;\\r\\n justify-content: flex-end;\\r\\n gap: 12px;\\r\\n padding: 16px 20px;\\r\\n border-top: 1px solid var(--theme-border);\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","if(typeof __WEBPACK_EXTERNAL_MODULE__947__ === 'undefined') { var e = new Error(\"Cannot find module 'fs'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__947__;","var req = require(\"!!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\src\\\\components\\\\workspaceList.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Check if module exists (development only)\n\tif (__webpack_modules__[moduleId] === undefined) {\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// Build-time constants injected by webpack DefinePlugin\r\ndeclare const __CONFIG_KEY__: string\r\ndeclare const __DISPLAY_NAME__: string\r\ndeclare const __IS_DEV__: boolean\r\n\r\nexport const CONFIG_KEY = typeof __CONFIG_KEY__ !== 'undefined' ? __CONFIG_KEY__ : 'tabbyspaces'\r\nexport const DISPLAY_NAME = typeof __DISPLAY_NAME__ !== 'undefined' ? __DISPLAY_NAME__ : 'TabbySpaces'\r\nexport const IS_DEV = typeof __IS_DEV__ !== 'undefined' ? __IS_DEV__ : false\r\n","import { Injectable } from '@angular/core'\r\nimport { ConfigProvider } from 'tabby-core'\r\nimport { CONFIG_KEY } from '../build-config'\r\n\r\n@Injectable()\r\nexport class WorkspaceEditorConfigProvider extends ConfigProvider {\r\n defaults = {\r\n [CONFIG_KEY]: {\r\n workspaces: [],\r\n },\r\n }\r\n}\r\n","// Tabby profile interfaces\r\nexport interface TabbyProfileOptions {\r\n command?: string\r\n args?: string[]\r\n cwd?: string\r\n env?: Record<string, string>\r\n restoreFromPTYID?: boolean\r\n width?: number | null\r\n height?: number | null\r\n pauseAfterExit?: boolean\r\n runAsAdministrator?: boolean\r\n}\r\n\r\nexport interface TabbyProfile {\r\n id: string\r\n type: string\r\n name: string\r\n group?: string\r\n icon?: string\r\n color?: string\r\n options?: TabbyProfileOptions\r\n isBuiltin?: boolean\r\n isTemplate?: boolean\r\n weight?: number\r\n disableDynamicTitle?: boolean\r\n terminalColorScheme?: string | null\r\n behaviorOnSessionEnd?: string\r\n}\r\n\r\nexport interface TabbyRecoveryToken {\r\n type: string\r\n orientation?: 'h' | 'v'\r\n ratios?: number[]\r\n children?: TabbyRecoveryToken[]\r\n profile?: Partial<TabbyProfile>\r\n savedState?: boolean\r\n tabTitle?: string\r\n tabCustomTitle?: string\r\n disableDynamicTitle?: boolean\r\n}\r\n\r\nexport interface TabbySplitLayoutProfile {\r\n id: string\r\n type: 'split-layout'\r\n name: string\r\n group: string\r\n icon?: string\r\n color?: string\r\n isBuiltin: boolean\r\n options: {\r\n recoveryToken: TabbyRecoveryToken\r\n }\r\n}\r\n\r\n// Workspace interfaces\r\nexport interface WorkspacePane {\r\n id: string\r\n profileId: string\r\n cwd?: string\r\n startupCommand?: string\r\n title?: string\r\n}\r\n\r\nexport interface WorkspaceSplit {\r\n orientation: 'horizontal' | 'vertical'\r\n ratios: number[]\r\n children: (WorkspacePane | WorkspaceSplit)[]\r\n}\r\n\r\nexport interface Workspace {\r\n id: string\r\n name: string\r\n icon?: string\r\n color?: string\r\n root: WorkspaceSplit\r\n isDefault?: boolean\r\n hotkey?: string\r\n}\r\n\r\nexport function isWorkspaceSplit(node: WorkspacePane | WorkspaceSplit): node is WorkspaceSplit {\r\n return 'orientation' in node && 'children' in node\r\n}\r\n\r\nexport function createDefaultPane(): WorkspacePane {\r\n return {\r\n id: generateUUID(),\r\n profileId: '',\r\n cwd: '',\r\n startupCommand: '',\r\n title: '',\r\n }\r\n}\r\n\r\nexport function createDefaultSplit(orientation: 'horizontal' | 'vertical' = 'horizontal'): WorkspaceSplit {\r\n return {\r\n orientation,\r\n ratios: [0.5, 0.5],\r\n children: [createDefaultPane(), createDefaultPane()],\r\n }\r\n}\r\n\r\nexport function createDefaultWorkspace(name: string = 'New Workspace'): Workspace {\r\n return {\r\n id: generateUUID(),\r\n name,\r\n icon: 'columns',\r\n color: '#3b82f6',\r\n root: createDefaultSplit(),\r\n isDefault: false,\r\n }\r\n}\r\n\r\nexport function generateUUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8\r\n return v.toString(16)\r\n })\r\n}\r\n\r\nexport function countPanes(node: WorkspacePane | WorkspaceSplit): number {\r\n if (isWorkspaceSplit(node)) {\r\n return node.children.reduce((sum, child) => sum + countPanes(child), 0)\r\n }\r\n return 1\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { ConfigService, NotificationsService, ProfilesService } from 'tabby-core'\r\nimport {\r\n Workspace,\r\n WorkspacePane,\r\n WorkspaceSplit,\r\n isWorkspaceSplit,\r\n generateUUID,\r\n TabbyProfile,\r\n TabbyRecoveryToken,\r\n TabbySplitLayoutProfile,\r\n} from '../models/workspace.model'\r\nimport { CONFIG_KEY, DISPLAY_NAME } from '../build-config'\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkspaceEditorService {\r\n constructor(\r\n private config: ConfigService,\r\n private notifications: NotificationsService,\r\n private profilesService: ProfilesService\r\n ) {}\r\n\r\n getWorkspaces(): Workspace[] {\r\n return this.config.store[CONFIG_KEY]?.workspaces ?? []\r\n }\r\n\r\n async saveWorkspaces(workspaces: Workspace[]): Promise<boolean> {\r\n this.config.store[CONFIG_KEY].workspaces = workspaces\r\n this.syncTabbyProfiles(workspaces)\r\n return await this.saveConfig()\r\n }\r\n\r\n async addWorkspace(workspace: Workspace): Promise<void> {\r\n const workspaces = this.getWorkspaces()\r\n workspaces.push(workspace)\r\n await this.saveWorkspaces(workspaces)\r\n this.notifications.info(`Workspace \"${workspace.name}\" created`)\r\n }\r\n\r\n async updateWorkspace(workspace: Workspace): Promise<void> {\r\n const workspaces = this.getWorkspaces()\r\n const index = workspaces.findIndex((w) => w.id === workspace.id)\r\n if (index !== -1) {\r\n workspaces[index] = workspace\r\n await this.saveWorkspaces(workspaces)\r\n this.notifications.info(`Workspace \"${workspace.name}\" updated`)\r\n }\r\n }\r\n\r\n async deleteWorkspace(workspaceId: string): Promise<void> {\r\n const workspaces = this.getWorkspaces()\r\n const workspace = workspaces.find((w) => w.id === workspaceId)\r\n const filtered = workspaces.filter((w) => w.id !== workspaceId)\r\n await this.saveWorkspaces(filtered)\r\n if (workspace) {\r\n this.notifications.info(`Workspace \"${workspace.name}\" deleted`)\r\n }\r\n }\r\n\r\n async getAvailableProfiles(): Promise<TabbyProfile[]> {\r\n const allProfiles = await this.profilesService.getProfiles()\r\n return allProfiles.filter(\r\n (p) => p.type === 'local' && !p.id?.startsWith('split-layout:')\r\n ) as TabbyProfile[]\r\n }\r\n\r\n private syncTabbyProfiles(workspaces: Workspace[]): void {\r\n const profiles: (TabbyProfile | TabbySplitLayoutProfile)[] = this.config.store.profiles ?? []\r\n\r\n // Remove old plugin profiles (mutate in place)\r\n for (let i = profiles.length - 1; i >= 0; i--) {\r\n if (profiles[i].id?.startsWith(`split-layout:${CONFIG_KEY}:`)) {\r\n profiles.splice(i, 1)\r\n }\r\n }\r\n\r\n // Add new workspace profiles\r\n for (const workspace of workspaces) {\r\n const tabbyProfile = this.generateTabbyProfile(workspace)\r\n profiles.push(tabbyProfile)\r\n }\r\n }\r\n\r\n generateTabbyProfile(workspace: Workspace): TabbySplitLayoutProfile {\r\n const safeName = this.sanitizeForProfileId(workspace.name)\r\n return {\r\n id: `split-layout:${CONFIG_KEY}:${safeName}:${workspace.id}`,\r\n type: 'split-layout',\r\n name: workspace.name,\r\n group: DISPLAY_NAME,\r\n icon: workspace.icon,\r\n color: workspace.color,\r\n isBuiltin: false,\r\n options: {\r\n recoveryToken: this.generateRecoveryToken(workspace.root),\r\n },\r\n }\r\n }\r\n\r\n private generateRecoveryToken(split: WorkspaceSplit): TabbyRecoveryToken {\r\n return {\r\n type: 'app:split-tab',\r\n orientation: split.orientation === 'horizontal' ? 'h' : 'v',\r\n ratios: split.ratios,\r\n children: split.children.map((child) => {\r\n if (isWorkspaceSplit(child)) {\r\n return this.generateRecoveryToken(child)\r\n }\r\n return this.generatePaneToken(child)\r\n }),\r\n }\r\n }\r\n\r\n private generatePaneToken(pane: WorkspacePane): TabbyRecoveryToken {\r\n const baseProfile = this.getProfileById(pane.profileId)\r\n\r\n if (!baseProfile) {\r\n return {\r\n type: 'app:local-tab',\r\n profile: {\r\n type: 'local',\r\n name: 'Shell',\r\n },\r\n savedState: false,\r\n }\r\n }\r\n\r\n // Build complete profile object like Tabby expects\r\n const options = {\r\n restoreFromPTYID: false,\r\n command: baseProfile.options?.command || '',\r\n args: baseProfile.options?.args || [],\r\n cwd: pane.cwd || baseProfile.options?.cwd || '',\r\n env: baseProfile.options?.env || {},\r\n width: null,\r\n height: null,\r\n pauseAfterExit: false,\r\n runAsAdministrator: false,\r\n }\r\n\r\n // Handle startup command for different shells\r\n if (pane.startupCommand) {\r\n const cmd = baseProfile.options?.command || ''\r\n if (cmd.includes('nu.exe') || baseProfile.name?.toLowerCase().includes('nushell')) {\r\n options.args = ['-e', pane.startupCommand]\r\n } else if (cmd.includes('powershell') || cmd.includes('pwsh')) {\r\n options.args = ['-NoExit', '-Command', pane.startupCommand]\r\n } else if (cmd.includes('cmd.exe')) {\r\n options.args = ['/K', pane.startupCommand]\r\n } else {\r\n options.args = ['-c', pane.startupCommand]\r\n }\r\n }\r\n\r\n const profile = {\r\n id: baseProfile.id,\r\n type: 'local',\r\n name: baseProfile.name || 'Shell',\r\n group: baseProfile.group || '',\r\n options,\r\n icon: baseProfile.icon || '',\r\n color: baseProfile.color || '',\r\n disableDynamicTitle: false,\r\n weight: 0,\r\n isBuiltin: false,\r\n isTemplate: false,\r\n terminalColorScheme: null,\r\n behaviorOnSessionEnd: 'auto',\r\n }\r\n\r\n return {\r\n type: 'app:local-tab',\r\n profile,\r\n savedState: false,\r\n tabTitle: pane.title || '',\r\n tabCustomTitle: pane.title || '',\r\n disableDynamicTitle: !!pane.title,\r\n }\r\n }\r\n\r\n duplicateWorkspace(workspace: Workspace): Workspace {\r\n const clone = JSON.parse(JSON.stringify(workspace)) as Workspace\r\n clone.id = generateUUID()\r\n clone.name = `${workspace.name} (Copy)`\r\n clone.isDefault = false\r\n this.regenerateIds(clone.root)\r\n return clone\r\n }\r\n\r\n private regenerateIds(node: WorkspacePane | WorkspaceSplit): void {\r\n if (isWorkspaceSplit(node)) {\r\n for (const child of node.children) {\r\n this.regenerateIds(child)\r\n }\r\n } else {\r\n node.id = generateUUID()\r\n }\r\n }\r\n\r\n private sanitizeForProfileId(name: string): string {\r\n return name\r\n .toLowerCase()\r\n .replace(/[^a-z0-9-]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '')\r\n || 'workspace'\r\n }\r\n\r\n private getProfileById(profileId: string): TabbyProfile | undefined {\r\n const profiles: TabbyProfile[] = this.config.store.profiles ?? []\r\n return profiles.find((p) => p.id === profileId && p.type === 'local')\r\n }\r\n\r\n getProfileName(profileId: string): string | undefined {\r\n return this.getProfileById(profileId)?.name\r\n }\r\n\r\n private async saveConfig(): Promise<boolean> {\r\n try {\r\n await this.config.save()\r\n return true\r\n } catch (error) {\r\n this.notifications.error('Failed to save configuration')\r\n console.error('TabbySpaces save error:', error)\r\n return false\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, OnDestroy, ChangeDetectorRef } from '@angular/core'\r\nimport { ConfigService } from 'tabby-core'\r\nimport { Subscription } from 'rxjs'\r\nimport { WorkspaceEditorService } from '../services/workspaceEditor.service'\r\nimport {\r\n Workspace,\r\n WorkspacePane,\r\n WorkspaceSplit,\r\n countPanes,\r\n createDefaultWorkspace,\r\n isWorkspaceSplit,\r\n} from '../models/workspace.model'\r\n\r\n@Component({\r\n selector: 'workspace-list',\r\n template: require('./workspaceList.component.pug'),\r\n styles: [require('./workspaceList.component.scss')],\r\n})\r\nexport class WorkspaceListComponent implements OnInit, OnDestroy {\r\n workspaces: Workspace[] = []\r\n editingWorkspace: Workspace | null = null\r\n showEditor = false\r\n private configSubscription: Subscription | null = null\r\n\r\n constructor(\r\n public config: ConfigService,\r\n private workspaceService: WorkspaceEditorService,\r\n private cdr: ChangeDetectorRef\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.loadWorkspaces()\r\n this.configSubscription = this.config.changed$.subscribe(() => {\r\n this.loadWorkspaces()\r\n })\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.configSubscription?.unsubscribe()\r\n }\r\n\r\n loadWorkspaces(): void {\r\n this.workspaces = this.workspaceService.getWorkspaces()\r\n this.cdr.detectChanges()\r\n }\r\n\r\n async createWorkspace(): Promise<void> {\r\n const profiles = await this.workspaceService.getAvailableProfiles()\r\n const defaultProfileId = profiles[0]?.id || ''\r\n const workspace = createDefaultWorkspace()\r\n this.setProfileForAllPanes(workspace.root, defaultProfileId)\r\n this.editingWorkspace = workspace\r\n this.showEditor = true\r\n }\r\n\r\n private setProfileForAllPanes(node: WorkspacePane | WorkspaceSplit, profileId: string): void {\r\n if (isWorkspaceSplit(node)) {\r\n node.children.forEach((child) => this.setProfileForAllPanes(child, profileId))\r\n } else {\r\n node.profileId = profileId\r\n }\r\n }\r\n\r\n editWorkspace(workspace: Workspace): void {\r\n this.editingWorkspace = JSON.parse(JSON.stringify(workspace))\r\n this.showEditor = true\r\n }\r\n\r\n async duplicateWorkspace(workspace: Workspace): Promise<void> {\r\n const clone = this.workspaceService.duplicateWorkspace(workspace)\r\n await this.workspaceService.addWorkspace(clone)\r\n this.loadWorkspaces()\r\n }\r\n\r\n async deleteWorkspace(workspace: Workspace): Promise<void> {\r\n console.log('[TabbySpaces] deleteWorkspace called', workspace.id)\r\n if (confirm(`Delete workspace \"${workspace.name}\"?`)) {\r\n console.log('[TabbySpaces] confirm = true, calling service.deleteWorkspace')\r\n await this.workspaceService.deleteWorkspace(workspace.id)\r\n console.log('[TabbySpaces] service.deleteWorkspace done, calling loadWorkspaces')\r\n this.loadWorkspaces()\r\n console.log('[TabbySpaces] loadWorkspaces done, workspaces:', this.workspaces.length)\r\n }\r\n }\r\n\r\n async onEditorSave(workspace: Workspace): Promise<void> {\r\n console.log('[TabbySpaces] onEditorSave called', workspace.id, workspace.name)\r\n const existing = this.workspaces.find((w) => w.id === workspace.id)\r\n console.log('[TabbySpaces] existing workspace?', !!existing)\r\n if (existing) {\r\n await this.workspaceService.updateWorkspace(workspace)\r\n } else {\r\n await this.workspaceService.addWorkspace(workspace)\r\n }\r\n console.log('[TabbySpaces] save done, calling loadWorkspaces')\r\n this.loadWorkspaces()\r\n console.log('[TabbySpaces] calling closeEditor')\r\n this.closeEditor()\r\n console.log('[TabbySpaces] closeEditor done, showEditor:', this.showEditor)\r\n }\r\n\r\n closeEditor(): void {\r\n console.log('[TabbySpaces] closeEditor called, showEditor before:', this.showEditor)\r\n this.showEditor = false\r\n this.editingWorkspace = null\r\n this.cdr.detectChanges()\r\n console.log('[TabbySpaces] closeEditor done, showEditor after:', this.showEditor)\r\n }\r\n\r\n getPaneCount(workspace: Workspace): number {\r\n return countPanes(workspace.root)\r\n }\r\n\r\n getOrientationLabel(workspace: Workspace): string {\r\n return workspace.root.orientation === 'horizontal' ? 'horizontal' : 'vertical'\r\n }\r\n\r\n async setAsDefault(workspace: Workspace): Promise<void> {\r\n this.workspaces.forEach((w) => (w.isDefault = false))\r\n workspace.isDefault = true\r\n await this.workspaceService.saveWorkspaces(this.workspaces)\r\n this.loadWorkspaces()\r\n }\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { SettingsTabProvider } from 'tabby-settings'\r\nimport { WorkspaceListComponent } from '../components/workspaceList.component'\r\nimport { CONFIG_KEY, DISPLAY_NAME } from '../build-config'\r\n\r\n@Injectable()\r\nexport class WorkspaceEditorSettingsProvider extends SettingsTabProvider {\r\n id = CONFIG_KEY\r\n icon = 'columns'\r\n title = DISPLAY_NAME\r\n\r\n getComponentType(): any {\r\n return WorkspaceListComponent\r\n }\r\n}\r\n","import { Injectable } from '@angular/core'\nimport { ToolbarButtonProvider, ToolbarButton, ProfilesService, AppService } from 'tabby-core'\nimport { WorkspaceEditorService } from '../services/workspaceEditor.service'\nimport { SettingsTabComponent } from 'tabby-settings'\nimport { CONFIG_KEY, DISPLAY_NAME } from '../build-config'\nimport { countPanes } from '../models/workspace.model'\n\n@Injectable()\nexport class WorkspaceToolbarProvider extends ToolbarButtonProvider {\n constructor(\n private workspaceService: WorkspaceEditorService,\n private profilesService: ProfilesService,\n private app: AppService\n ) {\n super()\n }\n\n provide(): ToolbarButton[] {\n return [\n {\n 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>`,\n title: DISPLAY_NAME,\n weight: 5,\n click: () => this.showWorkspaceSelector()\n }\n ]\n }\n\n private async showWorkspaceSelector(): Promise<void> {\n const workspaces = this.workspaceService.getWorkspaces()\n\n if (workspaces.length === 0) {\n this.openSettings()\n return\n }\n\n const options = workspaces.map((ws) => ({\n name: ws.name,\n description: `${countPanes(ws.root)} panes`,\n icon: ws.icon || 'grid',\n color: ws.color,\n result: ws.id\n }))\n\n // Add option to open settings\n options.push({\n name: 'Manage Workspaces...',\n description: 'Create and edit workspaces',\n icon: 'cog',\n color: undefined,\n result: '__settings__'\n })\n\n const selectedId = await this.app.showSelector('Select Workspace', options)\n\n if (selectedId === '__settings__') {\n this.openSettings()\n } else if (selectedId) {\n this.openWorkspace(selectedId)\n }\n }\n\n private openSettings(): void {\n this.app.openNewTabRaw({ type: SettingsTabComponent, inputs: { activeTab: CONFIG_KEY } })\n }\n\n private openWorkspace(workspaceId: string): void {\n const workspaces = this.workspaceService.getWorkspaces()\n const workspace = workspaces.find((w) => w.id === workspaceId)\n\n if (!workspace) return\n\n const profile = this.workspaceService.generateTabbyProfile(workspace)\n this.profilesService.openNewTabForProfile(profile)\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core'\r\nimport {\r\n Workspace,\r\n WorkspacePane,\r\n WorkspaceSplit,\r\n TabbyProfile,\r\n isWorkspaceSplit,\r\n createDefaultPane,\r\n generateUUID,\r\n} from '../models/workspace.model'\r\nimport { WorkspaceEditorService } from '../services/workspaceEditor.service'\r\n\r\n@Component({\r\n selector: 'workspace-editor',\r\n template: require('./workspaceEditor.component.pug'),\r\n styles: [require('./workspaceEditor.component.scss')],\r\n})\r\nexport class WorkspaceEditorComponent implements OnInit {\r\n @Input() workspace!: Workspace\r\n @Output() save = new EventEmitter<Workspace>()\r\n @Output() cancel = new EventEmitter<void>()\r\n\r\n selectedPane: WorkspacePane | null = null\r\n showPaneEditor = false\r\n profiles: TabbyProfile[] = []\r\n availableIcons = [\r\n 'columns', 'terminal', 'code', 'folder', 'home', 'briefcase',\r\n 'cog', 'database', 'server', 'cloud', 'rocket', 'flask',\r\n 'bug', 'wrench', 'cube', 'layer-group', 'sitemap', 'project-diagram'\r\n ]\r\n\r\n constructor(private workspaceService: WorkspaceEditorService) {}\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.profiles = await this.workspaceService.getAvailableProfiles()\r\n if (!this.workspace.root) {\r\n this.workspace.root = {\r\n orientation: 'horizontal',\r\n ratios: [0.5, 0.5],\r\n children: [createDefaultPane(), createDefaultPane()],\r\n }\r\n }\r\n }\r\n\r\n onSave(): void {\r\n if (!this.workspace.name?.trim()) {\r\n return\r\n }\r\n this.save.emit(this.workspace)\r\n }\r\n\r\n onCancel(): void {\r\n this.cancel.emit()\r\n }\r\n\r\n selectPane(pane: WorkspacePane): void {\r\n this.selectedPane = pane\r\n this.showPaneEditor = true\r\n }\r\n\r\n closePaneEditor(): void {\r\n this.showPaneEditor = false\r\n this.selectedPane = null\r\n }\r\n\r\n onPaneSave(pane: WorkspacePane): void {\r\n this.updatePaneInTree(this.workspace.root, pane)\r\n this.closePaneEditor()\r\n }\r\n\r\n private updatePaneInTree(node: WorkspaceSplit, updatedPane: WorkspacePane): boolean {\r\n for (let i = 0; i < node.children.length; i++) {\r\n const child = node.children[i]\r\n if (isWorkspaceSplit(child)) {\r\n if (this.updatePaneInTree(child, updatedPane)) {\r\n return true\r\n }\r\n } else if (child.id === updatedPane.id) {\r\n node.children[i] = updatedPane\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n splitPane(pane: WorkspacePane, orientation: 'horizontal' | 'vertical'): void {\r\n this.splitPaneInTree(this.workspace.root, pane, orientation)\r\n }\r\n\r\n private splitPaneInTree(\r\n node: WorkspaceSplit,\r\n targetPane: WorkspacePane,\r\n orientation: 'horizontal' | 'vertical'\r\n ): boolean {\r\n for (let i = 0; i < node.children.length; i++) {\r\n const child = node.children[i]\r\n if (isWorkspaceSplit(child)) {\r\n if (this.splitPaneInTree(child, targetPane, orientation)) {\r\n return true\r\n }\r\n } else if (child.id === targetPane.id) {\r\n const newPane = createDefaultPane()\r\n newPane.profileId = child.profileId // Copy profile from source pane\r\n const newSplit: WorkspaceSplit = {\r\n orientation,\r\n ratios: [0.5, 0.5],\r\n children: [child, newPane],\r\n }\r\n node.children[i] = newSplit\r\n this.recalculateRatios(node)\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n removePane(pane: WorkspacePane): void {\r\n this.removePaneFromTree(this.workspace.root, pane)\r\n }\r\n\r\n private removePaneFromTree(node: WorkspaceSplit, targetPane: WorkspacePane): boolean {\r\n for (let i = 0; i < node.children.length; i++) {\r\n const child = node.children[i]\r\n if (isWorkspaceSplit(child)) {\r\n // Check if the pane is directly in this split\r\n const paneIndex = child.children.findIndex(\r\n (c) => !isWorkspaceSplit(c) && (c as WorkspacePane).id === targetPane.id\r\n )\r\n if (paneIndex !== -1 && child.children.length > 1) {\r\n child.children.splice(paneIndex, 1)\r\n this.recalculateRatios(child)\r\n // If only one child remains, flatten\r\n if (child.children.length === 1) {\r\n node.children[i] = child.children[0]\r\n }\r\n return true\r\n }\r\n if (this.removePaneFromTree(child, targetPane)) {\r\n return true\r\n }\r\n } else if (child.id === targetPane.id) {\r\n if (node.children.length > 1) {\r\n node.children.splice(i, 1)\r\n this.recalculateRatios(node)\r\n return true\r\n }\r\n }\r\n }\r\n return false\r\n }\r\n\r\n private recalculateRatios(split: WorkspaceSplit): void {\r\n const count = split.children.length\r\n split.ratios = split.children.map(() => 1 / count)\r\n }\r\n\r\n setOrientation(orientation: 'horizontal' | 'vertical'): void {\r\n this.workspace.root.orientation = orientation\r\n }\r\n\r\n updateRatio(index: number, value: number): void {\r\n const ratios = [...this.workspace.root.ratios]\r\n const diff = value - ratios[index]\r\n\r\n if (index < ratios.length - 1) {\r\n ratios[index] = value\r\n ratios[index + 1] -= diff\r\n } else {\r\n ratios[index] = value\r\n ratios[index - 1] -= diff\r\n }\r\n\r\n // Clamp values\r\n ratios.forEach((r, i) => {\r\n ratios[i] = Math.max(0.1, Math.min(0.9, r))\r\n })\r\n\r\n this.workspace.root.ratios = ratios\r\n }\r\n\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnInit } from '@angular/core'\r\nimport { WorkspacePane, TabbyProfile } from '../models/workspace.model'\r\n\r\n@Component({\r\n selector: 'pane-editor',\r\n template: require('./paneEditor.component.pug'),\r\n styles: [require('./paneEditor.component.scss')],\r\n})\r\nexport class PaneEditorComponent implements OnInit {\r\n @Input() pane!: WorkspacePane\r\n @Input() profiles: TabbyProfile[] = []\r\n @Output() save = new EventEmitter<WorkspacePane>()\r\n @Output() cancel = new EventEmitter<void>()\r\n\r\n editedPane!: WorkspacePane\r\n\r\n ngOnInit(): void {\r\n this.editedPane = { ...this.pane }\r\n }\r\n\r\n onSave(): void {\r\n this.save.emit(this.editedPane)\r\n }\r\n\r\n onCancel(): void {\r\n this.cancel.emit()\r\n }\r\n\r\n getProfileName(profileId: string): string {\r\n const profile = this.profiles.find((p) => p.id === profileId)\r\n return profile?.name ?? 'Unknown'\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core'\r\nimport {\r\n WorkspaceSplit,\r\n WorkspacePane,\r\n isWorkspaceSplit,\r\n} from '../models/workspace.model'\r\nimport { WorkspaceEditorService } from '../services/workspaceEditor.service'\r\n\r\n@Component({\r\n selector: 'split-preview',\r\n template: require('./splitPreview.component.pug'),\r\n styles: [require('./splitPreview.component.scss')],\r\n})\r\nexport class SplitPreviewComponent {\r\n @Input() split!: WorkspaceSplit\r\n @Input() depth = 0\r\n @Output() paneClick = new EventEmitter<WorkspacePane>()\r\n @Output() splitHorizontal = new EventEmitter<WorkspacePane>()\r\n @Output() splitVertical = new EventEmitter<WorkspacePane>()\r\n @Output() removePane = new EventEmitter<WorkspacePane>()\r\n\r\n contextMenuPane: WorkspacePane | null = null\r\n contextMenuPosition = { x: 0, y: 0 }\r\n\r\n constructor(private workspaceService: WorkspaceEditorService) {}\r\n\r\n isPane(child: WorkspacePane | WorkspaceSplit): boolean {\r\n return !isWorkspaceSplit(child)\r\n }\r\n\r\n isSplit(child: WorkspacePane | WorkspaceSplit): boolean {\r\n return isWorkspaceSplit(child)\r\n }\r\n\r\n asSplit(child: WorkspacePane | WorkspaceSplit): WorkspaceSplit {\r\n return child as WorkspaceSplit\r\n }\r\n\r\n asPane(child: WorkspacePane | WorkspaceSplit): WorkspacePane {\r\n return child as WorkspacePane\r\n }\r\n\r\n getFlexStyle(index: number): string {\r\n return `${this.split.ratios[index] * 100}%`\r\n }\r\n\r\n onPaneClick(pane: WorkspacePane): void {\r\n this.paneClick.emit(pane)\r\n }\r\n\r\n onContextMenu(event: MouseEvent, pane: WorkspacePane): void {\r\n event.preventDefault()\r\n this.contextMenuPane = pane\r\n this.contextMenuPosition = { x: event.clientX, y: event.clientY }\r\n }\r\n\r\n closeContextMenu(): void {\r\n this.contextMenuPane = null\r\n }\r\n\r\n onSplitH(): void {\r\n if (this.contextMenuPane) {\r\n this.splitHorizontal.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onSplitV(): void {\r\n if (this.contextMenuPane) {\r\n this.splitVertical.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onRemove(): void {\r\n if (this.contextMenuPane) {\r\n this.removePane.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n getProfileName(profileId: string): string {\r\n return this.workspaceService.getProfileName(profileId) ?? 'Select profile'\r\n }\r\n\r\n getPaneLabel(pane: WorkspacePane): string {\r\n if (pane.title) return pane.title\r\n if (pane.startupCommand) {\r\n const cmd = pane.startupCommand\r\n return cmd.length > 20 ? cmd.substring(0, 17) + '...' : cmd\r\n }\r\n return this.getProfileName(pane.profileId)\r\n }\r\n\r\n // Pass-through events from nested splits\r\n onNestedPaneClick(pane: WorkspacePane): void {\r\n this.paneClick.emit(pane)\r\n }\r\n\r\n onNestedSplitH(pane: WorkspacePane): void {\r\n this.splitHorizontal.emit(pane)\r\n }\r\n\r\n onNestedSplitV(pane: WorkspacePane): void {\r\n this.splitVertical.emit(pane)\r\n }\r\n\r\n onNestedRemove(pane: WorkspacePane): void {\r\n this.removePane.emit(pane)\r\n }\r\n}\r\n","import { NgModule } from '@angular/core'\r\nimport { CommonModule } from '@angular/common'\r\nimport { FormsModule } from '@angular/forms'\r\nimport { ConfigProvider, ToolbarButtonProvider } from 'tabby-core'\r\nimport { SettingsTabProvider } from 'tabby-settings'\r\n\r\nimport { WorkspaceEditorConfigProvider } from './providers/config.provider'\r\nimport { WorkspaceEditorSettingsProvider } from './providers/settings.provider'\r\nimport { WorkspaceToolbarProvider } from './providers/toolbar.provider'\r\nimport { WorkspaceEditorService } from './services/workspaceEditor.service'\r\n\r\nimport { WorkspaceListComponent } from './components/workspaceList.component'\r\nimport { WorkspaceEditorComponent } from './components/workspaceEditor.component'\r\nimport { PaneEditorComponent } from './components/paneEditor.component'\r\nimport { SplitPreviewComponent } from './components/splitPreview.component'\r\n\r\n@NgModule({\r\n imports: [CommonModule, FormsModule],\r\n providers: [\r\n { provide: ConfigProvider, useClass: WorkspaceEditorConfigProvider, multi: true },\r\n { provide: SettingsTabProvider, useClass: WorkspaceEditorSettingsProvider, multi: true },\r\n { provide: ToolbarButtonProvider, useClass: WorkspaceToolbarProvider, multi: true },\r\n WorkspaceEditorService,\r\n ],\r\n declarations: [\r\n WorkspaceListComponent,\r\n WorkspaceEditorComponent,\r\n PaneEditorComponent,\r\n SplitPreviewComponent,\r\n ],\r\n})\r\nexport default class WorkspaceEditorModule {}\r\n\r\nexport {\r\n WorkspaceEditorService,\r\n WorkspaceEditorConfigProvider,\r\n WorkspaceEditorSettingsProvider,\r\n}\r\n"],"names":["root","factory","exports","module","require","e","define","amd","a","i","global","__WEBPACK_EXTERNAL_MODULE__860__","__WEBPACK_EXTERNAL_MODULE__358__","__WEBPACK_EXTERNAL_MODULE__182__","__WEBPACK_EXTERNAL_MODULE__650__","__WEBPACK_EXTERNAL_MODULE__700__","__WEBPACK_EXTERNAL_MODULE__947__","___CSS_LOADER_EXPORT___","push","id","result","__esModule","default","toString","locals","cssWithMappingToString","list","this","map","item","content","needLayer","concat","length","join","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","req","apply","pug_has_own_property","Object","prototype","hasOwnProperty","pug_classes","val","escaping","Array","isArray","className","classString","padding","escapeEnabled","pug_escape","pug_classes_array","key","call","pug_classes_object","pug_style","out","style","pug_attr","escaped","terse","type","toJSON","indexOf","replace","merge","pug_merge","b","arguments","attrs","valA","valB","classes","attr","obj","pug_match_html","_html","html","regexResult","exec","lastIndex","escape","index","charCodeAt","substring","rethrow","pug_rethrow","err","filename","lineno","str","Error","window","message","context","lines","start","end","encoding","split","Math","max","min","ex","slice","line","curr","path","code","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","d","definition","o","defineProperty","enumerable","get","prop","r","Symbol","toStringTag","value","CONFIG_KEY","DISPLAY_NAME","WorkspaceEditorConfigProvider","ConfigProvider","defaults","workspaces","isWorkspaceSplit","node","createDefaultPane","generateUUID","profileId","cwd","startupCommand","title","createDefaultSplit","orientation","ratios","children","c","random","countPanes","reduce","sum","child","Injectable","WorkspaceEditorService","constructor","config","notifications","profilesService","getWorkspaces","store","saveWorkspaces","syncTabbyProfiles","saveConfig","addWorkspace","workspace","info","name","updateWorkspace","findIndex","w","deleteWorkspace","workspaceId","find","filtered","filter","getAvailableProfiles","getProfiles","p","startsWith","profiles","splice","tabbyProfile","generateTabbyProfile","safeName","sanitizeForProfileId","group","icon","color","isBuiltin","options","recoveryToken","generateRecoveryToken","generatePaneToken","pane","baseProfile","getProfileById","profile","savedState","restoreFromPTYID","command","args","env","width","height","pauseAfterExit","runAsAdministrator","cmd","includes","toLowerCase","disableDynamicTitle","weight","isTemplate","terminalColorScheme","behaviorOnSessionEnd","tabTitle","tabCustomTitle","duplicateWorkspace","clone","parse","isDefault","regenerateIds","getProfileName","save","error","console","providedIn","ConfigService","NotificationsService","ProfilesService","WorkspaceListComponent","workspaceService","cdr","editingWorkspace","showEditor","configSubscription","ngOnInit","loadWorkspaces","changed$","subscribe","ngOnDestroy","unsubscribe","detectChanges","createWorkspace","defaultProfileId","createDefaultWorkspace","setProfileForAllPanes","forEach","editWorkspace","log","confirm","onEditorSave","existing","closeEditor","getPaneCount","getOrientationLabel","setAsDefault","Component","selector","template","styles","ChangeDetectorRef","WorkspaceEditorSettingsProvider","SettingsTabProvider","getComponentType","WorkspaceToolbarProvider","ToolbarButtonProvider","app","super","provide","click","showWorkspaceSelector","openSettings","ws","description","selectedId","showSelector","openWorkspace","openNewTabRaw","SettingsTabComponent","inputs","activeTab","openNewTabForProfile","AppService","WorkspaceEditorComponent","EventEmitter","cancel","selectedPane","showPaneEditor","availableIcons","onSave","trim","emit","onCancel","selectPane","closePaneEditor","onPaneSave","updatePaneInTree","updatedPane","splitPane","splitPaneInTree","targetPane","newPane","newSplit","recalculateRatios","removePane","removePaneFromTree","paneIndex","count","setOrientation","updateRatio","diff","Input","Output","PaneEditorComponent","editedPane","SplitPreviewComponent","depth","paneClick","splitHorizontal","splitVertical","contextMenuPane","contextMenuPosition","x","y","isPane","isSplit","asSplit","asPane","getFlexStyle","onPaneClick","onContextMenu","event","preventDefault","clientX","clientY","closeContextMenu","onSplitH","onSplitV","onRemove","getPaneLabel","onNestedPaneClick","onNestedSplitH","onNestedSplitV","onNestedRemove","WorkspaceEditorModule","NgModule","imports","CommonModule","FormsModule","providers","useClass","multi","declarations"],"ignoreList":[],"sourceRoot":""}
1
+ {"version":3,"file":"index.js","mappings":";CAAA,SAA2CA,EAAMC,GAChD,GAAsB,iBAAZC,SAA0C,iBAAXC,OACxCA,OAAOD,QAAUD,EAAQG,QAAQ,iBAAkBA,QAAQ,mBAAoBA,QAAQ,kBAAmBA,QAAQ,cAAeA,QAAQ,kBAAmBA,QAAQ,kBAAmBA,QAAQ,QAAU,WAA+C,IAAM,OAAOA,QAAQ,KAAO,CAAE,MAAMC,GAAI,CAAE,CAA1F,SACpM,GAAqB,mBAAXC,QAAyBA,OAAOC,IAC9CD,OAAO,CAAC,gBAAiB,kBAAmB,iBAAkB,aAAc,iBAAkB,iBAAkB,OAAQ,MAAOL,OAC3H,CACJ,IAAIO,EAAuB,iBAAZN,QAAuBD,EAAQG,QAAQ,iBAAkBA,QAAQ,mBAAoBA,QAAQ,kBAAmBA,QAAQ,cAAeA,QAAQ,kBAAmBA,QAAQ,kBAAmBA,QAAQ,QAAU,WAA+C,IAAM,OAAOA,QAAQ,KAAO,CAAE,MAAMC,GAAI,CAAE,CAA1F,IAAkGJ,EAAQD,EAAK,iBAAkBA,EAAK,mBAAoBA,EAAK,kBAAmBA,EAAK,cAAeA,EAAK,kBAAmBA,EAAK,kBAAmBA,EAAW,KAAGA,EAAS,IAC1e,IAAI,IAAIS,KAAKD,GAAuB,iBAAZN,QAAuBA,QAAUF,GAAMS,GAAKD,EAAEC,EACvE,CACA,CATD,CASGC,OAAQ,CAACC,EAAkCC,EAAkCC,EAAkCC,EAAkCC,EAAkCC,EAAkCC,EAAkCC,I,iGCNtPC,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACjB,EAAOkB,GAAI,09HAA29H,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,6DAA6D,MAAQ,GAAG,SAAW,orDAAorD,eAAiB,CAAC,u0KAAu0K,WAAa,MAE5oW,S,YCNQ,IAAIC,EAAS,EAAQ,KAEjBA,GAAUA,EAAOC,aACjBD,EAASA,EAAOE,SAIhBrB,EAAOD,QADW,iBAAXoB,EACUA,EAEAA,EAAOG,U,sBCVpCtB,EAAOD,QAAUW,C,aCCT,IAAIS,EAAS,EAAQ,KAEjBA,GAAUA,EAAOC,aACjBD,EAASA,EAAOE,SAIhBrB,EAAOD,QADW,iBAAXoB,EACUA,EAEAA,EAAOG,U,aCV1B,EAAQ,KAGlBtB,EAAOD,QADP,SAAkBwB,GAA63K,MAAr2K,GAAsD,44HAA+zK,C,aCFr5K,EAAQ,KAGlBvB,EAAOD,QADP,SAAkBwB,GAAyoE,MAAjnE,GAAsD,84CAA2kE,C,aCFjqE,EAAQ,KAGlBvB,EAAOD,QADP,SAAkBwB,GAA8gG,MAAt/F,GAAsD,6nEAAg9F,C,uFCC5iGP,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACjB,EAAOkB,GAAI,y8EAA08E,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,0DAA0D,MAAQ,GAAG,SAAW,uuCAAuuC,eAAiB,CAAC,kgHAAkgH,WAAa,MAEt2O,S,sBCDAlB,EAAOD,QAAU,SAAUyB,GACzB,IAAIC,EAAO,GA4EX,OAzEAA,EAAKH,SAAW,WACd,OAAOI,KAAKC,IAAI,SAAUC,GACxB,IAAIC,EAAU,GACVC,OAA+B,IAAZF,EAAK,GAoB5B,OAnBIA,EAAK,KACPC,GAAW,cAAcE,OAAOH,EAAK,GAAI,QAEvCA,EAAK,KACPC,GAAW,UAAUE,OAAOH,EAAK,GAAI,OAEnCE,IACFD,GAAW,SAASE,OAAOH,EAAK,GAAGI,OAAS,EAAI,IAAID,OAAOH,EAAK,IAAM,GAAI,OAE5EC,GAAWL,EAAuBI,GAC9BE,IACFD,GAAW,KAETD,EAAK,KACPC,GAAW,KAETD,EAAK,KACPC,GAAW,KAENA,CACT,GAAGI,KAAK,GACV,EAGAR,EAAKnB,EAAI,SAAW4B,EAASC,EAAOC,EAAQC,EAAUC,GAC7B,iBAAZJ,IACTA,EAAU,CAAC,CAAC,KAAMA,OAASK,KAE7B,IAAIC,EAAyB,CAAC,EAC9B,GAAIJ,EACF,IAAK,IAAIK,EAAI,EAAGA,EAAIf,KAAKM,OAAQS,IAAK,CACpC,IAAIvB,EAAKQ,KAAKe,GAAG,GACP,MAANvB,IACFsB,EAAuBtB,IAAM,EAEjC,CAEF,IAAK,IAAIwB,EAAK,EAAGA,EAAKR,EAAQF,OAAQU,IAAM,CAC1C,IAAId,EAAO,GAAGG,OAAOG,EAAQQ,IACzBN,GAAUI,EAAuBZ,EAAK,WAGrB,IAAVU,SACc,IAAZV,EAAK,KAGdA,EAAK,GAAK,SAASG,OAAOH,EAAK,GAAGI,OAAS,EAAI,IAAID,OAAOH,EAAK,IAAM,GAAI,MAAMG,OAAOH,EAAK,GAAI,MAF/FA,EAAK,GAAKU,GAMVH,IACGP,EAAK,IAGRA,EAAK,GAAK,UAAUG,OAAOH,EAAK,GAAI,MAAMG,OAAOH,EAAK,GAAI,KAC1DA,EAAK,GAAKO,GAHVP,EAAK,GAAKO,GAMVE,IACGT,EAAK,IAGRA,EAAK,GAAK,cAAcG,OAAOH,EAAK,GAAI,OAAOG,OAAOH,EAAK,GAAI,KAC/DA,EAAK,GAAKS,GAHVT,EAAK,GAAK,GAAGG,OAAOM,IAMxBZ,EAAKR,KAAKW,GACZ,CACF,EACOH,CACT,C,aCnFQ,IAAIN,EAAS,EAAQ,KAEjBA,GAAUA,EAAOC,aACjBD,EAASA,EAAOE,SAIhBrB,EAAOD,QADW,iBAAXoB,EACUA,EAEAA,EAAOG,U,sBCVpCtB,EAAOD,QAAUc,C,sBCEjBb,EAAOD,QAAU,SAAU6B,GACzB,IAAIC,EAAUD,EAAK,GACfe,EAAaf,EAAK,GACtB,IAAKe,EACH,OAAOd,EAET,GAAoB,mBAATe,KAAqB,CAC9B,IAAIC,EAASD,KAAKE,SAASC,mBAAmBC,KAAKC,UAAUN,MACzDO,EAAO,+DAA+DnB,OAAOc,GAC7EM,EAAgB,OAAOpB,OAAOmB,EAAM,OACxC,MAAO,CAACrB,GAASE,OAAO,CAACoB,IAAgBlB,KAAK,KAChD,CACA,MAAO,CAACJ,GAASI,KAAK,KACxB,C,sBCfAjC,EAAOD,QAAUU,C,uFCGbO,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACjB,EAAOkB,GAAI,qlDAAslD,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,2DAA2D,MAAQ,GAAG,SAAW,+sBAA+sB,eAAiB,CAAC,sqEAAsqE,WAAa,MAE/nJ,S,aCPU,EAAQ,KAGlBlB,EAAOD,QADP,SAAkBwB,GAAopI,MAA5nI,GAAsD,shGAAslI,C,aCFtrI,IAAI6B,EAAM,EAAQ,KAClBpD,EAAOD,SAAWqD,EAAa,SAAKA,GAAKC,MAAMD,EAAK,G,sBCDpDpD,EAAOD,QAAUY,C,sBCAjBX,EAAOD,QAAUa,C,0BCEjB,IAAI0C,EAAuBC,OAAOC,UAAUC,eAqF5C,SAASC,EAAYC,EAAKC,GACxB,OAAIC,MAAMC,QAAQH,GA1BpB,SAA2BA,EAAKC,GAK9B,IAJA,IACEG,EADEC,EAAc,GAEhBC,EAAU,GACVC,EAAgBL,MAAMC,QAAQF,GACvBtD,EAAI,EAAGA,EAAIqD,EAAI3B,OAAQ1B,KAC9ByD,EAAYL,EAAYC,EAAIrD,OAE5B4D,GAAiBN,EAAStD,KAAOyD,EAAYI,EAAWJ,IACxDC,EAAcA,EAAcC,EAAUF,EACtCE,EAAU,KAEZ,OAAOD,CACT,CAcWI,CAAkBT,EAAKC,GACrBD,GAAsB,iBAARA,EAd3B,SAA4BA,GAC1B,IAAIK,EAAc,GAChBC,EAAU,GACZ,IAAK,IAAII,KAAOV,EACVU,GAAOV,EAAIU,IAAQf,EAAqBgB,KAAKX,EAAKU,KACpDL,EAAcA,EAAcC,EAAUI,EACtCJ,EAAU,KAGd,OAAOD,CACT,CAKWO,CAAmBZ,GAEnBA,GAAO,EAElB,CAUA,SAASa,EAAUb,GACjB,IAAKA,EAAK,MAAO,GACjB,GAAmB,iBAARA,EAAkB,CAC3B,IAAIc,EAAM,GACV,IAAK,IAAIC,KAASf,EAEZL,EAAqBgB,KAAKX,EAAKe,KACjCD,EAAMA,EAAMC,EAAQ,IAAMf,EAAIe,GAAS,KAG3C,OAAOD,CACT,CACE,OAAOd,EAAM,EAEjB,CAYA,SAASgB,EAASN,EAAKV,EAAKiB,EAASC,GACnC,IACU,IAARlB,GACO,MAAPA,IACEA,IAAgB,UAARU,GAA2B,UAARA,GAE7B,MAAO,GAET,IAAY,IAARV,EACF,MAAO,KAAOkB,EAAQR,EAAMA,EAAM,KAAOA,EAAM,KAEjD,IAAIS,SAAcnB,EAOlB,MALY,WAATmB,GAA8B,aAATA,GACA,mBAAfnB,EAAIoB,SAEXpB,EAAMA,EAAIoB,UAEO,iBAARpB,IACTA,EAAMX,KAAKC,UAAUU,GAChBiB,IAAiC,IAAtBjB,EAAIqB,QAAQ,OAI1BJ,IAASjB,EAAMQ,EAAWR,IACvB,IAAMU,EAAM,KAAOV,EAAM,KAJrB,IAAMU,EAAM,KAAOV,EAAIsB,QAAQ,KAAM,SAAW,GAK7D,CA7IAlF,EAAQmF,MACR,SAASC,EAAU9E,EAAG+E,GACpB,GAAyB,IAArBC,UAAUrD,OAAc,CAE1B,IADA,IAAIsD,EAAQjF,EAAE,GACLC,EAAI,EAAGA,EAAID,EAAE2B,OAAQ1B,IAC5BgF,EAAQH,EAAUG,EAAOjF,EAAEC,IAE7B,OAAOgF,CACT,CAEA,IAAK,IAAIjB,KAAOe,EACd,GAAY,UAARf,EAAiB,CACnB,IAAIkB,EAAOlF,EAAEgE,IAAQ,GACrBhE,EAAEgE,IAAQR,MAAMC,QAAQyB,GAAQA,EAAO,CAACA,IAAOxD,OAAOqD,EAAEf,IAAQ,GAClE,MAAO,GAAY,UAARA,EAAiB,CAE1BkB,GADIA,EAAOf,EAAUnE,EAAEgE,MACkB,MAA1BkB,EAAKA,EAAKvD,OAAS,GAAauD,EAAO,IAAMA,EAC5D,IAAIC,EAAOhB,EAAUY,EAAEf,IACvBmB,EAAOA,GAAkC,MAA1BA,EAAKA,EAAKxD,OAAS,GAAawD,EAAO,IAAMA,EAC5DnF,EAAEgE,GAAOkB,EAAOC,CAClB,MACEnF,EAAEgE,GAAOe,EAAEf,GAIf,OAAOhE,CACT,EAmBAN,EAAQ0F,QAAU/B,EA2ClB3D,EAAQ2E,MAAQF,EA0BhBzE,EAAQ2F,KAAOf,EAoCf5E,EAAQuF,MACR,SAAmBK,EAAKd,GACtB,IAAIS,EAAQ,GAEZ,IAAK,IAAIjB,KAAOsB,EACd,GAAIrC,EAAqBgB,KAAKqB,EAAKtB,GAAM,CACvC,IAAIV,EAAMgC,EAAItB,GAEd,GAAI,UAAYA,EAAK,CAEnBiB,EAAQX,EAASN,EADjBV,EAAMD,EAAYC,IACS,EAAOkB,GAASS,EAC3C,QACF,CACI,UAAYjB,IACdV,EAAMa,EAAUb,IAElB2B,GAASX,EAASN,EAAKV,GAAK,EAAOkB,EACrC,CAGF,OAAOS,CACT,EAUA,IAAIM,EAAiB,SAErB,SAASzB,EAAW0B,GAClB,IAAIC,EAAO,GAAKD,EACZE,EAAcH,EAAeI,KAAKF,GACtC,IAAKC,EAAa,OAAOF,EAEzB,IACIvF,EAAG2F,EAAWC,EADd/E,EAAS,GAEb,IAAKb,EAAIyF,EAAYI,MAAOF,EAAY,EAAG3F,EAAIwF,EAAK9D,OAAQ1B,IAAK,CAC/D,OAAQwF,EAAKM,WAAW9F,IACtB,KAAK,GACH4F,EAAS,SACT,MACF,KAAK,GACHA,EAAS,QACT,MACF,KAAK,GACHA,EAAS,OACT,MACF,KAAK,GACHA,EAAS,OACT,MACF,QACE,SAEAD,IAAc3F,IAAGa,GAAU2E,EAAKO,UAAUJ,EAAW3F,IACzD2F,EAAY3F,EAAI,EAChBa,GAAU+E,CACZ,CACA,OAAID,IAAc3F,EAAUa,EAAS2E,EAAKO,UAAUJ,EAAW3F,GACnDa,CACd,CA/BApB,EAAQmG,OAAS/B,EA4CjBpE,EAAQuG,QACR,SAASC,EAAYC,EAAKC,EAAUC,EAAQC,GAC1C,KAAMH,aAAeI,OAAQ,MAAMJ,EACnC,KAAsB,oBAAVK,QAA0BJ,GAAcE,GAElD,MADAH,EAAIM,SAAW,YAAcJ,EACvBF,EAER,IAAIO,EAASC,EAAOC,EAAOC,EAC3B,IACEP,EAAMA,GAAO,oBAA2BF,EAAU,CAACU,SAAU,SAC7DJ,EAAU,EACVC,EAAQL,EAAIS,MAAM,MAClBH,EAAQI,KAAKC,IAAIZ,EAASK,EAAS,GACnCG,EAAMG,KAAKE,IAAIP,EAAMhF,OAAQ0E,EAASK,EACxC,CAAE,MAAOS,GAIP,OAHAhB,EAAIM,SACF,0BAA4BL,EAAW,KAAOe,EAAGV,QAAU,SAC7DP,EAAYC,EAAK,KAAME,EAEzB,CAGAK,EAAUC,EACPS,MAAMR,EAAOC,GACbvF,IAAI,SAAS+F,EAAMpH,GAClB,IAAIqH,EAAOrH,EAAI2G,EAAQ,EACvB,OAAQU,GAAQjB,EAAS,OAAS,QAAUiB,EAAO,KAAOD,CAC5D,GACCzF,KAAK,MAGRuE,EAAIoB,KAAOnB,EACX,IACED,EAAIM,SACDL,GAAY,OACb,IACAC,EACA,KACAK,EACA,OACAP,EAAIM,OACR,CAAE,MAAO5G,GAAI,CACb,MAAMsG,CACR,C,aC7RA,IAAIpD,EAAM,EAAQ,KAClBpD,EAAOD,SAAWqD,EAAa,SAAKA,GAAKC,MAAMD,EAAK,G,aCA5C,IAAIjC,EAAS,EAAQ,IAEjBA,GAAUA,EAAOC,aACjBD,EAASA,EAAOE,SAIhBrB,EAAOD,QADW,iBAAXoB,EACUA,EAEAA,EAAOG,U,sBCVpCtB,EAAOD,QAAUS,C,aCAjB,IAAI4C,EAAM,EAAQ,KAClBpD,EAAOD,SAAWqD,EAAa,SAAKA,GAAKC,MAAMD,EAAK,G,uFCEhDpC,E,MAA0B,GAA4B,KAE1DA,EAAwBC,KAAK,CAACjB,EAAOkB,GAAI,w6CAAy6C,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,wDAAwD,MAAQ,GAAG,SAAW,2uBAA2uB,eAAiB,CAAC,uiEAAuiE,WAAa,MAE52I,S,sBCPA,QAA+C,IAArCH,EAAkD,CAAE,IAAIb,EAAI,IAAI0G,MAAM,2BAAyD,MAA7B1G,EAAE2H,KAAO,mBAA0B3H,CAAG,CAElJF,EAAOD,QAAUgB,C,aCFjB,IAAIqC,EAAM,EAAQ,KAClBpD,EAAOD,SAAWqD,EAAa,SAAKA,GAAKC,MAAMD,EAAK,G,sBCDpDpD,EAAOD,QAAUe,C,GCCbgH,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBzF,IAAjB0F,EACH,OAAOA,EAAalI,QAGrB,QAAsCwC,IAAlC2F,EAAoBF,GAAyB,CAChD,IAAI9H,EAAI,IAAI0G,MAAM,uBAAyBoB,EAAW,KAEtD,MADA9H,EAAE2H,KAAO,mBACH3H,CACP,CAEA,IAAIF,EAAS8H,EAAyBE,GAAY,CACjD9G,GAAI8G,EAEJjI,QAAS,CAAC,GAOX,OAHAmI,EAAoBF,GAAUhI,EAAQA,EAAOD,QAASgI,GAG/C/H,EAAOD,OACf,CC3BAgI,EAAoBI,EAAKnI,IACxB,IAAIoI,EAASpI,GAAUA,EAAOoB,WAC7B,IAAOpB,EAAiB,QACxB,IAAM,EAEP,OADA+H,EAAoBM,EAAED,EAAQ,CAAE/H,EAAG+H,IAC5BA,GCLRL,EAAoBM,EAAI,CAACtI,EAASuI,KACjC,IAAI,IAAIjE,KAAOiE,EACXP,EAAoBQ,EAAED,EAAYjE,KAAS0D,EAAoBQ,EAAExI,EAASsE,IAC5Ed,OAAOiF,eAAezI,EAASsE,EAAK,CAAEoE,YAAY,EAAMC,IAAKJ,EAAWjE,MCJ3E0D,EAAoBQ,EAAI,CAAC5C,EAAKgD,IAAUpF,OAAOC,UAAUC,eAAea,KAAKqB,EAAKgD,GCClFZ,EAAoBa,EAAK7I,IACH,oBAAX8I,QAA0BA,OAAOC,aAC1CvF,OAAOiF,eAAezI,EAAS8I,OAAOC,YAAa,CAAEC,MAAO,WAE7DxF,OAAOiF,eAAezI,EAAS,aAAc,CAAEgJ,OAAO,K,wNCAhD,MAAMC,EAAqD,cACrDC,EAAyD,cCD/D,IAAMC,EAAN,cAA4C,EAAAC,eAA5C,c,oBACL,KAAAC,SAAW,CACT,CAACJ,GAAa,CACZK,WAAY,IAGlB,GANaH,E,mUAA6B,GADzC,IAAAI,eACYJ,G,sBCON,IAAMK,EAAN,MAIL,WAAAC,CAAoBC,GAAA,KAAAA,IAAAA,EAHZ,KAAAC,gBAA+C,IAAIC,IAIzDjI,KAAKkI,aAAelI,KAAK+H,IAAII,WAAWC,UAAWC,GAAQrI,KAAKsI,YAAYD,GAC9E,CAEA,gBAAAE,CAAiBC,GACfC,QAAQC,IAAI,sCAAuCF,GACnD,IAAK,MAAMG,KAAOH,EAChBxI,KAAKgI,gBAAgBY,IAAID,EAAIE,OAAQF,EAEzC,CAEQ,WAAAL,CAAYD,GAOlB,GANAI,QAAQC,IAAI,4BAA6B,CACvCtF,KAAMiF,EAAIP,YAAYgB,KACtBC,MAAOV,EAAIU,QAITV,aAAe,EAAAW,kBAIjB,OAHAP,QAAQC,IAAI,0EAEZO,WAAW,IAAMjJ,KAAKkJ,iBAAiBb,GAAM,KAK3CA,aAAe,EAAAc,0BACjBnJ,KAAKoJ,mBAAmBf,EAE5B,CAEQ,gBAAAa,CAAiBG,GAEvB,MAAMC,EAAUD,EAASE,aACzBd,QAAQC,IAAI,kCAAmCY,EAAQhJ,QAEvD,IAAK,MAAM+H,KAAOiB,EACZjB,aAAe,EAAAc,0BACjBnJ,KAAKoJ,mBAAmBf,EAG9B,CAGQ,kBAAAe,CAAmBI,GACzB,MAAMX,EAASW,EAAYC,aAAeD,EAAYT,MACtDN,QAAQC,IAAI,yCAA0C,CACpDK,MAAOS,EAAYT,MACnBU,YAAaD,EAAYC,YACzBZ,SACAa,YAAa,IAAI1J,KAAKgI,gBAAgB2B,UAGxC,MAAMC,EAAU5J,KAAKgI,gBAAgBhB,IAAI6B,GACzC,IAAKe,EAEH,YADAnB,QAAQC,IAAI,gDAAiDG,GAI/D7I,KAAKgI,gBAAgB6B,OAAOhB,GAG5B,MAAMiB,EAAc9J,KAAK+J,iBAAiBH,GACrCE,GAKLrB,QAAQC,IAAI,8DAA+DoB,GAGvEN,EAAYQ,SAASC,QACvBT,EAAYQ,QAAQC,QAAQC,MAC1B,IAAAC,UACA,IAAAC,WAAU,KAAM,IAAAC,OAAM,OACtBjC,UAAU,KACVK,QAAQC,IAAI,8CAA+CoB,GAC3DN,EAAYc,UAAUR,EAAc,MAGpC9J,KAAKuK,iBAAiBf,GAGlBI,EAAQY,cACVhB,EAAYiB,SAASb,EAAQY,eAE7BhB,EAAYC,YAAc,MAI9BhB,QAAQC,IAAI,6DAEZO,WAAW,KACTO,EAAYc,UAAUR,EAAc,MAGpC9J,KAAKuK,iBAAiBf,GAElBI,EAAQY,cACVhB,EAAYiB,SAASb,EAAQY,eAE7BhB,EAAYC,YAAc,IAE3B,OAvCHhB,QAAQC,IAAI,+DAyChB,CAEQ,gBAAAqB,CAAiBH,GACvB,OAAOA,EAAQc,SAAW,IAC5B,CAGQ,gBAAAH,CAAiBf,GAGvB,MAAMmB,EAAWnB,EAAoBmB,QACjCA,GAASC,SAASC,OACpBpC,QAAQC,IAAI,kEACZiC,EAAQC,QAAQC,KAAO,GAE3B,CAEA,WAAAC,GACE9K,KAAKkI,cAAc6C,aACrB,GC7DK,SAASC,EAAiBC,GAC/B,MAAO,gBAAiBA,GAAQ,aAAcA,CAChD,CAEO,SAASC,IACd,MAAO,CACL1L,GAAI2L,IACJC,UAAW,GACXC,IAAK,GACLC,eAAgB,GAChBvC,MAAO,GAEX,CAEO,SAASwC,EAAmBC,EAAyC,cAC1E,MAAO,CACLA,cACAC,OAAQ,CAAC,GAAK,IACdC,SAAU,CAACR,IAAqBA,KAEpC,CDvFarD,E,mUAAqB,GADjC,IAAAD,c,kIAK0B,EAAA+D,cAJd9D,GC0Fb,MAAM+D,EAAmB,CACvB,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAIIC,EAAkB,CACtB,UAAW,WAAY,OAAQ,SAAU,OAAQ,YACjD,MAAO,WAAY,SAAU,QAAS,SAAU,QAChD,MAAO,SAAU,OAAQ,cAAe,UAAW,mBAsB9C,SAASV,IACd,MAAO,uCAAuC5H,QAAQ,QAAUuI,IAC9D,MAAM5E,EAAqB,GAAhBvB,KAAKoG,SAAiB,EAEjC,OADgB,MAAND,EAAY5E,EAAS,EAAJA,EAAW,GAC7BtH,SAAS,KAEtB,CAEO,SAASoM,EAAWf,GACzB,OAAID,EAAiBC,GACZA,EAAKS,SAASO,OAAO,CAACC,EAAKC,IAAUD,EAAMF,EAAWG,GAAQ,GAEhE,CACT,CCxIO,IAAMC,EAAN,MAGL,WAAAtE,CACUuE,EACAC,EACAC,GAFA,KAAAF,OAAAA,EACA,KAAAC,cAAAA,EACA,KAAAC,gBAAAA,EALF,KAAAC,eAAiC,EAMtC,CAEK,mBAAMC,GACZzM,KAAKwM,qBAAwBxM,KAAKuM,gBAAgBG,aACpD,CAEA,aAAAC,GACE,OAAO3M,KAAKqM,OAAOO,QAAQtF,IAAaK,YAAc,EACxD,CAEA,oBAAMkF,CAAelF,GACnB,QAAK3H,KAAKqM,OAAOO,QAAQtF,KAGzBtH,KAAKqM,OAAOO,MAAMtF,GAAYK,WAAaA,QAC9B3H,KAAK8M,aACpB,CAEA,kBAAMC,CAAaC,GACjB,MAAMrF,EAAa3H,KAAK2M,gBACxBhF,EAAWpI,KAAKyN,SACVhN,KAAK6M,eAAelF,GAC1B3H,KAAKsM,cAAcW,KAAK,cAAcD,EAAUlE,gBAClD,CAEA,qBAAMoE,CAAgBF,GACpB,MAAMrF,EAAa3H,KAAK2M,gBAClBlI,EAAQkD,EAAWwF,UAAWC,GAAMA,EAAE5N,KAAOwN,EAAUxN,KAC9C,IAAXiF,IACFkD,EAAWlD,GAASuI,QACdhN,KAAK6M,eAAelF,GAC1B3H,KAAKsM,cAAcW,KAAK,cAAcD,EAAUlE,iBAEpD,CAEA,qBAAMuE,CAAgBC,GACpB,MAAM3F,EAAa3H,KAAK2M,gBAClBK,EAAYrF,EAAW4F,KAAMH,GAAMA,EAAE5N,KAAO8N,GAC5CE,EAAW7F,EAAW8F,OAAQL,GAAMA,EAAE5N,KAAO8N,SAC7CtN,KAAK6M,eAAeW,GACtBR,GACFhN,KAAKsM,cAAcW,KAAK,cAAcD,EAAUlE,gBAEpD,CAEA,0BAAM4E,GAEJ,aAD0B1N,KAAKuM,gBAAgBG,eAC5Be,OAChBE,IACa,UAAXA,EAAEvK,MAAoBuK,EAAEvK,MAAMwK,WAAW,aACzCD,EAAEnO,IAAIoO,WAAW,iBAExB,CAMA,uBAAAC,GACE,IAAK7N,KAAKqM,OAAOO,OAAOkB,SACtB,OAEF,MAAMA,EAA2B9N,KAAKqM,OAAOO,MAAMkB,SAC7CC,EAAS,gBAAgBzG,KACzBkG,EAAWM,EAASL,OAAQE,IAAOA,EAAEnO,IAAIoO,WAAWG,IACtDP,EAASlN,SAAWwN,EAASxN,SAC/BN,KAAKqM,OAAOO,MAAMkB,SAAWN,EAC7BxN,KAAKqM,OAAO2B,OACZvF,QAAQC,IAAI,IAAInB,iBAA4BuG,EAASxN,OAASkN,EAASlN,4BAE3E,CAEA,0BAAM2N,CAAqBjB,SACnBhN,KAAKyM,gBACX,MAAMyB,EAAWlO,KAAKmO,qBAAqBnB,EAAUlE,MACrD,MAAO,CACLtJ,GAAI,gBAAgB8H,KAAc4G,KAAYlB,EAAUxN,KACxD4D,KAAM,eACN0F,KAAMkE,EAAUlE,KAChBsF,MAAO7G,EACP8G,KAAMrB,EAAUqB,KAChBC,MAAOtB,EAAUsB,MACjBC,WAAW,EACX3D,QAAS,CACP4D,cAAexO,KAAKyO,sBAAsBzB,EAAU7O,OAG1D,CAEQ,qBAAAsQ,CAAsB/I,GAC5B,MAAO,CACLtC,KAAM,gBACNoI,YAAmC,eAAtB9F,EAAM8F,YAA+B,IAAM,IACxDC,OAAQ/F,EAAM+F,OACdC,SAAUhG,EAAMgG,SAASzL,IAAKkM,GACxBnB,EAAiBmB,GACZnM,KAAKyO,sBAAsBtC,GAE7BnM,KAAK0O,kBAAkBvC,IAGpC,CAEQ,iBAAAuC,CAAkBC,GACxB,MAAMC,EAAc5O,KAAK6O,eAAeF,EAAKvD,WAE7C,IAAKwD,EACH,MAAO,CACLxL,KAAM,gBACNuH,QAAS,CACPvH,KAAM,QACN0F,KAAM,SAERgG,YAAY,GAKhB,MAAMlE,EAAU,CACdmE,kBAAkB,EAClBrE,QAASkE,EAAYhE,SAASF,SAAW,GACzCG,KAAM+D,EAAYhE,SAASC,MAAQ,GACnCQ,IAAKsD,EAAKtD,KAAOuD,EAAYhE,SAASS,KAAO,GAC7C2D,IAAKJ,EAAYhE,SAASoE,KAAO,CAAC,EAClCC,MAAO,KACPC,OAAQ,KACRC,gBAAgB,EAChBC,oBAAoB,GAMhBzE,EAAU,CACdnL,GAAIoP,EAAYpP,GAChB4D,KAAM,QACN0F,KAAM8F,EAAY9F,MAAQ,QAC1BsF,MAAOQ,EAAYR,OAAS,GAC5BxD,UACAyD,KAAMO,EAAYP,MAAQ,GAC1BC,MAAOM,EAAYN,OAAS,GAC5Be,qBAAqB,EACrBC,OAAQ,EACRf,WAAW,EACXgB,YAAY,EACZC,oBAAqB,KACrBC,qBAAsB,QAKlBpE,EAAMsD,EAAKtD,KAAOuD,EAAYhE,SAASS,KAAO,GACpD,MAAO,CACLjI,KAAM,gBACNuH,UACAmE,YAAY,EACZY,SAAUf,EAAKnP,GACfmQ,eAAgBhB,EAAKnP,GACrB6P,qBAAqB,EACrBhE,MAEJ,CAEA,kBAAAuE,CAAmB5C,GACjB,MAAM6C,EAAQvO,KAAKwO,MAAMxO,KAAKC,UAAUyL,IAKxC,OAJA6C,EAAMrQ,GAAK2L,IACX0E,EAAM/G,KAAO,GAAGkE,EAAUlE,cAC1B+G,EAAME,iBAAkB,EACxB/P,KAAKgQ,cAAcH,EAAM1R,MAClB0R,CACT,CAEQ,aAAAG,CAAc/E,GACpB,GAAID,EAAiBC,GACnB,IAAK,MAAMkB,KAASlB,EAAKS,SACvB1L,KAAKgQ,cAAc7D,QAGrBlB,EAAKzL,GAAK2L,GAEd,CAEQ,oBAAAgD,CAAqBrF,GAC3B,OAAOA,EACJmH,cACA1M,QAAQ,cAAe,KACvBA,QAAQ,MAAO,KACfA,QAAQ,SAAU,KAChB,WACP,CAEQ,cAAAsL,CAAezD,GACrB,MAAM8E,EAAe9M,GAA0B,UAATA,GAAoBA,GAAMwK,WAAW,UAK3E,OAFqC5N,KAAKqM,OAAOO,OAAOkB,UAAY,IACzCP,KAAMI,GAAMA,EAAEnO,KAAO4L,GAAa8E,EAAYvC,EAAEvK,QAIpEpD,KAAKwM,eAAee,KAAMI,GAAMA,EAAEnO,KAAO4L,GAAa8E,EAAYvC,EAAEvK,MAC7E,CAEA,sBAAA+M,CAAuBnD,GACrB,MAAMxE,EAA6B,GAEnC,OADAxI,KAAKoQ,wBAAwBpD,EAAU7O,KAAMqK,GACtCA,CACT,CAEQ,uBAAA4H,CACNnF,EACAzC,GAEA,GAAIwC,EAAiBC,GACnB,IAAK,MAAMkB,KAASlB,EAAKS,SACvB1L,KAAKoQ,wBAAwBjE,EAAO3D,QAE7ByC,EAAKK,gBACd9C,EAASjJ,KAAK,CACZsJ,OAAQoC,EAAKzL,GACbkL,QAASO,EAAKK,eACdd,cAAeS,EAAKlC,OAAS,IAGnC,CAEQ,gBAAM+D,GACZ,IAEE,aADM9M,KAAKqM,OAAO2B,QACX,C,CACP,MAAOqC,GAGP,OAFArQ,KAAKsM,cAAc+D,MAAM,gCACzB5H,QAAQ4H,MAAM,0BAA2BA,IAClC,C,CAEX,GAlPWjE,E,mUAAsB,GADlC,IAAAxE,YAAW,CAAE0I,WAAY,S,kIAKN,EAAAC,cACO,EAAAC,qBACE,EAAAC,mBANhBrE,GCGN,IAAMsE,EAAN,MAQL,WAAA5I,CACSuE,EACCsE,EACApE,EACAqE,EACAC,EACAC,EACAC,GAND,KAAA1E,OAAAA,EACC,KAAAsE,iBAAAA,EACA,KAAApE,gBAAAA,EACA,KAAAqE,eAAAA,EACA,KAAAC,IAAAA,EACA,KAAAC,WAAAA,EACA,KAAAC,KAAAA,EAdV,KAAApJ,WAA0B,GAC1B,KAAAqJ,kBAAsC,KACtC,KAAAC,iBAAqC,KACrC,KAAAC,eAAgB,EAChB,KAAAC,mBAAoC,KAC5B,KAAAC,mBAA0C,IAU/C,CAEH,QAAAC,GACErR,KAAKsR,iBACLtR,KAAKuR,kBACLvR,KAAKoR,mBAAqBpR,KAAKqM,OAAOmF,SAASpJ,UAAU,KACvDpI,KAAKsR,kBAET,CAEA,eAAAG,GAEExI,WAAW,KACT,MAAMyI,EAAS1R,KAAK8Q,WAAWa,cAAcC,QAAQ,qBACjDF,IACFA,EAAO1O,MAAM6O,SAAW,UAEzB,EACL,CAEQ,eAAAN,GACFvR,KAAK2H,WAAWrH,OAAS,IAAMN,KAAKgR,mBACtChR,KAAK8R,gBAAgB9R,KAAK2H,WAAW,GAEzC,CAEA,eAAAmK,CAAgB9E,GACdhN,KAAKkR,eAAgB,EACrBlR,KAAKgR,kBAAoBhE,EACzBhN,KAAKiR,iBAAmB3P,KAAKwO,MAAMxO,KAAKC,UAAUyL,GACpD,CAEA,UAAA+E,CAAW/E,GACT,OAAOhN,KAAKgR,mBAAmBxR,KAAOwN,EAAUxN,EAClD,CAEA,WAAAsL,GACE9K,KAAKoR,oBAAoBrG,aAC3B,CAEA,cAAAuG,GACEtR,KAAK2H,WAAa3H,KAAK2Q,iBAAiBhE,gBACxC3M,KAAK6Q,IAAImB,eACX,CAEA,qBAAMC,GACJ,MAAMnE,QAAiB9N,KAAK2Q,iBAAiBjD,uBACvCwE,EAAmBpE,EAAS,IAAItO,IAAM,GACtCwN,EF6CH,SAAgClE,EAAe,IACpD,MAAO,CACLtJ,GAAI2L,IACJrC,OACAuF,KAPKxC,EAAgBlG,KAAKwM,MAAMxM,KAAKoG,SAAWF,EAAgBvL,SAQhEgO,MAZK1C,EAAiBjG,KAAKwM,MAAMxM,KAAKoG,SAAWH,EAAiBtL,SAalEnC,KAAMoN,IACNwE,iBAAiB,EAErB,CEtDsBqC,GAClBpS,KAAKqS,sBAAsBrF,EAAU7O,KAAM+T,GAC3ClS,KAAKgR,kBAAoB,KACzBhR,KAAKiR,iBAAmBjE,EACxBhN,KAAKkR,eAAgB,EACrBlR,KAAK6Q,IAAImB,eACX,CAEQ,qBAAAK,CAAsBpH,EAAsCG,GAC9DJ,EAAiBC,GACnBA,EAAKS,SAAS4G,QAASnG,GAAUnM,KAAKqS,sBAAsBlG,EAAOf,IAEnEH,EAAKG,UAAYA,CAErB,CAEA,aAAAmH,CAAcvF,GACZhN,KAAK8R,gBAAgB9E,EACvB,CAEA,wBAAM4C,CAAmB4C,EAAmBxF,GAC1CwF,EAAMC,kBACN,MAAM5C,EAAQ7P,KAAK2Q,iBAAiBf,mBAAmB5C,SACjDhN,KAAK2Q,iBAAiB5D,aAAa8C,GACzC7P,KAAKsR,iBAGL,MAAMoB,EAAa1S,KAAK2H,WAAW4F,KAAMH,GAAMA,EAAE5N,KAAOqQ,EAAMrQ,IAC1DkT,GACF1S,KAAK8R,gBAAgBY,GAEvB1S,KAAK6Q,IAAImB,eACX,CAEA,qBAAM3E,CAAgBmF,EAAmBxF,GAEvC,GADAwF,EAAMC,kBACFE,QAAQ,qBAAqB3F,EAAUlE,UAAW,CACpD,MAAM8J,EAAe5S,KAAK2H,WAAWwF,UAAWC,GAAMA,EAAE5N,KAAOwN,EAAUxN,IAKzE,SAJMQ,KAAK2Q,iBAAiBtD,gBAAgBL,EAAUxN,IACtDQ,KAAKsR,iBAGDtR,KAAK2H,WAAWrH,OAAS,EAAG,CAC9B,MAAMuS,EAAYlN,KAAKE,IAAI+M,EAAc5S,KAAK2H,WAAWrH,OAAS,GAClEN,KAAK8R,gBAAgB9R,KAAK2H,WAAWkL,G,MAErC7S,KAAKgR,kBAAoB,KACzBhR,KAAKiR,iBAAmB,KACxBjR,KAAKkR,eAAgB,EAEvBlR,KAAK6Q,IAAImB,e,CAEb,CAEA,kBAAMc,CAAa9F,GACFhN,KAAK2H,WAAW4F,KAAMH,GAAMA,EAAE5N,KAAOwN,EAAUxN,UAItDQ,KAAK2Q,iBAAiBzD,gBAAgBF,SAFtChN,KAAK2Q,iBAAiB5D,aAAaC,GAI3ChN,KAAKsR,iBACLtR,KAAKkR,eAAgB,EAGrB,MAAM6B,EAAQ/S,KAAK2H,WAAW4F,KAAMH,GAAMA,EAAE5N,KAAOwN,EAAUxN,IACzDuT,GACF/S,KAAK8R,gBAAgBiB,GAEvB/S,KAAK6Q,IAAImB,eACX,CAEA,cAAAgB,GACMhT,KAAKkR,eAEPlR,KAAKkR,eAAgB,EACjBlR,KAAK2H,WAAWrH,OAAS,EAC3BN,KAAK8R,gBAAgB9R,KAAK2H,WAAW,KAErC3H,KAAKgR,kBAAoB,KACzBhR,KAAKiR,iBAAmB,OAEjBjR,KAAKgR,oBAEdhR,KAAKiR,iBAAmB3P,KAAKwO,MAAMxO,KAAKC,UAAUvB,KAAKgR,qBAEzDhR,KAAK6Q,IAAImB,eACX,CAEA,YAAAiB,CAAajG,GACX,OAAOhB,EAAWgB,EAAU7O,KAC9B,CAEA,mBAAA+U,CAAoBlG,GAClB,MAAsC,eAA/BA,EAAU7O,KAAKqN,YAA+B,aAAe,UACtE,CAEA,qBAAI2H,GACF,OAAKnT,KAAKiR,kBAAqBjR,KAAKgR,kBAC7B1P,KAAKC,UAAUvB,KAAKiR,oBAAsB3P,KAAKC,UAAUvB,KAAKgR,mBADPhR,KAAKkR,aAErE,CAEA,mBAAMkC,CAAcZ,EAAmBxF,GAErC,GADAwF,EAAMC,mBACFzS,KAAKmR,mBAAT,CACAnR,KAAKmR,mBAAqBnE,EAAUxN,GAEpC,IACE,MAAMgJ,EAAWxI,KAAK2Q,iBAAiBR,uBAAuBnD,GAC1DxE,EAASlI,OAAS,GACpBN,KAAK4Q,eAAerI,iBAAiBC,GAGvC,MAAMmC,QAAgB3K,KAAK2Q,iBAAiB1C,qBAAqBjB,GACjEhN,KAAK+Q,KAAKsC,IAAI,KACZrT,KAAKuM,gBAAgB+G,qBAAqB3I,I,SAG5C3K,KAAKmR,mBAAqB,KAC1BnR,KAAK6Q,IAAImB,e,CAfwB,CAiBrC,GAzLWtB,E,mUAAsB,GALlC,IAAA6C,WAAU,CACTC,SAAU,iBACVC,SAAU,EAAQ,KAClBC,OAAQ,CAAC,EAAQ,Q,kIAWA,EAAAnD,cACWnE,EACD,EAAAqE,gBACD5I,EACX,EAAA8L,kBACO,EAAAC,WACN,EAAAC,UAfLnD,GCbN,IAAMoD,EAAN,cAA8C,EAAAC,oBAA9C,c,oBACL,KAAAvU,GAAK8H,EACL,KAAA+G,KAAyB,WACzB,KAAAtF,MAAQxB,CAKV,CAHE,gBAAAyM,GACE,OAAOtD,CACT,GAPWoD,E,mUAA+B,GAD3C,IAAAlM,eACYkM,GCcN,IAAMG,EAAN,cAAuC,EAAAC,sBAC5C,WAAApM,CACU6I,EACApE,EACAxE,EACA6I,GAERuD,QALQ,KAAAxD,iBAAAA,EACA,KAAApE,gBAAAA,EACA,KAAAxE,IAAAA,EACA,KAAA6I,eAAAA,EAIR3H,WAAW,KAETjJ,KAAK2Q,iBAAiB9C,0BAEtB7N,KAAKoU,2BACJ,IACL,CAEQ,6BAAMA,GACZ,MACMC,EADarU,KAAK2Q,iBAAiBhE,gBACJc,OAAOL,GAAKA,EAAE2C,iBAEnD,IAAK,MAAM/C,KAAaqH,QAChBrU,KAAKoT,cAAcpG,EAAUxN,GAEvC,CAEA,OAAA8U,GACE,MAAO,CACL,CACEjG,KA1CU,6VA2CVtF,MAAOxB,EACP+H,OAAQ,EACRiF,MAAO,IAAMvU,KAAKwU,yBAGxB,CAEQ,2BAAMA,GACZ,MAAM7M,EAAa3H,KAAK2Q,iBAAiBhE,gBAEzC,GAA0B,IAAtBhF,EAAWrH,OAEb,YADAN,KAAKyU,eAIP,MAAM7J,EAAUjD,EAAW1H,IAAKyU,IAAO,CACrC5L,KAAM4L,EAAG5L,KACT6L,YAAa,GAAG3I,EAAW0I,EAAGvW,cAC9BkQ,KAAMqG,EAAGrG,MAAQ,OACjBC,MAAOoG,EAAGpG,MACV7O,OAAQiV,EAAGlV,MAIboL,EAAQrL,KAAK,CACXuJ,KAAM,uBACN6L,YAAa,6BACbtG,KAAM,MACNC,WAAOzN,EACPpB,OAAQ,iBAGV,MAAMmV,QAAmB5U,KAAK+H,IAAI8M,aAAa,mBAAoBjK,GAEhD,iBAAfgK,EACF5U,KAAKyU,eACIG,GACT5U,KAAKoT,cAAcwB,EAEvB,CAEQ,YAAAH,GACNzU,KAAK+H,IAAI+M,cAAc,CAAE1R,KAAM,EAAA2R,qBAAsBC,OAAQ,CAAEC,UAAW3N,IAC5E,CAEQ,mBAAM8L,CAAc9F,GAC1B,MACMN,EADahN,KAAK2Q,iBAAiBhE,gBACZY,KAAMH,GAAMA,EAAE5N,KAAO8N,GAElD,IAAKN,EAAW,OAIhB,MAAMxE,EAAWxI,KAAK2Q,iBAAiBR,uBAAuBnD,GAC1DxE,EAASlI,OAAS,GACpBN,KAAK4Q,eAAerI,iBAAiBC,GAGvC,MAAMmC,QAAgB3K,KAAK2Q,iBAAiB1C,qBAAqBjB,GACjEhN,KAAKuM,gBAAgB+G,qBAAqB3I,EAC5C,GA1FWsJ,E,mUAAwB,GADpC,IAAArM,c,kIAG6BwE,EACD,EAAAqE,gBACZ,EAAA9E,WACW9D,KALfoM,G,ybCHN,IAAMiB,EAAN,MAoBL,WAAApN,CACU6I,EACAG,GADA,KAAAH,iBAAAA,EACA,KAAAG,WAAAA,EApBD,KAAAqE,WAAY,EACZ,KAAAhC,mBAAoB,EACnB,KAAAnF,KAAO,IAAI,EAAAoH,aACX,KAAAC,OAAS,IAAI,EAAAD,aAIvB,KAAAE,eAAgC,KAChC,KAAAC,YAAoC,KACpC,KAAAC,gBAAiB,EACjB,KAAA1H,SAA2B,GAC3B,KAAA2H,eAAiB,CACf,UAAW,WAAY,OAAQ,SAAU,OAAQ,YACjD,MAAO,WAAY,SAAU,QAAS,SAAU,QAChD,MAAO,SAAU,OAAQ,cAAe,UAAW,mBAErD,KAAAC,kBAAmB,CAKhB,CAGH,eAAAC,CAAgBnD,GACd,MAAMoD,EAAa5V,KAAK8Q,WAAWa,cAAckE,cAAc,gBAC3DD,IAAeA,EAAWE,SAAStD,EAAMuD,UAC3C/V,KAAK0V,kBAAmB,EAE5B,CAEA,kBAAAM,GACEhW,KAAK0V,kBAAoB1V,KAAK0V,gBAChC,CAEA,UAAAO,CAAW5H,GACTrO,KAAKgN,UAAUqB,KAAOA,EACtBrO,KAAK0V,kBAAmB,CAC1B,CAEA,cAAMrE,GACJrR,KAAK8N,eAAiB9N,KAAK2Q,iBAAiBjD,uBAC5C1N,KAAKkW,qBACP,CAEA,eAAAzE,GACMzR,KAAKmV,WACPnV,KAAKmW,gBAET,CAEQ,cAAAA,GACNC,sBAAsB,KACpBnN,WAAW,KACLjJ,KAAKqW,WAAW1E,gBAClB3R,KAAKqW,UAAU1E,cAAc2E,QAC7BtW,KAAKqW,UAAU1E,cAAc4E,WAE9B,IAEP,CAEA,WAAAC,CAAYC,GACNA,EAAmB,YAAMA,EAAmB,UAAEC,cAEhD1W,KAAKsV,eAAiB,KACtBtV,KAAKuV,YAAc,KACnBvV,KAAKwV,gBAAiB,EACtBxV,KAAK0V,kBAAmB,EACxB1V,KAAKkW,uBAIHO,EAAmB,WAAGE,cACxB3W,KAAKmW,gBAET,CAEQ,mBAAAD,GACDlW,KAAKgN,UAAU7O,OAClB6B,KAAKgN,UAAU7O,KAAO,CACpBqN,YAAa,aACbC,OAAQ,CAAC,GAAK,IACdC,SAAU,CAACR,IAAqBA,MAGtC,CAEA,MAAA0L,GACO5W,KAAKgN,UAAUlE,MAAM+N,QAG1B7W,KAAKgO,KAAK8I,KAAK9W,KAAKgN,UACtB,CAEA,QAAA+J,GACE/W,KAAKqV,OAAOyB,MACd,CAEA,UAAAE,CAAWrI,GACT3O,KAAKsV,eAAiB3G,EAAKnP,EAC7B,CAEA,YAAAyX,GACEjX,KAAKsV,eAAiB,IACxB,CAEA,wBAAA4B,GACElX,KAAKiX,cACP,CAEA,QAAAE,CAASxI,GACP3O,KAAKuV,YAAc5G,EACnB3O,KAAKwV,gBAAiB,CACxB,CAEA,gBAAA4B,GACE,IAAKpX,KAAKsV,eAAgB,OAC1B,MAAM3G,EAAO3O,KAAKqX,aAAarX,KAAKsV,gBAChC3G,GAAM3O,KAAKmX,SAASxI,EAC1B,CAEA,eAAA2I,GACEtX,KAAKwV,gBAAiB,EACtBxV,KAAKuV,YAAc,IACrB,CAEA,UAAAgC,CAAW5I,GACT3O,KAAKwX,iBAAiBxX,KAAKgN,UAAU7O,KAAMwQ,GAC3C3O,KAAKsX,iBACP,CAGQ,YAAAD,CAAa7X,GACnB,OAAOQ,KAAKyX,eAAezX,KAAKgN,UAAU7O,KAAMqB,EAClD,CAEQ,cAAAiY,CAAexM,EAAsBzL,GAC3C,IAAK,MAAM2M,KAASlB,EAAKS,SACvB,GAAIV,EAAiBmB,GAAQ,CAC3B,MAAMuL,EAAQ1X,KAAKyX,eAAetL,EAAO3M,GACzC,GAAIkY,EAAO,OAAOA,C,MACb,GAAIvL,EAAM3M,KAAOA,EACtB,OAAO2M,EAGX,OAAO,IACT,CAEA,aAAAwL,GACE,OAAO3X,KAAKgM,WAAWhM,KAAKgN,UAAU7O,MAAQ,CAChD,CAEQ,UAAA6N,CAAWf,GACjB,OAAOA,EAAKS,SAASO,OAAO,CAAC2L,EAAOzL,IAC3ByL,GAAS5M,EAAiBmB,GAASnM,KAAKgM,WAAWG,GAAS,GAClE,EACL,CAEQ,gBAAAqL,CAAiBvM,EAAsB4M,GAC7C,IAAK,IAAIjZ,EAAI,EAAGA,EAAIqM,EAAKS,SAASpL,OAAQ1B,IAAK,CAC7C,MAAMuN,EAAQlB,EAAKS,SAAS9M,GAC5B,GAAIoM,EAAiBmB,IACnB,GAAInM,KAAKwX,iBAAiBrL,EAAO0L,GAC/B,OAAO,OAEJ,GAAI1L,EAAM3M,KAAOqY,EAAYrY,GAElC,OADAyL,EAAKS,SAAS9M,GAAKiZ,GACZ,C,CAGX,OAAO,CACT,CAEA,SAAAC,CAAUnJ,EAAqBnD,GAC7BxL,KAAK+X,gBAAgB/X,KAAKgN,UAAU7O,KAAMwQ,EAAMnD,EAClD,CAEA,iBAAAwM,CAAkBxM,GAChB,IAAKxL,KAAKsV,eAAgB,OAC1B,MAAM3G,EAAO3O,KAAKqX,aAAarX,KAAKsV,gBAChC3G,GAAM3O,KAAK8X,UAAUnJ,EAAMnD,EACjC,CAEQ,eAAAuM,CACN9M,EACAgN,EACAzM,GAEA,IAAK,IAAI5M,EAAI,EAAGA,EAAIqM,EAAKS,SAASpL,OAAQ1B,IAAK,CAC7C,MAAMuN,EAAQlB,EAAKS,SAAS9M,GAC5B,GAAIoM,EAAiBmB,IACnB,GAAInM,KAAK+X,gBAAgB5L,EAAO8L,EAAYzM,GAC1C,OAAO,OAEJ,GAAIW,EAAM3M,KAAOyY,EAAWzY,GAAI,CACrC,MAAM0Y,EAAUhN,IAChBgN,EAAQ9M,UAAYe,EAAMf,UAC1B,MAAM+M,EAA2B,CAC/B3M,cACAC,OAAQ,CAAC,GAAK,IACdC,SAAU,CAACS,EAAO+L,IAIpB,OAFAjN,EAAKS,SAAS9M,GAAKuZ,EACnBnY,KAAKoY,kBAAkBnN,IAChB,C,EAGX,OAAO,CACT,CAEA,UAAAoN,CAAW1J,GACL3O,KAAKsV,iBAAmB3G,EAAKnP,KAC/BQ,KAAKsV,eAAiB,MAExBtV,KAAKsY,mBAAmBtY,KAAKgN,UAAU7O,KAAMwQ,EAC/C,CAEA,kBAAA4J,GACE,IAAKvY,KAAKsV,iBAAmBtV,KAAK2X,gBAAiB,OACnD,MAAMhJ,EAAO3O,KAAKqX,aAAarX,KAAKsV,gBAChC3G,GAAM3O,KAAKqY,WAAW1J,EAC5B,CAEQ,kBAAA2J,CAAmBrN,EAAsBgN,GAC/C,IAAK,IAAIrZ,EAAI,EAAGA,EAAIqM,EAAKS,SAASpL,OAAQ1B,IAAK,CAC7C,MAAMuN,EAAQlB,EAAKS,SAAS9M,GAC5B,GAAIoM,EAAiBmB,GAAQ,CAE3B,MAAMqM,EAAYrM,EAAMT,SAASyB,UAC9BrB,IAAOd,EAAiBc,IAAOA,EAAoBtM,KAAOyY,EAAWzY,IAExE,IAAmB,IAAfgZ,GAAoBrM,EAAMT,SAASpL,OAAS,EAO9C,OANA6L,EAAMT,SAAS+M,OAAOD,EAAW,GACjCxY,KAAKoY,kBAAkBjM,GAEO,IAA1BA,EAAMT,SAASpL,SACjB2K,EAAKS,SAAS9M,GAAKuN,EAAMT,SAAS,KAE7B,EAET,GAAI1L,KAAKsY,mBAAmBnM,EAAO8L,GACjC,OAAO,C,MAEJ,GAAI9L,EAAM3M,KAAOyY,EAAWzY,IAC7ByL,EAAKS,SAASpL,OAAS,EAGzB,OAFA2K,EAAKS,SAAS+M,OAAO7Z,EAAG,GACxBoB,KAAKoY,kBAAkBnN,IAChB,C,CAIb,OAAO,CACT,CAEQ,iBAAAmN,CAAkB1S,GACxB,MAAMkS,EAAQlS,EAAMgG,SAASpL,OAC7BoF,EAAM+F,OAAS/F,EAAMgG,SAASzL,IAAI,IAAM,EAAI2X,EAC9C,CAEA,cAAAc,CAAelN,GACbxL,KAAKgN,UAAU7O,KAAKqN,YAAcA,CACpC,CAEA,WAAAmN,CAAYlU,EAAe4C,GACzB,MAAMoE,EAAS,IAAIzL,KAAKgN,UAAU7O,KAAKsN,QACjCmN,EAAOvR,EAAQoE,EAAOhH,GAExBA,EAAQgH,EAAOnL,OAAS,GAC1BmL,EAAOhH,GAAS4C,EAChBoE,EAAOhH,EAAQ,IAAMmU,IAErBnN,EAAOhH,GAAS4C,EAChBoE,EAAOhH,EAAQ,IAAMmU,GAIvBnN,EAAO6G,QAAQ,CAACpL,EAAGtI,KACjB6M,EAAO7M,GAAK+G,KAAKC,IAAI,GAAKD,KAAKE,IAAI,GAAKqB,MAG1ClH,KAAKgN,UAAU7O,KAAKsN,OAASA,CAC/B,CAGA,OAAAoN,CAAQC,GACN,IAAK9Y,KAAKsV,eAAgB,OAC1B,MAAM3G,EAAO3O,KAAKqX,aAAarX,KAAKsV,gBAC/B3G,GACL3O,KAAK+Y,cAAc/Y,KAAKgN,UAAU7O,KAAMwQ,EAAMmK,EAAW,KAC3D,CAEA,gBAAAE,CAAiBrK,EAAqBmK,GACpC9Y,KAAK+Y,cAAc/Y,KAAKgN,UAAU7O,KAAMwQ,EAAMmK,EAAW,KAC3D,CAEQ,aAAAC,CACN9N,EACAgN,EACAa,EACAG,GAEA,MACMC,EAAyB,SAAdJ,GAAsC,QAAdA,EACnCK,EAFgC,SAAdL,GAAsC,UAAdA,EAEJ,aAAe,WAE3D,IAAK,IAAIla,EAAI,EAAGA,EAAIqM,EAAKS,SAASpL,OAAQ1B,IAAK,CAC7C,MAAMuN,EAAQlB,EAAKS,SAAS9M,GAE5B,GAAIoM,EAAiBmB,IACnB,GAAInM,KAAK+Y,cAAc5M,EAAO8L,EAAYa,EAAW7N,GAAO,OAAO,OAC9D,GAAIkB,EAAM3M,KAAOyY,EAAWzY,GAAI,CACrC,MAAM0Y,EAAUhN,IAGhB,GAFAgN,EAAQ9M,UAAYe,EAAMf,UAEtBH,EAAKO,cAAgB2N,EAAmB,CAE1C,MAAMC,EAAcF,EAAWta,EAAIA,EAAI,EACvCqM,EAAKS,SAAS+M,OAAOW,EAAa,EAAGlB,GACrClY,KAAKoY,kBAAkBnN,E,KAClB,CAEL,MAAMoO,EAA2B,CAC/B7N,YAAaP,EAAKO,YAClBC,OAAQ,IAAIR,EAAKQ,QACjBC,SAAU,IAAIT,EAAKS,WAEf4N,EAA0B,CAC9B9N,YAAa2N,EACb1N,OAAQ,CAAC,GAAK,IACdC,SAAUwN,EAAW,CAAChB,EAASmB,GAAY,CAACA,EAAUnB,IAGxD,GAAIjN,IAASjL,KAAKgN,UAAU7O,KAC1B6B,KAAKgN,UAAU7O,KAAOmb,OACjB,GAAIL,EAAY,CACrB,MAAMM,EAAYN,EAAWvN,SAASpI,QAAQ2H,IAC3B,IAAfsO,IACFN,EAAWvN,SAAS6N,GAAaD,E,EAIvC,OAAO,C,EAGX,OAAO,CACT,GA3VA,IAAC,IAAAE,S,yDACD,IAAC,IAAAA,S,yDACD,IAAC,IAAAA,S,iEACD,IAAC,IAAAC,U,oDACD,IAAC,IAAAA,U,sDAED,IAAC,IAAAC,WAAU,a,gBAAyB,EAAA9F,a,gCAkBpC,IAAC,IAAA+F,cAAa,iBAAkB,CAAC,W,iDACVC,a,mEA1BZ1E,EAAwB,IALpC,IAAA3B,WAAU,CACTC,SAAU,mBACVC,SAAU,EAAQ,KAClBC,OAAQ,CAAC,EAAQ,Q,uBAuBWtH,EACN,EAAAwH,cAtBXsB,G,ybCTN,IAAM2E,EAAN,oBAEI,KAAA/L,SAA2B,GAC1B,KAAAE,KAAO,IAAI,EAAAoH,aACX,KAAAC,OAAS,IAAI,EAAAD,aAIf,KAAA0E,wBAAyB,CAkCnC,CAhCE,QAAAzI,GACErR,KAAK+Z,WAAa,IAAK/Z,KAAK2O,KAC9B,CAGA,WAAAqL,GACEha,KAAKqV,OAAOyB,MACd,CAGA,qBAAAmD,CAAsBzH,GACpBxS,KAAK8Z,uBAAyB9Z,KAAKka,SAASvI,cAAcmE,SAAStD,EAAMuD,OAC3E,CAEA,cAAAoE,CAAe3H,GACRxS,KAAK8Z,wBAA0BtH,EAAMuD,SAAWvD,EAAM4H,eACzDpa,KAAKqV,OAAOyB,MAEhB,CAEA,MAAAF,GACE5W,KAAKgO,KAAK8I,KAAK9W,KAAK+Z,WACtB,CAEA,QAAAhD,GACE/W,KAAKqV,OAAOyB,MACd,CAEA,cAAAuD,CAAejP,GACb,MAAMT,EAAU3K,KAAK8N,SAASP,KAAMI,GAAMA,EAAEnO,KAAO4L,GACnD,OAAOT,GAAS7B,MAAQ,SAC1B,GAxCA,IAAC,IAAA0Q,S,oDACD,IAAC,IAAAA,S,uDACD,IAAC,IAAAC,U,oDACD,IAAC,IAAAA,U,sDACD,IAAC,IAAAC,WAAU,QAAS,CAAEY,QAAQ,I,gBAAmB,EAAA1G,a,+BASjD,IAAC,IAAA+F,cAAa,2B,mHAKd,IAAC,IAAAA,cAAa,uBAAwB,CAAC,W,iDACVY,e,yEApBlBV,EAAmB,IAL/B,IAAAtG,WAAU,CACTC,SAAU,cACVC,SAAU,EAAQ,KAClBC,OAAQ,CAAC,EAAQ,QAENmG,G,ybCKN,IAAMW,EAAN,oBAEI,KAAAC,MAAQ,EACR,KAAAnF,eAAgC,KAChC,KAAAxH,SAA2B,GAC1B,KAAA4M,WAAa,IAAI,EAAAtF,aACjB,KAAAuF,SAAW,IAAI,EAAAvF,aACf,KAAAwF,gBAAkB,IAAI,EAAAxF,aACtB,KAAAyF,cAAgB,IAAI,EAAAzF,aACpB,KAAAiD,WAAa,IAAI,EAAAjD,aACjB,KAAA0F,QAAU,IAAI,EAAA1F,aACd,KAAA2F,SAAW,IAAI,EAAA3F,aACf,KAAA4F,OAAS,IAAI,EAAA5F,aACb,KAAA6F,UAAY,IAAI,EAAA7F,aAE1B,KAAA8F,gBAAwC,KACxC,KAAAC,oBAAsB,CAAEC,EAAG,EAAGC,EAAG,EA4JnC,CA1JE,MAAAC,CAAOnP,GACL,OAAQnB,EAAiBmB,EAC3B,CAEA,OAAAoP,CAAQpP,GACN,OAAOnB,EAAiBmB,EAC1B,CAEA,OAAAqP,CAAQrP,GACN,OAAOA,CACT,CAEA,MAAAsP,CAAOtP,GACL,OAAOA,CACT,CAEA,YAAAuP,CAAajX,GACX,OAAqC,IAA3BzE,KAAK0F,MAAM+F,OAAOhH,GAArB,GACT,CAEA,WAAAkX,CAAYhN,GACV3O,KAAK0a,WAAW5D,KAAKnI,EACvB,CAEA,WAAAiN,CAAYpJ,EAAmB7D,GAC7B6D,EAAMC,kBACNzS,KAAK2a,SAAS7D,KAAKnI,EACrB,CAEA,QAAAkN,CAASC,EAAcC,GACrB,OAAOD,EAAKxb,OAASyb,EACjBD,EAAKnX,UAAU,EAAGoX,GAAa,MAC/BD,CACN,CAEA,aAAAE,CAAcxJ,EAAmB7D,GAC/B6D,EAAMyJ,iBACNjc,KAAKkb,gBAAkBvM,EACvB3O,KAAKmb,oBAAsB,CAAEC,EAAG5I,EAAM0J,QAASb,EAAG7I,EAAM2J,QAC1D,CAEA,gBAAAC,GACEpc,KAAKkb,gBAAkB,IACzB,CAEA,MAAAmB,GACMrc,KAAKkb,kBACPlb,KAAK2a,SAAS7D,KAAK9W,KAAKkb,iBACxBlb,KAAKoc,mBAET,CAEA,QAAAE,GACMtc,KAAKkb,kBACPlb,KAAK4a,gBAAgB9D,KAAK9W,KAAKkb,iBAC/Blb,KAAKoc,mBAET,CAEA,QAAAG,GACMvc,KAAKkb,kBACPlb,KAAK6a,cAAc/D,KAAK9W,KAAKkb,iBAC7Blb,KAAKoc,mBAET,CAEA,SAAAI,GACMxc,KAAKkb,kBACPlb,KAAK8a,QAAQhE,KAAK9W,KAAKkb,iBACvBlb,KAAKoc,mBAET,CAEA,UAAAK,GACMzc,KAAKkb,kBACPlb,KAAK+a,SAASjE,KAAK9W,KAAKkb,iBACxBlb,KAAKoc,mBAET,CAEA,QAAAM,GACM1c,KAAKkb,kBACPlb,KAAKgb,OAAOlE,KAAK9W,KAAKkb,iBACtBlb,KAAKoc,mBAET,CAEA,WAAAO,GACM3c,KAAKkb,kBACPlb,KAAKib,UAAUnE,KAAK9W,KAAKkb,iBACzBlb,KAAKoc,mBAET,CAEA,QAAAQ,GACM5c,KAAKkb,kBACPlb,KAAKqY,WAAWvB,KAAK9W,KAAKkb,iBAC1Blb,KAAKoc,mBAET,CAEA,YAAAS,CAAalO,GAEX,IAAImO,EAAc,GAClB,GAAInO,EAAKvD,UAAW,CAClB,MAAMT,EAAU3K,KAAK8N,SAASP,KAAKI,GAAKA,EAAEnO,KAAOmP,EAAKvD,WAClDT,GAAS7B,OAAMgU,EAAcnS,EAAQ7B,K,CAG3C,OAAKgU,EAGDnO,EAAK5F,MACA,GAAG4F,EAAK5F,WAAW+T,IAErBA,EANkB,gBAO3B,CAGA,kBAAAC,CAAmBpO,GACjB3O,KAAK0a,WAAW5D,KAAKnI,EACvB,CAEA,gBAAAqO,CAAiBrO,GACf3O,KAAK2a,SAAS7D,KAAKnI,EACrB,CAEA,cAAAsO,CAAetO,GACb3O,KAAK4a,gBAAgB9D,KAAKnI,EAC5B,CAEA,cAAAuO,CAAevO,GACb3O,KAAK6a,cAAc/D,KAAKnI,EAC1B,CAEA,eAAAwO,CAAgBxO,GACd3O,KAAK8a,QAAQhE,KAAKnI,EACpB,CAEA,gBAAAyO,CAAiBzO,GACf3O,KAAK+a,SAASjE,KAAKnI,EACrB,CAEA,cAAA0O,CAAe1O,GACb3O,KAAKgb,OAAOlE,KAAKnI,EACnB,CAEA,iBAAA2O,CAAkB3O,GAChB3O,KAAKib,UAAUnE,KAAKnI,EACtB,CAEA,cAAA4O,CAAe5O,GACb3O,KAAKqY,WAAWvB,KAAKnI,EACvB,GA1KA,IAAC,IAAA6K,S,qDACD,IAAC,IAAAA,S,qDACD,IAAC,IAAAA,S,8DACD,IAAC,IAAAA,S,uDACD,IAAC,IAAAC,U,0DACD,IAAC,IAAAA,U,wDACD,IAAC,IAAAA,U,+DACD,IAAC,IAAAA,U,6DACD,IAAC,IAAAA,U,0DACD,IAAC,IAAAA,U,uDACD,IAAC,IAAAA,U,wDACD,IAAC,IAAAA,U,sDACD,IAAC,IAAAA,U,yDAbUe,EAAqB,IALjC,IAAAjH,WAAU,CACTC,SAAU,gBACVC,SAAU,EAAQ,KAClBC,OAAQ,CAAC,EAAQ,SAEN8G,GCoBE,IAAMgD,EAAN,QAAMA,E,mUAAqB,GAhBzC,IAAAC,UAAS,CACRC,QAAS,CAAC,EAAAC,aAAc,EAAAC,aACxBC,UAAW,CACT,CAAEvJ,QAAS,EAAA7M,eAAgBqW,SAAUtW,EAA+BuW,OAAO,GAC3E,CAAEzJ,QAAS,EAAAP,oBAAqB+J,SAAUhK,EAAiCiK,OAAO,GAClF,CAAEzJ,QAAS,EAAAJ,sBAAuB4J,SAAU7J,EAA0B8J,OAAO,GAC7E3R,EACAvE,GAEFmW,aAAc,CACZtN,EACAwE,EACA2E,EACAW,MAGiBgD,G","sources":["webpack://tabby-tabbyspaces/webpack/universalModuleDefinition","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.scss","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.scss?5edd","webpack://tabby-tabbyspaces/external umd \"@angular/forms\"","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.scss?0de1","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.pug","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.pug","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.pug","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.scss","webpack://tabby-tabbyspaces/./node_modules/css-loader/dist/runtime/api.js","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.scss?e911","webpack://tabby-tabbyspaces/external umd \"tabby-terminal\"","webpack://tabby-tabbyspaces/./node_modules/css-loader/dist/runtime/sourceMaps.js","webpack://tabby-tabbyspaces/external umd \"@angular/common\"","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.scss","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.pug","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.pug?8802","webpack://tabby-tabbyspaces/external umd \"tabby-core\"","webpack://tabby-tabbyspaces/external umd \"tabby-settings\"","webpack://tabby-tabbyspaces/./node_modules/pug-runtime/index.js","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.pug?b08a","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.scss?c31e","webpack://tabby-tabbyspaces/external umd \"@angular/core\"","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.pug?4d23","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.scss","webpack://tabby-tabbyspaces/external umd \"fs\"","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.pug?e89b","webpack://tabby-tabbyspaces/external umd \"rxjs\"","webpack://tabby-tabbyspaces/webpack/bootstrap","webpack://tabby-tabbyspaces/webpack/runtime/compat get default export","webpack://tabby-tabbyspaces/webpack/runtime/define property getters","webpack://tabby-tabbyspaces/webpack/runtime/hasOwnProperty shorthand","webpack://tabby-tabbyspaces/webpack/runtime/make namespace object","webpack://tabby-tabbyspaces/./src/build-config.ts","webpack://tabby-tabbyspaces/./src/providers/config.provider.ts","webpack://tabby-tabbyspaces/./src/services/startupCommand.service.ts","webpack://tabby-tabbyspaces/./src/models/workspace.model.ts","webpack://tabby-tabbyspaces/./src/services/workspaceEditor.service.ts","webpack://tabby-tabbyspaces/./src/components/workspaceList.component.ts","webpack://tabby-tabbyspaces/./src/providers/settings.provider.ts","webpack://tabby-tabbyspaces/./src/providers/toolbar.provider.ts","webpack://tabby-tabbyspaces/./src/components/workspaceEditor.component.ts","webpack://tabby-tabbyspaces/./src/components/paneEditor.component.ts","webpack://tabby-tabbyspaces/./src/components/splitPreview.component.ts","webpack://tabby-tabbyspaces/./src/index.ts"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory(require(\"@angular/core\"), require(\"@angular/common\"), require(\"@angular/forms\"), require(\"tabby-core\"), require(\"tabby-settings\"), require(\"tabby-terminal\"), require(\"rxjs\"), (function webpackLoadOptionalExternalModule() { try { return require(\"fs\"); } catch(e) {} }()));\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([\"@angular/core\", \"@angular/common\", \"@angular/forms\", \"tabby-core\", \"tabby-settings\", \"tabby-terminal\", \"rxjs\", \"fs\"], factory);\n\telse {\n\t\tvar a = typeof exports === 'object' ? factory(require(\"@angular/core\"), require(\"@angular/common\"), require(\"@angular/forms\"), require(\"tabby-core\"), require(\"tabby-settings\"), require(\"tabby-terminal\"), require(\"rxjs\"), (function webpackLoadOptionalExternalModule() { try { return require(\"fs\"); } catch(e) {} }())) : factory(root[\"@angular/core\"], root[\"@angular/common\"], root[\"@angular/forms\"], root[\"tabby-core\"], root[\"tabby-settings\"], root[\"tabby-terminal\"], root[\"rxjs\"], root[\"fs\"]);\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(global, (__WEBPACK_EXTERNAL_MODULE__860__, __WEBPACK_EXTERNAL_MODULE__358__, __WEBPACK_EXTERNAL_MODULE__182__, __WEBPACK_EXTERNAL_MODULE__650__, __WEBPACK_EXTERNAL_MODULE__700__, __WEBPACK_EXTERNAL_MODULE__349__, __WEBPACK_EXTERNAL_MODULE__961__, __WEBPACK_EXTERNAL_MODULE__947__) => {\nreturn ","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.workspace-editor-inline{background:var(--theme-bg-more);border-radius:8px;border:1px solid var(--theme-border);margin-bottom:16px}.workspace-editor-inline .editor-body{padding:16px}.workspace-editor-inline .editor-footer{display:flex;justify-content:space-between;align-items:center;padding:10px 16px;border-top:1px solid var(--theme-border);background:var(--theme-bg);border-radius:0 0 8px 8px}.workspace-editor-inline .editor-footer .startup-checkbox{display:flex;align-items:center;gap:6px;font-size:.85rem;color:var(--theme-fg-more);cursor:pointer}.workspace-editor-inline .editor-footer .startup-checkbox input{margin:0}.workspace-editor-inline .editor-footer .editor-actions{display:flex;gap:8px}.workspace-editor-inline .editor-footer .editor-actions .btn-success{background:#10b981;border-color:#10b981;color:#fff}.workspace-editor-inline .editor-footer .editor-actions .btn-success:hover{background:#059669;border-color:#059669}.workspace-editor-inline .editor-footer .editor-actions .unsaved-indicator{color:#f59e0b;font-weight:bold;margin-left:2px}.editor-top-row{display:flex;align-items:flex-start;gap:12px;margin-bottom:16px}.color-picker .color-input{width:40px;height:40px;padding:2px;border:1px solid var(--theme-border);border-radius:6px;cursor:pointer;background:var(--theme-bg)}.color-picker .color-input::-webkit-color-swatch-wrapper{padding:2px}.color-picker .color-input::-webkit-color-swatch{border-radius:4px;border:none}.name-input{flex:1;min-width:150px;padding:10px 12px;border-radius:6px;border:1px solid var(--theme-border);background:var(--theme-bg);color:var(--theme-fg);font-size:1rem;font-weight:500}.name-input:focus{outline:none;border-color:var(--theme-primary)}.name-input::placeholder{color:var(--theme-fg-more);font-weight:400}.icon-picker{position:relative}.icon-picker .icon-trigger{width:40px;height:40px;display:flex;align-items:center;justify-content:center;border:1px solid var(--theme-border);border-radius:6px;background:var(--theme-bg);cursor:pointer;font-size:1.1rem;transition:background .15s}.icon-picker .icon-trigger:hover{background:var(--theme-bg-more)}.icon-picker .icon-dropdown{position:absolute;top:100%;right:0;margin-top:4px;padding:8px;background:var(--theme-bg-more);border:1px solid var(--theme-border);border-radius:6px;box-shadow:0 4px 12px rgba(0,0,0,.15);z-index:100;display:grid;grid-template-columns:repeat(6, 28px);gap:4px}.icon-picker .icon-option{width:28px;height:28px;display:flex;align-items:center;justify-content:center;border:1px solid rgba(0,0,0,0);border-radius:4px;background:rgba(0,0,0,0);color:var(--theme-fg-more);cursor:pointer;transition:all .15s;font-size:.85rem}.icon-picker .icon-option:hover{background:var(--theme-bg-more-more);color:var(--theme-fg)}.icon-picker .icon-option.selected{border-color:currentColor;background:var(--theme-bg)}.layout-section .layout-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.layout-section .layout-title{font-size:.8rem;font-weight:500;color:var(--theme-fg-more);text-transform:uppercase;letter-spacing:.5px}.layout-toolbar{display:flex;align-items:center;gap:4px;padding:8px 0;margin-bottom:8px}.layout-toolbar .toolbar-group{display:flex;align-items:center;gap:2px}.layout-toolbar .toolbar-label{font-size:.75rem;color:var(--theme-fg-more);margin-right:4px;text-transform:uppercase;letter-spacing:.3px}.layout-toolbar .toolbar-spacer{flex:1}.layout-toolbar .toolbar-divider{width:1px;height:20px;background:var(--theme-border);margin:0 4px}.layout-toolbar .toolbar-btn{padding:4px 8px;background:var(--theme-bg);border:1px solid var(--theme-border);border-radius:4px;color:var(--theme-fg);cursor:pointer;transition:all .15s;font-size:.85rem}.layout-toolbar .toolbar-btn:hover:not(:disabled){background:var(--theme-bg-more-more)}.layout-toolbar .toolbar-btn:disabled{opacity:.4;cursor:not-allowed}.layout-toolbar .toolbar-btn.danger{color:var(--theme-danger, #ef4444)}.layout-preview-container{background:var(--theme-bg);border-radius:6px;padding:8px;min-height:120px;max-height:180px}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/workspaceEditor.component.scss\"],\"names\":[],\"mappings\":\"AACA,yBACE,+BAAA,CACA,iBAAA,CACA,oCAAA,CACA,kBAAA,CAEA,sCACE,YAAA,CAGF,wCACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CACA,wCAAA,CACA,0BAAA,CACA,yBAAA,CAEA,0DACE,YAAA,CACA,kBAAA,CACA,OAAA,CACA,gBAAA,CACA,0BAAA,CACA,cAAA,CAEA,gEACE,QAAA,CAIJ,wDACE,YAAA,CACA,OAAA,CAEA,qEACE,kBAAA,CACA,oBAAA,CACA,UAAA,CAEA,2EACE,kBAAA,CACA,oBAAA,CAIJ,2EACE,aAAA,CACA,gBAAA,CACA,eAAA,CAOR,gBACE,YAAA,CACA,sBAAA,CACA,QAAA,CACA,kBAAA,CAIA,2BACE,UAAA,CACA,WAAA,CACA,WAAA,CACA,oCAAA,CACA,iBAAA,CACA,cAAA,CACA,0BAAA,CAEA,yDACE,WAAA,CAGF,iDACE,iBAAA,CACA,WAAA,CAKN,YACE,MAAA,CACA,eAAA,CACA,iBAAA,CACA,iBAAA,CACA,oCAAA,CACA,0BAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CAEA,kBACE,YAAA,CACA,iCAAA,CAGF,yBACE,0BAAA,CACA,eAAA,CAIJ,aACE,iBAAA,CAEA,2BACE,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,oCAAA,CACA,iBAAA,CACA,0BAAA,CACA,cAAA,CACA,gBAAA,CACA,0BAAA,CAEA,iCACE,+BAAA,CAIJ,4BACE,iBAAA,CACA,QAAA,CACA,OAAA,CACA,cAAA,CACA,WAAA,CACA,+BAAA,CACA,oCAAA,CACA,iBAAA,CACA,qCAAA,CACA,WAAA,CACA,YAAA,CACA,qCAAA,CACA,OAAA,CAGF,0BACE,UAAA,CACA,WAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,8BAAA,CACA,iBAAA,CACA,wBAAA,CACA,0BAAA,CACA,cAAA,CACA,mBAAA,CACA,gBAAA,CAEA,gCACE,oCAAA,CACA,qBAAA,CAGF,mCACE,yBAAA,CACA,0BAAA,CAOJ,+BACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CAGF,8BACE,eAAA,CACA,eAAA,CACA,0BAAA,CACA,wBAAA,CACA,mBAAA,CAKJ,gBACE,YAAA,CACA,kBAAA,CACA,OAAA,CACA,aAAA,CACA,iBAAA,CAEA,+BACE,YAAA,CACA,kBAAA,CACA,OAAA,CAGF,+BACE,gBAAA,CACA,0BAAA,CACA,gBAAA,CACA,wBAAA,CACA,mBAAA,CAGF,gCACE,MAAA,CAGF,iCACE,SAAA,CACA,WAAA,CACA,8BAAA,CACA,YAAA,CAGF,6BACE,eAAA,CACA,0BAAA,CACA,oCAAA,CACA,iBAAA,CACA,qBAAA,CACA,cAAA,CACA,mBAAA,CACA,gBAAA,CAEA,kDACE,oCAAA,CAGF,sCACE,UAAA,CACA,kBAAA,CAGF,oCACE,kCAAA,CAKN,0BACE,0BAAA,CACA,iBAAA,CACA,WAAA,CACA,gBAAA,CACA,gBAAA\",\"sourcesContent\":[\"// Workspace editor (inline)\\r\\n.workspace-editor-inline {\\r\\n background: var(--theme-bg-more);\\r\\n border-radius: 8px;\\r\\n border: 1px solid var(--theme-border);\\r\\n margin-bottom: 16px;\\r\\n\\r\\n .editor-body {\\r\\n padding: 16px;\\r\\n }\\r\\n\\r\\n .editor-footer {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n padding: 10px 16px;\\r\\n border-top: 1px solid var(--theme-border);\\r\\n background: var(--theme-bg);\\r\\n border-radius: 0 0 8px 8px;\\r\\n\\r\\n .startup-checkbox {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 6px;\\r\\n font-size: 0.85rem;\\r\\n color: var(--theme-fg-more);\\r\\n cursor: pointer;\\r\\n\\r\\n input {\\r\\n margin: 0;\\r\\n }\\r\\n }\\r\\n\\r\\n .editor-actions {\\r\\n display: flex;\\r\\n gap: 8px;\\r\\n\\r\\n .btn-success {\\r\\n background: #10b981;\\r\\n border-color: #10b981;\\r\\n color: white;\\r\\n\\r\\n &:hover {\\r\\n background: #059669;\\r\\n border-color: #059669;\\r\\n }\\r\\n }\\r\\n\\r\\n .unsaved-indicator {\\r\\n color: #f59e0b;\\r\\n font-weight: bold;\\r\\n margin-left: 2px;\\r\\n }\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n// Shared editor content\\r\\n.editor-top-row {\\r\\n display: flex;\\r\\n align-items: flex-start;\\r\\n gap: 12px;\\r\\n margin-bottom: 16px;\\r\\n}\\r\\n\\r\\n.color-picker {\\r\\n .color-input {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n padding: 2px;\\r\\n border: 1px solid var(--theme-border);\\r\\n border-radius: 6px;\\r\\n cursor: pointer;\\r\\n background: var(--theme-bg);\\r\\n\\r\\n &::-webkit-color-swatch-wrapper {\\r\\n padding: 2px;\\r\\n }\\r\\n\\r\\n &::-webkit-color-swatch {\\r\\n border-radius: 4px;\\r\\n border: none;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.name-input {\\r\\n flex: 1;\\r\\n min-width: 150px;\\r\\n padding: 10px 12px;\\r\\n border-radius: 6px;\\r\\n border: 1px solid var(--theme-border);\\r\\n background: var(--theme-bg);\\r\\n color: var(--theme-fg);\\r\\n font-size: 1rem;\\r\\n font-weight: 500;\\r\\n\\r\\n &:focus {\\r\\n outline: none;\\r\\n border-color: var(--theme-primary);\\r\\n }\\r\\n\\r\\n &::placeholder {\\r\\n color: var(--theme-fg-more);\\r\\n font-weight: 400;\\r\\n }\\r\\n}\\r\\n\\r\\n.icon-picker {\\r\\n position: relative;\\r\\n\\r\\n .icon-trigger {\\r\\n width: 40px;\\r\\n height: 40px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: 1px solid var(--theme-border);\\r\\n border-radius: 6px;\\r\\n background: var(--theme-bg);\\r\\n cursor: pointer;\\r\\n font-size: 1.1rem;\\r\\n transition: background 0.15s;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-bg-more);\\r\\n }\\r\\n }\\r\\n\\r\\n .icon-dropdown {\\r\\n position: absolute;\\r\\n top: 100%;\\r\\n right: 0;\\r\\n margin-top: 4px;\\r\\n padding: 8px;\\r\\n background: var(--theme-bg-more);\\r\\n border: 1px solid var(--theme-border);\\r\\n border-radius: 6px;\\r\\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);\\r\\n z-index: 100;\\r\\n display: grid;\\r\\n grid-template-columns: repeat(6, 28px);\\r\\n gap: 4px;\\r\\n }\\r\\n\\r\\n .icon-option {\\r\\n width: 28px;\\r\\n height: 28px;\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n border: 1px solid transparent;\\r\\n border-radius: 4px;\\r\\n background: transparent;\\r\\n color: var(--theme-fg-more);\\r\\n cursor: pointer;\\r\\n transition: all 0.15s;\\r\\n font-size: 0.85rem;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-bg-more-more);\\r\\n color: var(--theme-fg);\\r\\n }\\r\\n\\r\\n &.selected {\\r\\n border-color: currentColor;\\r\\n background: var(--theme-bg);\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n// Layout section\\r\\n.layout-section {\\r\\n .layout-header {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n margin-bottom: 8px;\\r\\n }\\r\\n\\r\\n .layout-title {\\r\\n font-size: 0.8rem;\\r\\n font-weight: 500;\\r\\n color: var(--theme-fg-more);\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.5px;\\r\\n }\\r\\n}\\r\\n\\r\\n// Layout toolbar\\r\\n.layout-toolbar {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 4px;\\r\\n padding: 8px 0;\\r\\n margin-bottom: 8px;\\r\\n\\r\\n .toolbar-group {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 2px;\\r\\n }\\r\\n\\r\\n .toolbar-label {\\r\\n font-size: 0.75rem;\\r\\n color: var(--theme-fg-more);\\r\\n margin-right: 4px;\\r\\n text-transform: uppercase;\\r\\n letter-spacing: 0.3px;\\r\\n }\\r\\n\\r\\n .toolbar-spacer {\\r\\n flex: 1;\\r\\n }\\r\\n\\r\\n .toolbar-divider {\\r\\n width: 1px;\\r\\n height: 20px;\\r\\n background: var(--theme-border);\\r\\n margin: 0 4px;\\r\\n }\\r\\n\\r\\n .toolbar-btn {\\r\\n padding: 4px 8px;\\r\\n background: var(--theme-bg);\\r\\n border: 1px solid var(--theme-border);\\r\\n border-radius: 4px;\\r\\n color: var(--theme-fg);\\r\\n cursor: pointer;\\r\\n transition: all 0.15s;\\r\\n font-size: 0.85rem;\\r\\n\\r\\n &:hover:not(:disabled) {\\r\\n background: var(--theme-bg-more-more);\\r\\n }\\r\\n\\r\\n &:disabled {\\r\\n opacity: 0.4;\\r\\n cursor: not-allowed;\\r\\n }\\r\\n\\r\\n &.danger {\\r\\n color: var(--theme-danger, #ef4444);\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.layout-preview-container {\\r\\n background: var(--theme-bg);\\r\\n border-radius: 6px;\\r\\n padding: 8px;\\r\\n min-height: 120px;\\r\\n max-height: 180px;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\n var result = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./paneEditor.component.scss\");\n\n if (result && result.__esModule) {\n result = result.default;\n }\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n ","module.exports = __WEBPACK_EXTERNAL_MODULE__182__;","\n var result = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./splitPreview.component.scss\");\n\n if (result && result.__esModule) {\n result = result.default;\n }\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n ","var pug = require(\"!../../node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"workspace-editor-inline\\\"\\u003E\\u003Cdiv class=\\\"editor-body\\\"\\u003E\\u003Cng-container *ngTemplateOutlet=\\\"editorContent\\\"\\u003E\\u003C\\u002Fng-container\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"editor-footer\\\"\\u003E\\u003Clabel class=\\\"startup-checkbox\\\"\\u003E\\u003Cinput type=\\\"checkbox\\\" [(ngModel)]=\\\"workspace.launchOnStartup\\\"\\u003E Launch on startup\\u003C\\u002Flabel\\u003E\\u003Cdiv class=\\\"editor-actions\\\"\\u003E\\u003Cbutton class=\\\"btn btn-secondary btn-sm\\\" type=\\\"button\\\" (click)=\\\"onCancel()\\\"\\u003ECancel\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-primary btn-sm\\\" type=\\\"button\\\" (click)=\\\"onSave()\\\" [disabled]=\\\"!workspace.name?.trim() || !hasUnsavedChanges\\\"\\u003E\\u003Ci class=\\\"fas fa-save\\\"\\u003E\\u003C\\u002Fi\\u003E Save\\u003Cspan class=\\\"unsaved-indicator\\\" *ngIf=\\\"hasUnsavedChanges\\\"\\u003E*\\u003C\\u002Fspan\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cng-template #editorContent\\u003E\\u003Cdiv class=\\\"editor-top-row\\\"\\u003E\\u003Cdiv class=\\\"color-picker\\\"\\u003E\\u003Cinput class=\\\"color-input\\\" type=\\\"color\\\" [(ngModel)]=\\\"workspace.color\\\" title=\\\"Workspace color\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cinput class=\\\"name-input\\\" #nameInput type=\\\"text\\\" [(ngModel)]=\\\"workspace.name\\\" placeholder=\\\"Name your workspace\\\"\\u003E\\u003Cdiv class=\\\"icon-picker\\\"\\u003E\\u003Cbutton class=\\\"icon-trigger\\\" type=\\\"button\\\" [style.color]=\\\"workspace.color\\\" (click)=\\\"toggleIconDropdown()\\\" title=\\\"Select icon\\\"\\u003E\\u003Ci class=\\\"fas\\\" [class]=\\\"&quot;fa-&quot; + workspace.icon\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cdiv class=\\\"icon-dropdown\\\" *ngIf=\\\"iconDropdownOpen\\\"\\u003E\\u003Cbutton 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)\\\"\\u003E\\u003Ci class=\\\"fas\\\" [class]=\\\"&quot;fa-&quot; + icon\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"layout-section\\\"\\u003E\\u003Cdiv class=\\\"layout-header\\\"\\u003E\\u003Cspan class=\\\"layout-title\\\"\\u003ELayout\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"layout-toolbar\\\"\\u003E\\u003Cdiv class=\\\"toolbar-group split-group\\\"\\u003E\\u003Cspan class=\\\"toolbar-label\\\"\\u003ESplit\\u003C\\u002Fspan\\u003E\\u003Cbutton class=\\\"toolbar-btn\\\" type=\\\"button\\\" [disabled]=\\\"!selectedPaneId\\\" (click)=\\\"splitSelectedPane(&quot;horizontal&quot;)\\\" title=\\\"Split Horizontal\\\"\\u003E\\u003Ci class=\\\"fas fa-arrows-alt-h\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"toolbar-btn\\\" type=\\\"button\\\" [disabled]=\\\"!selectedPaneId\\\" (click)=\\\"splitSelectedPane(&quot;vertical&quot;)\\\" title=\\\"Split Vertical\\\"\\u003E\\u003Ci class=\\\"fas fa-arrows-alt-v\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"toolbar-divider\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"toolbar-group add-group\\\"\\u003E\\u003Cspan class=\\\"toolbar-label\\\"\\u003EAdd\\u003C\\u002Fspan\\u003E\\u003Cbutton class=\\\"toolbar-btn\\\" type=\\\"button\\\" [disabled]=\\\"!selectedPaneId\\\" (click)=\\\"addPane(&quot;left&quot;)\\\" title=\\\"Add Left\\\"\\u003E\\u003Ci class=\\\"fas fa-caret-left\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"toolbar-btn\\\" type=\\\"button\\\" [disabled]=\\\"!selectedPaneId\\\" (click)=\\\"addPane(&quot;right&quot;)\\\" title=\\\"Add Right\\\"\\u003E\\u003Ci class=\\\"fas fa-caret-right\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"toolbar-btn\\\" type=\\\"button\\\" [disabled]=\\\"!selectedPaneId\\\" (click)=\\\"addPane(&quot;top&quot;)\\\" title=\\\"Add Top\\\"\\u003E\\u003Ci class=\\\"fas fa-caret-up\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"toolbar-btn\\\" type=\\\"button\\\" [disabled]=\\\"!selectedPaneId\\\" (click)=\\\"addPane(&quot;bottom&quot;)\\\" title=\\\"Add Bottom\\\"\\u003E\\u003Ci class=\\\"fas fa-caret-down\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"toolbar-spacer\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"toolbar-group\\\"\\u003E\\u003Cbutton class=\\\"toolbar-btn danger\\\" type=\\\"button\\\" [disabled]=\\\"!selectedPaneId || !canRemovePane()\\\" (click)=\\\"removeSelectedPane()\\\" title=\\\"Remove pane\\\"\\u003E\\u003Ci class=\\\"fas fa-trash\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"layout-preview-container\\\" (click)=\\\"onPreviewBackgroundClick()\\\"\\u003E\\u003Csplit-preview [split]=\\\"workspace.root\\\" [selectedPaneId]=\\\"selectedPaneId\\\" [profiles]=\\\"profiles\\\" (paneSelect)=\\\"selectPane($event)\\\" (paneEdit)=\\\"editPane($event)\\\" (splitHorizontal)=\\\"splitPane($event, &quot;horizontal&quot;)\\\" (splitVertical)=\\\"splitPane($event, &quot;vertical&quot;)\\\" (addLeft)=\\\"addPaneFromEvent($event, &quot;left&quot;)\\\" (addRight)=\\\"addPaneFromEvent($event, &quot;right&quot;)\\\" (addTop)=\\\"addPaneFromEvent($event, &quot;top&quot;)\\\" (addBottom)=\\\"addPaneFromEvent($event, &quot;bottom&quot;)\\\" (removePane)=\\\"removePane($event)\\\"\\u003E\\u003C\\u002Fsplit-preview\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fng-template\\u003E\\u003Cpane-editor *ngIf=\\\"showPaneEditor &amp;&amp; editingPane\\\" [pane]=\\\"editingPane\\\" [profiles]=\\\"profiles\\\" (save)=\\\"onPaneSave($event)\\\" (cancel)=\\\"closePaneEditor()\\\"\\u003E\\u003C\\u002Fpane-editor\\u003E\";;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"pane-editor-overlay\\\" (click)=\\\"onOverlayClick($event)\\\"\\u003E\\u003Cdiv class=\\\"pane-editor-modal\\\" #modal\\u003E\\u003Cdiv class=\\\"modal-header\\\"\\u003E\\u003Ch4\\u003EEdit Pane\\u003C\\u002Fh4\\u003E\\u003Cbutton class=\\\"btn btn-link close-btn\\\" type=\\\"button\\\" (click)=\\\"onCancel()\\\"\\u003E\\u003Ci class=\\\"fas fa-times\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"modal-body\\\"\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EBase Profile\\u003C\\u002Flabel\\u003E\\u003Cselect class=\\\"form-control\\\" [(ngModel)]=\\\"editedPane.profileId\\\"\\u003E\\u003Coption value=\\\"\\\"\\u003E-- Select Profile --\\u003C\\u002Foption\\u003E\\u003Coption *ngFor=\\\"let profile of profiles\\\" [value]=\\\"profile.id\\\"\\u003E{{ profile.name }}\\u003C\\u002Foption\\u003E\\u003C\\u002Fselect\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EWorking Directory\\u003C\\u002Flabel\\u003E\\u003Cinput class=\\\"form-control\\\" type=\\\"text\\\" [(ngModel)]=\\\"editedPane.cwd\\\" placeholder=\\\"C:\\\\path\\\\to\\\\project\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EStartup Command\\u003C\\u002Flabel\\u003E\\u003Cinput class=\\\"form-control\\\" type=\\\"text\\\" [(ngModel)]=\\\"editedPane.startupCommand\\\" placeholder=\\\"e.g., npm run dev\\\"\\u003E\\u003Csmall class=\\\"help-text\\\"\\u003ECommand to execute when the pane opens. For Nushell, use commands like: uv run serve\\u003C\\u002Fsmall\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"form-group\\\"\\u003E\\u003Clabel\\u003EPane Title (optional)\\u003C\\u002Flabel\\u003E\\u003Cinput class=\\\"form-control\\\" type=\\\"text\\\" [(ngModel)]=\\\"editedPane.title\\\" placeholder=\\\"Custom tab title\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"modal-footer\\\"\\u003E\\u003Cbutton class=\\\"btn btn-secondary\\\" type=\\\"button\\\" (click)=\\\"onCancel()\\\"\\u003ECancel\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-primary\\\" type=\\\"button\\\" (click)=\\\"onSave()\\\"\\u003E\\u003Ci class=\\\"fas fa-check\\\"\\u003E\\u003C\\u002Fi\\u003E Apply\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";;return pug_html;};\nmodule.exports = template;","var pug = require(\"!../../node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"workspace-list-container\\\"\\u003E\\u003Cdiv class=\\\"workspace-list-header\\\"\\u003E\\u003Ch3\\u003EWorkspace Editor\\u003C\\u002Fh3\\u003E\\u003Cbutton class=\\\"btn btn-primary\\\" type=\\\"button\\\" (click)=\\\"createWorkspace()\\\"\\u003E\\u003Ci class=\\\"fas fa-plus\\\"\\u003E\\u003C\\u002Fi\\u003E New Workspace\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cworkspace-editor *ngIf=\\\"editingWorkspace\\\" [workspace]=\\\"editingWorkspace\\\" [autoFocus]=\\\"isCreatingNew\\\" [hasUnsavedChanges]=\\\"hasUnsavedChanges\\\" (save)=\\\"onEditorSave($event)\\\" (cancel)=\\\"onEditorCancel()\\\"\\u003E\\u003C\\u002Fworkspace-editor\\u003E\\u003Cdiv class=\\\"workspace-list\\\" *ngIf=\\\"workspaces.length &gt; 0\\\"\\u003E\\u003Cdiv class=\\\"workspace-item\\\" *ngFor=\\\"let workspace of workspaces\\\" [class.selected]=\\\"isSelected(workspace)\\\" (click)=\\\"selectWorkspace(workspace)\\\"\\u003E\\u003Cdiv class=\\\"workspace-info\\\"\\u003E\\u003Cdiv class=\\\"workspace-icon\\\" [style.color]=\\\"workspace.color\\\"\\u003E\\u003Ci class=\\\"fas\\\" [class]=\\\"&quot;fa-&quot; + (workspace.icon || &quot;columns&quot;)\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-details\\\"\\u003E\\u003Cdiv class=\\\"workspace-name\\\"\\u003E{{ workspace.name }}\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-meta\\\"\\u003E\\u003Cspan\\u003E{{ getPaneCount(workspace) }} panes\\u003C\\u002Fspan\\u003E\\u003Cspan class=\\\"separator\\\"\\u003E&middot;\\u003C\\u002Fspan\\u003E\\u003Cspan\\u003E{{ getOrientationLabel(workspace) }}\\u003C\\u002Fspan\\u003E\\u003Cspan class=\\\"separator\\\" *ngIf=\\\"workspace.launchOnStartup\\\"\\u003E&middot;\\u003C\\u002Fspan\\u003E\\u003Cspan class=\\\"badge badge-primary\\\" *ngIf=\\\"workspace.launchOnStartup\\\"\\u003Estartup\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-actions\\\"\\u003E\\u003Cbutton class=\\\"btn btn-link open-btn\\\" type=\\\"button\\\" title=\\\"Open\\\" [disabled]=\\\"openingWorkspaceId === workspace.id\\\" (click)=\\\"openWorkspace($event, workspace)\\\"\\u003E\\u003Ci class=\\\"fas\\\" [class.fa-external-link-alt]=\\\"openingWorkspaceId !== workspace.id\\\" [class.fa-spinner]=\\\"openingWorkspaceId === workspace.id\\\" [class.fa-spin]=\\\"openingWorkspaceId === workspace.id\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-link\\\" type=\\\"button\\\" title=\\\"Duplicate\\\" (click)=\\\"duplicateWorkspace($event, workspace)\\\"\\u003E\\u003Ci class=\\\"fas fa-copy\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"btn btn-link text-danger\\\" type=\\\"button\\\" title=\\\"Delete\\\" (click)=\\\"deleteWorkspace($event, workspace)\\\"\\u003E\\u003Ci class=\\\"fas fa-trash\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"workspace-empty\\\" *ngIf=\\\"workspaces.length === 0 &amp;&amp; !isCreatingNew\\\"\\u003E\\u003Cp\\u003ENo workspaces configured yet.\\u003C\\u002Fp\\u003E\\u003Cp\\u003EClick \\\"New Workspace\\\" to create your first split-layout workspace.\\u003C\\u002Fp\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";;return pug_html;};\nmodule.exports = template;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.split-preview{display:flex;width:100%;height:140px;gap:4px;border-radius:6px;overflow:hidden;background:var(--theme-bg);border:1px solid var(--theme-border)}.split-preview.horizontal{flex-direction:row}.split-preview.vertical{flex-direction:column}.split-preview.nested{height:auto;border:1px dashed var(--theme-fg-more);background:hsla(0,0%,100%,.02);padding:4px;border-radius:4px}.preview-pane{display:flex;align-items:center;justify-content:center;background:var(--theme-bg-more);border-radius:4px;border:2px solid rgba(0,0,0,0);cursor:pointer;transition:all .15s;position:relative;min-height:50px}.preview-pane:hover{background:var(--theme-bg-more-more)}.preview-pane.selected{border-color:var(--theme-primary);background:var(--theme-bg-more-more)}.pane-content{text-align:center;padding:8px;color:var(--theme-fg);max-width:100%;overflow:hidden}.pane-title,.pane-profile{font-size:.8rem;font-weight:500;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.pane-details{font-size:.7rem;opacity:.7;margin-top:4px}.pane-details .pane-detail{display:flex;align-items:center;justify-content:center;gap:4px}.pane-details .pane-detail i{width:12px;text-align:center;font-size:.65rem}.pane-details .pane-detail span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:100px}.pane-edit-btn{position:absolute;top:4px;right:4px;padding:4px 6px;background:var(--theme-bg);border:1px solid var(--theme-border);border-radius:4px;color:var(--theme-fg);cursor:pointer;font-size:.7rem;transition:all .15s;opacity:0}.pane-edit-btn:hover{background:var(--theme-primary);color:#fff;border-color:var(--theme-primary)}.preview-pane:hover .pane-edit-btn{opacity:1}.context-menu-overlay{position:fixed;top:0;left:0;right:0;bottom:0;z-index:1200}.context-menu{position:fixed;background:var(--theme-bg);border:1px solid var(--theme-border);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.3);min-width:160px;padding:4px;z-index:1201}.context-menu-item{display:flex;align-items:center;gap:10px;width:100%;padding:8px 12px;border:none;background:none;color:var(--theme-fg);font-size:.9rem;text-align:left;cursor:pointer;border-radius:4px}.context-menu-item:hover{background:var(--theme-bg-more)}.context-menu-item.danger{color:var(--theme-danger, #ef4444)}.context-menu-item.danger:hover{background:rgba(239,68,68,.1)}.context-menu-item i{width:16px;text-align:center;opacity:.7}.context-menu-divider{height:1px;background:var(--theme-border);margin:4px 0}:host{display:flex;flex:1}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/splitPreview.component.scss\"],\"names\":[],\"mappings\":\"AAAA,eACE,YAAA,CACA,UAAA,CACA,YAAA,CACA,OAAA,CACA,iBAAA,CACA,eAAA,CACA,0BAAA,CACA,oCAAA,CAEA,0BACE,kBAAA,CAGF,wBACE,qBAAA,CAGF,sBACE,WAAA,CACA,sCAAA,CACA,8BAAA,CACA,WAAA,CACA,iBAAA,CAIJ,cACE,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,+BAAA,CACA,iBAAA,CACA,8BAAA,CACA,cAAA,CACA,mBAAA,CACA,iBAAA,CACA,eAAA,CAEA,oBACE,oCAAA,CAGF,uBACE,iCAAA,CACA,oCAAA,CAIJ,cACE,iBAAA,CACA,WAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CAGF,0BAEE,eAAA,CACA,eAAA,CACA,iBAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CAGF,cACE,eAAA,CACA,UAAA,CACA,cAAA,CAEA,2BACE,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,OAAA,CAEA,6BACE,UAAA,CACA,iBAAA,CACA,gBAAA,CAGF,gCACE,eAAA,CACA,sBAAA,CACA,kBAAA,CACA,eAAA,CAKN,eACE,iBAAA,CACA,OAAA,CACA,SAAA,CACA,eAAA,CACA,0BAAA,CACA,oCAAA,CACA,iBAAA,CACA,qBAAA,CACA,cAAA,CACA,eAAA,CACA,mBAAA,CACA,SAAA,CAEA,qBACE,+BAAA,CACA,UAAA,CACA,iCAAA,CAIJ,mCACE,SAAA,CAIF,sBACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,YAAA,CAGF,cACE,cAAA,CACA,0BAAA,CACA,oCAAA,CACA,iBAAA,CACA,oCAAA,CACA,eAAA,CACA,WAAA,CACA,YAAA,CAGF,mBACE,YAAA,CACA,kBAAA,CACA,QAAA,CACA,UAAA,CACA,gBAAA,CACA,WAAA,CACA,eAAA,CACA,qBAAA,CACA,eAAA,CACA,eAAA,CACA,cAAA,CACA,iBAAA,CAEA,yBACE,+BAAA,CAGF,0BACE,kCAAA,CAEA,gCACE,6BAAA,CAIJ,qBACE,UAAA,CACA,iBAAA,CACA,UAAA,CAIJ,sBACE,UAAA,CACA,8BAAA,CACA,YAAA,CAIF,MACE,YAAA,CACA,MAAA\",\"sourcesContent\":[\".split-preview {\\r\\n display: flex;\\r\\n width: 100%;\\r\\n height: 140px;\\r\\n gap: 4px;\\r\\n border-radius: 6px;\\r\\n overflow: hidden;\\r\\n background: var(--theme-bg);\\r\\n border: 1px solid var(--theme-border);\\r\\n\\r\\n &.horizontal {\\r\\n flex-direction: row;\\r\\n }\\r\\n\\r\\n &.vertical {\\r\\n flex-direction: column;\\r\\n }\\r\\n\\r\\n &.nested {\\r\\n height: auto;\\r\\n border: 1px dashed var(--theme-fg-more);\\r\\n background: rgba(255, 255, 255, 0.02);\\r\\n padding: 4px;\\r\\n border-radius: 4px;\\r\\n }\\r\\n}\\r\\n\\r\\n.preview-pane {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n background: var(--theme-bg-more);\\r\\n border-radius: 4px;\\r\\n border: 2px solid transparent;\\r\\n cursor: pointer;\\r\\n transition: all 0.15s;\\r\\n position: relative;\\r\\n min-height: 50px;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-bg-more-more);\\r\\n }\\r\\n\\r\\n &.selected {\\r\\n border-color: var(--theme-primary);\\r\\n background: var(--theme-bg-more-more);\\r\\n }\\r\\n}\\r\\n\\r\\n.pane-content {\\r\\n text-align: center;\\r\\n padding: 8px;\\r\\n color: var(--theme-fg);\\r\\n max-width: 100%;\\r\\n overflow: hidden;\\r\\n}\\r\\n\\r\\n.pane-title,\\r\\n.pane-profile {\\r\\n font-size: 0.8rem;\\r\\n font-weight: 500;\\r\\n margin-bottom: 2px;\\r\\n white-space: nowrap;\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n}\\r\\n\\r\\n.pane-details {\\r\\n font-size: 0.7rem;\\r\\n opacity: 0.7;\\r\\n margin-top: 4px;\\r\\n\\r\\n .pane-detail {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n gap: 4px;\\r\\n\\r\\n i {\\r\\n width: 12px;\\r\\n text-align: center;\\r\\n font-size: 0.65rem;\\r\\n }\\r\\n\\r\\n span {\\r\\n overflow: hidden;\\r\\n text-overflow: ellipsis;\\r\\n white-space: nowrap;\\r\\n max-width: 100px;\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.pane-edit-btn {\\r\\n position: absolute;\\r\\n top: 4px;\\r\\n right: 4px;\\r\\n padding: 4px 6px;\\r\\n background: var(--theme-bg);\\r\\n border: 1px solid var(--theme-border);\\r\\n border-radius: 4px;\\r\\n color: var(--theme-fg);\\r\\n cursor: pointer;\\r\\n font-size: 0.7rem;\\r\\n transition: all 0.15s;\\r\\n opacity: 0;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-primary);\\r\\n color: white;\\r\\n border-color: var(--theme-primary);\\r\\n }\\r\\n}\\r\\n\\r\\n.preview-pane:hover .pane-edit-btn {\\r\\n opacity: 1;\\r\\n}\\r\\n\\r\\n// Context menu\\r\\n.context-menu-overlay {\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n z-index: 1200;\\r\\n}\\r\\n\\r\\n.context-menu {\\r\\n position: fixed;\\r\\n background: var(--theme-bg);\\r\\n border: 1px solid var(--theme-border);\\r\\n border-radius: 8px;\\r\\n box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);\\r\\n min-width: 160px;\\r\\n padding: 4px;\\r\\n z-index: 1201;\\r\\n}\\r\\n\\r\\n.context-menu-item {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 10px;\\r\\n width: 100%;\\r\\n padding: 8px 12px;\\r\\n border: none;\\r\\n background: none;\\r\\n color: var(--theme-fg);\\r\\n font-size: 0.9rem;\\r\\n text-align: left;\\r\\n cursor: pointer;\\r\\n border-radius: 4px;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-bg-more);\\r\\n }\\r\\n\\r\\n &.danger {\\r\\n color: var(--theme-danger, #ef4444);\\r\\n\\r\\n &:hover {\\r\\n background: rgba(239, 68, 68, 0.1);\\r\\n }\\r\\n }\\r\\n\\r\\n i {\\r\\n width: 16px;\\r\\n text-align: center;\\r\\n opacity: 0.7;\\r\\n }\\r\\n}\\r\\n\\r\\n.context-menu-divider {\\r\\n height: 1px;\\r\\n background: var(--theme-border);\\r\\n margin: 4px 0;\\r\\n}\\r\\n\\r\\n// Nested splits styling\\r\\n:host {\\r\\n display: flex;\\r\\n flex: 1;\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","\"use strict\";\n\n/*\n MIT License http://www.opensource.org/licenses/mit-license.php\n Author Tobias Koppers @sokra\n*/\nmodule.exports = function (cssWithMappingToString) {\n var list = [];\n\n // return the list of modules as css string\n list.toString = function toString() {\n return this.map(function (item) {\n var content = \"\";\n var needLayer = typeof item[5] !== \"undefined\";\n if (item[4]) {\n content += \"@supports (\".concat(item[4], \") {\");\n }\n if (item[2]) {\n content += \"@media \".concat(item[2], \" {\");\n }\n if (needLayer) {\n content += \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\");\n }\n content += cssWithMappingToString(item);\n if (needLayer) {\n content += \"}\";\n }\n if (item[2]) {\n content += \"}\";\n }\n if (item[4]) {\n content += \"}\";\n }\n return content;\n }).join(\"\");\n };\n\n // import a list of modules into the list\n list.i = function i(modules, media, dedupe, supports, layer) {\n if (typeof modules === \"string\") {\n modules = [[null, modules, undefined]];\n }\n var alreadyImportedModules = {};\n if (dedupe) {\n for (var k = 0; k < this.length; k++) {\n var id = this[k][0];\n if (id != null) {\n alreadyImportedModules[id] = true;\n }\n }\n }\n for (var _k = 0; _k < modules.length; _k++) {\n var item = [].concat(modules[_k]);\n if (dedupe && alreadyImportedModules[item[0]]) {\n continue;\n }\n if (typeof layer !== \"undefined\") {\n if (typeof item[5] === \"undefined\") {\n item[5] = layer;\n } else {\n item[1] = \"@layer\".concat(item[5].length > 0 ? \" \".concat(item[5]) : \"\", \" {\").concat(item[1], \"}\");\n item[5] = layer;\n }\n }\n if (media) {\n if (!item[2]) {\n item[2] = media;\n } else {\n item[1] = \"@media \".concat(item[2], \" {\").concat(item[1], \"}\");\n item[2] = media;\n }\n }\n if (supports) {\n if (!item[4]) {\n item[4] = \"\".concat(supports);\n } else {\n item[1] = \"@supports (\".concat(item[4], \") {\").concat(item[1], \"}\");\n item[4] = supports;\n }\n }\n list.push(item);\n }\n };\n return list;\n};","\n var result = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./workspaceList.component.scss\");\n\n if (result && result.__esModule) {\n result = result.default;\n }\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n ","module.exports = __WEBPACK_EXTERNAL_MODULE__349__;","\"use strict\";\n\nmodule.exports = function (item) {\n var content = item[1];\n var cssMapping = item[3];\n if (!cssMapping) {\n return content;\n }\n if (typeof btoa === \"function\") {\n var base64 = btoa(unescape(encodeURIComponent(JSON.stringify(cssMapping))));\n var data = \"sourceMappingURL=data:application/json;charset=utf-8;base64,\".concat(base64);\n var sourceMapping = \"/*# \".concat(data, \" */\");\n return [content].concat([sourceMapping]).join(\"\\n\");\n }\n return [content].join(\"\\n\");\n};","module.exports = __WEBPACK_EXTERNAL_MODULE__358__;","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.workspace-list-container{padding:20px}.workspace-list-header{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px}.workspace-list-header h3{margin:0;font-size:1.5rem}.workspace-list{display:flex;flex-direction:column;gap:12px}.workspace-item{display:flex;justify-content:space-between;align-items:center;padding:16px;background:var(--theme-bg-more);border-radius:8px;border:1px solid var(--theme-border);transition:background .2s,border-color .2s;cursor:pointer}.workspace-item:hover{background:var(--theme-bg-more-more)}.workspace-item.selected{border-color:var(--theme-primary);border-left-width:3px;background:var(--theme-bg-more-more);box-shadow:0 0 0 1px var(--theme-primary) inset}.workspace-info{display:flex;align-items:center;gap:16px}.workspace-icon{font-size:24px;width:40px;text-align:center}.workspace-details{display:flex;flex-direction:column;gap:4px}.workspace-name{font-size:1.1rem;font-weight:500}.workspace-meta{font-size:.85rem;color:var(--theme-fg-more)}.workspace-meta .separator{margin:0 6px}.workspace-meta .badge{font-size:.75rem;padding:2px 6px;border-radius:4px;background:var(--theme-primary);color:#fff}.workspace-actions{display:flex;gap:4px}.workspace-actions .btn-link{padding:8px;color:var(--theme-fg-more);opacity:.7;transition:opacity .2s,color .2s}.workspace-actions .btn-link:hover{opacity:1}.workspace-actions .btn-link.open-btn:hover{color:var(--theme-success, #10b981)}.workspace-actions .btn-link.text-danger:hover{color:var(--theme-danger)}.workspace-empty{text-align:center;padding:40px;color:var(--theme-fg-more)}.workspace-empty p{margin:8px 0}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/workspaceList.component.scss\"],\"names\":[],\"mappings\":\"AAAA,0BACE,YAAA,CAGF,uBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,kBAAA,CAEA,0BACE,QAAA,CACA,gBAAA,CAIJ,gBACE,YAAA,CACA,qBAAA,CACA,QAAA,CAGF,gBACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,YAAA,CACA,+BAAA,CACA,iBAAA,CACA,oCAAA,CACA,0CAAA,CACA,cAAA,CAEA,sBACE,oCAAA,CAGF,yBACE,iCAAA,CACA,qBAAA,CACA,oCAAA,CACA,+CAAA,CAIJ,gBACE,YAAA,CACA,kBAAA,CACA,QAAA,CAGF,gBACE,cAAA,CACA,UAAA,CACA,iBAAA,CAGF,mBACE,YAAA,CACA,qBAAA,CACA,OAAA,CAGF,gBACE,gBAAA,CACA,eAAA,CAGF,gBACE,gBAAA,CACA,0BAAA,CAEA,2BACE,YAAA,CAGF,uBACE,gBAAA,CACA,eAAA,CACA,iBAAA,CACA,+BAAA,CACA,UAAA,CAIJ,mBACE,YAAA,CACA,OAAA,CAEA,6BACE,WAAA,CACA,0BAAA,CACA,UAAA,CACA,gCAAA,CAEA,mCACE,SAAA,CAGF,4CACE,mCAAA,CAGF,+CACE,yBAAA,CAKN,iBACE,iBAAA,CACA,YAAA,CACA,0BAAA,CAEA,mBACE,YAAA\",\"sourcesContent\":[\".workspace-list-container {\\r\\n padding: 20px;\\r\\n}\\r\\n\\r\\n.workspace-list-header {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n margin-bottom: 20px;\\r\\n\\r\\n h3 {\\r\\n margin: 0;\\r\\n font-size: 1.5rem;\\r\\n }\\r\\n}\\r\\n\\r\\n.workspace-list {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: 12px;\\r\\n}\\r\\n\\r\\n.workspace-item {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n padding: 16px;\\r\\n background: var(--theme-bg-more);\\r\\n border-radius: 8px;\\r\\n border: 1px solid var(--theme-border);\\r\\n transition: background 0.2s, border-color 0.2s;\\r\\n cursor: pointer;\\r\\n\\r\\n &:hover {\\r\\n background: var(--theme-bg-more-more);\\r\\n }\\r\\n\\r\\n &.selected {\\r\\n border-color: var(--theme-primary);\\r\\n border-left-width: 3px;\\r\\n background: var(--theme-bg-more-more);\\r\\n box-shadow: 0 0 0 1px var(--theme-primary) inset;\\r\\n }\\r\\n}\\r\\n\\r\\n.workspace-info {\\r\\n display: flex;\\r\\n align-items: center;\\r\\n gap: 16px;\\r\\n}\\r\\n\\r\\n.workspace-icon {\\r\\n font-size: 24px;\\r\\n width: 40px;\\r\\n text-align: center;\\r\\n}\\r\\n\\r\\n.workspace-details {\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n gap: 4px;\\r\\n}\\r\\n\\r\\n.workspace-name {\\r\\n font-size: 1.1rem;\\r\\n font-weight: 500;\\r\\n}\\r\\n\\r\\n.workspace-meta {\\r\\n font-size: 0.85rem;\\r\\n color: var(--theme-fg-more);\\r\\n\\r\\n .separator {\\r\\n margin: 0 6px;\\r\\n }\\r\\n\\r\\n .badge {\\r\\n font-size: 0.75rem;\\r\\n padding: 2px 6px;\\r\\n border-radius: 4px;\\r\\n background: var(--theme-primary);\\r\\n color: white;\\r\\n }\\r\\n}\\r\\n\\r\\n.workspace-actions {\\r\\n display: flex;\\r\\n gap: 4px;\\r\\n\\r\\n .btn-link {\\r\\n padding: 8px;\\r\\n color: var(--theme-fg-more);\\r\\n opacity: 0.7;\\r\\n transition: opacity 0.2s, color 0.2s;\\r\\n\\r\\n &:hover {\\r\\n opacity: 1;\\r\\n }\\r\\n\\r\\n &.open-btn:hover {\\r\\n color: var(--theme-success, #10b981);\\r\\n }\\r\\n\\r\\n &.text-danger:hover {\\r\\n color: var(--theme-danger);\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.workspace-empty {\\r\\n text-align: center;\\r\\n padding: 40px;\\r\\n color: var(--theme-fg-more);\\r\\n\\r\\n p {\\r\\n margin: 8px 0;\\r\\n }\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var pug = require(\"!../../node_modules/pug-runtime/index.js\");\n\nfunction template(locals) {var pug_html = \"\", pug_mixins = {}, pug_interp;pug_html = pug_html + \"\\u003Cdiv class=\\\"split-preview\\\" [class.horizontal]=\\\"split.orientation === &quot;horizontal&quot;\\\" [class.vertical]=\\\"split.orientation === &quot;vertical&quot;\\\" [class.nested]=\\\"depth &gt; 0\\\"\\u003E\\u003Cng-container *ngFor=\\\"let child of split.children; let i = index\\\"\\u003E\\u003Cdiv class=\\\"preview-pane\\\" *ngIf=\\\"isPane(child)\\\" [style.flex-basis]=\\\"getFlexStyle(i)\\\" [class.selected]=\\\"asPane(child).id === selectedPaneId\\\" (click)=\\\"onPaneClick(asPane(child)); $event.stopPropagation()\\\" (dblclick)=\\\"onEditClick($event, asPane(child))\\\" (contextmenu)=\\\"onContextMenu($event, asPane(child))\\\"\\u003E\\u003Cdiv class=\\\"pane-content\\\"\\u003E\\u003Cdiv class=\\\"pane-label\\\"\\u003E{{ getPaneLabel(asPane(child)) }}\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"pane-details\\\"\\u003E\\u003Cdiv class=\\\"pane-detail\\\" *ngIf=\\\"asPane(child).cwd\\\" [title]=\\\"asPane(child).cwd\\\"\\u003E\\u003Ci class=\\\"fas fa-folder\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003Cspan\\u003E{{ truncate(asPane(child).cwd, 20) }}\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"pane-detail\\\" *ngIf=\\\"asPane(child).startupCommand\\\" [title]=\\\"asPane(child).startupCommand\\\"\\u003E\\u003Ci class=\\\"fas fa-terminal\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003Cspan\\u003E{{ truncate(asPane(child).startupCommand, 20) }}\\u003C\\u002Fspan\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cbutton class=\\\"pane-edit-btn\\\" type=\\\"button\\\" (click)=\\\"onEditClick($event, asPane(child))\\\" title=\\\"Edit pane\\\"\\u003E\\u003Ci class=\\\"fas fa-pen\\\"\\u003E\\u003C\\u002Fi\\u003E\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003Csplit-preview *ngIf=\\\"isSplit(child)\\\" [split]=\\\"asSplit(child)\\\" [depth]=\\\"depth + 1\\\" [selectedPaneId]=\\\"selectedPaneId\\\" [profiles]=\\\"profiles\\\" [style.flex-basis]=\\\"getFlexStyle(i)\\\" (paneSelect)=\\\"onNestedPaneSelect($event)\\\" (paneEdit)=\\\"onNestedPaneEdit($event)\\\" (splitHorizontal)=\\\"onNestedSplitH($event)\\\" (splitVertical)=\\\"onNestedSplitV($event)\\\" (addLeft)=\\\"onNestedAddLeft($event)\\\" (addRight)=\\\"onNestedAddRight($event)\\\" (addTop)=\\\"onNestedAddTop($event)\\\" (addBottom)=\\\"onNestedAddBottom($event)\\\" (removePane)=\\\"onNestedRemove($event)\\\"\\u003E\\u003C\\u002Fsplit-preview\\u003E\\u003C\\u002Fng-container\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cdiv class=\\\"context-menu-overlay\\\" *ngIf=\\\"contextMenuPane\\\" (click)=\\\"closeContextMenu()\\\"\\u003E\\u003Cdiv class=\\\"context-menu\\\" [style.left.px]=\\\"contextMenuPosition.x\\\" [style.top.px]=\\\"contextMenuPosition.y\\\" (click)=\\\"$event.stopPropagation()\\\"\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onEdit()\\\"\\u003E\\u003Ci class=\\\"fas fa-pen\\\"\\u003E\\u003C\\u002Fi\\u003E Edit\\u003C\\u002Fbutton\\u003E\\u003Cdiv class=\\\"context-menu-divider\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onSplitH()\\\"\\u003E\\u003Ci class=\\\"fas fa-arrows-alt-h\\\"\\u003E\\u003C\\u002Fi\\u003E Split Horizontal\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onSplitV()\\\"\\u003E\\u003Ci class=\\\"fas fa-arrows-alt-v\\\"\\u003E\\u003C\\u002Fi\\u003E Split Vertical\\u003C\\u002Fbutton\\u003E\\u003Cdiv class=\\\"context-menu-divider\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onAddLeft()\\\"\\u003E\\u003Ci class=\\\"fas fa-caret-left\\\"\\u003E\\u003C\\u002Fi\\u003E Add Left\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onAddRight()\\\"\\u003E\\u003Ci class=\\\"fas fa-caret-right\\\"\\u003E\\u003C\\u002Fi\\u003E Add Right\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onAddTop()\\\"\\u003E\\u003Ci class=\\\"fas fa-caret-up\\\"\\u003E\\u003C\\u002Fi\\u003E Add Top\\u003C\\u002Fbutton\\u003E\\u003Cbutton class=\\\"context-menu-item\\\" type=\\\"button\\\" (click)=\\\"onAddBottom()\\\"\\u003E\\u003Ci class=\\\"fas fa-caret-down\\\"\\u003E\\u003C\\u002Fi\\u003E Add Bottom\\u003C\\u002Fbutton\\u003E\\u003Cdiv class=\\\"context-menu-divider\\\"\\u003E\\u003C\\u002Fdiv\\u003E\\u003Cbutton class=\\\"context-menu-item danger\\\" type=\\\"button\\\" (click)=\\\"onRemove()\\\"\\u003E\\u003Ci class=\\\"fas fa-trash\\\"\\u003E\\u003C\\u002Fi\\u003E Remove Pane\\u003C\\u002Fbutton\\u003E\\u003C\\u002Fdiv\\u003E\\u003C\\u002Fdiv\\u003E\";;return pug_html;};\nmodule.exports = template;","var req = require(\"!!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\src\\\\components\\\\splitPreview.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = __WEBPACK_EXTERNAL_MODULE__650__;","module.exports = __WEBPACK_EXTERNAL_MODULE__700__;","'use strict';\n\nvar pug_has_own_property = Object.prototype.hasOwnProperty;\n\n/**\n * Merge two attribute objects giving precedence\n * to values in object `b`. Classes are special-cased\n * allowing for arrays and merging/joining appropriately\n * resulting in a string.\n *\n * @param {Object} a\n * @param {Object} b\n * @return {Object} a\n * @api private\n */\n\nexports.merge = pug_merge;\nfunction pug_merge(a, b) {\n if (arguments.length === 1) {\n var attrs = a[0];\n for (var i = 1; i < a.length; i++) {\n attrs = pug_merge(attrs, a[i]);\n }\n return attrs;\n }\n\n for (var key in b) {\n if (key === 'class') {\n var valA = a[key] || [];\n a[key] = (Array.isArray(valA) ? valA : [valA]).concat(b[key] || []);\n } else if (key === 'style') {\n var valA = pug_style(a[key]);\n valA = valA && valA[valA.length - 1] !== ';' ? valA + ';' : valA;\n var valB = pug_style(b[key]);\n valB = valB && valB[valB.length - 1] !== ';' ? valB + ';' : valB;\n a[key] = valA + valB;\n } else {\n a[key] = b[key];\n }\n }\n\n return a;\n}\n\n/**\n * Process array, object, or string as a string of classes delimited by a space.\n *\n * If `val` is an array, all members of it and its subarrays are counted as\n * classes. If `escaping` is an array, then whether or not the item in `val` is\n * escaped depends on the corresponding item in `escaping`. If `escaping` is\n * not an array, no escaping is done.\n *\n * If `val` is an object, all the keys whose value is truthy are counted as\n * classes. No escaping is done.\n *\n * If `val` is a string, it is counted as a class. No escaping is done.\n *\n * @param {(Array.<string>|Object.<string, boolean>|string)} val\n * @param {?Array.<string>} escaping\n * @return {String}\n */\nexports.classes = pug_classes;\nfunction pug_classes_array(val, escaping) {\n var classString = '',\n className,\n padding = '',\n escapeEnabled = Array.isArray(escaping);\n for (var i = 0; i < val.length; i++) {\n className = pug_classes(val[i]);\n if (!className) continue;\n escapeEnabled && escaping[i] && (className = pug_escape(className));\n classString = classString + padding + className;\n padding = ' ';\n }\n return classString;\n}\nfunction pug_classes_object(val) {\n var classString = '',\n padding = '';\n for (var key in val) {\n if (key && val[key] && pug_has_own_property.call(val, key)) {\n classString = classString + padding + key;\n padding = ' ';\n }\n }\n return classString;\n}\nfunction pug_classes(val, escaping) {\n if (Array.isArray(val)) {\n return pug_classes_array(val, escaping);\n } else if (val && typeof val === 'object') {\n return pug_classes_object(val);\n } else {\n return val || '';\n }\n}\n\n/**\n * Convert object or string to a string of CSS styles delimited by a semicolon.\n *\n * @param {(Object.<string, string>|string)} val\n * @return {String}\n */\n\nexports.style = pug_style;\nfunction pug_style(val) {\n if (!val) return '';\n if (typeof val === 'object') {\n var out = '';\n for (var style in val) {\n /* istanbul ignore else */\n if (pug_has_own_property.call(val, style)) {\n out = out + style + ':' + val[style] + ';';\n }\n }\n return out;\n } else {\n return val + '';\n }\n}\n\n/**\n * Render the given attribute.\n *\n * @param {String} key\n * @param {String} val\n * @param {Boolean} escaped\n * @param {Boolean} terse\n * @return {String}\n */\nexports.attr = pug_attr;\nfunction pug_attr(key, val, escaped, terse) {\n if (\n val === false ||\n val == null ||\n (!val && (key === 'class' || key === 'style'))\n ) {\n return '';\n }\n if (val === true) {\n return ' ' + (terse ? key : key + '=\"' + key + '\"');\n }\n var type = typeof val;\n if (\n (type === 'object' || type === 'function') &&\n typeof val.toJSON === 'function'\n ) {\n val = val.toJSON();\n }\n if (typeof val !== 'string') {\n val = JSON.stringify(val);\n if (!escaped && val.indexOf('\"') !== -1) {\n return ' ' + key + \"='\" + val.replace(/'/g, '&#39;') + \"'\";\n }\n }\n if (escaped) val = pug_escape(val);\n return ' ' + key + '=\"' + val + '\"';\n}\n\n/**\n * Render the given attributes object.\n *\n * @param {Object} obj\n * @param {Object} terse whether to use HTML5 terse boolean attributes\n * @return {String}\n */\nexports.attrs = pug_attrs;\nfunction pug_attrs(obj, terse) {\n var attrs = '';\n\n for (var key in obj) {\n if (pug_has_own_property.call(obj, key)) {\n var val = obj[key];\n\n if ('class' === key) {\n val = pug_classes(val);\n attrs = pug_attr(key, val, false, terse) + attrs;\n continue;\n }\n if ('style' === key) {\n val = pug_style(val);\n }\n attrs += pug_attr(key, val, false, terse);\n }\n }\n\n return attrs;\n}\n\n/**\n * Escape the given string of `html`.\n *\n * @param {String} html\n * @return {String}\n * @api private\n */\n\nvar pug_match_html = /[\"&<>]/;\nexports.escape = pug_escape;\nfunction pug_escape(_html) {\n var html = '' + _html;\n var regexResult = pug_match_html.exec(html);\n if (!regexResult) return _html;\n\n var result = '';\n var i, lastIndex, escape;\n for (i = regexResult.index, lastIndex = 0; i < html.length; i++) {\n switch (html.charCodeAt(i)) {\n case 34:\n escape = '&quot;';\n break;\n case 38:\n escape = '&amp;';\n break;\n case 60:\n escape = '&lt;';\n break;\n case 62:\n escape = '&gt;';\n break;\n default:\n continue;\n }\n if (lastIndex !== i) result += html.substring(lastIndex, i);\n lastIndex = i + 1;\n result += escape;\n }\n if (lastIndex !== i) return result + html.substring(lastIndex, i);\n else return result;\n}\n\n/**\n * Re-throw the given `err` in context to the\n * the pug in `filename` at the given `lineno`.\n *\n * @param {Error} err\n * @param {String} filename\n * @param {String} lineno\n * @param {String} str original source\n * @api private\n */\n\nexports.rethrow = pug_rethrow;\nfunction pug_rethrow(err, filename, lineno, str) {\n if (!(err instanceof Error)) throw err;\n if ((typeof window != 'undefined' || !filename) && !str) {\n err.message += ' on line ' + lineno;\n throw err;\n }\n var context, lines, start, end;\n try {\n str = str || require('fs').readFileSync(filename, {encoding: 'utf8'});\n context = 3;\n lines = str.split('\\n');\n start = Math.max(lineno - context, 0);\n end = Math.min(lines.length, lineno + context);\n } catch (ex) {\n err.message +=\n ' - could not read from ' + filename + ' (' + ex.message + ')';\n pug_rethrow(err, null, lineno);\n return;\n }\n\n // Error context\n context = lines\n .slice(start, end)\n .map(function(line, i) {\n var curr = i + start + 1;\n return (curr == lineno ? ' > ' : ' ') + curr + '| ' + line;\n })\n .join('\\n');\n\n // Alter exception message\n err.path = filename;\n try {\n err.message =\n (filename || 'Pug') +\n ':' +\n lineno +\n '\\n' +\n context +\n '\\n\\n' +\n err.message;\n } catch (e) {}\n throw err;\n}\n","var req = require(\"!!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\src\\\\components\\\\workspaceEditor.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","\n var result = require(\"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./workspaceEditor.component.scss\");\n\n if (result && result.__esModule) {\n result = result.default;\n }\n\n if (typeof result === \"string\") {\n module.exports = result;\n } else {\n module.exports = result.toString();\n }\n ","module.exports = __WEBPACK_EXTERNAL_MODULE__860__;","var req = require(\"!!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\src\\\\components\\\\paneEditor.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, `.pane-editor-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.7);display:flex;align-items:center;justify-content:center;z-index:1100}.pane-editor-modal{background:var(--theme-bg);border-radius:12px;width:90%;max-width:500px;max-height:80vh;overflow:hidden;display:flex;flex-direction:column;box-shadow:0 20px 60px rgba(0,0,0,.4)}.modal-header{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid var(--theme-border)}.modal-header h4{margin:0;font-size:1.15rem}.modal-header .close-btn{font-size:1.15rem;color:var(--theme-fg-more);padding:4px 8px}.modal-header .close-btn:hover{color:var(--theme-fg)}.modal-body{padding:20px;overflow-y:auto;flex:1}.form-group{margin-bottom:16px}.form-group:last-child{margin-bottom:0}.form-group label{display:block;margin-bottom:6px;font-size:.9rem;color:var(--theme-fg-more)}.form-control{width:100%;padding:10px 12px;border-radius:6px;border:1px solid var(--theme-border);background:var(--theme-bg-more);color:var(--theme-fg);font-size:.95rem}.form-control:focus{outline:none;border-color:var(--theme-primary)}select.form-control{cursor:pointer}.input-with-button{display:flex;gap:8px}.input-with-button input{flex:1}.help-text{display:block;margin-top:4px;font-size:.8rem;color:var(--theme-fg-more);opacity:.8}.modal-footer{display:flex;justify-content:flex-end;gap:12px;padding:16px 20px;border-top:1px solid var(--theme-border)}`, \"\",{\"version\":3,\"sources\":[\"webpack://./src/components/paneEditor.component.scss\"],\"names\":[],\"mappings\":\"AAAA,qBACE,cAAA,CACA,KAAA,CACA,MAAA,CACA,OAAA,CACA,QAAA,CACA,yBAAA,CACA,YAAA,CACA,kBAAA,CACA,sBAAA,CACA,YAAA,CAGF,mBACE,0BAAA,CACA,kBAAA,CACA,SAAA,CACA,eAAA,CACA,eAAA,CACA,eAAA,CACA,YAAA,CACA,qBAAA,CACA,qCAAA,CAGF,cACE,YAAA,CACA,6BAAA,CACA,kBAAA,CACA,iBAAA,CACA,2CAAA,CAEA,iBACE,QAAA,CACA,iBAAA,CAGF,yBACE,iBAAA,CACA,0BAAA,CACA,eAAA,CAEA,+BACE,qBAAA,CAKN,YACE,YAAA,CACA,eAAA,CACA,MAAA,CAGF,YACE,kBAAA,CAEA,uBACE,eAAA,CAGF,kBACE,aAAA,CACA,iBAAA,CACA,eAAA,CACA,0BAAA,CAIJ,cACE,UAAA,CACA,iBAAA,CACA,iBAAA,CACA,oCAAA,CACA,+BAAA,CACA,qBAAA,CACA,gBAAA,CAEA,oBACE,YAAA,CACA,iCAAA,CAIJ,oBACE,cAAA,CAGF,mBACE,YAAA,CACA,OAAA,CAEA,yBACE,MAAA,CAIJ,WACE,aAAA,CACA,cAAA,CACA,eAAA,CACA,0BAAA,CACA,UAAA,CAGF,cACE,YAAA,CACA,wBAAA,CACA,QAAA,CACA,iBAAA,CACA,wCAAA\",\"sourcesContent\":[\".pane-editor-overlay {\\r\\n position: fixed;\\r\\n top: 0;\\r\\n left: 0;\\r\\n right: 0;\\r\\n bottom: 0;\\r\\n background: rgba(0, 0, 0, 0.7);\\r\\n display: flex;\\r\\n align-items: center;\\r\\n justify-content: center;\\r\\n z-index: 1100;\\r\\n}\\r\\n\\r\\n.pane-editor-modal {\\r\\n background: var(--theme-bg);\\r\\n border-radius: 12px;\\r\\n width: 90%;\\r\\n max-width: 500px;\\r\\n max-height: 80vh;\\r\\n overflow: hidden;\\r\\n display: flex;\\r\\n flex-direction: column;\\r\\n box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);\\r\\n}\\r\\n\\r\\n.modal-header {\\r\\n display: flex;\\r\\n justify-content: space-between;\\r\\n align-items: center;\\r\\n padding: 16px 20px;\\r\\n border-bottom: 1px solid var(--theme-border);\\r\\n\\r\\n h4 {\\r\\n margin: 0;\\r\\n font-size: 1.15rem;\\r\\n }\\r\\n\\r\\n .close-btn {\\r\\n font-size: 1.15rem;\\r\\n color: var(--theme-fg-more);\\r\\n padding: 4px 8px;\\r\\n\\r\\n &:hover {\\r\\n color: var(--theme-fg);\\r\\n }\\r\\n }\\r\\n}\\r\\n\\r\\n.modal-body {\\r\\n padding: 20px;\\r\\n overflow-y: auto;\\r\\n flex: 1;\\r\\n}\\r\\n\\r\\n.form-group {\\r\\n margin-bottom: 16px;\\r\\n\\r\\n &:last-child {\\r\\n margin-bottom: 0;\\r\\n }\\r\\n\\r\\n label {\\r\\n display: block;\\r\\n margin-bottom: 6px;\\r\\n font-size: 0.9rem;\\r\\n color: var(--theme-fg-more);\\r\\n }\\r\\n}\\r\\n\\r\\n.form-control {\\r\\n width: 100%;\\r\\n padding: 10px 12px;\\r\\n border-radius: 6px;\\r\\n border: 1px solid var(--theme-border);\\r\\n background: var(--theme-bg-more);\\r\\n color: var(--theme-fg);\\r\\n font-size: 0.95rem;\\r\\n\\r\\n &:focus {\\r\\n outline: none;\\r\\n border-color: var(--theme-primary);\\r\\n }\\r\\n}\\r\\n\\r\\nselect.form-control {\\r\\n cursor: pointer;\\r\\n}\\r\\n\\r\\n.input-with-button {\\r\\n display: flex;\\r\\n gap: 8px;\\r\\n\\r\\n input {\\r\\n flex: 1;\\r\\n }\\r\\n}\\r\\n\\r\\n.help-text {\\r\\n display: block;\\r\\n margin-top: 4px;\\r\\n font-size: 0.8rem;\\r\\n color: var(--theme-fg-more);\\r\\n opacity: 0.8;\\r\\n}\\r\\n\\r\\n.modal-footer {\\r\\n display: flex;\\r\\n justify-content: flex-end;\\r\\n gap: 12px;\\r\\n padding: 16px 20px;\\r\\n border-top: 1px solid var(--theme-border);\\r\\n}\\r\\n\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","if(typeof __WEBPACK_EXTERNAL_MODULE__947__ === 'undefined') { var e = new Error(\"Cannot find module 'fs'\"); e.code = 'MODULE_NOT_FOUND'; throw e; }\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE__947__;","var req = require(\"!!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\node_modules\\\\pug-loader\\\\index.js!C:\\\\Users\\\\halil\\\\tabbyspaces\\\\src\\\\components\\\\workspaceList.component.pug\");\nmodule.exports = (req['default'] || req).apply(req, [])","module.exports = __WEBPACK_EXTERNAL_MODULE__961__;","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Check if module exists (development only)\n\tif (__webpack_modules__[moduleId] === undefined) {\n\t\tvar e = new Error(\"Cannot find module '\" + moduleId + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\tid: moduleId,\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","// Build-time constants injected by webpack DefinePlugin\r\ndeclare const __CONFIG_KEY__: string\r\ndeclare const __DISPLAY_NAME__: string\r\ndeclare const __IS_DEV__: boolean\r\n\r\nexport const CONFIG_KEY = typeof __CONFIG_KEY__ !== 'undefined' ? __CONFIG_KEY__ : 'tabbyspaces'\r\nexport const DISPLAY_NAME = typeof __DISPLAY_NAME__ !== 'undefined' ? __DISPLAY_NAME__ : 'TabbySpaces'\r\nexport const IS_DEV = typeof __IS_DEV__ !== 'undefined' ? __IS_DEV__ : false\r\n","import { Injectable } from '@angular/core'\r\nimport { ConfigProvider } from 'tabby-core'\r\nimport { CONFIG_KEY } from '../build-config'\r\n\r\n@Injectable()\r\nexport class WorkspaceEditorConfigProvider extends ConfigProvider {\r\n defaults = {\r\n [CONFIG_KEY]: {\r\n workspaces: [],\r\n },\r\n }\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { AppService, BaseTabComponent, SplitTabComponent } from 'tabby-core'\r\nimport { BaseTerminalTabComponent } from 'tabby-terminal'\r\nimport { Subscription, first, timer, switchMap } from 'rxjs'\r\n\r\nexport interface PendingCommand {\r\n paneId: string\r\n command?: string\r\n originalTitle: string\r\n}\r\n\r\n@Injectable()\r\nexport class StartupCommandService {\r\n private pendingCommands: Map<string, PendingCommand> = new Map()\r\n private subscription: Subscription\r\n\r\n constructor(private app: AppService) {\r\n this.subscription = this.app.tabOpened$.subscribe((tab) => this.onTabOpened(tab))\r\n }\r\n\r\n registerCommands(commands: PendingCommand[]): void {\r\n console.log('[TabbySpaces] Registering commands:', commands)\r\n for (const cmd of commands) {\r\n this.pendingCommands.set(cmd.paneId, cmd)\r\n }\r\n }\r\n\r\n private onTabOpened(tab: BaseTabComponent): void {\r\n console.log('[TabbySpaces] Tab opened:', {\r\n type: tab.constructor.name,\r\n title: tab.title,\r\n })\r\n\r\n // Handle SplitTabComponent - get all child terminal tabs\r\n if (tab instanceof SplitTabComponent) {\r\n console.log('[TabbySpaces] SplitTabComponent detected, waiting for children...')\r\n // Wait for split tab to fully initialize its children\r\n setTimeout(() => this.processChildTabs(tab), 300)\r\n return\r\n }\r\n\r\n // Handle individual terminal tab (shouldn't happen for split-layout, but just in case)\r\n if (tab instanceof BaseTerminalTabComponent) {\r\n this.processTerminalTab(tab)\r\n }\r\n }\r\n\r\n private processChildTabs(splitTab: SplitTabComponent): void {\r\n // Get all nested tabs from the split container\r\n const allTabs = splitTab.getAllTabs()\r\n console.log('[TabbySpaces] Found child tabs:', allTabs.length)\r\n\r\n for (const tab of allTabs) {\r\n if (tab instanceof BaseTerminalTabComponent) {\r\n this.processTerminalTab(tab)\r\n }\r\n }\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private processTerminalTab(terminalTab: BaseTerminalTabComponent<any>): void {\r\n const paneId = terminalTab.customTitle || terminalTab.title\r\n console.log('[TabbySpaces] Processing terminal tab:', {\r\n title: terminalTab.title,\r\n customTitle: terminalTab.customTitle,\r\n paneId,\r\n pendingKeys: [...this.pendingCommands.keys()],\r\n })\r\n\r\n const pending = this.pendingCommands.get(paneId)\r\n if (!pending) {\r\n console.log('[TabbySpaces] No matching command for paneId:', paneId)\r\n return\r\n }\r\n\r\n this.pendingCommands.delete(paneId)\r\n\r\n // Build startup command (cd + command)\r\n const fullCommand = this.buildFullCommand(pending)\r\n if (!fullCommand) {\r\n console.log('[TabbySpaces] No command to send (no cwd or startup command)')\r\n return\r\n }\r\n\r\n console.log('[TabbySpaces] Command matched, waiting for shell output...:', fullCommand)\r\n\r\n // Wait for shell to emit first output (prompt), then send command\r\n if (terminalTab.session?.output$) {\r\n terminalTab.session.output$.pipe(\r\n first(), // Wait for first output (shell prompt)\r\n switchMap(() => timer(100)) // Small buffer after prompt renders\r\n ).subscribe(() => {\r\n console.log('[TabbySpaces] Shell ready, sending command:', fullCommand)\r\n terminalTab.sendInput(fullCommand + '\\r')\r\n\r\n // Clear profile args to prevent native splits from re-running command\r\n this.clearProfileArgs(terminalTab)\r\n\r\n // Reset title - either to original or clear for dynamic shell title\r\n if (pending.originalTitle) {\r\n terminalTab.setTitle(pending.originalTitle)\r\n } else {\r\n terminalTab.customTitle = ''\r\n }\r\n })\r\n } else {\r\n console.log('[TabbySpaces] No session.output$, falling back to timeout')\r\n // Fallback if session not available yet\r\n setTimeout(() => {\r\n terminalTab.sendInput(fullCommand + '\\r')\r\n\r\n // Clear profile args to prevent native splits from re-running command\r\n this.clearProfileArgs(terminalTab)\r\n\r\n if (pending.originalTitle) {\r\n terminalTab.setTitle(pending.originalTitle)\r\n } else {\r\n terminalTab.customTitle = ''\r\n }\r\n }, 500)\r\n }\r\n }\r\n\r\n private buildFullCommand(pending: PendingCommand): string | null {\r\n return pending.command || null\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n private clearProfileArgs(terminalTab: BaseTerminalTabComponent<any>): void {\r\n // Clear args from profile to prevent native splits from re-running startup command\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n const profile = (terminalTab as any).profile\r\n if (profile?.options?.args) {\r\n console.log('[TabbySpaces] Clearing profile args to prevent re-run on split')\r\n profile.options.args = []\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscription?.unsubscribe()\r\n }\r\n}\r\n","// Tabby profile interfaces\r\nexport interface TabbyProfileOptions {\r\n command?: string\r\n args?: string[]\r\n cwd?: string\r\n env?: Record<string, string>\r\n restoreFromPTYID?: boolean\r\n width?: number | null\r\n height?: number | null\r\n pauseAfterExit?: boolean\r\n runAsAdministrator?: boolean\r\n}\r\n\r\nexport interface TabbyProfile {\r\n id: string\r\n type: string\r\n name: string\r\n group?: string\r\n icon?: string\r\n color?: string\r\n options?: TabbyProfileOptions\r\n isBuiltin?: boolean\r\n isTemplate?: boolean\r\n weight?: number\r\n disableDynamicTitle?: boolean\r\n terminalColorScheme?: string | null\r\n behaviorOnSessionEnd?: string\r\n}\r\n\r\nexport interface TabbyRecoveryToken {\r\n type: string\r\n orientation?: 'h' | 'v'\r\n ratios?: number[]\r\n children?: TabbyRecoveryToken[]\r\n profile?: Partial<TabbyProfile>\r\n savedState?: boolean\r\n tabTitle?: string\r\n tabCustomTitle?: string\r\n disableDynamicTitle?: boolean\r\n cwd?: string\r\n}\r\n\r\nexport interface TabbySplitLayoutProfile {\r\n id: string\r\n type: 'split-layout'\r\n name: string\r\n group: string\r\n icon?: string\r\n color?: string\r\n isBuiltin: boolean\r\n options: {\r\n recoveryToken: TabbyRecoveryToken\r\n }\r\n}\r\n\r\n// Workspace interfaces\r\nexport interface WorkspacePane {\r\n id: string\r\n profileId: string\r\n cwd?: string\r\n startupCommand?: string\r\n title?: string\r\n}\r\n\r\nexport interface WorkspaceSplit {\r\n orientation: 'horizontal' | 'vertical'\r\n ratios: number[]\r\n children: (WorkspacePane | WorkspaceSplit)[]\r\n}\r\n\r\nexport interface Workspace {\r\n id: string\r\n name: string\r\n icon?: string\r\n color?: string\r\n root: WorkspaceSplit\r\n launchOnStartup?: boolean\r\n}\r\n\r\nexport function isWorkspaceSplit(node: WorkspacePane | WorkspaceSplit): node is WorkspaceSplit {\r\n return 'orientation' in node && 'children' in node\r\n}\r\n\r\nexport function createDefaultPane(): WorkspacePane {\r\n return {\r\n id: generateUUID(),\r\n profileId: '',\r\n cwd: '',\r\n startupCommand: '',\r\n title: '',\r\n }\r\n}\r\n\r\nexport function createDefaultSplit(orientation: 'horizontal' | 'vertical' = 'horizontal'): WorkspaceSplit {\r\n return {\r\n orientation,\r\n ratios: [0.5, 0.5],\r\n children: [createDefaultPane(), createDefaultPane()],\r\n }\r\n}\r\n\r\n// Color palette for workspaces\r\nconst WORKSPACE_COLORS = [\r\n '#3b82f6', // blue\r\n '#10b981', // emerald\r\n '#f59e0b', // amber\r\n '#ef4444', // red\r\n '#8b5cf6', // violet\r\n '#ec4899', // pink\r\n '#06b6d4', // cyan\r\n '#f97316', // orange\r\n]\r\n\r\n// Icon list for workspaces\r\nconst WORKSPACE_ICONS = [\r\n 'columns', 'terminal', 'code', 'folder', 'home', 'briefcase',\r\n 'cog', 'database', 'server', 'cloud', 'rocket', 'flask',\r\n 'bug', 'wrench', 'cube', 'layer-group', 'sitemap', 'project-diagram'\r\n]\r\n\r\nexport function getRandomColor(): string {\r\n return WORKSPACE_COLORS[Math.floor(Math.random() * WORKSPACE_COLORS.length)]\r\n}\r\n\r\nexport function getRandomIcon(): string {\r\n return WORKSPACE_ICONS[Math.floor(Math.random() * WORKSPACE_ICONS.length)]\r\n}\r\n\r\nexport function createDefaultWorkspace(name: string = ''): Workspace {\r\n return {\r\n id: generateUUID(),\r\n name,\r\n icon: getRandomIcon(),\r\n color: getRandomColor(),\r\n root: createDefaultSplit(),\r\n launchOnStartup: false,\r\n }\r\n}\r\n\r\nexport function generateUUID(): string {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\r\n const r = (Math.random() * 16) | 0\r\n const v = c === 'x' ? r : (r & 0x3) | 0x8\r\n return v.toString(16)\r\n })\r\n}\r\n\r\nexport function countPanes(node: WorkspacePane | WorkspaceSplit): number {\r\n if (isWorkspaceSplit(node)) {\r\n return node.children.reduce((sum, child) => sum + countPanes(child), 0)\r\n }\r\n return 1\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { ConfigService, NotificationsService, ProfilesService } from 'tabby-core'\r\nimport {\r\n Workspace,\r\n WorkspacePane,\r\n WorkspaceSplit,\r\n isWorkspaceSplit,\r\n generateUUID,\r\n TabbyProfile,\r\n TabbyRecoveryToken,\r\n TabbySplitLayoutProfile,\r\n} from '../models/workspace.model'\r\nimport { CONFIG_KEY, DISPLAY_NAME } from '../build-config'\r\nimport { PendingCommand } from './startupCommand.service'\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class WorkspaceEditorService {\r\n private cachedProfiles: TabbyProfile[] = []\r\n\r\n constructor(\r\n private config: ConfigService,\r\n private notifications: NotificationsService,\r\n private profilesService: ProfilesService\r\n ) {}\r\n\r\n private async cacheProfiles(): Promise<void> {\r\n this.cachedProfiles = (await this.profilesService.getProfiles()) as TabbyProfile[]\r\n }\r\n\r\n getWorkspaces(): Workspace[] {\r\n return this.config.store?.[CONFIG_KEY]?.workspaces ?? []\r\n }\r\n\r\n async saveWorkspaces(workspaces: Workspace[]): Promise<boolean> {\r\n if (!this.config.store?.[CONFIG_KEY]) {\r\n return false\r\n }\r\n this.config.store[CONFIG_KEY].workspaces = workspaces\r\n return await this.saveConfig()\r\n }\r\n\r\n async addWorkspace(workspace: Workspace): Promise<void> {\r\n const workspaces = this.getWorkspaces()\r\n workspaces.push(workspace)\r\n await this.saveWorkspaces(workspaces)\r\n this.notifications.info(`Workspace \"${workspace.name}\" created`)\r\n }\r\n\r\n async updateWorkspace(workspace: Workspace): Promise<void> {\r\n const workspaces = this.getWorkspaces()\r\n const index = workspaces.findIndex((w) => w.id === workspace.id)\r\n if (index !== -1) {\r\n workspaces[index] = workspace\r\n await this.saveWorkspaces(workspaces)\r\n this.notifications.info(`Workspace \"${workspace.name}\" updated`)\r\n }\r\n }\r\n\r\n async deleteWorkspace(workspaceId: string): Promise<void> {\r\n const workspaces = this.getWorkspaces()\r\n const workspace = workspaces.find((w) => w.id === workspaceId)\r\n const filtered = workspaces.filter((w) => w.id !== workspaceId)\r\n await this.saveWorkspaces(filtered)\r\n if (workspace) {\r\n this.notifications.info(`Workspace \"${workspace.name}\" deleted`)\r\n }\r\n }\r\n\r\n async getAvailableProfiles(): Promise<TabbyProfile[]> {\r\n const allProfiles = await this.profilesService.getProfiles()\r\n return allProfiles.filter(\r\n (p) =>\r\n (p.type === 'local' || p.type?.startsWith('local:')) &&\r\n !p.id?.startsWith('split-layout:')\r\n ) as TabbyProfile[]\r\n }\r\n\r\n /**\r\n * Cleanup orphaned profiles from previous plugin versions.\r\n * Call this once on plugin init.\r\n */\r\n cleanupOrphanedProfiles(): void {\r\n if (!this.config.store?.profiles) {\r\n return\r\n }\r\n const profiles: TabbyProfile[] = this.config.store.profiles\r\n const prefix = `split-layout:${CONFIG_KEY}:`\r\n const filtered = profiles.filter((p) => !p.id?.startsWith(prefix))\r\n if (filtered.length !== profiles.length) {\r\n this.config.store.profiles = filtered\r\n this.config.save()\r\n console.log(`[${DISPLAY_NAME}] Cleaned up ${profiles.length - filtered.length} orphaned profiles`)\r\n }\r\n }\r\n\r\n async generateTabbyProfile(workspace: Workspace): Promise<TabbySplitLayoutProfile> {\r\n await this.cacheProfiles()\r\n const safeName = this.sanitizeForProfileId(workspace.name)\r\n return {\r\n id: `split-layout:${CONFIG_KEY}:${safeName}:${workspace.id}`,\r\n type: 'split-layout',\r\n name: workspace.name,\r\n group: DISPLAY_NAME,\r\n icon: workspace.icon,\r\n color: workspace.color,\r\n isBuiltin: false,\r\n options: {\r\n recoveryToken: this.generateRecoveryToken(workspace.root),\r\n },\r\n }\r\n }\r\n\r\n private generateRecoveryToken(split: WorkspaceSplit): TabbyRecoveryToken {\r\n return {\r\n type: 'app:split-tab',\r\n orientation: split.orientation === 'horizontal' ? 'h' : 'v',\r\n ratios: split.ratios,\r\n children: split.children.map((child) => {\r\n if (isWorkspaceSplit(child)) {\r\n return this.generateRecoveryToken(child)\r\n }\r\n return this.generatePaneToken(child)\r\n }),\r\n }\r\n }\r\n\r\n private generatePaneToken(pane: WorkspacePane): TabbyRecoveryToken {\r\n const baseProfile = this.getProfileById(pane.profileId)\r\n\r\n if (!baseProfile) {\r\n return {\r\n type: 'app:local-tab',\r\n profile: {\r\n type: 'local',\r\n name: 'Shell',\r\n },\r\n savedState: false,\r\n }\r\n }\r\n\r\n // Build complete profile object like Tabby expects\r\n const options = {\r\n restoreFromPTYID: false,\r\n command: baseProfile.options?.command || '',\r\n args: baseProfile.options?.args || [],\r\n cwd: pane.cwd || baseProfile.options?.cwd || '',\r\n env: baseProfile.options?.env || {},\r\n width: null,\r\n height: null,\r\n pauseAfterExit: false,\r\n runAsAdministrator: false,\r\n }\r\n\r\n // Note: startupCommand is handled via sendInput() in StartupCommandService\r\n // to avoid re-execution when Tabby splits the pane\r\n\r\n const profile = {\r\n id: baseProfile.id,\r\n type: 'local',\r\n name: baseProfile.name || 'Shell',\r\n group: baseProfile.group || '',\r\n options,\r\n icon: baseProfile.icon || '',\r\n color: baseProfile.color || '',\r\n disableDynamicTitle: false,\r\n weight: 0,\r\n isBuiltin: false,\r\n isTemplate: false,\r\n terminalColorScheme: null,\r\n behaviorOnSessionEnd: 'auto',\r\n }\r\n\r\n // Use pane.id for matching in StartupCommandService\r\n // Original title will be restored after command execution\r\n const cwd = pane.cwd || baseProfile.options?.cwd || ''\r\n return {\r\n type: 'app:local-tab',\r\n profile,\r\n savedState: false,\r\n tabTitle: pane.id,\r\n tabCustomTitle: pane.id,\r\n disableDynamicTitle: false,\r\n cwd,\r\n }\r\n }\r\n\r\n duplicateWorkspace(workspace: Workspace): Workspace {\r\n const clone = JSON.parse(JSON.stringify(workspace)) as Workspace\r\n clone.id = generateUUID()\r\n clone.name = `${workspace.name} (Copy)`\r\n clone.launchOnStartup = false\r\n this.regenerateIds(clone.root)\r\n return clone\r\n }\r\n\r\n private regenerateIds(node: WorkspacePane | WorkspaceSplit): void {\r\n if (isWorkspaceSplit(node)) {\r\n for (const child of node.children) {\r\n this.regenerateIds(child)\r\n }\r\n } else {\r\n node.id = generateUUID()\r\n }\r\n }\r\n\r\n private sanitizeForProfileId(name: string): string {\r\n return name\r\n .toLowerCase()\r\n .replace(/[^a-z0-9-]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '')\r\n || 'workspace'\r\n }\r\n\r\n private getProfileById(profileId: string): TabbyProfile | undefined {\r\n const isLocalType = (type: string) => type === 'local' || type?.startsWith('local:')\r\n\r\n // First: check user profiles in config\r\n const userProfiles: TabbyProfile[] = this.config.store?.profiles ?? []\r\n const found = userProfiles.find((p) => p.id === profileId && isLocalType(p.type))\r\n if (found) return found\r\n\r\n // Fallback: check cached profiles (includes built-ins)\r\n return this.cachedProfiles.find((p) => p.id === profileId && isLocalType(p.type))\r\n }\r\n\r\n collectStartupCommands(workspace: Workspace): PendingCommand[] {\r\n const commands: PendingCommand[] = []\r\n this.collectCommandsFromNode(workspace.root, commands)\r\n return commands\r\n }\r\n\r\n private collectCommandsFromNode(\r\n node: WorkspacePane | WorkspaceSplit,\r\n commands: PendingCommand[]\r\n ): void {\r\n if (isWorkspaceSplit(node)) {\r\n for (const child of node.children) {\r\n this.collectCommandsFromNode(child, commands)\r\n }\r\n } else if (node.startupCommand) {\r\n commands.push({\r\n paneId: node.id,\r\n command: node.startupCommand,\r\n originalTitle: node.title || '',\r\n })\r\n }\r\n }\r\n\r\n private async saveConfig(): Promise<boolean> {\r\n try {\r\n await this.config.save()\r\n return true\r\n } catch (error) {\r\n this.notifications.error('Failed to save configuration')\r\n console.error('TabbySpaces save error:', error)\r\n return false\r\n }\r\n }\r\n}\r\n","import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, ElementRef, NgZone } from '@angular/core'\r\nimport { ConfigService, ProfilesService } from 'tabby-core'\r\nimport { Subscription } from 'rxjs'\r\nimport { StartupCommandService } from '../services/startupCommand.service'\r\nimport { WorkspaceEditorService } from '../services/workspaceEditor.service'\r\nimport {\r\n Workspace,\r\n WorkspacePane,\r\n WorkspaceSplit,\r\n countPanes,\r\n createDefaultWorkspace,\r\n isWorkspaceSplit,\r\n} from '../models/workspace.model'\r\n\r\n@Component({\r\n selector: 'workspace-list',\r\n template: require('./workspaceList.component.pug'),\r\n styles: [require('./workspaceList.component.scss')],\r\n})\r\nexport class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit {\r\n workspaces: Workspace[] = []\r\n selectedWorkspace: Workspace | null = null\r\n editingWorkspace: Workspace | null = null\r\n isCreatingNew = false\r\n openingWorkspaceId: string | null = null\r\n private configSubscription: Subscription | null = null\r\n\r\n constructor(\r\n public config: ConfigService,\r\n private workspaceService: WorkspaceEditorService,\r\n private profilesService: ProfilesService,\r\n private startupService: StartupCommandService,\r\n private cdr: ChangeDetectorRef,\r\n private elementRef: ElementRef,\r\n private zone: NgZone\r\n ) {}\r\n\r\n ngOnInit(): void {\r\n this.loadWorkspaces()\r\n this.autoSelectFirst()\r\n this.configSubscription = this.config.changed$.subscribe(() => {\r\n this.loadWorkspaces()\r\n })\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // Hack: Override Tabby's settings-tab-body max-width restriction\r\n setTimeout(() => {\r\n const parent = this.elementRef.nativeElement.closest('settings-tab-body') as HTMLElement\r\n if (parent) {\r\n parent.style.maxWidth = '876px'\r\n }\r\n }, 0)\r\n }\r\n\r\n private autoSelectFirst(): void {\r\n if (this.workspaces.length > 0 && !this.selectedWorkspace) {\r\n this.selectWorkspace(this.workspaces[0])\r\n }\r\n }\r\n\r\n selectWorkspace(workspace: Workspace): void {\r\n this.isCreatingNew = false\r\n this.selectedWorkspace = workspace\r\n this.editingWorkspace = JSON.parse(JSON.stringify(workspace))\r\n }\r\n\r\n isSelected(workspace: Workspace): boolean {\r\n return this.selectedWorkspace?.id === workspace.id\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.configSubscription?.unsubscribe()\r\n }\r\n\r\n loadWorkspaces(): void {\r\n this.workspaces = this.workspaceService.getWorkspaces()\r\n this.cdr.detectChanges()\r\n }\r\n\r\n async createWorkspace(): Promise<void> {\r\n const profiles = await this.workspaceService.getAvailableProfiles()\r\n const defaultProfileId = profiles[0]?.id || ''\r\n const workspace = createDefaultWorkspace()\r\n this.setProfileForAllPanes(workspace.root, defaultProfileId)\r\n this.selectedWorkspace = null\r\n this.editingWorkspace = workspace\r\n this.isCreatingNew = true\r\n this.cdr.detectChanges()\r\n }\r\n\r\n private setProfileForAllPanes(node: WorkspacePane | WorkspaceSplit, profileId: string): void {\r\n if (isWorkspaceSplit(node)) {\r\n node.children.forEach((child) => this.setProfileForAllPanes(child, profileId))\r\n } else {\r\n node.profileId = profileId\r\n }\r\n }\r\n\r\n editWorkspace(workspace: Workspace): void {\r\n this.selectWorkspace(workspace)\r\n }\r\n\r\n async duplicateWorkspace(event: MouseEvent, workspace: Workspace): Promise<void> {\r\n event.stopPropagation()\r\n const clone = this.workspaceService.duplicateWorkspace(workspace)\r\n await this.workspaceService.addWorkspace(clone)\r\n this.loadWorkspaces()\r\n\r\n // Select the duplicated workspace\r\n const duplicated = this.workspaces.find((w) => w.id === clone.id)\r\n if (duplicated) {\r\n this.selectWorkspace(duplicated)\r\n }\r\n this.cdr.detectChanges()\r\n }\r\n\r\n async deleteWorkspace(event: MouseEvent, workspace: Workspace): Promise<void> {\r\n event.stopPropagation()\r\n if (confirm(`Delete workspace \"${workspace.name}\"?`)) {\r\n const currentIndex = this.workspaces.findIndex((w) => w.id === workspace.id)\r\n await this.workspaceService.deleteWorkspace(workspace.id)\r\n this.loadWorkspaces()\r\n\r\n // Select next workspace after deletion\r\n if (this.workspaces.length > 0) {\r\n const nextIndex = Math.min(currentIndex, this.workspaces.length - 1)\r\n this.selectWorkspace(this.workspaces[nextIndex])\r\n } else {\r\n this.selectedWorkspace = null\r\n this.editingWorkspace = null\r\n this.isCreatingNew = false\r\n }\r\n this.cdr.detectChanges()\r\n }\r\n }\r\n\r\n async onEditorSave(workspace: Workspace): Promise<void> {\r\n const isNew = !this.workspaces.find((w) => w.id === workspace.id)\r\n if (isNew) {\r\n await this.workspaceService.addWorkspace(workspace)\r\n } else {\r\n await this.workspaceService.updateWorkspace(workspace)\r\n }\r\n this.loadWorkspaces()\r\n this.isCreatingNew = false\r\n\r\n // Select the saved workspace\r\n const saved = this.workspaces.find((w) => w.id === workspace.id)\r\n if (saved) {\r\n this.selectWorkspace(saved)\r\n }\r\n this.cdr.detectChanges()\r\n }\r\n\r\n onEditorCancel(): void {\r\n if (this.isCreatingNew) {\r\n // Cancel new workspace creation - go back to first workspace or empty\r\n this.isCreatingNew = false\r\n if (this.workspaces.length > 0) {\r\n this.selectWorkspace(this.workspaces[0])\r\n } else {\r\n this.selectedWorkspace = null\r\n this.editingWorkspace = null\r\n }\r\n } else if (this.selectedWorkspace) {\r\n // Reset to original workspace data\r\n this.editingWorkspace = JSON.parse(JSON.stringify(this.selectedWorkspace))\r\n }\r\n this.cdr.detectChanges()\r\n }\r\n\r\n getPaneCount(workspace: Workspace): number {\r\n return countPanes(workspace.root)\r\n }\r\n\r\n getOrientationLabel(workspace: Workspace): string {\r\n return workspace.root.orientation === 'horizontal' ? 'horizontal' : 'vertical'\r\n }\r\n\r\n get hasUnsavedChanges(): boolean {\r\n if (!this.editingWorkspace || !this.selectedWorkspace) return this.isCreatingNew\r\n return JSON.stringify(this.editingWorkspace) !== JSON.stringify(this.selectedWorkspace)\r\n }\r\n\r\n async openWorkspace(event: MouseEvent, workspace: Workspace): Promise<void> {\r\n event.stopPropagation()\r\n if (this.openingWorkspaceId) return\r\n this.openingWorkspaceId = workspace.id\r\n\r\n try {\r\n const commands = this.workspaceService.collectStartupCommands(workspace)\r\n if (commands.length > 0) {\r\n this.startupService.registerCommands(commands)\r\n }\r\n\r\n const profile = await this.workspaceService.generateTabbyProfile(workspace)\r\n this.zone.run(() => {\r\n this.profilesService.openNewTabForProfile(profile)\r\n })\r\n } finally {\r\n this.openingWorkspaceId = null\r\n this.cdr.detectChanges()\r\n }\r\n }\r\n}\r\n","import { Injectable } from '@angular/core'\r\nimport { SettingsTabProvider } from 'tabby-settings'\r\nimport { WorkspaceListComponent } from '../components/workspaceList.component'\r\nimport { CONFIG_KEY, DISPLAY_NAME, IS_DEV } from '../build-config'\r\n\r\n@Injectable()\r\nexport class WorkspaceEditorSettingsProvider extends SettingsTabProvider {\r\n id = CONFIG_KEY\r\n icon = IS_DEV ? 'bolt' : 'th-large'\r\n title = DISPLAY_NAME\r\n\r\n getComponentType(): any {\r\n return WorkspaceListComponent\r\n }\r\n}\r\n","import { Injectable } from '@angular/core'\nimport { ToolbarButtonProvider, ToolbarButton, ProfilesService, AppService } from 'tabby-core'\nimport { WorkspaceEditorService } from '../services/workspaceEditor.service'\nimport { StartupCommandService } from '../services/startupCommand.service'\nimport { SettingsTabComponent } from 'tabby-settings'\nimport { CONFIG_KEY, DISPLAY_NAME, IS_DEV } from '../build-config'\n\nconst ICON_GRID = `<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>`\n\nconst ICON_BOLT = `<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 <polygon points=\"13 2 3 14 12 14 11 22 21 10 12 10 13 2\"/>\n</svg>`\nimport { countPanes } from '../models/workspace.model'\n\n@Injectable()\nexport class WorkspaceToolbarProvider extends ToolbarButtonProvider {\n constructor(\n private workspaceService: WorkspaceEditorService,\n private profilesService: ProfilesService,\n private app: AppService,\n private startupService: StartupCommandService\n ) {\n super()\n // Delay startup tasks to ensure Tabby config is loaded\n setTimeout(() => {\n // Cleanup orphaned profiles from previous plugin versions (one-time migration)\n this.workspaceService.cleanupOrphanedProfiles()\n // Launch workspaces marked for startup\n this.launchStartupWorkspaces()\n }, 500)\n }\n\n private async launchStartupWorkspaces(): Promise<void> {\n const workspaces = this.workspaceService.getWorkspaces()\n const startupWorkspaces = workspaces.filter(w => w.launchOnStartup)\n\n for (const workspace of startupWorkspaces) {\n await this.openWorkspace(workspace.id)\n }\n }\n\n provide(): ToolbarButton[] {\n return [\n {\n icon: IS_DEV ? ICON_BOLT : ICON_GRID,\n title: DISPLAY_NAME,\n weight: 5,\n click: () => this.showWorkspaceSelector()\n }\n ]\n }\n\n private async showWorkspaceSelector(): Promise<void> {\n const workspaces = this.workspaceService.getWorkspaces()\n\n if (workspaces.length === 0) {\n this.openSettings()\n return\n }\n\n const options = workspaces.map((ws) => ({\n name: ws.name,\n description: `${countPanes(ws.root)} panes`,\n icon: ws.icon || 'grid',\n color: ws.color,\n result: ws.id\n }))\n\n // Add option to open settings\n options.push({\n name: 'Manage Workspaces...',\n description: 'Create and edit workspaces',\n icon: 'cog',\n color: undefined,\n result: '__settings__'\n })\n\n const selectedId = await this.app.showSelector('Select Workspace', options)\n\n if (selectedId === '__settings__') {\n this.openSettings()\n } else if (selectedId) {\n this.openWorkspace(selectedId)\n }\n }\n\n private openSettings(): void {\n this.app.openNewTabRaw({ type: SettingsTabComponent, inputs: { activeTab: CONFIG_KEY } })\n }\n\n private async openWorkspace(workspaceId: string): Promise<void> {\n const workspaces = this.workspaceService.getWorkspaces()\n const workspace = workspaces.find((w) => w.id === workspaceId)\n\n if (!workspace) return\n\n // Register startup commands BEFORE opening the workspace\n // Commands will be sent via sendInput() when terminals open\n const commands = this.workspaceService.collectStartupCommands(workspace)\n if (commands.length > 0) {\n this.startupService.registerCommands(commands)\n }\n\n const profile = await this.workspaceService.generateTabbyProfile(workspace)\n this.profilesService.openNewTabForProfile(profile)\n }\n}\n","import { Component, Input, Output, EventEmitter, OnInit, OnChanges, AfterViewInit, SimpleChanges, HostListener, ElementRef, ViewChild } from '@angular/core'\r\nimport {\r\n Workspace,\r\n WorkspacePane,\r\n WorkspaceSplit,\r\n TabbyProfile,\r\n isWorkspaceSplit,\r\n createDefaultPane,\r\n generateUUID,\r\n} from '../models/workspace.model'\r\nimport { WorkspaceEditorService } from '../services/workspaceEditor.service'\r\n\r\n@Component({\r\n selector: 'workspace-editor',\r\n template: require('./workspaceEditor.component.pug'),\r\n styles: [require('./workspaceEditor.component.scss')],\r\n})\r\nexport class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewInit {\r\n @Input() workspace!: Workspace\r\n @Input() autoFocus = false\r\n @Input() hasUnsavedChanges = false\r\n @Output() save = new EventEmitter<Workspace>()\r\n @Output() cancel = new EventEmitter<void>()\r\n\r\n @ViewChild('nameInput') nameInput!: ElementRef<HTMLInputElement>\r\n\r\n selectedPaneId: string | null = null\r\n editingPane: WorkspacePane | null = null\r\n showPaneEditor = false\r\n profiles: TabbyProfile[] = []\r\n availableIcons = [\r\n 'columns', 'terminal', 'code', 'folder', 'home', 'briefcase',\r\n 'cog', 'database', 'server', 'cloud', 'rocket', 'flask',\r\n 'bug', 'wrench', 'cube', 'layer-group', 'sitemap', 'project-diagram'\r\n ]\r\n iconDropdownOpen = false\r\n\r\n constructor(\r\n private workspaceService: WorkspaceEditorService,\r\n private elementRef: ElementRef\r\n ) {}\r\n\r\n @HostListener('document:click', ['$event'])\r\n onDocumentClick(event: MouseEvent): void {\r\n const iconPicker = this.elementRef.nativeElement.querySelector('.icon-picker')\r\n if (iconPicker && !iconPicker.contains(event.target as Node)) {\r\n this.iconDropdownOpen = false\r\n }\r\n }\r\n\r\n toggleIconDropdown(): void {\r\n this.iconDropdownOpen = !this.iconDropdownOpen\r\n }\r\n\r\n selectIcon(icon: string): void {\r\n this.workspace.icon = icon\r\n this.iconDropdownOpen = false\r\n }\r\n\r\n async ngOnInit(): Promise<void> {\r\n this.profiles = await this.workspaceService.getAvailableProfiles()\r\n this.initializeWorkspace()\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n if (this.autoFocus) {\r\n this.focusNameInput()\r\n }\r\n }\r\n\r\n private focusNameInput(): void {\r\n requestAnimationFrame(() => {\r\n setTimeout(() => {\r\n if (this.nameInput?.nativeElement) {\r\n this.nameInput.nativeElement.focus()\r\n this.nameInput.nativeElement.select()\r\n }\r\n }, 0)\r\n })\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if (changes['workspace'] && !changes['workspace'].firstChange) {\r\n // Reset component state when workspace input changes\r\n this.selectedPaneId = null\r\n this.editingPane = null\r\n this.showPaneEditor = false\r\n this.iconDropdownOpen = false\r\n this.initializeWorkspace()\r\n }\r\n\r\n // Handle autoFocus change\r\n if (changes['autoFocus']?.currentValue) {\r\n this.focusNameInput()\r\n }\r\n }\r\n\r\n private initializeWorkspace(): void {\r\n if (!this.workspace.root) {\r\n this.workspace.root = {\r\n orientation: 'horizontal',\r\n ratios: [0.5, 0.5],\r\n children: [createDefaultPane(), createDefaultPane()],\r\n }\r\n }\r\n }\r\n\r\n onSave(): void {\r\n if (!this.workspace.name?.trim()) {\r\n return\r\n }\r\n this.save.emit(this.workspace)\r\n }\r\n\r\n onCancel(): void {\r\n this.cancel.emit()\r\n }\r\n\r\n selectPane(pane: WorkspacePane): void {\r\n this.selectedPaneId = pane.id\r\n }\r\n\r\n deselectPane(): void {\r\n this.selectedPaneId = null\r\n }\r\n\r\n onPreviewBackgroundClick(): void {\r\n this.deselectPane()\r\n }\r\n\r\n editPane(pane: WorkspacePane): void {\r\n this.editingPane = pane\r\n this.showPaneEditor = true\r\n }\r\n\r\n editSelectedPane(): void {\r\n if (!this.selectedPaneId) return\r\n const pane = this.findPaneById(this.selectedPaneId)\r\n if (pane) this.editPane(pane)\r\n }\r\n\r\n closePaneEditor(): void {\r\n this.showPaneEditor = false\r\n this.editingPane = null\r\n }\r\n\r\n onPaneSave(pane: WorkspacePane): void {\r\n this.updatePaneInTree(this.workspace.root, pane)\r\n this.closePaneEditor()\r\n }\r\n\r\n // Helper functions\r\n private findPaneById(id: string): WorkspacePane | null {\r\n return this.findPaneInNode(this.workspace.root, id)\r\n }\r\n\r\n private findPaneInNode(node: WorkspaceSplit, id: string): WorkspacePane | null {\r\n for (const child of node.children) {\r\n if (isWorkspaceSplit(child)) {\r\n const found = this.findPaneInNode(child, id)\r\n if (found) return found\r\n } else if (child.id === id) {\r\n return child\r\n }\r\n }\r\n return null\r\n }\r\n\r\n canRemovePane(): boolean {\r\n return this.countPanes(this.workspace.root) > 1\r\n }\r\n\r\n private countPanes(node: WorkspaceSplit): number {\r\n return node.children.reduce((count, child) => {\r\n return count + (isWorkspaceSplit(child) ? this.countPanes(child) : 1)\r\n }, 0)\r\n }\r\n\r\n private updatePaneInTree(node: WorkspaceSplit, updatedPane: WorkspacePane): boolean {\r\n for (let i = 0; i < node.children.length; i++) {\r\n const child = node.children[i]\r\n if (isWorkspaceSplit(child)) {\r\n if (this.updatePaneInTree(child, updatedPane)) {\r\n return true\r\n }\r\n } else if (child.id === updatedPane.id) {\r\n node.children[i] = updatedPane\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n splitPane(pane: WorkspacePane, orientation: 'horizontal' | 'vertical'): void {\r\n this.splitPaneInTree(this.workspace.root, pane, orientation)\r\n }\r\n\r\n splitSelectedPane(orientation: 'horizontal' | 'vertical'): void {\r\n if (!this.selectedPaneId) return\r\n const pane = this.findPaneById(this.selectedPaneId)\r\n if (pane) this.splitPane(pane, orientation)\r\n }\r\n\r\n private splitPaneInTree(\r\n node: WorkspaceSplit,\r\n targetPane: WorkspacePane,\r\n orientation: 'horizontal' | 'vertical'\r\n ): boolean {\r\n for (let i = 0; i < node.children.length; i++) {\r\n const child = node.children[i]\r\n if (isWorkspaceSplit(child)) {\r\n if (this.splitPaneInTree(child, targetPane, orientation)) {\r\n return true\r\n }\r\n } else if (child.id === targetPane.id) {\r\n const newPane = createDefaultPane()\r\n newPane.profileId = child.profileId // Copy profile from source pane\r\n const newSplit: WorkspaceSplit = {\r\n orientation,\r\n ratios: [0.5, 0.5],\r\n children: [child, newPane],\r\n }\r\n node.children[i] = newSplit\r\n this.recalculateRatios(node)\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n removePane(pane: WorkspacePane): void {\r\n if (this.selectedPaneId === pane.id) {\r\n this.selectedPaneId = null\r\n }\r\n this.removePaneFromTree(this.workspace.root, pane)\r\n }\r\n\r\n removeSelectedPane(): void {\r\n if (!this.selectedPaneId || !this.canRemovePane()) return\r\n const pane = this.findPaneById(this.selectedPaneId)\r\n if (pane) this.removePane(pane)\r\n }\r\n\r\n private removePaneFromTree(node: WorkspaceSplit, targetPane: WorkspacePane): boolean {\r\n for (let i = 0; i < node.children.length; i++) {\r\n const child = node.children[i]\r\n if (isWorkspaceSplit(child)) {\r\n // Check if the pane is directly in this split\r\n const paneIndex = child.children.findIndex(\r\n (c) => !isWorkspaceSplit(c) && (c as WorkspacePane).id === targetPane.id\r\n )\r\n if (paneIndex !== -1 && child.children.length > 1) {\r\n child.children.splice(paneIndex, 1)\r\n this.recalculateRatios(child)\r\n // If only one child remains, flatten\r\n if (child.children.length === 1) {\r\n node.children[i] = child.children[0]\r\n }\r\n return true\r\n }\r\n if (this.removePaneFromTree(child, targetPane)) {\r\n return true\r\n }\r\n } else if (child.id === targetPane.id) {\r\n if (node.children.length > 1) {\r\n node.children.splice(i, 1)\r\n this.recalculateRatios(node)\r\n return true\r\n }\r\n }\r\n }\r\n return false\r\n }\r\n\r\n private recalculateRatios(split: WorkspaceSplit): void {\r\n const count = split.children.length\r\n split.ratios = split.children.map(() => 1 / count)\r\n }\r\n\r\n setOrientation(orientation: 'horizontal' | 'vertical'): void {\r\n this.workspace.root.orientation = orientation\r\n }\r\n\r\n updateRatio(index: number, value: number): void {\r\n const ratios = [...this.workspace.root.ratios]\r\n const diff = value - ratios[index]\r\n\r\n if (index < ratios.length - 1) {\r\n ratios[index] = value\r\n ratios[index + 1] -= diff\r\n } else {\r\n ratios[index] = value\r\n ratios[index - 1] -= diff\r\n }\r\n\r\n // Clamp values\r\n ratios.forEach((r, i) => {\r\n ratios[i] = Math.max(0.1, Math.min(0.9, r))\r\n })\r\n\r\n this.workspace.root.ratios = ratios\r\n }\r\n\r\n // Add pane operations\r\n addPane(direction: 'left' | 'right' | 'top' | 'bottom'): void {\r\n if (!this.selectedPaneId) return\r\n const pane = this.findPaneById(this.selectedPaneId)\r\n if (!pane) return\r\n this.addPaneInTree(this.workspace.root, pane, direction, null)\r\n }\r\n\r\n addPaneFromEvent(pane: WorkspacePane, direction: 'left' | 'right' | 'top' | 'bottom'): void {\r\n this.addPaneInTree(this.workspace.root, pane, direction, null)\r\n }\r\n\r\n private addPaneInTree(\r\n node: WorkspaceSplit,\r\n targetPane: WorkspacePane,\r\n direction: 'left' | 'right' | 'top' | 'bottom',\r\n parentNode: WorkspaceSplit | null\r\n ): boolean {\r\n const isHorizontalAdd = direction === 'left' || direction === 'right'\r\n const isBefore = direction === 'left' || direction === 'top'\r\n const targetOrientation = isHorizontalAdd ? 'horizontal' : 'vertical'\r\n\r\n for (let i = 0; i < node.children.length; i++) {\r\n const child = node.children[i]\r\n\r\n if (isWorkspaceSplit(child)) {\r\n if (this.addPaneInTree(child, targetPane, direction, node)) return true\r\n } else if (child.id === targetPane.id) {\r\n const newPane = createDefaultPane()\r\n newPane.profileId = child.profileId\r\n\r\n if (node.orientation === targetOrientation) {\r\n // Same orientation: add as sibling\r\n const insertIndex = isBefore ? i : i + 1\r\n node.children.splice(insertIndex, 0, newPane)\r\n this.recalculateRatios(node)\r\n } else {\r\n // Different orientation: wrap entire node in new split\r\n const nodeCopy: WorkspaceSplit = {\r\n orientation: node.orientation,\r\n ratios: [...node.ratios],\r\n children: [...node.children]\r\n }\r\n const wrapper: WorkspaceSplit = {\r\n orientation: targetOrientation,\r\n ratios: [0.5, 0.5],\r\n children: isBefore ? [newPane, nodeCopy] : [nodeCopy, newPane]\r\n }\r\n\r\n if (node === this.workspace.root) {\r\n this.workspace.root = wrapper\r\n } else if (parentNode) {\r\n const nodeIndex = parentNode.children.indexOf(node)\r\n if (nodeIndex !== -1) {\r\n parentNode.children[nodeIndex] = wrapper\r\n }\r\n }\r\n }\r\n return true\r\n }\r\n }\r\n return false\r\n }\r\n\r\n}\r\n","import { Component, Input, Output, EventEmitter, OnInit, HostListener, ElementRef, ViewChild } from '@angular/core'\r\nimport { WorkspacePane, TabbyProfile } from '../models/workspace.model'\r\n\r\n@Component({\r\n selector: 'pane-editor',\r\n template: require('./paneEditor.component.pug'),\r\n styles: [require('./paneEditor.component.scss')],\r\n})\r\nexport class PaneEditorComponent implements OnInit {\r\n @Input() pane!: WorkspacePane\r\n @Input() profiles: TabbyProfile[] = []\r\n @Output() save = new EventEmitter<WorkspacePane>()\r\n @Output() cancel = new EventEmitter<void>()\r\n @ViewChild('modal', { static: true }) modalRef!: ElementRef<HTMLElement>\r\n\r\n editedPane!: WorkspacePane\r\n private pointerDownInsideModal = false\r\n\r\n ngOnInit(): void {\r\n this.editedPane = { ...this.pane }\r\n }\r\n\r\n @HostListener('document:keydown.escape')\r\n onEscapeKey(): void {\r\n this.cancel.emit()\r\n }\r\n\r\n @HostListener('document:pointerdown', ['$event'])\r\n onDocumentPointerDown(event: PointerEvent): void {\r\n this.pointerDownInsideModal = this.modalRef.nativeElement.contains(event.target as Node)\r\n }\r\n\r\n onOverlayClick(event: MouseEvent): void {\r\n if (!this.pointerDownInsideModal && event.target === event.currentTarget) {\r\n this.cancel.emit()\r\n }\r\n }\r\n\r\n onSave(): void {\r\n this.save.emit(this.editedPane)\r\n }\r\n\r\n onCancel(): void {\r\n this.cancel.emit()\r\n }\r\n\r\n getProfileName(profileId: string): string {\r\n const profile = this.profiles.find((p) => p.id === profileId)\r\n return profile?.name ?? 'Unknown'\r\n }\r\n}\r\n","import { Component, Input, Output, EventEmitter } from '@angular/core'\r\nimport {\r\n WorkspaceSplit,\r\n WorkspacePane,\r\n TabbyProfile,\r\n isWorkspaceSplit,\r\n} from '../models/workspace.model'\r\n\r\n@Component({\r\n selector: 'split-preview',\r\n template: require('./splitPreview.component.pug'),\r\n styles: [require('./splitPreview.component.scss')],\r\n})\r\nexport class SplitPreviewComponent {\r\n @Input() split!: WorkspaceSplit\r\n @Input() depth = 0\r\n @Input() selectedPaneId: string | null = null\r\n @Input() profiles: TabbyProfile[] = []\r\n @Output() paneSelect = new EventEmitter<WorkspacePane>()\r\n @Output() paneEdit = new EventEmitter<WorkspacePane>()\r\n @Output() splitHorizontal = new EventEmitter<WorkspacePane>()\r\n @Output() splitVertical = new EventEmitter<WorkspacePane>()\r\n @Output() removePane = new EventEmitter<WorkspacePane>()\r\n @Output() addLeft = new EventEmitter<WorkspacePane>()\r\n @Output() addRight = new EventEmitter<WorkspacePane>()\r\n @Output() addTop = new EventEmitter<WorkspacePane>()\r\n @Output() addBottom = new EventEmitter<WorkspacePane>()\r\n\r\n contextMenuPane: WorkspacePane | null = null\r\n contextMenuPosition = { x: 0, y: 0 }\r\n\r\n isPane(child: WorkspacePane | WorkspaceSplit): boolean {\r\n return !isWorkspaceSplit(child)\r\n }\r\n\r\n isSplit(child: WorkspacePane | WorkspaceSplit): boolean {\r\n return isWorkspaceSplit(child)\r\n }\r\n\r\n asSplit(child: WorkspacePane | WorkspaceSplit): WorkspaceSplit {\r\n return child as WorkspaceSplit\r\n }\r\n\r\n asPane(child: WorkspacePane | WorkspaceSplit): WorkspacePane {\r\n return child as WorkspacePane\r\n }\r\n\r\n getFlexStyle(index: number): string {\r\n return `${this.split.ratios[index] * 100}%`\r\n }\r\n\r\n onPaneClick(pane: WorkspacePane): void {\r\n this.paneSelect.emit(pane)\r\n }\r\n\r\n onEditClick(event: MouseEvent, pane: WorkspacePane): void {\r\n event.stopPropagation()\r\n this.paneEdit.emit(pane)\r\n }\r\n\r\n truncate(text: string, maxLength: number): string {\r\n return text.length > maxLength\r\n ? text.substring(0, maxLength) + '...'\r\n : text\r\n }\r\n\r\n onContextMenu(event: MouseEvent, pane: WorkspacePane): void {\r\n event.preventDefault()\r\n this.contextMenuPane = pane\r\n this.contextMenuPosition = { x: event.clientX, y: event.clientY }\r\n }\r\n\r\n closeContextMenu(): void {\r\n this.contextMenuPane = null\r\n }\r\n\r\n onEdit(): void {\r\n if (this.contextMenuPane) {\r\n this.paneEdit.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onSplitH(): void {\r\n if (this.contextMenuPane) {\r\n this.splitHorizontal.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onSplitV(): void {\r\n if (this.contextMenuPane) {\r\n this.splitVertical.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onAddLeft(): void {\r\n if (this.contextMenuPane) {\r\n this.addLeft.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onAddRight(): void {\r\n if (this.contextMenuPane) {\r\n this.addRight.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onAddTop(): void {\r\n if (this.contextMenuPane) {\r\n this.addTop.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onAddBottom(): void {\r\n if (this.contextMenuPane) {\r\n this.addBottom.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n onRemove(): void {\r\n if (this.contextMenuPane) {\r\n this.removePane.emit(this.contextMenuPane)\r\n this.closeContextMenu()\r\n }\r\n }\r\n\r\n getPaneLabel(pane: WorkspacePane): string {\r\n // Base label is always the profile name\r\n let profileName = ''\r\n if (pane.profileId) {\r\n const profile = this.profiles.find(p => p.id === pane.profileId)\r\n if (profile?.name) profileName = profile.name\r\n }\r\n\r\n if (!profileName) return 'Select profile'\r\n\r\n // Format: \"Title - Profile\" or just \"Profile\"\r\n if (pane.title) {\r\n return `${pane.title} - ${profileName}`\r\n }\r\n return profileName\r\n }\r\n\r\n // Pass-through events from nested splits\r\n onNestedPaneSelect(pane: WorkspacePane): void {\r\n this.paneSelect.emit(pane)\r\n }\r\n\r\n onNestedPaneEdit(pane: WorkspacePane): void {\r\n this.paneEdit.emit(pane)\r\n }\r\n\r\n onNestedSplitH(pane: WorkspacePane): void {\r\n this.splitHorizontal.emit(pane)\r\n }\r\n\r\n onNestedSplitV(pane: WorkspacePane): void {\r\n this.splitVertical.emit(pane)\r\n }\r\n\r\n onNestedAddLeft(pane: WorkspacePane): void {\r\n this.addLeft.emit(pane)\r\n }\r\n\r\n onNestedAddRight(pane: WorkspacePane): void {\r\n this.addRight.emit(pane)\r\n }\r\n\r\n onNestedAddTop(pane: WorkspacePane): void {\r\n this.addTop.emit(pane)\r\n }\r\n\r\n onNestedAddBottom(pane: WorkspacePane): void {\r\n this.addBottom.emit(pane)\r\n }\r\n\r\n onNestedRemove(pane: WorkspacePane): void {\r\n this.removePane.emit(pane)\r\n }\r\n}\r\n","import { NgModule } from '@angular/core'\r\nimport { CommonModule } from '@angular/common'\r\nimport { FormsModule } from '@angular/forms'\r\nimport { ConfigProvider, ToolbarButtonProvider } from 'tabby-core'\r\nimport { SettingsTabProvider } from 'tabby-settings'\r\n\r\nimport { WorkspaceEditorConfigProvider } from './providers/config.provider'\r\nimport { WorkspaceEditorSettingsProvider } from './providers/settings.provider'\r\nimport { WorkspaceToolbarProvider } from './providers/toolbar.provider'\r\nimport { WorkspaceEditorService } from './services/workspaceEditor.service'\r\nimport { StartupCommandService } from './services/startupCommand.service'\r\n\r\nimport { WorkspaceListComponent } from './components/workspaceList.component'\r\nimport { WorkspaceEditorComponent } from './components/workspaceEditor.component'\r\nimport { PaneEditorComponent } from './components/paneEditor.component'\r\nimport { SplitPreviewComponent } from './components/splitPreview.component'\r\n\r\n@NgModule({\r\n imports: [CommonModule, FormsModule],\r\n providers: [\r\n { provide: ConfigProvider, useClass: WorkspaceEditorConfigProvider, multi: true },\r\n { provide: SettingsTabProvider, useClass: WorkspaceEditorSettingsProvider, multi: true },\r\n { provide: ToolbarButtonProvider, useClass: WorkspaceToolbarProvider, multi: true },\r\n WorkspaceEditorService,\r\n StartupCommandService,\r\n ],\r\n declarations: [\r\n WorkspaceListComponent,\r\n WorkspaceEditorComponent,\r\n PaneEditorComponent,\r\n SplitPreviewComponent,\r\n ],\r\n})\r\nexport default class WorkspaceEditorModule {}\r\n\r\nexport {\r\n WorkspaceEditorService,\r\n WorkspaceEditorConfigProvider,\r\n WorkspaceEditorSettingsProvider,\r\n}\r\n"],"names":["root","factory","exports","module","require","e","define","amd","a","i","global","__WEBPACK_EXTERNAL_MODULE__860__","__WEBPACK_EXTERNAL_MODULE__358__","__WEBPACK_EXTERNAL_MODULE__182__","__WEBPACK_EXTERNAL_MODULE__650__","__WEBPACK_EXTERNAL_MODULE__700__","__WEBPACK_EXTERNAL_MODULE__349__","__WEBPACK_EXTERNAL_MODULE__961__","__WEBPACK_EXTERNAL_MODULE__947__","___CSS_LOADER_EXPORT___","push","id","result","__esModule","default","toString","locals","cssWithMappingToString","list","this","map","item","content","needLayer","concat","length","join","modules","media","dedupe","supports","layer","undefined","alreadyImportedModules","k","_k","cssMapping","btoa","base64","unescape","encodeURIComponent","JSON","stringify","data","sourceMapping","req","apply","pug_has_own_property","Object","prototype","hasOwnProperty","pug_classes","val","escaping","Array","isArray","className","classString","padding","escapeEnabled","pug_escape","pug_classes_array","key","call","pug_classes_object","pug_style","out","style","pug_attr","escaped","terse","type","toJSON","indexOf","replace","merge","pug_merge","b","arguments","attrs","valA","valB","classes","attr","obj","pug_match_html","_html","html","regexResult","exec","lastIndex","escape","index","charCodeAt","substring","rethrow","pug_rethrow","err","filename","lineno","str","Error","window","message","context","lines","start","end","encoding","split","Math","max","min","ex","slice","line","curr","path","code","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","n","getter","d","definition","o","defineProperty","enumerable","get","prop","r","Symbol","toStringTag","value","CONFIG_KEY","DISPLAY_NAME","WorkspaceEditorConfigProvider","ConfigProvider","defaults","workspaces","Injectable","StartupCommandService","constructor","app","pendingCommands","Map","subscription","tabOpened$","subscribe","tab","onTabOpened","registerCommands","commands","console","log","cmd","set","paneId","name","title","SplitTabComponent","setTimeout","processChildTabs","BaseTerminalTabComponent","processTerminalTab","splitTab","allTabs","getAllTabs","terminalTab","customTitle","pendingKeys","keys","pending","delete","fullCommand","buildFullCommand","session","output$","pipe","first","switchMap","timer","sendInput","clearProfileArgs","originalTitle","setTitle","command","profile","options","args","ngOnDestroy","unsubscribe","isWorkspaceSplit","node","createDefaultPane","generateUUID","profileId","cwd","startupCommand","createDefaultSplit","orientation","ratios","children","AppService","WORKSPACE_COLORS","WORKSPACE_ICONS","c","random","countPanes","reduce","sum","child","WorkspaceEditorService","config","notifications","profilesService","cachedProfiles","cacheProfiles","getProfiles","getWorkspaces","store","saveWorkspaces","saveConfig","addWorkspace","workspace","info","updateWorkspace","findIndex","w","deleteWorkspace","workspaceId","find","filtered","filter","getAvailableProfiles","p","startsWith","cleanupOrphanedProfiles","profiles","prefix","save","generateTabbyProfile","safeName","sanitizeForProfileId","group","icon","color","isBuiltin","recoveryToken","generateRecoveryToken","generatePaneToken","pane","baseProfile","getProfileById","savedState","restoreFromPTYID","env","width","height","pauseAfterExit","runAsAdministrator","disableDynamicTitle","weight","isTemplate","terminalColorScheme","behaviorOnSessionEnd","tabTitle","tabCustomTitle","duplicateWorkspace","clone","parse","launchOnStartup","regenerateIds","toLowerCase","isLocalType","collectStartupCommands","collectCommandsFromNode","error","providedIn","ConfigService","NotificationsService","ProfilesService","WorkspaceListComponent","workspaceService","startupService","cdr","elementRef","zone","selectedWorkspace","editingWorkspace","isCreatingNew","openingWorkspaceId","configSubscription","ngOnInit","loadWorkspaces","autoSelectFirst","changed$","ngAfterViewInit","parent","nativeElement","closest","maxWidth","selectWorkspace","isSelected","detectChanges","createWorkspace","defaultProfileId","floor","createDefaultWorkspace","setProfileForAllPanes","forEach","editWorkspace","event","stopPropagation","duplicated","confirm","currentIndex","nextIndex","onEditorSave","saved","onEditorCancel","getPaneCount","getOrientationLabel","hasUnsavedChanges","openWorkspace","run","openNewTabForProfile","Component","selector","template","styles","ChangeDetectorRef","ElementRef","NgZone","WorkspaceEditorSettingsProvider","SettingsTabProvider","getComponentType","WorkspaceToolbarProvider","ToolbarButtonProvider","super","launchStartupWorkspaces","startupWorkspaces","provide","click","showWorkspaceSelector","openSettings","ws","description","selectedId","showSelector","openNewTabRaw","SettingsTabComponent","inputs","activeTab","WorkspaceEditorComponent","autoFocus","EventEmitter","cancel","selectedPaneId","editingPane","showPaneEditor","availableIcons","iconDropdownOpen","onDocumentClick","iconPicker","querySelector","contains","target","toggleIconDropdown","selectIcon","initializeWorkspace","focusNameInput","requestAnimationFrame","nameInput","focus","select","ngOnChanges","changes","firstChange","currentValue","onSave","trim","emit","onCancel","selectPane","deselectPane","onPreviewBackgroundClick","editPane","editSelectedPane","findPaneById","closePaneEditor","onPaneSave","updatePaneInTree","findPaneInNode","found","canRemovePane","count","updatedPane","splitPane","splitPaneInTree","splitSelectedPane","targetPane","newPane","newSplit","recalculateRatios","removePane","removePaneFromTree","removeSelectedPane","paneIndex","splice","setOrientation","updateRatio","diff","addPane","direction","addPaneInTree","addPaneFromEvent","parentNode","isBefore","targetOrientation","insertIndex","nodeCopy","wrapper","nodeIndex","Input","Output","ViewChild","HostListener","MouseEvent","PaneEditorComponent","pointerDownInsideModal","editedPane","onEscapeKey","onDocumentPointerDown","modalRef","onOverlayClick","currentTarget","getProfileName","static","PointerEvent","SplitPreviewComponent","depth","paneSelect","paneEdit","splitHorizontal","splitVertical","addLeft","addRight","addTop","addBottom","contextMenuPane","contextMenuPosition","x","y","isPane","isSplit","asSplit","asPane","getFlexStyle","onPaneClick","onEditClick","truncate","text","maxLength","onContextMenu","preventDefault","clientX","clientY","closeContextMenu","onEdit","onSplitH","onSplitV","onAddLeft","onAddRight","onAddTop","onAddBottom","onRemove","getPaneLabel","profileName","onNestedPaneSelect","onNestedPaneEdit","onNestedSplitH","onNestedSplitV","onNestedAddLeft","onNestedAddRight","onNestedAddTop","onNestedAddBottom","onNestedRemove","WorkspaceEditorModule","NgModule","imports","CommonModule","FormsModule","providers","useClass","multi","declarations"],"ignoreList":[],"sourceRoot":""}