tabby-tabbyspaces 0.0.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/.claude/settings.local.json +29 -2
  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 +92 -20
  7. package/CLAUDE.md +196 -15
  8. package/CONTRIBUTING.md +3 -1
  9. package/README.md +80 -61
  10. package/RELEASE.md +91 -0
  11. package/TODO.md +77 -0
  12. package/dist/build-config.d.ts +3 -3
  13. package/dist/components/deleteConfirmModal.component.d.ts +7 -0
  14. package/dist/components/deleteConfirmModal.component.d.ts.map +1 -0
  15. package/dist/components/paneEditor.component.d.ts +9 -13
  16. package/dist/components/paneEditor.component.d.ts.map +1 -1
  17. package/dist/components/splitPreview.component.d.ts +50 -35
  18. package/dist/components/splitPreview.component.d.ts.map +1 -1
  19. package/dist/components/workspaceEditor.component.d.ts +61 -28
  20. package/dist/components/workspaceEditor.component.d.ts.map +1 -1
  21. package/dist/components/workspaceList.component.d.ts +56 -27
  22. package/dist/components/workspaceList.component.d.ts.map +1 -1
  23. package/dist/index.d.ts +6 -6
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +1 -1
  26. package/dist/index.js.LICENSE.txt +1 -1
  27. package/dist/index.js.map +1 -1
  28. package/dist/models/workspace.model.d.ts +118 -76
  29. package/dist/models/workspace.model.d.ts.map +1 -1
  30. package/dist/package.json +26 -0
  31. package/dist/providers/config.provider.d.ts +8 -8
  32. package/dist/providers/settings.provider.d.ts +7 -7
  33. package/dist/providers/settings.provider.d.ts.map +1 -1
  34. package/dist/providers/toolbar.provider.d.ts +23 -12
  35. package/dist/providers/toolbar.provider.d.ts.map +1 -1
  36. package/dist/services/startupCommand.service.d.ts +28 -0
  37. package/dist/services/startupCommand.service.d.ts.map +1 -0
  38. package/dist/services/workspaceBackground.service.d.ts +38 -0
  39. package/dist/services/workspaceBackground.service.d.ts.map +1 -0
  40. package/dist/services/workspaceEditor.service.d.ts +46 -24
  41. package/dist/services/workspaceEditor.service.d.ts.map +1 -1
  42. package/docs/DESIGN.md +57 -0
  43. package/docs/SESSION-2026-01-14-S1-DESIGN.md +134 -0
  44. package/docs/marketing_status.md +92 -0
  45. package/mockups/index.html +162 -0
  46. package/mockups/s1-tight-sharp.html +522 -0
  47. package/mockups/shared/base.css +216 -0
  48. package/mockups/v06-tabbed.html +643 -0
  49. package/package.json +3 -7
  50. package/screenshots/editor.png +0 -0
  51. package/screenshots/pane-edit.png +0 -0
  52. package/scripts/build-dev.js +2 -1
  53. package/scripts/build-prod.js +40 -0
  54. package/src/components/deleteConfirmModal.component.ts +23 -0
  55. package/src/components/paneEditor.component.pug +27 -43
  56. package/src/components/paneEditor.component.scss +37 -85
  57. package/src/components/paneEditor.component.ts +6 -16
  58. package/src/components/splitPreview.component.pug +36 -5
  59. package/src/components/splitPreview.component.scss +78 -45
  60. package/src/components/splitPreview.component.ts +83 -18
  61. package/src/components/workspaceEditor.component.pug +162 -74
  62. package/src/components/workspaceEditor.component.scss +261 -108
  63. package/src/components/workspaceEditor.component.ts +294 -31
  64. package/src/components/workspaceList.component.pug +32 -41
  65. package/src/components/workspaceList.component.scss +89 -74
  66. package/src/components/workspaceList.component.ts +181 -44
  67. package/src/index.ts +6 -0
  68. package/src/models/workspace.model.ts +113 -8
  69. package/src/providers/settings.provider.ts +2 -2
  70. package/src/providers/toolbar.provider.ts +113 -13
  71. package/src/services/startupCommand.service.ts +140 -0
  72. package/src/services/workspaceBackground.service.ts +167 -0
  73. package/src/services/workspaceEditor.service.ts +134 -65
  74. package/src/styles/_index.scss +3 -0
  75. package/src/styles/_mixins.scss +180 -0
  76. package/src/styles/_variables.scss +67 -0
  77. package/RELEASE_PLAN.md +0 -161
  78. package/screenshots/workspace-edit.png +0 -0
