From 2ec00234d4e3b8b077131ca4b8beaec7c89b4e5c Mon Sep 17 00:00:00 2001 From: halilc4 Date: Wed, 14 Jan 2026 10:04:05 +0100 Subject: [PATCH 01/18] Add TODO items for startup detection and tab titles Co-Authored-By: Claude Opus 4.5 --- TODO.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/TODO.md b/TODO.md index 4185312..e5379de 100644 --- a/TODO.md +++ b/TODO.md @@ -17,6 +17,8 @@ ### Bugs - [~] Resize panes in Tabby reverts to original values (ratio problem) - WATCH: happens only on one workspace - [ ] Layout preview responsive - nested splits don't adapt well to smaller sizes +- [ ] Launch on startup - Tabby remembers open tabs, check if we can detect if workspace is already open; if not, kill the feature +- [ ] Tab titles are a mess - keep only workspace name or default to Tabby behavior (verify no caching/lookup by tab name) ### Other - [ ] Update screenshots in README From 82fbc884b75c126f98e767ac6ebcc73a8376556a Mon Sep 17 00:00:00 2001 From: halilc4 Date: Wed, 14 Jan 2026 10:35:09 +0100 Subject: [PATCH 02/18] Refactor SCSS to modular DRY architecture - Add shared styles: _variables.scss, _mixins.scss, _index.scss - Centralize spacing scale ($spacing-xs to $spacing-2xl) - Centralize border radius ($radius-sm to $radius-xl) - Extract color variables ($color-success, $color-warning, $color-danger) - Create reusable mixins: flex-row, flex-center, form-input, interactive-card, toolbar-btn, btn-success, full-overlay, etc. - Migrate all 4 component SCSS files to use shared styles - No visual changes - pure refactor for maintainability Co-Authored-By: Claude Opus 4.5 --- src/components/paneEditor.component.scss | 52 ++---- src/components/splitPreview.component.scss | 77 ++++----- src/components/workspaceEditor.component.scss | 138 +++++----------- src/components/workspaceList.component.scss | 60 ++----- src/styles/_index.scss | 3 + src/styles/_mixins.scss | 154 ++++++++++++++++++ src/styles/_variables.scss | 48 ++++++ 7 files changed, 314 insertions(+), 218 deletions(-) create mode 100644 src/styles/_index.scss create mode 100644 src/styles/_mixins.scss create mode 100644 src/styles/_variables.scss diff --git a/src/components/paneEditor.component.scss b/src/components/paneEditor.component.scss index 43be40d..ded5310 100644 --- a/src/components/paneEditor.component.scss +++ b/src/components/paneEditor.component.scss @@ -1,33 +1,26 @@ +@import '../styles/index'; + .pane-editor-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - background: rgba(0, 0, 0, 0.7); - display: flex; - align-items: center; - justify-content: center; - z-index: 1100; + @include full-overlay($z-modal-overlay); + @include flex-center; + background: $overlay-bg; } .pane-editor-modal { background: var(--theme-bg); - border-radius: 12px; + border-radius: $radius-xl; width: 90%; max-width: 500px; max-height: 80vh; overflow: hidden; display: flex; flex-direction: column; - box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4); + box-shadow: $shadow-modal; } .modal-header { - display: flex; - justify-content: space-between; - align-items: center; - padding: 16px 20px; + @include flex-between; + padding: $spacing-xl $spacing-2xl; border-bottom: 1px solid var(--theme-border); h4 { @@ -38,7 +31,7 @@ .close-btn { font-size: 1.15rem; color: var(--theme-fg-more); - padding: 4px 8px; + padding: $spacing-sm $spacing-md; &:hover { color: var(--theme-fg); @@ -47,13 +40,13 @@ } .modal-body { - padding: 20px; + padding: $spacing-2xl; overflow-y: auto; flex: 1; } .form-group { - margin-bottom: 16px; + margin-bottom: $spacing-xl; &:last-child { margin-bottom: 0; @@ -69,17 +62,7 @@ .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: 0.95rem; - - &:focus { - outline: none; - border-color: var(--theme-primary); - } + @include form-input(var(--theme-bg-more)); } select.form-control { @@ -87,8 +70,7 @@ select.form-control { } .input-with-button { - display: flex; - gap: 8px; + @include flex-row($spacing-md); input { flex: 1; @@ -97,7 +79,7 @@ select.form-control { .help-text { display: block; - margin-top: 4px; + margin-top: $spacing-sm; font-size: 0.8rem; color: var(--theme-fg-more); opacity: 0.8; @@ -106,7 +88,7 @@ select.form-control { .modal-footer { display: flex; justify-content: flex-end; - gap: 12px; - padding: 16px 20px; + gap: $spacing-lg; + padding: $spacing-xl $spacing-2xl; border-top: 1px solid var(--theme-border); } diff --git a/src/components/splitPreview.component.scss b/src/components/splitPreview.component.scss index b10bc4e..bee89b3 100644 --- a/src/components/splitPreview.component.scss +++ b/src/components/splitPreview.component.scss @@ -1,9 +1,11 @@ +@import '../styles/index'; + .split-preview { display: flex; width: 100%; height: 140px; - gap: 4px; - border-radius: 6px; + gap: $spacing-sm; + border-radius: $radius-md; overflow: hidden; background: var(--theme-bg); border: 1px solid var(--theme-border); @@ -20,20 +22,18 @@ height: auto; border: 1px dashed var(--theme-fg-more); background: rgba(255, 255, 255, 0.02); - padding: 4px; - border-radius: 4px; + padding: $spacing-sm; + border-radius: $radius-sm; } } .preview-pane { - display: flex; - align-items: center; - justify-content: center; + @include flex-center; background: var(--theme-bg-more); - border-radius: 4px; + border-radius: $radius-sm; border: 2px solid transparent; cursor: pointer; - transition: all 0.15s; + transition: all $transition-fast; position: relative; min-height: 50px; @@ -49,7 +49,7 @@ .pane-content { text-align: center; - padding: 8px; + padding: $spacing-md; color: var(--theme-fg); max-width: 100%; overflow: hidden; @@ -59,22 +59,18 @@ .pane-profile { font-size: 0.8rem; font-weight: 500; - margin-bottom: 2px; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; + margin-bottom: $spacing-xs; + @include text-ellipsis; } .pane-details { font-size: 0.7rem; opacity: 0.7; - margin-top: 4px; + margin-top: $spacing-sm; .pane-detail { - display: flex; - align-items: center; - justify-content: center; - gap: 4px; + @include flex-center; + gap: $spacing-sm; i { width: 12px; @@ -83,9 +79,7 @@ } span { - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; + @include text-ellipsis; max-width: 100px; } } @@ -93,16 +87,16 @@ .pane-edit-btn { position: absolute; - top: 4px; - right: 4px; - padding: 4px 6px; + top: $spacing-sm; + right: $spacing-sm; + padding: $spacing-sm 6px; background: var(--theme-bg); border: 1px solid var(--theme-border); - border-radius: 4px; + border-radius: $radius-sm; color: var(--theme-fg); cursor: pointer; font-size: 0.7rem; - transition: all 0.15s; + transition: all $transition-fast; opacity: 0; &:hover { @@ -118,48 +112,41 @@ // Context menu .context-menu-overlay { - position: fixed; - top: 0; - left: 0; - right: 0; - bottom: 0; - z-index: 1200; + @include full-overlay($z-context-menu-overlay); } .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, 0.3); + border-radius: $radius-lg; + box-shadow: $shadow-context-menu; min-width: 160px; - padding: 4px; - z-index: 1201; + padding: $spacing-sm; + z-index: $z-context-menu; } .context-menu-item { - display: flex; - align-items: center; - gap: 10px; + @include flex-row(10px); width: 100%; - padding: 8px 12px; + padding: $spacing-md $spacing-lg; border: none; background: none; color: var(--theme-fg); font-size: 0.9rem; text-align: left; cursor: pointer; - border-radius: 4px; + border-radius: $radius-sm; &:hover { background: var(--theme-bg-more); } &.danger { - color: var(--theme-danger, #ef4444); + color: var(--theme-danger, $color-danger); &:hover { - background: rgba(239, 68, 68, 0.1); + background: rgba($color-danger, 0.1); } } @@ -173,7 +160,7 @@ .context-menu-divider { height: 1px; background: var(--theme-border); - margin: 4px 0; + margin: $spacing-sm 0; } // Nested splits styling diff --git a/src/components/workspaceEditor.component.scss b/src/components/workspaceEditor.component.scss index aa28e2d..413bc97 100644 --- a/src/components/workspaceEditor.component.scss +++ b/src/components/workspaceEditor.component.scss @@ -1,27 +1,25 @@ +@import '../styles/index'; + // Workspace editor (inline) .workspace-editor-inline { background: var(--theme-bg-more); - border-radius: 8px; + border-radius: $radius-lg; border: 1px solid var(--theme-border); - margin-bottom: 16px; + margin-bottom: $spacing-xl; .editor-body { - padding: 16px; + padding: $spacing-xl; } .editor-footer { - display: flex; - justify-content: space-between; - align-items: center; - padding: 10px 16px; + @include flex-between; + padding: 10px $spacing-xl; border-top: 1px solid var(--theme-border); background: var(--theme-bg); - border-radius: 0 0 8px 8px; + border-radius: 0 0 $radius-lg $radius-lg; .startup-checkbox { - display: flex; - align-items: center; - gap: 6px; + @include flex-row(6px); font-size: 0.85rem; color: var(--theme-fg-more); cursor: pointer; @@ -32,24 +30,16 @@ } .editor-actions { - display: flex; - gap: 8px; + @include flex-row($spacing-md); .btn-success { - background: #10b981; - border-color: #10b981; - color: white; - - &:hover { - background: #059669; - border-color: #059669; - } + @include btn-success; } .unsaved-indicator { - color: #f59e0b; + color: $color-warning; font-weight: bold; - margin-left: 2px; + margin-left: $spacing-xs; } } } @@ -57,28 +47,27 @@ // Shared editor content .editor-top-row { - display: flex; + @include flex-row($spacing-lg); align-items: flex-start; - gap: 12px; - margin-bottom: 16px; + margin-bottom: $spacing-xl; } .color-picker { .color-input { width: 40px; height: 40px; - padding: 2px; + padding: $spacing-xs; border: 1px solid var(--theme-border); - border-radius: 6px; + border-radius: $radius-md; cursor: pointer; background: var(--theme-bg); &::-webkit-color-swatch-wrapper { - padding: 2px; + padding: $spacing-xs; } &::-webkit-color-swatch { - border-radius: 4px; + border-radius: $radius-sm; border: none; } } @@ -87,21 +76,11 @@ .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); + @include form-input(var(--theme-bg)); font-size: 1rem; font-weight: 500; - &:focus { - outline: none; - border-color: var(--theme-primary); - } - &::placeholder { - color: var(--theme-fg-more); font-weight: 400; } } @@ -112,15 +91,13 @@ .icon-trigger { width: 40px; height: 40px; - display: flex; - align-items: center; - justify-content: center; + @include flex-center; border: 1px solid var(--theme-border); - border-radius: 6px; + border-radius: $radius-md; background: var(--theme-bg); cursor: pointer; font-size: 1.1rem; - transition: background 0.15s; + transition: background $transition-fast; &:hover { background: var(--theme-bg-more); @@ -131,30 +108,25 @@ 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, 0.15); - z-index: 100; + margin-top: $spacing-sm; + padding: $spacing-md; + @include dropdown-panel; + z-index: $z-dropdown; display: grid; grid-template-columns: repeat(6, 28px); - gap: 4px; + gap: $spacing-sm; } .icon-option { width: 28px; height: 28px; - display: flex; - align-items: center; - justify-content: center; + @include flex-center; border: 1px solid transparent; - border-radius: 4px; + border-radius: $radius-sm; background: transparent; color: var(--theme-fg-more); cursor: pointer; - transition: all 0.15s; + transition: all $transition-fast; font-size: 0.85rem; &:hover { @@ -172,10 +144,8 @@ // Layout section .layout-section { .layout-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 8px; + @include flex-between; + margin-bottom: $spacing-md; } .layout-title { @@ -189,22 +159,18 @@ // Layout toolbar .layout-toolbar { - display: flex; - align-items: center; - gap: 4px; - padding: 8px 0; - margin-bottom: 8px; + @include flex-row($spacing-sm); + padding: $spacing-md 0; + margin-bottom: $spacing-md; .toolbar-group { - display: flex; - align-items: center; - gap: 2px; + @include flex-row($spacing-xs); } .toolbar-label { font-size: 0.75rem; color: var(--theme-fg-more); - margin-right: 4px; + margin-right: $spacing-sm; text-transform: uppercase; letter-spacing: 0.3px; } @@ -217,38 +183,18 @@ width: 1px; height: 20px; background: var(--theme-border); - margin: 0 4px; + margin: 0 $spacing-sm; } .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 0.15s; - font-size: 0.85rem; - - &:hover:not(:disabled) { - background: var(--theme-bg-more-more); - } - - &:disabled { - opacity: 0.4; - cursor: not-allowed; - } - - &.danger { - color: var(--theme-danger, #ef4444); - } + @include toolbar-btn; } } .layout-preview-container { background: var(--theme-bg); - border-radius: 6px; - padding: 8px; + border-radius: $radius-md; + padding: $spacing-md; min-height: 120px; max-height: 180px; } diff --git a/src/components/workspaceList.component.scss b/src/components/workspaceList.component.scss index 612a5c1..b4f0268 100644 --- a/src/components/workspaceList.component.scss +++ b/src/components/workspaceList.component.scss @@ -1,12 +1,12 @@ +@import '../styles/index'; + .workspace-list-container { - padding: 20px; + padding: $spacing-2xl; } .workspace-list-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 20px; + @include flex-between; + margin-bottom: $spacing-2xl; h3 { margin: 0; @@ -15,38 +15,22 @@ } .workspace-list { - display: flex; - flex-direction: column; - gap: 12px; + @include flex-col($spacing-lg); } .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 0.2s, border-color 0.2s; - cursor: pointer; - - &:hover { - background: var(--theme-bg-more-more); - } + @include flex-between; + @include interactive-card($radius-lg); + padding: $spacing-xl; &.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; + @include flex-row($spacing-xl); } .workspace-icon { @@ -56,9 +40,7 @@ } .workspace-details { - display: flex; - flex-direction: column; - gap: 4px; + @include flex-col($spacing-sm); } .workspace-name { @@ -76,29 +58,23 @@ .badge { font-size: 0.75rem; - padding: 2px 6px; - border-radius: 4px; + padding: $spacing-xs 6px; + border-radius: $radius-sm; background: var(--theme-primary); color: white; } } .workspace-actions { - display: flex; - gap: 4px; + @include flex-row($spacing-sm); .btn-link { - padding: 8px; + padding: $spacing-md; color: var(--theme-fg-more); - opacity: 0.7; - transition: opacity 0.2s, color 0.2s; - - &:hover { - opacity: 1; - } + @include icon-btn-opacity; &.open-btn:hover { - color: var(--theme-success, #10b981); + color: var(--theme-success, $color-success); } &.text-danger:hover { @@ -113,6 +89,6 @@ color: var(--theme-fg-more); p { - margin: 8px 0; + margin: $spacing-md 0; } } diff --git a/src/styles/_index.scss b/src/styles/_index.scss new file mode 100644 index 0000000..200197d --- /dev/null +++ b/src/styles/_index.scss @@ -0,0 +1,3 @@ +// Main entry point for shared styles +@import 'variables'; +@import 'mixins'; diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss new file mode 100644 index 0000000..35c9aa7 --- /dev/null +++ b/src/styles/_mixins.scss @@ -0,0 +1,154 @@ +@import 'variables'; + +// ====================== +// LAYOUT MIXINS +// ====================== + +@mixin flex-row($gap: $spacing-md) { + display: flex; + align-items: center; + gap: $gap; +} + +@mixin flex-col($gap: $spacing-md) { + display: flex; + flex-direction: column; + gap: $gap; +} + +@mixin flex-between { + display: flex; + justify-content: space-between; + align-items: center; +} + +@mixin flex-center { + display: flex; + align-items: center; + justify-content: center; +} + +// ====================== +// FORM INPUT MIXIN +// ====================== + +@mixin form-input($bg: var(--theme-bg)) { + padding: 10px 12px; + border-radius: $radius-md; + border: 1px solid var(--theme-border); + background: $bg; + color: var(--theme-fg); + font-size: 0.95rem; + + &:focus { + outline: none; + border-color: var(--theme-primary); + } + + &::placeholder { + color: var(--theme-fg-more); + } +} + +// ====================== +// INTERACTIVE CARD MIXIN +// ====================== + +@mixin interactive-card($radius: $radius-lg) { + background: var(--theme-bg-more); + border-radius: $radius; + border: 1px solid var(--theme-border); + cursor: pointer; + transition: background $transition-normal, border-color $transition-normal; + + &:hover { + background: var(--theme-bg-more-more); + } + + &.selected { + border-color: var(--theme-primary); + background: var(--theme-bg-more-more); + } +} + +// ====================== +// BUTTON MIXINS +// ====================== + +@mixin toolbar-btn { + padding: $spacing-sm $spacing-md; + background: var(--theme-bg); + border: 1px solid var(--theme-border); + border-radius: $radius-sm; + color: var(--theme-fg); + cursor: pointer; + transition: all $transition-fast; + font-size: 0.85rem; + + &:hover:not(:disabled) { + background: var(--theme-bg-more-more); + } + + &:disabled { + opacity: 0.4; + cursor: not-allowed; + } + + &.danger { + color: var(--theme-danger, $color-danger); + } +} + +@mixin icon-btn-opacity { + opacity: 0.7; + transition: opacity $transition-normal, color $transition-normal; + + &:hover { + opacity: 1; + } +} + +@mixin btn-success { + background: $color-success; + border-color: $color-success; + color: white; + + &:hover { + background: $color-success-hover; + border-color: $color-success-hover; + } +} + +// ====================== +// OVERLAY/MODAL MIXINS +// ====================== + +@mixin full-overlay($z-index: $z-modal-overlay) { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: $z-index; +} + +// ====================== +// TEXT UTILITIES +// ====================== + +@mixin text-ellipsis { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +// ====================== +// DROPDOWN/POPUP +// ====================== + +@mixin dropdown-panel { + background: var(--theme-bg-more); + border: 1px solid var(--theme-border); + border-radius: $radius-md; + box-shadow: $shadow-dropdown; +} diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss new file mode 100644 index 0000000..1ac7fec --- /dev/null +++ b/src/styles/_variables.scss @@ -0,0 +1,48 @@ +// ====================== +// SPACING SCALE +// ====================== +$spacing-xs: 2px; // toolbar group gap, tiny margins +$spacing-sm: 4px; // gaps, small padding +$spacing-md: 8px; // default gaps, button padding +$spacing-lg: 12px; // section gaps, form spacing +$spacing-xl: 16px; // container padding, large gaps +$spacing-2xl: 20px; // modal padding, section margins + +// ====================== +// BORDER RADIUS SCALE +// ====================== +$radius-sm: 4px; // buttons, small elements +$radius-md: 6px; // inputs, dropdowns +$radius-lg: 8px; // cards, containers +$radius-xl: 12px; // modals + +// ====================== +// CUSTOM COLORS +// ====================== +// These extend Tabby's --theme-* variables +$color-success: #10b981; +$color-success-hover: #059669; +$color-warning: #f59e0b; +$color-danger: #ef4444; + +// ====================== +// SHADOWS +// ====================== +$shadow-dropdown: 0 4px 12px rgba(0, 0, 0, 0.15); +$shadow-context-menu: 0 8px 24px rgba(0, 0, 0, 0.3); +$shadow-modal: 0 20px 60px rgba(0, 0, 0, 0.4); +$overlay-bg: rgba(0, 0, 0, 0.7); + +// ====================== +// Z-INDEX SCALE +// ====================== +$z-dropdown: 100; +$z-modal-overlay: 1100; +$z-context-menu-overlay: 1200; +$z-context-menu: 1201; + +// ====================== +// TRANSITIONS +// ====================== +$transition-fast: 0.15s; +$transition-normal: 0.2s; From 6b708aee894c94c1044f4f4891ed595eea5f7c87 Mon Sep 17 00:00:00 2001 From: halilc4 Date: Wed, 14 Jan 2026 10:45:03 +0100 Subject: [PATCH 03/18] Add design system documentation - Create docs/DESIGN.md with SCSS architecture overview - Update CLAUDE.md with styles section and structure Co-Authored-By: Claude Opus 4.5 --- CLAUDE.md | 13 ++++++++++++ docs/DESIGN.md | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 docs/DESIGN.md diff --git a/CLAUDE.md b/CLAUDE.md index 61189a0..2f1ae7c 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -44,6 +44,9 @@ src/ │ ├── config.provider.ts │ ├── settings.provider.ts │ └── toolbar.provider.ts +├── styles/ # Shared SCSS (modular DRY) +│ ├── _variables.scss # Spacing, radius, colors, z-index +│ └── _mixins.scss # Reusable patterns └── components/ # Angular components (.ts, .pug, .scss) ├── workspaceList # Main settings UI ├── workspaceEditor # Single workspace editor @@ -51,6 +54,16 @@ src/ └── splitPreview # Visual split preview ``` +## Styles + +Modular DRY SCSS architecture. All components import `@import '../styles/index'`. + +- **Variables**: `$spacing-*`, `$radius-*`, `$color-*`, `$z-*`, `$transition-*` +- **Mixins**: `flex-row`, `form-input`, `interactive-card`, `toolbar-btn`, `btn-success`, etc. +- **Theming**: Uses Tabby's `--theme-*` CSS variables + +See `docs/DESIGN.md` for details. + ## Build ```bash diff --git a/docs/DESIGN.md b/docs/DESIGN.md new file mode 100644 index 0000000..c6a537f --- /dev/null +++ b/docs/DESIGN.md @@ -0,0 +1,57 @@ +# Design System + +TabbySpaces uses a modular DRY SCSS architecture. + +## Structure + +``` +src/styles/ +├── _index.scss # Entry point (imports all) +├── _variables.scss # Spacing, radius, colors, z-index, transitions +└── _mixins.scss # Reusable patterns (flex, inputs, buttons, overlays) +``` + +## Usage + +All component SCSS files import shared styles: + +```scss +@import '../styles/index'; + +.my-component { + padding: $spacing-md; + border-radius: $radius-lg; + @include flex-row($spacing-sm); +} +``` + +## Variables + +@src/styles/_variables.scss + +## Mixins + +Key mixins available: + +| Mixin | Purpose | +|-------|---------| +| `flex-row($gap)` | Horizontal flex with gap | +| `flex-col($gap)` | Vertical flex with gap | +| `flex-center` | Center content | +| `flex-between` | Space between | +| `form-input($bg)` | Styled input field | +| `interactive-card($radius)` | Clickable card with hover/selected states | +| `toolbar-btn` | Small toolbar button | +| `btn-success` | Green success button | +| `icon-btn-opacity` | Icon with hover opacity | +| `full-overlay($z)` | Fixed fullscreen overlay | +| `dropdown-panel` | Dropdown with border/shadow | +| `text-ellipsis` | Truncate text with ellipsis | + +## Theming + +Plugin uses Tabby's CSS custom properties (`--theme-*`) for automatic theme support: +- `--theme-bg`, `--theme-bg-more`, `--theme-bg-more-more` +- `--theme-fg`, `--theme-fg-more` +- `--theme-border`, `--theme-primary` +- `--theme-success`, `--theme-danger` From ec5abeb8454d9017c1a592755e6832f27b0bcc61 Mon Sep 17 00:00:00 2001 From: halilc4 Date: Wed, 14 Jan 2026 16:40:42 +0100 Subject: [PATCH 04/18] Refine UI design and add mockups - Update pane editor styling - Improve split preview appearance - Refine workspace list and editor components - Extend SCSS variables and mixins - Add session documentation and mockups Co-Authored-By: Claude Opus 4.5 --- docs/SESSION-2026-01-14-S1-DESIGN.md | 134 ++++ mockups/index.html | 162 +++++ mockups/s1-tight-sharp.html | 522 ++++++++++++++ mockups/shared/base.css | 216 ++++++ mockups/v06-tabbed.html | 643 ++++++++++++++++++ src/components/paneEditor.component.pug | 85 +-- src/components/paneEditor.component.scss | 148 ++-- src/components/paneEditor.component.ts | 15 +- src/components/splitPreview.component.scss | 21 +- src/components/workspaceEditor.component.pug | 235 ++++--- src/components/workspaceEditor.component.scss | 378 ++++++---- src/components/workspaceList.component.pug | 79 +-- src/components/workspaceList.component.scss | 135 ++-- src/styles/_mixins.scss | 21 +- src/styles/_variables.scss | 35 +- 15 files changed, 2321 insertions(+), 508 deletions(-) create mode 100644 docs/SESSION-2026-01-14-S1-DESIGN.md create mode 100644 mockups/index.html create mode 100644 mockups/s1-tight-sharp.html create mode 100644 mockups/shared/base.css create mode 100644 mockups/v06-tabbed.html diff --git a/docs/SESSION-2026-01-14-S1-DESIGN.md b/docs/SESSION-2026-01-14-S1-DESIGN.md new file mode 100644 index 0000000..c6dfa80 --- /dev/null +++ b/docs/SESSION-2026-01-14-S1-DESIGN.md @@ -0,0 +1,134 @@ +# Session Summary: S1 Design Implementation +**Date:** 2026-01-14 +**Branch:** design + +## Task +Implement S1 "Tight & Sharp" design from `mockups/s1-tight-sharp.html` into TabbySpaces plugin. + +## Status: COMPLETED (Core Structure) + +### What Was Done + +#### 1. Tab Bar Navigation (workspaceList) +- **Before:** Vertical card list with workspace items +- **After:** Horizontal tab bar with colored icons, close buttons, and "+" button +- **Files:** `workspaceList.component.pug`, `workspaceList.component.scss` + +#### 2. Editor Section Structure (workspaceEditor) +- Added explicit sections with uppercase titles and icons: + - "WORKSPACE SETTINGS" (fa-cog) + - "SPLIT LAYOUT" (fa-columns) +- **Files:** `workspaceEditor.component.pug`, `workspaceEditor.component.scss` + +#### 3. Dropdown Triggers +- Icon picker: Styled as dropdown trigger with chevron +- Color picker: Native input wrapped in dropdown-style trigger with chevron +- **Files:** `workspaceEditor.component.pug`, `workspaceEditor.component.scss` + +#### 4. Inline Pane Editor (MAJOR CHANGE) +- **Before:** Modal overlay with backdrop +- **After:** Inline panel below split preview with: + - Header with title and close button + - 2-column grid form (Profile, CWD, Title, Command) + - Cancel/Apply buttons at bottom +- **Files:** `paneEditor.component.pug`, `paneEditor.component.scss`, `paneEditor.component.ts` + +#### 5. Preview Toolbar +- Reorganized toolbar above split preview: + - Edit (fa-pen) + - Split H (fa-grip-lines-vertical) + - Split V (fa-grip-lines) + - Separator + - Add Left/Right/Up/Down (fa-arrow-*) + - Separator + - Delete (fa-trash, danger style) +- **Files:** `workspaceEditor.component.pug`, `workspaceEditor.component.scss` + +#### 6. Split Preview Container +- Wrapped preview in bordered container with padding +- **Files:** `workspaceEditor.component.scss` + +#### 7. Action Buttons +- Footer with: + - Left: "Launch on startup" checkbox + - Right: Cancel (ghost), Save (success) buttons +- **Files:** `workspaceEditor.component.pug`, `workspaceEditor.component.scss` + +### Files Modified + +``` +src/components/ +├── workspaceList.component.pug # Tab bar structure +├── workspaceList.component.scss # Tab bar styles +├── workspaceEditor.component.pug # Sections, dropdowns, toolbar, inline pane editor +├── workspaceEditor.component.scss # All new styles +├── paneEditor.component.pug # Inline panel (removed modal) +├── paneEditor.component.scss # Inline panel styles +└── paneEditor.component.ts # Removed modal-specific code +``` + +### Previously Done (before this session) +- Variables (`_variables.scss`): S1 spacing, radius, shadows, fonts +- Mixins (`_mixins.scss`): form-input, form-label, interactive-card +- Color/icon picker size reduced to 28x28px + +### Build Status +✅ Build successful (`npm run build:dev`) +- Only Sass deprecation warnings (expected, @import rules) + +## What Might Need Attention + +### 1. Visual Testing Required +- Restart Tabby and visually verify all changes +- Test tab switching, pane selection, split/add operations +- Check inline pane editor save/cancel flow + +### 2. Potential Issues to Watch +- Tab close button might need adjustment (currently uses deleteWorkspace with confirm dialog) +- Icon dropdown positioning (absolute, right-aligned) +- Color picker trigger click area (hidden input overlay) + +### 3. Not Implemented (out of scope for this session) +- Open/Duplicate buttons removed from UI (were on cards, not in tab bar) + - Could add to editor action buttons or tab context menu later +- No mobile/responsive considerations + +## Reference: Mockup vs Implementation + +| Mockup Element | Implementation | +|----------------|----------------| +| `.tab-bar` | ✅ Implemented | +| `.tab` with icon, name, close | ✅ Implemented | +| `.tab-new` (+) | ✅ Implemented | +| `.tab-content` | ✅ Implemented | +| `.editor-section` | ✅ Implemented | +| `.section-title` | ✅ Implemented | +| `.form-row`, `.form-group` | ✅ Implemented | +| `.dropdown-trigger` | ✅ Implemented | +| `.color-trigger` | ✅ Implemented (native input wrapped) | +| `.split-preview-container` | ✅ Implemented | +| `.preview-toolbar` | ✅ Implemented | +| `.preview-btn` | ✅ Implemented | +| `.toolbar-separator` | ✅ Implemented | +| `.pane-details` (inline panel) | ✅ Implemented | +| `.pane-form` (2-col grid) | ✅ Implemented | +| `.action-buttons` | ✅ Implemented | +| `.checkbox-group` | ✅ Implemented | + +## Quick Start for Next Session + +```bash +# Build and test +cd C:\Users\halil\tabbyspaces +npm run build:dev + +# Install if needed +cd "$APPDATA/tabby/plugins" && npm install "C:/Users/halil/tabbyspaces/dist-dev" + +# Restart Tabby to see changes +``` + +## Key Files to Read +- `mockups/s1-tight-sharp.html` - Target design +- `src/styles/_variables.scss` - S1 spacing/radius values +- `src/styles/_mixins.scss` - Reusable patterns diff --git a/mockups/index.html b/mockups/index.html new file mode 100644 index 0000000..546a8af --- /dev/null +++ b/mockups/index.html @@ -0,0 +1,162 @@ + + + + + + TabbySpaces Design Mockups + + + + + + + + diff --git a/mockups/s1-tight-sharp.html b/mockups/s1-tight-sharp.html new file mode 100644 index 0000000..d15d65f --- /dev/null +++ b/mockups/s1-tight-sharp.html @@ -0,0 +1,522 @@ + + + + + + S1: Tight & Sharp - TabbySpaces + + + + + +
+ + + Back to variants + + + + +
+
+ + Development + +
+
+ + DevOps + +
+
+ + Research + +
+
+ +
+
+ +
+
+
+ + Workspace Settings +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+ + Split Layout +
+ +
+
+ + + + + + + + + + +
+ +
+
+
+ +
PowerShell
+
C:\Projects\app
+
+
+ +
PowerShell
+
C:\Projects\app
+
+
+
+ +
PowerShell
+
C:\Projects\api
+
+
+ +
+
+ + Pane 1 Configuration + + + Close + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ +
+
+ + +
+
+ + +
+
+
+
+ +
+

S1: Tight & Sharp

+
    +
  • Spacing: Minimal padding, compact layout
  • +
  • Radius: 2-4px, sharp corners
  • +
  • Borders: Thin 1px, subtle
  • +
  • Shadows: None - completely flat
  • +
  • Vibe: IDE/developer tool aesthetic
  • +
