@bakapiano/ccsm 0.22.6 → 0.22.8

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 (61) hide show
  1. package/CLAUDE.md +521 -540
  2. package/README.md +186 -189
  3. package/bin/ccsm.js +235 -235
  4. package/lib/cliActivity.js +36 -139
  5. package/lib/codexSeed.js +126 -183
  6. package/lib/config.js +277 -274
  7. package/lib/devices.js +229 -229
  8. package/lib/folders.js +124 -124
  9. package/lib/persistedSessions.js +179 -139
  10. package/lib/tunnel.js +621 -621
  11. package/lib/webTerminal.js +225 -225
  12. package/lib/winPath.js +1 -1
  13. package/lib/workspace.js +233 -233
  14. package/package.json +57 -57
  15. package/public/css/base.css +99 -99
  16. package/public/css/cards.css +183 -183
  17. package/public/css/feedback.css +504 -504
  18. package/public/css/forms.css +453 -453
  19. package/public/css/layout.css +154 -154
  20. package/public/css/modal.css +190 -190
  21. package/public/css/responsive.css +176 -176
  22. package/public/css/sidebar.css +707 -707
  23. package/public/css/terminals.css +546 -546
  24. package/public/css/tokens.css +81 -81
  25. package/public/css/wco.css +196 -196
  26. package/public/css/widgets.css +2347 -2725
  27. package/public/index.html +152 -152
  28. package/public/js/api.js +349 -371
  29. package/public/js/backend.js +149 -149
  30. package/public/js/components/App.js +73 -73
  31. package/public/js/components/DirectoryPicker.js +203 -203
  32. package/public/js/components/EntityFormModal.js +153 -153
  33. package/public/js/components/Modal.js +57 -57
  34. package/public/js/components/OfflineBanner.js +67 -67
  35. package/public/js/components/PageTitleBar.js +13 -13
  36. package/public/js/components/PendingApprovalOverlay.js +128 -128
  37. package/public/js/components/Picker.js +179 -179
  38. package/public/js/components/Popover.js +55 -55
  39. package/public/js/components/RestartOverlay.js +36 -36
  40. package/public/js/components/Sidebar.js +380 -380
  41. package/public/js/components/TerminalInstance.js +28 -0
  42. package/public/js/components/useDragSort.js +67 -67
  43. package/public/js/dialog.js +67 -67
  44. package/public/js/icons.js +212 -212
  45. package/public/js/main.js +296 -296
  46. package/public/js/pages/AboutPage.js +90 -90
  47. package/public/js/pages/ConfigurePage.js +730 -713
  48. package/public/js/pages/LaunchPage.js +403 -421
  49. package/public/js/pages/RemotePage.js +743 -743
  50. package/public/js/pages/SessionsPage.js +54 -54
  51. package/public/js/state.js +335 -335
  52. package/public/js/util.js +1 -1
  53. package/scripts/dev.js +149 -149
  54. package/scripts/install.js +153 -153
  55. package/scripts/restart-helper.js +96 -96
  56. package/scripts/upgrade-helper.js +687 -687
  57. package/server.js +1748 -1817
  58. package/lib/localCliSessions.js +0 -519
  59. package/public/js/components/AdoptModal.js +0 -261
  60. package/public/manifest.webmanifest +0 -25
  61. package/public/setup/index.html +0 -567
