tabby-tabbyspaces 0.1.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/.claude/settings.local.json +2 -1
  2. package/.github/workflows/ci.yml +26 -0
  3. package/.github/workflows/claude-code-review.yml +44 -0
  4. package/.github/workflows/claude.yml +81 -0
  5. package/.github/workflows/release.yml +30 -0
  6. package/CHANGELOG.md +46 -0
  7. package/CLAUDE.md +33 -0
  8. package/CONTRIBUTING.md +3 -1
  9. package/README.md +21 -18
  10. package/TODO.md +5 -0
  11. package/dist/build-config.d.ts +3 -3
  12. package/dist/components/deleteConfirmModal.component.d.ts +7 -0
  13. package/dist/components/deleteConfirmModal.component.d.ts.map +1 -0
  14. package/dist/components/paneEditor.component.d.ts +9 -18
  15. package/dist/components/paneEditor.component.d.ts.map +1 -1
  16. package/dist/components/splitPreview.component.d.ts +50 -50
  17. package/dist/components/splitPreview.component.d.ts.map +1 -1
  18. package/dist/components/workspaceEditor.component.d.ts +61 -54
  19. package/dist/components/workspaceEditor.component.d.ts.map +1 -1
  20. package/dist/components/workspaceList.component.d.ts +56 -39
  21. package/dist/components/workspaceList.component.d.ts.map +1 -1
  22. package/dist/index.d.ts +6 -6
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +1 -1
  25. package/dist/index.js.LICENSE.txt +1 -1
  26. package/dist/index.js.map +1 -1
  27. package/dist/models/workspace.model.d.ts +118 -78
  28. package/dist/models/workspace.model.d.ts.map +1 -1
  29. package/dist/package.json +1 -1
  30. package/dist/providers/config.provider.d.ts +8 -8
  31. package/dist/providers/settings.provider.d.ts +7 -7
  32. package/dist/providers/toolbar.provider.d.ts +23 -15
  33. package/dist/providers/toolbar.provider.d.ts.map +1 -1
  34. package/dist/services/startupCommand.service.d.ts +27 -19
  35. package/dist/services/startupCommand.service.d.ts.map +1 -1
  36. package/dist/services/workspaceBackground.service.d.ts +38 -0
  37. package/dist/services/workspaceBackground.service.d.ts.map +1 -0
  38. package/dist/services/workspaceEditor.service.d.ts +46 -32
  39. package/dist/services/workspaceEditor.service.d.ts.map +1 -1
  40. package/docs/DESIGN.md +57 -0
  41. package/docs/SESSION-2026-01-14-S1-DESIGN.md +134 -0
  42. package/mockups/index.html +162 -0
  43. package/mockups/s1-tight-sharp.html +522 -0
  44. package/mockups/shared/base.css +216 -0
  45. package/mockups/v06-tabbed.html +643 -0
  46. package/package.json +2 -1
  47. package/screenshots/editor.png +0 -0
  48. package/scripts/build-dev.js +2 -1
  49. package/scripts/build-prod.js +2 -1
  50. package/src/components/deleteConfirmModal.component.ts +23 -0
  51. package/src/components/paneEditor.component.pug +27 -43
  52. package/src/components/paneEditor.component.scss +37 -85
  53. package/src/components/paneEditor.component.ts +4 -32
  54. package/src/components/splitPreview.component.pug +0 -9
  55. package/src/components/splitPreview.component.scss +46 -70
  56. package/src/components/splitPreview.component.ts +15 -25
  57. package/src/components/workspaceEditor.component.pug +140 -112
  58. package/src/components/workspaceEditor.component.scss +270 -202
  59. package/src/components/workspaceEditor.component.ts +161 -85
  60. package/src/components/workspaceList.component.pug +31 -51
  61. package/src/components/workspaceList.component.scss +86 -77
  62. package/src/components/workspaceList.component.ts +89 -34
  63. package/src/index.ts +4 -0
  64. package/src/models/workspace.model.ts +80 -2
  65. package/src/providers/toolbar.provider.ts +78 -9
  66. package/src/services/startupCommand.service.ts +30 -32
  67. package/src/services/workspaceBackground.service.ts +167 -0
  68. package/src/services/workspaceEditor.service.ts +77 -40
  69. package/src/styles/_index.scss +3 -0
  70. package/src/styles/_mixins.scss +180 -0
  71. package/src/styles/_variables.scss +67 -0
  72. package/TEST_MCP.md +0 -176
  73. package/cdp-click.js +0 -22
  74. package/cdp-test.js +0 -28
  75. package/screenshots/pane-edit.png +0 -0
  76. package/test_cdp.py +0 -50
@@ -1,46 +1,26 @@
1
- //- Inline workspace editor
2
- .workspace-editor-inline
3
- .editor-body
4
- ng-container(*ngTemplateOutlet='editorContent')
1
+ //- Section 1: Workspace Settings
2
+ .editor-section
3
+ .section-title
4
+ i.fas.fa-cog
5
+ | Workspace Settings
5
6
 
