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.
- package/.claude/settings.local.json +2 -1
- package/.github/workflows/ci.yml +26 -0
- package/.github/workflows/claude-code-review.yml +44 -0
- package/.github/workflows/claude.yml +81 -0
- package/.github/workflows/release.yml +30 -0
- package/CHANGELOG.md +46 -0
- package/CLAUDE.md +33 -0
- package/CONTRIBUTING.md +3 -1
- package/README.md +21 -18
- package/TODO.md +5 -0
- package/dist/build-config.d.ts +3 -3
- package/dist/components/deleteConfirmModal.component.d.ts +7 -0
- package/dist/components/deleteConfirmModal.component.d.ts.map +1 -0
- package/dist/components/paneEditor.component.d.ts +9 -18
- package/dist/components/paneEditor.component.d.ts.map +1 -1
- package/dist/components/splitPreview.component.d.ts +50 -50
- package/dist/components/splitPreview.component.d.ts.map +1 -1
- package/dist/components/workspaceEditor.component.d.ts +61 -54
- package/dist/components/workspaceEditor.component.d.ts.map +1 -1
- package/dist/components/workspaceList.component.d.ts +56 -39
- package/dist/components/workspaceList.component.d.ts.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.LICENSE.txt +1 -1
- package/dist/index.js.map +1 -1
- package/dist/models/workspace.model.d.ts +118 -78
- package/dist/models/workspace.model.d.ts.map +1 -1
- package/dist/package.json +1 -1
- package/dist/providers/config.provider.d.ts +8 -8
- package/dist/providers/settings.provider.d.ts +7 -7
- package/dist/providers/toolbar.provider.d.ts +23 -15
- package/dist/providers/toolbar.provider.d.ts.map +1 -1
- package/dist/services/startupCommand.service.d.ts +27 -19
- package/dist/services/startupCommand.service.d.ts.map +1 -1
- package/dist/services/workspaceBackground.service.d.ts +38 -0
- package/dist/services/workspaceBackground.service.d.ts.map +1 -0
- package/dist/services/workspaceEditor.service.d.ts +46 -32
- package/dist/services/workspaceEditor.service.d.ts.map +1 -1
- package/docs/DESIGN.md +57 -0
- package/docs/SESSION-2026-01-14-S1-DESIGN.md +134 -0
- package/mockups/index.html +162 -0
- package/mockups/s1-tight-sharp.html +522 -0
- package/mockups/shared/base.css +216 -0
- package/mockups/v06-tabbed.html +643 -0
- package/package.json +2 -1
- package/screenshots/editor.png +0 -0
- package/scripts/build-dev.js +2 -1
- package/scripts/build-prod.js +2 -1
- package/src/components/deleteConfirmModal.component.ts +23 -0
- package/src/components/paneEditor.component.pug +27 -43
- package/src/components/paneEditor.component.scss +37 -85
- package/src/components/paneEditor.component.ts +4 -32
- package/src/components/splitPreview.component.pug +0 -9
- package/src/components/splitPreview.component.scss +46 -70
- package/src/components/splitPreview.component.ts +15 -25
- package/src/components/workspaceEditor.component.pug +140 -112
- package/src/components/workspaceEditor.component.scss +270 -202
- package/src/components/workspaceEditor.component.ts +161 -85
- package/src/components/workspaceList.component.pug +31 -51
- package/src/components/workspaceList.component.scss +86 -77
- package/src/components/workspaceList.component.ts +89 -34
- package/src/index.ts +4 -0
- package/src/models/workspace.model.ts +80 -2
- package/src/providers/toolbar.provider.ts +78 -9
- package/src/services/startupCommand.service.ts +30 -32
- package/src/services/workspaceBackground.service.ts +167 -0
- package/src/services/workspaceEditor.service.ts +77 -40
- package/src/styles/_index.scss +3 -0
- package/src/styles/_mixins.scss +180 -0
- package/src/styles/_variables.scss +67 -0
- package/TEST_MCP.md +0 -176
- package/cdp-click.js +0 -22
- package/cdp-test.js +0 -28
- package/screenshots/pane-edit.png +0 -0
- package/test_cdp.py +0 -50
|
@@ -1,46 +1,26 @@
|
|
|
1
|
-
//-
|
|
2
|
-
.
|
|
3
|
-
.
|
|
4
|
-
|
|
1
|
+
//- Section 1: Workspace Settings
|
|
2
|
+
.editor-section
|
|
3
|
+
.section-title
|
|
4
|
+
i.fas.fa-cog
|
|
5
|
+
| Workspace Settings
|
|
5
6
|
|
|
6
|
-
.
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
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
|
-
|
|
42
|
+
span.dropdown-chevron
|
|
43
|
+
i.fas.fa-chevron-down
|
|
76
44
|
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
.
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
-
|
|
71
|
+
//- Section 2: Split Layout
|
|
72
|
+
.editor-section
|
|
73
|
+
.section-title
|
|
74
|
+
i.fas.fa-columns
|
|
75
|
+
| Split Layout
|
|
111
76
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
-
|
|
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
|
-
//-
|
|
138
|
-
pane-editor(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
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') *
|