@@ -1,140 +1,140 @@
1
- // SVG icon components. Each accepts {size, className} but most callers
2
- // just take the default — sizing happens via CSS.
3
-
4
- import { html } from './html.js';
5
-
6
- const ic = (vb, body, defaultSize = 16) => ({ size = defaultSize, className = '', stroke = 1.6, fill = 'none' } = {}) =>
7
- html`<svg viewBox=${vb} width=${size} height=${size} fill=${fill} stroke="currentColor"
8
- stroke-width=${stroke} stroke-linecap="round" stroke-linejoin="round" class=${className} aria-hidden="true">${body}</svg>`;
9
-
10
- export const IconSessions = ic('0 0 24 24', html`
11
- <line x1="3" y1="6" x2="21" y2="6"/>
12
- <line x1="3" y1="12" x2="21" y2="12"/>
13
- <line x1="3" y1="18" x2="14" y2="18"/>
14
- `, 18);
15
-
16
- export const IconLaunch = ic('0 0 24 24', html`
17
- <path d="M19 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h6"/>
18
- <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
19
- `, 18);
20
-
21
- export const IconConfigure = ic('0 0 24 24', html`
22
- <circle cx="12" cy="12" r="3"/>
23
- <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33h0a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51h0a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82v0a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/>
24
- `, 18);
25
-
26
- export const IconRefresh = ic('0 0 24 24', html`
27
- <polyline points="23 4 23 10 17 10"/>
28
- <polyline points="1 20 1 14 7 14"/>
29
- <path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/>
30
- `, 16);
31
-
32
- export const IconChevronLeft = ic('0 0 24 24', html`<polyline points="15 18 9 12 15 6"/>`, 14);
33
- export const IconChevronRight = ic('0 0 24 24', html`<polyline points="9 18 15 12 9 6"/>`, 14);
34
- export const IconChevronUp = ic('0 0 24 24', html`<polyline points="18 15 12 9 6 15"/>`, 14);
35
- export const IconChevronDown = ic('0 0 24 24', html`<polyline points="6 9 12 15 18 9"/>`, 14);
36
- export const IconArrowRight = ic('0 0 24 24', html`<line x1="5" y1="12" x2="19" y2="12"/><polyline points="13 6 19 12 13 18"/>`, 14);
37
- export const IconHome = ic('0 0 24 24', html`
38
- <path d="M3 11l9-8 9 8"/>
39
- <path d="M5 10v10a1 1 0 0 0 1 1h4v-6h4v6h4a1 1 0 0 0 1-1V10"/>
40
- `, 14);
41
- export const IconSparkle = ic('0 0 24 24', html`
42
- <path d="M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z"/>
43
- <path d="M19 17l.8 1.6L21 20l-1.2.4L19 22l-.8-1.6L17 20l1.2-.4z"/>
44
- `, 18);
45
- // "Workspace" — stacked layers / cube. Used for the launch-page
46
- // destination pill so it doesn't clash with the folder-tag pill that
47
- // uses IconFolder.
48
- export const IconWorkspace = ic('0 0 24 24', html`
49
- <path d="M12 2l9 5-9 5-9-5z"/>
50
- <path d="M3 12l9 5 9-5"/>
51
- <path d="M3 17l9 5 9-5"/>
52
- `, 16);
53
- // Sidebar-toggle icon (panel-left). A rectangle with a vertical divider
54
- // near the left — universally recognised "show/hide sidebar" affordance
55
- // (Notion, Codex, Linear all use this shape).
56
- export const IconSidebarToggle = ic('0 0 24 24', html`
57
- <rect x="3" y="4" width="18" height="16" rx="2"/>
58
- <line x1="9" y1="4" x2="9" y2="20"/>
59
- `, 14);
60
-
61
- export const IconSearch = ic('0 0 24 24', html`
62
- <circle cx="11" cy="11" r="7"/>
63
- <line x1="21" y1="21" x2="16.65" y2="16.65"/>
64
- `, 14);
65
-
66
- export const IconClose = ic('0 0 24 24', html`
67
- <line x1="18" y1="6" x2="6" y2="18"/>
68
- <line x1="6" y1="6" x2="18" y2="18"/>
69
- `, 18);
70
-
71
- export const IconPlus = ic('0 0 24 24', html`
72
- <line x1="12" y1="5" x2="12" y2="19"/>
73
- <line x1="5" y1="12" x2="19" y2="12"/>
74
- `, 22);
75
-
76
- // Folder + folder-open. Used in the sidebar session tree to mirror the
77
- // icon-first style of the top nav items. Open variant for expanded
78
- // folders so the chevron isn't doing double duty.
79
- export const IconFolder = ic('0 0 24 24', html`
80
- <path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7z"/>
81
- `, 16);
82
- export const IconFolderOpen = ic('0 0 24 24', html`
83
- <path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v1H3V7z"/>
84
- <path d="M3 10h18l-2 7a2 2 0 0 1-2 1.5H5A2 2 0 0 1 3 17V10z"/>
85
- `, 16);
86
-
87
- export const IconPencil = ic('0 0 24 24', html`
88
- <path d="M12 20h9"/>
89
- <path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"/>
90
- `, 13);
91
-
92
- export const IconInfo = ic('0 0 24 24', html`
93
- <circle cx="12" cy="12" r="10"/>
94
- <line x1="12" y1="16" x2="12" y2="12"/>
95
- <line x1="12" y1="8" x2="12.01" y2="8"/>
96
- `, 18);
97
-
98
- export const IconGithub = ic('0 0 24 24', html`
99
- <path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/>
100
- `, 16);
101
-
102
- export const IconExternal = ic('0 0 24 24', html`
103
- <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>
104
- <polyline points="15 3 21 3 21 9"/>
105
- <line x1="10" y1="14" x2="21" y2="3"/>
106
- `, 13);
107
-
108
- // Monitor outline — used on "Focus" buttons since the action raises an
109
- // existing terminal window. Reads as "go to that window".
110
- export const IconMonitor = ic('0 0 24 24', html`
111
- <rect x="3" y="4" width="18" height="12" rx="2" ry="2"/>
112
- <line x1="8" y1="20" x2="16" y2="20"/>
113
- <line x1="12" y1="16" x2="12" y2="20"/>
114
- `, 13);
115
-
116
- // Light / dark theme glyphs for the Appearance toggle.
117
- export const IconSun = ic('0 0 24 24', html`
118
- <circle cx="12" cy="12" r="4"/>
119
- <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/>
120
- `, 14);
121
- export const IconMoon = ic('0 0 24 24', html`
122
- <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
123
- `, 14);
124
-
125
- // "> _" terminal prompt — for the Terminals nav tab
126
- export const IconTerminal = ic('0 0 24 24', html`
127
- <polyline points="4 17 10 11 4 5"/>
128
- <line x1="12" y1="19" x2="20" y2="19"/>
129
- `, 18);
130
-
131
- // Git branch — for repo selection
132
- export const IconBranch = ic('0 0 24 24', html`
133
- <line x1="6" y1="3" x2="6" y2="15"/>
134
- <circle cx="18" cy="6" r="3"/>
135
- <circle cx="6" cy="18" r="3"/>
136
- <path d="M18 9a9 9 0 0 1-9 9"/>
137
- `, 18);
1
+ // SVG icon components. Each accepts {size, className} but most callers
2
+ // just take the default — sizing happens via CSS.
3
+
4
+ import { html } from './html.js';
5
+
6
+ const ic = (vb, body, defaultSize = 16) => ({ size = defaultSize, className = '', stroke = 1.6, fill = 'none' } = {}) =>
7
+ html`<svg viewBox=${vb} width=${size} height=${size} fill=${fill} stroke="currentColor"
8
+ stroke-width=${stroke} stroke-linecap="round" stroke-linejoin="round" class=${className} aria-hidden="true">${body}</svg>`;
9
+
10
+ export const IconSessions = ic('0 0 24 24', html`
11
+ <line x1="3" y1="6" x2="21" y2="6"/>
12
+ <line x1="3" y1="12" x2="21" y2="12"/>
13
+ <line x1="3" y1="18" x2="14" y2="18"/>
14
+ `, 18);
15
+
16
+ export const IconLaunch = ic('0 0 24 24', html`
17
+ <path d="M19 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7a2 2 0 0 1 2-2h6"/>
18
+ <path d="M18.5 2.5a2.121 2.121 0 0 1 3 3L12 15l-4 1 1-4 9.5-9.5z"/>
19
+ `, 18);
20
+
21
+ export const IconConfigure = ic('0 0 24 24', html`
22
+ <circle cx="12" cy="12" r="3"/>
23
+ <path d="M19.4 15a1.65 1.65 0 0 0 .33 1.82l.06.06a2 2 0 0 1 0 2.83 2 2 0 0 1-2.83 0l-.06-.06a1.65 1.65 0 0 0-1.82-.33 1.65 1.65 0 0 0-1 1.51V21a2 2 0 1 1-4 0v-.09a1.65 1.65 0 0 0-1-1.51 1.65 1.65 0 0 0-1.82.33l-.06.06a2 2 0 0 1-2.83 0 2 2 0 0 1 0-2.83l.06-.06a1.65 1.65 0 0 0 .33-1.82 1.65 1.65 0 0 0-1.51-1H3a2 2 0 1 1 0-4h.09a1.65 1.65 0 0 0 1.51-1 1.65 1.65 0 0 0-.33-1.82l-.06-.06a2 2 0 1 1 2.83-2.83l.06.06a1.65 1.65 0 0 0 1.82.33h0a1.65 1.65 0 0 0 1-1.51V3a2 2 0 1 1 4 0v.09a1.65 1.65 0 0 0 1 1.51h0a1.65 1.65 0 0 0 1.82-.33l.06-.06a2 2 0 1 1 2.83 2.83l-.06.06a1.65 1.65 0 0 0-.33 1.82v0a1.65 1.65 0 0 0 1.51 1H21a2 2 0 1 1 0 4h-.09a1.65 1.65 0 0 0-1.51 1z"/>
24
+ `, 18);
25
+
26
+ export const IconRefresh = ic('0 0 24 24', html`
27
+ <polyline points="23 4 23 10 17 10"/>
28
+ <polyline points="1 20 1 14 7 14"/>
29
+ <path d="M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15"/>
30
+ `, 16);
31
+
32
+ export const IconChevronLeft = ic('0 0 24 24', html`<polyline points="15 18 9 12 15 6"/>`, 14);
33
+ export const IconChevronRight = ic('0 0 24 24', html`<polyline points="9 18 15 12 9 6"/>`, 14);
34
+ export const IconChevronUp = ic('0 0 24 24', html`<polyline points="18 15 12 9 6 15"/>`, 14);
35
+ export const IconChevronDown = ic('0 0 24 24', html`<polyline points="6 9 12 15 18 9"/>`, 14);
36
+ export const IconArrowRight = ic('0 0 24 24', html`<line x1="5" y1="12" x2="19" y2="12"/><polyline points="13 6 19 12 13 18"/>`, 14);
37
+ export const IconHome = ic('0 0 24 24', html`
38
+ <path d="M3 11l9-8 9 8"/>
39
+ <path d="M5 10v10a1 1 0 0 0 1 1h4v-6h4v6h4a1 1 0 0 0 1-1V10"/>
40
+ `, 14);
41
+ export const IconSparkle = ic('0 0 24 24', html`
42
+ <path d="M12 3l1.8 5.2L19 10l-5.2 1.8L12 17l-1.8-5.2L5 10l5.2-1.8z"/>
43
+ <path d="M19 17l.8 1.6L21 20l-1.2.4L19 22l-.8-1.6L17 20l1.2-.4z"/>
44
+ `, 18);
45
+ // "Workspace" — stacked layers / cube. Used for the launch-page
46
+ // destination pill so it doesn't clash with the folder-tag pill that
47
+ // uses IconFolder.
48
+ export const IconWorkspace = ic('0 0 24 24', html`
49
+ <path d="M12 2l9 5-9 5-9-5z"/>
50
+ <path d="M3 12l9 5 9-5"/>
51
+ <path d="M3 17l9 5 9-5"/>
52
+ `, 16);
53
+ // Sidebar-toggle icon (panel-left). A rectangle with a vertical divider
54
+ // near the left — universally recognised "show/hide sidebar" affordance
55
+ // (Notion, Codex, Linear all use this shape).
56
+ export const IconSidebarToggle = ic('0 0 24 24', html`
57
+ <rect x="3" y="4" width="18" height="16" rx="2"/>
58
+ <line x1="9" y1="4" x2="9" y2="20"/>
59
+ `, 14);
60
+
61
+ export const IconSearch = ic('0 0 24 24', html`
62
+ <circle cx="11" cy="11" r="7"/>
63
+ <line x1="21" y1="21" x2="16.65" y2="16.65"/>
64
+ `, 14);
65
+
66
+ export const IconClose = ic('0 0 24 24', html`
67
+ <line x1="18" y1="6" x2="6" y2="18"/>
68
+ <line x1="6" y1="6" x2="18" y2="18"/>
69
+ `, 18);
70
+
71
+ export const IconPlus = ic('0 0 24 24', html`
72
+ <line x1="12" y1="5" x2="12" y2="19"/>
73
+ <line x1="5" y1="12" x2="19" y2="12"/>
74
+ `, 22);
75
+
76
+ // Folder + folder-open. Used in the sidebar session tree to mirror the
77
+ // icon-first style of the top nav items. Open variant for expanded
78
+ // folders so the chevron isn't doing double duty.
79
+ export const IconFolder = ic('0 0 24 24', html`
80
+ <path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V7z"/>
81
+ `, 16);
82
+ export const IconFolderOpen = ic('0 0 24 24', html`
83
+ <path d="M3 7a2 2 0 0 1 2-2h4l2 2h8a2 2 0 0 1 2 2v1H3V7z"/>
84
+ <path d="M3 10h18l-2 7a2 2 0 0 1-2 1.5H5A2 2 0 0 1 3 17V10z"/>
85
+ `, 16);
86
+
87
+ export const IconPencil = ic('0 0 24 24', html`
88
+ <path d="M12 20h9"/>
89
+ <path d="M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z"/>
90
+ `, 13);
91
+
92
+ export const IconInfo = ic('0 0 24 24', html`
93
+ <circle cx="12" cy="12" r="10"/>
94
+ <line x1="12" y1="16" x2="12" y2="12"/>
95
+ <line x1="12" y1="8" x2="12.01" y2="8"/>
96
+ `, 18);
97
+
98
+ export const IconGithub = ic('0 0 24 24', html`
99
+ <path d="M9 19c-5 1.5-5-2.5-7-3m14 6v-3.87a3.37 3.37 0 0 0-.94-2.61c3.14-.35 6.44-1.54 6.44-7A5.44 5.44 0 0 0 20 4.77 5.07 5.07 0 0 0 19.91 1S18.73.65 16 2.48a13.38 13.38 0 0 0-7 0C6.27.65 5.09 1 5.09 1A5.07 5.07 0 0 0 5 4.77a5.44 5.44 0 0 0-1.5 3.78c0 5.42 3.3 6.61 6.44 7A3.37 3.37 0 0 0 9 18.13V22"/>
100
+ `, 16);
101
+
102
+ export const IconExternal = ic('0 0 24 24', html`
103
+ <path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/>
104
+ <polyline points="15 3 21 3 21 9"/>
105
+ <line x1="10" y1="14" x2="21" y2="3"/>
106
+ `, 13);
107
+
108
+ // Monitor outline — used on "Focus" buttons since the action raises an
109
+ // existing terminal window. Reads as "go to that window".
110
+ export const IconMonitor = ic('0 0 24 24', html`
111
+ <rect x="3" y="4" width="18" height="12" rx="2" ry="2"/>
112
+ <line x1="8" y1="20" x2="16" y2="20"/>
113
+ <line x1="12" y1="16" x2="12" y2="20"/>
114
+ `, 13);
115
+
116
+ // Light / dark theme glyphs for the Appearance toggle.
117
+ export const IconSun = ic('0 0 24 24', html`
118
+ <circle cx="12" cy="12" r="4"/>
119
+ <path d="M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41"/>
120
+ `, 14);
121
+ export const IconMoon = ic('0 0 24 24', html`
122
+ <path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/>
123
+ `, 14);
124
+
125
+ // "> _" terminal prompt — for the Terminals nav tab
126
+ export const IconTerminal = ic('0 0 24 24', html`
127
+ <polyline points="4 17 10 11 4 5"/>
128
+ <line x1="12" y1="19" x2="20" y2="19"/>
129
+ `, 18);
130
+
131
+ // Git branch — for repo selection
132
+ export const IconBranch = ic('0 0 24 24', html`
133
+ <line x1="6" y1="3" x2="6" y2="15"/>
134
+ <circle cx="18" cy="6" r="3"/>
135
+ <circle cx="6" cy="18" r="3"/>
136
+ <path d="M18 9a9 9 0 0 1-9 9"/>
137
+ `, 18);
138
138
  export const IconMoreVert = ic('0 0 24 24', html`
139
139
  <circle cx="12" cy="5" r="1.6" fill="currentColor" stroke="none"/>
140
140
  <circle cx="12" cy="12" r="1.6" fill="currentColor" stroke="none"/>
@@ -151,78 +151,78 @@ export const IconStop = ic('0 0 24 24', html`
151
151
 
152
152
  // Broadcast / remote — radiating arcs over a centre dot. Used on the
153
153
  // Remote nav tab; reads as "this machine is broadcasting" / "remote
154
- // access available".
155
- export const IconRemote = ic('0 0 24 24', html`
156
- <circle cx="18" cy="5" r="2.5"/>
157
- <circle cx="6" cy="12" r="2.5"/>
158
- <circle cx="18" cy="19" r="2.5"/>
159
- <line x1="8.2" y1="10.8" x2="15.8" y2="6.2"/>
160
- <line x1="8.2" y1="13.2" x2="15.8" y2="17.8"/>
161
- `, 18);
162
-
163
- // Copy — two stacked rectangles. For "copy to clipboard" affordance
164
- // next to URLs / tokens in the Remote page.
165
- export const IconCopy = ic('0 0 24 24', html`
166
- <rect x="9" y="9" width="11" height="11" rx="2"/>
167
- <path d="M5 15V6a2 2 0 0 1 2-2h9"/>
168
- `, 13);
169
-
170
- // Recycle / regenerate — for "regenerate token" button.
171
- export const IconRecycle = ic('0 0 24 24', html`
172
- <polyline points="23 4 23 10 17 10"/>
173
- <path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/>
174
- `, 14);
175
-
176
- // Brand-colored CLI marks. These use external SVG assets (full color),
177
- // rendered as <img> so the gradients / fills in the file are preserved.
178
- export const IconClaudeColor = () => html`
179
- <img src="./assets/claude-color.svg" alt="" width="18" height="18" style="display:block" />`;
180
- export const IconCodexColor = () => html`
181
- <img src="./assets/codex-color.svg" alt="" width="18" height="18" style="display:block" />`;
182
- export const IconCopilotColor = () => html`
183
- <img src="./assets/copilot-color.svg" alt="" width="18" height="18" style="display:block" />`;
184
- export const IconCloudflareColor = ({ size = 28 } = {}) => html`
185
- <img src="./assets/cloudflare-color.svg" alt="" width=${size} height=${size} style="display:block" />`;
186
- export const IconMicrosoftColor = ({ size = 28 } = {}) => html`
187
- <img src="./assets/microsoft-color.svg" alt="" width=${size} height=${size} style="display:block" />`;
188
-
189
- // Pick the right icon for a CLI based on its type field.
190
- export const IconForCliType = (type) => {
191
- if (type === 'claude') return IconClaudeColor;
192
- if (type === 'codex') return IconCodexColor;
193
- if (type === 'copilot') return IconCopilotColor;
194
- return IconTerminal;
195
- };
196
-
197
- // Two variants used in the StarButton.
198
- export const StarOutline = ({ size = 15 } = {}) => html`
199
- <svg viewBox="0 0 24 24" width=${size} height=${size} fill="none" stroke="currentColor"
200
- stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
201
- <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
202
- </svg>`;
203
-
204
- export const StarFilled = ({ size = 15 } = {}) => html`
205
- <svg viewBox="0 0 24 24" width=${size} height=${size} fill="currentColor" stroke="currentColor"
206
- stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
207
- <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
208
- </svg>`;
209
-
210
- // Used as the favorites card title decoration
211
- export const StarSmallFilled = ({ size = 14 } = {}) => html`
212
- <svg class="title-icon title-icon-after" viewBox="0 0 24 24" width=${size} height=${size} fill="currentColor" stroke="none" aria-hidden="true">
213
- <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
214
- </svg>`;
215
-
216
- // brand mark (terminal window + ccsm text — matches /favicon.svg)
217
- export const BrandMark = () => html`
218
- <svg viewBox="0 0 32 32" width="32" height="32">
219
- <rect class="brand-rect" x="2" y="4" width="28" height="24" rx="3" fill="#1a1815"/>
220
- <line x1="2" y1="10" x2="30" y2="10" stroke="#faf9f5" stroke-width="0.6" opacity="0.45"/>
221
- <!-- macOS traffic-light style: red / yellow / green -->
222
- <circle cx="6" cy="7" r="1" fill="#ed6a5e"/>
223
- <circle cx="9.5" cy="7" r="1" fill="#f4be4f"/>
224
- <circle cx="13" cy="7" r="1" fill="#62c554"/>
225
- <text x="16" y="19.5" text-anchor="middle" dominant-baseline="central"
226
- font-family="'JetBrains Mono', 'Cascadia Mono', 'Consolas', monospace"
227
- font-weight="700" font-size="10" fill="#faf9f5">ccsm</text>
228
- </svg>`;
154
+ // access available".
155
+ export const IconRemote = ic('0 0 24 24', html`
156
+ <circle cx="18" cy="5" r="2.5"/>
157
+ <circle cx="6" cy="12" r="2.5"/>
158
+ <circle cx="18" cy="19" r="2.5"/>
159
+ <line x1="8.2" y1="10.8" x2="15.8" y2="6.2"/>
160
+ <line x1="8.2" y1="13.2" x2="15.8" y2="17.8"/>
161
+ `, 18);
162
+
163
+ // Copy — two stacked rectangles. For "copy to clipboard" affordance
164
+ // next to URLs / tokens in the Remote page.
165
+ export const IconCopy = ic('0 0 24 24', html`
166
+ <rect x="9" y="9" width="11" height="11" rx="2"/>
167
+ <path d="M5 15V6a2 2 0 0 1 2-2h9"/>
168
+ `, 13);
169
+
170
+ // Recycle / regenerate — for "regenerate token" button.
171
+ export const IconRecycle = ic('0 0 24 24', html`
172
+ <polyline points="23 4 23 10 17 10"/>
173
+ <path d="M20.49 15a9 9 0 1 1-2.12-9.36L23 10"/>
174
+ `, 14);
175
+
176
+ // Brand-colored CLI marks. These use external SVG assets (full color),
177
+ // rendered as <img> so the gradients / fills in the file are preserved.
178
+ export const IconClaudeColor = () => html`
179
+ <img src="./assets/claude-color.svg" alt="" width="18" height="18" style="display:block" />`;
180
+ export const IconCodexColor = () => html`
181
+ <img src="./assets/codex-color.svg" alt="" width="18" height="18" style="display:block" />`;
182
+ export const IconCopilotColor = () => html`
183
+ <img src="./assets/copilot-color.svg" alt="" width="18" height="18" style="display:block" />`;
184
+ export const IconCloudflareColor = ({ size = 28 } = {}) => html`
185
+ <img src="./assets/cloudflare-color.svg" alt="" width=${size} height=${size} style="display:block" />`;
186
+ export const IconMicrosoftColor = ({ size = 28 } = {}) => html`
187
+ <img src="./assets/microsoft-color.svg" alt="" width=${size} height=${size} style="display:block" />`;
188
+
189
+ // Pick the right icon for a CLI based on its type field.
190
+ export const IconForCliType = (type) => {
191
+ if (type === 'claude') return IconClaudeColor;
192
+ if (type === 'codex') return IconCodexColor;
193
+ if (type === 'copilot') return IconCopilotColor;
194
+ return IconTerminal;
195
+ };
196
+
197
+ // Two variants used in the StarButton.
198
+ export const StarOutline = ({ size = 15 } = {}) => html`
199
+ <svg viewBox="0 0 24 24" width=${size} height=${size} fill="none" stroke="currentColor"
200
+ stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
201
+ <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
202
+ </svg>`;
203
+
204
+ export const StarFilled = ({ size = 15 } = {}) => html`
205
+ <svg viewBox="0 0 24 24" width=${size} height=${size} fill="currentColor" stroke="currentColor"
206
+ stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">
207
+ <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
208
+ </svg>`;
209
+
210
+ // Used as the favorites card title decoration
211
+ export const StarSmallFilled = ({ size = 14 } = {}) => html`
212
+ <svg class="title-icon title-icon-after" viewBox="0 0 24 24" width=${size} height=${size} fill="currentColor" stroke="none" aria-hidden="true">
213
+ <polygon points="12 2 15.09 8.26 22 9.27 17 14.14 18.18 21.02 12 17.77 5.82 21.02 7 14.14 2 9.27 8.91 8.26 12 2"/>
214
+ </svg>`;
215
+
216
+ // brand mark (terminal window + ccsm text — matches /favicon.svg)
217
+ export const BrandMark = () => html`
218
+ <svg viewBox="0 0 32 32" width="32" height="32">
219
+ <rect class="brand-rect" x="2" y="4" width="28" height="24" rx="3" fill="#1a1815"/>
220
+ <line x1="2" y1="10" x2="30" y2="10" stroke="#faf9f5" stroke-width="0.6" opacity="0.45"/>
221
+ <!-- macOS traffic-light style: red / yellow / green -->
222
+ <circle cx="6" cy="7" r="1" fill="#ed6a5e"/>
223
+ <circle cx="9.5" cy="7" r="1" fill="#f4be4f"/>
224
+ <circle cx="13" cy="7" r="1" fill="#62c554"/>
225
+ <text x="16" y="19.5" text-anchor="middle" dominant-baseline="central"
226
+ font-family="'JetBrains Mono', 'Cascadia Mono', 'Consolas', monospace"
227
+ font-weight="700" font-size="10" fill="#faf9f5">ccsm</text>
228
+ </svg>`;