@bakapiano/ccsm 0.10.3 → 0.12.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 (51) hide show
  1. package/CLAUDE.md +475 -475
  2. package/README.md +190 -190
  3. package/bin/ccsm.js +194 -194
  4. package/lib/atomicJson.js +48 -0
  5. package/lib/cliSessionWatcher.js +249 -249
  6. package/lib/config.js +188 -185
  7. package/lib/folders.js +105 -96
  8. package/lib/jsonStore.js +15 -10
  9. package/lib/localCliSessions.js +489 -177
  10. package/lib/persistedSessions.js +142 -134
  11. package/lib/webTerminal.js +208 -208
  12. package/lib/workspace.js +230 -255
  13. package/package.json +57 -57
  14. package/public/css/base.css +99 -99
  15. package/public/css/cards.css +183 -183
  16. package/public/css/feedback.css +303 -303
  17. package/public/css/forms.css +405 -405
  18. package/public/css/layout.css +160 -160
  19. package/public/css/modal.css +190 -183
  20. package/public/css/responsive.css +10 -10
  21. package/public/css/sidebar.css +608 -601
  22. package/public/css/terminals.css +294 -294
  23. package/public/css/tokens.css +81 -79
  24. package/public/css/wco.css +98 -98
  25. package/public/css/widgets.css +1596 -1375
  26. package/public/index.html +105 -103
  27. package/public/js/api.js +272 -260
  28. package/public/js/components/AdoptModal.js +343 -171
  29. package/public/js/components/App.js +35 -35
  30. package/public/js/components/DirectoryPicker.js +203 -203
  31. package/public/js/components/EntityFormModal.js +105 -105
  32. package/public/js/components/Modal.js +51 -51
  33. package/public/js/components/OfflineBanner.js +93 -93
  34. package/public/js/components/PageTitleBar.js +13 -13
  35. package/public/js/components/Picker.js +179 -179
  36. package/public/js/components/Popover.js +55 -55
  37. package/public/js/components/Sidebar.js +341 -270
  38. package/public/js/components/TerminalView.js +298 -298
  39. package/public/js/components/useDragSort.js +67 -67
  40. package/public/js/dialog.js +67 -67
  41. package/public/js/icons.js +177 -177
  42. package/public/js/main.js +132 -140
  43. package/public/js/pages/AboutPage.js +165 -165
  44. package/public/js/pages/ConfigurePage.js +475 -487
  45. package/public/js/pages/LaunchPage.js +369 -369
  46. package/public/js/pages/SessionsPage.js +97 -97
  47. package/public/js/state.js +231 -231
  48. package/public/manifest.webmanifest +15 -15
  49. package/scripts/dev.js +59 -0
  50. package/scripts/install.js +137 -137
  51. package/server.js +1147 -1117