+
+ + diff --git a/mockups/shared/base.css b/mockups/shared/base.css new file mode 100644 index 0000000..4f29175 --- /dev/null +++ b/mockups/shared/base.css @@ -0,0 +1,216 @@ +/* TabbySpaces Design Mockups - Base Styles */ +/* Simulates Tabby's dark theme environment */ + +:root { + /* Tabby-like dark theme variables */ + --theme-bg: #1e1e1e; + --theme-bg-more: #252526; + --theme-bg-more-more: #2d2d30; + --theme-fg: #cccccc; + --theme-fg-more: #ffffff; + --theme-fg-less: #808080; + --theme-border: #3c3c3c; + --theme-primary: #0078d4; + --theme-success: #10b981; + --theme-danger: #ef4444; + --theme-warning: #f59e0b; + + /* Spacing scale */ + --space-xs: 2px; + --space-sm: 4px; + --space-md: 8px; + --space-lg: 12px; + --space-xl: 16px; + --space-2xl: 20px; + --space-3xl: 24px; + --space-4xl: 32px; + + /* Border radius */ + --radius-sm: 4px; + --radius-md: 6px; + --radius-lg: 8px; + --radius-xl: 12px; + + /* Typography */ + --font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; + --font-mono: "Cascadia Code", "Fira Code", Consolas, monospace; + --font-size-xs: 0.75rem; + --font-size-sm: 0.85rem; + --font-size-md: 1rem; + --font-size-lg: 1.25rem; + --font-size-xl: 1.5rem; + + /* Shadows */ + --shadow-sm: 0 1px 2px rgba(0,0,0,0.3); + --shadow-md: 0 4px 6px rgba(0,0,0,0.4); + --shadow-lg: 0 10px 15px rgba(0,0,0,0.5); + + /* Transitions */ + --transition-fast: 150ms ease; + --transition-normal: 250ms ease; +} + +/* Reset */ +*, *::before, *::after { + box-sizing: border-box; + margin: 0; + padding: 0; +} + +body { + font-family: var(--font-family); + font-size: var(--font-size-md); + color: var(--theme-fg); + background: var(--theme-bg); + line-height: 1.5; + min-height: 100vh; +} + +/* Container - simulates Tabby settings panel */ +.mockup-container { + max-width: 876px; + margin: 0 auto; + padding: var(--space-xl); + background: var(--theme-bg); + min-height: 100vh; +} + +/* Typography utilities */ +.text-muted { color: var(--theme-fg-less); } +.text-primary { color: var(--theme-primary); } +.text-success { color: var(--theme-success); } +.text-danger { color: var(--theme-danger); } +.text-sm { font-size: var(--font-size-sm); } +.text-xs { font-size: var(--font-size-xs); } +.text-lg { font-size: var(--font-size-lg); } +.text-xl { font-size: var(--font-size-xl); } +.font-mono { font-family: var(--font-mono); } +.font-bold { font-weight: 600; } + +/* Common form elements */ +input[type="text"], +input[type="color"], +select { + background: var(--theme-bg); + border: 1px solid var(--theme-border); + border-radius: var(--radius-md); + color: var(--theme-fg); + padding: var(--space-md) var(--space-lg); + font-size: var(--font-size-sm); + transition: border-color var(--transition-fast); +} + +input[type="text"]:focus, +select:focus { + outline: none; + border-color: var(--theme-primary); +} + +/* Button base */ +.btn { + display: inline-flex; + align-items: center; + gap: var(--space-md); + padding: var(--space-md) var(--space-lg); + border: none; + border-radius: var(--radius-sm); + font-size: var(--font-size-sm); + cursor: pointer; + transition: all var(--transition-fast); +} + +.btn-primary { + background: var(--theme-primary); + color: white; +} +.btn-primary:hover { + filter: brightness(1.1); +} + +.btn-success { + background: var(--theme-success); + color: white; +} +.btn-success:hover { + filter: brightness(1.1); +} + +.btn-danger { + background: var(--theme-danger); + color: white; +} + +.btn-ghost { + background: transparent; + color: var(--theme-fg); +} +.btn-ghost:hover { + background: var(--theme-bg-more); +} + +/* Card base */ +.card { + background: var(--theme-bg-more); + border: 1px solid var(--theme-border); + border-radius: var(--radius-lg); + padding: var(--space-xl); +} + +.card-hover:hover { + border-color: var(--theme-primary); +} + +/* Flex utilities */ +.flex { display: flex; } +.flex-col { flex-direction: column; } +.items-center { align-items: center; } +.justify-between { justify-content: space-between; } +.gap-xs { gap: var(--space-xs); } +.gap-sm { gap: var(--space-sm); } +.gap-md { gap: var(--space-md); } +.gap-lg { gap: var(--space-lg); } +.gap-xl { gap: var(--space-xl); } + +/* Grid utilities */ +.grid { display: grid; } +.grid-cols-2 { grid-template-columns: repeat(2, 1fr); } + +/* Spacing utilities */ +.p-md { padding: var(--space-md); } +.p-lg { padding: var(--space-lg); } +.p-xl { padding: var(--space-xl); } +.mt-md { margin-top: var(--space-md); } +.mt-lg { margin-top: var(--space-lg); } +.mt-xl { margin-top: var(--space-xl); } +.mb-md { margin-bottom: var(--space-md); } +.mb-lg { margin-bottom: var(--space-lg); } + +/* Design notes (visible as overlay) */ +.design-notes { + position: fixed; + top: var(--space-lg); + right: var(--space-lg); + background: rgba(0,0,0,0.9); + border: 1px solid var(--theme-border); + border-radius: var(--radius-lg); + padding: var(--space-lg); + max-width: 300px; + font-size: var(--font-size-xs); + color: var(--theme-fg-less); + z-index: 1000; +} +.design-notes h4 { + color: var(--theme-primary); + margin-bottom: var(--space-md); +} +.design-notes ul { + list-style: none; + padding-left: 0; +} +.design-notes li { + margin-bottom: var(--space-sm); +} +.design-notes li::before { + content: "• "; + color: var(--theme-primary); +} diff --git a/mockups/v06-tabbed.html b/mockups/v06-tabbed.html new file mode 100644 index 0000000..6b85391 --- /dev/null +++ b/mockups/v06-tabbed.html @@ -0,0 +1,643 @@ + + + + + + V06: Tabbed Interface - TabbySpaces + + + + + +
+ + + + Back to variants + + + + + + +
+
+ + Development + +
+
+ + DevOps + +
+
+ + Research + +
+
+ +
+
+ + +
+ +
+
+ + Workspace Settings +
+ +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + Split Layout +
+ +
+
+ + + + + + + + + + +
+ + +
+ +
+
+ +
PowerShell
+
C:\Projects\app
+
+
+ +
PowerShell
+
C:\Projects\app
+
+
+ +
+ +
PowerShell
+
C:\Projects\api
+
+
+ + +
+
+ + Pane 1 Configuration + + + Close + +
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+
+
+ + +
+
+
+ + +
+
+
+ + +
+
+
+
+ + +
+

Design Notes

+
    +
  • Familiar metaphor: Browser tabs are universally understood - instant learnability
  • +
  • Quick switching: All workspaces visible and one-click accessible
  • +
  • Active tab connected: No border between tab and content creates visual unity
  • +
  • Close on hover: Clean tabs, X appears only when needed
  • +
  • New tab button: Plus icon follows convention for adding items
  • +
  • Full editor below: No scrolling needed, everything visible at once
  • +
  • Inline pane config: Click pane to edit, no modal disruption
  • +
  • Consistent with code editors: VSCode, terminals all use tabs
  • +
+
+ + diff --git a/src/components/paneEditor.component.pug b/src/components/paneEditor.component.pug index 3d8e10d..556e184 100644 --- a/src/components/paneEditor.component.pug +++ b/src/components/paneEditor.component.pug @@ -1,46 +1,49 @@ -.pane-editor-overlay((click)='onOverlayClick($event)') - .pane-editor-modal(#modal) - .modal-header - h4 Edit Pane - button.btn.btn-link.close-btn(type='button', (click)='onCancel()') - i.fas.fa-times +//- Inline pane editor panel (no modal overlay) +.pane-details + .pane-details-header + span.pane-details-title + i.fas.fa-terminal + | Pane Configuration + span.pane-details-close((click)='onCancel()') + i.fas.fa-xmark + | Close - .modal-body - .form-group - label Base Profile - select.form-control([(ngModel)]='editedPane.profileId') - option(value='') -- Select Profile -- - option(*ngFor='let profile of profiles', [value]='profile.id') - | {{ profile.name }} + .pane-form + .form-group + label Profile + select.form-control([(ngModel)]='editedPane.profileId') + option(value='') -- Select Profile -- + option(*ngFor='let profile of profiles', [value]='profile.id') + | {{ profile.name }} - .form-group - label Working Directory - input.form-control( - type='text', - [(ngModel)]='editedPane.cwd', - placeholder='C:\\path\\to\\project' - ) + .form-group + label Working Directory + input.form-control( + type='text', + [(ngModel)]='editedPane.cwd', + placeholder='C:\\path\\to\\project' + ) - .form-group - label Startup Command - input.form-control( - type='text', - [(ngModel)]='editedPane.startupCommand', - placeholder='e.g., npm run dev' - ) - small.help-text - | Command to execute when the pane opens. For Nushell, use commands like: uv run serve + .form-group + label Tab Title + input.form-control( + type='text', + [(ngModel)]='editedPane.title', + placeholder='Optional' + ) - .form-group - label Pane Title (optional) - input.form-control( - type='text', - [(ngModel)]='editedPane.title', - placeholder='Custom tab title' - ) + .form-group + label Startup Command + input.form-control( + type='text', + [(ngModel)]='editedPane.startupCommand', + placeholder='e.g., npm run dev' + ) - .modal-footer - button.btn.btn-secondary(type='button', (click)='onCancel()') Cancel - button.btn.btn-primary(type='button', (click)='onSave()') - i.fas.fa-check - | Apply + .pane-form-actions + button.btn.btn-ghost(type='button', (click)='onCancel()') + i.fas.fa-xmark + | Cancel + button.btn.btn-primary(type='button', (click)='onSave()') + i.fas.fa-check + | Apply diff --git a/src/components/paneEditor.component.scss b/src/components/paneEditor.component.scss index ded5310..a74ab02 100644 --- a/src/components/paneEditor.component.scss +++ b/src/components/paneEditor.component.scss @@ -1,94 +1,120 @@ @import '../styles/index'; -.pane-editor-overlay { - @include full-overlay($z-modal-overlay); - @include flex-center; - background: $overlay-bg; +// Inline pane details panel +.pane-details { + background: var(--theme-bg-more-more); + border-radius: $radius-sm; + padding: $spacing-lg; + padding-top: $spacing-lg; + margin-top: $spacing-xl; + border-left: 2px solid var(--theme-primary); + border-top: 1px solid var(--theme-border); } -.pane-editor-modal { - background: var(--theme-bg); - border-radius: $radius-xl; - width: 90%; - max-width: 500px; - max-height: 80vh; - overflow: hidden; +.pane-details-header { display: flex; - flex-direction: column; - box-shadow: $shadow-modal; + justify-content: space-between; + align-items: center; + margin-bottom: $spacing-lg; } -.modal-header { - @include flex-between; - padding: $spacing-xl $spacing-2xl; - border-bottom: 1px solid var(--theme-border); - - h4 { - margin: 0; - font-size: 1.15rem; - } +.pane-details-title { + font-size: $font-sm; + color: var(--theme-fg); + font-weight: 500; + display: flex; + align-items: center; + gap: $spacing-sm; +} - .close-btn { - font-size: 1.15rem; - color: var(--theme-fg-more); - padding: $spacing-sm $spacing-md; +.pane-details-close { + color: var(--theme-fg-more); + cursor: pointer; + font-size: 11px; + display: flex; + align-items: center; + gap: $spacing-xs; + transition: color $transition-fast; - &:hover { - color: var(--theme-fg); - } + &:hover { + color: var(--theme-fg); } } -.modal-body { - padding: $spacing-2xl; - overflow-y: auto; - flex: 1; +// 2-column grid for pane form +.pane-form { + display: grid; + grid-template-columns: 1fr 1fr; + gap: $spacing-lg; } -.form-group { - margin-bottom: $spacing-xl; - - &:last-child { - margin-bottom: 0; +@media (max-width: 600px) { + .pane-form { + grid-template-columns: 1fr; } +} +.form-group { label { - display: block; - margin-bottom: 6px; - font-size: 0.9rem; - color: var(--theme-fg-more); + @include form-label; } } .form-control { width: 100%; - @include form-input(var(--theme-bg-more)); + @include form-input(var(--theme-bg)); + font-size: $font-sm; + // Override Tabby's global border reset + border: 1px solid var(--theme-border) !important; + + &:focus { + border-color: var(--theme-primary) !important; + } } select.form-control { cursor: pointer; + appearance: auto; // Show dropdown arrow } -.input-with-button { - @include flex-row($spacing-md); +// Action buttons at bottom of panel +.pane-form-actions { + grid-column: 1 / -1; + display: flex; + justify-content: flex-end; + gap: $spacing-md; + margin-top: $spacing-lg; + padding-top: $spacing-lg; + border-top: 1px solid var(--theme-border); - input { - flex: 1; + .btn { + display: inline-flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-sm $spacing-lg; + font-size: $font-sm; + border-radius: $radius-sm; + cursor: pointer; + transition: all $transition-fast; } -} -.help-text { - display: block; - margin-top: $spacing-sm; - font-size: 0.8rem; - color: var(--theme-fg-more); - opacity: 0.8; -} + .btn-ghost { + background: transparent; + border: 1px solid var(--theme-border); + color: var(--theme-fg); -.modal-footer { - display: flex; - justify-content: flex-end; - gap: $spacing-lg; - padding: $spacing-xl $spacing-2xl; - border-top: 1px solid var(--theme-border); + &:hover { + background: var(--theme-bg-more); + } + } + + .btn-primary { + background: var(--theme-primary); + border: 1px solid var(--theme-primary); + color: white; + + &:hover { + filter: brightness(1.1); + } + } } diff --git a/src/components/paneEditor.component.ts b/src/components/paneEditor.component.ts index 3f11c5b..12c8bae 100644 --- a/src/components/paneEditor.component.ts +++ b/src/components/paneEditor.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, Output, EventEmitter, OnInit, HostListener, ElementRef, ViewChild } from '@angular/core' +import { Component, Input, Output, EventEmitter, OnInit, HostListener } from '@angular/core' import { WorkspacePane, TabbyProfile } from '../models/workspace.model' @Component({ @@ -11,10 +11,8 @@ export class PaneEditorComponent implements OnInit { @Input() profiles: TabbyProfile[] = [] @Output() save = new EventEmitter() @Output() cancel = new EventEmitter() - @ViewChild('modal', { static: true }) modalRef!: ElementRef editedPane!: WorkspacePane - private pointerDownInsideModal = false ngOnInit(): void { this.editedPane = { ...this.pane } @@ -25,17 +23,6 @@ export class PaneEditorComponent implements OnInit { this.cancel.emit() } - @HostListener('document:pointerdown', ['$event']) - onDocumentPointerDown(event: PointerEvent): void { - this.pointerDownInsideModal = this.modalRef.nativeElement.contains(event.target as Node) - } - - onOverlayClick(event: MouseEvent): void { - if (!this.pointerDownInsideModal && event.target === event.currentTarget) { - this.cancel.emit() - } - } - onSave(): void { this.save.emit(this.editedPane) } diff --git a/src/components/splitPreview.component.scss b/src/components/splitPreview.component.scss index bee89b3..8fa72b8 100644 --- a/src/components/splitPreview.component.scss +++ b/src/components/splitPreview.component.scss @@ -31,7 +31,7 @@ @include flex-center; background: var(--theme-bg-more); border-radius: $radius-sm; - border: 2px solid transparent; + border: 2px solid var(--theme-border); cursor: pointer; transition: all $transition-fast; position: relative; @@ -39,11 +39,16 @@ &:hover { background: var(--theme-bg-more-more); + border-color: var(--theme-fg-more); } &.selected { border-color: var(--theme-primary); - background: var(--theme-bg-more-more); + background: linear-gradient( + to bottom, + rgba(59, 130, 246, 0.08), + rgba(59, 130, 246, 0.04) + ); } } @@ -55,6 +60,13 @@ overflow: hidden; } +.pane-label { + font-size: 0.85rem; + font-weight: 600; + margin-bottom: $spacing-sm; + @include text-ellipsis; +} + .pane-title, .pane-profile { font-size: 0.8rem; @@ -89,7 +101,7 @@ position: absolute; top: $spacing-sm; right: $spacing-sm; - padding: $spacing-sm 6px; + padding: $spacing-sm $spacing-md; background: var(--theme-bg); border: 1px solid var(--theme-border); border-radius: $radius-sm; @@ -98,6 +110,7 @@ font-size: 0.7rem; transition: all $transition-fast; opacity: 0; + z-index: 10; &:hover { background: var(--theme-primary); @@ -127,7 +140,7 @@ } .context-menu-item { - @include flex-row(10px); + @include flex-row($spacing-lg); width: 100%; padding: $spacing-md $spacing-lg; border: none; diff --git a/src/components/workspaceEditor.component.pug b/src/components/workspaceEditor.component.pug index c2003ab..dc4aa0a 100644 --- a/src/components/workspaceEditor.component.pug +++ b/src/components/workspaceEditor.component.pug @@ -1,46 +1,26 @@ -//- Inline workspace editor -.workspace-editor-inline - .editor-body - ng-container(*ngTemplateOutlet='editorContent') +//- Section 1: Workspace Settings +.editor-section + .section-title + i.fas.fa-cog + | Workspace Settings - .editor-footer - label.startup-checkbox - input(type='checkbox', [(ngModel)]='workspace.launchOnStartup') - | Launch on startup - .editor-actions - button.btn.btn-secondary.btn-sm(type='button', (click)='onCancel()') Cancel - button.btn.btn-primary.btn-sm(type='button', (click)='onSave()', [disabled]='!workspace.name?.trim() || !hasUnsavedChanges') - i.fas.fa-save - | Save - span.unsaved-indicator(*ngIf='hasUnsavedChanges') * - -//- Shared editor content -ng-template(#editorContent) - //- Top row: Color picker, Name input, Icon grid - .editor-top-row - .color-picker - input.color-input( - type='color', - [(ngModel)]='workspace.color', - title='Workspace color' - ) - - input.name-input( - #nameInput, - type='text', - [(ngModel)]='workspace.name', - placeholder='Name your workspace' - ) - - .icon-picker - button.icon-trigger( - type='button', - [style.color]='workspace.color', - (click)='toggleIconDropdown()', - title='Select icon' + .form-row + .form-group + label Name + input.form-control( + #nameInput, + type='text', + [(ngModel)]='workspace.name', + placeholder='Workspace name' ) - i.fas([class]='"fa-" + workspace.icon') + .form-group.auto-width + label Icon + .dropdown-trigger((click)='toggleIconDropdown()') + span.dropdown-icon([style.color]='workspace.color') + i.fas([class]='"fa-" + workspace.icon') + span.dropdown-chevron + i.fas.fa-chevron-down .icon-dropdown(*ngIf='iconDropdownOpen') button.icon-option( *ngFor='let icon of availableIcons', @@ -51,74 +31,87 @@ ng-template(#editorContent) ) i.fas([class]='"fa-" + icon') - //- Layout section - .layout-section - .layout-header - span.layout-title Layout - - .layout-toolbar - .toolbar-group.split-group - span.toolbar-label Split - button.toolbar-btn( - type='button', - [disabled]='!selectedPaneId', - (click)='splitSelectedPane("horizontal")', - title='Split Horizontal' + .form-group.auto-width + label Color + .color-trigger + span.dropdown-color([style.background]='workspace.color') + input.color-input-hidden( + type='color', + [(ngModel)]='workspace.color' ) - i.fas.fa-arrows-alt-h - button.toolbar-btn( - type='button', - [disabled]='!selectedPaneId', - (click)='splitSelectedPane("vertical")', - title='Split Vertical' - ) - i.fas.fa-arrows-alt-v + span.dropdown-chevron + i.fas.fa-chevron-down - .toolbar-divider +//- Section 2: Split Layout +.editor-section + .section-title + i.fas.fa-columns + | Split Layout - .toolbar-group.add-group - span.toolbar-label Add - button.toolbar-btn( - type='button', - [disabled]='!selectedPaneId', - (click)='addPane("left")', - title='Add Left' - ) - i.fas.fa-caret-left - button.toolbar-btn( - type='button', - [disabled]='!selectedPaneId', - (click)='addPane("right")', - title='Add Right' - ) - i.fas.fa-caret-right - button.toolbar-btn( - type='button', - [disabled]='!selectedPaneId', - (click)='addPane("top")', - title='Add Top' - ) - i.fas.fa-caret-up - button.toolbar-btn( - type='button', - [disabled]='!selectedPaneId', - (click)='addPane("bottom")', - title='Add Bottom' - ) - i.fas.fa-caret-down - - .toolbar-spacer - - .toolbar-group - button.toolbar-btn.danger( - type='button', - [disabled]='!selectedPaneId || !canRemovePane()', - (click)='removeSelectedPane()', - title='Remove pane' - ) - i.fas.fa-trash + .split-preview-container + //- Preview toolbar + .preview-toolbar + button.preview-btn( + type='button', + title='Edit pane', + [disabled]='!selectedPaneId', + (click)='editSelectedPane()' + ) + i.fas.fa-pen + button.preview-btn( + type='button', + title='Split Horizontal', + [disabled]='!selectedPaneId', + (click)='splitSelectedPane("horizontal")' + ) + i.fas.fa-grip-lines-vertical + button.preview-btn( + type='button', + title='Split Vertical', + [disabled]='!selectedPaneId', + (click)='splitSelectedPane("vertical")' + ) + i.fas.fa-grip-lines + span.toolbar-separator + button.preview-btn( + type='button', + title='Add Left', + [disabled]='!selectedPaneId', + (click)='addPane("left")' + ) + i.fas.fa-arrow-left + button.preview-btn( + type='button', + title='Add Right', + [disabled]='!selectedPaneId', + (click)='addPane("right")' + ) + i.fas.fa-arrow-right + button.preview-btn( + type='button', + title='Add Top', + [disabled]='!selectedPaneId', + (click)='addPane("top")' + ) + i.fas.fa-arrow-up + button.preview-btn( + type='button', + title='Add Bottom', + [disabled]='!selectedPaneId', + (click)='addPane("bottom")' + ) + i.fas.fa-arrow-down + span.toolbar-separator + button.preview-btn.danger( + type='button', + title='Remove pane', + [disabled]='!selectedPaneId || !canRemovePane()', + (click)='removeSelectedPane()' + ) + i.fas.fa-trash - .layout-preview-container((click)='onPreviewBackgroundClick()') + //- Split preview + .layout-preview((click)='onPreviewBackgroundClick()') split-preview( [split]='workspace.root', [selectedPaneId]='selectedPaneId', @@ -134,11 +127,29 @@ ng-template(#editorContent) (removePane)='removePane($event)' ) -//- Pane editor (always modal) -pane-editor( - *ngIf='showPaneEditor && editingPane', - [pane]='editingPane', - [profiles]='profiles', - (save)='onPaneSave($event)', - (cancel)='closePaneEditor()' -) + //- Inline pane editor (replaces modal) + pane-editor( + *ngIf='showPaneEditor && editingPane', + [pane]='editingPane', + [profiles]='profiles', + (save)='onPaneSave($event)', + (cancel)='closePaneEditor()' + ) + +//- Action buttons +.action-buttons + .checkbox-group + input(type='checkbox', [(ngModel)]='workspace.launchOnStartup', id='launchStartup') + label(for='launchStartup') Launch on startup + .action-buttons-right + button.btn.btn-ghost(type='button', (click)='onCancel()') + i.fas.fa-xmark + | Cancel + button.btn.btn-success( + type='button', + (click)='onSave()', + [disabled]='!workspace.name?.trim() || !hasUnsavedChanges' + ) + i.fas.fa-check + | Save + span.unsaved-indicator(*ngIf='hasUnsavedChanges') * diff --git a/src/components/workspaceEditor.component.scss b/src/components/workspaceEditor.component.scss index 413bc97..11ab652 100644 --- a/src/components/workspaceEditor.component.scss +++ b/src/components/workspaceEditor.component.scss @@ -1,200 +1,284 @@ @import '../styles/index'; -// Workspace editor (inline) -.workspace-editor-inline { - background: var(--theme-bg-more); - border-radius: $radius-lg; - border: 1px solid var(--theme-border); +// Editor section +.editor-section { margin-bottom: $spacing-xl; +} - .editor-body { - padding: $spacing-xl; - } +.section-title { + font-size: 11px; + color: var(--theme-fg-more); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: $spacing-lg; + display: flex; + align-items: center; + gap: $spacing-sm; +} - .editor-footer { - @include flex-between; - padding: 10px $spacing-xl; - border-top: 1px solid var(--theme-border); - background: var(--theme-bg); - border-radius: 0 0 $radius-lg $radius-lg; +// Form layout +.form-row { + display: flex; + gap: $spacing-lg; + align-items: flex-end; +} - .startup-checkbox { - @include flex-row(6px); - font-size: 0.85rem; - color: var(--theme-fg-more); - cursor: pointer; +.form-group { + flex: 1; + position: relative; - input { - margin: 0; - } - } + &.auto-width { + flex: none; + } - .editor-actions { - @include flex-row($spacing-md); + label { + @include form-label; + } - .btn-success { - @include btn-success; - } + .form-control { + @include form-input(var(--theme-bg-more)); + width: 100%; + font-size: $font-sm; + // Override Tabby's global border reset + border: 1px solid var(--theme-border) !important; - .unsaved-indicator { - color: $color-warning; - font-weight: bold; - margin-left: $spacing-xs; - } + &:focus { + border-color: var(--theme-primary) !important; } } } -// Shared editor content -.editor-top-row { - @include flex-row($spacing-lg); - align-items: flex-start; - margin-bottom: $spacing-xl; +// Dropdown trigger (icon picker) +.dropdown-trigger { + display: flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-sm $spacing-md; + background: var(--theme-bg-more); + border: 1px solid var(--theme-border); + border-radius: $radius-sm; + cursor: pointer; + transition: border-color $transition-fast; + height: 32px; + box-sizing: border-box; + + &:hover { + border-color: var(--theme-fg-more); + } } -.color-picker { - .color-input { - width: 40px; - height: 40px; - padding: $spacing-xs; - border: 1px solid var(--theme-border); - border-radius: $radius-md; - cursor: pointer; - background: var(--theme-bg); +.dropdown-icon { + font-size: 14px; +} - &::-webkit-color-swatch-wrapper { - padding: $spacing-xs; - } +.dropdown-chevron { + color: var(--theme-fg-more); + font-size: 10px; +} - &::-webkit-color-swatch { - border-radius: $radius-sm; - border: none; - } - } +// Icon dropdown +.icon-dropdown { + position: absolute; + top: 100%; + left: 0; + margin-top: $spacing-sm; + padding: $spacing-md; + @include dropdown-panel; + z-index: $z-dropdown; + display: grid; + grid-template-columns: repeat(6, 28px); + gap: $spacing-sm; } -.name-input { - flex: 1; - min-width: 150px; - @include form-input(var(--theme-bg)); - font-size: 1rem; - font-weight: 500; +.icon-option { + width: 28px; + height: 28px; + @include flex-center; + border: 1px solid transparent; + border-radius: $radius-sm; + background: transparent; + color: var(--theme-fg-more); + cursor: pointer; + transition: all $transition-fast; + font-size: 0.85rem; - &::placeholder { - font-weight: 400; + &:hover { + background: var(--theme-bg-more-more); + color: var(--theme-fg); + } + + &.selected { + border-color: currentColor; + background: var(--theme-bg); } } -.icon-picker { +// Color trigger (wraps native color input) +.color-trigger { + display: flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-sm $spacing-md; + background: var(--theme-bg-more); + border: 1px solid var(--theme-border); + border-radius: $radius-sm; + cursor: pointer; position: relative; + transition: border-color $transition-fast; + height: 32px; + box-sizing: border-box; - .icon-trigger { - width: 40px; - height: 40px; - @include flex-center; - border: 1px solid var(--theme-border); - border-radius: $radius-md; - background: var(--theme-bg); - cursor: pointer; - font-size: 1.1rem; - transition: background $transition-fast; + &:hover { + border-color: var(--theme-fg-more); + } - &:hover { - background: var(--theme-bg-more); - } + &:focus-within { + border-color: var(--theme-primary); } - .icon-dropdown { + .color-input-hidden { position: absolute; - top: 100%; - right: 0; - margin-top: $spacing-sm; - padding: $spacing-md; - @include dropdown-panel; - z-index: $z-dropdown; - display: grid; - grid-template-columns: repeat(6, 28px); - gap: $spacing-sm; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; + cursor: pointer; } +} - .icon-option { - width: 28px; - height: 28px; - @include flex-center; - border: 1px solid transparent; - border-radius: $radius-sm; - background: transparent; - color: var(--theme-fg-more); - cursor: pointer; - transition: all $transition-fast; - font-size: 0.85rem; +.dropdown-color { + width: 16px; + height: 16px; + border-radius: $radius-xs; +} - &:hover { - background: var(--theme-bg-more-more); - color: var(--theme-fg); - } +// Split preview container +.split-preview-container { + background: var(--theme-bg-more); + border: 1px solid var(--theme-border); + border-radius: $radius-md; + padding: $spacing-lg; +} - &.selected { - border-color: currentColor; - background: var(--theme-bg); - } - } +// Preview toolbar +.preview-toolbar { + display: flex; + justify-content: flex-end; + align-items: center; + gap: $spacing-sm; + margin-bottom: $spacing-lg; + padding-bottom: $spacing-md; + border-bottom: 1px solid var(--theme-border); +} + +.toolbar-separator { + width: 1px; + height: 18px; + background: var(--theme-border); + margin: 0 $spacing-sm; + align-self: center; } -// Layout section -.layout-section { - .layout-header { - @include flex-between; - margin-bottom: $spacing-md; +.preview-btn { + width: 24px; + height: 24px; + display: flex; + align-items: center; + justify-content: center; + background: var(--theme-bg); + border: 1px solid var(--theme-border); + border-radius: $radius-sm; + color: var(--theme-fg-more); + cursor: pointer; + font-size: 10px; + transition: all $transition-fast; + + &:hover:not(:disabled) { + border-color: var(--theme-primary); + color: var(--theme-primary); + } + + &.danger:hover:not(:disabled) { + border-color: var(--theme-danger); + color: var(--theme-danger); } - .layout-title { - font-size: 0.8rem; - font-weight: 500; - color: var(--theme-fg-more); - text-transform: uppercase; - letter-spacing: 0.5px; + &:disabled { + opacity: 0.4; + cursor: not-allowed; } } -// Layout toolbar -.layout-toolbar { - @include flex-row($spacing-sm); - padding: $spacing-md 0; - margin-bottom: $spacing-md; +// Layout preview area +.layout-preview { + background: var(--theme-bg); + border-radius: $radius-sm; + min-height: 150px; + max-height: 200px; + padding: $spacing-sm; +} + +// Action buttons +.action-buttons { + display: flex; + justify-content: space-between; + align-items: center; + padding-top: $spacing-xl; + border-top: 1px solid var(--theme-border); + margin-top: $spacing-xl; +} + +.checkbox-group { + display: flex; + align-items: center; + gap: $spacing-sm; - .toolbar-group { - @include flex-row($spacing-xs); + input[type="checkbox"] { + width: 14px; + height: 14px; + margin: 0; } - .toolbar-label { - font-size: 0.75rem; - color: var(--theme-fg-more); - margin-right: $spacing-sm; - text-transform: uppercase; - letter-spacing: 0.3px; + label { + font-size: $font-sm; + color: var(--theme-fg); + cursor: pointer; } +} + +.action-buttons-right { + display: flex; + gap: $spacing-md; - .toolbar-spacer { - flex: 1; + .btn { + display: inline-flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-sm $spacing-lg; + font-size: $font-sm; + border-radius: $radius-sm; + cursor: pointer; + transition: all $transition-fast; } - .toolbar-divider { - width: 1px; - height: 20px; - background: var(--theme-border); - margin: 0 $spacing-sm; + .btn-ghost { + background: transparent; + border: 1px solid var(--theme-border); + color: var(--theme-fg); + + &:hover { + background: var(--theme-bg-more); + } } - .toolbar-btn { - @include toolbar-btn; + .btn-success { + @include btn-success; } -} -.layout-preview-container { - background: var(--theme-bg); - border-radius: $radius-md; - padding: $spacing-md; - min-height: 120px; - max-height: 180px; + .unsaved-indicator { + color: $color-warning; + font-weight: bold; + margin-left: $spacing-xs; + } } diff --git a/src/components/workspaceList.component.pug b/src/components/workspaceList.component.pug index 07af348..3001e09 100644 --- a/src/components/workspaceList.component.pug +++ b/src/components/workspaceList.component.pug @@ -1,57 +1,36 @@ .workspace-list-container - .workspace-list-header - h3 Workspace Editor - button.btn.btn-primary(type='button', (click)='createWorkspace()') - i.fas.fa-plus - | New Workspace - - //- Editor (above list) - workspace-editor( - *ngIf='editingWorkspace', - [workspace]='editingWorkspace', - [autoFocus]='isCreatingNew', - [hasUnsavedChanges]='hasUnsavedChanges', - (save)='onEditorSave($event)', - (cancel)='onEditorCancel()' - ) - - //- Workspace list - .workspace-list(*ngIf='workspaces.length > 0') - .workspace-item( + //- Tab bar navigation + .tab-bar + .tab( *ngFor='let workspace of workspaces', - [class.selected]='isSelected(workspace)', + [class.active]='isSelected(workspace)', (click)='selectWorkspace(workspace)' ) - .workspace-info - .workspace-icon([style.color]='workspace.color') - i.fas([class]='"fa-" + (workspace.icon || "columns")') - .workspace-details - .workspace-name {{ workspace.name }} - .workspace-meta - span {{ getPaneCount(workspace) }} panes - span.separator · - span {{ getOrientationLabel(workspace) }} - span.separator(*ngIf='workspace.launchOnStartup') · - span.badge.badge-primary(*ngIf='workspace.launchOnStartup') startup + span.tab-icon([style.color]='workspace.color') + i.fas([class]='"fa-" + (workspace.icon || "columns")') + span.tab-name {{ workspace.name }} + span.tab-close( + (click)='deleteWorkspace($event, workspace)', + title='Delete workspace' + ) + i.fas.fa-xmark - .workspace-actions - button.btn.btn-link.open-btn( - type='button', - title='Open', - [disabled]='openingWorkspaceId === workspace.id', - (click)='openWorkspace($event, workspace)' - ) - i.fas( - [class.fa-external-link-alt]='openingWorkspaceId !== workspace.id', - [class.fa-spinner]='openingWorkspaceId === workspace.id', - [class.fa-spin]='openingWorkspaceId === workspace.id' - ) - button.btn.btn-link(type='button', title='Duplicate', (click)='duplicateWorkspace($event, workspace)') - i.fas.fa-copy - button.btn.btn-link.text-danger(type='button', title='Delete', (click)='deleteWorkspace($event, workspace)') - i.fas.fa-trash + .tab-new((click)='createWorkspace()', title='New workspace') + i.fas.fa-plus + + //- Tab content (editor) + .tab-content(*ngIf='editingWorkspace') + workspace-editor( + [workspace]='editingWorkspace', + [autoFocus]='isCreatingNew', + [hasUnsavedChanges]='hasUnsavedChanges', + (save)='onEditorSave($event)', + (cancel)='onEditorCancel()' + ) - //- Empty state - .workspace-empty(*ngIf='workspaces.length === 0 && !isCreatingNew') + //- Empty state (when no workspaces) + .tab-content.empty-state(*ngIf='!editingWorkspace && workspaces.length === 0') p No workspaces configured yet. - p Click "New Workspace" to create your first split-layout workspace. + p Click + strong + + | to create your first workspace. diff --git a/src/components/workspaceList.component.scss b/src/components/workspaceList.component.scss index b4f0268..93edaf3 100644 --- a/src/components/workspaceList.component.scss +++ b/src/components/workspaceList.component.scss @@ -4,91 +4,104 @@ padding: $spacing-2xl; } -.workspace-list-header { - @include flex-between; - margin-bottom: $spacing-2xl; - - h3 { - margin: 0; - font-size: 1.5rem; - } +// Tab bar +.tab-bar { + display: flex; + background: var(--theme-bg-more); + border: 1px solid var(--theme-border); + border-bottom: none; } -.workspace-list { - @include flex-col($spacing-lg); -} +.tab { + display: flex; + align-items: center; + gap: $spacing-md; + padding: $spacing-md $spacing-lg; + border-right: 1px solid var(--theme-border); + color: var(--theme-fg-more); + cursor: pointer; + font-size: $font-sm; + min-width: 120px; + transition: background $transition-fast; -.workspace-item { - @include flex-between; - @include interactive-card($radius-lg); - padding: $spacing-xl; + &:hover { + background: var(--theme-bg-more-more); - &.selected { - border-left-width: 3px; - box-shadow: 0 0 0 1px var(--theme-primary) inset; + .tab-close { + opacity: 1; + } } -} -.workspace-info { - @include flex-row($spacing-xl); + &.active { + background: var(--theme-bg); + color: var(--theme-fg); + border-bottom: 2px solid var(--theme-primary); + margin-bottom: -1px; + } } -.workspace-icon { - font-size: 24px; - width: 40px; - text-align: center; +.tab-icon { + font-size: 12px; } -.workspace-details { - @include flex-col($spacing-sm); +.tab-name { + flex: 1; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -.workspace-name { - font-size: 1.1rem; - font-weight: 500; +.tab-close { + width: 16px; + height: 16px; + display: flex; + align-items: center; + justify-content: center; + opacity: 0; + font-size: 9px; + border-radius: $radius-xs; + transition: opacity $transition-fast, background $transition-fast; + + &:hover { + background: var(--theme-danger); + color: white; + } } -.workspace-meta { - font-size: 0.85rem; +.tab-new { + display: flex; + align-items: center; + justify-content: center; + width: 36px; color: var(--theme-fg-more); + cursor: pointer; + transition: color $transition-fast, background $transition-fast; - .separator { - margin: 0 6px; - } - - .badge { - font-size: 0.75rem; - padding: $spacing-xs 6px; - border-radius: $radius-sm; - background: var(--theme-primary); - color: white; + &:hover { + background: var(--theme-bg-more-more); + color: var(--theme-primary); } } -.workspace-actions { - @include flex-row($spacing-sm); +// Tab content +.tab-content { + background: var(--theme-bg); + border: 1px solid var(--theme-border); + border-top: none; + padding: $spacing-xl; - .btn-link { - padding: $spacing-md; + &.empty-state { + text-align: center; + padding: $spacing-2xl; color: var(--theme-fg-more); - @include icon-btn-opacity; - &.open-btn:hover { - color: var(--theme-success, $color-success); + p { + margin: $spacing-md 0; } - &.text-danger:hover { - color: var(--theme-danger); + strong { + color: var(--theme-primary); + padding: 0 $spacing-xs; } } } - -.workspace-empty { - text-align: center; - padding: 40px; - color: var(--theme-fg-more); - - p { - margin: $spacing-md 0; - } -} diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss index 35c9aa7..b15e521 100644 --- a/src/styles/_mixins.scss +++ b/src/styles/_mixins.scss @@ -33,12 +33,12 @@ // ====================== @mixin form-input($bg: var(--theme-bg)) { - padding: 10px 12px; - border-radius: $radius-md; + padding: $spacing-sm $spacing-md; + border-radius: $radius-sm; border: 1px solid var(--theme-border); background: $bg; color: var(--theme-fg); - font-size: 0.95rem; + font-size: $font-md; &:focus { outline: none; @@ -50,11 +50,24 @@ } } +// ====================== +// FORM LABEL MIXIN (S1: Uppercase compact) +// ====================== + +@mixin form-label { + display: block; + font-size: $font-xs; + color: var(--theme-fg-less); + text-transform: uppercase; + letter-spacing: 0.5px; + margin-bottom: $spacing-xs; +} + // ====================== // INTERACTIVE CARD MIXIN // ====================== -@mixin interactive-card($radius: $radius-lg) { +@mixin interactive-card($radius: $radius-md) { background: var(--theme-bg-more); border-radius: $radius; border: 1px solid var(--theme-border); diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index 1ac7fec..dfe058a 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -1,20 +1,20 @@ // ====================== -// SPACING SCALE +// SPACING SCALE (S1: Tight) // ====================== $spacing-xs: 2px; // toolbar group gap, tiny margins $spacing-sm: 4px; // gaps, small padding -$spacing-md: 8px; // default gaps, button padding -$spacing-lg: 12px; // section gaps, form spacing -$spacing-xl: 16px; // container padding, large gaps -$spacing-2xl: 20px; // modal padding, section margins +$spacing-md: 6px; // default gaps, button padding +$spacing-lg: 10px; // section gaps, form spacing +$spacing-xl: 14px; // container padding, large gaps +$spacing-2xl: 18px; // modal padding, section margins // ====================== -// BORDER RADIUS SCALE +// BORDER RADIUS SCALE (S1: Sharp) // ====================== -$radius-sm: 4px; // buttons, small elements -$radius-md: 6px; // inputs, dropdowns -$radius-lg: 8px; // cards, containers -$radius-xl: 12px; // modals +$radius-xs: 2px; // tiny elements +$radius-sm: 2px; // buttons, small elements +$radius-md: 3px; // inputs, dropdowns +$radius-lg: 4px; // cards, containers, modals // ====================== // CUSTOM COLORS @@ -26,13 +26,20 @@ $color-warning: #f59e0b; $color-danger: #ef4444; // ====================== -// SHADOWS +// SHADOWS (S1: Flat - no shadows) // ====================== -$shadow-dropdown: 0 4px 12px rgba(0, 0, 0, 0.15); -$shadow-context-menu: 0 8px 24px rgba(0, 0, 0, 0.3); -$shadow-modal: 0 20px 60px rgba(0, 0, 0, 0.4); +$shadow-dropdown: none; +$shadow-context-menu: none; +$shadow-modal: none; $overlay-bg: rgba(0, 0, 0, 0.7); +// ====================== +// FONT SIZES (S1: Compact) +// ====================== +$font-xs: 0.7rem; // 11px - sublabels, hints +$font-sm: 0.8rem; // 13px - labels, secondary text +$font-md: 0.85rem; // 14px - default body + // ====================== // Z-INDEX SCALE // ====================== From fbafca2bd898d6dc0983040921e38d11f60f3f25 Mon Sep 17 00:00:00 2001 From: halilc4 Date: Wed, 14 Jan 2026 16:49:39 +0100 Subject: [PATCH 05/18] Add CI/CD workflows - CI: Build check on push to dev and PRs to main - Release: Auto npm publish on merge to main Co-Authored-By: Claude Opus 4.5 --- .env.example | 4 ++++ .github/workflows/ci.yml | 26 ++++++++++++++++++++++++++ .github/workflows/release.yml | 30 ++++++++++++++++++++++++++++++ 3 files changed, 60 insertions(+) create mode 100644 .env.example create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/release.yml diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..8dde061 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +# NPM token for publishing +# Get yours from: https://www.npmjs.com/settings/YOUR_USERNAME/tokens +# Create "Automation" type token for CI/CD +NPM_TOKEN=npm_xxxxxxxxxxxxxxxxxxxx diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..815a96f --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,26 @@ +name: CI + +on: + push: + branches: [dev] + pull_request: + branches: [main] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install dependencies + run: npm ci --legacy-peer-deps + + - name: Build + run: npm run build diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..5c00795 --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,30 @@ +name: Release + +on: + push: + branches: [main] + +jobs: + publish: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + registry-url: 'https://registry.npmjs.org' + + - name: Install dependencies + run: npm ci --legacy-peer-deps + + - name: Build + run: npm run build + + - name: Publish to npm + run: npm publish --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} From 9e2458fda2c0cbef06152af461af5d7308f798a9 Mon Sep 17 00:00:00 2001 From: halilc4 Date: Wed, 14 Jan 2026 17:18:26 +0100 Subject: [PATCH 06/18] Update docs for dev branch workflow - CONTRIBUTING: PRs go to dev, not main - README: Add Contributing section Co-Authored-By: Claude Opus 4.5 --- CONTRIBUTING.md | 4 +++- README.md | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index f8e9053..f2d36c4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -49,7 +49,9 @@ No hot reload. Tabby doesn't support it for plugins. Restart after each build. 2. Create a branch (`git checkout -b fix/thing`) 3. Make your changes 4. Test manually in Tabby -5. Submit PR with a clear description +5. Submit PR **to the `dev` branch** (not `main`) + +CI will check that your code builds. `main` is for releases only. No strict commit message format. Just be clear about what you changed and why. diff --git a/README.md b/README.md index f8355c5..06971ce 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,12 @@ Restart Tabby after installation. - [Discussions](https://github.com/halilc4/tabbyspaces/discussions) - Questions, ideas, show your setup - [Issues](https://github.com/halilc4/tabbyspaces/issues) - Bug reports +## Contributing + +PRs welcome! See [CONTRIBUTING.md](CONTRIBUTING.md) for setup instructions. + +All PRs go to the `dev` branch. CI checks the build automatically. + ## License MIT From cd04cde7998cae91f63aabb0a881af52d6d7574d Mon Sep 17 00:00:00 2001 From: halilc4 Date: Thu, 15 Jan 2026 16:42:51 +0100 Subject: [PATCH 07/18] Fix duplicate workspace detection and startup timing - Add workspaceId to recovery tokens for reliable detection after Tabby restart - Update isWorkspaceAlreadyOpen() with two-strategy detection: 1. Check recoveryToken.workspaceId (restored tabs) 2. Check profile ID (freshly opened tabs) - Add waitForTabbyReady() to ensure Tabby finishes recovery before launching - Remove per-pane title field, use workspace name for all tabs - Simplify tab title handling with disableDynamicTitle Co-Authored-By: Claude Opus 4.5 --- TODO.md | 4 +- src/components/paneEditor.component.pug | 8 ---- src/components/splitPreview.component.ts | 16 ++----- src/models/workspace.model.ts | 4 +- src/providers/toolbar.provider.ts | 54 +++++++++++++++++++++--- src/services/startupCommand.service.ts | 17 +++----- src/services/workspaceEditor.service.ts | 30 +++++++------ 7 files changed, 79 insertions(+), 54 deletions(-) diff --git a/TODO.md b/TODO.md index e5379de..eed336d 100644 --- a/TODO.md +++ b/TODO.md @@ -13,12 +13,14 @@ - [ ] List: add small layout preview - [ ] Better input for command - [ ] Better input for cwd +- [ ] Editor workspace + pane editor autosave +- [ ] Undo/redo for editor changes ### Bugs - [~] Resize panes in Tabby reverts to original values (ratio problem) - WATCH: happens only on one workspace - [ ] Layout preview responsive - nested splits don't adapt well to smaller sizes - [ ] Launch on startup - Tabby remembers open tabs, check if we can detect if workspace is already open; if not, kill the feature -- [ ] Tab titles are a mess - keep only workspace name or default to Tabby behavior (verify no caching/lookup by tab name) +- [x] Tab titles are a mess - keep only workspace name or default to Tabby behavior (verify no caching/lookup by tab name) ### Other - [ ] Update screenshots in README diff --git a/src/components/paneEditor.component.pug b/src/components/paneEditor.component.pug index 556e184..7d4d514 100644 --- a/src/components/paneEditor.component.pug +++ b/src/components/paneEditor.component.pug @@ -24,14 +24,6 @@ placeholder='C:\\path\\to\\project' ) - .form-group - label Tab Title - input.form-control( - type='text', - [(ngModel)]='editedPane.title', - placeholder='Optional' - ) - .form-group label Startup Command input.form-control( diff --git a/src/components/splitPreview.component.ts b/src/components/splitPreview.component.ts index 791f47d..874c762 100644 --- a/src/components/splitPreview.component.ts +++ b/src/components/splitPreview.component.ts @@ -131,20 +131,10 @@ export class SplitPreviewComponent { } getPaneLabel(pane: WorkspacePane): string { - // Base label is always the profile name - let profileName = '' - if (pane.profileId) { - const profile = this.profiles.find(p => p.id === pane.profileId) - if (profile?.name) profileName = profile.name - } - - if (!profileName) return 'Select profile' + if (!pane.profileId) return 'Select profile' - // Format: "Title - Profile" or just "Profile" - if (pane.title) { - return `${pane.title} - ${profileName}` - } - return profileName + const profile = this.profiles.find(p => p.id === pane.profileId) + return profile?.name || 'Select profile' } // Pass-through events from nested splits diff --git a/src/models/workspace.model.ts b/src/models/workspace.model.ts index e4c5236..7625842 100644 --- a/src/models/workspace.model.ts +++ b/src/models/workspace.model.ts @@ -38,6 +38,8 @@ export interface TabbyRecoveryToken { tabCustomTitle?: string disableDynamicTitle?: boolean cwd?: string + // Allow custom properties (matches Tabby's RecoveryToken interface) + [key: string]: any } export interface TabbySplitLayoutProfile { @@ -59,7 +61,6 @@ export interface WorkspacePane { profileId: string cwd?: string startupCommand?: string - title?: string } export interface WorkspaceSplit { @@ -87,7 +88,6 @@ export function createDefaultPane(): WorkspacePane { profileId: '', cwd: '', startupCommand: '', - title: '', } } diff --git a/src/providers/toolbar.provider.ts b/src/providers/toolbar.provider.ts index 3c4fb5e..733e214 100644 --- a/src/providers/toolbar.provider.ts +++ b/src/providers/toolbar.provider.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core' -import { ToolbarButtonProvider, ToolbarButton, ProfilesService, AppService } from 'tabby-core' +import { ToolbarButtonProvider, ToolbarButton, ProfilesService, AppService, SplitTabComponent } from 'tabby-core' +import { BaseTerminalTabComponent } from 'tabby-terminal' import { WorkspaceEditorService } from '../services/workspaceEditor.service' import { StartupCommandService } from '../services/startupCommand.service' import { SettingsTabComponent } from 'tabby-settings' @@ -26,13 +27,28 @@ export class WorkspaceToolbarProvider extends ToolbarButtonProvider { private startupService: StartupCommandService ) { super() - // Delay startup tasks to ensure Tabby config is loaded - setTimeout(() => { - // Cleanup orphaned profiles from previous plugin versions (one-time migration) + // Wait for Tabby to finish recovery before launching startup workspaces + this.waitForTabbyReady().then(() => { this.workspaceService.cleanupOrphanedProfiles() - // Launch workspaces marked for startup this.launchStartupWorkspaces() - }, 500) + }) + } + + private waitForTabbyReady(): Promise { + return new Promise(resolve => { + let lastTabCount = -1 + const checkStable = () => { + const currentCount = this.app.tabs.length + if (currentCount === lastTabCount && currentCount >= 0) { + resolve() + } else { + lastTabCount = currentCount + setTimeout(checkStable, 300) + } + } + // Initial delay to let Tabby start loading + setTimeout(checkStable, 500) + }) } private async launchStartupWorkspaces(): Promise { @@ -40,10 +56,36 @@ export class WorkspaceToolbarProvider extends ToolbarButtonProvider { const startupWorkspaces = workspaces.filter(w => w.launchOnStartup) for (const workspace of startupWorkspaces) { + if (this.isWorkspaceAlreadyOpen(workspace.id)) { + console.log(`[TabbySpaces] Workspace "${workspace.name}" already open, skipping`) + continue + } await this.openWorkspace(workspace.id) } } + private isWorkspaceAlreadyOpen(workspaceId: string): boolean { + for (const tab of this.app.tabs) { + if (tab instanceof SplitTabComponent) { + // Strategy 1: Check recoveryToken.workspaceId (for restored tabs) + const token = (tab as any).recoveryToken + if (token?.workspaceId === workspaceId) { + return true + } + + // Strategy 2: Check profile ID (for freshly opened tabs) + for (const child of tab.getAllTabs()) { + if (child instanceof BaseTerminalTabComponent) { + if (child.profile?.id?.includes(`:${workspaceId}`)) { + return true + } + } + } + } + } + return false + } + provide(): ToolbarButton[] { return [ { diff --git a/src/services/startupCommand.service.ts b/src/services/startupCommand.service.ts index 9e69a9c..49d315c 100644 --- a/src/services/startupCommand.service.ts +++ b/src/services/startupCommand.service.ts @@ -96,12 +96,9 @@ export class StartupCommandService { // Clear profile args to prevent native splits from re-running command this.clearProfileArgs(terminalTab) - // Reset title - either to original or clear for dynamic shell title - if (pending.originalTitle) { - terminalTab.setTitle(pending.originalTitle) - } else { - terminalTab.customTitle = '' - } + // Set tab title to workspace name + terminalTab.setTitle(pending.originalTitle) + terminalTab.customTitle = pending.originalTitle }) } else { console.log('[TabbySpaces] No session.output$, falling back to timeout') @@ -112,11 +109,9 @@ export class StartupCommandService { // Clear profile args to prevent native splits from re-running command this.clearProfileArgs(terminalTab) - if (pending.originalTitle) { - terminalTab.setTitle(pending.originalTitle) - } else { - terminalTab.customTitle = '' - } + // Set tab title to workspace name + terminalTab.setTitle(pending.originalTitle) + terminalTab.customTitle = pending.originalTitle }, 500) } } diff --git a/src/services/workspaceEditor.service.ts b/src/services/workspaceEditor.service.ts index 8821d62..3d1dbe1 100644 --- a/src/services/workspaceEditor.service.ts +++ b/src/services/workspaceEditor.service.ts @@ -105,26 +105,27 @@ export class WorkspaceEditorService { color: workspace.color, isBuiltin: false, options: { - recoveryToken: this.generateRecoveryToken(workspace.root), + recoveryToken: this.generateRecoveryToken(workspace.root, workspace.name, workspace.id), }, } } - private generateRecoveryToken(split: WorkspaceSplit): TabbyRecoveryToken { + private generateRecoveryToken(split: WorkspaceSplit, workspaceName: string, workspaceId: string): TabbyRecoveryToken { return { type: 'app:split-tab', orientation: split.orientation === 'horizontal' ? 'h' : 'v', ratios: split.ratios, + workspaceId, children: split.children.map((child) => { if (isWorkspaceSplit(child)) { - return this.generateRecoveryToken(child) + return this.generateRecoveryToken(child, workspaceName, workspaceId) } - return this.generatePaneToken(child) + return this.generatePaneToken(child, workspaceName, workspaceId) }), } } - private generatePaneToken(pane: WorkspacePane): TabbyRecoveryToken { + private generatePaneToken(pane: WorkspacePane, workspaceName: string, workspaceId: string): TabbyRecoveryToken { const baseProfile = this.getProfileById(pane.profileId) if (!baseProfile) { @@ -162,7 +163,7 @@ export class WorkspaceEditorService { options, icon: baseProfile.icon || '', color: baseProfile.color || '', - disableDynamicTitle: false, + disableDynamicTitle: true, weight: 0, isBuiltin: false, isTemplate: false, @@ -170,16 +171,18 @@ export class WorkspaceEditorService { behaviorOnSessionEnd: 'auto', } - // Use pane.id for matching in StartupCommandService - // Original title will be restored after command execution + // tabTitle: workspace name (what user sees) + // tabCustomTitle: pane.id (for matching in StartupCommandService) + // workspaceId: for duplicate detection after Tabby recovery const cwd = pane.cwd || baseProfile.options?.cwd || '' return { type: 'app:local-tab', profile, savedState: false, - tabTitle: pane.id, + tabTitle: workspaceName, tabCustomTitle: pane.id, - disableDynamicTitle: false, + workspaceId, + disableDynamicTitle: true, cwd, } } @@ -226,23 +229,24 @@ export class WorkspaceEditorService { collectStartupCommands(workspace: Workspace): PendingCommand[] { const commands: PendingCommand[] = [] - this.collectCommandsFromNode(workspace.root, commands) + this.collectCommandsFromNode(workspace.root, workspace.name, commands) return commands } private collectCommandsFromNode( node: WorkspacePane | WorkspaceSplit, + workspaceName: string, commands: PendingCommand[] ): void { if (isWorkspaceSplit(node)) { for (const child of node.children) { - this.collectCommandsFromNode(child, commands) + this.collectCommandsFromNode(child, workspaceName, commands) } } else if (node.startupCommand) { commands.push({ paneId: node.id, command: node.startupCommand, - originalTitle: node.title || '', + originalTitle: workspaceName, }) } } From 4baaf35117a8525190e915fd5d9b9fda1f76d062 Mon Sep 17 00:00:00 2001 From: halilc4 Date: Thu, 15 Jan 2026 17:14:17 +0100 Subject: [PATCH 08/18] Add comprehensive code review documentation Document all issues found during code review: - 3 critical issues (memory leak, race condition, unsafe casts) - 5 moderate issues (DRY violations, error handling, caching) - 6 minor issues (docs, naming, performance) Includes fix recommendations and priority list for next release. Co-Authored-By: Claude Opus 4.5 --- CODE_REVIEW.md | 445 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 445 insertions(+) create mode 100644 CODE_REVIEW.md diff --git a/CODE_REVIEW.md b/CODE_REVIEW.md new file mode 100644 index 0000000..3042ddc --- /dev/null +++ b/CODE_REVIEW.md @@ -0,0 +1,445 @@ +# Code Review - TabbySpaces + +**Date**: 2026-01-15 +**Reviewer**: Claude Opus 4.5 +**Scope**: Full codebase review (TypeScript, SCSS, Angular patterns) + +--- + +## Summary + +| Severity | Count | Status | +|----------|-------|--------| +| 🔴 Critical | 3 | Open | +| 🟠 Moderate | 5 | Open | +| 🟡 Minor | 6 | Open | + +--- + +## 🔴 Critical Issues + +### CR-001: Memory Leak in StartupCommandService + +**File**: `src/services/startupCommand.service.ts:17-18, 134-136` +**Priority**: P0 - Fix immediately + +**Problem**: The service subscribes to `app.tabOpened$` in the constructor but `ngOnDestroy()` is never called because services are not Angular components with lifecycle hooks. + +```typescript +export class StartupCommandService { + private subscription: Subscription + + constructor(private app: AppService) { + this.subscription = this.app.tabOpened$.subscribe(...) + } + + ngOnDestroy(): void { // NEVER CALLED - not an Angular lifecycle + this.subscription?.unsubscribe() + } +} +``` + +**Impact**: Subscription leaks for the entire application lifetime. Multiple subscriptions accumulate if service is re-provided. + +**Fix**: Use `DestroyRef` with `takeUntilDestroyed()` (Angular 16+): +```typescript +constructor(private app: AppService, private destroyRef: DestroyRef) { + this.app.tabOpened$.pipe( + takeUntilDestroyed(this.destroyRef) + ).subscribe((tab) => this.onTabOpened(tab)) +} +``` + +--- + +### CR-002: Race Condition in Shell Initialization + +**File**: `src/services/startupCommand.service.ts:88-116` +**Priority**: P0 - Fix immediately + +**Problem**: Mixing RxJS subscriptions with `setTimeout` creates unpredictable race conditions. + +```typescript +if (terminalTab.session?.output$) { + terminalTab.session.output$.pipe( + first(), + switchMap(() => timer(100)) + ).subscribe(() => { + terminalTab.sendInput(fullCommand + '\r') + }) +} else { + setTimeout(() => { + terminalTab.sendInput(fullCommand + '\r') + }, 500) +} +``` + +**Impact**: +- Commands may not send if `output$` emits before subscription completes +- No error handling if session closes unexpectedly +- `switchMap` can cancel subscriptions on rapid tab opens + +**Fix**: Consolidate async logic with proper error handling: +```typescript +const sendCommand = () => { + terminalTab.sendInput(fullCommand + '\r') + this.clearProfileArgs(terminalTab) + terminalTab.setTitle(pending.originalTitle) +} + +const waitForReady$ = terminalTab.session?.output$ + ? terminalTab.session.output$.pipe(first(), delay(100)) + : timer(500) + +waitForReady$.subscribe({ + next: sendCommand, + error: () => sendCommand() // Fallback on error +}) +``` + +--- + +### CR-003: Unsafe Type Casts in Duplicate Detection + +**File**: `src/providers/toolbar.provider.ts:71, 79` +**Priority**: P0 - Fix immediately + +**Problem**: Using `any` cast hides potential runtime errors. + +```typescript +const token = (tab as any).recoveryToken // UNSAFE CAST +if (child.profile?.id?.includes(`:${workspaceId}`)) // UNSAFE +``` + +**Impact**: +- If `recoveryToken` doesn't exist, code continues silently with `undefined` +- `.includes()` for ID matching is brittle (could match partial IDs) + +**Fix**: Add proper type guards: +```typescript +interface TabWithRecoveryToken { + recoveryToken?: { workspaceId?: string } +} + +const getWorkspaceId = (tab: unknown): string | undefined => { + if (tab && typeof tab === 'object' && 'recoveryToken' in tab) { + return (tab as TabWithRecoveryToken).recoveryToken?.workspaceId + } + return undefined +} + +// Use strict ID matching +const profileId = child.profile?.id ?? '' +if (profileId.startsWith(`split-layout:${CONFIG_KEY}:`) && + profileId.endsWith(`:${workspaceId}`)) { + return true +} +``` + +--- + +## 🟠 Moderate Issues + +### CR-004: DRY Violation - Tree Walking Logic + +**File**: `src/components/workspaceEditor.component.ts` +**Priority**: P1 - Fix soon + +**Problem**: Tree traversal logic is duplicated in 4+ methods: +- `splitPaneInTree()` (lines 194-229) +- `removePaneFromTree()` (lines 244-273) +- `updatePaneInTree()` (lines 179-192) +- `addPaneInTree()` (lines 316-366) + +**Fix**: Extract generic tree walker utility: +```typescript +type TreeVisitor = ( + child: WorkspaceSplit | WorkspacePane, + index: number, + parent: WorkspaceSplit +) => T | undefined + +private walkTree( + node: WorkspaceSplit, + visitor: TreeVisitor +): T | undefined { + for (let i = 0; i < node.children.length; i++) { + const child = node.children[i] + const result = visitor(child, i, node) + if (result !== undefined) return result + + if (isWorkspaceSplit(child)) { + const nested = this.walkTree(child, visitor) + if (nested !== undefined) return nested + } + } + return undefined +} +``` + +--- + +### CR-005: DRY Violation - Button Styles + +**Files**: +- `src/components/workspaceList.component.scss:15-85` +- `src/components/workspaceEditor.component.scss:183-211` +- `src/components/paneEditor.component.scss:90-120` + +**Priority**: P1 - Fix soon + +**Problem**: Each component defines its own button styles instead of using shared mixins from `_mixins.scss`. + +**Fix**: Use existing `@mixin toolbar-btn` consistently: +```scss +.btn-primary { + @include toolbar-btn; + @include btn-success; +} + +.btn-ghost { + @include toolbar-btn; + background: transparent; +} + +.btn-danger { + @include toolbar-btn; + color: var(--theme-danger); +} +``` + +--- + +### CR-006: Inconsistent Error Handling + +**File**: `src/services/workspaceEditor.service.ts:34-40` +**Priority**: P1 - Fix soon + +**Problem**: `saveWorkspaces()` returns boolean but callers don't check the result. + +```typescript +async saveWorkspaces(workspaces: Workspace[]): Promise { + if (!this.config.store?.[CONFIG_KEY]) { + return false // Silent failure - callers don't check + } + // ... +} +``` + +**Impact**: `addWorkspace`, `updateWorkspace`, `deleteWorkspace` may silently fail. + +**Fix**: Either throw exceptions or ensure all callers handle the boolean return value: +```typescript +async saveWorkspaces(workspaces: Workspace[]): Promise { + if (!this.config.store?.[CONFIG_KEY]) { + throw new Error('Config store not initialized') + } + // ... +} +``` + +--- + +### CR-007: Missing Profile Cache Invalidation + +**File**: `src/services/workspaceEditor.service.ts:26-28` +**Priority**: P1 - Fix soon + +**Problem**: Profile cache is never invalidated if user adds/removes profiles during runtime. + +```typescript +private async cacheProfiles(): Promise { + this.cachedProfiles = (await this.profilesService.getProfiles()) as TabbyProfile[] +} +``` + +**Fix**: Add cache invalidation or make cache time-limited: +```typescript +private cachedProfiles: TabbyProfile[] | null = null +private cacheTimestamp: number = 0 +private readonly CACHE_TTL = 30000 // 30 seconds + +private async getProfiles(): Promise { + const now = Date.now() + if (!this.cachedProfiles || now - this.cacheTimestamp > this.CACHE_TTL) { + this.cachedProfiles = await this.profilesService.getProfiles() + this.cacheTimestamp = now + } + return this.cachedProfiles +} +``` + +--- + +### CR-008: Manual Change Detection Overuse + +**File**: `src/components/workspaceList.component.ts` +**Priority**: P2 - Refactor when possible + +**Problem**: Component calls `cdr.detectChanges()` in 5 different places instead of using proper change detection strategy. + +**Fix**: Use `ChangeDetectionStrategy.OnPush` and rely on immutable data patterns: +```typescript +@Component({ + selector: 'workspace-list', + changeDetection: ChangeDetectionStrategy.OnPush, + // ... +}) +``` + +--- + +## 🟡 Minor Issues + +### CR-009: Missing JSDoc Documentation + +**Files**: +- `src/models/workspace.model.ts` - Factory functions lack documentation +- `src/services/workspaceEditor.service.ts` - Public methods lack documentation + +**Priority**: P2 - Improve when touching these files + +**Fix**: Add JSDoc to all public APIs: +```typescript +/** + * Creates a new workspace with default configuration. + * @param name - Display name for the workspace + * @returns A new Workspace instance with generated UUID + */ +export function createDefaultWorkspace(name?: string): Workspace { + // ... +} +``` + +--- + +### CR-010: Magic Numbers and Strings + +**Files**: +- `src/providers/toolbar.provider.ts:122` - `'__settings__'` +- `src/components/splitPreview.component.scss:6` - `height: 140px` +- `src/components/splitPreview.component.scss:24` - `rgba(255, 255, 255, 0.02)` + +**Priority**: P3 - Nice to have + +**Fix**: Extract to constants: +```typescript +// constants.ts +export const COMMANDS = { + SETTINGS: '__settings__' +} as const + +// _variables.scss +$preview-height: 140px; +$overlay-bg: rgba(255, 255, 255, 0.02); +``` + +--- + +### CR-011: Inconsistent Naming Conventions + +**Files**: Multiple components + +**Priority**: P3 - Nice to have + +**Problem**: +- Boolean getters: `get hasUnsavedChanges()` vs methods `canRemovePane()` +- RxJS streams don't use `$` suffix convention + +**Fix**: Standardize on one pattern: +- Boolean state: use getters (`get isValid()`, `get hasChanges()`) +- Boolean actions: use methods (`canRemove()`, `shouldUpdate()`) +- RxJS streams: use `$` suffix (`tabOpened$`, `config$`) + +--- + +### CR-012: Over-engineered Focus Logic + +**File**: `src/components/workspaceEditor.component.ts:72-80` +**Priority**: P3 - Nice to have + +**Problem**: Unnecessary combination of `requestAnimationFrame` and `setTimeout`: +```typescript +private focusNameInput(): void { + requestAnimationFrame(() => { + setTimeout(() => { + // ... + }, 0) + }) +} +``` + +**Fix**: Simple `setTimeout(0)` is sufficient: +```typescript +private focusNameInput(): void { + setTimeout(() => { + this.nameInput?.nativeElement?.focus() + this.nameInput?.nativeElement?.select() + }, 0) +} +``` + +--- + +### CR-013: Unused SCSS Mixins + +**File**: `src/styles/_mixins.scss` +**Priority**: P3 - Nice to have + +**Problem**: Unused mixins: +- `interactive-card` (line 70) +- `icon-btn-opacity` (line 115) + +**Fix**: Remove or document as planned for future use. + +--- + +### CR-014: Inefficient Deep Clone + +**File**: `src/components/workspaceList.component.ts:65` +**Priority**: P3 - Nice to have + +**Problem**: Using `JSON.parse(JSON.stringify())` for deep cloning loses type info and is slow. + +**Fix**: Use typed deep clone utility: +```typescript +function deepClone(obj: T): T { + if (Array.isArray(obj)) { + return obj.map(item => deepClone(item)) as T + } + if (obj !== null && typeof obj === 'object') { + const cloned = {} as T + for (const key in obj) { + cloned[key] = deepClone(obj[key]) + } + return cloned + } + return obj +} +``` + +--- + +## Fix Priority for Next Release + +### P0 - Must Fix +- [ ] CR-001: Memory Leak in StartupCommandService +- [ ] CR-002: Race Condition in Shell Initialization +- [ ] CR-003: Unsafe Type Casts + +### P1 - Should Fix +- [ ] CR-004: DRY Violation - Tree Walking +- [ ] CR-005: DRY Violation - Button Styles +- [ ] CR-006: Error Handling +- [ ] CR-007: Profile Cache Invalidation + +### P2 - Nice to Have +- [ ] CR-008: Change Detection Strategy +- [ ] CR-009: JSDoc Documentation + +### P3 - Future Improvement +- [ ] CR-010: Magic Numbers/Strings +- [ ] CR-011: Naming Conventions +- [ ] CR-012: Over-engineered Focus +- [ ] CR-013: Unused Mixins +- [ ] CR-014: Deep Clone Performance From d99e554c72d157322e14b53d1310e9cf45fc9ba5 Mon Sep 17 00:00:00 2001 From: halilc4 Date: Thu, 15 Jan 2026 17:19:30 +0100 Subject: [PATCH 09/18] fix: resolve critical issues from code review (CR-001, CR-002, CR-003) CR-001: Remove misleading ngOnDestroy from StartupCommandService - Service is module-level singleton, ngOnDestroy was never called - Added JSDoc documenting intentional singleton behavior - Removed unused Subscription variable CR-002: Fix race condition in shell initialization - Added timeout(2000) to prevent infinite wait - Added catchError for graceful fallback on timeout/error - Removed switchMap (was incorrect usage) - Extracted sendCommand helper to reduce duplication - Added setTabTitle helper method CR-003: Add type guards for workspace detection - Added RecoveryTokenWithWorkspace interface - Created type-safe getRecoveryWorkspaceId helper - Use startsWith + endsWith instead of includes() for strict matching - Added profilePrefix constant for clarity Co-Authored-By: Claude Opus 4.5 --- src/providers/toolbar.provider.ts | 25 +++++++++-- src/services/startupCommand.service.ts | 57 ++++++++++++++------------ 2 files changed, 52 insertions(+), 30 deletions(-) diff --git a/src/providers/toolbar.provider.ts b/src/providers/toolbar.provider.ts index 733e214..1d1250f 100644 --- a/src/providers/toolbar.provider.ts +++ b/src/providers/toolbar.provider.ts @@ -18,6 +18,11 @@ const ICON_BOLT = `` import { countPanes } from '../models/workspace.model' +/** Recovery token structure for workspace tabs */ +interface RecoveryTokenWithWorkspace { + workspaceId?: string +} + @Injectable() export class WorkspaceToolbarProvider extends ToolbarButtonProvider { constructor( @@ -64,19 +69,33 @@ export class WorkspaceToolbarProvider extends ToolbarButtonProvider { } } + /** + * Type-safe helper to extract workspace ID from tab's recovery token. + */ + private getRecoveryWorkspaceId(tab: unknown): string | undefined { + if (tab && typeof tab === 'object' && 'recoveryToken' in tab) { + const token = (tab as { recoveryToken?: RecoveryTokenWithWorkspace }).recoveryToken + return token?.workspaceId + } + return undefined + } + private isWorkspaceAlreadyOpen(workspaceId: string): boolean { + const profilePrefix = `split-layout:${CONFIG_KEY}:` + for (const tab of this.app.tabs) { if (tab instanceof SplitTabComponent) { // Strategy 1: Check recoveryToken.workspaceId (for restored tabs) - const token = (tab as any).recoveryToken - if (token?.workspaceId === workspaceId) { + if (this.getRecoveryWorkspaceId(tab) === workspaceId) { return true } // Strategy 2: Check profile ID (for freshly opened tabs) for (const child of tab.getAllTabs()) { if (child instanceof BaseTerminalTabComponent) { - if (child.profile?.id?.includes(`:${workspaceId}`)) { + const profileId = child.profile?.id ?? '' + // Strict matching: prefix + workspaceId at the end + if (profileId.startsWith(profilePrefix) && profileId.endsWith(`:${workspaceId}`)) { return true } } diff --git a/src/services/startupCommand.service.ts b/src/services/startupCommand.service.ts index 49d315c..119b012 100644 --- a/src/services/startupCommand.service.ts +++ b/src/services/startupCommand.service.ts @@ -1,7 +1,8 @@ import { Injectable } from '@angular/core' import { AppService, BaseTabComponent, SplitTabComponent } from 'tabby-core' import { BaseTerminalTabComponent } from 'tabby-terminal' -import { Subscription, first, timer, switchMap } from 'rxjs' +import { first, timeout, of } from 'rxjs' +import { catchError } from 'rxjs/operators' export interface PendingCommand { paneId: string @@ -9,13 +10,21 @@ export interface PendingCommand { originalTitle: string } +/** + * Handles startup commands for workspace panes. + * + * This service listens to tab open events and sends startup commands + * to terminals that match registered pane IDs. + * + * NOTE: This is a module-level singleton that lives for the app lifetime. + * The tabOpened$ subscription intentionally runs forever - no cleanup needed. + */ @Injectable() export class StartupCommandService { private pendingCommands: Map = new Map() - private subscription: Subscription constructor(private app: AppService) { - this.subscription = this.app.tabOpened$.subscribe((tab) => this.onTabOpened(tab)) + this.app.tabOpened$.subscribe((tab) => this.onTabOpened(tab)) } registerCommands(commands: PendingCommand[]): void { @@ -84,35 +93,27 @@ export class StartupCommandService { console.log('[TabbySpaces] Command matched, waiting for shell output...:', fullCommand) + // Unified command sender - reduces duplication + const sendCommand = () => { + console.log('[TabbySpaces] Shell ready, sending command:', fullCommand) + terminalTab.sendInput(fullCommand + '\r') + this.clearProfileArgs(terminalTab) + this.setTabTitle(terminalTab, pending.originalTitle) + } + // Wait for shell to emit first output (prompt), then send command if (terminalTab.session?.output$) { terminalTab.session.output$.pipe( - first(), // Wait for first output (shell prompt) - switchMap(() => timer(100)) // Small buffer after prompt renders + first(), + timeout(2000), // Prevent infinite wait if shell doesn't emit + catchError(() => of(null)) // Fallback on timeout/error ).subscribe(() => { - console.log('[TabbySpaces] Shell ready, sending command:', fullCommand) - terminalTab.sendInput(fullCommand + '\r') - - // Clear profile args to prevent native splits from re-running command - this.clearProfileArgs(terminalTab) - - // Set tab title to workspace name - terminalTab.setTitle(pending.originalTitle) - terminalTab.customTitle = pending.originalTitle + // Small delay after prompt renders + setTimeout(sendCommand, 100) }) } else { console.log('[TabbySpaces] No session.output$, falling back to timeout') - // Fallback if session not available yet - setTimeout(() => { - terminalTab.sendInput(fullCommand + '\r') - - // Clear profile args to prevent native splits from re-running command - this.clearProfileArgs(terminalTab) - - // Set tab title to workspace name - terminalTab.setTitle(pending.originalTitle) - terminalTab.customTitle = pending.originalTitle - }, 500) + setTimeout(sendCommand, 500) } } @@ -131,7 +132,9 @@ export class StartupCommandService { } } - ngOnDestroy(): void { - this.subscription?.unsubscribe() + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private setTabTitle(terminalTab: BaseTerminalTabComponent, title: string): void { + terminalTab.setTitle(title) + terminalTab.customTitle = title } } From 86f02b40097061738ecba87fd7c6cd3599733568 Mon Sep 17 00:00:00 2001 From: halilc4 Date: Thu, 15 Jan 2026 17:19:54 +0100 Subject: [PATCH 10/18] docs: mark critical issues as fixed in CODE_REVIEW.md Co-Authored-By: Claude Opus 4.5 --- CODE_REVIEW.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CODE_REVIEW.md b/CODE_REVIEW.md index 3042ddc..d587210 100644 --- a/CODE_REVIEW.md +++ b/CODE_REVIEW.md @@ -423,9 +423,9 @@ function deepClone(obj: T): T { ## Fix Priority for Next Release ### P0 - Must Fix -- [ ] CR-001: Memory Leak in StartupCommandService -- [ ] CR-002: Race Condition in Shell Initialization -- [ ] CR-003: Unsafe Type Casts +- [x] CR-001: Memory Leak in StartupCommandService ✅ Fixed in d99e554 +- [x] CR-002: Race Condition in Shell Initialization ✅ Fixed in d99e554 +- [x] CR-003: Unsafe Type Casts ✅ Fixed in d99e554 ### P1 - Should Fix - [ ] CR-004: DRY Violation - Tree Walking From 3348d7d6c24cf8399c708e05b39883fab064f42e Mon Sep 17 00:00:00 2001 From: halilc4 Date: Thu, 15 Jan 2026 17:46:18 +0100 Subject: [PATCH 11/18] refactor: complete code review fixes and cleanup - Fix memory leak in StartupCommandService (CR-001) - Fix race condition in shell initialization (CR-002) - Add type-safe recovery token handling (CR-003) - Extract generic walkTree utility for DRY (CR-004) - Consolidate button styles with shared mixins (CR-005) - Add proper error handling with exceptions (CR-006) - Add TTL-based profile cache invalidation (CR-007) - Use OnPush change detection strategy (CR-008) - Add JSDoc documentation to public APIs (CR-009) - Extract magic numbers to SCSS variables (CR-010) - Add deepClone() utility function (CR-014) - Migrate SCSS from @import to @use/@forward (CR-015) - Remove unused SCSS mixins (CR-016) - Delete CODE_REVIEW.md (all issues resolved) Co-Authored-By: Claude Opus 4.5 --- .claude/settings.local.json | 3 +- .env.example | 4 - CODE_REVIEW.md | 445 ------------------ src/components/paneEditor.component.scss | 29 +- src/components/paneEditor.component.ts | 3 +- src/components/splitPreview.component.scss | 14 +- src/components/splitPreview.component.ts | 3 +- src/components/workspaceEditor.component.scss | 50 +- src/components/workspaceEditor.component.ts | 133 +++--- src/components/workspaceList.component.scss | 2 +- src/components/workspaceList.component.ts | 7 +- src/models/workspace.model.ts | 49 ++ src/providers/toolbar.provider.ts | 7 +- src/services/workspaceEditor.service.ts | 84 +++- src/styles/_index.scss | 4 +- src/styles/_mixins.scss | 111 +++-- src/styles/_variables.scss | 8 + 17 files changed, 281 insertions(+), 675 deletions(-) delete mode 100644 .env.example delete mode 100644 CODE_REVIEW.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 1ae27db..abc685b 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -31,7 +31,8 @@ "Bash(git log:*)", "Bash(ls -la \"C:\\\\Users\\\\halil\\\\tabbyspaces\\\\screenshots\"\" 2>nul || echo \"Directory not found \")", "Bash(dir:*)", - "Bash(cmd.exe /c start \"\" \"C:\\\\Program Files \\(x86\\)\\\\Tabby\\\\Tabby.exe\" --remote-debugging-port=9222)" + "Bash(cmd.exe /c start \"\" \"C:\\\\Program Files \\(x86\\)\\\\Tabby\\\\Tabby.exe\" --remote-debugging-port=9222)", + "Bash(ls:*)" ] }, "enableAllProjectMcpServers": true, diff --git a/.env.example b/.env.example deleted file mode 100644 index 8dde061..0000000 --- a/.env.example +++ /dev/null @@ -1,4 +0,0 @@ -# NPM token for publishing -# Get yours from: https://www.npmjs.com/settings/YOUR_USERNAME/tokens -# Create "Automation" type token for CI/CD -NPM_TOKEN=npm_xxxxxxxxxxxxxxxxxxxx diff --git a/CODE_REVIEW.md b/CODE_REVIEW.md deleted file mode 100644 index d587210..0000000 --- a/CODE_REVIEW.md +++ /dev/null @@ -1,445 +0,0 @@ -# Code Review - TabbySpaces - -**Date**: 2026-01-15 -**Reviewer**: Claude Opus 4.5 -**Scope**: Full codebase review (TypeScript, SCSS, Angular patterns) - ---- - -## Summary - -| Severity | Count | Status | -|----------|-------|--------| -| 🔴 Critical | 3 | Open | -| 🟠 Moderate | 5 | Open | -| 🟡 Minor | 6 | Open | - ---- - -## 🔴 Critical Issues - -### CR-001: Memory Leak in StartupCommandService - -**File**: `src/services/startupCommand.service.ts:17-18, 134-136` -**Priority**: P0 - Fix immediately - -**Problem**: The service subscribes to `app.tabOpened$` in the constructor but `ngOnDestroy()` is never called because services are not Angular components with lifecycle hooks. - -```typescript -export class StartupCommandService { - private subscription: Subscription - - constructor(private app: AppService) { - this.subscription = this.app.tabOpened$.subscribe(...) - } - - ngOnDestroy(): void { // NEVER CALLED - not an Angular lifecycle - this.subscription?.unsubscribe() - } -} -``` - -**Impact**: Subscription leaks for the entire application lifetime. Multiple subscriptions accumulate if service is re-provided. - -**Fix**: Use `DestroyRef` with `takeUntilDestroyed()` (Angular 16+): -```typescript -constructor(private app: AppService, private destroyRef: DestroyRef) { - this.app.tabOpened$.pipe( - takeUntilDestroyed(this.destroyRef) - ).subscribe((tab) => this.onTabOpened(tab)) -} -``` - ---- - -### CR-002: Race Condition in Shell Initialization - -**File**: `src/services/startupCommand.service.ts:88-116` -**Priority**: P0 - Fix immediately - -**Problem**: Mixing RxJS subscriptions with `setTimeout` creates unpredictable race conditions. - -```typescript -if (terminalTab.session?.output$) { - terminalTab.session.output$.pipe( - first(), - switchMap(() => timer(100)) - ).subscribe(() => { - terminalTab.sendInput(fullCommand + '\r') - }) -} else { - setTimeout(() => { - terminalTab.sendInput(fullCommand + '\r') - }, 500) -} -``` - -**Impact**: -- Commands may not send if `output$` emits before subscription completes -- No error handling if session closes unexpectedly -- `switchMap` can cancel subscriptions on rapid tab opens - -**Fix**: Consolidate async logic with proper error handling: -```typescript -const sendCommand = () => { - terminalTab.sendInput(fullCommand + '\r') - this.clearProfileArgs(terminalTab) - terminalTab.setTitle(pending.originalTitle) -} - -const waitForReady$ = terminalTab.session?.output$ - ? terminalTab.session.output$.pipe(first(), delay(100)) - : timer(500) - -waitForReady$.subscribe({ - next: sendCommand, - error: () => sendCommand() // Fallback on error -}) -``` - ---- - -### CR-003: Unsafe Type Casts in Duplicate Detection - -**File**: `src/providers/toolbar.provider.ts:71, 79` -**Priority**: P0 - Fix immediately - -**Problem**: Using `any` cast hides potential runtime errors. - -```typescript -const token = (tab as any).recoveryToken // UNSAFE CAST -if (child.profile?.id?.includes(`:${workspaceId}`)) // UNSAFE -``` - -**Impact**: -- If `recoveryToken` doesn't exist, code continues silently with `undefined` -- `.includes()` for ID matching is brittle (could match partial IDs) - -**Fix**: Add proper type guards: -```typescript -interface TabWithRecoveryToken { - recoveryToken?: { workspaceId?: string } -} - -const getWorkspaceId = (tab: unknown): string | undefined => { - if (tab && typeof tab === 'object' && 'recoveryToken' in tab) { - return (tab as TabWithRecoveryToken).recoveryToken?.workspaceId - } - return undefined -} - -// Use strict ID matching -const profileId = child.profile?.id ?? '' -if (profileId.startsWith(`split-layout:${CONFIG_KEY}:`) && - profileId.endsWith(`:${workspaceId}`)) { - return true -} -``` - ---- - -## 🟠 Moderate Issues - -### CR-004: DRY Violation - Tree Walking Logic - -**File**: `src/components/workspaceEditor.component.ts` -**Priority**: P1 - Fix soon - -**Problem**: Tree traversal logic is duplicated in 4+ methods: -- `splitPaneInTree()` (lines 194-229) -- `removePaneFromTree()` (lines 244-273) -- `updatePaneInTree()` (lines 179-192) -- `addPaneInTree()` (lines 316-366) - -**Fix**: Extract generic tree walker utility: -```typescript -type TreeVisitor = ( - child: WorkspaceSplit | WorkspacePane, - index: number, - parent: WorkspaceSplit -) => T | undefined - -private walkTree( - node: WorkspaceSplit, - visitor: TreeVisitor -): T | undefined { - for (let i = 0; i < node.children.length; i++) { - const child = node.children[i] - const result = visitor(child, i, node) - if (result !== undefined) return result - - if (isWorkspaceSplit(child)) { - const nested = this.walkTree(child, visitor) - if (nested !== undefined) return nested - } - } - return undefined -} -``` - ---- - -### CR-005: DRY Violation - Button Styles - -**Files**: -- `src/components/workspaceList.component.scss:15-85` -- `src/components/workspaceEditor.component.scss:183-211` -- `src/components/paneEditor.component.scss:90-120` - -**Priority**: P1 - Fix soon - -**Problem**: Each component defines its own button styles instead of using shared mixins from `_mixins.scss`. - -**Fix**: Use existing `@mixin toolbar-btn` consistently: -```scss -.btn-primary { - @include toolbar-btn; - @include btn-success; -} - -.btn-ghost { - @include toolbar-btn; - background: transparent; -} - -.btn-danger { - @include toolbar-btn; - color: var(--theme-danger); -} -``` - ---- - -### CR-006: Inconsistent Error Handling - -**File**: `src/services/workspaceEditor.service.ts:34-40` -**Priority**: P1 - Fix soon - -**Problem**: `saveWorkspaces()` returns boolean but callers don't check the result. - -```typescript -async saveWorkspaces(workspaces: Workspace[]): Promise { - if (!this.config.store?.[CONFIG_KEY]) { - return false // Silent failure - callers don't check - } - // ... -} -``` - -**Impact**: `addWorkspace`, `updateWorkspace`, `deleteWorkspace` may silently fail. - -**Fix**: Either throw exceptions or ensure all callers handle the boolean return value: -```typescript -async saveWorkspaces(workspaces: Workspace[]): Promise { - if (!this.config.store?.[CONFIG_KEY]) { - throw new Error('Config store not initialized') - } - // ... -} -``` - ---- - -### CR-007: Missing Profile Cache Invalidation - -**File**: `src/services/workspaceEditor.service.ts:26-28` -**Priority**: P1 - Fix soon - -**Problem**: Profile cache is never invalidated if user adds/removes profiles during runtime. - -```typescript -private async cacheProfiles(): Promise { - this.cachedProfiles = (await this.profilesService.getProfiles()) as TabbyProfile[] -} -``` - -**Fix**: Add cache invalidation or make cache time-limited: -```typescript -private cachedProfiles: TabbyProfile[] | null = null -private cacheTimestamp: number = 0 -private readonly CACHE_TTL = 30000 // 30 seconds - -private async getProfiles(): Promise { - const now = Date.now() - if (!this.cachedProfiles || now - this.cacheTimestamp > this.CACHE_TTL) { - this.cachedProfiles = await this.profilesService.getProfiles() - this.cacheTimestamp = now - } - return this.cachedProfiles -} -``` - ---- - -### CR-008: Manual Change Detection Overuse - -**File**: `src/components/workspaceList.component.ts` -**Priority**: P2 - Refactor when possible - -**Problem**: Component calls `cdr.detectChanges()` in 5 different places instead of using proper change detection strategy. - -**Fix**: Use `ChangeDetectionStrategy.OnPush` and rely on immutable data patterns: -```typescript -@Component({ - selector: 'workspace-list', - changeDetection: ChangeDetectionStrategy.OnPush, - // ... -}) -``` - ---- - -## 🟡 Minor Issues - -### CR-009: Missing JSDoc Documentation - -**Files**: -- `src/models/workspace.model.ts` - Factory functions lack documentation -- `src/services/workspaceEditor.service.ts` - Public methods lack documentation - -**Priority**: P2 - Improve when touching these files - -**Fix**: Add JSDoc to all public APIs: -```typescript -/** - * Creates a new workspace with default configuration. - * @param name - Display name for the workspace - * @returns A new Workspace instance with generated UUID - */ -export function createDefaultWorkspace(name?: string): Workspace { - // ... -} -``` - ---- - -### CR-010: Magic Numbers and Strings - -**Files**: -- `src/providers/toolbar.provider.ts:122` - `'__settings__'` -- `src/components/splitPreview.component.scss:6` - `height: 140px` -- `src/components/splitPreview.component.scss:24` - `rgba(255, 255, 255, 0.02)` - -**Priority**: P3 - Nice to have - -**Fix**: Extract to constants: -```typescript -// constants.ts -export const COMMANDS = { - SETTINGS: '__settings__' -} as const - -// _variables.scss -$preview-height: 140px; -$overlay-bg: rgba(255, 255, 255, 0.02); -``` - ---- - -### CR-011: Inconsistent Naming Conventions - -**Files**: Multiple components - -**Priority**: P3 - Nice to have - -**Problem**: -- Boolean getters: `get hasUnsavedChanges()` vs methods `canRemovePane()` -- RxJS streams don't use `$` suffix convention - -**Fix**: Standardize on one pattern: -- Boolean state: use getters (`get isValid()`, `get hasChanges()`) -- Boolean actions: use methods (`canRemove()`, `shouldUpdate()`) -- RxJS streams: use `$` suffix (`tabOpened$`, `config$`) - ---- - -### CR-012: Over-engineered Focus Logic - -**File**: `src/components/workspaceEditor.component.ts:72-80` -**Priority**: P3 - Nice to have - -**Problem**: Unnecessary combination of `requestAnimationFrame` and `setTimeout`: -```typescript -private focusNameInput(): void { - requestAnimationFrame(() => { - setTimeout(() => { - // ... - }, 0) - }) -} -``` - -**Fix**: Simple `setTimeout(0)` is sufficient: -```typescript -private focusNameInput(): void { - setTimeout(() => { - this.nameInput?.nativeElement?.focus() - this.nameInput?.nativeElement?.select() - }, 0) -} -``` - ---- - -### CR-013: Unused SCSS Mixins - -**File**: `src/styles/_mixins.scss` -**Priority**: P3 - Nice to have - -**Problem**: Unused mixins: -- `interactive-card` (line 70) -- `icon-btn-opacity` (line 115) - -**Fix**: Remove or document as planned for future use. - ---- - -### CR-014: Inefficient Deep Clone - -**File**: `src/components/workspaceList.component.ts:65` -**Priority**: P3 - Nice to have - -**Problem**: Using `JSON.parse(JSON.stringify())` for deep cloning loses type info and is slow. - -**Fix**: Use typed deep clone utility: -```typescript -function deepClone(obj: T): T { - if (Array.isArray(obj)) { - return obj.map(item => deepClone(item)) as T - } - if (obj !== null && typeof obj === 'object') { - const cloned = {} as T - for (const key in obj) { - cloned[key] = deepClone(obj[key]) - } - return cloned - } - return obj -} -``` - ---- - -## Fix Priority for Next Release - -### P0 - Must Fix -- [x] CR-001: Memory Leak in StartupCommandService ✅ Fixed in d99e554 -- [x] CR-002: Race Condition in Shell Initialization ✅ Fixed in d99e554 -- [x] CR-003: Unsafe Type Casts ✅ Fixed in d99e554 - -### P1 - Should Fix -- [ ] CR-004: DRY Violation - Tree Walking -- [ ] CR-005: DRY Violation - Button Styles -- [ ] CR-006: Error Handling -- [ ] CR-007: Profile Cache Invalidation - -### P2 - Nice to Have -- [ ] CR-008: Change Detection Strategy -- [ ] CR-009: JSDoc Documentation - -### P3 - Future Improvement -- [ ] CR-010: Magic Numbers/Strings -- [ ] CR-011: Naming Conventions -- [ ] CR-012: Over-engineered Focus -- [ ] CR-013: Unused Mixins -- [ ] CR-014: Deep Clone Performance diff --git a/src/components/paneEditor.component.scss b/src/components/paneEditor.component.scss index a74ab02..bffa6f6 100644 --- a/src/components/paneEditor.component.scss +++ b/src/components/paneEditor.component.scss @@ -1,4 +1,4 @@ -@import '../styles/index'; +@use '../styles/index' as *; // Inline pane details panel .pane-details { @@ -87,34 +87,11 @@ select.form-control { padding-top: $spacing-lg; border-top: 1px solid var(--theme-border); - .btn { - display: inline-flex; - align-items: center; - gap: $spacing-sm; - padding: $spacing-sm $spacing-lg; - font-size: $font-sm; - border-radius: $radius-sm; - cursor: pointer; - transition: all $transition-fast; - } - .btn-ghost { - background: transparent; - border: 1px solid var(--theme-border); - color: var(--theme-fg); - - &:hover { - background: var(--theme-bg-more); - } + @include btn-ghost; } .btn-primary { - background: var(--theme-primary); - border: 1px solid var(--theme-primary); - color: white; - - &:hover { - filter: brightness(1.1); - } + @include btn-primary; } } diff --git a/src/components/paneEditor.component.ts b/src/components/paneEditor.component.ts index 12c8bae..3d8b312 100644 --- a/src/components/paneEditor.component.ts +++ b/src/components/paneEditor.component.ts @@ -1,10 +1,11 @@ -import { Component, Input, Output, EventEmitter, OnInit, HostListener } from '@angular/core' +import { Component, Input, Output, EventEmitter, OnInit, HostListener, ChangeDetectionStrategy } from '@angular/core' import { WorkspacePane, TabbyProfile } from '../models/workspace.model' @Component({ selector: 'pane-editor', template: require('./paneEditor.component.pug'), styles: [require('./paneEditor.component.scss')], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class PaneEditorComponent implements OnInit { @Input() pane!: WorkspacePane diff --git a/src/components/splitPreview.component.scss b/src/components/splitPreview.component.scss index 8fa72b8..60752e1 100644 --- a/src/components/splitPreview.component.scss +++ b/src/components/splitPreview.component.scss @@ -1,9 +1,9 @@ -@import '../styles/index'; +@use '../styles/index' as *; .split-preview { display: flex; width: 100%; - height: 140px; + height: $preview-height; gap: $spacing-sm; border-radius: $radius-md; overflow: hidden; @@ -21,7 +21,7 @@ &.nested { height: auto; border: 1px dashed var(--theme-fg-more); - background: rgba(255, 255, 255, 0.02); + background: $nested-split-bg; padding: $spacing-sm; border-radius: $radius-sm; } @@ -46,8 +46,8 @@ border-color: var(--theme-primary); background: linear-gradient( to bottom, - rgba(59, 130, 246, 0.08), - rgba(59, 130, 246, 0.04) + $selected-pane-gradient-start, + $selected-pane-gradient-end ); } } @@ -140,7 +140,9 @@ } .context-menu-item { - @include flex-row($spacing-lg); + display: flex; + align-items: center; + gap: $spacing-lg; width: 100%; padding: $spacing-md $spacing-lg; border: none; diff --git a/src/components/splitPreview.component.ts b/src/components/splitPreview.component.ts index 874c762..2f4fa1d 100644 --- a/src/components/splitPreview.component.ts +++ b/src/components/splitPreview.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core' +import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core' import { WorkspaceSplit, WorkspacePane, @@ -10,6 +10,7 @@ import { selector: 'split-preview', template: require('./splitPreview.component.pug'), styles: [require('./splitPreview.component.scss')], + changeDetection: ChangeDetectionStrategy.OnPush, }) export class SplitPreviewComponent { @Input() split!: WorkspaceSplit diff --git a/src/components/workspaceEditor.component.scss b/src/components/workspaceEditor.component.scss index 11ab652..caf6353 100644 --- a/src/components/workspaceEditor.component.scss +++ b/src/components/workspaceEditor.component.scss @@ -1,4 +1,4 @@ -@import '../styles/index'; +@use '../styles/index' as *; // Editor section .editor-section { @@ -181,33 +181,7 @@ } .preview-btn { - width: 24px; - height: 24px; - display: flex; - align-items: center; - justify-content: center; - background: var(--theme-bg); - border: 1px solid var(--theme-border); - border-radius: $radius-sm; - color: var(--theme-fg-more); - cursor: pointer; - font-size: 10px; - transition: all $transition-fast; - - &:hover:not(:disabled) { - border-color: var(--theme-primary); - color: var(--theme-primary); - } - - &.danger:hover:not(:disabled) { - border-color: var(--theme-danger); - color: var(--theme-danger); - } - - &:disabled { - opacity: 0.4; - cursor: not-allowed; - } + @include icon-btn-sm; } // Layout preview area @@ -251,28 +225,12 @@ display: flex; gap: $spacing-md; - .btn { - display: inline-flex; - align-items: center; - gap: $spacing-sm; - padding: $spacing-sm $spacing-lg; - font-size: $font-sm; - border-radius: $radius-sm; - cursor: pointer; - transition: all $transition-fast; - } - .btn-ghost { - background: transparent; - border: 1px solid var(--theme-border); - color: var(--theme-fg); - - &:hover { - background: var(--theme-bg-more); - } + @include btn-ghost; } .btn-success { + @include btn-base; @include btn-success; } diff --git a/src/components/workspaceEditor.component.ts b/src/components/workspaceEditor.component.ts index 0e5eb1c..e697263 100644 --- a/src/components/workspaceEditor.component.ts +++ b/src/components/workspaceEditor.component.ts @@ -8,6 +8,13 @@ import { createDefaultPane, generateUUID, } from '../models/workspace.model' + +interface TreeContext { + node: WorkspaceSplit + index: number + parent: WorkspaceSplit | null + child: WorkspacePane | WorkspaceSplit +} import { WorkspaceEditorService } from '../services/workspaceEditor.service' @Component({ @@ -145,7 +152,7 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni } onPaneSave(pane: WorkspacePane): void { - this.updatePaneInTree(this.workspace.root, pane) + this.updatePaneInTree(pane) this.closePaneEditor() } @@ -176,23 +183,36 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni }, 0) } - private updatePaneInTree(node: WorkspaceSplit, updatedPane: WorkspacePane): boolean { + private walkTree( + node: WorkspaceSplit, + visitor: (ctx: TreeContext) => boolean, + parent: WorkspaceSplit | null = null + ): boolean { for (let i = 0; i < node.children.length; i++) { const child = node.children[i] + const ctx: TreeContext = { node, index: i, parent, child } + if (isWorkspaceSplit(child)) { - if (this.updatePaneInTree(child, updatedPane)) { - return true - } - } else if (child.id === updatedPane.id) { - node.children[i] = updatedPane + if (this.walkTree(child, visitor, node)) return true + } else if (visitor(ctx)) { return true } } return false } + private updatePaneInTree(updatedPane: WorkspacePane): boolean { + return this.walkTree(this.workspace.root, (ctx) => { + if ((ctx.child as WorkspacePane).id === updatedPane.id) { + ctx.node.children[ctx.index] = updatedPane + return true + } + return false + }) + } + splitPane(pane: WorkspacePane, orientation: 'horizontal' | 'vertical'): void { - this.splitPaneInTree(this.workspace.root, pane, orientation) + this.splitPaneInTree(pane, orientation) } splitSelectedPane(orientation: 'horizontal' | 'vertical'): void { @@ -202,30 +222,24 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni } private splitPaneInTree( - node: WorkspaceSplit, targetPane: WorkspacePane, orientation: 'horizontal' | 'vertical' ): boolean { - for (let i = 0; i < node.children.length; i++) { - const child = node.children[i] - if (isWorkspaceSplit(child)) { - if (this.splitPaneInTree(child, targetPane, orientation)) { - return true - } - } else if (child.id === targetPane.id) { + return this.walkTree(this.workspace.root, (ctx) => { + if ((ctx.child as WorkspacePane).id === targetPane.id) { const newPane = createDefaultPane() - newPane.profileId = child.profileId // Copy profile from source pane + newPane.profileId = (ctx.child as WorkspacePane).profileId const newSplit: WorkspaceSplit = { orientation, ratios: [0.5, 0.5], - children: [child, newPane], + children: [ctx.child, newPane], } - node.children[i] = newSplit - this.recalculateRatios(node) + ctx.node.children[ctx.index] = newSplit + this.recalculateRatios(ctx.node) return true } - } - return false + return false + }) } removePane(pane: WorkspacePane): void { @@ -306,63 +320,56 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni if (!this.selectedPaneId) return const pane = this.findPaneById(this.selectedPaneId) if (!pane) return - this.addPaneInTree(this.workspace.root, pane, direction, null) + this.addPaneInTree(pane, direction) } addPaneFromEvent(pane: WorkspacePane, direction: 'left' | 'right' | 'top' | 'bottom'): void { - this.addPaneInTree(this.workspace.root, pane, direction, null) + this.addPaneInTree(pane, direction) } private addPaneInTree( - node: WorkspaceSplit, targetPane: WorkspacePane, - direction: 'left' | 'right' | 'top' | 'bottom', - parentNode: WorkspaceSplit | null + direction: 'left' | 'right' | 'top' | 'bottom' ): boolean { const isHorizontalAdd = direction === 'left' || direction === 'right' const isBefore = direction === 'left' || direction === 'top' const targetOrientation = isHorizontalAdd ? 'horizontal' : 'vertical' - for (let i = 0; i < node.children.length; i++) { - const child = node.children[i] - - if (isWorkspaceSplit(child)) { - if (this.addPaneInTree(child, targetPane, direction, node)) return true - } else if (child.id === targetPane.id) { - const newPane = createDefaultPane() - newPane.profileId = child.profileId - - if (node.orientation === targetOrientation) { - // Same orientation: add as sibling - const insertIndex = isBefore ? i : i + 1 - node.children.splice(insertIndex, 0, newPane) - this.recalculateRatios(node) - } else { - // Different orientation: wrap entire node in new split - const nodeCopy: WorkspaceSplit = { - orientation: node.orientation, - ratios: [...node.ratios], - children: [...node.children] - } - const wrapper: WorkspaceSplit = { - orientation: targetOrientation, - ratios: [0.5, 0.5], - children: isBefore ? [newPane, nodeCopy] : [nodeCopy, newPane] - } + return this.walkTree(this.workspace.root, (ctx) => { + if ((ctx.child as WorkspacePane).id !== targetPane.id) return false + + const newPane = createDefaultPane() + newPane.profileId = (ctx.child as WorkspacePane).profileId + + if (ctx.node.orientation === targetOrientation) { + // Same orientation: add as sibling + const insertIndex = isBefore ? ctx.index : ctx.index + 1 + ctx.node.children.splice(insertIndex, 0, newPane) + this.recalculateRatios(ctx.node) + } else { + // Different orientation: wrap entire node in new split + const nodeCopy: WorkspaceSplit = { + orientation: ctx.node.orientation, + ratios: [...ctx.node.ratios], + children: [...ctx.node.children] + } + const wrapper: WorkspaceSplit = { + orientation: targetOrientation, + ratios: [0.5, 0.5], + children: isBefore ? [newPane, nodeCopy] : [nodeCopy, newPane] + } - if (node === this.workspace.root) { - this.workspace.root = wrapper - } else if (parentNode) { - const nodeIndex = parentNode.children.indexOf(node) - if (nodeIndex !== -1) { - parentNode.children[nodeIndex] = wrapper - } + if (ctx.node === this.workspace.root) { + this.workspace.root = wrapper + } else if (ctx.parent) { + const nodeIndex = ctx.parent.children.indexOf(ctx.node) + if (nodeIndex !== -1) { + ctx.parent.children[nodeIndex] = wrapper } } - return true } - } - return false + return true + }) } } diff --git a/src/components/workspaceList.component.scss b/src/components/workspaceList.component.scss index 93edaf3..779e9ef 100644 --- a/src/components/workspaceList.component.scss +++ b/src/components/workspaceList.component.scss @@ -1,4 +1,4 @@ -@import '../styles/index'; +@use '../styles/index' as *; .workspace-list-container { padding: $spacing-2xl; diff --git a/src/components/workspaceList.component.ts b/src/components/workspaceList.component.ts index 36f3325..88efa1a 100644 --- a/src/components/workspaceList.component.ts +++ b/src/components/workspaceList.component.ts @@ -9,9 +9,12 @@ import { WorkspaceSplit, countPanes, createDefaultWorkspace, + deepClone, isWorkspaceSplit, } from '../models/workspace.model' +const SETTINGS_MAX_WIDTH = '876px' + @Component({ selector: 'workspace-list', template: require('./workspaceList.component.pug'), @@ -48,7 +51,7 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit setTimeout(() => { const parent = this.elementRef.nativeElement.closest('settings-tab-body') as HTMLElement if (parent) { - parent.style.maxWidth = '876px' + parent.style.maxWidth = SETTINGS_MAX_WIDTH } }, 0) } @@ -62,7 +65,7 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit selectWorkspace(workspace: Workspace): void { this.isCreatingNew = false this.selectedWorkspace = workspace - this.editingWorkspace = JSON.parse(JSON.stringify(workspace)) + this.editingWorkspace = deepClone(workspace) } isSelected(workspace: Workspace): boolean { diff --git a/src/models/workspace.model.ts b/src/models/workspace.model.ts index 7625842..6d5b5c7 100644 --- a/src/models/workspace.model.ts +++ b/src/models/workspace.model.ts @@ -78,10 +78,19 @@ export interface Workspace { launchOnStartup?: boolean } +/** + * Type guard to check if a node is a WorkspaceSplit. + * @param node - The node to check + * @returns True if the node is a WorkspaceSplit + */ export function isWorkspaceSplit(node: WorkspacePane | WorkspaceSplit): node is WorkspaceSplit { return 'orientation' in node && 'children' in node } +/** + * Creates a new pane with default configuration. + * @returns A new WorkspacePane with generated UUID and empty settings + */ export function createDefaultPane(): WorkspacePane { return { id: generateUUID(), @@ -91,6 +100,11 @@ export function createDefaultPane(): WorkspacePane { } } +/** + * Creates a new split with two default panes. + * @param orientation - Split direction ('horizontal' or 'vertical'), defaults to 'horizontal' + * @returns A new WorkspaceSplit with two panes at 50/50 ratio + */ export function createDefaultSplit(orientation: 'horizontal' | 'vertical' = 'horizontal'): WorkspaceSplit { return { orientation, @@ -118,14 +132,21 @@ const WORKSPACE_ICONS = [ 'bug', 'wrench', 'cube', 'layer-group', 'sitemap', 'project-diagram' ] +/** Returns a random color from the workspace color palette. */ export function getRandomColor(): string { return WORKSPACE_COLORS[Math.floor(Math.random() * WORKSPACE_COLORS.length)] } +/** Returns a random icon from the workspace icon set. */ export function getRandomIcon(): string { return WORKSPACE_ICONS[Math.floor(Math.random() * WORKSPACE_ICONS.length)] } +/** + * Creates a new workspace with default configuration. + * @param name - Display name for the workspace (optional) + * @returns A new Workspace with generated UUID, random icon/color, and a default split + */ export function createDefaultWorkspace(name: string = ''): Workspace { return { id: generateUUID(), @@ -137,6 +158,7 @@ export function createDefaultWorkspace(name: string = ''): Workspace { } } +/** Generates a random UUID v4 string. */ export function generateUUID(): string { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { const r = (Math.random() * 16) | 0 @@ -145,9 +167,36 @@ export function generateUUID(): string { }) } +/** + * Recursively counts the total number of panes in a split tree. + * @param node - The root node to count from + * @returns Total number of panes in the tree + */ export function countPanes(node: WorkspacePane | WorkspaceSplit): number { if (isWorkspaceSplit(node)) { return node.children.reduce((sum, child) => sum + countPanes(child), 0) } return 1 } + +/** + * Creates a deep clone of an object, preserving type information. + * More efficient than JSON.parse(JSON.stringify()) for simple objects. + * @param obj - The object to clone + * @returns A deep copy of the object + */ +export function deepClone(obj: T): T { + if (obj === null || typeof obj !== 'object') { + return obj + } + if (Array.isArray(obj)) { + return obj.map(item => deepClone(item)) as T + } + const cloned = {} as T + for (const key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + cloned[key] = deepClone(obj[key]) + } + } + return cloned +} diff --git a/src/providers/toolbar.provider.ts b/src/providers/toolbar.provider.ts index 1d1250f..9eaeb70 100644 --- a/src/providers/toolbar.provider.ts +++ b/src/providers/toolbar.provider.ts @@ -16,6 +16,9 @@ const ICON_GRID = ` ` + +const SELECTOR_SETTINGS_ID = '__settings__' + import { countPanes } from '../models/workspace.model' /** Recovery token structure for workspace tabs */ @@ -138,12 +141,12 @@ export class WorkspaceToolbarProvider extends ToolbarButtonProvider { description: 'Create and edit workspaces', icon: 'cog', color: undefined, - result: '__settings__' + result: SELECTOR_SETTINGS_ID }) const selectedId = await this.app.showSelector('Select Workspace', options) - if (selectedId === '__settings__') { + if (selectedId === SELECTOR_SETTINGS_ID) { this.openSettings() } else if (selectedId) { this.openWorkspace(selectedId) diff --git a/src/services/workspaceEditor.service.ts b/src/services/workspaceEditor.service.ts index 3d1dbe1..dfda797 100644 --- a/src/services/workspaceEditor.service.ts +++ b/src/services/workspaceEditor.service.ts @@ -15,7 +15,9 @@ import { PendingCommand } from './startupCommand.service' @Injectable({ providedIn: 'root' }) export class WorkspaceEditorService { - private cachedProfiles: TabbyProfile[] = [] + private cachedProfiles: TabbyProfile[] | null = null + private cacheTimestamp: number = 0 + private readonly CACHE_TTL = 30000 // 30 seconds constructor( private config: ConfigService, @@ -23,49 +25,78 @@ export class WorkspaceEditorService { private profilesService: ProfilesService ) {} - private async cacheProfiles(): Promise { - this.cachedProfiles = (await this.profilesService.getProfiles()) as TabbyProfile[] + private async getCachedProfiles(): Promise { + const now = Date.now() + if (!this.cachedProfiles || now - this.cacheTimestamp > this.CACHE_TTL) { + this.cachedProfiles = (await this.profilesService.getProfiles()) as TabbyProfile[] + this.cacheTimestamp = now + } + return this.cachedProfiles } + /** Returns all saved workspaces from config. */ getWorkspaces(): Workspace[] { return this.config.store?.[CONFIG_KEY]?.workspaces ?? [] } - async saveWorkspaces(workspaces: Workspace[]): Promise { + /** + * Saves the workspace list to config. + * @throws Error if config store is not initialized + */ + async saveWorkspaces(workspaces: Workspace[]): Promise { if (!this.config.store?.[CONFIG_KEY]) { - return false + throw new Error('Config store not initialized') } this.config.store[CONFIG_KEY].workspaces = workspaces - return await this.saveConfig() + await this.saveConfig() } + /** Adds a new workspace and shows notification. */ async addWorkspace(workspace: Workspace): Promise { - const workspaces = this.getWorkspaces() - workspaces.push(workspace) - await this.saveWorkspaces(workspaces) - this.notifications.info(`Workspace "${workspace.name}" created`) + try { + const workspaces = this.getWorkspaces() + workspaces.push(workspace) + await this.saveWorkspaces(workspaces) + this.notifications.info(`Workspace "${workspace.name}" created`) + } catch (error) { + this.notifications.error(`Failed to create workspace "${workspace.name}"`) + throw error + } } + /** Updates an existing workspace by ID and shows notification. */ async updateWorkspace(workspace: Workspace): Promise { - const workspaces = this.getWorkspaces() - const index = workspaces.findIndex((w) => w.id === workspace.id) - if (index !== -1) { - workspaces[index] = workspace - await this.saveWorkspaces(workspaces) - this.notifications.info(`Workspace "${workspace.name}" updated`) + try { + const workspaces = this.getWorkspaces() + const index = workspaces.findIndex((w) => w.id === workspace.id) + if (index !== -1) { + workspaces[index] = workspace + await this.saveWorkspaces(workspaces) + this.notifications.info(`Workspace "${workspace.name}" updated`) + } + } catch (error) { + this.notifications.error(`Failed to update workspace "${workspace.name}"`) + throw error } } + /** Deletes a workspace by ID and shows notification. */ async deleteWorkspace(workspaceId: string): Promise { const workspaces = this.getWorkspaces() const workspace = workspaces.find((w) => w.id === workspaceId) - const filtered = workspaces.filter((w) => w.id !== workspaceId) - await this.saveWorkspaces(filtered) - if (workspace) { - this.notifications.info(`Workspace "${workspace.name}" deleted`) + try { + const filtered = workspaces.filter((w) => w.id !== workspaceId) + await this.saveWorkspaces(filtered) + if (workspace) { + this.notifications.info(`Workspace "${workspace.name}" deleted`) + } + } catch (error) { + this.notifications.error(`Failed to delete workspace "${workspace?.name || workspaceId}"`) + throw error } } + /** Returns all local shell profiles available for use in workspaces. */ async getAvailableProfiles(): Promise { const allProfiles = await this.profilesService.getProfiles() return allProfiles.filter( @@ -93,8 +124,9 @@ export class WorkspaceEditorService { } } + /** Generates a Tabby split-layout profile from a workspace for opening. */ async generateTabbyProfile(workspace: Workspace): Promise { - await this.cacheProfiles() + await this.getCachedProfiles() const safeName = this.sanitizeForProfileId(workspace.name) return { id: `split-layout:${CONFIG_KEY}:${safeName}:${workspace.id}`, @@ -187,6 +219,7 @@ export class WorkspaceEditorService { } } + /** Creates a deep copy of a workspace with new IDs. */ duplicateWorkspace(workspace: Workspace): Workspace { const clone = JSON.parse(JSON.stringify(workspace)) as Workspace clone.id = generateUUID() @@ -224,9 +257,10 @@ export class WorkspaceEditorService { if (found) return found // Fallback: check cached profiles (includes built-ins) - return this.cachedProfiles.find((p) => p.id === profileId && isLocalType(p.type)) + return this.cachedProfiles?.find((p) => p.id === profileId && isLocalType(p.type)) } + /** Collects all startup commands from panes in a workspace. */ collectStartupCommands(workspace: Workspace): PendingCommand[] { const commands: PendingCommand[] = [] this.collectCommandsFromNode(workspace.root, workspace.name, commands) @@ -251,14 +285,12 @@ export class WorkspaceEditorService { } } - private async saveConfig(): Promise { + private async saveConfig(): Promise { try { await this.config.save() - return true } catch (error) { - this.notifications.error('Failed to save configuration') console.error('TabbySpaces save error:', error) - return false + throw error } } } diff --git a/src/styles/_index.scss b/src/styles/_index.scss index 200197d..0311771 100644 --- a/src/styles/_index.scss +++ b/src/styles/_index.scss @@ -1,3 +1,3 @@ // Main entry point for shared styles -@import 'variables'; -@import 'mixins'; +@forward 'variables'; +@forward 'mixins'; diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss index b15e521..114e02f 100644 --- a/src/styles/_mixins.scss +++ b/src/styles/_mixins.scss @@ -1,27 +1,9 @@ -@import 'variables'; +@use 'variables' as *; // ====================== // LAYOUT MIXINS // ====================== -@mixin flex-row($gap: $spacing-md) { - display: flex; - align-items: center; - gap: $gap; -} - -@mixin flex-col($gap: $spacing-md) { - display: flex; - flex-direction: column; - gap: $gap; -} - -@mixin flex-between { - display: flex; - justify-content: space-between; - align-items: center; -} - @mixin flex-center { display: flex; align-items: center; @@ -63,27 +45,6 @@ margin-bottom: $spacing-xs; } -// ====================== -// INTERACTIVE CARD MIXIN -// ====================== - -@mixin interactive-card($radius: $radius-md) { - background: var(--theme-bg-more); - border-radius: $radius; - border: 1px solid var(--theme-border); - cursor: pointer; - transition: background $transition-normal, border-color $transition-normal; - - &:hover { - background: var(--theme-bg-more-more); - } - - &.selected { - border-color: var(--theme-primary); - background: var(--theme-bg-more-more); - } -} - // ====================== // BUTTON MIXINS // ====================== @@ -112,15 +73,6 @@ } } -@mixin icon-btn-opacity { - opacity: 0.7; - transition: opacity $transition-normal, color $transition-normal; - - &:hover { - opacity: 1; - } -} - @mixin btn-success { background: $color-success; border-color: $color-success; @@ -132,6 +84,67 @@ } } +@mixin btn-base { + display: inline-flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-sm $spacing-lg; + font-size: $font-sm; + border-radius: $radius-sm; + cursor: pointer; + transition: all $transition-fast; +} + +@mixin btn-ghost { + @include btn-base; + background: transparent; + border: 1px solid var(--theme-border); + color: var(--theme-fg); + + &:hover { + background: var(--theme-bg-more); + } +} + +@mixin btn-primary { + @include btn-base; + background: var(--theme-primary); + border: 1px solid var(--theme-primary); + color: white; + + &:hover { + filter: brightness(1.1); + } +} + +@mixin icon-btn-sm($size: 24px) { + width: $size; + height: $size; + @include flex-center; + background: var(--theme-bg); + border: 1px solid var(--theme-border); + border-radius: $radius-sm; + color: var(--theme-fg-more); + cursor: pointer; + font-size: 10px; + transition: all $transition-fast; + + &:hover:not(:disabled) { + border-color: var(--theme-primary); + color: var(--theme-primary); + } + + &.danger:hover:not(:disabled) { + border-color: var(--theme-danger); + color: var(--theme-danger); + } + + &:disabled { + opacity: 0.4; + cursor: not-allowed; + } +} + // ====================== // OVERLAY/MODAL MIXINS // ====================== diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index dfe058a..ef55fb2 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -33,6 +33,14 @@ $shadow-context-menu: none; $shadow-modal: none; $overlay-bg: rgba(0, 0, 0, 0.7); +// ====================== +// PREVIEW COMPONENT +// ====================== +$preview-height: 140px; +$nested-split-bg: rgba(255, 255, 255, 0.02); +$selected-pane-gradient-start: rgba(59, 130, 246, 0.08); +$selected-pane-gradient-end: rgba(59, 130, 246, 0.04); + // ====================== // FONT SIZES (S1: Compact) // ====================== From 0b069eecdcdcd16807aed1cce8af440c820836ca Mon Sep 17 00:00:00 2001 From: halilc4 Date: Thu, 15 Jan 2026 20:35:22 +0100 Subject: [PATCH 12/18] refactor: use deepClone helper consistently Replace JSON.parse(JSON.stringify()) with deepClone() utility for consistency across the codebase. Co-Authored-By: Claude Opus 4.5 --- src/components/workspaceList.component.ts | 2 +- src/services/workspaceEditor.service.ts | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/components/workspaceList.component.ts b/src/components/workspaceList.component.ts index 88efa1a..bceae38 100644 --- a/src/components/workspaceList.component.ts +++ b/src/components/workspaceList.component.ts @@ -168,7 +168,7 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit } } else if (this.selectedWorkspace) { // Reset to original workspace data - this.editingWorkspace = JSON.parse(JSON.stringify(this.selectedWorkspace)) + this.editingWorkspace = deepClone(this.selectedWorkspace) } this.cdr.detectChanges() } diff --git a/src/services/workspaceEditor.service.ts b/src/services/workspaceEditor.service.ts index dfda797..0f53424 100644 --- a/src/services/workspaceEditor.service.ts +++ b/src/services/workspaceEditor.service.ts @@ -6,6 +6,7 @@ import { WorkspaceSplit, isWorkspaceSplit, generateUUID, + deepClone, TabbyProfile, TabbyRecoveryToken, TabbySplitLayoutProfile, @@ -221,7 +222,7 @@ export class WorkspaceEditorService { /** Creates a deep copy of a workspace with new IDs. */ duplicateWorkspace(workspace: Workspace): Workspace { - const clone = JSON.parse(JSON.stringify(workspace)) as Workspace + const clone = deepClone(workspace) clone.id = generateUUID() clone.name = `${workspace.name} (Copy)` clone.launchOnStartup = false From 0fc67a57394e5ea3b9aade84994fb85af01169eb Mon Sep 17 00:00:00 2001 From: halilc4 Date: Fri, 16 Jan 2026 09:13:56 +0100 Subject: [PATCH 13/18] fix: remove OnPush from splitPreview to fix change detection Parent component mutates objects instead of creating new references, so OnPush strategy prevented UI updates until clicking elsewhere. Also added Angular CD guidelines to CLAUDE.md. Co-Authored-By: Claude Opus 4.5 --- CLAUDE.md | 20 ++++++++++++++++++++ src/components/splitPreview.component.ts | 3 +-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 2f1ae7c..49d65fb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -304,6 +304,26 @@ await new Promise(r => setTimeout(r, 100)); return document.querySelectorAll('.preview-pane.selected').length; ``` +## Angular Change Detection + +**KRITIČNO**: NE koristi `OnPush` strategiju na komponentama koje primaju mutirane objekte. + +### Pravilo +- **NE koristi `OnPush`** ako parent komponenta mutira objekte umesto da kreira nove reference +- Angular default strategija automatski detektuje sve promene +- `OnPush` je samo za leaf komponente koje emituju events bez lokalnog state-a + +### Zašto +- `OnPush` osvežava view samo kada se `@Input` referenca promeni +- Mutacija objekta (npr. `workspace.root.children.push()`) NE menja referencu +- Bez nove reference, Angular ne zna da treba re-renderovati + +### Komponente u ovom projektu +- `workspaceEditor` - **default CD** (mutira workspace) +- `workspaceList` - **default CD** (koristi `detectChanges()` za async operacije) +- `splitPreview` - **default CD** (prima mutirane objekte) +- `paneEditor` - može biti `OnPush` (samo emituje, nema mutacija) + ## Known Issues ### YAML escape sequences in config.yaml diff --git a/src/components/splitPreview.component.ts b/src/components/splitPreview.component.ts index 2f4fa1d..874c762 100644 --- a/src/components/splitPreview.component.ts +++ b/src/components/splitPreview.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, Output, EventEmitter, ChangeDetectionStrategy } from '@angular/core' +import { Component, Input, Output, EventEmitter } from '@angular/core' import { WorkspaceSplit, WorkspacePane, @@ -10,7 +10,6 @@ import { selector: 'split-preview', template: require('./splitPreview.component.pug'), styles: [require('./splitPreview.component.scss')], - changeDetection: ChangeDetectionStrategy.OnPush, }) export class SplitPreviewComponent { @Input() split!: WorkspaceSplit From b801c3db8decb8c90b22d9dbd32cd9a93fc1b6f9 Mon Sep 17 00:00:00 2001 From: halilc4 Date: Fri, 23 Jan 2026 09:33:44 +0100 Subject: [PATCH 14/18] fix: replace native confirm() with NgbModal to fix focus bug After deleting a workspace, focus was lost and user couldn't interact with inputs until alt-tab. Root cause: native confirm() dialog takes focus away from Electron renderer and doesn't restore it properly. Solution: Use ng-bootstrap's NgbModal for in-app confirmation dialog that stays within Angular's focus management. Changes: - Add DeleteConfirmModalComponent for delete confirmation - Replace confirm() with NgbModal in workspaceList - Add @ng-bootstrap/ng-bootstrap@14 as devDependency - Add workspaceBackground.service.ts - Various component improvements and refactoring Co-Authored-By: Claude Opus 4.5 --- package-lock.json | 27 ++- package.json | 1 + scripts/build-dev.js | 3 +- scripts/build-prod.js | 3 +- .../deleteConfirmModal.component.ts | 23 +++ src/components/paneEditor.component.pug | 17 +- src/components/paneEditor.component.scss | 37 +--- src/components/paneEditor.component.ts | 24 +-- src/components/splitPreview.component.pug | 9 - src/components/splitPreview.component.scss | 36 +--- src/components/splitPreview.component.ts | 24 +-- src/components/workspaceEditor.component.pug | 39 ++-- src/components/workspaceEditor.component.scss | 94 +++++++++- src/components/workspaceEditor.component.ts | 115 +++++++++--- src/components/workspaceList.component.pug | 15 +- src/components/workspaceList.component.scss | 26 ++- src/components/workspaceList.component.ts | 117 ++++++++---- src/index.ts | 4 + src/models/workspace.model.ts | 29 +++ src/providers/toolbar.provider.ts | 7 +- src/services/workspaceBackground.service.ts | 167 ++++++++++++++++++ src/styles/_mixins.scss | 14 +- src/styles/_variables.scss | 4 + 23 files changed, 618 insertions(+), 217 deletions(-) create mode 100644 src/components/deleteConfirmModal.component.ts create mode 100644 src/services/workspaceBackground.service.ts diff --git a/package-lock.json b/package-lock.json index d1116d6..eaab0ef 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { - "name": "tabbyspaces", - "version": "1.0.0", + "name": "tabby-tabbyspaces", + "version": "0.1.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "tabbyspaces", - "version": "1.0.0", + "name": "tabby-tabbyspaces", + "version": "0.1.0", "license": "MIT", "devDependencies": { "@angular/common": "^15.0.0", @@ -14,6 +14,7 @@ "@angular/compiler-cli": "^15.0.0", "@angular/core": "^15.0.0", "@angular/forms": "^15.0.0", + "@ng-bootstrap/ng-bootstrap": "^14.2.0", "@ngtools/webpack": "^15.0.0", "apply-loader": "^2.0.0", "css-loader": "^6.8.0", @@ -483,6 +484,24 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@ng-bootstrap/ng-bootstrap": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/@ng-bootstrap/ng-bootstrap/-/ng-bootstrap-14.2.0.tgz", + "integrity": "sha512-nqEKVXauSontGKqC5WSKpch5TiAGDZB3hluvxkINS0r9LUE6sBQRP3qeYOe7Uwu+UbQcj28NG3qFHhpfnG8KHw==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "^2.3.0" + }, + "peerDependencies": { + "@angular/common": "^15.0.0", + "@angular/core": "^15.0.0", + "@angular/forms": "^15.0.0", + "@angular/localize": "^15.0.0", + "@popperjs/core": "^2.11.6", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, "node_modules/@ngtools/webpack": { "version": "15.2.11", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.11.tgz", diff --git a/package.json b/package.json index 7fee475..46455e5 100644 --- a/package.json +++ b/package.json @@ -30,6 +30,7 @@ "@angular/compiler-cli": "^15.0.0", "@angular/core": "^15.0.0", "@angular/forms": "^15.0.0", + "@ng-bootstrap/ng-bootstrap": "^14.2.0", "@ngtools/webpack": "^15.0.0", "apply-loader": "^2.0.0", "css-loader": "^6.8.0", diff --git a/scripts/build-dev.js b/scripts/build-dev.js index c06acd6..f42d1d1 100644 --- a/scripts/build-dev.js +++ b/scripts/build-dev.js @@ -12,7 +12,8 @@ if (fs.existsSync(distDevDir)) { // 2. Run webpack with dev env directly to dist-dev console.log('Building dev version...') -execSync(`npx webpack --mode production --env dev --output-path "${distDevDir}"`, { +const webpackCli = path.join(rootDir, 'node_modules', 'webpack-cli', 'bin', 'cli.js') +execSync(`node "${webpackCli}" --mode production --env dev --output-path "${distDevDir}"`, { cwd: rootDir, stdio: 'inherit' }) diff --git a/scripts/build-prod.js b/scripts/build-prod.js index 657f19d..6b5c5d7 100644 --- a/scripts/build-prod.js +++ b/scripts/build-prod.js @@ -12,7 +12,8 @@ if (fs.existsSync(distDir)) { // 2. Run webpack console.log('Building production version...') -execSync('npx webpack --mode production', { +const webpackCli = path.join(rootDir, 'node_modules', 'webpack-cli', 'bin', 'cli.js') +execSync(`node "${webpackCli}" --mode production`, { cwd: rootDir, stdio: 'inherit' }) diff --git a/src/components/deleteConfirmModal.component.ts b/src/components/deleteConfirmModal.component.ts new file mode 100644 index 0000000..30f6e9c --- /dev/null +++ b/src/components/deleteConfirmModal.component.ts @@ -0,0 +1,23 @@ +import { Component, Input } from '@angular/core' +import { NgbActiveModal } from '@ng-bootstrap/ng-bootstrap' + +@Component({ + selector: 'delete-confirm-modal', + template: ` + + + + `, +}) +export class DeleteConfirmModalComponent { + @Input() workspaceName = '' + constructor(public modal: NgbActiveModal) {} +} diff --git a/src/components/paneEditor.component.pug b/src/components/paneEditor.component.pug index 7d4d514..13896fe 100644 --- a/src/components/paneEditor.component.pug +++ b/src/components/paneEditor.component.pug @@ -4,14 +4,11 @@ span.pane-details-title i.fas.fa-terminal | Pane Configuration - span.pane-details-close((click)='onCancel()') - i.fas.fa-xmark - | Close .pane-form .form-group label Profile - select.form-control([(ngModel)]='editedPane.profileId') + select.form-control([(ngModel)]='pane.profileId') option(value='') -- Select Profile -- option(*ngFor='let profile of profiles', [value]='profile.id') | {{ profile.name }} @@ -20,7 +17,7 @@ label Working Directory input.form-control( type='text', - [(ngModel)]='editedPane.cwd', + [(ngModel)]='pane.cwd', placeholder='C:\\path\\to\\project' ) @@ -28,14 +25,6 @@ label Startup Command input.form-control( type='text', - [(ngModel)]='editedPane.startupCommand', + [(ngModel)]='pane.startupCommand', placeholder='e.g., npm run dev' ) - - .pane-form-actions - button.btn.btn-ghost(type='button', (click)='onCancel()') - i.fas.fa-xmark - | Cancel - button.btn.btn-primary(type='button', (click)='onSave()') - i.fas.fa-check - | Apply diff --git a/src/components/paneEditor.component.scss b/src/components/paneEditor.component.scss index bffa6f6..2ba429e 100644 --- a/src/components/paneEditor.component.scss +++ b/src/components/paneEditor.component.scss @@ -8,7 +8,7 @@ padding-top: $spacing-lg; margin-top: $spacing-xl; border-left: 2px solid var(--theme-primary); - border-top: 1px solid var(--theme-border); + border-top: 1px solid var(--theme-border, $fallback-border); } .pane-details-header { @@ -27,20 +27,6 @@ gap: $spacing-sm; } -.pane-details-close { - color: var(--theme-fg-more); - cursor: pointer; - font-size: 11px; - display: flex; - align-items: center; - gap: $spacing-xs; - transition: color $transition-fast; - - &:hover { - color: var(--theme-fg); - } -} - // 2-column grid for pane form .pane-form { display: grid; @@ -65,7 +51,7 @@ @include form-input(var(--theme-bg)); font-size: $font-sm; // Override Tabby's global border reset - border: 1px solid var(--theme-border) !important; + border: 1px solid var(--theme-border, $fallback-border) !important; &:focus { border-color: var(--theme-primary) !important; @@ -76,22 +62,3 @@ select.form-control { cursor: pointer; appearance: auto; // Show dropdown arrow } - -// Action buttons at bottom of panel -.pane-form-actions { - grid-column: 1 / -1; - display: flex; - justify-content: flex-end; - gap: $spacing-md; - margin-top: $spacing-lg; - padding-top: $spacing-lg; - border-top: 1px solid var(--theme-border); - - .btn-ghost { - @include btn-ghost; - } - - .btn-primary { - @include btn-primary; - } -} diff --git a/src/components/paneEditor.component.ts b/src/components/paneEditor.component.ts index 3d8b312..7df293a 100644 --- a/src/components/paneEditor.component.ts +++ b/src/components/paneEditor.component.ts @@ -1,35 +1,19 @@ -import { Component, Input, Output, EventEmitter, OnInit, HostListener, ChangeDetectionStrategy } from '@angular/core' +import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core' import { WorkspacePane, TabbyProfile } from '../models/workspace.model' @Component({ selector: 'pane-editor', template: require('./paneEditor.component.pug'), styles: [require('./paneEditor.component.scss')], - changeDetection: ChangeDetectionStrategy.OnPush, }) -export class PaneEditorComponent implements OnInit { +export class PaneEditorComponent { @Input() pane!: WorkspacePane @Input() profiles: TabbyProfile[] = [] - @Output() save = new EventEmitter() - @Output() cancel = new EventEmitter() - - editedPane!: WorkspacePane - - ngOnInit(): void { - this.editedPane = { ...this.pane } - } + @Output() close = new EventEmitter() @HostListener('document:keydown.escape') onEscapeKey(): void { - this.cancel.emit() - } - - onSave(): void { - this.save.emit(this.editedPane) - } - - onCancel(): void { - this.cancel.emit() + this.close.emit() } getProfileName(profileId: string): string { diff --git a/src/components/splitPreview.component.pug b/src/components/splitPreview.component.pug index 692e4b4..e8cd0f6 100644 --- a/src/components/splitPreview.component.pug +++ b/src/components/splitPreview.component.pug @@ -6,7 +6,6 @@ [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))' ) .pane-content @@ -20,13 +19,6 @@ i.fas.fa-terminal span {{ truncate(asPane(child).startupCommand, 20) }} - button.pane-edit-btn( - type='button', - (click)='onEditClick($event, asPane(child))', - title='Edit pane' - ) - i.fas.fa-pen - //- Nested split split-preview( *ngIf='isSplit(child)', @@ -35,7 +27,6 @@ [selectedPaneId]='selectedPaneId', [profiles]='profiles', [style.flex-basis]='getFlexStyle(i)', - (paneSelect)='onNestedPaneSelect($event)', (paneEdit)='onNestedPaneEdit($event)', (splitHorizontal)='onNestedSplitH($event)', (splitVertical)='onNestedSplitV($event)', diff --git a/src/components/splitPreview.component.scss b/src/components/splitPreview.component.scss index 60752e1..d521bed 100644 --- a/src/components/splitPreview.component.scss +++ b/src/components/splitPreview.component.scss @@ -8,7 +8,7 @@ border-radius: $radius-md; overflow: hidden; background: var(--theme-bg); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, rgba(255, 255, 255, 0.1)); &.horizontal { flex-direction: row; @@ -31,7 +31,7 @@ @include flex-center; background: var(--theme-bg-more); border-radius: $radius-sm; - border: 2px solid var(--theme-border); + border: 2px solid var(--theme-border, rgba(255, 255, 255, 0.1)); cursor: pointer; transition: all $transition-fast; position: relative; @@ -39,7 +39,7 @@ &:hover { background: var(--theme-bg-more-more); - border-color: var(--theme-fg-more); + border-color: var(--theme-fg-more, rgba(255, 255, 255, 0.3)); } &.selected { @@ -97,32 +97,6 @@ } } -.pane-edit-btn { - position: absolute; - top: $spacing-sm; - right: $spacing-sm; - padding: $spacing-sm $spacing-md; - background: var(--theme-bg); - border: 1px solid var(--theme-border); - border-radius: $radius-sm; - color: var(--theme-fg); - cursor: pointer; - font-size: 0.7rem; - transition: all $transition-fast; - opacity: 0; - z-index: 10; - - &:hover { - background: var(--theme-primary); - color: white; - border-color: var(--theme-primary); - } -} - -.preview-pane:hover .pane-edit-btn { - opacity: 1; -} - // Context menu .context-menu-overlay { @include full-overlay($z-context-menu-overlay); @@ -131,7 +105,7 @@ .context-menu { position: fixed; background: var(--theme-bg); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-radius: $radius-lg; box-shadow: $shadow-context-menu; min-width: 160px; @@ -174,7 +148,7 @@ .context-menu-divider { height: 1px; - background: var(--theme-border); + background: var(--theme-border, $fallback-border); margin: $spacing-sm 0; } diff --git a/src/components/splitPreview.component.ts b/src/components/splitPreview.component.ts index 874c762..8c11bee 100644 --- a/src/components/splitPreview.component.ts +++ b/src/components/splitPreview.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, Output, EventEmitter } from '@angular/core' +import { Component, Input, Output, EventEmitter, OnChanges, SimpleChanges, ChangeDetectorRef } from '@angular/core' import { WorkspaceSplit, WorkspacePane, @@ -11,12 +11,11 @@ import { template: require('./splitPreview.component.pug'), styles: [require('./splitPreview.component.scss')], }) -export class SplitPreviewComponent { +export class SplitPreviewComponent implements OnChanges { @Input() split!: WorkspaceSplit @Input() depth = 0 @Input() selectedPaneId: string | null = null @Input() profiles: TabbyProfile[] = [] - @Output() paneSelect = new EventEmitter() @Output() paneEdit = new EventEmitter() @Output() splitHorizontal = new EventEmitter() @Output() splitVertical = new EventEmitter() @@ -29,6 +28,15 @@ export class SplitPreviewComponent { contextMenuPane: WorkspacePane | null = null contextMenuPosition = { x: 0, y: 0 } + constructor(private cdr: ChangeDetectorRef) {} + + ngOnChanges(changes: SimpleChanges): void { + // Clear context menu when split input changes to avoid stale state + if (changes['split']) { + this.closeContextMenu() + } + } + isPane(child: WorkspacePane | WorkspaceSplit): boolean { return !isWorkspaceSplit(child) } @@ -50,11 +58,6 @@ export class SplitPreviewComponent { } onPaneClick(pane: WorkspacePane): void { - this.paneSelect.emit(pane) - } - - onEditClick(event: MouseEvent, pane: WorkspacePane): void { - event.stopPropagation() this.paneEdit.emit(pane) } @@ -72,6 +75,7 @@ export class SplitPreviewComponent { closeContextMenu(): void { this.contextMenuPane = null + this.cdr.detectChanges() } onEdit(): void { @@ -138,10 +142,6 @@ export class SplitPreviewComponent { } // Pass-through events from nested splits - onNestedPaneSelect(pane: WorkspacePane): void { - this.paneSelect.emit(pane) - } - onNestedPaneEdit(pane: WorkspacePane): void { this.paneEdit.emit(pane) } diff --git a/src/components/workspaceEditor.component.pug b/src/components/workspaceEditor.component.pug index dc4aa0a..925b323 100644 --- a/src/components/workspaceEditor.component.pug +++ b/src/components/workspaceEditor.component.pug @@ -42,6 +42,32 @@ span.dropdown-chevron i.fas.fa-chevron-down + .form-group.auto-width + label Background + .background-picker + .background-trigger((click)='toggleBackgroundDropdown()') + span.background-preview([style.background]='workspace.background?.value || "transparent"') + i.fas.fa-ban(*ngIf='!workspace.background?.value') + span.dropdown-chevron + i.fas.fa-chevron-down + .background-dropdown(*ngIf='backgroundDropdownOpen') + .preset-grid + button.preset-option( + *ngFor='let preset of backgroundPresets', + type='button', + [class.selected]='isBackgroundSelected(preset)', + [style.background]='preset.value || "var(--theme-bg)"', + (click)='selectBackgroundPreset(preset)' + ) + i.fas.fa-ban(*ngIf='preset.type === "none"') + .custom-input-wrapper + input.form-control.custom-bg-input( + type='text', + [(ngModel)]='customBackgroundValue', + placeholder='Custom CSS gradient...', + (blur)='applyCustomBackground()' + ) + //- Section 2: Split Layout .editor-section .section-title @@ -51,13 +77,6 @@ .split-preview-container //- Preview toolbar .preview-toolbar - button.preview-btn( - type='button', - title='Edit pane', - [disabled]='!selectedPaneId', - (click)='editSelectedPane()' - ) - i.fas.fa-pen button.preview-btn( type='button', title='Split Horizontal', @@ -116,7 +135,6 @@ [split]='workspace.root', [selectedPaneId]='selectedPaneId', [profiles]='profiles', - (paneSelect)='selectPane($event)', (paneEdit)='editPane($event)', (splitHorizontal)='splitPane($event, "horizontal")', (splitVertical)='splitPane($event, "vertical")', @@ -127,13 +145,12 @@ (removePane)='removePane($event)' ) - //- Inline pane editor (replaces modal) + //- Inline pane editor pane-editor( *ngIf='showPaneEditor && editingPane', [pane]='editingPane', [profiles]='profiles', - (save)='onPaneSave($event)', - (cancel)='closePaneEditor()' + (close)='closePaneEditor()' ) //- Action buttons diff --git a/src/components/workspaceEditor.component.scss b/src/components/workspaceEditor.component.scss index caf6353..41a73eb 100644 --- a/src/components/workspaceEditor.component.scss +++ b/src/components/workspaceEditor.component.scss @@ -40,7 +40,7 @@ width: 100%; font-size: $font-sm; // Override Tabby's global border reset - border: 1px solid var(--theme-border) !important; + border: 1px solid var(--theme-border, $fallback-border) !important; &:focus { border-color: var(--theme-primary) !important; @@ -55,7 +55,7 @@ gap: $spacing-sm; padding: $spacing-sm $spacing-md; background: var(--theme-bg-more); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-radius: $radius-sm; cursor: pointer; transition: border-color $transition-fast; @@ -120,7 +120,7 @@ gap: $spacing-sm; padding: $spacing-sm $spacing-md; background: var(--theme-bg-more); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-radius: $radius-sm; cursor: pointer; position: relative; @@ -153,10 +153,90 @@ border-radius: $radius-xs; } +// Background picker +.background-picker { + position: relative; +} + +.background-trigger { + display: flex; + align-items: center; + gap: $spacing-sm; + padding: $spacing-sm $spacing-md; + background: var(--theme-bg-more); + border: 1px solid var(--theme-border, $fallback-border); + border-radius: $radius-sm; + cursor: pointer; + transition: border-color $transition-fast; + height: 32px; + box-sizing: border-box; + + &:hover { + border-color: var(--theme-fg-more); + } +} + +.background-preview { + width: 48px; + height: 18px; + border-radius: $radius-xs; + border: 1px solid var(--theme-border, $fallback-border); + @include flex-center; + color: var(--theme-fg-more, $fallback-fg-more); + font-size: 10px; +} + +.background-dropdown { + position: absolute; + top: 100%; + left: 0; + right: 0; + margin-top: $spacing-sm; + padding: $spacing-md; + @include dropdown-panel; + z-index: $z-dropdown; + min-width: 260px; +} + +.preset-grid { + display: grid; + grid-template-columns: repeat(4, 1fr); + gap: $spacing-sm; + margin-bottom: $spacing-md; +} + +.preset-option { + aspect-ratio: 1.5; + height: 32px; + @include flex-center; + border: 1px solid var(--theme-border, $fallback-border); + border-radius: $radius-sm; + cursor: pointer; + transition: all $transition-fast; + color: var(--theme-fg-more, $fallback-fg-more); + font-size: 10px; + + &:hover { + border-color: var(--theme-fg-more); + } + + &.selected { + border-color: var(--theme-primary); + border-width: 2px; + } +} + +.custom-input-wrapper { + .custom-bg-input { + width: 100%; + font-size: $font-xs; + } +} + // Split preview container .split-preview-container { background: var(--theme-bg-more); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-radius: $radius-md; padding: $spacing-lg; } @@ -169,13 +249,13 @@ gap: $spacing-sm; margin-bottom: $spacing-lg; padding-bottom: $spacing-md; - border-bottom: 1px solid var(--theme-border); + border-bottom: 1px solid var(--theme-border, $fallback-border); } .toolbar-separator { width: 1px; height: 18px; - background: var(--theme-border); + background: var(--theme-border, $fallback-border); margin: 0 $spacing-sm; align-self: center; } @@ -199,7 +279,7 @@ justify-content: space-between; align-items: center; padding-top: $spacing-xl; - border-top: 1px solid var(--theme-border); + border-top: 1px solid var(--theme-border, $fallback-border); margin-top: $spacing-xl; } diff --git a/src/components/workspaceEditor.component.ts b/src/components/workspaceEditor.component.ts index e697263..ef1e3a3 100644 --- a/src/components/workspaceEditor.component.ts +++ b/src/components/workspaceEditor.component.ts @@ -1,12 +1,14 @@ -import { Component, Input, Output, EventEmitter, OnInit, OnChanges, AfterViewInit, SimpleChanges, HostListener, ElementRef, ViewChild } from '@angular/core' +import { Component, Input, Output, EventEmitter, OnInit, OnChanges, AfterViewInit, SimpleChanges, HostListener, ElementRef, ViewChild, ChangeDetectorRef } from '@angular/core' import { Workspace, WorkspacePane, WorkspaceSplit, + WorkspaceBackground, TabbyProfile, isWorkspaceSplit, createDefaultPane, generateUUID, + BACKGROUND_PRESETS, } from '../models/workspace.model' interface TreeContext { @@ -41,18 +43,35 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni 'bug', 'wrench', 'cube', 'layer-group', 'sitemap', 'project-diagram' ] iconDropdownOpen = false + backgroundPresets = BACKGROUND_PRESETS + backgroundDropdownOpen = false + customBackgroundValue = '' constructor( private workspaceService: WorkspaceEditorService, - private elementRef: ElementRef + private elementRef: ElementRef, + private cdr: ChangeDetectorRef ) {} @HostListener('document:click', ['$event']) onDocumentClick(event: MouseEvent): void { - const iconPicker = this.elementRef.nativeElement.querySelector('.icon-picker') - if (iconPicker && !iconPicker.contains(event.target as Node)) { + // Check if click is outside the icon dropdown area (trigger + dropdown) + const dropdownTrigger = this.elementRef.nativeElement.querySelector('.dropdown-trigger') + const iconDropdown = this.elementRef.nativeElement.querySelector('.icon-dropdown') + const iconClickedInside = dropdownTrigger?.contains(event.target as Node) || + iconDropdown?.contains(event.target as Node) + if (this.iconDropdownOpen && !iconClickedInside) { this.iconDropdownOpen = false } + + // Check if click is outside the background dropdown area + const bgTrigger = this.elementRef.nativeElement.querySelector('.background-trigger') + const bgDropdown = this.elementRef.nativeElement.querySelector('.background-dropdown') + const bgClickedInside = bgTrigger?.contains(event.target as Node) || + bgDropdown?.contains(event.target as Node) + if (this.backgroundDropdownOpen && !bgClickedInside) { + this.backgroundDropdownOpen = false + } } toggleIconDropdown(): void { @@ -64,9 +83,49 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni this.iconDropdownOpen = false } + toggleBackgroundDropdown(): void { + this.backgroundDropdownOpen = !this.backgroundDropdownOpen + } + + selectBackgroundPreset(preset: WorkspaceBackground): void { + if (preset.type === 'none') { + this.workspace.background = undefined + this.customBackgroundValue = '' + } else { + this.workspace.background = { ...preset } + this.customBackgroundValue = preset.value + } + this.backgroundDropdownOpen = false + } + + applyCustomBackground(): void { + const value = this.customBackgroundValue.trim() + if (value) { + this.workspace.background = { + type: 'gradient', + value + } + } else { + this.workspace.background = undefined + } + } + + clearBackground(): void { + this.workspace.background = undefined + this.customBackgroundValue = '' + } + + isBackgroundSelected(preset: WorkspaceBackground): boolean { + if (preset.type === 'none') { + return !this.workspace.background || this.workspace.background.type === 'none' + } + return this.workspace.background?.value === preset.value + } + async ngOnInit(): Promise { this.profiles = await this.workspaceService.getAvailableProfiles() this.initializeWorkspace() + this.cdr.detectChanges() } ngAfterViewInit(): void { @@ -88,11 +147,26 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni ngOnChanges(changes: SimpleChanges): void { if (changes['workspace'] && !changes['workspace'].firstChange) { - // Reset component state when workspace input changes - this.selectedPaneId = null - this.editingPane = null - this.showPaneEditor = false + const prevId = changes['workspace'].previousValue?.id + const currId = this.workspace.id + + if (prevId !== currId) { + // Different workspace - reset everything and focus name input + this.selectedPaneId = null + this.editingPane = null + this.showPaneEditor = false + this.focusNameInput() + } else { + // Same workspace ID but different reference (after save/reload) + // Re-sync editingPane to point to pane in new object tree + if (this.selectedPaneId && this.showPaneEditor) { + this.editingPane = this.findPaneById(this.selectedPaneId) + } + } + // Always reset dropdowns and sync background value this.iconDropdownOpen = false + this.backgroundDropdownOpen = false + this.customBackgroundValue = this.workspace.background?.value || '' this.initializeWorkspace() } @@ -123,37 +197,26 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni this.cancel.emit() } - selectPane(pane: WorkspacePane): void { - this.selectedPaneId = pane.id - } - deselectPane(): void { this.selectedPaneId = null } onPreviewBackgroundClick(): void { this.deselectPane() + this.closePaneEditor() } editPane(pane: WorkspacePane): void { + this.selectedPaneId = pane.id this.editingPane = pane this.showPaneEditor = true - } - - editSelectedPane(): void { - if (!this.selectedPaneId) return - const pane = this.findPaneById(this.selectedPaneId) - if (pane) this.editPane(pane) + this.cdr.detectChanges() } closePaneEditor(): void { this.showPaneEditor = false this.editingPane = null - } - - onPaneSave(pane: WorkspacePane): void { - this.updatePaneInTree(pane) - this.closePaneEditor() + this.cdr.detectChanges() } // Helper functions @@ -213,6 +276,7 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni splitPane(pane: WorkspacePane, orientation: 'horizontal' | 'vertical'): void { this.splitPaneInTree(pane, orientation) + this.cdr.detectChanges() } splitSelectedPane(orientation: 'horizontal' | 'vertical'): void { @@ -247,6 +311,7 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni this.selectedPaneId = null } this.removePaneFromTree(this.workspace.root, pane) + this.cdr.detectChanges() } removeSelectedPane(): void { @@ -293,6 +358,7 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni setOrientation(orientation: 'horizontal' | 'vertical'): void { this.workspace.root.orientation = orientation + this.cdr.detectChanges() } updateRatio(index: number, value: number): void { @@ -313,6 +379,7 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni }) this.workspace.root.ratios = ratios + this.cdr.detectChanges() } // Add pane operations @@ -321,10 +388,12 @@ export class WorkspaceEditorComponent implements OnInit, OnChanges, AfterViewIni const pane = this.findPaneById(this.selectedPaneId) if (!pane) return this.addPaneInTree(pane, direction) + this.cdr.detectChanges() } addPaneFromEvent(pane: WorkspacePane, direction: 'left' | 'right' | 'top' | 'bottom'): void { this.addPaneInTree(pane, direction) + this.cdr.detectChanges() } private addPaneInTree( diff --git a/src/components/workspaceList.component.pug b/src/components/workspaceList.component.pug index 3001e09..0cde004 100644 --- a/src/components/workspaceList.component.pug +++ b/src/components/workspaceList.component.pug @@ -2,15 +2,16 @@ //- Tab bar navigation .tab-bar .tab( - *ngFor='let workspace of workspaces', - [class.active]='isSelected(workspace)', - (click)='selectWorkspace(workspace)' + *ngFor='let tab of displayTabs; trackBy: trackByTab', + [class.active]='isTabSelected(tab)', + (click)='!tab.isNew && selectWorkspace(tab.workspace)' ) - span.tab-icon([style.color]='workspace.color') - i.fas([class]='"fa-" + (workspace.icon || "columns")') - span.tab-name {{ workspace.name }} + span.tab-icon([style.color]='tab.workspace.color') + i.fas([class]='"fa-" + (tab.workspace.icon || "columns")') + span.tab-name {{ tab.workspace.name || 'New Workspace' }} span.tab-close( - (click)='deleteWorkspace($event, workspace)', + *ngIf='!tab.isNew', + (click)='deleteWorkspace($event, tab.workspace)', title='Delete workspace' ) i.fas.fa-xmark diff --git a/src/components/workspaceList.component.scss b/src/components/workspaceList.component.scss index 779e9ef..e8e91f4 100644 --- a/src/components/workspaceList.component.scss +++ b/src/components/workspaceList.component.scss @@ -8,8 +8,28 @@ .tab-bar { display: flex; background: var(--theme-bg-more); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-bottom: none; + overflow-y: hidden; + overflow-x: auto; + + // Thin scrollbar + &::-webkit-scrollbar { + height: 6px; + } + + &::-webkit-scrollbar-track { + background: var(--theme-bg-more); + } + + &::-webkit-scrollbar-thumb { + background: var(--theme-border, $fallback-border); + border-radius: 3px; + + &:hover { + background: var(--theme-fg-more); + } + } } .tab { @@ -17,7 +37,7 @@ align-items: center; gap: $spacing-md; padding: $spacing-md $spacing-lg; - border-right: 1px solid var(--theme-border); + border-right: 1px solid var(--theme-border, $fallback-border); color: var(--theme-fg-more); cursor: pointer; font-size: $font-sm; @@ -86,7 +106,7 @@ // Tab content .tab-content { background: var(--theme-bg); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-top: none; padding: $spacing-xl; diff --git a/src/components/workspaceList.component.ts b/src/components/workspaceList.component.ts index bceae38..17a215d 100644 --- a/src/components/workspaceList.component.ts +++ b/src/components/workspaceList.component.ts @@ -1,12 +1,15 @@ import { Component, OnInit, OnDestroy, AfterViewInit, ChangeDetectorRef, ElementRef, NgZone } from '@angular/core' +import { NgbModal } from '@ng-bootstrap/ng-bootstrap' import { ConfigService, ProfilesService } from 'tabby-core' import { Subscription } from 'rxjs' import { StartupCommandService } from '../services/startupCommand.service' import { WorkspaceEditorService } from '../services/workspaceEditor.service' +import { DeleteConfirmModalComponent } from './deleteConfirmModal.component' import { Workspace, WorkspacePane, WorkspaceSplit, + TabbyProfile, countPanes, createDefaultWorkspace, deepClone, @@ -26,6 +29,8 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit editingWorkspace: Workspace | null = null isCreatingNew = false openingWorkspaceId: string | null = null + displayTabs: Array<{ workspace: Workspace; isNew: boolean }> = [] + private cachedProfiles: TabbyProfile[] = [] private configSubscription: Subscription | null = null constructor( @@ -33,16 +38,18 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit private workspaceService: WorkspaceEditorService, private profilesService: ProfilesService, private startupService: StartupCommandService, + private modalService: NgbModal, private cdr: ChangeDetectorRef, private elementRef: ElementRef, private zone: NgZone ) {} - ngOnInit(): void { + async ngOnInit(): Promise { this.loadWorkspaces() this.autoSelectFirst() + this.cachedProfiles = await this.workspaceService.getAvailableProfiles() this.configSubscription = this.config.changed$.subscribe(() => { - this.loadWorkspaces() + this.zone.run(() => this.loadWorkspaces()) }) } @@ -66,6 +73,7 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit this.isCreatingNew = false this.selectedWorkspace = workspace this.editingWorkspace = deepClone(workspace) + this.updateDisplayTabs() } isSelected(workspace: Workspace): boolean { @@ -77,18 +85,29 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit } loadWorkspaces(): void { + const previousSelectedId = this.selectedWorkspace?.id this.workspaces = this.workspaceService.getWorkspaces() - this.cdr.detectChanges() + + // Re-sync selectedWorkspace to point to object in new array + // This prevents stale reference after delete/reload operations + if (previousSelectedId) { + this.selectedWorkspace = this.workspaces.find(w => w.id === previousSelectedId) || null + } + + this.updateDisplayTabs() } - async createWorkspace(): Promise { - const profiles = await this.workspaceService.getAvailableProfiles() - const defaultProfileId = profiles[0]?.id || '' + createWorkspace(): void { + console.log('[L5 DEBUG] createWorkspace called, cachedProfiles:', this.cachedProfiles.length) + const defaultProfileId = this.cachedProfiles[0]?.id || '' const workspace = createDefaultWorkspace() this.setProfileForAllPanes(workspace.root, defaultProfileId) this.selectedWorkspace = null this.editingWorkspace = workspace this.isCreatingNew = true + console.log('[L5 DEBUG] before updateDisplayTabs, isCreatingNew:', this.isCreatingNew, 'editingWorkspace:', !!this.editingWorkspace) + this.updateDisplayTabs() + console.log('[L5 DEBUG] after updateDisplayTabs, displayTabs.length:', this.displayTabs.length) this.cdr.detectChanges() } @@ -108,33 +127,48 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit event.stopPropagation() const clone = this.workspaceService.duplicateWorkspace(workspace) await this.workspaceService.addWorkspace(clone) - this.loadWorkspaces() - // Select the duplicated workspace - const duplicated = this.workspaces.find((w) => w.id === clone.id) - if (duplicated) { - this.selectWorkspace(duplicated) - } - this.cdr.detectChanges() + this.zone.run(() => { + this.loadWorkspaces() + const duplicated = this.workspaces.find((w) => w.id === clone.id) + if (duplicated) { + this.selectWorkspace(duplicated) + } + }) } async deleteWorkspace(event: MouseEvent, workspace: Workspace): Promise { event.stopPropagation() - if (confirm(`Delete workspace "${workspace.name}"?`)) { - const currentIndex = this.workspaces.findIndex((w) => w.id === workspace.id) - await this.workspaceService.deleteWorkspace(workspace.id) - this.loadWorkspaces() - // Select next workspace after deletion - if (this.workspaces.length > 0) { - const nextIndex = Math.min(currentIndex, this.workspaces.length - 1) - this.selectWorkspace(this.workspaces[nextIndex]) - } else { + const confirmed = await this.confirmDelete(workspace.name) + if (!confirmed) return + + const wasSelected = this.selectedWorkspace?.id === workspace.id + const deletedIndex = this.workspaces.findIndex((w) => w.id === workspace.id) + + await this.workspaceService.deleteWorkspace(workspace.id) + + this.zone.run(() => { + this.loadWorkspaces() + if (this.workspaces.length === 0) { this.selectedWorkspace = null this.editingWorkspace = null this.isCreatingNew = false + } else if (wasSelected) { + const nextIndex = Math.min(deletedIndex, this.workspaces.length - 1) + this.selectWorkspace(this.workspaces[nextIndex]) } - this.cdr.detectChanges() + }) + } + + private async confirmDelete(name: string): Promise { + const modalRef = this.modalService.open(DeleteConfirmModalComponent) + modalRef.componentInstance.workspaceName = name + try { + await modalRef.result + return true + } catch { + return false } } @@ -145,15 +179,16 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit } else { await this.workspaceService.updateWorkspace(workspace) } - this.loadWorkspaces() - this.isCreatingNew = false - // Select the saved workspace - const saved = this.workspaces.find((w) => w.id === workspace.id) - if (saved) { - this.selectWorkspace(saved) - } - this.cdr.detectChanges() + // Wrap state changes in zone.run to ensure proper change detection + this.zone.run(() => { + this.loadWorkspaces() + this.isCreatingNew = false + const saved = this.workspaces.find((w) => w.id === workspace.id) + if (saved) { + this.selectWorkspace(saved) + } + }) } onEditorCancel(): void { @@ -165,6 +200,7 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit } else { this.selectedWorkspace = null this.editingWorkspace = null + this.updateDisplayTabs() } } else if (this.selectedWorkspace) { // Reset to original workspace data @@ -186,6 +222,24 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit return JSON.stringify(this.editingWorkspace) !== JSON.stringify(this.selectedWorkspace) } + // Update display tabs array (call after state changes) + private updateDisplayTabs(): void { + const tabs = this.workspaces.map(w => ({ workspace: w, isNew: false })) + if (this.isCreatingNew && this.editingWorkspace) { + tabs.push({ workspace: this.editingWorkspace, isNew: true }) + } + this.displayTabs = tabs + } + + isTabSelected(tab: { workspace: Workspace; isNew: boolean }): boolean { + if (tab.isNew) return true + return this.selectedWorkspace?.id === tab.workspace.id + } + + trackByTab(index: number, tab: { workspace: Workspace; isNew: boolean }): string { + return tab.isNew ? '__new__' : tab.workspace.id + } + async openWorkspace(event: MouseEvent, workspace: Workspace): Promise { event.stopPropagation() if (this.openingWorkspaceId) return @@ -206,4 +260,5 @@ export class WorkspaceListComponent implements OnInit, OnDestroy, AfterViewInit this.cdr.detectChanges() } } + } diff --git a/src/index.ts b/src/index.ts index 607062c..3c62e6f 100644 --- a/src/index.ts +++ b/src/index.ts @@ -9,11 +9,13 @@ import { WorkspaceEditorSettingsProvider } from './providers/settings.provider' import { WorkspaceToolbarProvider } from './providers/toolbar.provider' import { WorkspaceEditorService } from './services/workspaceEditor.service' import { StartupCommandService } from './services/startupCommand.service' +import { WorkspaceBackgroundService } from './services/workspaceBackground.service' import { WorkspaceListComponent } from './components/workspaceList.component' import { WorkspaceEditorComponent } from './components/workspaceEditor.component' import { PaneEditorComponent } from './components/paneEditor.component' import { SplitPreviewComponent } from './components/splitPreview.component' +import { DeleteConfirmModalComponent } from './components/deleteConfirmModal.component' @NgModule({ imports: [CommonModule, FormsModule], @@ -23,12 +25,14 @@ import { SplitPreviewComponent } from './components/splitPreview.component' { provide: ToolbarButtonProvider, useClass: WorkspaceToolbarProvider, multi: true }, WorkspaceEditorService, StartupCommandService, + WorkspaceBackgroundService, ], declarations: [ WorkspaceListComponent, WorkspaceEditorComponent, PaneEditorComponent, SplitPreviewComponent, + DeleteConfirmModalComponent, ], }) export default class WorkspaceEditorModule {} diff --git a/src/models/workspace.model.ts b/src/models/workspace.model.ts index 6d5b5c7..770cd03 100644 --- a/src/models/workspace.model.ts +++ b/src/models/workspace.model.ts @@ -69,15 +69,44 @@ export interface WorkspaceSplit { children: (WorkspacePane | WorkspaceSplit)[] } +export interface WorkspaceBackground { + type: 'none' | 'solid' | 'gradient' | 'image' + value: string // CSS value: hex, gradient string, or URL +} + export interface Workspace { id: string name: string icon?: string color?: string + background?: WorkspaceBackground root: WorkspaceSplit launchOnStartup?: boolean } +// Preset backgrounds for quick selection +export const BACKGROUND_PRESETS: WorkspaceBackground[] = [ + { type: 'none', value: '' }, + // Existing presets + { type: 'gradient', value: 'linear-gradient(132deg, transparent 83%, rgba(6, 220, 249, 0.18) 100%), linear-gradient(210deg, transparent 85%, rgba(139, 92, 246, 0.2) 100%)' }, + { type: 'gradient', value: 'linear-gradient(135deg, rgba(16, 185, 129, 0.15) 0%, transparent 50%)' }, + { type: 'gradient', value: 'linear-gradient(45deg, rgba(239, 68, 68, 0.1) 0%, transparent 50%)' }, + { type: 'gradient', value: 'linear-gradient(135deg, rgba(59, 130, 246, 0.15) 0%, transparent 50%)' }, + { type: 'gradient', value: 'linear-gradient(225deg, transparent 70%, rgba(249, 115, 22, 0.15) 100%)' }, + { type: 'gradient', value: 'linear-gradient(180deg, rgba(139, 92, 246, 0.1) 0%, transparent 40%)' }, + // New presets + { type: 'gradient', value: 'linear-gradient(315deg, transparent 80%, rgba(236, 72, 153, 0.15) 100%)' }, // Pink bottom-right + { type: 'gradient', value: 'linear-gradient(0deg, rgba(6, 182, 212, 0.12) 0%, transparent 35%)' }, // Cyan bottom + { type: 'gradient', value: 'linear-gradient(45deg, transparent 85%, rgba(234, 179, 8, 0.18) 100%), linear-gradient(225deg, transparent 85%, rgba(249, 115, 22, 0.15) 100%)' }, // Gold corners + { type: 'gradient', value: 'linear-gradient(160deg, rgba(34, 197, 94, 0.12) 0%, transparent 40%)' }, // Green top-left + { type: 'gradient', value: 'linear-gradient(200deg, transparent 75%, rgba(99, 102, 241, 0.18) 100%)' }, // Indigo bottom-left + { type: 'gradient', value: 'linear-gradient(135deg, rgba(20, 184, 166, 0.1) 0%, transparent 50%), linear-gradient(315deg, rgba(139, 92, 246, 0.1) 0%, transparent 50%)' }, // Teal + Violet diagonal + { type: 'gradient', value: 'linear-gradient(90deg, rgba(239, 68, 68, 0.08) 0%, transparent 30%, transparent 70%, rgba(59, 130, 246, 0.08) 100%)' }, // Red-Blue sides + { type: 'gradient', value: 'linear-gradient(180deg, transparent 60%, rgba(16, 185, 129, 0.12) 100%)' }, // Emerald bottom fade + { type: 'gradient', value: 'linear-gradient(45deg, rgba(168, 85, 247, 0.1) 0%, transparent 40%), linear-gradient(225deg, rgba(6, 182, 212, 0.1) 0%, transparent 40%)' }, // Purple + Cyan corners + { type: 'gradient', value: 'linear-gradient(150deg, transparent 70%, rgba(251, 146, 60, 0.15) 100%), linear-gradient(30deg, transparent 70%, rgba(251, 146, 60, 0.1) 100%)' }, // Warm orange accents +] + /** * Type guard to check if a node is a WorkspaceSplit. * @param node - The node to check diff --git a/src/providers/toolbar.provider.ts b/src/providers/toolbar.provider.ts index 9eaeb70..022af9a 100644 --- a/src/providers/toolbar.provider.ts +++ b/src/providers/toolbar.provider.ts @@ -3,6 +3,7 @@ import { ToolbarButtonProvider, ToolbarButton, ProfilesService, AppService, Spli import { BaseTerminalTabComponent } from 'tabby-terminal' import { WorkspaceEditorService } from '../services/workspaceEditor.service' import { StartupCommandService } from '../services/startupCommand.service' +import { WorkspaceBackgroundService } from '../services/workspaceBackground.service' import { SettingsTabComponent } from 'tabby-settings' import { CONFIG_KEY, DISPLAY_NAME, IS_DEV } from '../build-config' @@ -32,9 +33,13 @@ export class WorkspaceToolbarProvider extends ToolbarButtonProvider { private workspaceService: WorkspaceEditorService, private profilesService: ProfilesService, private app: AppService, - private startupService: StartupCommandService + private startupService: StartupCommandService, + private backgroundService: WorkspaceBackgroundService ) { super() + // Initialize background service to listen for tab events + this.backgroundService.initialize() + // Wait for Tabby to finish recovery before launching startup workspaces this.waitForTabbyReady().then(() => { this.workspaceService.cleanupOrphanedProfiles() diff --git a/src/services/workspaceBackground.service.ts b/src/services/workspaceBackground.service.ts new file mode 100644 index 0000000..d085e6c --- /dev/null +++ b/src/services/workspaceBackground.service.ts @@ -0,0 +1,167 @@ +import { Injectable } from '@angular/core' +import { AppService, SplitTabComponent } from 'tabby-core' +import { WorkspaceEditorService } from './workspaceEditor.service' +import { WorkspaceBackground } from '../models/workspace.model' +import { CONFIG_KEY } from '../build-config' + +/** + * Service for applying custom backgrounds to workspace tabs. + * Injects CSS dynamically based on workspace configuration. + */ +@Injectable({ providedIn: 'root' }) +export class WorkspaceBackgroundService { + private styleElement: HTMLStyleElement | null = null + private appliedWorkspaces = new Map() // workspaceId -> CSS + + constructor( + private app: AppService, + private workspaceService: WorkspaceEditorService + ) {} + + /** + * Initialize the service by setting up tab event listeners. + * Must be called once during app initialization. + */ + initialize(): void { + this.setupTabListeners() + } + + private setupTabListeners(): void { + // Listen for tab open + this.app.tabOpened$.subscribe(tab => this.onTabOpened(tab)) + + // Listen for tab close - cleanup + this.app.tabClosed$.subscribe(tab => this.onTabClosed(tab)) + } + + private onTabOpened(tab: unknown): void { + if (!(tab instanceof SplitTabComponent)) return + + // Small delay to let Angular finish rendering + setTimeout(() => { + const workspaceId = this.extractWorkspaceId(tab) + if (!workspaceId) return + + const workspace = this.workspaceService.getWorkspaces() + .find(w => w.id === workspaceId) + + if (workspace?.background && workspace.background.type !== 'none') { + this.applyBackground(workspaceId, workspace.background) + } + }, 200) + } + + private onTabClosed(tab: unknown): void { + if (!(tab instanceof SplitTabComponent)) return + + const workspaceId = this.extractWorkspaceId(tab) + if (workspaceId) { + this.removeBackground(workspaceId) + } + } + + /** + * Extract workspace ID from a SplitTabComponent. + * Tries multiple strategies: _recoveredState and child profile ID. + */ + private extractWorkspaceId(tab: SplitTabComponent): string | undefined { + const tabAny = tab as any + + // Strategy 1: Check _recoveredState.workspaceId (for restored tabs) + if (tabAny._recoveredState?.workspaceId) { + return tabAny._recoveredState.workspaceId + } + + // Strategy 2: Extract from child profile ID (for freshly opened tabs) + const profilePrefix = `split-layout:${CONFIG_KEY}:` + for (const child of tab.getAllTabs()) { + const profileId = (child as any).profile?.id ?? '' + if (profileId.startsWith(profilePrefix)) { + // Profile ID format: split-layout:CONFIG_KEY:name:UUID + const parts = profileId.split(':') + return parts[parts.length - 1] + } + } + + return undefined + } + + private applyBackground(workspaceId: string, bg: WorkspaceBackground): void { + // Mark split-tab element with data attribute + this.markSplitTabElement(workspaceId) + + // Generate and inject CSS + const css = this.generateCSS(workspaceId, bg) + this.injectCSS(workspaceId, css) + } + + private markSplitTabElement(workspaceId: string): void { + // Find split-tab that doesn't have a workspace-id yet + const splitTabs = document.querySelectorAll('split-tab') + for (let i = splitTabs.length - 1; i >= 0; i--) { + const splitTab = splitTabs[i] + if (!splitTab.hasAttribute('data-workspace-id')) { + splitTab.setAttribute('data-workspace-id', workspaceId) + break + } + } + } + + private generateCSS(workspaceId: string, bg: WorkspaceBackground): string { + if (bg.type === 'none' || !bg.value) return '' + + return ` + split-tab[data-workspace-id="${workspaceId}"] { + background: ${bg.value} !important; + } + split-tab[data-workspace-id="${workspaceId}"] .xterm-viewport, + split-tab[data-workspace-id="${workspaceId}"] .xterm-screen { + background: transparent !important; + } + ` + } + + private injectCSS(workspaceId: string, css: string): void { + if (!this.styleElement) { + this.styleElement = document.createElement('style') + this.styleElement.id = 'tabbyspaces-backgrounds' + document.head.appendChild(this.styleElement) + } + + this.appliedWorkspaces.set(workspaceId, css) + this.updateStyleElement() + } + + private removeBackground(workspaceId: string): void { + this.appliedWorkspaces.delete(workspaceId) + this.updateStyleElement() + } + + private updateStyleElement(): void { + if (this.styleElement) { + this.styleElement.textContent = Array.from(this.appliedWorkspaces.values()).join('\n') + } + } + + /** + * Refresh background for a specific workspace. + * Call this when workspace background is updated in settings. + */ + refreshWorkspaceBackground(workspaceId: string): void { + const workspace = this.workspaceService.getWorkspaces() + .find(w => w.id === workspaceId) + + if (!workspace) { + this.removeBackground(workspaceId) + return + } + + if (workspace.background && workspace.background.type !== 'none') { + const css = this.generateCSS(workspaceId, workspace.background) + this.appliedWorkspaces.set(workspaceId, css) + } else { + this.appliedWorkspaces.delete(workspaceId) + } + this.updateStyleElement() + } +} diff --git a/src/styles/_mixins.scss b/src/styles/_mixins.scss index 114e02f..284b583 100644 --- a/src/styles/_mixins.scss +++ b/src/styles/_mixins.scss @@ -17,7 +17,7 @@ @mixin form-input($bg: var(--theme-bg)) { padding: $spacing-sm $spacing-md; border-radius: $radius-sm; - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); background: $bg; color: var(--theme-fg); font-size: $font-md; @@ -28,7 +28,7 @@ } &::placeholder { - color: var(--theme-fg-more); + color: var(--theme-fg-more, $fallback-fg-more); } } @@ -52,7 +52,7 @@ @mixin toolbar-btn { padding: $spacing-sm $spacing-md; background: var(--theme-bg); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-radius: $radius-sm; color: var(--theme-fg); cursor: pointer; @@ -98,7 +98,7 @@ @mixin btn-ghost { @include btn-base; background: transparent; - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); color: var(--theme-fg); &:hover { @@ -122,9 +122,9 @@ height: $size; @include flex-center; background: var(--theme-bg); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-radius: $radius-sm; - color: var(--theme-fg-more); + color: var(--theme-fg-more, $fallback-fg-more); cursor: pointer; font-size: 10px; transition: all $transition-fast; @@ -174,7 +174,7 @@ @mixin dropdown-panel { background: var(--theme-bg-more); - border: 1px solid var(--theme-border); + border: 1px solid var(--theme-border, $fallback-border); border-radius: $radius-md; box-shadow: $shadow-dropdown; } diff --git a/src/styles/_variables.scss b/src/styles/_variables.scss index ef55fb2..50d55a6 100644 --- a/src/styles/_variables.scss +++ b/src/styles/_variables.scss @@ -25,6 +25,10 @@ $color-success-hover: #059669; $color-warning: #f59e0b; $color-danger: #ef4444; +// Fallback values for Tabby theme variables that may not be defined +$fallback-border: rgba(255, 255, 255, 0.1); +$fallback-fg-more: rgba(255, 255, 255, 0.3); + // ====================== // SHADOWS (S1: Flat - no shadows) // ====================== From 5162abb930ab8e185744876697e8a14ec4c85fce Mon Sep 17 00:00:00 2001 From: halilc4 Date: Fri, 23 Jan 2026 09:36:08 +0100 Subject: [PATCH 15/18] docs: mark focus bug as fixed in TODO.md Co-Authored-By: Claude Opus 4.5 --- TODO.md | 1 + 1 file changed, 1 insertion(+) diff --git a/TODO.md b/TODO.md index eed336d..13a98ca 100644 --- a/TODO.md +++ b/TODO.md @@ -64,6 +64,7 @@ - [x] Refactoring: Remove profile persistence, shell-aware CWD, dead code cleanup ### Bugs +- [x] Focus lost after deleting workspace (native confirm() steals focus from Electron) - fix: use NgbModal instead - [x] Audit async functions - check if `detectChanges()` is missing after async operations that change state - [x] Split pane runs command (in-memory profiles) - fix: clear profile.options.args after command execution - [x] Pane editor modal bug - mouseup outside dialog closes modal. Dialog should close only on Esc or close/cancel/save button From 8e492355965f84e0be61d7337d42e033b8a93a8b Mon Sep 17 00:00:00 2001 From: halilc4 Date: Mon, 26 Jan 2026 14:37:30 +0100 Subject: [PATCH 16/18] release: v0.2.0 - S1 "Tight & Sharp" UI redesign - Tab bar navigation, inline pane editor - Bug fixes (focus, change detection) - Updated screenshots Co-Authored-By: Claude Opus 4.5 --- CHANGELOG.md | 46 ++++++++++++++++++++++++++++++++++++++ README.md | 39 +++++++++++++++++--------------- package.json | 2 +- screenshots/editor.png | Bin 85054 -> 180814 bytes screenshots/pane-edit.png | Bin 40032 -> 202571 bytes 5 files changed, 68 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9e8b6bc..87ca675 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,51 @@ # Changelog +## [0.2.0] - 2026-01-26 + +### Design + +- **S1 "Tight & Sharp" UI redesign** + - Tab bar navigation replaces vertical workspace list + - Inline pane editor replaces modal overlay + - Section-based layout with uppercase titles + - Reorganized preview toolbar with icon buttons + - 2-column form grid in pane editor +- Refactor SCSS to modular DRY architecture + - Shared variables: spacing scale, border radius, colors, z-index + - Reusable mixins: flex-row, form-input, interactive-card, toolbar-btn + - All components migrated to use shared styles +- Add design system documentation (docs/DESIGN.md) +- Add HTML mockups for design exploration + +### Reliability + +- Improved duplicate workspace detection on Tabby restart + - Add workspaceId to recovery tokens + - Two-strategy detection (restored tabs + freshly opened) +- Better shell initialization with 2s timeout and error handling +- Wait for Tabby recovery before launching startup workspaces +- Type-safe workspace detection with proper type guards + +### Bug Fixes + +- Fix focus lost after workspace delete (NgbModal replaces native confirm) +- Fix split preview change detection (remove OnPush strategy) +- Fix race condition in shell initialization + +### Infrastructure + +- Add CI/CD workflows (GitHub Actions for build + release) +- Add dev branch workflow documentation + +### Technical + +- Code review cleanup and fixes +- Consistent use of deepClone helper +- Add deleteConfirmModal component +- Improve singleton service patterns + +--- + ## [0.1.0] - 2026-01-13 ### Features diff --git a/README.md b/README.md index 06971ce..a683b48 100644 --- a/README.md +++ b/README.md @@ -4,19 +4,26 @@ Visual workspace editor for [Tabby](https://tabby.sh). Create split-layout termi ![Workspace Editor](screenshots/editor.png) -## What it does +## Features -- Visual editor for split layouts (horizontal/vertical, nested, any depth) -- Per-pane configuration: profile, working directory, startup command, title -- One-click workspace launch from toolbar -- Launch on startup (auto-open workspaces when Tabby starts) -- Works with any shell (Bash, Zsh, PowerShell, Nushell, etc.) +- **Visual split editor** - Design layouts inline, not in modal dialogs. Split horizontally, vertically, nest to any depth +- **Layout toolbar** - Select a pane, then split, add adjacent panes, or delete with toolbar buttons +- **Per-pane configuration** - Set profile, working directory, startup command, and custom title for each pane +- **One-click launch** - Open workspaces instantly from the toolbar dropdown +- **Launch on startup** - Auto-open multiple workspaces when Tabby starts +- **Any shell** - Works with Bash, Zsh, PowerShell, Nushell, cmd, WSL, and any other shell Tabby supports + +## Screenshots + +| Editor with selected pane | Pane configuration | +|---------------------------|-------------------| +| ![Editor](screenshots/editor.png) | ![Pane Edit](screenshots/pane-edit.png) | ## About this project This plugin was written 100% by [Claude Code](https://claude.ai/code). -Igor Halilović had the idea and provided product direction. He hates Angular so much (19 years of web dev, wrote his own TypeScript framework) that he didn't look at this code. Not once. He told Claude Code what he wanted, Claude Code built it. +Igor Halilovic had the idea and provided product direction. He hates Angular so much (19 years of web dev, wrote his own TypeScript framework) that he didn't look at this code. Not once. He told Claude Code what he wanted, Claude Code built it. Human provides the *what* and *why*. AI handles the *how*. @@ -25,7 +32,7 @@ Here's the fun part: to test this plugin, we built [tabby-mcp](https://github.co ## Install **From Tabby Plugin Manager:** -Settings → Plugins → Search "tabbyspaces" → Install +Settings > Plugins > Search "tabbyspaces" > Install **Manual:** ```bash @@ -35,17 +42,13 @@ npm install tabby-tabbyspaces Restart Tabby after installation. -## Usage - -1. Open Settings → TabbySpaces -2. Create a workspace -3. Design your split layout visually -4. Configure each pane (profile, cwd, startup command) -5. Save and launch from the toolbar - -### Pane configuration +## Quick Start -![Edit Pane](screenshots/pane-edit.png) +1. **Open settings** - Settings > TabbySpaces +2. **Create workspace** - Click "New Workspace", name it +3. **Design layout** - Click a pane to select it, use toolbar to split (horizontal/vertical) +4. **Configure panes** - Hover over a pane, click the edit icon to set profile, cwd, startup command +5. **Save and launch** - Save changes, then click "Open" or use the toolbar dropdown ## Roadmap diff --git a/package.json b/package.json index 46455e5..24eec8b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tabby-tabbyspaces", - "version": "0.1.0", + "version": "0.2.0", "description": "Workspaces for Tabby - Visual split-layout workspace editor", "keywords": [ "tabby", diff --git a/screenshots/editor.png b/screenshots/editor.png index af43a43badd0db7485441617937730ce28c33589..368718eacea004b9a951396c486fafe6dc8a3910 100644 GIT binary patch literal 180814 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⪚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

q3LVPUCGN3{1Bg(-%rBO^pYZARCDr(7XRzbQE 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 z

O%DJWS}Taj!uzZULKqF@KCvRaIc31o4K8 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%0Ar(`coh!&*E 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

%jgKt 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 NlAOA1tu!R~{{f&yKl%Uw literal 85054 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 E;jg$LBHYy9a50|4rqaB)$Pg}p;{MC{h+ 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 diff --git a/screenshots/pane-edit.png b/screenshots/pane-edit.png index e13c8a55a4df1aab4b7c0b194b14d94cd94d7541..534bc72e9dd88d9278cafedd8b01622727b4bfd7 100644 GIT binary patch literal 202571 zcmeEuXIN8P*DZ>QQjY>6NUdPeVh)^x(dR zF%1n}9}UeZ#MzVJUt$>?*l1|}qIsZk*Tg@4nMxPTO?XTW>m}#zOq|XA!to^>x}3qL z8I>Pc>nISrA{e_OUmprtT?z`BU6TK)H!~b7+W85Gx&Ki(->hvyWcY6GU#H$q1nsF! z*m~e;&c6J0@>KTZP96(dDQLcHM5v|9>x@I=%ZLb3nmen{<+&k+4gq?IoRq|? z=q)HERaH{*^Z4d(8+N72xGePLOixckp-?m$jqzRS=Qm|83gQ#l^+V z4NVE3nwlyPqb_xKcWcM-mX(+DsRsKyIxb9qi}WzDE}Gi--CJH<{C96}EqLMZrW?Y- zq@My=V+}qoT3T;>YWH?`{R60XnM-uTfBevbGwkl~*NTk&dOEHmo95P?Dw8a3qZ)P? zeCJL}_T7j#jGXFIvF_JA>Hb*y79}NJq#~+lvTGO8gMLJFCMG5d=%;_7g#Y^W)Wc(y zkGh}@Zaff4c=zsIgGRm4o=VWRGIewC({TDfuxeP*>*m)(6NTmmoH!9 zQSh|POtNZ4cJ>rU^X}_!)4Q1FeT?s%oEvd-d(^`cD|YRgI^ibxw2I$6936Lm#T!&s zR!URX+WA<{oil>4rwN7;nkhpk-NRdW!V7F}%>Ibk*w}!0tc+ASY$4kkXdgUyP*PGt ziLo{^dOXe0YhT60qi7P;hJs@*dC~HeAjNOqEF3Qr!-^{_H&#?s6c+wyUVY1OVSKSRs(EEJ*aZkEJN=iz7eLd-NAMS;Pohkx_!oObm^)p_^t|LK+vOwLL z6!2<~@n5DG8o{4D$qn>h-`H4MS}Ie@6T99Pc3nHx#5k{(7}w4B>@)XmVPR){sd;-W zPv_5{60f&dZ}9WaZS<;@BawsJIxKoBAbwJpIub>kKcDv2Qv06BykxT?N~&$#z`}C# z^0uTXT`5u=Vpg}CZwH5jB#T-WQVcScowhD*4B9LvS|=wbJ3M`Ag$>*)^eaWWu?px% z$Hh(7dpWqdtz^WJvYDsPU)NgbyY9K_MD$gZF_OcC%3AwXD&MvATp^-ue?%L7D&}im zB9u>7+UatrX-2$!Y2TA>ZfyMg*Wc%*?Dp2@K-kc+@D9}{Fr%PIQ@spD=wPkesQrnM zf$MR~&!<{W5a8PeDq9HwIW9CAQFRl(I@(dE!NPCy8>sI68msqWKfB;+3Ue@>%wE!g zy>h#tmTWK38KB(*S7 zE6U&AFby(bV`5_T?%y}O4>vROkNk#k{B7b!RM=QwPnfmrvAINaf>z<;H@$2k@A&%G zsC)5zrs!q!3u~=Xl9B3`JTkv~G9VnN*P-e`u!j$$L)$TL8X(CJjEp||PAMIj7xAS{ zQptWkj>VlCA-fhGws9(jJpLQ=-EtjcTN`0>9f`!(52sLY>I*vFI{&rYO5M|BN=$ZE z3-KHakK)r4A&H@(2&Kub?eZf^IYuEb^p!79`*GUCK1lWeFO#McR3mmd(S50GMv?(; zJRl#i{&eH1iJgXy37ZEg5a0fQ^Szj>&x4@tW%Duv_=Ks6$t{cO1rXefx8CWGJ58bT zV4MXnGktj=ygB*C5;5;o*(qawlOfl&q8&L#1o7#&AHV#>qq%{42QoUwZ&kLuT>+ds z*19~Nf*TZ01W##p_8m19w73w)WG7nD$4UiNtEcuJI=axGhi>=fnp|?I{`!pi5LUR@ zCG+4HY?0EDjb)Nl8J6 zDOBdtDpqz=<8lr}JNkM`&^A;nGG|*t4|ZY&OY+5eue?ySz?HYep8;D&lMRXLxp>Pg z+eHGNxkSH2!Xf<*BbRA2uQ9;St`1k+<4Btq|6A1IS8*r<{G`ZrW76l3A9ENyA=a&( zUtcpgbf<2SF{>7L==`|qT(nL8@&YFsoE0Ijioob|HVF$U(~{9&zTDm-3R$c9kcML1 zv85#?(*g{N1(PZrC(sa~{=v-BVVIg$;%5D-E!d@41_lNns|A{VF(Mg4?MYJ&X)xBM z(woo+9PF+wFT0}ee%#qzn>{{E9EiIcyefevN?#^~6=6NalP7-u{F$m7QU-Fxa&DT1 zwuY%`Qmjrv0qQT)X0@Ta1?8m%=m2n!lVYf!P=KQAVBfc>; zpB`=hBbEp0(crf_5$kde-sem>%+88p(zp2eEs}+RTKf1RKM~==nik8tay62LPj(QU zgRU*Ls+SZK)5m&2r)^g$a4a}zXHE*u|I^pRklO^s{H_O~qR zvIEfrBp8HV*!0)a)J^7d=lUlq?K+c~F3WyyN-q!HLMl3MigsnOItwX=^q-qaZrUtJ zNMMU^4%;4a$O@&D94AGZ-Fpq(mKfi%uS{N%>0(O>TuTF8)IxrE@XBcIYG2MhEMKya z^le*4v!2nv;Db1QJ4uvQL&qjp8SCpskN_bIA3?%b@HhyeEEXl2EKfGuBo}-A?twBS zrUIguVq$Fs(NjdS_^g? zDd*?4F)p2`hOGQjZG(KHrZovtKcz|9MXk5`W(m8&o|Y_9M#|tO0o6}*&>BX0CwBlu zuxj)-+AC==-m-J)=QXU z%LNQFP3RIY_~NoRHxBkTNS~RQnN1()!NQd$oIuu6P*4Cc0J357uvyc)G$jz5o825vWS;W#go@3A^f|f=Y0fDS=Y~@ z@RIhP>-T<#^*h?&&b_E9ttt0ChwT$m$MC(Wy?a?#DPmj2t$gxeUXHkl3b`dAVKma< z8|@Lgkv5;d@=hRgchMjWft~Bu=EEK4W&O}O+Ul2UT4T~A@r4~!G-OooXlZKl^Ybq{ z)Q!aZT*wPqBs3qQee*rS_D6}2tAniSpKCfuEiNuL@3x6EbIbo3^Xhe?8=OFeSTo?3 z)efdv(9NROjb`0deI6s}V?~bTeQX#A=Bu0jF*pu)@8jG8FX#ggTm0H*)xKy0A6X=J zU_bX%_)u}I*P-66V~L+Xe3+si#L2=h2zwenhntxE3gswA`Qp@(974lmb$8K8yYBFwPlcy{|Fz?8;1i#kJu)^}77Urj>|N$x>C$Nthd1OWE!gN8=;|u@k<)+X zG0@W|I4<4k6DxDS!9PXO#BDW|eVzXi;N?*nDghFzQC>MfU?m48CB=Jsr3E5uFjW*@ zm@J)A7#hF`z#v@$XW~Qt9r8HR=9Pu5b7HIx6xjjQa)YS7aKt z^uPt$tRs_biY7ivExJw!xh**MhEvMkk$_GY5Fs_xZTvpvSbOl(Aas2yf`#O;+^LeUN4Pn7*ciCwykb<|eAwX2z7juL>jA5c(ZAbeOKUO(vS8B2*!`f49$2+Naeh{o z4MuaJed`$4@o1H!tAxT>n3!-bD@Mdxw63G?>s{g=+S1h2G}WQj*KSl2GSxLA@=V_zBf|oQj&# z&r-z(fwdlYAJ)@36S~)F<4gG{xdXtTnO_>Jko|AL3JH(IR|}u;TP2mu@Qu`>dQyk9 zoE$7C>h##1Eaov>yWJBdc%;aE@&*x~Q6L(r3moPaq*Hv|m*_8{jO z=ZTC+1@cU2=QQZ^3UlG$(8;u2cw@Iv#=!ESOyXn{9zl;kkx@ zN``6+O-R-@lq&48bD!PKQS(o#qoS)-^2m+Bjvo_AxSHemxUr;eWz#X_=5ZPZR4eaJMXYpWDf%FiA^z|f(lvtB z2a6s-$lq$pL+ZX>)7N!OW*)nAO9AFi-XGznb29``R7;LL~doPO!j zyLNUZp0bB|`tws=ojk#ekJ9gY_`E|#GpHo+T~{6b%JxR=H}SCxROZ{?z60p%VUfFT zzVR`j)E6_&^^gr!Q}P@CuwPuk$J=LotE^rT+dsib&M&}Rw3r*}kDj>VSC2E_5gp~_J zy~RrwY}CHvik!(0EeBEwa~^H0$@(0q$3f=QN*@dsj$F8W*S1VxLiR5 zGAE~%k<}yClpqI%-aLTD;>nq&WA$eRHogZ)h)hz?OV?`e=bSVg4BriA<JvSW_7aJ#M!0w;N47>Lz0gBING~(Ho%0g>Wn@ssX>lBEx7?~Dl5dZ~Y zpY7JEAoiJ}=`*!Jcz_c@lBA8LHYt>?CHrE(*IV=p7``0DQ!}&AoN&;^ zYSMkpR0;CFO}cMHNC-X7+}EU}ARa!$q~uro;k-#3tM%S@0LgH-nKX0;SI9LqB{uV% zXEoLC*WVv4(wmZ#T;6n4r1RKX6bGmmn!cQH&Y@7h--}*N5B+uX=1o%9gCpnOezAPM z<_D7G9eKlnq(j#*-EjhUeE7$g5t=9J)K$7KfjPK7+{FXJY{pz;1wlZs=U6@aQ z-~qt7)$jb;sCit?^CEY#5I}V(o<0DT@41&(w~eYZi*#=ojNdtq`I=ti2Hm%l@Y~;{ z7qy@H`uh55T^dB8vV!tAz&6?XN z>V*1^u`p1V5R>Y#k$Lwo+1Xd%)uik217XpT#(*jSJ*52VFlQp4Q{U-$Y-}3BEI=;930F27ns2F_Pv>9HU$(d`VRJJ;X>)! z%g9M+B;u?0>)F)YTU#wJXje}94O$l3h=Rld;Vy^f6o}ZbT=RsfkQQ+ssizq(3a&s& z`IGnh`}^l1RMddFk1I2u>e$%pvI%ji?@Z)ZrkFsNu7xA}a1Qh^r*8jM^`4|%>wH)bMLF@as%u_P8yAMO7X&RvFVvxx0XG+TUJ5dP~|}xNw1t-LXzo4xwy+?Dq?udun?`s zBZJRa^bTJfy=;(eiB!-Oh3X?V4b5vRb$1p! zFk8A6vzxwEmOR9fj0_vyq31Gi^JWoUl3Be_VKuy2w`((2*ZU}TeyP~@&YT{a%)d1X zpLT739r`g&uS`U$X(FQ!U_T7LF@Uk8=uA5d-LV$Qbh&V&s{E0BMo=BL3y3~j`VoIGUI*mWLxym(?k8fv6HUWm^T^Eu(;;19lx+5{?N^SZQ&9X zL%8-10P7(4Z2-uit)<1xt8AwIJy8Va9`u3V{{vm^%g~weup=tzj`3us&rT^EQ-eTs zL=P8ZpLKnfAkH;NIEI>DzeRN4-fWIcjL1TUcHBmy`>|2uI5~?S#nkiC8er2#*&xnu?6qpLtA*p zrv3`Eh(SGv+J=h0*wl1)i-0@`haFK*!lu391Qow5AI%s^${19X?#)3f>)`N1L*A5d zu8@34ZY-ZupuK(J{;0A5!E%SMe`T9{!*}=3G$4Y^YTd^HeJ!K;+pJ@3aA4qJvOz`s z>lgQ_B0Q0`q!8z0D%#uLgO@jc`spz`q9$>=n)m+^4_$kY2|eM?d%>P8?yXl^Tx@8S zy-1O}eY+3aD3ZJ?V=+^d6&g6-l`=MF#lNU?a6~FU6uxq$C7A2Nh02iqZ9ph$5X1p> zW%PK!*SnSWSO@U?TZ1%MWKcWeO7b)&r(|Y^&ULV7beLW0^L7sb3_a%1Y7QKvu-VI# zW@u*|Aek{EpV!ydb91k0c>t>Z&ZG$hlBbIR4N|!{W0jS;d5Qc!C?Mpp)be+yPoLI7 zP5RF=Ntq(vzw|&7a5!9sTG+%Ee%h0fPt_^~LpcZbS5iukK3Zy0n6H-lGO8Pn>-!__)>S*)wDCe#<`z8dnRSy)tBP!@9*!&JO2z6 zCAiesPunQ4WZ{{!tE=TMA{(VL47K+O%PcCJA5hHd_wFGP2q2QE9{joI^T_Ou9FRO( z;CH5CLu1skPJxvMloF%RzbeT8RYm0Z#c62%cl4HUn5}KzX_^JNY+6};{m4m5QDNat zhJSwD`%%?De}g|-cx>-;{`-wG&;tJbn&lq_<)80bXwQxv$ItQghXyD@|GobIkN>}3 znLuUFo%Qup09Zi=YQ$naEb0mi?EwJ=P;6OQ*?*Kgup3nEI686!9gB6v6U|4D9(j3r zSz20h@UQp=Sy_!Cph&=&3JVLDPRz~Dva+$|e{Tk$)V^wOZ%;->rlcF6vGxf1-#ra) zDs89TSy*tiv6&ng7yw6>Kp^-TNnX451fUchY+{d}l;_UQ4xg0$Lm!{5xz1#EXG^~; zqM~kq^#naS<&e6M`xMC+x;sK*S1dN&SZlR@@KZk4bTTrHW%?_msEpy2MyFRl9P8x$nuM9Y-YRzc>KI)rTaL@ zY^Ery`p4hi06r83wYH8IfV`eD7!Et5-K}+}PdQ8xQ!O)dF1I*6BrOf4r`ZP`e^7z6xqRiTx}+J(sj&-H7`A`%F&wc1Zh`T6IOm095PpY4^K>kOd_=h|Dyi_=e)e!xQu^y>Z#?30%NMr3GibF3(Nb~aBLo1cF} zP0glaA9RbK;^Pf66zx=@xgpEL6|{8B($doDfEU%Zp$ve!0UdbGtWo7QS`#l|AS)wd zXK#Pl&qwXAb{dp*AM?*UEhGoaYzjLH?JjVIb2e~Z((Y6YJ8Z01gC7Y$fL$x6H%OPy zNdnMs2S9dFQBfeqq7cRq$ZGxX%nW_{F`Pkm3tS3i(>(E9)eT)*x(wp945-pSe;SGL z@$s#;zF7P>W2zvU&yerly$hNddURr=NDc~x%2W3n=QIx=pDqF2284 zXPq`}mC%#Mndt2j_0k{P6ukG`$;k-_oY(d*i#mcmOVyMCyR}%BWLLPP36lK!&Z}3a z(BFG|4MrL+5{X1afrzu*>}cI(mB8w+fo+@f(-rh%P*re7LFP#E8p;4dKLR0)Z3^5% zIM-o|YM!(J#bN15oF<=X5dH)DI zAcFeJw>l#Wg==^vo_yci_zlE6@1X}jgUroG07d&S-K}b5d3!Ph4NkaTAKLN(b3VF zEbbEM>RLJ%EJ?b@qLT3G)4=esJg^gJlISsdKU-Q_)F^psik?&9)*ydezkc0zvMD5K zqqPVjDkj#`+uIvru7d*+TLDhjmoHzy%4}|KzUL4p0}^viCJ2-R6O)9S4R2o8`>t33 zMLLRI1Z=3u1eNTAHte)$@Ge0Z@3btBRK1UilJ%Hy{h$45<_)`5G_V2k)EPQDKMDPY zpvPX5frPwL4K1ytgamL5e?$w|CL|}zNlOc^#>U3V+IGrwGmFBE_Iomvx`)ZY(*R5a zI@s<19=F(3@2rKQ2qdReL=Ko4#{m=k9Y7K!yc`db?6?ycJtP=naN zg~)+Z$*;>UPmWJk2xspDrv_2QgeK&};!jZ9TEhE>hyV7>rlFZC3_MUB!Q=5rebe%# znKQ3Ui^vbXjZ`P76s3#g!=mFb0ay5;BMtLIBPi5og($PrZ*S%7>)~RV}F3!#km*mbY?34fGlpL;|_!(Cq4U>~gdXDakSipfBzx2r8Q5c;4 z*c0;kjNz9nM%<>^>&%;o;F405N#{_%Yz`LDKs+ zeIGDl(b3A!W?lt6Rd;n=2C^N9bX^^tA8~xETswu;)tkW20a}HNW8e3PN7A@3>-;!a z^1FRB1s{g7!qirm?5AL4V`?lkH8m|Q_fw3GjS&b$wWea|kk9M2wY5}!aq;rBs^Sww zKHz$hZFz%#rg8K1Eeb={IixFdR(9l3z3+yajP*g|kv*AM36j5J`f5i+cTj@C!qkG( zqzRGyhd~O$eR#efa#%exMwur*K{odrJmP5t42B{~+^WuVH0;iCi(#vvrq+x?^>CS8 zU}Y`RODmj|0q{b=3v@;_o_^=+XlawiM|m-VsIn2^G4np+<|xfqrSI+HJBAixiHQyv`bqXQaKEM!G1nM1QBh8kl9JZJYns>$;G+r*3#y780(5(GgxWLmt|cd8$0$ii zpJs-4FR`vpt=5U%ZZKy{du@M0%`RWLBg$zn;;r)S+n!%vodb3OA@QT}dEnSEp2&AQ z&(7}CtFi;m>LO4cS1y8bdjJ$u9%cVONhkfbG9G5B!mApO4)@2?HFG9D@#}&r@*zGx z?+x%blw?q`gKg)flpVX(0*fA2aW}7ot#e6>dE!`H(~e4}zf;n>7LGeXWg(%T_Ek~X{CR@Ldh)6orH5|B=Hjb>gRwTRXY1qMC9`1;#Z4T5? zOd_x#D{R}HrFa1D^po)qI5ydgN2*lVZ{Cv;71ev+*ONUV&htr5MY?+9mQ9mYND4(L zaBW6&$@g_+q_}nCZeE-!*CVx<72o|2SMS}_OU=&;1xz@3_blIWa4+bcBDb_W-KcC6 z)w^$&X$CWc`Bqlv{Hc}8*>9ulY3(Lu3A>=2m@jj2tBBmR54D;X7c&`?_wtj+QnyEs zh0mF<1-i+qz#B$yFd4L}QeZ+qBV+Vp8JJf9sHr>JIXcYxdgXN){dz2~3c{+Xrp6Z_ zZLsKLKp;9nmpt?Z}0ddg@lcL)Te$EU@2n zHYa**DhdiZZjo?+@mw4}(HG~>uYWdRn?LCOa+pEo2#--oYaBJQTdnl4r4t`Rh?8x9 zd;a>6(_`MMLRxLe@n`UuY_haK@)n6AyQLo;(zjZEZ15=Vp62oDt&M=pJLy>JLZ+LJ zV4>R)bqZmu3X5@@O=VSUPpdV7OXPEED&kN${>##BiHwIT=j)aXK~Z*3ix2fD-R^&k z0Z8}qcybw*UqQi~4g(k(HGu{W#!RWgfD zN_3t~q8=SyaXVTyz|yYnTLu}LP$z6^@ku^Lde+txy`kGuo%L^Uv^j?tw)7VrpO@Wn zlaCKc!$Bbs*1!JBUKGv~0*Tn-s4)87A`Y4J4xwk+A*24bLCYjZHXUC>zi^!}-b7?I zu|ADRFFo;{%zDYI*DqHftb2ZoPVNiR;D)@YSR;eUCg`kBjjKb zST{vf8i8a6^voG+UrNhEWI_7?s1)tqIYJm1{PFZ^G0i{=1}-r zLkhgY!onie9(J?1^v~ZPuY*)DqMn(ChF!FE?c4Ckv6}!TZ!@6r4XX85yW$cWKM9A<7n77XXO2fjSfk~I%lj-Hmiw<=xWaZAbRX=(y5LCavK2EP*y>iS|#CF}hJ*ug;R-J{E z^+~xQAmFkAc*am549Jlj1`0<2LE+3RWgpFzZ41P!X~bQ+*b5u1`an<^;?1S!3;xq; zphh);e^9JgKE_$*hNeQqxTOsdfA6dcr_bzJQ6n-(HHLVe?s}DN~;0K*s}>heJJuQ6s}e( zoxB*@8Ag_KZIavDXH2vCGC9<~^6@9m3%^oPJKCR7N^ikc8khWWjx$W|M% zjWq*!g3z$k(9V*y;dw`tCRPSk_^&;28~L3THo^6mEA#5xHG}jA&8t*&fz{g2n?!)brcgws|W62!p-IG3kLjU)_Tz~@o46eVp z-unik>o^y>AtH?0U&b=Ko!`j}%7L-1+pn!G_-OW?}&fGzOZ=_SQSK;3E? zs@$YCrRxX8O0lL$7-6PbNY4d5mTVpPb8^z=0rpzxiZ1Cds6g>NPJJtH7r0vulfx+u zn*~GElG*WFFigz$J<ZVs1_At+_r_9~hYy-!4n z!O+qN?#ibkv+lJ?V{aBU{MmSU8CrbFair2N%7g9v{M;OsLTFYE+AbYn>QuN{x8543 zc4&5ff{1nr+pfw=!KATYT^Xw%jGjihE*u-hdi$ue zI_-PJZ`d%uc+5BZjfzovE(?9AY_cqxGU}GmV{K(sn*Y$K^oh*eGhj2;=^bYfY=le{ z-7;81*1YZL%~G2T&VPu1^+qSJT93W$M|-;n()iMEdLr9oxp|e=$MniaSm@Jc;6><6 z$w5wP8qES9oJn&M>J!4oyz!daR!5!OJxi;gx7+mH1$PEXFjv(RvBO5DF7FHUo-PHt zF4WW{X=y)=Qjy=*dV$#!Ikg2B>K-Bvb_{j!$+@S0vf8-xu&vZ0i+IYyHV~O$3Q1rW z_Jm~?`xNK>49*t<{!J)%xukG5A~SgXLE93sFv)8<6$s8QX{76?DWEi`eqQ>uls{!{ z*%AH6b}LLZCxZIqM~(DBO>Hlkr|+k&(Wu2zR1e!S^_dH#J4RUIUD@_yw>$~kA9Y8X zv9eM4{DzN1ImLQ~rvRdUAYzW80NX+Jk;`v2pfTHQiR-^r>0MXIZ>guS!u< zjPD@YscC5M-|UVa>I{G>@i$KU1yQ z+1Y@M0_M)_)JMkbqTt2eBpQd3jY)42=mJ3JHXgl1jjZr94{+_@8;+v3Y&y9s(D!-Csn zkm_-$`=%5+p|-0T=MKx>CVq5LI&^@yu89fv zoA%N7OB65$l7>n~Mn+I^3DeFoqE>Z%j9+*;IEuvh34Ooqf0z3XXxm>ToG-e*pcSX? z3%3QYxCZ;Xg}U`vnxhqD@NU#@ z>9e?=w{1itfHa8rO1q=E$Vc2 zn=TFW&F6jslshNL_cd;#QSaX$k4FWTp2#ahqy8jpjkcTYqGfTu2aSpj$&x$nxL@2q z;TdM}H}#&YNSKM3QaOoQ^A)+mdA8cfA?l-k1|IR+9S&vtmJm0Hs8Oe6ulnt{23#dk zrN#u(Wy4iZCYs6>O&~UYG_=YYk1B4zaGHdukSe^W-({~iiUibBXsNOzUmi#7-4p4o zKLk{WtPB3umO%El|SCeP4VMqdWbk|QC9-uhi>vh|LI81zu{7^yYP7$fQd}%(_m(Hf@Y?n3z@yodsbXnpn7!#cRBUuC zoSPPR$iOW}etn`fw)DC;PPV~^9NM^v>P_6UKcz-l-JZI%~h*U#NOV%!2!*q zeZ}Yi;d<;IeGPyXfa)+nh@#6lz=Ri|b5b?4CLHgA_ZKdWagXf=x|lhwk);Y*bsO=lN(WH+kbiAP7GCri!7*m!_kGl$2U^2<~HW_NR) zXf(f@c|lOmJdYv1%t)1C$qG!2Y%WNb-+e=IyHX{SjFE-c7m# zF;fQbVXf0jfV)D@1jip>b+{}&s%NU**@FSeZ+ZT4`)A8hGSK({A#YP=jJ8eq$B-!>f8f42f8SGH{- zK9lZa2M-cC3T(o(`otNMdB0VWeunX3v7mW5`-p>sgUBXKu{86N=zWPNn5&YM6p)$T z5Nit0Akibv?guNwWWPJ@u@vFzZQhVgqp|?I3?TFY^R_F@71%R?;ES*6yIVB7^!**H z1y%{rG*S++GnzbU!rA1DJMwk2FB89)BlM|<(%bN&NyrOlZ1A6%L^+T%a58<&QF|R9*sV`N;ebI9VYT5 z(`fZT?v*el@buaKP=26yC+g#wIK*%uSpf@(baH z$OlXpk~#7^=tmw{<-|+MpPm7XjQxE-c2)0%4|~@rFffmBBm9qNq6yK3+yd1>hH~J_ z`%E7+Y}0x9HC}Wh%i?CN?m>&A2Of)#1CV(5I26K*-c#5Ywn$5p+>!mw4UJto%eSoL z{<>T4?}r}BRrLi^R=;J2T@|gXLy0kOJgA|k5hB+V6)liPIc26F=|!kr9UYPnkoeE^ zj=Dk@n}NT09paT%^~BG|Md-OqZ<~w=UYQ4m9M>Qb|3X0c(U%?bTsoa6Kzr)!yK+_0 zzgy+2y?EuBH#M^5*>!KL+ufK~lPK$z(X~1TjblXr_#Vxb0%Cz)c?7;$!L#dTU+R!` z**l_^#dIp_lSPF^Z(!MV^|UF#yOUl@ia;<}h3s@Ur$HT4QW+Bo-y#b|(&~+>Tk5FE zCL+=@b)_a6-VwWp@6MlnK3Pgk4a~u6uJm6mrE0fH!{2){xw!wxHG-zXE?XQSMjzVT z?KBQpiF6Ko7oU`CSJGJM!q>+TlD|6Ito5Y-Y9a6UtM}e42==XJi@kxJ3|IPf7!0Pa zfqG$1Lt!sS;?bTXr*=Qy;A3;#slh#k)yjCK1$cPI_;_BQkQM2l{K%c%{rp?jH=>DV zOj(MID9*12*Y$yor<^6xc=5WFu(w?2=*o6%UUgca$wWwlPHJ}jlH$Iq^*qXi$^w^q(|SCr+~1qOus1unoVe(HnwUW> z+e0M}RD2nsYuIq@J^U&j*wrVX>MGcIYiwhdgxt5htnz`!@7b5n)Uk-LRAmvubYtYh)fhH2p+8Z_@Yq%dRYpgrm{a%NEG@rTEFVY}q42OxS`)k(>$O{>G=zO8wzZ^LzBrE5ymN zlVgd+rRndl-@btXH@h>^V1T*(c(Oa33?LMR^W;wGi(|9UqwuT8lh)&{_aOg@RR1q5 zLcj>)C(jMaR$O$nv`1QMs+d)sp|!R9zwdcFeA9m_Gbw31u{^k~y}ey#Zl>)$7|lF# zK2awcdOqUhy=%8N-OwrRqQ`ZIh9!kc65zFp>udIp7<(Eawj3Vwc-fvd$k^nS~Ev>j3)0;qewUeR6e2=EtU$GvWU+ zW`P$I^4!_pX5QVf1Jm^Xd0qeu3kxHoNsoIWP^gtD3wdDDI&>-?Ylk$ znogu!Eoj>n_&-hupWxn~?pmMn*{?CAVZw-S&LEXcRUH7ORO4XA7g+!T|~qMNc$F6Km!N#DFA{w1^`TL0%yS-ph^dh!}wQGi?taH~=>*_dOvQtTMnI^-tE;PO z&t|?mWCm!RW}^V)VgU3yRy7cjENTaa@9Hn+`@{J`0|SD*fF=Y89vyS&I-pji7V4+T z9#8c38H4TvOsv;@`0!U**4>CRCHx2y7~v;;2VPJBq&lY;)|&t4gO9zlZukc8uNf~H zGyp0*7`5M!mg@CKv-$Jb;=> zZgBWG5Kg>-TLWuK*HYWGRR)k6X$4q%s0RlLH5|aqo7bHt=hARtV?#g5>**!nYVS<^ zk~TdrQ&3nq|C+=4HuaQv^Fifap|!QOaLFqb;A5+-G-mDW>`Wy5o|^+tg#fB!@b|ap z5A}sXB&`FBaEd^a{nMw8*8IyBMjp-7niQC5%I(Kr0d_PQI2M_XuT3bHt&W9L^4IbB zc%mUNwAAk3zq;R_r%focBv7m2z(@cLt-!ViJb1tj2HbprKlEPcy9#-?FTbcW42&8e z@VhK`;y}X&G8n+5z?BMuP#Ru;P;8WU>v!KqYO$HkiG~Z?zkdA!$TU%6_6sKU8JIUG z!1pM=z?C5kB3#P<&!cXn|9J4wR6d8ZLr4gg^R#s*^jb5RYm2YBOcAq4Kej^k15*Mx z(mKEYn?7mo@Zmv`3-EMoUyRB;cAhv5-sJC}@6YQX% zvBC}o%jILGp{uLgo;~^e$K;dDe9}t3GrU(vCG@~wPp=#JagxN~K({!i3;^fBze?^! zdb8sj!R!q$5QE!*O#@6YE?akF`gy2tNd3>p2Yoy1a~so#GNvqESqxBfR{kvqewyN^ z$r;88!N5ld&b{i^5CjB`{Szaj{^Myh;VE+91R%QviJ=?aa*6MjR={~U`ektV6y$Io zT0hNc;Qp~^Oz}-108=0v8{3dP*y&?&+Q-KSH7~Sl-4q<~>{-Rd{HIo1V~z=XLqkIf zUh{zdr^^aEtXB{2mbdF*L+T<7(JAMr;X@BH0&>jg5ie0FjcW zT|{)P0fwo*K0|DVqL1^VM^k`>>}s^oc=F`Q+d*K$tG?wWfXNM;`)6eNapE}^7T5`| z=K9pKA#11*zPZ0o%>Gqih<3p?C=4Bwm?rG_b7sf*jEpiX>kPURCr$t&kz#Ct2fnGq zugH;9$3TWI?9qQB7(61SG@0xP9-jfkk+hdvfZ;Ri`9lTHJMfSU|Am}L>HY>yU|Z`z zvsYrsCxA;3c=MJw7Y9L%-f}o7BUmJ@FM-Ge|N2>=(4waWh%>M4UwN}nR6E7z`eIf6 z|72fV1rug5+zQ4DO(%B%LgkhBoC2;LP{NKai$nInqUw9Sr4HuVum4O}4Y8Q68`uU@1(vl1UrWX{ zq?j=QWx+NIyC9bPzJz*BaB$pl1=5_l2wG!+@Rk{c+0%&B{%hc{d&NnZo5uASw&S9)XkcWcQENbxXQ}LMpRgM z|GE&^dECBxx4NpTp)h5yf&vcH5vPIJ+qeG^Q_i%A)_>TmxmEiPuf2>wDT-(eLu>{~ z`@G^Fr?j$GU-o(p_IFe47Dya$$WUrGzJXIw!v>85prUn@Br8C7cW+YPMEBmOL?mMr zA=EtWcK8n9(IYZ-kW$0q^g4!~p+ZjErW5n7-yq4in1G*)Z-iZbnp9a8p_Ykjs-twK zsnE(8oX+B)Vn3_8Hr>S&E|b6A85a2}R9{@&PvTM%DINB9FE8M1CQ%JTpFWlHoObZ5 z+Rdl?f|BY9O&12Q+Lxb4MA+_kENgEk+?4`CAYTo70czE`Oc3|m~~lu4lIrr}xCAE!CNkR#>X%7Q_7D(MxGX-nAn+VfxhlPVEYDVbjRfKN`> z4}`R!IAUr93m?ip&UBrd9-paJO{>#3iWvn;$>geZLd{h9T2dojN6pDnEV-t#k|2P^ zCziIhj2HImQBT-x1;>yzA#PonLXr>zk?mDZ$kF4Ui&d}^rj+lWdN zE1A76DA8JZz|Wj+-9&)Zw$?gH+{VBP#n%w`(d~}9gbVu$4!ZLlxsL0L)k8;s)&$Q8 zTk9TY&ObUG$~qdFv0)JOO!`SqPn-cR@gdp{`<^PcG)j!n^d+Xj+V82$^cGLH+n1!> zNm0q00KW(<1Q#==zAg$bJlo)tA|b{Zmrtvx1aw;E-|((-S1d3cLh}}GLk5l3s=Z*O zn9?)o7m)0&b^gu*YO)}?kI!YaqJLnh%Ox)|+uU?tKmKo{zMWZj0_%$kGqZr8`a?F)iLTlTtYL)7Xr;B@bI zWQlK+b$;LRj`~1h_WJ>|{=r3c?SzI&OuFmnJvYV-)ilKuH3wP-+Vdj5-koBnA~xk; zYeyoI2r2eAj{p zEHtQ#J6LbNeG=z%=Z+Qmq}xb2XTTA(WDkfIxukJBJH@kVYTAp^w$T14e~q*znUh~Y zis_L8hxU%{{qJE^6|UDNfExjzk|}xG?=ZQ|E7@>m7lXO8YDlYwy2R>1&Xbrylu zo_dzWkI7m#XlsO>zPw#YJKm#nvoqi7oT|R}$2sf4on8_yEBobA?(VQBQEi_NDLk8R zN;E$cmYymkY|eDCa@o&e7~7F6(T^Uc*WAbNJ9PjpralExmo0AYO6!>1*zW>aEw8!E z$v3}ReH^0xSr8Hys~;IgQJayODRxCI^_2eUoX4hqg|HAYkI5KENuM3Au{bBD`~CY< zJ)dFK5vF?aRfc5`gPv|OH8!Sk+-~_bN3m0Sc}q;`o5xhjV2O4OOton?J8Y~=IXyUA z#7uX)-3`k*O1y|C@i0JPJMno_;Rq*Y_w=_gr+J)h9-0TboyfYw$Dy@2wl zaJo%?VWHug{@mq_wtJCg{8sT0aQWh#*^~O~0G?`V(Npyfpc+9FlE*x~ZtYqEyzPa` zM%~#t%jJr;E!tq@64Ww`g<2((<0d8o12o%wp{q^Bw$zH5o9Z4ujtmpV6j+y_LbC>6wTel*sI#;ljo5m*JGR}LbSZ% z4!6yz+m?0o*cywhAZezLr_7)ob5foN(^vqnMfJltg43d#l(PS@fEs6=T=Zoa>R80= zXQISDFd5LZEtHVgp)Td@(NXF$BUmX~!Lu_nLY$;qFCrtmUhNZSGvT6UW@Z*v<@KC= zY=Tf)R!(wPiVSt3bjuqtHqmktdP|qSTJm*1JNX5&XY$D-uZpc>JTh65!FeLK(q&Z^ zHT{0Y7szDxcuy7W9gHt*f8Tr(cR&DV(GM1@sU1bWSw&?mH)lZ?dlD%Kh$kTTjfBiH z>krbO>3JBuE}f&Kyt}tG(YIYq`cJyN7mis|D=m{xdf8+IC%TZ)s?d zp+W%TetMQsCS2tZ06&8=%RVJ`@KTL+v{i~i z(Wi$!IQLe=kgl5O>!;*cl|nTXR3dU$*E15*OE8*hwxYmoX_MSrG^p+4JEKYU_*ql= z>AO`XnX6iGLO*L@D*yzhQ=Xy~E8FrDyO=<(KBjP|T}+dw88S9=b~P=}jGr7qR;0xo zWOO$USjhZ7<^5X3-LGB!?r}&+((|@&-;LFKwR);5g8~Bs(WbXL8Y_2KW;k8FTJ1H& znZTVZ!jt`6`j$zq!(Wh)4b;b*pPG93@Zm?rg^q8ZnFIo}pK}ty|7%!MD-bOhd8Aa& zfvI#iAb=OX3R_BcK@EmOL{3|tLs7}gjG4K*=YX1#( zCm*td!)T%V#KBKjJ1==d%1OGG#)_KusE<3Ha?a$)E*RR`@du`)AAq=G;+qb~6!BeO z8~JH_&X>x1iBb53ZkHRt1=R3)gfRRTbW*!!$?|=E8vY zbI(&K6r&sukyUG5HBUh(rl+NK$&R0X;n-eDDXFk=tCwMEylQeaB!@M@RG~2D z{2AJQ9i=(Wlp|vMY^|lA@!A&$&R7Yj=InmvCaE@@^L%MWE4dE-a&;d&KJYPbxo@*@a>|@-I737m=j(F6e%ffA_UBb6W#pu@Aypt= z{3rict^WT>Yg@#Z+isH$d=u(**Plu8@jYN70`~hKndO=E!jkUxlLOT7A{ zNK4(&ZlLFZxhF8_lXG0^l1r_wPg#>s|%QlxN>od(bX zf)F^lfb!3(9;&0bHsfpE90CH7LRtwO?w{>4TM19R`^$7_a96|kYcTguvl^Np=m!83 zbwU~lU&$wE&Af)va=^9y4;m^J7`#_%)a_znk@RLPAt7O%!gT4?&Oti`D{E^JyxFug zofbw*OOke*U5-dxv1LTSO~O9lALvtL4;{J&p(JW(?>QEI9TfJmX?BP!s{mY32rlTn zFDm||N0l8-=2aW(8ycEkf*+9V|M}5L{tq=ZX-P>h**5_y5bbw4kBRn`Tb-MDc&vN4 zHf^%<`(Jv(wHPLl8t3t?CB(-IogT?jI(DoKmW@!;TQPQ+O@h2G10J!lh|@wWbXUrO zo1h*P=G8T%)^&6{SPZC4KtQ9td;9k7f`X?4Q6g(**vt6aksQ)*30cuaRelnVScS!3 z8B@2+NxM?&*$GC&w> zOO^_kt2uL;TdTr%Mmvz2n%ZbE@hB%JC+wnCLkaSDZxt^)0g??ism4K|>EtfjTELlE zTw&pjq8S@s#~*_Sz1$EIQLDnv(hMmuoH#j_=|)sC@CHfPxEi z6(cED9M&JBTs4lbM?iGssLVOC<<-?;qEAvH>CcreT_@;{zMU|9fv*a_i9;Vw2R3Np z&;^Z%j6yGwyPv$P3PBSMu0|Ay&YFbSf5eVda`c-XF-Sjf;!d79A=Qa-?|F{`6Ec5$ zXwoW!f`TmGsXi0W`uHjT=4LPTB>4L3kt?X=yPg9uLR z+N9ZEB=c~w(N^^mo~@b1Q3?H3cJ0|`4hZ|uMFBx=h9*!`^YJ(nT1V9SZ{ylkN&$`U z2j1xwfq@MYkYS`%L%%8mtTGG-_A^#Oa6>0GOzGI7z0;%#Cy(Rgents_<|2OW%Bhse zqQ-1sPnP+`w{?3lbOFI12x`+J+62U(IyCmCFlD)$=AYWN64eK+Q=XLl3-hh zrifB84Xgt1Za*H`<;;~USNgCMeNvv2{`wxVjLGR*!x%yhSDA`8k?vr)eiQ`GYfw}Z z19;;i{e6?T!ioRrr*j7_^h%d}sH)PU$^!x5cuT&R(@tC;3xkW~f=UFGS0Hi|l*vaq z8J5Z)5xoNPAX{U3&-6UwZm=d-bn8M71lk}0nh3vX=Ix)%wxfAM;1=*6r8z`7?k=k> zbS%E0Hac;4^B4?J1S{$Fk?y@)#7@c3iV03}qv|VkWDp3Mp=;u7rQK?ha^Z(Nq|i9# z-gO|)$)LCfXh;!xvpQsA`s)LVzL+w%!r0r50VO&oT5~EXEkB0ab<`sMtgH!sEW&(n z`*z(9&Q+_pldYrm@3jRDmez63)ITeZJ7lb5$!E2Tn0ukSiXrcB?2a}i+?ztEl{|-p zno0hs#Iz>K=(wyB$?L1nu>T9ytGQe$qA8=kc()jWBh@KLRxHAX&yJOu6*Kz z`isMQD}NE?E9_e{pdL5`N`TiYKYEJcOu;4+5G;k*;;^f(2mUS^_X=)YWmZENTHLTF z?K`9Ka{l!S0l_L=op5P;5L~~bwvyD~TRylNrqlF9m3Q2!;eBrd5-3ZR#9DLgP2Anx z;lN`}6J&VL4(G7$HC|vTS2N4PEi?llDK43iqi%7!gUObn`eC3^yFO7LTb;gi=_?u{ z22YA)LZKXJ^@TcdR62A3nhMlE3`|}Y7k762MK#ZT@J`(7)`tw8cdRr*MKB@<%xI&} z3c2JmrB5Zz-%#Jn&Ck8QN09sPm>=RT0+ZIzSbiD1a+o(Nx2tK9?F~d4Dgq0H34?z? z)aNK*$p7#2U>6v3c8Fb35SM0a>!q1mOuTHc>zqz~Ob}X}2Ob-1!xrm@OXRDX4_7-K z(t7eA7@L|}h`kEGUQqVo<41`dJKm__Zlr!O_p9}oV(K(MN3o8236^z37|l7{>*n9G z1%m`NjxiV&&`$Yf+F*WoY~&;uJDd{^Z^=o3K_%qs;!aJg)uHf8|*XSteYxN^A2(OK)@{^j7le{Dkv` z*ItPWx(>JLkVt*`ng?Q?vuCv|gXv(h6R`%$>-@v}dL$XFlQ~Z(G%56AUgT3%iF@7N zS_GBc{(*pEG5B}tk)q^w=lq0JPf-4#yIIM}8SvnN$;%7Z>-$`fXTSLmpE0Z;_{$11Wq}3GP;@%~RR6?*~(~+xjz)COwMFu_+ znPiezR+N;~4=*p>wI1zm4qd0Tv>L#I2O$Q@Fcf742HCp?MoJcnHG8Rj!a_o!{c(bN ziPoqd$nYzK6uIVJA9O8N$Bx~sH4DB)X_ejCxFxQ3tx;LB$QA;%K+&BALB3ABO+E|| zKrsOHLKq6WG@}f(P=VnISdQ*+E)q^YXS^ln=`=Jc#J@L>R>=u2x9&s@^E2CNu(0rO zge&x*Mf&RokJgcLul58yjahDe1YJs_bJ|9im6v6N#z>do$dQ(w`VV7H*I9>!OhmYe zhbh}?o$#qn4vY`){@P@Fp_u00YgKTinkZfR6*y|}MX}2zyrb*%crf6*yO*?)Gu36^ z_)USIN&^#sf+9VbG90a4^FMNG3_*R%7px0brn_x-H-sI-xTBHd&)JfN0&#I?JuavQ ztpz1}=VwQJhH3OhrwcjlIwu@|0-GZWRrR4yX1B#NI=!Zhj2;cttI>6ZBOg6N99~=H z-u_UW#?@6(UOpGOFyZ6;I>tJ*z1VUkT1Kgk-leJqaIv(Mtr{?$bk*RWGg)AnNb_xb z7g1ZywPon?C&|tEfwlEq=^`gx1)3OLU5bsTuNRLymcQ-YdEjZ_poY8Oo89;623~Q0 z8|}-f)vJjTm*vx@g(dB>GR0&}bzg|6{?&j~};C4vp??;;*6Jk-gNM7?u>&QC-hm6&9bg7|R_J4k!UZq{J0x%)~A( zYT~Wq^0H1_?6t~?RGdK3={0u^ZoF}jp}m!lFD*U!vY{CLu6}^-{m^pl_%+eZDZ-h5 z$=dq%HW`RDrmi_7>Nc1=T*qhrfH&lgQ7u9}q$)7J8@v;YPkuX;eE)n_u0wa+GkyzNZ`pmCe7+r@-n9X!6X}4?n z@Zu$6AaR-JaeGwbyQ#2C)u>Ry4Tq)nE+fhFwOd=j8NUXQrMw5e;CJV7MHkvj=E7&R zxoU<2j@e4_Eyo0yVCHxN_)(nARP?~TTj;f)@15;hC@wA#XLh>x@p*Zj`B+m!JA7oQ z)le8G&pEnc#DRYLj_DWbQa7`7>O`WQW<;f*+}x?e2P&iOXHuO8uc^}Zn~*N{yk|}+ zXv^evHp|k&i`qWqFQ&cyyNbE7UB@~rE6Z6lxmD!3tnSb}M~!Cn5av*0(vd9K*}MZ9_++Ug*+&>6Rqjr2$h3bPTA5qe~fT zGf<_WjxV-j$WnOLY}tRD#5tT{4;_6-$ma4n>d+Cd2%s8!_UsYS8M(%Qjp|;aC ze5GvquV%veW_o%$!;VzkVV5snP#t^DNUPeK9t7<%?y?*10TI(C+XlrVq|V!8w#*Q4 z=;>^{&sFE)?%o<<=*OrU8d997K0ti?OP4Ic!;g4o;@yg$-ESn%p9@nNF9I9xuy=k^ zz{$nKGx5ins6IlN&%=+l(0#0&heasL;jr_p({thsUkG{YZ);?=u!94bcQYW~3pE4t z4dqHZ5J`mW)Eo@5yJl+LCP!dD>Ht0l0$<8el7#+mopGiCFE_C@$L$NOJaJXv#+F}u z^<#~TX@XF1bS!jDl_4P^02_Y(^dyDi$@(Aw!X^GYbgT^jx8F4YX*8S$p7L<^_yNN! z7&BT2>~JZn`S4+2vfG&Lipc|zLiU$lA+40X`}fzg601{2S#*g2xber&iC^*A?mYhCCLOS!sO=Og>k4M7X5o}Aw~7-NlT5_MI0Qc@Bo;ljrV+epLA z)%gCe7nr(D=x&)?y6*5^Gmzm}c+zZC|Zvud92B&JVB-u$YiXSIDoyo$~VZbXKwK zOi7kK37`X-{1%AkH%S=VBmgv(6%rbNf2Ngjg-YW%I2HY>dBrSnC1A9g1(lkX(%g!C zXan&XCcuz{1pePI-P>Qzw>T;_wYt6CfM+juW>`;YSXrf%lq>*JcP@{&-rywgkg5Zc zk;^V{g+AjRK+9afFKN@?ruNJ|((6YkKAo>|;>OHhHqS(e#tdxM2W?ZjQ#SZ0#p9JC zgt~Ly3x>%)qc;Tv!eTUKhStzfZx&4 zA4m@=s-Gnm#w8Tzr@x}E^I4eff@A}xX!?K^>VKe)4axiNTA+Ts1d_19Zy5fLBco3f zia>DwVEEY8Py*^@>iOvL-jPE_L3t&tW&_3fu?K{o%aB~>;8KiN7BT-RTT+)E@<_zq za+A?LEEQ7io`$ws+_*65n->`Am>M1Io~0N6kTm+xPqqO@6$X->`DHk@Z1K+Md28sW2piZ178EC=xy@jJoruWxDMUuEHGaqM?X0jQ79=b z4Z5g)pA8%@Yk@*xfekKvcyKWH#*ML0lp@-SChJvY8xCCeK>wq+r%L9f8n~6fZ6qdTI7@UoSaR|UX+rcKNbHRucAg@I7k8m!PYkIs1pYh z(0RROAHGVKE68gB-?26*PQs#AnI@d24)X}Wv-;S&0vDQHBVqLe{ReZ7>?zW}{)>f~ zTgEpXGfil7gA^z0j#00--6Q1fC%SOqVSo|#;sw>PvtwCYRXE@w5O@Y;#iXQkc`oI1 zUajHYym=Z<>iv(8@$6j~6IgHrHIJA|%d5F(&9-Ag9C^s`s0=N`JigxC6!tEr77?@V z9v;$%@+$4yvujxTV`CUQ+p=Onegiy8At|lVvNk&QQRKwO>gv^;oSNyryd(KrOeBoG zSWWj?f;1l@W~GVsO~+H$t4JIQrKj|Pb4aXsBJ+W@p&Y&0h$KpcC$9Si;+Fs$UPsu) zr6Vpj{qV-!YIW_1IR>>N&mrMZK&lDbLnp zm5WTa18D{_VO)4^%xj8qMJDntFF(Kc_m+JJGOoZb3#~V1d*9~IHUGNkIjAz&Y_?@X zLLMo8OUYEx2rWB%(8b$(9(bA?aD;!~_wms|1IDD z<2tc982V(o-&Pm6nAy5*tv|!A#PUOSwv?ptg1(n;82shpeF)U~Y{AT(_4w~apQ+X` z^wY8|=(+o;DTVpA-)oO;j(6ld0sYGR64L{G83O%s*J%ZI*(vFg#r9M+m_sf4zu#E4 zcN95^MeA0;U;PYLV;?&JM!E}>5;{-1ZAt}SUW{}P(P-{ z51VFg^S+;y{ON!H3+7&w(bqrS#J_)kW3QA#ph;GVeUOi;ms5}5)%d2@$*(mUV)*9Q zQtWeSS#!0$#4q7{o=kior3Lee4CRlvxBU2i`>(TWr#R;srO{FaViz2u++MmF9WffF z=|}z<`Bvw{v66#39Niz6MZQ+Xb0RPMy-#k^{?U_IEq=bit=;tVopqY+rn`mx*70vJ zoyvZ8C5R?PlhTnEa-ZTHRXHEFxkT`FZ+ZE4Jl#G=lcl2^pl1>GdoT;6gE}TDDTzE} z50YFv@;1m*KY#wj?5SwY>eY7x3FKZFLHg9GKmPcm?rnBuZGJ>6&VSF?v= z5>F;7C{&y0aPx^)dk);NPIdJ!Azjcs=XAztV9d10*4naa=5qj}YSRG`aYyCHottb5 zn(OPnq*Qi0sDkYi+7Fz!6HNM2B;MY=jsswA8GvQy2{)~1Hsm$74dy8Py2-9!s&;aMli zPo7pe?SNA&?rs6GGXsW-q+aTQcMxkzfOeLes@4~Pu%c@cV?MOZ1!)r`V$kcGWl}=< z`S^-}^`TsH+3-tOV%(7Fqnz~64u@hE{zn;v)CXsX@gpk_#?tHC>A2cIl)dxO)hm;Shcj_G6V2>1J88_1DUFaiF zfulwN!}Zs(AUWAiu#9G2A3L_>%hKiPDt4(B+J$y95_yF;3d`!>81NcUsM<8Cg(;m7 zx7%)mvB#Dy=QyY%)ob_OE@k@WzVmRfBlvAtz2Sg5sP8LXml!yI z5v({EYUkUu?)RhTH`dQ|J{2=yUv0DNzdH%Kx9(IaN|N+dWuO`q$wN4Zg1WAN?D>3S zL=3SnXr1EEm;0wc@#{xn`~Lm=y>~iowSMGaW>p;UnOcWLs zZ47-XBQZHOMe=RIsP%z1p~wrXZ)}WvN>nyx*fS9PRpd26Lv!ce%ePcGR{aK>P1eeU z`1k4uV30+*@CNnxQ-GhJpe@OwtiJa6Z#KtpJph7wJ4MTS*kxK6ooQ-pJYRdv9Pa>B zaSTiHE3f*FGof1O>uil6r}`|ZmE z3$FQj2|~`=NsKD$g`((bH=f;{M>=ngoaN-(qU%;9HCrTNmZ)N{9W5Rklo$T$liT+e zM|d-MI~Kd)MxnYDc6b28TFYUeMNka+8q>dCFZhsQ;xSA^?j&cRI zmBbjz{Qb4^AsDKSp{)vjKyWiHuc2~5?+@MzfmRcho>dDdaZSQCNxKRAHN+MjQ)-T^ zj0Yyu++jn*kv~5~hJ^3b9)DHAFNZnE4USb@CkH7)feQp+W?`K7P3x?DygG;9_|wer zZc+(5SbbVF${sjl=na=5K`}8eAm=WHA=KT&-Ka5$%k26c!AcsFjb&po$39mm&cAy0 zjE;Gm^LtM$U}-Sm(#eawtUw(Mtf&-Tkq%;r^=d79ICcT7+Bp;V9&V%6DXkq`IN!_wWAfuG zs4cO7X``7F>NEBf=I4--j!&knS(S<$SGZ6Y(deqlOulFY{fK9 zlBRowM5Fy=W>9FadcLgc6ECh~2pc?4oxk-;X)!LmSq?dH!zhjyIPMT%AR2oIR4%kg375==dnj_UZ^9rqCKJ9?gAYM}G@T@1adXCrX;S?Sc*qKROH;CQza{>F1bS*UWw1ON+fi$idEs zUD?hiXBtoTraQWb!dymW_6GoI?o@hXqoD1A$-UX|ei&p11I!XC67?u9T{2(L*HJiKq; zs|G#Piv(*HJ~RxRrF>$V1GlJaP$B9(*yIe$E?90)PC5++XT#(03Knje%v6%pX4eTQ zY~$mzm05AWgv=VmIX^4+%bjOYV*RCZ?kiO`YYp61JhjZ!57##slwUZ!7w_ooK&#_B z2nT7XqVPg8gLJcQ^<4$*JHf;wJMgbskbryu5@94~kW&Rdw4M(*NIR}ka$1Ie5ObLC z`bo2YjzY_Tg~N!Zhn2Yb@w9q}hT7-G+qSk&5uf{zkpRQ_?`oi>_@I;#jVgQgA0kGA zdS2CO^ZT5kK#MSpU$V$o;x?Yo9Jtq*(8{B^2Do9gWfE)&u3{)%U1gzQQ+0Ly!S~`` zlZ;-GYG3i7e*Yn(#PS@sG6nn^;uR$@(2C30m$YByV>{z^_sED(tbucI70%}5vqAnf%TxQyZN zb4qhfsnJ3yTKdUQvFiyH;+K*C0Ht*_w3N#V?El~X_|oTa#Lq0ySU9g;$x8elcp z*`~lKnD517(w49sJ`|Es;JF7=3THM!zlX9nAp)8`l<(l+TiJSg78XZX>j|gl{SPiR6o+#s#4tZ%@2JId^K(J@yCpqe^91SbV7csvL<#(^0;nnbnG zn8)ZJbZY`WVIx>@_{Y!#dmyNU^Wxi%cR-60osBn2&Vqmd1u%AuZbQylZPX+j;l|zk zR?-@ziym540rzbRL7OsxW(Z}5r21RX*htT`{d^NAHh zrK%q(d>WH#B9JVHp5zF3%A=_+A0I5ujPazI*f+hzn52L9#PQ?Wzudh`1?odz*2(}9 z@)dXV#~BuK*8LU%K0@bi8CX$Lb8}m+cIp$2HF_miC!u8eBtS$SF0Q1zH@r7ihnXDaz~VIQKK{{xYqWh^G`a zlYu-_N6GV<+vLeadOV}12AZG7pFWth0mO&EMOfYkBW>&ppsK*BHc5zV1X@Q})9SgQ z;_X%L9`o>Po_xe!1P5wpc2Y$Ir*;E`AYM5zao9Y~l}kLe^?B|E7hW&n=)p2>$(z|o zq=KKAn{%aSkJq*RhXqJV>eaRwh0@0Droy{)E(ShPs4oFyRoeDg=99t3LN>j_rjrj? zqdqprf?@zh->J~tH-v2IKGs{lCZ9jwLfHMx`+}y65)W-)XkKH)UTif)!B4BpAG6X> zRb!^ptsc)*{(gt0!>jNBe~h01LQ(_b$;n-(Ugz07=e^4A7Z=*DBbQOg~R7Im1gy0+thXc~74{ z1=0a%`Zo1~&>^h_$O%!*oEmEGSRpK0$1Kg-nT-8#_UuR|?q@{K@)VSQzg_ zbMH6uzk&(ikfnS|dxBI%YIV(_csyrf0<@~3qvN~6-PwD+nx~&woE0Si=Jv2nw1&pQh>RR5|T!f?+S{>A=XSTswVF&BJ#ynC#O4#5$Na=+$=y#Da zn?%h|NSY&3nmhAyOsR~zE5J#fcpbhU&F$;GTU1o-wewU}BJ3=Fv|Lh2GMaK0IgN!f z7|7Yd{^@y6{0a^ZAzz|y6A>0RJPL3xkB1UzsrW_WioFpC*ZinT`Ugnw*@4$;fui1QH`h|aB?F&Hg>4NnhtI? z30Rh5Xkv8Nh`N~#5+7Lpzcj?ow+KTN=M~op_PW)twEejj*6pxNxv<)ecm%}j|I5;( z+*Q{LYRnOVSFK%Zhuo8rVueTc`{$y%?juVQ{vj}^Rm1!S{OcuCxHC|V3HoEpJ|M=rPCXNW)+y(763q^)K-=SDS17)0JXJlXy&Jm@G#vUq9qJs4` z#)>X%Vjxbk^9PV~%7<_T<})$a$8-VTOp(qTD*OXkL%=G-V*c<3QwXdp^ojZL>&;=D zg`5YdllusJX2!CUYX3w4j#Y#y15jC