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,254 +1,322 @@
1
- // Workspace editor (inline)
2
- .workspace-editor-inline {
3
- background: var(--theme-bg-more);
4
- border-radius: 8px;
5
- border: 1px solid var(--theme-border);
6
- margin-bottom: 16px;
1
+ @use '../styles/index' as *;
2
+
3
+ // Editor section
4
+ .editor-section {
5
+ margin-bottom: $spacing-xl;
6
+ }
7
+
8
+ .section-title {
9
+ font-size: 11px;
10
+ color: var(--theme-fg-more);
11
+ text-transform: uppercase;
12
+ letter-spacing: 0.5px;
13
+ margin-bottom: $spacing-lg;
14
+ display: flex;
15
+ align-items: center;
16
+ gap: $spacing-sm;
17
+ }
18
+
19
+ // Form layout
20
+ .form-row {
21
+ display: flex;
22
+ gap: $spacing-lg;
23
+ align-items: flex-end;
24
+ }
7
25
 
8
- .editor-body {
9
- padding: 16px;
26
+ .form-group {
27
+ flex: 1;
28
+ position: relative;
29
+
30
+ &.auto-width {
31
+ flex: none;
10
32
  }
11
33
 
12
- .editor-footer {
13
- display: flex;
14
- justify-content: space-between;
15
- align-items: center;
16
- padding: 10px 16px;
17
- border-top: 1px solid var(--theme-border);
18
- background: var(--theme-bg);
19
- border-radius: 0 0 8px 8px;
20
-
21
- .startup-checkbox {
22
- display: flex;
23
- align-items: center;
24
- gap: 6px;
25
- font-size: 0.85rem;
26
- color: var(--theme-fg-more);
27
- cursor: pointer;
28
-
29
- input {
30
- margin: 0;
31
- }
32
- }
34
+ label {
35
+ @include form-label;
36
+ }
37
+
38
+ .form-control {
39
+ @include form-input(var(--theme-bg-more));
40
+ width: 100%;
41
+ font-size: $font-sm;
42
+ // Override Tabby's global border reset
43
+ border: 1px solid var(--theme-border, $fallback-border) !important;
33
44
 
34
- .editor-actions {
35
- display: flex;
36
- gap: 8px;
37
-
38
- .btn-success {
39
- background: #10b981;
40
- border-color: #10b981;
41
- color: white;
42
-
43
- &:hover {
44
- background: #059669;
45
- border-color: #059669;
46
- }
47
- }
48
-
49
- .unsaved-indicator {
50
- color: #f59e0b;
51
- font-weight: bold;
52
- margin-left: 2px;
53
- }
45
+ &:focus {
46
+ border-color: var(--theme-primary) !important;
54
47
  }
55
48
  }
56
49
  }
57
50
 
58
- // Shared editor content
59
- .editor-top-row {
51
+ // Dropdown trigger (icon picker)
52
+ .dropdown-trigger {
60
53
  display: flex;
61
- align-items: flex-start;
62
- gap: 12px;
63
- margin-bottom: 16px;
64
- }
65
-
66
- .color-picker {
67
- .color-input {
68
- width: 40px;
69
- height: 40px;
70
- padding: 2px;
71
- border: 1px solid var(--theme-border);
72
- border-radius: 6px;
73
- cursor: pointer;
74
- background: var(--theme-bg);
54
+ align-items: center;
55
+ gap: $spacing-sm;
56
+ padding: $spacing-sm $spacing-md;
57
+ background: var(--theme-bg-more);
58
+ border: 1px solid var(--theme-border, $fallback-border);
59
+ border-radius: $radius-sm;
60
+ cursor: pointer;
61
+ transition: border-color $transition-fast;
62
+ height: 32px;
63
+ box-sizing: border-box;
64
+
65
+ &:hover {
66
+ border-color: var(--theme-fg-more);
67
+ }
68
+ }
75
69
 
76
- &::-webkit-color-swatch-wrapper {
77
- padding: 2px;
78
- }
70
+ .dropdown-icon {
71
+ font-size: 14px;
72
+ }
79
73
 
80
- &::-webkit-color-swatch {
81
- border-radius: 4px;
82
- border: none;
83
- }
84
- }
74
+ .dropdown-chevron {
75
+ color: var(--theme-fg-more);
76
+ font-size: 10px;
85
77
  }
86
78
 
87
- .name-input {
88
- flex: 1;
89
- min-width: 150px;
90
- padding: 10px 12px;
91
- border-radius: 6px;
92
- border: 1px solid var(--theme-border);
93
- background: var(--theme-bg);
94
- color: var(--theme-fg);
95
- font-size: 1rem;
96
- font-weight: 500;
79
+ // Icon dropdown
80
+ .icon-dropdown {
81
+ position: absolute;
82
+ top: 100%;
83
+ left: 0;
84
+ margin-top: $spacing-sm;
85
+ padding: $spacing-md;
86
+ @include dropdown-panel;
87
+ z-index: $z-dropdown;
88
+ display: grid;
89
+ grid-template-columns: repeat(6, 28px);
90
+ gap: $spacing-sm;
91
+ }
97
92
 
98
- &:focus {
99
- outline: none;
100
- border-color: var(--theme-primary);
93
+ .icon-option {
94
+ width: 28px;
95
+ height: 28px;
96
+ @include flex-center;
97
+ border: 1px solid transparent;
98
+ border-radius: $radius-sm;
99
+ background: transparent;
100
+ color: var(--theme-fg-more);
101
+ cursor: pointer;
102
+ transition: all $transition-fast;
103
+ font-size: 0.85rem;
104
+
105
+ &:hover {
106
+ background: var(--theme-bg-more-more);
107
+ color: var(--theme-fg);
101
108
  }
102
109
 
103
- &::placeholder {
104
- color: var(--theme-fg-more);
105
- font-weight: 400;
110
+ &.selected {
111
+ border-color: currentColor;
112
+ background: var(--theme-bg);
106
113
  }
107
114
  }
108
115
 
109
- .icon-picker {
116
+ // Color trigger (wraps native color input)
117
+ .color-trigger {
118
+ display: flex;
119
+ align-items: center;
120
+ gap: $spacing-sm;
121
+ padding: $spacing-sm $spacing-md;
122
+ background: var(--theme-bg-more);
123
+ border: 1px solid var(--theme-border, $fallback-border);
124
+ border-radius: $radius-sm;
125
+ cursor: pointer;
110
126
  position: relative;
127
+ transition: border-color $transition-fast;
128
+ height: 32px;
129
+ box-sizing: border-box;
111
130
 
112
- .icon-trigger {
113
- width: 40px;
114
- height: 40px;
115
- display: flex;
116
- align-items: center;
117
- justify-content: center;
118
- border: 1px solid var(--theme-border);
119
- border-radius: 6px;
120
- background: var(--theme-bg);
121
- cursor: pointer;
122
- font-size: 1.1rem;
123
- transition: background 0.15s;
131
+ &:hover {
132
+ border-color: var(--theme-fg-more);
133
+ }
124
134
 
125
- &:hover {
126
- background: var(--theme-bg-more);
127
- }
135
+ &:focus-within {
136
+ border-color: var(--theme-primary);
128
137
  }
129
138
 
130
- .icon-dropdown {
139
+ .color-input-hidden {
131
140
  position: absolute;
132
- top: 100%;
133
- right: 0;
134
- margin-top: 4px;
135
- padding: 8px;
136
- background: var(--theme-bg-more);
137
- border: 1px solid var(--theme-border);
138
- border-radius: 6px;
139
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
140
- z-index: 100;
141
- display: grid;
142
- grid-template-columns: repeat(6, 28px);
143
- gap: 4px;
144
- }
145
-
146
- .icon-option {
147
- width: 28px;
148
- height: 28px;
149
- display: flex;
150
- align-items: center;
151
- justify-content: center;
152
- border: 1px solid transparent;
153
- border-radius: 4px;
154
- background: transparent;
155
- color: var(--theme-fg-more);
141
+ top: 0;
142
+ left: 0;
143
+ width: 100%;
144
+ height: 100%;
145
+ opacity: 0;
156
146
  cursor: pointer;
157
- transition: all 0.15s;
158
- font-size: 0.85rem;
147
+ }
148
+ }
159
149
 
160
- &:hover {
161
- background: var(--theme-bg-more-more);
162
- color: var(--theme-fg);
163
- }
150
+ .dropdown-color {
151
+ width: 16px;
152
+ height: 16px;
153
+ border-radius: $radius-xs;
154
+ }
164
155
 
165
- &.selected {
166
- border-color: currentColor;
167
- background: var(--theme-bg);
168
- }
156
+ // Background picker
157
+ .background-picker {
158
+ position: relative;
159
+ }
160
+
161
+ .background-trigger {
162
+ display: flex;
163
+ align-items: center;
164
+ gap: $spacing-sm;
165
+ padding: $spacing-sm $spacing-md;
166
+ background: var(--theme-bg-more);
167
+ border: 1px solid var(--theme-border, $fallback-border);
168
+ border-radius: $radius-sm;
169
+ cursor: pointer;
170
+ transition: border-color $transition-fast;
171
+ height: 32px;
172
+ box-sizing: border-box;
173
+
174
+ &:hover {
175
+ border-color: var(--theme-fg-more);
169
176
  }
170
177
  }
171
178
 
172
- // Layout section
173
- .layout-section {
174
- .layout-header {
175
- display: flex;
176
- justify-content: space-between;
177
- align-items: center;
178
- margin-bottom: 8px;
179
+ .background-preview {
180
+ width: 48px;
181
+ height: 18px;
182
+ border-radius: $radius-xs;
183
+ border: 1px solid var(--theme-border, $fallback-border);
184
+ @include flex-center;
185
+ color: var(--theme-fg-more, $fallback-fg-more);
186
+ font-size: 10px;
187
+ }
188
+
189
+ .background-dropdown {
190
+ position: absolute;
191
+ top: 100%;
192
+ left: 0;
193
+ right: 0;
194
+ margin-top: $spacing-sm;
195
+ padding: $spacing-md;
196
+ @include dropdown-panel;
197
+ z-index: $z-dropdown;
198
+ min-width: 260px;
199
+ }
200
+
201
+ .preset-grid {
202
+ display: grid;
203
+ grid-template-columns: repeat(4, 1fr);
204
+ gap: $spacing-sm;
205
+ margin-bottom: $spacing-md;
206
+ }
207
+
208
+ .preset-option {
209
+ aspect-ratio: 1.5;
210
+ height: 32px;
211
+ @include flex-center;
212
+ border: 1px solid var(--theme-border, $fallback-border);
213
+ border-radius: $radius-sm;
214
+ cursor: pointer;
215
+ transition: all $transition-fast;
216
+ color: var(--theme-fg-more, $fallback-fg-more);
217
+ font-size: 10px;
218
+
219
+ &:hover {
220
+ border-color: var(--theme-fg-more);
179
221
  }
180
222
 
181
- .layout-title {
182
- font-size: 0.8rem;
183
- font-weight: 500;
184
- color: var(--theme-fg-more);
185
- text-transform: uppercase;
186
- letter-spacing: 0.5px;
223
+ &.selected {
224
+ border-color: var(--theme-primary);
225
+ border-width: 2px;
226
+ }
227
+ }
228
+
229
+ .custom-input-wrapper {
230
+ .custom-bg-input {
231
+ width: 100%;
232
+ font-size: $font-xs;
187
233
  }
188
234
  }
189
235
 
190
- // Layout toolbar
191
- .layout-toolbar {
236
+ // Split preview container
237
+ .split-preview-container {
238
+ background: var(--theme-bg-more);
239
+ border: 1px solid var(--theme-border, $fallback-border);
240
+ border-radius: $radius-md;
241
+ padding: $spacing-lg;
242
+ }
243
+
244
+ // Preview toolbar
245
+ .preview-toolbar {
192
246
  display: flex;
247
+ justify-content: flex-end;
193
248
  align-items: center;
194
- gap: 4px;
195
- padding: 8px 0;
196
- margin-bottom: 8px;
249
+ gap: $spacing-sm;
250
+ margin-bottom: $spacing-lg;
251
+ padding-bottom: $spacing-md;
252
+ border-bottom: 1px solid var(--theme-border, $fallback-border);
253
+ }
197
254
 
198
- .toolbar-group {
199
- display: flex;
200
- align-items: center;
201
- gap: 2px;
202
- }
255
+ .toolbar-separator {
256
+ width: 1px;
257
+ height: 18px;
258
+ background: var(--theme-border, $fallback-border);
259
+ margin: 0 $spacing-sm;
260
+ align-self: center;
261
+ }
203
262
 
204
- .toolbar-label {
205
- font-size: 0.75rem;
206
- color: var(--theme-fg-more);
207
- margin-right: 4px;
208
- text-transform: uppercase;
209
- letter-spacing: 0.3px;
210
- }
263
+ .preview-btn {
264
+ @include icon-btn-sm;
265
+ }
211
266
 
212
- .toolbar-spacer {
213
- flex: 1;
214
- }
267
+ // Layout preview area
268
+ .layout-preview {
269
+ background: var(--theme-bg);
270
+ border-radius: $radius-sm;
271
+ min-height: 150px;
272
+ max-height: 200px;
273
+ padding: $spacing-sm;
274
+ }
275
+
276
+ // Action buttons
277
+ .action-buttons {
278
+ display: flex;
279
+ justify-content: space-between;
280
+ align-items: center;
281
+ padding-top: $spacing-xl;
282
+ border-top: 1px solid var(--theme-border, $fallback-border);
283
+ margin-top: $spacing-xl;
284
+ }
285
+
286
+ .checkbox-group {
287
+ display: flex;
288
+ align-items: center;
289
+ gap: $spacing-sm;
215
290
 
216
- .toolbar-divider {
217
- width: 1px;
218
- height: 20px;
219
- background: var(--theme-border);
220
- margin: 0 4px;
291
+ input[type="checkbox"] {
292
+ width: 14px;
293
+ height: 14px;
294
+ margin: 0;
221
295
  }
222
296
 
223
- .toolbar-btn {
224
- padding: 4px 8px;
225
- background: var(--theme-bg);
226
- border: 1px solid var(--theme-border);
227
- border-radius: 4px;
297
+ label {
298
+ font-size: $font-sm;
228
299
  color: var(--theme-fg);
229
300
  cursor: pointer;
230
- transition: all 0.15s;
231
- font-size: 0.85rem;
301
+ }
302
+ }
232
303
 
233
- &:hover:not(:disabled) {
234
- background: var(--theme-bg-more-more);
235
- }
304
+ .action-buttons-right {
305
+ display: flex;
306
+ gap: $spacing-md;
236
307
 
237
- &:disabled {
238
- opacity: 0.4;
239
- cursor: not-allowed;
240
- }
308
+ .btn-ghost {
309
+ @include btn-ghost;
310
+ }
241
311
 
242
- &.danger {
243
- color: var(--theme-danger, #ef4444);
244
- }
312
+ .btn-success {
313
+ @include btn-base;
314
+ @include btn-success;
245
315
  }
246
- }
247
316
 
248
- .layout-preview-container {
249
- background: var(--theme-bg);
250
- border-radius: 6px;
251
- padding: 8px;
252
- min-height: 120px;
253
- max-height: 180px;
317
+ .unsaved-indicator {
318
+ color: $color-warning;
319
+ font-weight: bold;
320
+ margin-left: $spacing-xs;
321
+ }
254
322
  }