@@ -1,160 +1,160 @@
1
- /* App grid · main column · page header · tab panels · footer status line */
2
-
3
- .app {
4
- display: grid;
5
- grid-template-columns: var(--sidebar-w) 1fr;
6
- height: 100vh;
7
- /* Pin to viewport height (not min-height) — child flex columns set
8
- min-height:0 and rely on a bounded parent height to compute their own
9
- space. With min-height:100vh, a transient xterm resize that briefly
10
- reports a too-large cell count makes the WebGL canvas grow, .session-pane
11
- grows to fit, .main grows, .app grows... cascading into a multi-hundred-
12
- thousand-pixel tall page. height:100vh caps the cascade. */
13
- transition: grid-template-columns .25s cubic-bezier(.4, 0, .2, 1);
14
- }
15
- .app:has(.sidebar[data-collapsed="true"]) {
16
- grid-template-columns: var(--sidebar-w-collapsed) 1fr;
17
- }
18
- /* While dragging the sidebar resize handle, kill the transition so the
19
- grid tracks pointermove pixel-for-pixel instead of lagging behind. */
20
- body.is-resizing-sidebar .app {
21
- transition: none;
22
- }
23
-
24
- .main {
25
- display: flex;
26
- flex-direction: column;
27
- min-width: 0;
28
- /* grid items default to min-height:auto which lets internal content
29
- (eg a misbehaving xterm canvas that briefly reports an absurd height)
30
- overflow the grid track and balloon the whole page. min-height:0
31
- restores the expected "fit my grid cell" behaviour. */
32
- min-height: 0;
33
- padding: 0 var(--s-4);
34
- gap: var(--s-2);
35
- }
36
-
37
- .page-head {
38
- display: flex;
39
- align-items: flex-start;
40
- justify-content: space-between;
41
- gap: var(--s-8);
42
- padding-bottom: var(--s-5);
43
- border-bottom: 1px solid var(--border);
44
- }
45
- .page-head-inner { min-width: 0; }
46
-
47
- .page-title {
48
- font-family: var(--display);
49
- font-size: 26px;
50
- font-weight: 600;
51
- letter-spacing: -0.024em;
52
- color: var(--ink);
53
- line-height: 1.1;
54
- }
55
- .page-subtitle {
56
- margin-top: 4px;
57
- font-size: 13.5px;
58
- color: var(--ink-mid);
59
- }
60
-
61
- .page-head-meta {
62
- display: flex;
63
- align-items: baseline;
64
- gap: var(--s-3);
65
- flex-shrink: 0;
66
- white-space: nowrap;
67
- font-family: var(--mono);
68
- font-size: 11px;
69
- color: var(--ink-muted);
70
- }
71
- .ph-stat { display: inline-flex; gap: 6px; align-items: baseline; }
72
- .ph-key {
73
- font-family: var(--body);
74
- font-size: 10.5px;
75
- letter-spacing: 0.06em;
76
- text-transform: uppercase;
77
- color: var(--ink-faint);
78
- }
79
- .ph-val { color: var(--ink-mid); }
80
- .ph-divider { color: var(--ink-faint); }
81
-
82
- .content {
83
- flex: 1;
84
- display: flex;
85
- flex-direction: column;
86
- min-height: 0;
87
- }
88
-
89
- .tab-panel {
90
- display: none;
91
- flex-direction: column;
92
- gap: var(--s-4);
93
- min-height: 0;
94
- }
95
- .tab-panel[data-active] {
96
- display: flex;
97
- flex: 1;
98
- }
99
-
100
- /* Per-page title strip — height matches the sidebar collapse-toggle
101
- (28px) so the topmost row of the window reads as one unified band. */
102
- .page-title-bar {
103
- display: flex;
104
- flex-direction: row-reverse;
105
- align-items: center;
106
- justify-content: flex-start;
107
- gap: var(--s-3);
108
- height: 40px;
109
- margin: 0 calc(-1 * var(--s-4)) 0;
110
- padding: 0 var(--s-5);
111
- /* Replace the hard inset shadow rule with a soft gradient fade — gives
112
- the top band a printed-paper masthead feeling rather than a CSS
113
- divider. */
114
- background:
115
- linear-gradient(to bottom, rgba(216, 212, 198, 0.0) 0%, rgba(216, 212, 198, 0.0) calc(100% - 1px), var(--ui-border-soft) 100%);
116
- color: var(--ink);
117
- font-size: 13px;
118
- font-weight: 400;
119
- line-height: 1.4;
120
- }
121
- .page-title-bar-title {
122
- margin: 0;
123
- font-size: 13px;
124
- font-weight: 400;
125
- display: flex;
126
- align-items: center;
127
- gap: var(--s-2);
128
- min-width: 0;
129
- flex: 1;
130
- overflow: hidden;
131
- line-height: 1.4;
132
- }
133
- .page-title-bar-actions {
134
- display: flex;
135
- align-items: center;
136
- gap: var(--s-2);
137
- flex-shrink: 0;
138
- }
139
- .session-title-text {
140
- font-weight: 500;
141
- font-size: 13px;
142
- letter-spacing: -0.005em;
143
- color: var(--ink);
144
- flex-shrink: 0;
145
- }
146
- .session-title-meta {
147
- display: flex;
148
- align-items: center;
149
- gap: 6px;
150
- color: var(--ink-muted);
151
- font-size: 11.5px;
152
- overflow: hidden;
153
- white-space: nowrap;
154
- }
155
- .session-title-meta .mono {
156
- font-family: var(--mono);
157
- overflow: hidden;
158
- text-overflow: ellipsis;
159
- max-width: 40vw;
160
- }
1
+ /* App grid · main column · page header · tab panels · footer status line */
2
+
3
+ .app {
4
+ display: grid;
5
+ grid-template-columns: var(--sidebar-w) 1fr;
6
+ height: 100vh;
7
+ /* Pin to viewport height (not min-height) — child flex columns set
8
+ min-height:0 and rely on a bounded parent height to compute their own
9
+ space. With min-height:100vh, a transient xterm resize that briefly
10
+ reports a too-large cell count makes the WebGL canvas grow, .session-pane
11
+ grows to fit, .main grows, .app grows... cascading into a multi-hundred-
12
+ thousand-pixel tall page. height:100vh caps the cascade. */
13
+ transition: grid-template-columns .25s cubic-bezier(.4, 0, .2, 1);
14
+ }
15
+ .app:has(.sidebar[data-collapsed="true"]) {
16
+ grid-template-columns: var(--sidebar-w-collapsed) 1fr;
17
+ }
18
+ /* While dragging the sidebar resize handle, kill the transition so the
19
+ grid tracks pointermove pixel-for-pixel instead of lagging behind. */
20
+ body.is-resizing-sidebar .app {
21
+ transition: none;
22
+ }
23
+
24
+ .main {
25
+ display: flex;
26
+ flex-direction: column;
27
+ min-width: 0;
28
+ /* grid items default to min-height:auto which lets internal content
29
+ (eg a misbehaving xterm canvas that briefly reports an absurd height)
30
+ overflow the grid track and balloon the whole page. min-height:0
31
+ restores the expected "fit my grid cell" behaviour. */
32
+ min-height: 0;
33
+ padding: 0 var(--s-4);
34
+ gap: var(--s-2);
35
+ }
36
+
37
+ .page-head {
38
+ display: flex;
39
+ align-items: flex-start;
40
+ justify-content: space-between;
41
+ gap: var(--s-8);
42
+ padding-bottom: var(--s-5);
43
+ border-bottom: 1px solid var(--border);
44
+ }
45
+ .page-head-inner { min-width: 0; }
46
+
47
+ .page-title {
48
+ font-family: var(--display);
49
+ font-size: 26px;
50
+ font-weight: 600;
51
+ letter-spacing: -0.024em;
52
+ color: var(--ink);
53
+ line-height: 1.1;
54
+ }
55
+ .page-subtitle {
56
+ margin-top: 4px;
57
+ font-size: 13.5px;
58
+ color: var(--ink-mid);
59
+ }
60
+
61
+ .page-head-meta {
62
+ display: flex;
63
+ align-items: baseline;
64
+ gap: var(--s-3);
65
+ flex-shrink: 0;
66
+ white-space: nowrap;
67
+ font-family: var(--mono);
68
+ font-size: 11px;
69
+ color: var(--ink-muted);
70
+ }
71
+ .ph-stat { display: inline-flex; gap: 6px; align-items: baseline; }
72
+ .ph-key {
73
+ font-family: var(--body);
74
+ font-size: 10.5px;
75
+ letter-spacing: 0.06em;
76
+ text-transform: uppercase;
77
+ color: var(--ink-faint);
78
+ }
79
+ .ph-val { color: var(--ink-mid); }
80
+ .ph-divider { color: var(--ink-faint); }
81
+
82
+ .content {
83
+ flex: 1;
84
+ display: flex;
85
+ flex-direction: column;
86
+ min-height: 0;
87
+ }
88
+
89
+ .tab-panel {
90
+ display: none;
91
+ flex-direction: column;
92
+ gap: var(--s-4);
93
+ min-height: 0;
94
+ }
95
+ .tab-panel[data-active] {
96
+ display: flex;
97
+ flex: 1;
98
+ }
99
+
100
+ /* Per-page title strip — height matches the sidebar collapse-toggle
101
+ (28px) so the topmost row of the window reads as one unified band. */
102
+ .page-title-bar {
103
+ display: flex;
104
+ flex-direction: row-reverse;
105
+ align-items: center;
106
+ justify-content: flex-start;
107
+ gap: var(--s-3);
108
+ height: 40px;
109
+ margin: 0 calc(-1 * var(--s-4)) 0;
110
+ padding: 0 var(--s-5);
111
+ /* Replace the hard inset shadow rule with a soft gradient fade — gives
112
+ the top band a printed-paper masthead feeling rather than a CSS
113
+ divider. */
114
+ background:
115
+ linear-gradient(to bottom, rgba(216, 212, 198, 0.0) 0%, rgba(216, 212, 198, 0.0) calc(100% - 1px), var(--ui-border-soft) 100%);
116
+ color: var(--ink);
117
+ font-size: 13px;
118
+ font-weight: 400;
119
+ line-height: 1.4;
120
+ }
121
+ .page-title-bar-title {
122
+ margin: 0;
123
+ font-size: 13px;
124
+ font-weight: 400;
125
+ display: flex;
126
+ align-items: center;
127
+ gap: var(--s-2);
128
+ min-width: 0;
129
+ flex: 1;
130
+ overflow: hidden;
131
+ line-height: 1.4;
132
+ }
133
+ .page-title-bar-actions {
134
+ display: flex;
135
+ align-items: center;
136
+ gap: var(--s-2);
137
+ flex-shrink: 0;
138
+ }
139
+ .session-title-text {
140
+ font-weight: 500;
141
+ font-size: 13px;
142
+ letter-spacing: -0.005em;
143
+ color: var(--ink);
144
+ flex-shrink: 0;
145
+ }
146
+ .session-title-meta {
147
+ display: flex;
148
+ align-items: center;
149
+ gap: 6px;
150
+ color: var(--ink-muted);
151
+ font-size: 11.5px;
152
+ overflow: hidden;
153
+ white-space: nowrap;
154
+ }
155
+ .session-title-meta .mono {
156
+ font-family: var(--mono);
157
+ overflow: hidden;
158
+ text-overflow: ellipsis;
159
+ max-width: 40vw;
160
+ }