6
- .editor-footer
7
- label.startup-checkbox
8
- input(type='checkbox', [(ngModel)]='workspace.launchOnStartup')
9
- | Launch on startup
10
- .editor-actions
11
- button.btn.btn-secondary.btn-sm(type='button', (click)='onCancel()') Cancel
12
- button.btn.btn-primary.btn-sm(type='button', (click)='onSave()', [disabled]='!workspace.name?.trim() || !hasUnsavedChanges')
13
- i.fas.fa-save
14
- | Save
15
- span.unsaved-indicator(*ngIf='hasUnsavedChanges') *
16
-
17
- //- Shared editor content
18
- ng-template(#editorContent)
19
- //- Top row: Color picker, Name input, Icon grid
20
- .editor-top-row
21
- .color-picker
22
- input.color-input(
23
- type='color',
24
- [(ngModel)]='workspace.color',
25
- title='Workspace color'
26
- )
27
-
28
- input.name-input(
29
- #nameInput,
30
- type='text',
31
- [(ngModel)]='workspace.name',
32
- placeholder='Name your workspace'
33
- )
34
-
35
- .icon-picker
36
- button.icon-trigger(
37
- type='button',
38
- [style.color]='workspace.color',
39
- (click)='toggleIconDropdown()',
40
- title='Select icon'
7
+ .form-row
8
+ .form-group
9
+ label Name
10
+ input.form-control(
11
+ #nameInput,
12
+ type='text',
13
+ [(ngModel)]='workspace.name',
14
+ placeholder='Workspace name'
41
15
  )
42
- i.fas([class]='"fa-" + workspace.icon')
43
16
 
17
+ .form-group.auto-width
18
+ label Icon
19
+ .dropdown-trigger((click)='toggleIconDropdown()')
20
+ span.dropdown-icon([style.color]='workspace.color')
21
+ i.fas([class]='"fa-" + workspace.icon')
22
+ span.dropdown-chevron
23
+ i.fas.fa-chevron-down
44
24
  .icon-dropdown(*ngIf='iconDropdownOpen')
45
25
  button.icon-option(
46
26
  *ngFor='let icon of availableIcons',
@@ -51,79 +31,110 @@ ng-template(#editorContent)
51
31
  )
52
32
  i.fas([class]='"fa-" + icon')
53
33
 
54
- //- Layout section
55
- .layout-section
56
- .layout-header
57
- span.layout-title Layout
58
-
59
- .layout-toolbar
60
- .toolbar-group.split-group
61
- span.toolbar-label Split
62
- button.toolbar-btn(
63
- type='button',
64
- [disabled]='!selectedPaneId',
65
- (click)='splitSelectedPane("horizontal")',
66
- title='Split Horizontal'
67
- )
68
- i.fas.fa-arrows-alt-h
69
- button.toolbar-btn(
70
- type='button',
71
- [disabled]='!selectedPaneId',
72
- (click)='splitSelectedPane("vertical")',
73
- title='Split Vertical'
34
+ .form-group.auto-width
35
+ label Color
36
+ .color-trigger
37
+ span.dropdown-color([style.background]='workspace.color')
38
+ input.color-input-hidden(
39
+ type='color',
40
+ [(ngModel)]='workspace.color'
74
41
  )
75
- i.fas.fa-arrows-alt-v
42
+ span.dropdown-chevron
43
+ i.fas.fa-chevron-down
76
44
 
77
- .toolbar-divider
78
-
79
- .toolbar-group.add-group
80
- span.toolbar-label Add
81
- button.toolbar-btn(
82
- type='button',
83
- [disabled]='!selectedPaneId',
84
- (click)='addPane("left")',
85
- title='Add Left'
86
- )
87
- i.fas.fa-caret-left
88
- button.toolbar-btn(
89
- type='button',
90
- [disabled]='!selectedPaneId',
91
- (click)='addPane("right")',
92
- title='Add Right'
93
- )
94
- i.fas.fa-caret-right
95
- button.toolbar-btn(
96
- type='button',
97
- [disabled]='!selectedPaneId',
98
- (click)='addPane("top")',
99
- title='Add Top'
100
- )
101
- i.fas.fa-caret-up
102
- button.toolbar-btn(
103
- type='button',
104
- [disabled]='!selectedPaneId',
105
- (click)='addPane("bottom")',
106
- title='Add Bottom'
107
- )
108
- i.fas.fa-caret-down
45
+ .form-group.auto-width
46
+ label Background
47
+ .background-picker
48
+ .background-trigger((click)='toggleBackgroundDropdown()')
49
+ span.background-preview([style.background]='workspace.background?.value || "transparent"')
50
+ i.fas.fa-ban(*ngIf='!workspace.background?.value')
51
+ span.dropdown-chevron
52
+ i.fas.fa-chevron-down
53
+ .background-dropdown(*ngIf='backgroundDropdownOpen')
54
+ .preset-grid
55
+ button.preset-option(
56
+ *ngFor='let preset of backgroundPresets',
57
+ type='button',
58
+ [class.selected]='isBackgroundSelected(preset)',
59
+ [style.background]='preset.value || "var(--theme-bg)"',
60
+ (click)='selectBackgroundPreset(preset)'
61
+ )
62
+ i.fas.fa-ban(*ngIf='preset.type === "none"')
63
+ .custom-input-wrapper
64
+ input.form-control.custom-bg-input(
65
+ type='text',
66
+ [(ngModel)]='customBackgroundValue',
67
+ placeholder='Custom CSS gradient...',
68
+ (blur)='applyCustomBackground()'
69
+ )
109
70
 
110
- .toolbar-spacer
71
+ //- Section 2: Split Layout
72
+ .editor-section
73
+ .section-title
74
+ i.fas.fa-columns
75
+ | Split Layout
111
76
 
112
- .toolbar-group
113
- button.toolbar-btn.danger(
114
- type='button',
115
- [disabled]='!selectedPaneId || !canRemovePane()',
116
- (click)='removeSelectedPane()',
117
- title='Remove pane'
118
- )
119
- i.fas.fa-trash
77
+ .split-preview-container
78
+ //- Preview toolbar
79
+ .preview-toolbar
80
+ button.preview-btn(
81
+ type='button',
82
+ title='Split Horizontal',
83
+ [disabled]='!selectedPaneId',
84
+ (click)='splitSelectedPane("horizontal")'
85
+ )
86
+ i.fas.fa-grip-lines-vertical
87
+ button.preview-btn(
88
+ type='button',
89
+ title='Split Vertical',
90
+ [disabled]='!selectedPaneId',
91
+ (click)='splitSelectedPane("vertical")'
92
+ )
93
+ i.fas.fa-grip-lines
94
+ span.toolbar-separator
95
+ button.preview-btn(
96
+ type='button',
97
+ title='Add Left',
98
+ [disabled]='!selectedPaneId',
99
+ (click)='addPane("left")'
100
+ )
101
+ i.fas.fa-arrow-left
102
+ button.preview-btn(
103
+ type='button',
104
+ title='Add Right',
105
+ [disabled]='!selectedPaneId',
106
+ (click)='addPane("right")'
107
+ )
108
+ i.fas.fa-arrow-right
109
+ button.preview-btn(
110
+ type='button',
111
+ title='Add Top',
112
+ [disabled]='!selectedPaneId',
113
+ (click)='addPane("top")'
114
+ )
115
+ i.fas.fa-arrow-up
116
+ button.preview-btn(
117
+ type='button',
118
+ title='Add Bottom',
119
+ [disabled]='!selectedPaneId',
120
+ (click)='addPane("bottom")'
121
+ )
122
+ i.fas.fa-arrow-down
123
+ span.toolbar-separator
124
+ button.preview-btn.danger(
125
+ type='button',
126
+ title='Remove pane',
127
+ [disabled]='!selectedPaneId || !canRemovePane()',
128
+ (click)='removeSelectedPane()'
129
+ )
130
+ i.fas.fa-trash
120
131
 
121
- .layout-preview-container((click)='onPreviewBackgroundClick()')
132
+ //- Split preview
133
+ .layout-preview((click)='onPreviewBackgroundClick()')
122
134
  split-preview(
123
135
  [split]='workspace.root',
124
136
  [selectedPaneId]='selectedPaneId',
125
137
  [profiles]='profiles',
126
- (paneSelect)='selectPane($event)',
127
138
  (paneEdit)='editPane($event)',
128
139
  (splitHorizontal)='splitPane($event, "horizontal")',
129
140
  (splitVertical)='splitPane($event, "vertical")',
@@ -134,11 +145,28 @@ ng-template(#editorContent)
134
145
  (removePane)='removePane($event)'
135
146
  )
136
147
 
137
- //- Pane editor (always modal)
138
- pane-editor(
139
- *ngIf='showPaneEditor && editingPane',
140
- [pane]='editingPane',
141
- [profiles]='profiles',
142
- (save)='onPaneSave($event)',
143
- (cancel)='closePaneEditor()'
144
- )
148
+ //- Inline pane editor
149
+ pane-editor(
150
+ *ngIf='showPaneEditor && editingPane',
151
+ [pane]='editingPane',
152
+ [profiles]='profiles',
153
+ (close)='closePaneEditor()'
154
+ )
155
+
156
+ //- Action buttons
157
+ .action-buttons
158
+ .checkbox-group
159
+ input(type='checkbox', [(ngModel)]='workspace.launchOnStartup', id='launchStartup')
160
+ label(for='launchStartup') Launch on startup
161
+ .action-buttons-right
162
+ button.btn.btn-ghost(type='button', (click)='onCancel()')
163
+ i.fas.fa-xmark
164
+ | Cancel
165
+ button.btn.btn-success(
166
+ type='button',
167
+ (click)='onSave()',
168
+ [disabled]='!workspace.name?.trim() || !hasUnsavedChanges'
169
+ )
170
+ i.fas.fa-check
171
+ | Save
172
+ span.unsaved-indicator(*ngIf='hasUnsavedChanges') *