@@ -1,169 +1,322 @@
1
- .workspace-editor-overlay {
2
- position: fixed;
3
- top: 0;
4
- left: 0;
5
- right: 0;
6
- bottom: 0;
7
- background: rgba(0, 0, 0, 0.6);
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;
8
14
  display: flex;
9
15
  align-items: center;
10
- justify-content: center;
11
- z-index: 1000;
16
+ gap: $spacing-sm;
12
17
  }
13
18
 
14
- .workspace-editor-modal {
15
- background: var(--theme-bg);
16
- border-radius: 12px;
17
- width: 90%;
18
- max-width: 700px;
19
- max-height: 90vh;
20
- overflow: hidden;
19
+ // Form layout
20
+ .form-row {
21
21
  display: flex;
22
- flex-direction: column;
23
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
22
+ gap: $spacing-lg;
23
+ align-items: flex-end;
24
24
  }
25
25
 
26
- .modal-header {
27
- display: flex;
28
- justify-content: space-between;
29
- align-items: center;
30
- padding: 16px 20px;
31
- border-bottom: 1px solid var(--theme-border);
26
+ .form-group {
27
+ flex: 1;
28
+ position: relative;
32
29
 
33
- h4 {
34
- margin: 0;
35
- font-size: 1.25rem;
30
+ &.auto-width {
31
+ flex: none;
36
32
  }
37
33
 
38
- .close-btn {
39
- font-size: 1.25rem;
40
- color: var(--theme-fg-more);
41
- padding: 4px 8px;
34
+ label {
35
+ @include form-label;
36
+ }
42
37
 
43
- &:hover {
44
- color: var(--theme-fg);
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;
44
+
45
+ &:focus {
46
+ border-color: var(--theme-primary) !important;
45
47
  }
46
48
  }
47
49
  }
48
50
 
49
- .modal-body {
50
- padding: 20px;
51
- overflow-y: auto;
52
- flex: 1;
53
- }
54
-
55
- .form-row {
51
+ // Dropdown trigger (icon picker)
52
+ .dropdown-trigger {
56
53
  display: flex;
57
- gap: 16px;
58
- margin-bottom: 16px;
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;
59
64
 
60
- &:last-child {
61
- margin-bottom: 0;
65
+ &:hover {
66
+ border-color: var(--theme-fg-more);
62
67
  }
63
68
  }
64
69
 
65
- .form-group {
66
- display: flex;
67
- flex-direction: column;
68
- gap: 6px;
70
+ .dropdown-icon {
71
+ font-size: 14px;
72
+ }
69
73
 
70
- &.flex-grow {
71
- flex: 1;
72
- }
74
+ .dropdown-chevron {
75
+ color: var(--theme-fg-more);
76
+ font-size: 10px;
77
+ }
73
78
 
74
- label {
75
- font-size: 0.9rem;
76
- color: var(--theme-fg-more);
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
+ }
92
+
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);
77
108
  }
78
109
 
79
- input[type='checkbox'] {
80
- margin-right: 8px;
110
+ &.selected {
111
+ border-color: currentColor;
112
+ background: var(--theme-bg);
81
113
  }
82
114
  }
83
115
 
84
- .form-control {
85
- padding: 8px 12px;
86
- border-radius: 6px;
87
- border: 1px solid var(--theme-border);
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;
88
122
  background: var(--theme-bg-more);
89
- color: var(--theme-fg);
90
- font-size: 0.95rem;
123
+ border: 1px solid var(--theme-border, $fallback-border);
124
+ border-radius: $radius-sm;
125
+ cursor: pointer;
126
+ position: relative;
127
+ transition: border-color $transition-fast;
128
+ height: 32px;
129
+ box-sizing: border-box;
91
130
 
92
- &:focus {
93
- outline: none;
131
+ &:hover {
132
+ border-color: var(--theme-fg-more);
133
+ }
134
+
135
+ &:focus-within {
94
136
  border-color: var(--theme-primary);
95
137
  }
138
+
139
+ .color-input-hidden {
140
+ position: absolute;
141
+ top: 0;
142
+ left: 0;
143
+ width: 100%;
144
+ height: 100%;
145
+ opacity: 0;
146
+ cursor: pointer;
147
+ }
96
148
  }
97
149
 
98
- .color-input {
99
- width: 60px;
100
- height: 36px;
101
- padding: 2px;
102
- cursor: pointer;
150
+ .dropdown-color {
151
+ width: 16px;
152
+ height: 16px;
153
+ border-radius: $radius-xs;
103
154
  }
104
155
 
105
- .icon-selector {
106
- display: flex;
107
- flex-wrap: wrap;
108
- gap: 4px;
156
+ // Background picker
157
+ .background-picker {
158
+ position: relative;
109
159
  }
110
160
 
111
- .icon-option {
112
- width: 36px;
113
- height: 36px;
161
+ .background-trigger {
114
162
  display: flex;
115
163
  align-items: center;
116
- justify-content: center;
117
- border: 1px solid var(--theme-border);
118
- border-radius: 6px;
164
+ gap: $spacing-sm;
165
+ padding: $spacing-sm $spacing-md;
119
166
  background: var(--theme-bg-more);
120
- color: var(--theme-fg-more);
167
+ border: 1px solid var(--theme-border, $fallback-border);
168
+ border-radius: $radius-sm;
121
169
  cursor: pointer;
122
- transition: all 0.2s;
170
+ transition: border-color $transition-fast;
171
+ height: 32px;
172
+ box-sizing: border-box;
123
173
 
124
174
  &:hover {
125
- background: var(--theme-bg-more-more);
126
- color: var(--theme-fg);
175
+ border-color: var(--theme-fg-more);
176
+ }
177
+ }
178
+
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);
127
221
  }
128
222
 
129
223
  &.selected {
130
224
  border-color: var(--theme-primary);
131
- background: var(--theme-primary);
132
- color: white;
225
+ border-width: 2px;
133
226
  }
134
227
  }
135
228
 
136
- .form-section {
137
- margin-top: 20px;
229
+ .custom-input-wrapper {
230
+ .custom-bg-input {
231
+ width: 100%;
232
+ font-size: $font-xs;
233
+ }
234
+ }
138
235
 
139
- .section-header {
140
- display: flex;
141
- justify-content: space-between;
142
- align-items: center;
143
- margin-bottom: 12px;
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
+ }
144
243
 
145
- h5 {
146
- margin: 0;
147
- font-size: 1rem;
148
- }
149
- }
244
+ // Preview toolbar
245
+ .preview-toolbar {
246
+ display: flex;
247
+ justify-content: flex-end;
248
+ align-items: center;
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
+ }
254
+
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
+ }
262
+
263
+ .preview-btn {
264
+ @include icon-btn-sm;
265
+ }
266
+
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;
150
284
  }
151
285
 
152
- .orientation-toggle {
286
+ .checkbox-group {
153
287
  display: flex;
154
- gap: 8px;
288
+ align-items: center;
289
+ gap: $spacing-sm;
155
290
 
156
- .btn {
157
- display: flex;
158
- align-items: center;
159
- gap: 6px;
291
+ input[type="checkbox"] {
292
+ width: 14px;
293
+ height: 14px;
294
+ margin: 0;
295
+ }
296
+
297
+ label {
298
+ font-size: $font-sm;
299
+ color: var(--theme-fg);
300
+ cursor: pointer;
160
301
  }
161
302
  }
162
303
 
163
- .modal-footer {
304
+ .action-buttons-right {
164
305
  display: flex;
165
- justify-content: flex-end;
166
- gap: 12px;
167
- padding: 16px 20px;
168
- border-top: 1px solid var(--theme-border);
306
+ gap: $spacing-md;
307
+
308
+ .btn-ghost {
309
+ @include btn-ghost;
310
+ }
311
+
312
+ .btn-success {
313
+ @include btn-base;
314
+ @include btn-success;
315
+ }
316
+
317
+ .unsaved-indicator {
318
+ color: $color-warning;
319
+ font-weight: bold;
320
+ margin-left: $spacing-xs;
321
+ }
169
322
  }